本文提供有关如何诊断 ASP.NET Core 应用本地化问题的说明。
本地化配置问题
本地化中间件顺序
应用可能无法本地化,因为本地化中间件未按预期排序。
若要解决此问题,请确保在 MVC 中间件之前注册本地化中间件。 否则,不会应用本地化中间件。
public void ConfigureServices(IServiceCollection services)
{
services.AddLocalization(options => options.ResourcesPath = "Resources");
services.AddMvc();
}
找不到本地化资源路径
RequestCultureProvider 中支持的文化与注册的文化不匹配
资源文件命名问题
ASP.NET Core 具有本地化资源文件命名的预定义规则和准则,这些规则和准则在 ASP.NET Core 的全球化和本地化中进行了介绍。
缺少资源
找不到资源的常见原因包括:
- 资源名称在 .NET XML 资源文件 (
.resx) 或本地化程序请求中拼写错误。 - 某些语言的资源文件中缺少该资源,但存在于其他语言中。
- 如果仍遇到问题,请检查本地化日志消息(记录在
Debug日志级别)以获取更多有关缺失资源的详细信息。
小窍门
使用 CookieRequestCultureProvider时,请验证单引号未与本地化 cookie 值内的区域性一起使用。 例如, c='en-UK'|uic='en-US' 是无效 cookie 值,而 c=en-UK|uic=en-US 值有效。
资源和类库问题
默认情况下,ASP.NET Core 提供了一种方法,允许类库通过 ResourceLocationAttribute 查找其资源文件。
类库常见的一个问题是:
- 在类库中缺少ResourceLocationAttribute会阻止ResourceManagerStringLocalizerFactory发现资源。
- 资源文件命名。 有关详细信息,请参阅 “资源文件命名问题 ”部分。
- 更改类库的根命名空间。 有关详细信息,请参阅 根命名空间问题 部分。
CustomRequestCultureProvider 无法按预期工作
该 RequestLocalizationOptions 类有三个默认提供程序:
- QueryStringRequestCultureProvider
- CookieRequestCultureProvider
- AcceptLanguageHeaderRequestCultureProvider
此 CustomRequestCultureProvider 允许您自定义本地化语言环境的提供方式。 CustomRequestCultureProvider当默认提供程序不满足你的要求时,将使用它。
自定义提供程序无法正常工作的常见原因之一是它不是RequestCultureProviders列表中的第一个提供程序。 若要解决此问题,请执行下列操作:
在 RequestCultureProviders 列表的第一个位置插入自定义提供程序:
options.AddInitialRequestCultureProvider( new CustomRequestCultureProvider(async context => { // My custom request culture logic return new ProviderCultureResult("en"); }));
在位置为零的 RequestCultureProviders 列表中插入自定义提供程序:
options.RequestCultureProviders.Insert(0, new CustomRequestCultureProvider(async context => { // My custom request culture logic return new ProviderCultureResult("en"); }));
- 使用 AddInitialRequestCultureProvider 扩展方法将自定义提供程序设置为初始提供程序。
根命名空间问题
当程序集的根命名空间不同于程序集名称时,本地化默认情况下不起作用。 为了避免此问题,请使用 RootNamespaceASP.NET Core 中的全球化和本地化中介绍的属性。
警告
当项目的名称不是有效的 .NET 标识符时,可能会出现根命名空间问题。 例如, my-project-name.csproj 使用根命名空间 my_project_name 和程序集名称 my-project-name,这会导致此错误。
资源和构建操作
如果使用资源文件进行本地化,请确保选择适当的生成操作。 使用 嵌入式资源;否则, ResourceStringLocalizer 无法找到这些资源。
使用开发者工具中“传感器”窗格替代位置
使用 Google Chrome 或Microsoft Edge 开发者工具中的“传感器”窗格来替代位置时,预渲染后备用语言会重置。 在测试时避免使用“传感器”窗格设置语言。 使用浏览器的语言设置来设置语言。
有关详细信息,请参阅Blazor本地化不适用于 InteractiveServer (dotnet/aspnetcore #53707)。