ASP.NET Core'da taşınabilir nesne yerelleştirmeyi yapılandırma

Hisham Bin Ateya ve Sébastien Ros tarafından.

Bu makalede, Orchard Core çerçevesiyle bir ASP.NET Core uygulamasında Taşınabilir Nesne (PO) dosyalarını kullanma adımları açıklanmaktadır.

Not: Orchard Core bir Microsoft ürünü değildir. Microsoft bu özellik için destek sağlamaz.

Örnek kodu görüntüleme veya indirme (indirme)

PO dosyası nedir?

PO dosyaları, belirli bir dil için çevrilmiş dizeleri içeren metin dosyaları olarak dağıtılır. .resx dosyaları yerine PO dosyalarını kullanmanın bazı avantajları şunlardır:

  • PO dosyaları çoğullaştırmayı destekler; .resx dosyaları çoğullaştırmayı desteklemez.
  • PO dosyaları .resx dosyaları gibi derlenmemiştir. Bu nedenle özel araçlar ve derleme adımları gerekli değildir.
  • PO dosyaları, işbirliğine dayalı çevrimiçi düzenleme araçlarıyla iyi çalışır.

Örnek

Aşağıdaki örnek PO dosyası, çoğul biçimine sahip olmak üzere Fransızca iki dizenin çevirisini içerir:

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

Bu örnekte aşağıdaki söz dizimi kullanılır:

  • #:: Çevrilecek dizenin bağlamını gösteren açıklama. Aynı dize, kullanıldığı yere bağlı olarak farklı çevrilebilir.
  • msgid: Çevrilmemiş dize.
  • msgstr: Çevrilen dize.

Çoğullaştırma desteği için daha fazla giriş tanımlanabilir.

  • msgid_plural: Çevrilmemiş çoğul dize.
  • msgstr[0]: Büyük/küçük harf 0 için çevrilmiş dize.
  • msgstr[N]: Büyük/küçük harf N için çevrilmiş dize.

PO dosya belirtimi burada bulunabilir.

ASP.NET Core'da PO dosya desteğini yapılandırma

Bu örnek, Visual Studio 2022 proje şablonundan oluşturulan ASP.NET Core Web uygulamasını temel alır.

Pakete başvurma

NuGet paketine OrchardCore.Localization.Core bir başvuru ekleyin.

Dosya .csproj artık aşağıdakine benzer bir satır içeriyor (sürüm numarası farklılık gösterebilir):

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

Hizmeti kaydetme

Gerekli hizmetleri öğesine Program.csekleyin:

builder.Services.AddPortableObjectLocalization();

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

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

Aşağıdaki kodu istediğiniz sayfaya Razor ekleyin. Index.cshtml bu örnekte kullanılır.

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

Bir IViewLocalizer örnek eklenir ve "Merhaba dünya!" metnini çevirmek için kullanılır.

PO dosyası oluşturma

Uygulama kök klasörünüzde culture code.po> adlı <bir dosya oluşturun. Bu örnekte, Fransızca dili kullanıldığından dosya adı fr.po şeklindedir:

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

Bu dosya hem çevrilecek dizeyi hem de Fransızca çevrilmiş dizeyi depolar. Çeviriler gerekirse üst kültürlerine geri döner. Bu örnekte, istenen kültür fr-FR veya fr-CAise fr.po dosyası kullanılır.

Uygulamayı test etme

Uygulamanızı çalıştırın; Merhaba dünya! metni görüntülenir.

/Index?culture=fr-FR URL'sine gidin. Bonjour le monde! metni görüntülenir.

Çoğullaştırma

PO dosyaları çoğullaştırma formlarını destekler. Bu, aynı dizenin kardinaliteye göre farklı çevrilmesi gerektiğinde kullanışlıdır. Bu görev, her dilin kardinaliteye göre hangi dizenin kullanılacağını seçmek için özel kurallar tanımlaması nedeniyle karmaşık hale getirilir.

Orchard Yerelleştirme paketi, bu farklı çoğul formları otomatik olarak çağırmak için bir API sağlar.

Çoğullaştırma PO dosyaları oluşturma

Daha önce bahsedilen fr.po dosyasına aşağıdaki içeriği ekleyin:

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

Bu örnekteki her girişin neyi temsil ettiği hakkında bir açıklama için bkz. PO dosyası nedir?

Farklı çoğullama formları kullanarak dil ekleme

Önceki örnekte İngilizce ve Fransızca dizeler kullanılmıştır. İngilizce ve Fransızca yalnızca iki çoğullaştırma formuna sahiptir ve aynı form kurallarını paylaşırlar; bu da bir kardinalitesinin ilk çoğul forma eşlenmesidir. Diğer kardinaliteler ikinci çoğul forma eşlenir.

Tüm diller aynı kuralları paylaşmaz. Bu, üç çoğul biçimi olan Çek diliyle gösterilmiştir.

cs.po Dosyayı aşağıdaki gibi oluşturun ve çoğullaştırmanın üç farklı çeviriye nasıl ihtiyacı olduğunu not edin:

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

Çek yerelleştirmelerini kabul etmek için yönteminde desteklenen kültürler Configure listesine ekleyin"cs":

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

Pages/Index.cshtml Dosyayı düzenleyerek çeşitli kardinaliteler için yerelleştirilmiş çoğul dizeleri işleyin:

<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: Gerçek dünya senaryosunda, sayıyı temsil etmek için bir değişken kullanılır. Burada, belirli bir olayı kullanıma açmak için aynı kodu üç farklı değerle yineleyeceğiz.

Kültürler arasında geçiş yaptığınızda aşağıdakileri görürsünüz:

/Index için:

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

/Index?culture=fr için:

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

/Index?culture=cs için:

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

Çek kültürü için üç çeviri farklıdır. Fransız ve İngiliz kültürleri, son çevrilen iki dize için aynı yapıyı paylaşır.

Gelişmiş görevler

Dizeleri bağlamsallaştırma

Uygulamalar genellikle çeşitli yerlerde çevrilecek dizeleri içerir. Aynı dizenin bir uygulama içindeki belirli konumlarda (Razor görünümler veya sınıf dosyaları) farklı bir çevirisi olabilir. PO dosyası, temsil edilen dizeyi kategorilere ayırmak için kullanılabilen dosya bağlamı kavramlarını destekler. Bir dosya bağlamı kullanılarak, bir dize dosya bağlamı (veya dosya bağlamı eksikliği) bağlı olarak farklı çevrilebilir.

PO yerelleştirme hizmetleri, tam sınıfın adını veya bir dizeyi çevirirken kullanılan görünümü kullanır. Bu, girdideki msgctxt değer ayarlanarak gerçekleştirilir.

Önceki fr.po örneğine küçük bir ekleme düşünün. Razor konumunda Pages/Index.cshtml bulunan bir sayfa, ayrılmış msgctxt girişin değeri ayarlanarak dosya bağlamı olarak tanımlanabilir:

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

msgctxt Bu şekilde ayarlandığında, adresine gezinirken /Index?culture=fr-FRmetin çevirisi gerçekleşir. çevirisi adresine gezinirken /Privacy?culture=fr-FRgerçekleşmez.

Belirli bir dosya bağlamıyla eşleşmediğinde, Orchard Core'un geri dönüş mekanizması bağlamı olmayan uygun bir PO dosyasını arar. için Pages/Privacy.cshtmltanımlanmış belirli bir dosya bağlamı olmadığı varsayıldığında, aşağıdaki gibi bir PO dosyasını yüklemek için /Privacy?culture=fr-FR gezinme:

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

PO dosyalarının konumunu değiştirme

PO dosyalarının varsayılan konumu içinde Programs.csdeğiştirilebilir:

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

Bu örnekte, PO dosyaları Yerelleştirme klasöründen yüklenir.

Yerelleştirme dosyalarını bulmak için özel mantık uygulama

PO dosyalarını bulmak için daha karmaşık bir mantık gerektiğinde, OrchardCore.Localization.PortableObject.ILocalizationFileLocationProvider arabirim uygulanabilir ve hizmet olarak kaydedilebilir. Bu, PO dosyalarının farklı konumlarda depolanabilmesi veya dosyaların bir klasör hiyerarşisi içinde bulunması gerektiğinde kullanışlıdır.

Farklı bir varsayılan çoğullaştırılmış dil kullanma

Paket, iki çoğul forma özgü bir Plural uzantı yöntemi içerir. Daha fazla çoğul form gerektiren diller için bir uzantı yöntemi oluşturun. Bir uzantı yöntemiyle, varsayılan dil için herhangi bir yerelleştirme dosyası sağlamanız gerekmez; özgün dizeler doğrudan kodda zaten kullanılabilir.

Çevirilerin dize dizisini kabul eden daha genel Plural(int count, string[] pluralForms, params object[] arguments) aşırı yüklemeyi kullanabilirsiniz.

Sébastien Ros, Scott Addie ve Hisham Bin Ateya tarafından

Bu makalede, Orchard Core çerçevesiyle bir ASP.NET Core uygulamasında Taşınabilir Nesne (PO) dosyalarını kullanma adımları açıklanmaktadır.

Not: Orchard Core bir Microsoft ürünü değildir. Sonuç olarak, Microsoft bu özellik için destek sağlamaz.

Örnek kodu görüntüleme veya indirme (indirme)

PO dosyası nedir?

PO dosyaları, belirli bir dil için çevrilmiş dizeleri içeren metin dosyaları olarak dağıtılır. .resx dosyaları yerine PO dosyalarını kullanmanın bazı avantajları şunlardır:

  • PO dosyaları çoğullaştırmayı destekler; .resx dosyaları çoğullaştırmayı desteklemez.
  • PO dosyaları .resx dosyaları gibi derlenmemiştir. Bu nedenle özel araçlar ve derleme adımları gerekli değildir.
  • PO dosyaları, işbirliğine dayalı çevrimiçi düzenleme araçlarıyla iyi çalışır.

Örnek

Aşağıda, çoğul biçimine sahip olmak üzere fransızca iki dizenin çevirisini içeren örnek bir PO dosyası verilmiştir:

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

Bu örnekte aşağıdaki söz dizimi kullanılır:

  • #:: Çevrilecek dizenin bağlamını gösteren açıklama. Aynı dize, kullanıldığı yere bağlı olarak farklı çevrilebilir.
  • msgid: Çevrilmemiş dize.
  • msgstr: Çevrilen dize.

Çoğullaştırma desteği söz konusu olduğunda daha fazla giriş tanımlanabilir.

  • msgid_plural: Çevrilmemiş çoğul dize.
  • msgstr[0]: Büyük/küçük harf 0 için çevrilmiş dize.
  • msgstr[N]: Büyük/küçük harf N için çevrilmiş dize.

PO dosya belirtimi burada bulunabilir.

ASP.NET Core'da PO dosya desteğini yapılandırma

Bu örnek, Visual Studio 2019 proje şablonundan oluşturulan ASP.NET Core MVC uygulamasını temel alır.

Pakete başvurma

NuGet paketine OrchardCore.Localization.Core bir başvuru ekleyin.

Dosya .csproj artık aşağıdakine benzer bir satır içeriyor (sürüm numarası farklılık gösterebilir):

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

Hizmeti kaydetme

Gerekli hizmetleri yöntemine ConfigureServicesStartup.csekleyin:

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

    services.AddPortableObjectLocalization();

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

gerekli ara yazılımı yöntemine ConfigureStartup.csekleyin:

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?}");
    });
}

Aşağıdaki kodu istediğiniz sayfaya Razor ekleyin. Index.cshtml bu örnekte kullanılır.

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

Bir IViewLocalizer örnek eklenir ve "Merhaba dünya!" metnini çevirmek için kullanılır.

PO dosyası oluşturma

Uygulama kök klasörünüzde culture code.po> adlı <bir dosya oluşturun. Bu örnekte, Fransızca dili kullanıldığından dosya adı fr.po şeklindedir:

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

Bu dosya hem çevrilecek dizeyi hem de Fransızca çevrilmiş dizeyi depolar. Çeviriler gerekirse üst kültürlerine geri döner. Bu örnekte, istenen kültür fr-FR veya fr-CAise fr.po dosyası kullanılır.

Uygulamayı test etme

Uygulamanızı çalıştırın ve URL'sine /Indexgidin. Merhaba dünya! metni görüntülenir.

/Index?culture=fr-FR URL'sine gidin. Bonjour le monde! metni görüntülenir.

Çoğullaştırma

PO dosyaları çoğullaştırma formlarını destekler. Bu, aynı dizenin kardinaliteye göre farklı çevrilmesi gerektiğinde kullanışlıdır. Bu görev, her dilin kardinaliteye göre hangi dizenin kullanılacağını seçmek için özel kurallar tanımlaması nedeniyle karmaşık hale getirilir.

Orchard Yerelleştirme paketi, bu farklı çoğul formları otomatik olarak çağırmak için bir API sağlar.

Çoğullaştırma PO dosyaları oluşturma

Daha önce bahsedilen fr.po dosyasına aşağıdaki içeriği ekleyin:

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

Bu örnekteki her girişin neyi temsil ettiği hakkında bir açıklama için bkz. PO dosyası nedir?

Farklı çoğullama formları kullanarak dil ekleme

Önceki örnekte İngilizce ve Fransızca dizeler kullanılmıştır. İngilizce ve Fransızca yalnızca iki çoğullaştırma formuna sahiptir ve aynı form kurallarını paylaşırlar; bu da bir kardinalitesinin ilk çoğul forma eşlenmesidir. Diğer kardinaliteler ikinci çoğul forma eşlenir.

Tüm diller aynı kuralları paylaşmaz. Bu, üç çoğul biçimi olan Çek diliyle gösterilmiştir.

cs.po Dosyayı aşağıdaki gibi oluşturun ve çoğullaştırmanın üç farklı çeviriye nasıl ihtiyacı olduğunu not edin:

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

Çek yerelleştirmelerini kabul etmek için yönteminde desteklenen kültürler ConfigureServices listesine ekleyin"cs":

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

Pages/Index.cshtml Dosyayı düzenleyerek çeşitli kardinaliteler için yerelleştirilmiş çoğul dizeleri işleyin:

<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: Gerçek dünya senaryosunda, sayıyı temsil etmek için bir değişken kullanılır. Burada aynı kodu üç farklı değerle tekrarlar ve çok belirli bir olayı kullanıma sunarız.

Kültürler arasında geçiş yaptığınızda aşağıdakileri görürsünüz:

/Index için:

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

/Index?culture=fr için:

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

/Index?culture=cs için:

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

Çek kültürü için üç çevirinin farklı olduğunu unutmayın. Fransız ve İngiliz kültürleri, son çevrilen iki dize için aynı yapıyı paylaşır.

Gelişmiş görevler

Dizeleri bağlamsallaştırma

Uygulamalar genellikle çeşitli yerlerde çevrilecek dizeleri içerir. Aynı dizenin bir uygulama içindeki belirli konumlarda (Razor görünümler veya sınıf dosyaları) farklı bir çevirisi olabilir. PO dosyası, temsil edilen dizeyi kategorilere ayırmak için kullanılabilen dosya bağlamı kavramlarını destekler. Bir dosya bağlamı kullanılarak, bir dize dosya bağlamı (veya dosya bağlamı eksikliği) bağlı olarak farklı çevrilebilir.

PO yerelleştirme hizmetleri, tam sınıfın adını veya bir dizeyi çevirirken kullanılan görünümü kullanır. Bu, girdideki msgctxt değer ayarlanarak gerçekleştirilir.

Önceki fr.po örneğine küçük bir ekleme düşünün. konumunda Pages/Index.cshtml bulunan bir Razor görünüm, ayrılmış msgctxt girişin değeri ayarlanarak dosya bağlamı olarak tanımlanabilir:

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

msgctxt Bu şekilde ayarlandığında, adresine gezinirken /Index?culture=fr-FRmetin çevirisi gerçekleşir. çevirisi adresine ilerlerken /Privacy?culture=fr-FRgerçekleşmez.

Belirli bir dosya bağlamıyla eşleşmediğinde, Orchard Core'un geri dönüş mekanizması bağlamı olmayan uygun bir PO dosyasını arar. için Pages/Privacy.cshtmltanımlanmış belirli bir dosya bağlamı olmadığı varsayıldığında, aşağıdaki gibi bir PO dosyasını yüklemek için /Privacy?culture=fr-FR gezinme:

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

PO dosyalarının konumunu değiştirme

PO dosyalarının varsayılan konumu içinde ConfigureServicesdeğiştirilebilir:

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

Bu örnekte, PO dosyaları Yerelleştirme klasöründen yüklenir.

Yerelleştirme dosyalarını bulmak için özel mantık uygulama

PO dosyalarını bulmak için daha karmaşık bir mantık gerektiğinde, OrchardCore.Localization.PortableObject.ILocalizationFileLocationProvider arabirim uygulanabilir ve hizmet olarak kaydedilebilir. Bu, PO dosyalarının farklı konumlarda depolanabilmesi veya dosyaların bir klasör hiyerarşisi içinde bulunması gerektiğinde kullanışlıdır.

Farklı bir varsayılan çoğullaştırılmış dil kullanma

Paket, iki çoğul forma özgü bir Plural uzantı yöntemi içerir. Daha fazla çoğul form gerektiren diller için bir uzantı yöntemi oluşturun. Bir uzantı yöntemiyle, varsayılan dil için herhangi bir yerelleştirme dosyası sağlamanız gerekmez; özgün dizeler doğrudan kodda zaten kullanılabilir.

Çevirilerin dize dizisini kabul eden daha genel Plural(int count, string[] pluralForms, params object[] arguments) aşırı yüklemeyi kullanabilirsiniz.

Sébastien Ros, Scott Addie ve Hisham Bin Ateya tarafından

Bu makalede, Orchard Core çerçevesiyle bir ASP.NET Core uygulamasında Taşınabilir Nesne (PO) dosyalarını kullanma adımları açıklanmaktadır.

Not: Orchard Core bir Microsoft ürünü değildir. Sonuç olarak, Microsoft bu özellik için destek sağlamaz.

Örnek kodu görüntüleme veya indirme (indirme)

PO dosyası nedir?

PO dosyaları, belirli bir dil için çevrilmiş dizeleri içeren metin dosyaları olarak dağıtılır. .resx dosyaları yerine PO dosyalarını kullanmanın bazı avantajları şunlardır:

  • PO dosyaları çoğullaştırmayı destekler; .resx dosyaları çoğullaştırmayı desteklemez.
  • PO dosyaları .resx dosyaları gibi derlenmemiştir. Bu nedenle özel araçlar ve derleme adımları gerekli değildir.
  • PO dosyaları, işbirliğine dayalı çevrimiçi düzenleme araçlarıyla iyi çalışır.

Örnek

Aşağıda, çoğul biçimine sahip olmak üzere fransızca iki dizenin çevirisini içeren örnek bir PO dosyası verilmiştir:

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

Bu örnekte aşağıdaki söz dizimi kullanılır:

  • #:: Çevrilecek dizenin bağlamını gösteren açıklama. Aynı dize, kullanıldığı yere bağlı olarak farklı çevrilebilir.
  • msgid: Çevrilmemiş dize.
  • msgstr: Çevrilen dize.

Çoğullaştırma desteği söz konusu olduğunda daha fazla giriş tanımlanabilir.

  • msgid_plural: Çevrilmemiş çoğul dize.
  • msgstr[0]: Büyük/küçük harf 0 için çevrilmiş dize.
  • msgstr[N]: Büyük/küçük harf N için çevrilmiş dize.

PO dosya belirtimi burada bulunabilir.

ASP.NET Core'da PO dosya desteğini yapılandırma

Bu örnek, Visual Studio 2017 proje şablonundan oluşturulan ASP.NET Core MVC uygulamasını temel alır.

Pakete başvurma

NuGet paketine OrchardCore.Localization.Core bir başvuru ekleyin.

Dosya .csproj artık aşağıdakine benzer bir satır içeriyor (sürüm numarası farklılık gösterebilir):

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

Hizmeti kaydetme

Gerekli hizmetleri yöntemine ConfigureServicesStartup.csekleyin:

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;
        });
}

gerekli ara yazılımı yöntemine ConfigureStartup.csekleyin:

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?}");
    });
}

Aşağıdaki kodu istediğiniz görünüme Razor ekleyin. About.cshtml bu örnekte kullanılır.

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

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

Bir IViewLocalizer örnek eklenir ve "Merhaba dünya!" metnini çevirmek için kullanılır.

PO dosyası oluşturma

Uygulama kök klasörünüzde culture code.po> adlı <bir dosya oluşturun. Bu örnekte, Fransızca dili kullanıldığından dosya adı fr.po şeklindedir:

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

Bu dosya hem çevrilecek dizeyi hem de Fransızca çevrilmiş dizeyi depolar. Çeviriler gerekirse üst kültürlerine geri döner. Bu örnekte, istenen kültür fr-FR veya fr-CAise fr.po dosyası kullanılır.

Uygulamayı test etme

Uygulamanızı çalıştırın ve URL'sine /Home/Aboutgidin. Merhaba dünya! metni görüntülenir.

/Home/About?culture=fr-FR URL'sine gidin. Bonjour le monde! metni görüntülenir.

Çoğullaştırma

PO dosyaları çoğullaştırma formlarını destekler. Bu, aynı dizenin kardinaliteye göre farklı çevrilmesi gerektiğinde kullanışlıdır. Bu görev, her dilin kardinaliteye göre hangi dizenin kullanılacağını seçmek için özel kurallar tanımlaması nedeniyle karmaşık hale getirilir.

Orchard Yerelleştirme paketi, bu farklı çoğul formları otomatik olarak çağırmak için bir API sağlar.

Çoğullaştırma PO dosyaları oluşturma

Daha önce bahsedilen fr.po dosyasına aşağıdaki içeriği ekleyin:

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

Bu örnekteki her girişin neyi temsil ettiği hakkında bir açıklama için bkz. PO dosyası nedir?

Farklı çoğullama formları kullanarak dil ekleme

Önceki örnekte İngilizce ve Fransızca dizeler kullanılmıştır. İngilizce ve Fransızca yalnızca iki çoğullaştırma formuna sahiptir ve aynı form kurallarını paylaşırlar; bu da bir kardinalitesinin ilk çoğul forma eşlenmesidir. Diğer kardinaliteler ikinci çoğul forma eşlenir.

Tüm diller aynı kuralları paylaşmaz. Bu, üç çoğul biçimi olan Çek diliyle gösterilmiştir.

cs.po Dosyayı aşağıdaki gibi oluşturun ve çoğullaştırmanın üç farklı çeviriye nasıl ihtiyacı olduğunu not edin:

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

Çek yerelleştirmelerini kabul etmek için yönteminde desteklenen kültürler ConfigureServices listesine ekleyin"cs":

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 Dosyayı düzenleyerek çeşitli kardinaliteler için yerelleştirilmiş çoğul dizeleri işleyin:

<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: Gerçek dünya senaryosunda, sayıyı temsil etmek için bir değişken kullanılır. Burada aynı kodu üç farklı değerle tekrarlar ve çok belirli bir olayı kullanıma sunarız.

Kültürler arasında geçiş yaptığınızda aşağıdakileri görürsünüz:

/Home/About için:

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

/Home/About?culture=fr için:

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

/Home/About?culture=cs için:

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

Çek kültürü için üç çevirinin farklı olduğunu unutmayın. Fransız ve İngiliz kültürleri, son çevrilen iki dize için aynı yapıyı paylaşır.

Gelişmiş görevler

Dizeleri bağlamsallaştırma

Uygulamalar genellikle çeşitli yerlerde çevrilecek dizeleri içerir. Aynı dizenin bir uygulama içindeki belirli konumlarda (Razor görünümler veya sınıf dosyaları) farklı bir çevirisi olabilir. PO dosyası, temsil edilen dizeyi kategorilere ayırmak için kullanılabilen dosya bağlamı kavramlarını destekler. Bir dosya bağlamı kullanılarak, bir dize dosya bağlamı (veya dosya bağlamı eksikliği) bağlı olarak farklı çevrilebilir.

PO yerelleştirme hizmetleri, tam sınıfın adını veya bir dizeyi çevirirken kullanılan görünümü kullanır. Bu, girdideki msgctxt değer ayarlanarak gerçekleştirilir.

Önceki fr.po örneğine küçük bir ekleme düşünün. konumunda Views/Home/About.cshtml bulunan bir Razor görünüm, ayrılmış msgctxt girişin değeri ayarlanarak dosya bağlamı olarak tanımlanabilir:

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

msgctxt Bu şekilde ayarlandığında, adresine gezinirken /Home/About?culture=fr-FRmetin çevirisi gerçekleşir. çevirisi adresine ilerlerken /Home/Contact?culture=fr-FRgerçekleşmez.

Belirli bir dosya bağlamıyla eşleşmediğinde, Orchard Core'un geri dönüş mekanizması bağlamı olmayan uygun bir PO dosyasını arar. için Views/Home/Contact.cshtmltanımlanmış belirli bir dosya bağlamı olmadığı varsayıldığında, aşağıdaki gibi bir PO dosyasını yüklemek için /Home/Contact?culture=fr-FR gezinme:

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

PO dosyalarının konumunu değiştirme

PO dosyalarının varsayılan konumu içinde ConfigureServicesdeğiştirilebilir:

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

Bu örnekte, PO dosyaları Yerelleştirme klasöründen yüklenir.

Yerelleştirme dosyalarını bulmak için özel mantık uygulama

PO dosyalarını bulmak için daha karmaşık bir mantık gerektiğinde, OrchardCore.Localization.PortableObject.ILocalizationFileLocationProvider arabirim uygulanabilir ve hizmet olarak kaydedilebilir. Bu, PO dosyalarının farklı konumlarda depolanabilmesi veya dosyaların bir klasör hiyerarşisi içinde bulunması gerektiğinde kullanışlıdır.

Farklı bir varsayılan çoğullaştırılmış dil kullanma

Paket, iki çoğul forma özgü bir Plural uzantı yöntemi içerir. Daha fazla çoğul form gerektiren diller için bir uzantı yöntemi oluşturun. Bir uzantı yöntemiyle, varsayılan dil için herhangi bir yerelleştirme dosyası sağlamanız gerekmez; özgün dizeler doğrudan kodda zaten kullanılabilir.

Çevirilerin dize dizisini kabul eden daha genel Plural(int count, string[] pluralForms, params object[] arguments) aşırı yüklemeyi kullanabilirsiniz.