23

これは、 php マニュアルからの小さなコード スニペットです。

putenv('LC_ALL=zh_CN');
setlocale(LC_ALL, 'zh_CN');

bindtextdomain('domain', './locale');
textdomain('domain');

echo gettext('Hello');

ファイルで定義されているように出力されdomain.moますが、問題はApacheが実行されている限り、gettext()常にキャッシュされた結果を返すことです。

Helloの翻訳を您好inに変更しても、你好domain.moが出力されます。

ただし、とのdomain引数を新しい名前に変更することで、これを修正できます。からまでのように。しかし、これは、ファイルを更新するたびに php ファイルを編集するのは本当に苦痛です。bindtextdomain()textdomain()"domain""domain2".mo

いくつかのフォルダを削除したり、いくつかのphp関数を呼び出して仕事をするなど、これを行うためのより良い方法はありますか? この目的のために小さなスクリプトを書くことができるように。

4

6 に答える 6

17

すべての解決策 ( 123domain )は、キャッシュの問題を取り除くために を変更することを提案していますが、これにより、メモリ内に多くの古いキャッシュが作成されます。

そこで、キャッシュ戦略の詳細について gnu-gettext ソースを掘り下げました (bindtextdom.c:78)。

bindtextdomain(domain, dirname)呼び出されるとdomain、キャッシュに存在するかどうかがチェックされます。もしそうならdirname、キャッシュ内のものと同じかどうかをチェックします。これが失敗した場合、メモリ内に新しいドメインを作成する代わりに、同じドメインのキャッシュ フラッシュを強制します。

修正は信じられないほど簡単です。まず、ファイルが保存されているlocaleフォルダーへのダミー リンクを作成します。.mo

cd locale
ln -s . nocache

次に、前に1行追加しますbindtextdomain()

bindtextdomain('domain', './locale/nocache');
bindtextdomain('domain', './locale');

現在、キャッシュは毎回強制的にフラッシュされます。


アップデート:

このハックは、場合によっては機能しない可能性があります (正確な条件を把握することはできません)。このソリューションは、運用環境で使用する必要はありませんが、httpd を実行したまま何かを修正する必要がある場合にのみ使用してください。

できる限り、最初から gettext を使用することは避けてください。これは本当に古いものであり、完全に非推奨にする必要があります。

于 2012-11-29T15:25:31.160 に答える
14

clearstatcache();から変換した後に関数messages.poを呼び出しmessages.mo、Apacheを再起動せずに正常に動作しました。任意の言語ファイルで行っている各変更をロードします。

于 2013-09-23T06:46:56.770 に答える
1

私見にはそれを直接行う方法はありません(あなたが言及したドメインの回避策を除いて)、それが私たちがphp-gettextを使用している理由です。

更新:motranslatorとして維持し始め、Composerでインストール可能で、すべてのPHPバージョンと互換性があります。

于 2012-11-29T14:57:00.410 に答える