tohokuaikiのチラシの裏

技術的ネタとか。

PHPのsetlocaleをCLIでチェックばかりしてたらハマった話。

まとめ

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

を行う。

f:id:tohokuaiki:20170314170055p:plain

ここでチェックが入っているのは、/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の値に影響がされていた。

しかも、これはコンソールからCLIPHPを動作させた時であって、Apacheから見た時はこの設定に影響されず、ちゃんと切り替わっていた。