这是处理本地化错误的推荐方法。异常消息?

时间:2012-09-14 13:34:08

标签: php localization

第1部分:
假设我做了一些抛出异常的事情,如:

function do_something($somepar)
{
    if (inexistent())
        return TRUE;
    else
        return FALSE;
}
if (do_something("SMART"))
    echo "Everything went right";
else
    echo "Something failed";

我得到了

Fatal error: Call to undefined function inexistent() in xyz.php on line 123

是否可以本地化此消息?我希望

setlocale(LC_ALL,'it_IT');

可以做到,但事实并非如此。

第2部分:
这是您处理本地化错误的建议。假设我想创建一个通用函数来在网上公开它,并且可以被希望它使用自己语言的人使用。

function do_something($somepar)
{
    if (whatever())
    {
        return TRUE;
    }
    else
    {
        $error_message = localizeThis("How to translate this?");
        trigger_error($error_message, E_USER_ERROR);
        return FALSE;
    }
}
if (do_something("SMART"))
    echo "Everything went right";
else
    echo "Something failed";

另外如何设置正确的输出语言?

1 个答案:

答案 0 :(得分:3)

您需要区分错误处理,调试/错误消息和用户可见输出。由PHP触发的标准错误消息未由PHP本地化。它们专门供开发人员使用,以帮助开发人员调试应用程序,开发人员应该会说英语。不管怎样,PHP语言的其余部分都是英文的。

trigger_error或抛出异常触发的消息不适用于最终用户消费,因为大多数最终用户无论如何都不会理解它们。您需要在内部捕获这些错误,并在必要时通过任何类型的本地化系统通知用户发生了一些不好的事情。技术错误消息还可能包含不应向公众披露的敏感信息。所以:

set_error_handler(function ($errno, $errstr) {
    logErrorToFile($errstr);

    switch ($errno) {
        case E_ERROR :
            die(_('Sorry, something bad happened. Please read this comforting localized error instead'));
        case E_NOTICE :
            // decide what you want to do here
        ...
    }
});

try {
    somethingThatThrowsExceptions();
} catch (Exception $e) {
    logErrorToFile($e->getMessage());
    die(_('Sorry, something bad happened. Please read this comforting localized error instead'));
}