Globalization and Localization ในแอพ Blazor Server

Oct 25 2020

วิธีการทำ Globalization และ Localization ใน Blazor Server App

ไม่พบตัวอย่างการทำงานของโลกาภิวัตน์และการแปลในแอป Blazor Server ฉันได้สร้างขึ้นมาเอง นี่คือตัวอย่างโค้ด คัดลอกและทดสอบ ...

คำตอบ

enet Oct 25 2020 at 16:21
  1. สร้างโฟลเดอร์และตั้งชื่อว่าทรัพยากร

  2. เพิ่มไฟล์ทรัพยากรต่อไปนี้ ( .resx) ลงในโฟลเดอร์Pages.Index.resx: เพิ่มสตริงคำทักทายในคอลัมน์ชื่อและสวัสดี! ไปที่คอลัมน์ Value

    Pages.Index.fr.resx: เพิ่มสตริงคำทักทายในคอลัมน์ชื่อและ Bonjour! ไปที่คอลัมน์ Value

    Pages.Index.de.resx: เพิ่มสตริงคำทักทายในคอลัมน์ชื่อและ Hallo ในคอลัมน์ Value

  3. เพิ่มส่วนประกอบชื่อ CultureSelector.razor ไปยังโฟลเดอร์ที่แชร์:

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" },
    };
}

สร้างอินสแตนซ์คอมโพเนนต์ CultureSelector ใน MainLayout ดังนี้:

@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>

การใช้งาน (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");
        });
    }

เพิ่มคลาส Controller ไปยังโฟลเดอร์ Controllers (ถ้ามีถ้าไม่เพิ่ม) ตั้งชื่อเป็น 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);
        }
    }
}