diff options
| author | TSR Berry <20988865+TSRBerry@users.noreply.github.com> | 2023-04-08 01:22:00 +0200 |
|---|---|---|
| committer | Mary <thog@protonmail.com> | 2023-04-27 23:51:14 +0200 |
| commit | cee712105850ac3385cd0091a923438167433f9f (patch) | |
| tree | 4a5274b21d8b7f938c0d0ce18736d3f2993b11b1 /src/Ryujinx.Ava/Common/Locale | |
| parent | cd124bda587ef09668a971fa1cac1c3f0cfc9f21 (diff) | |
Move solution and projects to src
Diffstat (limited to 'src/Ryujinx.Ava/Common/Locale')
| -rw-r--r-- | src/Ryujinx.Ava/Common/Locale/LocaleExtension.cs | 30 | ||||
| -rw-r--r-- | src/Ryujinx.Ava/Common/Locale/LocaleManager.cs | 146 |
2 files changed, 176 insertions, 0 deletions
diff --git a/src/Ryujinx.Ava/Common/Locale/LocaleExtension.cs b/src/Ryujinx.Ava/Common/Locale/LocaleExtension.cs new file mode 100644 index 00000000..b82c405d --- /dev/null +++ b/src/Ryujinx.Ava/Common/Locale/LocaleExtension.cs @@ -0,0 +1,30 @@ +using Avalonia.Data; +using Avalonia.Markup.Xaml; +using Avalonia.Markup.Xaml.MarkupExtensions; +using System; + +namespace Ryujinx.Ava.Common.Locale +{ + internal class LocaleExtension : MarkupExtension + { + public LocaleExtension(LocaleKeys key) + { + Key = key; + } + + public LocaleKeys Key { get; } + + public override object ProvideValue(IServiceProvider serviceProvider) + { + LocaleKeys keyToUse = Key; + + ReflectionBindingExtension binding = new($"[{keyToUse}]") + { + Mode = BindingMode.OneWay, + Source = LocaleManager.Instance + }; + + return binding.ProvideValue(serviceProvider); + } + } +}
\ No newline at end of file diff --git a/src/Ryujinx.Ava/Common/Locale/LocaleManager.cs b/src/Ryujinx.Ava/Common/Locale/LocaleManager.cs new file mode 100644 index 00000000..464ab780 --- /dev/null +++ b/src/Ryujinx.Ava/Common/Locale/LocaleManager.cs @@ -0,0 +1,146 @@ +using Ryujinx.Ava.UI.ViewModels; +using Ryujinx.Common; +using Ryujinx.Common.Utilities; +using Ryujinx.Ui.Common.Configuration; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Globalization; + +namespace Ryujinx.Ava.Common.Locale +{ + class LocaleManager : BaseModel + { + private const string DefaultLanguageCode = "en_US"; + + private Dictionary<LocaleKeys, string> _localeStrings; + private Dictionary<LocaleKeys, string> _localeDefaultStrings; + private readonly ConcurrentDictionary<LocaleKeys, object[]> _dynamicValues; + + public static LocaleManager Instance { get; } = new LocaleManager(); + + public LocaleManager() + { + _localeStrings = new Dictionary<LocaleKeys, string>(); + _localeDefaultStrings = new Dictionary<LocaleKeys, string>(); + _dynamicValues = new ConcurrentDictionary<LocaleKeys, object[]>(); + + Load(); + } + + public void Load() + { + // Load the system Language Code. + string localeLanguageCode = CultureInfo.CurrentCulture.Name.Replace('-', '_'); + + // If the view is loaded with the UI Previewer detached, then override it with the saved one or default. + if (Program.PreviewerDetached) + { + if (!string.IsNullOrEmpty(ConfigurationState.Instance.Ui.LanguageCode.Value)) + { + localeLanguageCode = ConfigurationState.Instance.Ui.LanguageCode.Value; + } + else + { + localeLanguageCode = DefaultLanguageCode; + } + } + + // Load en_US as default, if the target language translation is incomplete. + LoadDefaultLanguage(); + + LoadLanguage(localeLanguageCode); + } + + public string this[LocaleKeys key] + { + get + { + // Check if the locale contains the key. + if (_localeStrings.TryGetValue(key, out string value)) + { + // Check if the localized string needs to be formatted. + if (_dynamicValues.TryGetValue(key, out var dynamicValue)) + { + try + { + return string.Format(value, dynamicValue); + } + catch (Exception) + { + // If formatting failed use the default text instead. + if (_localeDefaultStrings.TryGetValue(key, out value)) + { + try + { + return string.Format(value, dynamicValue); + } + catch (Exception) + { + // If formatting the default text failed return the key. + return key.ToString(); + } + } + } + } + + return value; + } + + // If the locale doesn't contain the key return the default one. + if (_localeDefaultStrings.TryGetValue(key, out string defaultValue)) + { + return defaultValue; + } + + // If the locale text doesn't exist return the key. + return key.ToString(); + } + set + { + _localeStrings[key] = value; + + OnPropertyChanged(); + } + } + + public string UpdateAndGetDynamicValue(LocaleKeys key, params object[] values) + { + _dynamicValues[key] = values; + + OnPropertyChanged("Item"); + + return this[key]; + } + + private void LoadDefaultLanguage() + { + _localeDefaultStrings = LoadJsonLanguage(); + } + + public void LoadLanguage(string languageCode) + { + foreach (var item in LoadJsonLanguage(languageCode)) + { + this[item.Key] = item.Value; + } + } + + private Dictionary<LocaleKeys, string> LoadJsonLanguage(string languageCode = DefaultLanguageCode) + { + var localeStrings = new Dictionary<LocaleKeys, string>(); + string languageJson = EmbeddedResources.ReadAllText($"Ryujinx.Ava/Assets/Locales/{languageCode}.json"); + var strings = JsonHelper.Deserialize(languageJson, CommonJsonContext.Default.StringDictionary); + + foreach (var item in strings) + { + if (Enum.TryParse<LocaleKeys>(item.Key, out var key)) + { + localeStrings[key] = item.Value; + } + } + + return localeStrings; + } + } +}
\ No newline at end of file |
