2012-09-14 35 views
0

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"; 

另外如何設置正確的輸出語言?

+0

試圖趕上一個致命的錯誤? http://stackoverflow.com/questions/277224/how-do-i-catch-a-php-fatal-error – wesside

+0

順便說一句,錯誤不是例外。這些是PHP中單獨的錯誤處理概念。 – deceze

回答

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')); 
}