123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- #!/usr/bin/env python
- #############################################################################
- #
- # MODULE: Languages information and statistics (Python)
- # AUTHOR(S): Luca Delucchi <lucadeluge@gmail.com>
- # Pietro Zambelli <peter.zamb@gmail.com>
- # PURPOSE: Create a json file containing languages translations
- # information and statistics.
- # COPYRIGHT: (C) 2012 by the GRASS Development Team
- #
- # This program is free software under the GNU General
- # Public License (>=v2). Read the file COPYING that
- # comes with GRASS for details.
- #
- #############################################################################
- from __future__ import print_function
- import os, sys
- import subprocess
- import json
- import glob
- import codecs
- def read_po_files(inputdirpath):
- """Return a dictionary with for each language the list of *.po files"""
- originalpath = os.getcwd()
- os.chdir(inputdirpath)
- languages = {}
- for pofile in glob.glob("*.po"):
- lang = pofile.split('_')[1:]
- # check if are two definitions like pt_br
- if len(lang) == 2:
- lang = ['_'.join(lang)]
- lang = lang[0].split('.')[0]
- # if keys is not in languages add it and the file's name
- if lang not in languages:
- languages[lang] = [pofile, ]
- # add only files name
- else:
- languages[lang].append(pofile)
- os.chdir(originalpath)
- return languages
- def read_msgfmt_statistics(msg, lgood, lfuzzy, lbad):
- """Return a dictionary, and the good, fuzzy and bad values from a string"""
- langdict = {}
- # split the output
- out = msg.split(b',')
- # TODO maybe check using regex
- # check for each answer
- for o in out:
- o = o.lower().strip()
- # each answer is written into dictionary and
- # the value add to variable for the sum
- if b'untranslated' in o:
- val = int(o.split(b' ')[0])
- langdict['bad'] = val
- lbad += val
- elif b'fuzzy' in o:
- val = int(o.split(b' ')[0])
- langdict['fuzzy'] = val
- lfuzzy += val
- else:
- val = int(o.split(b' ')[0])
- langdict['good'] = val
- lgood += val
- return langdict, lgood, lfuzzy, lbad
- def langDefinition(fil):
- f = codecs.open(fil, encoding='utf-8', errors='replace', mode='r')
- for l in f.readlines():
- if '"Language-Team:' in l:
- lang = l.split(' ')[1:-1]
- break
- f.close()
- if len(lang) == 2:
- return " ".join(lang)
- elif len(lang) == 1:
- return lang[0]
- else:
- return ""
- def get_stats(languages, directory):
- """Return a dictionary with the statistic for each language"""
- # output dictionary to transform in json file
- output = {}
- # TO DO TOTALS OF ENGLISH WORD FOR EACH FILE
- # all the total string in english
- output['totals'] = {}
- # all the information about each lang
- output['langs'] = {}
- # for each language
- for lang, pofilelist in languages.items():
- output['langs'][lang] = {}
- output['langs'][lang]['total'] = {}
- output['langs'][lang]['name'] = langDefinition(os.path.join(directory, pofilelist[0]))
- # variables to create sum for each language
- lgood = 0
- lfuzzy = 0
- lbad = 0
- # for each file
- for flang in pofilelist:
- fpref = flang.split('_')[0]
- # run msgfmt for statistics
- # TODO check if it's working on windows
- process = subprocess.Popen(['msgfmt', '--statistics',
- os.path.join(directory,flang)],
- stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- msg = process.communicate()[1].strip()
- # check if some errors occurs
- if msg.find(b'error') != -1:
- # TODO CHECK IF grass.warning()
- print("WARNING: file <%s> has some problems: <%s>" % (flang, msg))
- continue
- output['langs'][lang][fpref], lgood, lfuzzy, lbad = \
- read_msgfmt_statistics(msg, lgood, lfuzzy, lbad)
- # write the sum and total of each file
- output['langs'][lang]['total']['good'] = lgood
- output['langs'][lang]['total']['fuzzy'] = lfuzzy
- output['langs'][lang]['total']['bad'] = lbad
- output['langs'][lang]['total']['total'] = lgood + lfuzzy + lbad
- return output
- def writejson(stats, outfile):
- # load dictionary into json format
- fjson = json.dumps(stats, sort_keys=True, indent=4)
- # write a string with pretty style
- outjson = os.linesep.join([l.rstrip() for l in fjson.splitlines()])
- # write out file
- fout = open(outfile, 'w')
- fout.write(outjson)
- fout.write(os.linesep)
- fout.close()
- try:
- os.remove("messages.mo")
- except:
- pass
- def main(in_dirpath, out_josonpath):
- languages = read_po_files(in_dirpath)
- stats = get_stats(languages, in_dirpath)
- if os.path.exists(out_josonpath):
- os.remove(out_josonpath)
- writejson(stats, out_josonpath)
- if __name__ == "__main__":
- directory = 'po/'
- outfile = os.path.join(os.environ['GISBASE'], 'translation_status.json')
- sys.exit(main(directory, outfile))
|