Skip to content

Commit

Permalink
resolved #1718, #1719
Browse files Browse the repository at this point in the history
  • Loading branch information
ismcagdas committed Jan 2, 2017
1 parent 9d1891f commit 4a55cfe
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 52 deletions.
19 changes: 1 addition & 18 deletions src/Abp.AspNetCore/AspNetCore/AbpApplicationBuilderExtensions.cs
Expand Up @@ -70,27 +70,10 @@ private static void ConfigureRequestLocalization(IApplicationBuilder app)
SupportedUICultures = supportedCultures
};

var settingManager = iocResolver.Resolve<ISettingManager>();
var settingRequestCultureProvider = new SettingRequestCultureProvider(settingManager);
AddSettingRequestCultureProvider(options, settingRequestCultureProvider);
options.RequestCultureProviders.Insert(0, new AbpLocalizationHeaderRequestCultureProvider());

app.UseRequestLocalization(options);
}
}

private static void AddSettingRequestCultureProvider(RequestLocalizationOptions options, SettingRequestCultureProvider settingRequestCultureProvider)
{
var acceptLanguageHeaderRequestCultureProvider = options.RequestCultureProviders.FirstOrDefault(rcp => rcp.GetType() == typeof(AcceptLanguageHeaderRequestCultureProvider));

if (acceptLanguageHeaderRequestCultureProvider != null)
{
var acceptLanguageHeaderRequestCultureProviderIndex = options.RequestCultureProviders.IndexOf(acceptLanguageHeaderRequestCultureProvider);
options.RequestCultureProviders.Insert(acceptLanguageHeaderRequestCultureProviderIndex, settingRequestCultureProvider);
}
else
{
options.RequestCultureProviders.Add(settingRequestCultureProvider);
}
}
}
}
@@ -0,0 +1,69 @@
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.Mvc.Internal;

namespace Abp.AspNetCore.Localization
{
public class AbpLocalizationHeaderRequestCultureProvider : RequestCultureProvider
{
private static readonly char[] _separator = new[] { '|' };

private static readonly string _culturePrefix = "c=";
private static readonly string _uiCulturePrefix = "uic=";

/// <inheritdoc />
public override Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext)
{
if (httpContext == null)
{
throw new ArgumentNullException(nameof(httpContext));
}

var localizationHeader = httpContext.Request.Headers[CookieRequestCultureProvider.DefaultCookieName];

if (localizationHeader.Count == 0)
{
return TaskCache<ProviderCultureResult>.DefaultCompletedTask;
}

var providerResultCulture = ParseHeaderValue(localizationHeader);
return Task.FromResult(providerResultCulture);
}

/// <summary>
/// Parses a <see cref="RequestCulture"/> from the specified cookie value.
/// Returns <c>null</c> if parsing fails.
/// </summary>
/// <param name="value">The cookie value to parse.</param>
/// <returns>The <see cref="RequestCulture"/> or <c>null</c> if parsing fails.</returns>
public static ProviderCultureResult ParseHeaderValue(string value)
{
if (string.IsNullOrWhiteSpace(value))
{
return null;
}

var parts = value.Split(_separator, StringSplitOptions.RemoveEmptyEntries);

if (parts.Length != 2)
{
return null;
}

var potentialCultureName = parts[0];
var potentialUiCultureName = parts[1];

if (!potentialCultureName.StartsWith(_culturePrefix) || !potentialUiCultureName.StartsWith(_uiCulturePrefix))
{
return null;
}

var cultureName = potentialCultureName.Substring(_culturePrefix.Length);
var uiCultureName = potentialUiCultureName.Substring(_uiCulturePrefix.Length);

return new ProviderCultureResult(cultureName, uiCultureName);
}
}
}

This file was deleted.

7 changes: 4 additions & 3 deletions test/Abp.AspNetCore.Tests/Tests/SimpleTestControllerTests.cs
Expand Up @@ -12,6 +12,7 @@
using Abp.Localization;
using Abp.UI;
using Abp.Web.Models;
using Microsoft.AspNetCore.Localization;
using NSubstitute;
using Shouldly;
using Xunit;
Expand Down Expand Up @@ -204,11 +205,10 @@ public async Task Should_Not_Wrap_Async_ActionResult_On_Exception()
}

[Fact]
public async Task SettingRequestCultureProvider_Test()
public async Task AbpLocalizationHeaderRequestCultureProvider_Test()
{
//Arrange
var settingManager = ServiceProvider.GetService<ISettingDefinitionManager>();
settingManager.GetSettingDefinition(LocalizationSettingNames.DefaultLanguage).DefaultValue = "it";
Client.DefaultRequestHeaders.Add(CookieRequestCultureProvider.DefaultCookieName, "c=it|uic=it");

var culture = await GetResponseAsStringAsync(
GetUrl<SimpleTestController>(
Expand All @@ -217,5 +217,6 @@ public async Task SettingRequestCultureProvider_Test()

culture.ShouldBe("it");
}

}
}

0 comments on commit 4a55cfe

Please sign in to comment.