あっさりと

ソフトウェアや技術話など諸々

gettextでセットした翻訳情報を同一プロセス内でクリアする方法

前提

・日本語がデフォルトの情報
・英語の翻訳リソースが用意されている。
PHPにて実行。

問題点

  バッチのループ処理等でgettextで翻訳情報をセットすると連続する次処理の時もセットした情報を引き継いでしまう。

<ループ1回目>日本語
     ↓
<ループ2回目>(gettextにて翻訳出力)英語
     ↓
<ループ3回目>(日本語に戻したいが)英語(のままになってしまう)

・処理コード抜粋
2回目のループ時だけ以下をコールしている。

setlocale(LC_MESSAGES, "en_US.utf8");
bindtextdomain等諸々〜

3回目ループ時も引き続き英語情報が出力されてしまう。

調査

そもそもデフォルトのロケールはなんだろうという事でデフォルトの情報を見てみると"C"だった。

echo setlocale(LC_MESSAGES, ""); //  デフォルト値として"C"

環境を確認。

$ locale -a
C
C.UTF-8
〜

*ご自身のロケール環境に合わせて考えてみてください。

解決

前述のループ3回目のタイミングで以下をコール。

setlocale(LC_MESSAGES, "C");

Cロケールの翻訳情報は用意してないので再度デフォルトの日本語で出力された。
とりあえず要件は満たせましたという事で。