diff options
Diffstat (limited to 'release/scripts/modules/bl_i18n_utils/update_po.py')
-rwxr-xr-x | release/scripts/modules/bl_i18n_utils/update_po.py | 110 |
1 files changed, 24 insertions, 86 deletions
diff --git a/release/scripts/modules/bl_i18n_utils/update_po.py b/release/scripts/modules/bl_i18n_utils/update_po.py index 4c6495c5cfe..6e03226f6d3 100755 --- a/release/scripts/modules/bl_i18n_utils/update_po.py +++ b/release/scripts/modules/bl_i18n_utils/update_po.py @@ -22,7 +22,7 @@ # Update po’s in the branches from blender.pot in /trunk/po dir. -import subprocess +import concurrent.futures import os import sys from codecs import open @@ -41,73 +41,25 @@ TRUNK_PO_DIR = settings.TRUNK_PO_DIR FILE_NAME_POT = settings.FILE_NAME_POT -def pproc_newcontext_po(po, pot_messages, pot_stats): - print("Adding new contexts to {}...".format(po)) - messages, state, stats = utils.parse_messages(po) - known_ctxt = stats["contexts"] - print("Already known (present) context(s): {}".format(str(known_ctxt))) - - new_ctxt = set() - added = 0 - # Only use valid already translated messages! - allowed_keys = state["trans_msg"] - state["fuzzy_msg"] - state["comm_msg"] - for key in pot_messages.keys(): - ctxt, msgid = key - if ctxt in known_ctxt: - continue - new_ctxt.add(ctxt) - for t_ctxt in known_ctxt: - # XXX The first match will win, this might not be optimal... - t_key = (t_ctxt, msgid) - if t_key in allowed_keys: - # Wrong comments (sources) will be removed by msgmerge... - messages[key] = messages[t_key] - messages[key]["msgctxt_lines"] = [ctxt] - added += 1 - - utils.write_messages(po, messages, state["comm_msg"], state["fuzzy_msg"]) - print("Finished!\n {} new context(s) was/were added {}, adding {} new " - "messages.\n".format(len(new_ctxt), str(new_ctxt), added)) - return 0 - - -def process_po(po, lang): +def process_po(data): + po, lang, pot_msgs = data # update po file - cmd = (GETTEXT_MSGMERGE_EXECUTABLE, - "--update", - "-w", "1", # XXX Ugly hack to prevent msgmerge merging - # short source comments together! - "--no-wrap", - "--backup=none", - "--lang={}".format(lang), - po, - FILE_NAME_POT, - ) - + msg = utils.I18nMessages(iso=lang, kind='PO', src=po) print("Updating {}...".format(po)) - print("Running ", " ".join(cmd)) - ret = subprocess.call(cmd) - print("Finished!\n") - return ret + msg.update(pot_msgs) + msg.write(kind='PO', dest=po) + print("Finished updating {}!\n".format(po)) + return 0 def main(): import argparse - parser = argparse.ArgumentParser(description="Write out messages.txt " - "from Blender.") - parser.add_argument('-t', '--trunk', action="store_true", - help="Update po’s in /trunk/po rather than /branches.") - parser.add_argument('-i', '--input', metavar="File", - help="Input pot file path.") - parser.add_argument('--pproc-contexts', action="store_true", - help="Pre-process po’s to avoid having plenty of " - "fuzzy msgids just because a context was " - "added/changed!") + parser = argparse.ArgumentParser(description="Write out messages.txt from Blender.") + parser.add_argument('-t', '--trunk', action="store_true", help="Update po’s in /trunk/po rather than /branches.") + parser.add_argument('-i', '--input', metavar="File", help="Input pot file path.") parser.add_argument('-a', '--add', action="store_true", - help="Add missing po’s (useful only when one or " - "more languages are given!).") - parser.add_argument('langs', metavar='ISO_code', nargs='*', - help="Restrict processed languages to those.") + help="Add missing po’s (useful only when one or more languages are given!).") + parser.add_argument('langs', metavar='ISO_code', nargs='*', help="Restrict processed languages to those.") args = parser.parse_args() if args.input: @@ -115,12 +67,8 @@ def main(): FILE_NAME_POT = args.input ret = 0 - if args.pproc_contexts: - _ctxt_proc = pproc_newcontext_po - pot_messages, _a, pot_stats = utils.parse_messages(FILE_NAME_POT) - else: - _ctxt_proc = lambda a, b, c: 0 - pot_messages, pot_stats = None, None + pot_msgs = utils.I18nMessages(kind='PO', src=FILE_NAME_POT) + pool_data = [] if args.langs: for lang in args.langs: @@ -136,37 +84,27 @@ def main(): if not os.path.exists(po): shutil.copy(FILE_NAME_POT, po) if args.add or os.path.exists(po): - t = _ctxt_proc(po, pot_messages, pot_stats) - if t: - ret = t - t = process_po(po, lang) - if t: - ret = t + pool_data.append((po, lang, pot_msgs)) elif args.trunk: for po in os.listdir(TRUNK_PO_DIR): if po.endswith(".po"): lang = os.path.basename(po)[:-3] po = os.path.join(TRUNK_PO_DIR, po) - t = _ctxt_proc(po, pot_messages, pot_stats) - if t: - ret = t - t = process_po(po, lang) - if t: - ret = t + pool_data.append((po, lang, pot_msgs)) else: for lang in os.listdir(BRANCHES_DIR): po = os.path.join(BRANCHES_DIR, lang, ".".join((lang, "po"))) if os.path.exists(po): - t = _ctxt_proc(po, pot_messages, pot_stats) - if t: - ret = t - t = process_po(po, lang) - if t: - ret = t + pool_data.append((po, lang, pot_msgs)) + + with concurrent.futures.ProcessPoolExecutor() as executor: + for r in executor.map(process_po, pool_data, timeout=600): + if r != 0: + ret = r return ret if __name__ == "__main__": print("\n\n *** Running {} *** \n".format(__file__)) - sys.exit(main()) + sys.exit(main())
\ No newline at end of file |