|
@@ -38,6 +38,7 @@ namespace Emby.Server.Implementations.Localization
|
|
|
|
|
|
|
|
private readonly JsonSerializerOptions _jsonOptions = JsonDefaults.Options;
|
|
private readonly JsonSerializerOptions _jsonOptions = JsonDefaults.Options;
|
|
|
|
|
|
|
|
|
|
+ private readonly ConcurrentDictionary<string, CultureDto?> _cultureCache = new(StringComparer.OrdinalIgnoreCase);
|
|
|
private List<CultureDto> _cultures = [];
|
|
private List<CultureDto> _cultures = [];
|
|
|
|
|
|
|
|
private FrozenDictionary<string, string> _iso6392BtoT = null!;
|
|
private FrozenDictionary<string, string> _iso6392BtoT = null!;
|
|
@@ -161,6 +162,7 @@ namespace Emby.Server.Implementations.Localization
|
|
|
list.Add(new CultureDto(name, displayname, twoCharName, threeLetterNames));
|
|
list.Add(new CultureDto(name, displayname, twoCharName, threeLetterNames));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ _cultureCache.Clear();
|
|
|
_cultures = list;
|
|
_cultures = list;
|
|
|
_iso6392BtoT = iso6392BtoTdict.ToFrozenDictionary(StringComparer.OrdinalIgnoreCase);
|
|
_iso6392BtoT = iso6392BtoTdict.ToFrozenDictionary(StringComparer.OrdinalIgnoreCase);
|
|
|
}
|
|
}
|
|
@@ -169,20 +171,31 @@ namespace Emby.Server.Implementations.Localization
|
|
|
/// <inheritdoc />
|
|
/// <inheritdoc />
|
|
|
public CultureDto? FindLanguageInfo(string language)
|
|
public CultureDto? FindLanguageInfo(string language)
|
|
|
{
|
|
{
|
|
|
- // TODO language should ideally be a ReadOnlySpan but moq cannot mock ref structs
|
|
|
|
|
- for (var i = 0; i < _cultures.Count; i++)
|
|
|
|
|
|
|
+ if (string.IsNullOrEmpty(language))
|
|
|
{
|
|
{
|
|
|
- var culture = _cultures[i];
|
|
|
|
|
- if (language.Equals(culture.DisplayName, StringComparison.OrdinalIgnoreCase)
|
|
|
|
|
- || language.Equals(culture.Name, StringComparison.OrdinalIgnoreCase)
|
|
|
|
|
- || culture.ThreeLetterISOLanguageNames.Contains(language, StringComparison.OrdinalIgnoreCase)
|
|
|
|
|
- || language.Equals(culture.TwoLetterISOLanguageName, StringComparison.OrdinalIgnoreCase))
|
|
|
|
|
- {
|
|
|
|
|
- return culture;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ return null;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- return default;
|
|
|
|
|
|
|
+ return _cultureCache.GetOrAdd(
|
|
|
|
|
+ language,
|
|
|
|
|
+ static (lang, cultures) =>
|
|
|
|
|
+ {
|
|
|
|
|
+ // TODO language should ideally be a ReadOnlySpan but moq cannot mock ref structs
|
|
|
|
|
+ for (var i = 0; i < cultures.Count; i++)
|
|
|
|
|
+ {
|
|
|
|
|
+ var culture = cultures[i];
|
|
|
|
|
+ if (lang.Equals(culture.DisplayName, StringComparison.OrdinalIgnoreCase)
|
|
|
|
|
+ || lang.Equals(culture.Name, StringComparison.OrdinalIgnoreCase)
|
|
|
|
|
+ || culture.ThreeLetterISOLanguageNames.Contains(lang, StringComparison.OrdinalIgnoreCase)
|
|
|
|
|
+ || lang.Equals(culture.TwoLetterISOLanguageName, StringComparison.OrdinalIgnoreCase))
|
|
|
|
|
+ {
|
|
|
|
|
+ return culture;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return null;
|
|
|
|
|
+ },
|
|
|
|
|
+ _cultures);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/// <inheritdoc />
|
|
/// <inheritdoc />
|