Selaa lähdekoodia

Added follow system language

CPKreuz 2 vuotta sitten
vanhempi
commit
88efb07573

+ 2 - 0
src/PixiEditor/Localization/ILocalizationProvider.cs

@@ -9,6 +9,8 @@ public interface ILocalizationProvider
     public string LocalizationDataPath { get; }
     public LocalizationData LocalizationData { get; }
     public Language CurrentLanguage { get; set; }
+    public LanguageData SelectedLanguage { get; }
+    public LanguageData FollowSystem { get; }
     public event Action<Language> OnLanguageChanged;
 
     /// <summary>

+ 2 - 2
src/PixiEditor/Localization/LocalizationData.cs

@@ -2,8 +2,8 @@
 
 namespace PixiEditor.Localization;
 
-[DebuggerDisplay("{Languages.Length} Language(s)")]
+[DebuggerDisplay("{Languages.Count} Language(s)")]
 public class LocalizationData
 {
-    public LanguageData[] Languages { get; set; }
+    public List<LanguageData> Languages { get; set; }
 }

+ 16 - 14
src/PixiEditor/Localization/LocalizationProvider.cs

@@ -1,4 +1,5 @@
-using System.IO;
+using System.Globalization;
+using System.IO;
 using PixiEditor.Models.UserPreferences;
 
 namespace PixiEditor.Localization;
@@ -9,6 +10,8 @@ internal class LocalizationProvider : ILocalizationProvider
     public string LocalizationDataPath { get; } = Path.Combine("Data", "Localization", "LocalizationData.json");
     public LocalizationData LocalizationData { get; private set; }
     public Language CurrentLanguage { get; set; }
+    public LanguageData SelectedLanguage { get; private set; }
+    public LanguageData FollowSystem { get; } = new() { Name = "Follow system", Code = "system" };
     public event Action<Language> OnLanguageChanged;
     public void ReloadLanguage() => OnLanguageChanged?.Invoke(CurrentLanguage);
 
@@ -31,27 +34,18 @@ internal class LocalizationProvider : ILocalizationProvider
             throw new InvalidDataException("Localization data is null.");
         }
         
-        if (LocalizationData.Languages is null || LocalizationData.Languages.Length == 0)
+        if (LocalizationData.Languages is null || LocalizationData.Languages.Count == 0)
         {
             throw new InvalidDataException("Localization data does not contain any languages.");
         }
 
+        LocalizationData.Languages.Add(FollowSystem);
+        
         DefaultLanguage = LoadLanguageInternal(LocalizationData.Languages[0]);
         
         string currentLanguageCode = IPreferences.Current.GetPreference<string>("LanguageCode");
 
-        int languageIndex = 0;
-        
-        for (int i = 0; i < LocalizationData.Languages.Length; i++)
-        {
-            if (LocalizationData.Languages[i].Code == currentLanguageCode)
-            {
-                languageIndex = i;
-                break;
-            }
-        }
-        
-        LoadLanguage(LocalizationData.Languages[languageIndex]);
+        LoadLanguage(LocalizationData.Languages.FirstOrDefault(x => x.Code == currentLanguageCode, FollowSystem));
     }
 
     public void LoadLanguage(LanguageData languageData)
@@ -67,7 +61,15 @@ internal class LocalizationProvider : ILocalizationProvider
         }
         
         bool firstLoad = CurrentLanguage is null;
+        
+        SelectedLanguage = languageData;
 
+        if (languageData.Code == FollowSystem.Code)
+        {
+            string osLanguage = CultureInfo.CurrentUICulture.TwoLetterISOLanguageName;
+            languageData = LocalizationData.Languages.FirstOrDefault(x => x.Code == osLanguage, LocalizationData.Languages[0]);
+        }
+        
         CurrentLanguage = LoadLanguageInternal(languageData);
 
         if (!firstLoad)

+ 3 - 2
src/PixiEditor/ViewModels/SubViewModels/UserPreferences/Settings/GeneralSettings.cs

@@ -7,9 +7,10 @@ namespace PixiEditor.ViewModels.SubViewModels.UserPreferences.Settings;
 internal class GeneralSettings : SettingsGroup
 {
     private bool imagePreviewInTaskbar = GetPreference(nameof(ImagePreviewInTaskbar), false);
-    private LanguageData selectedLanguage = ILocalizationProvider.Current.CurrentLanguage.LanguageData;
+    private LanguageData selectedLanguage = ILocalizationProvider.Current.SelectedLanguage;
     private List<LanguageData> availableLanguages = ILocalizationProvider.Current.LocalizationData.Languages
-        .OrderByDescending(x => CultureInfo.CurrentUICulture.TwoLetterISOLanguageName == x.Code || CultureInfo.InstalledUICulture.TwoLetterISOLanguageName == x.Code)
+        .OrderByDescending(x => x == ILocalizationProvider.Current.FollowSystem)
+        .ThenByDescending(x => CultureInfo.CurrentUICulture.TwoLetterISOLanguageName == x.Code || CultureInfo.InstalledUICulture.TwoLetterISOLanguageName == x.Code)
         .ThenBy(x => x.Name).ToList();
 
     public bool ImagePreviewInTaskbar