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

Posted

技术标签:

【中文标题】PHP:如何在 Poedit 中使用换行符【英文标题】:PHP: How can you use line breaks in Poedit 【发布时间】:2014-03-08 02:40:18 【问题描述】:

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

“msg_forgot_pw”

将被翻译成:

“我忘记了密码”

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

【问题讨论】:

【参考方案1】:

一种可能性是使用“正常”换行符\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
)

【讨论】:

看下面的帖子,不幸的是这不是一个好的解决方案,因为你必须手动输入\n 答案也应该适用于翻译文件中的换行符。我已经编辑了我的答案,首先展示了它是如何工作的,另外还使用了 PHP 中的 nl2br 方法,该方法已经处理了与平台无关的将换行符替换为 HTML 标记的方法。【参考方案2】:

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 上下文中可用(例如,纯文本电子邮件)。

我的建议是:

    可翻译字符串包含纯文本

    打印时自己添加&lt;br&gt;标签

    <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 添加到 poedit 的 textarea 中,这个功能会很好用,但是如果你点击 enter 创建一个新行,poedit 不会插入那些 \n。所以这不是一个好的解决方案,因为翻译者不应该手动输入换行符(即使是 或 \n) @user3292653 我刚刚编辑了我的答案,以更正有关 Poedit 中换行的明显错误信息。很抱歉给您带来不便。 好的,谢谢!有其他人可以回答这个问题吗? @user3292653 我认为您应该编辑问题并解释您在当前答案中遗漏的内容。就像现在一样,它只是想知道您是否需要使用 HTML,而您显然不需要(br 不是 HTML;&lt;br&gt; 是)。

以上是关于PHP:如何在 Poedit 中使用换行符的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 poedit 从 js 文件生成 po 文件

如何让 poedit 工作?

如何在poedit中编辑原始字符串列?

使用 Poedit 创建 POT 文件

如何使用 POEdit 从特定域获取(可翻译的)字符串

如何找到 POEdit 错误