From d2629c2ee5b4a4884b8a3cd8898267d6f9a382da Mon Sep 17 00:00:00 2001 From: Michael Mortensen Date: Sun, 29 Sep 2024 14:56:45 +0200 Subject: [PATCH 1/3] :memo: updated DocFX --- .../api/namespaces/Cuemon.Extensions.Globalization.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.docfx/api/namespaces/Cuemon.Extensions.Globalization.md b/.docfx/api/namespaces/Cuemon.Extensions.Globalization.md index aef718d66..599ef7f53 100644 --- a/.docfx/api/namespaces/Cuemon.Extensions.Globalization.md +++ b/.docfx/api/namespaces/Cuemon.Extensions.Globalization.md @@ -2,11 +2,11 @@ uid: Cuemon.Extensions.Globalization summary: *content --- -The `Cuemon.Extensions.Globalization` namespace contains extension methods that complements the `Cuemon.Globalization` namespace while being an addition to the `System.Globalization` namespace. +The `Cuemon.Extensions.Globalization` namespace contains extension methods that is an addition to the `System.Globalization` namespace. [!INCLUDE [availability-default](../../includes/availability-default.md)] -Complements: [Cuemon.Globalization namespace](/api/dotnet/Cuemon.Globalization.html) 📘 +Complements: [System.Globalization namespace](https://docs.microsoft.com/en-us/dotnet/api/system.globalization) 🔗 ### Extension Methods @@ -15,10 +15,11 @@ Complements: [Cuemon.Globalization namespace](/api/dotnet/Cuemon.Globalization.h |CultureInfo|⬇️|`UseNationalLanguageSupport`| ### CSharp Example + ```csharp -var danishCultureIcu = CultureInfo("da-dk"); -var danishCultureNls = new CultureInfo("da-dk").UseNationalLanguageSupport(); +var danishCultureIcu = new CultureInfo("da-dk", false); +var danishCultureNls = new CultureInfo("da-dk", false).UseNationalLanguageSupport(); // danishCultureIcu outputs dd.MM.yyyy from danishCultureIcu.DateTimeFormat.ShortDatePattern // danishCultureNls outputs dd-MM-yyyy from danishCultureNls.DateTimeFormat.ShortDatePattern -``` \ No newline at end of file +``` From 742606b405220eb41375441f100d4abd25d09c4b Mon Sep 17 00:00:00 2001 From: Michael Mortensen Date: Sun, 29 Sep 2024 14:57:34 +0200 Subject: [PATCH 2/3] :package: updated NuGet package definition --- .nuget/Cuemon.Extensions.Globalization/README.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/.nuget/Cuemon.Extensions.Globalization/README.md b/.nuget/Cuemon.Extensions.Globalization/README.md index 34e65f97b..eb9854c49 100644 --- a/.nuget/Cuemon.Extensions.Globalization/README.md +++ b/.nuget/Cuemon.Extensions.Globalization/README.md @@ -7,12 +7,24 @@ It is, by heart, free, flexible and built to extend and boost your agile codebel ## **Cuemon.Extensions.Globalization** for .NET -The `Cuemon.Extensions.Globalization` namespace contains extension methods that complements the Cuemon.Globalization namespace while being an addition to the System.Globalization namespace. +The `Cuemon.Extensions.Globalization` namespace contains extension methods that is an addition to the `System.Globalization` namespace. + +It aims to provide a way to favor National Language Support (NLS) over International Components for Unicode (ICU). More documentation available at our documentation site: - [Cuemon for .NET documentation](https://docs.cuemon.net/api/extensions/dotnet/Cuemon.Extensions.Globalization.html) 🔗 +### CSharp Example + +```csharp +var danishCultureIcu = new CultureInfo("da-dk", false); +var danishCultureNls = new CultureInfo("da-dk", false).UseNationalLanguageSupport(); + +// danishCultureIcu outputs dd.MM.yyyy from danishCultureIcu.DateTimeFormat.ShortDatePattern +// danishCultureNls outputs dd-MM-yyyy from danishCultureNls.DateTimeFormat.ShortDatePattern +``` + ## Related Packages * [Cuemon.AspNetCore](https://www.nuget.org/packages/Cuemon.AspNetCore/) 📦 From aafeee23d50b493b34132f18dfb4bc91ae238756 Mon Sep 17 00:00:00 2001 From: Michael Mortensen Date: Sun, 29 Sep 2024 15:00:47 +0200 Subject: [PATCH 3/3] :globe_with_meridians: handling of readonly cultures --- .../Cuemon.Extensions.Globalization.csproj | 2 -- .../CultureInfoExtensions.cs | 19 ++++++++--- .../CultureInfoExtensionsTest.cs | 33 ++++++++++++++++--- 3 files changed, 43 insertions(+), 11 deletions(-) diff --git a/src/Cuemon.Extensions.Globalization/Cuemon.Extensions.Globalization.csproj b/src/Cuemon.Extensions.Globalization/Cuemon.Extensions.Globalization.csproj index cd32788a6..b41f716b2 100644 --- a/src/Cuemon.Extensions.Globalization/Cuemon.Extensions.Globalization.csproj +++ b/src/Cuemon.Extensions.Globalization/Cuemon.Extensions.Globalization.csproj @@ -1204,9 +1204,7 @@ - - diff --git a/src/Cuemon.Extensions.Globalization/CultureInfoExtensions.cs b/src/Cuemon.Extensions.Globalization/CultureInfoExtensions.cs index b0b6249b5..21bfcfafb 100644 --- a/src/Cuemon.Extensions.Globalization/CultureInfoExtensions.cs +++ b/src/Cuemon.Extensions.Globalization/CultureInfoExtensions.cs @@ -59,15 +59,26 @@ public static IEnumerable UseNationalLanguageSupport(this IEnumerab { var surrogate = typeof(CultureInfoExtensions).GetEmbeddedResources($"{culture.Name}.bin", ManifestResourceMatch.ContainsName).SingleOrDefault(); var ms = new MemoryStream(surrogate.Value.DecompressGZip().ToByteArray()); - var suggogateCulture = YamlFormatter.DeserializeObject(ms, o => + var surrogateCulture = YamlFormatter.DeserializeObject(ms, o => { o.Settings.NamingConvention = NullNamingConvention.Instance; o.Settings.ReflectionRules = new MemberReflection(); o.Settings.IndentSequences = false; }); - Enrich(culture, suggogateCulture); - EnrichedCultureInfos.Add(culture); - enrichedCultures.Add(culture); + + if (culture.IsReadOnly) + { + var cultureClone = culture.Clone() as CultureInfo; + Enrich(cultureClone, surrogateCulture); + EnrichedCultureInfos.Add(cultureClone); + enrichedCultures.Add(cultureClone); + } + else + { + Enrich(culture, surrogateCulture); + EnrichedCultureInfos.Add(culture); + enrichedCultures.Add(culture); + } } } return enrichedCultures; diff --git a/test/Cuemon.Extensions.Globalization.Tests/CultureInfoExtensionsTest.cs b/test/Cuemon.Extensions.Globalization.Tests/CultureInfoExtensionsTest.cs index b7002f5da..bac02722d 100644 --- a/test/Cuemon.Extensions.Globalization.Tests/CultureInfoExtensionsTest.cs +++ b/test/Cuemon.Extensions.Globalization.Tests/CultureInfoExtensionsTest.cs @@ -1,18 +1,41 @@ using System.Globalization; -using System.Linq; +using System.Runtime.InteropServices; using Codebelt.Extensions.Xunit; -using Cuemon.Globalization; using Xunit; +using Xunit.Abstractions; namespace Cuemon.Extensions.Globalization { public class CultureInfoExtensionsTest : Test { + public CultureInfoExtensionsTest(ITestOutputHelper output) : base(output) + { + } + + [Fact] + public void UseNationalLanguageSupport_ShouldHaveDifferentFormattingAsWindowsVariant() + { + var sut1 = new CultureInfo("da-DK", false); + var sut2 = (RuntimeInformation.IsOSPlatform(OSPlatform.Linux) + ? new CultureInfo("da-DK") // Linux uses ICU + : new CultureInfo("da-DK", false) // Ensure we do not read from user culture settings on Windows + ).UseNationalLanguageSupport(); + + Assert.NotEqual(sut1.DateTimeFormat, sut2.DateTimeFormat); + Assert.NotEqual(sut1.NumberFormat, sut2.NumberFormat); +#if NET48_OR_GREATER + Assert.Equal(sut1.DateTimeFormat.ShortDatePattern, sut2.DateTimeFormat.ShortDatePattern); +#else + Assert.Equal("dd.MM.yyyy", sut1.DateTimeFormat.ShortDatePattern); + Assert.Equal("dd-MM-yyyy", sut2.DateTimeFormat.ShortDatePattern); +#endif + } + [Fact] - public void MergeWithOriginal_ShouldHaveDifferentFormattingAsWindowsVariant() + public void UseNationalLanguageSupport_ShouldHaveDifferentFormattingAsWindowsVariant_FromReadOnlyCultureInfos() { - var sut1 = World.GetCultures(new RegionInfo("DK")).Single(ci => ci.Name == "da-DK"); - var sut2 = new CultureInfo("da-dk").UseNationalLanguageSupport(); + var sut1 = CultureInfo.GetCultureInfo("da-DK"); + var sut2 = CultureInfo.GetCultureInfo("da-DK").UseNationalLanguageSupport(); Assert.NotEqual(sut1.DateTimeFormat, sut2.DateTimeFormat); Assert.NotEqual(sut1.NumberFormat, sut2.NumberFormat);