using System; using System.Collections; using System.Diagnostics; using System.IO; using System.Reflection; namespace System.Globalization { public class CultureInfoDisplayItem { public CultureInfoDisplayItem(string displayName, CultureInfo cultureInfo) { DisplayName = displayName; CultureInfo = cultureInfo; } public override string ToString() { return DisplayName; } public string DisplayName; public readonly CultureInfo CultureInfo; } /// /// Class responsible to collect available localized resources. /// public class LanguageCollector { public enum LanguageNameDisplay { DisplayName, EnglishName, NativeName } /// /// Initializes LanguageCollector object with a list of /// available localized resources based on subfolders names. /// public LanguageCollector() { m_avalableCutureInfos = GetApplicationAvailableCultures(); Debug.Assert(m_avalableCutureInfos != null); } /// /// Initializes LanguageCollector object with a list of available localized resources /// based on subfolders names plus CultureInfo supplied as a default culture. /// /// /// Default culure for which application did not create subfolder. /// public LanguageCollector(CultureInfo defaultCultureInfo) : this() { if (!m_avalableCutureInfos.Contains(defaultCultureInfo)) { m_avalableCutureInfos.Add(defaultCultureInfo); m_avalableCutureInfos.Sort(new CultureInfoComparer()); } Debug.Assert(m_avalableCutureInfos != null); } private class CultureInfoComparer : IComparer { int IComparer.Compare(object x, object y) { return Compare((CultureInfo)x, (CultureInfo)y); } public int Compare(CultureInfo cix, CultureInfo ciy) { return string.Compare(cix.Name, ciy.Name); } } /// /// Returns an array of CultureInfoDisplayItem objects for all available localized resources. /// /// /// LanguageNameDisplay value defining how language will be displayed. /// /// /// Index of currently active UI culture. /// /// /// An array of CultureInfoDisplayItem objects, sorted by their names (not DisplayNames). /// public CultureInfoDisplayItem[] GetLanguages(LanguageNameDisplay languageNameToDisplay, out int currentLanguage) { CultureInfoDisplayItem[] cidi = new CultureInfoDisplayItem[m_avalableCutureInfos.Count]; currentLanguage = -1; string currentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture.Name; string parentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture.Parent.Name; for (int i = 0; i < m_avalableCutureInfos.Count; i++) { CultureInfo ci = (CultureInfo)m_avalableCutureInfos[i]; string displayName = GetDisplayName(ci, languageNameToDisplay); cidi[i] = new CultureInfoDisplayItem(displayName, ci); if (currentCulture == ci.Name || (currentLanguage == -1 && parentCulture == ci.Name)) currentLanguage = i; } Debug.Assert(currentLanguage > -1 && currentLanguage < m_avalableCutureInfos.Count); return cidi; } private string GetDisplayName(CultureInfo cultureInfo, LanguageNameDisplay languageNameToDisplay) { switch (languageNameToDisplay) { case LanguageNameDisplay.DisplayName: return cultureInfo.DisplayName; case LanguageNameDisplay.EnglishName: return cultureInfo.EnglishName; case LanguageNameDisplay.NativeName: return cultureInfo.NativeName; } Debug.Assert(false, string.Format("Not supported LanguageNameDisplay value {0}", languageNameToDisplay)); return ""; } private Hashtable GetAllCultures() { CultureInfo[] cis = CultureInfo.GetCultures(CultureTypes.AllCultures); Hashtable allCultures = new Hashtable(cis.Length); foreach (CultureInfo ci in cis) { allCultures.Add(ci.Name, ci); } return allCultures; } private ArrayList GetApplicationAvailableCultures() { ArrayList availableCultures = new ArrayList(); Hashtable allCultures = GetAllCultures(); string executableRoot = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); foreach (string directory in Directory.GetDirectories(executableRoot)) { string subDirectory = Path.GetFileName(directory); CultureInfo ci = (CultureInfo)allCultures[subDirectory]; if (ci != null) { availableCultures.Add(ci); } } return availableCultures; } private ArrayList m_avalableCutureInfos; } }