一种用Poedit翻译JS的方法



我正在用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,Poedit软件也不会在_translate()中找到字符串。所以没有需要翻译的字符串。

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

您可以包含一个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;

因此您必须包含php文件script.php?js=yourscript 而不是yourscript.js

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

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

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

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

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

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

最新更新