ローカライズ完全攻略ガイド|Java Gold対策・ResourceBundle・探索順序まで解説

ローカライズ編

Java Gold試験において、アノテーションと並んで「地味ながら確実に得点源にしたい」のが**「ローカライズ(多言語対応)」**です。

「日本なら『こんにちは』、アメリカなら『Hello』と表示を切り替える仕組み」ですが、試験ではその裏側にあるクラスの継承関係や、リソースファイルの優先順位がしつこく問われます。

この記事では、現役エンジニアの視点で「言語と地域の組み合わせルール」や、受験者が最もハマりやすい「プロパティファイルの探索順序」を、図解とクイズ形式で徹底解説します。


目次

1. ローカライズの正体:プログラムの「パスポート」

ローカライズとは、単なる翻訳ではありません。言語、国、通貨、日付の形式など、その地域(Locale)に合わせた最適化を行うことです。

文系出身の私は、ローカライズを**「プログラムに持たせるパスポート」**だと解釈しています。

  • Localeクラス: 「私はどこの国の人間か」を証明するスタンプ。
  • ResourceBundle: その国に合わせた「おもてなし(文鎮や通貨)」が詰まったカタログ。

2. 【最重要】ResourceBundleの探索順序(フォールバック)

試験で最も狙われるのが、**「どのプロパティファイルが読み込まれるか?」**という優先順位です。

例えば、デフォルト設定が en_US の環境で、プログラムが ja_JP のリソースを探す場合、Javaは以下の「執念の捜索(フォールバック)」を開始します。

  1. MyData_ja_JP.properties(言語+国:完全一致)
  2. MyData_ja.properties(言語のみ)
  3. MyData_en_US.propertiesここが罠! システムのデフォルトLocaleを検索)
  4. MyData_en.properties(デフォルトの言語)
  5. MyData.properties(ベース名のみ)

エンジニアの視点: 自分の言語で見つからなかったら、すぐに諦めるのではなく「じゃあ、このサーバーの標準設定ならどう?」とデフォルト設定を律儀に探しに行くのがJavaの面白い仕様です。これが見つからない場合のみ MissingResourceException が発生します。


3. 数値・日付のフォーマット(Format一族)

地域によって、日付の書き方や通貨の記号はバラバラです。Java 8以降のTime API(DateTimeFormatter)を中心に押さえましょう。

クラス名役割頻出ポイント
NumberFormat数値・通貨getCurrencyInstance() で記号(¥など)が付く
DateTimeFormatter日付・時刻FormatStyle.SHORT(数字のみ)や FULL(曜日まで)の差
MessageFormat文章の置換{0} というインデックスを使い format() メソッドで値を埋める

参考リファレンス(外部リンク):

より詳細なクラス仕様はOracle公式:DateTimeFormatter クラスを参照してください。


4. 【応用】ListResourceBundle:Javaクラスでの管理

多くの受験者が .properties ファイルに集中しますが、Javaクラスとして定義する ListResourceBundle も試験範囲です。

Java

public class MyData_ja_JP extends ListResourceBundle {
    @Override
    protected Object[][] getContents() {
        return new Object[][] {
            { "price", 1000 }, // String以外(数値や画像オブジェクト)も保持できる!
            { "currency", "円" }
        };
    }
}

プロパティファイルは値がすべて「String」になりますが、ListResourceBundleObject 型を扱えるため、柔軟なデータ管理が可能です。


5. 実戦演習10問:クリックしてチェック!

試験本番で狙われるポイントを4択形式でまとめました。クリックして正解を確認してみましょう。

【第1問】Localeの生成

Localeクラスの生成方法として、誤っているものはどれですか? A. Locale loc = new Locale("ja"); B. Locale loc = Locale.JAPANESE; C. Locale loc = new Locale("JP", "ja"); D. Locale loc = new Locale.Builder().setLanguage("en").build();

正解:C コンストラクタは「言語(小文字)」、「国(大文字)」の順です。Cは順序が逆のため、意図した動作になりません。

【第2問】リソースの探索順序

システムのデフォルトLocaleが en_US のとき、ResourceBundle.getBundle("Msg", new Locale("ja", "JP")) を実行しました。3番目に検索されるファイルはどれですか? A. Msg_ja.properties B. Msg_en_US.properties C. Msg_en.properties D. Msg.properties

正解:B 探索順序は「ja_JP」→「ja」→「デフォルトのen_US」→「デフォルトのen」→「ベース」の順です。

【第3問】通貨のフォーマット

以下のコードを実行した際の出力結果はどれですか? NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.US); System.out.println(nf.format(100)); A. 100 B. $100.00 C. ¥100 D. 100 USD

正解:B getCurrencyInstance はその地域の通貨記号と小数点以下の精度を自動で適用します。

【第4問】DateTimeFormatter

FormatStyle.SHORT を指定して日付を表示した際、Locale.JPにおける形式として適切なものはどれですか? A. 2026年4月22日 B. 2026/04/22 C. 2026年4月22日 水曜日 D. 22/04/2026

正解:B SHORTは数字と区切り記号のみの最短形式です。AはMEDIUM、CはFULLの形式です。

【第5問】ListResourceBundleの実装

ListResourceBundle を継承したクラスでオーバーライドすべきメソッドはどれですか? A. public String[][] getContents() B. protected Object[][] getContents() C. public Map<String, Object> getContents() D. public Object[][] getContents()

正解:B getContents() メソッドを protected で定義し、Object[][] を返すのが正解です。

【第6問】プロパティファイルの文法

プロパティファイルにおいて、キーと値を区切る文字として使用できないものはどれですか? A. = (イコール) B. : (コロン) C. (スペース) D. ; (セミコロン)

正解:D セミコロンは区切り文字として認められていません。

【第7問】MessageFormatの置換

MessageFormat.format("Result: {1} and {0}", "A", "B") の出力はどれですか? A. Result: A and B B. Result: B and A C. Result: A and A D. コンパイルエラー

正解:B {1} にはインデックス1番目の引数(B)が入るため、順序が入れ替わります。

【第8問】リソースの継承

子リソース(ja_JP)にキーが存在しない場合、親(ja)から値を取得する挙動を何と呼びますか? A. リソースの継承 B. カプセル化 C. ポリモーフィズム D. オーバーライド

正解:A 多言語対応において、より汎用的なリソースから値を取得する仕組みを「リソースの継承」と呼びます。

【第9問】デフォルトLocaleの決定

Locale.getDefault() が返す値の基準はどれですか? A. JVMを起動した環境のOS設定 B. Javaのインストール言語 C. ソースコードの文字コード D. 常に Locale.US

正解:A JVMは起動時にホストOSの言語・地域設定を読み取り、デフォルト値として保持します。

【第10問】リソース欠如時の例外

どのリソースファイルも、ベースファイルさえも見つからない場合に投げられる例外はどれですか? A. FileNotFoundException B. MissingResourceException C. IOException 2. NullPointerException

正解:B ResourceBundle専用の例外である MissingResourceException がスローされます。

まとめ:合格へのチェックリスト

[ ] Locale は(小文字言語, 大文字国)の順

[ ] ResourceBundle は「指定」→「デフォルト」→「ベース」の順で探す

[ ] ListResourceBundleObject[][] を返すクラス形式


ローカライズは、一度仕組みを理解すると「暗記」というより「パズル」に近くなります。特に探索順序のルールは、図を書いて整理するのが合格への近道ですよ!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

tibiyaのアバター tibiya ITエンジニア

文系卒あほエンジニア
趣味はゲームとギャンブルとテニスっぽいスポーツと釣りです
Java javascript angular react C#

コメント

コメントする

目次