Skip to content

Commit 8f48b91

Browse files
committed
Moved strings to SecureFolderFS.UI
1 parent 2d07a3a commit 8f48b91

File tree

16 files changed

+143
-534
lines changed

16 files changed

+143
-534
lines changed

SecureFolderFS.Sdk/ViewModels/Controls/LanguageViewModel.cs

+14-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using CommunityToolkit.Mvvm.ComponentModel;
2-
using System;
32
using System.Globalization;
43

54
namespace SecureFolderFS.Sdk.ViewModels.Controls
@@ -22,7 +21,7 @@ public sealed class LanguageViewModel : ObservableObject
2221
public LanguageViewModel(CultureInfo cultureInfo)
2322
{
2423
CultureInfo = cultureInfo;
25-
FriendlyName = FormatName(CultureInfo.NativeName);
24+
FriendlyName = FormatName(cultureInfo);
2625
}
2726

2827
/// <inheritdoc/>
@@ -31,9 +30,20 @@ public override string ToString()
3130
return FriendlyName;
3231
}
3332

34-
private static string FormatName(string unformatted)
33+
private static string FormatName(CultureInfo cultureInfo)
3534
{
36-
return string.Concat(unformatted[0].ToString().ToUpperInvariant(), unformatted.AsSpan(1));
35+
// Sometimes the name may not have the country
36+
var name = cultureInfo.NativeName;
37+
if (name.Contains('('))
38+
return name;
39+
40+
// Convert the first letter to uppercase
41+
name = char.ToUpperInvariant(name[0]) + name.Substring(1);
42+
43+
// Get the region to use for the country name
44+
var regionInfo = new RegionInfo(cultureInfo.Name);
45+
46+
return $"{name} ({regionInfo.DisplayName})";
3747
}
3848
}
3949
}

SecureFolderFS.UI/SecureFolderFS.UI.csproj

+98-20
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
<EmbeddedResource Include="Assets\*" />
1212
<None Remove="Assets\AppAssets\AppIcon.png" />
1313
<None Remove="Assets\AppAssets\AppTitle.svg" />
14+
<None Remove="Assets\Licenses\FluentAvalonia LICENSE" />
15+
<None Remove="Assets\Licenses\MicrosoftExtensionsDependencyInjection LICENSE" />
1416
<EmbeddedResource Include="Assets\AppAssets\AppIcon.png">
1517
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
1618
</EmbeddedResource>
@@ -30,46 +32,92 @@
3032
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
3133
</EmbeddedResource>
3234
<None Remove="Assets\Licenses\Tmds.Fuse LICENSE" />
33-
<EmbeddedResource Include="Assets\Licenses\Tmds.Fuse LICENSE" />
35+
<EmbeddedResource Include="Assets\Licenses\FluentAvalonia LICENSE">
36+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
37+
</EmbeddedResource>
38+
<EmbeddedResource Include="Assets\Licenses\MicrosoftExtensionsDependencyInjection LICENSE">
39+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
40+
</EmbeddedResource>
41+
<EmbeddedResource Include="Assets\Licenses\Tmds.Fuse LICENSE">
42+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
43+
</EmbeddedResource>
3444
<None Remove="Assets\Licenses\NWebDav LICENSE" />
35-
<EmbeddedResource Include="Assets\Licenses\NWebDav LICENSE" />
45+
<EmbeddedResource Include="Assets\Licenses\NWebDav LICENSE">
46+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
47+
</EmbeddedResource>
3648
<None Remove="Assets\Licenses\DokanNet LICENSE" />
37-
<EmbeddedResource Include="Assets\Licenses\DokanNet LICENSE" />
49+
<EmbeddedResource Include="Assets\Licenses\DokanNet LICENSE">
50+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
51+
</EmbeddedResource>
3852
<None Remove="Assets\Licenses\DotnetCommunityToolkit LICENSE" />
39-
<EmbeddedResource Include="Assets\Licenses\DotnetCommunityToolkit LICENSE" />
53+
<EmbeddedResource Include="Assets\Licenses\DotnetCommunityToolkit LICENSE">
54+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
55+
</EmbeddedResource>
4056
<None Remove="Assets\Licenses\WindowsCommunityToolkit LICENSE" />
41-
<EmbeddedResource Include="Assets\Licenses\WindowsCommunityToolkit LICENSE" />
57+
<EmbeddedResource Include="Assets\Licenses\WindowsCommunityToolkit LICENSE">
58+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
59+
</EmbeddedResource>
4260
<None Remove="Assets\Licenses\WinUIEx LICENSE" />
43-
<EmbeddedResource Include="Assets\Licenses\WinUIEx LICENSE" />
61+
<EmbeddedResource Include="Assets\Licenses\WinUIEx LICENSE">
62+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
63+
</EmbeddedResource>
4464
<None Remove="Assets\Licenses\ByteSize LICENSE" />
45-
<EmbeddedResource Include="Assets\Licenses\ByteSize LICENSE" />
65+
<EmbeddedResource Include="Assets\Licenses\ByteSize LICENSE">
66+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
67+
</EmbeddedResource>
4668
<None Remove="Assets\Licenses\Miscreant LICENSE" />
47-
<EmbeddedResource Include="Assets\Licenses\Miscreant LICENSE" />
69+
<EmbeddedResource Include="Assets\Licenses\Miscreant LICENSE">
70+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
71+
</EmbeddedResource>
4872
<None Remove="Assets\Licenses\Konscious.Security.Cryptography LICENSE" />
49-
<EmbeddedResource Include="Assets\Licenses\KonsciousSecurityCryptography LICENSE" />
73+
<EmbeddedResource Include="Assets\Licenses\KonsciousSecurityCryptography LICENSE">
74+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
75+
</EmbeddedResource>
5076
<None Remove="Assets\Licenses\NSec LICENSE" />
51-
<EmbeddedResource Include="Assets\Licenses\NSec LICENSE" />
77+
<EmbeddedResource Include="Assets\Licenses\NSec LICENSE">
78+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
79+
</EmbeddedResource>
5280
<None Remove="Assets\Licenses\LiveCharts2 LICENSE" />
53-
<EmbeddedResource Include="Assets\Licenses\LiveCharts2 LICENSE" />
81+
<EmbeddedResource Include="Assets\Licenses\LiveCharts2 LICENSE">
82+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
83+
</EmbeddedResource>
5484
<None Remove="Assets\Licenses\WindowsAppSDK LICENSE" />
55-
<EmbeddedResource Include="Assets\Licenses\WindowsAppSDK LICENSE" />
85+
<EmbeddedResource Include="Assets\Licenses\WindowsAppSDK LICENSE">
86+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
87+
</EmbeddedResource>
5688
<None Remove="Assets\Licenses\MicrosoftExtensionsDependencyInjection" />
5789
<None Remove="Assets\Licenses\AppCenter LICENSE" />
58-
<EmbeddedResource Include="Assets\Licenses\AppCenter LICENSE" />
90+
<EmbeddedResource Include="Assets\Licenses\AppCenter LICENSE">
91+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
92+
</EmbeddedResource>
5993
<None Remove="Assets\Licenses\WindowsSDKBuildTools LICENSE" />
60-
<EmbeddedResource Include="Assets\Licenses\WindowsSDKBuildTools LICENSE" />
94+
<EmbeddedResource Include="Assets\Licenses\WindowsSDKBuildTools LICENSE">
95+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
96+
</EmbeddedResource>
6197
<None Remove="Assets\Licenses\Avalonia LICENSE" />
62-
<EmbeddedResource Include="Assets\Licenses\Avalonia LICENSE" />
98+
<EmbeddedResource Include="Assets\Licenses\Avalonia LICENSE">
99+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
100+
</EmbeddedResource>
63101
<None Remove="Assets\Licenses\SvgSkia LICENSE" />
64-
<EmbeddedResource Include="Assets\Licenses\SvgSkia LICENSE" />
102+
<EmbeddedResource Include="Assets\Licenses\SvgSkia LICENSE">
103+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
104+
</EmbeddedResource>
65105
<None Remove="Assets\Licenses\AvaloniaBehaviors LICENSE" />
66-
<EmbeddedResource Include="Assets\Licenses\AvaloniaBehaviors LICENSE" />
106+
<EmbeddedResource Include="Assets\Licenses\AvaloniaBehaviors LICENSE">
107+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
108+
</EmbeddedResource>
67109
<None Remove="Assets\Licenses\TextCopy LICENSE" />
68-
<EmbeddedResource Include="Assets\Licenses\TextCopy LICENSE" />
110+
<EmbeddedResource Include="Assets\Licenses\TextCopy LICENSE">
111+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
112+
</EmbeddedResource>
69113
<None Remove="Assets\Licenses\AvaloniaNameGenerator LICENSE" />
70-
<EmbeddedResource Include="Assets\Licenses\AvaloniaNameGenerator LICENSE" />
114+
<EmbeddedResource Include="Assets\Licenses\AvaloniaNameGenerator LICENSE">
115+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
116+
</EmbeddedResource>
71117
<None Remove="Assets\Licenses\FluentAvaloniaFluentIcons LICENSE" />
72-
<EmbeddedResource Include="Assets\Licenses\FluentAvaloniaFluentIcons LICENSE" />
118+
<EmbeddedResource Include="Assets\Licenses\FluentAvaloniaFluentIcons LICENSE">
119+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
120+
</EmbeddedResource>
73121
</ItemGroup>
74122

75123
<ItemGroup>
@@ -84,4 +132,34 @@
84132
<ProjectReference Include="..\SecureFolderFS.Core\SecureFolderFS.Core.csproj" />
85133
<ProjectReference Include="..\SecureFolderFS.Sdk\SecureFolderFS.Sdk.csproj" />
86134
</ItemGroup>
135+
136+
<ItemGroup>
137+
<EmbeddedResource Update="Strings\cs-CZ\Resources.resx">
138+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
139+
</EmbeddedResource>
140+
<EmbeddedResource Update="Strings\da-DK\Resources.resx">
141+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
142+
</EmbeddedResource>
143+
<EmbeddedResource Update="Strings\de-DE\Resources.resx">
144+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
145+
</EmbeddedResource>
146+
<EmbeddedResource Update="Strings\es-ES\Resources.resx">
147+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
148+
</EmbeddedResource>
149+
<EmbeddedResource Update="Strings\fr-FR\Resources.resx">
150+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
151+
</EmbeddedResource>
152+
<EmbeddedResource Update="Strings\it-IT\Resources.resx">
153+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
154+
</EmbeddedResource>
155+
<EmbeddedResource Update="Strings\pl-PL\Resources.resx">
156+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
157+
</EmbeddedResource>
158+
<EmbeddedResource Update="Strings\ru-RU\Resources.resx">
159+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
160+
</EmbeddedResource>
161+
<EmbeddedResource Update="Strings\uk-UA\Resources.resx">
162+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
163+
</EmbeddedResource>
164+
</ItemGroup>
87165
</Project>

SecureFolderFS.WinUI/Localization/ResourceString.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ internal sealed class ResourceString : MarkupExtension
1414
/// <summary>
1515
/// Gets or sets the name identifier that is associated with a resource.
1616
/// </summary>
17-
public string Name { get; set; }
17+
public string? Name { get; set; }
1818

1919
/// <inheritdoc/>
2020
protected override object ProvideValue()
@@ -23,7 +23,7 @@ protected override object ProvideValue()
2323
if (LocalizationService is null)
2424
return $"{{{Name}}}";
2525

26-
return LocalizationService.GetString(Name) ?? $"{{{Name}}}";
26+
return LocalizationService.GetString(Name ?? string.Empty) ?? $"{{{Name}}}";
2727
}
2828
}
2929
}

SecureFolderFS.WinUI/Package.appxmanifest

+2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
<Resources>
2727
<Resource Language="en-US"/>
2828
<Resource Language="pl-PL"/>
29+
<Resource Language="de-DE"/>
30+
<Resource Language="es-ES"/>
2931
</Resources>
3032

3133
<Applications>

SecureFolderFS.WinUI/SecureFolderFS.WinUI.csproj

+1-55
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<TargetFramework>net7.0-windows10.0.22621.0</TargetFramework>
55
<TargetPlatformMinVersion>10.0.19041.0</TargetPlatformMinVersion>
66
<AppxBundleAutoResourcePackageQualifiers>Scale|DXFeatureLevel</AppxBundleAutoResourcePackageQualifiers>
7-
<AppxDefaultResourceQualifiers>Language=en-US;pl-PL</AppxDefaultResourceQualifiers>
7+
<AppxDefaultResourceQualifiers>Language=en-US;pl-PL;de-DE;es-ES</AppxDefaultResourceQualifiers>
88
<TargetPlatformVersion Condition=" '$(TargetPlatformVersion)' == '' ">10.0.22621.0</TargetPlatformVersion>
99
<RootNamespace>SecureFolderFS.WinUI</RootNamespace>
1010
<ApplicationManifest>app.manifest</ApplicationManifest>
@@ -290,59 +290,5 @@
290290
<EmbeddedResource Include="Assets\Wide310x150Logo.scale-150.png" />
291291
<EmbeddedResource Include="Assets\Wide310x150Logo.scale-200.png" />
292292
<EmbeddedResource Include="Assets\Wide310x150Logo.scale-400.png" />
293-
<EmbeddedResource Include="Strings\cs-CZ\Resources.resw">
294-
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
295-
</EmbeddedResource>
296-
<EmbeddedResource Include="Strings\da-DK\Resources.resw">
297-
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
298-
</EmbeddedResource>
299-
<EmbeddedResource Include="Strings\de-DE\Resources.resw">
300-
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
301-
</EmbeddedResource>
302-
<EmbeddedResource Include="Strings\en-US\Resources.resw">
303-
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
304-
</EmbeddedResource>
305-
<EmbeddedResource Include="Strings\fr-FR\Resources.resw">
306-
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
307-
</EmbeddedResource>
308-
<EmbeddedResource Include="Strings\it-IT\Resources.resw">
309-
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
310-
</EmbeddedResource>
311-
<EmbeddedResource Include="Strings\pl-PL\Resources.resw">
312-
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
313-
</EmbeddedResource>
314-
<EmbeddedResource Include="Strings\ru-RU\Resources.resw">
315-
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
316-
</EmbeddedResource>
317-
<EmbeddedResource Include="Strings\uk-UA\Resources.resw">
318-
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
319-
</EmbeddedResource>
320-
</ItemGroup>
321-
<ItemGroup>
322-
<PRIResource Remove="Strings\cs-CZ\Resources.resw" />
323-
</ItemGroup>
324-
<ItemGroup>
325-
<PRIResource Remove="Strings\da-DK\Resources.resw" />
326-
</ItemGroup>
327-
<ItemGroup>
328-
<PRIResource Remove="Strings\de-DE\Resources.resw" />
329-
</ItemGroup>
330-
<ItemGroup>
331-
<PRIResource Remove="Strings\en-US\Resources.resw" />
332-
</ItemGroup>
333-
<ItemGroup>
334-
<PRIResource Remove="Strings\fr-FR\Resources.resw" />
335-
</ItemGroup>
336-
<ItemGroup>
337-
<PRIResource Remove="Strings\it-IT\Resources.resw" />
338-
</ItemGroup>
339-
<ItemGroup>
340-
<PRIResource Remove="Strings\pl-PL\Resources.resw" />
341-
</ItemGroup>
342-
<ItemGroup>
343-
<PRIResource Remove="Strings\ru-RU\Resources.resw" />
344-
</ItemGroup>
345-
<ItemGroup>
346-
<PRIResource Remove="Strings\uk-UA\Resources.resw" />
347293
</ItemGroup>
348294
</Project>

SecureFolderFS.WinUI/ServiceImplementation/LocalizationService.cs

+26-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
using Microsoft.Windows.ApplicationModel.Resources;
2-
using SecureFolderFS.Sdk.Services;
1+
using SecureFolderFS.Sdk.Services;
2+
using System;
33
using System.Collections.Generic;
4+
using System.Diagnostics;
45
using System.Globalization;
56
using System.Linq;
7+
using System.Resources;
68
using System.Threading.Tasks;
79
using Windows.Globalization;
810

@@ -11,7 +13,7 @@ namespace SecureFolderFS.WinUI.ServiceImplementation
1113
/// <inheritdoc cref="ILocalizationService"/>
1214
internal sealed class LocalizationService : ILocalizationService
1315
{
14-
private static ResourceLoader ResourceLoader { get; } = new();
16+
private ResourceManager ResourceManager { get; set; }
1517

1618
/// <inheritdoc/>
1719
public CultureInfo CurrentCulture { get; }
@@ -25,12 +27,24 @@ public LocalizationService()
2527
AppLanguages = ApplicationLanguages.ManifestLanguages
2628
.Select(x => new CultureInfo(x))
2729
.ToList();
30+
31+
ResourceManager = new($"SecureFolderFS.UI.Strings.{GetLanguageString(CurrentCulture)}.Resources", typeof(UI.Constants).Assembly);
2832
}
2933

3034
/// <inheritdoc/>
3135
public string? GetString(string resourceKey)
3236
{
33-
return ResourceLoader.GetString(resourceKey);
37+
try
38+
{
39+
return ResourceManager.GetString(resourceKey);
40+
}
41+
catch (Exception ex)
42+
{
43+
_ = ex;
44+
Debugger.Break();
45+
46+
return null;
47+
}
3448
}
3549

3650
/// <inheritdoc/>
@@ -39,5 +53,13 @@ public Task SetCultureAsync(CultureInfo cultureInfo)
3953
ApplicationLanguages.PrimaryLanguageOverride = cultureInfo.Name;
4054
return Task.CompletedTask;
4155
}
56+
57+
private static string GetLanguageString(CultureInfo cultureInfo)
58+
{
59+
if (cultureInfo.Name.Contains('-', StringComparison.OrdinalIgnoreCase))
60+
return cultureInfo.Name.Replace('-', '_');
61+
62+
return $"{cultureInfo.Name}_{cultureInfo.TwoLetterISOLanguageName.ToUpperInvariant()}";
63+
}
4264
}
4365
}

0 commit comments

Comments
 (0)