searchfindreplace_user_cont.../FormLanguageSwitch/LanguageCollector.cs
2020-11-25 13:52:49 +01:00

159 lines
5.6 KiB
C#

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;
}
/// <summary>
/// Class responsible to collect available localized resources.
/// </summary>
public class LanguageCollector
{
public enum LanguageNameDisplay
{
DisplayName,
EnglishName,
NativeName
}
/// <summary>
/// Initializes <c>LanguageCollector</c> object with a list of
/// available localized resources based on subfolders names.
/// </summary>
public LanguageCollector()
{
m_avalableCutureInfos = GetApplicationAvailableCultures();
Debug.Assert(m_avalableCutureInfos != null);
}
/// <summary>
/// Initializes <c>LanguageCollector</c> object with a list of available localized resources
/// based on subfolders names plus <c>CultureInfo</c> supplied as a default culture.
/// </summary>
/// <param name="defaultCultureInfo">
/// Default culure for which application did not create subfolder.
/// </param>
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);
}
}
/// <summary>
/// Returns an array of <c>CultureInfoDisplayItem</c> objects for all available localized resources.
/// </summary>
/// <param name="languageNameToDisplay">
/// <c>LanguageNameDisplay</c> value defining how language will be displayed.
/// </param>
/// <param name="currentLanguage">
/// Index of currently active UI culture.
/// </param>
/// <returns>
/// An array of <c>CultureInfoDisplayItem</c> objects, sorted by their names (not <c>DisplayName</c>s).
/// </returns>
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;
}
}