-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathAppCultureCatalog.cs
More file actions
93 lines (78 loc) · 3.48 KB
/
AppCultureCatalog.cs
File metadata and controls
93 lines (78 loc) · 3.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
using System.Globalization;
namespace PrompterOne.Core.Localization;
public static class AppCultureCatalog
{
public const string DefaultCultureName = EnglishCultureName;
public const string EnglishCultureName = "en";
public const string UkrainianCultureName = "uk";
public const string FrenchCultureName = "fr";
public const string SpanishCultureName = "es";
public const string GermanCultureName = "de";
public const string PortugueseCultureName = "pt";
public const string ItalianCultureName = "it";
private const char CultureSeparator = '-';
private const char AlternateCultureSeparator = '_';
private const string EnglishDisplayName = "English";
private const string FrenchDisplayName = "Français";
private const string GermanDisplayName = "Deutsch";
private const string ItalianDisplayName = "Italiano";
private const string PortugueseDisplayName = "Português";
private const string RussianLanguageName = "ru";
private const string SpanishDisplayName = "Español";
private const string UkrainianDisplayName = "Українська";
private static readonly IReadOnlyList<AppCultureDefinition> SupportedCultureDefinitions =
[
new(EnglishCultureName, EnglishDisplayName),
new(UkrainianCultureName, UkrainianDisplayName),
new(FrenchCultureName, FrenchDisplayName),
new(SpanishCultureName, SpanishDisplayName),
new(ItalianCultureName, ItalianDisplayName),
new(GermanCultureName, GermanDisplayName),
new(PortugueseCultureName, PortugueseDisplayName)
];
private static readonly HashSet<string> SupportedCultures = new(StringComparer.OrdinalIgnoreCase)
{
EnglishCultureName,
UkrainianCultureName,
FrenchCultureName,
SpanishCultureName,
GermanCultureName,
PortugueseCultureName,
ItalianCultureName
};
public static IReadOnlyList<AppCultureDefinition> SupportedCultureDefinitionsInDisplayOrder => SupportedCultureDefinitions;
public static IReadOnlyCollection<string> SupportedCultureNames => SupportedCultures;
public static string ResolvePreferredCulture(IEnumerable<string?> requestedCultures)
{
foreach (var requestedCulture in requestedCultures)
{
var supportedCulture = ResolveSupportedCultureOrNull(requestedCulture);
if (!string.IsNullOrEmpty(supportedCulture))
{
return supportedCulture;
}
}
return DefaultCultureName;
}
public static string ResolveSupportedCulture(string? requestedCulture) =>
ResolveSupportedCultureOrNull(requestedCulture) ?? DefaultCultureName;
public static CultureInfo CreateCulture(string? requestedCulture) =>
CultureInfo.GetCultureInfo(ResolveSupportedCulture(requestedCulture));
private static string? ResolveSupportedCultureOrNull(string? requestedCulture)
{
if (string.IsNullOrWhiteSpace(requestedCulture))
{
return null;
}
var normalized = requestedCulture
.Trim()
.Replace(AlternateCultureSeparator, CultureSeparator)
.ToLowerInvariant();
var languageName = normalized.Split(CultureSeparator, StringSplitOptions.RemoveEmptyEntries)[0];
if (string.Equals(languageName, RussianLanguageName, StringComparison.Ordinal))
{
return DefaultCultureName;
}
return SupportedCultures.Contains(languageName) ? languageName : null;
}
}