Локализовать приложение 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

Другие вопросы по тегам