LocalizedString.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. namespace PixiEditor.Extensions.Common.Localization;
  2. public struct LocalizedString
  3. {
  4. public static LocalizationKeyShowMode? OverridenKeyFlowMode { get; set; } = null;
  5. private string key;
  6. public string Key
  7. {
  8. get => key;
  9. set
  10. {
  11. key = value;
  12. #if DEBUG_LOCALIZATION
  13. Value = key;
  14. #else
  15. Value = OverridenKeyFlowMode switch
  16. {
  17. LocalizationKeyShowMode.Key => Key,
  18. LocalizationKeyShowMode.ValueKey => $"{GetValue(value)} ({Key})",
  19. LocalizationKeyShowMode.LALALA => $"#~{GetLongString(GetValue(value).Count(x => x == ' ') + 1)}{Math.Abs(Key.GetHashCode()).ToString()[..2]}~#",
  20. _ => GetValue(value)
  21. };
  22. #endif
  23. }
  24. }
  25. public string Value { get; private set; }
  26. public bool IsStatic { get; private set; }
  27. public object[] Parameters { get; set; }
  28. public LocalizedString() { }
  29. public LocalizedString(string key)
  30. {
  31. Key = key;
  32. }
  33. public LocalizedString(string key, params object[] parameters)
  34. {
  35. Parameters = parameters;
  36. Key = key;
  37. }
  38. public static LocalizedString Static(string value)
  39. {
  40. var localized = new LocalizedString();
  41. localized.IsStatic = true;
  42. localized.Value = value;
  43. return localized;
  44. }
  45. public override string ToString()
  46. {
  47. return Value;
  48. }
  49. private string GetValue(string localizationKey)
  50. {
  51. if (string.IsNullOrEmpty(localizationKey))
  52. {
  53. return localizationKey;
  54. }
  55. ILocalizationProvider localizationProvider = ILocalizationProvider.Current;
  56. if (localizationProvider?.LocalizationData == null)
  57. {
  58. return localizationKey;
  59. }
  60. if (!localizationProvider.CurrentLanguage.Locale.ContainsKey(localizationKey))
  61. {
  62. Language defaultLanguage = localizationProvider.DefaultLanguage;
  63. if (localizationProvider.CurrentLanguage == defaultLanguage || !defaultLanguage.Locale.ContainsKey(localizationKey))
  64. {
  65. return localizationKey;
  66. }
  67. return ApplyParameters(defaultLanguage.Locale[localizationKey]);
  68. }
  69. return ApplyParameters(ILocalizationProvider.Current.CurrentLanguage.Locale[localizationKey]);
  70. }
  71. private string GetLongString(int length)
  72. {
  73. if (IsStatic)
  74. {
  75. return Key;
  76. }
  77. return string.Join(' ', Enumerable.Repeat("LaLaLaLaLa", length));
  78. }
  79. private string ApplyParameters(string value)
  80. {
  81. if (Parameters == null || Parameters.Length == 0)
  82. {
  83. return value;
  84. }
  85. try
  86. {
  87. var executedParameters = new object[Parameters.Length];
  88. for (var i = 0; i < Parameters.Length; i++)
  89. {
  90. var parameter = Parameters[i];
  91. object objToExecute = parameter;
  92. if (parameter is LocalizedString str)
  93. {
  94. objToExecute = new LocalizedString(str.Key, str.Parameters).Value;
  95. }
  96. executedParameters[i] = objToExecute;
  97. }
  98. return string.Format(value, executedParameters);
  99. }
  100. catch (FormatException)
  101. {
  102. return value;
  103. }
  104. }
  105. public static implicit operator LocalizedString(string key) => new(key);
  106. public static implicit operator string(LocalizedString localizedString) => localizedString.Value;
  107. }