有没有办法本地化PHP的错误输出?

时间:2012-07-19 08:01:04

标签: php localization

我们正在上中文(普通话)。对于我们的学生来说,如果运行php(在命令行上)的错误输出可以本地化为普通话,那么它会更容易(并且对他们更有意义)。有没有办法配置我们的PHP设置来支持这个(即编辑php.ini文件)?

2 个答案:

答案 0 :(得分: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版本。或者,Zend Framework也能够解析这些文件。

显然,您不希望手动翻译每个可能的字符串。最后一个选项是使用翻译服务,例如Google TranslateMicrosoft Translate

在所有情况下,您必须使用新的错误字符串替换现有的错误字符串。有一个名为set_error_handler()的本机PHP函数。这允许您设置自定义错误处理功能。如果要翻译现有的错误字符串,则应该在那里进行。这是你可以使用的设置(我没有彻底测试过):

<?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;
}
?>

剩下的就是将这段代码包含在你的脚本中,你应该都很好!

答案 1 :(得分:0)

你可以尝试,这可能有效

/* Set locale to Dutch */
setlocale(LC_ALL, 'nl_NL');