19

PHP 5.5 で php gettext 拡張機能を使用しようとしています (win2008 サーバーで、IIS7 を使用)。私はこれをやっています:

<?php

$locale = "es";
if (isSet($_GET["locale"])) $locale = $_GET["locale"];
putenv("LC_ALL=$locale");
setlocale(LC_ALL, $locale);
bindtextdomain("messages", "./locale");
textdomain("messages");

echo gettext("Hello world");

?>

このフォルダー構造を使用すると、次のようになります。

locale/es/LC_MESSAGES/messages.mo

しかし、それは常に Hello world を返すだけであり、正しい翻訳ではありません (私のスペイン語スキルの不足に基づいて) 現時点では、messages.po ファイルに次のように記述されています。

msgid ""
msgstr ""
"Project-Id-Version: TestXlations\n"
"POT-Creation-Date: 2014-04-19 08:15-0500\n"
"PO-Revision-Date: 2014-04-19 09:18-0500\n"
"Language-Team: \n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.6.3\n"
"X-Poedit-Basepath: .\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Poedit-SearchPath-0: c:/dev\n"

msgid "Hello world"
msgstr "Hola World"

これは、コマンド ラインおよび IIS 経由では失敗します。だから私はgettext呼び出しなどを見て実行していますが、翻訳ファイルを読んでいません。これをさらにデバッグするにはどうすればよいですか? 翻訳ファイルを削除しても、同じ動作になります。

4

7 に答える 7

13

「locale -a」の出力に「es」はありますか? そうでない場合は、次のコマンドを実行する必要があります。

 sudo locale-gen es
于 2014-07-22T17:04:06.167 に答える
6

OS で使用する言語パックがわからないため、ありがたいことに、このsetlocale()関数は配列を許可します。PHPドキュメントに従って:

「ロケールが配列であるか、追加のパラメーターが続く場合、各配列要素またはパラメーターは、成功するまで新しいロケールとして設定しようとします。これは、ロケールが異なるシステムで異なる名前で知られている場合、または可能性のあるロケールのフォールバックを提供するために役立ちます。利用できないロケール"

これにより、次の後にセットを確認することで、OS がフォールバックしているロケールを掘り下げることができます。

$locales = array( "fr_FR", "fr_FR.UTF-8", "fr_FR.utf8", "fr-FR" );

if (( $setTo = setlocale( LC_ALL, $locales )) === FALSE )
{
    echo "Unable to set a locale that the OS recognises.";
    return false;
}
else
{
    echo "Set LC_ALL to " . $setTo; //echos fr_FR.utf8
    return true;
}

$setTo$locales成功した値が提供されます。これは、記述するロケールを見つけるときに役立つ場合があります.po

私のコメントに書かれているように、setlocale()セッションまたはデータベースの値によってユーザーの言語の選択を保持する必要があるため、すべてのページ要求の各スクリプトの上部でこれを実行していないという問題がありました。一度設定したら、私は素朴に信じていたので、それは永遠に設定されました!

于 2016-03-15T09:57:02.487 に答える