2012-07-19 74 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

相關問題