我正在努力让我的应用正确地本地化字符串。感觉我已经搜索过网络的每个角落而没有找到符合我预期效果的东西。
我使用RouteDataRequestCultureProvider
,我试图解决的第一个问题是能够使用"短手版本"例如,文化在创建文化时,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>
,但没有一个选项有效。我也尝试过古老的方式@My.Namespace.Resources.Resource.StringToLocalize
是否无法拥有共享资源文件?不想诉诸Resource\Views\ViewA.resx
和Resource\Controllers\AController.resx
。
由于
答案 0 :(得分:0)
所以我得到了这个工作。在我的Resource
文件夹中,我有Lang.resx
- public
访问修饰符的文件。
我找到this并添加了一个类Lang
(命名为文件LangDummy
,不与资源文件冲突)属于根命名空间项目
然后在我看来导入文件@inject Microsoft.Extensions.Localization.IStringLocalizer<My.Namespace.Lang> StringLocalizer
并使用它@StringLocalizer["PropertyInResxFile"]
。理想情况下,我希望使用生成的静态属性来实现类型安全,并且更容易重构,并且在任何地方使用nameof
只会感到臃肿。
这适用于通过数据注释属性进行本地化以及但这里我使用ResourceType = typeof(My.Namespace.Resources.Lang)
,即resx文件的类