Je souhaite que mon application prenne en charge trois langues: espagnol, portugais et anglais. Et donnez la possibilité de sélectionner la langue dans l'application.
1) 3 dossiers à dessiner drawable-es, drawable-pt, drawable.
2) Dossier à 3 valeurs values-es, values-pt, values.Changez les valeurs de String.xml en fonction des langues.
J'ai imageView pour sélectionner la langue.Lorsque vous cliquez dessus, le menu s'ouvre qui comprend l'option anglais, espagnol, portugais.
J'ai défini les paramètres régionaux dans l'application lors de la sélection d'option 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 Manifest- android: configChanges = "locale"
Cela fonctionne mais il y a un problème.
Problème:-
1) Lorsque la langue est sélectionnée, l'écran qui consiste en une image de sélection de la langue ne change pas mais les autres écrans changent.
2) Après l'orientation, changez la langue de restauration de l'application en fonction des paramètres régionaux du téléphone.
la source
android:configChanges="locale"
pour votre activité dans le fichier AndroidManifest.xmlRéponses:
C'est un extrait de 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 ci-dessous qui accepte les paramètres régionaux sous forme de chaîne (comme «en» pour l'anglais, «hi» pour l'hindi), configurez les paramètres régionaux de 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 modifiez pas à nouveau manuellement.
Assurez-vous d'avoir importé les packages suivants:
ajouter le manifeste à l'activité android: configChanges = "locale | orientation"
la source
finish()
doit être appelé avantstartActivity(refresh)
. Sinon, l'application peut quitter au lieu de redémarrer l'activité.Les bonnes solutions expliquées assez bien ici. Mais en voici un de plus.
Créez votre propre
CustomContextWrapper
extension de classeContextWrapper
et utilisez-la pour modifier les paramètres régionaux de l'application complète. Voici un GIST avec l'utilisation.Et puis appelez l'
CustomContextWrapper
identificateur de paramètres régionaux avec, par exemple,'hi'
pour la langue hindi dans la méthode du cycle de vie de l'activitéattachBaseContext
. Utilisation ici:la source
MyContextWrapper.warp
enonAttach
d'un seul fragment de mon application , mais la langue a été modifié pour l'application entière, mais les titres d'activité sont restés inchangés, je pense que ce est parce que les titres du manifeste ont la priorité, mais si j'appelle la même méthode dansonAttachBaseContex
ma sous-classe d'application, les titres d'activité changent également dans la langue sélectionnée, mais alors les modifications ne sont appliquées qu'au fragment que j'ai appelé dans la méthode warp, pourquoi ?warp
dansonAttach
le fragment, auparavant j'ai dit que j'avais juste besoin de le faire avec le fragment de l'activité principale et la langue changée en l'application entière, c'est vrai, mais pour tous les autres fragments, la langue change en anglais lors du changement de configuration, je dois donc inséreronattach
tous les fragments et au lieu du manifeste, je définis les titres de la barre d'action dans le code, maintenant l'application fonctionne comme prévu. merciattachBaseContext
fonction uniquement. Et cela le fait pour tous les écrans. Avez-vous créé une «BaseActivity» pour toutes les activités de votre application?wrap()
code doit être exécuté à chaque changement de configuration, alors je l'ai mis dans le Activité abstraite à partir de laquelle toutes les autres activités s'étendent, maintenant ça marcheVous devez soit supprimer
android:configChanges="locale"
du manifeste, ce qui entraînera le rechargement de l'activité, soit remplacer laonConfigurationChanged
méthode:la source
tout le code ci-dessus @ Uday est parfait mais il ne manque qu'une seule chose (configuration par défaut dans build.gradle)
}
Le mien ne fonctionnait pas simplement parce que les langues n'étaient pas mentionnées dans le fichier de configuration (build.gradle)
après cela, toutes les langues ont commencé à fonctionner
la source
Ceux qui rencontrent le problème de version essaient ce code.
la source
L'exemple de code d'Udhay fonctionne bien. Sauf la question de Sofiane Hassaini et Chirag SolankI, pour la rentrée, ça ne marche pas. J'essaye d'appeler le code d'Udhay sans redémarrer l'activité dans onCreate (), avant super.onCreate (savedInstanceState) ;. Alors c'est OK! Seul petit problème, les chaînes de menu n'ont toujours pas été modifiées par les paramètres régionaux définis.
la source
Intent refresh = new Intent(this, ThisActivity.class); startActivity(refresh);
?