如何在ASP.NET Core视图中添加本地化字符串?
刚好做过类似的实现,结合你给出的代码片段,我把ASP.NET Core视图本地化的完整流程和细节整理出来,帮你落地:
ASP.NET Core 视图本地化完整实现指南
1. 资源文件的正确配置
你提到的Resources/Views.Account.Login.en-US.resx资源文件命名是符合规则的,不过还有几个关键细节要注意:
- 资源文件命名规则必须和视图路径对应:
Views.{ControllerName}.{ViewName}.{CultureCode}.resx,所以你的Views.Account.Login.en-US.resx完美匹配Views/Account/Login.cshtml视图的英文(美国)本地化资源。 - 右键资源文件→属性,把生成操作设置为
Embedded resource,不然程序编译后找不到这些资源。 - 可以按需添加其他语言的资源文件,比如中文简体的
Views.Account.Login.zh-CN.resx,只要Key一致,程序会自动根据当前文化切换文本。
2. 视图中的本地化代码优化
你给出的视图代码已经有了核心部分,我帮你补全并做了注释说明:
@using Microsoft.AspNetCore.Mvc.Localization @inject IViewLocalizer Localizer <div> <!-- 输出当前文化信息,方便调试是否切换成功 --> 当前文化:@System.Threading.Thread.CurrentThread.CurrentCulture.Name 当前UI文化:@System.Threading.Thread.CurrentThread.CurrentUICulture.Name <!-- 通过Key获取本地化文本,替换成你资源文件里的实际Key即可 --> 欢迎语:@Localizer["WelcomeMessage"] </div>
@inject IViewLocalizer Localizer:这是注入视图本地化服务的关键,有了它才能从资源文件中取文本。Localizer["Key"]:直接通过资源文件里的Key调用就行,比如你在en-US资源里给WelcomeMessage设值Welcome to Login Page,中文资源里设为欢迎登录,程序会自动匹配当前文化输出对应文本。
3. Startup.cs 中的服务配置补全
你给出的ConfigureServices片段有个小拼写错误(Resou...应该是Resources),我把完整的配置代码贴出来,包含必要的请求本地化设置:
public void ConfigureServices(IServiceCollection services) { // 注册本地化服务,指定资源文件存放在"Resources"文件夹 services.AddLocalization(options => options.ResourcesPath = "Resources"); services.AddControllersWithViews() // 启用视图本地化,用后缀规则匹配资源文件 .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix) // 可选:如果需要模型验证消息本地化,加上这一行 .AddDataAnnotationsLocalization(); // 配置支持的文化列表,按需添加 var supportedCultures = new[] { new CultureInfo("en-US"), new CultureInfo("zh-CN"), new CultureInfo("ja-JP") }; // 设置请求本地化选项 services.Configure<RequestLocalizationOptions>(options => { options.DefaultRequestCulture = new RequestCulture("en-US"); // 默认文化 options.SupportedCultures = supportedCultures; options.SupportedUICultures = supportedCultures; // 配置文化来源优先级:URL参数 > Cookie > 请求头 options.RequestCultureProviders = new List<IRequestCultureProvider> { new QueryStringRequestCultureProvider(), // 比如URL加?culture=zh-CN切换 new CookieRequestCultureProvider(), new AcceptLanguageHeaderRequestCultureProvider() }; }); } // 一定要在Configure方法中启用请求本地化中间件,而且要放在路由之前! public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // ...先加静态文件、错误处理这些中间件 // 启用请求本地化,这一步不能忘,否则文化切换不生效 app.UseRequestLocalization(); app.UseRouting(); // ...后续的认证、授权、端点路由等中间件 }
services.AddLocalization(...):指定资源文件的根目录,和你存放Resources文件夹的路径对应。AddViewLocalization(...):明确告诉程序用后缀式的资源文件命名规则来匹配视图。UseRequestLocalization():这个中间件必须放在UseRouting之前,不然无法正确解析请求中的文化参数。
常见踩坑点排查
如果遇到本地化文本不显示、还是显示Key本身的情况,按下面步骤排查:
- 检查资源文件的生成操作是不是
Embedded resource,这个是最容易忽略的点。 - 核对资源文件的命名是否和视图路径完全一致,比如
Views.Account.Login必须对应Views/Account/Login.cshtml,大小写也要注意。 - 查看页面上输出的
CurrentCulture和CurrentUICulture是不是你配置的支持文化之一,比如如果当前是zh-CN,但你没加对应的资源文件,就会显示Key。
内容的提问来源于stack exchange,提问作者user8664653
相关产品推荐
相关产品推荐

