5

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

“msg_forgot_pw”

将被翻译为:

“我忘记了密码”

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

4

2 回答 2

4

PO 目录格式本身并不限制翻译为单行,但您需要使用适当的标记:

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

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

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>
    

这很长,所以我建议编写包装器:

/**
 * 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”。您将不得不忍受它或找到其他工具。

于 2014-02-11T10:10:12.300 回答
3

一种可能性是使用“正常”换行符\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
)
于 2014-02-10T16:38:05.187 回答