diff --git a/samples/LocalizationSample/Startup.cs b/samples/LocalizationSample/Startup.cs index 237fc4b8a1..07b6fbd6cd 100644 --- a/samples/LocalizationSample/Startup.cs +++ b/samples/LocalizationSample/Startup.cs @@ -155,7 +155,9 @@ $@" public static void Main(string[] args) { - var config = new ConfigurationBuilder().AddCommandLine(args).Build(); + var config = new ConfigurationBuilder() + .AddCommandLine(args) + .Build(); var host = new WebHostBuilder() .UseKestrel() diff --git a/src/Microsoft.AspNetCore.Localization/RequestCultureProvider.cs b/src/Microsoft.AspNetCore.Localization/RequestCultureProvider.cs index bc806a58d3..c3103596e2 100644 --- a/src/Microsoft.AspNetCore.Localization/RequestCultureProvider.cs +++ b/src/Microsoft.AspNetCore.Localization/RequestCultureProvider.cs @@ -19,6 +19,5 @@ namespace Microsoft.AspNetCore.Localization /// public abstract Task DetermineProviderCultureResult(HttpContext httpContext); - } } diff --git a/src/Microsoft.AspNetCore.Localization/RequestLocalizationMiddleware.cs b/src/Microsoft.AspNetCore.Localization/RequestLocalizationMiddleware.cs index f9bc60a222..ff5edf81ca 100644 --- a/src/Microsoft.AspNetCore.Localization/RequestLocalizationMiddleware.cs +++ b/src/Microsoft.AspNetCore.Localization/RequestLocalizationMiddleware.cs @@ -14,7 +14,7 @@ using Microsoft.Extensions.Options; namespace Microsoft.AspNetCore.Localization { /// - /// Enables automatic setting of the culture for s based on information + /// Enables automatic setting of the culture for s based on information /// sent by the client in headers and logic provided by the application. /// public class RequestLocalizationMiddleware diff --git a/src/Microsoft.Extensions.Localization.Abstractions/StringLocalizerOfT.cs b/src/Microsoft.Extensions.Localization.Abstractions/StringLocalizerOfT.cs index 6862db7e37..131c1126ec 100644 --- a/src/Microsoft.Extensions.Localization.Abstractions/StringLocalizerOfT.cs +++ b/src/Microsoft.Extensions.Localization.Abstractions/StringLocalizerOfT.cs @@ -10,7 +10,7 @@ namespace Microsoft.Extensions.Localization /// /// Provides strings for . /// - /// The to provide strings for. + /// The to provide strings for. public class StringLocalizer : IStringLocalizer { private IStringLocalizer _localizer; diff --git a/src/Microsoft.Extensions.Localization/Internal/AssemblyResourceStringProvider.cs b/src/Microsoft.Extensions.Localization/Internal/AssemblyResourceStringProvider.cs index 1c57960271..4289aec633 100644 --- a/src/Microsoft.Extensions.Localization/Internal/AssemblyResourceStringProvider.cs +++ b/src/Microsoft.Extensions.Localization/Internal/AssemblyResourceStringProvider.cs @@ -15,8 +15,6 @@ namespace Microsoft.Extensions.Localization.Internal public class AssemblyResourceStringProvider : IResourceStringProvider { private const string AssemblyElementDelimiter = ", "; - private static readonly string[] _assemblyElementDelimiterArray = new[] { AssemblyElementDelimiter }; - private static readonly char[] _assemblyEqualDelimiter = new[] { '=' }; private readonly AssemblyWrapper _assembly; private readonly string _resourceBaseName; @@ -65,6 +63,7 @@ namespace Microsoft.Extensions.Localization.Internal public IList GetAllResourceStrings(CultureInfo culture, bool throwOnMissing) { var cacheKey = GetResourceCacheKey(culture); + return _resourceNamesCache.GetOrAdd(cacheKey, _ => { var assembly = GetAssembly(culture); diff --git a/src/Microsoft.Extensions.Localization/ResourceManagerStringLocalizer.cs b/src/Microsoft.Extensions.Localization/ResourceManagerStringLocalizer.cs index 128c1c1f6a..74611a2e73 100644 --- a/src/Microsoft.Extensions.Localization/ResourceManagerStringLocalizer.cs +++ b/src/Microsoft.Extensions.Localization/ResourceManagerStringLocalizer.cs @@ -106,6 +106,7 @@ namespace Microsoft.Extensions.Localization } var value = GetStringSafely(name, null); + return new LocalizedString(name, value ?? name, resourceNotFound: value == null); } } @@ -122,6 +123,7 @@ namespace Microsoft.Extensions.Localization var format = GetStringSafely(name, null); var value = string.Format(format ?? name, arguments); + return new LocalizedString(name, value, resourceNotFound: format == null); } } diff --git a/src/Microsoft.Extensions.Localization/ResourceManagerWithCultureStringLocalizer.cs b/src/Microsoft.Extensions.Localization/ResourceManagerWithCultureStringLocalizer.cs index 4ca2ed0748..3cd0b898c2 100644 --- a/src/Microsoft.Extensions.Localization/ResourceManagerWithCultureStringLocalizer.cs +++ b/src/Microsoft.Extensions.Localization/ResourceManagerWithCultureStringLocalizer.cs @@ -117,6 +117,7 @@ namespace Microsoft.Extensions.Localization } var value = GetStringSafely(name, _culture); + return new LocalizedString(name, value ?? name); } } @@ -133,6 +134,7 @@ namespace Microsoft.Extensions.Localization var format = GetStringSafely(name, _culture); var value = string.Format(_culture, format ?? name, arguments); + return new LocalizedString(name, value ?? name, resourceNotFound: format == null); } } diff --git a/test/LocalizationWebsite/Models/Customer.cs b/test/LocalizationWebsite/Models/Customer.cs index 7d3447df72..b38d34e7f1 100644 --- a/test/LocalizationWebsite/Models/Customer.cs +++ b/test/LocalizationWebsite/Models/Customer.cs @@ -1,7 +1,5 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace LocalizationWebsite.Models { diff --git a/test/Microsoft.AspNetCore.Localization.FunctionalTests/LocalizationSampleTest.cs b/test/Microsoft.AspNetCore.Localization.FunctionalTests/LocalizationSampleTest.cs index 2fac8633ea..92ed3f505e 100644 --- a/test/Microsoft.AspNetCore.Localization.FunctionalTests/LocalizationSampleTest.cs +++ b/test/Microsoft.AspNetCore.Localization.FunctionalTests/LocalizationSampleTest.cs @@ -19,6 +19,7 @@ namespace Microsoft.AspNetCore.Localization.FunctionalTests public Task RunSite_WindowsOnly() { var testRunner = new TestRunner(_applicationPath); + return testRunner.RunTestAndVerifyResponseHeading( RuntimeFlavor.Clr, RuntimeArchitecture.x64, @@ -27,10 +28,12 @@ namespace Microsoft.AspNetCore.Localization.FunctionalTests "fr-FR", "

Bonjour

"); } + [Fact] public Task RunSite_AnyOS() { var testRunner = new TestRunner(_applicationPath); + return testRunner.RunTestAndVerifyResponseHeading( RuntimeFlavor.CoreClr, RuntimeArchitecture.x64, diff --git a/test/Microsoft.AspNetCore.Localization.FunctionalTests/LocalizationTest.cs b/test/Microsoft.AspNetCore.Localization.FunctionalTests/LocalizationTest.cs index 9e8b81dd88..1c8be16ab4 100644 --- a/test/Microsoft.AspNetCore.Localization.FunctionalTests/LocalizationTest.cs +++ b/test/Microsoft.AspNetCore.Localization.FunctionalTests/LocalizationTest.cs @@ -17,6 +17,7 @@ namespace Microsoft.AspNetCore.Localization.FunctionalTests public Task Localization_CustomCulture_AllOS() { var testRunner = new TestRunner(_applicationPath); + return testRunner.RunTestAndVerifyResponse( RuntimeFlavor.CoreClr, RuntimeArchitecture.x64, @@ -32,6 +33,7 @@ namespace Microsoft.AspNetCore.Localization.FunctionalTests public Task Localization_CustomCulture_Windows() { var testRunner = new TestRunner(_applicationPath); + return testRunner.RunTestAndVerifyResponse( RuntimeFlavor.Clr, RuntimeArchitecture.x64, @@ -45,6 +47,7 @@ namespace Microsoft.AspNetCore.Localization.FunctionalTests public Task Localization_ResourcesInClassLibrary_ReturnLocalizedValue_AllOS() { var testRunner = new TestRunner(_applicationPath); + return testRunner.RunTestAndVerifyResponse( RuntimeFlavor.CoreClr, RuntimeArchitecture.x64, @@ -60,6 +63,7 @@ namespace Microsoft.AspNetCore.Localization.FunctionalTests public Task Localization_ResourcesInClassLibrary_ReturnLocalizedValue_Windows() { var testRunner = new TestRunner(_applicationPath); + return testRunner.RunTestAndVerifyResponse( RuntimeFlavor.Clr, RuntimeArchitecture.x64, @@ -73,6 +77,7 @@ namespace Microsoft.AspNetCore.Localization.FunctionalTests public Task Localization_ResourcesInFolder_ReturnLocalizedValue_AllOS() { var testRunner = new TestRunner(_applicationPath); + return testRunner.RunTestAndVerifyResponse( RuntimeFlavor.CoreClr, RuntimeArchitecture.x64, @@ -88,6 +93,7 @@ namespace Microsoft.AspNetCore.Localization.FunctionalTests public Task Localization_ResourcesInFolder_ReturnLocalizedValue_Windows() { var testRunner = new TestRunner(_applicationPath); + return testRunner.RunTestAndVerifyResponse( RuntimeFlavor.Clr, RuntimeArchitecture.x64, @@ -101,6 +107,7 @@ namespace Microsoft.AspNetCore.Localization.FunctionalTests public Task Localization_ResourcesInFolder_ReturnLocalizedValue_WithCultureFallback_AllOS() { var testRunner = new TestRunner(_applicationPath); + return testRunner.RunTestAndVerifyResponse( RuntimeFlavor.CoreClr, RuntimeArchitecture.x64, @@ -116,6 +123,7 @@ namespace Microsoft.AspNetCore.Localization.FunctionalTests public Task Localization_ResourcesInFolder_ReturnLocalizedValue_WithCultureFallback_Windows() { var testRunner = new TestRunner(_applicationPath); + return testRunner.RunTestAndVerifyResponse( RuntimeFlavor.Clr, RuntimeArchitecture.x64, @@ -129,6 +137,7 @@ namespace Microsoft.AspNetCore.Localization.FunctionalTests public Task Localization_ResourcesInFolder_ReturnNonLocalizedValue_CultureHierarchyTooDeep_AllOS() { var testRunner = new TestRunner(_applicationPath); + return testRunner.RunTestAndVerifyResponse( RuntimeFlavor.CoreClr, RuntimeArchitecture.x64, @@ -144,6 +153,7 @@ namespace Microsoft.AspNetCore.Localization.FunctionalTests public Task Localization_ResourcesInFolder_ReturnNonLocalizedValue_CultureHierarchyTooDeep_Windows() { var testRunner = new TestRunner(_applicationPath); + return testRunner.RunTestAndVerifyResponse( RuntimeFlavor.Clr, RuntimeArchitecture.x64, @@ -157,6 +167,7 @@ namespace Microsoft.AspNetCore.Localization.FunctionalTests public Task Localization_ResourcesAtRootFolder_ReturnLocalizedValue_AllOS() { var testRunner = new TestRunner(_applicationPath); + return testRunner.RunTestAndVerifyResponse( RuntimeFlavor.CoreClr, RuntimeArchitecture.x64, @@ -172,6 +183,7 @@ namespace Microsoft.AspNetCore.Localization.FunctionalTests public Task Localization_ResourcesAtRootFolder_ReturnLocalizedValue_Windows() { var testRunner = new TestRunner(_applicationPath); + return testRunner.RunTestAndVerifyResponse( RuntimeFlavor.Clr, RuntimeArchitecture.x64, diff --git a/test/Microsoft.AspNetCore.Localization.Routing.Tests/RouteDataRequestCultureProviderTest.cs b/test/Microsoft.AspNetCore.Localization.Routing.Tests/RouteDataRequestCultureProviderTest.cs index b5400a2cd6..dd57f56f68 100644 --- a/test/Microsoft.AspNetCore.Localization.Routing.Tests/RouteDataRequestCultureProviderTest.cs +++ b/test/Microsoft.AspNetCore.Localization.Routing.Tests/RouteDataRequestCultureProviderTest.cs @@ -106,6 +106,7 @@ namespace Microsoft.AspNetCore.Localization.Routing { var requestCultureFeature = context.Features.Get(); var requestCulture = requestCultureFeature.RequestCulture; + return context.Response.WriteAsync( $"{requestCulture.Culture.Name},{requestCulture.UICulture.Name}"); }); @@ -168,6 +169,7 @@ namespace Microsoft.AspNetCore.Localization.Routing { var requestCultureFeature = context.Features.Get(); var requestCulture = requestCultureFeature.RequestCulture; + return context.Response.WriteAsync( $"{requestCulture.Culture.Name},{requestCulture.UICulture.Name}"); }); diff --git a/test/Microsoft.AspNetCore.Localization.Tests/AcceptLanguageHeaderRequestCultureProviderTest.cs b/test/Microsoft.AspNetCore.Localization.Tests/AcceptLanguageHeaderRequestCultureProviderTest.cs index 4861c8ac08..c5c2a7722e 100644 --- a/test/Microsoft.AspNetCore.Localization.Tests/AcceptLanguageHeaderRequestCultureProviderTest.cs +++ b/test/Microsoft.AspNetCore.Localization.Tests/AcceptLanguageHeaderRequestCultureProviderTest.cs @@ -137,6 +137,7 @@ namespace Microsoft.Extensions.Localization.Tests { var requestCultureFeature = context.Features.Get(); var requestCulture = requestCultureFeature.RequestCulture; + Assert.Equal("ar-YE", requestCulture.Culture.Name); Assert.Equal("ar-YE", requestCulture.UICulture.Name); return Task.FromResult(0); diff --git a/test/Microsoft.AspNetCore.Localization.Tests/CookieRequestCultureProviderTest.cs b/test/Microsoft.AspNetCore.Localization.Tests/CookieRequestCultureProviderTest.cs index d40833e97a..316ab69d57 100644 --- a/test/Microsoft.AspNetCore.Localization.Tests/CookieRequestCultureProviderTest.cs +++ b/test/Microsoft.AspNetCore.Localization.Tests/CookieRequestCultureProviderTest.cs @@ -93,6 +93,7 @@ namespace Microsoft.Extensions.Localization.Tests using (var server = new TestServer(builder)) { var client = server.CreateClient(); + client.DefaultRequestHeaders.Add("Cookie", new CookieHeaderValue("Preferences", "uic=ar-SA").ToString()); var response = await client.GetAsync(string.Empty); } diff --git a/test/Microsoft.AspNetCore.Localization.Tests/QueryStringRequestCultureProviderTest.cs b/test/Microsoft.AspNetCore.Localization.Tests/QueryStringRequestCultureProviderTest.cs index d7935fc113..113d54c90e 100644 --- a/test/Microsoft.AspNetCore.Localization.Tests/QueryStringRequestCultureProviderTest.cs +++ b/test/Microsoft.AspNetCore.Localization.Tests/QueryStringRequestCultureProviderTest.cs @@ -273,6 +273,7 @@ namespace Microsoft.Extensions.Localization.Tests } }; var provider = new QueryStringRequestCultureProvider(); + provider.QueryStringKey = "c"; provider.UIQueryStringKey = "uic"; options.RequestCultureProviders.Insert(0, provider); diff --git a/test/Microsoft.Extensions.Localization.Tests/ResourceManagerStringLocalizerTest.cs b/test/Microsoft.Extensions.Localization.Tests/ResourceManagerStringLocalizerTest.cs index c0ef4b9714..a3fada4bb2 100644 --- a/test/Microsoft.Extensions.Localization.Tests/ResourceManagerStringLocalizerTest.cs +++ b/test/Microsoft.Extensions.Localization.Tests/ResourceManagerStringLocalizerTest.cs @@ -56,7 +56,6 @@ namespace Microsoft.Extensions.Localization.Tests var resourceManager2 = new TestResourceManager(baseName, resourceAssembly2.Assembly); var resourceStreamManager1 = new TestResourceStringProvider(resourceNamesCache, resourceAssembly1, baseName); var resourceStreamManager2 = new TestResourceStringProvider(resourceNamesCache, resourceAssembly2, baseName); - var localizer1 = new ResourceManagerStringLocalizer( resourceManager1, resourceStreamManager1, @@ -194,17 +193,15 @@ namespace Microsoft.Extensions.Localization.Tests public class TestAssemblyWrapper : AssemblyWrapper { - private readonly string _name; - public TestAssemblyWrapper(string name = nameof(TestAssemblyWrapper)) : base(typeof(TestAssemblyWrapper).GetTypeInfo().Assembly) { - _name = name; + FullName = name; } public int GetManifestResourceStreamCallCount { get; private set; } - public override string FullName => _name; + public override string FullName { get; } public override Stream GetManifestResourceStream(string name) {