Edited at

ロケール(locale)まとめ

More than 1 year has passed since last update.


情報源

Archのwikiがとてもよくまとまっている。

man 5 localeman 7 localeにも情報がある。

基本的にロケールはlibcの機能だと知っていると理解が進むと思う。


現在のロケール設定を確認するにはlocaleコマンド

# locale                        

LANG=ja_JP.UTF-8
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=


システムにインストールされているロケールの一覧を確認するにはlocale -a

# locale -a

C
POSIX
ja_JP.utf8

またはlocaledef --list-archive -v


システムに使いたいロケールがインストールされていない場合

自分でロケールのソースからコンパイルすればよい。やり方はディストリビューションによって異なるが、locale-genコマンドがある場合はそれを使う。

locale-genはシェルスクリプトになっていて、内部で

localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8

に相当することをやっている。


環境変数の意味と優先順位

環境変数
意味

LC_CTYPE
文字の分類および大文字/小文字の変換。

LC_NUMERIC
小数区切り文字 (または基数文字)、千の区切り文字、およびグループ化を指定します。

LC_TIME
月の名前、曜日、一般的な完全表示や短縮表示など、日付や時刻の書式を指定します。

LC_MONETARY
ロケールの通貨記号、千の区切り文字、符号の位置、小数点以下の桁数など、通貨の書式を指定します。

LC_COLLATE
ロケールの照合順序および正規表現の定義を指定します。

LC_MESSAGES
ロケールのローカライズメッセージの記述言語、および肯定と否定の応答 (yes と no の文字列と表現) を指定します。

以上の6個はPOSIXで定義されているもの。それ以外のLC_PAPERなどはGNU C libraryの独自拡張、とman 5 localeに書いてあった。

LANG < LC_CTYPE, LC_MESSAGE等 < LC_ALL

右に行くほど優先される。

~/.bash_profileではLANGだけ設定しておけば十分。もし必要ならLC_CTYPEなどを個別に設定、さらにそれらを全て(一時的に)上書きしたい場合にLC_ALLを使う。

シェルスクリプト内で必ずCロケールにしてsortコマンドなどを使いたい場合はLC_ALL=Cを使うと良い。


ファイルとディレクトリの配置(Arch Linuxの場合)

ファイル
説明

/etc/locale.gen
生成すべきロケールの一覧。これは手で編集する

/usr/bin/localedef
ロケールをコンパイルするプログラム。glibcの一部なので、CentOS等にも入っている

/usr/bin/locale-gen
/etc/locale.genで定義された各ロケールに対してlocaledefを呼び出すシェルスクリプト

/usr/share/i18n/locales/

localedefでコンパイルする入力ファイルが置かれる

/usr/lib/locale/locale-archive

localedefでコンパイルされたロケールの実体

/usr/share/locale/
gettextで使用する翻訳ファイル(*.mo)が置かれる