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

ASP.NET Core Razor Pages:如何设置非en-US的请求本地化默认区域性

ASP.NET Core 8 本地化问题:默认语言与URL参数切换无法同时生效

问题概述

使用VS2022的“ASP.NET Core Web App (Razor Pages)”模板创建了目标框架为.NET 8.0的Web应用WebApplication2,目前遇到本地化配置冲突:仅能二选一——要么通过URL参数(如?culture=fr-FR)切换请求本地化,要么将应用默认语言固定为fr-FR,无法同时实现两者。两种场景下本地化翻译功能均正常,但无法兼顾默认语言设置与URL参数切换。


情况1:URL参数生效,但默认语言无法设为fr-FR

尽管在配置中指定默认区域性为fr-FR,应用启动后仍默认使用en-US,对应Program.cs代码如下:

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddControllersWithViews();
// Add localization services
builder.Services.AddLocalization(options => options.ResourcesPath = "Resources");


string[] supportedCultures = [ "fr-FR", "en-US", "es-ES" ];
builder.Services.Configure<RequestLocalizationOptions>(options =>
{
    options.DefaultRequestCulture = new RequestCulture("fr-FR");
    options.SetDefaultCulture("fr-FR")
           .AddSupportedCultures(supportedCultures)
           .AddSupportedUICultures(supportedCultures);
});

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

var localizationOptions = app.Services.GetService<IOptions<RequestLocalizationOptions>>()?.Value;
if (localizationOptions != null)
{
    localizationOptions.AddSupportedCultures(supportedCultures);
    localizationOptions.DefaultRequestCulture = new RequestCulture("fr-FR");
    app.UseRequestLocalization(localizationOptions);
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

情况2:默认语言设为fr-FR,但URL参数切换失效

将区域性固定为fr-FR后,?culture=en-US这类URL参数不再生效,修改后的代码片段如下:

/* Comment these lines and replace it with single app.UseRequestLocalization call */
// var localizationOptions = app.Services.GetService<IOptions<RequestLocalizationOptions>>()?.Value;
// if (localizationOptions != null)
// {
//     localizationOptions.AddSupportedCultures(supportedCultures);
//     localizationOptions.DefaultRequestCulture = new RequestCulture("fr-FR");
//     app.UseRequestLocalization(localizationOptions);
// }
/* This has effect but then URL like `?culture=en-US` doesn't work */
app.UseRequestLocalization("fr-FR");

项目配置细节

  • 项目根目录下有Resources文件夹,包含3个资源文件(各含字符串StrLearnAbout):
    • Resources/SharedResource.en-US.resx
    • Resources/SharedResource.es-ES.resx
    • Resources/SharedResource.fr-FR.resx
  • 根目录下有空类SharedResource:
namespace WebApplication2
{
    public class SharedResource
    {
    }
}
  • Index.cshtml代码:
@using Microsoft.Extensions.Localization
@inject IStringLocalizer<SharedResource> Localizer

@{
    ViewData["Title"] = "Home Page";
}

<div class="text-center">
    <h1 class="display-4">Welcome</h1>
    <p>@Localizer["StrLearnAbout"]</p>
    <p>Learn about <a href="https://learn.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

解决方案

问题核心在于请求本地化中间件的配置顺序与重复配置冲突,修改后可同时满足默认语言设置与URL参数切换需求:

修改后的Program.cs

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddControllersWithViews();
// Add localization services
builder.Services.AddLocalization(options => options.ResourcesPath = "Resources");

string[] supportedCultures = [ "fr-FR", "en-US", "es-ES" ];
builder.Services.Configure<RequestLocalizationOptions>(options =>
{
    // 设置默认区域性
    var defaultCulture = "fr-FR";
    options.DefaultRequestCulture = new RequestCulture(defaultCulture);
    options.SetDefaultCulture(defaultCulture)
           .AddSupportedCultures(supportedCultures)
           .AddSupportedUICultures(supportedCultures);

    // 确保URL参数提供器优先级最高(默认已启用,显式声明更稳妥)
    options.RequestCultureProviders.Insert(0, new QueryStringRequestCultureProvider());
});

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
}

// 关键:在UseRouting之前启用请求本地化中间件
app.UseRequestLocalization();

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

关键说明

  1. 中间件顺序:UseRequestLocalization必须放在UseRouting之前,否则路由匹配会先于本地化处理,导致URL参数无法生效。
  2. 避免重复配置:移除服务构建后对RequestLocalizationOptions的二次修改,服务配置阶段的设置已足够,重复修改会干扰默认逻辑。
  3. URL参数优先级:显式将QueryStringRequestCultureProvider插入到提供器列表首位,确保URL参数的优先级高于Cookie、Accept-Language头等其他本地化来源。

配置完成后,应用默认将使用fr-FR,同时访问?culture=en-US或?culture=es-ES时,会正常切换到对应语言。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 23:58:24