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

.NET6 Blazor Server无法按浏览器语言加载对应本地化资源

.NET 6 Blazor Server 多语言跟随浏览器加载失效修复

Program.cs 配置顺序是第一优先级

这个地方踩坑的人最多,服务注册和中间件的顺序错了,后面所有配置都白搭:

  • 必须先注册本地化服务,再注册Razor、Blazor相关服务,代码示例:
// 本地化服务放最前面注册,如果你的resx文件统一放在Resources目录,就把ResourcesPath设为"Resources",放根目录就留空
builder.Services.AddLocalization(options => options.ResourcesPath = "");
// 配置支持的文化列表
builder.Services.Configure<RequestLocalizationOptions>(opts =>
{
    var supportedCultures = new[] { "en", "fr" };
    opts.SetDefaultCulture("en")
        .AddSupportedCultures(supportedCultures)
        .AddSupportedUICultures(supportedCultures);
});
// 后面再注册Razor和Blazor服务
builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();
  • 中间件管道里,UseRequestLocalization()必须放在所有其他业务中间件的最前面,在UseStaticFiles、UseRouting之前执行,否则读不到请求头里的Accept-Language信息:
var app = builder.Build();
// 本地化中间件第一个加
app.UseRequestLocalization();

// 后面再放其他中间件
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.MapBlazorHub();
app.MapFallbackToPage("/_Host");
app.Run();

资源文件配置踩坑

  • 命名规则:如果用全局公共资源文件resource.resx、resource.fr.resx,Razor页面注入的时候必须写@inject IStringLocalizer<resource> Localizer,用无泛型的IStringLocalizer会找不到对应资源集。如果是页面单独的资源文件,必须保证资源文件的命名空间和对应Razor页面的命名空间完全一致,否则匹配失败。
  • 文件属性:手动添加的resx文件一定要检查属性,生成操作必须设为「嵌入的资源」,自定义工具设为PublicResXFileCodeGenerator,否则资源不会被打包进程序集,永远返回默认的英语值。
  • 语言代码:就用两字母ISO 639-1代码就行,法语用fr,不要画蛇添足写fr-FR,.NET的本地化中间件会自动做前缀匹配,只要浏览器发的Accept-Language头里带fr前缀就能匹配上。

Blazor Server 特有适配

Blazor Server用SignalR长连接,不会像普通MPA页面那样每个请求都读请求头,必须手动把首次请求拿到的文化信息传到Blazor上下文:

  • 打开Pages/_Host.cshtml,在渲染Blazor根组件的时候把当前请求的UI文化传进去:
<component type="typeof(App)" render-mode="ServerPrerendered"
           param-InitialCulture="@CultureInfo.CurrentUICulture.Name" />
  • 打开App.razor,接收参数并设置全局线程文化:
@code {
    [Parameter]
    public string InitialCulture { get; set; } = default!;

    protected override void OnInitialized()
    {
        var culture = new CultureInfo(InitialCulture);
        CultureInfo.DefaultThreadCurrentCulture = culture;
        CultureInfo.DefaultThreadCurrentUICulture = culture;
    }
}

测试注意事项

  • 浏览器修改语言排序后,必须硬刷新(Ctrl+F5),普通刷新会复用之前的SignalR连接,保留旧的文化配置。
  • 打开浏览器F12网络面板,检查页面请求的Accept-Language头,确认你设置的目标语言是最高优先级,很多人改了语言但是没把对应语言拖到列表最顶部,发出去的请求头里英语优先级还是最高,自然加载英语资源。

我之前踩这个坑踩了整整两天,最后发现是把UseRequestLocalization写在了UseStaticFiles后面,不管怎么改浏览器语言、怎么调资源文件都没用,调整完中间件顺序立刻就正常了。

内容的提问来源于stack exchange,提问作者nbt1032

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 21:27:37