【问题标题】:Localization based on URL .NET Core 3.0基于 URL .NET Core 3.0 的本地化
【发布时间】:2019-10-28 10:28:30
【问题描述】:

我想获得基于 url 而不是浏览器文化的视图本地化。

"/account/leadregistrationstep/de" 将显示没有翻译的视图。要获得翻译,浏览器文化必须与视图匹配(这可行)。

有没有办法在不让浏览器文化匹配资源文件的情况下获得翻译?我希望德语视图只显示德语

启动配置服务

            services.Configure<RequestLocalizationOptions>(
            options =>
            {
                var supportedCultures = new List<CultureInfo>
                {
                    new CultureInfo("en"),
                    new CultureInfo("de"),
                    new CultureInfo("nl"),
                    new CultureInfo("fr")
                };

                options.DefaultRequestCulture = new RequestCulture(culture: "nl", uiCulture: "nl");
                options.SupportedCultures = supportedCultures;
                options.SupportedUICultures = supportedCultures;

                options.RequestCultureProviders.Insert(0, new QueryStringRequestCultureProvider());
            });

配置

            app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
            endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{language}/{id?}");
        });

【问题讨论】:

    标签: c# asp.net-core


    【解决方案1】:

    默认的 RequestCultureProviders 有 3 个,其中: AcceptLanguageHeaderRequestCultureProvider 使用浏览器标头作为文化信息。您需要覆盖列表而不是将 QueryStringRequestCultureProvider 插入其中,从而删除 AcceptLanguageHeaderRequestCultureProvider。

    options =>
        {
            var supportedCultures = new List<CultureInfo>
            {
                new CultureInfo("en"),
                new CultureInfo("de"),
                new CultureInfo("nl"),
                new CultureInfo("fr")
            };
    
            options.DefaultRequestCulture = new RequestCulture(culture: "nl", uiCulture: "nl");
            options.SupportedCultures = supportedCultures;
            options.SupportedUICultures = supportedCultures;
    
            options.RequestCultureProviders = new List<IRequestCultureProvider>
            {
                new QueryStringRequestCultureProvider(),
                new CookieRequestCultureProvider()
            };
        }
    

    这将仅使用设置的 cookie 或查询字符串 ?culture=fr ... 来选择文化。

    但是,如果您需要自定义规则,则需要实现自己的 RequestCultureProvider。这是一个例子:

    public class UrlRequestCultureProvider : RequestCultureProvider
    {
        public override Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext)
        {
            var validCultures = new []{"en", "de", "fr", "nl"};
            if (httpContext == null)
            {
                throw new ArgumentNullException(nameof(httpContext));
            }
    
            var culture = httpContext.Request.Path.Value
                            .Split("/")
                            .FirstOrDefault( (p) => validCultures.IndexOf(p.ToLower()) >= 0);
    
            if (culture == null)
            {
                return Task.FromResult((ProviderCultureResult)null);
            }
    
            return Task.FromResult(new ProviderCultureResult(culture));
        }
    }
    

    【讨论】:

    • 这样做的正确方法是什么?我需要专门的课程来处理这个问题吗?
    • 如果您需要自定义规则,那么您需要实现自己的RequestCultureProvider,但如果您只想使用QueryStringRequestCultureProvider - 那么我发布的代码就足够了。
    • ?culture=fr ... 是查询字符串方式
    • 哦,我的错。这也适用于我的代码。我正在寻找一个不需要传递文化的解决方案。文化应该是视图的语言,因此 /de 应该只显示德语等。
    猜你喜欢
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多