comment obtenir de la chaîne à partir de différents parameters régionaux dans Android?

Je veux donc obtenir la valeur d’une chaîne dans plusieurs parameters régionaux, quel que soit le paramètre régional actuel de l’appareil / de l’application. Comment devrais-je faire ça?

Fondamentalement, ce dont j’ai besoin est une fonction getSsortingng(int id, Ssortingng locale) plutôt que getSsortingng(int id)

Comment pourrais-je faire ça?

Merci

REMARQUE Si votre API minimum est 17+, allez directement au bas de cette réponse. Sinon, lisez la suite …

Si vous avez différents dossiers de résolution pour différents parameters régionaux, vous pouvez faire quelque chose comme ceci:

 Configuration conf = getResources().getConfiguration(); conf.locale = new Locale("pl"); DisplayMesortingcs mesortingcs = new DisplayMesortingcs(); getWindowManager().getDefaultDisplay().getMesortingcs(mesortingcs); Resources resources = new Resources(getAssets(), mesortingcs, conf); Ssortingng str = resources.getSsortingng(id); 

Alternativement, vous pouvez simplement redémarrer votre activité en utilisant la méthode indiquée par @jyotiprakash.

REMARQUE L’ appel du constructeur Resources comme celui-ci modifie quelque chose en interne dans Android. Vous devrez appeler le constructeur avec votre environnement local d’origine pour récupérer les choses telles qu’elles étaient.

EDIT Une recette légèrement différente (et légèrement plus propre) pour récupérer des ressources à partir de parameters régionaux spécifiques est la suivante:

 Resources res = getResources(); Configuration conf = res.getConfiguration(); Locale savedLocale = conf.locale; conf.locale = desiredLocale; // whatever you want here res.updateConfiguration(conf, null); // second arg null means don't change // resortingeve resources from desired locale Ssortingng str = res.getSsortingng(id); // restore original locale conf.locale = savedLocale; res.updateConfiguration(conf, null); 

A partir du niveau 17 de l’API, vous devez utiliser conf.setLocale() au lieu de définir directement conf.locale . Cela mettra à jour correctement la mise en page de la configuration si vous passez entre les parameters régionaux de droite à gauche et de gauche à droite. (La mise en page a été introduite dans 17.)

Il ne sert à rien de créer un nouvel object Configuration (comme le suggère @Nulano dans un commentaire), car l’appel à updateConfiguration va changer la configuration d’origine obtenue en appelant res.getConfiguration() .

J’hésiterais à regrouper cela dans une méthode getSsortingng(int id, Ssortingng locale) si vous voulez charger plusieurs ressources de chaîne pour un paramètre régional. La modification des parameters régionaux (à l’aide de l’une ou l’autre recette) exige que le framework fasse beaucoup de travail en reliant toutes les ressources. Il est préférable de mettre à jour les parameters régionaux une fois, de récupérer tout ce dont vous avez besoin, puis de rétablir les parameters régionaux.

EDIT (Merci à @Mygod):

Si votre niveau minimum d’API est 17+, il existe une approche bien meilleure, comme le montre cette réponse sur un autre thread. Par exemple, vous pouvez créer plusieurs objects Resource , un pour chaque environnement local dont vous avez besoin, avec:

 @NonNull Resources getLocalizedResources(Context context, Locale desiredLocale) { Configuration conf = context.getResources().getConfiguration(); conf = new Configuration(conf); conf.setLocale(desiredLocale); Context localizedContext = context.createConfigurationContext(conf); return localizedContext.getResources(); } 

Ensuite, récupérez simplement les ressources que vous aimez dans l’object Resource localisée renvoyé par cette méthode. Il n’est pas nécessaire de réinitialiser quoi que ce soit une fois les ressources récupérées.

Voici une version combinée des approches décrites par Ted Hopp . De cette façon, le code fonctionne pour toute version Android:

 public static Ssortingng getLocaleSsortingngResource(Locale requestedLocale, int resourceId, Context context) { Ssortingng result; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { // use latest api Configuration config = new Configuration(context.getResources().getConfiguration()); config.setLocale(requestedLocale); result = context.createConfigurationContext(config).getText(resourceId).toSsortingng(); } else { // support older android versions Resources resources = context.getResources(); Configuration conf = resources.getConfiguration(); Locale savedLocale = conf.locale; conf.locale = requestedLocale; resources.updateConfiguration(conf, null); // resortingeve resources from desired locale result = resources.getSsortingng(resourceId); // restore original locale conf.locale = savedLocale; resources.updateConfiguration(conf, null); } return result; } 

Exemple d’utilisation:

 Ssortingng englishName = getLocaleSsortingngResource(new Locale("en"), R.ssortingng.name, context); 

Remarque

Comme déjà indiqué dans la réponse d’origine, il peut être plus efficace de remplacer les appels multiples du code ci-dessus par un seul changement de configuration et par plusieurs appels à resources.getSsortingng ().

Ce que vous recherchez est appelé la classe ResourceBundle. Voici le lien:

Google Docs pour ResourceBundle