在Razor + Blazor组件中使用URL路径实现多语言本地化的方法咨询
基于URL路径的ASP.NET Razor Pages + Blazor混合应用本地化实现方案
以下是可直接落地的完整实现步骤:
1. 配置带语言标识的路由规则
让所有页面路由自动匹配/{culture}/xxx格式,不同语言前缀共用同一个后台页面逻辑
- 首先在
Program.cs中配置Razor Pages路由约定,统一添加语言参数前缀
builder.Services.AddRazorPages() .AddRazorPagesOptions(options => { // 给所有页面路由添加{culture}前缀,约束为2位小写语言码 options.Conventions.AddFolderRouteModelConvention("/", model => { foreach (var selector in model.Selectors) { selector.AttributeRouteModel.Template = AttributeRouteModel.CombineTemplates("{culture:regex(^[a-z]{{2}}$)}", selector.AttributeRouteModel.Template); } }); });
- 配置请求本地化规则,优先从路由路径中读取语言参数
builder.Services.Configure<RequestLocalizationOptions>(options => { var supportedCultures = new[] { "en", "fr" }; // 按需要添加支持的语言 options.SetDefaultCulture("en") .AddSupportedCultures(supportedCultures) .AddSupportedUICultures(supportedCultures); // 把路由文化提供器设为最高优先级,覆盖Cookie、请求头的取值逻辑 options.RequestCultureProviders.Insert(0, new RouteDataRequestCultureProvider { RouteDataStringKey = "culture", UIRouteDataStringKey = "culture" }); });
- 调整中间件顺序,把请求本地化中间件放在路由中间件之后
var app = builder.Build(); // ... 静态文件、HSTS等基础中间件 app.UseRouting(); app.UseRequestLocalization(); // 必须放在UseRouting之后,认证、授权中间件之前 // ... 认证、授权中间件 app.MapRazorPages(); app.MapBlazorHub(); // Blazor Server场景需要添加
2. 配置多语言资源
使用.NET内置的.resx资源文件机制,分别为Razor Pages和Blazor组件配置多语言内容
- 资源文件按页面/组件路径命名即可:
- Razor Pages对应
Pages/[页面名].[语言码].resx,例如Pages/Home.en.resx、Pages/Home.fr.resx - Blazor组件对应
Components/[组件名].[语言码].resx,例如Components/NavMenu.en.resx、Components/NavMenu.fr.resx
- Razor Pages对应
- Razor Pages中注入
IStringLocalizer获取当前语言文本
// Home.cshtml.cs public class HomeModel : PageModel { private readonly IStringLocalizer<HomeModel> _localizer; public HomeModel(IStringLocalizer<HomeModel> localizer) => _localizer = localizer; public string WelcomeText { get; set; } public void OnGet() => WelcomeText = _localizer["WelcomeMessage"]; }
- Blazor组件中同样可以注入
IStringLocalizer直接使用
@inject IStringLocalizer<NavMenu> Localizer <li class="nav-item"> <a class="nav-link" href="">@Localizer["HomeLink"]</a> </li>
3. Blazor组件语言适配
如果使用Blazor Server模式,注入IHttpContextAccessor即可直接获取当前请求的文化参数,CultureInfo.CurrentCulture会自动同步路由中的语言值;如果使用Blazor WebAssembly模式,需要在应用初始化时从URL截取语言参数配置默认文化:
// Blazor WASM Program.cs var nav = builder.Services.BuildServiceProvider().GetRequiredService<NavigationManager>(); var cultureCode = nav.Uri.Split('/')[3]; // 路径第3段为语言码,例如/fr/home中第三段为fr var culture = new CultureInfo(cultureCode); CultureInfo.DefaultThreadCurrentCulture = culture; CultureInfo.DefaultThreadCurrentUICulture = culture;
4. 无语言路径默认跳转(可选)
如果用户访问不带语言前缀的路径,可以自动重定向到默认语言对应的页面,添加对应的拦截中间件即可,注意排除Blazor Hub请求、静态资源路径避免误跳转:
app.Use(async (context, next) => { var path = context.Request.Path.Value; if (path != null && !path.StartsWith("/en/") && !path.StartsWith("/fr/") && !path.StartsWith("/_blazor") && !path.StartsWith("/lib") && !path.StartsWith("/favicon.ico")) { context.Response.Redirect($"/en{path}"); return; } await next(); });
内容的提问来源于stack exchange,提问作者TeamDman
相关产品推荐
相关产品推荐

