feat: 添加 i18n 自动 diff 和 update 工具 (i18n-util.py)

This commit is contained in:
Bai 2023-02-03 20:07:35 +08:00 committed by Jiangjie.Bai
parent be6e1a3449
commit 05c2425bc6
2 changed files with 110 additions and 1 deletions

View File

@ -4,11 +4,17 @@ root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
[*.{js,jsx,ts,tsx,vue}]
indent_size = 2
[*.py]
indent_size = 4
[*.md]
insert_final_newline = false
trim_trailing_whitespace = false

103
src/i18n/langs/i18n-util.py Executable file
View File

@ -0,0 +1,103 @@
"""
requirements:
pip install data-tree
pip install pathdict
"""
import json
import argparse
import data_tree
from pathdict import PathDict
class I18NFileUtil(object):
def diff(self, lang):
zh_json = self.load_json('./zh.json')
zh_tree = data_tree.Data_tree_node(arg_data=zh_json)
zh_paths = list(zh_tree.paths(arg_bool_get_paths_as_strings=True))
lang_json = self.load_json(f'./{lang}.json')
lang_tree = data_tree.Data_tree_node(arg_data=lang_json)
lang_paths = list(lang_tree.paths(arg_bool_get_paths_as_strings=True))
diff_paths = set(zh_paths) - set(lang_paths)
data = {}
diff_filepath = f'./diff-zh-{lang}.json'
with open(diff_filepath, 'w', encoding='utf-8') as f:
for path in diff_paths:
value = zh_tree.get(path)
if not isinstance(value, str):
continue
data[path] = value
json_data = json.dumps(data, ensure_ascii=False, indent=2)
f.write(json_data)
def update(self, lang):
diff_data = self.load_json(f'./diff-zh-{lang}.json')
lang_data = self.load_json(f'./{lang}.json')
lang_pdict = PathDict(lang_data, create_if_not_exists=True)
for key_path, value in diff_data.items():
lang_pdict[key_path] = value
with open(f'./{lang}.json', 'w', encoding='utf-8') as f:
data = self.pathdict_to_dict(lang_pdict)
data = json.dumps(data, ensure_ascii=False, indent=2)
f.write(data)
def pathdict_to_dict(self, data):
d = {}
for k, v in data.items():
if isinstance(v, PathDict):
v = self.pathdict_to_dict(v)
d[k] = v
return d
@staticmethod
def load_json(filename):
with open(filename, 'r') as f:
data = f.read()
return json.loads(data)
if __name__ == '__main__':
parser = argparse.ArgumentParser(
description="""
Lina i18n util
Example: \r\n
%(prog)s diff en(ja);
%(prog)s update en(ja);
"""
)
parser.add_argument(
'action', type=str, choices=("diff", "update"),
)
parser.add_argument(
'langs', type=str, choices=("en", "ja"), nargs='*'
)
args = parser.parse_args()
zh = 'zh'
en = 'en'
ja = 'ja'
# I18NFileUtil().diff(en)
# I18NFileUtil().update(en)
#
# I18NFileUtil().diff(ja)
# I18NFileUtil().update(ja)
action = args.action
langs = args.langs
print(action, '>>>>', args.langs)
util = I18NFileUtil()
method = getattr(util, action)
for _lang in langs:
method(_lang)