PHP:如何在Poedit中使用换行符

时间:2014-02-10 16:33:35

标签: php gettext poedit

我正在使用poedit来翻译我的gettext字符串。我使用ID进行翻译,例如以下ID:

  

“msg_forgot_pw”

     

将被翻译为:

     

“我忘记了密码”

字符串将使用echo打印,因此字符串应该是有效的HTML。目前我正在使用<br>在Poedit的翻译中创建新行。我们已经发现您可以在翻译中使用\n,而不是使用像Álvaro G. Vicario这样的翻译功能。这里唯一的问题是,您必须在Pedit中手动输入\n,因为它不会将输入替换为\n。那么有没有办法在这些翻译字符串的输出中创建新行,而无需手动将<br>\n放入其中?

2 个答案:

答案 0 :(得分:4)

采购订单目录格式本身不会将翻译限制为单行,但您需要使用正确的标记:

#: example.php:2
msgid "__multi_line_example__"
msgstr ""
"One line\n"
"Two lines\n"
"Three lines\n"

不幸的是,流行的Poedit程序并不容易:您可以使用 Enter 键输入实际的新行,但是在保存时它们会被默默地丢弃!即使使用Poedit,您也可以插入新行,但您需要手动输入\n转义序列:

New lines in Poedit

(不知道其他图形工具的用途。)

  

字符串将使用echo打印,因此字符串应该是有效的HTML。

恕我直言,接受翻译人员的HTML代码是有风险的。你给他们太多的力量来严重打破应用程序。通常只接受纯文本并在HTML上下文中注入它时正确地转义它是安全的,例如:

<p><?php echo htmlspecialchars(_('msg_forgot_pw')); ?></p>

这也使字符串可用于非HTML上下文(例如,纯文本电子邮件)。

我的建议是:

  1. 可翻译字符串包含纯文本
  2. 您在打印时自己添加<br>个标签

    <p><?php echo nl2br(htmlspecialchars(_('msg_forgot_pw'))); ?></p>
    
  3. 这是相当冗长的,所以我建议写包装器:

    /**
     * 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”。你将不得不忍受它或找到另一种工具。

答案 1 :(得分:3)

可能会使用“正常”换行符\n\r\r\n(取决于您的平台)并使用<br />标记在PHP中替换它们 - 已经有一个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
)