Delen via


Lokalisatie van draagbare objecten configureren in ASP.NET Core

Door Hisham Bin Ateya en Sébastien Ros.

In dit artikel worden de stappen beschreven voor het gebruik van PO-bestanden (Portable Object) in een ASP.NET Core-toepassing met het Boomgaard Core-framework .

Notitie: Orchard Core is geen Microsoft-product. Microsoft biedt geen ondersteuning voor deze functie.

Voorbeeldcode bekijken of downloaden (hoe download je)

Wat is een PO-bestand?

PO-bestanden worden gedistribueerd als tekstbestanden met de vertaalde tekenreeksen voor een bepaalde taal. Enkele voordelen van het gebruik van PO-bestanden in plaats van .resx-bestanden zijn:

  • PO-bestanden ondersteunen pluralisatie; .resx-bestanden bieden geen ondersteuning voor pluralisatie.
  • PO-bestanden worden niet gecompileerd als .resx-bestanden . Daarom zijn gespecialiseerde tools en buildstappen niet vereist.
  • PO-bestanden werken goed met gezamenlijke online bewerkingsprogramma's.

Example

Het volgende voorbeeld-PO-bestand bevat de vertaling voor twee tekenreeksen in het Frans, inclusief een met de meervoudsvorm:

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

In dit voorbeeld wordt de volgende syntaxis gebruikt:

  • #:: Een opmerking die de context aangeeft van de tekenreeks die moet worden vertaald. Dezelfde tekenreeks kan anders worden vertaald, afhankelijk van waar deze wordt gebruikt.
  • msgid: De niet-vertaalde tekenreeks.
  • msgstr: de vertaalde tekenreeks.

Voor pluralisatieondersteuning kunnen meer vermeldingen worden gedefinieerd.

  • msgid_plural: De niet-vertaalde meervoudtekenreeks.
  • msgstr[0]: De vertaalde tekenreeks voor de case 0.
  • msgstr[N]: De vertaalde tekenreeks voor het geval N.

De specificatie van het PO-bestand vindt u hier.

Ondersteuning voor PO-bestanden configureren in ASP.NET Core

Dit voorbeeld is gebaseerd op een ASP.NET Core-webtoepassing die is gegenereerd op basis van een Visual Studio 2022-projectsjabloon.

Naar het pakket verwijzen

Voeg een verwijzing toe naar het OrchardCore.Localization.Core NuGet-pakket.

Het .csproj bestand bevat nu een regel die lijkt op het volgende (versienummer kan variëren):

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

De service registreren

Voeg de vereiste services toe aan Program.cs:

builder.Services.AddPortableObjectLocalization();

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

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

Voeg de volgende code toe aan uw Razor gewenste pagina. Index.cshtml wordt in dit voorbeeld gebruikt.

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

Er wordt een IViewLocalizer exemplaar geïnjecteerd en gebruikt om de tekst 'Hallo wereld!' te vertalen.

Een PO-bestand maken

Maak een bestand met de naam <culture code.po> in de hoofdmap van uw toepassing. In dit voorbeeld is de bestandsnaam fr.po omdat de Franse taal wordt gebruikt:

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

In dit bestand wordt zowel de tekenreeks opgeslagen die moet worden vertaald als de Frans vertaalde tekenreeks. Vertalingen keren zo nodig terug naar hun hoofd cultuur. In dit voorbeeld wordt het fr.po-bestand gebruikt als de aangevraagde cultuur fr-FR of fr-CA is.

De toepassing testen

Voer uw toepassing uit, de tekst Hallo wereld! wordt weergegeven.

Navigeer naar de URL /Index?culture=fr-FR. De tekst Bonjour le monde! wordt weergegeven.

Pluralization

PO-bestanden ondersteunen pluralisatieformulieren, wat handig is wanneer dezelfde tekenreeks anders moet worden vertaald op basis van een kardinaliteit. Deze taak wordt ingewikkeld gemaakt door het feit dat elke taal aangepaste regels definieert om te selecteren welke tekenreeks moet worden gebruikt op basis van de kardinaliteit.

Het Localization-pakket Boomgaard biedt een API om deze verschillende meervoudvormen automatisch aan te roepen.

Pluralization PO-bestanden maken

Voeg de volgende inhoud toe aan het eerder genoemde fr.po-bestand :

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

Zie Wat is een PO-bestand? voor een uitleg van wat elke vermelding in dit voorbeeld vertegenwoordigt.

Een taal toevoegen met behulp van verschillende pluralisatieformulieren

In het vorige voorbeeld zijn Engelse en Franse tekenreeksen gebruikt. Engels en Frans hebben slechts twee meervoudsvormen en delen dezelfde vormregels, namelijk dat een cardinaliteit van één wordt toegewezen aan de eerste meervoudsvorm. Elke andere kardinaliteit wordt toegewezen aan het tweede meervoud.

Niet alle talen delen dezelfde regels. Dit wordt geïllustreerd met de Tsjechische taal, die drie meervoudvormen heeft.

Maak het cs.po bestand als volgt en kijk hoe de pluralisatie drie verschillende vertalingen nodig heeft:

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

Als u Tsjechische lokalisaties wilt accepteren, voegt u toe "cs" aan de lijst met ondersteunde culturen in de Configure methode:

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

Bewerk het Pages/Index.cshtml bestand om gelokaliseerde, meervoudtekenreeksen weer te geven voor verschillende kardinaliteiten:

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

Notitie: In een praktijkscenario wordt een variabele gebruikt om het aantal weer te geven. Hier herhalen we dezelfde code met drie verschillende waarden om een specifiek geval weer te geven.

Wanneer u van cultuur wisselt, ziet u het volgende:

Voor /Index:

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

Voor /Index?culture=fr:

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

Voor /Index?culture=cs:

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

Voor de Tsjechische cultuur zijn de drie vertalingen anders. De Franse en Engelse culturen delen dezelfde constructie voor de twee laatst vertaalde strings.

Geavanceerde taken

Aanvullende argumenten gebruiken

Het argument bij index nul {0} vertegenwoordigt altijd de tellingswaarde. Wanneer u de Plural methode aanroept, is het mogelijk om extra argumenten toe te voegen en de bijbehorende index begint vervolgens bij één (1).

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

Tekenreeksen contextualiseren

Toepassingen bevatten vaak de tekenreeksen die op verschillende plaatsen moeten worden vertaald. Dezelfde tekenreeks kan een andere vertaling hebben op bepaalde locaties binnen een app (Razor weergaven of klassebestanden). Een PO-bestand ondersteunt het concept van een bestandscontext, die kan worden gebruikt om de tekenreeks te categoriseren die wordt weergegeven. Met behulp van een bestandscontext kan een tekenreeks anders worden vertaald, afhankelijk van de bestandscontext (of een gebrek aan bestandscontext).

De PO-lokalisatieservices gebruiken de naam van de volledige klasse of de weergave die wordt gebruikt bij het vertalen van een tekenreeks. Dit wordt bereikt door de waarde in te stellen voor de vermelding msgctxt.

Overweeg een kleine toevoeging aan het vorige fr.po-voorbeeld . Een Razor pagina die zich bevindt op Pages/Index.cshtml, kan als bestandscontext worden gedefinieerd door de waarde van de gereserveerde msgctxt vermelding in te stellen.

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

Met de msgctxt set als zodanig vindt tekstomzetting plaats bij het navigeren naar /Index?culture=fr-FR. De vertaling vindt niet plaats bij het navigeren naar /Privacy?culture=fr-FR.

Wanneer er geen specifieke vermelding overeenkomt met een bepaalde bestandscontext, zoekt het terugvalmechanisme van Orchard Core naar een geschikt PO-bestand zonder context. Ervan uitgaande dat er geen specifieke bestandscontext is gedefinieerd voor Pages/Privacy.cshtml, zorgt navigeren naar /Privacy?culture=fr-FR ervoor dat een PO-bestand wordt geladen, zoals:

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

De locatie van PO-bestanden wijzigen

De standaardlocatie van PO-bestanden kan worden gewijzigd in Programs.cs:

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

In dit voorbeeld worden de PO-bestanden geladen vanuit de map Lokalisatie .

Een aangepaste logica implementeren voor het vinden van lokalisatiebestanden

Wanneer complexere logica nodig is om PO-bestanden te vinden, kan de OrchardCore.Localization.PortableObject.ILocalizationFileLocationProvider interface worden geïmplementeerd en geregistreerd als een service. Dit is handig wanneer PO-bestanden kunnen worden opgeslagen op verschillende locaties of wanneer de bestanden moeten worden gevonden in een hiërarchie van mappen.

Een andere standaardtaal voor gepluraliseerde vormen gebruiken

Het pakket bevat een Plural uitbreidingsmethode die specifiek is voor twee meervoudvormen. Maak een uitbreidingsmethode voor talen die meer pluralistische formulieren vereisen. Met een extensiemethode hoeft u geen lokalisatiebestand op te geven voor de standaardtaal. De oorspronkelijke tekenreeksen zijn al rechtstreeks in de code beschikbaar.

U kunt de meer generieke Plural(int count, string[] pluralForms, params object[] arguments) overload gebruiken die een string array van vertalingen accepteert.

Door Sébastien Ros, Scott Addie en Hisham Bin Ateya

In dit artikel worden de stappen beschreven voor het gebruik van PO-bestanden (Portable Object) in een ASP.NET Core-toepassing met het Boomgaard Core-framework .

Notitie: Orchard Core is geen Microsoft-product. Daarom biedt Microsoft geen ondersteuning voor deze functie.

Voorbeeldcode bekijken of downloaden (hoe download je)

Wat is een PO-bestand?

PO-bestanden worden gedistribueerd als tekstbestanden met de vertaalde tekenreeksen voor een bepaalde taal. Enkele voordelen van het gebruik van PO-bestanden in plaats van .resx-bestanden zijn:

  • PO-bestanden ondersteunen pluralisatie; .resx-bestanden bieden geen ondersteuning voor pluralisatie.
  • PO-bestanden worden niet gecompileerd als .resx-bestanden . Daarom zijn gespecialiseerde tools en buildstappen niet vereist.
  • PO-bestanden werken goed met gezamenlijke online bewerkingsprogramma's.

Example

Hier volgt een voorbeeld van een PO-bestand met de vertaling voor twee strings in het Frans, inclusief een string met de meervoudsvorm.

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

In dit voorbeeld wordt de volgende syntaxis gebruikt:

  • #:: Een opmerking die de context aangeeft van de tekenreeks die moet worden vertaald. Dezelfde tekenreeks kan anders worden vertaald, afhankelijk van waar deze wordt gebruikt.
  • msgid: De niet-vertaalde tekenreeks.
  • msgstr: de vertaalde tekenreeks.

In het geval van pluralisatieondersteuning kunnen er meer vermeldingen worden gedefinieerd.

  • msgid_plural: De niet-vertaalde meervoudtekenreeks.
  • msgstr[0]: De vertaalde tekenreeks voor de case 0.
  • msgstr[N]: De vertaalde tekenreeks voor het geval N.

De specificatie van het PO-bestand vindt u hier.

Ondersteuning voor PO-bestanden configureren in ASP.NET Core

Dit voorbeeld is gebaseerd op een ASP.NET Core MVC-toepassing die is gegenereerd op basis van een Visual Studio 2019-projectsjabloon.

Naar het pakket verwijzen

Voeg een verwijzing toe naar het OrchardCore.Localization.Core NuGet-pakket.

Het .csproj bestand bevat nu een regel die lijkt op het volgende (versienummer kan variëren):

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

De service registreren

Voeg de vereiste services toe aan de ConfigureServices methode van 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")
    );
}

Voeg de vereiste middleware toe aan de Configure methode van 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?}");
    });
}

Voeg de volgende code toe aan uw Razor gewenste pagina. Index.cshtml wordt in dit voorbeeld gebruikt.

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

Er wordt een IViewLocalizer exemplaar geïnjecteerd en gebruikt om de tekst 'Hallo wereld!' te vertalen.

Een PO-bestand maken

Maak een bestand met de naam <culture code.po> in de hoofdmap van uw toepassing. In dit voorbeeld is de bestandsnaam fr.po omdat de Franse taal wordt gebruikt:

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

In dit bestand wordt zowel de tekenreeks opgeslagen die moet worden vertaald als de Frans vertaalde tekenreeks. Vertalingen keren zo nodig terug naar hun hoofd cultuur. In dit voorbeeld wordt het fr.po-bestand gebruikt als de aangevraagde cultuur fr-FR of fr-CA is.

De toepassing testen

Voer uw toepassing uit en navigeer naar de URL /Index. De tekst Hallo wereld! wordt weergegeven.

Navigeer naar de URL /Index?culture=fr-FR. De tekst Bonjour le monde! wordt weergegeven.

Pluralization

PO-bestanden ondersteunen pluralisatieformulieren, wat handig is wanneer dezelfde tekenreeks anders moet worden vertaald op basis van een kardinaliteit. Deze taak wordt ingewikkeld gemaakt door het feit dat elke taal aangepaste regels definieert om te selecteren welke tekenreeks moet worden gebruikt op basis van de kardinaliteit.

Het Localization-pakket Boomgaard biedt een API om deze verschillende meervoudvormen automatisch aan te roepen.

Pluralization PO-bestanden maken

Voeg de volgende inhoud toe aan het eerder genoemde fr.po-bestand :

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

Zie Wat is een PO-bestand? voor een uitleg van wat elke vermelding in dit voorbeeld vertegenwoordigt.

Een taal toevoegen met behulp van verschillende pluralisatieformulieren

In het vorige voorbeeld zijn Engelse en Franse tekenreeksen gebruikt. Engels en Frans hebben slechts twee meervoudsvormen en delen dezelfde vormregels, namelijk dat een cardinaliteit van één wordt toegewezen aan de eerste meervoudsvorm. Elke andere kardinaliteit wordt toegewezen aan het tweede meervoud.

Niet alle talen delen dezelfde regels. Dit wordt geïllustreerd met de Tsjechische taal, die drie meervoudvormen heeft.

Maak het cs.po bestand als volgt en kijk hoe de pluralisatie drie verschillende vertalingen nodig heeft:

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

Als u Tsjechische lokalisaties wilt accepteren, voegt u toe "cs" aan de lijst met ondersteunde culturen in de ConfigureServices methode:

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

Bewerk het Pages/Index.cshtml bestand om gelokaliseerde, meervoudtekenreeksen weer te geven voor verschillende kardinaliteiten:

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

Notitie: In een praktijkscenario wordt een variabele gebruikt om het aantal weer te geven. Hier herhalen we dezelfde code met drie verschillende waarden om een zeer specifieke case weer te geven.

Wanneer u van cultuur wisselt, ziet u het volgende:

Voor /Index:

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

Voor /Index?culture=fr:

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

Voor /Index?culture=cs:

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

Houd er rekening mee dat voor de Tsjechische cultuur de drie vertalingen verschillen. De Franse en Engelse culturen delen dezelfde constructie voor de twee laatst vertaalde strings.

Geavanceerde taken

Tekenreeksen contextualiseren

Toepassingen bevatten vaak de tekenreeksen die op verschillende plaatsen moeten worden vertaald. Dezelfde tekenreeks kan een andere vertaling hebben op bepaalde locaties binnen een app (Razor weergaven of klassebestanden). Een PO-bestand ondersteunt het concept van een bestandscontext, die kan worden gebruikt om de tekenreeks te categoriseren die wordt weergegeven. Met behulp van een bestandscontext kan een tekenreeks anders worden vertaald, afhankelijk van de bestandscontext (of een gebrek aan bestandscontext).

De PO-lokalisatieservices gebruiken de naam van de volledige klasse of de weergave die wordt gebruikt bij het vertalen van een tekenreeks. Dit wordt bereikt door de waarde in te stellen voor de vermelding msgctxt.

Overweeg een kleine toevoeging aan het vorige fr.po-voorbeeld . Een Razor weergave die zich bevindt bij Pages/Index.cshtml kan worden gedefinieerd als de bestandscontext door de waarde van de gereserveerde msgctxt vermelding in te stellen.

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

Met de msgctxt set als zodanig vindt tekstomzetting plaats bij het navigeren naar /Index?culture=fr-FR. De vertaling vindt niet plaats bij het navigeren naar /Privacy?culture=fr-FR.

Wanneer er geen specifieke vermelding overeenkomt met een bepaalde bestandscontext, zoekt het terugvalmechanisme van Orchard Core naar een geschikt PO-bestand zonder context. Ervan uitgaande dat er geen specifieke bestandscontext is gedefinieerd voor Pages/Privacy.cshtml, zorgt navigeren naar /Privacy?culture=fr-FR ervoor dat een PO-bestand wordt geladen, zoals:

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

De locatie van PO-bestanden wijzigen

De standaardlocatie van PO-bestanden kan worden gewijzigd in ConfigureServices:

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

In dit voorbeeld worden de PO-bestanden geladen vanuit de map Lokalisatie .

Een aangepaste logica implementeren voor het vinden van lokalisatiebestanden

Wanneer complexere logica nodig is om PO-bestanden te vinden, kan de OrchardCore.Localization.PortableObject.ILocalizationFileLocationProvider interface worden geïmplementeerd en geregistreerd als een service. Dit is handig wanneer PO-bestanden kunnen worden opgeslagen op verschillende locaties of wanneer de bestanden moeten worden gevonden in een hiërarchie van mappen.

Een andere standaardtaal voor gepluraliseerde vormen gebruiken

Het pakket bevat een Plural uitbreidingsmethode die specifiek is voor twee meervoudvormen. Maak een uitbreidingsmethode voor talen die meer pluralistische formulieren vereisen. Met een extensiemethode hoeft u geen lokalisatiebestand op te geven voor de standaardtaal. De oorspronkelijke tekenreeksen zijn al rechtstreeks in de code beschikbaar.

U kunt de meer generieke Plural(int count, string[] pluralForms, params object[] arguments) overload gebruiken die een string array van vertalingen accepteert.

Door Sébastien Ros, Scott Addie en Hisham Bin Ateya

In dit artikel worden de stappen beschreven voor het gebruik van PO-bestanden (Portable Object) in een ASP.NET Core-toepassing met het Boomgaard Core-framework .

Notitie: Orchard Core is geen Microsoft-product. Daarom biedt Microsoft geen ondersteuning voor deze functie.

Voorbeeldcode bekijken of downloaden (hoe download je)

Wat is een PO-bestand?

PO-bestanden worden gedistribueerd als tekstbestanden met de vertaalde tekenreeksen voor een bepaalde taal. Enkele voordelen van het gebruik van PO-bestanden in plaats van .resx-bestanden zijn:

  • PO-bestanden ondersteunen pluralisatie; .resx-bestanden bieden geen ondersteuning voor pluralisatie.
  • PO-bestanden worden niet gecompileerd als .resx-bestanden . Daarom zijn gespecialiseerde tools en buildstappen niet vereist.
  • PO-bestanden werken goed met gezamenlijke online bewerkingsprogramma's.

Example

Hier volgt een voorbeeld van een PO-bestand met de vertaling voor twee strings in het Frans, inclusief een string met de meervoudsvorm.

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

In dit voorbeeld wordt de volgende syntaxis gebruikt:

  • #:: Een opmerking die de context aangeeft van de tekenreeks die moet worden vertaald. Dezelfde tekenreeks kan anders worden vertaald, afhankelijk van waar deze wordt gebruikt.
  • msgid: De niet-vertaalde tekenreeks.
  • msgstr: de vertaalde tekenreeks.

In het geval van pluralisatieondersteuning kunnen er meer vermeldingen worden gedefinieerd.

  • msgid_plural: De niet-vertaalde meervoudtekenreeks.
  • msgstr[0]: De vertaalde tekenreeks voor de case 0.
  • msgstr[N]: De vertaalde tekenreeks voor het geval N.

De specificatie van het PO-bestand vindt u hier.

Ondersteuning voor PO-bestanden configureren in ASP.NET Core

Dit voorbeeld is gebaseerd op een ASP.NET Core MVC-toepassing die is gegenereerd op basis van een Visual Studio 2017-projectsjabloon.

Naar het pakket verwijzen

Voeg een verwijzing toe naar het OrchardCore.Localization.Core NuGet-pakket.

Het .csproj bestand bevat nu een regel die lijkt op het volgende (versienummer kan variëren):

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

De service registreren

Voeg de vereiste services toe aan de ConfigureServices methode van 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;
        });
}

Voeg de vereiste middleware toe aan de Configure methode van 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?}");
    });
}

Voeg de volgende code toe aan uw Razor keuzeweergave. About.cshtml wordt in dit voorbeeld gebruikt.

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

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

Er wordt een IViewLocalizer exemplaar geïnjecteerd en gebruikt om de tekst 'Hallo wereld!' te vertalen.

Een PO-bestand maken

Maak een bestand met de naam <culture code.po> in de hoofdmap van uw toepassing. In dit voorbeeld is de bestandsnaam fr.po omdat de Franse taal wordt gebruikt:

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

In dit bestand wordt zowel de tekenreeks opgeslagen die moet worden vertaald als de Frans vertaalde tekenreeks. Vertalingen keren zo nodig terug naar hun hoofd cultuur. In dit voorbeeld wordt het fr.po-bestand gebruikt als de aangevraagde cultuur fr-FR of fr-CA is.

De toepassing testen

Voer uw toepassing uit en navigeer naar de URL /Home/About. De tekst Hallo wereld! wordt weergegeven.

Navigeer naar de URL /Home/About?culture=fr-FR. De tekst Bonjour le monde! wordt weergegeven.

Pluralization

PO-bestanden ondersteunen pluralisatieformulieren, wat handig is wanneer dezelfde tekenreeks anders moet worden vertaald op basis van een kardinaliteit. Deze taak wordt ingewikkeld gemaakt door het feit dat elke taal aangepaste regels definieert om te selecteren welke tekenreeks moet worden gebruikt op basis van de kardinaliteit.

Het Localization-pakket Boomgaard biedt een API om deze verschillende meervoudvormen automatisch aan te roepen.

Pluralization PO-bestanden maken

Voeg de volgende inhoud toe aan het eerder genoemde fr.po-bestand :

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

Zie Wat is een PO-bestand? voor een uitleg van wat elke vermelding in dit voorbeeld vertegenwoordigt.

Een taal toevoegen met behulp van verschillende pluralisatieformulieren

In het vorige voorbeeld zijn Engelse en Franse tekenreeksen gebruikt. Engels en Frans hebben slechts twee meervoudsvormen en delen dezelfde vormregels, namelijk dat een cardinaliteit van één wordt toegewezen aan de eerste meervoudsvorm. Elke andere kardinaliteit wordt toegewezen aan het tweede meervoud.

Niet alle talen delen dezelfde regels. Dit wordt geïllustreerd met de Tsjechische taal, die drie meervoudvormen heeft.

Maak het cs.po bestand als volgt en kijk hoe de pluralisatie drie verschillende vertalingen nodig heeft:

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

Als u Tsjechische lokalisaties wilt accepteren, voegt u toe "cs" aan de lijst met ondersteunde culturen in de ConfigureServices methode:

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

Bewerk het Views/Home/About.cshtml bestand om gelokaliseerde, meervoudtekenreeksen weer te geven voor verschillende kardinaliteiten:

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

Notitie: In een praktijkscenario wordt een variabele gebruikt om het aantal weer te geven. Hier herhalen we dezelfde code met drie verschillende waarden om een zeer specifieke case weer te geven.

Wanneer u van cultuur wisselt, ziet u het volgende:

Voor /Home/About:

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

Voor /Home/About?culture=fr:

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

Voor /Home/About?culture=cs:

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

Houd er rekening mee dat voor de Tsjechische cultuur de drie vertalingen verschillen. De Franse en Engelse culturen delen dezelfde constructie voor de twee laatst vertaalde strings.

Geavanceerde taken

Tekenreeksen contextualiseren

Toepassingen bevatten vaak de tekenreeksen die op verschillende plaatsen moeten worden vertaald. Dezelfde tekenreeks kan een andere vertaling hebben op bepaalde locaties binnen een app (Razor weergaven of klassebestanden). Een PO-bestand ondersteunt het concept van een bestandscontext, die kan worden gebruikt om de tekenreeks te categoriseren die wordt weergegeven. Met behulp van een bestandscontext kan een tekenreeks anders worden vertaald, afhankelijk van de bestandscontext (of een gebrek aan bestandscontext).

De PO-lokalisatieservices gebruiken de naam van de volledige klasse of de weergave die wordt gebruikt bij het vertalen van een tekenreeks. Dit wordt bereikt door de waarde in te stellen voor de vermelding msgctxt.

Overweeg een kleine toevoeging aan het vorige fr.po-voorbeeld . Een Razor weergave die zich bevindt bij Views/Home/About.cshtml kan worden gedefinieerd als de bestandscontext door de waarde van de gereserveerde msgctxt vermelding in te stellen.

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

Met de msgctxt set als zodanig vindt tekstomzetting plaats bij het navigeren naar /Home/About?culture=fr-FR. De vertaling vindt niet plaats bij het navigeren naar /Home/Contact?culture=fr-FR.

Wanneer er geen specifieke vermelding overeenkomt met een bepaalde bestandscontext, zoekt het terugvalmechanisme van Orchard Core naar een geschikt PO-bestand zonder context. Ervan uitgaande dat er geen specifieke bestandscontext is gedefinieerd voor Views/Home/Contact.cshtml, zorgt navigeren naar /Home/Contact?culture=fr-FR ervoor dat een PO-bestand wordt geladen, zoals:

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

De locatie van PO-bestanden wijzigen

De standaardlocatie van PO-bestanden kan worden gewijzigd in ConfigureServices:

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

In dit voorbeeld worden de PO-bestanden geladen vanuit de map Lokalisatie .

Een aangepaste logica implementeren voor het vinden van lokalisatiebestanden

Wanneer complexere logica nodig is om PO-bestanden te vinden, kan de OrchardCore.Localization.PortableObject.ILocalizationFileLocationProvider interface worden geïmplementeerd en geregistreerd als een service. Dit is handig wanneer PO-bestanden kunnen worden opgeslagen op verschillende locaties of wanneer de bestanden moeten worden gevonden in een hiërarchie van mappen.

Een andere standaardtaal voor gepluraliseerde vormen gebruiken

Het pakket bevat een Plural uitbreidingsmethode die specifiek is voor twee meervoudvormen. Maak een uitbreidingsmethode voor talen die meer pluralistische formulieren vereisen. Met een extensiemethode hoeft u geen lokalisatiebestand op te geven voor de standaardtaal. De oorspronkelijke tekenreeksen zijn al rechtstreeks in de code beschikbaar.

U kunt de meer generieke Plural(int count, string[] pluralForms, params object[] arguments) overload gebruiken die een string array van vertalingen accepteert.