562 votes

Changer la langue de l'application de manière programmatique dans Android

Est-il possible de changer la langue d'une application par programmation tout en utilisant les ressources d'Android ?

Sinon, est-il possible de demander une ressource dans une langue spécifique ?

Je voudrais que l'utilisateur puisse changer la langue de l'application à partir de l'application.

4 votes

Vous pouvez utiliser la bibliothèque suivante, qui fournit la liste des langues, la préférence pour votre écran de configuration et remplace la langue dans votre application : github.com/delight-im/Android-Languages

0 votes

@MarcoW. Savez-vous si Android-Languages fonctionne avec Android 5.0 Lollipop ?

1 votes

@neu242 Oui, il fonctionne sous Android 5.0 sans aucun problème.

453voto

Alex Volovoy Points 34562

C'est possible. Vous pouvez définir la locale. Cependant, je ne le recommande pas. Nous l'avons essayé à des stades précoces, cela revient à se battre contre le système.

Nous avons la même exigence de changer la langue mais nous avons décidé de nous contenter du fait que l'interface utilisateur doit être la même que celle du téléphone. Cela fonctionnait via le réglage de la locale mais c'était trop bogué. D'après mon expérience, vous devez le définir à chaque fois que vous entrez dans une activité (chaque activité). Voici un code si vous en avez encore besoin (encore une fois, je ne le recommande pas)

Resources res = context.getResources();
// Change locale settings in the app.
DisplayMetrics dm = res.getDisplayMetrics();
android.content.res.Configuration conf = res.getConfiguration();
conf.setLocale(new Locale(language_code.toLowerCase())); // API 17+ only.
// Use conf.locale = new Locale(...) if targeting lower versions
res.updateConfiguration(conf, dm);

Si vous avez un contenu spécifique à une langue, vous pouvez le modifier en fonction des paramètres.


mise à jour le 26 mars 2020

    public static void setLocale(Activity activity, String languageCode) {
        Locale locale = new Locale(languageCode);
        Locale.setDefault(locale);
        Resources resources = activity.getResources();
        Configuration config = resources.getConfiguration();
        config.setLocale(locale);
        resources.updateConfiguration(config, resources.getDisplayMetrics());
    }
  • NOTES : Le code de la langue ne peut pas être '-' et doit être composé de 2 lettres minuscules seulement.

2 votes

Il revient en arrière après un certain temps.

3 votes

Ceci doit être appelé par toutes les activités dans la méthode onCreate ? Ou si nous donnons à l'application un contexte, il suffit qu'elle soit appelée une seule fois, et non dans toutes les activités ?

0 votes

J'ai essayé @Paul. mais la langue revient après une certaine activité et cela n'est pas non plus corrigé. cela fonctionne très bien dans l'émulateur, mais pas dans l'appareil. Je vais donc essayer d'appeler le dans toutes les activités.

223voto

AliSh Points 1419

Ce code fonctionne vraiment :

fa = persan, en = anglais

  • NOTES : Le code de la langue ne peut pas être '-' et doit être composé de 2 lettres minuscules seulement.

Entrez votre code de langue dans languageToLoad variable :

import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;

public class Main extends Activity {
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    String languageToLoad  = "fa"; // your language
    Locale locale = new Locale(languageToLoad); 
    Locale.setDefault(locale);
    Configuration config = new Configuration();
    config.locale = locale;
    getBaseContext().getResources().updateConfiguration(config, 
      getBaseContext().getResources().getDisplayMetrics());
    this.setContentView(R.layout.main);
  }
}

MISE À JOUR le 20 juin 2021(Kotlin) :

class Main : Activity() {
    // Called when the activity is first created.
    public override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val config = resources.configuration
        val lang = "fa" // your language code
        val locale = Locale(lang)
        Locale.setDefault(locale)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
            config.setLocale(locale)
        else
            config.locale = locale

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
            createConfigurationContext(config)
        resources.updateConfiguration(config, resources.displayMetrics)

        this.setContentView(R.layout.main)
    }
}

4 votes

Je veux changer la locale à l'exécution, dans votre code, vous mettez votre code avant la méthode setContentView(). Donc votre code n'est pas utile pour moi, Alors comment changer la langue au moment de l'exécution, Dans mon application, il y a deux boutons radio, un pour l'anglais et l'autre pour l'arabe,

0 votes

Il suffit de mettre setContentView(R.layout.main) ; après avoir cliqué sur un bouton radio, cela fonctionnera.

0 votes

Mais il a réinitialisé le champ de mise à jour et pas la meilleure façon aussi, @AliSh

39voto

icyerasor Points 1335

Je cherchais un moyen de changer la langue du système par programme. Bien que je comprenne parfaitement qu'une application normale ne devrait jamais faire cela et plutôt soit :

  • l'utilisateur doit être dirigé (par une intention) vers les paramètres du système pour le modifier manuellement.
  • l'application doit gérer elle-même sa localisation, comme décrit dans la réponse d'Alex.

il fallait vraiment changer le langage du système sur le plan programmatique.

Il s'agit d'une API non documentée et elle ne doit donc pas être utilisée pour les applications du marché/de l'utilisateur final !

Bref, voici la solution que j'ai trouvée :

  Locale locale = new Locale(targetLocaleAsString);

  Class amnClass = Class.forName("android.app.ActivityManagerNative");
  Object amn = null;
  Configuration config = null;

  // amn = ActivityManagerNative.getDefault();
  Method methodGetDefault = amnClass.getMethod("getDefault");
  methodGetDefault.setAccessible(true);
  amn = methodGetDefault.invoke(amnClass);

  // config = amn.getConfiguration();
  Method methodGetConfiguration = amnClass.getMethod("getConfiguration");
  methodGetConfiguration.setAccessible(true);
  config = (Configuration) methodGetConfiguration.invoke(amn);

  // config.userSetLocale = true;
  Class configClass = config.getClass();
  Field f = configClass.getField("userSetLocale");
  f.setBoolean(config, true);

  // set the locale to the new value
  config.locale = locale;

  // amn.updateConfiguration(config);
  Method methodUpdateConfiguration = amnClass.getMethod("updateConfiguration", Configuration.class);
  methodUpdateConfiguration.setAccessible(true);
  methodUpdateConfiguration.invoke(amn, config);

2 votes

Donner exception invocationcible exception cible

0 votes

Sur quelle version d'Android ? Comme c'est une API non documentée, ils ont pu changer les noms, ou la supprimer complètement... Vous devrez vérifier les sources d'Android je suppose.

0 votes

Android 4.2, mais dans quel paquet ?

15voto

harikrishnan Points 573

J'ai changé la langue allemande pour le démarrage de mon application.

Voici mon code correct. Quelqu'un veut utiliser ce même pour moi (Comment changer la langue dans Android de manière programmatique)

mon code :

Configuration config ; // variable declaration in globally

// this part is given inside onCreate Method starting and before setContentView()

public void onCreate(Bundle icic) 
{
    super.onCreate(icic);
    config = new Configuration(getResources().getConfiguration());
    config.locale = Locale.GERMAN ;
    getResources().updateConfiguration(config,getResources().getDisplayMetrics());

    setContentView(R.layout.newdesign);
}

1 votes

@harikrishnan Cela ne fonctionne pas pour moi et le clavier ne passe pas à la langue spécifiée Comment avez-vous déclaré l'activité dans le manifeste ?

8voto

Mike Points 1555

La seule solution qui fonctionne parfaitement pour moi est une combinaison du code d'Alex Volovoy avec le mécanisme de redémarrage des applications :

void restartApplication() {
    Intent i = new Intent(MainTabActivity.context, MagicAppRestart.class);
    i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    MainTabActivity.context.startActivity(i);
}

/** This activity shows nothing; instead, it restarts the android process */
public class MagicAppRestart extends Activity {
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        finish();
    }

    protected void onResume() {
        super.onResume();
        startActivityForResult(new Intent(this, MainTabActivity.class), 0);         
    }
}

2 votes

Après un changement de locale, vous pouvez également appeler activity.recreate()

1 votes

Je ne veux pas redémarrer mon application parce que l'application est en train d'effectuer certaines tâches comme l'enregistrement de l'écran. Donc sans redémarrer l'application, y a-t-il une solution pour Android 7.0 ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X