From 979cf10c66f6963aed28e26c0a8e5486b4e4a4bc Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Sat, 2 May 2020 22:52:32 +1000 Subject: [PATCH 1/3] First pass at a translation helper script --- InvenTree/script/translate.py | 63 +++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 InvenTree/script/translate.py diff --git a/InvenTree/script/translate.py b/InvenTree/script/translate.py new file mode 100644 index 0000000000..0c4a3e7253 --- /dev/null +++ b/InvenTree/script/translate.py @@ -0,0 +1,63 @@ +""" +This script is used to simplify the translation process. + +Django provides a framework for working out which strings are "translatable", +and these strings are then dumped in a file under InvenTree/locale//LC_MESSAGES/django.po + +This script presents the translator with a list of strings which have not yet been translated, +allowing for a simpler and quicker translation process. + +If a string translation needs to be updated, this will still need to be done manually, +by editing the appropriate .po file. + +""" + +import argparse +import os +import sys + + +def manually_translate_file(filename): + """ + Manually translate a .po file. + Present any missing translation strings to the translator, + and write their responses back to the file. + """ + + print("here we go!", filename) + + +if __name__ == '__main__': + + MY_DIR = os.path.dirname(os.path.realpath(__file__)) + LOCALE_DIR = os.path.join(MY_DIR, '..', 'locale') + + if not os.path.exists(LOCALE_DIR): + print("Error: {d} does not exist!".format(d=LOCALE_DIR)) + sys.exit(1) + + parser = argparse.ArgumentParser(description="InvenTree Translation Helper") + + parser.add_argument('language', help='Language code', action='store') + + args = parser.parse_args() + + language = args.language + + LANGUAGE_DIR = os.path.abspath(os.path.join(LOCALE_DIR, language)) + + # Check that a locale directory exists for the given language! + if not os.path.exists(LANGUAGE_DIR): + print("Error: Locale directory for language '{l}' does not exist".format(l=language)) + sys.exit(1) + + # Check that a .po file exists for the given language! + PO_FILE = os.path.join(LANGUAGE_DIR, 'LC_MESSAGES', 'django.po') + + if not os.path.exists(PO_FILE): + print("Error: File '{f}' does not exist".format(f=PO_FILE)) + sys.exit(1) + + # Ok, now we run the user through the translation file + manually_translate_file(PO_FILE) + \ No newline at end of file From 88e28edba9f652bbf01479fbd589a81df82c6197 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Sat, 2 May 2020 23:10:18 +1000 Subject: [PATCH 2/3] Script now manually adjusts the translation file --- InvenTree/script/translate.py | 51 ++++++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/InvenTree/script/translate.py b/InvenTree/script/translate.py index 0c4a3e7253..f92567dabd 100644 --- a/InvenTree/script/translate.py +++ b/InvenTree/script/translate.py @@ -17,15 +17,58 @@ import os import sys -def manually_translate_file(filename): +def manually_translate_file(filename, save=False): """ Manually translate a .po file. Present any missing translation strings to the translator, and write their responses back to the file. """ - print("here we go!", filename) + print("Add manual translations to '{f}'".format(f=filename)) + print("For each missing translation:") + print("a) Directly enter a new tranlation in the target language") + print("b) Leave empty to skip") + + input("Press to continue") + print("") + with open(filename, 'r') as f: + lines = f.readlines() + + out = [] + + # Context data + source_line = '' + msgid = '' + + for num, line in enumerate(lines): + # Keep track of context data BEFORE an empty msgstr object + line = line.strip() + + if line.startswith("#: "): + source_line = line.replace("#: ", "") + + elif line.startswith("msgid "): + msgid = line.replace("msgid ", "") + + if line.strip() == 'msgstr ""': + # We have found an empty translation! + + if msgid and len(msgid) > 0 and not msgid == '""': + print("Source:", source_line) + print("Enter translation for {t}".format(t=msgid)) + + translation = str(input(">")) + + if translation and len(translation) > 0: + # Update the line with the new translation + line = 'msgstr "{msg}"'.format(msg=translation) + + out.append(line + "\r\n") + + if save: + with open(filename, 'w') as output_file: + output_file.writelines(out) if __name__ == '__main__': @@ -40,6 +83,8 @@ if __name__ == '__main__': parser.add_argument('language', help='Language code', action='store') + parser.add_argument('--fake', help="Do not save updated translations", action='store_true') + args = parser.parse_args() language = args.language @@ -59,5 +104,5 @@ if __name__ == '__main__': sys.exit(1) # Ok, now we run the user through the translation file - manually_translate_file(PO_FILE) + manually_translate_file(PO_FILE, save=args.fake is not True) \ No newline at end of file From 275cd063e15c371c51d19d4f9655ab7240525975 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Sun, 3 May 2020 08:59:44 +1000 Subject: [PATCH 3/3] PEP fixes --- InvenTree/script/translate.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/InvenTree/script/translate.py b/InvenTree/script/translate.py index f92567dabd..407acb93c8 100644 --- a/InvenTree/script/translate.py +++ b/InvenTree/script/translate.py @@ -70,6 +70,10 @@ def manually_translate_file(filename, save=False): with open(filename, 'w') as output_file: output_file.writelines(out) + print("Translation done: written to", filename) + print("Run 'make translate' to rebuild translation data") + + if __name__ == '__main__': MY_DIR = os.path.dirname(os.path.realpath(__file__)) @@ -105,4 +109,3 @@ if __name__ == '__main__': # Ok, now we run the user through the translation file manually_translate_file(PO_FILE, save=args.fake is not True) - \ No newline at end of file