Локализовать приложение ASP.NET Core MVC
Я пытаюсь заставить мое приложение правильно локализовать строки. Почувствуйте, что я обыскал каждый уголок в Интернете, не найдя чего-то, что работает, как я ожидаю.
Я использую 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
,
Спасибо
1 ответ
Так что я получил это на работу. Внутри моего Resource
папка у меня есть Lang.resx
-файлы с public
модификатор доступа.
Я нашел это и добавил класс Lang
(назван в файл LangDummy
не конфликтовать с файлами ресурсов), принадлежащим корневому пространству имен проекта.
Тогда на мой взгляд импортирует файл @inject Microsoft.Extensions.Localization.IStringLocalizer<My.Namespace.Lang> StringLocalizer
и использовать это @StringLocalizer["PropertyInResxFile"]
, В идеале я хотел бы использовать сгенерированные статические свойства для обеспечения безопасности типов и упрощения рефакторинга и использования nameof
везде просто чувствует себя раздутым
Это работает для локализации через атрибуты аннотации данных, но здесь я использую ResourceType = typeof(My.Namespace.Resources.Lang)
т.е. класс для файла resx