【问题标题】:What is the correct way to create locale -object in Java (for instance Finnish)在 Java 中创建 locale -object 的正确方法是什么(例如芬兰语)
【发布时间】:2012-05-13 07:30:50
【问题描述】:

有人能告诉我为什么语言环境芬兰语不起作用而其他语言环境都起作用吗?

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.GERMAN 类似的语言环境对象?我的软件除了更新语言环境 ja Faces 上下文之外什么都不做。没有例外。对不起,如果q是愚蠢的。其他一切正常,我的意思是德语、英语等,并且程序会更新语言环境和 Faces 上下文。

如果您回答这个问题,我将非常感激,我迷路了(再次) 萨米人

【问题讨论】:

  • "not workin" 不是我见过的编译器或运行时错误。
  • @house_no_name,我很惊讶你没有听说过“NotWorkingException”,它是 Exception、Error、UserStupidity、EndOfWorld 等的父类。

标签: java jsf-2 localization locale facescontext


【解决方案1】:

您的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&lt;String, Object&gt;改成Map&lt;String, Locale&gt;再改

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

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

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

【讨论】:

  • 非常感谢,kiitos paljon! FacesContext.getCurrentInstance().getViewRoot().setLocale(new Locale(localeCode));这是一个如此整洁和干净的解决方案,我感到羞耻 :) 从 20 行代码到 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());
    }
}


}

【讨论】:

  • 好的,谢谢。我会尝试解决它。我直接从 JSF 页面使用 setter:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-22
  • 2016-04-20
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
相关资源
最近更新 更多