Bläddra i källkod

Fix startup and translation selection

Ruben 11 månader sedan
förälder
incheckning
02e64a775d

+ 2 - 1
src/PicView.Avalonia.Win32/App.axaml.cs

@@ -57,7 +57,8 @@ public partial class App : Application, IPlatformSpecificService
         try
         {
             settingsExists = await SettingsHelper.LoadSettingsAsync().ConfigureAwait(false);
-            await TranslationHelper.LoadLanguage(SettingsHelper.Settings.UIProperties.UserLanguage);
+            TranslationHelper.Init();
+            //await TranslationHelper.LoadLanguage(SettingsHelper.Settings.UIProperties.UserLanguage);
         }
         catch (TaskCanceledException)
         {

+ 10 - 1
src/PicView.Avalonia/SettingsManagement/LanguageUpdater.cs

@@ -6,8 +6,17 @@ namespace PicView.Avalonia.SettingsManagement;
 
 public static class LanguageUpdater
 {
-    public static void UpdateLanguage(MainViewModel vm)
+    public static async Task UpdateLanguageAsync(MainViewModel vm, bool settingsExists)
     {
+        if (settingsExists)
+        {
+            await TranslationHelper.LoadLanguage(SettingsHelper.Settings.UIProperties.UserLanguage).ConfigureAwait(false);
+        }
+        else
+        {
+            await TranslationHelper.DetermineAndLoadLanguage().ConfigureAwait(false);
+        }
+
         vm.UpdateLanguage();
 
         vm.GetIsFlippedTranslation = vm.ScaleX == 1 ? vm.Flip : vm.UnFlip;

+ 19 - 17
src/PicView.Avalonia/StartUp/StartUpHelper.cs

@@ -42,7 +42,7 @@ public static class StartUpHelper
                 return;
             }
         }
-        
+
         vm.IsLoading = true;
 
         if (SettingsHelper.Settings.WindowProperties.Fullscreen)
@@ -50,29 +50,31 @@ public static class StartUpHelper
             window.Show();
             WindowFunctions.Fullscreen(vm, desktop);
         }
-        
+
         ScreenHelper.UpdateScreenSize(window);
         vm.ImageViewer = new ImageViewer();
         HandleStartUpMenuOrImage(vm, args);
 
-        if (SettingsHelper.Settings.WindowProperties.Maximized)
-        {
-            WindowFunctions.Maximize();
-            window.Show();
-        }
-        else if (SettingsHelper.Settings.WindowProperties.AutoFit)
-        {
-            HandleAutoFit(vm, desktop);
-            window.Show();
-        }
-        else if (!SettingsHelper.Settings.WindowProperties.Fullscreen)
+        if (settingsExists)
         {
-            HandleNormalWindow(vm, window);
-            window.Show();
+            if (SettingsHelper.Settings.WindowProperties.Maximized)
+            {
+                WindowFunctions.Maximize();
+            }
+            else if (SettingsHelper.Settings.WindowProperties.AutoFit)
+            {
+                HandleAutoFit(vm, desktop);
+            }
+            else if (!SettingsHelper.Settings.WindowProperties.Fullscreen)
+            {
+                HandleNormalWindow(vm, window);
+            }
         }
+        window.Show();
+
 
         UIHelper.SetControls(desktop);
-        LanguageUpdater.UpdateLanguage(vm);
+        Task.Run(async () => await LanguageUpdater.UpdateLanguageAsync(vm, settingsExists));
 
         HandleWindowControlSettings(vm, desktop);
 
@@ -88,7 +90,7 @@ public static class StartUpHelper
         {
             Task.Run(() => KeybindingManager.SetDefaultKeybindings(vm.PlatformService));
         }
-        
+
         SetWindowEventHandlers(window);
 
         UIHelper.AddMenus();

+ 1 - 1
src/PicView.Avalonia/Views/LanguageView.axaml.cs

@@ -114,7 +114,7 @@ public partial class LanguageView : UserControl
                 SettingsHelper.Settings.UIProperties.UserLanguage = language;
 
                 await TranslationHelper.LoadLanguage(language).ConfigureAwait(false);
-                LanguageUpdater.UpdateLanguage(vm);
+                await LanguageUpdater.UpdateLanguageAsync(vm, true).ConfigureAwait(false);
             };
         };
     }

+ 43 - 2
src/PicView.Core/Localization/TranslationHelper.cs

@@ -1,7 +1,8 @@
-using PicView.Core.Config;
-using System.Diagnostics;
+using System.Diagnostics;
+using System.Globalization;
 using System.Text.Json;
 using System.Text.Json.Serialization;
+using PicView.Core.Config;
 
 namespace PicView.Core.Localization;
 
@@ -20,6 +21,11 @@ public static class TranslationHelper
         private set;
     }
 
+    public static void Init()
+    {
+        Translation = new LanguageModel();
+    }
+
     public static string GetTranslation(string key)
     {
         if (Translation == null)
@@ -60,6 +66,13 @@ public static class TranslationHelper
         }
     }
 
+    public static async Task DetermineAndLoadLanguage()
+    {
+        var isoLanguageCode = DetermineCorrectLanguage();
+        SettingsHelper.Settings.UIProperties.UserLanguage = isoLanguageCode;
+        await LoadLanguage(isoLanguageCode).ConfigureAwait(false);
+    }
+
     public static IEnumerable<string> GetLanguages()
     {
         var languagesDirectory = GetLanguagesDirectory();
@@ -101,4 +114,32 @@ public static class TranslationHelper
     {
         return Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Config/Languages/");
     }
+    
+    public static string DetermineCorrectLanguage()
+    {
+        var userCulture = CultureInfo.CurrentUICulture;
+        var baseLanguageCode = userCulture.TwoLetterISOLanguageName; // Gets 'da' from 'da-DK'
+
+        // Handle special cases, e.g., Chinese or different regions.
+        switch (baseLanguageCode)
+        {
+            case "zh":
+                // Simplified Chinese vs Traditional Chinese
+                return userCulture.Name switch
+                {
+                    "zh-TW" => "zh-TW",  // Traditional Chinese
+                    "zh-HK" => "zh-TW",  // Treat Hong Kong as Traditional Chinese
+                    _ => "zh-CN"         // Default to Simplified Chinese
+                };
+            case "de":
+                // Handle German-speaking regions (Austria, Germany, Switzerland)
+                return "de";  // Map all 'de-*' to 'de'
+            default:
+                // Fall back to the base language if it's available in the translation files
+                return GetLanguages()
+                    .Any(lang => Path.GetFileNameWithoutExtension(lang) == baseLanguageCode)
+                    ? baseLanguageCode
+                    : "en"; // Default to English if not found
+        }
+    }
 }