From 4b7137df38c9f87a87225855872d3e99c0fc7941 Mon Sep 17 00:00:00 2001 From: Andrew KeepCoding Date: Sun, 10 Sep 2023 16:58:12 +0900 Subject: [PATCH 1/3] Add support for factoring strings into multiple resources files --- WinUI3Localizer/LocalizerBuilder.cs | 49 ++++++++++++++++++++++------- 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/WinUI3Localizer/LocalizerBuilder.cs b/WinUI3Localizer/LocalizerBuilder.cs index d8a90bd..40e64f3 100644 --- a/WinUI3Localizer/LocalizerBuilder.cs +++ b/WinUI3Localizer/LocalizerBuilder.cs @@ -21,11 +21,23 @@ private record StringResourceItems(string Language, IEnumerable Localizer.Get() is Localizer; - private ILogger? Logger { get; set; } + public LocalizerBuilder SetDefaultStringResourcesFileName(string fileName) + { + this.defaultStringResourcesFileName = fileName; + return this; + } + + public LocalizerBuilder SetStringResourcesFileXPath(string xPath) + { + this.stringResourcesFileXPath = xPath; + return this; + } public LocalizerBuilder SetLogger(ILogger logger) { @@ -44,15 +56,22 @@ public LocalizerBuilder AddStringResourcesFolderForLanguageDictionaries( { try { - string languageFilePath = Path.Combine(languageFolderPath, resourcesFileName); + foreach (string stringResourcesFileFullPath in Directory.GetFiles(languageFolderPath, "*.resw")) + { + string fileName = Path.GetFileName(stringResourcesFileFullPath); + string sourceName = fileName == this.defaultStringResourcesFileName + ? string.Empty + : Path.GetFileNameWithoutExtension(fileName); if (CreateLanguageDictionaryFromStringResourcesFile( - languageFilePath, - StringResourcesFileXPath) is LanguageDictionary dictionary) + sourceName, + stringResourcesFileFullPath, + this.stringResourcesFileXPath) is LanguageDictionary dictionary) { this.languageDictionaries.Add(dictionary); } } + } catch { if (ignoreExceptions is false) @@ -121,9 +140,10 @@ public async Task Build() return localizer; } - private static LanguageDictionary? CreateLanguageDictionaryFromStringResourcesFile(string filePath, string fileXPath) + private static LanguageDictionary? CreateLanguageDictionaryFromStringResourcesFile(string sourceName, string filePath, string fileXPath) { if (CreateStringResourceItemsFromResourcesFile( + sourceName, filePath, fileXPath) is StringResourceItems stringResourceItems) { @@ -159,7 +179,7 @@ private static LanguageDictionary.Item CreateLanguageDictionaryItem(StringResour stringResourceItem.Name); } - private static StringResourceItems? CreateStringResourceItemsFromResourcesFile(string filePath, string xPath = "//root/data") + private static StringResourceItems? CreateStringResourceItemsFromResourcesFile(string sourceName, string filePath, string xPath = "//root/data") { DirectoryInfo directoryInfo = new(filePath); @@ -171,7 +191,8 @@ private static LanguageDictionary.Item CreateLanguageDictionaryItem(StringResour if (document.SelectNodes(xPath) is XmlNodeList nodeList) { List items = new(); - items.AddRange(CreateStringResourceItems(nodeList)); + IEnumerable stringResourceItems = CreateStringResourceItems(sourceName, nodeList); + items.AddRange(stringResourceItems); return new StringResourceItems(language, items); } } @@ -179,21 +200,25 @@ private static LanguageDictionary.Item CreateLanguageDictionaryItem(StringResour return null; } - private static IEnumerable CreateStringResourceItems(XmlNodeList nodeList) + private static IEnumerable CreateStringResourceItems(string sourceName, XmlNodeList nodeList) { foreach (XmlNode node in nodeList) { - if (CreateStringResourceItem(node) is StringResourceItem item) + if (CreateStringResourceItem(sourceName, node) is StringResourceItem item) { yield return item; } } } - private static StringResourceItem? CreateStringResourceItem(XmlNode node) + private static StringResourceItem? CreateStringResourceItem(string sourceName, XmlNode node) { + string prefix = string.IsNullOrEmpty(sourceName) is false + ? $"/{sourceName}/" + : string.Empty; + return new StringResourceItem( - Name: node.Attributes?["name"]?.Value ?? string.Empty, + Name: $"{prefix}{node.Attributes?["name"]?.Value ?? string.Empty}", Value: node["value"]?.InnerText ?? string.Empty, Comment: string.Empty); } From 3a26fb977843116f66fc33689d7bb20e2984515f Mon Sep 17 00:00:00 2001 From: Andrew KeepCoding Date: Sun, 10 Sep 2023 16:58:54 +0900 Subject: [PATCH 2/3] Refactor logger on LocalizerBuilder --- WinUI3Localizer/LocalizerBuilder.cs | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/WinUI3Localizer/LocalizerBuilder.cs b/WinUI3Localizer/LocalizerBuilder.cs index 40e64f3..c94830e 100644 --- a/WinUI3Localizer/LocalizerBuilder.cs +++ b/WinUI3Localizer/LocalizerBuilder.cs @@ -25,6 +25,8 @@ private record StringResourceItems(string Language, IEnumerable Localizer.Get() is Localizer; public LocalizerBuilder SetDefaultStringResourcesFileName(string fileName) @@ -41,13 +43,12 @@ public LocalizerBuilder SetStringResourcesFileXPath(string xPath) public LocalizerBuilder SetLogger(ILogger logger) { - Logger = logger; + this.logger = logger; return this; } public LocalizerBuilder AddStringResourcesFolderForLanguageDictionaries( string stringResourcesFolderPath, - string resourcesFileName = "Resources.resw", bool ignoreExceptions = false) { this.builderActions.Add(() => @@ -63,15 +64,15 @@ public LocalizerBuilder AddStringResourcesFolderForLanguageDictionaries( ? string.Empty : Path.GetFileNameWithoutExtension(fileName); - if (CreateLanguageDictionaryFromStringResourcesFile( + if (CreateLanguageDictionaryFromStringResourcesFile( sourceName, stringResourcesFileFullPath, this.stringResourcesFileXPath) is LanguageDictionary dictionary) - { - this.languageDictionaries.Add(dictionary); + { + this.languageDictionaries.Add(dictionary); + } } } - } catch { if (ignoreExceptions is false) @@ -108,15 +109,15 @@ public async Task Build() if (IsLocalizerAlreadyBuilt is true) { LocalizerIsAlreadyBuiltException localizerException = new(); - Logger?.LogError(localizerException, localizerException.Message); + this.logger?.LogError(localizerException, localizerException.Message); throw localizerException; } Localizer localizer = new(this.options); - if (Logger is not null) + if (this.logger is not null) { - localizer.SetLogger(Logger); + localizer.SetLogger(this.logger); } foreach (Action action in this.builderActions) From 9cc9a8c1b950987dfda1e7e0dac1239c58cdaf2e Mon Sep 17 00:00:00 2001 From: Andrew KeepCoding Date: Sun, 10 Sep 2023 17:00:00 +0900 Subject: [PATCH 3/3] Add page for multi resources files on the sample app --- WinUI3Localizer.SampleApp/App.xaml | 6 +- WinUI3Localizer.SampleApp/App.xaml.cs | 10 +- WinUI3Localizer.SampleApp/ControlsPage.xaml | 2 +- .../ItemTemplatesPage.xaml | 106 +++++++-------- .../LocalizationActionsPage.xaml | 4 +- .../MultipleResourcesPage.xaml | 26 ++++ .../MultipleResourcesPage.xaml.cs | 19 +++ WinUI3Localizer.SampleApp/SettingsPage.xaml | 24 ++-- WinUI3Localizer.SampleApp/ShellPage.xaml | 10 +- .../Strings/en-US/ErrorMessages.resw | 123 ++++++++++++++++++ .../Strings/en-US/Resources.resw | 8 ++ .../Strings/es-ES/ErrorMessages.resw | 123 ++++++++++++++++++ .../Strings/es-ES/Resources.resw | 8 ++ .../Strings/ja/ErrorMessages.resw | 123 ++++++++++++++++++ .../Strings/ja/Resources.resw | 8 ++ WinUI3Localizer.SampleApp/StylesPage.xaml | 106 +++++++-------- .../WinUI3Localizer.SampleApp.csproj | 1 + 17 files changed, 581 insertions(+), 126 deletions(-) create mode 100644 WinUI3Localizer.SampleApp/MultipleResourcesPage.xaml create mode 100644 WinUI3Localizer.SampleApp/MultipleResourcesPage.xaml.cs create mode 100644 WinUI3Localizer.SampleApp/Strings/en-US/ErrorMessages.resw create mode 100644 WinUI3Localizer.SampleApp/Strings/es-ES/ErrorMessages.resw create mode 100644 WinUI3Localizer.SampleApp/Strings/ja/ErrorMessages.resw diff --git a/WinUI3Localizer.SampleApp/App.xaml b/WinUI3Localizer.SampleApp/App.xaml index 5ac7f20..ee41fc7 100644 --- a/WinUI3Localizer.SampleApp/App.xaml +++ b/WinUI3Localizer.SampleApp/App.xaml @@ -13,8 +13,12 @@ + - -