web-dev-qa-db-fra.com

Android obtenir les paramètres régionaux de l'appareil

Lors de l'installation de mon programme Android, je vérifie les paramètres régionaux de l'appareil:

String deviceLocale=Locale.getDefault().getLanguage();

Si deviceLocale est dans mes langues prises en charge (anglais, français, allemand), je ne change pas les paramètres régionaux.

Mais disons par exemple que si je ne supporte pas la langue de l'appareil: par exemple l'espagnol.
J'ai défini les paramètres régionaux actuels sur l'anglais, car la plupart des gens peuvent comprendre l'anglais en partie.

Locale locale = new Locale("en");
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
pContext.getResources().updateConfiguration(config, null);

Mais après cela, dans d'autres méthodes, lorsque je vérifie les paramètres régionaux de l'appareil comme ceci:

String deviceLocale=Locale.getDefault().getLanguage();

J'obtiens le résultat comme "anglais". Mais les paramètres régionaux de l'appareil sont en espagnol.

GetLanguage () donne-t-il les paramètres régionaux de l'application actuelle?
Comment obtenir les paramètres régionaux de l'appareil?

Modifier: lors de la première exécution de l'application, il s'agit d'une option pour enregistrer les paramètres régionaux de l'appareil. Mais si l'utilisateur change les paramètres régionaux de l'appareil après avoir enregistré, je ne peux pas connaître les nouveaux paramètres régionaux du périphérique. Je ne peux connaître que les paramètres régionaux que j'ai enregistrés lors de l'installation de l'application.

38
trante

Il existe un moyen beaucoup plus simple et plus propre de le faire que d'utiliser la réflexion ou l'analyse d'une propriété système.

Comme vous l'avez remarqué une fois que vous avez défini les paramètres régionaux par défaut dans votre application, vous n'avez plus accès aux paramètres régionaux par défaut du système. Les paramètres régionaux par défaut que vous définissez dans votre application ne sont valides que pendant le cycle de vie de votre application. Tout ce que vous définissez dans votre Locale.setDefault (Locale) a disparu une fois le processus terminé. Lorsque l'application est redémarrée, vous pourrez à nouveau lire les paramètres régionaux par défaut du système.

Donc, tout ce que vous devez faire est de récupérer les paramètres régionaux par défaut du système au démarrage de l'application, souvenez-vous-en tant que l'application s'exécute et mettez-la à jour si l'utilisateur décide de changer la langue dans les paramètres Android Android. Parce que nous n'avons besoin de cette information que tant que l'application fonctionne, nous pouvons simplement la stocker dans une variable statique, accessible de n'importe où dans votre application.

Et voici comment nous procédons:

public class MyApplication extends Application {

    public static String sDefSystemLanguage;

    @Override
    public void onCreate() {
        super.onCreate();

        sDefSystemLanguage = Locale.getDefault().getLanguage();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        sDefSystemLanguage = newConfig.locale.getLanguage();
    }

}

En utilisant une application (n'oubliez pas de la définir dans votre manifeste), nous obtenons les paramètres régionaux par défaut au démarrage de l'application (onCreate ()) et nous la mettons à jour lorsque l'utilisateur change de langue dans le Android = settings (onConfigurationChanged (Configuration)). C'est tout ce qu'il y a. Chaque fois que vous avez besoin de connaître la langue par défaut du système avant d'utiliser votre appel setDefault, sDefSystemLanguage vous donnera la réponse.

Il y a un problème que j'ai repéré dans votre code. Lorsque vous définissez les nouveaux paramètres régionaux, vous effectuez:

Configuration config = new Configuration();
config.locale = locale;
pContext.getResources().updateConfiguration(config, null);

Lorsque vous faites cela, vous écrasez toutes les informations de configuration que vous voudrez peut-être conserver. Par exemple. Configuration.fontScale reflète le texte en gros des paramètres d'accessibilité. En définissant la langue et en perdant toutes les autres configurations, votre application ne refléterait plus les paramètres de texte volumineux, ce qui signifie que le texte est plus petit qu'il ne devrait l'être (si l'utilisateur a activé le paramètre de texte volumineux). La bonne façon de procéder est:

Resources res = pContext.getResources();
Configuration config = res.getConfiguration();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
    configuration.setLocale(Locale.CANADA);
}
else {
    configuration.locale = Locale.CANADA;
}
res.updateConfiguration(config, null);

Ainsi, au lieu de créer un nouvel objet de configuration, nous mettons simplement à jour l'objet actuel.

69

Vous pouvez accéder aux paramètres régionaux globaux en -

defaultLocale = Resources.getSystem().getConfiguration().locale;

Jetez un œil à http://developer.Android.com/reference/Android/content/res/Resources.html#getSystem () -

Renvoie un objet Resources partagé global qui donne accès uniquement aux ressources système (pas de ressources d'application)

Mise à jour: Comme indiqué dans les commentaires, le champ 'locale' est obsolète et vous devez utiliser getLocales () à la place.

defaultLocale = Resources.getSystem().getConfiguration().getLocales().get(0);

42
Aniket Awati

La meilleure façon de concevoir l'application est d'utiliser une langue par défaut, l'anglais dans votre cas, sous valeurs/et vous pouvez ajouter des langues supplémentaires sous valeurs-XX /. De cette façon, lorsqu'une langue n'est pas prise en charge Android retour à votre valeur par défaut, donc l'anglais. Laissez le système d'exploitation faire le travail pour vous :) Cependant, oui, si vous changez les paramètres régionaux, vous obtiendrez votre derniers paramètres, vous devez donc enregistrer ces informations quelque part.

7
greywolf82

Lorsque vous modifiez le Application language programatically like

Locale locale = new Locale("en");
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
pContext.getResources().updateConfiguration(config, null);

Et

But after that, in other methods, when I check device's locale like this:

String deviceLocale=Locale.getDefault().getLanguage();
I get result as "English". But device's locale is Spanish.

Donc, au lieu de cela, utilisez ce code ci-dessous pour obtenir le device's Local

try {
    Process exec = Runtime.getRuntime().exec(new String[]{"getprop", "persist.sys.language"});
    String locale = new BufferedReader(new InputStreamReader(exec.getInputStream())).readLine();
    exec.destroy();
    Log.e("", "Device locale: "+locale);
} catch (IOException e) {
    e.printStackTrace();
}

SORTIE: SpanishCochez cette case

J'espère que c'est exactement ce que vous recherchez.

3
Amit Gupta

Bien que la réponse de @ user2944616 soit politiquement correcte, cela ne donne pas de réponse à la question posée.

Donc, si je devais vraiment connaître les paramètres régionaux du système défini par l'utilisateur, j'utiliserais la réflexion (je ne connais pas de meilleure option ATM):

private String getSystemPropertyValue(String name) {
    try {
        Class<?> systemProperties = Class.forName("Android.os.SystemProperties");
        try {
            Method get = systemProperties.getMethod("get", String.class, String.class);
            if (get == null) {
                return "Failure!?";
            }
            try {
                return (String)get.invoke(systemProperties, name, "");
            } catch (IllegalAccessException e) {
                return "IllegalAccessException";
            } catch (IllegalArgumentException e) {
                return "IllegalArgumentException";
            } catch (InvocationTargetException e) {
                return "InvocationTargetException";
            }
        } catch (NoSuchMethodException e) {
            return "SystemProperties.get(String key, String def) method is not found";
        }
    } catch (ClassNotFoundException e) {
        return "SystemProperties class is not found";
    }
}

Avec cette donnée et les paramètres régionaux de l'appareil définis sur Spanish (United States)/Español (Estados Unidos) chaîne suivante

<string name="system_locale">System locale: <xliff:g id="profile_name">%1$s</xliff:g>&#95;<xliff:g id="device_name">%2$s</xliff:g></string>

et ce code

private static final String SYS_COUNTRY = "persist.sys.country";
private static final String SYS_LANG = "persist.sys.language";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    TextView tv = (TextView)findViewById(R.id.locale);
    tv.setText(getString(R.string.system_locale, getSystemPropertyValue(SYS_LANG),
            getSystemPropertyValue(SYS_COUNTRY)));
}

donne l'écran suivant:

System locale screenshot

Si vous le souhaitez, on pourrait également facilement construire une instance de Locale en utilisant ce qui précède:

Locale locale = new Locale(getSystemPropertyValue(SYS_LANG),
        getSystemPropertyValue(SYS_COUNTRY));
Log.d(TAG, "Language: " + locale.getLanguage());
Log.d(TAG, "Country: " + locale.getCountry());

Sortie du journal:

D/GetSystemLocale(5697): Language: es
D/GetSystemLocale(5697): Country: US

J'espère que cela t'aides.

1
ozbek

vous devez utiliser String deviceLocale= Locale.getDefault().getDisplayLanguage(); pour afficher la langue au lieu de

String deviceLocale=Locale.getDefault().getLanguage();

consultez cette réponse, cela peut vous aider si ce n'est pas le cas ci-dessus. cliquable

1
k0sh