Globalisation et localisation dans l'application serveur Blazor
Comment faire la mondialisation et la localisation dans l'application Blazor Server?
Ne pouvant pas trouver un échantillon fonctionnel de mondialisation et de localisation dans Blazor Server App, j'ai créé l'un des miens. Voici l'exemple de code. Copier et tester ...
Réponses
Créez un dossier et nommez-le Resources
Ajoutez les fichiers de ressources suivants (
.resx) au dossierPages.Index.resx: Ajoutez la chaîne Greetings à la colonne Nom et Hello! dans la colonne ValeurPages.Index.fr.resx: Ajoutez la chaîne Greetings à la colonne Nom et Bonjour! dans la colonne ValeurPages.Index.de.resx: Ajoutez la chaîne Greetings à la colonne Nom et Hallo à la colonne ValueAjoutez un composant nommé CultureSelector.razor au dossier partagé:
CultureSelector.razor
@using System.Globalization
@inject NavigationManager NavigationManager
@using System.Threading
<div>@SelectedCulture</div>
<select value="@SelectedCulture" @onchange="OnSelected">
@foreach (var culture in Cultures)
{
<option value="@culture.Value">@culture.Caption</option>
}
</select>
@code {
private void OnSelected(ChangeEventArgs e)
{
var culture = (string)e.Value;
var uri = new Uri(NavigationManager.Uri)
.GetComponents(UriComponents.PathAndQuery, UriFormat.Unescaped);
var query = $"?culture={Uri.EscapeDataString(culture)}&" + $"redirectUri={Uri.EscapeDataString(uri)}";
NavigationManager.NavigateTo("/Culture/SetCulture" + query, forceLoad: true);
}
public string SelectedCulture { get; set; } = Thread.CurrentThread.CurrentUICulture.Name;
public class CultureData
{
public string Caption { get; set; }
public string Value { get; set; }
}
public List<CultureData> Cultures { get; set; } = new List<CultureData>()
{
new CultureData() { Caption = "English", Value = "en-US" },
new CultureData() { Caption = "French", Value = "fr-FR" },
new CultureData() { Caption = "German", Value = "de-DE" },
};
}
Instanciez le composant CultureSelector dans MainLayout comme ceci:
@inherits LayoutComponentBase
@using System.Linq;
@using System.Reflection
@using Microsoft.AspNetCore.Components
<div class="sidebar">
<NavMenu />
</div>
<div class="main">
<div class="top-row px-4">
<CultureSelector></CultureSelector>
<a href="https://docs.microsoft.com/aspnet/" target="_blank">About</a>
</div>
<div class="content px-4">
@Body
</div>
</div>
Utilisation (Index.razor)
@page "/"
@using Microsoft.Extensions.Localization
@inject Microsoft.Extensions.Localization.IStringLocalizer<Index> localizer
<h1>@localizer["Greetings"].Value</h1>
@code{ }
Startrup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddLocalization(options => options.ResourcesPath =
"Resources");
services.AddRazorPages();
services.AddServerSideBlazor();
services.AddSingleton<WeatherForecastService>();
services.AddControllers();
services.Configure<RequestLocalizationOptions>(options =>
{
// define the list of cultures your app will support
var supportedCultures = new List<CultureInfo>()
{
new CultureInfo("en-US"),
new CultureInfo("fr-FR"),
new CultureInfo("de-DE")
};
// set the default culture
options.DefaultRequestCulture = new RequestCulture("en-US");
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseRequestLocalization(
app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>
().Value);
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
// enable controllers for the culture controller
endpoints.MapControllers();
endpoints.MapBlazorHub();
endpoints.MapFallbackToPage("/_Host");
});
}
Ajoutez une classe Controller au dossier Controllers (s'il existe. Sinon, ajoutez-en une) Nommez-la CultureController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
namespace <Put here the namespace of your app>.Controllers
{
[Route("[controller]/[action]")]
public class CultureController : Controller
{
public IActionResult SetCulture(string culture, string redirectUri)
{
if (culture != null)
{
HttpContext.Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(
new RequestCulture(culture)));
}
return LocalRedirect(redirectUri);
}
public IActionResult ResetCulture(string redirectUri)
{
HttpContext.Response.Cookies.Delete(CookieRequestCultureProvider.DefaultCookieName);
return LocalRedirect(redirectUri);
}
}
}