From d4d42dc899d4b0924d6ace9bf106cba39959407c Mon Sep 17 00:00:00 2001 From: flatron4eg Date: Wed, 19 Jun 2024 23:49:44 +0300 Subject: [PATCH] Move message formatter in LanguageEngine, add locale for message formatter --- .../LanguageEngineTests.cs | 2 +- .../LanguageEngine.cs | 39 +++++++++++-------- .../UniGetUI.Core.LanguageEngine.csproj | 4 ++ src/UniGetUI.Core.Tools/Tools.cs | 14 +++---- .../UniGetUI.Core.Tools.csproj | 4 -- .../AbstractPackagesPage.xaml.cs | 2 +- 6 files changed, 34 insertions(+), 31 deletions(-) diff --git a/src/UniGetUI.Core.Language.Tests/LanguageEngineTests.cs b/src/UniGetUI.Core.Language.Tests/LanguageEngineTests.cs index 1ed1be4ec..2895d9af1 100644 --- a/src/UniGetUI.Core.Language.Tests/LanguageEngineTests.cs +++ b/src/UniGetUI.Core.Language.Tests/LanguageEngineTests.cs @@ -46,7 +46,7 @@ public void LocalFallbackTest() { LanguageEngine engine = new(); engine.LoadLanguage("random-nonexistent-language"); - Assert.Equal("en", engine.Translate("locale")); + Assert.Equal("en", engine.Locale); } [Fact] diff --git a/src/UniGetUI.Core.LanguageEngine/LanguageEngine.cs b/src/UniGetUI.Core.LanguageEngine/LanguageEngine.cs index 8a511eb33..f67cf519c 100644 --- a/src/UniGetUI.Core.LanguageEngine/LanguageEngine.cs +++ b/src/UniGetUI.Core.LanguageEngine/LanguageEngine.cs @@ -1,4 +1,6 @@ -using System.Text.Json.Nodes; +using System.Diagnostics.CodeAnalysis; +using System.Text.Json.Nodes; +using Jeffijoe.MessageFormat; using UniGetUI.Core.Data; using UniGetUI.Core.Logging; using UniGetUI.Core.SettingsEngine; @@ -10,6 +12,11 @@ public class LanguageEngine { private Dictionary MainLangDict = new(); + [NotNull] + public string? Locale { get; private set; } + + private MessageFormatter? Formatter; + public LanguageEngine(string ForceLanguage = "") { string LangName = Settings.GetValue("PreferredLanguage"); @@ -26,23 +33,16 @@ public LanguageEngine(string ForceLanguage = "") /// the language code public void LoadLanguage(string lang) { - if (LanguageData.LanguageReference.ContainsKey(lang)) - { - MainLangDict = LoadLanguageFile(lang); - MainLangDict.TryAdd("locale", lang); - } - else if (LanguageData.LanguageReference.ContainsKey(lang[0..2])) - { - MainLangDict = LoadLanguageFile(lang[0..2]); - MainLangDict.TryAdd("locale", lang[0..2]); - } - else - { - MainLangDict = LoadLanguageFile("en"); - MainLangDict.TryAdd("locale", "en"); - } + Locale = LanguageData.LanguageReference.ContainsKey(lang) + ? lang + : LanguageData.LanguageReference.ContainsKey(lang[0..2]) + ? lang[0..2] + : "en"; + MainLangDict = LoadLanguageFile(lang); + Formatter = new() { Locale = Locale.Replace('_', '-') }; + LoadStaticTranslation(); - Logger.Info("Loaded language locale: " + MainLangDict["locale"]); + Logger.Info("Loaded language locale: " + Locale); } public Dictionary LoadLanguageFile(string LangKey, bool ForceBundled = false) @@ -144,5 +144,10 @@ public string Translate(string key) else return key.Replace("WingetUI", "UniGetUI"); } + + public string Translate(string key, Dictionary dict) + { + return Formatter!.FormatMessage(Translate(key), dict); + } } } diff --git a/src/UniGetUI.Core.LanguageEngine/UniGetUI.Core.LanguageEngine.csproj b/src/UniGetUI.Core.LanguageEngine/UniGetUI.Core.LanguageEngine.csproj index 9baedd06a..9f784a894 100644 --- a/src/UniGetUI.Core.LanguageEngine/UniGetUI.Core.LanguageEngine.csproj +++ b/src/UniGetUI.Core.LanguageEngine/UniGetUI.Core.LanguageEngine.csproj @@ -26,6 +26,10 @@ enable + + + + diff --git a/src/UniGetUI.Core.Tools/Tools.cs b/src/UniGetUI.Core.Tools/Tools.cs index 5f8dccc06..d7c7b2305 100644 --- a/src/UniGetUI.Core.Tools/Tools.cs +++ b/src/UniGetUI.Core.Tools/Tools.cs @@ -1,5 +1,4 @@ -using Jeffijoe.MessageFormat; -using System.Diagnostics; +using System.Diagnostics; using System.Globalization; using System.Net; using System.Security.Cryptography; @@ -19,7 +18,7 @@ public static class CoreTools AutomaticDecompression = DecompressionMethods.All }; - private static LanguageEngine? LanguageEngine; + private static LanguageEngine LanguageEngine = new(); /// /// Translate a string to the current language @@ -27,23 +26,22 @@ public static class CoreTools /// The string to translate /// The translated string if available, the original string otherwise public static string Translate(string text) { - if(LanguageEngine == null) LanguageEngine = new LanguageEngine(); return LanguageEngine.Translate(text); } public static string Translate(string text, Dictionary dict) { - return MessageFormatter.Format(Translate(text), dict); + return LanguageEngine.Translate(text, dict); } public static string Translate(string text, params object[] values) { - Dictionary dict = new(); + Dictionary dict = []; foreach ((object item, int index) in values.Select((item, index) => (item, index))) { dict.Add(index.ToString(), item); } - return MessageFormatter.Format(Translate(text), dict); + return Translate(text, dict); } public static void ReloadLanguageEngineInstance(string ForceLanguage = "") @@ -152,7 +150,7 @@ public static void ReportFatalException(Exception e) string LangName = "Unknown"; try { - LangName = Translate("langName"); + LangName = LanguageEngine.Locale; } catch { } diff --git a/src/UniGetUI.Core.Tools/UniGetUI.Core.Tools.csproj b/src/UniGetUI.Core.Tools/UniGetUI.Core.Tools.csproj index 2d0272625..d07f72acd 100644 --- a/src/UniGetUI.Core.Tools/UniGetUI.Core.Tools.csproj +++ b/src/UniGetUI.Core.Tools/UniGetUI.Core.Tools.csproj @@ -25,10 +25,6 @@ enable - - - - diff --git a/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs b/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs index 2219c401a..acf3ce02d 100644 --- a/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs +++ b/src/UniGetUI/Interface/SoftwarePages/AbstractPackagesPage.xaml.cs @@ -107,7 +107,7 @@ protected string NoMatches_SubtitleText get { return CoreTools.Translate("{0} packages were found, {1} of which match the specified filters.", - Packages.Count.ToString(), FilteredPackages.Count()) + Packages.Count, FilteredPackages.Count()) + " " + (SHOW_LAST_CHECKED_TIME? CoreTools.Translate("(Last checked: {0})", LastPackageLoadTime.ToString()): ""); } }