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

在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中注入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:09:01