Mendukung berbagai bahasa dan budaya

Aplikasi menyertakan resource yang mungkin dikhususkan untuk budaya tertentu. Contohnya, aplikasi dapat menyertakan string spesifik budaya yang diterjemahkan ke dalam bahasa lokal saat ini. Ini adalah praktik yang baik untuk menjaga agar resource spesifik budaya dipisahkan dari bagian aplikasi lainnya. Android me-resolve resource spesifik bahasa dan budaya berdasarkan setelan lokal sistem. Anda dapat memberikan dukungan untuk berbagai lokal menggunakan direktori resource dalam project Android.

Anda dapat menentukan resource yang disesuaikan dengan budaya pengguna aplikasi Anda dan menyediakan jenis resource apa pun yang sesuai dengan bahasa dan budaya pengguna Anda. Misalnya, screenshot berikut menunjukkan aplikasi yang menampilkan string dan resource drawable dalam lokal (en_US) default perangkat dan lokal bahasa Spanyol (es_ES).

Aplikasi menampilkan
teks dan ikon yang berbeda menurut lokal saat ini

Gambar 1. Aplikasi menggunakan resource yang berbeda menurut lokal saat ini

Jika Anda membuat project menggunakan Android SDK Tools (bacalah Membuat Project Android), alat tersebut akan membuat direktori res/ pada level teratas project. Dalam direktori res/ ini, terdapat subdirektori dari berbagai jenis resource. Ada juga beberapa file default seperti res/values/strings.xml, yang menyimpan nilai string Anda.

Mendukung berbagai bahasa akan lebih bermanfaat daripada sekadar menggunakan resource spesifik lokal. Beberapa pengguna memilih bahasa yang menggunakan skrip kanan-ke-kiri (RTL) untuk lokal UI mereka, seperti bahasa Arab atau Ibrani. Pengguna lain melihat atau membuat konten dalam bahasa yang menggunakan skrip RTL, meskipun telah menetapkan bahasa yang menggunakan skrip LTR, seperti bahasa Inggris, sebagai bahasa lokal UI mereka. Untuk mendukung kedua jenis pengguna, aplikasi Anda perlu melakukan hal berikut:

  • Menggunakan tata letak UI RTL untuk lokal RTL.
  • Mendeteksi dan mendeklarasikan arah data teks yang ditampilkan dalam pesan yang diformat. Biasanya, Anda cukup memanggil sebuah metode yang akan menentukan arah data teks untuk Anda.

Membuat file resource dan direktori lokal

Guna menambahkan dukungan untuk lebih banyak lokal, buat direktori tambahan di dalam res/. Setiap nama direktori harus mengikuti format berikut:

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

Misalnya, values-b+es/ berisi resource string untuk lokal yang memiliki kode bahasa es. Demikian pula, mipmap-b+es+ES/ berisi ikon untuk lokal yang memiliki kode bahasa es dan kode negara ES. Android memuat resource yang sesuai menurut setelan lokal perangkat pada saat digunakan. Untuk informasi selengkapnya, lihat Menyediakan Resource Alternatif.

Setelah memutuskan lokal yang akan didukung, buat file dan subdirektori resource. Contoh:

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

Contohnya, berikut adalah beberapa file resource untuk bahasa yang berbeda:

String bahasa Inggris (lokal default), /values/strings.xml:

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

String bahasa Spanyol (lokal es), /values-es/strings.xml:

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

Ikon bendera Amerika Serikat (lokal default), /mipmap/country_flag.png:

Ikon bendera
Amerika Serikat

Gambar 2. Ikon yang digunakan untuk lokal default (en_US)

Ikon bendera Spanyol (lokal es_ES), /mipmap-b+es+ES/country_flag.png:

Ikon bendera
Spanyol

Gambar 3. Ikon yang digunakan untuk lokal es_ES

Catatan: Anda dapat menggunakan penentu lokal (atau penentu konfigurasi apa pun) pada setiap jenis resource, seperti jika Anda ingin menyediakan versi resource drawable bitmap yang dilokalkan. Untuk informasi selengkapnya, lihat Pelokalan.

Menggunakan resource dalam aplikasi

Anda dapat merujuk resource dalam kode sumber Anda dan file XML lainnya menggunakan atribut name dari setiap resource.

Di kode sumber, Anda dapat merujuk ke resource menggunakan sintaks R.<resource type>.<resource name>. Ada berbagai metode yang menerima resource dengan cara ini.

Contoh:

Kotlin

// Get a string resource from your app's Resources
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 from your app's Resources
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);

Pada file XML lainnya, Anda dapat merujuk ke resource dengan sintaks @<resource type>/<resource name> setiap kali atribut XML menerima nilai yang kompatibel.

Contoh:

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

Penting: Untuk memastikan bahwa setelan bahasa pengguna diprioritaskan dengan benar, tentukan bahasa yang didukung aplikasi Anda menggunakan properti resConfigs. Untuk informasi selengkapnya, lihat Menentukan bahasa yang didukung aplikasi.

Memformat teks dalam pesan

Salah satu tugas paling umum dalam aplikasi adalah memformat teks. Pesan yang dilokalkan diformat dengan memasukkan data teks dan numerik ke posisi yang sesuai. Sayangnya, ketika menangani UI RTL atau data RTL, pemformatan sederhana bisa menampilkan output teks yang salah atau bahkan tidak bisa dibaca.

Bahasa seperti Arab, Ibrani, Persia, dan Urdu ditulis dalam arah RTL secara keseluruhan. Namun, beberapa elemennya, seperti angka dan teks LTR yang tersemat, ditulis dalam arah LTR di dalam teks RTL yang sebaliknya. Bahasa yang menggunakan skrip LTR, termasuk bahasa Inggris, juga bersifat dua arah karena bisa memuat skrip RTL tersemat yang perlu ditampilkan dalam arah RTL.

Biasanya, aplikasi itu sendiri yang menghasilkan instance dari teks yang berlawanan arah yang disematkan. Aplikasi menyisipkan data teks dari bahasa yang berubah-ubah, serta arah teks yang berubah-ubah, ke dalam pesan yang dilokalkan. Pencampuran arah ini sering kali tidak menyertakan indikasi yang jelas tentang tempat teks arah berlawanan dimulai dan berakhir. Karakteristik teks yang dihasilkan aplikasi ini sering menjadi penyebab munculnya masalah.

Meskipun penanganan default sistem teks dua arah biasanya membuat teks seperti yang diharapkan, namun ada kemungkinan teks tidak merender dengan benar ketika aplikasi Anda memasukkannya ke dalam pesan lokal. Situasi berikut ini menampilkan contoh kasus ketika teks tersebut kemungkinan tidak muncul dengan benar:

  • Dimasukkan pada bagian paling awal pesan:

    PERSON_NAME menghubungi Anda

  • Mulai dengan nomor, seperti alamat atau nomor telepon:

    987 654-3210

  • Dimulai dengan tanda baca, seperti dalam nomor telepon:

    +19876543210

  • Berakhiran dengan tanda baca:

    Yakin?

  • Sudah memuat kedua arah:

    Kata בננה dalam bahasa Ibrani berarti pisang.

Contoh

Misalnya, anggaplah suatu aplikasi terkadang perlu menampilkan pesan "Apakah maksud Anda %s?", dengan alamat yang disisipkan menggantikan %s pada saat aplikasi tersebut berjalan. Karena aplikasi mendukung berbagai lokal UI, pesan tersebut masuk dari resource spesifik lokal dan menggunakan arah RTL ketika lokal RTL sedang digunakan. Untuk UI bahasa Ibrani, tampilannya seharusnya akan seperti ini:

האם התכוונת ל %s?

Namun, saran yang diberikan mungkin berasal dari database yang tidak menyertakan teks dalam bahasa lokal tersebut. Misalnya, jika alamat yang dimaksud adalah sebuah tempat di California, alamat akan muncul dalam database menggunakan teks bahasa Inggris. Jika Anda menyisipkan alamat "15 Bay Street, Laurel, CA" ke dalam pesan RTL tersebut tanpa memberikan petunjuk terkait arah teks, hasilnya akan menjadi tidak terduga atau tidak benar:

האם התכוונת ל 15 Bay Street, Laurel, CA?

Perlu diketahui bahwa nomor rumah muncul di sebelah kanan alamat, bukan di sebelah kiri seperti yang dimaksud, dan nomor rumah tersebut tampak lebih mirip dengan kode pos yang aneh. Masalah yang sama bisa terjadi jika Anda menyertakan teks RTL dalam pesan yang menggunakan arah teks LTR.

Penjelasan dan solusinya

Masalah dalam contoh sebelumnya terjadi karena pemformat teks tidak menentukan bahwa "15" adalah bagian dari alamat sehingga sistem tidak bisa menentukan apakah "15" merupakan bagian dari teks RTL yang muncul sebelumnya atau teks LTR yang muncul setelahnya.

Untuk mengatasi masalah ini, gunakan metode unicodeWrap() yang dapat ditemukan dalam class BidiFormatter, pada setiap bagian teks yang Anda masukkan ke pesan yang dilokalkan. Ada beberapa situasi ketika Anda tidak boleh menggunakan unicodeWrap(), antara lain:

  • Teks akan disisipkan ke string yang bisa dibaca mesin, seperti URI atau kueri SQL.
  • Anda tahu bahwa potongan teks tersebut sudah dilengkapi dengan benar.

Metode unicodeWrap() mendeteksi arah string dan menggabungkannya ke dalam karakter pemformatan Unicode yang mendeklarasikan arah tersebut. Karena "15" sekarang muncul dalam teks yang dideklarasikan sebagai LTR, angka tersebut ditampilkan pada posisi yang benar:

האם התכוונת ל 15 Bay Street, Laurel, CA?

Cuplikan kode berikut menunjukkan cara menggunakan unicodeWrap():

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

Catatan: Jika aplikasi Anda menargetkan Android 4.3 (API level 18) atau yang lebih tinggi, gunakan versi BidiFormatter yang ada dalam Framework Android. Jika tidak, gunakan versi BidiFormatter yang ada dalam Support Library.

Memformat angka

Gunakan string format, bukan panggilan metode, untuk mengonversi angka menjadi string dalam logika aplikasi Anda:

Kotlin

var myIntAsString = "$myInt"

Java

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

Tindakan ini akan memformat angka sesuai lokal Anda, yang mungkin mencakup penggunaan rangkaian digit yang berbeda.

Saat menggunakan String.format() untuk membuat kueri SQL pada perangkat yang lokalnya memiliki angka sendiri, seperti Persia dan sebagian besar lokal Arab, masalah akan terjadi jika salah satu parameter kueri berupa angka. Hal ini dikarenakan angka menggunakan format angka lokal, dan angka ini tidak valid dalam SQL.

Untuk mempertahankan angka yang diformat ASCII dan agar kueri SQL tetap valid, Anda harus menggunakan versi overloaded dari String.format() yang menyertakan lokal sebagai parameter pertama. Argumen lokal harus Locale.US.

Mendukung pencerminan tata letak

Pengguna skrip RTL akan lebih menyukai antarmuka pengguna RTL yang menyertakan menu rata kanan, teks rata kanan, dan panah maju yang menghadap ke kiri.

Gambar 4 menunjukkan perbedaan antara versi layar LTR dalam aplikasi Setelan dan kebalikannya dalam RTL:

Area notifikasi diratakan ke kanan di dekat sudut kanan atas,
           tombol menu di panel aplikasi ada di dekat sudut kiri atas,
           konten di bagian utama layar diratakan ke kiri dan ditampilkan
           secara LTR, dan tombol kembali terletak di dekat sudut kiri bawah serta
           mengarah ke kiri. Area notifikasi diratakan ke kiri di dekat sudut kiri atas,
           tombol menu di panel aplikasi ada di dekat sudut kanan atas, konten
           di bagian utama layar diratakan ke kanan dan ditampilkan secara RTL, dan
           tombol kembali terletak di dekat sudut kanan bawah serta mengarah
           ke kanan.
Gambar 4. Varian LTR dan RTL layar

Saat menambahkan dukungan RTL ke aplikasi Anda, penting untuk selalu mengingat hal-hal berikut:

  • Pencerminan teks RTL hanya didukung dalam aplikasi ketika digunakan di perangkat yang menjalankan Android 4.2 (API level 17) atau lebih tinggi. Untuk mempelajari cara mendukung pencerminan teks di perangkat yang lebih lama, lihat Memberikan dukungan untuk aplikasi lama.
  • Untuk menguji apakah aplikasi mendukung arah teks RTL, uji menggunakan opsi developer dan undang pengguna skrip RTL untuk menggunakan aplikasi Anda.

Catatan: Untuk melihat pedoman desain tambahan terkait pencerminan tata letak, termasuk daftar elemen yang harus dan tidak boleh Anda cerminkan, lihat pedoman desain material Bidireksionalitas.

Untuk mencerminkan tata letak UI dalam aplikasi sehingga tampak sebagai RTL dalam lokal RTL, selesaikan langkah-langkah di bagian berikut ini.

Mengubah file build dan manifes

Ubah file build.gradle modul aplikasi dan file manifes aplikasi seperti berikut:

build.gradle (Module: app)

Groovy

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

Kotlin

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

AndroidManifest.xml

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

Catatan: Jika aplikasi Anda menargetkan Android 4.1.1 (API level 16) atau yang lebih rendah, atribut android:supportsRtl akan diabaikan, beserta nilai atribut start dan end yang muncul di file tata letak aplikasi Anda. Apabila ini terjadi, pencerminan tata letak RTL tidak terjadi secara otomatis dalam aplikasi.

Mengupdate resource yang ada

Konversikan left ke start dan right ke end, dalam setiap file resource tata letak yang sudah ada. Dengan begitu, Anda mengizinkan framework untuk menyelaraskan elemen UI aplikasi berdasarkan setelan bahasa pengguna.

Catatan: Sebelum memperbarui resource, pelajari cara memberikan dukungan untuk aplikasi lama, atau aplikasi yang menargetkan Android 4.1.1 (API level 16) dan yang lebih rendah.

Untuk menggunakan kemampuan penyelarasan RTL framework, ubah atribut dalam file tata letak yang ada dalam Tabel 1.

Tabel 1. Atribut yang akan digunakan jika aplikasi Anda mendukung beberapa arah teks

Atribut yang hanya mendukung LTR Atribut yang mendukung LTR dan RTL
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

Tabel 2 menunjukkan bagaimana sistem menangani atribut penyelarasan UI berdasarkan versi SDK target, apakah atribut left dan right sudah ditentukan, dan apakah atribut start dan end sudah ditentukan.

Tabel 2. Perilaku penyelarasan elemen UI berdasarkan versi SDK target dan atribut yang ditentukan

Menargetkan Android 4.2
(API level 17) atau yang lebih tinggi?
Kiri dan kanan ditentukan? Awal dan akhir ditentukan? Hasil
Ya Ya Ya start dan end di-resolve, dan menggantikan left dan right
Ya Ya Tidak Hanya left dan right yang digunakan
Ya Tidak Ya Hanya start dan end yang digunakan
Tidak Ya Ya left dan right yang digunakan (start dan end diabaikan)
Tidak Ya Tidak Hanya left dan right yang digunakan
Tidak Tidak Ya start dan end di-resolve menjadi left dan right

Menambahkan resource khusus arah dan bahasa

Langkah ini melibatkan penambahan versi spesifik tata letak, drawable, dan file resource nilai yang berisi nilai kustom untuk berbagai bahasa dan arah teks.

In Android 4.2 (API level 17) dan lebih tinggi, Anda dapat menggunakan penentu resource -ldrtl (arah tata letak kanan ke kiri) dan -ldltr (arah tata letak kiri ke kanan). Untuk mempertahankan kompatibilitas mundur dengan pemuatan resource yang ada, versi lama Android menggunakan penentu bahasa resource untuk menyimpulkan arah teks yang benar.

Anggaplah Anda ingin menambahkan file tata letak spesifik untuk mendukung skrip RTL, seperti bahasa Ibrani, Arab, dan Persia. Caranya, tambahkan direktori layout-ldrtl/ pada direktori res/ Anda, seperti yang ditunjukkan pada contoh berikut:

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.

Jika ingin menambahkan versi tata letak spesifik yang didesain hanya untuk teks bahasa Arab, struktur direktori Anda akan menjadi seperti berikut:

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.

Catatan: Resource spesifik bahasa lebih diutamakan daripada resource spesifik arah tata letak, yang lebih diutamakan daripada resource default.

Menggunakan widget yang didukung

Sejak Android 4.2 (API level 17), hampir semua elemen UI framework mendukung arah teks RTL secara otomatis. Namun, beberapa elemen framework seperti ViewPager tidak mendukung arah teks RTL.

Widget layar utama mendukung arah teks RTL selama file manifes miliknya yang terkait menyertakan penerapan atribut android:supportsRtl="true".

Memberikan dukungan untuk aplikasi lama

Jika aplikasi Anda menargetkan 4.1.1 (API level 16) atau yang lebih rendah, cantumkan juga atribut left dan right, selain start dan end.

Untuk memeriksa apakah tata letak Anda harus menggunakan arah teks RTL, gunakan logika berikut:

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

Catatan: Untuk menghindari masalah kompatibilitas, gunakan versi 23.0.1 atau yang lebih tinggi untuk Android SDK Build Tools.

Menguji menggunakan opsi developer

Di perangkat yang menjalankan Android 4.4 (API level 19) atau yang lebih tinggi, Anda dapat mengaktifkan Paksa arah tata letak RTL dalam opsi developer bawaan perangkat. Setelan ini memungkinkan Anda melihat teks yang menggunakan skrip LTR, seperti teks bahasa Inggris, dalam mode RTL.

Memperbarui logika aplikasi

Bagian ini menjelaskan tempat tertentu dalam logika aplikasi Anda yang harus diupdate saat menyesuaikan aplikasi untuk menangani beberapa arah teks.

Perubahan properti

Untuk menangani perubahan dalam properti terkait RTL apa pun, seperti arah tata letak, parameter tata letak, padding, arah teks, perataan teks, atau pemosisian drawable, Anda dapat menggunakan callback onRtlPropertiesChanged(). Callback ini memungkinkan Anda mendapatkan arah tata letak saat ini dan memperbarui objek View aktivitas setelahnya.

Penayangan

Jika Anda membuat widget UI yang tidak secara langsung menjadi bagian dari hierarki tampilan aktivitas, seperti dialog atau elemen UI yang mirip dengan toast, setel arah tata letak yang benar menurut konteksnya. Cuplikan kode berikut menunjukkan cara menyelesaikan proses ini:

Kotlin

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

Java

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

Beberapa metode class View memerlukan pertimbangan lainnya:

onMeasure()
Ukuran tampilan dapat bervariasi menurut arah teks.
onLayout()
Jika membuat implementasi tata letak sendiri, Anda harus memanggil super() dalam versi onLayout() dan menyesuaikan logika kustom agar mendukung skrip RTL.
onDraw()
Jika mengimplementasikan tampilan kustom atau menambahkan fungsionalitas lanjutan ke gambar, Anda harus mengupdate kode agar mendukung skrip RTL. Gunakan kode berikut ini untuk menentukan apakah widget Anda berada dalam mode RTL:

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

Drawable

Jika memiliki drawable yang perlu dicerminkan untuk tata letak RTL, selesaikan salah satu langkah ini berdasarkan versi Android yang berjalan di perangkat:

  • Pada perangkat yang menjalankan Android 4.3 (API level 18) dan yang lebih rendah, Anda perlu menambahkan file resource -ldrtl.
  • Pada Android 4.4 (API level 19) dan yang lebih tinggi, Anda dapat menggunakan android:autoMirrored="true" saat menentukan drawable, yang memungkinkan sistem menangani pencerminan tata letak RTL untuk Anda.

    Catatan: Atribut android:autoMirrored hanya berfungsi untuk drawable sederhana yang pencerminan bidireksionalnya hanyalah pencerminan grafis dari seluruh drawable. Jika drawable Anda berisi banyak elemen, atau jika pencerminan akan mengubah interpretasinya, Anda harus melakukan pencerminan sendiri. Kapan pun jika memungkinkan, tanyakan kepada pakar bidireksional untuk menentukan apakah resource yang dapat digambar milik Anda yang dicerminkan dapat diterima oleh pengguna.

Gravitasi

Jika kode aplikasi Anda menggunakan Gravity.LEFT atau Gravity.RIGHT, Anda perlu mengubah nilai ini ke Gravity.START dan Gravity.END.

Misalnya, jika menggunakan kode berikut ini:

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

...Anda harus mengubahnya menjadi seperti berikut:

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

Artinya, Anda bisa terus menggunakan kode saat ini yang menangani nilai rata kiri dan rata kanan meskipun menggunakan start dan end untuk nilai gravitasi.

Catatan: Saat menerapkan setelan gravitasi, gunakan versi muatan berlebih Gravity.apply() yang menyertakan argumen layoutDirection.

Margin dan padding

Untuk mendukung skrip RTL dalam aplikasi, ikuti praktik terbaik mengenai nilai margin dan padding ini:

Mendukung preferensi bahasa per aplikasi

Dalam banyak kasus, pengguna multibahasa menyetel bahasa sistemnya ke satu bahasa, seperti bahasa Inggris, tetapi mereka ingin memilih bahasa lain untuk aplikasi tertentu, seperti Belanda, China, atau Hindi. Untuk membantu aplikasi memberikan pengalaman yang lebih baik bagi pengguna ini, Android 13 memperkenalkan fitur berikut untuk aplikasi yang mendukung beberapa bahasa:

  • Setelan sistem: Lokasi terpusat tempat pengguna dapat memilih bahasa pilihan untuk setiap aplikasi.

    Aplikasi harus mendeklarasikan atribut android:localeConfig dalam manifes aplikasi untuk memberi tahu sistem bahwa aplikasi mendukung beberapa bahasa. Untuk mempelajari lebih lanjut, lihat petunjuk untuk membuat file resource dan mendeklarasikannya di file manifes aplikasi.

  • API tambahan: API publik ini, seperti metode setApplicationLocales() dan getApplicationLocales() di LocaleManager, memungkinkan aplikasi menyetel bahasa yang berbeda dari bahasa sistem saat runtime.

    Aplikasi yang menggunakan pemilih bahasa kustom dalam aplikasi harus menggunakan API ini untuk memastikan bahwa pengguna memiliki pengalaman pengguna yang konsisten, di mana pun mereka memilih preferensi bahasa mereka. API publik ini tidak hanya membantu Anda mengurangi jumlah kode boilerplate, tetapi juga mendukung APK terpisah dan Pencadangan Otomatis untuk Aplikasi guna menyimpan setelan bahasa pengguna tingkat aplikasi.

    Untuk kompatibilitas mundur dengan versi Android sebelumnya, API yang setara juga tersedia di AndroidX. Sebaiknya gunakan Appcompat 1.6.0-beta1 atau yang lebih baru.

    Untuk mempelajari lebih lanjut, lihat petunjuk untuk menerapkan API baru.

Lihat juga

Referensi tambahan

Untuk mempelajari cara mendukung perangkat lama lebih lanjut, lihat referensi berikut:

Postingan blog