Mon application prend en charge 3 (bientôt 4) langues. Étant donné que plusieurs paramètres régionaux sont assez similaires, j'aimerais donner à l'utilisateur la possibilité de modifier les paramètres régionaux dans mon application, par exemple, une personne italienne pourrait préférer l'espagnol à l'anglais.
Existe-t-il un moyen pour l'utilisateur de sélectionner parmi les paramètres régionaux disponibles pour l'application, puis de modifier les paramètres régionaux utilisés? Je ne vois pas cela comme un problème pour définir les paramètres régionaux pour chaque activité car c'est une tâche simple à effectuer dans une classe de base.
android
locale
user-defined
Roland
la source
la source
Réponses:
Pour les personnes qui recherchent toujours cette réponse, étant donné qu'elle
configuration.locale
est obsolète depuis l'API 24, vous pouvez désormais utiliser:Tenez compte du fait que minSkdVersion pour cette méthode est l'API 17.
Exemple de code complet:
N'oubliez pas que si vous modifiez les paramètres régionaux avec une activité en cours d'exécution, vous devrez la redémarrer pour que les modifications prennent effet.
EDIT 11 MAI 2018
Depuis le post de @ CookieMonster, vous pourriez avoir des problèmes pour conserver le changement de langue dans les versions d'API supérieures. Si tel est le cas, ajoutez le code suivant à votre activité de base afin de mettre à jour les paramètres régionaux de contexte à chaque création d'activité:
Si vous utilisez ceci, n'oubliez pas d'enregistrer la langue dans SharedPreferences lorsque vous définissez les paramètres régionaux avec
setLocate(locale)
EDIT 7 AVRIL 2020
Vous rencontrez peut-être des problèmes sous Android 6 et 7, et cela est dû à un problème dans les bibliothèques androidx lors de la gestion du mode nuit. Pour cela, vous devrez également remplacer
applyOverrideConfiguration
votre activité de base et mettre à jour les paramètres régionaux de la configuration au cas où un nouveau paramètre régional serait créé.Exemple de code:
la source
androidx.appcompat:appcompat:
version de1.0.2
à1.1.0
ne fonctionne pas sur Android 7, mais fonctionne sur Android 9.1.1.0
androidxappcompat:1.1.0
peut être résolu avecappcompat:1.2.0-alpha02
et le code à l'Set<Locale> set = new LinkedHashSet<>(); // bring the target locale to the front of the list set.add(locale); LocaleList all = LocaleList.getDefault(); for (int i = 0; i < all.size(); i++) { // append other locales supported by the user set.add(all.get(i)); } Locale[] locales = set.toArray(new Locale[0]); configuration.setLocales(new LocaleList(locales));
intérieur@TargetApi(Build.VERSION_CODES.N) updateResourcesLocale()
J'espère que cette aide (dans onResume):
la source
J'ai eu un problème avec la configuration des paramètres régionaux par programmation avec des appareils dotés d' Android OS N et supérieur . Pour moi, la solution était d'écrire ce code dans mon activité de base:
(si vous n'avez pas d'activité de base, vous devez effectuer ces changements dans toutes vos activités)
notez qu'ici il ne suffit pas d'appeler
vous devez également obtenir le contexte renvoyé par cette méthode, puis définir ce contexte dans la
attachBaseContext
méthode.la source
updateBaseContextLocale
méthodeonCreate
de votre activité parent / base.Comme aucune réponse n'est complète pour la manière actuelle de résoudre ce problème, j'essaie de donner des instructions pour une solution complète. Veuillez commenter si quelque chose manque ou pourrait être amélioré.
informations générales
Premièrement, il existe des bibliothèques qui veulent résoudre le problème mais elles semblent toutes obsolètes ou manquent de certaines fonctionnalités:
De plus, je pense qu'écrire une bibliothèque n'est peut-être pas un moyen simple / bon de résoudre ce problème car il n'y a pas grand chose à faire, et ce qu'il faut faire est plutôt de changer le code existant que d'utiliser quelque chose de complètement découplé. C'est pourquoi j'ai rédigé les instructions suivantes qui devraient être complètes.
Ma solution est principalement basée sur https://github.com/gunhansancar/ChangeLanguageExample (comme déjà lié par localhost ). C'est le meilleur code que j'ai trouvé pour m'orienter. Quelques remarques:
updateViews()
dans chaque activité pour mettre à jour manuellement toutes les chaînes après avoir changé les paramètres régionaux (en utilisant l'habituelgetString(id)
), ce qui n'est pas nécessaire dans l'approche ci-dessousJe l'ai un peu changé, découplant la partie qui persiste dans la locale choisie (car on pourrait vouloir le faire séparément, comme suggéré ci-dessous).
Solution
La solution comprend les deux étapes suivantes:
Étape 1: modifier les paramètres régionaux
Utilisez la classe
LocaleHelper
, basée sur LocaleHelper de gunhansancar :ListPreference
dans unPreferenceFragment
avec les langues disponibles (doit être conservé lorsque des langues doivent être ajoutées ultérieurement)Créez un
SettingsFragment
comme celui-ci:Créez une ressource
locales.xml
répertoriant tous les paramètres régionaux avec les traductions disponibles de la manière suivante ( liste des codes de paramètres régionaux ):Dans votre,
PreferenceScreen
vous pouvez utiliser la section suivante pour permettre à l'utilisateur de sélectionner les langues disponibles:qui utilise les chaînes suivantes de
strings.xml
:Étape 2: faire en sorte que l'application utilise les paramètres régionaux personnalisés
Configurez maintenant chaque activité pour utiliser l'ensemble de paramètres régionaux personnalisés. Le moyen le plus simple d'y parvenir est d'avoir une classe de base commune pour toutes les activités avec le code suivant (où se trouve le code important
attachBaseContext(Context base)
etonResume()
):Ce que ça fait c'est
attachBaseContext(Context base)
pour utiliser les paramètres régionaux précédemment conservés avecLocaleHelper
Remarques sur cette solution
La recréation d'une activité ne met pas à jour le titre de l'ActionBar (comme déjà observé ici: https://github.com/gunhansancar/ChangeLanguageExample/issues/1 ).
setTitle(R.string.mytitle)
dans laonCreate()
méthode de chaque activité.Il permet à l'utilisateur de choisir les paramètres régionaux par défaut du système, ainsi que les paramètres régionaux par défaut de l'application (qui peuvent être nommés, dans ce cas, «anglais»).
Seuls les codes de langue, aucune région (pays) et codes de variante (comme
fr-rCA
) sont pris en charge jusqu'à présent. Pour prendre en charge les spécifications régionales complètes, un analyseur similaire à celui de la bibliothèque Android-Languages peut être utilisé (qui prend en charge la région mais pas les codes de variante).la source
attachBaseContext(Context base)
etonResume()
vers une classe séparée) peut faire l'affaire. Ensuite, tout ce que vous avez à faire est de déclarer un objet dans chaque classe de base d'activité et de déléguer ces deux appels.Utilisez simplement cette méthode d'assistance pour forcer des paramètres régionaux spécifiques.
UDPATE 22 AOÛT 2017. Mieux vaut utiliser cette approche .
la source
Ajoutez une classe d'assistance avec la méthode suivante:
Et appelez-le dans votre activité de démarrage, comme
MainActivity.java
:la source
simple et facile
où "en" est le code de la langue et "US" est le code du pays.
la source
conf.locale=locale;
est obsolète et l'est égalementupdateConfiguration
.Valable pour API16 à API28 Il suffit de placer cette méthode là où:
Insérez ce code dans toutes vos activités en utilisant:
ou appelez localeUpdateResources sur des fragments, des adaptateurs, etc. où vous avez besoin du nouveau contexte.
Crédits: Yaroslav Berezanskyi
la source
Il existe un moyen très simple.
dans BaseActivity, Activity ou Fragment override attachBaseContext
extension
la source
J'ai trouvé le
androidx.appcompat:appcompat:1.1.0
bogue peut également être fixé en appelant simplementgetResources()
enapplyOverrideConfiguration()
la source
la source
Pour ceux qui ont tout essayé mais qui ne fonctionnent pas . Veuillez vérifier que si vous définissez
darkmode
avecAppCompatDelegate.setDefaultNightMode
et que le système n'est pas sombre,Configuration.setLocale
cela ne fonctionnera pas au-dessus d' Andorid 7.0 .Ajoutez ce code dans chacune de vos activités pour résoudre ce problème:
la source
Mettez ce code dans votre activité
la source