Xamarin.Forms Dize ve Görüntü Yerelleştirme
Yerelleştirme, bir uygulamayı hedef pazarın belirli dil veya kültürel gereksinimlerini karşılayacak şekilde uyarlama işlemidir. Yerelleştirmeyi gerçekleştirmek için bir uygulamadaki metin ve görüntülerin birden çok dile çevrilmesi gerekebilir. Yerelleştirilmiş bir uygulama, çevrilmiş metni mobil cihazın kültür ayarlarına göre otomatik olarak görüntüler:
.NET framework, Resx kaynak dosyalarını kullanarak uygulamaları yerelleştirmek için yerleşik bir mekanizma içerir. Kaynak dosyası, uygulamanın sağlanan bir anahtar için içerik almasını sağlayan ad/değer çiftleri olarak metin ve diğer içeriği depolar. Kaynak dosyaları, yerelleştirilmiş içeriğin uygulama kodundan ayrılmasına olanak sağlar.
Uygulamaları yerelleştirmek Xamarin.Forms için kaynak dosyalarını kullanmak için aşağıdaki adımları gerçekleştirmeniz gerekir:
- Çevrilmiş metin içeren Resx dosyaları oluşturun.
- Paylaşılan projede varsayılan kültürü belirtin.
- içindeki metni yerelleştirin Xamarin.Forms.
- Görüntüleri her platform için kültür ayarlarına göre yerelleştirin.
- Her platformda uygulama adını yerelleştirin.
- Her platformda yerelleştirmeyi test edin.
Resx dosyaları oluşturma
Kaynak dosyaları, derleme işlemi sırasında ikili kaynak (.resources) dosyalarına derlenen .resx uzantısına sahip XML dosyalarıdır. Visual Studio 2019, kaynakları almak için kullanılan bir API sağlayan bir sınıf oluşturur. Yerelleştirilmiş bir uygulama genellikle uygulamada kullanılan tüm dizelerin yanı sıra desteklenen her dil için kaynak dosyaları içeren varsayılan bir kaynak dosyası içerir. Örnek uygulamanın paylaşılan projede kaynak dosyalarını içeren bir Resx klasörü ve AppResources.resx adlı varsayılan kaynak dosyası vardır.
Kaynak dosyaları her öğe için aşağıdaki bilgileri içerir:
- Ad , koddaki metne erişmek için kullanılan anahtarı belirtir.
- Değer çevrilen metni belirtir.
- Açıklama , ek bilgi içeren isteğe bağlı bir alandır.
Visual Studio 2019'da Yeni Öğe Ekle iletişim kutusuyla bir kaynak dosyası eklenir:
Dosya eklendikten sonra, her metin kaynağı için satırlar eklenebilir:
Erişim Değiştirici açılan ayarı, Visual Studio'da kaynaklara erişmek için kullanılan sınıfın nasıl oluşturulacağı belirlenir. Erişim Değiştirici'yi Genel veya İç olarak ayarlamak, belirtilen erişilebilirlik düzeyine sahip oluşturulan bir sınıfta sonuçlanıyor. Erişim Değiştirici'nin Kod oluşturma yok olarak ayarlanması bir sınıf dosyası oluşturmaz. Varsayılan kaynak dosyası, bir sınıf dosyası oluşturacak şekilde yapılandırılmalıdır ve bu da projeye .designer.cs uzantısının eklendiği bir dosyaya neden olur.
Varsayılan kaynak dosyası oluşturulduktan sonra, uygulamanın desteklediği her kültür için ek dosyalar oluşturulabilir. Her ek kaynak dosyası, dosya adında çeviri kültürünü içermelidir ve Access Değiştiricisi Kod oluşturma yok olarak ayarlanmalıdır.
Çalışma zamanında uygulama, bir kaynak isteğini özgüllük sırasına göre çözümlemeye çalışır. Örneğin, cihaz kültürü en-US ise uygulama kaynak dosyalarını şu sırayla arar:
- AppResources.en-US.resx
- AppResources.en.resx
- AppResources.resx (varsayılan)
Aşağıdaki ekran görüntüsünde AppResources.es.resx adlı bir İspanyolca çeviri dosyası gösterilmektedir:
Çeviri dosyası, varsayılan dosyada belirtilen ad değerlerini kullanır ancak Value sütununda İspanyolca dil dizeleri içerir. Ayrıca, Erişim Değiştiricisi Kod oluşturma yok olarak ayarlanır.
Mac için Visual Studio 2019'da Yeni Dosya Ekle iletişim kutusuyla bir kaynak dosyası eklenir:
Varsayılan kaynak dosyası oluşturulduktan sonra, kaynak dosyasındaki root
öğesi içinde öğeler oluşturularak data
metin eklenebilir:
<?xml version="1.0" encoding="utf-8"?>
<root>
...
<data name="AddButton" xml:space="preserve">
<value>Add Note</value>
</data>
<data name="NotesLabel" xml:space="preserve">
<value>Notes:</value>
</data>
<data name="NotesPlaceholder" xml:space="preserve">
<value>e.g. Get Milk</value>
</data>
</root>
.designer.cs sınıf dosyası, kaynak dosyası seçeneklerinde Özel Araç özelliği ayarlanarak oluşturulabilir:
Özel Araç'ın PublicResXFileCodeGenerator olarak ayarlanması, oluşturulan sınıfın erişime sahip olmasıyla public
sonuçlanır. Özel Araç'ın InternalResXFileCodeGenerator olarak ayarlanması, oluşturulan bir sınıfın erişime sahip internal
olmasına neden olur. Boş bir Özel Araç değeri sınıf oluşturmaz. Oluşturulan sınıf adı kaynak dosya adıyla eşleşecektir. Örneğin, AppResources.resx dosyası AppResources.designer.cs adlı bir dosyada sınıf oluşturulmasına AppResources
neden olur.
Desteklenen her kültür için ek kaynak dosyaları oluşturulabilir. Her dil dosyası dosya adında çeviri kültürünü içermelidir, bu nedenle es-MX'i hedefleyen bir dosya AppResources.es-MX.resx olarak adlandırılmalıdır.
Çalışma zamanında uygulama, bir kaynak isteğini özgüllük sırasına göre çözümlemeye çalışır. Örneğin, cihaz kültürü en-US ise uygulama kaynak dosyalarını şu sırayla arar:
- AppResources.en-US.resx
- AppResources.en.resx
- AppResources.resx (varsayılan)
Dil çevirisi dosyaları, varsayılan dosyayla aynı Ad değerlerine sahip olmalıdır. Aşağıdaki XML, AppResources.es.resx adlı İspanyolca çeviri dosyasını gösterir:
<?xml version="1.0" encoding="utf-8"?>
<root>
...
<data name="NotesLabel" xml:space="preserve">
<value>Notas:</value>
</data>
<data name="NotesPlaceholder" xml:space="preserve">
<value>por ejemplo . comprar leche</value>
</data>
<data name="AddButton" xml:space="preserve">
<value>Agregar nuevo elemento</value>
</data>
</root>
Varsayılan kültürü belirtme
Kaynak dosyalarının düzgün çalışması için uygulamanın belirtilen bir NeutralResourcesLanguage
özniteliği olmalıdır. Kaynak dosyalarını içeren projede, AssemblyInfo.cs dosyası varsayılan kültürü belirtmek üzere özelleştirilmelidir. Aşağıdaki kod, AssemblyInfo.cs dosyasında öğesinin en-USolarak nasıl ayarlandığını NeutralResourcesLanguage
gösterir:
using System.Resources;
// The resources from the neutral language .resx file are stored directly
// within the library assembly. For that reason, changing en-US to a different
// language in this line will not by itself change the language shown in the
// app. See the discussion of UltimateResourceFallbackLocation in the
// documentation for additional information:
// https://learn.microsoft.com/dotnet/api/system.resources.neutralresourceslanguageattribute
[assembly: NeutralResourcesLanguage("en-US")]
Uyarı
özniteliğini NeutralResourcesLanguage
belirtmezseniz, ResourceManager
sınıfı belirli bir kaynak dosyası olmadan herhangi bir kültür için değerler döndürür null
. Varsayılan kültür belirtildiğinde, desteklenmeyen ResourceManager
kültürler için varsayılan Resx dosyasından sonuçlar döndürür. Bu nedenle, desteklenmeyen kültürler için metnin görüntülenmesi için her zaman öğesini belirtmeniz NeutralResourcesLanguage
önerilir.
Varsayılan kaynak dosyası oluşturulduktan ve AssemblyInfo.cs dosyasında belirtilen varsayılan kültür oluşturulduktan sonra, uygulama çalışma zamanında yerelleştirilmiş dizeleri alabilir.
Kaynak dosyaları hakkında daha fazla bilgi için bkz . .NET uygulamaları için kaynak dosyaları oluşturma.
iOS'ta desteklenen dilleri belirtme
iOS'ta , projeniz için Info.plist dosyasında desteklenen tüm dilleri bildirmeniz gerekir. Info.plist dosyasında Kaynak görünümünü kullanarakanahtar için CFBundleLocalizations
bir dizi ayarlayın ve Resx dosyalarına karşılık gelen değerler sağlayın. Ayrıca, anahtar aracılığıyla beklenen bir dil ayarladığınızdan CFBundleDevelopmentRegion
emin olun:
Alternatif olarak, Info.plist dosyasını bir XML düzenleyicisinde açın ve aşağıdakileri ekleyin:
<key>CFBundleLocalizations</key>
<array>
<string>de</string>
<string>es</string>
<string>fr</string>
<string>ja</string>
<string>pt</string> <!-- Brazil -->
<string>pt-PT</string> <!-- Portugal -->
<string>ru</string>
<string>zh-Hans</string>
<string>zh-Hant</string>
</array>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
Not
Apple, Portekizce'ye beklediğinizden biraz farklı davranır. Daha fazla bilgi için bkz . developer.apple.com Dil Ekleme .
Daha fazla bilgi için bkz . Info.plist dosyasında varsayılan ve desteklenen dilleri belirtme.
UWP'de desteklenen dilleri belirtme
Bu, yalnızca uygulamayı dışarıdan yükleme veya mağaza için paketlediğinizde bir Uygulama Paketi oluşturursanız gereklidir. Bir UWP Uygulama Paketi oluşturduğunuzda, paket yüklendiğinde yalnızca yükleme cihazının dil ayarlarıyla ilgili kaynakları yükler. Bu nedenle, cihazda yalnızca İngilizce varsa, uygulamayla yalnızca İngilizce kaynaklar yüklenir. Daha fazla bilgi ve yönergeler için bkz . Windows 8.1 Mağazası uygulamaları: Bir cihazın gerekli olup olmadığına bakılmaksızın kaynakların bir cihaza yüklendiğinden emin olun.
içindeki metni yerelleştirme Xamarin.Forms
Oluşturulan sınıf kullanılarak AppResources
içinde Xamarin.Forms metin yerelleştirilir. Bu sınıf, varsayılan kaynak dosya adına göre adlandırılır. Örnek proje kaynak dosyası AppResources.resx olarak adlandırıldığından, Visual Studio adlı AppResources
eşleşen bir sınıf oluşturur. Statik özellikler, kaynak dosyasındaki AppResources
her satır için sınıfında oluşturulur. Örnek uygulamanın AppResources
sınıfında aşağıdaki statik özellikler oluşturulur:
- Addbutton
- NotesLabel
- NotesPlaceholder
Bu değerlere x:Static özellikleri olarak erişmek, yerelleştirilmiş metnin XAML'de görüntülenmesini sağlar:
<ContentPage ...
xmlns:resources="clr-namespace:LocalizationDemo.Resx">
<Label Text="{x:Static resources:AppResources.NotesLabel}" />
<Entry Placeholder="{x:Static resources:AppResources.NotesPlaceholder}" />
<Button Text="{x:Static resources:AppResources.AddButton}" />
</ContentPage>
Yerelleştirilmiş metin kodda da alınabilir:
public LocalizedCodePage()
{
Label notesLabel = new Label
{
Text = AppResources.NotesLabel,
// ...
};
Entry notesEntry = new Entry
{
Placeholder = AppResources.NotesPlaceholder,
//...
};
Button addButton = new Button
{
Text = AppResources.AddButton,
// ...
};
Content = new StackLayout
{
Children = {
notesLabel,
notesEntry,
addButton
}
};
}
sınıfındaki AppResources
özellikler, değerlerin alındığı kültür kaynak dosyasını belirlemek için geçerli değerini System.Globalization.CultureInfo.CurrentUICulture
kullanır.
Görüntüleri yerelleştirme
Resx dosyaları, metin depolamaya ek olarak, yalnızca metinden fazlasını depolayabilir, ayrıca görüntüleri ve ikili verileri de depolayabilir. Bununla birlikte, mobil cihazların çeşitli ekran boyutları ve yoğunlukları vardır ve her mobil platformda yoğunluğa bağımlı görüntüleri görüntülemeye yönelik işlevler bulunur. Bu nedenle, görüntüleri kaynak dosyalarında depolamak yerine platform görüntüsü yerelleştirme işlevi kullanılmalıdır.
Android'de görüntüleri yerelleştirme
Android'de yerelleştirilmiş çizilebilir öğeler (görüntüler), Kaynaklar dizinindeki klasörler için bir adlandırma kuralı kullanılarak depolanır. Klasörler, hedef dil için bir sonekle drawable olarak adlandırılır. Örneğin, İspanyolca klasörü drawable-es olarak adlandırılır.
Dört harfli bir yerel ayar kodu gerektiğinde Android, tireyi izleyen ek bir r gerektirir. Örneğin, Meksika yerel ayarı (es-MX) klasörü drawable-es-rMX olarak adlandırılmalıdır. Her yerel ayar klasöründeki görüntü dosyası adları aynı olmalıdır:
Daha fazla bilgi için bkz . Android Yerelleştirme.
iOS'ta görüntüleri yerelleştirme
iOS'ta, yerelleştirilmiş görüntüler Kaynaklar dizinindeki klasörler için bir adlandırma kuralı kullanılarak depolanır. Varsayılan klasör Base.lproj olarak adlandırılır. Dile özgü klasörler dil veya yerel ayar adıyla adlandırılır ve ardından .lproj eklenir. Örneğin, İspanyolca klasörü es.lproj olarak adlandırılır.
Dört harfli yerel kodlar aynı iki harfli dil kodları gibi çalışır. Örneğin, Meksika yerel ayarı (es-MX) klasörü es-MX.lproj olarak adlandırılmalıdır. Her yerel ayar klasöründeki görüntü dosyası adları aynı olmalıdır:
Not
iOS, .lproj klasör yapısını kullanmak yerine yerelleştirilmiş Varlık Kataloğu oluşturmayı destekler. Ancak, bunların Xcode'da oluşturulması ve yönetilmesi gerekir.
Daha fazla bilgi için bkz . iOS Yerelleştirme.
UWP'de görüntüleri yerelleştirme
UWP'de yerelleştirilmiş görüntüler Varlıklar/Görüntüler dizinindeki klasörler için bir adlandırma kuralı kullanılarak depolanır. Klasörler dil veya yerel ayar ile adlandırılır. Örneğin, İspanyolca dil klasörü es, Meksika yerel ayar klasörü ise es-MX olarak adlandırılmalıdır. Her yerel ayar klasöründeki görüntü dosyası adları aynı olmalıdır:
Daha fazla bilgi için bkz . UWP Yerelleştirme.
Yerelleştirilmiş görüntüleri kullanma
Her platform benzersiz bir dosya yapısına sahip görüntüleri depoladığından XAML, geçerli platformu temel alarak özelliğini ayarlamak ImageSource
için sınıfını kullanırOnPlatform
:
<Image>
<Image.Source>
<OnPlatform x:TypeArguments="ImageSource">
<On Platform="iOS, Android" Value="flag.png" />
<On Platform="UWP" Value="Assets/Images/flag.png" />
</OnPlatform>
</Image.Source>
</Image>
Not
İşaretleme OnPlatform
uzantısı, platforma özgü değerleri belirtmenin daha kısa bir yolunu sunar. Daha fazla bilgi için bkz . OnPlatform işaretleme uzantısı.
Görüntü kaynağı, koddaki Device.RuntimePlatform
özelliğine göre ayarlanabilir:
string imgSrc = Device.RuntimePlatform == Device.UWP ? "Assets/Images/flag.png" : "flag.png";
Image flag = new Image
{
Source = ImageSource.FromFile(imgSrc),
WidthRequest = 100
};
Uygulama adını yerelleştirme
Uygulama adı platform başına belirtilir ve Resx kaynak dosyalarını kullanmaz. Android'de uygulama adını yerelleştirmek için bkz . Android'de uygulama adını yerelleştirme. iOS'ta uygulama adını yerelleştirmek için bkz . iOS'ta uygulama adını yerelleştirme. UWP'de uygulama adını yerelleştirmek için bkz . UWP paket bildirimindeki dizeleri yerelleştirme.
Yerelleştirmeyi test et
Yerelleştirmeyi test etme işlemi en iyi şekilde cihazınızın dilini değiştirerek gerçekleştirilir. değerini kod olarak ayarlamak System.Globalization.CultureInfo.CurrentUICulture
mümkündür, ancak davranış platformlar arasında tutarsız olduğundan test için bu önerilmez.
iOS'ta, ayarlar uygulamasında, cihaz dilinizi değiştirmeden her uygulamanın dilini ayarlayabilirsiniz.
Android'de, uygulama başlatıldığında dil ayarları algılanıp önbelleğe alınır. Dilleri değiştirirseniz, uygulanan değişiklikleri görmek için uygulamadan çıkmanız ve uygulamayı yeniden başlatmanız gerekebilir.