|
1 | 1 | using System; |
| 2 | +using System.Collections.Generic; |
2 | 3 | using System.Globalization; |
3 | 4 | using System.Linq; |
4 | 5 | using System.Text.RegularExpressions; |
@@ -35,38 +36,54 @@ public override void OnFrameworkInitializationCompleted() { |
35 | 36 |
|
36 | 37 | public void InitializeCulture() { |
37 | 38 | Log.Information("Initializing culture."); |
38 | | - var language = CultureInfo.InstalledUICulture.Name; |
39 | | - if (!string.IsNullOrEmpty(Core.Util.Preferences.Default.Language)) { |
40 | | - language = Core.Util.Preferences.Default.Language; |
| 39 | + string sysLang = CultureInfo.InstalledUICulture.Name; |
| 40 | + string prefLang = Core.Util.Preferences.Default.Language; |
| 41 | + var languages = GetLanguages(); |
| 42 | + if (languages.TryGetValue(prefLang, out var res)) { |
| 43 | + SetLanguage(res); |
| 44 | + } else if (languages.TryGetValue(sysLang, out res)) { |
| 45 | + SetLanguage(res); |
| 46 | + Core.Util.Preferences.Default.Language = sysLang; |
| 47 | + Core.Util.Preferences.Save(); |
| 48 | + } else { |
| 49 | + SetLanguage(languages["en-US"]); |
41 | 50 | } |
42 | | - SetLanguage(language); |
43 | 51 |
|
44 | 52 | // Force using InvariantCulture to prevent issues caused by culture dependent string conversion, especially for floating point numbers. |
45 | 53 | Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; |
46 | 54 | Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture; |
47 | 55 | Log.Information("Initialized culture."); |
48 | 56 | } |
49 | 57 |
|
50 | | - public static void SetLanguage(string language) { |
51 | | - var dictionaryList = Current.Resources.MergedDictionaries |
| 58 | + public static Dictionary<string, ResourceInclude> GetLanguages() { |
| 59 | + if (Current == null) { |
| 60 | + return new(); |
| 61 | + } |
| 62 | + var re = new Regex(@"Strings\.?([\w-]+)\.axaml"); |
| 63 | + return Current.Resources.MergedDictionaries |
52 | 64 | .Select(res => (ResourceInclude)res) |
53 | | - .ToList(); |
54 | | - var resDictName = string.Format(@"Strings.{0}.axaml", language); |
55 | | - var resDict = dictionaryList |
56 | | - .FirstOrDefault(d => d.Source!.OriginalString.Contains(resDictName)); |
57 | | - if (resDict == null) { |
58 | | - resDict = dictionaryList.FirstOrDefault(d => d.Source!.OriginalString.Contains("Strings.axaml")); |
| 65 | + .Where(res => res.Source!.OriginalString.Contains("Strings.")) |
| 66 | + .ToDictionary(res => { |
| 67 | + var m = re.Match(res.Source!.OriginalString); |
| 68 | + return string.IsNullOrEmpty(m.Groups[1].Value) ? "en-US" : m.Groups[1].Value; |
| 69 | + }); |
| 70 | + } |
| 71 | + |
| 72 | + public static void SetLanguage(ResourceInclude res) { |
| 73 | + if (Current == null) { |
| 74 | + return; |
59 | 75 | } |
60 | | - if (resDict != null) { |
61 | | - Current.Resources.MergedDictionaries.Remove(resDict); |
62 | | - Current.Resources.MergedDictionaries.Add(resDict); |
63 | | - var langName = resDict.Source.OriginalString.Replace("/Strings/Strings", "").Replace(".", "").Replace("axaml", ""); |
64 | | - if (langName == "") |
65 | | - langName = language; |
66 | | - if (Core.Util.Preferences.Default.Language != langName) { |
67 | | - Core.Util.Preferences.Default.Language = langName; |
68 | | - Core.Util.Preferences.Save(); |
69 | | - } |
| 76 | + Current.Resources.MergedDictionaries.Remove(res); |
| 77 | + Current.Resources.MergedDictionaries.Add(res); |
| 78 | + } |
| 79 | + |
| 80 | + public static void SetLanguage(string language) { |
| 81 | + if (Current == null) { |
| 82 | + return; |
| 83 | + } |
| 84 | + var languages = GetLanguages(); |
| 85 | + if (languages.TryGetValue(language, out var res)) { |
| 86 | + SetLanguage(res); |
70 | 87 | } |
71 | 88 | } |
72 | 89 |
|
|
0 commit comments