ソースを参照

misc: Cache LocalesJson when loading locale

Evan Husted 1 年間 前
コミット
77ef82d92a

+ 8 - 2
src/Ryujinx.Common/Utilities/JsonHelper.cs

@@ -1,3 +1,4 @@
+using System;
 using System.IO;
 using System.Text;
 using System.Text.Json;
@@ -27,9 +28,14 @@ namespace Ryujinx.Common.Utilities
                 ReadCommentHandling = JsonCommentHandling.Skip
             };
 
-        public static string Serialize<T>(T value, JsonTypeInfo<T> typeInfo) => JsonSerializer.Serialize(value, typeInfo);
+        public static string Serialize<T>(T value, JsonTypeInfo<T> typeInfo) 
+            => JsonSerializer.Serialize(value, typeInfo);
 
-        public static T Deserialize<T>(string value, JsonTypeInfo<T> typeInfo) => JsonSerializer.Deserialize(value, typeInfo);
+        public static T Deserialize<T>(string value, JsonTypeInfo<T> typeInfo) 
+            => JsonSerializer.Deserialize(value, typeInfo);
+
+        public static T Deserialize<T>(ReadOnlySpan<byte> utf8Value, JsonTypeInfo<T> typeInfo) 
+            => JsonSerializer.Deserialize<T>(utf8Value, typeInfo);
 
         public static void SerializeToFile<T>(string filePath, T value, JsonTypeInfo<T> typeInfo)
         {

+ 19 - 28
src/Ryujinx/Common/LocaleManager.cs

@@ -1,3 +1,4 @@
+using Gommon;
 using Ryujinx.Ava.UI.ViewModels;
 using Ryujinx.Common;
 using Ryujinx.Common.Logging;
@@ -7,12 +8,7 @@ using System;
 using System.Collections.Concurrent;
 using System.Collections.Generic;
 using System.Globalization;
-using System.IO;
-using System.Linq;
-using System.Text.Encodings.Web;
-using System.Text.Json;
 using System.Text.Json.Serialization;
-using System.Text.Unicode;
 
 namespace Ryujinx.Ava.Common.Locale
 {
@@ -147,39 +143,34 @@ namespace Ryujinx.Ava.Common.Locale
             LocaleChanged?.Invoke();
         }
 
+        #nullable enable
+
+        private static LocalesJson? _localeData;
+        
+        #nullable disable
+
         private static Dictionary<LocaleKeys, string> LoadJsonLanguage(string languageCode)
         {
             var localeStrings = new Dictionary<LocaleKeys, string>();
-            string fileData = EmbeddedResources.ReadAllText($"Ryujinx/Assets/locales.json");
-
-            if (fileData == null)
-            {
-                // We were unable to find file for that language code.
-                return null;
-            }
 
-            LocalesJson json = JsonHelper.Deserialize(fileData, LocalesJsonContext.Default.LocalesJson);
+            _localeData ??= EmbeddedResources.ReadAllText("Ryujinx/Assets/locales.json")
+                .Into(it => JsonHelper.Deserialize(it, LocalesJsonContext.Default.LocalesJson));
 
-            foreach (LocalesEntry locale in json.Locales)
+            foreach (LocalesEntry locale in _localeData.Value.Locales)
             {
-                if (locale.Translations.Count != json.Languages.Count)
+                if (locale.Translations.Count != _localeData.Value.Languages.Count)
                 {
                     Logger.Error?.Print(LogClass.UI, $"Locale key {{{locale.ID}}} is missing languages!");
                     throw new Exception("Missing locale data!");
                 }
 
-                if (Enum.TryParse<LocaleKeys>(locale.ID, out var localeKey))
-                {
-                    if (locale.Translations.TryGetValue(languageCode, out string val) && val != "")
-                    {
-                        localeStrings[localeKey] = val;
-                    }
-                    else
-                    {
-                        locale.Translations.TryGetValue("en_US", out val);
-                        localeStrings[localeKey] = val;
-                    }
-                }
+                if (!Enum.TryParse<LocaleKeys>(locale.ID, out var localeKey))
+                    continue;
+
+                localeStrings[localeKey] =
+                    locale.Translations.TryGetValue(languageCode, out string val) && val != string.Empty
+                        ? val
+                        : locale.Translations[DefaultLanguageCode];
             }
 
             return localeStrings;
@@ -200,5 +191,5 @@ namespace Ryujinx.Ava.Common.Locale
 
     [JsonSourceGenerationOptions(WriteIndented = true)]
     [JsonSerializable(typeof(LocalesJson))]
-    internal partial class LocalesJsonContext : JsonSerializerContext { }
+    internal partial class LocalesJsonContext : JsonSerializerContext;
 }