diff options
Diffstat (limited to 'desktop/install/check_lacked_trans.py')
-rwxr-xr-x | desktop/install/check_lacked_trans.py | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/desktop/install/check_lacked_trans.py b/desktop/install/check_lacked_trans.py new file mode 100755 index 00000000..965b103b --- /dev/null +++ b/desktop/install/check_lacked_trans.py @@ -0,0 +1,155 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +""" +Check translation lacked or disused. + +Example: +in OnionShare directory +$ check_lacked_trans.py +de disused choose_file +de disused gui_starting_server +de lacked gui_canceled +de lacked gui_starting_server1 +de lacked gui_starting_server2 +de lacked gui_starting_server3 +en disused choose_file +es disused choose_file +es disused gui_starting_server +... + + +1. search `{{strings.translation_key}}` and `strings._('translation_key')` + from .py or .html files. +2. load translation key from locale/*.json. +3. compare these. + +""" + + +import argparse +import re +import os +import codecs +import json +import sys + + +def arg_parser(): + desc = __doc__.strip().splitlines()[0] + p = argparse.ArgumentParser(description=desc) + p.add_argument( + "-d", + default=".", + help="onionshare directory", + metavar="ONIONSHARE_DIR", + dest="onionshare_dir", + ) + p.add_argument( + "--show-all-keys", + action="store_true", + help="show translation key in source and exit", + ), + p.add_argument( + "-l", + default="all", + help="language code (default: all)", + metavar="LANG_CODE", + dest="lang_code", + ) + return p + + +def files_in(*dirs): + dir = os.path.join(*dirs) + files = os.listdir(dir) + return [os.path.join(dir, f) for f in files] + + +def main(): + parser = arg_parser() + args = parser.parse_args() + + dir = args.onionshare_dir + + src = ( + files_in(dir, "onionshare_gui") + + files_in(dir, "onionshare_gui/tab") + + files_in(dir, "onionshare_gui/tab/mode") + + files_in(dir, "onionshare_gui/tab/mode/chat_mode") + + files_in(dir, "onionshare_gui/tab/mode/receive_mode") + + files_in(dir, "onionshare_gui/tab/mode/share_mode") + + files_in(dir, "onionshare_gui/tab/mode/website_mode") + + files_in(dir, "install/scripts") + ) + filenames = [p for p in src if p.endswith(".py")] + + lang_code = args.lang_code + + translate_keys = set() + for filename in filenames: + # load translate key from python source + with open(filename) as f: + src = f.read() + + # find all the starting strings + start_substr = "strings._\(" + starting_indices = [m.start() for m in re.finditer(start_substr, src)] + + for starting_i in starting_indices: + # are we dealing with single quotes or double quotes? + quote = None + inc = 0 + while True: + quote_i = starting_i + len("strings._(") + inc + if src[quote_i] == '"': + quote = '"' + break + elif src[quote_i] == "'": + quote = "'" + break + else: + inc += 1 + + # find the starting quote + starting_i = src.find(quote, starting_i) + if starting_i: + starting_i += 1 + # find the ending quote + ending_i = src.find(quote, starting_i) + if ending_i: + key = src[starting_i:ending_i] + translate_keys.add(key) + + if args.show_all_keys: + for k in sorted(translate_keys): + print(k) + sys.exit() + + if lang_code == "all": + locale_files = [f for f in files_in(dir, "share/locale") if f.endswith(".json")] + else: + locale_files = [ + f + for f in files_in(dir, "share/locale") + if f.endswith("%s.json" % lang_code) + ] + for locale_file in locale_files: + with codecs.open(locale_file, "r", encoding="utf-8") as f: + trans = json.load(f) + # trans -> {"key1": "translate-text1", "key2": "translate-text2", ...} + locale_keys = set(trans.keys()) + + disused = locale_keys - translate_keys + lacked = translate_keys - locale_keys + + locale, ext = os.path.splitext(os.path.basename(locale_file)) + for k in sorted(disused): + print(locale, "disused", k) + + for k in sorted(lacked): + print(locale, "lacked", k) + + +if __name__ == "__main__": + main() |