web-dev-qa-db-ja.com

Java 7デフォルトロケール

Jre7をインストールしたばかりで、デフォルトのロケールがen_USになっていることに驚いています。 jre6ではde_CHでした。

Jre7の違いは何ですか?デフォルトのロケールは、オペレーティングシステムの1つではありませんか? (ところで、私はWindows7を使用しています)

あなたの答えのためのThx。

編集:Category.FORMATのロケールは「古い」ロケール(de_CH)です。 Category.DISPLAYのロケールは、OSの言語(Windowsでは、コントロールパネル>地域と言語>キーボードと言語>表示言語で行われます)から言語を取得し、... ?

違うように見えるのは、プロパティ "ser.country"です。 Java6では「CH」、Java7では「US」になります。

24
Zardo

これは設計どおりです。 Java 7はLocale.getDefault()の動作を変更しました。Oracleに欠陥がありましたが、基本的には設計どおりです。

つまり、OSの表示言語を変更する必要があります。リージョンフォーマットのみを変更するだけでは不十分です。

ここでバグレポートをお読みください: Locale.getDefault()はJava SE 7 に対して間違ったロケールを返します

24
dream_team

変更については、この ブログ投稿 および 互換性ページ で詳しく説明しています。

Sun.locale.formatasdefaultシステムプロパティをtrueに設定すると、以前の動作に戻すことができます。

15
Jens Borgland

Java 7、つまりUIと「ユーザー」ロケールの違い)でロケールに関するいくつかの変更があるようです。 this を参照してください。 now があります= setDefault(Locale.Category, Locale)。ただし、これは実際に発生していることを説明するものではありません。ロケールの処理に関してJava 7に変更があったことを指摘しているだけです。

4
merryprankster

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;
}

}

2
Alex Kartishev

これは本当に私にとってバグのように見えます:

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

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

Java 5またはJava 6でこれを実行すると、「nl_NL」と表示されます。Java7:「en_US」

2
Johan Compagner

Windowsのコントロールパネルの[地域と言語のオプション]の設定[場所]を確認します(ドイツ語: "Region und Sprache"、 "Aufenthaltsort")。

0
stracktracer

あなたが十分に勇気があるなら、あなたは呼び出すことができます:

Locale.setDefault(Locale.getDefault());

これにより、これらのカテゴリの両方にデフォルトのロケールが設定されます

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

しかし、これはもちろん副作用を引き起こす可能性があります。

0
maryoush