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

标签 php gettext poedit

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

"msg_forgot_pw"

would be translated to:

"I have forgot my password"

该字符串将用 echo 打印,因此该字符串应该是有效的 HTML。目前我正在使用 <br>在 Poedit 的翻译中换行。我们已经发现您可以使用 \n在翻译中,而不是使用类似 Álvaro G. Vicario 的翻译功能制成。这里唯一的问题是,您必须输入 \n在 Pedit 中手动输入,因为它不会替换输入 \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手动转义序列:

New lines in Poedit

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

The string will be printed with echo, so the string should be valid HTML.

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

<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”。您将不得不忍受这种情况或寻找其他工具。

关于PHP:如何在 Poedit 中使用换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21682747/

相关文章:

gettext - 管理 poedit 与多种语言源的同步,命令行

php - PoEdit 关键字 - 复数形式

php - 一种更简单的方法来删除字符第一次出现之前的所有内容,包括首次出现的字符?

javascript - jQuery - 在 ajax 成功加载新数据之前清除 HTML 表

PhpStorm 不识别类别名

c - 如何将目录添加到 autoconf 的库搜索路径

java - 这是通过 getText() 将值存储到数组中的正确用法吗?

使用 xgettext 的 Python 行号

doctrine-orm - 使用 poedit 和 zend translate 翻译数据库

php - 在 foreach() 进程中查找最后一个条目