微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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);

文件夹层次结构:

enter image description here

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

enter image description here

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

解决方法

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

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

测试结果:

enter image description here

,

默认情况下,Asp.Net Core 使用以下 RequestCultureProviders 来检测请求区域性:

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

例如:

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

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

enter image description here

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

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

enter image description here

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。