Globalisation et localisation dans l'application serveur Blazor

Oct 25 2020

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

enet Oct 25 2020 at 16:21
  1. Créez un dossier et nommez-le Resources

  2. Ajoutez les fichiers de ressources suivants ( .resx) au dossier Pages.Index.resx: Ajoutez la chaîne Greetings à la colonne Nom et Hello! dans la colonne Valeur

    Pages.Index.fr.resx: Ajoutez la chaîne Greetings à la colonne Nom et Bonjour! dans la colonne Valeur

    Pages.Index.de.resx: Ajoutez la chaîne Greetings à la colonne Nom et Hallo à la colonne Value

  3. Ajoutez 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);
        }
    }
}