chores: i18n

This commit is contained in:
Zhe Fang
2025-12-22 14:17:43 -05:00
parent 2254a28e40
commit 1eca21c285
16 changed files with 5490 additions and 5870 deletions

View File

@@ -74,6 +74,7 @@ namespace BetterLyrics.WinUI3
await InitializeLocalizer();
var settingsService = Ioc.Default.GetRequiredService<ISettingsService>();
settingsService.UpdateLanguage();
WindowHook.OpenOrShowWindow<SystemTrayWindow>();
@@ -150,21 +151,14 @@ namespace BetterLyrics.WinUI3
{
// Initialize a "Strings" folder in the "LocalFolder" for the packaged app.
StorageFolder localFolder = ApplicationData.Current.LocalFolder;
StorageFolder stringsFolder = await localFolder.CreateFolderAsync(
"Strings",
CreationCollisionOption.OpenIfExists);
StorageFolder stringsFolder = await localFolder.CreateFolderAsync("Strings", CreationCollisionOption.ReplaceExisting);
// Create string resources file from app resources if doesn't exists.
// Create string resources file from app resources.
string resourceFileName = "Resources.resw";
await CreateStringResourceFileIfNotExists(stringsFolder, "de", resourceFileName);
await CreateStringResourceFileIfNotExists(stringsFolder, "en", resourceFileName);
await CreateStringResourceFileIfNotExists(stringsFolder, "es", resourceFileName);
await CreateStringResourceFileIfNotExists(stringsFolder, "fr", resourceFileName);
await CreateStringResourceFileIfNotExists(stringsFolder, "ja", resourceFileName);
await CreateStringResourceFileIfNotExists(stringsFolder, "ko", resourceFileName);
await CreateStringResourceFileIfNotExists(stringsFolder, "ru", resourceFileName);
await CreateStringResourceFileIfNotExists(stringsFolder, "zh-Hans", resourceFileName);
await CreateStringResourceFileIfNotExists(stringsFolder, "zh-Hant", resourceFileName);
foreach (var item in LanguageHelper.SupportedDisplayLanguages)
{
await CreateStringResourceFile(stringsFolder, item.LanguageCode, resourceFileName);
}
ILocalizer localizer = await new LocalizerBuilder()
.AddStringResourcesFolderForLanguageDictionaries(stringsFolder.Path)
@@ -175,18 +169,13 @@ namespace BetterLyrics.WinUI3
.Build();
}
private static async Task CreateStringResourceFileIfNotExists(StorageFolder stringsFolder, string language, string resourceFileName)
private static async Task CreateStringResourceFile(StorageFolder stringsFolder, string language, string resourceFileName)
{
StorageFolder languageFolder = await stringsFolder.CreateFolderAsync(
language,
CreationCollisionOption.OpenIfExists);
StorageFolder languageFolder = await stringsFolder.CreateFolderAsync(language, CreationCollisionOption.ReplaceExisting);
if (await languageFolder.TryGetItemAsync(resourceFileName) is null)
{
string resourceFilePath = Path.Combine(stringsFolder.Name, language, resourceFileName);
StorageFile resourceFile = await LoadStringResourcesFileFromAppResource(resourceFilePath);
_ = await resourceFile.CopyAsync(languageFolder);
}
string resourceFilePath = Path.Combine(stringsFolder.Name, language, resourceFileName);
StorageFile resourceFile = await LoadStringResourcesFileFromAppResource(resourceFilePath);
_ = await resourceFile.CopyAsync(languageFolder);
}
private static async Task<StorageFile> LoadStringResourcesFileFromAppResource(string filePath)

View File

@@ -138,7 +138,7 @@
<!-- Copy all "Resources.resw" files in the "Strings" folder to the output folder. -->
<ItemGroup>
<Content Include="Strings\**\*.resw">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>

View File

@@ -11,6 +11,7 @@ namespace BetterLyrics.WinUI3.Converter
{
if (value is string langCode)
{
langCode = LanguageHelper.ParseLanguageCode(langCode);
return LanguageHelper.SupportedDisplayLanguages.FindIndex(x => x.LanguageCode == langCode);
}
return 0;

View File

@@ -1,6 +1,7 @@
using BetterLyrics.WinUI3.Models;
using NTextCat;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using Windows.Globalization;
using WinUI3Localizer;
@@ -11,7 +12,6 @@ namespace BetterLyrics.WinUI3.Helper
{
private static readonly RankedLanguageIdentifierFactory _factory = new();
private static readonly RankedLanguageIdentifier _identifier;
private static readonly ILocalizer _localizer = Localizer.Get();
public const string ChineseCode = "zh";
public const string JapaneseCode = "ja";
@@ -91,7 +91,6 @@ namespace BetterLyrics.WinUI3.Helper
public static List<ExtendedLanguage> SupportedDisplayLanguages { get; set; } =
[
new ExtendedLanguage("", _localizer.GetLocalizedString("SettingsPageSystemLanguage")),
new ExtendedLanguage("de"),
new ExtendedLanguage("en"),
new ExtendedLanguage("es"),
@@ -146,23 +145,35 @@ namespace BetterLyrics.WinUI3.Helper
}
}
public static string GetDefaultLanguageCode()
public static string ParseLanguageCode(string? languageCode)
{
var systemLang = ApplicationLanguages.Languages.FirstOrDefault();
if (systemLang == null)
if (string.IsNullOrWhiteSpace(languageCode))
{
languageCode = ApplicationLanguages.Languages.FirstOrDefault();
}
if (languageCode == null)
{
return "en";
}
var shortSysLangCode = languageCode.Substring(0, 2);
var found = SupportedDisplayLanguages.FirstOrDefault(x => shortSysLangCode == x.LanguageCode.Substring(0, 2));
if (found == null)
{
return "en";
}
else
{
var found = SupportedDisplayLanguages.Where(x => x.LanguageCode != "").FirstOrDefault(x => systemLang.StartsWith(x.LanguageCode) == true);
if (found == null)
var shortLangCodeFound = found.LanguageCode.Substring(0, 2);
if (shortLangCodeFound == "zh")
{
return "en";
// https://learn.microsoft.com/zh-cn/windows/apps/publish/publish-your-app/msix/app-package-requirements#supported-languages
return languageCode is "zh-Hans" or "zh-CN" or "zh-Hans-CN" or "zh-SG" or "zh-Hans-SG" ? "zh-Hans" : "zh-Hant";
}
else
{
return found.LanguageCode;
return shortLangCodeFound;
}
}
}

View File

@@ -7,8 +7,8 @@ namespace BetterLyrics.WinUI3.Services.SettingsService
public interface ISettingsService
{
AppSettings AppSettings { get; set; }
// App behavior
void UpdateLanguage();
bool ImportSettings(string importPath);
void ExportSettings(string exportPath);
}

View File

@@ -118,15 +118,7 @@ namespace BetterLyrics.WinUI3.Services.SettingsService
switch (e.PropertyName)
{
case nameof(GeneralSettings.LanguageCode):
var langCode = AppSettings.GeneralSettings.LanguageCode;
if (langCode == "")
{
_localizer.SetLanguage(LanguageHelper.GetDefaultLanguageCode());
}
else
{
_localizer.SetLanguage(langCode);
}
UpdateLanguage();
break;
default:
break;
@@ -134,6 +126,12 @@ namespace BetterLyrics.WinUI3.Services.SettingsService
WriteAppSettings();
}
public void UpdateLanguage()
{
var langCode = AppSettings.GeneralSettings.LanguageCode;
_localizer.SetLanguage(LanguageHelper.ParseLanguageCode(langCode));
}
/// <summary>
/// Export settings to specific folder
/// </summary>

View File

@@ -35,7 +35,6 @@
<NavigationViewItem
l:Uids.Uid="SettingsPageLyricsWindowMgr"
Content="Lyrics window manager"
Icon="{ui:FontIcon FontFamily={StaticResource IconFontFamily},
Glyph=&#xE61F;}"
Tag="LyricsWindowMgr" />