Files
MaaAssistantArknights/tools/AutoLocalization/src/auto_localization/cli.py
quyansiyuanwang 490cfbf033 perf & refactor: 重构 tools/AutoLocalization (#6995)
其中包含部分更优化和跟规范的算法或结构

---------

Co-authored-by: David <56174894+Constrat@users.noreply.github.com>
2023-10-21 16:17:34 +02:00

235 lines
8.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import argparse
import logging
import os
from shutil import copy
from pathlib import Path
from dotenv import load_dotenv
from .git import get_latest_file_content
from .xaml_load import XamlParser
logging.basicConfig(
level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s"
)
logging.debug(os.path.abspath(".env"))
solution_dir = Path.cwd()
for i in range(10):
cases = (
(solution_dir / "docs").exists(),
solution_dir / ".env" in solution_dir.iterdir(),
)
match cases:
case (_, True): # find .env by find itself
load_dotenv(dotenv_path=solution_dir / ".env")
break
case (True, _): # find .env by finding resource dir
env_path = solution_dir / "tools/AutoLocalization/.env"
if env_path.exists():
load_dotenv(dotenv_path=env_path)
break
case _: # if not found go up one level
solution_dir = solution_dir.parent
else:
logging.error("未找到.env文件")
exit(1)
root_path = solution_dir / os.getenv("LOCALIZATION_PATH")
assert root_path, "LOCALIZATION_PATH is not set"
zh_cn_path = os.path.join(root_path, "zh-cn.xaml")
en_us_path = os.path.join(root_path, "en-us.xaml")
zh_tw_path = os.path.join(root_path, "zh-tw.xaml")
ja_jp_path = os.path.join(root_path, "ja-jp.xaml")
ko_kr_path = os.path.join(root_path, "ko-kr.xaml")
def initiate(args):
logging.info("initiate project")
copy("./copy.env", ".env")
with open("./copy.env", "r") as f:
content = f.read()
api_key = input("please input openai api key:")
content = content.replace(
"OPENAI_API_KEY=YOUR_API_KEY\n", f"OPENAI_API_KEY={api_key}\n"
)
with open(".env", "w") as f:
f.write(content)
def create(args):
logging.info(f"create project{args}")
if args.language:
generate_by_language(args.test, args.force, root_path, args.language)
return
if args.force:
logging.info("force create")
translate_force(args.test)
else:
logging.info("no force create")
translate_compare(args.test)
def update(args):
logging.info("update project")
if args.language:
update_by_language(args.test, root_path, args.language)
return
translate_update(args.test)
def translate_force(test):
zh_cn_parser = XamlParser(zh_cn_path)
en_us_parser = XamlParser(en_us_path)
# 生成中文翻译
zh_cn_parser.translate_force(zh_tw_path, skip_translate=test)
zh_cn_parser.translate_compare(en_us_parser, skip_translate=test)
en_us_parser = XamlParser(en_us_path)
en_us_parser.translate_force(ja_jp_path, skip_translate=test)
en_us_parser.translate_force(ko_kr_path, skip_translate=test)
logging.info("generate force done")
def translate_compare(test):
zh_cn_parser = XamlParser(zh_cn_path)
en_us_parser = XamlParser(en_us_path)
zh_tw_parser = XamlParser(zh_tw_path)
ja_jp_parser = XamlParser(ja_jp_path)
ko_kr_parser = XamlParser(ko_kr_path)
zh_tw_parser.translate_compare(zh_cn_parser, skip_translate=test)
en_us_parser.translate_compare(zh_cn_parser, skip_translate=test)
en_us_parser = XamlParser(en_us_path)
ja_jp_parser.translate_compare(en_us_parser, skip_translate=test)
ko_kr_parser.translate_compare(en_us_parser, skip_translate=test)
logging.info("generate compare done")
def generate_by_language(test, force, path, language):
zh_cn_parser = XamlParser(zh_cn_path)
if force:
assert language in [
"en-us",
"zh-tw",
"ja-jp",
"ko-kr",
], f"language {language} is not supported"
language_path = os.path.join(path, f"{language}.xaml")
zh_cn_parser.translate_force(language_path, skip_translate=test)
return
en_us_parser = XamlParser(en_us_path)
match language:
case s if s in ["en-us", "zh-tw"]:
file_path = os.path.join(path, f"{language}.xaml")
parser = XamlParser(file_path)
parser.translate_compare(zh_cn_parser, skip_translate=test)
case s if s in ["ja-jp", "ko-kr"]:
file_path = os.path.join(path, f"{language}.xaml")
parser = XamlParser(file_path)
parser.translate_compare(en_us_parser, skip_translate=test)
case _:
raise ValueError(f"language {language} is not supported")
def translate_update(test):
zh_cn_new_parser = XamlParser(zh_cn_path)
zh_cn_old_content = get_latest_file_content(
file_path=zh_cn_path, encoding=zh_cn_new_parser.encoding
)
zh_cn_old_parser = XamlParser(
parse_type=1,
xaml_string=zh_cn_old_content,
language=zh_cn_new_parser.language,
encoding=zh_cn_new_parser.encoding,
)
en_us_new_parser = XamlParser(en_us_path)
en_us_old_content = get_latest_file_content(
file_path=en_us_path, encoding=en_us_new_parser.encoding
)
en_us_old_parser = XamlParser(
parse_type=1,
xaml_string=en_us_old_content,
language=en_us_new_parser.language,
encoding=en_us_new_parser.encoding,
)
zh_tw_parser = XamlParser(zh_tw_path)
ja_jp_parser = XamlParser(ja_jp_path)
ko_kr_parser = XamlParser(ko_kr_path)
zh_tw_parser.update_translate(
zh_cn_old_parser, zh_cn_new_parser, skip_translate=test
)
# TODO: 英文更新翻译逻辑?
en_us_new_parser.translate_compare(zh_cn_new_parser, skip_translate=test)
en_us_new_parser = XamlParser(en_us_path)
ja_jp_parser.update_translate(
en_us_old_parser, en_us_new_parser, skip_translate=test
)
ko_kr_parser.update_translate(
en_us_old_parser, en_us_new_parser, skip_translate=test
)
logging.info("update done")
def update_by_language(test, path, language):
match language:
case s if s in ["en-us", "zh-tw"]:
compare_file_path = zh_cn_path
case s if s in ["ja-jp", "ko-kr"]:
compare_file_path = en_us_path
case _:
raise ValueError(f"language {language} is not supported")
compare_new_parser = XamlParser(compare_file_path)
compare_old_content = get_latest_file_content(
file_path=compare_file_path, encoding=compare_new_parser.encoding
)
compare_old_parser = XamlParser(
parse_type=1,
xaml_string=compare_old_content,
language=compare_new_parser.language,
encoding=compare_new_parser.encoding,
)
file_path = os.path.join(path, f"{language}.xaml")
parser = XamlParser(file_path)
parser.update_translate(compare_old_parser, compare_new_parser, skip_translate=test)
def cli_ui(test=None):
parser = argparse.ArgumentParser(description="一个用于自动翻译本地化目录下不同语言文档的命令行工具。")
subparsers = parser.add_subparsers()
parser_init = subparsers.add_parser("init", help="初始化工具")
parser_init.set_defaults(func=initiate)
parser_create = subparsers.add_parser(
"create", help="初始化其他语言的文档,可选参数:-f --force, -t --test"
)
parser_create.set_defaults(func=create)
parser_create.add_argument("-f", "--force", action="store_true", help="强制覆盖已有的部分")
parser_create.add_argument(
"-t", "--test", action="store_true", help="测试更新情况跳过chatgpt"
)
parser_create.add_argument(
"-l", "--language", help="指定语言可选参数en-us, zh-tw, ja-jp, ko-kr"
)
parser_update = subparsers.add_parser("update", help="更新本地化翻译,可选参数:-t --test")
parser_update.set_defaults(func=update)
parser_update.add_argument(
"-t", "--test", action="store_true", help="测试更新情况跳过chatgpt"
)
parser_update.add_argument(
"-l", "--language", help="指定语言可选参数en-us, zh-tw, ja-jp, ko-kr"
)
if test:
args = parser.parse_args(test)
else:
args = parser.parse_args()
args.func(args)
def main():
cli_ui()
if __name__ == "__main__":
cli_ui(["init"])
print()