Java目線でコンパイラの仕組みをのぞいてみよう!

プログラマーの常識をJavaで身につける (5)

国際化プログラミングの常識


NTTデータ ビジネスブレインズ
伊賀敏樹
2007/5/2


ResourceBundleクラスの利用例

 これらのプロパティファイルをプログラムで利用すると、以下のようになります。

KotowazaSample.java
import java.util.MissingResourceException;
import java.util.ResourceBundle;

public class KotowazaSample {
    public static void main(final String[] args) {
        ResourceBundle bundle = null;
        try {
            bundle
                = ResourceBundle.getBundle("kotowaza"); //(1)

        } catch (MissingResourceException ex) {
            System.out.println("基底名[kotowaza]のリソース"
                + "バンドルの取得を試みましたが失敗しました。:"
                + ex.toString());
            return;
        }

        try {
            final String message
                = bundle.getString("MESSAGE1"); //(2)

            System.out.println("MESSAGE1: " + message);
        } catch (MissingResourceException ex) {
            System.out.println("キー[MESSAGE1]の定義が"
                + "取得できませんでした。:"
                + ex.toString());
        }

        try {
            final String message
                 = bundle.getString("MESSAGE2"); // (3)

            System.out.println("MESSAGE2: " + message);
        } catch (MissingResourceException ex) {
            System.out.println("キー[MESSAGE2]の定義が"
                + "取得できませんでした。:"
                + ex.toString());
        }

        try {
            final String message
                 = bundle.getString("MESSAGE3"); // (4)

            System.out.println("MESSAGE3: " + message);
        } catch (MissingResourceException ex) {
            System.out.println("キー[MESSAGE3]の定義が"
                + "取得できませんでした。:"
                + ex.toString());
        }
    }
}

 (1)の個所で(日本語環境で実行している場合には)kotowaza_ja.propertiesファイルから設定値を読み込みます。そして、(2)、(3)、(4)の個所でキーに対応する文字列を取得します。

実行結果

MESSAGE1: 急がば回れ。
MESSAGE2: 時は金なり。
MESSAGE3: 郷に入いっては郷に従え。

 プロパティファイル化された文字列を利用してプログラムが動作していることが確認できます。

すでに英語も対応しているので、試してみよう!

 さて実は、このプログラムはすでに英語化対応が実現できています。Eclipseからアプリケーションをロケール指定で実行するには、下記の手順を踏みます。

  1. [実行(R)]→[構成および実行(N)]メニューを選ぶ
  2. [引数]タブの[VM引数]にJavaコマンドのオプションを指定
図12 ロケール指定によるアプリケーション起動
図12 ロケール指定によるアプリケーション起動 (クリックすると画像が拡大します)

 ここで、前述のEclipseのロケール指定を行った起動方法と同様の内容を指定すると、ロケール指定を切り替えられます。

 ロケールを指定する[java.util.Locale]を使うと……

 次に、強制的に英語ロケールのプロパティファイルを読み込む例を示します。先ほどのソースコードKotowazaSample.javaを以下の桃色太字のように書き換えて実行してください。

KotowazaSample.javaの一部
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;

public class KotowazaSample {
    public static void main(final String[] args) {
        ResourceBundle bundle = null;
        try {
            bundle = ResourceBundle.getBundle("kotowaza"
                , Locale.ENGLISH); // (5)
        } catch (MissingResourceException ex) {
            System.out.println("基底名[kotowaza]のリソース"
                + "バンドルの取得を試みましたが失敗しました。:"
                + ex.toString());
            return;
        }
    }
}

実行結果

MESSAGE1: Slow and steady wins the race.
MESSAGE2: Time is money.
MESSAGE3: When in rome, do as the romans do.

 (5)の個所をご覧ください。Localeクラスを利用して、ロケールを明示的に英語として指定しています。ただし、強制的にロケールを指定することは、通常のプログラムでは、あまり必要がないと考えます。

 地域の時差を表す[java.util.TimeZone]

 java.util.Calendarと連動して動作する、時差を表すクラスとしてjava.util.TimeZoneクラスがあります(Calendarについては、前回の記事を参照ください。タイムゾーンに関する記載もあります)。

 いま使っているOSのタイムゾーンを取得するプログラムでTimeZoneクラスの動作を見てみましょう。

TimeZoneSample.java
import java.util.TimeZone;

public class TimeZoneSample {
    public static void main(final String[] args) {
        final TimeZone current = TimeZone.getDefault();
        System.out.println(current.getID());
        System.out.println(current.getDisplayName());
    }
}

実行結果

Asia/Tokyo
日本標準時

 OS上でタイムゾーンが日本として設定されていると、上記のように日本のタイムゾーンになっていることが確認できます。

 お金の情報が詰まっている[java.util.Currency]

 通貨も国や地域によって異なるものの1つです。Java APIには、通貨を表すクラスとしてjava.util.Currencyクラスがあります。このクラスを使って、通貨に関する情報を取得できます。

日本の通貨の情報を見てみよう

 日本の通貨の情報を取得するには、(6)のように Localeクラスを併用して記述します。

CurrencySample.java(日本)
import java.util.Currency;
import java.util.Locale;

public class CurrencySample {
    public static void main(final String[] args) {
        final Currency current
            = Currency.getInstance(Locale.JAPAN); // (6)

        System.out.println(current.getSymbol());
        System.out.println("デフォルトの小数点けた数:" +             current.getDefaultFractionDigits());
    }
}

実行結果


デフォルトの小数点けた数:0

なんと、米国の通貨には小数点が!

 米国の通貨を取得するには、(7)のように記述します。米国内では、小数点けた数が2けたと取得されることが確認できます。私たち日本の通貨においては、小数点以下は日常生活では利用しないので、あまり見慣れませんね。

CurrencySample.java(米国)
import java.util.Currency;
import java.util.Locale;

public class CurrencySample {
    public static void main(final String[] args) {
        final Currency current
             = Currency.getInstance(Locale.US); // (7)
        System.out.println(current.getSymbol());
        System.out.println("デフォルトの小数点けた数:" +             current.getDefaultFractionDigits());
    }
}

実行結果

USD
デフォルトの小数点けた数:2


フランスの通貨はちゃんとユーロになっている

 同じように、フランスの通貨を取得しましょう。(8)のように記述します。フランスでは、ユーロが利用されているのですね。

CurrencySample.java(フランス)
import java.util.Currency;
import java.util.Locale;

public class CurrencySample {
    public static void main(final String[] args) {
        final Currency current
             = Currency.getInstance(Locale.FRANCE); // (8)
        System.out.println(current.getSymbol());
        System.out.println("デフォルトの小数点けた数:" +             current.getDefaultFractionDigits());
    }
}

実行結果

EUR
デフォルトの小数点けた数:2

 なお、このCurrencyクラスはほとんどのJavaプログラマーは利用したことがないと思います。

 次回は、「文字」の常識について

 次回は、「文字」についての常識を取り上げます。java.lang.Stringクラス、java.lang.Characterクラスで学ぶ文字列の概念や操作、パッケージjava.util.regexのクラスで学ぶ正規表現、今回の「国際化プログラミング」にも関係がある、パッケージjava.nio.charsetのクラスで学ぶ文字コードの基礎知識、Javaで使える文字エンコードの種類などについて学んでいきましょう。

@IT関連記事

Eclipseプラグインを国際化しよう
Eclipseプラグイン実践テクニック(1) Eclipseプラグイン作成の基礎を理解しても、現場で活用するには実践のためのノウハウが必要だ。本連載で応用力を身につけよう
Java Solution」フォーラム 2006/8/26
Javaのクラスライブラリを攻略「ユーティリティ編」
[連載]基礎から学ぶサーブレット/JSP(8) 
国際化機能や配列、正規表現のクラスを学び、実際的なアプリケーション作成のための基礎をつくります

Java Solution」フォーラム 2003/9/9
国際化対応アプリケーションの作成
Strutsを使うWebアプリケーション構築術(7) 最終回はアプリケーションの国際化対応を行います。ブラウザの言語設定で、自動的に表示言語が切り替わるようになります
Java Solution」フォーラム 2004/7/31

3/3

 Index
第5回 国際化プログラミングの常識
  Page1
実は、身近なところにある国際化対応プログラム
  デフォルト設定でEclipseを起動してみると
  Eclipseを「英語―米国」と設定して起動するには?
  ワンポイント 「エディタによって改行コードの扱いは違う」
  Eclipseを「フランス語―フランス」と設定して起動
  起動オプションによって言語や地域を切り替える
  ISOの言語コードと国コード
  Page2
Javaプログラミングの国際化について
  Javaの国際化の概要
  国際化は「ほどほど」に!
  文字列をソースコードから外部ファイルへ抽出[java.util.ResourceBundle]
プロパティファイルを使った国際化[java.util.ResourceBundle
  国際化したpropertiesファイルを作る
  Page3
  ResourceBundleクラスの利用例
  すでに英語も対応しているので、試してみよう!
ロケールを指定する[java.util.Locale]を使うと……
地域の時差を表す[java.util.TimeZone]
お金の情報が詰まっている[java.util.Currency]
  日本の通貨の情報を見てみよう
  なんと、米国の通貨には小数点が!
  フランスの通貨はちゃんとユーロになっている
次回は、「文字」の常識について


プロフィール
伊賀 敏樹(いが としき)
ハンドル:いがぴょん

1968年生まれ。現在、NTTデータ ビジネスブレインズ 第一SI事業部 ソリューショングループ所属。システム開発の技術支援などに従事する。仕事におけるJava言語とのかかわりは1998年から。 現在 blanco Frameworkというオープンソースによるソースコード自動生成タイプの開発フレームワーク提供に取り組んでいる。 趣味はヴァイオリン演奏。アマチュアオーケストラで演奏することもある。

ホームページ
いがぴょんの日記ウェブページv2(1996年から続けているWeb日記)

所属団体
blanco Framework(コミッタ)

主な著書
やさしく学ぶ基礎からのJDBC
Javaプログラミング[アプリケーション編]ステップアップラーニング





ご意見、ご感想はJava Solution 会議室へどうぞ


Java Solution全記事一覧



TechTargetジャパン

Java Solution フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ

- PR -
@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る
- PR -

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH