0

我正在使用 Gettext 和 Poedit 软件翻译 PHP 中的字符串。我也想在 JavaScript 中使用翻译后的字符串,但不要将代码内联到 HTML 文档中,而是放在外部文件中。内联在 HTML 文档中不会有问题,因为内联 JS 代码也会被渲染。一个例子:

var hello = <?=_("hello");?>

翻译器应该使用与 php 代码相同的翻译表(因为重复的字符串)。

所以我的想法是用 PHP “编译” JavaScript 文件。例如,在外部 JS 文件中是以下代码:

if (window.confirm("_translate('are_you_sure')")) {
location.href = this.href;
}

一个 php 脚本读取上面的代码并找到其中的所有字符串_translate()。代码将替换_translate('are_you_sure')为翻译后的字符串。_translate()它可以工作,但永远不会翻译,因为即使我将 _translate 添加到源代码的键中,Poedit 软件也不会在其中找到字符串。所以没有要翻译的翻译字符串。

所以我的问题是如何告诉 Poedit 他应该_translate()在 javascript 文件中读取字符串?

4

2 回答 2

0

您可以包含一个 php 脚本,该脚本在 javascript 文件中进行翻译

$js = $_GET['js'];

// security check
if (preg_match('~[^a-z0-9_-]~', $js)) {
    die("invalid js");
}

$content = file_get_contents('path_to_js/' . $js . '.js');
preg_match_all('~_translate\(\'([^\']+)\'\)~', $content, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
    $content = str_replace($match[0], _($match[1]), $content);
}
echo $content;

所以你必须包含而不是yourscript.jsphp文件script.php?js=yourscript

于 2013-07-22T22:37:15.360 回答
0

所以我的问题是如何告诉 Poedit 他应该在 javascript 文件中使用 _translate() 读取字符串?

_translate关键字(这是 JS 的非默认关键字)添加到关键字列表中,并将路径添加到您的 .js 文件。而已。Poedit/xgettext 支持 JavaScript 已经有一段时间了。

但是,您误诊了您的问题,而 Poedit 的 JS 支持不是它。真正的问题是您希望 Poedit/xgettext 解析恰好包含一些代码的字符串文字。"_translate('are_you_sure')"不是_translate上面示例中的 JavaScript 代码(xgettext 可以在其中找到函数)——它是一个字符串!而且您要求confirm()函数显示它,包括“_translate”位,这是没有意义的。

像这样的代码你不会有这个问题:

msg = _translate('are_you_sure');
if (window.confirm(msg)) {
  location.href = this.href;
}

(当然,你必须确保客户端JS gettext部署,包括访问MO文件,然后,这比在PHP端翻译字符串要多。)

于 2015-08-19T04:40:57.737 回答