Pregunta Android obtener la configuración regional del dispositivo


Tras la instalación de mi programa Android, compruebo la configuración regional del dispositivo:

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

Si deviceLocale está dentro de mis idiomas admitidos (inglés, francés, alemán), no cambio la configuración regional.

Pero, por ejemplo, decir que si no soy compatible con el idioma del dispositivo: por ejemplo, español.
Configuro la configuración regional actual en inglés, porque la mayoría de la gente puede entender inglés en parte.

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

Pero después de eso, en otros métodos, cuando reviso la configuración regional del dispositivo de esta manera:

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

Obtengo el resultado como "Inglés". Pero la configuración regional del dispositivo es español.

¿GetLanguage () da la configuración regional de la aplicación actual?
¿Cómo puedo obtener la configuración regional del dispositivo?

Editar: en la primera ejecución de la aplicación, es una opción para guardar la configuración regional del dispositivo. Pero si el usuario cambia la configuración regional del dispositivo después de guardarlo, no puedo conocer la nueva configuración regional del dispositivo. Solo puedo conocer la configuración regional que guardé en la instalación de la aplicación.


33
2018-04-28 18:49


origen


Respuestas:


Hay una manera mucho más simple y más limpia de hacer esto que usar la reflexión o analizar algunas propiedades del sistema.

Como notó una vez que configura la configuración regional predeterminada en su aplicación, ya no tiene acceso a la configuración regional predeterminada del sistema. La Configuración regional predeterminada que configura en su aplicación es válida solo durante el ciclo de vida de su aplicación. Cualquier cosa que establezca en su Locale.setDefault (Locale) desaparece una vez que finaliza el proceso. Cuando la aplicación se reinicie, podrá volver a leer la configuración regional predeterminada del sistema.

Entonces, todo lo que necesita hacer es recuperar la configuración regional predeterminada del sistema cuando se inicia la aplicación, recordarla mientras la aplicación se ejecuta y actualizarla si el usuario decide cambiar el idioma en la configuración de Android. Debido a que necesitamos esa información solo mientras se ejecuta la aplicación, podemos simplemente almacenarla en una variable estática, a la que se puede acceder desde cualquier lugar de la aplicación.

Y así es como lo hacemos:

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();
    }

}

Al utilizar una Aplicación (no olvide definirla en su manifiesto) obtenemos la configuración regional predeterminada cuando se inicia la aplicación (onCreate ()) y la actualizamos cuando el usuario cambia el idioma en la configuración de Android (onConfigurationChanged (Configuration)). Eso es todo lo que hay. Siempre que necesite saber cuál era el idioma predeterminado del sistema antes de usar su llamada setDefault, sDefSystemLanguage le dará la respuesta.

Hay un problema que vi en tu código. Cuando configura la nueva configuración regional, lo hace:

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

Cuando lo hace, sobrescribe toda la información de configuración que desee conservar. P.ej. Configuration.fontScale refleja la configuración de accesibilidad de texto grande. Al configurar el idioma y perder toda la configuración, su aplicación ya no reflejaría la configuración de texto grande, lo que significa que el texto es más pequeño de lo que debería (si el usuario ha habilitado la configuración de texto grande). La forma correcta de hacerlo es:

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);

Entonces, en lugar de crear un nuevo objeto de Configuración, simplemente actualizamos el actual.


61
2018-05-09 04:10



Puede acceder a la configuración regional global mediante:

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

Echa un vistazo a http://developer.android.com/reference/android/content/res/Resources.html#getSystem () -

Devuelve un objeto de recursos compartidos global que proporciona acceso solo a los recursos del sistema (sin recursos de la aplicación)

Actualización: como se señaló en los comentarios, el campo 'configuración regional' está en desuso y debe usar getLocales () en lugar.

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


34
2018-05-08 09:59



La mejor forma de diseñar la aplicación es usar un idioma predeterminado, inglés en su caso, en valores / y puede agregar idiomas adicionales en valores-XX /. De esta manera, cuando un idioma no es compatible con Android, vuelva a su configuración predeterminada, por lo que inglés. Deje que el sistema operativo haga el trabajo por usted :) Sin embargo, sí, si cambia la configuración regional obtendrá la última configuración, por lo que debe guardar esa información en algún lugar.


7
2018-04-28 18:53



Como estás cambiando el  Application language programatically like 

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

Y

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.

Entonces, en lugar de eso, usa este código a continuación para obtener  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();
}

SALIDA:  Spanish  Mira esto

Espero que esto sea exactamente lo que estás buscando.


3
2018-05-08 02:24



Deberías usar String deviceLocale= Locale.getDefault().getDisplayLanguage(); para mostrar el idioma en lugar de

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

echa un vistazo a esta respuesta que puede ayudarte si arriba no lo hace. Clickable


1
2018-05-01 19:52



Aunque, la respuesta por @ user2944616 es políticamente correcto, eso no da una respuesta a la pregunta real planteada.

Por lo tanto, si realmente tuviera que conocer la configuración regional del sistema del usuario, utilizaría la reflexión (no conozco ninguna opción mejor 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";
    }
}

Con esa ubicación de dispositivo y local establecida en español (Estados Unidos) / Español (Estados Unidos) después de cadena

<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>

y este código

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)));
}

produce la siguiente pantalla:

System locale screenshot 

Si lo desea, uno también podría construir fácilmente Locale instancia utilizando lo anterior:

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

Salida de registro:

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

Espero que esto ayude.


1
2018-05-06 15:05



Para obtener la configuración regional del dispositivo, use esto

Locale current = context.getResources().getConfiguration().locale;

y current.toString() te devolverá "en" "ar", etc.


-1
2018-05-05 12:44