From 0b9e426010ee7d8421b3ec265547bab746dd42e3 Mon Sep 17 00:00:00 2001 From: Vincenzo Carlino Date: Mon, 17 Jun 2024 20:53:22 +0200 Subject: [PATCH 01/10] feat(PoExtractor): add single file output --- .../LocalizableStringCollection.cs | 8 +++ src/OrchardCoreContrib.PoExtractor/Program.cs | 50 +++++++++++++++---- 2 files changed, 48 insertions(+), 10 deletions(-) diff --git a/src/OrchardCoreContrib.PoExtractor.Abstractions/LocalizableStringCollection.cs b/src/OrchardCoreContrib.PoExtractor.Abstractions/LocalizableStringCollection.cs index 2c77b67..f3adab8 100644 --- a/src/OrchardCoreContrib.PoExtractor.Abstractions/LocalizableStringCollection.cs +++ b/src/OrchardCoreContrib.PoExtractor.Abstractions/LocalizableStringCollection.cs @@ -41,4 +41,12 @@ public void Add(LocalizableStringOccurence item) _values.Add(key, new LocalizableString(item)); } } + + /// + /// Clear collection + /// + public void Clear() + { + _values.Clear(); + } } diff --git a/src/OrchardCoreContrib.PoExtractor/Program.cs b/src/OrchardCoreContrib.PoExtractor/Program.cs index 3bd30fc..9e98d0d 100644 --- a/src/OrchardCoreContrib.PoExtractor/Program.cs +++ b/src/OrchardCoreContrib.PoExtractor/Program.cs @@ -34,7 +34,7 @@ public static void Main(string[] args) return; } - (string language, string templateEngine) = GetCliOptions(args); + (string language, string templateEngine, string singleOutputFile) = GetCliOptions(args); if (language == null || templateEngine == null) { @@ -77,6 +77,9 @@ public static void Main(string[] args) projectProcessors.Add(new LiquidProjectProcessor()); } + var isSingleFileOutput = !string.IsNullOrEmpty(singleOutputFile); + + var localizableStrings = new LocalizableStringCollection(); foreach (var projectFile in projectFiles) { var projectPath = Path.GetDirectoryName(projectFile); @@ -88,30 +91,49 @@ public static void Main(string[] args) continue; } - var localizableStrings = new LocalizableStringCollection(); foreach (var projectProcessor in projectProcessors) { projectProcessor.Process(projectPath, projectBasePath, localizableStrings); } + if (!isSingleFileOutput) + { + if (localizableStrings.Values.Any()) + { + var potPath = Path.Combine(outputPath, Path.GetFileNameWithoutExtension(projectFile) + PoWriter.PortaleObjectTemplateExtension); + + Directory.CreateDirectory(Path.GetDirectoryName(potPath)); + + using var potFile = new PoWriter(potPath); + potFile.WriteRecord(localizableStrings.Values); + localizableStrings.Clear(); + } + + Console.WriteLine($"{Path.GetFileName(projectPath)}: Found {localizableStrings.Values.Count()} strings."); + } + } + + + if (isSingleFileOutput) + { + Console.WriteLine($"Found {localizableStrings.Values.Count()} strings."); if (localizableStrings.Values.Any()) { - var potPath = Path.Combine(outputPath, Path.GetFileNameWithoutExtension(projectFile) + PoWriter.PortaleObjectTemplateExtension); + var potPath = Path.Combine(outputPath, singleOutputFile); Directory.CreateDirectory(Path.GetDirectoryName(potPath)); - using var potFile = new PoWriter(potPath); potFile.WriteRecord(localizableStrings.Values); } - - Console.WriteLine($"{Path.GetFileName(projectPath)}: Found {localizableStrings.Values.Count()} strings."); } } - private static (string language, string templateEngine) GetCliOptions(string[] args) + private static (string language, string templateEngine, string singleOutputFile) GetCliOptions(string[] args) { var language = _defaultLanguage; var templateEngine = _defaultTemplateEngine; + string singleOutputFile = null; + for (int i = 4; i <= args.Length; i += 2) { switch (args[i - 2]) @@ -153,7 +175,7 @@ private static (string language, string templateEngine) GetCliOptions(string[] a if (!string.IsNullOrEmpty(args[i - 1])) { var ignoredProjects = args[i - 1].Split(',', StringSplitOptions.RemoveEmptyEntries); - + foreach (var ignoredProject in ignoredProjects) { IgnoredProject.Add(ignoredProject); @@ -169,6 +191,13 @@ private static (string language, string templateEngine) GetCliOptions(string[] a LocalizerAccessors.LocalizerIdentifiers = localizerIdentifiers; } + break; + case "-s": + case "--single": + if (!string.IsNullOrEmpty(args[i - 1])) + { + singleOutputFile = args[i - 1]; + } break; default: language = null; @@ -177,7 +206,7 @@ private static (string language, string templateEngine) GetCliOptions(string[] a } } - return (language, templateEngine); + return (language, templateEngine, singleOutputFile); } private static void ShowHelp() @@ -195,6 +224,7 @@ private static void ShowHelp() Console.WriteLine(" -t, --template Specifies the template engine to extract the translatable strings from."); Console.WriteLine(" Default: Razor & Liquid templates"); Console.WriteLine(" -i, --ignore project1,project2 Ignores extracting PO filed from a given project(s)."); - Console.WriteLine(" --localizer localizer1,localizer2 Specifies the name of the localizer(s) that will be used suring the extraction process."); + Console.WriteLine(" --localizer localizer1,localizer2 Specifies the name of the localizer(s) that will be used during the extraction process."); + Console.WriteLine(" -s, --single messages.pot Get single output file."); } } From 7dcb6a63951eb206fcfb5dd558328b6dc3110d30 Mon Sep 17 00:00:00 2001 From: Vincenzo Carlino Date: Mon, 17 Jun 2024 21:12:07 +0200 Subject: [PATCH 02/10] Update src/OrchardCoreContrib.PoExtractor.Abstractions/LocalizableStringCollection.cs Co-authored-by: Hisham Bin Ateya --- .../LocalizableStringCollection.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/OrchardCoreContrib.PoExtractor.Abstractions/LocalizableStringCollection.cs b/src/OrchardCoreContrib.PoExtractor.Abstractions/LocalizableStringCollection.cs index f3adab8..d1cab2d 100644 --- a/src/OrchardCoreContrib.PoExtractor.Abstractions/LocalizableStringCollection.cs +++ b/src/OrchardCoreContrib.PoExtractor.Abstractions/LocalizableStringCollection.cs @@ -45,8 +45,5 @@ public void Add(LocalizableStringOccurence item) /// /// Clear collection /// - public void Clear() - { - _values.Clear(); - } + public void Clear() => _values.Clear(); } From 1ce630bb430e156a29b96957914f0ccbf1ccd5b9 Mon Sep 17 00:00:00 2001 From: Vincenzo Carlino Date: Mon, 17 Jun 2024 21:12:13 +0200 Subject: [PATCH 03/10] Update src/OrchardCoreContrib.PoExtractor/Program.cs Co-authored-by: Hisham Bin Ateya --- src/OrchardCoreContrib.PoExtractor/Program.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OrchardCoreContrib.PoExtractor/Program.cs b/src/OrchardCoreContrib.PoExtractor/Program.cs index 9e98d0d..dec73f7 100644 --- a/src/OrchardCoreContrib.PoExtractor/Program.cs +++ b/src/OrchardCoreContrib.PoExtractor/Program.cs @@ -78,7 +78,6 @@ public static void Main(string[] args) } var isSingleFileOutput = !string.IsNullOrEmpty(singleOutputFile); - var localizableStrings = new LocalizableStringCollection(); foreach (var projectFile in projectFiles) { From 606c1f5ed2a7634a94d34577bf19e71d3deb4ab0 Mon Sep 17 00:00:00 2001 From: Vincenzo Carlino Date: Mon, 17 Jun 2024 21:12:30 +0200 Subject: [PATCH 04/10] Update src/OrchardCoreContrib.PoExtractor/Program.cs Co-authored-by: Hisham Bin Ateya --- src/OrchardCoreContrib.PoExtractor/Program.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OrchardCoreContrib.PoExtractor/Program.cs b/src/OrchardCoreContrib.PoExtractor/Program.cs index dec73f7..249c0bd 100644 --- a/src/OrchardCoreContrib.PoExtractor/Program.cs +++ b/src/OrchardCoreContrib.PoExtractor/Program.cs @@ -112,7 +112,6 @@ public static void Main(string[] args) } } - if (isSingleFileOutput) { Console.WriteLine($"Found {localizableStrings.Values.Count()} strings."); From b27746ea8860d5fb8bd3aee820a40beb738975f1 Mon Sep 17 00:00:00 2001 From: Vincenzo Carlino Date: Mon, 17 Jun 2024 21:12:49 +0200 Subject: [PATCH 05/10] Update src/OrchardCoreContrib.PoExtractor/Program.cs Co-authored-by: Hisham Bin Ateya --- src/OrchardCoreContrib.PoExtractor/Program.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OrchardCoreContrib.PoExtractor/Program.cs b/src/OrchardCoreContrib.PoExtractor/Program.cs index 249c0bd..3321b0e 100644 --- a/src/OrchardCoreContrib.PoExtractor/Program.cs +++ b/src/OrchardCoreContrib.PoExtractor/Program.cs @@ -131,7 +131,6 @@ private static (string language, string templateEngine, string singleOutputFile) var language = _defaultLanguage; var templateEngine = _defaultTemplateEngine; string singleOutputFile = null; - for (int i = 4; i <= args.Length; i += 2) { switch (args[i - 2]) From 58402f4b7c30a616fe17eba5aa44da1d7b7df5e8 Mon Sep 17 00:00:00 2001 From: Vincenzo Carlino Date: Mon, 17 Jun 2024 21:12:53 +0200 Subject: [PATCH 06/10] Update src/OrchardCoreContrib.PoExtractor/Program.cs Co-authored-by: Hisham Bin Ateya --- src/OrchardCoreContrib.PoExtractor/Program.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OrchardCoreContrib.PoExtractor/Program.cs b/src/OrchardCoreContrib.PoExtractor/Program.cs index 3321b0e..243be6c 100644 --- a/src/OrchardCoreContrib.PoExtractor/Program.cs +++ b/src/OrchardCoreContrib.PoExtractor/Program.cs @@ -222,6 +222,6 @@ private static void ShowHelp() Console.WriteLine(" Default: Razor & Liquid templates"); Console.WriteLine(" -i, --ignore project1,project2 Ignores extracting PO filed from a given project(s)."); Console.WriteLine(" --localizer localizer1,localizer2 Specifies the name of the localizer(s) that will be used during the extraction process."); - Console.WriteLine(" -s, --single messages.pot Get single output file."); + Console.WriteLine(" -s, --single messages.pot Specifices the single output file."); } } From 479751a4634e4b962a9cd7af95d6c6bdefaaefd4 Mon Sep 17 00:00:00 2001 From: Vincenzo Carlino Date: Mon, 17 Jun 2024 22:02:33 +0200 Subject: [PATCH 07/10] tests --- src/OrchardCoreContrib.PoExtractor/Program.cs | 2 +- .../ExecutionTests.cs | 40 +++++++++++++++++++ ...rchardCoreContrib.PoExtractor.Tests.csproj | 1 + 3 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 test/OrchardCoreContrib.PoExtractor.Tests/ExecutionTests.cs diff --git a/src/OrchardCoreContrib.PoExtractor/Program.cs b/src/OrchardCoreContrib.PoExtractor/Program.cs index 243be6c..6bb49d5 100644 --- a/src/OrchardCoreContrib.PoExtractor/Program.cs +++ b/src/OrchardCoreContrib.PoExtractor/Program.cs @@ -222,6 +222,6 @@ private static void ShowHelp() Console.WriteLine(" Default: Razor & Liquid templates"); Console.WriteLine(" -i, --ignore project1,project2 Ignores extracting PO filed from a given project(s)."); Console.WriteLine(" --localizer localizer1,localizer2 Specifies the name of the localizer(s) that will be used during the extraction process."); - Console.WriteLine(" -s, --single messages.pot Specifices the single output file."); + Console.WriteLine(" -s, --single messages.pot Specifies the single output file."); } } diff --git a/test/OrchardCoreContrib.PoExtractor.Tests/ExecutionTests.cs b/test/OrchardCoreContrib.PoExtractor.Tests/ExecutionTests.cs new file mode 100644 index 0000000..7443f69 --- /dev/null +++ b/test/OrchardCoreContrib.PoExtractor.Tests/ExecutionTests.cs @@ -0,0 +1,40 @@ +using Microsoft.Extensions.Localization; +using NSubstitute; +using Xunit; + +namespace OrchardCoreContrib.PoExtractor.Tests; + +public class ExecutionTests +{ + private readonly IStringLocalizer _localizer = Substitute.For>(); + + public ExecutionTests() + { + var _ = _localizer["fake_one"]; + } + + [Fact] + public void Should_get_translations() + { + var outputPath = Path.Combine(Path.GetTempPath(), "test_should_get_translations"); + var args = new string[]{ + Directory.GetCurrentDirectory().Split("/OrchardCoreContrib.PoExtractor.Tests").First(), // first element: input project path + outputPath, + "--localizer", + "_localizer" + }; + + Program.Main(args); + + var files = Directory.EnumerateFiles(outputPath) + .Where(f => f.Contains("OrchardCoreContrib.PoExtractor.Tests")); + + Assert.Single(files); + + using var reader = new StreamReader(files.Single()); + string potContent = reader.ReadToEnd(); + + Assert.Contains("msgid \"fake_one\"", potContent); + Assert.Contains("msgctxt \"OrchardCoreContrib.PoExtractor.Tests.ExecutionTests\"", potContent); + } +} \ No newline at end of file diff --git a/test/OrchardCoreContrib.PoExtractor.Tests/OrchardCoreContrib.PoExtractor.Tests.csproj b/test/OrchardCoreContrib.PoExtractor.Tests/OrchardCoreContrib.PoExtractor.Tests.csproj index ef38796..c918450 100644 --- a/test/OrchardCoreContrib.PoExtractor.Tests/OrchardCoreContrib.PoExtractor.Tests.csproj +++ b/test/OrchardCoreContrib.PoExtractor.Tests/OrchardCoreContrib.PoExtractor.Tests.csproj @@ -10,6 +10,7 @@ + runtime; build; native; contentfiles; analyzers; buildtransitive From b22ab3bada77c674e66d0b996cdd828a270b24a8 Mon Sep 17 00:00:00 2001 From: Hisham Bin Ateya Date: Tue, 13 Aug 2024 01:44:42 +0300 Subject: [PATCH 08/10] Formatting --- src/OrchardCoreContrib.PoExtractor/Program.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/OrchardCoreContrib.PoExtractor/Program.cs b/src/OrchardCoreContrib.PoExtractor/Program.cs index 6bb49d5..97d90d7 100644 --- a/src/OrchardCoreContrib.PoExtractor/Program.cs +++ b/src/OrchardCoreContrib.PoExtractor/Program.cs @@ -114,15 +114,17 @@ public static void Main(string[] args) if (isSingleFileOutput) { - Console.WriteLine($"Found {localizableStrings.Values.Count()} strings."); if (localizableStrings.Values.Any()) { var potPath = Path.Combine(outputPath, singleOutputFile); Directory.CreateDirectory(Path.GetDirectoryName(potPath)); + using var potFile = new PoWriter(potPath); potFile.WriteRecord(localizableStrings.Values); } + + Console.WriteLine($"Found {localizableStrings.Values.Count()} strings."); } } @@ -195,6 +197,7 @@ private static (string language, string templateEngine, string singleOutputFile) { singleOutputFile = args[i - 1]; } + break; default: language = null; @@ -222,6 +225,6 @@ private static void ShowHelp() Console.WriteLine(" Default: Razor & Liquid templates"); Console.WriteLine(" -i, --ignore project1,project2 Ignores extracting PO filed from a given project(s)."); Console.WriteLine(" --localizer localizer1,localizer2 Specifies the name of the localizer(s) that will be used during the extraction process."); - Console.WriteLine(" -s, --single messages.pot Specifies the single output file."); + Console.WriteLine(" -s, --single Specifies the single output file."); } } From e18c768d842ed88ef2fc015fb652ba2f0af48c7a Mon Sep 17 00:00:00 2001 From: Hisham Bin Ateya Date: Thu, 15 Aug 2024 11:59:07 +0300 Subject: [PATCH 09/10] Delete ExecutionTests --- .../ExecutionTests.cs | 40 ------------------- 1 file changed, 40 deletions(-) delete mode 100644 test/OrchardCoreContrib.PoExtractor.Tests/ExecutionTests.cs diff --git a/test/OrchardCoreContrib.PoExtractor.Tests/ExecutionTests.cs b/test/OrchardCoreContrib.PoExtractor.Tests/ExecutionTests.cs deleted file mode 100644 index 7443f69..0000000 --- a/test/OrchardCoreContrib.PoExtractor.Tests/ExecutionTests.cs +++ /dev/null @@ -1,40 +0,0 @@ -using Microsoft.Extensions.Localization; -using NSubstitute; -using Xunit; - -namespace OrchardCoreContrib.PoExtractor.Tests; - -public class ExecutionTests -{ - private readonly IStringLocalizer _localizer = Substitute.For>(); - - public ExecutionTests() - { - var _ = _localizer["fake_one"]; - } - - [Fact] - public void Should_get_translations() - { - var outputPath = Path.Combine(Path.GetTempPath(), "test_should_get_translations"); - var args = new string[]{ - Directory.GetCurrentDirectory().Split("/OrchardCoreContrib.PoExtractor.Tests").First(), // first element: input project path - outputPath, - "--localizer", - "_localizer" - }; - - Program.Main(args); - - var files = Directory.EnumerateFiles(outputPath) - .Where(f => f.Contains("OrchardCoreContrib.PoExtractor.Tests")); - - Assert.Single(files); - - using var reader = new StreamReader(files.Single()); - string potContent = reader.ReadToEnd(); - - Assert.Contains("msgid \"fake_one\"", potContent); - Assert.Contains("msgctxt \"OrchardCoreContrib.PoExtractor.Tests.ExecutionTests\"", potContent); - } -} \ No newline at end of file From 0784a8d78aaa06a690491247ff38f63d251781d7 Mon Sep 17 00:00:00 2001 From: Hisham Bin Ateya Date: Thu, 15 Aug 2024 11:59:40 +0300 Subject: [PATCH 10/10] Remove NSubstitute dependency --- .../OrchardCoreContrib.PoExtractor.Tests.csproj | 1 - 1 file changed, 1 deletion(-) diff --git a/test/OrchardCoreContrib.PoExtractor.Tests/OrchardCoreContrib.PoExtractor.Tests.csproj b/test/OrchardCoreContrib.PoExtractor.Tests/OrchardCoreContrib.PoExtractor.Tests.csproj index c918450..ef38796 100644 --- a/test/OrchardCoreContrib.PoExtractor.Tests/OrchardCoreContrib.PoExtractor.Tests.csproj +++ b/test/OrchardCoreContrib.PoExtractor.Tests/OrchardCoreContrib.PoExtractor.Tests.csproj @@ -10,7 +10,6 @@ - runtime; build; native; contentfiles; analyzers; buildtransitive