6

一部の文字列を翻訳するために PHP gettext 拡張機能を使用しようとしています。gettext()すべての関数は正しい値を返すように見えますが、 /を呼び出すと_()元の文字列のみが返されます。PO/MO ファイルは正しいようで、ディレクトリを正しく設定したと思います。WindowsでPHP 5.3.10を使用してWAMPサーバーを実行しています(インストールがあるため、5.3.4と5.3.8も実行してみました)。

まず、次を参照してください/new2/www/index.php

$locale = 'esn'; # returns Spanish_Spain.1252 in var dump

putenv("LC_ALL={$locale}"); // Returns TRUE
setlocale(LC_ALL, $locale); // Returns 'Spanish_Spain.1252'

$domain = 'messages';
bindtextdomain($domain, './locale'); // Returns C:\wamp\www\new2\www\locale
bind_textdomain_codeset($domain, 'UTF-8'); // Returns UTF-8
textdomain($domain); // Returns'messages'

print gettext("In the dashboard"); // Prints the original text, not the translation.
exit;

次のファイル構造を作成しました。

www/new2/www/locale/Spanish_Spain.1252/LC_MESSAGES/messages.mo

また、、 、、、およびに置き換えSpanish_Spain.1252てみました。es_ESesnespSpanishSpanish_Spain

MO の生成に使用される PO ファイルは次のようになります (関連するエントリのみを示します)。

#: C:\wamp\www\new2/www/index.php:76
msgid "In the dashboard"
msgstr "TRANSLATED es_ES DASHBOARD"

これは PoEdit を使用して生成されました。新しい .MO ファイルを追加した後、Apache を再起動しました。また、以前は Gettext で Zend_Translate を使用していましたが、正しく翻訳されていたことにも注意してください。ただし、独自の軽量フレームワークを作成しようとしているという理由もあって、ネイティブの gettext 拡張機能に依存したいと考えています。

どんな助けでも大歓迎です。

編集:修正されたディレクトリ構造。注 - 最近の回答を 24 時間以内に試すことができます。

4

6 に答える 6

3

これを XAMPP インスタンスに設定し、理解しました。

  • 完全な setlocale は Windows では機能しないため、返される内容は無関係です。
  • Windows の場合、標準の言語/国コードを使用してロケールを設定します (この場合、es_ES はスペインで話されているスペイン語です)。
  • ロケール ディレクトリの下に es_ES/LC_MESSAGES/ を作成します。これは、messages.mo ファイルが存在する場所です。

    $locale = 'es_ES'; 
    
    putenv("LC_ALL={$locale}"); // Returns TRUE
    
    $domain = 'messages';
    bindtextdomain($domain, './locale'); 
    bind_textdomain_codeset($domain, 'UTF-8'); 
    textdomain($domain); // Returns'messages'
    
    print gettext("In the dashboard"); 
    exit;
    

これが違うのかどうかはわかりませんが、po ファイルを作成するときに 2 つのことを行いました。File -> Preferences の poEdit で、行末の形式を Windows に変更しました。そして、poEdit で最初の po を作成した後、メモ帳 ++ でファイルを開き、エンコード タイプを UTF-8 に切り替えました。

これが少なくともあなたを正しい方向に向けてくれることを願っています。

参考文献

Windows での PHP ローカリゼーション チュートリアル

国コード

言語コード

于 2012-05-15T23:24:17.230 に答える
3

あなたのコードは、これをからの戻り値として言及していますbindtextdomain

C:\wamp\www\new2\www\locale

setlocaleofSpanish_Spain.1252textdomainof を使用すると、 へのmessages呼び出しは次のgettextパスを参照します。

C:\wamp\www\new2\www\locale\Spanish_Spain.1252\LC_MESSAGES\messages.mo

ただし、次のファイル構造を作成しました。

www/new2/locale/Spanish_Spain.1252/LC_MESSAGES/messages.mo
         ^^
         www/ missing here

編集

さて、それは役に立ちませんでした。Windowsでテストスクリプトを作成し、POEditをあなたのように使用しました:

$locale = "Dutch_Netherlands.1252";
putenv("LC_ALL=$locale"); // 'true'
setlocale(LC_ALL, $locale); // 'Dutch_Netherlands.1252'
bindtextdomain("messages", "./locale"); // 'D:\work\so\l10n\locale'
textdomain("messages"); // 'messages'

echo _("Hello world"); // 'Hallo wereld'

私のフォルダ構造は次のようなものです:

D:\work\so\l10n\
    \locale\Dutch_Netherlands.1252\LC_MESSAGES\messages.mo
    \locale\Dutch_Netherlands.1252\LC_MESSAGES\messages.po
    \test.php

あなたのものとほとんど同じに見えますが、それが役立つことを願っています. オンラインで見つけたいくつかのこと:

  • .po ファイルで文字セットを設定することが重要です
  • ローカリゼーション ファイル内のスペースには UTF8 の代替がある可能性があるため、キー ルックアップの失敗に注意してください。おそらく、最初にテストする最善の方法は、スペースがまったくないキーです。
于 2012-05-16T03:26:46.820 に答える
2

提案: .mo ファイルの完全なロケールが必要になる場合があります。これはおそらく、Spanish_Spain.UTF8 または esn_esn.UTF8 または esn_esp.UTF8 です (コード ベースを変更するため、1252 ではありません)。

探しているディレクトリを追跡するには、プロセス モニター (http://technet.microsoft.com/en-us/sysinternals/bb896645) をインストールします。情報にバケットの負荷を吐き出しますが、探しているファイル/ディレクトリを見つけることができるはずです。

(私の考えでは、ファイルのアクセス許可を確認することも考えられますが、Zend_Translate に似たようなものが既にある場合は、おそらく原因ではありませんが、とにかく確認する価値があります)。

良くない場合は申し訳ありませんが、手がかりになるかもしれません。

于 2012-05-14T11:36:33.243 に答える
1

ここを見てください。WindowsでもLinuxでも機能します。配列の最後の値はウィンドウで機能します。言語名のリストはここにあります。私のカタログは

./locales/en/LC_MESSAGES/domain.mo
         /cs/LC_MESSAGES/domain.mo
于 2012-05-09T19:30:36.707 に答える
1

Windows で gettext を使用したことはありませんが、Linux システムで gettext に問題が発生するたびに、適切な言語パックがインストールされていなかったことが原因でした。

于 2012-05-16T00:02:36.163 に答える
0

*.po および *.mo ファイルを変更すると、Apache Serverを再起動する必要があるという問題もあります。これは問題になる可能性があるため、回避策を使用できます。常にこれらのファイルの名前を新しい名前に変更すると、再ロードされます。

于 2012-05-12T09:37:14.003 に答える