You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 6本地化器无法保存语言设置问题求助

ASP.NET Core 6 本地化切换失效问题解决

核心问题分析

你的代码存在两个关键问题导致语言切换始终失效:

  1. UseRequestLocalization 未复用已配置的本地化选项
    你在builder.Services.Configure<RequestLocalizationOptions>中已经定义了支持的文化、默认文化,但后续调用app.UseRequestLocalization时,重新创建了全新的RequestLocalizationOptions实例,修改提供者顺序的同时完全丢弃了之前的配置,导致系统使用默认文化设置而非你定义的nl和en-US。

  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 06:17:53