【发布时间】:2019-01-17 23:36:08
【问题描述】:
我正在为我的 Web 应用程序添加本地化。我已经配置了IStringLocalizer,它可以从两个不同的 resx 文件中正确读取字符串资源,具体取决于浏览器设置。然后它将这些字符串资源映射到 ViewData,我的 View 从中获取正确语言的文本(不确定这是否是最好的方法,但现在我不想花更多时间在这上面)。
问题是我的 UI 中还有一个下拉列表,允许用户手动切换语言。我正在读取用户在我的控制器操作中设置的值并将其添加到 cookie,但现在我还想将我的应用程序的文化设置为与 cookie 中的字符串匹配的文化。
是否可以通过 MVC Core 中的控制器操作设置应用程序文化?如果是,那么如何正确执行此操作?
编辑:
我刚刚了解到我可以这样做:
<a class="nav-item nav-link" asp-route-culture="en-US">English</a>
它会将?culture=en-US 添加到我的路线中,这将为我设置页面的文化。有什么方法可以做到这一点而不必将其保存在地址栏中?
编辑 2:
关于亚当西蒙的回答:
CookieRequestCultureProvider 是我想在我的应用程序中使用的,但问题是它没有产生任何 cookie。文档说 .net 核心将通过检查哪个提供者提供有效的解决方案来解析使用哪个提供者,从 QueryStringRequestCultureProvider 开始,然后转到 CookieRequestCultureProvider,然后是其他提供者。
我当前的 Startup 是这样的:
public class Startup
{
private const string defaultCulutreName = "en-US";
public void ConfigureServices(IServiceCollection services)
{
services.AddLocalization();
services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new[]
{
new CultureInfo(defaultCulutreName),
new CultureInfo("pl-PL")
};
options.DefaultRequestCulture = new RequestCulture(defaultCulutreName, defaultCulutreName);
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
});
services.AddMvc()
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseStaticFiles();
//TRIED PLACING IT BEFORE AND AFTER UseRequestLocalization
//CookieRequestCultureProvider.MakeCookieValue(new RequestCulture("pl-PL", "pl-PL"));
app.UseRequestLocalization(app.ApplicationServices
.GetService<IOptions<RequestLocalizationOptions>>().Value);
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture("pl-PL", "pl-PL"));
app.UseMvc(ConfigureRoutes);
}
private void ConfigureRoutes(IRouteBuilder routeBuilder)
{
routeBuilder.MapRoute("Default", "{controller=About}/{action=About}");
}
}
关于CookieRequestCultureProvider.MakeCookieValue(new RequestCulture("pl-PL", "pl-PL")),我尝试将其放入ConfigureServices 中的RequestLocalizationOptions,在UseRequestLocalization 之前和之后的Configure 中。结果都一样。
此解决方案出现以下“问题”:
MakeCookieValue方法未生成任何.AspNetCore.Culturecookie语言设置为 PL 的 Chrome 浏览器正在使用
pl-PL文化 正确,但 Firefox 使用en-US文化,语言设置为 PL 在选项中(尽管注释掉了options.DefaultRequestCulture = new RequestCulture(defaultCulutreName, defaultCulutreName)行)不知何故,我的本地化默认情况下可以正常工作,而无需使用查询 字符串或 cookie 为应用程序提供文化,但这是 不是我想要的,因为我无法控制它
【问题讨论】:
标签: model-view-controller asp.net-core .net-core asp.net-core-mvc asp.net-core-2.0