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

Sébastien Ros, Scott Addie a Hisham Bin Ateya

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

Poznámka: Už není produktem Microsoftu. V důsledku toho Microsoft tuto funkci nepodporuje.

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

Co je soubor po?

Soubory PO se distribuují 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ří:

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

Příklad

Tady je ukázkový soubor PO obsahující překlad pro dva řetězce ve francouzštině, včetně jednoho s množném číslem:

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}\""

Tento příklad používá následující syntaxi:

  • #:: Komentář označující kontext řetězce, který se má přeložit. Stejný řetězec se může překládat různě 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žený ř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 ASP.NET Core MVC vygenerované ze šablony projektu Visual Studio 2017.

Odkazování na balíček

Přidejte odkaz na OrchardCore.Localization.Core 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-rc2-13450" />

Registrace služby

Přidejte požadované služby ConfigureServices do metody souboru 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 Configure do metody souboru 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 zobrazení podle volby Razor přidejte následující kód. V tomto příkladu se používá soubor About.cshtml.

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

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

Instance IViewLocalizer se injektuje a používá se k překladu textu "Hello world!".

Vytvoření souboru PO

V kořenové složce aplikace vytvořte soubor s názvem <culture code> .po. V tomto příkladu je název souboru fr.po, protože se používá francouzština:

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

V tomto souboru je uložen ř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é jazykové verzi. V tomto příkladu se soubor fr.po použije, pokud požadovaná jazyková verze je fr-FR nebo fr-CA .

Testování aplikace

Spusťte aplikaci a přejděte na adresu URL /Home/About . Text Hello world! se zobrazí .

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

Pluralizace

Soubory PO podporují formuláře pluralizace, což je užitečné v případě, že je potřeba překládat stejný řetězec odlišně na základě kardinálnosti. Tato úloha je komplikovaná skutečností, že každý jazyk definuje vlastní pravidla pro výběr řetězce, který se má použít na základě kardinity.

Balíček localization poskytuje rozhraní API pro automatické vyvolání těchto různých množného čísla.

Vytváření souborů PO pro pluralizaci

Do výše uvedené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."

Vysvětlení toho, co jednotlivé položky v tomto příkladu představují, najdete v tématu Co je soubor po.

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

V předchozím příkladu se používaly řetězce pro angličtinu a francouzštinu. Angličtina a francouzština mají pouze dvě formuláře pluralizace a sdílejí stejná pravidla formuláře, což znamená, že kardinalita jednoho je namapovaná na první množné číslo. Jakákoli jiná kardinalita se mapuje na druhý tvar v množném čísle.

Ne všechny jazyky sdílejí stejná pravidla. Je to znázorněno v češtině, který má tři podoby v množném čísle.

Vytvořte soubor cs.po následujícím způsobem a všimněte si, že pluralizace vyžaduje 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řijímat češtinu lokalizací, přidejte do "cs" 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")
};

Upravte soubor Views/ Home /About.cshtml a vykreslete lokalizované řetězce v množném čísle pro několik kardinálů:

<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: Ve skutečném scénáři by se k reprezentaci počtu použila proměnná. Tady zopakujeme stejný kód se třemi různými hodnotami, aby se vystavoval velmi specifický případ.

Při přepínání jazykových verzí uvidíte 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 češtinu se tyto tři překlady liší. Francouzština a angličtina mají stejnou konstrukci pro dva poslední přeložené řetězce.

Pokročilé úlohy

Kontextová inicializace ř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 jiný překlad v určitých umístěních v rámci aplikace ( Razor zobrazení nebo soubory tříd). Soubor PO podporuje zorný výraz kontextu souboru, který lze použít ke kategorizaci reprezentovaných řetězců. Pomocí kontextu souboru lze řetězec přeložit různě v závislosti na kontextu souboru (nebo chybějícím kontextu souboru).

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

Zvažte dílčí doplnění předchozího příkladu fr.po. Zobrazení Razor v views/ Home /About.cshtml se může definovat jako kontext souboru nastavením hodnoty msgctxt rezervované položky:

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

S msgctxt nastavenou jako taková k překladu textu dochází při přechodu na /Home/About?culture=fr-FR . K překladu nedojde při přechodu na /Home/Contact?culture=fr-FR .

Pokud se s daným kontextem souboru neshoduje žádná konkrétní položka, záložní mechanismus Odoly Core hledá vhodný soubor NÁKUPNÍ položky bez kontextu. Za předpokladu, že pro Views/ Home /Contact.cshtml není definovaný žádný konkrétní kontext souboru, přejdete k načtení souboru /Home/Contact?culture=fr-FR PO, například:

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

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

Výchozí umístění souborů PO můžete změnit v souboru ConfigureServices :

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

V tomto příkladu se soubory PO načítá ze složky Localization.

Implementace vlastní logiky pro hledání souborů lokalizace

Pokud je k vyhledání souborů PO potřeba složitější logika, je možné rozhraní OrchardCore.Localization.PortableObject.ILocalizationFileLocationProvider implementovat a zaregistrovat jako službu. To je užitečné, když se soubory PO můžou ukládat v různých umístěních nebo když se musí najít v hierarchii složek.

Použití jiného výchozího pluralizovaného jazyka

Balíček obsahuje rozšiřující Plural metodu, která je specifická pro dvě podoby v množném čísle. Pro jazyky, které vyžadují více formulářů v množném čísle, vytvořte rozšiřující metodu. V případě metody rozšíření nebudete muset poskytovat žádný soubor lokalizace pro výchozí jazyk, protože původní řetězce jsou již k dispozici — přímo v kódu.

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

Sébastien Ros a Scott Addie

Tento článek vás provede kroky pro použití souborů PO (Portable Object) v aplikaci ASP.NET Core s architekturou Zařízení Core.

Poznámka: Už není produktem Microsoftu. V důsledku toho Microsoft tuto funkci nepodporuje.

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

Co je soubor po?

Soubory PO se distribuují 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ří:

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

Příklad

Tady je ukázkový soubor PO obsahující překlad pro dva řetězce ve francouzštině, včetně jednoho s množném číslem:

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}\""

Tento příklad používá následující syntaxi:

  • #:: Komentář označující kontext řetězce, který se má přeložit. Stejný řetězec se může překládat různě 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žený ř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 ASP.NET Core MVC vygenerované ze šablony projektu Visual Studio 2017.

Odkazování na balíček

Přidejte odkaz na OrchardCore.Localization.Core 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-beta1-3187" />

Registrace služby

Přidejte požadované služby ConfigureServices do metody souboru 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 Configure do metody souboru Startup.cs:

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

    app.UseStaticFiles();

    app.UseRequestLocalization();

    app.UseMvcWithDefaultRoute();
}

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

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

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

Instance IViewLocalizer se injektuje a používá se k překladu textu "Hello world!".

Vytvoření souboru PO

V kořenové složce aplikace vytvořte soubor s názvem <culture code> .po. V tomto příkladu je název souboru fr.po, protože se používá francouzština:

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

V tomto souboru je uložen ř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é jazykové verzi. V tomto příkladu se soubor fr.po použije, pokud požadovaná jazyková verze je fr-FR nebo fr-CA .

Testování aplikace

Spusťte aplikaci a přejděte na adresu URL /Home/About . Text Hello world! se zobrazí .

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

Pluralizace

Soubory PO podporují formuláře pluralizace, což je užitečné v případě, že je potřeba překládat stejný řetězec různě na základě mohutnosti. Tato úloha je komplikovaná skutečností, že každý jazyk definuje vlastní pravidla pro výběr řetězce, který se má použít na základě kardinity.

Balíček Pro lokalizaci v Microsoftu poskytuje rozhraní API pro automatické vyvolání těchto různých množného čísla.

Vytváření souborů PO pro pluralizaci

Do výše uvedené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."

Vysvětlení toho, co jednotlivé položky v tomto příkladu představují, najdete v tématu Co je soubor po.

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

V předchozím příkladu se používaly řetězce pro angličtinu a francouzštinu. Angličtina a francouzština mají pouze dva formuláře pluralizace a sdílejí stejná pravidla formuláře, což znamená, že kardinalita jednoho je namapovaná na první formulář v množném čísle. Jakákoli jiná kardinalita se mapuje na druhý tvar v množném čísle.

Ne všechny jazyky sdílejí stejná pravidla. Je to znázorněno v češtině, který má tři podoby v množném čísle.

Vytvořte soubor cs.po následujícím způsobem a všimněte si, že pluralizace vyžaduje 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řijímat češtinu lokalizací, přidejte do "cs" 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")
};

Upravte soubor Views/ Home /About.cshtml a vykreslete lokalizované řetězce v množném čísle pro několik kardinálů:

<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: Ve skutečném scénáři by se proměnná použila k reprezentaci počtu. Tady zopakujeme stejný kód se třemi různými hodnotami, aby se vystavoval velmi specifický případ.

Při přepínání jazykových verzí uvidíte 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 češtinu se tyto tři překlady liší. Francouzština a angličtina mají stejnou konstrukci pro dva poslední přeložené řetězce.

Pokročilé úlohy

Kontextová inicializace ř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 jiný překlad v určitých umístěních v rámci aplikace ( Razor zobrazení nebo soubory tříd). Soubor PO podporuje zorný výraz kontextu souboru, který lze použít ke kategorizaci reprezentovaných řetězců. Pomocí kontextu souboru lze řetězec překládat odlišně v závislosti na kontextu souboru (nebo chybějícím kontextu souboru).

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

Zvažte dílčí doplnění předchozího příkladu fr.po. Zobrazení Razor v views/ Home /About.cshtml se může definovat jako kontext souboru nastavením hodnoty msgctxt rezervované položky:

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

S msgctxt nastavenou jako taková k překladu textu dochází při přechodu na /Home/About?culture=fr-FR . K překladu nedojde při přechodu na /Home/Contact?culture=fr-FR .

Pokud se s daným kontextem souboru neshoduje žádná konkrétní položka, záložní mechanismus Odoly Core hledá vhodný soubor nákupních návěn bez kontextu. Za předpokladu, že pro Views/ Home /Contact.cshtml není definovaný žádný konkrétní kontext souboru, přejdete k načtení souboru /Home/Contact?culture=fr-FR PO, například:

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

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

Výchozí umístění souborů PO můžete změnit v souboru ConfigureServices :

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

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

Implementace vlastní logiky pro hledání souborů lokalizace

Pokud je k vyhledání souborů PO potřeba složitější logika, je možné rozhraní OrchardCore.Localization.PortableObject.ILocalizationFileLocationProvider implementovat a zaregistrovat jako službu. To je užitečné, když se soubory PO můžou ukládat v různých umístěních nebo když se musí najít v hierarchii složek.

Použití jiného výchozího pluralizovaného jazyka

Balíček obsahuje rozšiřující Plural metodu, která je specifická pro dvě podoby v množném čísle. Pro jazyky, které vyžadují více formulářů v množném čísle, vytvořte rozšiřující metodu. V případě metody rozšíření nebudete muset poskytovat žádný soubor lokalizace pro výchozí jazyk, protože původní řetězce jsou již k dispozici — přímo v kódu.

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