Aplikasi saya mendukung 3 (segera 4) bahasa. Karena beberapa lokal sangat mirip, saya ingin memberi pengguna opsi untuk mengubah lokal di aplikasi saya, misalnya orang Italia mungkin lebih suka bahasa Spanyol daripada bahasa Inggris.
Apakah ada cara bagi pengguna untuk memilih di antara lokal yang tersedia untuk aplikasi dan kemudian mengubah lokal apa yang digunakan? Saya tidak melihatnya sebagai masalah untuk menetapkan lokal untuk setiap Kegiatan karena itu adalah tugas sederhana untuk dilakukan di kelas dasar.
android
locale
user-defined
Roland
sumber
sumber
Jawaban:
Untuk orang yang masih mencari jawaban ini, karena
configuration.locale
sudah tidak digunakan lagi di API 24, Anda sekarang dapat menggunakan:Mempertimbangkan bahwa minSkdVersion untuk metode ini adalah API 17.
Kode contoh lengkap:
Jangan lupa bahwa, jika Anda mengubah lokal dengan Activity yang sedang berjalan, Anda harus memulai kembali agar perubahan tersebut berlaku.
EDIT 11 MEI 2018
Seperti dari pos @ CookieMonster, Anda mungkin memiliki masalah menjaga perubahan lokal di versi API yang lebih tinggi. Jika demikian, tambahkan kode berikut ke Aktivitas Dasar Anda sehingga Anda memperbarui lokal konteks pada setiap pembuatan Aktivitas:
Jika Anda menggunakan ini, jangan lupa untuk menyimpan bahasa ke SharedPreferences saat Anda mengatur lokal dengan
setLocate(locale)
EDIT 7 APRIL 2020
Anda mungkin mengalami masalah di Android 6 dan 7, dan ini terjadi karena masalah di pustaka androidx saat menangani mode malam. Untuk ini, Anda juga perlu mengganti
applyOverrideConfiguration
dalam aktivitas dasar Anda dan memperbarui lokal konfigurasi jika seandainya lokal baru yang baru dibuat.Kode sampel:
sumber
androidx.appcompat:appcompat:
versi dari1.0.2
ke1.1.0
tidak bekerja pada android 7, tetapi bekerja pada android 9.1.1.0
androidxappcompat:1.1.0
dapat diperbaiki denganappcompat:1.2.0-alpha02
dan kodeSet<Locale> set = new LinkedHashSet<>(); // bring the target locale to the front of the list set.add(locale); LocaleList all = LocaleList.getDefault(); for (int i = 0; i < all.size(); i++) { // append other locales supported by the user set.add(all.get(i)); } Locale[] locales = set.toArray(new Locale[0]); configuration.setLocales(new LocaleList(locales));
di dalam@TargetApi(Build.VERSION_CODES.N) updateResourcesLocale()
Semoga bantuan ini (di onResume):
sumber
Saya punya masalah dengan pengaturan lokal secara pemrograman dengan perangkat yang memiliki Android OS N dan lebih tinggi . Bagi saya solusinya adalah menulis kode ini dalam aktivitas dasar saya:
(jika Anda tidak memiliki aktivitas dasar maka Anda harus membuat perubahan ini di semua aktivitas Anda)
perhatikan bahwa ini tidak cukup untuk menelepon
Anda juga perlu mendapatkan konteks bahwa metode ini kembali dan kemudian mengatur konteks ini dalam
attachBaseContext
metode ini.sumber
updateBaseContextLocale
metode padaonCreate
aktivitas induk / basis Anda.Karena tidak ada jawaban yang lengkap untuk cara saat ini untuk menyelesaikan masalah ini, saya mencoba memberikan instruksi untuk solusi yang lengkap. Berikan komentar jika ada yang hilang atau bisa dilakukan dengan lebih baik.
Informasi Umum
Pertama, ada beberapa perpustakaan yang ingin menyelesaikan masalah tetapi mereka semua tampaknya sudah ketinggalan zaman atau kehilangan beberapa fitur:
Lebih lanjut saya pikir menulis perpustakaan mungkin bukan cara yang baik / mudah untuk memecahkan masalah ini karena tidak banyak yang harus dilakukan, dan apa yang harus dilakukan adalah mengubah kode yang ada daripada menggunakan sesuatu yang sepenuhnya dipisahkan. Karena itu saya menyusun instruksi berikut yang harus lengkap.
Solusi saya terutama didasarkan pada https://github.com/gunhansancar/ChangeLanguageExample (sebagaimana telah ditautkan oleh localhost ). Ini adalah kode terbaik yang saya temukan untuk orientasi. Beberapa komentar:
updateViews()
di setiap Aktivitas untuk memperbarui semua string secara manual setelah mengubah lokal (menggunakan yang biasagetString(id)
) yang tidak diperlukan dalam pendekatan yang ditunjukkan di bawah iniSaya mengubahnya sedikit, memisahkan bagian yang tetap ada lokal yang dipilih (karena orang mungkin ingin melakukannya secara terpisah, seperti yang disarankan di bawah).
Larutan
Solusinya terdiri dari dua langkah berikut:
Langkah 1: Ubah lokal
Gunakan kelas
LocaleHelper
, berdasarkan LocaleHelper gunhansancar :ListPreference
dalamPreferenceFragment
dengan bahasa yang tersedia (harus dipertahankan ketika bahasa harus ditambahkan kemudian)Buat
SettingsFragment
seperti berikut:Buat sumber daya yang
locales.xml
mencantumkan semua lokal dengan terjemahan yang tersedia dengan cara berikut ( daftar kode lokal ):Di Anda,
PreferenceScreen
Anda dapat menggunakan bagian berikut untuk membiarkan pengguna memilih bahasa yang tersedia:yang menggunakan string berikut dari
strings.xml
:Langkah 2: Buat aplikasi menggunakan lokal kustom
Sekarang atur setiap Aktivitas untuk menggunakan set lokal kustom. Cara termudah untuk mencapai ini adalah memiliki kelas dasar yang sama untuk semua kegiatan dengan kode berikut (di mana kode penting berada di
attachBaseContext(Context base)
danonResume()
):Apa yang dilakukannya adalah
attachBaseContext(Context base)
untuk menggunakan lokal yang sebelumnya bertahanLocaleHelper
Catatan tentang solusi ini
Menciptakan sebuah Aktivitas tidak memperbarui judul ActionBar (seperti yang telah diamati di sini: https://github.com/gunhansancar/ChangeLanguageExample/issues/1 ).
setTitle(R.string.mytitle)
dalamonCreate()
metode masing-masing kegiatan.Ini memungkinkan pengguna memilih lokal default sistem, serta lokal default aplikasi (yang dapat dinamai, dalam hal ini "Bahasa Inggris").
Hanya kode bahasa, tidak ada wilayah (negara) dan kode varian (seperti
fr-rCA
) yang didukung sejauh ini. Untuk mendukung spesifikasi lokal lengkap, parser yang mirip dengan yang ada di pustaka Android-Bahasa dapat digunakan (yang mendukung wilayah tetapi tidak ada kode varian).sumber
attachBaseContext(Context base)
danonResume()
ke kelas yang terpisah) dapat melakukan trik. Maka yang harus Anda lakukan adalah mendeklarasikan satu objek di setiap kelas dasar aktivitas dan mendelegasikan dua panggilan itu.Cukup gunakan metode pembantu ini untuk memaksa lokal tertentu.
UDPATE 22 Agustus 2017. Lebih baik gunakan pendekatan ini .
sumber
Tambahkan kelas pembantu dengan metode berikut:
Dan menyebutnya dalam aktivitas startup Anda, seperti
MainActivity.java
:sumber
sederhana dan mudah
di mana "en" adalah kode bahasa dan "AS" adalah kode negara.
sumber
conf.locale=locale;
sudah usang, dan jugaupdateConfiguration
.Berlaku untuk API16 hingga API28 Tempatkan metode ini di mana saja:
Masukkan kode ini di semua aktivitas Anda menggunakan:
atau panggil localeUpdateResources pada fragmen, adaptor, dll. di mana Anda memerlukan konteks baru.
Penghargaan: Yaroslav Berezanskyi
sumber
Ada cara yang super sederhana.
di BaseActivity, Activity, atau Fragment override attachBaseContext
perpanjangan
sumber
Saya menemukan
androidx.appcompat:appcompat:1.1.0
bug juga bisa diperbaiki hanya dengan menelepongetResources()
diapplyOverrideConfiguration()
sumber
sumber
Bagi mereka yang mencoba segalanya tetapi tidak berhasil . Harap periksa bahwa jika Anda mengatur
darkmode
denganAppCompatDelegate.setDefaultNightMode
dan sistem tidak gelap, makaConfiguration.setLocale
tidak akan berfungsi di atas Andorid 7.0 .Tambahkan kode ini di setiap aktivitas Anda untuk menyelesaikan masalah ini:
sumber
Masukkan kode ini ke dalam aktivitas Anda
sumber