15

私はオープンソースプロジェクトを国際化するためのオプションを検討してきました。

  • 誰もが推奨しているように見えるGettextを使用するには、ロケールを「システムにインストール」する必要があるようです。私の状況を正確に反映しているPHPマニュアルのこのメモを参照してください。このSOの質問は、同じ問題についても尋ねます。エンドユーザーがシステムに適切なロケールをインストールしているとは信じられないため、これはオープンソースプロジェクトには適していません。その上、翻訳した文字列(IMO)を使用するためだけにロケールをインストールしなければならないのは非常に奇妙です。

  • 時々gettextを優先してZend_Translateも推奨されますが、私はZendフレームワークを使用していないので、それが私にとってのオプションではないと思います。Zendフレームワークから分割できると言う人もいますが、どうすればよいかわかりません。誰かが私が選ぶのに必要なファイル(私はZendフレームワークのtarballをダウンロードしました)を教えてくれれば、私はZend_Translateを使用することにオープンになります。

  • 配列。それが私が今していることですが、それは理想的ではありません。理由は次のとおりです。

    • 現在のページでほとんど使用されない場合、すべての翻訳を定義するために多くのメモリを消費します。
    • 配列内のキーを複製することに問題があります。これはすでに1000行のコード長になっており、まだほとんど何も追加していません...
    • これは、プログラマー以外の人が実際に翻訳できないことを意味しますが、POeditは誰もが使用することを期待している標準です。

.moGettextまたはZend_Translateなしでファイルを読み取ることはできますか、それともGettextを使用する必要がありますか?もしそうなら、私が上でリンクした質問のように、どうすればすべてのロケールを機能させることができますか?

編集:私は今Zend_Translateを使用する用意があります。必要なファイルを見つける必要があります(1つのファイルにまとめることができれば素晴らしいと思います)-プロジェクトにZendFramework全体を含めたくありません。


更新:大きなオープンソースプロジェクトがi18nをどのように処理するかを知りたいと思いました。

したがって、私が見る限り、これら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を再起動してみました。

4

3 に答える 3

4

解決策は次のとおりです。

$lang = 'de'; //debug
setlocale( LC_ALL, 'C.UTF-8' );
bindtextdomain( 'default', PATH . "/locale/$lang" );
bind_textdomain_codeset( 'default', 'UTF-8' );
textdomain( 'default' );

それと私の答えの最後に投稿した例との唯一の違いは、それがC.UTF-8だけでなくを使用しているということCです。

私はこれについてさらにテストを行い、クロスプラットフォームで機能するかどうかを確認します。他に何か見つかった場合は、この回答を更新します。

于 2013-03-22T22:38:23.217 に答える
4

gettext-phpを試してください。これは、PHPで記述されたgettextのドロップイン置換です。WPは、すべてのロケールに対して常に構成されているとは限らない共有ホストで実行する必要があるため、元々はWordPress用に行われたと思います。これもあなたの問題のようです。

パフォーマンスに少し影響がありますが、私にとってはまったく問題になりませんでした。

于 2013-03-22T22:44:37.440 に答える
0

まだこれに問題がある人は、以下のコードを試すことができます。これは、http: //php.net/manual/en/function.gettext.php#58310から入手できます。

それはfreebsdサーバーで私を解決し、追加のロケールインストール(fr_FRとmy_MY)はありませんでした。このコードは、gettextキャッシュに問題がある場合にも役立ちます。

<?php
function initialize_i18n($locale) {
  $locales_root="/app/php/locale"; // change This to where you locale folder at
  putenv('LANG='.$locale);
  setlocale(LC_ALL,"");
  setlocale(LC_MESSAGES,$locale);
  setlocale(LC_CTYPE,$locale);
  $domains = glob($locales_root.'/'.$locale.'/LC_MESSAGES/*.mo');
  $current = basename($domains[0],'.mo');
  $timestamp = preg_replace('{messages-}i','',$current);
  bindtextdomain($current,$locales_root);
  textdomain($current);
}
?>
于 2018-08-01T08:04:56.457 に答える