diff --git a/My.Extensions.Localization.Json.sln b/My.Extensions.Localization.Json.sln index 3fe07cb..5914cba 100644 --- a/My.Extensions.Localization.Json.sln +++ b/My.Extensions.Localization.Json.sln @@ -27,48 +27,152 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LocalizationSample.Blazor.C EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "My.Extensions.Localization.Json.Benchmarks", "test\My.Extensions.Localization.Json.Benchmarks\My.Extensions.Localization.Json.Benchmarks.csproj", "{37DA3363-09EC-4686-89A9-2D12B2472C52}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ResourcesClassLibraryNoAttribute", "test\ResourcesClassLibraryNoAttribute\ResourcesClassLibraryNoAttribute.csproj", "{4E150972-E056-4C80-A934-1136B20A3065}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ResourcesClassLibraryWithAttribute", "test\ResourcesClassLibraryWithAttribute\ResourcesClassLibraryWithAttribute.csproj", "{AB0714F5-7BBC-4DAC-B622-2F5745A8C91C}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {15E86906-2A6F-4F35-8D06-404CD33C82D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {15E86906-2A6F-4F35-8D06-404CD33C82D5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {15E86906-2A6F-4F35-8D06-404CD33C82D5}.Debug|x64.ActiveCfg = Debug|Any CPU + {15E86906-2A6F-4F35-8D06-404CD33C82D5}.Debug|x64.Build.0 = Debug|Any CPU + {15E86906-2A6F-4F35-8D06-404CD33C82D5}.Debug|x86.ActiveCfg = Debug|Any CPU + {15E86906-2A6F-4F35-8D06-404CD33C82D5}.Debug|x86.Build.0 = Debug|Any CPU {15E86906-2A6F-4F35-8D06-404CD33C82D5}.Release|Any CPU.ActiveCfg = Release|Any CPU {15E86906-2A6F-4F35-8D06-404CD33C82D5}.Release|Any CPU.Build.0 = Release|Any CPU + {15E86906-2A6F-4F35-8D06-404CD33C82D5}.Release|x64.ActiveCfg = Release|Any CPU + {15E86906-2A6F-4F35-8D06-404CD33C82D5}.Release|x64.Build.0 = Release|Any CPU + {15E86906-2A6F-4F35-8D06-404CD33C82D5}.Release|x86.ActiveCfg = Release|Any CPU + {15E86906-2A6F-4F35-8D06-404CD33C82D5}.Release|x86.Build.0 = Release|Any CPU {73B1195D-006C-40EE-A36F-2EDCFB2FFCDE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {73B1195D-006C-40EE-A36F-2EDCFB2FFCDE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {73B1195D-006C-40EE-A36F-2EDCFB2FFCDE}.Debug|x64.ActiveCfg = Debug|Any CPU + {73B1195D-006C-40EE-A36F-2EDCFB2FFCDE}.Debug|x64.Build.0 = Debug|Any CPU + {73B1195D-006C-40EE-A36F-2EDCFB2FFCDE}.Debug|x86.ActiveCfg = Debug|Any CPU + {73B1195D-006C-40EE-A36F-2EDCFB2FFCDE}.Debug|x86.Build.0 = Debug|Any CPU {73B1195D-006C-40EE-A36F-2EDCFB2FFCDE}.Release|Any CPU.ActiveCfg = Release|Any CPU {73B1195D-006C-40EE-A36F-2EDCFB2FFCDE}.Release|Any CPU.Build.0 = Release|Any CPU + {73B1195D-006C-40EE-A36F-2EDCFB2FFCDE}.Release|x64.ActiveCfg = Release|Any CPU + {73B1195D-006C-40EE-A36F-2EDCFB2FFCDE}.Release|x64.Build.0 = Release|Any CPU + {73B1195D-006C-40EE-A36F-2EDCFB2FFCDE}.Release|x86.ActiveCfg = Release|Any CPU + {73B1195D-006C-40EE-A36F-2EDCFB2FFCDE}.Release|x86.Build.0 = Release|Any CPU {4732D5B3-AEB5-4AF4-8679-7EBB4B2FBF95}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4732D5B3-AEB5-4AF4-8679-7EBB4B2FBF95}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4732D5B3-AEB5-4AF4-8679-7EBB4B2FBF95}.Debug|x64.ActiveCfg = Debug|Any CPU + {4732D5B3-AEB5-4AF4-8679-7EBB4B2FBF95}.Debug|x64.Build.0 = Debug|Any CPU + {4732D5B3-AEB5-4AF4-8679-7EBB4B2FBF95}.Debug|x86.ActiveCfg = Debug|Any CPU + {4732D5B3-AEB5-4AF4-8679-7EBB4B2FBF95}.Debug|x86.Build.0 = Debug|Any CPU {4732D5B3-AEB5-4AF4-8679-7EBB4B2FBF95}.Release|Any CPU.ActiveCfg = Release|Any CPU {4732D5B3-AEB5-4AF4-8679-7EBB4B2FBF95}.Release|Any CPU.Build.0 = Release|Any CPU + {4732D5B3-AEB5-4AF4-8679-7EBB4B2FBF95}.Release|x64.ActiveCfg = Release|Any CPU + {4732D5B3-AEB5-4AF4-8679-7EBB4B2FBF95}.Release|x64.Build.0 = Release|Any CPU + {4732D5B3-AEB5-4AF4-8679-7EBB4B2FBF95}.Release|x86.ActiveCfg = Release|Any CPU + {4732D5B3-AEB5-4AF4-8679-7EBB4B2FBF95}.Release|x86.Build.0 = Release|Any CPU {9789DDC4-6CC1-4A77-9883-D745BCAB524F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9789DDC4-6CC1-4A77-9883-D745BCAB524F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9789DDC4-6CC1-4A77-9883-D745BCAB524F}.Debug|x64.ActiveCfg = Debug|Any CPU + {9789DDC4-6CC1-4A77-9883-D745BCAB524F}.Debug|x64.Build.0 = Debug|Any CPU + {9789DDC4-6CC1-4A77-9883-D745BCAB524F}.Debug|x86.ActiveCfg = Debug|Any CPU + {9789DDC4-6CC1-4A77-9883-D745BCAB524F}.Debug|x86.Build.0 = Debug|Any CPU {9789DDC4-6CC1-4A77-9883-D745BCAB524F}.Release|Any CPU.ActiveCfg = Release|Any CPU {9789DDC4-6CC1-4A77-9883-D745BCAB524F}.Release|Any CPU.Build.0 = Release|Any CPU + {9789DDC4-6CC1-4A77-9883-D745BCAB524F}.Release|x64.ActiveCfg = Release|Any CPU + {9789DDC4-6CC1-4A77-9883-D745BCAB524F}.Release|x64.Build.0 = Release|Any CPU + {9789DDC4-6CC1-4A77-9883-D745BCAB524F}.Release|x86.ActiveCfg = Release|Any CPU + {9789DDC4-6CC1-4A77-9883-D745BCAB524F}.Release|x86.Build.0 = Release|Any CPU {92B0128E-57BA-4D6B-A2D9-26B54686F7D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {92B0128E-57BA-4D6B-A2D9-26B54686F7D9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {92B0128E-57BA-4D6B-A2D9-26B54686F7D9}.Debug|x64.ActiveCfg = Debug|Any CPU + {92B0128E-57BA-4D6B-A2D9-26B54686F7D9}.Debug|x64.Build.0 = Debug|Any CPU + {92B0128E-57BA-4D6B-A2D9-26B54686F7D9}.Debug|x86.ActiveCfg = Debug|Any CPU + {92B0128E-57BA-4D6B-A2D9-26B54686F7D9}.Debug|x86.Build.0 = Debug|Any CPU {92B0128E-57BA-4D6B-A2D9-26B54686F7D9}.Release|Any CPU.ActiveCfg = Release|Any CPU {92B0128E-57BA-4D6B-A2D9-26B54686F7D9}.Release|Any CPU.Build.0 = Release|Any CPU + {92B0128E-57BA-4D6B-A2D9-26B54686F7D9}.Release|x64.ActiveCfg = Release|Any CPU + {92B0128E-57BA-4D6B-A2D9-26B54686F7D9}.Release|x64.Build.0 = Release|Any CPU + {92B0128E-57BA-4D6B-A2D9-26B54686F7D9}.Release|x86.ActiveCfg = Release|Any CPU + {92B0128E-57BA-4D6B-A2D9-26B54686F7D9}.Release|x86.Build.0 = Release|Any CPU {DC858972-8F2F-4E79-A455-154D58EC47AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DC858972-8F2F-4E79-A455-154D58EC47AE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DC858972-8F2F-4E79-A455-154D58EC47AE}.Debug|x64.ActiveCfg = Debug|Any CPU + {DC858972-8F2F-4E79-A455-154D58EC47AE}.Debug|x64.Build.0 = Debug|Any CPU + {DC858972-8F2F-4E79-A455-154D58EC47AE}.Debug|x86.ActiveCfg = Debug|Any CPU + {DC858972-8F2F-4E79-A455-154D58EC47AE}.Debug|x86.Build.0 = Debug|Any CPU {DC858972-8F2F-4E79-A455-154D58EC47AE}.Release|Any CPU.ActiveCfg = Release|Any CPU {DC858972-8F2F-4E79-A455-154D58EC47AE}.Release|Any CPU.Build.0 = Release|Any CPU + {DC858972-8F2F-4E79-A455-154D58EC47AE}.Release|x64.ActiveCfg = Release|Any CPU + {DC858972-8F2F-4E79-A455-154D58EC47AE}.Release|x64.Build.0 = Release|Any CPU + {DC858972-8F2F-4E79-A455-154D58EC47AE}.Release|x86.ActiveCfg = Release|Any CPU + {DC858972-8F2F-4E79-A455-154D58EC47AE}.Release|x86.Build.0 = Release|Any CPU {ABAE045F-7B99-4C72-83F7-8F37209B5D8C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {ABAE045F-7B99-4C72-83F7-8F37209B5D8C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ABAE045F-7B99-4C72-83F7-8F37209B5D8C}.Debug|x64.ActiveCfg = Debug|Any CPU + {ABAE045F-7B99-4C72-83F7-8F37209B5D8C}.Debug|x64.Build.0 = Debug|Any CPU + {ABAE045F-7B99-4C72-83F7-8F37209B5D8C}.Debug|x86.ActiveCfg = Debug|Any CPU + {ABAE045F-7B99-4C72-83F7-8F37209B5D8C}.Debug|x86.Build.0 = Debug|Any CPU {ABAE045F-7B99-4C72-83F7-8F37209B5D8C}.Release|Any CPU.ActiveCfg = Release|Any CPU {ABAE045F-7B99-4C72-83F7-8F37209B5D8C}.Release|Any CPU.Build.0 = Release|Any CPU + {ABAE045F-7B99-4C72-83F7-8F37209B5D8C}.Release|x64.ActiveCfg = Release|Any CPU + {ABAE045F-7B99-4C72-83F7-8F37209B5D8C}.Release|x64.Build.0 = Release|Any CPU + {ABAE045F-7B99-4C72-83F7-8F37209B5D8C}.Release|x86.ActiveCfg = Release|Any CPU + {ABAE045F-7B99-4C72-83F7-8F37209B5D8C}.Release|x86.Build.0 = Release|Any CPU {BCDCE0D6-4A71-49CF-8F81-1233FB14DEA3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BCDCE0D6-4A71-49CF-8F81-1233FB14DEA3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BCDCE0D6-4A71-49CF-8F81-1233FB14DEA3}.Debug|x64.ActiveCfg = Debug|Any CPU + {BCDCE0D6-4A71-49CF-8F81-1233FB14DEA3}.Debug|x64.Build.0 = Debug|Any CPU + {BCDCE0D6-4A71-49CF-8F81-1233FB14DEA3}.Debug|x86.ActiveCfg = Debug|Any CPU + {BCDCE0D6-4A71-49CF-8F81-1233FB14DEA3}.Debug|x86.Build.0 = Debug|Any CPU {BCDCE0D6-4A71-49CF-8F81-1233FB14DEA3}.Release|Any CPU.ActiveCfg = Release|Any CPU {BCDCE0D6-4A71-49CF-8F81-1233FB14DEA3}.Release|Any CPU.Build.0 = Release|Any CPU + {BCDCE0D6-4A71-49CF-8F81-1233FB14DEA3}.Release|x64.ActiveCfg = Release|Any CPU + {BCDCE0D6-4A71-49CF-8F81-1233FB14DEA3}.Release|x64.Build.0 = Release|Any CPU + {BCDCE0D6-4A71-49CF-8F81-1233FB14DEA3}.Release|x86.ActiveCfg = Release|Any CPU + {BCDCE0D6-4A71-49CF-8F81-1233FB14DEA3}.Release|x86.Build.0 = Release|Any CPU {37DA3363-09EC-4686-89A9-2D12B2472C52}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {37DA3363-09EC-4686-89A9-2D12B2472C52}.Debug|Any CPU.Build.0 = Debug|Any CPU + {37DA3363-09EC-4686-89A9-2D12B2472C52}.Debug|x64.ActiveCfg = Debug|Any CPU + {37DA3363-09EC-4686-89A9-2D12B2472C52}.Debug|x64.Build.0 = Debug|Any CPU + {37DA3363-09EC-4686-89A9-2D12B2472C52}.Debug|x86.ActiveCfg = Debug|Any CPU + {37DA3363-09EC-4686-89A9-2D12B2472C52}.Debug|x86.Build.0 = Debug|Any CPU {37DA3363-09EC-4686-89A9-2D12B2472C52}.Release|Any CPU.ActiveCfg = Release|Any CPU {37DA3363-09EC-4686-89A9-2D12B2472C52}.Release|Any CPU.Build.0 = Release|Any CPU + {37DA3363-09EC-4686-89A9-2D12B2472C52}.Release|x64.ActiveCfg = Release|Any CPU + {37DA3363-09EC-4686-89A9-2D12B2472C52}.Release|x64.Build.0 = Release|Any CPU + {37DA3363-09EC-4686-89A9-2D12B2472C52}.Release|x86.ActiveCfg = Release|Any CPU + {37DA3363-09EC-4686-89A9-2D12B2472C52}.Release|x86.Build.0 = Release|Any CPU + {4E150972-E056-4C80-A934-1136B20A3065}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4E150972-E056-4C80-A934-1136B20A3065}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4E150972-E056-4C80-A934-1136B20A3065}.Debug|x64.ActiveCfg = Debug|Any CPU + {4E150972-E056-4C80-A934-1136B20A3065}.Debug|x64.Build.0 = Debug|Any CPU + {4E150972-E056-4C80-A934-1136B20A3065}.Debug|x86.ActiveCfg = Debug|Any CPU + {4E150972-E056-4C80-A934-1136B20A3065}.Debug|x86.Build.0 = Debug|Any CPU + {4E150972-E056-4C80-A934-1136B20A3065}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4E150972-E056-4C80-A934-1136B20A3065}.Release|Any CPU.Build.0 = Release|Any CPU + {4E150972-E056-4C80-A934-1136B20A3065}.Release|x64.ActiveCfg = Release|Any CPU + {4E150972-E056-4C80-A934-1136B20A3065}.Release|x64.Build.0 = Release|Any CPU + {4E150972-E056-4C80-A934-1136B20A3065}.Release|x86.ActiveCfg = Release|Any CPU + {4E150972-E056-4C80-A934-1136B20A3065}.Release|x86.Build.0 = Release|Any CPU + {AB0714F5-7BBC-4DAC-B622-2F5745A8C91C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AB0714F5-7BBC-4DAC-B622-2F5745A8C91C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AB0714F5-7BBC-4DAC-B622-2F5745A8C91C}.Debug|x64.ActiveCfg = Debug|Any CPU + {AB0714F5-7BBC-4DAC-B622-2F5745A8C91C}.Debug|x64.Build.0 = Debug|Any CPU + {AB0714F5-7BBC-4DAC-B622-2F5745A8C91C}.Debug|x86.ActiveCfg = Debug|Any CPU + {AB0714F5-7BBC-4DAC-B622-2F5745A8C91C}.Debug|x86.Build.0 = Debug|Any CPU + {AB0714F5-7BBC-4DAC-B622-2F5745A8C91C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AB0714F5-7BBC-4DAC-B622-2F5745A8C91C}.Release|Any CPU.Build.0 = Release|Any CPU + {AB0714F5-7BBC-4DAC-B622-2F5745A8C91C}.Release|x64.ActiveCfg = Release|Any CPU + {AB0714F5-7BBC-4DAC-B622-2F5745A8C91C}.Release|x64.Build.0 = Release|Any CPU + {AB0714F5-7BBC-4DAC-B622-2F5745A8C91C}.Release|x86.ActiveCfg = Release|Any CPU + {AB0714F5-7BBC-4DAC-B622-2F5745A8C91C}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -83,6 +187,8 @@ Global {ABAE045F-7B99-4C72-83F7-8F37209B5D8C} = {5D3D85C6-7B3B-4D7E-925F-33B19AE15D76} {BCDCE0D6-4A71-49CF-8F81-1233FB14DEA3} = {5D3D85C6-7B3B-4D7E-925F-33B19AE15D76} {37DA3363-09EC-4686-89A9-2D12B2472C52} = {9FF90A72-EC14-4C15-921F-DB7AE3D1D34C} + {4E150972-E056-4C80-A934-1136B20A3065} = {9FF90A72-EC14-4C15-921F-DB7AE3D1D34C} + {AB0714F5-7BBC-4DAC-B622-2F5745A8C91C} = {9FF90A72-EC14-4C15-921F-DB7AE3D1D34C} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {D173946A-BDF7-44A8-9740-2156FA7EC074} diff --git a/src/My.Extensions.Localization.Json/JsonStringLocalizerFactory.cs b/src/My.Extensions.Localization.Json/JsonStringLocalizerFactory.cs index a45a9ea..9c9e4c4 100644 --- a/src/My.Extensions.Localization.Json/JsonStringLocalizerFactory.cs +++ b/src/My.Extensions.Localization.Json/JsonStringLocalizerFactory.cs @@ -47,10 +47,10 @@ public IStringLocalizer Create(Type resourceSource) var typeInfo = resourceSource.GetTypeInfo(); var assembly = typeInfo.Assembly; - var assemblyName = resourceSource.Assembly.GetName().Name; - var typeName = $"{assemblyName}.{typeInfo.Name}" == typeInfo.FullName + var rootNamespace = GetRootNamespace(assembly); + var typeName = $"{rootNamespace}.{typeInfo.Name}" == typeInfo.FullName ? typeInfo.Name - : TrimPrefix(typeInfo.FullName, assemblyName + "."); + : TrimPrefix(typeInfo.FullName, rootNamespace + "."); resourcesPath = Path.Combine(PathHelpers.GetApplicationRoot(), GetResourcePath(assembly)); typeName = TryFixInnerClassPath(typeName); @@ -79,7 +79,8 @@ public IStringLocalizer Create(string baseName, string location) if (_resourcesType == ResourcesType.TypeBased) { baseName = TryFixInnerClassPath(baseName); - resourceName = TrimPrefix(baseName, location + "."); + var rootNamespace = GetRootNamespace(assembly); + resourceName = TrimPrefix(baseName, rootNamespace + "."); } return CreateJsonStringLocalizer(resourcesPath, resourceName); @@ -107,6 +108,14 @@ private string GetResourcePath(Assembly assembly) : resourceLocationAttribute.ResourceLocation; } + private static string GetRootNamespace(Assembly assembly) + { + var rootNamespaceAttribute = assembly.GetCustomAttribute(); + + return rootNamespaceAttribute?.RootNamespace + ?? assembly.GetName().Name; + } + private static string TrimPrefix(string name, string prefix) { if (name.StartsWith(prefix, StringComparison.Ordinal)) diff --git a/test/My.Extensions.Localization.Json.Tests/JsonStringLocalizerFactoryTests.cs b/test/My.Extensions.Localization.Json.Tests/JsonStringLocalizerFactoryTests.cs index 8e230dc..aee3e2e 100644 --- a/test/My.Extensions.Localization.Json.Tests/JsonStringLocalizerFactoryTests.cs +++ b/test/My.Extensions.Localization.Json.Tests/JsonStringLocalizerFactoryTests.cs @@ -1,7 +1,4 @@ -using System; -using System.Net; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.TestHost; @@ -12,6 +9,8 @@ using Microsoft.Extensions.Options; using Moq; using My.Extensions.Localization.Json.Tests.Common; +using System; +using System.Threading.Tasks; using Xunit; namespace My.Extensions.Localization.Json.Tests; @@ -112,6 +111,78 @@ public async Task LocalizerReturnsTranslationFromInnerClass() var response = await client.GetAsync("/"); } + [Fact] + public void CreateLocalizerWithType_WithoutRootNamespaceAttribute_UsesAssemblyName() + { + SetupLocalizationOptions("Resources"); + LocalizationHelper.SetCurrentCulture("en"); + + // Arrange + var localizerFactory = new JsonStringLocalizerFactory(_localizationOptions.Object, _loggerFactory); + + // Act + var localizer = localizerFactory.Create(typeof(ResourcesClassLibraryNoAttribute.TestModel)); + + // Assert + Assert.NotNull(localizer); + Assert.Equal("Hello from NoAttribute", localizer["Hello"]); + } + + [Fact] + public void CreateLocalizerWithType_WithRootNamespaceAttribute_UsesRootNamespace() + { + SetupLocalizationOptions("Resources"); + LocalizationHelper.SetCurrentCulture("en"); + + // Arrange + var localizerFactory = new JsonStringLocalizerFactory(_localizationOptions.Object, _loggerFactory); + + // Act + var localizer = localizerFactory.Create(typeof(MyCustomNamespace.TestModel)); + + // Assert + Assert.NotNull(localizer); + Assert.Equal("Hello from WithAttribute", localizer["Hello"]); + } + + [Fact] + public void CreateLocalizerWithBasenameAndLocation_WithoutRootNamespaceAttribute() + { + SetupLocalizationOptions("Resources"); + LocalizationHelper.SetCurrentCulture("fr-FR"); + + // Arrange + var localizerFactory = new JsonStringLocalizerFactory(_localizationOptions.Object, _loggerFactory); + var location = "ResourcesClassLibraryNoAttribute"; + var basename = $"{location}.TestModel"; + + // Act + var localizer = localizerFactory.Create(basename, location); + + // Assert + Assert.NotNull(localizer); + Assert.Equal("Bonjour from NoAttribute", localizer["Hello"]); + } + + [Fact] + public void CreateLocalizerWithBasenameAndLocation_WithRootNamespaceAttribute() + { + SetupLocalizationOptions("Resources"); + LocalizationHelper.SetCurrentCulture("fr-FR"); + + // Arrange + var localizerFactory = new JsonStringLocalizerFactory(_localizationOptions.Object, _loggerFactory); + var location = "ResourcesClassLibraryWithAttribute"; + var basename = "MyCustomNamespace.TestModel"; + + // Act + var localizer = localizerFactory.Create(basename, location); + + // Assert + Assert.NotNull(localizer); + Assert.Equal("Bonjour from WithAttribute", localizer["Hello"]); + } + private void SetupLocalizationOptions(string resourcesPath, ResourcesType resourcesType = ResourcesType.TypeBased) => _localizationOptions.Setup(o => o.Value) .Returns(() => new JsonLocalizationOptions { diff --git a/test/My.Extensions.Localization.Json.Tests/My.Extensions.Localization.Json.Tests.csproj b/test/My.Extensions.Localization.Json.Tests/My.Extensions.Localization.Json.Tests.csproj index 4845135..ea10982 100644 --- a/test/My.Extensions.Localization.Json.Tests/My.Extensions.Localization.Json.Tests.csproj +++ b/test/My.Extensions.Localization.Json.Tests/My.Extensions.Localization.Json.Tests.csproj @@ -18,6 +18,8 @@ + + diff --git a/test/ResourcesClassLibraryNoAttribute/AssemblyInfo.cs b/test/ResourcesClassLibraryNoAttribute/AssemblyInfo.cs new file mode 100644 index 0000000..8e2bda8 --- /dev/null +++ b/test/ResourcesClassLibraryNoAttribute/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using Microsoft.Extensions.Localization; + +[assembly: ResourceLocation("Resources/NoAttr")] diff --git a/test/ResourcesClassLibraryNoAttribute/Class1.cs b/test/ResourcesClassLibraryNoAttribute/Class1.cs new file mode 100644 index 0000000..e0cf2a9 --- /dev/null +++ b/test/ResourcesClassLibraryNoAttribute/Class1.cs @@ -0,0 +1,6 @@ +namespace ResourcesClassLibraryNoAttribute; + +public class TestModel +{ + public string Name { get; set; } +} diff --git a/test/ResourcesClassLibraryNoAttribute/Resources/NoAttr/TestModel.en.json b/test/ResourcesClassLibraryNoAttribute/Resources/NoAttr/TestModel.en.json new file mode 100644 index 0000000..6eed50a --- /dev/null +++ b/test/ResourcesClassLibraryNoAttribute/Resources/NoAttr/TestModel.en.json @@ -0,0 +1,3 @@ +{ + "Hello": "Hello from NoAttribute" +} diff --git a/test/ResourcesClassLibraryNoAttribute/Resources/NoAttr/TestModel.fr-FR.json b/test/ResourcesClassLibraryNoAttribute/Resources/NoAttr/TestModel.fr-FR.json new file mode 100644 index 0000000..caca9ff --- /dev/null +++ b/test/ResourcesClassLibraryNoAttribute/Resources/NoAttr/TestModel.fr-FR.json @@ -0,0 +1,3 @@ +{ + "Hello": "Bonjour from NoAttribute" +} diff --git a/test/ResourcesClassLibraryNoAttribute/ResourcesClassLibraryNoAttribute.csproj b/test/ResourcesClassLibraryNoAttribute/ResourcesClassLibraryNoAttribute.csproj new file mode 100644 index 0000000..3a1a8fa --- /dev/null +++ b/test/ResourcesClassLibraryNoAttribute/ResourcesClassLibraryNoAttribute.csproj @@ -0,0 +1,18 @@ + + + + net10.0 + enable + + + + + + + + + PreserveNewest + + + + diff --git a/test/ResourcesClassLibraryWithAttribute/AssemblyInfo.cs b/test/ResourcesClassLibraryWithAttribute/AssemblyInfo.cs new file mode 100644 index 0000000..7ead986 --- /dev/null +++ b/test/ResourcesClassLibraryWithAttribute/AssemblyInfo.cs @@ -0,0 +1,4 @@ +using Microsoft.Extensions.Localization; + +[assembly: RootNamespace("MyCustomNamespace")] +[assembly: ResourceLocation("Resources/WithAttr")] diff --git a/test/ResourcesClassLibraryWithAttribute/Class1.cs b/test/ResourcesClassLibraryWithAttribute/Class1.cs new file mode 100644 index 0000000..9976829 --- /dev/null +++ b/test/ResourcesClassLibraryWithAttribute/Class1.cs @@ -0,0 +1,6 @@ +namespace MyCustomNamespace; + +public class TestModel +{ + public string Name { get; set; } +} diff --git a/test/ResourcesClassLibraryWithAttribute/Resources/WithAttr/TestModel.en.json b/test/ResourcesClassLibraryWithAttribute/Resources/WithAttr/TestModel.en.json new file mode 100644 index 0000000..e565910 --- /dev/null +++ b/test/ResourcesClassLibraryWithAttribute/Resources/WithAttr/TestModel.en.json @@ -0,0 +1,3 @@ +{ + "Hello": "Hello from WithAttribute" +} diff --git a/test/ResourcesClassLibraryWithAttribute/Resources/WithAttr/TestModel.fr-FR.json b/test/ResourcesClassLibraryWithAttribute/Resources/WithAttr/TestModel.fr-FR.json new file mode 100644 index 0000000..93e256e --- /dev/null +++ b/test/ResourcesClassLibraryWithAttribute/Resources/WithAttr/TestModel.fr-FR.json @@ -0,0 +1,3 @@ +{ + "Hello": "Bonjour from WithAttribute" +} diff --git a/test/ResourcesClassLibraryWithAttribute/ResourcesClassLibraryWithAttribute.csproj b/test/ResourcesClassLibraryWithAttribute/ResourcesClassLibraryWithAttribute.csproj new file mode 100644 index 0000000..a2206bd --- /dev/null +++ b/test/ResourcesClassLibraryWithAttribute/ResourcesClassLibraryWithAttribute.csproj @@ -0,0 +1,19 @@ + + + + net10.0 + enable + MyCustomNamespace + + + + + + + + + PreserveNewest + + + +