如何解决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);
文件夹层次结构:
结果: 即使我将默认文化设置为“en”的 supportedCultures[0],应用程序也会获得“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 Core 使用以下 RequestCultureProviders
来检测请求区域性:
QueryStringRequestCultureProvider
CookieRequestCultureProvider
AcceptedLanguageHeaderRequestCultureProvider
因此,根据启动时提供的支持的文化列表,它将尝试通过提供程序中的请求文化匹配列表中的文化,直到找到第一个匹配项并做出相应的响应。
例如:
- 我们有
en
和ar
作为支持的文化列表, - 我们将
ar
设置为DefaultRequestCulture
- 我们没有在查询字符串
?culture=xx
中提供请求区域性
所以本地化中间件将首先尝试查询字符串,但由于那里没有定义文化,它将检查下一个提供者 CookieRequestCultreProvider
(下面是 TR
文化的示例文化 cookie。)
如果 cookie 中没有文化参数,它将检查最后一个文化提供者 AcceptedLanguageHeaderRequestCultureProvider
,它提供了一个接受的文化列表。
您可以在下面看到 chrome 支持的文化列表的屏幕截图,您可以更改浏览器文化的顺序,看看它如何影响请求文化。
如果它无法在上述任何提供程序中检测到请求文化,那么它将在启动时使用 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 举报,一经查实,本站将立刻删除。