我正在使用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()
的字符串?
答案 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端翻译字符串的更多工作。)