使用正则表达式从po文件中获取翻译计数和模糊计数....

时间:2014-01-23 06:22:50

标签: php regex gettext po

我需要一些正则表达式来分割PO(语言翻译文件)文件的翻译计数,模糊计数和总字符串数。

我使用PHP作为程序,我搜索每个地方但找不到。

请帮帮我。

2 个答案:

答案 0 :(得分:3)

gettext PO文件是如此陈旧和无处不在,它们是事实上的行业标准,并得到各种工具的大力支持。当你可以使用众多PO文件解析器中的一个时,尝试使用regexen重新发明解决方案似乎是非常不合适的。例如oscarotero/Gettext

$translations = Gettext\Extractors\Po::extract('messages.po');

$total = $translated = $fuzzy = 0;

foreach ($translations as $translation) {
    $total++;

    if (!$translation->hasTranslation()) {
        $untranslated++;
    }

    if (in_array('fuzzy', $translation->getComments())) {
        $fuzzy++;
    }
}

(未经测试,但应立即工作或稍作更改。)

事实上,有些工具可以执行此操作:Translate ToolkitPology,对于我所知道的人:

$ pocount locale/ko/LC_MESSAGES/

data/locale/ko/LC_MESSAGES/messages.po
type              strings      words (source)    words (translation)
translated:       3 (  0%)          7 (  0%)              28
fuzzy:            0 (  0%)          0 (  0%)             n/a
untranslated:   729 ( 99%)       1065 ( 99%)             n/a
Total:          732              1072                     28

unreviewed:       3 (  0%)          7 (  0%)              28
empty:          729 ( 99%)       1065 ( 99%)               0

$ posieve stats locale/ko/
-              msg   msg/tot   w-or   w/tot-or   w-tr   ch-or   ch-tr
translated       3      0.4%     15       0.9%     26      93     114
fuzzy            0      0.0%      0       0.0%      0       0       0
untranslated   729     99.6%   1708      99.1%      0   17323       0
total          732         -   1723          -     26   17416     114
obsolete         0         -      0          -      0       0       0

答案 1 :(得分:0)

试试这个正则表达式,

$total = array();
$translated = array();
$extra ='';


// If fuzzy true then translated count = fuzzy count
if($fuzzy) {
   $extra = '#, fuzzy\n';
} 

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

    for ($i = 0; $i < $matched; $i++) {
        if(trim(substr(rtrim($matches[1][$i]), 1, -1))!="") {
            $total[] = substr(rtrim($matches[1][$i]), 1, -1);
        }
        if(trim(substr(rtrim($matches[2][$i]), 1, -1))!="") {
            if (strpos(substr(rtrim($matches[2][$i]), 1, -1), 'Language-Team')===false && strpos(substr(rtrim($matches[2][$i]), 1, -1), 'MIME-Version')===false ) {
                $translated[] = substr(rtrim($matches[2][$i]), 1, -1); 
            }
        }
    }

总计数=计数($ total); 翻译计数=计数($翻译);