ASP.NET Core Blazor globalizace a lokalizace

Razor komponenty mohou vykreslovat globální a lokalizovaný obsah uživatelům v různých jazykových verzích a jazycích. Pro globalizaci Blazor poskytuje formát čísla a data. Pro lokalizaci Blazor vykreslí obsah pomocí systému prostředků .NET.

podporuje se omezená sada funkcí lokalizace ASP.NET Core:

✔️ IStringLocalizer a IStringLocalizer<T> jsou podporované v Blazor aplikacích.

IHtmlLocalizer IViewLocalizer lokalizace datových poznámek , a jsou ASP.NET Core funkcemi MVC a nejsou v Blazor aplikacích podporovány.

Tento článek popisuje, jak používat Blazor funkce globalizace a lokalizace v závislosti na:

  • Accept-Language Hlavička, která je nastavena prohlížečem v závislosti na jazykových preferencích uživatele v nastavení prohlížeče.
  • Jazyková verze nastavená aplikací nezávisí na hodnotě Accept-Language záhlaví. Nastavení může být statické pro všechny uživatele nebo dynamická v závislosti na logice aplikace. Pokud je nastavení založené na předvolbě uživatele, nastavení se obvykle ukládá pro opětovné načtení při budoucích návštěvách.

Další obecné informace najdete v tématu Globalizace a lokalizace v ASP.NET Core .

Poznámka

Při práci s koncepty globalizace a lokalizace se často používají pojmy jazyk a jazyková verze .

V tomto článku jazyk odkazuje na výběry provedené uživatelem v nastavení prohlížeče. Výběr jazyka uživatele jsou odesílány v rámci požadavků prohlížeče v Accept-Language hlavičce. Nastavení prohlížeče obvykle používá slovo "Language" v uživatelském rozhraní.

Jazyková verze se týká členů rozhraní .NET a Blazor rozhraní API. Například požadavek uživatele může zahrnout Accept-Language hlavičku určující jazyk z perspektivy uživatele, ale aplikace nakonec nastaví CurrentCulture vlastnost ("Culture") z jazyka, který si uživatel požadoval. Rozhraní API obvykle používá slovo "Culture" v názvech členů.

Globalizace

@bindDirektiva Attribute používá formáty a analyzuje hodnoty pro zobrazení na základě prvního preferovaného jazyka uživatele, který aplikace podporuje. @bind podporuje @bind:culture parametr System.Globalization.CultureInfo pro zajištění analýzy a formátování hodnoty.

K aktuální jazykové verzi je možné přistupovat z System.Globalization.CultureInfo.CurrentCulture Vlastnosti.

CultureInfo.InvariantCulture se používá pro následující typy polí ( <input type="{TYPE}" /> , kde {TYPE} zástupný symbol je typ):

  • date
  • number

Předchozí typy polí:

  • Se zobrazují pomocí příslušných pravidel formátování založených na prohlížeči.
  • Text s volným formulářem nemůže obsahovat.
  • Poskytněte charakteristiky interakce s uživatelem na základě implementace prohlížeče.

Při použití date number typů polí a, zadání jazykové verze se @bind:culture nedoporučuje, protože Blazor poskytuje integrovanou podporu pro vykreslování hodnot v aktuální jazykové verzi.

Následující typy polí mají specifické požadavky na formátování a aktuálně nejsou podporovány, Blazor protože nejsou podporovány ve všech hlavních prohlížečích:

  • datetime-local
  • month
  • week

Aktuální podporu prohlížeče pro předchozí typy najdete v tématu lze použít.

Invariantní globalizace

Pokud aplikace nevyžaduje lokalizaci, nakonfigurujte aplikaci tak, aby podporovala invariantní jazykovou verzi, která je obecně založena na USA English ( en-US ). Nastavte InvariantGlobalization vlastnost na true soubor projektu aplikace ( .csproj ):

<PropertyGroup>
  <InvariantGlobalization>true</InvariantGlobalization>
</PropertyGroup>

Případně můžete nakonfigurovat invariantní globalizaci následujícími přístupy:

  • V runtimeconfig.json:

    {
      "runtimeOptions": {
        "configProperties": {
          "System.Globalization.Invariant": true
        }
      }
    }
    
  • S proměnnou prostředí:

    • Klíč: DOTNET_SYSTEM_GLOBALIZATION_INVARIANT
    • Hodnota: true nebo 1

Další informace naleznete v tématu Možnosti konfigurace modulu runtime pro globalizaci (dokumentace rozhraní .NET).

Ukázková komponenta

Následující CultureExample1 komponentu lze použít k předvedení Blazor konceptů globalizace a lokalizace, na které se vztahuje tento článek.

Pages/CultureExample1.razor:

@page "/culture-example-1"
@using System.Globalization

<h1>Culture Example 1</h1>

<p>
    <b>CurrentCulture</b>: @CultureInfo.CurrentCulture
</p>

<h2>Rendered values</h2>

<ul>
    <li><b>Date</b>: @dt</li>
    <li><b>Number</b>: @number.ToString("N2")</li>
</ul>

<h2><code>&lt;input&gt;</code> elements that don't set a <code>type</code></h2>

<p>
    The following <code>&lt;input&gt;</code> elements use
    <code>CultureInfo.CurrentCulture</code>.
</p>

<ul>
    <li><label><b>Date:</b> <input @bind="dt" /></label></li>
    <li><label><b>Number:</b> <input @bind="number" /></label></li>
</ul>

<h2><code>&lt;input&gt;</code> elements that set a <code>type</code></h2>

<p>
    The following <code>&lt;input&gt;</code> elements use
    <code>CultureInfo.InvariantCulture</code>.
</p>

<ul>
    <li><label><b>Date:</b> <input type="date" @bind="dt" /></label></li>
    <li><label><b>Number:</b> <input type="number" @bind="number" /></label></li>
</ul>

@code {
    private DateTime dt = DateTime.Now;
    private double number = 1999.69;
}

Formát číselného řetězce ( N2 ) v předchozím příkladu ( .ToString("N2") ) je standardní specifikátor číselného formátu .NET. N2Formát je podporován pro všechny číselné typy, zahrnuje oddělovač skupin a vykresluje až dvě desetinná místa.

Přidejte položku seznamu do prvku navigační nabídky <ul> v Shared/NavMenu.razor pro CultureExample1 komponentu:

<li class="nav-item px-3">
    <NavLink class="nav-link" href="culture-example-1">
        <span class="oi oi-list-rich" aria-hidden="true"></span> Culture Example 1
    </NavLink>
</li>

Dynamicky nastavit jazykovou verzi z Accept-Language hlavičky

Accept-Language Záhlaví je nastaveno prohlížečem a řídí se v nastavení prohlížeče v jazykových preferencích uživatele. V nastavení prohlížeče nastaví uživatel jeden nebo více preferovaných jazyků v pořadí podle priority. Pořadí předvoleb se používá v prohlížeči k nastavení hodnot kvality ( q 0-1) pro každý jazyk v hlavičce. Následující příklad určuje USA angličtinu, angličtinu a Chilská španělštinu s předvolbou pro USA angličtinu nebo angličtinu:

Accept-Language: en-US, EN; q = 0.9, ES-CL; q = 0,8

Jazyková verze aplikace je nastavená tak, aby odpovídala prvnímu požadovanému jazyku, který odpovídá podporované jazykové verzi aplikace.

Nastavte BlazorWebAssemblyLoadAllGlobalizationData vlastnost na true soubor projektu aplikace ( .csproj ):

<PropertyGroup>
  <BlazorWebAssemblyLoadAllGlobalizationData>true</BlazorWebAssemblyLoadAllGlobalizationData>
</PropertyGroup>

Blazor Server aplikace jsou lokalizovány pomocí middleware lokalizace. Přidejte do aplikace lokalizační služby pomocí AddLocalization .

V Program.cs:

builder.Services.AddLocalization();

Určete podporované jazykové verze aplikace Program.cs hned po přidání služby Routing middleware do kanálu zpracování. Následující příklad konfiguruje podporované jazykové verze pro USA Chilská English a španělština:

app.UseRequestLocalization(new RequestLocalizationOptions()
    .AddSupportedCultures(new[] { "en-US", "es-CL" })
    .AddSupportedUICultures(new[] { "en-US", "es-CL" }));

Informace o řazení middlewaru pro lokalizaci v kanálu middlewaru pro najdete v Program.cs tématu ASP.NET Core Jiné .

Pomocí CultureExample1 komponenty uvedené v části demonstrační komponenta můžete prozkoumat, jak globalizace funguje. Vydejte žádost s USA angličtinu ( en-US ). V nastavení jazyka prohlížeče přepněte na Chilská španělština ( es-CL ). Vyžádejte si webovou stránku znovu.

Poznámka

Některé prohlížeče vynutí použití výchozího nastavení jazyka pro obě žádosti a vlastní nastavení uživatelského rozhraní v prohlížeči. To může změnit jazyk zpátky na takový, který je obtížné pochopit, protože všechny obrazovky uživatelského rozhraní nastavení mohou končit v jazyce, který nelze číst. Prohlížeč, jako je Opera , je vhodný pro testování, protože umožňuje nastavit výchozí jazyk pro požadavky na webovou stránku, ale ponechat nastavení prohlížeče v jazyce.

Pokud je jazyková verze USA English ( en-US ), vykreslená komponenta používá formátování data za měsíc a den ( 6/7 ), 12 hodinový čas ( AM / PM ) a oddělovače čárkami v číslech s tečkou pro hodnotu typu Decimal ( 1,999.69 ):

  • Datum: 6/7/2021 6:45:22 DOP.
  • Číslo: 1 999,69

Pokud je jazyková verze Chilská španělština ( es-CL ), vykreslená komponenta používá formátování data a 7/6 času (), 24hodinový čas a oddělovače v číslech se čárkou pro desítkovou hodnotu ( 1.999,69 ):

  • Datum: 7/6/2021 6:49:38
  • Číslo: číslo 1,999, 69

Staticky nastavit jazykovou verzi

Nastavte BlazorWebAssemblyLoadAllGlobalizationData vlastnost na true soubor projektu aplikace ( .csproj ):

<PropertyGroup>
  <BlazorWebAssemblyLoadAllGlobalizationData>true</BlazorWebAssemblyLoadAllGlobalizationData>
</PropertyGroup>

Jazyková verze aplikace může být nastavena v JavaScriptu při Blazor spuštění s applicationCulture Blazor možností Start. Následující příklad nakonfiguruje aplikaci tak, aby se spouštěla pomocí USA en-US jazykové verze English ().

  • V nástroji wwwroot/index.html Zabraňte Blazor automatickému spuštění autostart="false" přidáním Blazor značky k <script> :

    <script src="_framework/blazor.webassembly.js" autostart="false"></script>
    
  • Přidejte následující <script> blok po Blazor <script> značce a před uzavírací </body> značku:

    <script>
      Blazor.start({
        applicationCulture: 'en-US'
      });
    </script>
    

Hodnota pro applicationCulture musí odpovídat formátu označení jazyka BCP-47. Další informace o Blazor spuštění najdete v tématu ASP.NET Core Blazor Úvod .

Alternativou k nastavení Blazor počáteční možnosti jazykové verze je nastavení jazykové verze v kódu jazyka C#. Nastavte CultureInfo.DefaultThreadCurrentCulture a CultureInfo.DefaultThreadCurrentUICulture v Program.cs .

Přidat System.Globalization obor názvů do Program.cs :

using System.Globalization;

Přidejte nastavení jazykové verze před řádek, který sestaví a spustí WebAssemblyHostBuilder ( await builder.Build().RunAsync(); ):

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US");
CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("en-US");

Blazor Server aplikace jsou lokalizovány pomocí middleware lokalizace. Přidejte do aplikace lokalizační služby pomocí AddLocalization .

V Program.cs:

builder.Services.AddLocalization();

Zadejte statickou jazykovou verzi Program.cs přímo po přidání middlewaru do kanálu zpracování. Následující příklad nakonfiguruje USA angličtinu:

app.UseRequestLocalization("en-US");

Hodnota jazykové verze pro UseRequestLocalization musí odpovídat formátu označení jazyka BCP-47.

Informace o řazení middlewaru pro lokalizaci v kanálu middlewaru pro najdete v Program.cs tématu ASP.NET Core Jiné .

Pomocí CultureExample1 komponenty uvedené v části demonstrační komponenta můžete prozkoumat, jak globalizace funguje. Vydejte žádost s USA angličtinu ( en-US ). V nastavení jazyka prohlížeče přepněte na Chilská španělština ( es-CL ). Vyžádejte si webovou stránku znovu. Pokud je požadovaný jazyk Chilská španělština, jazyková verze aplikace zůstane USA angličtinu ( en-US ).

Dynamicky nastavit jazykovou verzi podle předvolby uživatele

Příklady umístění, kam může aplikace ukládat předvolby uživatele, patří do místního úložiště prohlížeče (společné v Blazor WebAssembly aplikacích), v lokalizaci cookie nebo databázi (společné v Blazor Server aplikacích) nebo v externí službě připojené k externí databázi a k ní přistupované webovým rozhraním API. Následující příklad ukazuje, jak používat místní úložiště prohlížeče.

Přidejte odkaz na balíček pro Microsoft.Extensions.Localization balíček do souboru projektu aplikace ( .csproj ):

<PackageReference Include="Microsoft.Extensions.Localization" Version="{VERSION}" />

{VERSION}Zástupný symbol v předchozím odkazu na balíček je verze balíčku.

Nastavte BlazorWebAssemblyLoadAllGlobalizationData vlastnost na hodnotu true v souboru projektu:

<PropertyGroup>
  <BlazorWebAssemblyLoadAllGlobalizationData>true</BlazorWebAssemblyLoadAllGlobalizationData>
</PropertyGroup>

Jazyková verze aplikace v Blazor WebAssembly aplikaci je nastavená pomocí Blazor rozhraní API rozhraní API. Výběr jazykové verze uživatele lze zachovat v místním úložišti prohlížeče.

V wwwroot/index.html souboru po Blazor <script> značce a před uzavírací </body> značkou poskytněte funkce js, aby získaly a nastavily výběr jazykové verze uživatele v místním úložišti prohlížeče:

<script>
  window.blazorCulture = {
    get: () => window.localStorage['BlazorCulture'],
    set: (value) => window.localStorage['BlazorCulture'] = value
  };
</script>

Poznámka

Předchozí příklad zneznečišťující klient s globálními metodami. Lepší přístup v produkčních aplikacích naleznete v tématu izolace JavaScriptu v modulech JavaScript.

Příklad:

export function getBlazorCulture() {
  return window.localStorage['BlazorCulture'];
};
export function setBlazorCulture(value) {
  window.localStorage['BlazorCulture'] = value;
};

Použijete-li předchozí funkce, změňte volání Interop JS v tomto oddílu z blazorCulture.get na getBlazorCulture a z blazorCulture.set na setBlazorCulture .

Přidejte obory názvů pro System.Globalization a Microsoft.JSInterop do horní části Program.cs :

using System.Globalization;
using Microsoft.JSInterop;

Odebrat následující řádek z Program.cs :

- await builder.Build().RunAsync();

Nahraďte předchozí řádek následujícím kódem. Kód přidá Blazor službu lokalizace do kolekce služeb aplikace s AddLocalization a pomocí zprostředkovatele komunikace js volá js a načte výběr jazykové verze uživatele z místního úložiště. Pokud místní úložiště neobsahuje jazykovou verzi pro uživatele, kód nastaví výchozí hodnotu USA English ( en-US ).

builder.Services.AddLocalization();

var host = builder.Build();

CultureInfo culture;
var js = host.Services.GetRequiredService<IJSRuntime>();
var result = await js.InvokeAsync<string>("blazorCulture.get");

if (result != null)
{
    culture = new CultureInfo(result);
}
else
{
    culture = new CultureInfo("en-US");
    await js.InvokeVoidAsync("blazorCulture.set", "en-US");
}

CultureInfo.DefaultThreadCurrentCulture = culture;
CultureInfo.DefaultThreadCurrentUICulture = culture;

await host.RunAsync();

Následující CultureSelector Komponenta ukazuje, jak nastavit výběr jazykové verze uživatele na místní úložiště prohlížeče přes interoperabilitu js. Komponenta je umístěna do Shared složky pro použití v rámci aplikace.

Shared/CultureSelector.razor:

@using  System.Globalization
@inject IJSRuntime JSRuntime
@inject NavigationManager Nav

<p>
    <label>
        Select your locale:
        <select @bind="Culture">
            @foreach (var culture in supportedCultures)
            {
                <option value="@culture">@culture.DisplayName</option>
            }
        </select>
    </label>
</p>

@code
{
    private CultureInfo[] supportedCultures = new[]
    {
        new CultureInfo("en-US"),
        new CultureInfo("es-CL"),
    };

    private CultureInfo Culture
    {
        get => CultureInfo.CurrentCulture;
        set
        {
            if (CultureInfo.CurrentCulture != value)
            {
                var js = (IJSInProcessRuntime)JSRuntime;
                js.InvokeVoid("blazorCulture.set", value.Name);

                Nav.NavigateTo(Nav.Uri, forceLoad: true);
            }
        }
    }
}

Uvnitř uzavírací </div> značky <div class="main"> elementu v Shared/MainLayout.razor přidejte CultureSelector komponentu:

<div class="bottom-row px-4">
    <CultureSelector />
</div>

Příklady umístění, kam může aplikace ukládat předvolby uživatele, patří do místního úložiště prohlížeče (společné v Blazor WebAssembly aplikacích), v lokalizaci cookie nebo databázi (společné v Blazor Server aplikacích) nebo v externí službě připojené k externí databázi a k ní přistupované webovým rozhraním API. Následující příklad ukazuje, jak použít lokalizaci cookie .

Přidejte odkaz na balíček pro Microsoft.Extensions.Localization balíček do souboru projektu aplikace ( .csproj ):

<ItemGroup>
  <PackageReference Include="Microsoft.Extensions.Localization" Version="{VERSION}" />
</ItemGroup>

{VERSION}Zástupný symbol v předchozím odkazu na balíček je verze balíčku.

Blazor Server aplikace jsou lokalizovány pomocí middleware lokalizace. Přidejte do aplikace lokalizační služby pomocí AddLocalization .

V Program.cs:

builder.Services.AddLocalization();

Nastavte výchozí a podporované jazykové verze aplikace pomocí RequestLocalizationOptions.SetDefaultCulture .

Program.csIhned po přidání middlewaru do kanálu zpracování:

var supportedCultures = new[] { "en-US", "es-CL" };
var localizationOptions = new RequestLocalizationOptions()
    .SetDefaultCulture(supportedCultures[0])
    .AddSupportedCultures(supportedCultures)
    .AddSupportedUICultures(supportedCultures);

app.UseRequestLocalization(localizationOptions);

Informace o řazení middlewaru pro lokalizaci v kanálu middlewaru pro najdete v Program.cs tématu ASP.NET Core Jiné .

Následující příklad ukazuje, jak nastavit aktuální jazykovou verzi v cookie , kterou lze přečíst pomocí middleware Localization.

Do horní části souboru přidejte následující obory názvů Pages/_Layout.cshtml :

@using System.Globalization
@using Microsoft.AspNetCore.Localization

Hned za úvodní <body> značku Pages/_Layout.cshtml přidejte následující Razor výraz:

@{
    this.HttpContext.Response.Cookies.Append(
        CookieRequestCultureProvider.DefaultCookieName,
        CookieRequestCultureProvider.MakeCookieValue(
            new RequestCulture(
                CultureInfo.CurrentCulture,
                CultureInfo.CurrentUICulture)));
}

Informace o řazení middlewaru pro lokalizaci v kanálu middlewaru pro najdete v Program.cs tématu ASP.NET Core Jiné .

Pokud aplikace není nakonfigurovaná na zpracování akcí kontroleru:

  • Přidat MVC Services voláním AddControllers na kolekci služeb v Program.cs :

    builder.Services.AddControllers();
    
  • Přidejte směrování koncových bodů řadiče do služby Program.cs voláním MapControllers IEndpointRouteBuilder :

    app.MapControllers();
    

    Následující příklad ukazuje volání UseEndpoints po přidání řádku:

    app.MapControllers();
    app.MapBlazorHub();
    app.MapFallbackToPage("/_Host");
    

Chcete-li poskytnout uživatelské rozhraní, které uživateli umožní vybrat jazykovou verzi, použijte k lokalizaci přístup založený na přesměrování cookie . Aplikace zachovává vybranou jazykovou verzi uživatele prostřednictvím přesměrování na kontroler. Řadič Nastaví vybranou jazykovou verzi uživatele na cookie a přesměruje uživatele zpět na původní identifikátor URI. Proces se podobá tomu, co se stane ve webové aplikaci, když se uživatel pokusí o přístup k zabezpečenému prostředku, kde je uživatel přesměrován na přihlašovací stránku a pak se přesměruje zpátky na původní prostředek.

Controllers/CultureController.cs:

using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.Mvc;

[Route("[controller]/[action]")]
public class CultureController : Controller
{
    public IActionResult Set(string culture, string redirectUri)
    {
        if (culture != null)
        {
            HttpContext.Response.Cookies.Append(
                CookieRequestCultureProvider.DefaultCookieName,
                CookieRequestCultureProvider.MakeCookieValue(
                    new RequestCulture(culture, culture)));
        }

        return LocalRedirect(redirectUri);
    }
}

Upozornění

Pomocí LocalRedirect výsledku akce zabráníte otevírání útoků přes přesměrování. Další informace naleznete v tématu Prevence útoků s otevřeným přesměrováním ASP.NET Core.

Následující CultureSelector Komponenta ukazuje, jak provést počáteční přesměrování, když uživatel vybere jazykovou verzi. Komponenta je umístěna do Shared složky pro použití v rámci aplikace.

Shared/CultureSelector.razor:

@using  System.Globalization
@inject NavigationManager Nav

<p>
    <label>
        Select your locale:
        <select @bind="Culture">
            @foreach (var culture in supportedCultures)
            {
                <option value="@culture">@culture.DisplayName</option>
            }
        </select>
    </label>
</p>

@code
{
    private CultureInfo[] supportedCultures = new[]
    {
        new CultureInfo("en-US"),
        new CultureInfo("es-CL"),
    };

    protected override void OnInitialized()
    {
        Culture = CultureInfo.CurrentCulture;
    }

    private CultureInfo Culture
    {
        get => CultureInfo.CurrentCulture;
        set
        {
            if (CultureInfo.CurrentCulture != value)
            {
                var uri = new Uri(Nav.Uri)
                    .GetComponents(UriComponents.PathAndQuery, UriFormat.Unescaped);
                var cultureEscaped = Uri.EscapeDataString(value.Name);
                var uriEscaped = Uri.EscapeDataString(uri);

                Nav.NavigateTo(
                    $"Culture/Set?culture={cultureEscaped}&redirectUri={uriEscaped}",
                    forceLoad: true);
            }
        }
    }
}

Uvnitř uzavírací </div> značky <div class="main"> elementu v Shared/MainLayout.razor přidejte CultureSelector komponentu:

<div class="bottom-row px-4">
    <CultureSelector />
</div>

Pomocí CultureExample1 komponenty uvedené v části demonstrační komponenta můžete zkoumat, jak funguje předchozí příklad.

Lokalizace

Pokud aplikace ještě nepodporuje výběr jazykové verze v části dynamicky nastavit jazykovou verzi podle preferencí uživatele v tomto článku, přidejte Microsoft.Extensions.Localization do souboru projektu aplikace odkaz na balíček ( .csproj ):

<PackageReference Include="Microsoft.Extensions.Localization" Version="{VERSION}" />

{VERSION}Zástupný symbol v předchozím odkazu na balíček je verze balíčku.

Nastavte BlazorWebAssemblyLoadAllGlobalizationData vlastnost na true soubor projektu aplikace ( .csproj ):

<PropertyGroup>
  <BlazorWebAssemblyLoadAllGlobalizationData>true</BlazorWebAssemblyLoadAllGlobalizationData>
</PropertyGroup>

V nástroji Program.cs přidejte obor názvů do System.Globalization horní části souboru:

using System.Globalization;

BlazorSlužba lokalizace se přidá do kolekce služeb aplikace s nástrojem AddLocalization v Program.cs :

builder.Services.AddLocalization();

K nastavení jazykové verze aplikace použijte middleware lokalizace .

Pokud aplikace ještě nepodporuje výběr jazykové verze v části dynamicky nastavovat jazyk podle preferencí uživatele v tomto článku:

  • Přidejte do aplikace lokalizační služby pomocí AddLocalization .
  • Zadejte výchozí a podporované jazykové verze aplikace v Program.cs . Následující příklad konfiguruje podporované jazykové verze pro USA English a Chilská španělština.

V Program.cs:

builder.Services.AddLocalization();

Program.csIhned po přidání middlewaru do kanálu zpracování:

var supportedCultures = new[] { "en-US", "es-CL" };
var localizationOptions = new RequestLocalizationOptions()
    .SetDefaultCulture(supportedCultures[0])
    .AddSupportedCultures(supportedCultures)
    .AddSupportedUICultures(supportedCultures);

app.UseRequestLocalization(localizationOptions);

Informace o řazení middlewaru pro lokalizaci v kanálu middlewaru pro najdete v Program.cs tématu ASP.NET Core Jiné .

Pokud by aplikace měla lokalizovat prostředky na základě ukládání nastavení jazykové verze uživatele, použijte lokalizaci kultury cookie . Použití nástroje cookie zajistí, že připojení protokolu WebSocket dokáže správně rozšířit jazykovou verzi. Pokud jsou schémata lokalizací založena na cestě URL nebo řetězci dotazu, nemusí být schopná pracovat s objekty WebSockets, takže nepůjde zachovat jazykovou verzi. Proto je doporučený přístup použít lokalizovanou jazykovou verzi cookie . V části dynamické nastavení jazykové verze podle předvoleb uživatele v tomto článku se zobrazí vzorový Razor výraz pro Pages/_Layout.cshtml soubor, který uchovává výběr jazykové verze uživatele.

Příklad lokalizovaných prostředků v této části funguje s předchozími příklady v tomto článku, kde jsou podporované jazykové verze aplikace English ( en ) jako výchozí národní prostředí a španělština ( es ) jako alternativní národní prostředí určené uživatelem nebo v prohlížeči.

Vytvořte prostředky pro každé národní prostředí. V následujícím příkladu jsou vytvořeny prostředky pro výchozí Greeting řetězec:

  • Angličtina: Hello, World!
  • Španělština ( es ): ¡Hola, Mundo!

Poznámka

následující soubor prostředků lze přidat do Visual Studio tak, že kliknete pravým tlačítkem myši na Pages složku projektu a vyberete přidat > nový > soubor prostředků položek. Pojmenujte soubor CultureExample2.resx. Po zobrazení editoru zadejte data pro novou položku. Nastavte název Greeting a hodnotu na Hello, World! . Soubor uložte.

Pages/CultureExample2.resx:

<?xml version="1.0" encoding="utf-8"?>
<root>
  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
    <xsd:element name="root" msdata:IsDataSet="true">
      <xsd:complexType>
        <xsd:choice maxOccurs="unbounded">
          <xsd:element name="metadata">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" />
              </xsd:sequence>
              <xsd:attribute name="name" use="required" type="xsd:string" />
              <xsd:attribute name="type" type="xsd:string" />
              <xsd:attribute name="mimetype" type="xsd:string" />
              <xsd:attribute ref="xml:space" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="assembly">
            <xsd:complexType>
              <xsd:attribute name="alias" type="xsd:string" />
              <xsd:attribute name="name" type="xsd:string" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="data">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
              <xsd:attribute ref="xml:space" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="resheader">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required" />
            </xsd:complexType>
          </xsd:element>
        </xsd:choice>
      </xsd:complexType>
    </xsd:element>
  </xsd:schema>
  <resheader name="resmimetype">
    <value>text/microsoft-resx</value>
  </resheader>
  <resheader name="version">
    <value>2.0</value>
  </resheader>
  <resheader name="reader">
    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  </resheader>
  <resheader name="writer">
    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  </resheader>
  <data name="Greeting" xml:space="preserve">
    <value>Hello, World!</value>
  </data>
</root>

Poznámka

následující soubor prostředků lze přidat do Visual Studio tak, že kliknete pravým tlačítkem myši na Pages složku projektu a vyberete přidat > nový > soubor prostředků položek. Pojmenujte soubor CultureExample2.es.resx. Po zobrazení editoru zadejte data pro novou položku. Nastavte název Greeting a hodnotu na ¡Hola, Mundo! . Soubor uložte.

Pages/CultureExample2.es.resx:

<?xml version="1.0" encoding="utf-8"?>
<root>
  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
    <xsd:element name="root" msdata:IsDataSet="true">
      <xsd:complexType>
        <xsd:choice maxOccurs="unbounded">
          <xsd:element name="metadata">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" />
              </xsd:sequence>
              <xsd:attribute name="name" use="required" type="xsd:string" />
              <xsd:attribute name="type" type="xsd:string" />
              <xsd:attribute name="mimetype" type="xsd:string" />
              <xsd:attribute ref="xml:space" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="assembly">
            <xsd:complexType>
              <xsd:attribute name="alias" type="xsd:string" />
              <xsd:attribute name="name" type="xsd:string" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="data">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
              <xsd:attribute ref="xml:space" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="resheader">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required" />
            </xsd:complexType>
          </xsd:element>
        </xsd:choice>
      </xsd:complexType>
    </xsd:element>
  </xsd:schema>
  <resheader name="resmimetype">
    <value>text/microsoft-resx</value>
  </resheader>
  <resheader name="version">
    <value>2.0</value>
  </resheader>
  <resheader name="reader">
    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  </resheader>
  <resheader name="writer">
    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  </resheader>
  <data name="Greeting" xml:space="preserve">
    <value>¡Hola, Mundo!</value>
  </data>
</root>

Následující komponenta ukazuje použití lokalizovaného Greeting řetězce s IStringLocalizer<T> .

Přidejte obor názvů Microsoft.Extensions.Localization do _Imports.razor souboru aplikace:

@using Microsoft.Extensions.Localization

Pages/CultureExample2.razor:

@page "/culture-example-2"
@using System.Globalization
@inject IStringLocalizer<CultureExample2> Loc

<h1>Culture Example 2</h1>

<p>
    <b>CurrentCulture</b>: @CultureInfo.CurrentCulture
</p>

<h2>Greeting</h2>

<p>
    @Loc["Greeting"]
</p>

<p>
    @greeting
</p>

@code {
    private string greeting;

    protected override void OnInitialized()
    {
        greeting = Loc["Greeting"];
    }
}

Přidejte položku seznamu do prvku navigační nabídky <ul> v Shared/NavMenu.razor pro CultureExample2 komponentu:

<li class="nav-item px-3">
    <NavLink class="nav-link" href="culture-example-2">
        <span class="oi oi-list-rich" aria-hidden="true"></span> Culture Example 2
    </NavLink>
</li>

Další zdroje informací

Razor komponenty mohou vykreslovat globální a lokalizovaný obsah uživatelům v různých jazykových verzích a jazycích. Pro globalizaci Blazor poskytuje formát čísla a data. Pro lokalizaci Blazor vykreslí obsah pomocí systému prostředků .NET.

podporuje se omezená sada funkcí lokalizace ASP.NET Core:

✔️ IStringLocalizer a IStringLocalizer<T> jsou podporované v Blazor aplikacích.

IHtmlLocalizer IViewLocalizer lokalizace datových poznámek , a jsou ASP.NET Core funkcemi MVC a nejsou v Blazor aplikacích podporovány.

Tento článek popisuje, jak používat Blazor funkce globalizace a lokalizace v závislosti na:

  • Accept-Language Hlavička, která je nastavena prohlížečem v závislosti na jazykových preferencích uživatele v nastavení prohlížeče.
  • Jazyková verze nastavená aplikací nezávisí na hodnotě Accept-Language záhlaví. Nastavení může být statické pro všechny uživatele nebo dynamické na základě logiky aplikace. Pokud je nastavení založené na předvolbách uživatele, nastavení se obvykle uloží pro opětovné načtení při budoucích návštěvách.

Další obecné informace najdete v tématu Globalizace a lokalizace v ASP.NET Core .

Poznámka

Termíny jazyk a kultura se často používají zaměnitelně při řešení konceptů globalizace a lokalizace.

V tomto článku jazyk odkazuje na výběry provedené uživatelem v nastavení prohlížeče. Výběry jazyka uživatele se v požadavcích prohlížeče posílají v Accept-Language hlavičce. Nastavení prohlížeče obvykle v uživatelském rozhraní používá slovo "jazyk".

Jazyková verze se týká členů rozhraní .NET a Blazor rozhraní API. Požadavek uživatele může například obsahovat Accept-Language hlavičku určující jazyk z pohledu uživatele, ale aplikace nakonec nastaví vlastnost ("culture") z jazyka, který CurrentCulture si uživatel vyžádal. Rozhraní API obvykle v názvech členů používá slovo "culture".

Globalizace

Direktiva atributu používá formáty a analyzuje hodnoty pro zobrazení na základě prvního upřednostňovaného jazyka @bind uživatele, který aplikace podporuje. @bind podporuje @bind:culture parametr , který poskytuje System.Globalization.CultureInfo pro parsování a formátování hodnoty.

Aktuální jazyková verze je přístupná z System.Globalization.CultureInfo.CurrentCulture vlastnosti .

CultureInfo.InvariantCulture se používá pro následující typy polí ( <input type="{TYPE}" /> , kde zástupný symbol je typ {TYPE} ):

  • date
  • number

Předchozí typy polí:

  • Zobrazují se pomocí příslušných pravidel formátování založených na prohlížeči.
  • Nemůže obsahovat volný text.
  • Zadejte charakteristiky interakce uživatele na základě implementace prohlížeče.

Při použití typů polí a se určení jazykové verze pomocí nedoporučuje, protože poskytuje integrovanou podporu vykreslování hodnot date number v aktuální jazykové @bind:culture Blazor verzi.

Následující typy polí mají specifické požadavky na formátování a nejsou aktuálně podporovány aplikací , protože je nepodporují všechny Blazor hlavní prohlížeče:

  • datetime-local
  • month
  • week

Aktuální podporu prohlížečů předchozích typů najdete v tématu Můžu použít.

Invariantní globalizace

Pokud aplikace nevyžaduje lokalizaci, nakonfigurujte aplikaci tak, aby podporovala neutrální jazykovou verzi, která je obecně založená na USA angličtině ( en-US ). Nastavte InvariantGlobalization vlastnost na v souboru projektu aplikace ( true .csproj ):

<PropertyGroup>
  <InvariantGlobalization>true</InvariantGlobalization>
</PropertyGroup>

Alternativně nakonfigurujte invariantní globalizaci s následujícími přístupy:

  • V runtimeconfig.json:

    {
      "runtimeOptions": {
        "configProperties": {
          "System.Globalization.Invariant": true
        }
      }
    }
    
  • S proměnnou prostředí:

    • Klíč: DOTNET_SYSTEM_GLOBALIZATION_INVARIANT
    • Hodnota: true nebo 1

Další informace najdete v tématu Možnosti konfigurace modulu runtime pro globalizaci (dokumentace k .NET).

Demonstrační komponenta

Následující CultureExample1 komponentu lze použít k předvedení konceptů globalizace a lokalizace, Blazor na které se vztahuje tento článek.

Pages/CultureExample1.razor:

@page "/culture-example-1"
@using System.Globalization

<h1>Culture Example 1</h1>

<p>
    <b>CurrentCulture</b>: @CultureInfo.CurrentCulture
</p>

<h2>Rendered values</h2>

<ul>
    <li><b>Date</b>: @dt</li>
    <li><b>Number</b>: @number.ToString("N2")</li>
</ul>

<h2><code>&lt;input&gt;</code> elements that don't set a <code>type</code></h2>

<p>
    The following <code>&lt;input&gt;</code> elements use
    <code>CultureInfo.CurrentCulture</code>.
</p>

<ul>
    <li><label><b>Date:</b> <input @bind="dt" /></label></li>
    <li><label><b>Number:</b> <input @bind="number" /></label></li>
</ul>

<h2><code>&lt;input&gt;</code> elements that set a <code>type</code></h2>

<p>
    The following <code>&lt;input&gt;</code> elements use
    <code>CultureInfo.InvariantCulture</code>.
</p>

<ul>
    <li><label><b>Date:</b> <input type="date" @bind="dt" /></label></li>
    <li><label><b>Number:</b> <input type="number" @bind="number" /></label></li>
</ul>

@code {
    private DateTime dt = DateTime.Now;
    private double number = 1999.69;
}

Formát číselného řetězce ( ) v předchozím příkladu ( ) je standardní N2 .ToString("N2") specifikátor číselnéhoformátu .NET . Formát je podporovaný pro všechny číselné typy, zahrnuje oddělovač skupin a vykresluje se N2 až na dvě desetinná místa.

Přidejte položku seznamu do prvku navigační <ul> nabídky v souboru pro Shared/NavMenu.razor CultureExample1 komponentu:

<li class="nav-item px-3">
    <NavLink class="nav-link" href="culture-example-1">
        <span class="oi oi-list-rich" aria-hidden="true"></span> Culture Example 1
    </NavLink>
</li>

Dynamické nastavení jazykové verze z Accept-Language hlavičky

Accept-Language Hlavička se nastavuje v prohlížeči a řídí se podle jazykových předvoleb uživatele v nastavení prohlížeče. V nastavení prohlížeče uživatel nastaví jeden nebo více upřednostňovaných jazyků podle preferovaného pořadí. Pořadí předvoleb používá prohlížeč k nastavení hodnot kvality ( q , 0–1) pro každý jazyk v hlavičce. Následující příklad určuje USA angličtině, angličtině a španělštině s předvolbou pro USA angličtinu nebo angličtinu:

Accept-Language: en-US,en;q=0.9,es-CL;q=0.8

Jazyková verze aplikace se nastavuje tak, že se porovná první požadovaný jazyk, který odpovídá podporované jazykové verzi aplikace.

Nastavte BlazorWebAssemblyLoadAllGlobalizationData vlastnost na v souboru projektu aplikace ( true .csproj ):

<PropertyGroup>
  <BlazorWebAssemblyLoadAllGlobalizationData>true</BlazorWebAssemblyLoadAllGlobalizationData>
</PropertyGroup>

Blazor Server Aplikace jsou lokalizované pomocí lokalizačního middlewaru. Přidejte do aplikace lokalizační služby pomocí AddLocalization .

V Startup.ConfigureServices souboru ( Startup.cs ):

services.AddLocalization();

Určete podporované jazykové verze aplikace v ( ) ihned po přidání middlewaru směrování Startup.Configure Startup.cs do kanálu zpracování. Následující příklad konfiguruje podporované jazykové verze pro jazykovou USA angličtině a španělštině:

app.UseRequestLocalization(new RequestLocalizationOptions()
    .AddSupportedCultures(new[] { "en-US", "es-CL" })
    .AddSupportedUICultures(new[] { "en-US", "es-CL" }));

Informace o objednání middlewaru lokalizace v middlewaru kanálu najdete Startup.Configure v tématu ASP.NET Core Jiné .

Pomocí komponenty CultureExample1 zobrazené v části Demonstrační komponenta můžete prostudovat, jak globalizace funguje. Vydáte žádost s USA angličtinou ( en-US ). V nastavení jazyka prohlížeče přepněte na Španělštinu ( es-CL ). Znovu si vyžádejte webovou stránku.

Poznámka

Některé prohlížeče nutí použít výchozí nastavení jazyka pro požadavky i pro vlastní nastavení uživatelského rozhraní prohlížeče. Změna jazyka zpět na jazyk, který rozumíte, může být obtížná, protože všechny obrazovky uživatelského rozhraní, které se nastavují, můžou být v jazyce, který nemůžete přečíst. Prohlížeč, jako je Například Opera, je dobrou volbou pro testování, protože umožňuje nastavit výchozí jazyk pro žádosti webové stránky, ale ponechat uživatelské rozhraní nastavení prohlížeče ve vašem jazyce.

Pokud je jazyková verze USA angličtina ( ), vykreslená komponenta používá formátování data měsíce a dne en-US ( 6/7 ), 12hodinový čas ( ) AM / PM a oddělovače čárek v číslech s tečkou pro desetinnou hodnotu ( 1,999.69 ):

  • Datum: 7.6.2021 6:45:22
  • Číslo: 1 999,69

Pokud je jazyková verze španělština ( ), vykreslená komponenta používá formátování data es-CL dne/měsíce ( ), 24hodinový čas a oddělovače tečky v číslech s čárkou pro 7/6 desetinnou hodnotu ( 1.999,69 ):

  • Datum: 6.7.2021 6:49:38
  • Číslo: 1,999,69

Statické nastavení jazykové verze

Nastavte BlazorWebAssemblyLoadAllGlobalizationData vlastnost na v souboru projektu aplikace ( true .csproj ):

<PropertyGroup>
  <BlazorWebAssemblyLoadAllGlobalizationData>true</BlazorWebAssemblyLoadAllGlobalizationData>
</PropertyGroup>

Jazykovou verzi aplikace je možné nastavit v JavaScriptu, Blazor když začíná applicationCulture Blazor možností start. Následující příklad nakonfiguruje aplikaci tak, aby se spouštěl pomocí USA jazykové verze angličtiny ( en-US ).

  • V wwwroot/index.html Blazor zabraňte automatickému spuštění autostart="false" Blazor přidáním do <script> značky ' :

    <script src="_framework/blazor.webassembly.js" autostart="false"></script>
    
  • Přidejte následující <script> blok za značku a před uzavírací Blazor <script> </body> značku:

    <script>
      Blazor.start({
        applicationCulture: 'en-US'
      });
    </script>
    

Hodnota pro musí odpovídat formátu značky jazyka applicationCulture BCP-47. Další informace o spuštění Blazor najdete v tématu ASP.NET Core Blazor Úvod .

Alternativou k nastavení možnosti start jazykové verze je nastavení Blazor jazykové verze v kódu jazyka C#. Nastavte CultureInfo.DefaultThreadCurrentCulture a CultureInfo.DefaultThreadCurrentUICulture v Program.cs .

Přidejte System.Globalization obor názvů do Program.cs :

using System.Globalization;

Přidejte nastavení jazykové verze před řádek, který sestaví a spustí WebAssemblyHostBuilder ( await builder.Build().RunAsync(); ):

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US");
CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("en-US");

Blazor Server Aplikace jsou lokalizované pomocí lokalizačního middlewaru. Přidejte do aplikace lokalizační služby pomocí AddLocalization .

V Startup.ConfigureServices souboru ( Startup.cs ):

services.AddLocalization();

Zadejte statickou jazykovou verzi v souboru ( ) ihned po přidání middlewaru směrování Startup.Configure Startup.cs do kanálu zpracování. Následující příklad konfiguruje USA angličtině:

app.UseRequestLocalization("en-US");

Hodnota jazykové verze pro musí odpovídat formátu značky jazyka UseRequestLocalization BCP-47.

Informace o objednání middlewaru lokalizace v middlewaru kanálu najdete Startup.Configure v tématu ASP.NET Core Jiné .

Pomocí komponenty CultureExample1 zobrazené v části Demonstrační komponenta můžete prostudovat, jak globalizace funguje. Vydáte žádost s USA angličtinou ( en-US ). V nastavení jazyka prohlížeče přepněte na Španělštinu ( es-CL ). Znovu si vyžádejte webovou stránku. Pokud je požadovaným jazykem španělština, jazyková verze aplikace zůstává USA angličtině ( en-US ).

Dynamické nastavení jazykové verze podle předvoleb uživatele

Mezi příklady umístění, kam může aplikace ukládat předvolby uživatele, patří místní úložiště prohlížeče (běžné v aplikacích), lokalizace nebo databáze (v aplikacích Blazor WebAssembly běžné) nebo v externí službě připojené k externí databázi, ke které přistupuje webové cookie rozhraní Blazor Server API. Následující příklad ukazuje, jak používat místní úložiště prohlížeče.

Přidejte odkaz na Microsoft.Extensions.Localization balíček pro balíček do souboru projektu aplikace ( .csproj ):

<PackageReference Include="Microsoft.Extensions.Localization" Version="{VERSION}" />

Zástupný {VERSION} symbol v předchozím odkazu na balíček je verze balíčku.

V souboru BlazorWebAssemblyLoadAllGlobalizationData projektu true nastavte vlastnost na :

<PropertyGroup>
  <BlazorWebAssemblyLoadAllGlobalizationData>true</BlazorWebAssemblyLoadAllGlobalizationData>
</PropertyGroup>

Jazyková verze aplikace se v Blazor WebAssembly aplikaci nastaví pomocí Blazor rozhraní API architektury. Výběr jazykové verze uživatele lze zachovat v místním úložišti prohlížeče.

V souboru za značkou a před uzavírací značkou zadejte funkce JS pro získání a nastavení výběru jazykové verze uživatele pomocí wwwroot/index.html Blazor místního úložiště <script> </body> prohlížeče:

<script>
  window.blazorCulture = {
    get: () => window.localStorage['BlazorCulture'],
    set: (value) => window.localStorage['BlazorCulture'] = value
  };
</script>

Poznámka

Předchozí příklad zomení klienta globálními metodami. Lepší přístup v produkčních aplikacích najdete v tématu Izolace JavaScriptu v modulech JavaScriptu.

Příklad:

export function getBlazorCulture() {
  return window.localStorage['BlazorCulture'];
};
export function setBlazorCulture(value) {
  window.localStorage['BlazorCulture'] = value;
};

Pokud použijete předchozí funkce, změňte volání z a z z na volání z JS interop v blazorCulture.get getBlazorCulture této blazorCulture.set setBlazorCulture části.

Přidejte obory názvů pro System.Globalization a Microsoft.JSInterop do horní části Program.cs :

using System.Globalization;
using Microsoft.JSInterop;

Odebrat následující řádek z Program.cs :

- await builder.Build().RunAsync();

Nahraďte předchozí řádek následujícím kódem. Kód přidá Blazor službu lokalizace do kolekce služeb aplikace s AddLocalization a pomocí zprostředkovatele komunikace js volá js a načte výběr jazykové verze uživatele z místního úložiště. Pokud místní úložiště neobsahuje jazykovou verzi pro uživatele, kód nastaví výchozí hodnotu USA English ( en-US ).

builder.Services.AddLocalization();

var host = builder.Build();

CultureInfo culture;
var js = host.Services.GetRequiredService<IJSRuntime>();
var result = await js.InvokeAsync<string>("blazorCulture.get");

if (result != null)
{
    culture = new CultureInfo(result);
}
else
{
    culture = new CultureInfo("en-US");
    await js.InvokeVoidAsync("blazorCulture.set", "en-US");
}

CultureInfo.DefaultThreadCurrentCulture = culture;
CultureInfo.DefaultThreadCurrentUICulture = culture;

await host.RunAsync();

Následující CultureSelector Komponenta ukazuje, jak nastavit výběr jazykové verze uživatele na místní úložiště prohlížeče přes interoperabilitu js. Komponenta je umístěna do Shared složky pro použití v rámci aplikace.

Shared/CultureSelector.razor:

@using  System.Globalization
@inject IJSRuntime JSRuntime
@inject NavigationManager Nav

<p>
    <label>
        Select your locale:
        <select @bind="Culture">
            @foreach (var culture in supportedCultures)
            {
                <option value="@culture">@culture.DisplayName</option>
            }
        </select>
    </label>
</p>

@code
{
    private CultureInfo[] supportedCultures = new[]
    {
        new CultureInfo("en-US"),
        new CultureInfo("es-CL"),
    };

    private CultureInfo Culture
    {
        get => CultureInfo.CurrentCulture;
        set
        {
            if (CultureInfo.CurrentCulture != value)
            {
                var js = (IJSInProcessRuntime)JSRuntime;
                js.InvokeVoid("blazorCulture.set", value.Name);

                Nav.NavigateTo(Nav.Uri, forceLoad: true);
            }
        }
    }
}

Uvnitř uzavírací </div> značky <div class="main"> elementu v Shared/MainLayout.razor přidejte CultureSelector komponentu:

<div class="bottom-row px-4">
    <CultureSelector />
</div>

Příklady umístění, kam může aplikace ukládat předvolby uživatele, patří do místního úložiště prohlížeče (společné v Blazor WebAssembly aplikacích), v lokalizaci cookie nebo databázi (společné v Blazor Server aplikacích) nebo v externí službě připojené k externí databázi a k ní přistupované webovým rozhraním API. Následující příklad ukazuje, jak použít lokalizaci cookie .

Přidejte odkaz na balíček pro Microsoft.Extensions.Localization balíček do souboru projektu aplikace ( .csproj ):

<ItemGroup>
  <PackageReference Include="Microsoft.Extensions.Localization" Version="{VERSION}" />
</ItemGroup>

{VERSION}Zástupný symbol v předchozím odkazu na balíček je verze balíčku.

Blazor Server aplikace jsou lokalizovány pomocí middleware lokalizace. Přidejte do aplikace lokalizační služby pomocí AddLocalization .

V Startup.ConfigureServices ( Startup.cs ):

services.AddLocalization();

Nastavte výchozí a podporované jazykové verze aplikace pomocí RequestLocalizationOptions.SetDefaultCulture .

Startup.ConfigureIhned po přidání middlewaru do kanálu zpracování:

var supportedCultures = new[] { "en-US", "es-CL" };
var localizationOptions = new RequestLocalizationOptions()
    .SetDefaultCulture(supportedCultures[0])
    .AddSupportedCultures(supportedCultures)
    .AddSupportedUICultures(supportedCultures);

app.UseRequestLocalization(localizationOptions);

Informace o řazení middlewaru pro lokalizaci v kanálu middlewaru pro najdete v Startup.Configure tématu ASP.NET Core Jiné .

Následující příklad ukazuje, jak nastavit aktuální jazykovou verzi v cookie , kterou lze přečíst pomocí middleware Localization.

Do horní části souboru přidejte následující obory názvů Pages/_Host.cshtml :

@using System.Globalization
@using Microsoft.AspNetCore.Localization

Hned za úvodní <body> značku Pages/_Host.cshtml přidejte následující Razor výraz:

@{
    this.HttpContext.Response.Cookies.Append(
        CookieRequestCultureProvider.DefaultCookieName,
        CookieRequestCultureProvider.MakeCookieValue(
            new RequestCulture(
                CultureInfo.CurrentCulture,
                CultureInfo.CurrentUICulture)));
}

Informace o řazení middlewaru pro lokalizaci v kanálu middlewaru pro najdete v Startup.Configure tématu ASP.NET Core Jiné .

Pokud aplikace není nakonfigurovaná na zpracování akcí kontroleru:

  • Přidat MVC Services voláním AddControllers na kolekci služeb v Startup.ConfigureServices :

    services.AddControllers();
    
  • Přidejte směrování koncových bodů řadiče do služby Startup.Configure voláním MapControllers IEndpointRouteBuilder :

    endpoints.MapControllers();
    

    Následující příklad ukazuje volání UseEndpoints po přidání řádku:

    app.UseEndpoints(endpoints =>
    {
    +   endpoints.MapControllers();
        endpoints.MapBlazorHub();
        endpoints.MapFallbackToPage("/_Host");
    });
    

Chcete-li poskytnout uživatelské rozhraní, které uživateli umožní vybrat jazykovou verzi, použijte k lokalizaci přístup založený na přesměrování cookie . Aplikace zachovává vybranou jazykovou verzi uživatele prostřednictvím přesměrování na kontroler. Řadič Nastaví vybranou jazykovou verzi uživatele na cookie a přesměruje uživatele zpět na původní identifikátor URI. Proces se podobá tomu, co se stane ve webové aplikaci, když se uživatel pokusí o přístup k zabezpečenému prostředku, kde je uživatel přesměrován na přihlašovací stránku a pak se přesměruje zpátky na původní prostředek.

Controllers/CultureController.cs:

using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.Mvc;

[Route("[controller]/[action]")]
public class CultureController : Controller
{
    public IActionResult Set(string culture, string redirectUri)
    {
        if (culture != null)
        {
            HttpContext.Response.Cookies.Append(
                CookieRequestCultureProvider.DefaultCookieName,
                CookieRequestCultureProvider.MakeCookieValue(
                    new RequestCulture(culture, culture)));
        }

        return LocalRedirect(redirectUri);
    }
}

Upozornění

Pomocí LocalRedirect výsledku akce zabráníte otevírání útoků přes přesměrování. Další informace naleznete v tématu Prevence útoků s otevřeným přesměrováním ASP.NET Core.

Následující CultureSelector Komponenta ukazuje, jak provést počáteční přesměrování, když uživatel vybere jazykovou verzi. Komponenta je umístěna do Shared složky pro použití v rámci aplikace.

Shared/CultureSelector.razor:

@using  System.Globalization
@inject NavigationManager Nav

<p>
    <label>
        Select your locale:
        <select @bind="Culture">
            @foreach (var culture in supportedCultures)
            {
                <option value="@culture">@culture.DisplayName</option>
            }
        </select>
    </label>
</p>

@code
{
    private CultureInfo[] supportedCultures = new[]
    {
        new CultureInfo("en-US"),
        new CultureInfo("es-CL"),
    };

    protected override void OnInitialized()
    {
        Culture = CultureInfo.CurrentCulture;
    }

    private CultureInfo Culture
    {
        get => CultureInfo.CurrentCulture;
        set
        {
            if (CultureInfo.CurrentCulture != value)
            {
                var uri = new Uri(Nav.Uri)
                    .GetComponents(UriComponents.PathAndQuery, UriFormat.Unescaped);
                var cultureEscaped = Uri.EscapeDataString(value.Name);
                var uriEscaped = Uri.EscapeDataString(uri);

                Nav.NavigateTo(
                    $"Culture/Set?culture={cultureEscaped}&redirectUri={uriEscaped}",
                    forceLoad: true);
            }
        }
    }
}

Uvnitř uzavírací </div> značky <div class="main"> elementu v Shared/MainLayout.razor přidejte CultureSelector komponentu:

<div class="bottom-row px-4">
    <CultureSelector />
</div>

Pomocí CultureExample1 komponenty uvedené v části demonstrační komponenta můžete zkoumat, jak funguje předchozí příklad.

Lokalizace

Pokud aplikace ještě nepodporuje výběr jazykové verze v části dynamicky nastavit jazykovou verzi podle preferencí uživatele v tomto článku, přidejte Microsoft.Extensions.Localization do souboru projektu aplikace odkaz na balíček ( .csproj ):

<PackageReference Include="Microsoft.Extensions.Localization" Version="{VERSION}" />

{VERSION}Zástupný symbol v předchozím odkazu na balíček je verze balíčku.

Nastavte BlazorWebAssemblyLoadAllGlobalizationData vlastnost na true soubor projektu aplikace ( .csproj ):

<PropertyGroup>
  <BlazorWebAssemblyLoadAllGlobalizationData>true</BlazorWebAssemblyLoadAllGlobalizationData>
</PropertyGroup>

V nástroji Program.cs přidejte obor názvů do System.Globalization horní části souboru:

using System.Globalization;

BlazorSlužba lokalizace se přidá do kolekce služeb aplikace s nástrojem AddLocalization v Program.cs :

builder.Services.AddLocalization();

K nastavení jazykové verze aplikace použijte middleware lokalizace .

Pokud aplikace ještě nepodporuje výběr jazykové verze v části dynamicky nastavovat jazyk podle preferencí uživatele v tomto článku:

  • Přidejte do aplikace lokalizační služby pomocí AddLocalization .
  • Zadejte výchozí a podporované jazykové verze aplikace v Startup.Configure ( Startup.cs ). Následující příklad konfiguruje podporované jazykové verze pro USA English a Chilská španělština.

V Startup.ConfigureServices ( Startup.cs ):

services.AddLocalization();

Startup.ConfigureIhned po přidání middlewaru do kanálu zpracování:

var supportedCultures = new[] { "en-US", "es-CL" };
var localizationOptions = new RequestLocalizationOptions()
    .SetDefaultCulture(supportedCultures[0])
    .AddSupportedCultures(supportedCultures)
    .AddSupportedUICultures(supportedCultures);

app.UseRequestLocalization(localizationOptions);

Informace o řazení middlewaru pro lokalizaci v kanálu middlewaru pro najdete v Startup.Configure tématu ASP.NET Core Jiné .

Pokud by aplikace měla lokalizovat prostředky na základě ukládání nastavení jazykové verze uživatele, použijte lokalizaci kultury cookie . Použití nástroje cookie zajistí, že připojení protokolu WebSocket dokáže správně rozšířit jazykovou verzi. Pokud jsou schémata lokalizací založena na cestě URL nebo řetězci dotazu, nemusí být schopná pracovat s objekty WebSockets, takže nepůjde zachovat jazykovou verzi. Proto je doporučený přístup použít lokalizovanou jazykovou verzi cookie . V části dynamické nastavení jazykové verze podle předvoleb uživatele v tomto článku se zobrazí vzorový Razor výraz pro Pages/_Host.cshtml soubor, který uchovává výběr jazykové verze uživatele.

Příklad lokalizovaných prostředků v této části funguje s předchozími příklady v tomto článku, kde jsou podporované jazykové verze aplikace English ( en ) jako výchozí národní prostředí a španělština ( es ) jako alternativní národní prostředí určené uživatelem nebo v prohlížeči.

Vytvořte prostředky pro každé národní prostředí. V následujícím příkladu jsou vytvořeny prostředky pro výchozí Greeting řetězec:

  • Angličtina: Hello, World!
  • Španělština ( es ): ¡Hola, Mundo!

Poznámka

následující soubor prostředků lze přidat do Visual Studio tak, že kliknete pravým tlačítkem myši na Pages složku projektu a vyberete přidat > nový > soubor prostředků položek. Pojmenujte soubor CultureExample2.resx. Po zobrazení editoru zadejte data pro novou položku. Nastavte název Greeting a hodnotu na Hello, World! . Soubor uložte.

Pages/CultureExample2.resx:

<?xml version="1.0" encoding="utf-8"?>
<root>
  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
    <xsd:element name="root" msdata:IsDataSet="true">
      <xsd:complexType>
        <xsd:choice maxOccurs="unbounded">
          <xsd:element name="metadata">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" />
              </xsd:sequence>
              <xsd:attribute name="name" use="required" type="xsd:string" />
              <xsd:attribute name="type" type="xsd:string" />
              <xsd:attribute name="mimetype" type="xsd:string" />
              <xsd:attribute ref="xml:space" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="assembly">
            <xsd:complexType>
              <xsd:attribute name="alias" type="xsd:string" />
              <xsd:attribute name="name" type="xsd:string" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="data">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
              <xsd:attribute ref="xml:space" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="resheader">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required" />
            </xsd:complexType>
          </xsd:element>
        </xsd:choice>
      </xsd:complexType>
    </xsd:element>
  </xsd:schema>
  <resheader name="resmimetype">
    <value>text/microsoft-resx</value>
  </resheader>
  <resheader name="version">
    <value>2.0</value>
  </resheader>
  <resheader name="reader">
    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  </resheader>
  <resheader name="writer">
    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  </resheader>
  <data name="Greeting" xml:space="preserve">
    <value>Hello, World!</value>
  </data>
</root>

Poznámka

následující soubor prostředků lze přidat do Visual Studio tak, že kliknete pravým tlačítkem myši na Pages složku projektu a vyberete přidat > nový > soubor prostředků položek. Pojmenujte soubor CultureExample2.es.resx. Po zobrazení editoru zadejte data pro novou položku. Nastavte název Greeting a hodnotu na ¡Hola, Mundo! . Soubor uložte.

Pages/CultureExample2.es.resx:

<?xml version="1.0" encoding="utf-8"?>
<root>
  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
    <xsd:element name="root" msdata:IsDataSet="true">
      <xsd:complexType>
        <xsd:choice maxOccurs="unbounded">
          <xsd:element name="metadata">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" />
              </xsd:sequence>
              <xsd:attribute name="name" use="required" type="xsd:string" />
              <xsd:attribute name="type" type="xsd:string" />
              <xsd:attribute name="mimetype" type="xsd:string" />
              <xsd:attribute ref="xml:space" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="assembly">
            <xsd:complexType>
              <xsd:attribute name="alias" type="xsd:string" />
              <xsd:attribute name="name" type="xsd:string" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="data">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
              <xsd:attribute ref="xml:space" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="resheader">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required" />
            </xsd:complexType>
          </xsd:element>
        </xsd:choice>
      </xsd:complexType>
    </xsd:element>
  </xsd:schema>
  <resheader name="resmimetype">
    <value>text/microsoft-resx</value>
  </resheader>
  <resheader name="version">
    <value>2.0</value>
  </resheader>
  <resheader name="reader">
    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  </resheader>
  <resheader name="writer">
    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  </resheader>
  <data name="Greeting" xml:space="preserve">
    <value>¡Hola, Mundo!</value>
  </data>
</root>

Následující komponenta ukazuje použití lokalizovaného Greeting řetězce s IStringLocalizer<T> .

Přidejte obor názvů Microsoft.Extensions.Localization do _Imports.razor souboru aplikace:

@using Microsoft.Extensions.Localization

Pages/CultureExample2.razor:

@page "/culture-example-2"
@using System.Globalization
@inject IStringLocalizer<CultureExample2> Loc

<h1>Culture Example 2</h1>

<p>
    <b>CurrentCulture</b>: @CultureInfo.CurrentCulture
</p>

<h2>Greeting</h2>

<p>
    @Loc["Greeting"]
</p>

<p>
    @greeting
</p>

@code {
    private string greeting;

    protected override void OnInitialized()
    {
        greeting = Loc["Greeting"];
    }
}

Přidejte položku seznamu do prvku navigační nabídky <ul> v Shared/NavMenu.razor pro CultureExample2 komponentu:

<li class="nav-item px-3">
    <NavLink class="nav-link" href="culture-example-2">
        <span class="oi oi-list-rich" aria-hidden="true"></span> Culture Example 2
    </NavLink>
</li>

Další zdroje informací

Razor komponenty mohou vykreslovat globální a lokalizovaný obsah uživatelům v různých jazykových verzích a jazycích. Pro globalizaci Blazor poskytuje formát čísla a data. Pro lokalizaci Blazor vykreslí obsah pomocí systému prostředků .NET.

podporuje se omezená sada funkcí lokalizace ASP.NET Core:

✔️ IStringLocalizer a IStringLocalizer<T> jsou podporované v Blazor aplikacích.

IHtmlLocalizer IViewLocalizer lokalizace datových poznámek , a jsou ASP.NET Core funkcemi MVC a nejsou v Blazor aplikacích podporovány.

Tento článek popisuje, jak používat Blazor funkce globalizace a lokalizace v závislosti na:

  • Accept-Language Hlavička, která je nastavena prohlížečem v závislosti na jazykových preferencích uživatele v nastavení prohlížeče.
  • Jazyková verze nastavená aplikací nezávisí na hodnotě Accept-Language záhlaví. Nastavení může být statické pro všechny uživatele nebo dynamická v závislosti na logice aplikace. Pokud je nastavení založené na předvolbě uživatele, nastavení se obvykle ukládá pro opětovné načtení při budoucích návštěvách.

Další obecné informace najdete v tématu Globalizace a lokalizace v ASP.NET Core .

Poznámka

Při práci s koncepty globalizace a lokalizace se často používají pojmy jazyk a jazyková verze .

V tomto článku jazyk odkazuje na výběry provedené uživatelem v nastavení prohlížeče. Výběr jazyka uživatele jsou odesílány v rámci požadavků prohlížeče v Accept-Language hlavičce. Nastavení prohlížeče obvykle používá slovo "Language" v uživatelském rozhraní.

Jazyková verze se týká členů rozhraní .NET a Blazor rozhraní API. Například požadavek uživatele může zahrnout Accept-Language hlavičku určující jazyk z perspektivy uživatele, ale aplikace nakonec nastaví CurrentCulture vlastnost ("Culture") z jazyka, který si uživatel požadoval. Rozhraní API obvykle používá slovo "Culture" v názvech členů.

Globalizace

@bindDirektiva Attribute používá formáty a analyzuje hodnoty pro zobrazení na základě prvního preferovaného jazyka uživatele, který aplikace podporuje. @bind podporuje @bind:culture parametr , který poskytuje System.Globalization.CultureInfo pro parsování a formátování hodnoty.

Aktuální jazyková verze je přístupná z System.Globalization.CultureInfo.CurrentCulture vlastnosti .

CultureInfo.InvariantCulture se používá pro následující typy polí ( <input type="{TYPE}" /> , kde zástupný symbol je typ {TYPE} ):

  • date
  • number

Předchozí typy polí:

  • Zobrazují se pomocí příslušných pravidel formátování založených na prohlížeči.
  • Nemůže obsahovat volný text.
  • Zadejte charakteristiky interakce uživatelů na základě implementace prohlížeče.

Při použití typů polí a se určení jazykové verze pomocí nedoporučuje, protože poskytuje integrovanou podporu pro vykreslení hodnot date number v aktuální jazykové @bind:culture Blazor verzi.

Následující typy polí mají specifické požadavky na formátování a nejsou aktuálně podporovány aplikací , protože je nepodporují všechny Blazor hlavní prohlížeče:

  • datetime-local
  • month
  • week

Aktuální podporu prohlížečů předchozích typů najdete v tématu Můžu použít.

Invariantní globalizace

Pokud aplikace nevyžaduje lokalizaci, nakonfigurujte aplikaci tak, aby podporovala neutrální jazykovou verzi, která je obecně založená na USA angličtině ( en-US ). Nastavte InvariantGlobalization vlastnost na v souboru projektu aplikace ( true .csproj ):

<PropertyGroup>
  <InvariantGlobalization>true</InvariantGlobalization>
</PropertyGroup>

Alternativně nakonfigurujte invariantní globalizaci s následujícími přístupy:

  • V runtimeconfig.json:

    {
      "runtimeOptions": {
        "configProperties": {
          "System.Globalization.Invariant": true
        }
      }
    }
    
  • S proměnnou prostředí:

    • Klíč: DOTNET_SYSTEM_GLOBALIZATION_INVARIANT
    • Hodnota: true nebo 1

Další informace najdete v tématu Možnosti konfigurace modulu runtime pro globalizaci (dokumentace k .NET).

Demonstrační komponenta

Následující CultureExample1 komponentu lze použít k předvedení konceptů globalizace a lokalizace, Blazor na které se vztahuje tento článek.

Pages/CultureExample1.razor:

@page "/culture-example-1"
@using System.Globalization

<h1>Culture Example 1</h1>

<p>
    <b>CurrentCulture</b>: @CultureInfo.CurrentCulture
</p>

<h2>Rendered values</h2>

<ul>
    <li><b>Date</b>: @dt</li>
    <li><b>Number</b>: @number.ToString("N2")</li>
</ul>

<h2><code>&lt;input&gt;</code> elements that don't set a <code>type</code></h2>

<p>
    The following <code>&lt;input&gt;</code> elements use
    <code>CultureInfo.CurrentCulture</code>.
</p>

<ul>
    <li><label><b>Date:</b> <input @bind="dt" /></label></li>
    <li><label><b>Number:</b> <input @bind="number" /></label></li>
</ul>

<h2><code>&lt;input&gt;</code> elements that set a <code>type</code></h2>

<p>
    The following <code>&lt;input&gt;</code> elements use
    <code>CultureInfo.InvariantCulture</code>.
</p>

<ul>
    <li><label><b>Date:</b> <input type="date" @bind="dt" /></label></li>
    <li><label><b>Number:</b> <input type="number" @bind="number" /></label></li>
</ul>

@code {
    private DateTime dt = DateTime.Now;
    private double number = 1999.69;
}

Formát číselného řetězce ( ) v předchozím příkladu ( ) je standardní N2 .ToString("N2") specifikátor číselného formátu .NET. Formát je podporovaný pro všechny číselné typy, zahrnuje oddělovač skupin a vykresluje se N2 až na dvě desetinná místa.

Přidejte položku seznamu do prvku navigační <ul> nabídky v souboru pro Shared/NavMenu.razor CultureExample1 komponentu:

<li class="nav-item px-3">
    <NavLink class="nav-link" href="culture-example-1">
        <span class="oi oi-list-rich" aria-hidden="true"></span> Culture Example 1
    </NavLink>
</li>

Dynamické nastavení jazykové verze z Accept-Language hlavičky

Accept-Language Hlavička se nastavuje v prohlížeči a řídí se podle jazykových předvoleb uživatele v nastavení prohlížeče. V nastavení prohlížeče uživatel nastaví jeden nebo více upřednostňovaných jazyků podle priority. Pořadí předvoleb používá prohlížeč k nastavení hodnot kvality ( q , 0–1) pro každý jazyk v hlavičce. Následující příklad určuje USA angličtině, angličtině a španělštině s předvolbou pro USA angličtinu nebo angličtinu:

Accept-Language: en-US,en;q=0.9,es-CL;q=0.8

Jazyková verze aplikace se nastavuje tak, že se porovná první požadovaný jazyk, který odpovídá podporované jazykové verzi aplikace.

Blazor Server Aplikace jsou lokalizované pomocí lokalizačního middlewaru. Přidejte do aplikace lokalizační služby pomocí AddLocalization .

V Startup.ConfigureServices souboru ( Startup.cs ):

services.AddLocalization();

Určete podporované jazykové verze aplikace v ( ) ihned po přidání middlewaru směrování Startup.Configure Startup.cs do kanálu zpracování. Následující příklad konfiguruje podporované jazykové verze pro jazykovou USA angličtinu a španělštinu:

app.UseRequestLocalization(new RequestLocalizationOptions()
    .AddSupportedCultures(new[] { "en-US", "es-CL" })
    .AddSupportedUICultures(new[] { "en-US", "es-CL" }));

Informace o objednání middlewaru lokalizace v middlewaru kanálu najdete Startup.Configure v tématu ASP.NET Core Jiné .

Pomocí komponenty CultureExample1 zobrazené v části Demonstrační komponenta můžete prostudovat, jak globalizace funguje. Vydáte žádost s USA angličtinou ( en-US ). V nastavení jazyka prohlížeče přepněte na Španělštinu ( es-CL ). Znovu si vyžádejte webovou stránku.

Poznámka

Některé prohlížeče nutí použít výchozí nastavení jazyka pro požadavky i pro vlastní nastavení uživatelského rozhraní prohlížeče. Změna jazyka může být obtížná, protože všechny obrazovky uživatelského rozhraní, které se nastavují, můžou být v jazyce, který nemůžete přečíst. Prohlížeč, jako je Například Opera, je dobrou volbou pro testování, protože umožňuje nastavit výchozí jazyk pro žádosti webové stránky, ale ponechat uživatelské rozhraní nastavení prohlížeče ve vašem jazyce.

Pokud je jazyková verze USA angličtina ( ), vykreslená komponenta používá formátování data měsíce a dne en-US ( 6/7 ), 12hodinový čas ( ) AM / PM a oddělovače čárek v číslech s tečkou pro desetinnou hodnotu ( 1,999.69 ):

  • Datum: 7.6.2021 6:45:22
  • Číslo: 1 999,69

Pokud je jazyková verze španělština ( ), vykreslená komponenta používá formátování data es-CL dne/měsíce ( ), 24hodinový čas a oddělovače tečky v číslech s čárkou pro 7/6 desetinnou hodnotu ( 1.999,69 ):

  • Datum: 6.7.2021 6:49:38
  • Číslo: 1,999,69

Statické nastavení jazykové verze

Konfigurace linkeru IL (Intermediate Language) pro aplikace ve výchozím nastavení odčítá informace o globalizaci s výjimkou explicitně Blazor WebAssembly požadovaných národního prostředí. Další informace naleznete v tématu Konfigurace linkeru pro ASP.NET Core Blazor.

Blazor Server Aplikace jsou lokalizované pomocí lokalizačního middlewaru. Přidejte do aplikace lokalizační služby pomocí AddLocalization .

V Startup.ConfigureServices souboru ( Startup.cs ):

services.AddLocalization();

Zadejte statickou jazykovou verzi v souboru ( ) ihned po přidání middlewaru směrování Startup.Configure Startup.cs do kanálu zpracování. Následující příklad konfiguruje USA angličtině:

app.UseRequestLocalization("en-US");

Hodnota jazykové verze pro musí odpovídat formátu značky jazyka UseRequestLocalization BCP-47.

Informace o objednání middlewaru lokalizace v middlewaru kanálu najdete Startup.Configure v tématu ASP.NET Core Jiné .

Pomocí komponenty CultureExample1 zobrazené v části Demonstrační komponenta můžete prostudovat, jak globalizace funguje. Vydáte žádost s USA angličtinou ( en-US ). V nastavení jazyka prohlížeče přepněte na Španělštinu ( es-CL ). Znovu si vyžádejte webovou stránku. Pokud je požadovaným jazykem španělština, jazyková verze aplikace zůstává USA angličtině ( en-US ).

Dynamické nastavení jazykové verze podle předvoleb uživatele

Mezi příklady umístění, kam může aplikace ukládat předvolby uživatele, patří místní úložiště prohlížeče (v aplikacích běžné), lokalizace nebo databáze (v aplikacích Blazor WebAssembly běžné) nebo v externí službě připojené k externí databázi, ke které přistupuje webové cookie rozhraní Blazor Server API. Následující příklad ukazuje, jak používat místní úložiště prohlížeče.

Přidejte odkaz na Microsoft.Extensions.Localization balíček pro balíček do souboru projektu aplikace ( .csproj ):

<PackageReference Include="Microsoft.Extensions.Localization" Version="{VERSION}" />

Zástupný {VERSION} symbol v předchozím odkazu na balíček je verze balíčku.

Jazyková verze aplikace se v Blazor WebAssembly aplikaci nastaví pomocí Blazor rozhraní API architektury. Výběr jazykové verze uživatele lze zachovat v místním úložišti prohlížeče.

V souboru za značkou a před uzavírací značkou zadejte funkce JS pro získání a nastavení výběru jazykové verze uživatele pomocí wwwroot/index.html Blazor místního úložiště <script> </body> prohlížeče:

<script>
  window.blazorCulture = {
    get: () => window.localStorage['BlazorCulture'],
    set: (value) => window.localStorage['BlazorCulture'] = value
  };
</script>

Přidejte obory názvů System.Globalization pro a na začátek Microsoft.JSInterop Program.cs :

using System.Globalization;
using Microsoft.JSInterop;

Odeberte následující řádek z Program.cs :

-await builder.Build().RunAsync();

Nahraďte předchozí řádek následujícím kódem. Kód přidá službu lokalizace do kolekce služby aplikace pomocí a používá interoperabilitu JS k volání do JS a načtení výběru jazykové verze Blazor AddLocalization uživatele z místního úložiště. Pokud místní úložiště neobsahuje jazykovou verzi pro uživatele, kód nastaví výchozí hodnotu pro USA angličtině ( en-US ).

builder.Services.AddLocalization();

var host = builder.Build();

CultureInfo culture;
var js = host.Services.GetRequiredService<IJSRuntime>();
var result = await js.InvokeAsync<string>("blazorCulture.get");

if (result != null)
{
    culture = new CultureInfo(result);
}
else
{
    culture = new CultureInfo("en-US");
    await js.InvokeVoidAsync("blazorCulture.set", "en-US");
}

CultureInfo.DefaultThreadCurrentCulture = culture;
CultureInfo.DefaultThreadCurrentUICulture = culture;

await host.RunAsync();

Následující komponenta ukazuje, jak nastavit výběr jazykové verze uživatele do místního úložiště prohlížeče CultureSelector prostřednictvím zprostředkovatele komunikace JS. Komponenta se umístí do Shared složky pro použití v celé aplikaci.

Shared/CultureSelector.razor:

@using  System.Globalization
@inject IJSRuntime JSRuntime
@inject NavigationManager Nav

<p>
    <label>
        Select your locale:
        <select @bind="Culture">
            @foreach (var culture in supportedCultures)
            {
                <option value="@culture">@culture.DisplayName</option>
            }
        </select>
    </label>
</p>

@code
{
    private CultureInfo[] supportedCultures = new[]
    {
        new CultureInfo("en-US"),
        new CultureInfo("es-CL"),
    };

    private CultureInfo Culture
    {
        get => CultureInfo.CurrentCulture;
        set
        {
            if (CultureInfo.CurrentCulture != value)
            {
                var js = (IJSInProcessRuntime)JSRuntime;
                js.InvokeVoid("blazorCulture.set", value.Name);

                Nav.NavigateTo(Nav.Uri, forceLoad: true);
            }
        }
    }
}

Do uzavírací </div> značky <div class="main"> elementu v Shared/MainLayout.razor souboru přidejte CultureSelector komponentu :

<div class="bottom-row px-4">
    <CultureSelector />
</div>

Mezi příklady umístění, kam může aplikace ukládat předvolby uživatele, patří místní úložiště prohlížeče (v aplikacích běžné), lokalizace nebo databáze (v aplikacích Blazor WebAssembly běžné) nebo v externí službě připojené k externí databázi, ke které přistupuje webové cookie rozhraní Blazor Server API. Následující příklad ukazuje, jak použít lokalizaci cookie .

Přidejte odkaz na Microsoft.Extensions.Localization balíček pro balíček do souboru projektu aplikace ( .csproj ):

<ItemGroup>
  <PackageReference Include="Microsoft.Extensions.Localization" Version="{VERSION}" />
</ItemGroup>

Zástupný {VERSION} symbol v předchozím odkazu na balíček je verze balíčku.

Blazor Server Aplikace jsou lokalizované pomocí lokalizačního middlewaru. Přidejte do aplikace lokalizační služby pomocí AddLocalization .

V Startup.ConfigureServices souboru ( Startup.cs ):

services.AddLocalization();

Nastavte výchozí a podporované jazykové verze aplikace pomocí RequestLocalizationOptions.SetDefaultCulture .

Okamžitě Startup.Configure po přidání middlewaru směrování do kanálu zpracování:

var supportedCultures = new[] { "en-US", "es-CL" };
var localizationOptions = new RequestLocalizationOptions()
    .SetDefaultCulture(supportedCultures[0])
    .AddSupportedCultures(supportedCultures)
    .AddSupportedUICultures(supportedCultures);

app.UseRequestLocalization(localizationOptions);

Informace o objednání middlewaru lokalizace v middlewaru kanálu najdete Startup.Configure v tématu ASP.NET Core Jiné .

Následující příklad ukazuje, jak nastavit aktuální jazykovou verzi v , cookie kterou lze číst middlewarem pro lokalizaci.

Na začátek souboru přidejte následující Pages/_Host.cshtml obory názvů:

@using System.Globalization
@using Microsoft.AspNetCore.Localization

Ihned za úvodní <body> značku Pages/_Host.cshtml souboru přidejte následující Razor výraz:

@{
    this.HttpContext.Response.Cookies.Append(
        CookieRequestCultureProvider.DefaultCookieName,
        CookieRequestCultureProvider.MakeCookieValue(
            new RequestCulture(
                CultureInfo.CurrentCulture,
                CultureInfo.CurrentUICulture)));
}

Informace o objednání middlewaru lokalizace v middlewaru kanálu najdete Startup.Configure v tématu ASP.NET Core Jiné .

Pokud aplikace není nakonfigurovaná ke zpracování akcí kontroleru:

  • Přidejte služby MVC AddControllers voláním v kolekci služby v Startup.ConfigureServices :

    services.AddControllers();
    
  • Přidejte směrování koncového bodu Startup.Configure kontroleru do MapControllers voláním v IEndpointRouteBuilder :

    endpoints.MapControllers();
    

    Následující příklad ukazuje volání po UseEndpoints přidání řádku:

    app.UseEndpoints(endpoints =>
    {
    +   endpoints.MapControllers();
        endpoints.MapBlazorHub();
        endpoints.MapFallbackToPage("/_Host");
    });
    

Pokud chcete poskytnout uživatelské rozhraní, které uživateli umožní vybrat jazykovou verzi, použijte u lokalizace přístup založený na cookie přesměrování. Aplikace zachovává vybranou jazykovou verzi uživatele prostřednictvím přesměrování na kontroler. Řadič Nastaví vybranou jazykovou verzi uživatele na cookie a přesměruje uživatele zpět na původní identifikátor URI. Proces se podobá tomu, co se stane ve webové aplikaci, když se uživatel pokusí o přístup k zabezpečenému prostředku, kde je uživatel přesměrován na přihlašovací stránku a pak se přesměruje zpátky na původní prostředek.

Controllers/CultureController.cs:

using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.Mvc;

[Route("[controller]/[action]")]
public class CultureController : Controller
{
    public IActionResult Set(string culture, string redirectUri)
    {
        if (culture != null)
        {
            HttpContext.Response.Cookies.Append(
                CookieRequestCultureProvider.DefaultCookieName,
                CookieRequestCultureProvider.MakeCookieValue(
                    new RequestCulture(culture, culture)));
        }

        return LocalRedirect(redirectUri);
    }
}

Upozornění

Pomocí LocalRedirect výsledku akce zabráníte otevírání útoků přes přesměrování. Další informace naleznete v tématu Prevence útoků s otevřeným přesměrováním ASP.NET Core.

Následující CultureSelector Komponenta ukazuje, jak provést počáteční přesměrování, když uživatel vybere jazykovou verzi. Komponenta je umístěna do Shared složky pro použití v rámci aplikace.

Shared/CultureSelector.razor:

@using  System.Globalization
@inject NavigationManager Nav

<p>
    <label>
        Select your locale:
        <select @bind="Culture">
            @foreach (var culture in supportedCultures)
            {
                <option value="@culture">@culture.DisplayName</option>
            }
        </select>
    </label>
</p>

@code
{
    private CultureInfo[] supportedCultures = new[]
    {
        new CultureInfo("en-US"),
        new CultureInfo("es-CL"),
    };

    protected override void OnInitialized()
    {
        Culture = CultureInfo.CurrentCulture;
    }

    private CultureInfo Culture
    {
        get => CultureInfo.CurrentCulture;
        set
        {
            if (CultureInfo.CurrentCulture != value)
            {
                var uri = new Uri(Nav.Uri)
                    .GetComponents(UriComponents.PathAndQuery, UriFormat.Unescaped);
                var cultureEscaped = Uri.EscapeDataString(value.Name);
                var uriEscaped = Uri.EscapeDataString(uri);

                Nav.NavigateTo(
                    $"Culture/Set?culture={cultureEscaped}&redirectUri={uriEscaped}",
                    forceLoad: true);
            }
        }
    }
}

Uvnitř uzavírací </div> značky <div class="main"> elementu v Shared/MainLayout.razor přidejte CultureSelector komponentu:

<div class="bottom-row px-4">
    <CultureSelector />
</div>

Pomocí CultureExample1 komponenty uvedené v části demonstrační komponenta můžete zkoumat, jak funguje předchozí příklad.

Lokalizace

Pokud aplikace ještě nepodporuje výběr jazykové verze v části dynamicky nastavit jazykovou verzi podle preferencí uživatele v tomto článku, přidejte Microsoft.Extensions.Localization do souboru projektu aplikace odkaz na balíček ( .csproj ):

<PackageReference Include="Microsoft.Extensions.Localization" Version="{VERSION}" />

{VERSION}Zástupný symbol v předchozím odkazu na balíček je verze balíčku.

Ve výchozím nastavení konfigurace linkeru pro Blazor WebAssembly aplikace vyřadí informace o mezinárodním prostředí, s výjimkou výslovně požadovaných místních hodnot. Další informace naleznete v tématu Konfigurace linkeru pro ASP.NET Core Blazor.

V nástroji Program.cs přidejte obor názvů do System.Globalization horní části souboru:

using System.Globalization;

BlazorSlužba lokalizace se přidá do kolekce služeb aplikace s nástrojem AddLocalization v Program.cs :

builder.Services.AddLocalization();

K nastavení jazykové verze aplikace použijte middleware lokalizace .

Pokud aplikace ještě nepodporuje výběr jazykové verze v části dynamicky nastavovat jazyk podle preferencí uživatele v tomto článku:

  • Přidejte do aplikace lokalizační služby pomocí AddLocalization .
  • Zadejte výchozí a podporované jazykové verze aplikace v Startup.Configure ( Startup.cs ). Následující příklad konfiguruje podporované jazykové verze pro USA English a Chilská španělština.

V Startup.ConfigureServices ( Startup.cs ):

services.AddLocalization();

Startup.ConfigureIhned po přidání middlewaru do kanálu zpracování:

var supportedCultures = new[] { "en-US", "es-CL" };
var localizationOptions = new RequestLocalizationOptions()
    .SetDefaultCulture(supportedCultures[0])
    .AddSupportedCultures(supportedCultures)
    .AddSupportedUICultures(supportedCultures);

app.UseRequestLocalization(localizationOptions);

Informace o řazení middlewaru pro lokalizaci v kanálu middlewaru pro najdete v Startup.Configure tématu ASP.NET Core Jiné .

Pokud by aplikace měla lokalizovat prostředky na základě ukládání nastavení jazykové verze uživatele, použijte lokalizaci kultury cookie . Použití nástroje cookie zajistí, že připojení protokolu WebSocket dokáže správně rozšířit jazykovou verzi. Pokud jsou schémata lokalizací založena na cestě URL nebo řetězci dotazu, nemusí být schopná pracovat s objekty WebSockets, takže nepůjde zachovat jazykovou verzi. Proto je doporučený přístup použít lokalizovanou jazykovou verzi cookie . V části dynamické nastavení jazykové verze podle předvoleb uživatele v tomto článku se zobrazí vzorový Razor výraz pro Pages/_Host.cshtml soubor, který uchovává výběr jazykové verze uživatele.

Příklad lokalizovaných prostředků v této části funguje s předchozími příklady v tomto článku, kde jsou podporované jazykové verze aplikace English ( en ) jako výchozí národní prostředí a španělština ( es ) jako alternativní národní prostředí určené uživatelem nebo v prohlížeči.

Vytvořte prostředky pro každé národní prostředí. V následujícím příkladu jsou vytvořeny prostředky pro výchozí Greeting řetězec:

  • Angličtina: Hello, World!
  • Španělština ( es ): ¡Hola, Mundo!

Poznámka

následující soubor prostředků lze přidat do Visual Studio tak, že kliknete pravým tlačítkem myši na Pages složku projektu a vyberete přidat > nový > soubor prostředků položek. Pojmenujte soubor CultureExample2.resx. Po zobrazení editoru zadejte data pro novou položku. Nastavte název Greeting a hodnotu na Hello, World! . Soubor uložte.

Pages/CultureExample2.resx:

<?xml version="1.0" encoding="utf-8"?>
<root>
  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
    <xsd:element name="root" msdata:IsDataSet="true">
      <xsd:complexType>
        <xsd:choice maxOccurs="unbounded">
          <xsd:element name="metadata">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" />
              </xsd:sequence>
              <xsd:attribute name="name" use="required" type="xsd:string" />
              <xsd:attribute name="type" type="xsd:string" />
              <xsd:attribute name="mimetype" type="xsd:string" />
              <xsd:attribute ref="xml:space" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="assembly">
            <xsd:complexType>
              <xsd:attribute name="alias" type="xsd:string" />
              <xsd:attribute name="name" type="xsd:string" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="data">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
              <xsd:attribute ref="xml:space" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="resheader">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required" />
            </xsd:complexType>
          </xsd:element>
        </xsd:choice>
      </xsd:complexType>
    </xsd:element>
  </xsd:schema>
  <resheader name="resmimetype">
    <value>text/microsoft-resx</value>
  </resheader>
  <resheader name="version">
    <value>2.0</value>
  </resheader>
  <resheader name="reader">
    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  </resheader>
  <resheader name="writer">
    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  </resheader>
  <data name="Greeting" xml:space="preserve">
    <value>Hello, World!</value>
  </data>
</root>

Poznámka

následující soubor prostředků lze přidat do Visual Studio tak, že kliknete pravým tlačítkem myši na Pages složku projektu a vyberete přidat > nový > soubor prostředků položek. Pojmenujte soubor CultureExample2.es.resx. Po zobrazení editoru zadejte data pro novou položku. Nastavte název Greeting a hodnotu na ¡Hola, Mundo! . Soubor uložte.

Pages/CultureExample2.es.resx:

<?xml version="1.0" encoding="utf-8"?>
<root>
  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
    <xsd:element name="root" msdata:IsDataSet="true">
      <xsd:complexType>
        <xsd:choice maxOccurs="unbounded">
          <xsd:element name="metadata">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" />
              </xsd:sequence>
              <xsd:attribute name="name" use="required" type="xsd:string" />
              <xsd:attribute name="type" type="xsd:string" />
              <xsd:attribute name="mimetype" type="xsd:string" />
              <xsd:attribute ref="xml:space" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="assembly">
            <xsd:complexType>
              <xsd:attribute name="alias" type="xsd:string" />
              <xsd:attribute name="name" type="xsd:string" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="data">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
              <xsd:attribute ref="xml:space" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="resheader">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required" />
            </xsd:complexType>
          </xsd:element>
        </xsd:choice>
      </xsd:complexType>
    </xsd:element>
  </xsd:schema>
  <resheader name="resmimetype">
    <value>text/microsoft-resx</value>
  </resheader>
  <resheader name="version">
    <value>2.0</value>
  </resheader>
  <resheader name="reader">
    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  </resheader>
  <resheader name="writer">
    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  </resheader>
  <data name="Greeting" xml:space="preserve">
    <value>¡Hola, Mundo!</value>
  </data>
</root>

Následující komponenta ukazuje použití lokalizovaného Greeting řetězce s IStringLocalizer<T> .

Přidejte obor názvů Microsoft.Extensions.Localization do _Imports.razor souboru aplikace:

@using Microsoft.Extensions.Localization

Pages/CultureExample2.razor:

@page "/culture-example-2"
@using System.Globalization
@inject IStringLocalizer<CultureExample2> Loc

<h1>Culture Example 2</h1>

<p>
    <b>CurrentCulture</b>: @CultureInfo.CurrentCulture
</p>

<h2>Greeting</h2>

<p>
    @Loc["Greeting"]
</p>

<p>
    @greeting
</p>

@code {
    private string greeting;

    protected override void OnInitialized()
    {
        greeting = Loc["Greeting"];
    }
}

Přidejte položku seznamu do prvku navigační nabídky <ul> v Shared/NavMenu.razor pro CultureExample2 komponentu:

<li class="nav-item px-3">
    <NavLink class="nav-link" href="culture-example-2">
        <span class="oi oi-list-rich" aria-hidden="true"></span> Culture Example 2
    </NavLink>
</li>

Další zdroje informací