Made IRequestCultureStrategy async to support things like user profile lookup

This commit is contained in:
damianedwards 2015-05-11 18:29:03 -07:00
parent d22adcbef0
commit 21dc2909a1
8 changed files with 32 additions and 18 deletions

View File

@ -35,6 +35,14 @@ namespace LocalizationSample
// new CultureInfo("en-AU") // new CultureInfo("en-AU")
//} //}
}; };
// Optionally create an app-specific strategy with just a delegate, e.g. look up user preference from DB.
// Inserting it as position 0 ensures it has priority over any of the default strategies.
//options.RequestCultureStrategies.Insert(0, new CustomRequestCultureStrategy(async context =>
//{
//}));
app.UseRequestLocalization(options); app.UseRequestLocalization(options);
app.Use(async (context, next) => app.Use(async (context, next) =>

View File

@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Linq; using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNet.Http; using Microsoft.AspNet.Http;
using Microsoft.AspNet.Localization.Internal; using Microsoft.AspNet.Localization.Internal;
using Microsoft.Framework.Internal; using Microsoft.Framework.Internal;
@ -22,13 +23,13 @@ namespace Microsoft.AspNet.Localization
public int MaximumAcceptLanguageHeaderValuesToTry { get; set; } = 3; public int MaximumAcceptLanguageHeaderValuesToTry { get; set; } = 3;
/// <inheritdoc /> /// <inheritdoc />
public override RequestCulture DetermineRequestCulture([NotNull] HttpContext httpContext) public override Task<RequestCulture> DetermineRequestCulture([NotNull] HttpContext httpContext)
{ {
var acceptLanguageHeader = httpContext.Request.GetTypedHeaders().AcceptLanguage; var acceptLanguageHeader = httpContext.Request.GetTypedHeaders().AcceptLanguage;
if (acceptLanguageHeader == null || acceptLanguageHeader.Count == 0) if (acceptLanguageHeader == null || acceptLanguageHeader.Count == 0)
{ {
return null; return Task.FromResult((RequestCulture)null);
} }
var languages = acceptLanguageHeader.AsEnumerable(); var languages = acceptLanguageHeader.AsEnumerable();
@ -58,13 +59,13 @@ namespace Microsoft.AspNet.Localization
if (requestCulture != null) if (requestCulture != null)
{ {
return requestCulture; return Task.FromResult(requestCulture);
} }
} }
} }
} }
return null; return Task.FromResult((RequestCulture)null);
} }
} }
} }

View File

@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System; using System;
using System.Threading.Tasks;
using Microsoft.AspNet.Http; using Microsoft.AspNet.Http;
using Microsoft.AspNet.Localization.Internal; using Microsoft.AspNet.Localization.Internal;
using Microsoft.Framework.Internal; using Microsoft.Framework.Internal;
@ -24,20 +25,20 @@ namespace Microsoft.AspNet.Localization
public string CookieName { get; set; } = DefaultCookieName; public string CookieName { get; set; } = DefaultCookieName;
/// <inheritdoc /> /// <inheritdoc />
public override RequestCulture DetermineRequestCulture([NotNull] HttpContext httpContext) public override Task<RequestCulture> DetermineRequestCulture([NotNull] HttpContext httpContext)
{ {
var cookie = httpContext.Request.Cookies[CookieName]; var cookie = httpContext.Request.Cookies[CookieName];
if (cookie == null) if (cookie == null)
{ {
return null; return Task.FromResult((RequestCulture)null);
} }
var requestCulture = ParseCookieValue(cookie); var requestCulture = ParseCookieValue(cookie);
requestCulture = ValidateRequestCulture(requestCulture); requestCulture = ValidateRequestCulture(requestCulture);
return requestCulture; return Task.FromResult(requestCulture);
} }
/// <summary> /// <summary>

View File

@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System; using System;
using System.Threading.Tasks;
using Microsoft.AspNet.Http; using Microsoft.AspNet.Http;
using Microsoft.Framework.Internal; using Microsoft.Framework.Internal;
@ -12,19 +13,19 @@ namespace Microsoft.AspNet.Localization
/// </summary> /// </summary>
public class CustomRequestCultureStrategy : RequestCultureStrategy public class CustomRequestCultureStrategy : RequestCultureStrategy
{ {
private readonly Func<HttpContext, RequestCulture> _strategy; private readonly Func<HttpContext, Task<RequestCulture>> _strategy;
/// <summary> /// <summary>
/// Creates a new <see cref="CustomRequestCultureStrategy"/> using the specified delegate. /// Creates a new <see cref="CustomRequestCultureStrategy"/> using the specified delegate.
/// </summary> /// </summary>
/// <param name="strategy">The strategy delegate.</param> /// <param name="strategy">The strategy delegate.</param>
public CustomRequestCultureStrategy([NotNull] Func<HttpContext, RequestCulture> strategy) public CustomRequestCultureStrategy([NotNull] Func<HttpContext, Task<RequestCulture>> strategy)
{ {
_strategy = strategy; _strategy = strategy;
} }
/// <inheritdoc /> /// <inheritdoc />
public override RequestCulture DetermineRequestCulture([NotNull] HttpContext httpContext) public override Task<RequestCulture> DetermineRequestCulture([NotNull] HttpContext httpContext)
{ {
return _strategy(httpContext); return _strategy(httpContext);
} }

View File

@ -1,6 +1,7 @@
// Copyright (c) .NET Foundation. All rights reserved. // 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. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Threading.Tasks;
using Microsoft.AspNet.Http; using Microsoft.AspNet.Http;
namespace Microsoft.AspNet.Localization namespace Microsoft.AspNet.Localization
@ -18,6 +19,6 @@ namespace Microsoft.AspNet.Localization
/// The determined <see cref="RequestCulture"/>. /// The determined <see cref="RequestCulture"/>.
/// Returns <c>null</c> if the strategy couldn't determine a <see cref="RequestCulture"/>. /// Returns <c>null</c> if the strategy couldn't determine a <see cref="RequestCulture"/>.
/// </returns> /// </returns>
RequestCulture DetermineRequestCulture(HttpContext httpContext); Task<RequestCulture> DetermineRequestCulture(HttpContext httpContext);
} }
} }

View File

@ -1,6 +1,7 @@
// Copyright (c) .NET Foundation. All rights reserved. // 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. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Threading.Tasks;
using Microsoft.AspNet.Http; using Microsoft.AspNet.Http;
using Microsoft.AspNet.Localization.Internal; using Microsoft.AspNet.Localization.Internal;
using Microsoft.Framework.Internal; using Microsoft.Framework.Internal;
@ -26,12 +27,12 @@ namespace Microsoft.AspNet.Localization
public string UIQueryStringKey { get; set; } = "ui-culture"; public string UIQueryStringKey { get; set; } = "ui-culture";
/// <inheritdoc /> /// <inheritdoc />
public override RequestCulture DetermineRequestCulture([NotNull] HttpContext httpContext) public override Task<RequestCulture> DetermineRequestCulture([NotNull] HttpContext httpContext)
{ {
var request = httpContext.Request; var request = httpContext.Request;
if (!request.QueryString.HasValue) if (!request.QueryString.HasValue)
{ {
return null; return Task.FromResult((RequestCulture)null);
} }
string queryCulture = null; string queryCulture = null;
@ -50,7 +51,7 @@ namespace Microsoft.AspNet.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 null; return Task.FromResult((RequestCulture)null);
} }
if (queryCulture != null && queryUICulture == null) if (queryCulture != null && queryUICulture == null)
@ -64,14 +65,14 @@ namespace Microsoft.AspNet.Localization
if (culture == null || uiCulture == null) if (culture == null || uiCulture == null)
{ {
return null; return Task.FromResult((RequestCulture)null);
} }
var requestCulture = new RequestCulture(culture, uiCulture); var requestCulture = new RequestCulture(culture, uiCulture);
requestCulture = ValidateRequestCulture(requestCulture); requestCulture = ValidateRequestCulture(requestCulture);
return requestCulture; return Task.FromResult(requestCulture);
} }
} }
} }

View File

@ -1,6 +1,7 @@
// Copyright (c) .NET Foundation. All rights reserved. // 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. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Threading.Tasks;
using Microsoft.AspNet.Http; using Microsoft.AspNet.Http;
using Microsoft.Framework.Internal; using Microsoft.Framework.Internal;
@ -17,7 +18,7 @@ namespace Microsoft.AspNet.Localization
public RequestLocalizationOptions Options { get; set; } public RequestLocalizationOptions Options { get; set; }
/// <inheritdoc /> /// <inheritdoc />
public abstract RequestCulture DetermineRequestCulture(HttpContext httpContext); public abstract Task<RequestCulture> DetermineRequestCulture(HttpContext httpContext);
/// <summary> /// <summary>
/// Determines if the given <see cref="RequestCulture"/> is valid according to the currently configured. /// Determines if the given <see cref="RequestCulture"/> is valid according to the currently configured.

View File

@ -46,7 +46,7 @@ namespace Microsoft.AspNet.Localization
{ {
foreach (var strategy in _options.RequestCultureStrategies) foreach (var strategy in _options.RequestCultureStrategies)
{ {
var result = strategy.DetermineRequestCulture(context); var result = await strategy.DetermineRequestCulture(context);
if (result != null) if (result != null)
{ {
requestCulture = result; requestCulture = result;