- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用 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
手动转义序列:
(不知道其他图形工具的作用。)
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 上下文(例如,纯文本电子邮件消息)。
我的建议是:
您添加 <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/
我是一名优秀的程序员,十分优秀!