Sdílet prostřednictvím


Konfigurace lokalizace přenosných objektů v ASP.NET Core

Hisham Bin Ateya a Sébastien Ros.

Tento článek vás provede postupem použití souborů Portable Object (PO) v aplikaci ASP.NET Core s architekturou Orchard Core .

Poznámka: Orchard Core není produktem Microsoftu. Microsoft tuto funkci nepodporuje.

Zobrazení nebo stažení ukázkového kódu (postup stažení)

Co je soubor PO?

PO soubory jsou distribuovány jako textové soubory obsahující přeložené řetězce pro daný jazyk. Mezi výhody použití souborů PO místo souborů .resx patří:

  • PO soubory podporují pluralizaci; .resx soubory nepodporují pluralizaci.
  • Soubory PO nejsou kompilovány jako soubory .resx . Proto se nevyžadují specializované nástroje a kroky sestavení.
  • PO soubory fungují dobře s nástroji pro spolupráci a online úpravy.

Example

Následující ukázkový soubor PO obsahuje překlad dvou řetězců ve francouzštině, včetně jednoho i ve formě množného čísla:

fr.po

#: Pages/Index.cshtml:13
msgid "Hello world!"
msgstr "Bonjour le monde!"

msgid "There is one item."
msgid_plural "There are {0} items."
msgstr[0] "Il y a un élément."
msgstr[1] "Il y a {0} éléments."

V tomto příkladu se používá následující syntaxe:

  • #:: Komentář označující kontext řetězce, který se má přeložit. Stejný řetězec se může přeložit jinak v závislosti na tom, kde se používá.
  • msgid: Nepřeložený řetězec.
  • msgstr: Přeložený řetězec.

Pro podporu pluralizace je možné definovat více položek.

  • msgid_plural: Nepřeložitý řetězec v množném čísle.
  • msgstr[0]: Přeložený řetězec pro případ 0.
  • msgstr[N]: Přeložený řetězec pro případ N.

Specifikace souboru PO najdete tady.

Konfigurace podpory souborů PO v ASP.NET Core

Tento příklad je založený na webové aplikaci ASP.NET Core vygenerované ze šablony projektu sady Visual Studio 2022.

Odkazování na balíček

Přidejte odkaz na OrchardCore.Localization.Core balíček NuGet.

Soubor .csproj teď obsahuje řádek podobný následujícímu (číslo verze se může lišit):

<PackageReference Include="OrchardCore.Localization.Core" Version="1.5.0" />

Registrace služby

Přidejte požadované služby do Program.cs:

builder.Services.AddPortableObjectLocalization();

builder.Services
    .Configure<RequestLocalizationOptions>(options => options
        .AddSupportedCultures("fr", "cs")
        .AddSupportedUICultures("fr", "cs"));

builder.Services
    .AddRazorPages()
    .AddViewLocalization();

Na zvolenou stránku přidejte následující kód Razor . Index.cshtml se používá v tomto příkladu.

@page
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
@{
    ViewData["Title"] = "Home";
}

<div class="text-center">
    <h1 class="display-4">Welcome</h1>
    <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

<p>@Localizer["Hello world!"]</p>

Instance IViewLocalizer se vloží a použije se k překladu textu "Hello world!".

Vytvoření souboru PO

Vytvořte soubor s názvem <> v kořenové složce aplikace. V tomto příkladu je název souboru fr.po , protože se používá francouzský jazyk:

msgid "Hello world!"
msgstr "Bonjour le monde!"

Tento soubor ukládá řetězec pro překlad i řetězec přeložený francouzštinou. Překlady se v případě potřeby vrátí k nadřazené kulturní verzi. V tomto příkladu se soubor fr.po použije, pokud je požadována jazyková verze fr-FR nebo fr-CA.

Testování aplikace

Spusťte aplikaci, zobrazí se text Hello World.

Přejděte na adresu URL /Index?culture=fr-FR. Zobrazí se text Bonjour le monde!

Pluralization

Soubory PO podporují pluralizační formy, což je užitečné, když je třeba stejný řetězec přeložit různě na základě kardinality. Tato úloha je složitá skutečností, že každý jazyk definuje vlastní pravidla pro výběr řetězce, který se má použít na základě kardinality.

Balíček Orchard Localization poskytuje rozhraní API pro automatické použití těchto různých plurálů.

Vytváření pluralizačních PO souborů

Do dříve zmíněného souboru fr.po přidejte následující obsah:

msgid "There is one item."
msgid_plural "There are {0} items."
msgstr[0] "Il y a un élément."
msgstr[1] "Il y a {0} éléments."

Podívejte se na Co je soubor PO? pro vysvětlení toho, co jednotlivé položky v tomto příkladu představují.

Přidání jazyka pomocí různých druhů pluralizace

V předchozím příkladu byly použity anglické a francouzské řetězce. Angličtina a francouzština mají pouze dva tvary množného čísla a sdílejí stejná pravidla, což znamená, že kardinalita jedné je namapována na první tvar množného čísla. Jakákoli jiná kardinalita se mapuje na druhý tvar množného čísla.

Ne všechny jazyky sdílejí stejná pravidla. To je ilustrováno českým jazykem, který má tři tvary množného čísla.

cs.po Vytvořte soubor následujícím způsobem a všimněte si, jak pluralizace potřebuje tři různé překlady:

msgid "Hello world!"
msgstr "Ahoj světe!!"

msgid "There is one item."
msgid_plural "There are {0} items."
msgstr[0] "Existuje jedna položka."
msgstr[1] "Existují {0} položky."
msgstr[2] "Existuje {0} položek."

Pokud chcete přijmout českou lokalizaci, přidejte "cs" do seznamu podporovaných jazykových verzí v Configure metodě:

builder.Services
    .Configure<RequestLocalizationOptions>(options => options
        .AddSupportedCultures("fr", "cs")
        .AddSupportedUICultures("fr", "cs"));

Pages/Index.cshtml Upravte soubor tak, aby se vykreslovaly lokalizované řetězce množného čísla pro několik kardinalit.

<p>@Localizer.Plural(1, "There is one item.", "There are {0} items.")</p>
<p>@Localizer.Plural(2, "There is one item.", "There are {0} items.")</p>
<p>@Localizer.Plural(5, "There is one item.", "There are {0} items.")</p>

Poznámka: V reálném scénáři by se proměnná použila k reprezentaci počtu. Tady stejný kód opakujeme se třemi různými hodnotami, abychom zpřístupnili konkrétní případ.

Při přepínání kulturních verzí se zobrazí následující:

Pro /Index:

There is one item.
There are 2 items.
There are 5 items.

Pro /Index?culture=fr:

Il y a un élément.
Il y a 2 éléments.
Il y a 5 éléments.

Pro /Index?culture=cs:

Existuje jedna položka.
Existují 2 položky.
Existuje 5 položek.

Pro českou kulturu jsou tři překlady odlišné. Francouzská a anglická kultura mají stejnou konstrukci pro poslední dva přeložené řetězce.

Pokročilé úlohy

Použití dalších argumentů

Argument na indexu nula {0} vždy představuje počet. Při vyvolání Plural metody je možné přidat další argumenty a jejich index se spustí na jednom (1).

<p>@Localizer.Plural(count, "There is one item with the color {1}.", "There are {0} items. The main color is {1}.", color)</p>

Kontextové určení řetězců

Aplikace často obsahují řetězce, které se mají přeložit na několika místech. Stejný řetězec může mít v určitých umístěních v aplikaci jiný překlad (Razor zobrazení nebo soubory tříd). Soubor PO podporuje pojem kontextu souboru, který lze použít k kategorizaci reprezentované řetězce. Pomocí kontextu souboru lze řetězec přeložit odlišně v závislosti na kontextu souboru (nebo nedostatku kontextu souboru).

Lokalizační služby PO používají název celé třídy nebo pohled, který se používá při překladu řetězce. Toho dosáhnete nastavením hodnoty položky msgctxt .

Zvažte menší přidání k předchozímu příkladu fr.po . Stránku umístěnou Razor na Pages/Index.cshtml adrese může být definována jako kontext souboru nastavením hodnoty rezervované msgctxt položky:

msgctxt "Views.Home.About"
msgid "Hello world!"
msgstr "Bonjour le monde!"

Při nastavení msgctxt dojde k překladu textu při přechodu na /Index?culture=fr-FR. Překlad neprobíhá při přechodu na /Privacy?culture=fr-FR.

Pokud se žádná konkrétní položka neshoduje s daným kontextem souboru, náhradní mechanismus Orchard Core vyhledá příslušný soubor PO bez kontextu. Za předpokladu, že není definován žádný specifický kontext souboru pro Pages/Privacy.cshtml, načtení PO souboru na /Privacy?culture=fr-FR například:

msgid "Hello world!"
msgstr "Bonjour le monde!"

Změna umístění PO souborů

Výchozí umístění souborů PO lze změnit v Programs.cs:

services.AddPortableObjectLocalization(options => options.ResourcesPath = "Localization");

V tomto příkladu se soubory PO načtou ze složky Lokalizace.

Implementace vlastní logiky pro vyhledání lokalizačních souborů

Pokud je k vyhledání souborů PO potřeba složitější logika, lze rozhraní OrchardCore.Localization.PortableObject.ILocalizationFileLocationProvider implementovat a zaregistrovat jako službu. To je užitečné v případě, že soubory nákupní objednávky mohou být uloženy v různých umístěních nebo když se soubory musí najít v hierarchii složek.

Použití jiného výchozího množného jazyka v množném čísle

Balíček obsahuje rozšiřující metodu Plural specifickou pro dvě formuláře v množném čísle. Pro jazyky vyžadující více plurálních forem vytvořte metodu pro rozšíření. S rozšiřující metodou nebudete muset poskytnout žádný lokalizační soubor pro výchozí jazyk – původní řetězce jsou již k dispozici přímo v kódu.

Můžete použít obecnější Plural(int count, string[] pluralForms, params object[] arguments) přetížení, které přijímá pole řetězců překladů.

Od Sébastien Ros, Scott Addie a Hisham Bin Ateya

Tento článek vás provede postupem použití souborů Portable Object (PO) v aplikaci ASP.NET Core s architekturou Orchard Core .

Poznámka: Orchard Core není produktem Microsoftu. Společnost Microsoft proto neposkytuje pro tuto funkci žádnou podporu.

Zobrazení nebo stažení ukázkového kódu (postup stažení)

Co je soubor PO?

PO soubory jsou distribuovány jako textové soubory obsahující přeložené řetězce pro daný jazyk. Mezi výhody použití souborů PO místo souborů .resx patří:

  • PO soubory podporují pluralizaci; .resx soubory nepodporují pluralizaci.
  • Soubory PO nejsou kompilovány jako soubory .resx . Proto se nevyžadují specializované nástroje a kroky sestavení.
  • PO soubory fungují dobře s nástroji pro spolupráci a online úpravy.

Example

Tady je ukázkový soubor PO obsahující překlad dvou řetězců ve francouzštině, včetně jednoho s jeho množnou formou:

fr.po

#: Pages/Index.cshtml:13
msgid "Hello world!"
msgstr "Bonjour le monde!"

msgid "There is one item."
msgid_plural "There are {0} items."
msgstr[0] "Il y a un élément."
msgstr[1] "Il y a {0} éléments."

V tomto příkladu se používá následující syntaxe:

  • #:: Komentář označující kontext řetězce, který se má přeložit. Stejný řetězec se může přeložit jinak v závislosti na tom, kde se používá.
  • msgid: Nepřeložený řetězec.
  • msgstr: Přeložený řetězec.

V případě podpory pluralizace je možné definovat více položek.

  • msgid_plural: Nepřeložitý řetězec v množném čísle.
  • msgstr[0]: Přeložený řetězec pro případ 0.
  • msgstr[N]: Přeložený řetězec pro případ N.

Specifikace souboru PO najdete tady.

Konfigurace podpory souborů PO v ASP.NET Core

Tento příklad je založený na aplikaci ASP.NET Core MVC vygenerované ze šablony projektu sady Visual Studio 2019.

Odkazování na balíček

Přidejte odkaz na OrchardCore.Localization.Core balíček NuGet.

Soubor .csproj teď obsahuje řádek podobný následujícímu (číslo verze se může lišit):

<PackageReference Include="OrchardCore.Localization.Core" Version="1.2.0" />

Registrace služby

Přidejte požadované služby do ConfigureServices metody Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages()
        .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix);

    services.AddPortableObjectLocalization();

    services.Configure<RequestLocalizationOptions>(options => options
        .AddSupportedCultures("fr", "cs")
        .AddSupportedUICultures("fr", "cs")
    );
}

Přidejte požadovaný middleware do Configure metody Startup.cs:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
    }

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

    app.UseRequestLocalization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
    });
}

Na zvolenou stránku přidejte následující kód Razor . Index.cshtml se používá v tomto příkladu.

@page
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
@{
    ViewData["Title"] = "Home";
}

<div class="text-center">
    <h1 class="display-4">Welcome</h1>
    <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

<p>@Localizer["Hello world!"]</p>

Instance IViewLocalizer se vloží a použije se k překladu textu "Hello world!".

Vytvoření souboru PO

Vytvořte soubor s názvem <> v kořenové složce aplikace. V tomto příkladu je název souboru fr.po , protože se používá francouzský jazyk:

msgid "Hello world!"
msgstr "Bonjour le monde!"

Tento soubor ukládá řetězec pro překlad i řetězec přeložený francouzštinou. Překlady se v případě potřeby vrátí k nadřazené kulturní verzi. V tomto příkladu se soubor fr.po použije, pokud je požadována jazyková verze fr-FR nebo fr-CA.

Testování aplikace

Spusťte aplikaci a přejděte na adresu URL /Index. Zobrazí se text Hello World.

Přejděte na adresu URL /Index?culture=fr-FR. Zobrazí se text Bonjour le monde!

Pluralization

Soubory PO podporují pluralizační formy, což je užitečné, když je třeba stejný řetězec přeložit různě na základě kardinality. Tato úloha je složitá skutečností, že každý jazyk definuje vlastní pravidla pro výběr řetězce, který se má použít na základě kardinality.

Balíček Orchard Localization poskytuje rozhraní API pro automatické použití těchto různých plurálů.

Vytváření pluralizačních PO souborů

Do dříve zmíněného souboru fr.po přidejte následující obsah:

msgid "There is one item."
msgid_plural "There are {0} items."
msgstr[0] "Il y a un élément."
msgstr[1] "Il y a {0} éléments."

Podívejte se na Co je soubor PO? pro vysvětlení toho, co jednotlivé položky v tomto příkladu představují.

Přidání jazyka pomocí různých druhů pluralizace

V předchozím příkladu byly použity anglické a francouzské řetězce. Angličtina a francouzština mají pouze dva tvary množného čísla a sdílejí stejná pravidla, což znamená, že kardinalita jedné je namapována na první tvar množného čísla. Jakákoli jiná kardinalita se mapuje na druhý tvar množného čísla.

Ne všechny jazyky sdílejí stejná pravidla. To je ilustrováno českým jazykem, který má tři tvary množného čísla.

cs.po Vytvořte soubor následujícím způsobem a všimněte si, jak pluralizace potřebuje tři různé překlady:

msgid "Hello world!"
msgstr "Ahoj světe!!"

msgid "There is one item."
msgid_plural "There are {0} items."
msgstr[0] "Existuje jedna položka."
msgstr[1] "Existují {0} položky."
msgstr[2] "Existuje {0} položek."

Pokud chcete přijmout českou lokalizaci, přidejte "cs" do seznamu podporovaných jazykových verzí v ConfigureServices metodě:

services.Configure<RequestLocalizationOptions>(options => options
                .AddSupportedCultures("fr", "cs")
                .AddSupportedUICultures("fr", "cs")
            );

Pages/Index.cshtml Upravte soubor tak, aby se vykreslovaly lokalizované řetězce množného čísla pro několik kardinalit.

<p>@Localizer.Plural(1, "There is one item.", "There are {0} items.")</p>
<p>@Localizer.Plural(2, "There is one item.", "There are {0} items.")</p>
<p>@Localizer.Plural(5, "There is one item.", "There are {0} items.")</p>

Poznámka: V reálném scénáři by se proměnná použila k reprezentaci počtu. Tady stejný kód opakujeme se třemi různými hodnotami, abychom zpřístupnili velmi konkrétní případ.

Při přepínání kulturních verzí se zobrazí následující:

Pro /Index:

There is one item.
There are 2 items.
There are 5 items.

Pro /Index?culture=fr:

Il y a un élément.
Il y a 2 éléments.
Il y a 5 éléments.

Pro /Index?culture=cs:

Existuje jedna položka.
Existují 2 položky.
Existuje 5 položek.

Všimněte si, že pro českou kulturu jsou tři překlady odlišné. Francouzská a anglická kultura mají stejnou konstrukci pro poslední dva přeložené řetězce.

Pokročilé úlohy

Kontextové určení řetězců

Aplikace často obsahují řetězce, které se mají přeložit na několika místech. Stejný řetězec může mít v určitých umístěních v aplikaci jiný překlad (Razor zobrazení nebo soubory tříd). Soubor PO podporuje pojem kontextu souboru, který lze použít k kategorizaci reprezentované řetězce. Pomocí kontextu souboru lze řetězec přeložit odlišně v závislosti na kontextu souboru (nebo nedostatku kontextu souboru).

Lokalizační služby PO používají název celé třídy nebo pohled, který se používá při překladu řetězce. Toho dosáhnete nastavením hodnoty položky msgctxt .

Zvažte menší přidání k předchozímu příkladu fr.po . Zobrazení Razor umístěné na Pages/Index.cshtml adrese může být definováno jako kontext souboru nastavením hodnoty rezervované msgctxt položky:

msgctxt "Pages.Index"
msgid "Hello world!"
msgstr "Bonjour le monde!"

Při nastavení msgctxt dojde k překladu textu při přechodu na /Index?culture=fr-FR. Překlad neproběhne při přechodu na /Privacy?culture=fr-FR.

Pokud se žádná konkrétní položka neshoduje s daným kontextem souboru, náhradní mechanismus Orchard Core vyhledá příslušný soubor PO bez kontextu. Za předpokladu, že není definován žádný specifický kontext souboru pro Pages/Privacy.cshtml, načtení PO souboru na /Privacy?culture=fr-FR například:

msgid "Hello world!"
msgstr "Bonjour le monde!"

Změna umístění PO souborů

Výchozí umístění souborů PO lze změnit v ConfigureServices:

services.AddPortableObjectLocalization(options => options.ResourcesPath = "Localization");

V tomto příkladu se soubory PO načtou ze složky Lokalizace.

Implementace vlastní logiky pro vyhledání lokalizačních souborů

Pokud je k vyhledání souborů PO potřeba složitější logika, lze rozhraní OrchardCore.Localization.PortableObject.ILocalizationFileLocationProvider implementovat a zaregistrovat jako službu. To je užitečné v případě, že soubory nákupní objednávky mohou být uloženy v různých umístěních nebo když se soubory musí najít v hierarchii složek.

Použití jiného výchozího množného jazyka v množném čísle

Balíček obsahuje rozšiřující metodu Plural specifickou pro dvě formuláře v množném čísle. Pro jazyky vyžadující více plurálních forem vytvořte metodu pro rozšíření. S rozšiřující metodou nebudete muset poskytnout žádný lokalizační soubor pro výchozí jazyk – původní řetězce jsou již k dispozici přímo v kódu.

Můžete použít obecnější Plural(int count, string[] pluralForms, params object[] arguments) přetížení, které přijímá pole řetězců překladů.

Od Sébastien Ros, Scott Addie a Hisham Bin Ateya

Tento článek vás provede postupem použití souborů Portable Object (PO) v aplikaci ASP.NET Core s architekturou Orchard Core .

Poznámka: Orchard Core není produktem Microsoftu. Společnost Microsoft proto neposkytuje pro tuto funkci žádnou podporu.

Zobrazení nebo stažení ukázkového kódu (postup stažení)

Co je soubor PO?

PO soubory jsou distribuovány jako textové soubory obsahující přeložené řetězce pro daný jazyk. Mezi výhody použití souborů PO místo souborů .resx patří:

  • PO soubory podporují pluralizaci; .resx soubory nepodporují pluralizaci.
  • Soubory PO nejsou kompilovány jako soubory .resx . Proto se nevyžadují specializované nástroje a kroky sestavení.
  • PO soubory fungují dobře s nástroji pro spolupráci a online úpravy.

Example

Tady je ukázkový soubor PO obsahující překlad dvou řetězců ve francouzštině, včetně jednoho s jeho množnou formou:

fr.po

#: Services/EmailService.cs:29
msgid "Enter a comma separated list of email addresses."
msgstr "Entrez une liste d'emails séparés par une virgule."

#: Views/Email.cshtml:112
msgid "The email address is \"{0}\"."
msgid_plural "The email addresses are \"{0}\"."
msgstr[0] "L'adresse email est \"{0}\"."
msgstr[1] "Les adresses email sont \"{0}\""

V tomto příkladu se používá následující syntaxe:

  • #:: Komentář označující kontext řetězce, který se má přeložit. Stejný řetězec se může přeložit jinak v závislosti na tom, kde se používá.
  • msgid: Nepřeložený řetězec.
  • msgstr: Přeložený řetězec.

V případě podpory pluralizace je možné definovat více položek.

  • msgid_plural: Nepřeložitý řetězec v množném čísle.
  • msgstr[0]: Přeložený řetězec pro případ 0.
  • msgstr[N]: Přeložený řetězec pro případ N.

Specifikace souboru PO najdete tady.

Konfigurace podpory souborů PO v ASP.NET Core

Tento příklad vychází z aplikace ASP.NET Core MVC vygenerované ze šablony projektu sady Visual Studio 2017.

Odkazování na balíček

Přidejte odkaz na OrchardCore.Localization.Core balíček NuGet.

Soubor .csproj teď obsahuje řádek podobný následujícímu (číslo verze se může lišit):

<PackageReference Include="OrchardCore.Localization.Core" Version="1.0.0" />

Registrace služby

Přidejte požadované služby do ConfigureServices metody Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
        .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix);

    services.AddPortableObjectLocalization();

    services.Configure<RequestLocalizationOptions>(options =>
        {
            var supportedCultures = new List<CultureInfo>
            {
                new CultureInfo("en-US"),
                new CultureInfo("en"),
                new CultureInfo("fr-FR"),
                new CultureInfo("fr")
            };

            options.DefaultRequestCulture = new RequestCulture("en-US");
            options.SupportedCultures = supportedCultures;
            options.SupportedUICultures = supportedCultures;
        });
}

Přidejte požadovaný middleware do Configure metody Startup.cs:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
    }

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

    app.UseRequestLocalization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
    });
}

Do volby zobrazení přidejte následující kód Razor . About.cshtml se používá v tomto příkladu.

@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer

<p>@Localizer["Hello world!"]</p>

Instance IViewLocalizer se vloží a použije se k překladu textu "Hello world!".

Vytvoření souboru PO

Vytvořte soubor s názvem <> v kořenové složce aplikace. V tomto příkladu je název souboru fr.po , protože se používá francouzský jazyk:

msgid "Hello world!"
msgstr "Bonjour le monde!"

Tento soubor ukládá řetězec pro překlad i řetězec přeložený francouzštinou. Překlady se v případě potřeby vrátí k nadřazené kulturní verzi. V tomto příkladu se soubor fr.po použije, pokud je požadována jazyková verze fr-FR nebo fr-CA.

Testování aplikace

Spusťte aplikaci a přejděte na adresu URL /Home/About. Zobrazí se text Hello World.

Přejděte na adresu URL /Home/About?culture=fr-FR. Zobrazí se text Bonjour le monde!

Pluralization

Soubory PO podporují pluralizační formy, což je užitečné, když je třeba stejný řetězec přeložit různě na základě kardinality. Tato úloha je složitá skutečností, že každý jazyk definuje vlastní pravidla pro výběr řetězce, který se má použít na základě kardinality.

Balíček Orchard Localization poskytuje rozhraní API pro automatické použití těchto různých plurálů.

Vytváření pluralizačních PO souborů

Do dříve zmíněného souboru fr.po přidejte následující obsah:

msgid "There is one item."
msgid_plural "There are {0} items."
msgstr[0] "Il y a un élément."
msgstr[1] "Il y a {0} éléments."

Podívejte se na Co je soubor PO? pro vysvětlení toho, co jednotlivé položky v tomto příkladu představují.

Přidání jazyka pomocí různých druhů pluralizace

V předchozím příkladu byly použity anglické a francouzské řetězce. Angličtina a francouzština mají pouze dva tvary množného čísla a sdílejí stejná pravidla, což znamená, že kardinalita jedné je namapována na první tvar množného čísla. Jakákoli jiná kardinalita se mapuje na druhý tvar množného čísla.

Ne všechny jazyky sdílejí stejná pravidla. To je ilustrováno českým jazykem, který má tři tvary množného čísla.

cs.po Vytvořte soubor následujícím způsobem a všimněte si, jak pluralizace potřebuje tři různé překlady:

msgid "Hello world!"
msgstr "Ahoj světe!!"

msgid "There is one item."
msgid_plural "There are {0} items."
msgstr[0] "Existuje jedna položka."
msgstr[1] "Existují {0} položky."
msgstr[2] "Existuje {0} položek."

Pokud chcete přijmout českou lokalizaci, přidejte "cs" do seznamu podporovaných jazykových verzí v ConfigureServices metodě:

var supportedCultures = new List<CultureInfo>
{
    new CultureInfo("en-US"),
    new CultureInfo("en"),
    new CultureInfo("fr-FR"),
    new CultureInfo("fr"),
    new CultureInfo("cs")
};

Views/Home/About.cshtml Upravte soubor tak, aby se vykreslovaly lokalizované řetězce množného čísla pro několik kardinalit.

<p>@Localizer.Plural(1, "There is one item.", "There are {0} items.")</p>
<p>@Localizer.Plural(2, "There is one item.", "There are {0} items.")</p>
<p>@Localizer.Plural(5, "There is one item.", "There are {0} items.")</p>

Poznámka: V reálném scénáři by se proměnná použila k reprezentaci počtu. Tady stejný kód opakujeme se třemi různými hodnotami, abychom zpřístupnili velmi konkrétní případ.

Při přepínání kulturních verzí se zobrazí následující:

Pro /Home/About:

There is one item.
There are 2 items.
There are 5 items.

Pro /Home/About?culture=fr:

Il y a un élément.
Il y a 2 éléments.
Il y a 5 éléments.

Pro /Home/About?culture=cs:

Existuje jedna položka.
Existují 2 položky.
Existuje 5 položek.

Všimněte si, že pro českou kulturu jsou tři překlady odlišné. Francouzská a anglická kultura mají stejnou konstrukci pro poslední dva přeložené řetězce.

Pokročilé úlohy

Kontextové určení řetězců

Aplikace často obsahují řetězce, které se mají přeložit na několika místech. Stejný řetězec může mít v určitých umístěních v aplikaci jiný překlad (Razor zobrazení nebo soubory tříd). Soubor PO podporuje pojem kontextu souboru, který lze použít k kategorizaci reprezentované řetězce. Pomocí kontextu souboru lze řetězec přeložit odlišně v závislosti na kontextu souboru (nebo nedostatku kontextu souboru).

Lokalizační služby PO používají název celé třídy nebo pohled, který se používá při překladu řetězce. Toho dosáhnete nastavením hodnoty položky msgctxt .

Zvažte menší přidání k předchozímu příkladu fr.po . Zobrazení Razor umístěné na Views/Home/About.cshtml adrese může být definováno jako kontext souboru nastavením hodnoty rezervované msgctxt položky:

msgctxt "Views.Home.About"
msgid "Hello world!"
msgstr "Bonjour le monde!"

Při nastavení msgctxt dojde k překladu textu při přechodu na /Home/About?culture=fr-FR. Překlad neproběhne při přechodu na /Home/Contact?culture=fr-FR.

Pokud se žádná konkrétní položka neshoduje s daným kontextem souboru, náhradní mechanismus Orchard Core vyhledá příslušný soubor PO bez kontextu. Za předpokladu, že není definován žádný specifický kontext souboru pro Views/Home/Contact.cshtml, načtení PO souboru na /Home/Contact?culture=fr-FR například:

msgid "Hello world!"
msgstr "Bonjour le monde!"

Změna umístění PO souborů

Výchozí umístění souborů PO lze změnit v ConfigureServices:

services.AddPortableObjectLocalization(options => options.ResourcesPath = "Localization");

V tomto příkladu se soubory PO načtou ze složky Lokalizace.

Implementace vlastní logiky pro vyhledání lokalizačních souborů

Pokud je k vyhledání souborů PO potřeba složitější logika, lze rozhraní OrchardCore.Localization.PortableObject.ILocalizationFileLocationProvider implementovat a zaregistrovat jako službu. To je užitečné v případě, že soubory nákupní objednávky mohou být uloženy v různých umístěních nebo když se soubory musí najít v hierarchii složek.

Použití jiného výchozího množného jazyka v množném čísle

Balíček obsahuje rozšiřující metodu Plural specifickou pro dvě formuláře v množném čísle. Pro jazyky vyžadující více plurálních forem vytvořte metodu pro rozšíření. S rozšiřující metodou nebudete muset poskytnout žádný lokalizační soubor pro výchozí jazyk – původní řetězce jsou již k dispozici přímo v kódu.

Můžete použít obecnější Plural(int count, string[] pluralForms, params object[] arguments) přetížení, které přijímá pole řetězců překladů.