Java Gold 17のローカライズ対策|Locale・ResourceBundle

ローカライズの問題では、言語・地域・タイムゾーン・表示形式を分けて読みます。デフォルトの設定がどこで使われ、どこでは使われないかを確認しましょう。

言語と地域は別の情報

new Locale("de")は言語だけを指定したLocaleです。デフォルトのLocaleに国・地域があっても、その国コードをこのオブジェクトへ自動補完するわけではありません。getLanguage()とgetCountry()がそれぞれ何を返すかを区別してください。

Java 17ではLocale.JAPANESEが日本語、Locale.JAPANが日本語・日本を表します。言語タグではja-JPのようにハイフンを使いますが、後で扱うResourceBundleのファイル名とは区切り方が異なります。Localeそのものが日時のタイムゾーンを決定する、とも考えないようにします。

同じ出力になるかを問う問題では、明示したLocaleとデフォルトのLocaleを使う呼び出しを分けます。APIの対応バージョンを含め、Java SE 17のLocaleを基準に確認してください。

ResourceBundleは候補名と実在するファイルを照合する

ベース名がNoticeなら、ルートのpropertiesファイルはNotice.properties、カナダの英語向けはNotice_en_CA.propertiesです。候補名と、問題文で実際に用意されているファイルを一覧にして追います。

「最も近そうな名前」を感覚で選ぶのではなく、指定Localeから作る候補、デフォルトLocaleへのフォールバック、ルートの候補を区別します。さらに、バンドルが見つかることと、要求したキーが見つかることも別です。選ばれたバンドルにキーがない場合には親をたどるため、1ファイルの内容だけで判断しないようにします。

クラス形式とproperties形式、親バンドルの検索などの詳細はResourceBundleの公式APIで確認できます。通常のgetBundleと異なるControlを指定する問題では、その条件も先に確認してください。

数値・日時の書式化で確認する前提

API確認すること
NumberFormat数値・通貨・パーセントのどの形式か、明示したLocaleは何か
DateTimeFormatterパターンの大文字・小文字、表示対象が必要なフィールドを持つか
MessageFormat引数番号は0からで、引用符に特別な意味があること

たとえば日時パターンのMMは月、mmは分です。文字の見た目だけを暗記せず、DateTimeFormatterのパターン表と、書式化する日時型を一緒に確認してください。

例題2問:Localeの情報とバンドル名

デフォルトの設定が影響する場所と、ファイル名の区切りを確認してから答えてください。

例題1:言語だけを指定したLocale

次の処理が最後に表示する内容を選んでください。必要なimportは記述済みです。

Locale.setDefault(Locale.JAPAN);
var lang = new Locale("de");
System.out.print(lang.getLanguage() + ":" + lang.getCountry().isEmpty());

1つ選択してください

  • A. de:true
  • B. de:false
  • C. ja:false
  • D. de:DE
例題1の正解・解説を見る

正解:A

正解は「de:true」です。

言語だけで生成したLocaleの国コードは空です。デフォルトロケールの国を自動補完しません。

  • A:言語だけで生成したLocaleの国コードは空です。デフォルトロケールの国を自動補完しません。
  • B:この結果にはなりません。言語だけで生成したLocaleの国コードは空です。デフォルトロケールの国を自動補完しません。
  • C:この結果にはなりません。言語だけで生成したLocaleの国コードは空です。デフォルトロケールの国を自動補完しません。
  • D:この結果にはなりません。言語だけで生成したLocaleの国コードは空です。デフォルトロケールの国を自動補完しません。

確認するポイント:言語コードと地域コードは独立した情報です。

仕様を確認するための公式資料:

問題ID:jg17-0e7e3350bd55ba · この問題の訂正を連絡する

例題2:ResourceBundleの候補名

ベース名Noticeで、ルートとカナダの英語向けのpropertiesバンドルを用意します。標準の候補名として適切なものを2つ選んでください。

2つ選択してください

  • A. Notice_en_CA.txt
  • B. Notice.properties
  • C. Notice-en-CA.properties
  • D. Notice_en_CA.properties
例題2の正解・解説を見る

正解:B・D

バンドルはベース名に言語、地域などをアンダースコア区切りで追加します。

バンドルはベース名に言語、地域などをアンダースコア区切りで追加します。

  • A:properties形式の標準拡張子ではありません。
  • B:ロケールを付けないルートです。
  • C:標準の候補名はハイフン区切りではありません。
  • D:言語と地域をアンダースコアでつなぎます。

確認するポイント:BCP 47の言語タグの区切りとファイル名の区切りを混同しません。

仕様を確認するための公式資料:

問題ID:jg17-1467d4d37ba3a0 · この問題の訂正を連絡する

ローカライズの33問で復習する

問題演習の「出題分野」で「ローカライズ」を選びます。33問は本サイトの収録数で、公式試験の出題比率ではありません。

出力の予想が外れたら、言語・地域・タイムゾーン・書式パターンを一つずつ固定して確認します。ResourceBundleの問題では、存在するファイルとキーを書き出してから検索順序を追うと、誤答の理由を再現できます。

関連する学習

本サイトの問題は、Java SE 17を学ぶためのオリジナル練習教材です。本試験の過去問やOracle公式の教材ではありません。編集・訂正の方針をご確認ください。