Java 7默认语言环境

时间:2011-08-18 13:13:27

标签: java windows windows-7 locale java-7

我刚刚安装了jre7,我很惊讶地看到我的默认语言环境现在是en_US。有了jre6,它就是de_CH。

与jre7有什么不同?默认语言环境不再是操作系统之一吗? (顺便说一下,我正在使用Windows7)

谢谢你的回答。

编辑: 我已经看到 Category.FORMAT 的区域设置是“旧”区域(de_CH)。 Category.DISPLAY 的区域设置采用操作系统语言的语言(在Windows中,这是在控制面板>区域和语言>键盘和语言>显示语言中完成)和来自的...?

属性“ user.country ”似乎有所不同。使用Java6,我得到“CH”,而使用Java7,我得到“US”。

7 个答案:

答案 0 :(得分:22)

这是按照设计的。 Java 7改变了Locale.getDefault()的工作方式。 Oracle已经输入了一个缺陷,但他们基本上都说这是设计的。

总之,您必须修改操作系统的显示语言。仅修改区域格式已不再足够。

在此处阅读错误报告:Locale.getDefault() returns wrong Locale for Java SE 7

答案 1 :(得分:14)

blog postcompatibility page

中对此更改进行了详细介绍

请注意,您可以通过将sun.locale.formatasdefault系统属性设置为true来恢复旧行为。

答案 2 :(得分:4)

Java 7中的Locale似乎有一些变化,即UI和“用户”语言环境之间的区别。见this。有now setDefault(Locale.Category, Locale)。但是,这并没有真正解释您所遇到的问题 - 我只是指出Java 7中有关于语言环境处理的更改。

答案 3 :(得分:2)

这对我来说真是个错误:

public static void main(String[] args) throws FileNotFoundException, IOException {

System.err.println(Locale.getDefault());
}

使用java 5或java 6打印:'nl_NL' java7:'en_US'

答案 4 :(得分:2)

如何以下列方式在程序开头设置Locale,具体取决于java版本:

public class LocaleFormatter {

private static Locale locale;

private LocaleFormatter() {

}

public static Locale setDefaultLocale() {
    if (locale == null) {
        if (!System.getProperty("java.version").startsWith("1.7.")) {
            locale = Locale.getDefault();
        } else {
            try {
                Class localeClass = Class.forName("java.util.Locale");
                Class categoryClass = Class.forName("java.util.Locale$Category");
                Object format = null;
                for (Object constant : categoryClass.getEnumConstants()) {
                    if (constant.toString().equals("FORMAT")) {
                        format = constant;
                    }
                }
                Method method = localeClass.getMethod("getDefault", categoryClass);

                locale = (Locale) method.invoke(Locale.getDefault(), format);
                Locale.setDefault(locale);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }
    return locale;
}

}

答案 5 :(得分:0)

检查Windows控制面板中的“位置”设置区域和语言选项(德语:“Region und Sprache”,“Aufenthaltsort”)。

答案 6 :(得分:0)

如果你足够勇敢,你可以致电:

Locale.setDefault(Locale.getDefault());

这会为这两个类别设置默认区域设置

public static synchronized void setDefault(Locale newLocale) {
   setDefault(Category.DISPLAY, newLocale);
   setDefault(Category.FORMAT, newLocale);
   defaultLocale = newLocale;
}

但这当然会引起副作用。

相关问题