9

私が実行するコードは次のようになります。

...
$this->locale = da_DK;
...
putenv("LC_ALL=".$this->locale);
putenv('LANG='.$this->locale);
$res = setlocale(LC_ALL, $this->locale);
if($res != $this->locale){
    throw new Exception("The language could not be set.");
}
bindtextdomain("domain", "./locale");
textdomain("domain");

 echo setlocale(LC_MESSAGES, 0 );
 echo ' ';
 echo __('description');

apache2を介して実行した結果は次のとおりです。

da_DK Beskrivelse

それは私たちが望む通りです。

cliで実行する:

da_DK Description

私たちが英語を使っていたら、これは正しかったでしょう。「d」は英語の翻訳では大文字で、ソースでは小文字です(文脈からすると少し奇妙に見えます)

したがって、gettextは文字列を翻訳できるので機能しますが、どういうわけか、スクリプトでロケールを変更し、英語のディレクトリから.poファイルを選択したことを無視します。

なぜCLIスクリプトにロケールが必要なのか疑問に思われる場合:スクリプトは請求書を電子メールで送信するために使用されます。

私が使用しているのは、Ubuntu 12.10、PHP 5.4.6-1ubuntu1、apache 2.2.22、およびgettext0.18.1です。

4

3 に答える 3

22

環境変数LANGUAGEをリセットする必要があります。

putenv( "LANGUAGE =");

見つけるのに少し時間がかかりました。

于 2012-11-28T15:11:00.850 に答える
2

bindtextdomain()がphp-cliとphp-apacheから同じリソースファイルを指しているかどうかを確認する必要があります。私は提案します、

  1. bindtextdomain()の戻り値をエコーし​​、それらを確認します。
  2. 「./locale」を絶対パス(「/ var / www / yourproject / locale」など)に置き換えて、機能するかどうかを確認してください。
于 2012-11-04T17:19:33.683 に答える
1

これがどれだけ関連しているかはわかりませんが…</p>

私はちょうど反対の問題の解決策を見つけました:Gettextはphp-apacheを介して機能しませんが、php-cliで機能します。

また、strftimeのローカリゼーションはphp-apacheでは機能しませんが、php-cli(Linux Debianバスターシステム上)では機能します。

私はそのような環境変数を持っていないので、言語環境変数は役に立ちませんでした。

不思議なことに、 Apacheでperlモジュールを無効にしたところ、問題は解決しました。

したがって、Apacheモジュールのバグによって、この種の問題が発生する可能性があります…</ p>

于 2020-06-14T05:25:15.857 に答える