Android obtiene el idioma 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.
- Cómo obtener el código de idioma IETF BCP47 en la API de Android <21
- Cambiar la configuración regional, pero mantener orientaciones de izquierda a derecha y de otros teléfonos
- Android Cómo instalar los locales instalados del sistema
- ¿Por qué podría Resources.getString () devolver intermitentemente cadenas de la configuración regional equivocada?
- ¿Cómo puedo obtener mi código de país del dispositivo android sin usar GPS?
Pero por ejemplo decir que si no apoyo el idioma del dispositivo: por ejemplo español.
Puse el locale actual al 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 compruebo la configuración del dispositivo de esta manera:
String deviceLocale=Locale.getDefault().getLanguage();
Consigo el resultado como "inglés". Pero el idioma del dispositivo es el español.
¿GetLanguage () da el locale 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 del dispositivo después de guardar, no puedo conocer la nueva configuración regional del dispositivo. Sólo puedo conocer el entorno local que guardé en la instalación de la aplicación.
- Android 7.0 Nougat recoge cadenas predeterminadas cuando el idioma del dispositivo es en_US
- Configuración de la configuración regional en Android
- Obtener el nombre del idioma en ese idioma desde el código de idioma
- Comprobación de configuración regional de la matriz de cadenas de Android
- Número en árabe en texto árabe en Android
- Cómo forzar el lenguaje en la aplicación android
- Cómo configurar el texto del cuadro de diálogo de google api en el idioma predeterminado de la aplicación
- Lenguaje hindi
Hay una manera mucho más sencilla y más limpia de hacer esto que usar la reflexión o analizar algunas propiedades del sistema.
Como has notado una vez que estableces la configuración regional predeterminada en tu aplicación, ya no tienes acceso a la configuración regional predeterminada del sistema. La configuración regional predeterminada que establezca en su aplicación sólo es válida durante el ciclo de vida de la aplicación. Cualquier cosa que establezca en su Locale.setDefault (Locale) se ha ido una vez que el proceso se termina. Cuando se reinicie la aplicación, podrá volver a leer la configuración regional predeterminada del sistema.
Así que todo lo que necesitas hacer es recuperar la configuración predeterminada del sistema cuando se inicia la aplicación, recordarla mientras la aplicación se ejecute y actualizarla si el usuario decide cambiar el idioma en la configuración de Android. Debido a que necesitamos esa información solo mientras la aplicación se ejecute, podemos simplemente almacenarla en una variable estática, la cual es accesible desde cualquier lugar de la aplicación.
Y aquí es cómo 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(); } }
Usando una aplicación (no olvide definirla en su manifiesto) obtendremos la configuración regional predeterminada cuando se inicie 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 utilizar su llamada setDefault, sDefSystemLanguage le dará la respuesta.
Hay un problema que detecté en tu código. Cuando establezca la nueva configuración regional:
Configuration config = new Configuration(); config.locale = locale; pContext.getResources().updateConfiguration(config, null);
Al hacerlo, sobrescribirá toda la información de configuración que desee conservar. Por ejemplo, Configuration.fontScale refleja los Ajustes de accesibilidad Texto grande. Al configurar el idioma y perder toda otra configuración, su aplicación ya no reflejaría los ajustes de texto grande, lo que significa que el texto es más pequeño de lo que debería ser (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);
Así que en lugar de crear un nuevo objeto Configuration simplemente actualizamos el actual.
Puede acceder al entorno global por –
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 sólo a los recursos del sistema (sin recursos de la aplicación)
Actualización: Como se ha señalado en el campo "locale" de los comentarios, está obsoleto y necesitas usar getLocales () .
defaultLocale = Resources.getSystem().getConfiguration().getLocales().get(0);
La mejor manera de diseñar la aplicación es usar un idioma predeterminado, inglés en su caso, bajo valores / y puede agregar idiomas adicionales bajo valores-XX /. De esta manera cuando un idioma no es compatible con Android fallback a su valor predeterminado, por lo que Inglés. Deje que el sistema operativo haga el trabajo para usted 🙂 Sin embargo, sí, si cambia el entorno local obtendrá su última configuración, por lo que tiene que guardar esa información en alguna parte.
A medida que cambia el Application language programatically like
la 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.
Así que en lugar de usar este código a continuación para obtener el 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
Espero que esto exactamente lo que buscas.
Debe 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 ayudarle si arriba no. Clicable
Aunque, la respuesta por @ user2944616 es políticamente correcta, que no da una respuesta a la pregunta real planteada.
Por lo tanto, si realmente tenía que conocer el sistema de configuración de usuario del sistema, me gustaría utilizar la reflexión (no sé 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 configuración de idioma dada y de dispositivo 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>_<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))); }
Rendimientos pantalla siguiente:
Si se desea, también se puede construir fácilmente la instancia de Locale
usando 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.
Para aquellos que están usando la última solución de Amit Gupta
, que es:
Process exec = Runtime.getRuntime().exec(new String[]{"getprop", "persist.sys.language"}); String locale = new BufferedReader(new InputStreamReader(exec.getInputStream())).readLine(); exec.destroy();
Tenga en cuenta que la localidad podría estar VACÍA en la última versión de Android Api! En lugar de usar persist.sys.language
use persist.sys.locale
exec = Runtime.getRuntime().exec(new String[]{"getprop", "persist.sys.locale"}); locale = new BufferedReader(new InputStreamReader(exec.getInputStream())).readLine(); exec.destroy();
Para obtener la configuración regional del dispositivo utilice esta
Locale current = context.getResources().getConfiguration().locale;
Y current.toString()
le devolverá "en" "ar", etc