LocaleManager.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. using Ryujinx.Ava.UI.ViewModels;
  2. using Ryujinx.Common;
  3. using Ryujinx.Common.Utilities;
  4. using Ryujinx.Ui.Common.Configuration;
  5. using System;
  6. using System.Collections.Concurrent;
  7. using System.Collections.Generic;
  8. using System.Globalization;
  9. using System.Text.Json;
  10. namespace Ryujinx.Ava.Common.Locale
  11. {
  12. class LocaleManager : BaseModel
  13. {
  14. private const string DefaultLanguageCode = "en_US";
  15. private Dictionary<LocaleKeys, string> _localeStrings;
  16. private ConcurrentDictionary<LocaleKeys, object[]> _dynamicValues;
  17. public static LocaleManager Instance { get; } = new LocaleManager();
  18. public Dictionary<LocaleKeys, string> LocaleStrings { get => _localeStrings; set => _localeStrings = value; }
  19. public LocaleManager()
  20. {
  21. _localeStrings = new Dictionary<LocaleKeys, string>();
  22. _dynamicValues = new ConcurrentDictionary<LocaleKeys, object[]>();
  23. Load();
  24. }
  25. public void Load()
  26. {
  27. string localeLanguageCode = CultureInfo.CurrentCulture.Name.Replace('-', '_');
  28. if (Program.PreviewerDetached)
  29. {
  30. if (!string.IsNullOrEmpty(ConfigurationState.Instance.Ui.LanguageCode.Value))
  31. {
  32. localeLanguageCode = ConfigurationState.Instance.Ui.LanguageCode.Value;
  33. }
  34. }
  35. // Load english first, if the target language translation is incomplete, we default to english.
  36. LoadDefaultLanguage();
  37. if (localeLanguageCode != DefaultLanguageCode)
  38. {
  39. LoadLanguage(localeLanguageCode);
  40. }
  41. }
  42. public string this[LocaleKeys key]
  43. {
  44. get
  45. {
  46. if (_localeStrings.TryGetValue(key, out string value))
  47. {
  48. if (_dynamicValues.TryGetValue(key, out var dynamicValue))
  49. {
  50. return string.Format(value, dynamicValue);
  51. }
  52. return value;
  53. }
  54. return key.ToString();
  55. }
  56. set
  57. {
  58. _localeStrings[key] = value;
  59. OnPropertyChanged();
  60. }
  61. }
  62. public void UpdateDynamicValue(LocaleKeys key, params object[] values)
  63. {
  64. _dynamicValues[key] = values;
  65. OnPropertyChanged("Item");
  66. }
  67. public void LoadDefaultLanguage()
  68. {
  69. LoadLanguage(DefaultLanguageCode);
  70. }
  71. public void LoadLanguage(string languageCode)
  72. {
  73. string languageJson = EmbeddedResources.ReadAllText($"Ryujinx.Ava/Assets/Locales/{languageCode}.json");
  74. if (languageJson == null)
  75. {
  76. return;
  77. }
  78. var strings = JsonHelper.Deserialize<Dictionary<string, string>>(languageJson);
  79. foreach (var item in strings)
  80. {
  81. if (Enum.TryParse<LocaleKeys>(item.Key, out var key))
  82. {
  83. this[key] = item.Value;
  84. }
  85. }
  86. if (Program.PreviewerDetached)
  87. {
  88. ConfigurationState.Instance.Ui.LanguageCode.Value = languageCode;
  89. ConfigurationState.Instance.ToFileFormat().SaveConfig(Program.ConfigurationPath);
  90. }
  91. }
  92. }
  93. }