在Java中创建locale -object的正确方法是什么(例如芬兰语)

时间:2012-05-03 18:23:03

标签: java jsf-2 localization locale facescontext

有人可以告诉我为什么芬兰语的地方不起作用,剩下的就是吗?

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

              }
               }

        }

我的意思是我用New-clause创建的语言环境不起作用。我无法更好地解释它,因为我认为像这样实现的Locale类似于Locale-object而不是Locale.GERMAN?我的软件除了更新区域设置ja Faces上下文之外没有做任何其他事情。没有例外。对不起,如果q是愚蠢的。其他一切都在起作用,我的意思是德语,英语等,程序会更新语言环境和Faces上下文。

如果你回答这个问题,我将非常感激,我很遗憾(再次) 萨米

2 个答案:

答案 0 :(得分:4)

您的updateLocale()方法似乎是罪魁祸首。您将Locale#toString()newLocale进行了比较。 Locale常量只有语言集,而不是国家。例如Locale.ENGLISH.toString()会返回"en"new Locale("fi", "FI").toString()会返回"fi_FI"。这只能意味着您的newLocale变量实际上包含"en""fr""de""fi"。前三个匹配常量,但后者与finnishLocale不匹配,因为您要与toString()而不是getLanguage()进行比较。

要解决您的问题, 更改

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

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

,更好的是,将Map<String, Object>更改为Map<String, Locale>然后更改

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

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

总而言之,这个地图循环相当笨拙。如果newLocale是服务器端控制的值,则只需执行viewRoot.setLocale(new Locale(newLocale))

答案 1 :(得分:2)

在其他地方你有错误,因为这有效:

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


}