Язык Java 7 по умолчанию
Я только что установил jre7, и я удивлен, увидев, что мой стандарт по умолчанию теперь en_US. С jre6 это было de_CH.
Чем отличается jre7? Является ли стандартная локаль не более одной операционной системой? (Кстати, я использую Windows7)
спасибо для вашего ответа.
Изменить:
Я видел, что Locale для Category.FORMAT является "старым" (de_CH). Язык для Category.DISPLAY берет язык с языка ОС (в Windows это делается в Панели управления > Регион и язык > Клавиатура и языки > Язык отображения), а контировка от...
Похоже, что это другое свойство user.country. С Java6 я получаю "CH", а с Java7 я получаю "US".
Ответы
Ответ 1
Это так же хорошо. Java 7 изменила способ работы Locale.getDefault()
. Дефект был введен с Oracle, но в основном они сказали, что это As Designed.
Подводя итог, вы должны изменить язык отображения ОС. Изменение формата Region уже недостаточно.
Прочтите отчет об ошибке здесь: Locale.getDefault() возвращает неверный язык для Java SE 7
Ответ 2
Это изменение описано довольно хорошо в этом сообщении и на страница совместимости.
Обратите внимание, что вы можете вернуться к старому поведению, установив системное свойство sun.locale.formatasdefault
в true
.
Ответ 3
Кажется, что некоторые изменения касаются Locale в Java 7, а именно различия между пользовательским интерфейсом и пользовательским языком. См. это. Теперь setDefault(Locale.Category, Locale)
. Однако это не объясняет, что вы испытываете - я просто указываю на то, что в Java 7 произошли изменения в отношении обработки локали.
Ответ 4
Это действительно похоже на ошибку:
public static void main(String[] args) throws FileNotFoundException, IOException {
System.err.println(Locale.getDefault());
}
запуск этого с помощью java 5 или java 6 prints: 'nl_NL'
java7: 'en_US'
Ответ 5
Как настроить языковой стандарт в начале программы следующим образом, в зависимости от версии 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;
}
}
Ответ 6
Проверьте настройку "Местоположение" в панели управления Windows. Региональные и языковые параметры (немецкий: "Region und Sprache", "Aufenthaltsort" ).
Ответ 7
Если вы достаточно храбры, вы можете вызвать:
Locale.setDefault(Locale.getDefault());
Это устанавливает локаль по умолчанию для обеих категорий
public static synchronized void setDefault(Locale newLocale) {
setDefault(Category.DISPLAY, newLocale);
setDefault(Category.FORMAT, newLocale);
defaultLocale = newLocale;
}
Но это, конечно, может вызвать побочные эффекты.