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
来检测请求文化:
QueryStringRequestCultureProvider
CookieRequestCultureProvider
AcceptedLanguageHeaderRequestCultureProvider
因此,根据启动时提供的支持的文化列表,它将尝试通过提供者中的请求文化来匹配列表中的文化,直到找到第一个匹配项并做出相应的响应。
例如:
- 我们有
en
和 ar
作为支持的文化列表,
- 我们将
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());
});
我一直在关注本教程“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
来检测请求文化:
QueryStringRequestCultureProvider
CookieRequestCultureProvider
AcceptedLanguageHeaderRequestCultureProvider
因此,根据启动时提供的支持的文化列表,它将尝试通过提供者中的请求文化来匹配列表中的文化,直到找到第一个匹配项并做出相应的响应。
例如:
- 我们有
en
和ar
作为支持的文化列表, - 我们将
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());
});