Javaのリソースデータ (4)

今回は、リソースバンドルに関連して、ロケールついて書きます。
前回: id:simply-k:20100721:1279748122
次回: id:simply-k:20100728:1280297651
目次: id:simply-k:20100728:1280299110

ロケールの概要

Localeクラス

Localeクラスのオブジェクトは、次の3つの項目を保持する。

  • 言語コード
    ISO-639で定義される、2桁の小文字 (ja、enなど)
  • 国コード
    ISO-3166で定義される、2桁の大文字 (JP、USなど)
  • バリアント
    ベンダーまたはブラウザに固有のコード (WIN、MACPOSIXなど) *1

Localeクラスでは、一部の言語や国に対して、次のような定数が定義されている。

  • 言語を表す定数 (JAPANESE、ENGLISH、FRENCHなど)
    言語コードのみが設定されたLocaleオブジェクト
  • 国を表す定数 (JAPAN、US、UKなど)
    国コードと国に対するデフォルトの言語コードが設定されたLocaleオブジェクト
  • ルートロケール表す定数 (ROOT)
    言語コード、国コード、バリアントが、全てブランクに設定されたLocaleオブジェクト

Locale#toString()は、言語コード、国コード、バリアントをアンダースコア(_)でつないだ文字列を返す。

  • ja_JP、en_USなど
  • リソースバンドル名の最後の部分と同じ形式
  • Unix/Linux環境変数LANGの最初の部分と同じ形式
デフォルトロケールの取得

デフォルトロケールの取得には、2種類の方法がある。

  • System#getProperties()を使う。*2
    プログラム内では変更不可。(javaコマンドのオプションで変更することは可能。)
  • Locale#getDefault()を使う。
    プログラム内で変更可能。(Locale#setDefault()を使って変更する。)
デフォルトロケールの設定

デフォルトロケールの設定には、2種類の方法がある。

  • javaコマンドの「-D」オプションで、システムプロパティを設定する。
    java -Duser.language=ja -Duser.country=JP ...
  • Locale#setDefault()を使う。(ただし、System#getProperties()が返す値は変更できない。)
デフォルトロケールの取得と設定に関するサンプルコード

サンプルコード

import java.util.Properties;
import java.util.Locale;

public class Main {
    
    public static void main(String[] args) {
        
        printSystemPropsLocale("System#getProperties() [1]");
        printDefaultLocale("Locale#getDefault() [1]");
        
        Locale.setDefault(Locale.US); //デフォルトロケールの変更
        
        printSystemPropsLocale("System#getProperties() [2]");
        printDefaultLocale("Locale#getDefault() [2]");
        
    }
    
    //システムプロパティから取得した言語コード、国コード、バリアントを出力する。
    public static void printSystemPropsLocale(String testName) {
        final Properties props = System.getProperties();
        
        System.out.println(testName);
        System.out.println("language: " + props.getProperty("user.language"));
        System.out.println("country: " + props.getProperty("user.country"));
        System.out.println("variant: " +  props.getProperty("user.variant"));
        System.out.println();
    }
    
    //デフォルトロケールから取得した言語コード、国コード、バリアントを出力する。
    public static void printDefaultLocale(String testName) {
        final Locale locale = Locale.getDefault();
        
        System.out.println(testName);
        System.out.println("language: " + locale.getLanguage());
        System.out.println("country: " + locale.getCountry());
        System.out.println("variant: " +  locale.getVariant());
        System.out.println();
    }
}


実行結果 (日本語環境で実行した場合)

System#getProperties() [1]
language: ja
country: JP
variant: 

Locale#getDefault() [1]
language: ja
country: JP
variant: 

System#getProperties() [2]
language: ja
country: JP
variant: 

Locale#getDefault() [2]
language: en
country: US
variant: 


次の事が確認できた。

  • Locale#setDefault()により、Locale#getDefault()が返すデフォルトロケールが変更された。
  • Locale#setDefault()を使っても、System#getProperties()が返す値は変更されない。


前回: id:simply-k:20100721:1279748122
次回: id:simply-k:20100728:1280297651
目次: id:simply-k:20100728:1280299110

*1:リソースバンドルとの連携では、あまり使われません。

*2:Localeオブジェクトが必要な場合は、取得した文字列から生成する必要がある。