【问题标题】:Localization and Globalization in ASP.NET Core MVC (.NET 5)ASP.NET Core MVC (.NET 5) 中的本地化和全球化
【发布时间】:2021-04-13 21:31:24
【问题描述】:

我一直在关注本教程“https://www.youtube.com/watch?v=Hy9G30nncMM”。 用我自己的修改。

配置服务:

        services.AddLocalization(opt => { opt.ResourcesPath = "Resources"; });
        services.AddMvc().AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
            .AddDataAnnotationsLocalization();
        services.AddControllersWithViews();
        

配置:

        var supportedCultures = new[] {"en","ar"};
        var localizationOptions = new RequestLocalizationOptions()
            .SetDefaultCulture(supportedCultures[0])
            .AddSupportedCultures(supportedCultures)
            .AddSupportedUICultures(supportedCultures);

        app.UseRequestLocalization(localizationOptions);

文件夹层次结构:

结果: 即使我将默认文化设置为“en”的supportedCultures [0],应用程序也会获得“ar”。

任何有关此问题的帮助将不胜感激。提前致谢。

【问题讨论】:

    标签: asp.net-core localization globalization asp.net-core-5.0 asp.net-core-localization


    【解决方案1】:

    默认情况下,Asp.Net Core 使用下面的RequestCultureProviders 来检测请求文化:

    因此,根据启动时提供的支持文化列表,它将尝试通过提供者中的请求文化匹配列表中的文化,直到找到第一个匹配项并做出相应的响应。

    例如:

    • 我们有 enar 作为支持的文化列表,
    • 我们将ar 设置为DefaultRequestCulture
    • 我们没有在查询字符串?culture=xx 中提供请求文化

    因此本地化中间件将首先尝试使用查询字符串,但由于此处没有定义文化,它将检查下一个提供者CookieRequestCultreProvider(下面是TR 文化的示例文化cookie。)

    如果 cookie 中没有文化参数,它将检查最后一个文化提供者AcceptedLanguageHeaderRequestCultureProvider,它提供了接受的文化列表。

    您可以在下面看到 chrome 支持的文化列表的屏幕截图,您可以更改浏览器文化的顺序,看看它如何影响请求文化。

    如果它无法在上述任何提供程序中检测到请求文化,那么它将在启动时使用在RequestLocalizationOptions 中定义的DefaultRequestCulture

    在大多数情况下,我们可能会在 0 位置插入 RouteDataRequestCultureProvider 以在路线数据中提供文化,因此它将是在请求本地化期间首先查看的提供者:

    services.Configure<RequestLocalizationOptions>(ops =>
    {
        // ...
        ops.AddInitialRequestCultureProvider(new RouteDataRequestCultureProvider());
    });
    

    services.Configure<RequestLocalizationOptions>(ops =>
    {
        // ...
        ops.RequestCultureProviders.Insert(0, new RouteDataRequestCultureProvider());
    });
    

    【讨论】:

    • 感谢 LazZiya 先生的精彩介绍,您提供的信息我认为必须深入研究。
    • 很高兴为您提供帮助:)
    【解决方案2】:

    您可以像下面这样更改您的代码。

     var supportedCultures = new[] { new CultureInfo("en"), new CultureInfo("ar") };
    
            var localizationOptions = new RequestLocalizationOptions
            {
                SupportedCultures = supportedCultures,
                SupportedUICultures = supportedCultures,
                DefaultRequestCulture = new RequestCulture("en"),
            };
    
            localizationOptions.RequestCultureProviders.Clear();
    
            localizationOptions.RequestCultureProviders.Add(new QueryStringRequestCultureProvider() { QueryStringKey = "lang" });
    
            app.UseRequestLocalization(localizationOptions);
    

    测试结果:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-18
      • 2011-06-07
      • 1970-01-01
      • 2017-07-28
      • 1970-01-01
      • 1970-01-01
      • 2020-08-20
      相关资源
      最近更新 更多