「ロケール環境変数」の種類と優先順位まとめ【LC_ALL・LC_*・LANG・LANGUAGE】 | Linux Fan

「ロケール環境変数」の種類と優先順位まとめ【LC_ALL・LC_*・LANG・LANGUAGE】

2018年8月11日

Linuxにおいて、アプリやコマンドが処理/出力する言語および時刻や日付、通貨などのフォーマットは、「ロケール」により決定されます。そしてロケールは「ロケール環境変数」によって設定されています。このページでは、ロケール環境変数の種類と、優先順位をまとめます。

多くのLinuxシステムにおいて、システムロケールの設定はlocalectl」コマンドで行われます。ロケールは、「言語の省略形_国や地域の省略形.コードページ」という形式になっています。日本語のLinuxシステムでは、一般的に「ja_JP.UTF-8」が用いられます。

ja_JP.utf8」や「ja_JP.utf-8」といった形式で設定される場合もあります。glibcの内部では、コードページ部分を「小文字化」「アルファベットと数字以外は除去」という形で「正規化(ノーマライズ)」して扱われるため、いずれも同じ意味になります。

ロケールは、環境変数として設定されます。ロケールに関係する環境変数は、「ロケール環境変数」とも呼ばれます。各アプリやコマンドはロケール環境変数を参照し、表示する言語、時刻や日時、通貨などのフォーマットを切り替えます。

localeコマンドによるロケール設定の確認

現在のロケール設定は、locale」コマンドで参照することができます。

以下は、日本語環境における「locale」コマンドの出力例です。

$ locale
LANG=ja_JP.UTF-8
LANGUAGE=
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=

この例の場合、ダブルクォートされていない「LANG=ja_JP.UTF-8」のみ、環境変数「LANG」で設定されています。

LC_」から始まる各項目は、ロケールのカテゴリーです(LC_ALL以外)。カテゴリーごとに、環境変数として別のロケールを設定することもできます。この例では個別のロケールは設定されておらず、環境変数「LANG」の値が適用されています。環境変数が設定されていない場合は、「"ja_JP.UTF-8"」のようにダブルクォートで囲って表示されます。

ロケール設定の基本は環境変数「LANG

ロケール設定の基本は、環境変数「LANG」です。通常は「LANG」さえ設定しておけば、そのロケールに合った処理や表示が行われます。
ユーザーが何も設定しなければ、システムに設定したロケールや、デスクトップ環境の言語設定に対応したロケールが設定されます。
~/.profile」などのシェルの初期化ファイルで、別のロケールに変更することもできます。

カテゴリー別のロケール設定

ロケールは、「カテゴリー」別に設定することもできます。主なカテゴリーには、以下のようなものがあります。たとえば、「LANG」は「ja_JP.UTF-8」のまま、「~/.profile」などで環境変数「LC_TIME」に「en_US.UTF-8」を設定すれば、コマンドによる時刻と日付の出力のみ英語になります。

LC_MESSAGES
メッセージに表示する言語、および肯定と否定の応答表現に影響します。
LC_CTYPE
文字の判定・操作・文字数のカウントなどに影響します。
LC_MONETARY
金額に関連する数値、通貨記号の表示に影響します。
LC_NUMERIC
金額に関係しない数値の表示(小数の区切り文字など)に影響します。
LC_TIME
日付と時刻の表示に影響します。
LC_COLLATE
並び換えや正規表現に用いる文字の照合順序に影響します。

環境変数「LC_ALL」が設定されていれば最優先される

環境変数「LC_ALL」が設定されていれば、その値が常に最優先でロケールとして用いられます。この場合、他の「LC_」で始まる環境変数や、環境変数「LANG」が設定されていても、参照されなくなってしまうので注意が必要です。

一時的に英語ロケールでプログラムを実行したい場合に、コマンドの頭に「LC_ALL=C」をつけて実行するといった使い方ができます。環境変数「LANG」や「LC_」で始まる環境変数に何が設定されていても、「アメリカ英語」で処理/表示が行われます。

ロケール環境変数の優先順位まとめ

ここまで見てきた通り、ロケール環境変数の優先順位は以下の通りとなります。

  • LC_ALL最優先
  • LC_で始まるカテゴリーごとの環境変数
  • LANG(上の2つが設定されていない場合に適用)

環境変数「LANG」を設定しても有効にならない場合は、「LC_ALL」および他の「LC_」で始まるカテゴリーごとの環境変数が設定されていないか確認すると良いでしょう。

翻訳の優先順位を設定する「LANGUAGE

ロケールに関係する環境変数として、他に「LANGUAGE」があります。これは「GNU gettext」を用いて翻訳を表示するプログラムに対し、「表示する翻訳の優先順位」を指定します。ただし、日本ではあまり用いられません。

たとえば、フランスで使われているLinux環境なら、通常は「LANG」に「fr_FR.UTF-8」と設定されているでしょう。この場合、フランス語の翻訳があればフランス語のメッセージが表示されますが、なければ英語が表示されます。しかし、英語よりドイツ語のほうが得意な人ならば、フランス語がなければドイツ語で、ドイツ語もなければ英語でメッセージが表示されたほうが便利でしょう。そのような場合、環境変数「LANGUAGE」に「fr_FR:de_DE」を設定しておけば、希望通りの動作となります。

関連記事