Aracılığıyla paylaş


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:

iOS ve Android'de yerelleştirme uygulamasının ekran görüntüleri

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

  1. Çevrilmiş metin içeren Resx dosyaları oluşturun.
  2. Paylaşılan projede varsayılan kültürü belirtin.
  3. içindeki metni yerelleştirin Xamarin.Forms.
  4. Görüntüleri her platform için kültür ayarlarına göre yerelleştirin.
  5. Her platformda uygulama adını yerelleştirin.
  6. 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:

Visual Studio 2019'da yeni kaynak ekleme

Dosya eklendikten sonra, her metin kaynağı için satırlar eklenebilir:

.resx dosyasında varsayılan metin kaynaklarını belirtme

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:

  1. AppResources.en-US.resx
  2. AppResources.en.resx
  3. AppResources.resx (varsayılan)

Aşağıdaki ekran görüntüsünde AppResources.es.resx adlı bir İspanyolca çeviri dosyası gösterilmektedir:

.resx dosyasında varsayılan İspanyolca metin kaynaklarını belirtme

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

Mac için Visual Studio 2019'da yeni kaynak ekleme

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:

Kaynak dosyasının özelliklerinde belirtilen Özel Araç

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

  1. AppResources.en-US.resx
  2. AppResources.en.resx
  3. 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ı NeutralResourcesLanguagegö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:

Yerelleştirmeler bölümünü gösteren Info.plist düzenleyicisinin ekran görüntüsü

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ı AppResourceseş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:

Android projesinde yerelleştirilmiş görüntüler

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:

iOS projesinde yerelleştirilmiş görüntüler

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:

UWP projesinde yerelleştirilmiş görüntüler

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.