summaryrefslogtreecommitdiff
path: root/desktop/check_lacked_trans.py
diff options
context:
space:
mode:
Diffstat (limited to 'desktop/check_lacked_trans.py')
-rwxr-xr-xdesktop/check_lacked_trans.py155
1 files changed, 155 insertions, 0 deletions
diff --git a/desktop/check_lacked_trans.py b/desktop/check_lacked_trans.py
new file mode 100755
index 00000000..965b103b
--- /dev/null
+++ b/desktop/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()