まとめ
setlocale()の挙動について調べている際に、ApacheからではなくCLIから調べていた。
このCLIの場合の調査は下記の通り。
- CLIからPHPを実行してsetlocaleする際は、OSのロケールに依存する。
- OSの/etc/locale.genで有効にしてないロケールは、setlocale()で変更しても無視される。
- というか、そもそも環境変数LANGUAGEによりsetlocale()が上書きされるのでsetlocale()にあまり意味は無い。
Debianでロケールを追加する
英語・日本語の.moを用意し、setlocale()する最初のスクリプトを書いたところ、CentOSでは問題なくそれぞれの言語カタログが当たったが、debianでは上手くいかない。英語の方を見に行ってしまう。
で、gettextが欲しければ素直に追加しろということで、root権限で追加した。
/etc/locale.gen でja_JPを追加。
en_US.UTF-8 UTF-8 ja_JP.UTF-8 UTF-8
最終行に追加。
locale-genコマンドでシステムに反映
# locale-gen Generating locales (this might take a while)... en_US.UTF-8... done ja_JP.UTF-8... done Generation complete.
すると、$locale -a で
$ locale -a C C.UTF-8 en_US.utf8 ja_JP.utf8 POSIX
となった。
しかし、先ほどの空くプロとでgettext()で反映させようとしても出てこない。
ちなみに、en_US.utf8というのは、en_US.UTF8でもen_US.UTF-8でもen_US.utf-8でも良いみたい。
パッケージセットから追加する。
task-japaneseというパッケージらしい。しかし、これを普通にapt-get installしたところでlocaleが変わるのか・・・?
# apt-cache search task-japanese task-japanese - Japanese environment task-japanese-desktop - Japanese desktop task-japanese-gnome-desktop - Japanese GNOME desktop task-japanese-kde-desktop - Japanese KDE desktop
まだインストールしてないのを確認
# dpkg -l task-japanese dpkg-query: no packages found matching task-japanese
Debianの公式Wikiを調べて ChangeLanguage - Debian Wiki
# dpkg-reconfigure locales
を行う。
ここでチェックが入っているのは、/etc/locale.genで有効化されている言語。
ja_JP.UTF-8にチェックを入れて、進む。
デフォルトのLocaleはLocale - Debian Wikiによると「None」でイイらしい。
Get root and type dpkg-reconfigure locales and select the locale(s) you want to generate. At the end, you'll be asked which one should be the default. If you have users who access the system through ssh, it is recommended that you choose None as your default locale.
さて・・・・。
# dpkg -l task-japanese dpkg-query: no packages found matching task-japanese
あれ?パッケージがインストールされてない。
仕方ないので、手動でインストール
# apt-get install -y task-japanese
しかし、まだgettext()はja_JPの方を見に行かない。
んー、デフォルトのLanguageに引っ張られてるのか?
# env |grep LANG LANG=en_US.UTF-8 LANGUAGE=en_US:en
デフォルトLanguageを日本語にする。
# update-locale LANG=ja_JP.UTF-8 LANGUAGE=ja_JP:ja
$ more /etc/default/locale # File generated by update-locale LANG=ja_JP.UTF-8 LANGUAGE=ja_JP:ja
で、・・・・あ、gettext()で日本語が出た。確かにgettext()がデフォルト設定のロケールに引っ張られている。・・・ということは今度は日本語に切り替えようとしても切り替わらない・・・。困ったな。
色々調べてたら、
$export LANGUAGE="en_US" $php checmMO.php
というように、環境変数LANGUAGEの値に影響がされていた。
しかも、これはコンソールからCLIのPHPを動作させた時であって、Apacheから見た時はこの設定に影響されず、ちゃんと切り替わっていた。