Bonjour habr! À l'heure actuelle, OTUS ouvre une suite sur un nouveau flux de cours «C # ASP.NET Core Developer» . À cet égard, nous partageons traditionnellement avec vous une traduction utile et vous invitons à vous inscrire à une journée portes ouvertes , au cours de laquelle vous pourrez en apprendre davantage sur le cours et poser vos questions à l'expert.
Il s'agit du premier article d'une série sur la localisation dans les applications ASP.NET Core Razor Pages. Dans cet article, nous examinerons la configuration requise pour préparer un site à la localisation de contenu, ou en d'autres termes, à la globalisation du site. Dans les prochains articles, je parlerai de la création de contenu localisé et de la manière de le présenter à l'utilisateur final.
Globalisation dans 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
AcceptHeadersRequestCultureProvider
, Accept-Language
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) .