[英]PHP: How can you use line breaks in Poedit
我正在使用poedit來翻譯我的gettext字符串。 我使用ID進行翻譯,例如以下ID:
“msg_forgot_pw”
將被翻譯為:
“我忘記了密碼”
該字符串將使用echo打印,因此該字符串應該是有效的HTML。 目前我正在使用<br>
在Poedit的翻譯中創建新行。 我們已經發現你可以在翻譯中使用\\n
而不是像Álvaro G. Vicario
那樣使用翻譯功能。 這里唯一的問題是,您必須在Pedit中手動輸入\\n
,因為它不會將輸入替換為\\n
。 那么,有沒有辦法讓這些翻譯字符串輸出新線沒有把<br>
或\\n
手動成嗎?
PO目錄格式本身不會將翻譯限制為單行,但您需要使用正確的標記:
#: example.php:2
msgid "__multi_line_example__"
msgstr ""
"One line\n"
"Two lines\n"
"Three lines\n"
不幸的是,流行的Poedit程序並不容易:您可以使用Enter鍵鍵入實際的新行,但是在保存時它們會被默默地丟棄! 您可以使用Poedit插入新行,但您需要手動鍵入\\n
轉義序列:
(不知道其他圖形工具的用途。)
該字符串將使用echo打印,因此該字符串應該是有效的HTML。
恕我直言,接受翻譯人員的HTML代碼是有風險的。 你給他們太多的力量來嚴重打破應用程序。 通常只接受純文本並在HTML上下文中將其正確轉義時更安全,例如:
<p><?php echo htmlspecialchars(_('msg_forgot_pw')); ?></p>
這也使得字符串可用於非HTML上下文(例如,純文本電子郵件消息)。
我的建議是:
您添加<br>
標簽自己,當打印
<p><?php echo nl2br(htmlspecialchars(_('msg_forgot_pw'))); ?></p>
這是非常冗長的,所以我建議寫包裝器:
/**
* Fetches translation as HTML (block with line feeds)
*
* @param string $msg_id Message ID
* @return string HTML
*/
function p($msg_id){
return nl2br(htmlspecialchars(_($msg_id), ENT_COMPAT | ENT_HTML401, 'UTF-8'), false);
}
/**
* Fetches translation as HTML (single line)
*
* @param string $msg_id Message ID
* @return string HTML
*/
function l($msg_id){
return htmlspecialchars(_($msg_id), ENT_COMPAT | ENT_HTML401, 'UTF-8');
}
編輯:更新問題的答案是“不,不是Poedit”。 你必須忍受這個或找到另一個工具。
可能的方法是使用“普通”換行符\\n
, \\r
或\\r\\n
(取決於你的平台)並用PHP替換它們的<br />
標簽 - 已經有一個PHP函數:nl2br。 我不知道您的代碼設計,但通常您可以在翻譯密鑰的方法中執行此操作:
function translate($key){
// do something to get the translation from the file and store it in some variable ($translation in this case)
return nl2br($translation)
}
並通過以下方式調用:
echo translation("msg_forgot_pw");
您的翻譯文件必須如下所示:
array(
// you can use a \n, \r, \r\n tag
"msg_forgot_pw" => "I have forgot \nmy password",
// or you can simply add a linebreak
"msg_forgot_pw2" => "I have forgot
my password",
// ... more entries
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.