我刚刚安装了jre7,我很惊讶地看到我的默认语言环境现在是en_US。有了jre6,它就是de_CH。
与jre7有什么不同?默认语言环境不再是操作系统之一吗? (顺便说一下,我正在使用Windows7)
谢谢你的回答。
编辑: 我已经看到 Category.FORMAT 的区域设置是“旧”区域(de_CH)。 Category.DISPLAY 的区域设置采用操作系统语言的语言(在Windows中,这是在控制面板>区域和语言>键盘和语言>显示语言中完成)和来自的...?
属性“ user.country ”似乎有所不同。使用Java6,我得到“CH”,而使用Java7,我得到“US”。
答案 0 :(得分:22)
这是按照设计的。 Java 7改变了Locale.getDefault()
的工作方式。 Oracle已经输入了一个缺陷,但他们基本上都说这是设计的。
总之,您必须修改操作系统的显示语言。仅修改区域格式已不再足够。
在此处阅读错误报告:Locale.getDefault() returns wrong Locale for Java SE 7
答案 1 :(得分:14)
请注意,您可以通过将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;
}
但这当然会引起副作用。