ASP.NET Core taşınabilir nesne yerelleştirmesini yapılandırma
Sébastien Ros, Scott Ade ve Hisham bin ateya tarafından
bu makalede, orchard Core framework ile bir ASP.NET Core uygulamasında taşınabilir nesne (PO) dosyalarını kullanma adımları gösterilmektedir.
Note: 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 (nasıl indirileceği)
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ı, pluralization 'ı destekler; . resx dosyaları pluralization 'yi desteklemez.
- PO dosyaları . resx dosyaları gibi derlenmemektedir. Bu nedenle, özelleştirilmiş araç ve derleme adımları gerekli değildir.
- PO dosyaları işbirliğine dayalı çevrimiçi Düzenle araçlarıyla iyi çalışır.
Örnek
Aşağıda, çoğul biçimi ile birlikte olmak üzere Fransızca 'daki 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 örnek aşağıdaki sözdizimini kullanır:
#:: Çevrilecek dizenin bağlamını gösteren bir açıklama. Aynı dize, kullanıldığı yere bağlı olarak farklı şekilde çevrilebilir.msgid: Çevrilmemiş dize.msgstr: Çevrilmiş dize.
Plurselme desteği söz konusu olduğunda, daha fazla girdi tanımlanabilir.
msgid_plural: Çevrilmemiş çoğul dize.msgstr[0]: 0 durumu için çevrilmiş dize.msgstr[N]: N. durum için çevrilmiş dize.
PO dosya belirtimi buradabulunabilir.
ASP.NET Core 'de PO dosya desteğini yapılandırma
bu örnek, bir Visual Studio 2017 proje şablonundan oluşturulan ASP.NET Core MVC uygulamasını temel alır.
Pakete başvurma
NuGet paketine bir başvuru ekleyin OrchardCore.Localization.Core .
. Csproj dosyası artık aşağıdakine benzer bir satır içerir (sürüm numarası farklılık gösterebilir):
<PackageReference Include="OrchardCore.Localization.Core" Version="1.0.0-rc2-13450" />
Hizmet kaydediliyor
Gerekli Hizmetleri ConfigureServices Başlangıç. cs yöntemine ekleyin:
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ı Configure Başlangıç. cs yöntemine ekleyin:
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 tercih ettiğiniz görünüme ekleyin Razor . Bu örnekte . cshtml hakkında kullanılır.
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
<p>@Localizer["Hello world!"]</p>
IViewLocalizer"Hello World!" metnini dönüştürmek için bir örnek eklenmiş ve 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 olur:
msgid "Hello world!"
msgstr "Bonjour le monde!"
Bu dosya, hem çevrilecek dizeyi hem de Fransızca çevrilmiş dizeyi depolar. Çevirileri, gerekirse üst kültürüne döndürülür. Bu örnekte, istenen kültür veya ise fr. Po dosyası kullanılır fr-FR fr-CA .
Uygulamayı test etme
Uygulamanızı çalıştırın ve URL 'ye gidin /Home/About . Merhaba Dünya metni! görüntülenir.
URL 'ye gidin /Home/About?culture=fr-FR . Bonjour Le Monde metni! görüntülenir.
Çoğullaştırma
Po dosyaları, aynı dizenin kardinalite göre farklı şekilde çevrilmesi gerektiğinde yararlı olan çoğullaştırma formlarını destekler. Bu görev, her dilin kardinalite göre hangi dizenin kullanılacağını seçmek için özel kurallar tanımladığı konusunda 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
Aşağıdaki içeriği daha önce bahsedilen fr. Po dosyasına 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 girdinin ne olduğunu gösteren bir açıklama için bkz. po dosyası nedir? .
Farklı çoğullaştırma formları kullanarak dil ekleme
Önceki örnekte İngilizce ve Fransızca dizeleri kullanılmıştır. İngilizce ve Fransızca yalnızca iki plurtasyon biçimine sahiptir ve aynı form kurallarını paylaşır, bu da bir kardinalitesi ilk plural formuyla eşlenir. Diğer herhangi bir kardinalite ikinci çoğul formla eşleştirilir.
Dillerin hepsi aynı kuralları paylaşmaz. Bu, üç plural formu bulunan Çekçe dil ile gösterilmiştir.
cs.poDosyayı aşağıdaki gibi oluşturun ve plurun üç farklı çeviriyi nasıl ihtiyacı olduğunu aklınızda yapın:
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çe yerelleştirmeleri kabul etmek için, "cs" yönteminde desteklenen kültürlerin listesine ekleyin ConfigureServices :
var supportedCultures = new List<CultureInfo>
{
new CultureInfo("en-US"),
new CultureInfo("en"),
new CultureInfo("fr-FR"),
new CultureInfo("fr"),
new CultureInfo("cs")
};
Farklı kart aralıkları için yerelleştirilmiş, çoğul dizeleri işlemek üzere views/ Home /About.exe dosyasını düzenleyin:
<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>
Note: Gerçek bir Dünya senaryosunda, sayıyı temsil etmek için bir değişken kullanılır. Burada, çok özel bir durumu ortaya çıkarmak için aynı kodu üç farklı değerle tekrarlarız.
Kültürleri değiştirme sırasında, 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çe kültür için, üç çevirilerin farklı olduğunu unutmayın. Fransızca ve Ingilizce kültürler, son çevrilen iki dize için aynı yapıyı paylaşır.
Gelişmiş görevler
Contextualleme dizeleri
Uygulamalar genellikle birkaç yerde çevrilecek dizeleri içerir. Aynı dize bir uygulama içindeki belirli konumlarda farklı bir çeviriye sahip olabilir ( Razor görünümler veya sınıf dosyaları). Bir PO dosyası, temsil edilen dizeyi kategorilere ayırmak için kullanılabilecek bir dosya bağlamı kavramını destekler. Dosya bağlamını kullanarak, dosya bağlamına (veya bir dosya bağlamının olmamasından) bağlı olarak bir dize farklı şekilde çevrilebilir.
PO yerelleştirme hizmetleri, tam sınıfın veya bir dize çevrilirken kullanılan görünümün adını kullanır. Bu, girişteki değer ayarlanarak gerçekleştirilir msgctxt .
Önceki fr. Po örneğine küçük bir ek göz önünde bulundurun. Razor Views/ Home /About.exe içinde bulunan bir görünüm, ayrılmış girdinin değeri ayarlanarak dosya bağlamı olarak tanımlanabilir msgctxt :
msgctxt "Views.Home.About"
msgid "Hello world!"
msgstr "Bonjour le monde!"
msgctxtBu şekilde ayarlandığında, ' ye gidildiğinde metin çevirisi oluşur /Home/About?culture=fr-FR . Çeviri, ' a gidildiğinde gerçekleşmez /Home/Contact?culture=fr-FR .
Belirli bir giriş belirli bir dosya bağlamıyla eşleşmediğinde, Orchard Core 'un geri dönüş mekanizması bağlam olmadan uygun bir PO dosyası arar. Görünümler/ Home /Contact.exe için tanımlanan belirli bir dosya bağlamı olmadığı varsayılarak, ' /Home/Contact?culture=fr-FR a giderek bir PO dosyası yükler:
msgid "Hello world!"
msgstr "Bonjour le monde!"
PO dosyalarının konumunu değiştirme
PO dosyalarının varsayılan konumu ' de değiştirilebilir ConfigureServices :
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 bir mantık uygulama
PO dosyalarını bulmak için daha karmaşık mantık gerektiğinde, OrchardCore.Localization.PortableObject.ILocalizationFileLocationProvider arabirim bir hizmet olarak uygulanabilir ve kaydedilebilir. Bu, PO dosyaları farklı konumlarda depolanabileceği veya dosyaların bir klasör hiyerarşisi içinde bulunması gerektiğinde kullanışlıdır.
Farklı bir varsayılan plurar dili kullanma
Paket, Plural iki plural formlarına özgü bir genişletme yöntemi içerir. Daha fazla çoğul biçim gerektiren diller için bir genişletme yöntemi oluşturun. 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.
Çeviri dizesi dizisini Plural(int count, string[] pluralForms, params object[] arguments) kabul eden daha genel aşırı yüklemeyi kullanabilirsiniz.
Sébastien Ros ve Scott Addie tarafından
Bu makalede, Bir Mobil Uygulama içinde Taşınabilir Nesne (PO) dosyalarını, ASP.NET Core Core çerçevesiyle kullanma adımları adım adım açıklanmıştır.
Not: Core, Bir Microsoft ürünü değil. Sonuç olarak, Microsoft bu özellik için destek sağlar.
Örnek kodu görüntüleme veya indirme ( nasılindir)
Po dosyası nedir?
PO dosyaları, verilen 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 derlenmiş değil. Bu nedenle özel araç ve derleme adımları gerekli değildir.
- PO dosyaları işbirliğine dayalı çevrimiçi düzenleme araçlarıyla iyi çalışır.
Örnek
Fransızca iki dizenin çevirisini içeren, çoğul biçimine sahip bir po dosyası da dahil olmak üzere örnek po dosyası şöyledir:
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ı belirten bir açıklama. Aynı dize, kullanılan yere bağlı olarak farklı bir şekilde çevrilebilir.msgid: Aktarlanmamış dize.msgstr: Çevrilmiş dize.
Çoğullaştırma desteği durumunda daha fazla giriş tanımlanabilir.
msgid_plural: Aktarlanmamış çoğul dize.msgstr[0]: 0 durumu için çevrilmiş dize.msgstr[N]: N durumu için çevrilmiş dize.
PO dosyası belirtimi burada bulunabilir.
ASP.NET Core'da PO dosyası desteğini yapılandırma
Bu örnek, Visual Studio 2017 proje şablonundan oluşturulan bir ASP.NET Core MVC uygulamasını temel alan bir örnektir.
Pakete başvuru
NuGet OrchardCore.Localization.Core paketine bir başvuru ekleyin.
.csproj dosyası artık aşağıdakine benzer bir satır içerir (sürüm numarası farklılık gösterebilir):
<PackageReference Include="OrchardCore.Localization.Core" Version="1.0.0-beta1-3187" />
Hizmeti kaydetme
ConfigureServicesStartup.cs yöntemine gerekli hizmetleri ekleyin:
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;
});
}
Startup.cs yöntemine Configure gerekli ara yazılımı ekleyin:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseRequestLocalization();
app.UseMvcWithDefaultRoute();
}
Aşağıdaki kodu istediğiniz Razor görünüme ekleyin. Bu örnekte About.cshtml kullanılmıştır.
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
<p>@Localizer["Hello world!"]</p>
Örnek, IViewLocalizer "Hello world!" metnini çevirmek için bir örnek içine ve ardından kullanılır.
Po dosyası oluşturma
Uygulama kök <culture code> klasörünüzde .po adlı bir dosya oluşturun. Bu örnekte, Fransızca dil kullanılan dosya adı fr.po'dır:
msgid "Hello world!"
msgstr "Bonjour le monde!"
Bu dosya hem çevrilen dizeyi hem de Fransızca çevrilmiş dizeyi depolar. Gerekirse çeviriler üst kültürlerine geri döner. Bu örnekte, istenen kültür veya ise fr.po dosyası fr-FR fr-CA kullanılır.
Uygulamayı test etme
Uygulamalarınızı çalıştırın ve URL'sini /Home/About seçin. Merhaba dünya! metni görüntülenir.
URL'sini /Home/About?culture=fr-FR seçin. 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ı çevrilmeleri gereken durumlarda kullanışlıdır. Bu görev, her dilin kardinaliteye göre hangi dizeyi kullanmak üzere seçecek özel kuralları tanımladığı gerçeğiyle karmaşık hale geldi.
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 sahip ve aynı form kurallarını paylaşır. Bu da birinin kardinalitesi ilk çoğul biçime eşlenmiş olmasıdır. Diğer tüm kardinaliteler ikinci çoğul biçime eşlenmiş.
Tüm diller aynı kuralları paylaşmaz. Bu, üç çoğul biçime sahip Olan Çek diliyle birlikte gösterildi.
Dosyayı aşağıdaki cs.po gibi oluşturun ve çoğullaştırmanın üç farklı çeviriye nasıl ihtiyaç olduğunu not eder:
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çe yerelleştirmeleri kabul "cs" etmek için yönteminin desteklenen kültürler listesine ConfigureServices ekleyin:
var supportedCultures = new List<CultureInfo>
{
new CultureInfo("en-US"),
new CultureInfo("en"),
new CultureInfo("fr-FR"),
new CultureInfo("fr"),
new CultureInfo("cs")
};
Birkaç kardinalite için yerelleştirilmiş, çoğul dizeleri işlemek için Views/ Home /About.cshtml dosyasını düzenleyin:
<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, s sayımı temsil etmek için bir değişken kullanılır. Burada, çok belirli bir durumu ortaya çıkarmak için aynı kodu üç farklı değerle tekrarlarız.
Kültürleri değiştirerek şunları görüyorsunuz:
/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ızca ve İngilizce kültürler, son çevrilen iki dize için aynı yapıyı paylaşır.
Gelişmiş görevler
Dizeleri bağlama
Uygulamalar genellikle çeşitli yerlerde çevrilen dizeleri içerir. Aynı dizenin bir uygulama içindeki belirli konumlarda (görünümler veya sınıf dosyaları) Razor farklı bir çevirisi olabilir. Po dosyası, temsil edilen dizeyi kategorilere ayırmak için kullanılan bir dosya bağlamını destekler. Dosya bağlamı kullanılarak, bir dize dosya bağlamına (veya dosya bağlamının olmamasına) bağlı olarak farklı bir şekilde çevrilebilir.
Po yerelleştirme hizmetleri, tam sınıfın adını veya bir dizeyi çevirisinde kullanılan görünümü kullanır. Bu, girişte değeri ayar tarafından msgctxt başarılı olur.
Önceki fr.po örneğine küçük bir eklemeyi göz önünde bulundurarak. Razor Views/ Home /About.cshtml dosyasında bulunan bir görünüm, ayrılmış girişin değeri ayarlandığı şekilde msgctxt dosya bağlamı olarak tanımlanabilir:
msgctxt "Views.Home.About"
msgid "Hello world!"
msgstr "Bonjour le monde!"
Bu msgctxt şekilde ayarlanmış durumdayken, metin çevirisi'ne gezinirken /Home/About?culture=fr-FR gerçekleşir. çeviri, hizmetine doğru ilerlerken /Home/Contact?culture=fr-FR oluşmaz.
Belirli bir giriş belirli bir dosya bağlamıyla eşleşmezse, Temel Çekirdek'in geri dönüş mekanizması bağlam olmadan uygun bir PO dosyası aramaz. Views/ Home /Contact.cshtml için tanımlanmış belirli bir dosya bağlamı olmadığını varsayarak, aşağıdaki gibi bir /Home/Contact?culture=fr-FR PO dosyası yükler:
msgid "Hello world!"
msgstr "Bonjour le monde!"
PO dosyalarının konumunu değiştirme
Po dosyalarının varsayılan konumu içinde ConfigureServices değ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 bir mantık uygulama
PO dosyalarını bulmak için daha karmaşık bir mantık gerektiğinde, OrchardCore.Localization.PortableObject.ILocalizationFileLocationProvider arabirim bir hizmet olarak uygulanarak kaydedilebilirsiniz. Bu, PO dosyalarının farklı konumlarda depolandığı veya dosyaların bir klasör hiyerarşisi içinde bulunamaları gereken durumlarda kullanışlıdır.
Farklı bir varsayılan çoğullaştırılmış dil kullanma
Paket, iki Plural çoğul biçime özgü bir genişletme yöntemi içerir. Daha fazla çoğul form gerektiren diller için bir genişletme yöntemi oluşturun. Uzantı yöntemiyle, özgün dizelerin doğrudan kodda zaten kullanılabilir olduğu varsayılan dil için herhangi bir — yerelleştirme dosyası sağlamanız gerek yoktur.
Çeviri dizesi dizisini Plural(int count, string[] pluralForms, params object[] arguments) kabul eden daha genel aşırı yüklemeyi kullanabilirsiniz.