我需要一些正则表达式来分割PO(语言翻译文件)文件的翻译计数,模糊计数和总字符串数。
我使用PHP作为程序,我搜索每个地方但找不到。
请帮帮我。
答案 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 Toolkit或Pology,对于我所知道的人:
$ 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); 翻译计数=计数($翻译);