3

[国]ドロップダウンにデータを入力するために、JVMからすべてのロケールを取得しようとしています。最初の項目は、nullではなく空のオブジェクトです。TreeMapコレクションを使用して国の略語と(表示可能な)名前を追加しているため、nullではありません。コレクションが何であるかを確認するには、以下をご覧ください。

{=, AE=United Arab Emirates, AL=Albania, AR=Argentina, AT=Austria, AU=Australia, BA=Bosnia and Herzegovina, BE=Belgium, BG=Bulgaria, BH=Bahrain, BO=Bolivia, BR=Brazil,....

これがコードです。その空のオブジェクトを削除して、最初の値が空でないことを確認します。

public Map<String, String> countries(Locale currentLocale) {
    Map<String, String> countries = new TreeMap<String, String>();
    for (Locale locale : Locale.getAvailableLocales()) {
        countries.put(locale.getCountry(),
                locale.getDisplayCountry(currentLocale));
    }
    countries.remove("");
    return countries;
}

JVMバージョン-(ビルド1.7.0_09-b05)

4

3 に答える 3

4

javadocsは基本的にこれをカバーしています。

locale.getCountry()あなたが見つけるために:

このロケールの国/地域コードを返します。これは、空の文字列、大文字のISO 3166 2文字コード、またはUNM.493桁のコードのいずれかである必要があります。

そしてlocale.getDisplayCountry()あなたが見つけるために:

ユーザーへの表示に適したロケールの国の名前を返します。可能であれば、返される名前はデフォルトのロケールにローカライズされます。たとえば、ロケールがfr_FRで、デフォルトのロケールがen_USの場合、getDisplayCountry()は「France」を返します。ロケールがen_USで、デフォルトのロケールがfr_FRの場合、getDisplayCountry()は「Etats-Unis」を返します。返された名前をデフォルトのロケールにローカライズできない場合(たとえば、クロアチアの日本語名がない場合)、この関数は英語名にフォールバックし、ISOコードを最後の手段の値として使用します。ロケールで国が指定されていない場合、この関数は空の文字列を返します。

あなたが「見る」ことができないものはISOコードを持っておらず、あなたのロケールにローカライズすることができず、英語の名前も持っていない(または国を持っていない)のでそれにフォールバックしています指定)。両方に空の文字列を使用することは完全に有効です(ただし、かなり役に立たない)。

于 2012-12-30T07:33:49.273 に答える
3

問題のロケールは、 Locale.ROOTに他なりません。locale == Locale.ROOT私の側では、同じことがあなたにも当てはまると思います。

なぜLocale.ROOT存在するのですか?http://www.oracle.com/technetwork/java/javase/java8locales-2095355.htmlによると:

指定されたロケールプロバイダーのいずれも要求されたロケールをサポートしていない場合、Locale.ROOTロケールのデフォルトの「JRE」ロケールプロバイダーのリソースが使用されます。たとえば、「java.locale.providers」システムプロパティで「CLDR」のみが指定されている場合、「CLDR」ロケールプロバイダーはCollat​​orロケールデータを提供しないため、Collat​​orはROOTロケールに対して要求されたかのように機能します。「CLDR、JRE」を指定すると、「JRE」ロケールプロバイダーのCollat​​or機能が補完され、「CLDR」ロケールプロバイダーの他のロケールデータが「JRE」のものよりも優先されます。

于 2015-09-01T04:52:32.273 に答える
0

試す

    for (Locale locale : Locale.getAvailableLocales()) {
        System.out.println(locale.getLanguage() + " " + locale.getCountry());
    }

一部のロケールには言語のみがあり、国はありません。

ms MY
ar QA
is IS
fi FI
pl 
en MT
...
于 2012-12-30T07:24:03.617 に答える