Язык 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;
}

Но это, конечно, может вызвать побочные эффекты.