diff options
Diffstat (limited to 'release/scripts/modules/i18n/update_po.py')
-rwxr-xr-x | release/scripts/modules/i18n/update_po.py | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/release/scripts/modules/i18n/update_po.py b/release/scripts/modules/i18n/update_po.py new file mode 100755 index 00000000000..042b46c03f2 --- /dev/null +++ b/release/scripts/modules/i18n/update_po.py @@ -0,0 +1,166 @@ +#!/usr/bin/python3 + +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ***** END GPL LICENSE BLOCK ***** + +# <pep8 compliant> + +# Update po’s in the branches from blender.pot in /trunk/po dir. + +import subprocess +import os +import sys +from codecs import open +import shutil + +import settings +import utils + +GETTEXT_MSGMERGE_EXECUTABLE = settings.GETTEXT_MSGMERGE_EXECUTABLE +BRANCHES_DIR = settings.BRANCHES_DIR +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): + # update po file + cmd = (GETTEXT_MSGMERGE_EXECUTABLE, + "--update", + "--no-wrap", + "--backup=none", + "--lang={}".format(lang), + po, + FILE_NAME_POT, + ) + + print("Updating {}...".format(po)) + print("Running ", " ".join(cmd)) + ret = subprocess.call(cmd) + print("Finished!\n") + return ret + + +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.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.") + args = parser.parse_args() + + if args.input: + global FILE_NAME_POT + 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 + + if args.langs: + for lang in args.langs: + if args.trunk: + dr = TRUNK_PO_DIR + po = os.path.join(dr, ".".join((lang, "po"))) + else: + dr = os.path.join(BRANCHES_DIR, lang) + po = os.path.join(dr, ".".join((lang, "po"))) + if args.add: + if not os.path.exists(dr): + os.makedirs(dr) + 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 + 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 + 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 + + return ret + + +if __name__ == "__main__": + print("\n\n *** Running {} *** \n".format(__file__)) + sys.exit(main()) |