2013-07-22 98 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端的字符串。)