2013-12-09 216 views
3

我正在尋找一種簡單的方法來創建.po本地化文件中的Excel或CSV文件。將.po文件導出爲.csv

我找不到任何通過谷歌,所以我想自己寫在PHP中。 PO文件具有這樣的結構

MSGID「滴度」 msgstr「滴度」

所以我想我需要我的PHP腳本解析.po文件尋找「逗號之間的每個文本後的第一位關鍵字msgstr的發生「。

我認爲這是一個正則表達式的工作,所以我試過了,但它不會返回任何東西:

$po_file = '/path/to/messages.po'; 

if(!is_file($po_file)){ 
    die("you got the filepath wrong dude."); 
} 

$str = file_get_contents($po_file); 
// find all occurences of msgstr "SOMETHING" 
preg_match('@^msgstr "([^/]+)"@i', $str, $matches); 
$msgstr = $matches[1]; 

var_dump($msgstr); 
+0

你需要趕上註釋行? –

+0

不,我不知道! – pixeline

回答

2

有一個很好的梨庫。 File_Gettext

如果你看看File/Gettext/PO.php看到正則表達式的來源,你將需要:

$matched = preg_match_all('/msgid\s+((?:".*(?<!\\\\)"\s*)+)\s+' . 
          'msgstr\s+((?:".*(?<!\\\\)"\s*)+)/', 
          $contents, $matches); 

for ($i = 0; $i < $matched; $i++) { 
    $msgid = substr(rtrim($matches[1][$i]), 1, -1); 
    $msgstr = substr(rtrim($matches[2][$i]), 1, -1); 

    $this->strings[parent::prepare($msgid)] = parent::prepare($msgstr); 
} 

或者僅僅使用PEAR的lib:

include 'File/Gettext/PO.php'; 

$po = new File_Gettext_PO(); 
$po->load($poFile); 
$poArray = $po->toArray(); 

foreach ($poArray['strings'] as $msgid => $msgstr) { 
    // write your csv as you like... 
} 
+0

但是,請注意,如果您確實發現了一個應該寫入[PEAR bug跟蹤器](https://pear.php)的錯誤,則此模式將失敗,並顯示以下字符串:'msgstr「abc \\\」def「' –

+0

@CasimiretHippolyte .net/bugs/report.php?package = File_Gettext&action = Report + Bug) – bitWorking

+0

我錯了!它會失敗:'msgstr「abcdef \\」' –