From 524ecdf9849265498213c174536c5cd6e0b25e5e Mon Sep 17 00:00:00 2001 From: Hisham Bin Ateya Date: Fri, 3 Apr 2020 21:48:24 +0300 Subject: [PATCH] Localizer factory should respect class namespace --- ... => Controllers.HomeController.fr-FR.json} | 0 .../JsonStringLocalizer.cs | 6 +++--- .../JsonStringLocalizerFactory.cs | 9 +++++++-- .../LocalizationMvcSampleTests.cs | 19 +++++++++++++++++++ .../JsonStringLocalizerFactoryTests.cs | 2 +- .../JsonStringLocalizerTests.cs | 18 +++++++----------- ....Extensions.Localization.Json.Tests.csproj | 6 +++--- .../Resources/{ => Common}/Test.ar.json | 0 .../Resources/{ => Common}/Test.fr-FR.json | 0 .../Resources/{ => Common}/Test.fr.json | 0 10 files changed, 40 insertions(+), 20 deletions(-) rename samples/LocalizationSample.Mvc/Resources/{HomeController.fr-FR.json => Controllers.HomeController.fr-FR.json} (100%) rename test/My.Extensions.Localization.Json.Tests/Resources/{ => Common}/Test.ar.json (100%) rename test/My.Extensions.Localization.Json.Tests/Resources/{ => Common}/Test.fr-FR.json (100%) rename test/My.Extensions.Localization.Json.Tests/Resources/{ => Common}/Test.fr.json (100%) diff --git a/samples/LocalizationSample.Mvc/Resources/HomeController.fr-FR.json b/samples/LocalizationSample.Mvc/Resources/Controllers.HomeController.fr-FR.json similarity index 100% rename from samples/LocalizationSample.Mvc/Resources/HomeController.fr-FR.json rename to samples/LocalizationSample.Mvc/Resources/Controllers.HomeController.fr-FR.json diff --git a/src/My.Extensions.Localization.Json/JsonStringLocalizer.cs b/src/My.Extensions.Localization.Json/JsonStringLocalizer.cs index 6a07880..890fa4c 100644 --- a/src/My.Extensions.Localization.Json/JsonStringLocalizer.cs +++ b/src/My.Extensions.Localization.Json/JsonStringLocalizer.cs @@ -166,10 +166,10 @@ private void BuildResourcesCache(string culture) : $"{_resourceName}.{culture}.json"; _searchedLocation = Path.Combine( _resourcesPath, resourceFile); - - if (resourceFile.StartsWith("Views")) + + if (!File.Exists(_searchedLocation)) { - if (!File.Exists(_searchedLocation)) + if (resourceFile.Count(r => r == '.') > 1) { var resourceFileWithoutExtension = Path.GetFileNameWithoutExtension(resourceFile); var resourceFileWithoutCulture = resourceFileWithoutExtension.Substring(0, resourceFileWithoutExtension.LastIndexOf('.')); diff --git a/src/My.Extensions.Localization.Json/JsonStringLocalizerFactory.cs b/src/My.Extensions.Localization.Json/JsonStringLocalizerFactory.cs index a89c6de..ffd1a5d 100644 --- a/src/My.Extensions.Localization.Json/JsonStringLocalizerFactory.cs +++ b/src/My.Extensions.Localization.Json/JsonStringLocalizerFactory.cs @@ -37,9 +37,13 @@ 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 + ? typeInfo.Name + : typeInfo.FullName.Substring(assemblyName.Length + 1); var resourcesPath = Path.Combine(PathHelpers.GetApplicationRoot(), GetResourcePath(assembly)); - return CreateJsonStringLocalizer(resourcesPath, typeInfo.Name); + return CreateJsonStringLocalizer(resourcesPath, typeName); } public IStringLocalizer Create(string baseName, string location) @@ -54,7 +58,8 @@ public IStringLocalizer Create(string baseName, string location) throw new ArgumentNullException(nameof(location)); } - var assembly = Assembly.GetExecutingAssembly(); + var assemblyName = new AssemblyName(location); + var assembly = Assembly.Load(assemblyName); var resourcesPath = Path.Combine(PathHelpers.GetApplicationRoot(), GetResourcePath(assembly)); string resourceName = null; diff --git a/test/My.Extensions.Localization.Json.FunctionalTests/LocalizationMvcSampleTests.cs b/test/My.Extensions.Localization.Json.FunctionalTests/LocalizationMvcSampleTests.cs index 741dd1d..a3f85d2 100644 --- a/test/My.Extensions.Localization.Json.FunctionalTests/LocalizationMvcSampleTests.cs +++ b/test/My.Extensions.Localization.Json.FunctionalTests/LocalizationMvcSampleTests.cs @@ -53,5 +53,24 @@ public async Task LocalizeViewWithPathConventions() Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Contains("Bienvenu", content); } + + [Fact] + public async Task StringLocalizeShouldWorkWithControllersPrefix() + { + // Arrange + var url = "/Home/Privacy"; + var request = new HttpRequestMessage(HttpMethod.Get, url); + var culture = "fr-FR"; + var cookieValue = $"c={culture}|uic={culture}"; + request.Headers.Add("Cookie", $"{CookieRequestCultureProvider.DefaultCookieName}={cookieValue}"); + + // Act + var response = await _client.SendAsync(request); + var content = await response.Content.ReadAsStringAsync(); + + // Assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.Contains("Utilisez cette page pour détailler la politique de confidentialité de votre site.", WebUtility.HtmlDecode(content)); + } } } diff --git a/test/My.Extensions.Localization.Json.Tests/JsonStringLocalizerFactoryTests.cs b/test/My.Extensions.Localization.Json.Tests/JsonStringLocalizerFactoryTests.cs index 00c61e0..3929ee6 100644 --- a/test/My.Extensions.Localization.Json.Tests/JsonStringLocalizerFactoryTests.cs +++ b/test/My.Extensions.Localization.Json.Tests/JsonStringLocalizerFactoryTests.cs @@ -46,7 +46,7 @@ public void CreateLocalizerWithBasenameAndLocation(ResourcesType resourcesType) // Arrange var localizerFactory = new JsonStringLocalizerFactory(_localizationOptions.Object, _loggerFactory); var location = "My.Extensions.Localization.Json.Tests"; - var basename = $"{location}.{nameof(Test)}"; + var basename = $"{location}.Common.{nameof(Test)}"; // Act var localizer = localizerFactory.Create(basename, location); diff --git a/test/My.Extensions.Localization.Json.Tests/JsonStringLocalizerTests.cs b/test/My.Extensions.Localization.Json.Tests/JsonStringLocalizerTests.cs index 6f18467..9f03590 100644 --- a/test/My.Extensions.Localization.Json.Tests/JsonStringLocalizerTests.cs +++ b/test/My.Extensions.Localization.Json.Tests/JsonStringLocalizerTests.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using System.IO; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; @@ -7,11 +6,9 @@ using Microsoft.AspNetCore.TestHost; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Localization; -using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using Moq; -using My.Extensions.Localization.Json.Internal; using My.Extensions.Localization.Json.Tests.Common; using Xunit; @@ -20,18 +17,17 @@ namespace My.Extensions.Localization.Json.Tests public class JsonStringLocalizerTests { private readonly IStringLocalizer _localizer; - private readonly Mock> _localizationOptions; - private readonly ILogger _logger; + private readonly Mock> _localizationOptions; public JsonStringLocalizerTests() { - _localizationOptions = new Mock>(); + var _localizationOptions = new Mock>(); _localizationOptions.Setup(o => o.Value) - .Returns(() => new LocalizationOptions { ResourcesPath = "Resources" }); - _logger = NullLogger.Instance; - - var resourcePath = Path.Combine(PathHelpers.GetApplicationRoot(), _localizationOptions.Object.Value.ResourcesPath); - _localizer = new JsonStringLocalizer(resourcePath, nameof(Test), _logger); + .Returns(() => new JsonLocalizationOptions { ResourcesPath = "Resources" }); + var localizerFactory = new JsonStringLocalizerFactory(_localizationOptions.Object, NullLoggerFactory.Instance); + var location = "My.Extensions.Localization.Json.Tests"; + var basename = $"{location}.Common.{nameof(Test)}"; + _localizer = localizerFactory.Create(basename, location); } [Theory] 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 9466491..68758da 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 @@ -21,13 +21,13 @@ PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest diff --git a/test/My.Extensions.Localization.Json.Tests/Resources/Test.ar.json b/test/My.Extensions.Localization.Json.Tests/Resources/Common/Test.ar.json similarity index 100% rename from test/My.Extensions.Localization.Json.Tests/Resources/Test.ar.json rename to test/My.Extensions.Localization.Json.Tests/Resources/Common/Test.ar.json diff --git a/test/My.Extensions.Localization.Json.Tests/Resources/Test.fr-FR.json b/test/My.Extensions.Localization.Json.Tests/Resources/Common/Test.fr-FR.json similarity index 100% rename from test/My.Extensions.Localization.Json.Tests/Resources/Test.fr-FR.json rename to test/My.Extensions.Localization.Json.Tests/Resources/Common/Test.fr-FR.json diff --git a/test/My.Extensions.Localization.Json.Tests/Resources/Test.fr.json b/test/My.Extensions.Localization.Json.Tests/Resources/Common/Test.fr.json similarity index 100% rename from test/My.Extensions.Localization.Json.Tests/Resources/Test.fr.json rename to test/My.Extensions.Localization.Json.Tests/Resources/Common/Test.fr.json