Globalizace a lokalizace v ASP.NET Core
Rick Anderson, Dam pohotový Bowden, Bart Calixto, Nadeem Afanaa Hisham Bin Ateya
Vícejazyčný web umožňuje web oslovit širší cílovou skupinu. ASP.NET Core poskytuje služby a middleware pro lokalizaci do různých jazyků a kultur.
Globalizace zahrnuje globalizaci a lokalizaci. Globalizace je proces návrhu aplikací, které podporují různé kultury. Globalizace přidává podporu vstupu, zobrazení a výstupu definované sady jazykových skriptů, které se vztahují ke konkrétním geografickým oblastem.
Lokalizace je proces přizpůsobení globalizované aplikace, kterou jste již zpracují pro lokalizovatelnost, na konkrétní jazykovou verzi nebo národní prostředí. Další informace najdete v části Globalizace a termíny lokalizace na konci tohoto dokumentu.
Lokalizace aplikací zahrnuje následující:
- Nastavení lokalizovatelného obsahu aplikace
- Poskytnutí lokalizovaných prostředků pro jazyky a jazykové verze, které podporujete
- Implementace strategie pro výběr jazyka nebo jazykové verze pro každý požadavek
Zobrazení nebo stažení ukázkového kódu (stažení)
Nastavení lokalizovatelného obsahu aplikace
IStringLocalizer a IStringLocalizer<T> byly na jejich základě zdokonalovány tak, aby při vývoji lokalizovaných aplikací vylepšoval produktivitu. IStringLocalizer používá a ResourceManager ResourceReader k poskytování prostředků specifických pro jazykovou verzi za běhu. Rozhraní má indexer a pro IEnumerable vracení lokalizovaných řetězců. IStringLocalizer nevyžaduje ukládání výchozích řetězců jazyka do souboru prostředků. Můžete vyvinout aplikaci cílenou na lokalizaci a není nutné vytvářet soubory prostředků v rané fázi vývoje. Následující kód ukazuje, jak zabalit řetězec "O názvu" pro lokalizaci.
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Localization;
namespace Localization.Controllers
{
[Route("api/[controller]")]
public class AboutController : Controller
{
private readonly IStringLocalizer<AboutController> _localizer;
public AboutController(IStringLocalizer<AboutController> localizer)
{
_localizer = localizer;
}
[HttpGet]
public string Get()
{
return _localizer["About Title"];
}
}
}
V předchozím kódu implementace pochází z IStringLocalizer<T> injektáže závislostí. Pokud se lokalizovaná hodnota "O názvu" nenašla, vrátí se klíč indexeru, tedy řetězec "O názvu". V aplikaci můžete ponechat výchozí řetězce literálů jazyka a zabalit je do lokátoru, abyste se mohli soustředit na vývoj aplikace. Aplikaci vyvíjíte s výchozím jazykem a připravíte ji na krok lokalizace, aniž byste nejprve vytvářely výchozí soubor prostředků. Alternativně můžete použít tradiční přístup a zadat klíč k načtení výchozího řetězce jazyka. Pro mnoho vývojářů může nový pracovní postup, kdy nemá výchozí jazykový soubor .resx a jednoduše zabalit řetězcové literály, snížit režijní náklady na lokalizaci aplikace. Jiní vývojáři budou preferovat tradiční pracovní tok, protože usnadní práci s delšími řetězcové literály a usnadní aktualizaci lokalizovaných řetězců.
Implementace se IHtmlLocalizer<T> používá pro prostředky, které obsahují kód HTML. IHtmlLocalizer HTML kóduje argumenty, které jsou formátovány v řetězci prostředku, ale nekódují kód HTML samotný řetězec prostředku. V ukázce zvýrazněné níže je kódována pouze hodnota name parametru HTML.
using System;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Localization;
namespace Localization.Controllers
{
public class BookController : Controller
{
private readonly IHtmlLocalizer<BookController> _localizer;
public BookController(IHtmlLocalizer<BookController> localizer)
{
_localizer = localizer;
}
public IActionResult Hello(string name)
{
ViewData["Message"] = _localizer["<b>Hello</b><i> {0}</i>", name];
return View();
}
Poznámka
Obecně platí, že lokalizovat text, nikoli HTML.
Na nejnižší úrovni se můžete dostat IStringLocalizerFactory z injektáže závislostí:
{
public class TestController : Controller
{
private readonly IStringLocalizer _localizer;
private readonly IStringLocalizer _localizer2;
public TestController(IStringLocalizerFactory factory)
{
var type = typeof(SharedResource);
var assemblyName = new AssemblyName(type.GetTypeInfo().Assembly.FullName);
_localizer = factory.Create(type);
_localizer2 = factory.Create("SharedResource", assemblyName.Name);
}
public IActionResult About()
{
ViewData["Message"] = _localizer["Your application description page."]
+ " loc 2: " + _localizer2["Your application description page."];
Výše uvedený kód ukazuje každou ze dvou metod vytváření továrny.
Lokalizované řetězce můžete rozdělit podle kontroleru, oblasti nebo mít pouze jeden kontejner. V ukázkové aplikaci se pro sdílené prostředky používá fiktivní třída SharedResource s názvem .
// Dummy class to group shared resources
namespace Localization
{
public class SharedResource
{
}
}
Někteří vývojáři používají Startup třídu , která obsahuje globální nebo sdílené řetězce. V následující ukázce se InfoController používají SharedResource lokátory a :
public class InfoController : Controller
{
private readonly IStringLocalizer<InfoController> _localizer;
private readonly IStringLocalizer<SharedResource> _sharedLocalizer;
public InfoController(IStringLocalizer<InfoController> localizer,
IStringLocalizer<SharedResource> sharedLocalizer)
{
_localizer = localizer;
_sharedLocalizer = sharedLocalizer;
}
public string TestLoc()
{
string msg = "Shared resx: " + _sharedLocalizer["Hello!"] +
" Info resx " + _localizer["Hello!"];
return msg;
}
Zobrazení lokalizace
Služba IViewLocalizer poskytuje lokalizované řetězce pro zobrazení. Třída ViewLocalizer implementuje toto rozhraní a vyhledá umístění prostředku z cesty k souboru zobrazení. Následující kód ukazuje, jak použít výchozí implementaci IViewLocalizer :
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
@{
ViewData["Title"] = Localizer["About"];
}
<h2>@ViewData["Title"].</h2>
<h3>@ViewData["Message"]</h3>
<p>@Localizer["Use this area to provide additional information."]</p>
Výchozí implementace vyhledá IViewLocalizer soubor prostředků na základě názvu souboru zobrazení. Globální sdílený soubor prostředků není možné použít. ViewLocalizer implementuje lokalizační metodu pomocí IHtmlLocalizer , takže nekóduje lokalizovaný řetězec ve formátu Razor HTML. Můžete parametrizovat řetězce prostředků a kódovat parametry ve formátu IViewLocalizer HTML, ale ne řetězec prostředku. Zvažte následující Razor kód:
@Localizer["<i>Hello</i> <b>{0}!</b>", UserManager.GetUserName(User)]
Soubor prostředků ve Francouzštině může obsahovat následující položky:
| Klíč | Hodnota |
|---|---|
<i>Hello</i> <b>{0}!</b> |
<i>Bonjour</i> <b>{0} !</b> |
Vykreslené zobrazení by obsahovalo kód HTML ze souboru prostředků.
Poznámka
Obecně platí, že lokalizovat text, nikoli HTML.
Pokud chcete v zobrazení použít sdílený soubor prostředků, injektujte IHtmlLocalizer<T> :
@using Microsoft.AspNetCore.Mvc.Localization
@using Localization.Services
@inject IViewLocalizer Localizer
@inject IHtmlLocalizer<SharedResource> SharedLocalizer
@{
ViewData["Title"] = Localizer["About"];
}
<h2>@ViewData["Title"].</h2>
<h1>@SharedLocalizer["Hello!"]</h1>
Lokalizace datových poznámek
Chybové zprávy DataAnnotations jsou lokalizované pomocí IStringLocalizer<T> . Pomocí možnosti můžete chybové zprávy v souboru ResourcesPath = "Resources" uložit v jedné z následujících RegisterViewModel cest:
- Resources/ViewModels.Account.RegisterViewModel.fr.resx
- Prostředky/ViewModels/Account/RegisterViewModel.fr.resx
public class RegisterViewModel
{
[Required(ErrorMessage = "The Email field is required.")]
[EmailAddress(ErrorMessage = "The Email field is not a valid email address.")]
[Display(Name = "Email")]
public string Email { get; set; }
[Required(ErrorMessage = "The Password field is required.")]
[StringLength(8, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Confirm password")]
[Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
}
V ASP.NET Core MVC 1.1.0 a vyšší jsou lokalizovány ne validační atributy. ASP.NET Core MVC 1.0 neschová lokalizované řetězce pro atributy bez ověření.
Použití jednoho řetězce prostředků pro více tříd
Následující kód ukazuje, jak použít jeden řetězec prostředku pro atributy ověřování s více třídami:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.AddDataAnnotationsLocalization(options => {
options.DataAnnotationLocalizerProvider = (type, factory) =>
factory.Create(typeof(SharedResource));
});
}
V předchozím kódu je třída odpovídající SharedResource resxu, kde jsou uloženy ověřovací zprávy. Při použití tohoto přístupu budou objekty DataAnnotations používat pouze , a SharedResource nikoli prostředek pro každou třídu.
Poskytnutí lokalizovaných prostředků pro jazyky a jazykové verze, které podporujete
SupportedCultures and SupportedUICultures
ASP.NET Core umožňuje zadat dvě hodnoty jazykové verze, SupportedCultures a SupportedUICultures . Objekt CultureInfo pro určuje výsledky funkcí závislých na jazykové verzi, jako je například SupportedCultures formátování data, času, čísla a měny. SupportedCultures také určuje pořadí řazení textu, konvence pro malá a malá písmena a porovnávání řetězců. Další informace o tom, jak server získává jazykovou verzi, najdete v tématu CultureInfo.CurrentCulture. Určuje, SupportedUICultures které přeložené řetězce (ze souborů .resx) jsou v ResourceManageru zahledány. Jednoduše ResourceManager vyhledá řetězce specifické pro jazykovou verzi, které jsou určeny CurrentUICulture . Každé vlákno v rozhraní .NET má CurrentCulture CurrentUICulture objekty a . ASP.NET Core tyto hodnoty při vykreslování funkcí závislých na jazykové verzi. Pokud je například jazyková verze aktuálního vlákna nastavená na "en-US" (angličtina, USA), zobrazí DateTime.Now.ToLongDateString() se "Thursday, February 18, 2016", ale pokud je nastavená na CurrentCulture es-ES (španělština, Španělsko), bude výstup "jueves, 18 de febrero de 2016".
Soubory prostředků
Soubor prostředků je užitečný mechanismus pro oddělení lokalizovatelných řetězců od kódu. Přeložené řetězce pro jiné než výchozí jazyky jsou izolované v souborech prostředků .resx. Můžete například chtít vytvořit soubor prostředků španělštiny s názvem Welcome.es.resx obsahující přeložené řetězce. "es" je kód jazyka pro španělštinu. Pokud chcete vytvořit tento soubor prostředků v Visual Studio:
V Průzkumník řešení klikněte pravým tlačítkem na složku, která bude obsahovat soubor prostředků > Přidat novou > položku.

Do pole Prohledat nainstalované šablony zadejte "resource" a pojmnte soubor.

Zadejte hodnotu klíče (nativní řetězec) ve sloupci Název a přeložený řetězec ve sloupci Hodnota.

Visual Studio soubor Welcome.es.resx.

Pojmenování souborů prostředků
Prostředky jsou pojmenovány pro úplný název typu jejich třídy minus název sestavení. Například francouzština prostředek v projektu, jehož hlavní sestavení je pro třídu bude mít název LocalizationWebsite.Web.dll LocalizationWebsite.Web.Startup Startup.fr.resx. Prostředek pro třídu by LocalizationWebsite.Web.Controllers.HomeController měl mít název Controllers. Home Controller.fr.resx. Pokud obor názvů cílové třídy není stejný jako název sestavení, budete potřebovat úplný název typu. Například v ukázkovém projektu by měl prostředek pro typ název ExtraNamespace.Tools ExtraNamespace.Tools.fr.resx.
V ukázkovém projektu metoda nastaví hodnotu "Resources", takže relativní cesta k projektu pro francouzštinu souboru prostředků domovského kontroleru ConfigureServices ResourcesPath je Resources/Controllers. Home Controller.fr.resx. Případně můžete k uspořádání souborů prostředků použít složky. U domovského kontroleru by cesta byla Resources/Controllers/ Home Controller.fr.resx. Pokud možnost použít nechcete, soubor ResourcesPath .resx bude v základním adresáři projektu. Soubor prostředků pro HomeController by měl mít název Controllers. Home Controller.fr.resx. Volba použití tečky nebo zásady vytváření názvů cest závisí na tom, jak chcete uspořádat soubory prostředků.
| Název prostředku | Tečka nebo pojmenování cesty |
|---|---|
| Prostředky/kontrolery. Home Controller.fr.resx | Dot |
| Prostředky/Kontrolery/ Home Controller.fr.resx | Cesta |
Soubory prostředků, které @inject IViewLocalizer se používají Razor v zobrazeních, používají podobný vzor. Soubor prostředků pro zobrazení můžete pojmenovat pomocí tečkového pojmenování nebo pojmenování cesty. Razor Zobrazení souborů prostředků napodobuje cestu k přidruženému souboru zobrazení. Za předpokladu, že jsme nastavili na "Resources", může být soubor prostředků francouzština přidružený k zobrazení ResourcesPath Views/ Home /About.cshtml některý z následujících:
Prostředky/Zobrazení/ Home /About.fr.resx
Prostředky/zobrazení. Home . About.fr.resx
Pokud možnost použít nechcete, soubor ResourcesPath .resx pro zobrazení bude umístěný ve stejné složce jako zobrazení.
RootNamespaceAttribute
Atribut poskytuje kořenový obor názvů sestavení, pokud se kořenový obor názvů sestavení liší od RootNamespaceAttribute názvu sestavení.
Upozornění
K tomu může dojít v případě, že název projektu není platný identifikátor rozhraní .NET. Například bude používat kořenový obor názvů a my-project-name.csproj název sestavení vedoucí k této my_project_name my-project-name chybě.
Pokud se kořenový obor názvů sestavení liší od názvu sestavení:
- Lokalizace ve výchozím nastavení nefunguje.
- Lokalizace se nepovede kvůli způsobu vyhledávání prostředků v rámci sestavení.
RootNamespaceje hodnota v čase sestavení, která není k dispozici pro spuštěný proces.
Pokud se RootNamespace hodnota liší od souboru , zahršete do souboru AssemblyName AssemblyInfo.cs následující informace (hodnoty parametrů se nahradí skutečnými hodnotami):
using System.Reflection;
using Microsoft.Extensions.Localization;
[assembly: ResourceLocation("Resource Folder Name")]
[assembly: RootNamespace("App Root Namespace")]
Předchozí kód umožňuje úspěšné rozlišení souborů resx.
Záložní chování jazykové verze
Při hledání prostředku lokalizace využívá "záložní jazykovou verzi". Počínaje požadovanou jazykovou verzí se vrátí zpět na nadřazenou jazykovou verzi této jazykové verze, pokud není nalezena. Kromě toho vlastnost CultureInfo.Parent představuje nadřazenou jazykovou verzi. To obvykle (ale ne vždy) znamená odebrání národního signifikátoru ze standardu ISO. Například dialekt španělštiny mluvený v Mexiku je "es-MX". Má nadřazenou španělštinu "es", — která není specifická pro libovolnou zemi.
Imagine váš web obdrží žádost o "uvítací" prostředek pomocí jazykové verze "fr-CA". Lokalizační systém hledá v pořadí následující prostředky a vybere první shodu:
- Welcome.fr-CA.resx
- Welcome.fr.resx
- Welcome.resx (pokud
NeutralResourcesLanguageje "fr-CA")
Pokud například odeberete návrháře jazykové verze ".fr" a jazyková verze je nastavená na francouzštinu, výchozí soubor prostředků je přečten a řetězce jsou lokalizovány. Resource Manager určí výchozí nebo záložní prostředek pro, pokud nic nesplňuje požadovanou jazykovou verzi. Pokud chcete pouze vrátit klíč, pokud chybí prostředek pro požadovanou jazykovou verzi, nesmí být výchozí soubor prostředků.
Generování souborů prostředků pomocí Visual Studio
Pokud v nástroji Visual Studio vytvoříte soubor prostředků bez jazykové verze v názvu souboru (například Welcome.resx), vytvoří Visual Studio třídu jazyka C# s vlastností pro každý řetězec. To obvykle u této aplikace ASP.NET Core. Obvykle nemáte výchozí soubor prostředků .resx (soubor .resx bez názvu jazykové verze). Doporučujeme vytvořit soubor .resx s názvem jazykové verze (například Welcome.fr.resx). Když vytvoříte soubor .resx s názvem jazykové verze, Visual Studio soubor třídy negeneruje.
Přidání dalších jazykových verzí
Každá kombinace jazyka a jazykové verze (jiná než výchozí jazyk) vyžaduje jedinečný soubor prostředků. Soubory prostředků pro různé jazykové verze a národní prostředí vytvoříte tak, že vytvoříte nové soubory prostředků, ve kterých jsou kódy jazyka ISO součástí názvu souboru (například en-us, fr-ca a en-gb). Tyto kódy ISO se umisťuje mezi název souboru a příponu souboru .resx jako v souboru Welcome.es-MX.resx (španělština/Mexiko).
Implementace strategie pro výběr jazyka nebo jazykové verze pro každý požadavek
Konfigurace lokalizace
Lokalizace se konfiguruje v Startup.ConfigureServices metodě :
services.AddLocalization(options => options.ResourcesPath = "Resources");
services.AddMvc()
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
.AddDataAnnotationsLocalization();
AddLocalizationpřidá lokalizační služby do kontejneru služeb. Výše uvedený kód také nastaví cestu k prostředkům na "Resources".AddViewLocalizationpřidává podporu lokalizovaných souborů zobrazení. V tomto ukázkovém zobrazení lokalizace vychází z přípony souboru zobrazení. Například "fr" v souboru Index.fr.cshtml.AddDataAnnotationsLocalizationpřidává podporuDataAnnotationslokalizovaných ověřovacích zprávIStringLocalizerprostřednictvím abstrakcí.
Middleware pro lokalizaci
Aktuální jazyková verze požadavku je nastavená v lokalizačním middlewaru. Lokalizační middleware je povolený v Startup.Configure metodě . Middleware lokalizace musí být nakonfigurovaný před middlewarem, který může kontrolovat jazykovou verzi požadavku (například app.UseMvcWithDefaultRoute() ).
var supportedCultures = new[] { "en-US", "fr" };
var localizationOptions = new RequestLocalizationOptions().SetDefaultCulture(supportedCultures[0])
.AddSupportedCultures(supportedCultures)
.AddSupportedUICultures(supportedCultures);
app.UseRequestLocalization(localizationOptions);
Pokud chcete zobrazit komentáře ke kódu přeložené do jiných jazyků než angličtiny, dejte nám vědět v tomto problému diskuze na GitHubu.
UseRequestLocalization inicializuje RequestLocalizationOptions objekt . Při každém požadavku se vyčíslí seznam v a použije se první zprostředkovatel, který dokáže úspěšně určit RequestCultureProvider RequestLocalizationOptions jazykovou verzi požadavku. Výchozí zprostředkovatelé pocházejí z RequestLocalizationOptions třídy :
QueryStringRequestCultureProviderCookieRequestCultureProviderAcceptLanguageHeaderRequestCultureProvider
Výchozí seznam se od nejsměšnějších po nejméně konkrétní. Později v tomto článku se budeme podívat, jak můžete změnit pořadí a dokonce přidat vlastního zprostředkovatele jazykové verze. Pokud žádný z zprostředkovatelů nemůže určit jazykovou verzi požadavku, DefaultRequestCulture použije se .
QueryStringRequestCultureProvider
Některé aplikace budou k nastavení objektu používat řetězec CultureInfo dotazu. U aplikací, které používají hlavičku nebo Accept-Language, je přidání řetězce dotazu na adresu URL užitečné pro cookie ladění a testování kódu. Ve výchozím nastavení se jako první QueryStringRequestCultureProvider zprostředkovatel lokalizace v RequestCultureProvider seznamu zaregistroval . Předáte parametry řetězce dotazu culture ui-culture a . Následující příklad nastaví konkrétní jazykovou verzi (jazyk a oblast) na španělštinu/Mexiko:
http://localhost:5000/?culture=es-MX&ui-culture=es-MX
Pokud předáte pouze jednu z těchto dvou hodnot ( nebo ), zprostředkovatel řetězce dotazu nastaví obě hodnoty pomocí hodnoty, culture ui-culture kterou jste předali. Například nastavení pouze jazykové verze nastaví jak , tak Culture UICulture i :
http://localhost:5000/?culture=es-MX
CookieRequestCultureProvider
Produkční aplikace často poskytují mechanismus pro nastavení jazykové verze pomocí ASP.NET Core jazykové cookie verze. Pomocí MakeCookieValue metody vytvořte cookie .
Vrátí výchozí název používaný ke sledování informací o preferované jazykové verzi CookieRequestCultureProvider DefaultCookieName cookie uživatele. Výchozí název cookie je .AspNetCore.Culture .
Formát cookie je , kde je a je , c=%LANGCODE%|uic=%LANGCODE% c Culture uic UICulture například:
c=en-UK|uic=en-US
Pokud zadáte pouze jednu z informací o jazykové verzi a jazykovou verzi uživatelského rozhraní, zadaná jazyková verze se použije pro informace o jazykové verzi i jazykovou verzi uživatelského rozhraní.
Hlavička Accept-Language HTTP
Hlavička Accept-Language je ve většině prohlížečů nastavená a původně měla určovat jazyk uživatele. Toto nastavení určuje, co prohlížeč nastavil na odeslání nebo zděděný ze základního operačního systému. Hlavička Accept-Language HTTP z požadavku prohlížeče není nepochybatelné, jak rozpoznat preferovaný jazyk uživatele (viz Nastavení předvoleb jazyka v prohlížeči). Produkční aplikace by měla obsahovat způsob, jak může uživatel přizpůsobit svou volbu jazykové verze.
Nastavení hlavičky http Accept-Language v IE
V ikoně ozubeného kola klepněte na Možnosti Internetu.
Klepněte na Jazyky.

Klepněte na Nastavit jazykové předvolby.
Klepněte na Přidat jazyk.
Přidejte jazyk.
Klepněte na jazyk a pak klepněte na Přesunout nahoru.
Hlavička PROTOKOLU HTTP jazyka obsahu
Hlavička entity jazyka obsahu :
- Slouží k popisu jazyků, které jsou určené pro cílovou skupinu.
- Umožňuje uživateli rozlišovat podle vlastního preferovaného jazyka uživatelů.
Záhlaví entit se používají v požadavcích HTTP i v odpovědích.
Content-LanguageZáhlaví lze přidat nastavením vlastnosti ApplyCurrentCultureToResponseHeaders .
Přidání Content-Language hlavičky:
- Umožňuje RequestLocalizationMiddleware nastavit
Content-Languagehlavičku pomocíCurrentUICulture. - Eliminuje nutnost explicitně nastavit hlavičku odpovědi
Content-Language.
app.UseRequestLocalization(new RequestLocalizationOptions
{
ApplyCurrentCultureToResponseHeaders = true
});
Použití vlastního zprostředkovatele
Předpokládejme, že chcete, aby vaši zákazníci mohli ukládat svůj jazyk a jazykovou verzi do databází. Můžete napsat poskytovatele a vyhledat tyto hodnoty pro uživatele. Následující kód ukazuje, jak přidat vlastního zprostředkovatele:
private const string enUSCulture = "en-US";
services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new[]
{
new CultureInfo(enUSCulture),
new CultureInfo("fr")
};
options.DefaultRequestCulture = new RequestCulture(culture: enUSCulture, uiCulture: enUSCulture);
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
options.AddInitialRequestCultureProvider(new CustomRequestCultureProvider(async context =>
{
// My custom request culture logic
return new ProviderCultureResult("en");
}));
});
Použijte RequestLocalizationOptions k přidání nebo odebrání poskytovatelů lokalizace.
Programové nastavení kultury
tento ukázkový projekt Localization. StarterWeb v GitHub obsahuje uživatelské rozhraní pro nastavení Culture . Soubor views/Shared/_SelectLanguagePartial. cshtml umožňuje vybrat jazykovou verzi ze seznamu podporovaných jazykových verzí:
@using Microsoft.AspNetCore.Builder
@using Microsoft.AspNetCore.Http.Features
@using Microsoft.AspNetCore.Localization
@using Microsoft.AspNetCore.Mvc.Localization
@using Microsoft.Extensions.Options
@inject IViewLocalizer Localizer
@inject IOptions<RequestLocalizationOptions> LocOptions
@{
var requestCulture = Context.Features.Get<IRequestCultureFeature>();
var cultureItems = LocOptions.Value.SupportedUICultures
.Select(c => new SelectListItem { Value = c.Name, Text = c.DisplayName })
.ToList();
var returnUrl = string.IsNullOrEmpty(Context.Request.Path) ? "~/" : $"~{Context.Request.Path.Value}";
}
<div title="@Localizer["Request culture provider:"] @requestCulture?.Provider?.GetType().Name">
<form id="selectLanguage" asp-controller="Home"
asp-action="SetLanguage" asp-route-returnUrl="@returnUrl"
method="post" class="form-horizontal" role="form">
<label asp-for="@requestCulture.RequestCulture.UICulture.Name">@Localizer["Language:"]</label> <select name="culture"
onchange="this.form.submit();"
asp-for="@requestCulture.RequestCulture.UICulture.Name" asp-items="cultureItems">
</select>
</form>
</div>
Soubor views/Shared/_SelectLanguagePartial. cshtml se přidá do footer oddílu souboru rozložení, takže bude k dispozici pro všechna zobrazení:
<div class="container body-content" style="margin-top:60px">
@RenderBody()
<hr>
<footer>
<div class="row">
<div class="col-md-6">
<p>© @System.DateTime.Now.Year - Localization</p>
</div>
<div class="col-md-6 text-right">
@await Html.PartialAsync("_SelectLanguagePartial")
</div>
</div>
</footer>
</div>
SetLanguageMetoda nastaví jazykovou verzi cookie .
[HttpPost]
public IActionResult SetLanguage(string culture, string returnUrl)
{
Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) }
);
return LocalRedirect(returnUrl);
}
Nemůžete připojit _SelectLanguagePartial. cshtml k ukázkovému kódu pro tento projekt. projekt Localization. StarterWeb v GitHub obsahuje kód pro tok RequestLocalizationOptions do Razor částečného toku prostřednictvím kontejneru pro vkládání závislostí .
Vazba modelu data směrování a řetězce dotazů
Podívejte se na téma chování globalizace modelu vazby dat trasy a řetězce dotazu.
Výrazy globalizace a lokalizace
Proces lokalizace vaší aplikace také vyžaduje základní znalosti relevantních znakových sad, které se běžně používají při vývoji moderního softwaru, a porozumění problémům, které s nimi souvisejí. I když všechny počítače ukládají text jako čísla (kódy), různé systémy ukládají stejný text s různými čísly. Proces lokalizace odkazuje na překlad uživatelského rozhraní aplikace (UI) pro konkrétní jazykovou verzi nebo národní prostředí.
Lokalizace je přechodný proces pro ověření, že globální aplikace je připravená na lokalizaci.
Formát RFC 4646 pro název jazykové verze je <languagecode2>-<country/regioncode2> , kde <languagecode2> je kód jazyka a <country/regioncode2> je kód subkultury. Například es-CL pro španělštinu (Chile), en-US pro angličtinu (USA) a en-AU pro angličtinu (Austrálie). RFC 4646 je kombinací kódu kultury ISO 639 2 s malým písmenem, který je přidružený k jazyku, a kódu subkultury na velká písmena ISO 3166 2, který je přidružený k zemi nebo oblasti. Další informace naleznete v tématu System.Globalization.CultureInfo.
Mezinárodní využití se často zkracuje na "I18N". Zkratka používá první a poslední písmena a počet písmen mezi nimi, takže 18 představuje počet písmen mezi první I a poslední znak "N". Totéž platí pro globalizaci (G11N) a lokalizaci (L10N).
Uvedenými
- Globalizace (G11N): proces vytvoření aplikace, která podporuje různé jazyky a oblasti.
- Lokalizace (L10N): proces přizpůsobení aplikace pro daný jazyk a oblast.
- Mezinárodní (I18N): popisuje globalizaci a lokalizaci.
- Jazyková verze: Jedná se o jazyk a volitelně i oblast.
- Neutrální jazyková verze: jazyková verze, která má zadaný jazyk, ale ne oblast. (například "en", "ES")
- Specifická jazyková verze: jazyková verze, která má zadaný jazyk a oblast. (například "en-US", "en-GB", "ES-CL")
- Nadřazená jazyková verze: neutrální jazyková verze, která obsahuje konkrétní jazykovou verzi. (například "en" je nadřazená jazyková verze "en-US" a "en-GB")
- Národní prostředí: národní prostředí je stejné jako jazyková verze.
Poznámka
Je možné, že nebudete moci zadat desítkové čárky do polí typu Decimal. Aby bylo možné podporovat ověřování jQuery pro jiné než anglické národní prostředí, které používá čárku (",") pro desetinnou čárku a formáty neUS-Englishho data, je nutné provést kroky k globalizaci aplikace. Pokyny k přidání desetinné čárky najdete v tomto problému v githubu 4076 .
Poznámka
Před ASP.NET Core 3.0 zapište jeden protokol typu pro každý požadavek, pokud požadovaná jazyková verze LogLevel.Warning není podporována. Protokolováním LogLevel.Warning jednoho na požadavek můžete vytvořit velké soubory protokolu s redundantními informacemi. Toto chování se ve ASP.NET 3.0 změnilo. Zapíše RequestLocalizationMiddleware protokol typu LogLevel.Debug , který zmenšuje velikost produkčních protokolů.
Další zdroje informací
Od Rick Anderson, Damien Bowden, Bart Calixto, Nadeem Afanaa Hisham bin Ateya
Vícejazyčný web umožňuje webu oslovit širší cílovou skupinu. ASP.NET Core poskytuje služby a middleware pro lokalizaci do různých jazyků a kultur.
Mezinárodní využití zahrnuje globalizaci a lokalizaci. Globalizace je proces návrhu aplikací, které podporují různé jazykové verze. Globalizace přidává podporu pro vstup, zobrazení a výstup definované sady jazykových skriptů, které se vztahují na konkrétní geografické oblasti.
Lokalizace je proces přizpůsobení globální aplikace, kterou jste již zpracovali pro lokalizaci, do konkrétní jazykové verze nebo národního prostředí. Další informace najdete v tématu předpoklady globalizace a lokalizace poblíž konce tohoto dokumentu.
Lokalizace aplikace zahrnuje následující:
- Nastavit lokalizaci obsahu aplikace
- Poskytněte lokalizované prostředky pro jazyky a kultury, které podporujete.
- Implementujte strategii pro výběr jazyka nebo kultury pro každý požadavek.
Zobrazit nebo stáhnout ukázkový kód (Jak stáhnout)
Nastavit obsah aplikace jako Lokalizovatelný
IStringLocalizer a IStringLocalizer<T> bylo navrženo pro zlepšení produktivity při vývoji lokalizovaných aplikací. IStringLocalizer používá ResourceManager a ResourceReader k poskytnutí prostředků specifických pro jazykovou verzi v době běhu. Rozhraní má indexer a IEnumerable pro vracení lokalizovaných řetězců. IStringLocalizer nevyžaduje uložení výchozích řetězců jazyka v souboru prostředků. Můžete vyvíjet aplikaci zaměřenou na lokalizaci a nemusíte vytvářet soubory prostředků na začátku ve vývoji. Následující kód ukazuje, jak zabalit řetězec "About title" pro lokalizaci.
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Localization;
namespace Localization.Controllers
{
[Route("api/[controller]")]
public class AboutController : Controller
{
private readonly IStringLocalizer<AboutController> _localizer;
public AboutController(IStringLocalizer<AboutController> localizer)
{
_localizer = localizer;
}
[HttpGet]
public string Get()
{
return _localizer["About Title"];
}
}
}
V předchozím kódu IStringLocalizer<T> implementace pochází z Injektáže závislosti. Pokud se nenalezne lokalizovaná hodnota "o titulku", vrátí se klíč indexeru, tj. řetězec "About title". Můžete ponechat výchozí řetězcové literály v aplikaci a zabalit je do lokalizátora, abyste se mohli soustředit na vývoj aplikace. Vyvíjíte svou aplikaci pomocí výchozího jazyka a připravíte ji pro krok lokalizace bez prvotního vytvoření výchozího souboru prostředků. Alternativně můžete použít tradiční přístup a zadat klíč pro načtení výchozího řetězce jazyka. Pro mnoho vývojářů nový pracovní postup, který nemá výchozí jazyk . resx soubor, a jednoduše zabalí řetězcové literály může snížit režii lokalizace aplikace. Ostatní vývojáři budou preferovat tradiční pracovní postup, protože mohou usnadnit práci s delšími řetězcovými literály a usnadňují aktualizaci lokalizovaných řetězců.
Použijte IHtmlLocalizer<T> implementaci pro prostředky, které obsahují kód HTML. IHtmlLocalizer HTML kóduje argumenty, které jsou formátovány v řetězci prostředků, ale nekóduje kód HTML samotný řetězec prostředku. V ukázce zvýrazněné níže je pouze hodnota name parametru kódována HTML.
using System;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Localization;
namespace Localization.Controllers
{
public class BookController : Controller
{
private readonly IHtmlLocalizer<BookController> _localizer;
public BookController(IHtmlLocalizer<BookController> localizer)
{
_localizer = localizer;
}
public IActionResult Hello(string name)
{
ViewData["Message"] = _localizer["<b>Hello</b><i> {0}</i>", name];
return View();
}
Poznámka
Obecně pouze lokalizovat text, ne HTML.
Na nejnižší úrovni můžete obdržet zástupné IStringLocalizerFactory vkládání závislostí:
{
public class TestController : Controller
{
private readonly IStringLocalizer _localizer;
private readonly IStringLocalizer _localizer2;
public TestController(IStringLocalizerFactory factory)
{
var type = typeof(SharedResource);
var assemblyName = new AssemblyName(type.GetTypeInfo().Assembly.FullName);
_localizer = factory.Create(type);
_localizer2 = factory.Create("SharedResource", assemblyName.Name);
}
public IActionResult About()
{
ViewData["Message"] = _localizer["Your application description page."]
+ " loc 2: " + _localizer2["Your application description page."];
Výše uvedený kód ukazuje každou ze dvou metod Create Factory.
Lokalizované řetězce můžete rozdělit do oddílů podle řadiče, oblasti nebo pouze jednoho kontejneru. V ukázkové aplikaci se SharedResource pro sdílené prostředky používá fiktivní třída s názvem.
// Dummy class to group shared resources
namespace Localization
{
public class SharedResource
{
}
}
Někteří vývojáři používají Startup třídu pro zahrnutí globálních nebo sdílených řetězců. V níže uvedené ukázce se InfoController SharedResource používají a Localize:
public class InfoController : Controller
{
private readonly IStringLocalizer<InfoController> _localizer;
private readonly IStringLocalizer<SharedResource> _sharedLocalizer;
public InfoController(IStringLocalizer<InfoController> localizer,
IStringLocalizer<SharedResource> sharedLocalizer)
{
_localizer = localizer;
_sharedLocalizer = sharedLocalizer;
}
public string TestLoc()
{
string msg = "Shared resx: " + _sharedLocalizer["Hello!"] +
" Info resx " + _localizer["Hello!"];
return msg;
}
Lokalizace zobrazení
IViewLocalizerSlužba poskytuje lokalizované řetězce pro zobrazení. ViewLocalizerTřída implementuje toto rozhraní a vyhledá umístění prostředku z cesty k souboru zobrazení. Následující kód ukazuje, jak použít výchozí implementaci IViewLocalizer :
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
@{
ViewData["Title"] = Localizer["About"];
}
<h2>@ViewData["Title"].</h2>
<h3>@ViewData["Message"]</h3>
<p>@Localizer["Use this area to provide additional information."]</p>
Výchozí implementace nástroje IViewLocalizer vyhledá soubor prostředků na základě názvu souboru zobrazení. Neexistuje možnost použít globální sdílený soubor prostředků. ViewLocalizer implementuje lokalizátora pomocí IHtmlLocalizer , takže Razor nekóduje kód HTML jako lokalizovaný řetězec. Můžete parametrizovat řetězce prostředků a IViewLocalizer zakódovat parametry HTML, ale ne řetězec prostředku. Vezměte v úvahu následující Razor značky:
@Localizer["<i>Hello</i> <b>{0}!</b>", UserManager.GetUserName(User)]
Soubor prostředků francouzštiny může obsahovat následující:
| Klíč | Hodnota |
|---|---|
<i>Hello</i> <b>{0}!</b> |
<i>Bonjour</i> <b>{0} !</b> |
Vykreslené zobrazení by obsahovalo kód HTML ze souboru prostředků.
Poznámka
Obecně platí, že lokalizovat text, nikoli HTML.
Pokud chcete v zobrazení použít sdílený soubor prostředků, injektujte IHtmlLocalizer<T> :
@using Microsoft.AspNetCore.Mvc.Localization
@using Localization.Services
@inject IViewLocalizer Localizer
@inject IHtmlLocalizer<SharedResource> SharedLocalizer
@{
ViewData["Title"] = Localizer["About"];
}
<h2>@ViewData["Title"].</h2>
<h1>@SharedLocalizer["Hello!"]</h1>
Lokalizace datových poznámek
Chybové zprávy DataAnnotations jsou lokalizované pomocí IStringLocalizer<T> . Pomocí možnosti můžete chybové zprávy v souboru ResourcesPath = "Resources" uložit v jedné z následujících RegisterViewModel cest:
- Resources/ViewModels.Account.RegisterViewModel.fr.resx
- Prostředky/ViewModels/Account/RegisterViewModel.fr.resx
public class RegisterViewModel
{
[Required(ErrorMessage = "The Email field is required.")]
[EmailAddress(ErrorMessage = "The Email field is not a valid email address.")]
[Display(Name = "Email")]
public string Email { get; set; }
[Required(ErrorMessage = "The Password field is required.")]
[StringLength(8, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Confirm password")]
[Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
}
Atributy bez ověření jsou lokalizovány.
Použití jednoho řetězce prostředku pro více tříd
Následující kód ukazuje, jak použít jeden řetězec prostředku pro atributy ověřování s více třídami:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.AddDataAnnotationsLocalization(options => {
options.DataAnnotationLocalizerProvider = (type, factory) =>
factory.Create(typeof(SharedResource));
});
}
V předchozím kódu je třída odpovídající SharedResource resxu, kde jsou uloženy ověřovací zprávy. Při tomto přístupu budou objekty DataAnnotations používat pouze , a SharedResource nikoli prostředek pro každou třídu.
Poskytnutí lokalizovaných prostředků pro jazyky a jazykové verze, které podporujete
SupportedCultures and SupportedUICultures
ASP.NET Core umožňuje zadat dvě hodnoty jazykové verze, SupportedCultures a SupportedUICultures . Objekt pro určuje výsledky funkcí závislých na jazykové CultureInfo SupportedCultures verzi, jako je například datum, čas, číslo a formátování měny. SupportedCultures také určuje pořadí řazení textu, konvence pro malá a malá písmena a porovnávání řetězců. Další informace o tom, jak server získá jazykovou verzi, najdete v tématu a CultureInfo.CurrentCulture CultureInfo.CurrentUICulture . Určuje, SupportedUICultures které přeložené řetězce (ze .resx souborů) jsou pomocí . ResourceManager Vyhledá ResourceManager řetězce specifické pro jazykovou verzi, které jsou určeny . CurrentUICulture Každé vlákno v rozhraní .NET má CurrentCulture CurrentUICulture objekty a . Architektura tyto hodnoty prověřuje při vykreslování funkcí závislých na jazykové verzi. Pokud je jazyková verze aktuálního vlákna nastavená na (angličtina, USA), zobrazí ; ale pokud je nastavená en-US DateTime.Now.ToLongDateString() na Thursday, February 18, 2016 CurrentCulture es-ES (španělština, Španělsko), je jueves, 18 de febrero de 2016 výstupem .
Soubory prostředků
Soubor prostředků je užitečný mechanismus pro oddělení lokalizovatelných řetězců od kódu. Přeložené řetězce pro jiné než výchozí jazyky jsou izolované v souborech prostředků .resx. Můžete například chtít vytvořit soubor prostředků španělštiny s názvem Welcome.es.resx obsahující přeložené řetězce. "es" je kód jazyka pro španělštinu. Pokud chcete vytvořit tento soubor prostředků v Visual Studio:
V Průzkumník řešení klikněte pravým tlačítkem na složku, která bude obsahovat soubor prostředků > Přidat > novou položku.

Do pole Prohledat nainstalované šablony zadejte "resource" a pojmnte soubor.

Zadejte hodnotu klíče (nativní řetězec) ve sloupci Název a přeložený řetězec ve sloupci Hodnota.

Visual Studio soubor Welcome.es.resx.

Pojmenování souborů prostředků
Prostředky jsou pojmenovány pro úplný název typu jejich třídy bez názvu sestavení. Například francouzština prostředek v projektu, jehož hlavní sestavení je pro třídu bude mít název LocalizationWebsite.Web.dll LocalizationWebsite.Web.Startup Startup.fr.resx. Prostředek pro třídu by LocalizationWebsite.Web.Controllers.HomeController měl mít název Controllers. Home Controller.fr.resx. Pokud obor názvů cílové třídy není stejný jako název sestavení, budete potřebovat úplný název typu. Například v ukázkovém projektu by měl prostředek pro typ název ExtraNamespace.Tools ExtraNamespace.Tools.fr.resx.
V ukázkovém projektu metoda nastaví hodnotu "Resources", takže relativní cesta k projektu pro francouzštinu souboru prostředků domovského kontroleru ConfigureServices ResourcesPath je Resources/Controllers. Home Controller.fr.resx. Případně můžete k uspořádání souborů prostředků použít složky. U domovského kontroleru by cesta byla Resources/Controllers/ Home Controller.fr.resx. Pokud možnost použít nechcete, soubor ResourcesPath .resx bude v základním adresáři projektu. Soubor prostředků pro HomeController by měl mít název Controllers. Home Controller.fr.resx. Volba použití tečky nebo zásady vytváření názvů cest závisí na tom, jak chcete uspořádat soubory prostředků.
| Název prostředku | Tečka nebo pojmenování cesty |
|---|---|
| Prostředky/kontrolery. Home Controller.fr.resx | Dot |
| Prostředky/Kontrolery/ Home Controller.fr.resx | Cesta |
Soubory prostředků, které @inject IViewLocalizer se používají Razor v zobrazeních, používají podobný vzor. Soubor prostředků pro zobrazení můžete pojmenovat pomocí tečkového pojmenování nebo pojmenování cesty. Razor Zobrazení souborů prostředků napodobuje cestu k přidruženému souboru zobrazení. Za předpokladu, že jsme nastavili na "Resources", může být soubor prostředků francouzština přidružený k zobrazení ResourcesPath Views/ Home /About.cshtml některý z následujících:
Prostředky/Zobrazení/ Home /About.fr.resx
Prostředky/zobrazení. Home . About.fr.resx
Pokud možnost použít nechcete, soubor ResourcesPath .resx pro zobrazení bude umístěný ve stejné složce jako zobrazení.
RootNamespaceAttribute
Atribut poskytuje kořenový obor názvů sestavení, pokud se kořenový obor názvů sestavení liší od RootNamespaceAttribute názvu sestavení.
Upozornění
K tomu může dojít v případě, že název projektu není platný identifikátor rozhraní .NET. Například bude používat kořenový obor názvů a my-project-name.csproj název sestavení vedoucí k této my_project_name my-project-name chybě.
Pokud se kořenový obor názvů sestavení liší od názvu sestavení:
- Lokalizace ve výchozím nastavení nefunguje.
- Lokalizace se nepovede kvůli způsobu vyhledávání prostředků v rámci sestavení.
RootNamespaceje hodnota v čase sestavení, která není k dispozici pro spuštěný proces.
Pokud se RootNamespace hodnota liší od souboru , zahršete do souboru AssemblyName AssemblyInfo.cs následující informace (hodnoty parametrů se nahradí skutečnými hodnotami):
using System.Reflection;
using Microsoft.Extensions.Localization;
[assembly: ResourceLocation("Resource Folder Name")]
[assembly: RootNamespace("App Root Namespace")]
Předchozí kód umožňuje úspěšné rozlišení souborů resx.
Záložní chování jazykové verze
Při hledání prostředku lokalizace využívá "záložní jazykovou verzi". Počínaje požadovanou jazykovou verzí se vrátí zpět na nadřazenou jazykovou verzi této jazykové verze, pokud není nalezena. Kromě toho vlastnost CultureInfo.Parent představuje nadřazenou jazykovou verzi. To obvykle (ale ne vždy) znamená odebrání národního signifikátoru ze standardu ISO. Například dialekt španělštiny mluvený v Mexiku je "es-MX". Má nadřazenou španělštinu "es", — která není specifická pro libovolnou zemi.
Imagine váš web obdrží žádost o "uvítací" prostředek pomocí jazykové verze "fr-CA". Lokalizační systém hledá v pořadí následující prostředky a vybere první shodu:
- Welcome.fr-CA.resx
- Welcome.fr.resx
- Welcome.resx (pokud
NeutralResourcesLanguageje "fr-CA")
Pokud například odeberete návrháře jazykové verze ".fr" a jazyková verze je nastavená na francouzštinu, výchozí soubor prostředků je přečten a řetězce jsou lokalizovány. Resource Manager určí výchozí nebo záložní prostředek pro, pokud nic nesplňuje požadovanou jazykovou verzi. Pokud chcete pouze vrátit klíč, pokud chybí prostředek pro požadovanou jazykovou verzi, nesmí být výchozí soubor prostředků.
Generování souborů prostředků pomocí Visual Studio
Pokud v nástroji Visual Studio vytvoříte soubor prostředků bez jazykové verze v názvu souboru (například Welcome.resx), vytvoří Visual Studio třídu jazyka C# s vlastností pro každý řetězec. To obvykle u této aplikace ASP.NET Core. Obvykle nemáte výchozí soubor prostředků .resx (soubor .resx bez názvu jazykové verze). Doporučujeme vytvořit soubor .resx s názvem jazykové verze (například Welcome.fr.resx). Když vytvoříte soubor .resx s názvem jazykové verze, Visual Studio soubor třídy negeneruje.
Přidání dalších jazykových verzí
Každá kombinace jazyka a jazykové verze (jiná než výchozí jazyk) vyžaduje jedinečný soubor prostředků. Soubory prostředků pro různé jazykové verze a národní prostředí vytvoříte tak, že vytvoříte nové soubory prostředků, ve kterých jsou kódy jazyka ISO součástí názvu souboru (například en-us, fr-ca a en-gb). Tyto kódy ISO se umisťuje mezi název souboru a příponu souboru .resx jako v souboru Welcome.es-MX.resx (španělština/Mexiko).
Implementujte strategii pro výběr jazyka nebo kultury pro každý požadavek.
Konfigurace lokalizace
Lokalizace je nakonfigurovaná v Startup.ConfigureServices metodě:
services.AddLocalization(options => options.ResourcesPath = "Resources");
services.AddMvc()
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
.AddDataAnnotationsLocalization();
AddLocalizationPřidá služby lokalizace do kontejneru služby. Výše uvedený kód také nastaví cestu prostředků na prostředky.AddViewLocalizationPřidá podporu pro lokalizované soubory zobrazení. V tomto ukázkovém zobrazení je lokalizace založena na příponě souboru zobrazení. Například "fr" v souboru index. fr. cshtml .AddDataAnnotationsLocalizationpřidává podporu pro lokalizovanéDataAnnotationsověřovací zprávy prostřednictvímIStringLocalizerabstrakcí.
Middleware lokalizace
Aktuální jazyková verze v požadavku je nastavena v middlewarelokalizace. Middleware lokalizace je povolená v Startup.Configure metodě. Middleware lokalizace musí být konfigurovány před jakýmkoli middlewarem, který by mohl kontrolovat jazykovou verzi žádosti (například app.UseMvcWithDefaultRoute() ). Middleware pro lokalizaci se musí objevit po použití middlewaru pro směrování RouteDataRequestCultureProvider . Další informace o pořadí middlewaru naleznete v tématu ASP.NET Core Jiné .
var supportedCultures = new[] { "en-US", "fr" };
var localizationOptions = new RequestLocalizationOptions().SetDefaultCulture(supportedCultures[0])
.AddSupportedCultures(supportedCultures)
.AddSupportedUICultures(supportedCultures);
app.UseRequestLocalization(localizationOptions);
Pokud chcete zobrazit komentáře ke kódu přeložené do jiných jazyků než angličtiny, dejte nám vědět v tomto problému diskuze na GitHubu.
UseRequestLocalization Inicializuje RequestLocalizationOptions objekt. Při každém požadavku se vypíše seznam RequestCultureProvider ve RequestLocalizationOptions výčtu a první zprostředkovatel, který dokáže úspěšně určit jazykovou verzi žádosti. Výchozí zprostředkovatelé přicházejí z RequestLocalizationOptions třídy:
QueryStringRequestCultureProviderCookieRequestCultureProviderAcceptLanguageHeaderRequestCultureProvider
Výchozí seznam bude z nejpřesnější, aby byl nejméně specifický. Později v článku se dozvíte, jak můžete změnit pořadí a dokonce přidat vlastního poskytovatele jazykové verze. Pokud žádný z poskytovatelů nemůže určit jazykovou verzi žádosti, DefaultRequestCulture je použita.
QueryStringRequestCultureProvider
Některé aplikace budou k nastavení použít řetězec dotazu CultureInfo . Pro aplikace, které používají cookie přístup k hlavičce nebo Accept-Language, je přidání řetězce dotazu na adresu URL užitečné pro ladění a testování kódu. Ve výchozím nastavení QueryStringRequestCultureProvider je jako první poskytovatel lokalizace v RequestCultureProvider seznamu zaregistrován. Předáte parametry řetězce dotazu culture a ui-culture . Následující příklad nastaví konkrétní jazykovou verzi (jazyk a oblast) na španělština/Mexiko:
http://localhost:5000/?culture=es-MX&ui-culture=es-MX
Pokud předáte pouze jeden z těchto dvou ( culture nebo ui-culture ), zprostředkovatel řetězce dotazu nastaví obě hodnoty pomocí toho, kterou jste předali. Například nastavení pouze jazyková verze nastaví jak Culture a UICulture :
http://localhost:5000/?culture=es-MX
CookieRequestCultureProvider
produkční aplikace často poskytují mechanismus pro nastavení jazykové verze s ASP.NET Coreovou kulturou cookie . Použijte MakeCookieValue metodu k vytvoření cookie .
CookieRequestCultureProvider DefaultCookieName Vrátí výchozí název, který cookie slouží ke sledování informací o preferované jazykové verzi uživatele. Výchozí cookie název je .AspNetCore.Culture .
cookieFormát je c=%LANGCODE%|uic=%LANGCODE% , kde c je Culture a je například uic UICulture :
c=en-UK|uic=en-US
Pokud zadáte pouze jednu z informací o jazykové verzi a jazykovou verzi uživatelského rozhraní, zadaná jazyková verze bude použita pro informace o jazykové verzi i jazyková verze uživatelského rozhraní.
Hlavička Accept-Language HTTP
Záhlaví Accept-Language lze nastavit ve většině prohlížečů a původně bylo určeno pro určení jazyka uživatele. Toto nastavení indikuje, co je v prohlížeči nastavené na Odeslat nebo zděděné z podkladového operačního systému. Accept-Language hlavička protokolu HTTP z požadavku prohlížeče není infallible způsobem, jak zjistit preferovaný jazyk uživatele (viz Nastavení jazykových předvoleb v prohlížeči). Produkční aplikace by měla obsahovat způsob, jak může uživatel přizpůsobit svou volbu kultury.
Nastavení hlavičky protokolu HTTP Accept-Language v IE
Z ikony ozubeného kolečka klepněte na Možnosti Internetu.
Klepněte na jazyky.

Klepněte na nastavit jazykové předvolby.
Klepněte na Přidat jazyk.
Přidejte jazyk.
Klepněte na jazyk a potom klepněte na Přesunout nahoru.
Použití vlastního zprostředkovatele
Předpokládejme, že chcete, aby vaši zákazníci mohli ukládat svůj jazyk a jazykovou verzi do databází. Můžete napsat poskytovatele a vyhledat tyto hodnoty pro uživatele. Následující kód ukazuje, jak přidat vlastního zprostředkovatele:
private const string enUSCulture = "en-US";
services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new[]
{
new CultureInfo(enUSCulture),
new CultureInfo("fr")
};
options.DefaultRequestCulture = new RequestCulture(culture: enUSCulture, uiCulture: enUSCulture);
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
options.AddInitialRequestCultureProvider(new CustomRequestCultureProvider(async context =>
{
// My custom request culture logic
return new ProviderCultureResult("en");
}));
});
Použijte RequestLocalizationOptions k přidání nebo odebrání poskytovatelů lokalizace.
Programové nastavení kultury
tento ukázkový projekt Localization. StarterWeb v GitHub obsahuje uživatelské rozhraní pro nastavení Culture . Soubor views/Shared/_SelectLanguagePartial. cshtml umožňuje vybrat jazykovou verzi ze seznamu podporovaných jazykových verzí:
@using Microsoft.AspNetCore.Builder
@using Microsoft.AspNetCore.Http.Features
@using Microsoft.AspNetCore.Localization
@using Microsoft.AspNetCore.Mvc.Localization
@using Microsoft.Extensions.Options
@inject IViewLocalizer Localizer
@inject IOptions<RequestLocalizationOptions> LocOptions
@{
var requestCulture = Context.Features.Get<IRequestCultureFeature>();
var cultureItems = LocOptions.Value.SupportedUICultures
.Select(c => new SelectListItem { Value = c.Name, Text = c.DisplayName })
.ToList();
var returnUrl = string.IsNullOrEmpty(Context.Request.Path) ? "~/" : $"~{Context.Request.Path.Value}";
}
<div title="@Localizer["Request culture provider:"] @requestCulture?.Provider?.GetType().Name">
<form id="selectLanguage" asp-controller="Home"
asp-action="SetLanguage" asp-route-returnUrl="@returnUrl"
method="post" class="form-horizontal" role="form">
<label asp-for="@requestCulture.RequestCulture.UICulture.Name">@Localizer["Language:"]</label> <select name="culture"
onchange="this.form.submit();"
asp-for="@requestCulture.RequestCulture.UICulture.Name" asp-items="cultureItems">
</select>
</form>
</div>
Soubor views/Shared/_SelectLanguagePartial. cshtml se přidá do footer oddílu souboru rozložení, takže bude k dispozici pro všechna zobrazení:
<div class="container body-content" style="margin-top:60px">
@RenderBody()
<hr>
<footer>
<div class="row">
<div class="col-md-6">
<p>© @System.DateTime.Now.Year - Localization</p>
</div>
<div class="col-md-6 text-right">
@await Html.PartialAsync("_SelectLanguagePartial")
</div>
</div>
</footer>
</div>
SetLanguageMetoda nastaví jazykovou verzi cookie .
[HttpPost]
public IActionResult SetLanguage(string culture, string returnUrl)
{
Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) }
);
return LocalRedirect(returnUrl);
}
Nemůžete připojit _SelectLanguagePartial. cshtml k ukázkovému kódu pro tento projekt. projekt Localization. StarterWeb v GitHub obsahuje kód pro tok RequestLocalizationOptions do Razor částečného toku prostřednictvím kontejneru pro vkládání závislostí .
Vazba modelu data směrování a řetězce dotazů
Podívejte se na téma chování globalizace modelu vazby dat trasy a řetězce dotazu.
Výrazy globalizace a lokalizace
Proces lokalizace vaší aplikace také vyžaduje základní znalosti relevantních znakových sad, které se běžně používají při vývoji moderního softwaru, a porozumění problémům, které s nimi souvisejí. I když všechny počítače ukládají text jako čísla (kódy), různé systémy ukládají stejný text s různými čísly. Proces lokalizace odkazuje na překlad uživatelského rozhraní aplikace (UI) pro konkrétní jazykovou verzi nebo národní prostředí.
Lokalizace je přechodný proces pro ověření, že globální aplikace je připravená na lokalizaci.
Formát RFC 4646 pro název jazykové verze je <languagecode2>-<country/regioncode2> , kde <languagecode2> je kód jazyka a <country/regioncode2> je kód subkultury. Například es-CL pro španělštinu (Chile), en-US pro angličtinu (USA) a en-AU pro angličtinu (Austrálie). RFC 4646 je kombinací kódu kultury ISO 639 2 s malým písmenem, který je přidružený k jazyku, a kódu subkultury na velká písmena ISO 3166 2, který je přidružený k zemi nebo oblasti. Další informace naleznete v tématu System.Globalization.CultureInfo.
Mezinárodní využití se často zkracuje na "I18N". Zkratka používá první a poslední písmena a počet písmen mezi nimi, takže 18 představuje počet písmen mezi první I a poslední znak "N". Totéž platí pro globalizaci (G11N) a lokalizaci (L10N).
Uvedenými
- Globalizace (G11N): proces vytvoření aplikace, která podporuje různé jazyky a oblasti.
- Lokalizace (L10N): proces přizpůsobení aplikace pro daný jazyk a oblast.
- Mezinárodní (I18N): popisuje globalizaci a lokalizaci.
- Jazyková verze: Jedná se o jazyk a volitelně i oblast.
- Neutrální jazyková verze: jazyková verze, která má zadaný jazyk, ale ne oblast. (například "en", "ES")
- Specifická jazyková verze: jazyková verze, která má zadaný jazyk a oblast. (například "en-US", "en-GB", "ES-CL")
- Nadřazená jazyková verze: neutrální jazyková verze, která obsahuje konkrétní jazykovou verzi. (například "en" je nadřazená jazyková verze "en-US" a "en-GB")
- Národní prostředí: národní prostředí je stejné jako jazyková verze.
Poznámka
Je možné, že nebudete moci zadat desítkové čárky do polí typu Decimal. Aby bylo možné podporovat ověřování jQuery pro jiné než anglické národní prostředí, které používá čárku (",") pro desetinnou čárku a formáty neUS-Englishho data, je nutné provést kroky k globalizaci aplikace. Pokyny k přidání desetinné čárky najdete v tomto problému v githubu 4076 .
Poznámka
Před ASP.NET Core 3.0 zapište jeden protokol typu pro každý požadavek, pokud požadovaná jazyková verze LogLevel.Warning není podporována. Protokolováním LogLevel.Warning jednoho na požadavek můžete vytvořit velké soubory protokolu s redundantními informacemi. Toto chování se ve ASP.NET 3.0 změnilo. Zapíše RequestLocalizationMiddleware protokol typu LogLevel.Debug , který zmenšuje velikost produkčních protokolů.