#!/usr/bin/env python3 """Convert .po to .json.""" import json import optparse import os import sys import errno import re import polib parser = optparse.OptionParser(usage="usage: %prog [options] pofile...") parser.add_option("--quiet", action="store_false", default=True, dest="verbose", help="don't print status messages to stdout") parser.add_option("-o", type="string", default="", dest="destfile", help="output file name (if there is exactly one input file)") (options, args) = parser.parse_args() if args is None or len(args) == 0: print("ERROR: you must specify at least one po file to translate") sys.exit(1) if options.destfile != '' and len(args) != 1: print("ERROR: when -o is provided, there has to be exactly 1 input file") sys.exit(1) paramFix = re.compile("(\\(([0-9])\\))") for srcfile in args: destfile = os.path.splitext(srcfile)[0] + ".json" if options.destfile != '': destfile = options.destfile if options.verbose: print("INFO: converting %s to %s" % (srcfile, destfile)) xlate_map = {} po = polib.pofile(srcfile, autodetect_encoding=False, encoding="utf-8", wrapwidth=-1) for entry in po.translated_entries(): if entry.msgstr == '': continue xlate_map[entry.msgid] = entry.msgstr if not os.path.exists(os.path.dirname(destfile)): try: os.makedirs(os.path.dirname(destfile)) except OSError as exc: # Guard against race condition if exc.errno != errno.EEXIST: raise dest = open(destfile, "w") dest.write(json.dumps(xlate_map, sort_keys=True)) dest.close()