2

中国語(北京語)で授業をしています。私たちの学生にとって、php(コマンドライン上)を実行しているエラー出力が北京語にローカライズ可能であれば、それはより簡単です(そして彼らにとってより理にかなっています)。これをサポートするようにphpセットアップを構成する方法はありますか(つまり、php.iniファイルを編集します)?

4

2 に答える 2

4

PHPソースコードをダウンロードし、ソースがエラーをどのように処理するかを検索しました。いくつかの(ランダムに選択された)ファイルを調べて、あちこちでこれらの種類の行を見つけた後:

// warning for the sleep() function
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number of seconds must be greater than or equal to 0");

// warning for the constant() function
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't find constant %s", const_name);

// warning for the mysql_free_result() function
php_error_docref("function.mysql-free-result" TSRMLS_CC, E_WARNING, "%lu result set(s) not freed. Use mysql_free_result to free result sets which were requested using mysql_query()", MySG(result_allocated));

// error for the mysql-escape-string function()
php_error_docref("function.mysql-escape-string" TSRMLS_CC, E_DEPRECATED, "This function is deprecated; use mysql_real_escape_string() instead.");

これは永遠に続き、エラーはハードコーディングされているため、他の言語では利用できないと結論付けます...

残念な :(


何時間も検索した後(正確には5時間45分)-おそらく価値がないが、私が判断する解決策をいくつか見つけました。

多くの場合、翻訳は.po拡張子の付いたファイルに保存されます。これらのファイルには、元の文字列と翻訳された文字列が多数含まれています。これは、すべての文字列をそれぞれ手動で翻訳する必要があることを意味します。PoEditでファイルを作成できます。

次に、これらのファイルを解析する必要があります。GettextモジュールがインストールされているPHPバージョンをビルドできます。または、ZendFrameworkはこれらのファイルも解析できます。

明らかに、すべての可能な文字列を手動で翻訳する必要はありません。最後のオプションは、Google翻訳Microsoft翻訳などの翻訳サービスを使用することです。

いずれの場合も、既存のエラー文字列を新しいエラー文字列に置き換える必要があります。と呼ばれるネイティブPHP関数がありset_error_handler()ます。これにより、カスタムエラー処理関数を設定できます。既存のエラー文字列を変換する場合は、そこで実行する必要があります。これがあなたが使うことができるセットアップです(私はこれを徹底的にテストしていません):

<?php
set_error_handler('error_handler');

function error_handler($errno, $errstr, $errfile, $errline, $errcontext) {
    // Get the correct string for the error type
    switch($errno){
        case E_ERROR:
            $type = 'Error';
            break;
        case E_WARNING:
            $type = 'Warning';
            break;
        case E_PARSE:
            $type = 'Parse Error';
            break;
        case E_NOTICE:
            $type = 'Notice';
            break;
        case E_CORE_ERROR:
            $type = 'Core Error';
            break;
        case E_CORE_WARNING:
            $type = 'Core Warning';
            break;
        case E_COMPILE_ERROR:
            $type = 'Compile Error';
            break;
        case E_COMPILE_WARNING:
            $type = 'Compile Warning';
            break;
        case E_USER_ERROR:
            $type = 'User Error';
            break;
        case E_USER_WARNING:
            $type = 'User Warning';
            break;
        case E_USER_NOTICE:
            $type = 'User Notice';
            break;
        case E_STRICT:
            $type = 'Strict Notice';
            break;
        case E_RECOVERABLE_ERROR:
            $type = 'Recoverable Error';
            break;
        default:
            $type = 'Unknown error (' . $errno . ')';
            break;
    }

    // translate text
    $type = error_handler_translate($type);
    $str = error_handler_translate($errstr);
    $in = error_handler_translate('in');
    $line = error_handler_translate('on line');

    // echo the error in "default" PHP format
    echo '<br /><b>'. $type .':</b> ' . $str . ' '. $in .' <b>' . $errfile . '</b> '. $line .' <b>' . $errline . '</b><br />';

    // ignore the original PHP error handling
    return true;
}

function error_handler_translate($str) {
    // translate $str here

    return $str;
}
?>

残っているのは、このコードをスクリプトに含めることだけです。

于 2012-07-23T08:54:27.220 に答える
0

あなたは試すことができます、これはうまくいくかもしれません

/* Set locale to Dutch */
setlocale(LC_ALL, 'nl_NL');
于 2012-07-19T08:30:50.540 に答える