Est-il possible de changer la langue d'une application par programme tout en utilisant des ressources Android?
Sinon, est-il possible de demander une ressource dans une langue spécifique?
Je voudrais laisser l'utilisateur changer la langue de l'application depuis l'application.
android
localization
resources
hpique
la source
la source
Réponses:
C'est possible. Vous pouvez définir les paramètres régionaux. Cependant, je ne recommanderais pas cela. Nous l'avons essayé à un stade précoce, il s'agit essentiellement de combattre le système.
Nous avons la même exigence pour changer la langue, mais nous avons décidé de nous contenter du fait que l'interface utilisateur devrait être identique à l'interface utilisateur du téléphone. Cela fonctionnait via la définition des paramètres régionaux mais était trop bogué. Et vous devez le régler chaque fois que vous entrez dans une activité (chaque activité) d'après mon expérience. voici un code si vous en avez encore besoin (encore une fois, je ne le recommande pas)
Si vous avez un contenu spécifique à une langue, vous pouvez modifier cette base en fonction du paramètre.
mise à jour du 26 mars 2020
la source
Context.createConfigurationContext()
, qui peut être utilisée pour encapsuler le contexte par défaut avec une configuration spécifique aux paramètres régionaux, puis l'appelergetResources
sans avoir à mettre à jour la configuration sur les objets ressources eux-mêmes.conf.setLayoutDirection(locale)
, vous pouvez le remplacerconf.locale = new Locale(...))
parconf.setLocale(new Locale(...))
. Il appellera en internesetLayoutDirection
.Ce code fonctionne vraiment:
Entrez votre code de langue dans la
languageToLoad
variable:la source
Resources.updateConfiguration
méthode. J'ai mis en retrait le code pour le rendre plus clair.Je cherchais un moyen de changer la langue du système par programme. Bien que je comprenne bien qu'une application normale ne devrait jamais faire cela et à la place:
il fallait vraiment changer la langue du système par programme.
Il s'agit d'API non documentée et ne doit donc pas être utilisée pour les applications de marché / utilisateur final!
Quoi qu'il en soit, voici la solution que j'ai trouvée:
la source
android.permission.CHANGE_CONFIGURATION
ne peut être accordé que par une application signée avec la touche perform.Si vous souhaitez conserver la langue modifiée dans toute votre application, vous devez faire deux choses.
Tout d'abord, créez une activité de base et étendez toutes vos activités à partir de cela:
Notez que j'enregistre la nouvelle langue dans une préférence partagée.
Deuxièmement, créez une extension de l'application comme celle-ci:
Notez que getLocale () est la même que ci-dessus.
C'est tout! J'espère que cela peut aider quelqu'un.
la source
Application
c'est et comment l'utiliser. mobomo.com/2011/05/how-to-use-application-object-of-androidconfiguration.locate
est obsolète, setLocale nécessite l'API 17+ et updateConfiguration est obsolèteSelon cet article . Vous devrez télécharger
LocaleHelper.java
référencé dans cet article.MyApplication
classe qui s'étendraApplication
attachBaseContext()
pour mettre à jour la langue.Enregistrez cette classe dans le manifeste.
Créez
BaseActivity
et remplacezonAttach()
pour mettre à jour la langue. Nécessaire pour Android 6+Faites en sorte que toutes les activités de votre application s'étendent de
BaseActivity
.la source
Ajouter juste un morceau supplémentaire qui m'a fait trébucher.
Alors que les autres réponses fonctionnent bien avec "de" par exemple
Ce qui précède ne fonctionnera pas avec, par exemple, les
"fr_BE"
paramètres régionaux de sorte qu'il utiliserait levalues-fr-rBE
dossier ou similaire.Nécessite le léger changement suivant pour fonctionner avec
"fr_BE"
la source
activity.recreate()
android.content.res.Configuration conf = res.getConfiguration();
au lieu de créer une nouvelleConfiguration
instance? Y a-t-il un avantage à en utiliser un nouveau?J'ai changé de langue allemande pour que mon application démarre elle-même.
Voici mon bon code. Tout le monde veut utiliser la même chose pour moi .. (Comment changer la langue dans Android par programme)
mon code:
la source
Je sais qu'il est tard pour répondre mais j'ai trouvé cet article ici . Ce qui explique très bien l'ensemble du processus et vous fournit un code bien structuré.
Classe d'aide locale:
Vous devez remplacer attachBaseContext et appeler LocaleHelper.onAttach () pour initialiser les paramètres régionaux dans votre application.
Tout ce que vous avez à faire est d'ajouter
où vous voulez changer les paramètres régionaux.
la source
createConfigurationContext
, cela a été utileCréer une classe Étend
Application
et crée une méthode statique. Vous pouvez ensuite appeler cette méthode dans toutes les activités précédentessetContentView()
.Utilisation dans les activités:
la source
Pour Android 7.0 Nougat (et inférieur), suivez cet article:
Changer la langue par programme dans Android
Ancienne réponse
Cela inclut le support RTL / LTR:
la source
La seule solution qui fonctionne parfaitement pour moi est une combinaison du code d'Alex Volovoy avec le mécanisme de redémarrage de l'application:
la source
activity.recreate()
J'étais confronté au même problème. Sur GitHub, j'ai trouvé la bibliothèque Android-LocalizationActivity .
Cette bibliothèque facilite le changement de la langue de votre application au moment de l'exécution, comme vous pouvez le voir dans l'exemple de code ci-dessous. Un exemple de projet comprenant l'exemple de code ci-dessous et plus d'informations peuvent être trouvés sur la page github.
LocalizationActivity étend AppCompatActivity, vous pouvez donc également l'utiliser lorsque vous utilisez des fragments.
la source
Temps pour une mise à jour due.
Tout d'abord, la liste déconseillée avec l'API dans laquelle elle a été déconseillée:
configuration.locale
(API 17)updateConfiguration(configuration, displaymetrics)
(API 17)La chose à laquelle aucune question n'a été répondue récemment est devenue correcte, c'est l'utilisation de la nouvelle méthode .
createConfigurationContext est la nouvelle méthode pour updateConfiguration.
Certains l'ont utilisé de manière autonome comme ceci:
... mais ça ne marche pas. Pourquoi? La méthode renvoie un contexte, qui est ensuite utilisé pour gérer les traductions Strings.xml et d'autres ressources localisées (images, mises en page, etc.).
L'utilisation appropriée est comme ceci:
Si vous venez de copier-coller cela dans votre IDE, vous pouvez voir un avertissement que l'API vous oblige à cibler l'API 17 ou supérieure. Cela peut être contourné en le mettant dans une méthode et en ajoutant l'annotation
@TargetApi(17)
Mais attendez. Qu'en est-il des anciennes API?
Vous devez créer une autre méthode à l'aide de updateConfiguration sans l'annotation TargetApi.
Vous n'avez pas besoin de renvoyer un contexte ici.
Maintenant, leur gestion peut être difficile. Dans l'API 17+, vous avez besoin du contexte créé (ou des ressources du contexte créé) pour obtenir les ressources appropriées en fonction de la localisation. Comment gérez-vous cela?
Eh bien, c'est comme ça que je le fais:
Ce code fonctionne en ayant une méthode qui appelle la méthode appropriée en fonction de quelle API. C'est quelque chose que j'ai fait avec beaucoup d'appels obsolètes différents (y compris Html.fromHtml). Vous avez une méthode qui prend les arguments nécessaires, qui la divise ensuite en l'une des deux (ou trois ou plus) méthodes et renvoie le résultat approprié en fonction du niveau de l'API. Il est flexible car vous n'avez pas à vérifier plusieurs fois, la méthode "entrée" le fait pour vous. La méthode d'entrée ici est
setLanguage
VEUILLEZ LIRE CECI AVANT DE L'UTILISER
Vous devez utiliser le contexte renvoyé lorsque vous obtenez des ressources. Pourquoi? J'ai vu d'autres réponses ici qui utilisent createConfigurationContext et n'utilisent pas le contexte qu'il renvoie. Pour que cela fonctionne comme ça, updateConfiguration doit être appelé. Ce qui est obsolète. Utilisez le contexte renvoyé par la méthode pour obtenir des ressources.
Exemple d'utilisation :
Constructeur ou quelque part similaire:
Et puis, partout où vous voulez obtenir des ressources, vous le faites:
L'utilisation de tout autre contexte rompra (en théorie) cela.
AFAIK, vous devez toujours utiliser un contexte d'activité pour afficher les boîtes de dialogue ou les toasts. pour cela vous pouvez utiliser une instance d'une activité (si vous êtes à l'extérieur)
Et enfin, utilisez
recreate()
l'activité pour actualiser le contenu. Raccourci pour ne pas avoir à créer une intention de rafraîchissement.la source
Si vous écrivez
Dans chaque activité (dans le fichier manifeste), pas besoin de le définir à chaque fois que vous entrez
Activity
.la source
configChanges
utilisé pour un piratage pour préserver l'état d'activité lors des rotations / etc.Mise à jour importante:
Notez que sur SDK> = 21, vous devez appeler «Resources.updateConfiguration ()» , sinon les ressources ne seront pas mises à jour.
la source
Context ctx = createConfigurationContext(args);
et obtenez des ressources de celala source
activity.recreate()
Locale
configuration
doit être défini dans chacunactivity
avant de définir le contenu -this.setContentView(R.layout.main);
la source
activity.recreate()
Créez d'abord multi string.xml pour différentes langues; puis utilisez ce bloc de code dans la
onCreate()
méthode:la source
Voici un code qui fonctionne pour moi:
Source: ici
la source
Aucune des solutions énumérées ici ne m'a aidé.
La langue n'a pas activé Android> = 7.0 si AppCompatDelegate.setDefaultNightMode (AppCompatDelegate.MODE_NIGHT_YES)
Ce LocaleUtils fonctionne très bien: https://gist.github.com/GigigoGreenLabs/7d555c762ba2d3a810fe
LocaleUtils
Ajout de ce code à l'application
Code en activité
la source
La réponse d'Alex Volovoy ne fonctionne pour moi que si elle est dans la méthode onCreate de l'activité.
La réponse qui fonctionne dans toutes les méthodes est dans un autre thread
Changer la langue par programme dans Android
Voici l'adaptation du code
J'espère que ça aide.
la source
Notez que cette solution utilisant
updateConfiguration
ne fonctionnera plus avec la sortie d' Android M dans quelques semaines. La nouvelle façon de procéder consiste maintenant à utiliser laapplyOverrideConfiguration
méthodeContextThemeWrapper
voir le document APIVous pouvez trouver ma solution complète ici puisque j'ai moi-même fait face au problème: https://stackoverflow.com/a/31787201/2776572
la source
Il y a quelques étapes que vous devez implémenter
Tout d'abord, vous devez modifier les paramètres régionaux de votre configuration
Deuxièmement, si vous souhaitez que vos modifications s'appliquent directement à la présentation visible, vous pouvez soit mettre à jour les vues directement, soit appeler simplement activity.recreate () pour redémarrer l'activité en cours.
Et vous devez également persister vos modifications car après que l'utilisateur ferme votre application, vous perdriez le changement de langue.
J'ai expliqué la solution plus détaillée sur mon article de blog Changer de langue par programme dans Android
Fondamentalement, vous appelez simplement LocaleHelper.onCreate () sur votre classe d'application et si vous souhaitez modifier les paramètres régionaux à la volée, vous pouvez appeler LocaleHelper.setLocale ()
la source
Cela fonctionne lorsque j'appuie sur le bouton pour changer la langue du texte de mon TextView. (Strings.xml dans le dossier values-de)
la source
Ajouter une classe LocaleHelper
En activité ou fragment
Maintenant, placezText sur chaque texte
la source
similaire à la version acceptée, mais avec réponse 2017 et redémarrage ajouté (sans redémarrage, parfois la prochaine activité s'affiche toujours en anglais):
la source
activity.recreate()
3) le contexte retourné doit être utilisé pour obtenir les ressourcesD'abord, vous créez des valeurs de nom de répertoire - "Nom de langue" comme hindi que vous écrivez "salut" et la même copie de nom de fichier de chaîne dans ce répertoire et changez la valeur ne changez pas le paramètre après avoir défini le code ci-dessous dans votre action comme le bouton, etc.
la source
conf.locale
est obsolètela source
Dans l'exemple, nous définissons la langue anglaise:
N'oubliez pas que cela ne fonctionne que si la langue se trouve également dans le système de l'appareil, pas seulement dans l'application
la source
Pour la prise en charge de l'arabe / RTL
la source