.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
相关产品推荐
相关产品推荐

