1

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

我在程序中使用了 PHP,我到处搜索但找不到。

请帮我。

4

2 回答 2

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++;
    }
}

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

事实上,已经有一些工具可以做到这一点:翻译工具包政治学,对于我认识的人来说:

$ 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
于 2014-01-23T09:06:18.803 回答
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); 
            }
        }
    }

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

于 2014-06-06T02:35:07.490 回答