繁体   English   中英

asp.net core 2.1中基于国家/地区的本地化

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM