Apakah mungkin untuk mengubah bahasa aplikasi secara terprogram saat masih menggunakan sumber daya Android?
Jika tidak, apakah mungkin untuk meminta sumber daya dalam bahasa tertentu?
Saya ingin membiarkan pengguna mengubah bahasa aplikasi dari aplikasi.
android
localization
resources
hpique
sumber
sumber
Jawaban:
Itu mungkin. Anda dapat mengatur lokal. Namun, saya tidak akan merekomendasikan itu. Kami sudah mencobanya pada tahap awal, pada dasarnya melawan sistem.
Kami memiliki persyaratan yang sama untuk mengubah bahasa tetapi memutuskan untuk menyetujui fakta bahwa UI harus sama dengan UI ponsel. Itu bekerja melalui pengaturan lokal tetapi terlalu buggy. Dan Anda harus mengaturnya setiap kali Anda memasukkan aktivitas (setiap aktivitas) dari pengalaman saya. di sini adalah kode jika Anda masih membutuhkan ini (sekali lagi, saya tidak merekomendasikan itu)
Jika Anda memiliki konten khusus bahasa - Anda dapat mengubah dasar itu pada pengaturan.
pembaruan pada 26 Maret 2020
sumber
Context.createConfigurationContext()
, yang dapat digunakan untuk membungkus konteks default dengan konfigurasi khusus lokal dan kemudian memanggilnyagetResources
tanpa harus memperbarui konfigurasi pada objek sumber daya itu sendiri.conf.setLayoutDirection(locale)
, Anda dapat menggantinyaconf.locale = new Locale(...))
denganconf.setLocale(new Locale(...))
. Secara internal akan memanggilsetLayoutDirection
.Kode ini benar-benar berfungsi:
Masukkan kode bahasa Anda dalam
languageToLoad
variabel:sumber
Resources.updateConfiguration
metode ini. Saya telah membuat indentasi kode untuk membuatnya lebih jelas.Saya mencari cara untuk mengubah bahasa sistem secara terprogram. Sementara saya sepenuhnya memahami bahwa aplikasi normal seharusnya tidak pernah melakukan itu dan sebaliknya:
ada kebutuhan untuk benar-benar mengubah bahasa sistem secara terprogram.
Ini adalah API tidak berdokumen dan karenanya tidak boleh digunakan untuk aplikasi pasar / pengguna akhir!
Pokoknya inilah solusi yang saya temukan:
sumber
android.permission.CHANGE_CONFIGURATION
hanya dapat diberikan oleh aplikasi yang ditandatangani dengan melakukan key.Jika Anda ingin mempertahankan bahasa yang diubah pada semua aplikasi Anda, Anda harus melakukan dua hal.
Pertama, buat Aktivitas dasar dan buat semua aktivitas Anda diperluas dari ini:
Perhatikan bahwa saya menyimpan bahasa baru dalam Preferensi yang dibagikan.
Kedua, buat ekstensi Aplikasi seperti ini:
Perhatikan bahwa getLocale () sama seperti di atas.
Itu saja! Saya harap ini bisa membantu seseorang.
sumber
Application
itu dan bagaimana menggunakannya. mobomo.com/2011/05/05/how-to-use-application-object-of-androidconfiguration.locate
sudah ditinggalkan, setLocale membutuhkan API 17+ dan updateConfiguration sudah ditinggalkanMenurut artikel ini . Anda perlu mengunduh
LocaleHelper.java
referensi di artikel itu.MyApplication
kelas yang akan diperluasApplication
attachBaseContext()
untuk memperbarui bahasa.Daftarkan kelas ini dalam manifes.
Buat
BaseActivity
dan gantionAttach()
untuk memperbarui bahasa. Dibutuhkan untuk Android 6+Buat semua aktivitas di aplikasi Anda diperluas dari
BaseActivity
.sumber
Hanya menambahkan bagian ekstra yang membuatku tersandung.
Sementara jawaban lain berfungsi dengan baik dengan "de" misalnya
Di atas tidak akan berfungsi dengan misalnya
"fr_BE"
lokal sehingga akan menggunakanvalues-fr-rBE
folder atau serupa.Membutuhkan sedikit perubahan berikut untuk bekerja dengannya
"fr_BE"
sumber
activity.recreate()
android.content.res.Configuration conf = res.getConfiguration();
alih-alih membuatConfiguration
contoh baru ? Apakah ada manfaat menggunakan yang baru?Saya diubah untuk bahasa Jerman untuk memulai aplikasi saya sendiri.
Ini kode saya yang benar. Siapa pun yang ingin menggunakan ini sama untuk saya .. (Bagaimana mengubah bahasa di android secara terprogram)
kode saya:
sumber
Saya tahu sudah terlambat untuk menjawab tetapi saya menemukan artikel ini di sini . Yang menjelaskan seluruh proses dengan sangat baik dan memberi Anda kode terstruktur dengan baik.
Kelas Pembantu Lokal:
Anda perlu mengganti attachBaseContext dan memanggil LocaleHelper.onAttach () untuk menginisialisasi pengaturan lokal di aplikasi Anda.
Yang harus Anda lakukan adalah menambahkan
dimanapun Anda ingin mengubah lokal.
sumber
createConfigurationContext
, itu sangat membantuBuat kelas Perluas
Application
dan buat metode statis. Kemudian Anda dapat memanggil metode ini di semua aktivitas sebelumnyasetContentView()
.Penggunaan dalam aktivitas:
sumber
Untuk Android 7.0 Nougat (dan lebih rendah) ikuti artikel ini:
Ubah Bahasa Secara Programatis di Android
Jawaban lama
Ini termasuk dukungan RTL / LTR:
sumber
Satu-satunya solusi yang sepenuhnya berfungsi untuk saya adalah kombinasi kode Alex Volovoy dengan mekanisme restart aplikasi:
sumber
activity.recreate()
Saya menghadapi masalah yang sama. Di GitHub saya menemukan perpustakaan Android-LocalizationActivity .
Pustaka ini membuatnya sangat mudah untuk mengubah bahasa aplikasi Anda saat runtime, seperti yang Anda lihat dalam contoh kode di bawah ini. Proyek sampel termasuk kode sampel di bawah ini dan informasi lebih lanjut dapat ditemukan di halaman github.
LocalizationActivity memperluas AppCompatActivity, jadi Anda juga dapat menggunakannya saat Anda menggunakan Fragmen.
sumber
Waktu untuk pembaruan yang seharusnya.
Pertama, daftar yang sudah tidak digunakan lagi dengan API yang sudah tidak digunakan lagi:
configuration.locale
(API 17)updateConfiguration(configuration, displaymetrics)
(API 17)Hal yang tidak dijawab oleh pertanyaan baru-baru ini adalah penggunaan metode baru .
createConfigurationContext adalah metode baru untuk memperbaruiConfiguration.
Beberapa telah menggunakannya sendiri seperti ini:
... tapi itu tidak berhasil. Mengapa? Metode mengembalikan konteks, yang kemudian digunakan untuk menangani terjemahan Strings.xml dan sumber daya lokal lainnya (gambar, tata letak, apa pun).
Penggunaan yang tepat seperti ini:
Jika Anda hanya menyalin-menempelkannya ke IDE Anda, Anda mungkin melihat peringatan bahwa API mengharuskan Anda menargetkan API 17 atau lebih tinggi. Ini bisa diselesaikan dengan memasukkannya ke dalam metode dan menambahkan anotasi
@TargetApi(17)
Tapi tunggu. Bagaimana dengan API yang lebih lama?
Anda perlu membuat metode lain menggunakan updateConfiguration tanpa anotasi TargetApi.
Anda tidak perlu mengembalikan konteks di sini.
Sekarang, mengelola ini bisa sulit. Di API 17+ Anda memerlukan konteks yang dibuat (atau sumber daya dari konteks yang dibuat) untuk mendapatkan sumber daya yang sesuai berdasarkan lokalisasi. bagaimana kamu menangani ini?
Nah, inilah cara saya melakukannya:
Kode ini berfungsi dengan memiliki satu metode yang membuat panggilan ke metode yang sesuai berdasarkan API apa. Ini adalah sesuatu yang telah saya lakukan dengan banyak panggilan usang yang berbeda (termasuk Html.fromHtml). Anda memiliki satu metode yang memperhitungkan argumen yang diperlukan, yang kemudian membaginya menjadi salah satu dari dua (atau tiga atau lebih) metode dan mengembalikan hasil yang sesuai berdasarkan tingkat API. Ini fleksibel karena Anda tidak perlu memeriksa beberapa kali, metode "entri" melakukannya untuk Anda. Metode entri di sini adalah
setLanguage
HARAP BACA INI SEBELUM MENGGUNAKANNYA
Anda perlu menggunakan Konteks yang dikembalikan saat Anda mendapatkan sumber daya. Mengapa? Saya telah melihat jawaban lain di sini yang menggunakan createConfigurationContext dan tidak menggunakan konteks yang dikembalikan. Untuk membuatnya berfungsi seperti itu, updateConfiguration harus dipanggil. Yang sudah usang. Gunakan konteks yang dikembalikan oleh metode untuk mendapatkan sumber daya.
Contoh penggunaan :
Konstruktor atau sejenisnya:
Dan kemudian, di mana pun Anda ingin mendapatkan sumber daya yang Anda lakukan:
Menggunakan konteks lain akan (secara teori) mematahkan ini.
AFAIK Anda masih harus menggunakan konteks aktivitas untuk menampilkan dialog atau bersulang. untuk itu Anda dapat menggunakan contoh aktivitas (jika Anda berada di luar)
Dan akhirnya, gunakan
recreate()
pada aktivitas untuk menyegarkan konten. Jalan pintas untuk tidak harus membuat maksud untuk menyegarkan.sumber
Jika kamu menulis
Dalam setiap aktivitas (dalam file manifes) maka tidak perlu mengaturnya setiap kali Anda masuk
Activity
.sumber
configChanges
digunakan untuk peretasan untuk mempertahankan status Aktivitas pada rotasi / dll.Pembaruan penting:
Perhatikan, bahwa pada SDK> = 21, Anda perlu menelepon 'Resources.updateConfiguration ()' , jika tidak, sumber daya tidak akan diperbarui.
sumber
Context ctx = createConfigurationContext(args);
dan dapatkan sumber daya dari itusumber
activity.recreate()
Locale
configuration
harus diatur di masing-masingactivity
sebelum mengatur konten -this.setContentView(R.layout.main);
sumber
activity.recreate()
Mula-mula buat multi string.xml untuk berbagai bahasa; lalu gunakan blok kode ini dalam
onCreate()
metode:sumber
Berikut ini beberapa kode yang berfungsi untuk saya:
Sumber: di sini
sumber
Tidak ada solusi yang tercantum di sini yang membantu saya.
Bahasa tidak mengaktifkan Android> = 7.0 jika AppCompatDelegate.setDefaultNightMode (AppCompatDelegate.MODE_NIGHT_YES)
LocaleUtils ini berfungsi dengan baik: https://gist.github.com/GigigoGreenLabs/7d555c762ba2d3a810fe
Bahasa Lokal
Menambahkan kode ini ke Aplikasi
Kode dalam Aktivitas
sumber
Jawaban Alex Volovoy hanya berfungsi untuk saya jika menggunakan metode aktivitas onCreate.
Jawaban yang bekerja di semua metode ada di utas lain
Ubah bahasa secara terprogram di Android
Berikut ini adalah adaptasi dari kode tersebut
Semoga itu bisa membantu.
sumber
Perhatikan bahwa penggunaan solusi
updateConfiguration
ini tidak akan berfungsi lagi dengan rilis Android M yang akan datang dalam beberapa minggu. Cara baru untuk melakukan ini sekarang menggunakanapplyOverrideConfiguration
metode dariContextThemeWrapper
lihat API docAnda dapat menemukan solusi lengkap saya di sini karena saya sendiri yang menghadapi masalah: https://stackoverflow.com/a/31787201/2776572
sumber
Ada beberapa langkah yang harus Anda terapkan
Pertama, Anda perlu mengubah lokal konfigurasi Anda
Kedua, jika Anda ingin perubahan Anda diterapkan secara langsung ke tata letak yang terlihat, Anda dapat memperbarui pandangan secara langsung atau Anda bisa memanggil activity.recreate () untuk memulai kembali aktivitas saat ini.
Dan juga Anda harus bertahan perubahan Anda karena setelah pengguna menutup aplikasi Anda maka Anda akan kehilangan perubahan bahasa.
Saya menjelaskan solusi yang lebih terperinci pada posting blog saya Change Language Programmatically in Android
Pada dasarnya, Anda cukup memanggil LocaleHelper.onCreate () pada kelas aplikasi Anda dan jika Anda ingin mengubah lokal dengan cepat, Anda dapat menghubungi LocaleHelper.setLocale ()
sumber
Ini berfungsi ketika saya menekan tombol untuk mengubah bahasa teks dari TextView saya. (Strings.xml dalam folder values-de)
sumber
Tambahkan kelas LocaleHelper
Dalam Aktivitas atau Fragmen
Sekarang SetText pada setiap teks
sumber
mirip dengan yang diterima tetapi versi 2017 dan ditambahkan restart (tanpa memulai ulang, kadang-kadang Aktivitas berikutnya masih menerjemahkan bahasa Inggris):
sumber
activity.recreate()
3) konteks kembali saya pikir harus digunakan untuk mendapatkan sumber dayaPertama Anda membuat nilai nama direktori- "Nama bahasa" seperti hindi daripada menulis "hai" dan menyalin nama file string yang sama di direktori ini dan mengubah nilai tidak mengubah parameter setelah menetapkan kode di bawah ini dalam tindakan Anda seperti tombol dll ...
sumber
conf.locale
sudah tidak digunakan lagisumber
Sebagai contoh, kami mengatur bahasa Inggris:
Tolong, ingat ini hanya berfungsi jika bahasa ditemukan dalam sistem Perangkat juga, tidak hanya dalam aplikasi
sumber
Untuk dukungan bahasa Arab / RTL
sumber