私はオープンソースプロジェクトを国際化するためのオプションを検討してきました。
誰もが推奨しているように見えるGettextを使用するには、ロケールを「システムにインストール」する必要があるようです。私の状況を正確に反映しているPHPマニュアルのこのメモを参照してください。このSOの質問は、同じ問題についても尋ねます。エンドユーザーがシステムに適切なロケールをインストールしているとは信じられないため、これはオープンソースプロジェクトには適していません。その上、翻訳した文字列(IMO)を使用するためだけにロケールをインストールしなければならないのは非常に奇妙です。
時々gettextを優先してZend_Translateも推奨されますが、私はZendフレームワークを使用していないので、それが私にとってのオプションではないと思います。Zendフレームワークから分割できると言う人もいますが、どうすればよいかわかりません。誰かが私が選ぶのに必要なファイル(私はZendフレームワークのtarballをダウンロードしました)を教えてくれれば、私はZend_Translateを使用することにオープンになります。
配列。それが私が今していることですが、それは理想的ではありません。理由は次のとおりです。
- 現在のページでほとんど使用されない場合、すべての翻訳を定義するために多くのメモリを消費します。
- 配列内のキーを複製することに問題があります。これはすでに1000行のコード長になっており、まだほとんど何も追加していません...
- これは、プログラマー以外の人が実際に翻訳できないことを意味しますが、POeditは誰もが使用することを期待している標準です。
.mo
GettextまたはZend_Translateなしでファイルを読み取ることはできますか、それともGettextを使用する必要がありますか?もしそうなら、私が上でリンクした質問のように、どうすればすべてのロケールを機能させることができますか?
編集:私は今Zend_Translateを使用する用意があります。必要なファイルを見つける必要があります(1つのファイルにまとめることができれば素晴らしいと思います)-プロジェクトにZendFramework全体を含めたくありません。
更新:大きなオープンソースプロジェクトがi18nをどのように処理するかを知りたいと思いました。
- Moodleは配列を使用します。
- Drupalは、データベースフォールバックを使用して配列を使用しているようです。また
setlocale('C')
、一般的なロケールを取得し、setlocale
混乱全体を回避するために実行されます。 - Wordpressはi18nに独自の関数のヒープを使用しますが、その下ではgettextを使用します。
したがって、私が見る限り、これら3つのランダムなプロジェクトのいずれもZend_Translateを使用せず、gettextを直接使用しません。
ロケールを使用しC
、言語の名前をテキストドメイン名に保存して、そこから移動することをお勧めします。
だから、これが私が持っている限りです:
$lang = 'de'; //debug
setlocale( LC_ALL, 'C' );
bindtextdomain( 'default', PATH . "/locale/$lang" );
bind_textdomain_codeset( 'default', 'UTF-8' );
textdomain( 'default' );
var_dump( file_exists( PATH . "/locale/$lang/C/LC_MESSAGES/default.mo" ) ); //bool(true)
しかし、適切なファイルを作成するためにpoedit、msgfmtなどを使用したにもかかわらず、私はまだ英語の文字列を取得しています。また、Apacheを再起動してみました。