gramps/po/check_po
2006-03-15 23:58:23 +00:00

151 lines
3.9 KiB
Python
Executable File

#! /usr/bin/env python
NONE = 0
MSGID = 1
MSGSTR = 2
import sys
import re
all_total = {}
all_untranslated = {}
all_percent_s = {}
all_named_s = {}
all_bnamed_s = {}
all_coverage = {}
def strip_quotes(st):
if len(st.strip()) > 2:
return st.strip()[1:-1]
else:
return ""
args = sys.argv
while len(args) > 1:
args = args[1:]
f = open(args[0],"r")
mode = NONE
string_map = {}
current_msgid = ""
current_msgstr = ""
for line in f.readlines():
data = line.split(None,1)
if mode == NONE:
if len(data) > 0 and data[0] == "msgid":
mode = MSGID
if len(data) > 1:
current_msgid = strip_quotes(data[1])
elif mode == MSGID:
if data[0][0] == '"':
current_msgid += strip_quotes(line)
elif data[0] == "msgstr":
mode = MSGSTR
if len(data) > 1:
current_msgstr = strip_quotes(data[1])
elif mode == MSGSTR:
if line == "" or line[0] == "#":
mode = NONE
string_map[current_msgid] = current_msgstr
elif len(data) > 0 and data[0][0] == '"':
current_msgstr += strip_quotes(line)
f.close()
named = re.compile('%\((\w+)\)\d*s')
bnamed = re.compile('%\((\w+)\)\d*[^sd]')
total = len(string_map)
untranslated = 0
percent_s = 0
percent_s_list = []
named_s = 0
named_s_list = []
bnamed_s = 0
bnamed_s_list = []
for i in string_map.keys():
if string_map[i] == "":
untranslated += 1
continue
cnt1 = i.count('%s')
cnt2 = string_map[i].count('%s')
if cnt1 != cnt2:
percent_s += 1
percent_s_list.append(i)
list1 = named.findall(i)
list2 = named.findall(string_map[i])
if len(list1) != len(list2):
percent_s += 1
percent_s_list.append(i)
list1.sort()
list2.sort()
if list1 != list2:
named_s += 1
named_s_list.append(i)
match = bnamed.match(string_map[i])
if match:
bnamed_s +=1
bnamed_s_list.append(i)
coverage = (1.0 - (float(untranslated)/float(total))) * 100
print "File: %s" % args[0]
print "Total: %d" % total
all_total[args[0]] = total
print "Untranslated: %d" % untranslated
all_untranslated[args[0]] = untranslated
print "%%s mismatches: %d" % percent_s
all_percent_s[args[0]] = percent_s
print "%%()s mismatches: %d" % named_s
all_named_s[args[0]] = named_s
print "%%() missing s/d: %d" % bnamed_s
all_bnamed_s[args[0]] = bnamed_s
print "Coverage: %5.2f%%" % coverage
all_coverage[args[0]] = coverage
if percent_s:
print "\n-------- %s mismatches --------------"
for i in percent_s_list:
print "'%s' : '%s'" % (i, string_map[i])
if named_s:
print "\n-------- %()s mismatches ------------"
for i in named_s_list:
print "'%s' : '%s'" % (i, string_map[i])
if bnamed_s:
print "\n-------- %() missing s or d ---------"
for i in bnamed_s_list:
print "'%s' : '%s'" % (i, string_map[i])
print ""
if len(sys.argv) > 2:
print "\n\nFile \tTotal \tUntranslated. \t%s mismatch \t%()s mismatch \tmissing s/d \tCoverage"
for pofile in sys.argv[1:]:
print "%s \t%5d \t%7d \t%7d \t%7d \t%7d \t%3.2f%%" %\
(pofile,
all_total[pofile],
all_untranslated[pofile],
all_percent_s[pofile],
all_named_s[pofile],
all_bnamed_s[pofile],
all_coverage[pofile])
f = open("used_strings.txt","w")
keys = string_map.keys()
keys.sort()
for i in keys:
f.write(i + "\n")
f.close()