using System; using System.Collections.Generic; using System.Globalization; using System.Windows.Media; using System.Windows.Markup; namespace LunarSF.SHomeWorkshop.LunarMarkdownEditor { /// <summary> /// 此类源自网络。 /// 是用于主界面生成字体列表。 /// </summary> internal static class NameDictionaryHelper { public static string GetDisplayName(LanguageSpecificStringDictionary nameDictionary) { // Look up the display name based on the UI culture, which is the same culture // used for resource loading. XmlLanguage userLanguage = XmlLanguage.GetLanguage(CultureInfo.CurrentUICulture.IetfLanguageTag); // Look for an exact match. string name; if (nameDictionary.TryGetValue(userLanguage, out name)) { return name; } // No exact match; return the name for the most closely related language. int bestRelatedness = -1; string bestName = string.Empty; foreach (KeyValuePair<XmlLanguage, string> pair in nameDictionary) { int relatedness = GetRelatedness(pair.Key, userLanguage); if (relatedness > bestRelatedness) { bestRelatedness = relatedness; bestName = pair.Value; } } return bestName; } public static string GetDisplayName(IDictionary<CultureInfo, string> nameDictionary) { // Look for an exact match. string name; if (nameDictionary.TryGetValue(CultureInfo.CurrentUICulture, out name)) { return name; } // No exact match; return the name for the most closely related language. int bestRelatedness = -1; string bestName = string.Empty; XmlLanguage userLanguage = XmlLanguage.GetLanguage(CultureInfo.CurrentUICulture.IetfLanguageTag); foreach (KeyValuePair<CultureInfo, string> pair in nameDictionary) { int relatedness = GetRelatedness(XmlLanguage.GetLanguage(pair.Key.IetfLanguageTag), userLanguage); if (relatedness > bestRelatedness) { bestRelatedness = relatedness; bestName = pair.Value; } } return bestName; } private static int GetRelatedness(XmlLanguage keyLang, XmlLanguage userLang) { try { // Get equivalent cultures. CultureInfo keyCulture = CultureInfo.GetCultureInfoByIetfLanguageTag(keyLang.IetfLanguageTag); CultureInfo userCulture = CultureInfo.GetCultureInfoByIetfLanguageTag(userLang.IetfLanguageTag); if (!userCulture.IsNeutralCulture) { userCulture = userCulture.Parent; } // If the key is a prefix or parent of the user language it's a good match. if (IsPrefixOf(keyLang.IetfLanguageTag, userLang.IetfLanguageTag) || userCulture.Equals(keyCulture)) { return 2; } // If the key and user language share a common prefix or parent neutral culture, it's a reasonable match. if (IsPrefixOf(TrimSuffix(userLang.IetfLanguageTag), keyLang.IetfLanguageTag) || userCulture.Equals(keyCulture.Parent)) { return 1; } } catch (ArgumentException) { // Language tag with no corresponding CultureInfo. } // They're unrelated languages. return 0; } private static string TrimSuffix(string tag) { int i = tag.LastIndexOf('-'); if (i > 0) { return tag.Substring(0, i); } else { return tag; } } private static bool IsPrefixOf(string prefix, string tag) { return prefix.Length < tag.Length && tag[prefix.Length] == '-' && string.CompareOrdinal(prefix, 0, tag, 0, prefix.Length) == 0; } } }