Question Comment changer la langue de l'application lorsque l'utilisateur sélectionne la langue?


Je veux que mon application prenne en charge trois langues: espagnol, portugais et anglais. Et donner la possibilité de sélectionner la langue dans app.J'ai fait

1) 3 dossiers à dessiner dessinables-es, tirables-pt, dessinables.

2) 3 valeurs du dossier de valeurs-es, values-pt, values.Change Valeurs String.xml en fonction des langues.

J'ai clickView pour sélectionner la langue. Lorsque vous cliquez dessus, le menu est ouvert et comprend l'option Anglais, Espagnol, Portugais.

Je mets en place les paramètres régionaux dans l'application sur la sélection des options par ce code

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

J'ai déclaré dans le manifeste- android: configChanges = "locale"

Cela fonctionne mais cela pose problème.

Problème:-

1) Lorsque la langue est sélectionnée, l’écran consistant en une image de la sélection de la langue ne change pas, mais les autres écrans sont modifiés.

2) Après le changement d’orientation, l’application restaure la langue en fonction des paramètres régionaux du téléphone.


75
2017-10-16 05:46


origine


Réponses:


C'est un extrait pour la page Web: http://android.programmerguru.com/android-localization-at-runtime/

Il est simple de changer la langue de votre application lorsque l'utilisateur la sélectionne dans la liste des langues. Ayez une méthode comme celle ci-dessous qui accepte les paramètres régionaux sous forme de chaîne (comme "en" pour l'anglais, "salut" pour hindi), configurez les paramètres régionaux pour votre application et actualisez votre activité actuelle pour refléter le changement de langue. Les paramètres régionaux que vous avez appliqués ne seront pas modifiés tant que vous ne les aurez plus modifiés manuellement.

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

Assurez-vous d'avoir importé les paquets suivants:

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; 

ajouter un manifeste à l'activité android: configChanges = "locale | orientation"


134
2017-10-18 11:55



Vous devez soit supprimer android:configChanges="locale" à partir du manifeste, ce qui entraînera le rechargement de l’activité ou l’annulation onConfigurationChanged méthode:

@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



Les bonnes solutions sont bien expliquées ici. Mais voici un de plus.

Crée le tien CustomContextWrapper classe en extension ContextWrapper et l'utiliser pour modifier les paramètres régionaux pour l'application complète. Voici un GIST avec utilisation.

Et puis appelez le CustomContextWrapper avec l'identificateur de paramètres régionaux enregistré, par ex. 'hi' pour la langue hindi dans la méthode du cycle de vie de l'activité attachBaseContext. Utilisation ici:

@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



Le code exemple d'Udhay fonctionne bien. Sauf la question de Sofiane Hassaini et Chirag SolankI, pour la ré-entrée, ça ne marche pas. J'essaie d'appeler le code d'Udhay sans redémarrer l'activité dans onCreate (), avant super.onCreate (savedInstanceState) ;. Alors ça va!   Seul un petit problème, les chaînes de menu ne sont toujours pas modifiés à l'ensemble Locale.

    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