#asp.net-core #localization #blazor-server-side
Вопрос:
Поэтому я пытаюсь добавить локализацию без файлов cookie в свой серверный проект Blazor.
В документе https://docs.microsoft.com/en-us/aspnet/core/blazor/globalization-localization?view=aspnetcore-5.0#provide-ui-to-choose-the-culture там написано:
Использование файлов cookie гарантирует, что подключение к WebSocket может правильно распространять культуру. Если схемы локализации основаны на пути URL или строке запроса, схема может не работать с веб-сайтами и, следовательно, не сохранять культуру. Поэтому рекомендуется использовать файл cookie культуры локализации.
Поэтому я знаю, что это не рекомендуется, но я бы хотел, чтобы это было основано на пути, если это возможно. Можно ли это сделать с помощью стандартных сервисов.AddLocalization(); и IStringLocalizer, или мне нужно создать собственный?
Комментарии:
1. Согласно документу , культуру можно установить с помощью одного из следующих подходов: файлы cookie или предоставить пользовательский интерфейс для выбора культуры. Если вы хотите использовать метод предоставления пользовательского интерфейса для выбора культуры, вы можете следовать руководству по настройке приложения.
2. @Жилв Да? И «Предоставить пользовательский интерфейс для выбора культуры» — это всего лишь вызов IActionResult SetCulture, который устанавливает языковой файл cookie?
Ответ №1:
Для локализации я предпочитаю прямую, понятную и читаемую ссылку, содержащую первые 2 буквы языка (например: mysite.com/en/mypage ), что позволяет иметь правильную ссылку, используя именно тот язык, который необходим.
Единственным решением, которое я нашел, которое идеально работает с сервером Blazor без необходимости в файлах cookie, было использование пакета «BlazorServerUrlRequestCultureProvider», созданного «Пьер-Люк Бонневиль»; он прост в использовании и дает отличные результаты.
Использование:
Установите пакет BlazorServerUrlRequestCultureProvider (отлично работал для меня с .Net 5.0):
Install-Package BlazorServerUrlRequestCultureProvider -Version 1.0.0
Startup.cs:
using BlazorServerUrlRequestCultureProvider;
// ...
//------------------------------
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// ...
// Set the Resources folder name:
services.AddLocalization(options => options.ResourcesPath = "Resources");
// ...
}
}
//------------------------------
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseHttpsRedirection();
app.UseStaticFiles();
#region Localization
var supportedCultures = new[]
{
new CultureInfo("en"),
new CultureInfo("ar"),
};
var options = new RequestLocalizationOptions
{
// Select a default language:
DefaultRequestCulture = new RequestCulture("en"),
// For Numbers, Dates, etc:
SupportedCultures = supportedCultures,
// For strings that we have localized in .resx files:
SupportedUICultures = supportedCultures
};
app.UseUrlRequestLocalization(options);
#endregion
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapBlazorHub();
endpoints.MapFallbackToPage("/_Host");
});
app.UseRequestLocalization();
}
Это было как раз все, что тебе нужно! Никаких файлов cookie и контроллеров!
Теперь используйте StringLocalizer как обычно (в моем случае имена файлов ресурсов были App.resx и App.ar.resx внутри папки ресурсов):
Моя страница.бритва:
@page "/ar/MyPage"
@page "/en/MyPage"
@inject IStringLocalizer<App> localizer
<h1>@localizer["My Translated Text Here !"]</h1>
Вся благодарность и кредиты достаются «Пирсу-Люку Бонневиллю» за его замечательную работу. Веб — сайт проекта , NuGet .
—
Бонус: Чтобы сделать вашу жизнь намного проще, используйте инструмент ResXManager для простого управления и перевода файлов ресурсов, это бесплатный и отличный инструмент, и он сэкономит вам много времени.