こんにちはhabr!現在、OTUSは新しいコース「C# ASP.NETCoreDeveloper 」でスイートをオープンしています。この点で、私たちは伝統的にあなたと有用な翻訳を共有し、あなたがコースについて詳細に学び、あなたが興味を持っている専門家の質問をすることができるオープンデーにサインアップすることを勧めます。
これは、ASP.NET Core RazorPagesアプリケーションでのローカリゼーションに関するシリーズの最初の記事です。この記事では、コンテンツのローカリゼーション、つまりサイトのグローバル化のためにサイトを準備するために必要な構成について説明します。今後の記事では、ローカライズされたコンテンツの作成と、それをエンドユーザーに提示する方法について説明します。
ASP.NETコアのグローバル化
- . - , . - . . , 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) .