Locale を一言でいうと
java.util.Locale は
「このユーザー(or この処理)は、どの言語・どの国・どの地域のルールで動けばいいのか」
を表すための“タグ”です。
英語なら en、日本語なら ja。
アメリカなら US、日本なら JP。
これらを組み合わせて、ja_JP や en_US のように「ロケール(Locale)」として表現します。
文字列の表示・日付や数値のフォーマット・メッセージの言語切り替えなど、
「人間に見せるもの」を扱うときの前提条件として、Locale が効いてきます。
Locale が何を表すのか(言語コードと国コード)
言語コード(language)と国コード(country)
Locale は大きく言うと、「言語」と「国(地域)」の組み合わせです。
Locale の内部には主に次の情報が入ります。
言語コード(例: "ja", "en", "fr")
国コード(例: "JP", "US", "FR")
任意のバリアント(細かい違いを表す識別子。初心者のうちは無視して構いません)
例えば、日本語(日本)を表す Locale はこんな感じです。
Locale locale = new Locale("ja", "JP");
Java英語(アメリカ)ならこうです。
Locale locale = new Locale("en", "US");
JavaLocale クラスには、よく使うものの定数も用意されています。
Locale jp = Locale.JAPAN; // ja_JP
Locale us = Locale.US; // en_US
Locale fr = Locale.FRANCE; // fr_FR
Locale ja = Locale.JAPANESE; // 言語だけ ja、国は未指定
JavaJAPAN と JAPANESE の違いは、「国まで含めるかどうか」です。
国によって日付や数値の表現が変わることが多いので、
通常は「言語+国」のセット(例: ja_JP, en_US)を使うことが多いです。
デフォルト Locale と明示的な Locale
Locale.getDefault() で「その環境の標準設定」を知る
Java アプリケーションには、「デフォルト Locale」がひとつ決まっています。
Locale defaultLocale = Locale.getDefault();
System.out.println(defaultLocale);
Java日本の環境で実行すると、だいたい ja_JP のような値が出ます。
何も指定しない場合、NumberFormat や DateTimeFormatter、ResourceBundle などは
この Locale.getDefault() を前提に動きます。
つまり、「ユーザーの OS や JVM 設定に合わせて、よしなに振る舞う」状態です。
明示的に Locale を指定して「振る舞いを変える」
一方で、あえて「別の Locale でフォーマットしたい」ということもあります。
例えば、「同じ数値を日本式とアメリカ式で表示してみる」コードはこう書けます。
import java.text.NumberFormat;
import java.util.Locale;
public class LocaleNumberFormatSample {
public static void main(String[] args) {
double value = 1234567.89;
Locale jp = Locale.JAPAN;
Locale us = Locale.US;
NumberFormat nfJp = NumberFormat.getInstance(jp);
NumberFormat nfUs = NumberFormat.getInstance(us);
System.out.println("JAPAN: " + nfJp.format(value)); // 1,234,567.89 など
System.out.println("US : " + nfUs.format(value)); // 1,234,567.89(見た目似ていても、通貨などで差が出る)
}
}
Java通貨表記にすると違いが分かりやすくなります。
NumberFormat cfJp = NumberFormat.getCurrencyInstance(jp);
NumberFormat cfUs = NumberFormat.getCurrencyInstance(us);
System.out.println("JAPAN: " + cfJp.format(value)); // ¥1,234,567 など
System.out.println("US : " + cfUs.format(value)); // $1,234,567.89 など
Java同じ value でも、Locale によって「通貨記号」「小数点」「桁区切り」などが変わります。
ここでのポイントは、「Locale を変えると、人間向け表現のルールを切り替えられる」ということです。
Locale と日付・数値・メッセージ(ResourceBundle)の関係
日付・時間のフォーマットでの使い方
日付や時間を文字列にするときも、Locale が重要です。
DateTimeFormatter(java.time)などは Locale を受け取れます。
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class LocaleDateSample {
public static void main(String[] args) {
LocalDate date = LocalDate.of(2025, 12, 27);
DateTimeFormatter fmtJp = DateTimeFormatter.ofPattern("yyyy/MM/dd (E)", Locale.JAPAN);
DateTimeFormatter fmtUs = DateTimeFormatter.ofPattern("MMM d, yyyy (E)", Locale.US);
System.out.println("JP: " + date.format(fmtJp)); // 2025/12/27 (土) など
System.out.println("US: " + date.format(fmtUs)); // Dec 27, 2025 (Sat) など
}
}
Java曜日名や月名など、「文字で出す部分」は Locale で変わります。
ResourceBundle でのメッセージ切り替え
ResourceBundle はまさに、「Locale に応じてメッセージを切り替える」仕組みでした。
import java.util.Locale;
import java.util.ResourceBundle;
public class LocaleBundleSample {
public static void main(String[] args) {
ResourceBundle bundleJa = ResourceBundle.getBundle("Messages", Locale.JAPAN);
ResourceBundle bundleUs = ResourceBundle.getBundle("Messages", Locale.US);
System.out.println("JA: " + bundleJa.getString("greeting"));
System.out.println("US: " + bundleUs.getString("greeting"));
}
}
JavaMessages_ja.properties、Messages_en_US.properties などを用意しておけば、
Locale に応じて適切なファイルからメッセージが取られます。
ここでも、「Locale は“どの言語・どの国のルールで文字列を扱うか”を表すタグ」として機能しています。
Locale の作り方と、やりがちなミス
コンストラクタ、ビルダー、定数
Locale の作り方はいくつかあります。
古典的なコンストラクタ例:
Locale locale = new Locale("ja", "JP");
JavaJava 7 以降で使えるビルダー:
Locale locale = new Locale.Builder()
.setLanguage("ja")
.setRegion("JP")
.build();
Javaすでに用意されている定数:
Locale jp = Locale.JAPAN; // ja_JP
Locale us = Locale.US; // en_US
Java初心者のうちは、基本的に定数(Locale.JAPAN, Locale.US など)を使い、
必要になったら "fr", "FR" のような言語・国コードを調べて指定する形で十分です。
言語コード・国コードの大文字小文字
new Locale("ja", "jp") のように、国コードを小文字にしてしまうミスはよくあります。
慣習として、
言語コードは小文字(”ja”, “en”, “fr”)
国コード(リージョンコード)は大文字(”JP”, “US”, “FR”)
で書くのが基本です。
コード上で見たときに、「これは言語」「これは国」と一目で分かるので、このルールに従うのがおすすめです。
Locale を意識した設計をするメリット
べた書き日本語からの卒業
Java 初心者のうちは、つい System.out.println("こんにちは"); のように
日本語を直接コードに書きがちです。
最初はそれで構いませんが、少し規模が大きくなってくると、
英語版もほしい
別の国のフォーマットで表示したい
といった要求が出てきます。
そのとき、「Locale や ResourceBundle を前提に設計してあるかどうか」で難易度が大きく変わります。
最初から、
メッセージは ResourceBundle で取る
日付や数値の整形は Locale を意識して行う
という癖をつけておくと、後々の拡張がとても楽になります。
「人間に見せるもの」は Locale 依存と考える
画面に出すもの、ログに出すもの、ファイルに書き出すものなど、
人間が目で読むことを前提としたものは、
実は Locale の影響を受けるべき領域です。
日付の形式
小数点と桁区切り
通貨記号
曜日名や月名
言語そのもの
これらを全部「日本人(自分)基準」で固定してしまうと、
他のユーザーにとっては不親切なアプリになります。
Locale を意識することは、「誰に見せるのか」を意識することとほぼ同じです。
まとめ:Locale を自分の中でこう位置づける
Locale を一言でまとめると、
「人間向けの文字列・日付・数値・メッセージを扱うときに、“どの言語・どの国のルールでやるか” を表すタグ」
です。
押さえておきたいポイントは、
- 言語コード(”ja”)+国コード(”JP”)で
ja_JPのようなロケールを表す Locale.getDefault()が、その環境の標準ロケール- 日付・数値・通貨・メッセージは、Locale によって表現が変わる
- 多言語対応や国際化を考えるなら、「べた書き文字列」ではなく Locale/ResourceBundle ベースに切り替えていく
