web-dev-qa-db-ja.com

PHPで機能しないgettextをデバッグする方法は?

私はphp5.5でphpgettext拡張機能を使用しようとしています(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呼び出しなどを見て実行していますが、翻訳ファイルを読み取っていません。これをさらにデバッグするにはどうすればよいですか?翻訳ファイルを削除しても同じ動作になります。

15
glutz

戻り値を確認し、どの関数が失敗したかを知る必要があります。これはi18n固有ではありませんが、PHPスクリプト、またはプログラミング言語のデバッグに役立ちます。

<?php
$locale = 'es';
if (isset($_GET["locale"])) $locale = $_GET["locale"];

$domain = 'messages';

$results = putenv("LC_ALL=$locale");
if (!$results) {
    exit ('putenv failed');
}

// http://msdn.Microsoft.com/en-us/library/39cwe7zf%28v=vs.100%29.aspx
$results = setlocale(LC_ALL, $locale, 'spanish');
if (!$results) {
    exit ('setlocale failed: locale function is not available on this platform, or the given local does not exist in this environment');
}

$results = bindtextdomain($domain, "./locales");
echo 'new text domain is set: ' . $results. "\n";

$results = textdomain($domain);
echo 'current message domain is set: ' . $results. "\n";

$results = gettext("Hello world");
if ($results === "Hello world") {
    echo "Original English was returned. Something wrong\n";
}
echo $results . "\n";
17
akky

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

 Sudo locale-gen es
11
shailesh gupta

Linuxでも同じ問題が発生しているので、私はこの結論に達しました。プロジェクトに独自の* .moファイルを提供したとしても、ロケール自体(es)必須オペレーティングシステムに認識されている必要があります。

要求されたロケールをシステムレベルでインストールすると、問題が修正されました。

見る: locale-gen

実際にはデバッグgettextには役立たないかもしれませんが、少なくともそれはあなたが試すことができるものです。

10
jr997

OSで使用する言語パックがわからないため、ありがたいことに、setlocale()関数は配列を許可します。 PHP Docs によると:

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

これにより、次のセットをチェックすることで、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()を実行していないという問題がありました。データベース値。一度設定すると素朴に信じていたので、永遠に設定されました!

5
MackieeE

少し古い質問ですが、誰かに役立つことを期待して、この回答を示します。

LANG関数でLC_ALLputenvに変更してみてください。

$results = putenv("LC_ALL=$locale");

これに:

$results = putenv("LANG=$locale");

Macでは、LC_ALLで問題が発生し、おそらくここでも同じです。

他の場合にもこの回答を確認してください https://stackoverflow.com/a/3535866/662884

それが役に立てば幸い!

0
user38561

LC_LANGだけでなく、env vars LC_LANGUAGEおよびLC_ALLも設定してみてください。

putenv("LC_ALL=$locale");
putenv("LC_LANG=$locale");
putenv("LC_LANGUAGE=$locale");
0
user604234