2013-07-22 52 views
0

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

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

的PHP代码做(因为重复的字符串)译者应使用相同的翻译桌。

所以我的想法是“编译”的JavaScript文件用PHP。例如,在一个外部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

这不完全是你想要的,但似乎是util:http://i18next.com/ – Carlangueitor

回答

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

+0

这就是我的意思是“一个PHP脚本读取此代码找到_translate()内的所有字符串,代码将用翻译后的字符串替换_translate('are_you_sure')。“ 。 问题也在你的例子中:Poedit不会找到_($ match [1]),因此字符串不在列表中进行翻译。 – julesdude

+0

你知道问题不在于用翻译后的字符串替换_translate()。问题在于Poedit在_translate()内部找不到内容,因此我无法在程序中对其进行翻译。 – julesdude

+0

你必须在文件 - >设置下添加解析器定义 – Philipp

0

所以我的问题是,如何告诉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端的字符串。)