java android localization locale globalization

java - Android cambia y establece la configuración regional predeterminada dentro de la aplicación



localization locale (1)

Estoy trabajando en la globalización de la aplicación de Android. Tengo que proporcionar opciones para elegir diferentes locales desde la aplicación. Estoy usando el siguiente código en mi actividad (HomeActivity) donde ofrezco la opción de cambiar la configuración regional

Configuration config = new Configuration(); config.locale = selectedLocale; // set accordingly // eg. if Hindi then selectedLocale = new Locale("hi"); Locale.setDefault(selectedLocale); // has no effect Resources res = getApplicationContext().getResources(); res.updateConfiguration(config, res.getDisplayMetrics());

Esto funciona bien siempre que no haya cambios en la configuración, como la rotación de la pantalla, donde la configuración regional se establece de manera predeterminada a la configuración regional del sistema Android en lugar de la configuración regional establecida por el código.

Locale.setDefault(selectedLocale);

Una solución en la que puedo pensar es persistir en la configuración regional seleccionada por el usuario utilizando SharedPreferences y en el método onCreate () de cada actividad tener la configuración regional establecida en la configuración regional persistente a medida que se llama onCreate () una y otra vez para cada cambio de configuración. ¿Hay alguna forma mejor de hacerlo para que no tenga que hacerlo en todas las actividades?

Básicamente, lo que quiero es que: una vez que cambie / establezca alguna configuración regional en mi actividad de inicio, quiero que todas las actividades dentro de mi aplicación utilicen esa configuración regional independientemente de cualquier cambio de configuración ... a menos que se cambie a otra configuración regional HomeActivity de la aplicación que proporciona opciones para cambiar la configuración regional.


Aunque la solución indicada en esta respuesta funciona en el caso general, me encontré agregando a mi pantalla de preferencias:

<activity android:name="com.example.UserPreferences" android:screenOrientation="landscape" android:configChanges="orientation|keyboardHidden|screenSize"> </activity>

Esto se debe a que cuando la aplicación está en modo horizontal y la pantalla de preferencias en modo vertical, cambiar la configuración regional y volver a la aplicación puede causar problemas. Configurar ambos para estar en modo horizontal evita que esto suceda.

Solución general

Debe cambiar la configuración regional en el nivel de aplicación, de modo que sus efectos estén en todas partes.

public class MyApplication extends Application { @Override public void onCreate() { updateLanguage(this); super.onCreate(); } public static void updateLanguage(Context ctx) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx); String lang = prefs.getString("locale_override", ""); updateLanguage(ctx, lang); } public static void updateLanguage(Context ctx, String lang) { Configuration cfg = new Configuration(); if (!TextUtils.isEmpty(lang)) cfg.locale = new Locale(lang); else cfg.locale = Locale.getDefault(); ctx.getResources().updateConfiguration(cfg, null); } }

Entonces en tu manifiesto tienes que escribir:

<application android:name="com.example.MyApplication" ...> ... </application>