From 886a516ac0ac0819b16940a2eed189400ede2a02 Mon Sep 17 00:00:00 2001 From: IsWaffle Date: Sat, 9 Dec 2023 22:28:04 +0000 Subject: [PATCH] Merge pull request 'fix/first-run-locale-load' (!32) from waffle.lord/Launcher:fix/first-run-locale-load into master Reviewed-on: https://dev.sp-tarkov.com/SPT-AKI/Launcher/pulls/32 (cherry picked from commit a595111bbd698cb1aa81805e2a1b7b77e3a85411) --- .../Extensions/DictionaryExtensions.cs | 29 ++++++-- .../Helpers/LocalizationProvider.cs | 71 ++++++++++++------- .../Locales/Chinese (Simplified).json | 1 + .../Locales/Chinese (Traditional).json | 1 + .../Aki_Data/Launcher/Locales/English.json | 1 + .../Aki_Data/Launcher/Locales/French.json | 1 + .../Aki_Data/Launcher/Locales/German.json | 1 + .../Aki_Data/Launcher/Locales/Italian.json | 1 + .../Aki_Data/Launcher/Locales/Japanese.json | 1 + .../Aki_Data/Launcher/Locales/Korean.json | 1 + .../Aki_Data/Launcher/Locales/Polish.json | 1 + .../Aki_Data/Launcher/Locales/Russian.json | 1 + .../Aki_Data/Launcher/Locales/Spanish.json | 1 + .../ViewModels/MainWindowViewModel.cs | 30 ++++++++ .../ViewModels/ProfileViewModel.cs | 31 -------- 15 files changed, 107 insertions(+), 65 deletions(-) diff --git a/project/Aki.Launcher.Base/Extensions/DictionaryExtensions.cs b/project/Aki.Launcher.Base/Extensions/DictionaryExtensions.cs index d6d82db..bb6fb8f 100644 --- a/project/Aki.Launcher.Base/Extensions/DictionaryExtensions.cs +++ b/project/Aki.Launcher.Base/Extensions/DictionaryExtensions.cs @@ -14,24 +14,39 @@ namespace Aki.Launcher.Extensions { public static class DictionaryExtensions { - public static TKey GetKeyByValue(this Dictionary Dic, TValue value) + public static TKey GetKeyByValue(this Dictionary dic, TValue value) { - List Keys = Dic.Keys.ToList(); + List keys = dic.Keys.ToList(); - for (int x = 0; x < Keys.Count(); x++) + for (var x = 0; x < keys.Count; x++) { - TValue tempValue; - - if (Dic.TryGetValue(Keys[x], out tempValue)) + if (dic.TryGetValue(keys[x], out var tempValue)) { if (tempValue != null && tempValue.Equals(value)) { - return Keys[x]; + return keys[x]; } } } return default; } + + public static TKey GetKeyByInput(this Dictionary dic, + string input) + { + var keys = dic.Keys.ToList(); + var values = dic.Values.ToList(); + + for (var x = 0; x < dic.Count; x++) + { + if (values[x] is string s && (input.ToLower() == s.ToLower() || input.ToLower().StartsWith(s.ToLower()))) + { + return keys[x]; + } + } + + return default; + } } } diff --git a/project/Aki.Launcher.Base/Helpers/LocalizationProvider.cs b/project/Aki.Launcher.Base/Helpers/LocalizationProvider.cs index 16aab96..39a5df3 100644 --- a/project/Aki.Launcher.Base/Helpers/LocalizationProvider.cs +++ b/project/Aki.Launcher.Base/Helpers/LocalizationProvider.cs @@ -16,7 +16,6 @@ using System.ComponentModel; using System.Globalization; using System.IO; using System.Linq; -using System.Text.RegularExpressions; namespace Aki.Launcher.Helpers { @@ -24,11 +23,11 @@ namespace Aki.Launcher.Helpers { public static string DefaultLocaleFolderPath = Path.Join(Environment.CurrentDirectory, "Aki_Data", "Launcher", "Locales"); - public static Dictionary LocaleNameDictionary = GetLocaleDictionary(); + public static Dictionary LocaleNameDictionary = GetLocaleDictionary("native_name"); public static event EventHandler LocaleChanged = delegate { }; - public static void LoadLocaleFromFile(string localeName) + public static void LoadLocalByName(string localeName) { string localeRomanName = LocaleNameDictionary.GetKeyByValue(localeName); @@ -36,7 +35,12 @@ namespace Aki.Launcher.Helpers { localeRomanName = localeName; } + + LoadLocaleFromFile(localeRomanName); + } + public static void LoadLocaleFromFile(string localeRomanName) + { LocaleData newLocale = Json.LoadClassWithoutSaving(Path.Join(DefaultLocaleFolderPath, $"{localeRomanName}.json")); if (newLocale != null) @@ -55,30 +59,24 @@ namespace Aki.Launcher.Helpers //could possibly raise an event here to say why the local wasn't changed. } - private static string GetSystemLocale() - { - string UIlocaleName = CultureInfo.CurrentUICulture.DisplayName; - - var regexMatch = Regex.Match(UIlocaleName, @"^(\w+)"); - - if (regexMatch.Groups.Count == 2) - { - string localRomanName = LocaleNameDictionary.GetValueOrDefault(regexMatch.Groups[1].Value, ""); - - bool localExists = GetAvailableLocales().Where(x => x == localRomanName).Count() > 0; - - if (localExists) - { - return localRomanName; - } - } - - return "English"; - } - public static void TryAutoSetLocale() { - LoadLocaleFromFile(GetSystemLocale()); + // get local dictionary based on ietf_tag property in locale files. like: ("English", "en") + // "English" being the file name + var localeTagDictionary = GetLocaleDictionary("ietf_tag"); + + // get system locale. Like: "en-US" + var tag = CultureInfo.CurrentUICulture.IetfLanguageTag; + + // get the locale file name from the dictionary based on the input tag. If it matches, or starts with the value + var localeRomanName = localeTagDictionary.GetKeyByInput(tag); + + if (String.IsNullOrEmpty(localeRomanName)) + { + localeRomanName = "English"; + } + + LoadLocaleFromFile(localeRomanName); } public static LocaleData GenerateEnglishLocale() @@ -88,6 +86,7 @@ namespace Aki.Launcher.Helpers LocaleData englishLocale = new LocaleData(); #region Set All English Defaults + englishLocale.ietf_tag = "en"; englishLocale.native_name = "English"; englishLocale.retry = "Retry"; englishLocale.server_connecting = "Connecting"; @@ -189,14 +188,14 @@ namespace Aki.Launcher.Helpers return englishLocale; } - public static Dictionary GetLocaleDictionary() + public static Dictionary GetLocaleDictionary(string property) { List localeFiles = new List(Directory.GetFiles(DefaultLocaleFolderPath).Select(x => new FileInfo(x)).ToList()); Dictionary localeDictionary = new Dictionary(); foreach (FileInfo file in localeFiles) { - localeDictionary.Add(file.Name.Replace(".json", ""), Json.GetPropertyByName(file.FullName, "native_name")); + localeDictionary.Add(file.Name.Replace(".json", ""), Json.GetPropertyByName(file.FullName, property)); } return localeDictionary; @@ -215,6 +214,24 @@ namespace Aki.Launcher.Helpers #region All Properties + #region ietf_tag + + private string _ietf_tag; + + public string ietf_tag + { + get => _ietf_tag; + set + { + if (_ietf_tag != value) + { + _ietf_tag = value; + RaisePropertyChanged(nameof(ietf_tag)); + } + } + } + #endregion + #region native_name private string _native_name; public string native_name diff --git a/project/Aki.Launcher/Aki_Data/Launcher/Locales/Chinese (Simplified).json b/project/Aki.Launcher/Aki_Data/Launcher/Locales/Chinese (Simplified).json index 1a245a0..9ddeb28 100644 --- a/project/Aki.Launcher/Aki_Data/Launcher/Locales/Chinese (Simplified).json +++ b/project/Aki.Launcher/Aki_Data/Launcher/Locales/Chinese (Simplified).json @@ -1,4 +1,5 @@ { + "ietf_tag": "zh-hans", "native_name": "简体中文", "retry": "重试", "server_connecting": "连接中", diff --git a/project/Aki.Launcher/Aki_Data/Launcher/Locales/Chinese (Traditional).json b/project/Aki.Launcher/Aki_Data/Launcher/Locales/Chinese (Traditional).json index 8b922ed..59cad68 100644 --- a/project/Aki.Launcher/Aki_Data/Launcher/Locales/Chinese (Traditional).json +++ b/project/Aki.Launcher/Aki_Data/Launcher/Locales/Chinese (Traditional).json @@ -1,4 +1,5 @@ { + "ietf_tag": "zh-hant", "native_name": "繁體中文", "retry": "重試", "server_connecting": "正在連接伺服器", diff --git a/project/Aki.Launcher/Aki_Data/Launcher/Locales/English.json b/project/Aki.Launcher/Aki_Data/Launcher/Locales/English.json index 5378f74..f84bd3f 100644 --- a/project/Aki.Launcher/Aki_Data/Launcher/Locales/English.json +++ b/project/Aki.Launcher/Aki_Data/Launcher/Locales/English.json @@ -1,4 +1,5 @@ { + "ietf_tag": "en", "native_name": "English", "retry": "Retry", "server_connecting": "Connecting", diff --git a/project/Aki.Launcher/Aki_Data/Launcher/Locales/French.json b/project/Aki.Launcher/Aki_Data/Launcher/Locales/French.json index 1fc0d81..acda7fb 100644 --- a/project/Aki.Launcher/Aki_Data/Launcher/Locales/French.json +++ b/project/Aki.Launcher/Aki_Data/Launcher/Locales/French.json @@ -1,4 +1,5 @@ { + "ietf_tag": "fr", "native_name": "Français", "retry": "Réessayer", "server_connecting": "Connexion", diff --git a/project/Aki.Launcher/Aki_Data/Launcher/Locales/German.json b/project/Aki.Launcher/Aki_Data/Launcher/Locales/German.json index 47f7c33..26108c2 100644 --- a/project/Aki.Launcher/Aki_Data/Launcher/Locales/German.json +++ b/project/Aki.Launcher/Aki_Data/Launcher/Locales/German.json @@ -1,4 +1,5 @@ { + "ietf_tag": "de", "native_name": "Deutsch", "retry": "Erneut versuchen", "server_connecting": "Verbinden", diff --git a/project/Aki.Launcher/Aki_Data/Launcher/Locales/Italian.json b/project/Aki.Launcher/Aki_Data/Launcher/Locales/Italian.json index e387087..6b838c9 100644 --- a/project/Aki.Launcher/Aki_Data/Launcher/Locales/Italian.json +++ b/project/Aki.Launcher/Aki_Data/Launcher/Locales/Italian.json @@ -1,4 +1,5 @@ { + "ietf_tag": "it", "native_name": "Italiano", "retry": "Riprova", "server_connecting": "Connessione in corso", diff --git a/project/Aki.Launcher/Aki_Data/Launcher/Locales/Japanese.json b/project/Aki.Launcher/Aki_Data/Launcher/Locales/Japanese.json index 79b1152..4cd3b99 100644 --- a/project/Aki.Launcher/Aki_Data/Launcher/Locales/Japanese.json +++ b/project/Aki.Launcher/Aki_Data/Launcher/Locales/Japanese.json @@ -1,4 +1,5 @@ { + "ietf_tag": "ja", "native_name": "日本語", "retry": "リトライ", "server_connecting": "接続中", diff --git a/project/Aki.Launcher/Aki_Data/Launcher/Locales/Korean.json b/project/Aki.Launcher/Aki_Data/Launcher/Locales/Korean.json index 55f9a1d..f7af75b 100644 --- a/project/Aki.Launcher/Aki_Data/Launcher/Locales/Korean.json +++ b/project/Aki.Launcher/Aki_Data/Launcher/Locales/Korean.json @@ -1,4 +1,5 @@ { + "ietf_tag": "ko", "native_name": "한국어", "retry": "재시도", "server_connecting": "연결 중", diff --git a/project/Aki.Launcher/Aki_Data/Launcher/Locales/Polish.json b/project/Aki.Launcher/Aki_Data/Launcher/Locales/Polish.json index 4bf8bfd..9c2d2dc 100644 --- a/project/Aki.Launcher/Aki_Data/Launcher/Locales/Polish.json +++ b/project/Aki.Launcher/Aki_Data/Launcher/Locales/Polish.json @@ -1,4 +1,5 @@ { + "ietf_tag": "pl", "native_name": "Polski", "retry": "Ponów", "server_connecting": "Łączenie", diff --git a/project/Aki.Launcher/Aki_Data/Launcher/Locales/Russian.json b/project/Aki.Launcher/Aki_Data/Launcher/Locales/Russian.json index 9fac85a..5bd6d44 100644 --- a/project/Aki.Launcher/Aki_Data/Launcher/Locales/Russian.json +++ b/project/Aki.Launcher/Aki_Data/Launcher/Locales/Russian.json @@ -1,4 +1,5 @@ { + "ietf_tag": "ru", "native_name": "Русский", "retry": "Повторить", "server_connecting": "Соединение", diff --git a/project/Aki.Launcher/Aki_Data/Launcher/Locales/Spanish.json b/project/Aki.Launcher/Aki_Data/Launcher/Locales/Spanish.json index 868ea38..1423db8 100644 --- a/project/Aki.Launcher/Aki_Data/Launcher/Locales/Spanish.json +++ b/project/Aki.Launcher/Aki_Data/Launcher/Locales/Spanish.json @@ -1,4 +1,5 @@ { + "ietf_tag": "es", "native_name": "Español", "retry": "Reintentar", "server_connecting": "Conectando", diff --git a/project/Aki.Launcher/ViewModels/MainWindowViewModel.cs b/project/Aki.Launcher/ViewModels/MainWindowViewModel.cs index 1825700..c3306b9 100644 --- a/project/Aki.Launcher/ViewModels/MainWindowViewModel.cs +++ b/project/Aki.Launcher/ViewModels/MainWindowViewModel.cs @@ -7,6 +7,10 @@ using System.IO; using Splat; using Aki.Launcher.Models.Aki; using Aki.Launcher.Helpers; +using Aki.Launcher.ViewModels.Dialogs; +using Avalonia.Threading; +using dialogHost = DialogHost.DialogHost; + namespace Aki.Launcher.ViewModels { @@ -29,6 +33,32 @@ namespace Aki.Launcher.ViewModels LauncherSettingsProvider.Instance.AllowSettings = true; + if (LauncherSettingsProvider.Instance.FirstRun) + { + Dispatcher.UIThread.InvokeAsync(async () => + { + LauncherSettingsProvider.Instance.FirstRun = false; + + LocalizationProvider.TryAutoSetLocale(); + + var viewModel = new ConfirmationDialogViewModel(this, + LocalizationProvider.Instance.copy_live_settings_question, + LocalizationProvider.Instance.yes, + LocalizationProvider.Instance.no); + + var confirmCopySettings = await dialogHost.Show(viewModel); + + if (confirmCopySettings is bool and true) + { + var settingsVm = new SettingsViewModel(this); + + await settingsVm.ResetGameSettingsCommand(); + } + + LauncherSettingsProvider.Instance.SaveSettings(); + }); + } + this.WhenActivated((CompositeDisposable disposables) => { Router.Navigate.Execute(new ConnectServerViewModel(this)); diff --git a/project/Aki.Launcher/ViewModels/ProfileViewModel.cs b/project/Aki.Launcher/ViewModels/ProfileViewModel.cs index 699545c..03d1cbe 100644 --- a/project/Aki.Launcher/ViewModels/ProfileViewModel.cs +++ b/project/Aki.Launcher/ViewModels/ProfileViewModel.cs @@ -8,7 +8,6 @@ using System.Threading.Tasks; using Aki.Launcher.Attributes; using Aki.Launcher.ViewModels.Dialogs; using Avalonia.Threading; -using System.Reactive.Disposables; using System.Diagnostics; using System.IO; using Aki.Launcher.Models.Aki; @@ -62,36 +61,6 @@ namespace Aki.Launcher.ViewModels public ProfileViewModel(IScreen Host) : base(Host) { - this.WhenActivated((CompositeDisposable disposables) => - { - Task.Run(async () => - { - await GameVersionCheck(); - - await Dispatcher.UIThread.InvokeAsync(async () => - { - if (LauncherSettingsProvider.Instance.FirstRun) - { - LauncherSettingsProvider.Instance.FirstRun = false; - - LauncherSettingsProvider.Instance.SaveSettings(); - - var confirmCopySettings = await ShowDialog(new ConfirmationDialogViewModel(Host, - LocalizationProvider.Instance.copy_live_settings_question, - LocalizationProvider.Instance.yes, - LocalizationProvider.Instance.no)); - - if (confirmCopySettings != null && confirmCopySettings is bool confirmed && confirmed) - { - var settingsVM = new SettingsViewModel(Host); - - await settingsVM.ResetGameSettingsCommand(); - } - } - }); - }); - }); - // cache and load side image if profile has a side if(AccountManager.SelectedProfileInfo != null && AccountManager.SelectedProfileInfo.Side != null) {