2012-07-19 50 views
2

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

+0

据我所知,PHP错误总是用英文。如果我冒犯了你,但不是中国人接受过英语教育,我很抱歉吗?再次,不好意思,如果我是刻板印象或任何东西。 – 2012-07-19 08:04:48

+0

这是一个合理的问题。中国的教育系统确实强调英语。但由于中国规模庞大,教育质量参差不齐。但事实是,由于该国没有实用的英语(与印度这样的国家相比),大多数中国人的英语能力相当低。 – Avery 2012-07-21 01:12:21

+1

本地化对我来说似乎是一个坏主意,他们将无法搜索网络上的错误消息(和男孩,PHP有一些神秘的错误信息......致命错误:在0行未知的情况下抛出没有堆栈帧的异常','解析错误:语法错误,意外的T_PAAMAYIM_NEKUDOTAYIM') – 2012-07-23 09:09:59

回答

3

我已经下载了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框架也能解析这些文件。

显然,你不想手动翻译每一个可能的字符串。最后一种选择是使用翻译服务,如Google TranslateMicrosoft Translate

在所有情况下,您必须用新的错误字符串替换现有的错误字符串。有一个原生的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; 
} 
?> 

剩下的就是包括这段代码你的脚本,你应该是所有好!

+1

准确地说,我正在寻找的答案(呃...不完全,但它告诉我,没有一些工作就无法完成)。谢谢蒂姆! – Avery 2012-07-25 00:31:55

+0

@AveryChan我已经编辑了我的答案,并提供了一些您可能会喜欢的附加信息! – 2012-07-25 13:07:55

0

你可以尝试,这可能工作

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

这是行不通的;这只是为了字符串功能。 – Avery 2012-07-21 01:17:41

相关问题