{{ message }}
Repository navigation
Expand file tree
/
Copy pathLocalization.cs
More file actions
206 lines (187 loc) · 9.68 KB
/
Copy pathLocalization.cs
File metadata and controls
206 lines (187 loc) · 9.68 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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
using System.Globalization;
using System.Runtime.CompilerServices;
using System.Text.Json;
using ControlR.Libraries.Branding;
namespace ControlR.DesktopClient.Common;
public static class Localization
{
private const string BrandNameToken = "{brand_name}";
private const string DefaultCulture = "en-US";
private const string LanguageDisplayNameKey = nameof(LanguageDisplayName);
private const string StringsResourceMarker = ".Resources.Strings.";
private const string StringsSuffix = ".json";
private static readonly JsonSerializerOptions _jsonOptions = new()
{
AllowTrailingCommas = true,
PropertyNameCaseInsensitive = true,
ReadCommentHandling = JsonCommentHandling.Skip
};
private static string _currentCulture = CultureInfo.CurrentCulture.Name;
private static Dictionary<string, string> _localizationStrings = GetLocalizationStrings(_currentCulture);
public static string About => GetString();
public static string AboutLibraryAvaloniaUi => GetString();
public static string AboutLibraryControlR => GetString();
public static string AboutLibraryMicrosoftLibraries => GetString();
public static string AboutLibrarySerilog => GetString();
public static string AboutLibraryTmdsDbus => GetString();
public static string AboutLicenseLabel => GetString();
public static string AboutProjectLabel => GetString();
public static string AboutSourceText => GetString();
public static string AboutSponsorButton => GetString();
public static string AboutSponsorDescription => GetString();
public static string AboutSponsorLabel => GetString();
public static string AboutThirdPartyLicensesDescription => GetString();
public static string AboutThirdPartyLicensesLabel => GetString();
public static string AboutWebsiteLabel => GetString();
public static string Accessibility => GetString();
public static string AccessibilityPermissionDescription => GetString();
public static string ActiveConnections => GetString();
public static string ADeviceAdministrator => GetString();
public static string AgentConnectedTooltip => GetString();
public static string AgentDisconnectedTooltip => GetString();
public static string AgentStatus => GetString();
public static string Auto => GetString();
public static string CancelText => GetString();
public static string ChatMessageSendFailureMessage => GetString();
public static string ChatMessageSendFailureTitle => GetString();
public static string ChatSessionClosedToastMessage => GetString();
public static string ChatSessionClosedToastTitle => GetString();
public static string ChatWindowClosedSystemMessage => GetString();
public static string ChatWindowDefaultTitle => GetString();
public static string ChatWindowTitle => GetString();
public static string CloseText => GetString();
public static string ConfirmDisconnect => GetString();
public static string ConfirmDisconnectTitle => GetString();
public static string Connected => GetString();
public static string ConnectedAtLabel => GetString();
public static string Connections => GetString();
public static string CouldNotCreateViewMessage => GetString();
public static string Dark => GetString();
public static string Disconnect => GetString();
public static string Disconnected => GetString();
public static string EnterCodePlaceholder => GetString();
public static string EnterMessagePlaceholder => GetString();
public static string GetSupportDescription => GetString();
public static string GetTechSupportTitle => GetString();
public static string Granted => GetString();
public static string GrantPermission => GetString();
public static string InstanceId => GetString();
public static string InvalidViewModelTypeMessage => GetString();
public static string Language => GetString();
public static string LanguageDisplayName => GetString();
public static string LanguageRestartNote => GetString();
public static string LearnMore => GetString();
public static string Light => GetString();
public static string LinkLicenseText => GetString();
public static string MacAccessibilityPermissionRestartRequired => GetString();
public static string MacPermissionStaleHint => GetString();
public static string MacScreenCapturePermissionRestartRequired => GetString();
public static string ManagedDeviceMessage => GetString();
public static string ManagedDeviceTitle => GetString();
public static string NewChatMessageToastMessage => GetString();
public static string NewChatMessageToastTitle => GetString();
public static string NoActiveConnections => GetString();
public static string NoMessagesText => GetString();
public static string None => GetString();
public static string NoPermissionsRequired => GetString();
public static string NoText => GetString();
public static string NotGranted => GetString();
public static string NotificationPermissionDescription => GetString();
public static string Notifications => GetString();
public static string OkText => GetString();
public static string OpenSettings => GetString();
public static string Permissions => GetString();
public static string PermissionsMissingToastMessage => GetString();
public static string PermissionsMissingToastTitle => GetString();
public static string RemoteControlPermission => GetString();
public static string RemoteControlPermissionDescription => GetString();
public static string RemoteControlRequestMessage => GetString();
public static string RemoteControlRequestTitle => GetString();
public static string RemoteControlSessionEndToastMessage => GetString();
public static string RemoteControlSessionStartToastMessage => GetString();
public static string RemoteControlSessionToastTitle => GetString();
public static string Restart => GetString();
public static string ScreenCapturePermissionDescription => GetString();
public static string ScreenCastPermission => GetString();
public static string ScreenCastPermissionDescription => GetString();
public static string ScreenRecording => GetString();
public static string SendMessageText => GetString();
public static string SendText => GetString();
public static string Settings => GetString();
public static string ShareScreenSecurityWarning => GetString();
public static string Status => GetString();
public static string SubmitText => GetString();
public static string Theme => GetString();
public static string TrayExit => GetString();
public static string TrayShow => GetString();
public static string UnhandledExceptionMessage => GetString();
public static string UnhandledExceptionTitle => GetString();
public static string Version => GetString();
public static string ViewNotFoundMessage => GetString();
public static string YesText => GetString();
public static string You => GetString();
/// <summary>
/// The embedded cultures, each labeled in its own language.
/// </summary>
public static IReadOnlyList<LocalizationLanguage> GetAvailableLanguages()
{
var assembly = typeof(Localization).Assembly;
return GetCultures(assembly.GetManifestResourceNames())
.Select(culture => new LocalizationLanguage(culture, GetLocalizationStrings(culture)[LanguageDisplayNameKey]))
.OrderBy(x => x.DisplayName)
.ToList();
}
public static void SetCulture(string culture)
{
_currentCulture = culture;
_localizationStrings = GetLocalizationStrings(_currentCulture);
}
// Manifest names come from RootNamespace, which stays the project name in a white-label build even
// though the assembly is renamed. Only the tail after the strings directory is dependable.
internal static List<string> GetCultures(IEnumerable<string> resourcePaths)
{
return resourcePaths
.Select(path => (path, markerIndex: path.IndexOf(StringsResourceMarker, StringComparison.Ordinal)))
.Where(x => x.markerIndex >= 0 && x.path.EndsWith(StringsSuffix, StringComparison.Ordinal))
.Select(x => x.path[(x.markerIndex + StringsResourceMarker.Length)..^StringsSuffix.Length])
.Where(culture => culture.Length > 0)
.ToList();
}
private static string? FindResourcePath(IEnumerable<string> resourcePaths, string culture)
{
// An empty culture name would match every strings file, so require an exact one.
if (string.IsNullOrEmpty(culture))
{
return null;
}
var suffix = $"{culture}{StringsSuffix}";
return resourcePaths.FirstOrDefault(x =>
x.EndsWith(suffix, StringComparison.Ordinal) &&
x.Contains(StringsResourceMarker, StringComparison.Ordinal));
}
private static Dictionary<string, string> GetLocalizationStrings(string culture)
{
var assembly = typeof(Localization).Assembly;
var resourcePaths = assembly.GetManifestResourceNames();
var fileName =
FindResourcePath(resourcePaths, culture)
?? FindResourcePath(resourcePaths, DefaultCulture)
?? throw new InvalidOperationException("Unable to find localization file.");
using var resourceStream = assembly.GetManifestResourceStream(fileName)
?? throw new InvalidOperationException("Unable to find localization file.");
using var reader = new StreamReader(resourceStream);
var content = reader.ReadToEnd();
var strings = JsonSerializer.Deserialize<Dictionary<string, string>>(content, _jsonOptions)
?? throw new InvalidOperationException("Unable to deserialize localization file.");
return strings.ToDictionary(x => x.Key, x => x.Value.Replace(BrandNameToken, BrandingConstants.BrandName));
}
private static string GetString([CallerMemberName] string key = "")
{
if (_localizationStrings.TryGetValue(key, out var value))
{
return value;
}
return $"Localization key '{key}' not found.";
}
}
public record LocalizationLanguage(string Culture, string DisplayName);
You can’t perform that action at this time.
