ASP.NET Core 6本地化器无法保存语言设置问题求助
ASP.NET Core 6 本地化切换失效问题解决
核心问题分析
你的代码存在两个关键问题导致语言切换始终失效:
UseRequestLocalization未复用已配置的本地化选项
你在builder.Services.Configure<RequestLocalizationOptions>中已经定义了支持的文化、默认文化,但后续调用app.UseRequestLocalization时,重新创建了全新的RequestLocalizationOptions实例,修改提供者顺序的同时完全丢弃了之前的配置,导致系统使用默认文化设置而非你定义的nl和en-US。Program.cs 存在语法错误
builder.Services.AddSession();语句后多了一个多余的闭合大括号},会导致编译失败(若为粘贴笔误请立即修正)。
修复步骤
1. 修正UseRequestLocalization配置逻辑
将调整请求文化提供者顺序的操作整合到已配置的选项中,确保本地化规则完全生效:
方案一:在ConfigureServices阶段配置完整选项
builder.Services.Configure<RequestLocalizationOptions>(options => { var supportedCultures = new[] { "en-US", "nl" }; options.SetDefaultCulture(supportedCultures[1]) .AddSupportedCultures(supportedCultures) .AddSupportedUICultures(supportedCultures); // 调整提供者优先级:Cookie优先于QueryString var queryStringProvider = options.RequestCultureProviders.OfType<QueryStringRequestCultureProvider>().First(); options.RequestCultureProviders.Remove(queryStringProvider); options.RequestCultureProviders.Insert(1, queryStringProvider); }); // 直接应用已配置的选项 app.UseRequestLocalization();
方案二:在UseRequestLocalization阶段加载已配置选项
// 获取之前配置的本地化选项 var localizationOptions = app.Services.GetService<IOptions<RequestLocalizationOptions>>().Value; // 调整提供者顺序 var queryStringProvider = localizationOptions.RequestCultureProviders.OfType<QueryStringRequestCultureProvider>().First(); localizationOptions.RequestCultureProviders.Remove(queryStringProvider); localizationOptions.RequestCultureProviders.Insert(1, queryStringProvider); // 应用配置 app.UseRequestLocalization(localizationOptions);
2. 修复语法错误
删除builder.Services.AddSession();后的多余}。
3. 优化Cookie设置逻辑
确保生成的本地化Cookie在整个站点生效,修改HomeController的SetLanguage方法:
[HttpPost] public IActionResult SetLanguage(string culture, string returnUrl) { var requestCulture = new RequestCulture(culture, culture); var cookieValue = CookieRequestCultureProvider.MakeCookieValue(requestCulture); Response.Cookies.Append( CookieRequestCultureProvider.DefaultCookieName, cookieValue, new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1), Path = "/" // 确保Cookie在全站有效 } ); return LocalRedirect(returnUrl); }
4. 确认资源文件结构合规
确保资源文件命名和位置符合ASP.NET Core本地化规范:
- 视图资源:
Resources/Views.Home.Index.nl.resx、Resources/Views.Shared._Layout.nl.resx - 控制器资源:
Resources/Controllers.HomeController.nl.resx
所有资源文件需设置生成操作为嵌入式资源,你的ResourcesPath配置已正确设置为"Resources",无需修改。
额外检查项
- 确保
UseRequestLocalization在UseRouting、UseAuthentication之前调用(你的代码顺序正确)。 - 调试确认
SetLanguage方法的culture参数正确接收nl值。
内容的提问来源于stack exchange,提问作者FunnyDEV
相关产品推荐
相关产品推荐

