-
Notifications
You must be signed in to change notification settings - Fork 803
Expand file tree
/
Copy pathLocalizationManager.cs
More file actions
133 lines (116 loc) · 5.22 KB
/
LocalizationManager.cs
File metadata and controls
133 lines (116 loc) · 5.22 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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
namespace NETworkManager.Localization;
/// <summary>
/// Class provides variables/methods to manage localization.
/// </summary>
public class LocalizationManager
{
/// <summary>
/// Constant for the default culture code.
/// </summary>
private const string DefaultCultureCode = "en-US";
/// <summary>
/// Constant with the path to the flag images.
/// </summary>
private const string BaseFlagImageUri =
@"pack://application:,,,/NETworkManager.Localization;component/Resources/Flags/";
/// <summary>
/// Variable for the instance of the class.
/// </summary>
private static LocalizationManager _instance;
/// <summary>
/// Create an instance and load the language based on the culture code.
/// </summary>
/// <param name="cultureCode">Culture code (default is "en-US"). See also <see cref="LocalizationInfo.Code" />.</param>
private LocalizationManager(string cultureCode = DefaultCultureCode)
{
if (string.IsNullOrEmpty(cultureCode))
cultureCode = CultureInfo.CurrentCulture.Name;
var info = GetLocalizationInfoBasedOnCode(cultureCode) ?? List.First();
if (info.Code != List.First().Code)
{
Change(info);
}
else
{
Current = info;
Culture = new CultureInfo(info.Code);
}
}
/// <summary>
/// List with all <see cref="LocalizationInfo" />s.
/// </summary>
public static List<LocalizationInfo> List =>
[
// Official
new LocalizationInfo("English", "English", GetImageUri("en-US"), "en-US", true),
new LocalizationInfo("German (Germany)", "Deutsch", GetImageUri("de-DE"), "de-DE", true),
// Community
new LocalizationInfo("Chinese (China)", "大陆简体", GetImageUri("zh-CN"), "zh-CN"),
new LocalizationInfo("Chinese (Taiwan)", "台灣正體", GetImageUri("zh-TW"), "zh-TW"),
new LocalizationInfo("Czech (Czech Republic)", "Čeština", GetImageUri("cs-CZ"), "cs-CZ"),
new LocalizationInfo("Dutch (Netherlands)", "Nederlands", GetImageUri("nl-NL"), "nl-NL"),
new LocalizationInfo("French (France)", "Français", GetImageUri("fr-FR"), "fr-FR"),
new LocalizationInfo("Hungarian (Hungary)", "Magyar", GetImageUri("hu-HU"), "hu-HU"),
new LocalizationInfo("Italian (Italy)", "Italiano", GetImageUri("it-IT"), "it-IT"),
new LocalizationInfo("Japanese (Japan)", "日本語", GetImageUri("ja-JP"), "ja-JP"),
new LocalizationInfo("Korean (Korea)", "한국어", GetImageUri("ko-KR"), "ko-KR"),
new LocalizationInfo("Polish (Poland)", "Język polski", GetImageUri("pl-PL"), "pl-PL"),
new LocalizationInfo("Portuguese (Brazil)", "português brasileiro", GetImageUri("pt-BR"), "pt-BR"),
new LocalizationInfo("Russian (Russia)", "Русский", GetImageUri("ru-RU"), "ru-RU"),
new LocalizationInfo("Slovenian (Slovenia)", "slovenski jezik", GetImageUri("sl-SI"), "sl-SI"),
new LocalizationInfo("Spanish (Spain)", "Español", GetImageUri("es-ES"), "es-ES")
];
/// <summary>
/// Variable with the currently used <see cref="LocalizationInfo" />.
/// </summary>
public LocalizationInfo Current { get; private set; } = new();
/// <summary>
/// Variable with the currently used <see cref="CultureInfo" />.
/// </summary>
public CultureInfo Culture { get; private set; }
/// <summary>
/// Returns the current instance of the class.
/// The language can be set on creation (first call), by passing a culture code (like "en-US") as parameter.
/// Use <see cref="Change(LocalizationInfo)" /> to change it later.
/// </summary>
/// <param name="cultureCode">Culture code (default is "en-US"). See also <see cref="LocalizationInfo.Code" />.</param>
/// <returns>Instance of the class.</returns>
public static LocalizationManager GetInstance(string cultureCode = DefaultCultureCode)
{
_instance ??= new LocalizationManager(cultureCode);
return _instance;
}
/// <summary>
/// Method to build the uri for a flag image based on the culture code.
/// </summary>
/// <param name="cultureCode">Culture code like "en-US".</param>
/// <returns>Uri of the flag image.</returns>
private static Uri GetImageUri(string cultureCode)
{
return new Uri($"{BaseFlagImageUri}{cultureCode}.png");
}
/// <summary>
/// Method to get the <see cref="LocalizationInfo" /> based on the culture code.
/// </summary>
/// <param name="cultureCode"></param>
/// <returns>Return the <see cref="LocalizationInfo" /> or null if not found.</returns>
private static LocalizationInfo GetLocalizationInfoBasedOnCode(string cultureCode)
{
return List.FirstOrDefault(x => x.Code == cultureCode);
}
/// <summary>
/// Method to change the language.
/// </summary>
/// <param name="info">
/// <see cref="LocalizationInfo" />
/// </param>
public void Change(LocalizationInfo info)
{
Current = info;
Culture = new CultureInfo(info.Code);
}
}