diff --git a/RemnantSaveGuardian/App.config b/RemnantSaveGuardian/App.config index 2632aa2..fef8e07 100644 --- a/RemnantSaveGuardian/App.config +++ b/RemnantSaveGuardian/App.config @@ -115,6 +115,9 @@ 650 + + + \ No newline at end of file diff --git a/RemnantSaveGuardian/App.xaml.cs b/RemnantSaveGuardian/App.xaml.cs index 5ed42cd..482f501 100644 --- a/RemnantSaveGuardian/App.xaml.cs +++ b/RemnantSaveGuardian/App.xaml.cs @@ -2,11 +2,16 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using RemnantSaveGuardian.Models; +using RemnantSaveGuardian.Properties; using RemnantSaveGuardian.Services; +using System; +using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; +using System.Linq; using System.Reflection; +using System.Resources; using System.Threading; using System.Windows; using System.Windows.Markup; @@ -81,15 +86,32 @@ public static T GetService() private async void OnStartup(object sender, StartupEventArgs e) { var culture = CultureInfo.CurrentCulture; - //var culture = new CultureInfo("zh-TW"); + var cultures = EnumerateSupportedCultures(); + Current.Properties["langs"] = cultures; + if(Settings.Default.Language != "") + { + culture = cultures.First(e => e.Name == Settings.Default.Language); + } + Thread.CurrentThread.CurrentCulture = culture; WPFLocalizeExtension.Engine.LocalizeDictionary.Instance.Culture = culture; + FrameworkElement.LanguageProperty.OverrideMetadata( typeof(FrameworkElement), - new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag))); + new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(culture.IetfLanguageTag))); await _host.StartAsync(); } + private CultureInfo[] EnumerateSupportedCultures() + { + CultureInfo[] culture = CultureInfo.GetCultures(CultureTypes.AllCultures); + + string exeLocation = Path.GetDirectoryName(Uri.UnescapeDataString(new UriBuilder(Assembly.GetExecutingAssembly().CodeBase).Path)); + + var c = culture.Where(cultureInfo => Directory.Exists(Path.Combine(exeLocation, cultureInfo.Name)) && cultureInfo.Name != "").ToArray(); + return c; + } + /// /// Occurs when the application is closing. /// diff --git a/RemnantSaveGuardian/LocalizationProvider.cs b/RemnantSaveGuardian/LocalizationProvider.cs index 88606b8..c906c56 100644 --- a/RemnantSaveGuardian/LocalizationProvider.cs +++ b/RemnantSaveGuardian/LocalizationProvider.cs @@ -78,11 +78,18 @@ public static string GameT(string key) { return T(key, new LocalizationOptions { { "namespace", "GameStrings" } }); } - - public static List AvailableLocalizations() + public static bool Has(string key, LocalizationOptions options) + { + var val = GetLocalizedValue(key, options); + if (val == null || val == "") + { + return false; + } + return true; + } + public static bool GameTHas(string key) { - var cultures = WPFLocalizeExtension.Engine.LocalizeDictionary.Instance.MergedAvailableCultures; - return cultures.Select(c => c.Name).ToList(); + return Has(key, new LocalizationOptions { { "namespace", "GameStrings" } }); } } diff --git a/RemnantSaveGuardian/Properties/Settings.Designer.cs b/RemnantSaveGuardian/Properties/Settings.Designer.cs index 7111518..efb6f45 100644 --- a/RemnantSaveGuardian/Properties/Settings.Designer.cs +++ b/RemnantSaveGuardian/Properties/Settings.Designer.cs @@ -12,7 +12,7 @@ namespace RemnantSaveGuardian.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.6.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.7.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); @@ -454,5 +454,17 @@ public int WindowHeight { this["WindowHeight"] = value; } } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string Language { + get { + return ((string)(this["Language"])); + } + set { + this["Language"] = value; + } + } } } diff --git a/RemnantSaveGuardian/Properties/Settings.settings b/RemnantSaveGuardian/Properties/Settings.settings index 5eaa989..422f344 100644 --- a/RemnantSaveGuardian/Properties/Settings.settings +++ b/RemnantSaveGuardian/Properties/Settings.settings @@ -110,5 +110,8 @@ 650 + + + \ No newline at end of file diff --git a/RemnantSaveGuardian/Views/Pages/BackupsPage.xaml.cs b/RemnantSaveGuardian/Views/Pages/BackupsPage.xaml.cs index 37165c1..c287c4c 100644 --- a/RemnantSaveGuardian/Views/Pages/BackupsPage.xaml.cs +++ b/RemnantSaveGuardian/Views/Pages/BackupsPage.xaml.cs @@ -89,7 +89,7 @@ public BackupsPage(ViewModels.BackupsViewModel viewModel) SaveWatcher.SaveUpdated += SaveWatcher_SaveUpdated; btnStartGame.IsEnabled = !IsRemnantRunning(); - + Properties.Settings.Default.PropertyChanged += Default_PropertyChanged; loadBackups(); } catch (Exception ex) { Logger.Error($"Error loading backups page: {ex}"); @@ -771,6 +771,12 @@ private void refreshBackups() dataBackups.ItemsSource = listBackups; dataBackups.Items.SortDescriptions.Add(sorting); } + + private void Default_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e) + { + if(e.PropertyName == "Language") + dataBackups.Items.Refresh(); + } } public class BackupSaveViewedEventArgs : EventArgs diff --git a/RemnantSaveGuardian/Views/Pages/SettingsPage.xaml b/RemnantSaveGuardian/Views/Pages/SettingsPage.xaml index fe794b4..5cefedd 100644 --- a/RemnantSaveGuardian/Views/Pages/SettingsPage.xaml +++ b/RemnantSaveGuardian/Views/Pages/SettingsPage.xaml @@ -112,11 +112,17 @@ + + + +