Pelokalan di Halaman Razor Inti ASP.NET - Budaya

Halo habr! Saat ini, OTUS sedang membuka rangkaian kursus baru "C # ASP.NET Core Developer" . Dalam hal ini, kami biasanya membagikan terjemahan yang berguna kepada Anda dan mengundang Anda untuk mendaftar pada hari terbuka , di mana Anda dapat mempelajari kursus secara mendetail, serta mengajukan pertanyaan ahli yang Anda minati.


Ini adalah artikel pertama dalam seri pelokalan di aplikasi ASP.NET Core Razor Pages. Pada artikel ini, kita akan melihat konfigurasi yang diperlukan untuk menyiapkan situs untuk pelokalan konten, atau dengan kata lain, untuk globalisasi situs. Di artikel mendatang, saya akan berbicara tentang membuat konten yang dilokalkan dan cara menyajikannya kepada pengguna akhir.

Globalisasi di ASP.NET Core

- . - , . - . . , CultureInfo , , , .

Razor Pages , - ASP.NET Core 3.0 . «Localisation». , , .

1. Startup.cs using :

using System.Globalization;
using Microsoft.AspNetCore.Localization;
using Microsoft.Extensions.Options;

2. - . . ConfigureServices, AddLocalization, . RequestLocalizationOptions .

services.Configure<RequestLocalizationOptions>(options =>
{
   var supportedCultures = new[]
    {
        new CultureInfo("en"),
        new CultureInfo("de"),
        new CultureInfo("fr"),
        new CultureInfo("es"),
        new CultureInfo("ru"),
        new CultureInfo("ja"),
        new CultureInfo("ar"),
        new CultureInfo("zh"),
        new CultureInfo("en-GB")
    };
    options.DefaultRequestCulture = new RequestCulture("en-GB");
    options.SupportedCultures = supportedCultures;
    options.SupportedUICultures = supportedCultures;
});

, . .NET CultureInfo, , , , , . CultureInfo, , , (). - ISO 639-1, (, «en» ), ISO 3166, (, «en-GB» «en-ZA» ). , - , .

3. , RequestLocalizationOptions , , Configure app.UseRouting():

app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();

var localizationOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>().Value;
app.UseRequestLocalization(localizationOptions);

, RequestCultureProviders. :

  • QueryStringRequestCultureProvider,

  • CookieRequestCultureProvider, cookie

, . , . , , .

1. - Models CultureSwitcherModel.cs.

using System.Collections.Generic;
using System.Globalization;
 
namespace Localisation.Models
{
    public class CultureSwitcherModel
    {
        public CultureInfo CurrentUICulture { get; set; }
        public List<CultureInfo> SupportedCultures { get; set; }
    }
}

2. ViewComponents C# CultureSwitcherViewcomponent.cs. :

using Localisation.Models;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using System.Linq;
 
namespace Localisation.ViewComponents
{
    public class CultureSwitcherViewComponent : ViewComponent
    {
        private readonly IOptions<RequestLocalizationOptions> localizationOptions;
        public CultureSwitcherViewComponent(IOptions<RequestLocalizationOptions> localizationOptions) =>
            this.localizationOptions = localizationOptions;
 
        public IViewComponentResult Invoke()
        {
            var cultureFeature = HttpContext.Features.Get<IRequestCultureFeature>();
            var model = new CultureSwitcherModel
            {
                SupportedCultures = localizationOptions.Value.SupportedUICultures.ToList(),
                CurrentUICulture = cultureFeature.RequestCulture.UICulture
            };
            return View(model);
        }
    }
}

3. Pages Components. CultureSwitcher. Razor View default.cshtml :

@model CultureSwitcherModel
 
<div>
    <form id="culture-switcher">
        <select name="culture" id="culture-options">
            <option></option>
            @foreach (var culture in Model.SupportedCultures)
            {
                <option value="@culture.Name" selected="@(Model.CurrentUICulture.Name == culture.Name)">@culture.DisplayName</option>
            }
        </select>
    </form>
</div>
 
 
<script>
    document.getElementById("culture-options").addEventListener("change", () => {
        document.getElementById("culture-switcher").submit();
    });
</script>

- select , , Startup. , , get , , culture. QueryStringRequestCultureProvider culture (/ ui-culture).

CurrentCulture . CurrentUICulture , , . , . CurrentCulture CurrentUICulture , , . (, ), .

4. , , -   _ViewImports.cshtml using, , , tag- :

@using Localisation
@using Localisation.Models
@using System.Globalization
@namespace Localisation.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, Localisation

5. , tag-, .

<div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
    <ul class="navbar-nav flex-grow-1">
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
        </li>
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
        </li>
    </ul>
</div>
<vc:culture-switcher/>

6. Index.cshtml, HTML- , :

@page
@using Microsoft.AspNetCore.Localization
@model IndexModel
@{
    ViewData["Title"] = "Home page";
    var requestCultureFeature = HttpContext.Features.Get<IRequestCultureFeature>();
    var requestCulture = requestCultureFeature.RequestCulture;
}
 
<div class="text-center">
    <h1 class="display-4">Welcome</h1>
    <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
 
    <table class="table culture-table">
        <tr>
            <td style="width:50%;">Culture</td>
            <td>@requestCulture.Culture.DisplayName {@requestCulture.Culture.Name}</td>
        </tr>
        <tr>
            <td>UI Culture</td>
            <td>@requestCulture.UICulture.Name</td>
        </tr>
        <tr>
            <td>UICulture Parent</td>
            <td>@requestCulture.UICulture.Parent</td>
        </tr>
        <tr>
            <td>Date</td>
            <td>@DateTime.Now.ToLongDateString()</td>
        </tr>
        <tr>
            <td>Currency</td>
            <td>
                @(12345.00.ToString("c"))
            </td>
        </tr>
        <tr>
            <td>Number</td>
            <td>
                @(123.45m.ToString("F2"))
            </td>
        </tr>
    </table>
</div>

AcceptHeadersCultureRequestProvider. , QueryStringCultureRequestProvider. ui-culture culture (, https://localhost:xxxxx/?culture=es&ui-culture=de), , .

Razor Pages. , , , . , . , .

, , , , . , (.resx) .


.


:




All Articles