用Poedit翻译JS的方法

时间:2013-07-22 22:20:17

标签: javascript php internationalization gettext

我正在使用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()的字符串?

2 个答案:

答案 0 :(得分: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.js php文件script.php?js=yourscript

答案 1 :(得分:0)

  

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

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

你误解了你的问题,而Poedit的JS支持并不是这样。真正的问题是,您希望Poedit / xgettext解析碰巧包含某些代码的字符串文字。在上面的示例中,"_translate('are_you_sure')"不是JavaScript代码(xgettext可以在其​​中找到_translate函数) - 它是字符串!并且您要问的是confirm()显示它的功能,包括&#34; _translate&#34;这有点没用。

你不会遇到像这样的代码的问题:

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

(当然,你必须确保客户端 JS gettext部署,包括对MO文件的访问,然后,这就是在PHP端翻译字符串的更多工作。)