[英]Localization based on country in asp.net core 2.1
我试图根据他们正在查看我的应用的国家/地区来本地化发回给用户的内容,这意味着他们的国家/地区代码应作为请求网址的一部分。 例如,如果用户在美国,则所有请求URL都应类似于http://website.com/us/ {controller} / {action}。
话虽如此,有一种方法可以标识用户的原籍国,然后通过将其国家/地区Iso-2-Letter-Code
附加到该URL来修改请求URL,然后使用新URL重定向用户。 如果请求URL包含国家/地区代码,则应跳过此请求修改。
我希望使用或创建一个asp.net核心中间件的解决方案,该解决方案可以附加到Startup.cs的HTTP请求管道中,也可以涉及将新的自定义路由添加到默认MVC路由中。
您的帮助和想法将不胜感激。
.Net中有一个现有功能,您可以知道其起源。 称为文化信息 。
默认情况下,每个客户都会传递文化信息,或者他们可以指定他们打算使用的当前语言/国家。
我的建议是允许客户在标题名称“ Accept-Language”中指定区域性信息。 例如,我在美国,打算使用英语,因此我会在标头中发送“ en-us”作为请求的一部分。
在后端服务器内部,我将对照此标头进行检查并适当地设置区域性信息。
public class LanguageMessageHandler : DelegatingHandler
{
private const string LangenUS = "en-US";
private readonly List<string> _supportedLanguages = new List<string> { LangenUS };
private bool SetHeaderIfAcceptLanguageMatchesSupportedLanguage(HttpRequestMessage request)
{
foreach (var lang in request.Headers.AcceptLanguage)
{
if (_supportedLanguages.Contains(lang.Value))
{
SetCulture(request, lang.Value);
return true;
}
}
return false;
}
private void SetCulture(HttpRequestMessage request, string lang)
{
request.Headers.AcceptLanguage.Clear();
request.Headers.AcceptLanguage.Add(new StringWithQualityHeaderValue(lang));
Thread.CurrentThread.CurrentCulture = new CultureInfo(lang);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang);
}
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
if (!SetHeaderIfAcceptLanguageMatchesSupportedLanguage(request))
{
// Whoops no localization found. Lets try Globalisation
if (!SetHeaderIfGlobalAcceptLanguageMatchesSupportedLanguage(request))
{
// no global or localization found
SetCulture(request, LangenUS);
}
}
var response = await base.SendAsync(request, cancellationToken);
return response;
}
private bool SetHeaderIfGlobalAcceptLanguageMatchesSupportedLanguage(HttpRequestMessage request)
{
foreach (var lang in request.Headers.AcceptLanguage)
{
var globalLang = lang.Value.Substring(0, 2);
if (_supportedLanguages.Any(t => t.StartsWith(globalLang)))
{
SetCulture(request, _supportedLanguages.FirstOrDefault(i => i.StartsWith(globalLang)));
return true;
}
}
return false;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.