Caso de uso: Registro de mensajes de error que se muestra al usuario.

Sin embargo, usted no desea que los mensajes en el log que dependen de la configuración regional del usuario del dispositivo.
Por otro lado usted no desea cambiar la configuración regional del usuario del dispositivo para su (técnica) de registro.
Se consigue esto?
He encontrado un par de posibles soluciones aquí en stackoverflow:

Sin embargo, todos ellos como resultado el cambio de la configuración regional de mi dispositivo (hasta el siguiente cambio de configuración).

De todos modos, mi solución actual es así:

public String getStringInDefaultLocale(int resId) {
    Resources currentResources = getResources();
    AssetManager assets = currentResources.getAssets();
    DisplayMetrics metrics = currentResources.getDisplayMetrics();
    Configuration config = new Configuration(
            currentResources.getConfiguration());
    config.locale = DEFAULT_LOCALE;
    /*
     * Note: This (temporiarily) changes the devices locale! TODO find a
     * better way to get the string in the specific locale
     */
    Resources defaultLocaleResources = new Resources(assets, metrics,
            config);
    String string = defaultLocaleResources.getString(resId);
    //Restore device-specific locale
    new Resources(assets, metrics, currentResources.getConfiguration());
    return string;
}

Para ser honesto, no me gusta este enfoque en todos. No es eficiente y pensamiento acerca de la concurrencia y todo lo que podría resultar en algún punto de vista en el «mal» de la configuración regional.

Así – ¿Alguna idea? Tal vez esto podría lograrse mediante Un resourcebundles, al igual que en Java estándar?

  • Hola, ¿tienes alguna solución? Yo también tengo casi el mismo caso de uso.
  • No, todavía estoy con la solución indicada en la pregunta
  • por qué no usar un inglés basados en cadena para su registro de propósito. R. string.dev_error_clicking_button_b. Si no traducirlo a otros idiomas (y no se necesita) obtendrá por defecto.
  • gracias por tu idea, pero ¿cómo saben las cadenas no traducidas? Estoy buscando un mecanismo genérico para registrar todo lo que era de alguna manera que se muestra al usuario
InformationsquelleAutor schnatterer | 2013-07-21

4 Comentarios

  1. 22

    Usted puede usar esto para API +17

    @NonNull
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
    public static String getStringByLocal(Activity context, int id, String locale) {
        Configuration configuration = new Configuration(context.getResources().getConfiguration());
        configuration.setLocale(new Locale(locale));
        return context.createConfigurationContext(configuration).getResources().getString(id);
    }

    De actualización (1) : Cómo apoyar a las versiones antiguas.

    De actualización (2): Consulte este artículo

    • Puedo comprobar que esto funciona sin cambiar la configuración regional actual. Resuelto en la última! Al menos para la API 17+ 😉
    • Usted puede asegurarse de comprobación de versión de compilación para apoyar la versión antigua if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) return getStringByLocal(context, resId, locale); else return getStringByLocalBefore17(context, resId, locale);
    • por este método necesitas texto a todos los textviews manualmente. Hay alguna posibilidad de que no vaya en esta agitada de trabajo de configuración de texto?
  2. 3

    Usted puede guardar todas las cadenas de la configuración regional predeterminada en un Map dentro de una clase global, como Application que se ejecuta al iniciar la aplicación:

    Esta solución no es óptima, pero no tendrá problemas de simultaneidad.

    • Gracias por proponer otra forma de evitar! Que es un trade-off: Sin problemas de concurrencia vs mayor uso de memoria, y más lento en el arranque de la aplicación. Sin embargo, para mi caso de uso específico no necesito los recursos de la mayoría de las veces (sólo para registro de errores/excepciones). Por lo tanto la creación de un mapa y de mantener en la memoria en cada inicio parece un poco demasiado esfuerzo aquí.
    • Esto dependerá de cómo muchos de los recursos de cadena en realidad se está utilizando para los errores/excepciones. Si el subconjunto es pequeño, tal vez se puede vivir con ella. Otro enfoque (trabajo alrededor de enfoque :D) sería temporal de ahorro de estos recursos en un archivo tmp, y acceder a ellos en demanda. Sin el uso de la memoria con este enfoque, y que pueden adaptarse a sus necesidades, supongo.
    • Realmente son creativas cuando se trata de encontrar soluciones! +1 por que 😉 Gracias por tu esfuerzo – sin embargo, todavía estoy esperando que alguien enciende con una no-solución
  3. -2

    Intente esto:

    • Me estoy perdiendo algo, o no hay diferencia entre su enfoque y el de la pregunta? Si ejecuta new Resources(getAssets(), getResources().getDisplayMetrics(), getResources().getConfiguration()).getString(R.string.app_name); de la cadena ser en árabe, incluso si su dispositivo es el idioma era diferente antes! Estoy buscando una solución para el siguiente caso de uso: el dispositivo está en que permite decir de los Chinos, pero el registro debe imprimir el valor predeterminado (por ejemplo, inglés) mensaje.
    • Tenga cuidado de llamadas new Resources cambios en la configuración de la AssetManager. Esto causará problemas en el futuro no relacionados secciones de código. Ver este question y respuesta para los problemas que puede causar.

Dejar respuesta

Please enter your comment!
Please enter your name here