連載
» 2007年05月02日 00時00分 公開

プログラマーの常識をJavaで身につける(5):国際化プログラミングの常識 (2/3)

[伊賀敏樹,NTTデータ ビジネスブレインズ]

Javaプログラミングの国際化について

 それでは、Javaの国際化に関する情報を見ていきましょう。Javaにとっての一次情報源であるサン・マイクロシステムズ提供のドキュメントに、Javaの国際化に関する有益な情報が記載されていますので、こちらを見ていきます。

編集部注一次情報源の重要性については、連載第1回 の「プログラマーがAPIに向き合ううえでの常識」をご参照ください

 サン・マイクロシステムズからさまざまな情報が提供されていますが、ドキュメントが日本語訳されているものとしては以下の2点がよくまとまっています。

Javaの国際化の概要

 Javaの国際化の概要をより深く知るために、「JDK 5.0ドキュメント:国際化の概要」をもう少し詳しく見ていきましょう。。このドキュメントでは、Javaの国際化について、以下のような分類でまとめられています。各分類の詳細については、要約してあります。

コアJavaの国際化 テキストの表現 Unicode文字セットをベース
ロケールの識別と地域対応化 (代表例)
  • Localeクラスによる地理的、政治的、または文化的に特定の地域の表現
  • ResourceBundleクラスによる以下の機能の実現
    • 別の言語に簡単に地域対応(翻訳)できる
    • 複数のロケールを同時に扱える
    • 後から新しいロケールのサポートを簡単に追加できる
日付と時刻の処理 (代表例)
  • Calendarクラスによる、特定の言語とカレンダのスタイルに対する日付と時刻の書式指定を実装するために必要なすべての時刻フィールドの値を生成
  • TimeZoneクラスによる、UTC万国標準時)からのタイムゾーンのオフセットと使用可能なサマータイムのオフセットを、カプセル化 (ほとんどのプログラムでは、TimeZoneオブジェクトを直接扱う必要はない)
テキスト処理
  • 書式指定
    数値、日付、時刻、およびメッセージのすべてについての地域対応化について、ロケールの標準的な書式と、プログラマーが独自に定義した書式の両方を扱うためのクラスを提供
  • ロケールに依存する文字列の操作
    検索やソートなど、文字列操作の多くをロケールに依存した方法で処理するためのクラス群を提供
文字エンコーディングの変換 Unicode以外のほかのエンコーディングとの変換
デスクトップJavaの国際化 テキスト入力 インプットメソッドに関する機能の提供

国際化は「ほどほど」に!!

 この国際化対応の記載には、「Java実行環境に実装されているためプログラマーが意識しなくても自然に実現される国際化対応」と「Javaプログラマーが意識的にJava APIを活用などすることによって実現される国際化対応」の2種類が含まれている点に注意が必要です。このため、プログラマーがここに記載されているすべてを理解しておく必要はありません(例えば、Java実行環境のUnicode対応に関する実装については、プログラマーの多くは知る必要がないことでしょう)。

 さらに、Javaプログラマーが利用する国際化対応機能についても、すべてを使いこなす必要はありません。むしろ、国際化対応機能をむやみに使うと、訳の分からないソースコードが出来上がってしまう懸念すらあります。目的をしっかり持ち、必要となる国際化プログラミングを選択しながら、ほどほどに適切に利用する必要があるのです。

文字列をソースコードから外部ファイルへ抽出[java.util.ResourceBundle]

 また、国際化プログラミング技術の中には、国際化以外の目的でも有益な技術が含まれています。例えば、ResourceBundleクラスを使うと、画面表示内容メッセージなどの文字列をソースコードから外部ファイル(*.properties)へと追い出すことができます。外部ファイル化しておくと、そのプログラムに精通していない第三者でも、メッセージなどの文字列を変更(保守)しやすくなるというメリットがあります。

プロパティファイルを使った国際化

 それではいよいよ、国際化プログラミングに関するJava APIのうち、いくつかを見ていきましょう。

 最もよく利用される国際化関連Java APIの1つがjava.util.ResourceBundleクラスです。このクラスを使うと、ロケールに対応した言語の*.propertiesファイルが自動的に読み込まれます

国際化したpropertiesファイルを作る

 最初に、プロパティファイル(*.properties)を作成します。ResourceBundleが利用するプロパティファイルはnative2asciiコマンドを使って作成します。このコマンドについては「native2ascii - ネイティブ - ASCII コンバータ」 を参照してください。

 ただし、native2asciiコマンドは場合によって面倒なことが多いので、プロパティファイルの作成・編集には、Eclipseプラグインを利用する場合が多いです。@ITの記事「CoolなEclipseプラグイン(1):Javaのプロパティファイルを編集できるプラグイン」に、主なものが紹介されています。

 今回は、Excelを用いてプロパティファイルの記述が可能なblancoResourceBundleプラグイン(バージョン 1.0.0)を使います。インストールや使い方については、blancoResourceBundleプラグインのサイトを参照してください。

 また今回は、「ことわざバンドル」というリソースバンドルについて英語版と日本語版の2つを準備します。以下のように、enシートとjaシートの2つを作成します(シート名とロケールとをそろえておいてください)。

図7 リソースバンドル定義書記入(英語) 図7 リソースバンドル定義書記入(英語)
図8 リソースバンドル定義書記入(日本語) 図8 リソースバンドル定義書記入(日本語)

 インストールしたblancoResourceBundleプラグインの[ソースコード生成]ボタンを押します。

図9 blancoResourceBundleプラグインによるプロパティファイルの自動生成 図9 blancoResourceBundleプラグインによるプロパティファイルの自動生成

 すると、以下の3つのプロパティファイルが作成されます。

  • kotowaza.properties(基底名.properties
  • kotowaza_en.properties(基底名_en.properties
  • kotowaza_jp.properties(基底名_jp.properties

 これらのうち、_enのものが英語版、_jpのものが日本語版となります。。ちなみに、対応するプロパティファイルがない場合(例えば、このケースにおいてフランス語としてプログラムが起動された場合)には、kotowaza.properties(基底名.properties)が利用されるようになっています。

 これらのファイルはJavaのクラスパスの範囲に存在する必要があります。ここでは便宜上、Eclipseがクラスパスとして取り扱うsrcフォルダへプロパティファイルをコピーして利用します。

図10 コピー元のプロパティファイル 図10 コピー元のプロパティファイル
図11 コピー後のsrcフォルダ 図11 コピー後のsrcフォルダ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。