Ava UI: Fix locale crash (#6385)

* Fix locale crash

* Apply suggestions from code review

---------

Co-authored-by: Ac_K <Acoustik666@gmail.com>
This commit is contained in:
Isaac Marovitz 2024-03-17 01:27:14 +00:00 committed by GitHub
parent bb8c5ebae1
commit a0552fd78b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -30,28 +30,22 @@ namespace Ryujinx.Ava.Common.Locale
Load(); Load();
} }
public void Load() private void Load()
{ {
// Load the system Language Code. var localeLanguageCode = !string.IsNullOrEmpty(ConfigurationState.Instance.UI.LanguageCode.Value) ?
string localeLanguageCode = CultureInfo.CurrentCulture.Name.Replace('-', '_'); ConfigurationState.Instance.UI.LanguageCode.Value : CultureInfo.CurrentCulture.Name.Replace('-', '_');
// If the view is loaded with the UI Previewer detached, then override it with the saved one or default. // Load en_US as default, if the target language translation is missing or incomplete.
LoadDefaultLanguage();
LoadLanguage(localeLanguageCode);
// Save whatever we ended up with.
if (Program.PreviewerDetached) if (Program.PreviewerDetached)
{ {
if (!string.IsNullOrEmpty(ConfigurationState.Instance.UI.LanguageCode.Value)) ConfigurationState.Instance.UI.LanguageCode.Value = _localeLanguageCode;
{
localeLanguageCode = ConfigurationState.Instance.UI.LanguageCode.Value; ConfigurationState.Instance.ToFileFormat().SaveConfig(Program.ConfigurationPath);
}
else
{
localeLanguageCode = DefaultLanguageCode;
}
} }
// Load en_US as default, if the target language translation is incomplete.
LoadDefaultLanguage();
LoadLanguage(localeLanguageCode);
} }
public string this[LocaleKeys key] public string this[LocaleKeys key]
@ -126,24 +120,42 @@ namespace Ryujinx.Ava.Common.Locale
private void LoadDefaultLanguage() private void LoadDefaultLanguage()
{ {
_localeDefaultStrings = LoadJsonLanguage(); _localeDefaultStrings = LoadJsonLanguage(DefaultLanguageCode);
} }
public void LoadLanguage(string languageCode) public void LoadLanguage(string languageCode)
{ {
foreach (var item in LoadJsonLanguage(languageCode)) var locale = LoadJsonLanguage(languageCode);
if (locale == null)
{
_localeLanguageCode = DefaultLanguageCode;
locale = _localeDefaultStrings;
}
else
{
_localeLanguageCode = languageCode;
}
foreach (var item in locale)
{ {
this[item.Key] = item.Value; this[item.Key] = item.Value;
} }
_localeLanguageCode = languageCode;
LocaleChanged?.Invoke(); LocaleChanged?.Invoke();
} }
private static Dictionary<LocaleKeys, string> LoadJsonLanguage(string languageCode = DefaultLanguageCode) private static Dictionary<LocaleKeys, string> LoadJsonLanguage(string languageCode)
{ {
var localeStrings = new Dictionary<LocaleKeys, string>(); var localeStrings = new Dictionary<LocaleKeys, string>();
string languageJson = EmbeddedResources.ReadAllText($"Ryujinx/Assets/Locales/{languageCode}.json"); string languageJson = EmbeddedResources.ReadAllText($"Ryujinx/Assets/Locales/{languageCode}.json");
if (languageJson == null)
{
// We were unable to find file for that language code.
return null;
}
var strings = JsonHelper.Deserialize(languageJson, CommonJsonContext.Default.StringDictionary); var strings = JsonHelper.Deserialize(languageJson, CommonJsonContext.Default.StringDictionary);
foreach (var item in strings) foreach (var item in strings)