217 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			217 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
#! /usr/bin/env python
 | 
						|
#
 | 
						|
# Gramps - a GTK+/GNOME based genealogy program
 | 
						|
#
 | 
						|
# Copyright (C) 2000-2006  Donald N. Allingham
 | 
						|
#
 | 
						|
# This program is free software; you can redistribute it and/or modify
 | 
						|
# it under the terms of the GNU General Public License as published by
 | 
						|
# the Free Software Foundation; either version 2 of the License, or
 | 
						|
# (at your option) any later version.
 | 
						|
#
 | 
						|
# This program is distributed in the hope that it will be useful,
 | 
						|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
# GNU General Public License for more details.
 | 
						|
#
 | 
						|
# You should have received a copy of the GNU General Public License
 | 
						|
# along with this program; if not, write to the Free Software
 | 
						|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
						|
 | 
						|
# $Id: check_po,v 1.1.2.6 2006/04/22 18:30:33 rshura Exp $
 | 
						|
 | 
						|
import sys
 | 
						|
import re
 | 
						|
 | 
						|
f = open('gramps.pot')
 | 
						|
template_total = 0
 | 
						|
for line in f.xreadlines():
 | 
						|
    try:
 | 
						|
        if (line.split()[0] == 'msgid'):
 | 
						|
            template_total += 1
 | 
						|
    except:
 | 
						|
        pass
 | 
						|
f.close()
 | 
						|
 | 
						|
NONE   = 0
 | 
						|
MSGID  = 1
 | 
						|
MSGSTR = 2
 | 
						|
 | 
						|
all_total = {}
 | 
						|
all_fuzzy = {}
 | 
						|
all_untranslated = {}
 | 
						|
all_percent_s = {}
 | 
						|
all_named_s = {}
 | 
						|
all_bnamed_s = {}
 | 
						|
all_context = {}
 | 
						|
all_coverage = {}
 | 
						|
all_template_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
 | 
						|
    fuzzy = False
 | 
						|
    fuzzy_count = 0
 | 
						|
    string_map = {}
 | 
						|
    current_msgid = ""
 | 
						|
    current_msgstr = ""
 | 
						|
    
 | 
						|
    for line in f.xreadlines():
 | 
						|
        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 (len(data) > 0) and (data[0] == "#,") \
 | 
						|
                     and (data[1] == 'fuzzy\n'):
 | 
						|
                fuzzy = True
 | 
						|
        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
 | 
						|
                if fuzzy:
 | 
						|
                    fuzzy = False
 | 
						|
                    fuzzy_count += 1
 | 
						|
                else:
 | 
						|
                    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) + fuzzy_count
 | 
						|
    untranslated = 0
 | 
						|
    percent_s = 0
 | 
						|
    percent_s_list = []
 | 
						|
    named_s = 0
 | 
						|
    named_s_list = []
 | 
						|
    bnamed_s = 0
 | 
						|
    bnamed_s_list = []
 | 
						|
    context = 0
 | 
						|
    context_list = []
 | 
						|
    
 | 
						|
    for (msgid,msgstr) in string_map.items():
 | 
						|
        if msgstr == "":
 | 
						|
            untranslated += 1
 | 
						|
            continue
 | 
						|
    
 | 
						|
        cnt1 = msgid.count('%s')
 | 
						|
        cnt2 = msgstr.count('%s')
 | 
						|
        if cnt1 != cnt2:
 | 
						|
            percent_s += 1
 | 
						|
            percent_s_list.append(msgid)
 | 
						|
    
 | 
						|
        list1 = named.findall(msgid)
 | 
						|
        list2 = named.findall(msgstr)
 | 
						|
        if len(list1) != len(list2):
 | 
						|
            percent_s += 1
 | 
						|
            percent_s_list.append(msgid)
 | 
						|
    
 | 
						|
        list1.sort()
 | 
						|
        list2.sort()
 | 
						|
        if list1 != list2:
 | 
						|
            named_s += 1
 | 
						|
            named_s_list.append(msgid)
 | 
						|
    
 | 
						|
        match = bnamed.match(msgstr)
 | 
						|
        if match:
 | 
						|
            bnamed_s +=1
 | 
						|
            bnamed_s_list.append(msgstr)
 | 
						|
 | 
						|
        has_context1 = (msgid.count('|') > 0)
 | 
						|
        has_context2 = (msgstr.count('|') > 0)
 | 
						|
        if has_context1 and has_context2 and (msgid != msgstr):
 | 
						|
            context += 1
 | 
						|
            context_list.append(msgid)
 | 
						|
        
 | 
						|
    
 | 
						|
    coverage = (1.0 - (float(untranslated)/float(total))) * 100
 | 
						|
    template_coverage = coverage * float(total) / float(template_total)
 | 
						|
    
 | 
						|
    print "File:            %s" % args[0]
 | 
						|
    print "Template total:  %d" % template_total
 | 
						|
    print "PO total:        %d" % total
 | 
						|
    all_total[args[0]] = total
 | 
						|
    print "Fuzzy:           %d" % fuzzy_count
 | 
						|
    all_fuzzy[args[0]] = fuzzy_count
 | 
						|
    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 "Runaway context: %d" % context
 | 
						|
    all_context[args[0]] = context
 | 
						|
    print "PO Coverage:     %5.2f%%" % coverage
 | 
						|
    all_coverage[args[0]] = coverage
 | 
						|
    print "Template Coverage:  %5.2f%%" % template_coverage
 | 
						|
    all_template_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])
 | 
						|
 | 
						|
    if context:
 | 
						|
        print "\n-------- Runaway context in translation  ---------"
 | 
						|
        for i in context_list:
 | 
						|
            print "'%s' : '%s'" % (i, string_map[i])
 | 
						|
    print ""
 | 
						|
    
 | 
						|
 | 
						|
if len(sys.argv) > 2:
 | 
						|
    print "\n\nFile \tTotal \tFuzzy \tUntranslated \t%s mismatch \t%()s mismatch \tmissing s/d \tcontext \tCoverage"
 | 
						|
    for pofile in sys.argv[1:]:
 | 
						|
        print "%s \t%5d \t%7d \t%7d \t%7d \t%7d \t%7d \t%7d \t%3.2f%% \t%3.2f%%" %\
 | 
						|
           (pofile,
 | 
						|
            all_total[pofile],
 | 
						|
            all_fuzzy[pofile],
 | 
						|
            all_untranslated[pofile],
 | 
						|
            all_percent_s[pofile],
 | 
						|
            all_named_s[pofile],
 | 
						|
            all_bnamed_s[pofile],
 | 
						|
            all_context[pofile],
 | 
						|
            all_coverage[pofile],
 | 
						|
            all_template_coverage[pofile]
 | 
						|
            )
 | 
						|
 | 
						|
f = open("used_strings.txt","w")
 | 
						|
keys = string_map.keys()
 | 
						|
keys.sort()
 | 
						|
for i in keys:
 | 
						|
    f.write(i + "\n")
 | 
						|
f.close()
 |