Mengonfigurasi pelokalan objek portabel di ASP.NET Core

Oleh Hisham Bin Ateya dan Sébastien Ros.

Artikel ini menjelaskan langkah-langkah untuk menggunakan file Objek Portabel (PO) dalam aplikasi ASP.NET Core dengan kerangka kerja Orchard Core .

Catatan: Orchard Core bukan produk Microsoft. Microsoft tidak menyediakan dukungan untuk fitur ini.

Melihat atau mengunduh kode sampel (cara mengunduh)

Apa itu file PO?

File PO didistribusikan sebagai file teks yang berisi string yang diterjemahkan untuk bahasa tertentu. Beberapa keuntungan menggunakan file PO alih-alih file .resx meliputi:

  • File PO mendukung pluralisasi; File .resx tidak mendukung pluralisasi.
  • File PO tidak dikompilasi seperti file .resx . Dengan demikian, alat khusus dan langkah-langkah build tidak diperlukan.
  • File PO bekerja dengan baik dengan alat pengeditan online kolaboratif.

Contoh

Contoh file PO berikut berisi terjemahan untuk dua string dalam bahasa Prancis, termasuk satu dengan bentuk jamaknya:

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

Contoh ini menggunakan sintaks berikut:

  • #:: Komentar yang menunjukkan konteks string yang akan diterjemahkan. String yang sama mungkin diterjemahkan secara berbeda tergantung di mana string tersebut digunakan.
  • msgid: String yang tidak diterjemahkan.
  • msgstr: String yang diterjemahkan.

Untuk dukungan pluralisasi, lebih banyak entri dapat ditentukan.

  • msgid_plural: String jamak yang tidak diterjemahkan.
  • msgstr[0]: String yang diterjemahkan untuk kasus 0.
  • msgstr[N]: String yang diterjemahkan untuk kasus N.

Spesifikasi file PO dapat ditemukan di sini.

Mengonfigurasi dukungan file PO di ASP.NET Core

Contoh ini didasarkan pada aplikasi web ASP.NET Core yang dihasilkan dari templat proyek Visual Studio 2022.

Mereferensikan paket

Tambahkan referensi ke OrchardCore.Localization.Core paket NuGet.

File .csproj sekarang berisi baris yang mirip dengan baris berikut (nomor versi dapat bervariasi):

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

Mendaftarkan layanan

Tambahkan layanan yang diperlukan ke Program.cs:

builder.Services.AddPortableObjectLocalization();

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

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

Tambahkan kode berikut ke halaman pilihan Anda Razor . Index.cshtml digunakan dalam contoh ini.

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

Instans IViewLocalizer disuntikkan dan digunakan untuk menerjemahkan teks "Halo dunia!".

Membuat file PO

Buat file bernama <culture code.po> di folder akar aplikasi Anda. Dalam contoh ini, nama file adalah fr.po karena bahasa Prancis digunakan:

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

File ini menyimpan string untuk diterjemahkan dan string yang diterjemahkan Bahasa Prancis. Terjemahan kembali ke budaya induk mereka, jika perlu. Dalam contoh ini, file fr.po digunakan jika budaya yang diminta adalah fr-FR atau fr-CA.

Menguji aplikasi

Jalankan aplikasi Anda, teks Halo dunia! ditampilkan.

Navigasikan ke URL /Index?culture=fr-FR. Teks Bonjour le monde! ditampilkan.

Pluralisasi

File PO mendukung formulir pluralisasi, yang berguna ketika string yang sama perlu diterjemahkan secara berbeda berdasarkan kardinalitas. Tugas ini dibuat rumit oleh fakta bahwa setiap bahasa mendefinisikan aturan kustom untuk memilih string mana yang akan digunakan berdasarkan kardinalitas.

Paket Pelokalan Orchard menyediakan API untuk memanggil berbagai bentuk jamak ini secara otomatis.

Membuat file PO pluralisasi

Tambahkan konten berikut ke file fr.po yang disebutkan sebelumnya:

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

Lihat Apa itu file PO? untuk penjelasan tentang apa yang diwakili setiap entri dalam contoh ini.

Menambahkan bahasa menggunakan formulir pluralisasi yang berbeda

String Bahasa Inggris dan Prancis digunakan dalam contoh sebelumnya. Bahasa Inggris dan Prancis hanya memiliki dua bentuk pluralisasi dan berbagi aturan bentuk yang sama, yaitu bahwa kardinalitas seseorang dipetakan ke bentuk jamak pertama. Kardinalitas lain dipetakan ke bentuk jamak kedua.

Tidak semua bahasa berbagi aturan yang sama. Ini diilustrasikan dengan bahasa Ceko, yang memiliki tiga bentuk jamak.

cs.po Buat file sebagai berikut, dan perhatikan bagaimana pluralisasi membutuhkan tiga terjemahan yang berbeda:

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

Untuk menerima pelokalan Ceko, tambahkan "cs" ke daftar budaya yang Configure didukung dalam metode :

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

Pages/Index.cshtml Edit file untuk merender string jamak yang dilokalkan untuk beberapa kardinalitas:

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

Catatan: Dalam skenario dunia nyata, variabel akan digunakan untuk mewakili jumlah. Di sini, kami mengulangi kode yang sama dengan tiga nilai berbeda untuk mengekspos kasus tertentu.

Setelah beralih budaya, Anda akan melihat hal-hal berikut:

Untuk /Index:

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

Untuk /Index?culture=fr:

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

Untuk /Index?culture=cs:

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

Untuk budaya Ceko, ketiga terjemahannya berbeda. Budaya Prancis dan Inggris berbagi konstruksi yang sama untuk dua string terakhir yang diterjemahkan.

Tugas lanjutan

Kontekstualisasi string

Aplikasi sering berisi string yang akan diterjemahkan di beberapa tempat. String yang sama mungkin memiliki terjemahan yang berbeda di lokasi tertentu dalam aplikasi (Razor tampilan atau file kelas). File PO mendukung gagasan konteks file, yang dapat digunakan untuk mengategorikan string yang diwakili. Menggunakan konteks file, string dapat diterjemahkan secara berbeda, tergantung pada konteks file (atau kurangnya konteks file).

Layanan pelokalan PO menggunakan nama kelas lengkap atau tampilan yang digunakan saat menerjemahkan string. Ini dicapai dengan mengatur nilai pada msgctxt entri.

Pertimbangkan penambahan kecil untuk contoh fr.po sebelumnya. Razor Halaman yang terletak di dapat didefinisikan sebagai konteks file dengan mengatur nilai entri yang dipesan Pages/Index.cshtmlmsgctxt:

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

Dengan set seperti itu msgctxt , terjemahan teks terjadi saat menavigasi ke /Index?culture=fr-FR. Terjemahan tidak terjadi saat menavigasi ke /Privacy?culture=fr-FR.

Ketika tidak ada entri tertentu yang cocok dengan konteks file tertentu, mekanisme fallback Orchard Core mencari file PO yang sesuai tanpa konteks. Dengan asumsi tidak ada konteks file tertentu yang ditentukan untuk Pages/Privacy.cshtml, menavigasi untuk /Privacy?culture=fr-FR memuat file PO seperti:

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

Mengubah lokasi file PO

Lokasi default file PO dapat diubah di Programs.cs:

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

Dalam contoh ini, file PO dimuat dari folder Pelokalan .

Menerapkan logika kustom untuk menemukan file pelokalan

Ketika logika yang lebih kompleks diperlukan untuk menemukan file PO, OrchardCore.Localization.PortableObject.ILocalizationFileLocationProvider antarmuka dapat diimplementasikan dan didaftarkan sebagai layanan. Ini berguna ketika file PO dapat disimpan di berbagai lokasi atau ketika file harus ditemukan dalam hierarki folder.

Menggunakan bahasa pluralisasi default yang berbeda

Paket ini mencakup Plural metode ekstensi yang khusus untuk dua bentuk jamak. Untuk bahasa yang membutuhkan lebih banyak bentuk jamak, buat metode ekstensi. Dengan metode ekstensi, Anda tidak perlu menyediakan file pelokalan apa pun untuk bahasa default — string asli sudah tersedia langsung dalam kode.

Anda dapat menggunakan kelebihan umum yang menerima Plural(int count, string[] pluralForms, params object[] arguments) array string terjemahan.

Oleh Sébastien Ros, Scott Addie dan Hisham Bin Ateya

Artikel ini menjelaskan langkah-langkah untuk menggunakan file Objek Portabel (PO) dalam aplikasi ASP.NET Core dengan kerangka kerja Orchard Core .

Catatan: Orchard Core bukan produk Microsoft. Akibatnya, Microsoft tidak menyediakan dukungan untuk fitur ini.

Melihat atau mengunduh kode sampel (cara mengunduh)

Apa itu file PO?

File PO didistribusikan sebagai file teks yang berisi string yang diterjemahkan untuk bahasa tertentu. Beberapa keuntungan menggunakan file PO alih-alih file .resx meliputi:

  • File PO mendukung pluralisasi; File .resx tidak mendukung pluralisasi.
  • File PO tidak dikompilasi seperti file .resx . Dengan demikian, alat khusus dan langkah-langkah build tidak diperlukan.
  • File PO bekerja dengan baik dengan alat pengeditan online kolaboratif.

Contoh

Berikut adalah contoh file PO yang berisi terjemahan untuk dua string dalam bahasa Prancis, termasuk satu dengan bentuk jamaknya:

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

Contoh ini menggunakan sintaks berikut:

  • #:: Komentar yang menunjukkan konteks string yang akan diterjemahkan. String yang sama mungkin diterjemahkan secara berbeda tergantung di mana string tersebut digunakan.
  • msgid: String yang tidak diterjemahkan.
  • msgstr: String yang diterjemahkan.

Dalam kasus dukungan pluralisasi, lebih banyak entri dapat ditentukan.

  • msgid_plural: String jamak yang tidak diterjemahkan.
  • msgstr[0]: String yang diterjemahkan untuk kasus 0.
  • msgstr[N]: String yang diterjemahkan untuk kasus N.

Spesifikasi file PO dapat ditemukan di sini.

Mengonfigurasi dukungan file PO di ASP.NET Core

Contoh ini didasarkan pada aplikasi ASP.NET Core MVC yang dihasilkan dari templat proyek Visual Studio 2019.

Mereferensikan paket

Tambahkan referensi ke OrchardCore.Localization.Core paket NuGet.

File .csproj sekarang berisi baris yang mirip dengan baris berikut (nomor versi dapat bervariasi):

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

Mendaftarkan layanan

Tambahkan layanan yang diperlukan ke ConfigureServices metode 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")
    );
}

Tambahkan middleware yang diperlukan ke Configure metode 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?}");
    });
}

Tambahkan kode berikut ke halaman pilihan Anda Razor . Index.cshtml digunakan dalam contoh ini.

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

Instans IViewLocalizer disuntikkan dan digunakan untuk menerjemahkan teks "Halo dunia!".

Membuat file PO

Buat file bernama <culture code.po> di folder akar aplikasi Anda. Dalam contoh ini, nama file adalah fr.po karena bahasa Prancis digunakan:

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

File ini menyimpan string untuk diterjemahkan dan string yang diterjemahkan Bahasa Prancis. Terjemahan kembali ke budaya induk mereka, jika perlu. Dalam contoh ini, file fr.po digunakan jika budaya yang diminta adalah fr-FR atau fr-CA.

Menguji aplikasi

Jalankan aplikasi Anda, dan navigasikan ke URL /Index. Teks Halo dunia! ditampilkan.

Navigasikan ke URL /Index?culture=fr-FR. Teks Bonjour le monde! ditampilkan.

Pluralisasi

File PO mendukung formulir pluralisasi, yang berguna ketika string yang sama perlu diterjemahkan secara berbeda berdasarkan kardinalitas. Tugas ini dibuat rumit oleh fakta bahwa setiap bahasa mendefinisikan aturan kustom untuk memilih string mana yang akan digunakan berdasarkan kardinalitas.

Paket Pelokalan Orchard menyediakan API untuk memanggil berbagai bentuk jamak ini secara otomatis.

Membuat file PO pluralisasi

Tambahkan konten berikut ke file fr.po yang disebutkan sebelumnya:

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

Lihat Apa itu file PO? untuk penjelasan tentang apa yang diwakili setiap entri dalam contoh ini.

Menambahkan bahasa menggunakan formulir pluralisasi yang berbeda

String Bahasa Inggris dan Prancis digunakan dalam contoh sebelumnya. Bahasa Inggris dan Prancis hanya memiliki dua bentuk pluralisasi dan berbagi aturan bentuk yang sama, yaitu bahwa kardinalitas seseorang dipetakan ke bentuk jamak pertama. Kardinalitas lain dipetakan ke bentuk jamak kedua.

Tidak semua bahasa berbagi aturan yang sama. Ini diilustrasikan dengan bahasa Ceko, yang memiliki tiga bentuk jamak.

cs.po Buat file sebagai berikut, dan perhatikan bagaimana pluralisasi membutuhkan tiga terjemahan yang berbeda:

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

Untuk menerima pelokalan Ceko, tambahkan "cs" ke daftar budaya yang ConfigureServices didukung dalam metode :

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

Pages/Index.cshtml Edit file untuk merender string jamak yang dilokalkan untuk beberapa kardinalitas:

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

Catatan: Dalam skenario dunia nyata, variabel akan digunakan untuk mewakili jumlah. Di sini, kami mengulangi kode yang sama dengan tiga nilai berbeda untuk mengekspos kasus yang sangat spesifik.

Setelah beralih budaya, Anda akan melihat hal-hal berikut:

Untuk /Index:

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

Untuk /Index?culture=fr:

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

Untuk /Index?culture=cs:

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

Perhatikan bahwa untuk budaya Ceko, ketiga terjemahannya berbeda. Budaya Prancis dan Inggris berbagi konstruksi yang sama untuk dua string terakhir yang diterjemahkan.

Tugas lanjutan

Kontekstualisasi string

Aplikasi sering berisi string yang akan diterjemahkan di beberapa tempat. String yang sama mungkin memiliki terjemahan yang berbeda di lokasi tertentu dalam aplikasi (Razor tampilan atau file kelas). File PO mendukung gagasan konteks file, yang dapat digunakan untuk mengategorikan string yang diwakili. Menggunakan konteks file, string dapat diterjemahkan secara berbeda, tergantung pada konteks file (atau kurangnya konteks file).

Layanan pelokalan PO menggunakan nama kelas lengkap atau tampilan yang digunakan saat menerjemahkan string. Ini dicapai dengan mengatur nilai pada msgctxt entri.

Pertimbangkan penambahan kecil untuk contoh fr.po sebelumnya. Razor Tampilan yang terletak di dapat didefinisikan sebagai konteks file dengan mengatur nilai entri yang dipesan Pages/Index.cshtmlmsgctxt:

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

Dengan set seperti itu msgctxt , terjemahan teks terjadi saat menavigasi ke /Index?culture=fr-FR. Terjemahan tidak akan terjadi saat menavigasi ke /Privacy?culture=fr-FR.

Ketika tidak ada entri tertentu yang cocok dengan konteks file tertentu, mekanisme fallback Orchard Core mencari file PO yang sesuai tanpa konteks. Dengan asumsi tidak ada konteks file tertentu yang ditentukan untuk Pages/Privacy.cshtml, menavigasi untuk /Privacy?culture=fr-FR memuat file PO seperti:

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

Mengubah lokasi file PO

Lokasi default file PO dapat diubah di ConfigureServices:

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

Dalam contoh ini, file PO dimuat dari folder Pelokalan .

Menerapkan logika kustom untuk menemukan file pelokalan

Ketika logika yang lebih kompleks diperlukan untuk menemukan file PO, OrchardCore.Localization.PortableObject.ILocalizationFileLocationProvider antarmuka dapat diimplementasikan dan didaftarkan sebagai layanan. Ini berguna ketika file PO dapat disimpan di berbagai lokasi atau ketika file harus ditemukan dalam hierarki folder.

Menggunakan bahasa pluralisasi default yang berbeda

Paket ini mencakup Plural metode ekstensi yang khusus untuk dua bentuk jamak. Untuk bahasa yang membutuhkan lebih banyak bentuk jamak, buat metode ekstensi. Dengan metode ekstensi, Anda tidak perlu menyediakan file pelokalan apa pun untuk bahasa default — string asli sudah tersedia langsung dalam kode.

Anda dapat menggunakan kelebihan umum yang menerima Plural(int count, string[] pluralForms, params object[] arguments) array string terjemahan.

Oleh Sébastien Ros, Scott Addie dan Hisham Bin Ateya

Artikel ini menjelaskan langkah-langkah untuk menggunakan file Objek Portabel (PO) dalam aplikasi ASP.NET Core dengan kerangka kerja Orchard Core .

Catatan: Orchard Core bukan produk Microsoft. Akibatnya, Microsoft tidak menyediakan dukungan untuk fitur ini.

Melihat atau mengunduh kode sampel (cara mengunduh)

Apa itu file PO?

File PO didistribusikan sebagai file teks yang berisi string yang diterjemahkan untuk bahasa tertentu. Beberapa keuntungan menggunakan file PO alih-alih file .resx meliputi:

  • File PO mendukung pluralisasi; File .resx tidak mendukung pluralisasi.
  • File PO tidak dikompilasi seperti file .resx . Dengan demikian, alat khusus dan langkah-langkah build tidak diperlukan.
  • File PO bekerja dengan baik dengan alat pengeditan online kolaboratif.

Contoh

Berikut adalah contoh file PO yang berisi terjemahan untuk dua string dalam bahasa Prancis, termasuk satu dengan bentuk jamaknya:

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

Contoh ini menggunakan sintaks berikut:

  • #:: Komentar yang menunjukkan konteks string yang akan diterjemahkan. String yang sama mungkin diterjemahkan secara berbeda tergantung di mana string tersebut digunakan.
  • msgid: String yang tidak diterjemahkan.
  • msgstr: String yang diterjemahkan.

Dalam kasus dukungan pluralisasi, lebih banyak entri dapat ditentukan.

  • msgid_plural: String jamak yang tidak diterjemahkan.
  • msgstr[0]: String yang diterjemahkan untuk kasus 0.
  • msgstr[N]: String yang diterjemahkan untuk kasus N.

Spesifikasi file PO dapat ditemukan di sini.

Mengonfigurasi dukungan file PO di ASP.NET Core

Contoh ini didasarkan pada aplikasi ASP.NET Core MVC yang dihasilkan dari templat proyek Visual Studio 2017.

Mereferensikan paket

Tambahkan referensi ke OrchardCore.Localization.Core paket NuGet.

File .csproj sekarang berisi baris yang mirip dengan baris berikut (nomor versi dapat bervariasi):

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

Mendaftarkan layanan

Tambahkan layanan yang diperlukan ke ConfigureServices metode 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;
        });
}

Tambahkan middleware yang diperlukan ke Configure metode 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?}");
    });
}

Tambahkan kode berikut ke tampilan pilihan Anda Razor . About.cshtml digunakan dalam contoh ini.

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

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

Instans IViewLocalizer disuntikkan dan digunakan untuk menerjemahkan teks "Halo dunia!".

Membuat file PO

Buat file bernama <culture code.po> di folder akar aplikasi Anda. Dalam contoh ini, nama file adalah fr.po karena bahasa Prancis digunakan:

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

File ini menyimpan string untuk diterjemahkan dan string yang diterjemahkan Bahasa Prancis. Terjemahan kembali ke budaya induk mereka, jika perlu. Dalam contoh ini, file fr.po digunakan jika budaya yang diminta adalah fr-FR atau fr-CA.

Menguji aplikasi

Jalankan aplikasi Anda, dan navigasikan ke URL /Home/About. Teks Halo dunia! ditampilkan.

Navigasikan ke URL /Home/About?culture=fr-FR. Teks Bonjour le monde! ditampilkan.

Pluralisasi

File PO mendukung formulir pluralisasi, yang berguna ketika string yang sama perlu diterjemahkan secara berbeda berdasarkan kardinalitas. Tugas ini dibuat rumit oleh fakta bahwa setiap bahasa mendefinisikan aturan kustom untuk memilih string mana yang akan digunakan berdasarkan kardinalitas.

Paket Pelokalan Orchard menyediakan API untuk memanggil berbagai bentuk jamak ini secara otomatis.

Membuat file PO pluralisasi

Tambahkan konten berikut ke file fr.po yang disebutkan sebelumnya:

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

Lihat Apa itu file PO? untuk penjelasan tentang apa yang diwakili setiap entri dalam contoh ini.

Menambahkan bahasa menggunakan formulir pluralisasi yang berbeda

String Bahasa Inggris dan Prancis digunakan dalam contoh sebelumnya. Bahasa Inggris dan Prancis hanya memiliki dua bentuk pluralisasi dan berbagi aturan bentuk yang sama, yaitu bahwa kardinalitas seseorang dipetakan ke bentuk jamak pertama. Kardinalitas lain dipetakan ke bentuk jamak kedua.

Tidak semua bahasa berbagi aturan yang sama. Ini diilustrasikan dengan bahasa Ceko, yang memiliki tiga bentuk jamak.

cs.po Buat file sebagai berikut, dan perhatikan bagaimana pluralisasi membutuhkan tiga terjemahan yang berbeda:

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

Untuk menerima pelokalan Ceko, tambahkan "cs" ke daftar budaya yang ConfigureServices didukung dalam metode :

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 Edit file untuk merender string jamak yang dilokalkan untuk beberapa kardinalitas:

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

Catatan: Dalam skenario dunia nyata, variabel akan digunakan untuk mewakili jumlah. Di sini, kami mengulangi kode yang sama dengan tiga nilai berbeda untuk mengekspos kasus yang sangat spesifik.

Setelah beralih budaya, Anda akan melihat hal-hal berikut:

Untuk /Home/About:

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

Untuk /Home/About?culture=fr:

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

Untuk /Home/About?culture=cs:

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

Perhatikan bahwa untuk budaya Ceko, ketiga terjemahannya berbeda. Budaya Prancis dan Inggris berbagi konstruksi yang sama untuk dua string terakhir yang diterjemahkan.

Tugas lanjutan

Kontekstualisasi string

Aplikasi sering berisi string yang akan diterjemahkan di beberapa tempat. String yang sama mungkin memiliki terjemahan yang berbeda di lokasi tertentu dalam aplikasi (Razor tampilan atau file kelas). File PO mendukung gagasan konteks file, yang dapat digunakan untuk mengategorikan string yang diwakili. Menggunakan konteks file, string dapat diterjemahkan secara berbeda, tergantung pada konteks file (atau kurangnya konteks file).

Layanan pelokalan PO menggunakan nama kelas lengkap atau tampilan yang digunakan saat menerjemahkan string. Ini dicapai dengan mengatur nilai pada msgctxt entri.

Pertimbangkan penambahan kecil untuk contoh fr.po sebelumnya. Razor Tampilan yang terletak di dapat didefinisikan sebagai konteks file dengan mengatur nilai entri yang dipesan Views/Home/About.cshtmlmsgctxt:

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

Dengan set seperti itu msgctxt , terjemahan teks terjadi saat menavigasi ke /Home/About?culture=fr-FR. Terjemahan tidak akan terjadi saat menavigasi ke /Home/Contact?culture=fr-FR.

Ketika tidak ada entri tertentu yang cocok dengan konteks file tertentu, mekanisme fallback Orchard Core mencari file PO yang sesuai tanpa konteks. Dengan asumsi tidak ada konteks file tertentu yang ditentukan untuk Views/Home/Contact.cshtml, menavigasi untuk /Home/Contact?culture=fr-FR memuat file PO seperti:

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

Mengubah lokasi file PO

Lokasi default file PO dapat diubah di ConfigureServices:

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

Dalam contoh ini, file PO dimuat dari folder Pelokalan .

Menerapkan logika kustom untuk menemukan file pelokalan

Ketika logika yang lebih kompleks diperlukan untuk menemukan file PO, OrchardCore.Localization.PortableObject.ILocalizationFileLocationProvider antarmuka dapat diimplementasikan dan didaftarkan sebagai layanan. Ini berguna ketika file PO dapat disimpan di berbagai lokasi atau ketika file harus ditemukan dalam hierarki folder.

Menggunakan bahasa pluralisasi default yang berbeda

Paket ini mencakup Plural metode ekstensi yang khusus untuk dua bentuk jamak. Untuk bahasa yang membutuhkan lebih banyak bentuk jamak, buat metode ekstensi. Dengan metode ekstensi, Anda tidak perlu menyediakan file pelokalan apa pun untuk bahasa default — string asli sudah tersedia langsung dalam kode.

Anda dapat menggunakan kelebihan umum yang menerima Plural(int count, string[] pluralForms, params object[] arguments) array string terjemahan.