ASP.NET 核心 MVC (.NET 5) 中的本地化和全球化

Localization and Globalization in ASP.NET Core MVC (.NET 5)

我一直在关注本教程“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);

文件夹层次结构:

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

如有任何帮助,我们将不胜感激。提前致谢。

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

 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);

测试结果:

默认Asp.Net核心使用下面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());
});