Java 7默认语言环境

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

与jre7有什么不同? 缺省语言环境不再是操作系统的一个吗? (顺便说一下,我使用Windows7)

Thx为您的答案。

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

看起来不同的是“ user.country ”属性。 随着Java6我得到“CH”和Java7我得到“美国”。

Solutions Collecting From Web of "Java 7默认语言环境"

这是设计的。 Java 7改变了Locale.getDefault()工作方式。 甲骨文已经进入了一个缺陷,但他们基本上说这是As Designed。

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

在这里阅读错误报告: Locale.getDefault()为Java SE 7返回错误的Locale

在这个博客文章和兼容性页面中 ,这个改变被描述得非常好。

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

Java 7中的区域设置似乎有一些变化,即UI和“用户”区域设置之间的区别。 看到这个 现在有 setDefault(Locale.Category, Locale) 但是,这并不能真正解释你正在经历的事情 – 我只是指出了Java 7在语言环境处理方面的变化。

这真的看起来像一个错误给我:

 public static void main(String[] args) throws FileNotFoundException, IOException { System.err.println(Locale.getDefault()); } 

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

如何在程序开始时按照以下方式设置您的语言环境,具体取决于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; } 

}

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

如果你足够勇敢,你可以打电话给:

 Locale.setDefault(Locale.getDefault()); 

这为这两个类别设置了默认的语言环境

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

但是这当然会造成副作用。