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 上下文中可用(例如,纯文本电子邮件)。
我的建议是:
-
可翻译字符串包含纯文本
打印时自己添加<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 添加到 poedit 的 textarea 中,这个功能会很好用,但是如果你点击 enter 创建一个新行,poedit 不会插入那些 \n。所以这不是一个好的解决方案,因为翻译者不应该手动输入换行符(即使是br
不是 HTML;<br>
是)。以上是关于PHP:如何在 Poedit 中使用换行符的主要内容,如果未能解决你的问题,请参考以下文章