Dela via


Konfigurera lokalisering av portabla objekt i ASP.NET Core

Av Hisham Bin Ateya och Sébastien Ros.

Den här artikeln går igenom stegen för att använda PO-filer (Portable Object) i ett ASP.NET Core-program med Ramen för Orchard Core .

Obs: Orchard Core är inte en Microsoft-produkt. Microsoft har inget stöd för den här funktionen.

Visa eller ladda ned exempelkod (hur du laddar ned)

Vad är en PO-fil?

PO-filer distribueras som textfiler som innehåller översatta strängar för ett visst språk. Några fördelar med att använda PO-filer i stället för .resx-filer är:

  • PO-filer stöder pluralisering; .resx-filer stöder inte pluralisering.
  • PO-filer kompileras inte som .resx-filer . Därför krävs inte specialiserade verktyg och byggsteg.
  • PO-filer fungerar bra med samarbetsverktyg för onlineredigering.

Example

Följande exempel-PO-fil innehåller översättningen för två strängar på franska, inklusive en med dess pluralform:

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."

I det här exemplet används följande syntax:

  • #:: En kommentar som anger kontexten för strängen som ska översättas. Samma sträng kan översättas på olika sätt beroende på var den används.
  • msgid: Den oöversatta strängen.
  • msgstr: Den översatta strängen.

För stöd för pluralisering kan fler poster definieras.

  • msgid_plural: Den oöversatta pluralsträngen.
  • msgstr[0]: Den översatta strängen för fallet 0.
  • msgstr[N]: Den översatta strängen för fallet N.

Specifikationen för PO-filen finns här.

Konfigurera po-filstöd i ASP.NET Core

Det här exemplet baseras på ett ASP.NET Core-webbprogram som genererats från en Visual Studio 2022-projektmall.

Hänvisa till paketet

Lägg till en referens till OrchardCore.Localization.Core NuGet-paketet.

Filen .csproj innehåller nu en rad som liknar följande (versionsnumret kan variera):

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

Registrera tjänsten

Lägg till de nödvändiga tjänsterna i Program.cs:

builder.Services.AddPortableObjectLocalization();

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

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

Lägg till följande kod på valfri Razor sida. Index.cshtml används i det här exemplet.

@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>

En IViewLocalizer instans matas in och används för att översätta texten "Hello world!".

Skapa en PO-fil

Skapa en fil med namnet <culture code.po> i programrotmappen. I det här exemplet är filnamnet fr.po eftersom det franska språket används:

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

Den här filen lagrar både strängen som ska översättas och den fransköversatta strängen. Översättningar återgår till sin ursprungliga kultur om det behövs. I det här exemplet används filen fr.po om den begärda kulturen är fr-FR eller fr-CA.

Testa programmet

Kör ditt program, texten Hello world! visas.

Navigera till URL /Index?culture=fr-FR. Texten Bonjour le monde! visas på skärmen.

Pluralization

PO-filer stöder pluraliseringsformer, vilket är användbart när samma sträng måste översättas på olika sätt baserat på kardinalitet. Den här uppgiften kompliceras av att varje språk definierar anpassade regler för att välja vilken sträng som ska användas baserat på kardinaliteten.

Lokaliseringspaketet för Fruktträdgården tillhandahåller ett API för att anropa dessa olika pluralformulär automatiskt.

Skapa po-filer för pluralisering

Lägg till följande innehåll i den tidigare nämnda fr.po-filen :

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."

Se Vad är en PO-fil? för en förklaring av vad varje post i det här exemplet representerar.

Lägga till ett språk med olika pluraliseringsformer

Engelska och franska strängar användes i föregående exempel. Engelska och franska har bara två pluraliseringsformer och delar samma formregler, vilket är att en kardinalitet av en mappas till den första pluralformen. Alla andra kardinaliteter mappas till det andra pluralformen.

Alla språk har inte samma regler. Detta illustreras med det tjeckiska språket, som har tre pluralformer.

Skapa filen på cs.po följande sätt och notera hur pluraliseringen behöver tre olika översättningar:

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."

Om du vill acceptera tjeckiska lokaliseringar lägger du till "cs" i listan över kulturer som stöds i Configure metoden:

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

Pages/Index.cshtml Redigera filen för att återge lokaliserade pluralsträngar för flera kardinaliteter:

<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>

Not: I ett verkligt scenario skulle en variabel användas för att representera antalet. Här upprepar vi samma kod med tre olika värden för att exponera ett specifikt fall.

När du byter kultur ser du följande:

För /Index:

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

För /Index?culture=fr:

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

För /Index?culture=cs:

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

För den tjeckiska kulturen är de tre översättningarna olika. De franska och engelska kulturerna delar samma konstruktion för de två sista översatta strängarna.

Avancerade uppgifter

Använda ytterligare argument

Argumentet vid index noll {0} representerar alltid count-värdet. När du anropar Plural metoden är det möjligt att lägga till ytterligare argument och deras index börjar sedan vid ett (1).

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

Kontextualisera strängar

Program innehåller ofta de strängar som ska översättas på flera platser. Samma sträng kan ha en annan översättning på vissa platser i en app (Razor vyer eller klassfiler). En PO-fil stöder begreppet filkontext, som kan användas för att kategorisera strängen som representeras. Med hjälp av en filkontext kan en sträng översättas på olika sätt, beroende på filkontexten (eller avsaknaden av en filkontext).

Lokaliseringstjänsterna för inköpsorder använder namnet på den fullständiga klassen eller vyn som används vid översättning av en sträng. Detta uppnås genom att ange värdet för msgctxt posten.

Överväg ett mindre tillägg till föregående fr.po-exempel . En Razor sida som finns på Pages/Index.cshtml kan definieras som filkontext genom att ange värdet för den reserverade msgctxt posten:

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

Med uppsättningen msgctxt som sådan sker textöversättning när du navigerar till /Index?culture=fr-FR. Översättningen sker inte när du navigerar till /Privacy?culture=fr-FR.

När ingen specifik post matchas med en viss filkontext letar Orchard Cores återställningsmekanism efter en lämplig PO-fil utan kontext. Förutsatt att det inte finns någon specifik filkontext definierad för Pages/Privacy.cshtmlläser du in /Privacy?culture=fr-FR en PO-fil som:

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

Ändra platsen för PO-filer

Standardplatsen för PO-filer kan ändras i Programs.cs:

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

I det här exemplet läses PO-filerna in från mappen Lokalisering .

Implementera en anpassad logik för att hitta lokaliseringsfiler

När mer komplex logik behövs för att hitta PO-filer OrchardCore.Localization.PortableObject.ILocalizationFileLocationProvider kan gränssnittet implementeras och registreras som en tjänst. Detta är användbart när PO-filer kan lagras på olika platser eller när filerna måste hittas i en hierarki med mappar.

Använda ett annat standardspråk för pluralisering

Paketet innehåller en Plural tilläggsmetod som är specifik för två pluralformer. Skapa en tilläggsmetod för språk som kräver fler pluralformer. Med en tilläggsmetod behöver du inte ange någon lokaliseringsfil för standardspråket – de ursprungliga strängarna är redan tillgängliga direkt i koden.

Du kan använda den mer allmänna Plural(int count, string[] pluralForms, params object[] arguments) överbelastningen som accepterar en strängmatris med översättningar.

Av Sébastien Ros, Scott Addie och Hisham Bin Ateya

Den här artikeln går igenom stegen för att använda PO-filer (Portable Object) i ett ASP.NET Core-program med Ramen för Orchard Core .

Obs: Orchard Core är inte en Microsoft-produkt. Microsoft tillhandahåller därför inget stöd för den här funktionen.

Visa eller ladda ned exempelkod (hur du laddar ned)

Vad är en PO-fil?

PO-filer distribueras som textfiler som innehåller översatta strängar för ett visst språk. Några fördelar med att använda PO-filer i stället för .resx-filer är:

  • PO-filer stöder pluralisering; .resx-filer stöder inte pluralisering.
  • PO-filer kompileras inte som .resx-filer . Därför krävs inte specialiserade verktyg och byggsteg.
  • PO-filer fungerar bra med samarbetsverktyg för onlineredigering.

Example

Här är en po-exempelfil som innehåller översättningen för två strängar på franska, inklusive en med dess pluralform:

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."

I det här exemplet används följande syntax:

  • #:: En kommentar som anger kontexten för strängen som ska översättas. Samma sträng kan översättas på olika sätt beroende på var den används.
  • msgid: Den oöversatta strängen.
  • msgstr: Den översatta strängen.

När det gäller stöd för pluralisering kan fler poster definieras.

  • msgid_plural: Den oöversatta pluralsträngen.
  • msgstr[0]: Den översatta strängen för fallet 0.
  • msgstr[N]: Den översatta strängen för fallet N.

Specifikationen för PO-filen finns här.

Konfigurera po-filstöd i ASP.NET Core

Det här exemplet baseras på ett ASP.NET Core MVC-program som genererats från en Visual Studio 2019-projektmall.

Hänvisa till paketet

Lägg till en referens till OrchardCore.Localization.Core NuGet-paketet.

Filen .csproj innehåller nu en rad som liknar följande (versionsnumret kan variera):

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

Registrera tjänsten

Lägg till de nödvändiga tjänsterna i ConfigureServices metoden 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")
    );
}

Lägg till det mellanprogram som krävs i Configure metoden 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?}");
    });
}

Lägg till följande kod på valfri Razor sida. Index.cshtml används i det här exemplet.

@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>

En IViewLocalizer instans matas in och används för att översätta texten "Hello world!".

Skapa en PO-fil

Skapa en fil med namnet <culture code.po> i programrotmappen. I det här exemplet är filnamnet fr.po eftersom det franska språket används:

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

Den här filen lagrar både strängen som ska översättas och den fransköversatta strängen. Översättningar återgår till sin ursprungliga kultur om det behövs. I det här exemplet används filen fr.po om den begärda kulturen är fr-FR eller fr-CA.

Testa programmet

Kör ditt program och navigera till URL:en /Index. Texten Hej världen! visas.

Navigera till URL /Index?culture=fr-FR. Texten Bonjour le monde! visas på skärmen.

Pluralization

PO-filer stöder pluraliseringsformer, vilket är användbart när samma sträng måste översättas på olika sätt baserat på kardinalitet. Den här uppgiften kompliceras av att varje språk definierar anpassade regler för att välja vilken sträng som ska användas baserat på kardinaliteten.

Lokaliseringspaketet för Fruktträdgården tillhandahåller ett API för att anropa dessa olika pluralformulär automatiskt.

Skapa po-filer för pluralisering

Lägg till följande innehåll i den tidigare nämnda fr.po-filen :

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."

Se Vad är en PO-fil? för en förklaring av vad varje post i det här exemplet representerar.

Lägga till ett språk med olika pluraliseringsformer

Engelska och franska strängar användes i föregående exempel. Engelska och franska har bara två pluraliseringsformer och delar samma formregler, vilket är att en kardinalitet av en mappas till den första pluralformen. Alla andra kardinaliteter mappas till det andra pluralformen.

Alla språk har inte samma regler. Detta illustreras med det tjeckiska språket, som har tre pluralformer.

Skapa filen på cs.po följande sätt och notera hur pluraliseringen behöver tre olika översättningar:

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."

Om du vill acceptera tjeckiska lokaliseringar lägger du till "cs" i listan över kulturer som stöds i ConfigureServices metoden:

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

Pages/Index.cshtml Redigera filen för att återge lokaliserade pluralsträngar för flera kardinaliteter:

<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>

Not: I ett verkligt scenario skulle en variabel användas för att representera antalet. Här upprepar vi samma kod med tre olika värden för att exponera ett mycket specifikt fall.

När du byter kultur ser du följande:

För /Index:

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

För /Index?culture=fr:

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

För /Index?culture=cs:

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

Observera att för den tjeckiska kulturen är de tre översättningarna olika. De franska och engelska kulturerna delar samma konstruktion för de två sista översatta strängarna.

Avancerade uppgifter

Kontextualisera strängar

Program innehåller ofta de strängar som ska översättas på flera platser. Samma sträng kan ha en annan översättning på vissa platser i en app (Razor vyer eller klassfiler). En PO-fil stöder begreppet filkontext, som kan användas för att kategorisera strängen som representeras. Med hjälp av en filkontext kan en sträng översättas på olika sätt, beroende på filkontexten (eller avsaknaden av en filkontext).

Lokaliseringstjänsterna för inköpsorder använder namnet på den fullständiga klassen eller vyn som används vid översättning av en sträng. Detta uppnås genom att ange värdet för msgctxt posten.

Överväg ett mindre tillägg till föregående fr.po-exempel . En Razor vy i Pages/Index.cshtml kan definieras som filkontext genom att ange värdet för den reserverade msgctxt posten:

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

Med uppsättningen msgctxt som sådan sker textöversättning när du navigerar till /Index?culture=fr-FR. Översättningen sker inte när du navigerar till /Privacy?culture=fr-FR.

När ingen specifik post matchas med en viss filkontext letar Orchard Cores återställningsmekanism efter en lämplig PO-fil utan kontext. Förutsatt att det inte finns någon specifik filkontext definierad för Pages/Privacy.cshtmlläser du in /Privacy?culture=fr-FR en PO-fil som:

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

Ändra platsen för PO-filer

Standardplatsen för PO-filer kan ändras i ConfigureServices:

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

I det här exemplet läses PO-filerna in från mappen Lokalisering .

Implementera en anpassad logik för att hitta lokaliseringsfiler

När mer komplex logik behövs för att hitta PO-filer OrchardCore.Localization.PortableObject.ILocalizationFileLocationProvider kan gränssnittet implementeras och registreras som en tjänst. Detta är användbart när PO-filer kan lagras på olika platser eller när filerna måste hittas i en hierarki med mappar.

Använda ett annat standardspråk för pluralisering

Paketet innehåller en Plural tilläggsmetod som är specifik för två pluralformer. Skapa en tilläggsmetod för språk som kräver fler pluralformer. Med en tilläggsmetod behöver du inte ange någon lokaliseringsfil för standardspråket – de ursprungliga strängarna är redan tillgängliga direkt i koden.

Du kan använda den mer allmänna Plural(int count, string[] pluralForms, params object[] arguments) överbelastningen som accepterar en strängmatris med översättningar.

Av Sébastien Ros, Scott Addie och Hisham Bin Ateya

Den här artikeln går igenom stegen för att använda PO-filer (Portable Object) i ett ASP.NET Core-program med Ramen för Orchard Core .

Obs: Orchard Core är inte en Microsoft-produkt. Microsoft tillhandahåller därför inget stöd för den här funktionen.

Visa eller ladda ned exempelkod (hur du laddar ned)

Vad är en PO-fil?

PO-filer distribueras som textfiler som innehåller översatta strängar för ett visst språk. Några fördelar med att använda PO-filer i stället för .resx-filer är:

  • PO-filer stöder pluralisering; .resx-filer stöder inte pluralisering.
  • PO-filer kompileras inte som .resx-filer . Därför krävs inte specialiserade verktyg och byggsteg.
  • PO-filer fungerar bra med samarbetsverktyg för onlineredigering.

Example

Här är en po-exempelfil som innehåller översättningen för två strängar på franska, inklusive en med dess pluralform:

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

I det här exemplet används följande syntax:

  • #:: En kommentar som anger kontexten för strängen som ska översättas. Samma sträng kan översättas på olika sätt beroende på var den används.
  • msgid: Den oöversatta strängen.
  • msgstr: Den översatta strängen.

När det gäller stöd för pluralisering kan fler poster definieras.

  • msgid_plural: Den oöversatta pluralsträngen.
  • msgstr[0]: Den översatta strängen för fallet 0.
  • msgstr[N]: Den översatta strängen för fallet N.

Specifikationen för PO-filen finns här.

Konfigurera po-filstöd i ASP.NET Core

Det här exemplet baseras på ett ASP.NET Core MVC-program som genererats från en Visual Studio 2017-projektmall.

Hänvisa till paketet

Lägg till en referens till OrchardCore.Localization.Core NuGet-paketet.

Filen .csproj innehåller nu en rad som liknar följande (versionsnumret kan variera):

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

Registrera tjänsten

Lägg till de nödvändiga tjänsterna i ConfigureServices metoden 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;
        });
}

Lägg till det mellanprogram som krävs i Configure metoden 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?}");
    });
}

Lägg till följande kod i valfri Razor vy. About.cshtml används i det här exemplet.

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

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

En IViewLocalizer instans matas in och används för att översätta texten "Hello world!".

Skapa en PO-fil

Skapa en fil med namnet <culture code.po> i programrotmappen. I det här exemplet är filnamnet fr.po eftersom det franska språket används:

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

Den här filen lagrar både strängen som ska översättas och den fransköversatta strängen. Översättningar återgår till sin ursprungliga kultur om det behövs. I det här exemplet används filen fr.po om den begärda kulturen är fr-FR eller fr-CA.

Testa programmet

Kör ditt program och navigera till URL:en /Home/About. Texten Hej världen! visas.

Navigera till URL /Home/About?culture=fr-FR. Texten Bonjour le monde! visas på skärmen.

Pluralization

PO-filer stöder pluraliseringsformer, vilket är användbart när samma sträng måste översättas på olika sätt baserat på kardinalitet. Den här uppgiften kompliceras av att varje språk definierar anpassade regler för att välja vilken sträng som ska användas baserat på kardinaliteten.

Lokaliseringspaketet för Fruktträdgården tillhandahåller ett API för att anropa dessa olika pluralformulär automatiskt.

Skapa po-filer för pluralisering

Lägg till följande innehåll i den tidigare nämnda fr.po-filen :

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."

Se Vad är en PO-fil? för en förklaring av vad varje post i det här exemplet representerar.

Lägga till ett språk med olika pluraliseringsformer

Engelska och franska strängar användes i föregående exempel. Engelska och franska har bara två pluraliseringsformer och delar samma formregler, vilket är att en kardinalitet av en mappas till den första pluralformen. Alla andra kardinaliteter mappas till det andra pluralformen.

Alla språk har inte samma regler. Detta illustreras med det tjeckiska språket, som har tre pluralformer.

Skapa filen på cs.po följande sätt och notera hur pluraliseringen behöver tre olika översättningar:

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."

Om du vill acceptera tjeckiska lokaliseringar lägger du till "cs" i listan över kulturer som stöds i ConfigureServices metoden:

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 Redigera filen för att återge lokaliserade pluralsträngar för flera kardinaliteter:

<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>

Not: I ett verkligt scenario skulle en variabel användas för att representera antalet. Här upprepar vi samma kod med tre olika värden för att exponera ett mycket specifikt fall.

När du byter kultur ser du följande:

För /Home/About:

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

För /Home/About?culture=fr:

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

För /Home/About?culture=cs:

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

Observera att för den tjeckiska kulturen är de tre översättningarna olika. De franska och engelska kulturerna delar samma konstruktion för de två sista översatta strängarna.

Avancerade uppgifter

Kontextualisera strängar

Program innehåller ofta de strängar som ska översättas på flera platser. Samma sträng kan ha en annan översättning på vissa platser i en app (Razor vyer eller klassfiler). En PO-fil stöder begreppet filkontext, som kan användas för att kategorisera strängen som representeras. Med hjälp av en filkontext kan en sträng översättas på olika sätt, beroende på filkontexten (eller avsaknaden av en filkontext).

Lokaliseringstjänsterna för inköpsorder använder namnet på den fullständiga klassen eller vyn som används vid översättning av en sträng. Detta uppnås genom att ange värdet för msgctxt posten.

Överväg ett mindre tillägg till föregående fr.po-exempel . En Razor vy i Views/Home/About.cshtml kan definieras som filkontext genom att ange värdet för den reserverade msgctxt posten:

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

Med uppsättningen msgctxt som sådan sker textöversättning när du navigerar till /Home/About?culture=fr-FR. Översättningen sker inte när du navigerar till /Home/Contact?culture=fr-FR.

När ingen specifik post matchas med en viss filkontext letar Orchard Cores återställningsmekanism efter en lämplig PO-fil utan kontext. Förutsatt att det inte finns någon specifik filkontext definierad för Views/Home/Contact.cshtmlläser du in /Home/Contact?culture=fr-FR en PO-fil som:

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

Ändra platsen för PO-filer

Standardplatsen för PO-filer kan ändras i ConfigureServices:

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

I det här exemplet läses PO-filerna in från mappen Lokalisering .

Implementera en anpassad logik för att hitta lokaliseringsfiler

När mer komplex logik behövs för att hitta PO-filer OrchardCore.Localization.PortableObject.ILocalizationFileLocationProvider kan gränssnittet implementeras och registreras som en tjänst. Detta är användbart när PO-filer kan lagras på olika platser eller när filerna måste hittas i en hierarki med mappar.

Använda ett annat standardspråk för pluralisering

Paketet innehåller en Plural tilläggsmetod som är specifik för två pluralformer. Skapa en tilläggsmetod för språk som kräver fler pluralformer. Med en tilläggsmetod behöver du inte ange någon lokaliseringsfil för standardspråket – de ursprungliga strängarna är redan tillgängliga direkt i koden.

Du kan använda den mer allmänna Plural(int count, string[] pluralForms, params object[] arguments) överbelastningen som accepterar en strängmatris med översättningar.