diff --git a/samples/LocalizationSample/Startup.cs b/samples/LocalizationSample/Startup.cs index 2e2b93bd8b..ea9fb7c6c3 100644 --- a/samples/LocalizationSample/Startup.cs +++ b/samples/LocalizationSample/Startup.cs @@ -35,6 +35,14 @@ namespace LocalizationSample // 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.Use(async (context, next) => diff --git a/src/Microsoft.AspNet.Localization/AcceptLanguageHeaderRequestCultureStrategy.cs b/src/Microsoft.AspNet.Localization/AcceptLanguageHeaderRequestCultureStrategy.cs index dbc9883cd1..45ac85e2d3 100644 --- a/src/Microsoft.AspNet.Localization/AcceptLanguageHeaderRequestCultureStrategy.cs +++ b/src/Microsoft.AspNet.Localization/AcceptLanguageHeaderRequestCultureStrategy.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Linq; +using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.Localization.Internal; using Microsoft.Framework.Internal; @@ -22,13 +23,13 @@ namespace Microsoft.AspNet.Localization public int MaximumAcceptLanguageHeaderValuesToTry { get; set; } = 3; /// - public override RequestCulture DetermineRequestCulture([NotNull] HttpContext httpContext) + public override Task DetermineRequestCulture([NotNull] HttpContext httpContext) { var acceptLanguageHeader = httpContext.Request.GetTypedHeaders().AcceptLanguage; if (acceptLanguageHeader == null || acceptLanguageHeader.Count == 0) { - return null; + return Task.FromResult((RequestCulture)null); } var languages = acceptLanguageHeader.AsEnumerable(); @@ -58,13 +59,13 @@ namespace Microsoft.AspNet.Localization if (requestCulture != null) { - return requestCulture; + return Task.FromResult(requestCulture); } } } } - return null; + return Task.FromResult((RequestCulture)null); } } } diff --git a/src/Microsoft.AspNet.Localization/CookieRequestCultureStrategy.cs b/src/Microsoft.AspNet.Localization/CookieRequestCultureStrategy.cs index 97c70d82ed..68e7c96d06 100644 --- a/src/Microsoft.AspNet.Localization/CookieRequestCultureStrategy.cs +++ b/src/Microsoft.AspNet.Localization/CookieRequestCultureStrategy.cs @@ -2,6 +2,7 @@ // 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.AspNet.Http; using Microsoft.AspNet.Localization.Internal; using Microsoft.Framework.Internal; @@ -24,20 +25,20 @@ namespace Microsoft.AspNet.Localization public string CookieName { get; set; } = DefaultCookieName; /// - public override RequestCulture DetermineRequestCulture([NotNull] HttpContext httpContext) + public override Task DetermineRequestCulture([NotNull] HttpContext httpContext) { var cookie = httpContext.Request.Cookies[CookieName]; if (cookie == null) { - return null; + return Task.FromResult((RequestCulture)null); } var requestCulture = ParseCookieValue(cookie); requestCulture = ValidateRequestCulture(requestCulture); - return requestCulture; + return Task.FromResult(requestCulture); } /// diff --git a/src/Microsoft.AspNet.Localization/CustomRequestCultureStrategy.cs b/src/Microsoft.AspNet.Localization/CustomRequestCultureStrategy.cs index 5a5c87a825..65546bed44 100644 --- a/src/Microsoft.AspNet.Localization/CustomRequestCultureStrategy.cs +++ b/src/Microsoft.AspNet.Localization/CustomRequestCultureStrategy.cs @@ -2,6 +2,7 @@ // 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.AspNet.Http; using Microsoft.Framework.Internal; @@ -12,19 +13,19 @@ namespace Microsoft.AspNet.Localization /// public class CustomRequestCultureStrategy : RequestCultureStrategy { - private readonly Func _strategy; + private readonly Func> _strategy; /// /// Creates a new using the specified delegate. /// /// The strategy delegate. - public CustomRequestCultureStrategy([NotNull] Func strategy) + public CustomRequestCultureStrategy([NotNull] Func> strategy) { _strategy = strategy; } /// - public override RequestCulture DetermineRequestCulture([NotNull] HttpContext httpContext) + public override Task DetermineRequestCulture([NotNull] HttpContext httpContext) { return _strategy(httpContext); } diff --git a/src/Microsoft.AspNet.Localization/IRequestCultureStrategy.cs b/src/Microsoft.AspNet.Localization/IRequestCultureStrategy.cs index 9e71c133f4..91001e57cc 100644 --- a/src/Microsoft.AspNet.Localization/IRequestCultureStrategy.cs +++ b/src/Microsoft.AspNet.Localization/IRequestCultureStrategy.cs @@ -1,6 +1,7 @@ // 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.Threading.Tasks; using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Localization @@ -18,6 +19,6 @@ namespace Microsoft.AspNet.Localization /// The determined . /// Returns null if the strategy couldn't determine a . /// - RequestCulture DetermineRequestCulture(HttpContext httpContext); + Task DetermineRequestCulture(HttpContext httpContext); } } diff --git a/src/Microsoft.AspNet.Localization/QueryStringRequestCultureStrategy.cs b/src/Microsoft.AspNet.Localization/QueryStringRequestCultureStrategy.cs index 64a5a3b520..4a9a0b9140 100644 --- a/src/Microsoft.AspNet.Localization/QueryStringRequestCultureStrategy.cs +++ b/src/Microsoft.AspNet.Localization/QueryStringRequestCultureStrategy.cs @@ -1,6 +1,7 @@ // 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.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.Localization.Internal; using Microsoft.Framework.Internal; @@ -26,12 +27,12 @@ namespace Microsoft.AspNet.Localization public string UIQueryStringKey { get; set; } = "ui-culture"; /// - public override RequestCulture DetermineRequestCulture([NotNull] HttpContext httpContext) + public override Task DetermineRequestCulture([NotNull] HttpContext httpContext) { var request = httpContext.Request; if (!request.QueryString.HasValue) { - return null; + return Task.FromResult((RequestCulture)null); } string queryCulture = null; @@ -50,7 +51,7 @@ namespace Microsoft.AspNet.Localization if (queryCulture == null && queryUICulture == null) { // No values specified for either so no match - return null; + return Task.FromResult((RequestCulture)null); } if (queryCulture != null && queryUICulture == null) @@ -64,14 +65,14 @@ namespace Microsoft.AspNet.Localization if (culture == null || uiCulture == null) { - return null; + return Task.FromResult((RequestCulture)null); } var requestCulture = new RequestCulture(culture, uiCulture); requestCulture = ValidateRequestCulture(requestCulture); - return requestCulture; + return Task.FromResult(requestCulture); } } } diff --git a/src/Microsoft.AspNet.Localization/RequestCultureStrategy.cs b/src/Microsoft.AspNet.Localization/RequestCultureStrategy.cs index 17afbcd397..6d30805119 100644 --- a/src/Microsoft.AspNet.Localization/RequestCultureStrategy.cs +++ b/src/Microsoft.AspNet.Localization/RequestCultureStrategy.cs @@ -1,6 +1,7 @@ // 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.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.Framework.Internal; @@ -17,7 +18,7 @@ namespace Microsoft.AspNet.Localization public RequestLocalizationOptions Options { get; set; } /// - public abstract RequestCulture DetermineRequestCulture(HttpContext httpContext); + public abstract Task DetermineRequestCulture(HttpContext httpContext); /// /// Determines if the given is valid according to the currently configured. diff --git a/src/Microsoft.AspNet.Localization/RequestLocalizationMiddleware.cs b/src/Microsoft.AspNet.Localization/RequestLocalizationMiddleware.cs index c640fcbb8f..54600e17a4 100644 --- a/src/Microsoft.AspNet.Localization/RequestLocalizationMiddleware.cs +++ b/src/Microsoft.AspNet.Localization/RequestLocalizationMiddleware.cs @@ -46,7 +46,7 @@ namespace Microsoft.AspNet.Localization { foreach (var strategy in _options.RequestCultureStrategies) { - var result = strategy.DetermineRequestCulture(context); + var result = await strategy.DetermineRequestCulture(context); if (result != null) { requestCulture = result;