本地化 ASP.NET 核心 MVC 应用程序
Localize an ASP.NET Core MVC app
我正在努力让我的应用程序正确本地化字符串。感觉我已经搜索了网络的每个角落,但没有找到我期望的有用的东西。
我使用 RouteDataRequestCultureProvider
,我要解决的第一个问题是能够使用文化的 "short hand version",例如sv
而不是 sv-SE
,并且 sv
在创建文化时被视为 sv-SE
。这不会自动发生。
其次是让应用程序显示本地化字符串。这是我配置本地化的方式
public static IServiceCollection ConfigureLocalization(this IServiceCollection services)
{
services.AddLocalization(options =>
{
options.ResourcesPath = "Resources";
});
services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new[]
{
new System.Globalization.CultureInfo("sv-SE"),
new System.Globalization.CultureInfo("en-US")
};
options.DefaultRequestCulture = new RequestCulture(culture: "sv-SE", uiCulture: "sv-SE");
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
options.RequestCultureProviders = new[]
{
new RouteDataRequestCultureProvider
{
Options = options
}
};
});
return services;
}
然后在 Configure
中我执行 app.UseRequestLocalizationOptions();
注入先前配置的选项。
在文件夹 Resources
中,我创建了资源文件 Resource.resx
和 Resource.sv.resx
。
在我的视图文件中,我尝试了注入 IStringLocalizer
(由于没有注册默认实现而失败)和 IStringLocalizer<My.Namespace.Resources.Resource>
,但是 none 选项有效。我也尝试过老式的方式 @My.Namespace.Resources.Resource.StringToLocalize
难道没有共享资源文件?不想诉诸 Resource\Views\ViewA.resx
和 Resource\Controllers\AController.resx
.
谢谢
所以我让它工作了。在我的 Resource
文件夹中,我的 Lang.resx
文件带有 public
访问修饰符 。
我找到了 this 并添加了属于 的 class Lang
(命名为文件 LangDummy
不与资源文件冲突)项目的根命名空间。
然后在我看来导入文件 @inject Microsoft.Extensions.Localization.IStringLocalizer<My.Namespace.Lang> StringLocalizer
并使用它 @StringLocalizer["PropertyInResxFile"]
。理想情况下,我想使用生成的静态属性来实现类型安全和更轻松的重构,并且在任何地方使用 nameof
都会让人觉得臃肿。
这也适用于通过数据注释属性进行本地化但是我在这里使用ResourceType = typeof(My.Namespace.Resources.Lang)
,即resx文件的class
我正在努力让我的应用程序正确本地化字符串。感觉我已经搜索了网络的每个角落,但没有找到我期望的有用的东西。
我使用 RouteDataRequestCultureProvider
,我要解决的第一个问题是能够使用文化的 "short hand version",例如sv
而不是 sv-SE
,并且 sv
在创建文化时被视为 sv-SE
。这不会自动发生。
其次是让应用程序显示本地化字符串。这是我配置本地化的方式
public static IServiceCollection ConfigureLocalization(this IServiceCollection services)
{
services.AddLocalization(options =>
{
options.ResourcesPath = "Resources";
});
services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new[]
{
new System.Globalization.CultureInfo("sv-SE"),
new System.Globalization.CultureInfo("en-US")
};
options.DefaultRequestCulture = new RequestCulture(culture: "sv-SE", uiCulture: "sv-SE");
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
options.RequestCultureProviders = new[]
{
new RouteDataRequestCultureProvider
{
Options = options
}
};
});
return services;
}
然后在 Configure
中我执行 app.UseRequestLocalizationOptions();
注入先前配置的选项。
在文件夹 Resources
中,我创建了资源文件 Resource.resx
和 Resource.sv.resx
。
在我的视图文件中,我尝试了注入 IStringLocalizer
(由于没有注册默认实现而失败)和 IStringLocalizer<My.Namespace.Resources.Resource>
,但是 none 选项有效。我也尝试过老式的方式 @My.Namespace.Resources.Resource.StringToLocalize
难道没有共享资源文件?不想诉诸 Resource\Views\ViewA.resx
和 Resource\Controllers\AController.resx
.
谢谢
所以我让它工作了。在我的 Resource
文件夹中,我的 Lang.resx
文件带有 public
访问修饰符 。
我找到了 this 并添加了属于 的 class Lang
(命名为文件 LangDummy
不与资源文件冲突)项目的根命名空间。
然后在我看来导入文件 @inject Microsoft.Extensions.Localization.IStringLocalizer<My.Namespace.Lang> StringLocalizer
并使用它 @StringLocalizer["PropertyInResxFile"]
。理想情况下,我想使用生成的静态属性来实现类型安全和更轻松的重构,并且在任何地方使用 nameof
都会让人觉得臃肿。
这也适用于通过数据注释属性进行本地化但是我在这里使用ResourceType = typeof(My.Namespace.Resources.Lang)
,即resx文件的class