Локализация в asp.net core 2.0 бритвенное веб-приложение без mvc
Каждый найденный мной пример, включая официальную документацию Microsoft по локализации по адресу https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization?view=aspnetcore-2.1, использует контроллер для выполнения действия установка и сохранение желаемой культуры. Мое веб-приложение ASP.NET Core 2.1 НЕ является MVC, поэтому не имеет контроллера. Я попробовал несколько способов обойти это, включая добавление фиктивного контроллера в мой проект, но я все еще не могу заставить переключение Культуры работать.
Мой метод запуска класса Configure содержит следующий код:
var supportedCultures = new[]
{
new CultureInfo("en-US"),
new CultureInfo("hi-IN")
};
app.UseRequestLocalization(new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture(DefaultCulture.Name),
// Formatting numbers, dates, etc.
SupportedCultures = supportedCultures,
// UI strings that we have localized.
SupportedUICultures = supportedCultures
});
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseMvc();
Метод ConfigureServices содержит этот код:
// Add the localization services to the services container
services.AddLocalization(options => options.ResourcesPath = "Resources");
// Add MVC Services to the Services Collection.
services.AddMvc()
// Add support for finding localized views, based on file name suffix, e.g. Index.fr.cshtml
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
// Add support for localizing strings in data annotations (e.g. validation messages) via the
// IStringLocalizer abstractions.
.AddDataAnnotationsLocalization();
// Configure supported cultures and localization options
var supportedCultures = new[]
{
new CultureInfo("en-US"),
new CultureInfo("hi-IN")
};
services.Configure<RequestLocalizationOptions>(options =>
{
// State what the default culture for your application is. This will be used if no specific culture
// can be determined for a given request.
options.DefaultRequestCulture = new RequestCulture(DefaultCulture.Name, DefaultCulture.Name);
// You must explicitly state which cultures your application supports.
// These are the cultures the app supports for formatting numbers, dates, etc.
options.SupportedCultures = supportedCultures;
// These are the cultures the app supports for UI strings, i.e. we have localized resources for.
options.SupportedUICultures = supportedCultures;
});
// Register the email service used for "contacts".
services.AddSingleton<IEmailSender, EmailSender>();
// Configure startup to use the SendGrid options.
services.Configure<AuthMessageSenderOptions>(Configuration);
// Add cross-origin resource sharing services to the specified IServiceCollection.
//
// The Policy specifed as an option will allow any method.
services.AddCors(options => options.AddPolicy("CorsPolicy", b => b.AllowAnyMethod()));
И DefaultCulture - это:
DefaultCulture = new CultureInfo(Configuration["Localization:DefaultCulture"]);
Где файл настроек содержит строку "en-US".
Затем я использую код _SelectLanguagePartial.cshtml из образца документации Localization:
<div title="@Localizer["Request culture provider:"] @requestCulture?.Provider?.GetType().Name">
<form id="selectLanguage" asp-controller="Home"
asp-action="SetLanguage" asp-route-returnUrl="@returnUrl"
method="post" class="form-horizontal" role="form">
<label asp-for="@requestCulture.RequestCulture.UICulture.Name">@Localizer["Language:"]</label>
<select name="culture" onchange="this.form.submit();" asp-for="@requestCulture.RequestCulture.UICulture.Name" asp-items="cultureItems"></select>
</form>
Прежде всего, нет контроллера. Как именно я могу реализовать эту функциональность в веб-приложении ASP.NET Core не-MVC?
1 ответ
Вам не нужно использовать контроллеры, недавно я опубликовал пошаговое руководство по разработке многокультурного веб-приложения с ASP.NET Core Razor Pages; Вы можете найти это здесь:
http://www.ziyad.info/en/articles/10-Developing_Multicultural_Web_Application
Я использовал подход к значению маршрута, но вы можете расширить его, чтобы использовать строку запроса, cookie или принятое значение заголовка для выбора культуры.
На сайте вы можете увидеть живую демонстрацию и ссылку на исходный код проекта на github.
Кроме того, вам может понадобиться проверить локализацию сообщений об ошибках идентификации:
http://ziyad.info/en/articles/20-Localizing_Identity_Error_Messages
Я надеюсь, что это помогает:)
[ОБНОВИТЬ]
Приведенный мной пример использует файлы общих ресурсов. Если вы хотите использовать сопоставление файлов ресурсов, относящихся к представлению, создайте файлы ресурсов для каждого представления / культуры в папке "Ресурсы" и оставьте структуру папок ресурсов похожей на связанные представления.
например, если у нас есть представление с именем "MyView" внутри папки страниц:
Страницы /MyView.cshtml
Файлы ресурсов должны быть такими:
Ресурсы / Страницы /MyView.tr-TR.resx
Ресурсы / Страницы /MyView.ar-SY.resx
Ресурсы / Страницы /MyView.hi-IN.resx
Использовать локализацию внутри представлений IViewLocalizer
:
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer _loc
<h4>@_loc["My view title"]</h4>
и для ViewModel/DataAnnotations создайте другой файл ресурсов для каждой культуры:
Посмотреть модель:
Страницы /MyViewModel.cshtml.cs
Имя файла ресурса:
Ресурсы / Страницы /MyViewModel.tr-TR.resx
Ресурсы / Страницы /MyViewModel.ar-SY.resx
Ресурсы / Страницы /MyViewModel.hi-IN.resx
Заполните файлы ресурсов соответствующими отображаемыми именами свойств модели и сообщениями с комментариями к данным, затем измените файл startup.cs, очистив код общего ресурса для DataAnnotations и оставив его без параметров:
services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.AddViewLocalization(o=>o.ResourcesPath = "Resources")
// Option A: use this for localization with shared resource
/*
.AddDataAnnotationsLocalization(o=> {
var type = typeof(ViewResource);
var assemblyName = new AssemblyName(type.GetTypeInfo().Assembly.FullName);
var factory = services.BuildServiceProvider().GetService<IStringLocalizerFactory>();
var localizer = factory.Create("ViewResource", assemblyName.Name);
o.DataAnnotationLocalizerProvider = (t, f) => localizer;
})
*/
// Option B: use this for localization by view specific resource
.AddDataAnnotationsLocalization()
.AddRazorPagesOptions(o => {
o.Conventions.Add(new CultureTemplateRouteModelConvention());
});
Кстати, я обновил пример GitHub, теперь он содержит представление "AnotherPage", локализованное с использованием определенных файлов ресурсов.