Farklı dilleri ve kültürleri destekleme

Uygulamalar belirli bir kültüre özgü olabilecek kaynaklar içerir. Örneğin, bir uygulama mevcut yerel ayarın diline çevrilmiş, kültüre özgü dizeler içerebilir.

Kültüre özgü kaynakları uygulamanızın geri kalanından ayrı tutmak iyi bir uygulamadır. Android, dile ve kültüre özgü kaynakları sistem yerel ayarına göre çözer. Android projenizdeki kaynaklar dizinini kullanarak farklı yerel ayarlar için destek sağlayabilirsiniz.

Uygulamanızı kullananların kültürlerine uygun kaynaklar belirtebilirsiniz. Kullanıcılarınızın diline ve kültürüne uygun olan herhangi bir kaynak türünü sağlayabilirsiniz. Örneğin, aşağıdaki ekran görüntülerinde, cihazın varsayılan en_US ve İspanyolca es_ES ayarlarında dize ve çekilebilir kaynakları görüntüleyen bir uygulama gösterilmektedir.

Uygulama, mevcut yerel ayara
bağlı olarak farklı bir metin ve simge

Şekil 1. Mevcut yerel ayara bağlı olarak farklı kaynaklar kullanan uygulamalar.

Android SDK Araçları'nı kullanarak bir proje oluşturduğunuzda, araçlar projenin en üst düzeyinde bir res/ dizini oluşturur. Bu res/ dizininde çeşitli kaynak türleri için alt dizinler bulunur. Dize değerlerinizi barındıran res/values/strings.xml dosyası gibi birkaç varsayılan dosya da vardır.

Farklı dilleri desteklemek, yerel ayara özgü kaynakları kullanmaktan ibaret değildir. Bazı kullanıcılar, kullanıcı arayüzü yerel ayarları için sağdan sola (RTL) alfabe kullanan bir dil (ör. Arapça veya İbranice) seçer. Kullanıcı arayüzü yerel ayarlarını İngilizce gibi LTR komut dosyalarını kullanan bir dile ayarlayan diğer kullanıcılar, RTL komut dosyalarını kullanan bir dilde içerik görüntüleyebilir veya oluşturabilir. Her iki kullanıcı türünü de desteklemek için uygulamanızın şunları yapması gerekir:

  • RTL yerel ayarları için RTL kullanıcı arayüzü düzeni kullanın.
  • Biçimlendirilmiş mesajların içinde görüntülenen metin verilerinin yönünü tespit edip bildirin. Genellikle bu kılavuzda açıklandığı gibi, metin verilerinin yönünü sizin için belirleyen bir yöntem çağırabilirsiniz.

Yerel ayar dizinleri ve kaynak dosyaları oluşturma

Daha fazla yerel ayar desteği eklemek için res/ içinde ek dizinler oluşturun. Her dizin adı aşağıdaki biçime uygun olmalıdır:

<resource type>-b+<language code>[+<country code>]

Örneğin values-b+es/, es dil koduna sahip yerel ayarlar için dize kaynakları içerir. Benzer şekilde mipmap-b+es+ES/, es dil kodu ve ES ülke kodunu içeren yerel ayarlar için simgeler içerir.

Android, çalışma zamanında cihazın yerel ayarlarına göre uygun kaynakları yükler. Daha fazla bilgi için Alternatif kaynaklar sağlama bölümünü inceleyin.

Hangi yerel ayarların destekleneceğine karar verdikten sonra kaynak alt dizinlerini ve dosyalarını oluşturun. Örneğin:

MyProject/
    res/
       values/
           strings.xml
       values-b+es/
           strings.xml
       mipmap/
           country_flag.png
       mipmap-b+es+ES/
           country_flag.png

Kaynak dosyalara yerelleştirilmiş kaynaklar ekleyin. Aşağıda, yerelleştirilmiş dize ve resim kaynak dosyası örnekleri verilmiştir:

/values/strings.xml dilindeki İngilizce dizeler (varsayılan yerel ayar):

<resources>
    <string name="hello_world">Hello World!</string>
</resources>

/values-b+es/strings.xml dilinde İspanyolca dizeler (es yerel ayar):

<resources>
    <string name="hello_world">¡Hola Mundo!</string>
</resources>

/mipmap/country_flag.png bölgesindeki ABD bayrağı simgesi (varsayılan yerel ayar):

ABD bayrağının simgesi

2. Şekil. Varsayılan (en_US) yerel ayar için kullanılan simge.

/mipmap-b+es+ES/country_flag.png bölgesindeki İspanyol bayrağı simgesi (es_ES yerel ayar):

İspanya bayrağının simgesi

3. Şekil. es_ES yerel ayarı için kullanılan simge.

Not: Tüm kaynak türlerinde yerel ayar niteleyici gibi yapılandırma niteleyicileri kullanabilirsiniz. Örneğin, bit eşlem çekilebilirlerinizin yerelleştirilmiş sürümlerini sağlamak isteyebilirsiniz. Daha fazla bilgi için Uygulamanızı yerelleştirme başlıklı makaleyi inceleyin.

Uygulamanızdaki kaynakları kullanın

Her kaynağın name özelliğini kullanarak kaynak kodunuzdaki ve diğer XML dosyalarınızdaki kaynaklara referans verin: R.<resource type>.<resource name>. Aşağıdaki örneklerde gösterildiği gibi, bir kaynağı bu şekilde kabul eden çeşitli yöntemler vardır:

Kotlin

// Get a string resource
val hello = resources.getString(R.string.hello_world)

// Or supply a string resource to a method that requires a string
TextView(this).apply {
    setText(R.string.hello_world)
}

Java

// Get a string resource
String hello = getResources().getString(R.string.hello_world);

// Or supply a string resource to a method that requires a string
TextView textView = new TextView(this);
textView.setText(R.string.hello_world);

Aşağıdaki örnekte gösterildiği gibi, XML dosyalarında XML özelliğinin uyumlu bir değer kabul ettiği durumlarda @<resource type>/<resource name> söz dizimine sahip bir kaynağa başvurabilirsiniz:

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@mipmap/country_flag" />

Not: Kullanıcı dil ayarlarına doğru öncelik verildiğinden emin olmak için resConfigs özelliğini kullanarak uygulamanızın desteklediği dilleri belirtin. Daha fazla bilgi için Uygulamanızın desteklediği dilleri belirtme bölümüne bakın.

İletilerdeki metni biçimlendirme

Bir uygulamadaki en yaygın görevlerden biri metin biçimlendirmedir. Yerelleştirilmiş mesajlar, uygun konumlara metin ve sayısal veriler eklenerek biçimlendirilir. Maalesef, RTL kullanıcı arayüzü veya RTL verileriyle çalışırken basit biçimlendirme yanlış ve hatta okunamayan metin çıktıları görüntüleyebilir.

Arapça, İbranice, Farsça ve Urduca gibi diller RTL olarak yazılır. Ancak sayılar ve yerleştirilmiş LTR metni gibi bazı öğeler, RTL metni içinde LTR olarak yazılır. İngilizce dahil LTR komut dosyalarını kullanan diller de çift yönlüdür, çünkü sağdan sola görüntülenmesi gereken yerleşik RTL komut dosyalarını içerebilirler.

Uygulamalar genellikle bu tür yerleşik zıt yönde metin örnekleri oluşturur. Örneğin, yerelleştirilmiş mesajlara rastgele bir dille ilgili metin verileri ve isteğe bağlı bir metin yönü ekleme gibi yöntemler kullanılır. Yol tariflerinin bu şekilde karıştırılması genellikle zıt yön metninin nerede başlayıp nerede bittiğine dair net bir gösterge içermez. Bu nedenle, uygulama tarafından oluşturulan metinler kullanıcı deneyimini olumsuz yönde etkileyebilir.

Sistemin çift yönlü metni varsayılan olarak işleme şekli genellikle metni beklendiği gibi oluştursa da uygulamanız metni yerelleştirilmiş bir mesaja eklediğinde metin doğru şekilde oluşturulmayabilir. Aşağıda, metnin yanlış görünebileceği durumlara ilişkin örnekler verilmiştir:

  • İletinin başına metin eklendi:

    PERSON_NAME sizi arıyor

  • Bir sayıyla başlayan metin (ör. adres veya telefon numarası):

    987 654-3210

  • Noktalama işaretiyle başlayan metin (ör. telefon numarası):

    +19876543210

  • Noktalama işaretleriyle biten metin:

    Emin misiniz?

  • Her iki yönü de içeren metin:

    labelLi kelimesi İbranicede muz anlamına geliyor.

Örnek

Bir uygulamanın, çalışma zamanında %s yerine bir adres eklenmiş olarak bazen "Bunu mu demek istediniz?" mesajını görüntülemesi gerektiğini varsayalım. Uygulama farklı kullanıcı arayüzü yerel ayarlarını destekler. Bu nedenle, mesaj yerel ayara özel bir kaynaktan gelir ve cihaz bir RTL yerel ayarına ayarlandığında sağdan sola yönünü kullanır. Örneğin, İbranice kullanıcı arayüzü için mesaj şu şekilde görünür:

"/>&nbsp ️ ಠपlanamıyor #### %s?

Ancak önerilen adres, yerel ayarın dilinde metin içermeyen bir veritabanından gelebilir. Örneğin, adres Kaliforniya'daki bir yer içinse, veritabanında İngilizce metin kullanılarak görünür. "15 Bay Street, Laurel, CA" adresini metin yönüyle ilgili herhangi bir ipucu sağlamadan RTL mesajına eklerseniz sonuç beklenmiyor veya doğru olmaz:

"/> "/> aradığında छए öneriyoruz 15 Bay Street, Laurel, CA?

Ev numarası, beklendiği gibi adresin solunda değil sağ tarafında görünür. Bu durum, ev numarasını daha garip bir posta koduna benziyor. LTR metin yönünü kullanan bir mesaja sağdan sola metin eklerseniz da aynı sorun ortaya çıkabilir.

Açıklama ve çözüm

Bu örnekteki sorun, metin biçimlendiricinin "15"in adresin bir parçası olduğunu belirtmemesi ve bu nedenle sistem, "15"in kendisinden önce gelen RTL metninin mi yoksa ondan sonra gelen LTR metninin mi olduğunu belirleyememesinden kaynaklanır.

Bu sorunu çözmek için BidiFormatter sınıfındaki unicodeWrap() yöntemini kullanın. Bu yöntem, bir dizenin yönünü algılar ve bu yönü belirten Unicode biçimlendirme karakterleriyle sarmalanır.

Aşağıdaki kod snippet'inde unicodeWrap() özelliğinin nasıl kullanılacağı gösterilmektedir:

Kotlin

val mySuggestion = "15 Bay Street, Laurel, CA"
val myBidiFormatter: BidiFormatter = BidiFormatter.getInstance()

// The "did_you_mean" localized string resource includes
// a "%s" placeholder for the suggestion.
String.format(getString(R.string.did_you_mean), myBidiFormatter.unicodeWrap(mySuggestion))

Java

String mySuggestion = "15 Bay Street, Laurel, CA";
BidiFormatter myBidiFormatter = BidiFormatter.getInstance();

// The "did_you_mean" localized string resource includes
// a "%s" placeholder for the suggestion.
String.format(getString(R.string.did_you_mean),
        myBidiFormatter.unicodeWrap(mySuggestion));

"15" artık LTR olarak belirtilen metnin içinde göründüğü için doğru konumda gösterilmektedir:

Australia"/> "/> ɛ:#Etkinleştir platformları kapsayıcı 15 Bay Street, Laurel, CA?

Aşağıdakilerden biri geçerli olmadığı sürece, yerelleştirilmiş bir iletiye eklediğiniz her metin parçasında unicodeWrap() yöntemini kullanın:

  • Metin, URI veya SQL sorgusu gibi makine tarafından okunabilir bir dizeye ekleniyor.
  • Metin parçasının zaten düzgün bir şekilde kaydırıldığını biliyorsunuz.

Not: Uygulamanız Android 4.3 (API düzeyi 18) veya sonraki sürümleri hedefliyorsa Android Framework'te bulunan BidiFormatter sürümünü kullanın. Aksi takdirde, Destek Kitaplığı'ndaki BidiFormatter sürümünü kullanın.

Sayıları biçimlendirme

Uygulamanızın mantığındaki sayıları dizelere dönüştürmek için yöntem çağrılarını değil, biçim dizelerini kullanın:

Kotlin

var myIntAsString = "$myInt"

Java

String myIntAsString = String.format("%d", myInt);

Bu, sayıları yerel ayarınıza uygun şekilde biçimlendirir. Bu, farklı bir basamak grubu kullanmayı içerebilir.

Farsça ve çoğu Arapça yerel ayar gibi kendi rakam grubunu kullanan bir yerel ayara ayarlanmış bir cihazda SQL sorgusu oluşturmak için String.format() kullandığınızda, sorgudaki parametrelerden herhangi biri sayı olduğunda sorun meydana gelir. Bunun nedeni, sayının yerel ayarın basamaklarında biçimlendirilmiş olması ve bu rakamların SQL'de geçersiz olmasıdır.

ASCII biçimli sayıları korumak ve SQL sorgusunu geçerli tutmak için bunun yerine, ilk parametre olarak bir yerel ayar içeren String.format() özelliğinin aşırı yüklenmiş sürümünü kullanmanız gerekir. Locale.US yerel bağımsız değişkenini kullanın.

Düzen yansıtmayı destekleme

RTL komut dosyalarını kullanan kullanıcılar; sağa hizalı menüler, sağa hizalı metin ve sola işaret eden ileri oklar içeren bir RTL kullanıcı arayüzünü tercih eder.

Şekil 4'te, Ayarlar uygulamasındaki bir ekranın LTR sürümü ile RTL karşılığı arasındaki kontrast gösterilmektedir:

Bildirim alanı sağ üst köşeye yakın bir konumda sağa hizalanır, uygulama çubuğundaki menü düğmesi sol üst köşeye yakındır, ekranın ana bölümündeki içerik sola hizalanıp soldan sağa doğru hizalanır ve geri düğmesi sol alt köşeye yakın olup sol tarafı işaret eder. Bildirim alanı sol üst köşe yakınlarında sola hizalanır, uygulama çubuğundaki menü düğmesi sağ üst köşeye yakındır, ekranın ana bölümündeki içerik sağa hizalanır ve sağdan sola hizalanır, geri düğmesi de sağ alt köşeye yakın konumdadır ve sağ tarafı işaret eder
Şekil 4. Ayarlar ekranının LTR ve RTL varyantları.

Uygulamanıza RTL desteği eklerken aşağıdaki noktaları göz önünde bulundurun:

  • sağdan sola metin yansıtma yalnızca Android 4.2 (API düzeyi 17) veya sonraki sürümleri çalıştıran cihazlarda kullanıldığında uygulamalarda desteklenir. Eski cihazlarda metin yansıtmanın nasıl destekleneceğini öğrenmek için bu kılavuzdaki Eski uygulamalar için destek sağlama bölümüne bakın.
  • Uygulamanızın sağdan sola metin yönünü destekleyip desteklemediğini test etmek için bu kılavuzda açıklandığı şekilde geliştirici seçeneklerini kullanarak test edin ve RTL komut dosyalarını kullanan kişileri uygulamanızı kullanmaya davet edin.

Not: Yansıtmaya uygun olan ve olmayan öğelerin listesi dahil olmak üzere düzen yansıtmayla ilgili ek tasarım yönergelerini görüntülemek için İki yönlülük materyal tasarım yönergelerini inceleyin.

Uygulamanızdaki kullanıcı arayüzü düzenini RTL yerel ayarında RTL'de görünecek şekilde yansıtmak için aşağıdaki bölümlerde belirtilen adımları tamamlayın.

Derleme ve manifest dosyalarını değiştirin

Uygulama modülünüzün build.gradle dosyasını ve uygulama manifest dosyasını aşağıdaki gibi değiştirin:

build.gradle (Module: app)

Modern

android {
    ...
    defaultConfig {
        targetSdkVersion 17 // Or higher
        ...
    }
}

Kotlin

android {
    ...
    defaultConfig {
        targetSdkVersion(17) // Or higher
        ...
    }
}

AndroidManifest.xml

<manifest ... >
    ...
    <application ...
        android:supportsRtl="true">
    </application>
</manifest>

Not: Uygulamanız Android 4.1.1 (API düzeyi 16) veya önceki sürümleri hedefliyorsa uygulamanızın düzen dosyalarında görünen start ve end özellik değerlerinin yanı sıra android:supportsRtl özelliği de yoksayılır. Bu durumda, sağdan sola düzen yansıtma, uygulamanızda otomatik olarak gerçekleşmez.

Mevcut kaynakları güncelleyin

Mevcut düzen kaynağı dosyalarınızda sırasıyla left ve right öğelerini start ve end biçimine dönüştürün. Böylece çerçeve, uygulamanızın kullanıcı arayüzü öğelerini kullanıcının dil ayarlarına göre uyumlu hale getirebilir.

Not: Kaynaklarınızı güncellemeden önce, eski uygulamalar için veya Android 4.1.1 (API düzeyi 16) ve önceki sürümleri hedefleyen uygulamalar için nasıl destek sağlayacağınızı öğrenin.

Çerçevenin RTL hizalama özelliklerini kullanmak için Tablo 1'de görünen düzen dosyalarınızdaki özellikleri değiştirin.

Tablo 1. Uygulamanız birden çok metinle yol tarifini desteklediğinde kullanılacak özellikler

Yalnızca LTR'yi destekleyen özellik LTR ve RTL'yi destekleyen özellik
android:gravity="left" android:gravity="start"
android:gravity="right" android:gravity="end"
android:layout_gravity="left" android:layout_gravity="start"
android:layout_gravity="right" android:layout_gravity="end"
android:paddingLeft android:paddingStart
android:paddingRight android:paddingEnd
android:drawableLeft android:drawableStart
android:drawableRight android:drawableEnd
android:layout_alignLeft android:layout_alignStart
android:layout_alignRight android:layout_alignEnd
android:layout_marginLeft android:layout_marginStart
android:layout_marginRight android:layout_marginEnd
android:layout_alignParentLeft android:layout_alignParentStart
android:layout_alignParentRight android:layout_alignParentEnd
android:layout_toLeftOf android:layout_toStartOf
android:layout_toRightOf android:layout_toEndOf

Tablo 2'de sistemin, hedef SDK sürümüne, left ve right özelliklerinin tanımlanıp tanımlanmadığına ve start ile end özelliklerinin tanımlanıp tanımlanmadığına göre kullanıcı arayüzü hizalama özelliklerini nasıl işlediği gösterilmektedir.

Tablo 2. Hedef SDK sürümüne ve tanımlanmış özelliklere göre kullanıcı arayüzü öğesi hizalama davranışı

Android 4.2
(API düzeyi 17) veya sonraki sürümleri mi hedefliyorsunuz?
Sol ve sağ tanımlandı mı? Başlangıç ve bitiş tanımlandı mı? Sonuç
Evet Evet Evet left ve right geçersiz kılınarak start ve end kullanılır
Evet Evet Hayır left ve right kullanılıyor
Evet Hayır Evet start ve end kullanılıyor
Hayır Evet Evet left ve right kullanılıyor (start ve end yoksayılır)
Hayır Evet Hayır left ve right kullanılıyor
Hayır Hayır Evet start ve end, left ve right olarak çözümlendi

Yol tarifi ve dile özgü kaynaklar ekleyin

Bu adım, düzeninizin, çizimlerinizin ve değer kaynak dosyalarınızın farklı diller ve metin yönleri için özelleştirilmiş değerler içeren belirli sürümlerini eklemeyi içerir.

Android 4.2 (API düzeyi 17) ve sonraki sürümlerde -ldrtl (düzen-yönü-sağdan sola) ve -ldltr (düzen-yönü-soldan sağa) kaynak niteleyicilerini kullanabilirsiniz. Mevcut kaynaklarla geriye dönük uyumluluğu sağlamak için Android'in eski sürümleri, doğru metin yönünü belirlemek amacıyla kaynağın dil niteleyicilerini kullanır.

İbranice, Arapça ve Farsça dilleri gibi RTL komut dosyalarını desteklemek için belirli bir düzen dosyası eklemek istediğinizi varsayalım. Bunu yapmak için aşağıdaki örnekte gösterildiği gibi res/ dizininize bir layout-ldrtl/ dizini ekleyin:

res/
    layout/
        main.xml This layout file is loaded by default.
    layout-ldrtl/
        main.xml This layout file is loaded for languages using an
                 RTL text direction, including Arabic, Persian, and Hebrew.

Düzenin yalnızca Arapça metinler için tasarlanmış belirli bir sürümünü eklemek isterseniz dizin yapınız aşağıdaki gibi görünür:

res/
    layout/
        main.xml This layout file is loaded by default.
    layout-ar/
        main.xml This layout file is loaded for Arabic text.
    layout-ldrtl/
        main.xml This layout file is loaded only for non-Arabic
                 languages that use an RTL text direction.

Not: Dile özgü kaynaklar, düzene özel kaynaklara göre önceliklidir. Bu kaynaklar, varsayılan kaynaklara göre önceliklidir.

Desteklenen widget'ları kullanma

Android 4.2'den (API düzeyi 17) itibaren çoğu çerçeve kullanıcı arayüzü öğesi sağdan sola metin yönünü otomatik olarak destekler. Ancak ViewPager gibi bazı çerçeve öğeleri RTL metin yönünü desteklemez.

Ana ekrandaki widget'lar, karşılık gelen manifest dosyaları android:supportsRtl="true" özellik atamasını içerdiği sürece sağdan sola metin yönünü destekler.

Eski uygulamalar için destek sağlayın

Uygulamanız Android 4.1.1 (API düzeyi 16) veya önceki sürümleri hedefliyorsa start ve end ile birlikte left ve right özelliklerini ekleyin.

Düzeninizin sağdan sola metin yönünü kullanması gerekip gerekmediğini kontrol etmek için aşağıdaki mantığı kullanın:

Kotlin

private fun shouldUseLayoutRtl(): Boolean {
    return if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
        View.LAYOUT_DIRECTION_RTL == layoutDirection
    } else {
        false
    }
}

Java

private boolean shouldUseLayoutRtl() {
    if (android.os.Build.VERSION.SDK_INT >=
            android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
        return View.LAYOUT_DIRECTION_RTL == getLayoutDirection();
    } else {
        return false;
    }
}

Not: Uyumluluk sorunlarını önlemek için Android SDK Derleme Araçları'nın 23.0.1 veya sonraki bir sürümünü kullanın.

Geliştirici seçeneklerini kullanarak test etme

Android 4.4 (API düzeyi 19) veya sonraki sürümleri çalıştıran cihazlarda cihaz üzerinde geliştirici seçeneklerinden Sağdan düzen yönünü zorunlu kıl'ı etkinleştirebilirsiniz. Bu ayar, LTR komut dosyalarını kullanan metinleri (ör. İngilizce metinler) RTL modunda görmenizi sağlar.

Uygulama mantığını güncelleyin

Bu bölümde, uygulamanızı birden fazla metin talimatlarını işleyecek şekilde uyarlarken uygulamanızın güncelleme mantığının belirli yönleri açıklanmaktadır.

Mülk değişiklikleri

Düzen yönü, düzen parametreleri, dolgu, metin yönü, metin hizalaması veya çekilebilir konumlandırması gibi RTL ile ilgili herhangi bir özelliği değiştirmek için onRtlPropertiesChanged() geri çağırma işlevini kullanın. Bu geri çağırma, mevcut düzen yönünü almanızı ve bir etkinliğin View nesnelerini buna göre güncellemenizi sağlar.

Görüntüleme sayısı

Bir etkinliğin görünüm hiyerarşisinin doğrudan parçası olmayan bir kullanıcı arayüzü widget'ı (iletişim kutusu veya kısa ileti benzeri bir kullanıcı arayüzü öğesi gibi) oluşturuyorsanız bağlama göre doğru düzen yönünü ayarlayın. Aşağıdaki kod snippet'inde bu işlemin nasıl yapılacağı gösterilmektedir:

Kotlin

val config: Configuration = context.resources.configuration
view.layoutDirection = config.layoutDirection

Java

final Configuration config =
    getContext().getResources().getConfiguration();
view.setLayoutDirection(config.getLayoutDirection());

View sınıfının çeşitli yöntemleri için ek dikkat edilmesi gerekir:

onMeasure()
Görünüm ölçümleri metnin yönüne bağlı olarak değişiklik gösterebilir.
onLayout()
Kendi düzen uygulamanızı oluşturursanız onLayout() sürümünüzde super() yöntemini çağırmanız ve özel mantığınızı RTL komut dosyalarını destekleyecek şekilde uyarlamanız gerekir.
onDraw()
Özel görünüm uyguluyor veya bir çizime gelişmiş işlevler ekliyorsanız, kodunuzu RTL komut dosyalarını destekleyecek şekilde güncellemeniz gerekir. Widget'ınızın sağdan sola modda olup olmadığını belirlemek için aşağıdaki kodu kullanın:

Kotlin

// On devices running Android 4.1.1 (API level 16) and lower,
// you can call the isLayoutRtl() system method directly.
fun isLayoutRtl(): Boolean = layoutDirection == LAYOUT_DIRECTION_RTL

Java

// On devices running Android 4.1.1 (API level 16) and lower,
// you can call the isLayoutRtl() system method directly.
public boolean isLayoutRtl() {
    return (getLayoutDirection() == LAYOUT_DIRECTION_RTL);
}

Çekilebilir

RTL düzeni için yansıtılması gereken bir çekilebilir öğeniz varsa cihazda çalışan Android sürümüne bağlı olarak aşağıdaki adımlardan birini tamamlayın:

  • Android 4.3 (API düzeyi 18) ve önceki sürümleri çalıştıran cihazlarda -ldrtl kaynak dosyalarını ekleyin ve tanımlayın.
  • Android 4.4 (API düzeyi 19) ve sonraki sürümlerde, çekilebilir öğenizi tanımlarken sistemin RTL düzeni yansıtmasını sizin için işleyebilmesini sağlayan android:autoMirrored="true" kullanın.

    Not: android:autoMirrored özelliği, yalnızca çift yönlü yansıtması çekilebilir öğenin tamamının grafiksel yansıtması olan basit çekilebilir öğeler için çalışır. Çekilebilir öğeniz birden fazla öğe içeriyorsa veya çekilebilir öğenizi yansıttığınızda, yorumlanması değiştiriliyorsa yansıtma işlemini kendiniz yapabilirsiniz. Mümkün olduğunda iki yönlü bir uzmana danışarak yansıtılan çizimlerinizin kullanıcılar için anlamlı olup olmadığını belirleyin.

Yerçekimi

Uygulamanızın düzen kodu Gravity.LEFT veya Gravity.RIGHT kullanıyorsa bu değerleri sırasıyla Gravity.START ve Gravity.END olarak değiştirin.

Gravity.LEFT veya Gravity.RIGHT özelliklerine bağlı olan Kotlin ya da Java kodunuz varsa absoluteGravity değerini layoutDirection ile eşleşecek şekilde ayarlayarak kodu bu değişiklikle çalışacak şekilde uyarlayabilirsiniz.

Örneğin, aşağıdaki kodu kullanıyorsanız:

Kotlin

when (gravity and Gravity.HORIZONTAL_GRAVITY_MASK) {
    Gravity.LEFT -> {
        // Handle objects that are left-aligned.
    }
    Gravity.RIGHT -> {
        // Handle objects that are right-aligned.
    }
}

Java

switch (gravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
    case Gravity.LEFT:
        // Handle objects that are left-aligned.
        break;
    case Gravity.RIGHT:
        // Handle objects that are right-aligned.
        break;
}

Bunu aşağıdaki şekilde değiştirin:

Kotlin

val absoluteGravity: Int = Gravity.getAbsoluteGravity(gravity, layoutDirection)
when (absoluteGravity and Gravity.HORIZONTAL_GRAVITY_MASK) {
    Gravity.LEFT -> {
        // Handle objects that are left-aligned.
    }
    Gravity.RIGHT -> {
        // Handle objects that are right-aligned.
    }
}

Java

final int layoutDirection = getLayoutDirection();
final int absoluteGravity =
        Gravity.getAbsoluteGravity(gravity, layoutDirection);
switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
    case Gravity.LEFT:
        // Handle objects that are left-aligned.
        break;
    case Gravity.RIGHT:
        // Handle objects that are right-aligned.
        break;
}

Yani yerçekimi değerleriniz için start ve end kullanıyor olsanız bile, sola hizalı ve sağa hizalı değerleri işleyen mevcut kodunuzu kullanmaya devam edebilirsiniz.

Not: Yerçekimi ayarlarınızı uygularken layoutDirection bağımsız değişkeni içeren, aşırı yüklenmiş bir Gravity.apply() sürümü kullanın.

Kenar boşlukları ve dolgu

Uygulamanızda RTL komut dosyalarını desteklemek için kenar boşluğu ve dolgu değerleriyle ilgili bu en iyi uygulamaları izleyin:

  • Yola özgü özellik eşdeğerleri leftMargin ve rightMargin yerine getMarginStart() ve getMarginEnd() kullanın.
  • setMargins() kullanırken uygulamanız RTL komut dosyaları algılarsa left ve right bağımsız değişkenlerinin değerlerini değiştirin.
  • Uygulamanızda özel dolgu mantığı varsa setPadding() ve setPaddingRelative() değerlerini geçersiz kılın.

Uygulamaya özgü dil tercihlerini destekleme

Çok dilli kullanıcılar çoğu durumda sistem dillerini İngilizce gibi tek bir dile ayarlar, ancak belirli uygulamalar için Felemenkçe, Çince veya Hintçe gibi başka diller de seçmek isterler. Android 13, uygulamaların bu kullanıcılara daha iyi bir deneyim sunmasına yardımcı olmak için birden çok dili destekleyen uygulamalarda aşağıdaki özellikleri sunar:

  • Sistem ayarları: Kullanıcıların her uygulama için tercih ettiği dili seçebileceği merkezi bir konumdur.

    Uygulamanız, sisteme birden fazla dili desteklediğini bildirmek için manifest dosyasında android:localeConfig özelliğini beyan etmelidir. Daha fazla bilgi edinmek için kaynak dosyası oluşturma ve bunu uygulamanızın manifest dosyasında belirtme talimatlarını inceleyin.

  • Ek API'ler: LocaleManager uygulamasındaki l10n-placeholder1">setApplicationLocales() ve l10n-placeholder2">getApplicationLocales() yöntemleri gibi herkese açık API’ler, uygulamaların çalışma zamanında sistem dilinden farklı bir dil ayarlamasına olanak tanır.

    Özel uygulama içi dil seçiciler kullanan uygulamalar, dil tercihlerini seçtikleri yerden bağımsız olarak kullanıcılara tutarlı bir kullanıcı deneyimi sunmak için bu API'leri kullanabilir. Herkese açık API'ler, standart kod miktarını azaltmanıza yardımcı olur ve bölünmüş APK'ları destekler. Ayrıca, uygulama düzeyindeki kullanıcı dil ayarlarını depolamak için Uygulamalar için Otomatik Yedekleme'yi de desteklerler.

    Önceki Android sürümleriyle geriye dönük uyumluluk için AndroidX'te eşdeğer API'ler de mevcuttur. Appcompat 1.6.0-beta01 veya daha sonraki bir sürümü kullanmanızı öneririz.

    Daha fazla bilgi edinmek için yeni API'leri uygulama talimatlarına bakın.

Ayrıca bkz.

Ek kaynaklar

Eski cihazları destekleme hakkında daha fazla bilgi edinmek için aşağıdaki kaynakları görüntüleyin:

Blog yayınları