Added support for get culture information from request's route data information.
[Fixes #122] Get segment from mapped route for CustomRequestCultureProvider
This commit is contained in:
parent
07e7741463
commit
861ae52de5
|
|
@ -35,6 +35,10 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "ResourcesClassLibraryWithAt
|
||||||
EndProject
|
EndProject
|
||||||
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "ResourcesClassLibraryNoAttribute", "test\ResourcesClassLibraryNoAttribute\ResourcesClassLibraryNoAttribute.xproj", "{34740578-D5B5-4FB4-AFD4-5E87B5443E20}"
|
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "ResourcesClassLibraryNoAttribute", "test\ResourcesClassLibraryNoAttribute\ResourcesClassLibraryNoAttribute.xproj", "{34740578-D5B5-4FB4-AFD4-5E87B5443E20}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Localization.Routing", "src\Microsoft.AspNetCore.Localization.Routing\Microsoft.AspNetCore.Localization.Routing.xproj", "{E1B8DA18-7885-40ED-94ED-881BB0804F23}"
|
||||||
|
EndProject
|
||||||
|
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Localization.Routing.Tests", "test\Microsoft.AspNetCore.Localization.Routing.Tests\Microsoft.AspNetCore.Localization.Routing.Tests.xproj", "{375B000B-5DC0-4D16-AC0C-A5432D8E7581}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
|
@ -85,6 +89,14 @@ Global
|
||||||
{34740578-D5B5-4FB4-AFD4-5E87B5443E20}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{34740578-D5B5-4FB4-AFD4-5E87B5443E20}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{34740578-D5B5-4FB4-AFD4-5E87B5443E20}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{34740578-D5B5-4FB4-AFD4-5E87B5443E20}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{34740578-D5B5-4FB4-AFD4-5E87B5443E20}.Release|Any CPU.Build.0 = Release|Any CPU
|
{34740578-D5B5-4FB4-AFD4-5E87B5443E20}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{E1B8DA18-7885-40ED-94ED-881BB0804F23}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{E1B8DA18-7885-40ED-94ED-881BB0804F23}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{E1B8DA18-7885-40ED-94ED-881BB0804F23}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{E1B8DA18-7885-40ED-94ED-881BB0804F23}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{375B000B-5DC0-4D16-AC0C-A5432D8E7581}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{375B000B-5DC0-4D16-AC0C-A5432D8E7581}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{375B000B-5DC0-4D16-AC0C-A5432D8E7581}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{375B000B-5DC0-4D16-AC0C-A5432D8E7581}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|
@ -101,5 +113,7 @@ Global
|
||||||
{B1B441BA-3AC8-49F8-850D-E5A178E77DE2} = {B723DB83-A670-4BCB-95FB-195361331AD2}
|
{B1B441BA-3AC8-49F8-850D-E5A178E77DE2} = {B723DB83-A670-4BCB-95FB-195361331AD2}
|
||||||
{F27639B9-913E-43AF-9D64-BBD98D9A420A} = {B723DB83-A670-4BCB-95FB-195361331AD2}
|
{F27639B9-913E-43AF-9D64-BBD98D9A420A} = {B723DB83-A670-4BCB-95FB-195361331AD2}
|
||||||
{34740578-D5B5-4FB4-AFD4-5E87B5443E20} = {B723DB83-A670-4BCB-95FB-195361331AD2}
|
{34740578-D5B5-4FB4-AFD4-5E87B5443E20} = {B723DB83-A670-4BCB-95FB-195361331AD2}
|
||||||
|
{E1B8DA18-7885-40ED-94ED-881BB0804F23} = {FB313677-BAB3-4E49-8CDB-4FA4A9564767}
|
||||||
|
{375B000B-5DC0-4D16-AC0C-A5432D8E7581} = {B723DB83-A670-4BCB-95FB-195361331AD2}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
EndGlobal
|
EndGlobal
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="14.0.25420" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0.25420</VisualStudioVersion>
|
||||||
|
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.Props" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>e1b8da18-7885-40ed-94ed-881bb0804f23</ProjectGuid>
|
||||||
|
<RootNamespace>Microsoft.AspNetCore.Localization.Routing</RootNamespace>
|
||||||
|
<BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">.\obj</BaseIntermediateOutputPath>
|
||||||
|
<OutputPath Condition="'$(OutputPath)'=='' ">.\bin\</OutputPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.targets" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
</Project>
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Resources;
|
||||||
|
|
||||||
|
[assembly: AssemblyMetadata("Serviceable", "True")]
|
||||||
|
[assembly: NeutralResourcesLanguage("en-us")]
|
||||||
|
[assembly: AssemblyCompany("Microsoft Corporation.")]
|
||||||
|
[assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")]
|
||||||
|
[assembly: AssemblyProduct("Microsoft ASP.NET Core")]
|
||||||
|
|
@ -0,0 +1,74 @@
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.AspNetCore.Http;
|
||||||
|
using Microsoft.AspNetCore.Routing;
|
||||||
|
using Microsoft.Extensions.Internal;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Localization.Routing
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Determines the culture information for a request via values in the route data.
|
||||||
|
/// </summary>
|
||||||
|
public class RouteDataRequestCultureProvider : RequestCultureProvider
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The key that contains the culture name.
|
||||||
|
/// Defaults to "culture".
|
||||||
|
/// </summary>
|
||||||
|
public string RouteDataStringKey { get; set; } = "culture";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The key that contains the UI culture name. If not specified or no value is found,
|
||||||
|
/// <see cref="RouteDataStringKey"/> will be used.
|
||||||
|
/// Defaults to "ui-culture".
|
||||||
|
/// </summary>
|
||||||
|
public string UIRouteDataStringKey { get; set; } = "ui-culture";
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext)
|
||||||
|
{
|
||||||
|
if (httpContext == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(httpContext));
|
||||||
|
}
|
||||||
|
|
||||||
|
string culture = null;
|
||||||
|
string uiCulture = null;
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(RouteDataStringKey))
|
||||||
|
{
|
||||||
|
culture = httpContext.GetRouteValue(RouteDataStringKey)?.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(UIRouteDataStringKey))
|
||||||
|
{
|
||||||
|
uiCulture = httpContext.GetRouteValue(UIRouteDataStringKey)?.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (culture == null && uiCulture == null)
|
||||||
|
{
|
||||||
|
// No values specified for either so no match
|
||||||
|
return TaskCache<ProviderCultureResult>.DefaultCompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (culture != null && uiCulture == null)
|
||||||
|
{
|
||||||
|
// Value for culture but not for UI culture so default to culture value for both
|
||||||
|
uiCulture = culture;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (culture == null && uiCulture != null)
|
||||||
|
{
|
||||||
|
// Value for UI culture but not for culture so default to UI culture value for both
|
||||||
|
culture = uiCulture;
|
||||||
|
}
|
||||||
|
|
||||||
|
var providerResultCulture = new ProviderCultureResult(culture, uiCulture);
|
||||||
|
|
||||||
|
return Task.FromResult(providerResultCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
{
|
||||||
|
"version": "1.1.0-*",
|
||||||
|
"description": "Provides a request culture provider which gets culture and ui-culture from request's route data.",
|
||||||
|
"packOptions": {
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/aspnet/localization"
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"aspnetcore",
|
||||||
|
"localization"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"buildOptions": {
|
||||||
|
"warningsAsErrors": true,
|
||||||
|
"keyFile": "../../tools/Key.snk",
|
||||||
|
"nowarn": [
|
||||||
|
"CS1591"
|
||||||
|
],
|
||||||
|
"xmlDoc": true
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.AspNetCore.Localization": "1.1.0-*",
|
||||||
|
"Microsoft.AspNetCore.Routing.Abstractions": "1.1.0-*",
|
||||||
|
"Microsoft.Extensions.TaskCache.Sources": {
|
||||||
|
"type": "build",
|
||||||
|
"version": "1.1.0-*"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net451": {},
|
||||||
|
"netstandard1.3": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -5,6 +5,7 @@ using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
|
using Microsoft.Extensions.Internal;
|
||||||
using Microsoft.Net.Http.Headers;
|
using Microsoft.Net.Http.Headers;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Localization
|
namespace Microsoft.AspNetCore.Localization
|
||||||
|
|
@ -33,7 +34,7 @@ namespace Microsoft.AspNetCore.Localization
|
||||||
|
|
||||||
if (acceptLanguageHeader == null || acceptLanguageHeader.Count == 0)
|
if (acceptLanguageHeader == null || acceptLanguageHeader.Count == 0)
|
||||||
{
|
{
|
||||||
return Task.FromResult((ProviderCultureResult)null);
|
return TaskCache<ProviderCultureResult>.DefaultCompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
var languages = acceptLanguageHeader.AsEnumerable();
|
var languages = acceptLanguageHeader.AsEnumerable();
|
||||||
|
|
@ -53,7 +54,7 @@ namespace Microsoft.AspNetCore.Localization
|
||||||
return Task.FromResult(new ProviderCultureResult(orderedLanguages));
|
return Task.FromResult(new ProviderCultureResult(orderedLanguages));
|
||||||
}
|
}
|
||||||
|
|
||||||
return Task.FromResult((ProviderCultureResult)null);
|
return TaskCache<ProviderCultureResult>.DefaultCompletedTask;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
|
using Microsoft.Extensions.Internal;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Localization
|
namespace Microsoft.AspNetCore.Localization
|
||||||
{
|
{
|
||||||
|
|
@ -39,7 +40,7 @@ namespace Microsoft.AspNetCore.Localization
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(cookie))
|
if (string.IsNullOrEmpty(cookie))
|
||||||
{
|
{
|
||||||
return Task.FromResult<ProviderCultureResult>(null);
|
return TaskCache<ProviderCultureResult>.DefaultCompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
var providerResultCulture = ParseCookieValue(cookie);
|
var providerResultCulture = ParseCookieValue(cookie);
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
|
using Microsoft.Extensions.Internal;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Localization
|
namespace Microsoft.AspNetCore.Localization
|
||||||
{
|
{
|
||||||
|
|
@ -36,7 +37,7 @@ namespace Microsoft.AspNetCore.Localization
|
||||||
var request = httpContext.Request;
|
var request = httpContext.Request;
|
||||||
if (!request.QueryString.HasValue)
|
if (!request.QueryString.HasValue)
|
||||||
{
|
{
|
||||||
return Task.FromResult((ProviderCultureResult)null);
|
return TaskCache<ProviderCultureResult>.DefaultCompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
string queryCulture = null;
|
string queryCulture = null;
|
||||||
|
|
@ -55,7 +56,7 @@ namespace Microsoft.AspNetCore.Localization
|
||||||
if (queryCulture == null && queryUICulture == null)
|
if (queryCulture == null && queryUICulture == null)
|
||||||
{
|
{
|
||||||
// No values specified for either so no match
|
// No values specified for either so no match
|
||||||
return Task.FromResult((ProviderCultureResult)null);
|
return TaskCache<ProviderCultureResult>.DefaultCompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (queryCulture != null && queryUICulture == null)
|
if (queryCulture != null && queryUICulture == null)
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,11 @@
|
||||||
"Microsoft.AspNetCore.Http.Extensions": "1.1.0-*",
|
"Microsoft.AspNetCore.Http.Extensions": "1.1.0-*",
|
||||||
"Microsoft.Extensions.Globalization.CultureInfoCache": "1.1.0-*",
|
"Microsoft.Extensions.Globalization.CultureInfoCache": "1.1.0-*",
|
||||||
"Microsoft.Extensions.Localization.Abstractions": "1.1.0-*",
|
"Microsoft.Extensions.Localization.Abstractions": "1.1.0-*",
|
||||||
"Microsoft.Extensions.Options": "1.1.0-*"
|
"Microsoft.Extensions.Options": "1.1.0-*",
|
||||||
|
"Microsoft.Extensions.TaskCache.Sources": {
|
||||||
|
"type": "build",
|
||||||
|
"version": "1.1.0-*"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"frameworks": {
|
"frameworks": {
|
||||||
"net451": {},
|
"net451": {},
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="14.0.25420" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0.25420</VisualStudioVersion>
|
||||||
|
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.Props" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>375b000b-5dc0-4d16-ac0c-a5432d8e7581</ProjectGuid>
|
||||||
|
<RootNamespace>Microsoft.AspNetCore.Localization.Routing.Tests</RootNamespace>
|
||||||
|
<BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">.\obj</BaseIntermediateOutputPath>
|
||||||
|
<OutputPath Condition="'$(OutputPath)'=='' ">.\bin\</OutputPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Service Include="{82a7f48d-3b50-4b1e-b82e-3ada8210c358}" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.targets" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
</Project>
|
||||||
|
|
@ -0,0 +1,193 @@
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.Net;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.AspNetCore.Builder;
|
||||||
|
using Microsoft.AspNetCore.Hosting;
|
||||||
|
using Microsoft.AspNetCore.Http;
|
||||||
|
using Microsoft.AspNetCore.Routing;
|
||||||
|
using Microsoft.AspNetCore.TestHost;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Localization.Routing
|
||||||
|
{
|
||||||
|
public class RouteDataRequestCultureProviderTest
|
||||||
|
{
|
||||||
|
[Theory]
|
||||||
|
[InlineData("{culture}/{ui-culture}/hello", "ar-SA/ar-YE/hello", "ar-SA", "ar-YE")]
|
||||||
|
[InlineData("{CULTURE}/{UI-CULTURE}/hello", "ar-SA/ar-YE/hello", "ar-SA", "ar-YE")]
|
||||||
|
[InlineData("{culture}/{ui-culture}/hello", "unsupported/unsupported/hello", "en-US", "en-US")]
|
||||||
|
[InlineData("{culture}/hello", "ar-SA/hello", "ar-SA", "en-US")]
|
||||||
|
[InlineData("hello", "hello", "en-US", "en-US")]
|
||||||
|
[InlineData("{ui-culture}/hello", "ar-YE/hello", "en-US", "ar-YE")]
|
||||||
|
public async Task GetCultureInfo_FromRouteData(
|
||||||
|
string routeTemplate,
|
||||||
|
string requestUrl,
|
||||||
|
string expectedCulture,
|
||||||
|
string expectedUICulture)
|
||||||
|
{
|
||||||
|
var builder = new WebHostBuilder()
|
||||||
|
.Configure(app =>
|
||||||
|
{
|
||||||
|
app.UseRouter(routes =>
|
||||||
|
{
|
||||||
|
routes.MapRoute(routeTemplate, (IApplicationBuilder fork) =>
|
||||||
|
{
|
||||||
|
var options = new RequestLocalizationOptions
|
||||||
|
{
|
||||||
|
DefaultRequestCulture = new RequestCulture("en-US"),
|
||||||
|
SupportedCultures = new List<CultureInfo>
|
||||||
|
{
|
||||||
|
new CultureInfo("ar-SA")
|
||||||
|
},
|
||||||
|
SupportedUICultures = new List<CultureInfo>
|
||||||
|
{
|
||||||
|
new CultureInfo("ar-YE")
|
||||||
|
}
|
||||||
|
};
|
||||||
|
options.RequestCultureProviders = new[]
|
||||||
|
{
|
||||||
|
new RouteDataRequestCultureProvider()
|
||||||
|
{
|
||||||
|
Options = options
|
||||||
|
}
|
||||||
|
};
|
||||||
|
fork.UseRequestLocalization(options);
|
||||||
|
|
||||||
|
fork.Run(context =>
|
||||||
|
{
|
||||||
|
var requestCultureFeature = context.Features.Get<IRequestCultureFeature>();
|
||||||
|
var requestCulture = requestCultureFeature.RequestCulture;
|
||||||
|
return context.Response.WriteAsync(
|
||||||
|
$"{requestCulture.Culture.Name},{requestCulture.UICulture.Name}");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.ConfigureServices(services =>
|
||||||
|
{
|
||||||
|
services.AddRouting();
|
||||||
|
});
|
||||||
|
|
||||||
|
using (var server = new TestServer(builder))
|
||||||
|
{
|
||||||
|
var client = server.CreateClient();
|
||||||
|
var response = await client.GetAsync(requestUrl);
|
||||||
|
|
||||||
|
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
|
||||||
|
var data = await response.Content.ReadAsStringAsync();
|
||||||
|
Assert.Equal($"{expectedCulture},{expectedUICulture}", data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task GetDefaultCultureInfo_IfCultureKeysAreMissing()
|
||||||
|
{
|
||||||
|
var builder = new WebHostBuilder()
|
||||||
|
.Configure(app =>
|
||||||
|
{
|
||||||
|
var options = new RequestLocalizationOptions
|
||||||
|
{
|
||||||
|
DefaultRequestCulture = new RequestCulture("en-US")
|
||||||
|
};
|
||||||
|
options.RequestCultureProviders = new[]
|
||||||
|
{
|
||||||
|
new RouteDataRequestCultureProvider()
|
||||||
|
{
|
||||||
|
Options = options
|
||||||
|
}
|
||||||
|
};
|
||||||
|
app.UseRequestLocalization(options);
|
||||||
|
app.Run(context =>
|
||||||
|
{
|
||||||
|
var requestCultureFeature = context.Features.Get<IRequestCultureFeature>();
|
||||||
|
var requestCulture = requestCultureFeature.RequestCulture;
|
||||||
|
return context.Response.WriteAsync(
|
||||||
|
$"{requestCulture.Culture.Name},{requestCulture.UICulture.Name}");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
using (var server = new TestServer(builder))
|
||||||
|
{
|
||||||
|
var client = server.CreateClient();
|
||||||
|
var response = await client.GetAsync("/page");
|
||||||
|
|
||||||
|
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
|
||||||
|
var data = await response.Content.ReadAsStringAsync();
|
||||||
|
Assert.Equal("en-US,en-US", data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Theory]
|
||||||
|
[InlineData("{c}/{uic}/hello", "ar-SA/ar-YE/hello", "ar-SA", "ar-YE")]
|
||||||
|
[InlineData("{C}/{UIC}/hello", "ar-SA/ar-YE/hello", "ar-SA", "ar-YE")]
|
||||||
|
[InlineData("{c}/hello", "ar-SA/hello", "ar-SA", "en-US")]
|
||||||
|
[InlineData("hello", "hello", "en-US", "en-US")]
|
||||||
|
[InlineData("{uic}/hello", "ar-YE/hello", "en-US", "ar-YE")]
|
||||||
|
public async Task GetCultureInfo_FromRouteData_WithCustomKeys(
|
||||||
|
string routeTemplate,
|
||||||
|
string requestUrl,
|
||||||
|
string expectedCulture,
|
||||||
|
string expectedUICulture)
|
||||||
|
{
|
||||||
|
var builder = new WebHostBuilder()
|
||||||
|
.Configure(app =>
|
||||||
|
{
|
||||||
|
app.UseRouter(routes =>
|
||||||
|
{
|
||||||
|
routes.MapRoute(routeTemplate, (IApplicationBuilder fork) =>
|
||||||
|
{
|
||||||
|
var options = new RequestLocalizationOptions
|
||||||
|
{
|
||||||
|
DefaultRequestCulture = new RequestCulture("en-US"),
|
||||||
|
SupportedCultures = new List<CultureInfo>
|
||||||
|
{
|
||||||
|
new CultureInfo("ar-SA")
|
||||||
|
},
|
||||||
|
SupportedUICultures = new List<CultureInfo>
|
||||||
|
{
|
||||||
|
new CultureInfo("ar-YE")
|
||||||
|
}
|
||||||
|
};
|
||||||
|
options.RequestCultureProviders = new[]
|
||||||
|
{
|
||||||
|
new RouteDataRequestCultureProvider()
|
||||||
|
{
|
||||||
|
Options = options,
|
||||||
|
RouteDataStringKey = "c",
|
||||||
|
UIRouteDataStringKey = "uic"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
fork.UseRequestLocalization(options);
|
||||||
|
|
||||||
|
fork.Run(context =>
|
||||||
|
{
|
||||||
|
var requestCultureFeature = context.Features.Get<IRequestCultureFeature>();
|
||||||
|
var requestCulture = requestCultureFeature.RequestCulture;
|
||||||
|
return context.Response.WriteAsync(
|
||||||
|
$"{requestCulture.Culture.Name},{requestCulture.UICulture.Name}");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.ConfigureServices(services =>
|
||||||
|
{
|
||||||
|
services.AddRouting();
|
||||||
|
});
|
||||||
|
|
||||||
|
using (var server = new TestServer(builder))
|
||||||
|
{
|
||||||
|
var client = server.CreateClient();
|
||||||
|
var response = await client.GetAsync(requestUrl);
|
||||||
|
|
||||||
|
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
|
||||||
|
var data = await response.Content.ReadAsStringAsync();
|
||||||
|
Assert.Equal($"{expectedCulture},{expectedUICulture}", data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
{
|
||||||
|
"buildOptions": {
|
||||||
|
"warningsAsErrors": true
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"dotnet-test-xunit": "2.2.0-*",
|
||||||
|
"Microsoft.AspNetCore.Localization.Routing": "1.1.0-*",
|
||||||
|
"Microsoft.AspNetCore.Routing": "1.1.0-*",
|
||||||
|
"Microsoft.AspNetCore.TestHost": "1.1.0-*",
|
||||||
|
"xunit": "2.2.0-*"
|
||||||
|
},
|
||||||
|
"testRunner": "xunit",
|
||||||
|
"frameworks": {
|
||||||
|
"netcoreapp1.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.NETCore.App": {
|
||||||
|
"version": "1.0.0-*",
|
||||||
|
"type": "platform"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"net451": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue