如何在Blazor 8静态服务器渲染中配置本地化?新手求助
Blazor 8 静态服务器渲染(SSR)本地化实现指南
1. 配置本地化服务(Program.cs)
首先在项目入口配置本地化服务与请求文化规则,确保中间件顺序正确:
var builder = WebApplication.CreateBuilder(args); // 注册本地化服务,指定资源文件存放目录 builder.Services.AddLocalization(options => options.ResourcesPath = "Resources"); // 配置请求本地化参数 builder.Services.Configure<RequestLocalizationOptions>(options => { // 定义支持的文化列表 var supportedCultures = new[] { new CultureInfo("en-US"), new CultureInfo("zh-CN"), new CultureInfo("zh-TW") }; // 设置默认文化 options.DefaultRequestCulture = new RequestCulture("zh-CN"); options.SupportedCultures = supportedCultures; options.SupportedUICultures = supportedCultures; // 配置文化优先级:QueryString > Cookie > 浏览器默认语言 options.RequestCultureProviders = new List<IRequestCultureProvider> { new QueryStringRequestCultureProvider(), new CookieRequestCultureProvider(), new AcceptLanguageHeaderRequestCultureProvider() }; }); // 注册Blazor SSR服务 builder.Services.AddRazorComponents(); var app = builder.Build(); // 启用本地化中间件(必须放在路由配置之前) app.UseRequestLocalization(); app.UseStaticFiles(); app.UseAntiforgery(); app.MapRazorComponents<App>(); app.Run();
2. 创建本地化资源文件
- 在项目根目录新建
Resources文件夹 - 添加全局资源文件:
Shared.resx(默认文化,如中文)、Shared.en-US.resx(英文)、Shared.zh-TW.resx(繁体中文) - 若需组件专属本地化,可创建对应命名的资源文件,比如
Pages.Index.resx对应Pages/Index.razor的文本
注意:资源文件的访问修饰符需设置为
public(右键资源文件→属性→自定义工具命名空间→确保可见性为public)
3. 在SSR组件中使用本地化
全局资源调用
注入IStringLocalizer<Shared>(对应全局资源文件)直接使用:
@inject IStringLocalizer<Shared> Localizer <h1>@Localizer["WelcomeMessage"]</h1> <p>@Localizer["AppDescription"]</p>
组件专属资源调用
注入与组件同名的IStringLocalizer,调用对应资源文件的文本:
@inject IStringLocalizer<Index> Localizer <p>@Localizer["PageTitle"]</p>
4. 实现文化切换功能
SSR为静态渲染,切换文化需触发页面刷新,推荐两种实现方式:
方式1:QueryString临时切换
通过链接携带文化参数,直接触发文化切换:
<div class="culture-switch"> <a href="?culture=en-US&ui-culture=en-US">English</a> <a href="?culture=zh-CN&ui-culture=zh-CN">简体中文</a> <a href="?culture=zh-TW&ui-culture=zh-TW">繁体中文</a> </div>
方式2:Cookie持久化切换
通过表单提交到后端端点,设置文化Cookie后重定向回原页面:
后端端点(Program.cs)
app.MapPost("/set-culture", async (HttpContext context, string culture) => { if (!string.IsNullOrEmpty(culture) && CultureInfo.GetCultures(CultureTypes.AllCultures).Any(c => c.Name == culture)) { context.Response.Cookies.Append( CookieRequestCultureProvider.DefaultCookieName, CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)), new CookieOptions { Expires = DateTimeOffset.UtcNow.AddDays(30), HttpOnly = true } ); } return Results.Redirect(context.Request.Headers.Referer.ToString() ?? "/"); });
前端表单(组件中)
<form method="post" action="/set-culture"> <select name="culture" onchange="this.form.submit()"> <option value="zh-CN">简体中文</option> <option value="en-US">English</option> <option value="zh-TW">繁体中文</option> </select> </form>
关键注意事项
UseRequestLocalization必须在MapRazorComponents之前注册,否则文化规则不生效- 若使用Razor类库,需在类库中同步配置
ResourcesPath并放置对应资源文件 - 资源文件的命名需严格匹配组件或全局资源的命名空间
内容的提问来源于stack exchange,提问作者Dragan Velickovski
相关产品推荐
相关产品推荐

