Java | Java 標準ライブラリ:Locale

Java Java
スポンサーリンク

Locale を一言でいうと

java.util.Locale
「このユーザー(or この処理)は、どの言語・どの国・どの地域のルールで動けばいいのか」
を表すための“タグ”です。

英語なら en、日本語なら ja
アメリカなら US、日本なら JP
これらを組み合わせて、ja_JPen_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");
Java

Locale クラスには、よく使うものの定数も用意されています。

Locale jp = Locale.JAPAN;     // ja_JP
Locale us = Locale.US;        // en_US
Locale fr = Locale.FRANCE;    // fr_FR
Locale ja = Locale.JAPANESE;  // 言語だけ ja、国は未指定
Java

JAPANJAPANESE の違いは、「国まで含めるかどうか」です。
国によって日付や数値の表現が変わることが多いので、
通常は「言語+国」のセット(例: ja_JP, en_US)を使うことが多いです。


デフォルト Locale と明示的な Locale

Locale.getDefault() で「その環境の標準設定」を知る

Java アプリケーションには、「デフォルト Locale」がひとつ決まっています。

Locale defaultLocale = Locale.getDefault();
System.out.println(defaultLocale);
Java

日本の環境で実行すると、だいたい ja_JP のような値が出ます。

何も指定しない場合、NumberFormatDateTimeFormatterResourceBundle などは
この 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"));
    }
}
Java

Messages_ja.propertiesMessages_en_US.properties などを用意しておけば、
Locale に応じて適切なファイルからメッセージが取られます。

ここでも、「Locale は“どの言語・どの国のルールで文字列を扱うか”を表すタグ」として機能しています。


Locale の作り方と、やりがちなミス

コンストラクタ、ビルダー、定数

Locale の作り方はいくつかあります。

古典的なコンストラクタ例:

Locale locale = new Locale("ja", "JP");
Java

Java 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 ベースに切り替えていく

タイトルとURLをコピーしました