Pertanyaan Bagaimana cara mengubah bahasa aplikasi saat pengguna memilih bahasa?


Saya ingin aplikasi saya mendukung tiga bahasa Spanyol, Portugis & Inggris. Dan berikan opsi untuk memilih bahasa di aplikasi. Saya telah membuat

1) 3 drawable folder drawable-es, drawable-pt, drawable.

2) 3 nilai folder nilai-es, nilai-pt, nilai-nilai. Ubah nilai String.xml sesuai bahasa.

Saya memiliki imageView untuk memilih bahasa. Saat klik menu itu terbuka yang terdiri dari pilihan bahasa Inggris, Spanyol, Portugis.

Saya mengatur aplikasi Lokal dalam pilihan opsi oleh kode ini

public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.en:
             Locale locale = new Locale("en"); 
             Locale.setDefault(locale);
             Configuration config = new Configuration();
             config.locale = locale;
             getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
             Toast.makeText(this, "Locale in English !", Toast.LENGTH_LONG).show();
             break;

        case R.id.pt:
             Locale locale2 = new Locale("pt"); 
             Locale.setDefault(locale2);
             Configuration config2 = new Configuration();
             config2.locale = locale2;
             getBaseContext().getResources().updateConfiguration(config2, getBaseContext().getResources().getDisplayMetrics());

             Toast.makeText(this, "Locale in Portugal !", Toast.LENGTH_LONG).show();
             break;

        case R.id.es:
             Locale locale3 = new Locale("es"); 
             Locale.setDefault(locale3);
             Configuration config3 = new Configuration();
             config3.locale = locale3;
             getBaseContext().getResources().updateConfiguration(config3, getBaseContext().getResources().getDisplayMetrics());

             Toast.makeText(this, "Locale in Spain !", Toast.LENGTH_LONG).show();
             break;


    }
         return super.onOptionsItemSelected(item);
}

Saya telah menyatakan dalam Manifest- android: configChanges = "locale"

Ia bekerja tetapi memiliki beberapa masalah.

Masalah:-

1) Ketika bahasa dipilih, layar yang terdiri dari gambar pemilihan bahasa tidak berubah tetapi layar lainnya berubah.

2) Setelah orientasi mengubah bahasa pemulihan aplikasi sesuai dengan lokasi telepon.


75
2017-10-16 05:46


asal


Jawaban:


Ini adalah kutipan untuk halaman web: http://android.programmerguru.com/android-localization-at-runtime/

Sangat mudah untuk mengubah bahasa aplikasi Anda setelah pengguna memilihnya dari daftar bahasa. Memiliki metode seperti di bawah ini yang menerima lokal sebagai String (seperti 'en' untuk bahasa Inggris, 'hi' untuk hindi), konfigurasikan lokal untuk Aplikasi Anda dan segarkan aktivitas Anda saat ini untuk mencerminkan perubahan dalam bahasa. Lokal yang Anda terapkan tidak akan diubah sampai Anda mengubahnya secara manual lagi.

public void setLocale(String lang) { 
    Locale myLocale = new Locale(lang); 
    Resources res = getResources(); 
    DisplayMetrics dm = res.getDisplayMetrics(); 
    Configuration conf = res.getConfiguration(); 
    conf.locale = myLocale; 
    res.updateConfiguration(conf, dm); 
    Intent refresh = new Intent(this, AndroidLocalize.class); 
    startActivity(refresh); 
    finish();
} 

Pastikan Anda mengimpor paket berikut:

import java.util.Locale; 
import android.os.Bundle; 
import android.app.Activity; 
import android.content.Intent; 
import android.content.res.Configuration; 
import android.content.res.Resources; 
import android.util.DisplayMetrics; 

tambahkan dalam manifes ke aktivitas android: configChanges = "locale | orientation"


134
2017-10-18 11:55



Anda juga harus menghapus android:configChanges="locale" dari manifes, yang akan menyebabkan aktivitas dimuat ulang, atau diganti onConfigurationChanged metode:

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
    // your code here, you can use newConfig.locale if you need to check the language
    // or just re-set all the labels to desired string resource
}

5
2017-10-29 21:08



Solusi bagus dijelaskan dengan cukup baik di sini. Tapi ini satu lagi.

Buat milik Anda sendiri CustomContextWrapper kelas diperluas ContextWrapper dan gunakan untuk mengubah pengaturan Lokal untuk aplikasi lengkap. Berikut ini adalah GIST dengan penggunaan.

Dan kemudian panggil CustomContextWrapper dengan identifier lokal yang tersimpan mis. 'hi' untuk bahasa Hindi dalam metode siklus hidup aktivitas attachBaseContext. Penggunaan di sini:

@Override
protected void attachBaseContext(Context newBase) {
//fetch from shared preference also save to the same when applying. default here is en = English
    String language = MyPreferenceUtil.getInstance().getString("saved_locale", "en");
    super.attachBaseContext(SnapContextWrapper.wrap(newBase, language));
}

1
2017-09-03 15:01



Kode contoh Udhay bekerja dengan baik. Kecuali pertanyaan Sofiane Hassaini dan Chirag SolankI, untuk masuk kembali, itu tidak berhasil. Saya mencoba memanggil kode Udhay tanpa memulai kembali aktivitas di onCreate (), sebelum super.onCreate (savedInstanceState) ;. Maka itu OK!   Hanya sedikit masalah, senar menu masih belum berubah ke set Lokal.

    public void setLocale(String lang) { //call this in onCreate()
     Locale myLocale = new Locale(lang); 
     Resources res = getResources(); 
     DisplayMetrics dm = res.getDisplayMetrics(); 
     Configuration conf = res.getConfiguration(); 
     conf.locale = myLocale; 
     res.updateConfiguration(conf, dm); 
     //Intent refresh = new Intent(this, AndroidLocalize.class); 
     //startActivity(refresh); 
     //finish();
} 

1
2017-09-28 19:58