¿Cuál es la forma correcta de crear locale -object en Java (por ejemplo, finlandés)

¿Alguien podría decirme por qué la configuración regional finlandesa no funciona y el resto sí?

private static Map<String,Object> countries;
    private static Locale finnishLocale = new Locale("fi", "FI");

static{
    countries = new LinkedHashMap<String,Object>();
    countries.put("English", Locale.ENGLISH); //label, value
    countries.put("French", Locale.FRENCH);
    countries.put("German", Locale.GERMAN);
    countries.put("Finnish", finnishLocale); <---------- Not working!
}

public void setLocaleCode(String localeCode) {


                this.localeCode = localeCode;
                updateLocale(localeCode);          


        }


public void updateLocale(String newLocale){

        String newLocaleValue = newLocale;

        //loop country map to compare the locale code
                for (Map.Entry<String, Object> entry : countries.entrySet()) {

               if(entry.getValue().toString().equals(newLocaleValue)){

                FacesContext.getCurrentInstance()
                    .getViewRoot().setLocale((Locale)entry.getValue());

              }
               }

        }

Quiero decir que la configuración regional que creé con New-clause no funciona. No puedo explicarlo mejor, porque pensé que la configuración regional implementada de esa manera es similar a un objeto Locale que, por ejemplo, Locale.GERMAN. Mi software no hace nada más que actualizar locale ja Faces context. No hay excepciones. Lo siento si la q es estupida. Todo lo demás funciona, me refiero a alemán, inglés, etc. y el programa actualiza la configuración regional y el contexto de Faces.

Te agradecería mucho si respondes a la pregunta, estoy perdido (otra vez) Sami

preguntado el 03 de mayo de 12 a las 19:05

"no funciona" no es un error de compilación o tiempo de ejecución que haya visto nunca. -

@house_no_name, me sorprende que no haya oído hablar de "NotWorkingException", es la clase principal de Exception, Error, UserStupidity, EndOfWorld et al. -

2 Respuestas

Tus updateLocale() método parece ser el culpable. estas comparando Locale#toString() en contra newLocale. Las Locale Las constantes tienen todo solo el conjunto de idiomas, no el país. Locale.ENGLISH.toString() por ejemplo vuelve "en" mientras new Locale("fi", "FI").toString() devoluciones "fi_FI". Eso sólo puede significar que su newLocale la variable realmente contiene "en", "fr", "de" y "fi". Los primeros tres coincidirían con las constantes, pero el último no coincidiría con el finnishLocale, porque estás comparando con su toString() en lugar de getLanguage().

Para solucionar su problema, ya sea cambiar

private static Locale finnishLocale = new Locale("fi", "FI");

a

private static Locale finnishLocale = new Locale("fi");

or, mejor, cambio Map<String, Object> a Map<String, Locale> y luego cambia

if(entry.getValue().toString().equals(newLocaleValue)){

a

if(entry.getValue().getLanguage().equals(newLocaleValue)){

Con todo, este bucle de mapas es bastante torpe. Si el newLocale es un valor controlado del lado del servidor, solo hazlo viewRoot.setLocale(new Locale(newLocale)) preferiblemente.

contestado el 03 de mayo de 12 a las 22:05

¡Muchas gracias, kiitos paljon! FacesContext.getCurrentInstance().getViewRoot().setLocale(new Locale(localeCode)); Esa fue una solución tan ordenada y limpia que me da vergüenza :) De 20 líneas de código a una... Hay mucho que aprender. sami - Sami

Tienes un error en otro lugar ya que esto funciona:

public class Runner01 {
private static Map<String,Object> countries;
private static Locale finnishLocale = new Locale("fi", "FI");

static{
    countries = new LinkedHashMap<String,Object>();
    countries.put("English", Locale.ENGLISH); //label, value
    countries.put("French", Locale.FRENCH);
    countries.put("German", Locale.GERMAN);
    countries.put("Finnish", finnishLocale); 
}

public static void main(String[] args) {
    for( Map.Entry<String, Object> entry : countries.entrySet() ) {
        System.out.println(entry.getKey() + "=>" + entry.getValue().toString());
    }
}


}

contestado el 03 de mayo de 12 a las 22:05

OK gracias. Intentaré solucionarlo. Estoy usando el setter directamente desde la página JSF así: - Sami

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.