我正在使用poedit来翻译我的gettext字符串。我使用ID进行翻译,例如以下ID:
“msg_forgot_pw”
将被翻译为:
“我忘记了密码”
字符串将使用echo打印,因此字符串应该是有效的HTML。目前我正在使用<br>
在Poedit的翻译中创建新行。我们已经发现您可以在翻译中使用\n
,而不是使用像Álvaro G. Vicario
这样的翻译功能。这里唯一的问题是,您必须在Pedit中手动输入\n
,因为它不会将输入替换为\n
。那么有没有办法在这些翻译字符串的输出中创建新行,而无需手动将<br>
或\n
放入其中?
答案 0 :(得分:4)
采购订单目录格式本身不会将翻译限制为单行,但您需要使用正确的标记:
#: example.php:2
msgid "__multi_line_example__"
msgstr ""
"One line\n"
"Two lines\n"
"Three lines\n"
不幸的是,流行的Poedit程序并不容易:您可以使用 Enter 键输入实际的新行,但是在保存时它们会被默默地丢弃!即使使用Poedit,您也可以插入新行,但您需要手动输入\n
转义序列:
(不知道其他图形工具的用途。)
恕我直言,接受翻译人员的HTML代码是有风险的。你给他们太多的力量来严重打破应用程序。通常只接受纯文本并在HTML上下文中注入它时正确地转义它是安全的,例如:字符串将使用echo打印,因此字符串应该是有效的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”。你将不得不忍受它或找到另一种工具。
答案 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
)