2013-09-24 3 views
6

Comment puis-je implémenter la commutation de langue sans avoir à définir manuellement les paramètres régionaux dans une application Android? Je sais que l'application chargera le fichier strings.xml en fonction des paramètres régionaux lors du démarrage, mais je ne souhaite pas que ce choix soit effectué en fonction des paramètres régionaux du système, mais qu'il soit spécifié par l'utilisateur dans les paramètres.Changement de langue dans l'application android

Ou, les paramètres régionaux sont-ils correctement définis?

+0

Pouvez-vous être plus clair s'il vous plaît? Vous souhaitez que la langue change en fonction des paramètres de l'application plutôt que des paramètres régionaux de l'appareil? –

+0

Oui, je souhaite que la langue de l'application change en fonction des paramètres de l'application. –

Répondre

18

Vous pouvez étendre la classe Application (vous devez également la déclarer dans le manifeste) et y mettre quelque chose comme ça.

Chaque fois que vous voulez changer la langue que vous pouvez appeler

((App)getApplicationContext()).changeLang(lang); 

à partir de votre activité. R.string.locale_lang est juste une clé qui est stockée dans strings.xml des préférences partagées

public class App extends Application { 

    private Locale locale = null; 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     if (locale != null) { 
      Locale.setDefault(locale); 
      Configuration config = new Configuration(newConfig); 
      config.locale = locale; 
      getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); 
     } 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); 
     String lang = settings.getString(getString(R.string.locale_lang), ""); 
     changeLang(lang); 
    } 

    public void changeLang(String lang) { 
     Configuration config = getBaseContext().getResources().getConfiguration(); 
     if (!"".equals(lang) && !config.locale.getLanguage().equals(lang)) { 

      Editor ed = PreferenceManager.getDefaultSharedPreferences(this).edit(); 
      ed.putString(getString(R.string.locale_lang), lang); 
      ed.commit(); 

      locale = new Locale(lang); 
      Locale.setDefault(locale); 
      Configuration conf = new Configuration(config); 
      conf.locale = locale; 
      getBaseContext().getResources().updateConfiguration(conf, getBaseContext().getResources().getDisplayMetrics()); 
     } 
    } 

    public String getLang(){ 
     return PreferenceManager.getDefaultSharedPreferences(this).getString(this.getString(R.string.locale_lang), ""); 
    } 



} 
+0

Merci. J'ai l'idée. Mais, comment puis-je le déclarer dans le manifeste? pas comme activité je suppose. –

+1

non pas comme une activité mais vous avez une étiquette d'application qui contient des étiquettes d'activité. Comme un attribut à l'application, vous devez ajouter android: name = ". App" – kjurkovic

Questions connexes