Изменение культуры для страницы ASP.NET Core 2 Razor

Я создал проекты ASP.NET Core 2 с бритвенными страницами и хотел бы предоставить посетителю возможность выбрать язык. Первой проблемой, с которой я столкнулся, было изменение URL-адреса веб-приложения, чтобы в него был включен текущий код языка. Я решил эту проблему, добавив следующий код в ConfigureServices.

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc()
            .AddRazorPagesOptions(options =>
            {
                options.Conventions.AuthorizeFolder("/Account/Manage");
                options.Conventions.AuthorizePage("/Account/Logout");
                options.Conventions.AddFolderRouteModelConvention("/", model =>
                {
                    foreach (var selector in model.Selectors)
                    {
                        var attributeRouteModel = selector.AttributeRouteModel;
                        attributeRouteModel.Template = AttributeRouteModel.CombineTemplates("{language=el-GR}", attributeRouteModel.Template);
                    }
                });
            });
    }
}

Теперь я могу посетить страницу, используя следующий URL:

http://domain/el-GR/MyPage

Последнее, что я хотел бы сделать, это изменить культуру каждого запроса. Лучшее решение, которое я нашел, которое мне не нравится, - это разместить следующий код на моей странице:

System.Globalization.CultureInfo.CurrentCulture = new System.Globalization.CultureInfo((string)RouteData.Values["language"]);
System.Globalization.CultureInfo.CurrentUICulture = new System.Globalization.CultureInfo((string)RouteData.Values["language"]);

Это нехорошо, потому что мне придется добавлять эту ложь на каждую страницу бритвы, которую я создам в своем проекте.

Есть ли другой способ установить культуру для всех запросов моего веб-приложения?

1 ответ

Обратитесь к этой статье: https://joonasw.net/view/aspnet-core-localization-deep-dive

Есть несколько методов, я использую RequestCultureProviders.

NuGet: Microsoft.AspNetCore.Localization

в моем методе Startup.Configure.

IList<CultureInfo> sc = new List<CultureInfo>();
sc.Add(new CultureInfo("en-US"));
sc.Add(new CultureInfo("zh-TW"));

var lo = new RequestLocalizationOptions
{
    DefaultRequestCulture = new RequestCulture("en-US"),
    SupportedCultures = sc,
    SupportedUICultures = sc
};
var cp = lo.RequestCultureProviders.
    OfType<CookieRequestCultureProvider>().First();
    cp.CookieName = "UserCulture"; // Or whatever name that you like

app.UseRequestLocalization(lo);

Установите для файла cookie UserCulture значение "c=zh-TW|uic=zh-TW" один раз.

И это работает волшебно.

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