-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtranslator.py
146 lines (120 loc) · 5.35 KB
/
translator.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#!/usr/bin/python3
# -*- coding:utf-8 -*-
# @FileName : translator.py
# @Author : kang.chen
# @Time : 2023/3/17
# @Note :
import os
from enum import Enum
from typing import Callable, Optional
import archived_card
import main
import md_card
import ygocdb
from util import str_to_bytes, bytes_to_str
TRANSLATED_LIST_PATH = "temp/translator/translated_card_list.txt"
MISMATCHED_LIST_PATH = "temp/translator/mismatched_card_list.txt"
DUPLICATE_MATCHED_LIST_PATH = "temp/translator/duplicate_matched_card_list.txt"
class TranslateResult(Enum):
SUCCESS = 0,
MISMATCHED = 1,
DUPLICATED = 2
def translate_by_archived_cards(card: md_card.Card, archived_card_list: list[archived_card.Card]) -> TranslateResult:
for c in archived_card_list:
if c.md_name == card.md_name and c.md_desc == card.md_desc:
if c.translate_name != "":
card.translate_name = c.translate_name
else:
card.translate_name = c.md_name
if c.translate_desc != "":
card.translate_desc = c.translate_desc
else:
card.translate_desc = c.md_desc
card.translate_pdesc = c.translate_pdesc
return TranslateResult.SUCCESS
return TranslateResult.MISMATCHED
def translate_by_ygocdb_with_md_name(card: md_card.Card, translate_info_list: list[ygocdb.Card]) -> TranslateResult:
found_info = None
for info in translate_info_list:
if info.md_name != card.md_name:
continue
if found_info is not None:
return TranslateResult.DUPLICATED
found_info = info
if found_info is None:
return TranslateResult.MISMATCHED
card.translate_name = found_info.cn_name
card.translate_desc = found_info.desc
card.translate_pdesc = found_info.p_desc
return TranslateResult.SUCCESS
def translate_by_ygocdb_with_en_name(card: md_card.Card, translate_info_list: list[ygocdb.Card]) -> TranslateResult:
found_info = None
for info in translate_info_list:
if info.en_name != card.md_name:
continue
if found_info is not None:
return TranslateResult.DUPLICATED
found_info = info
if found_info is None:
return TranslateResult.MISMATCHED
card.translate_name = found_info.cn_name
card.translate_desc = found_info.desc
card.translate_pdesc = found_info.p_desc
return TranslateResult.SUCCESS
def __name_process_for_md_name(s: str) -> str:
s_bytes = str_to_bytes(s)
s_bytes = s_bytes.replace(b"\xC2\xA0", b"\x20")
return bytes_to_str(s_bytes)
def translate(cards: list[md_card.Card], ui: Optional[Callable]) -> None:
archived_card_list = archived_card.load_from_file()
print("len(archived_card_list) :", len(archived_card_list))
translate_info_list: list[ygocdb.Card] = ygocdb.load_cards_from_ygocdb_file()
# card list 中文预处理
for card in cards:
card.md_name = __name_process_for_md_name(card.md_name)
mismatched_cards = []
duplicate_matched_cards = []
# skip card 0
for card in cards[1:]:
if callable(ui):
ui(f"翻译中 - [{cards.index(card) + 1}/{len(cards)}] [{card.md_name}]")
translate_result = translate_by_archived_cards(card, archived_card_list)
if TranslateResult.SUCCESS == translate_result:
continue
translate_result = translate_by_ygocdb_with_md_name(card, translate_info_list)
if TranslateResult.DUPLICATED == translate_result:
duplicate_matched_cards.append(card)
elif TranslateResult.MISMATCHED == translate_result:
# 衍生物
if card.md_name.endswith("衍生物"):
continue
# 有些卡还是全英文的, 按英文去匹配
if card.md_name.isascii():
translate_result = translate_by_ygocdb_with_en_name(card, translate_info_list)
if TranslateResult.DUPLICATED == translate_result:
duplicate_matched_cards.append(card)
elif TranslateResult.MISMATCHED == translate_result:
# 衍生物
if card.md_name.endswith(" Token"):
continue
mismatched_cards.append(card)
else:
mismatched_cards.append(card)
if TRANSLATED_LIST_PATH is not None:
os.makedirs(os.path.dirname(TRANSLATED_LIST_PATH), exist_ok=True)
with open(TRANSLATED_LIST_PATH, "w", encoding="utf-8") as f:
for card in cards:
f.write(str(card))
if MISMATCHED_LIST_PATH is not None:
os.makedirs(os.path.dirname(MISMATCHED_LIST_PATH), exist_ok=True)
with open(MISMATCHED_LIST_PATH, "w", encoding="utf-8") as f:
f.write(archived_card.save_md_cards_as_archived_format(mismatched_cards))
if DUPLICATE_MATCHED_LIST_PATH is not None:
os.makedirs(os.path.dirname(DUPLICATE_MATCHED_LIST_PATH), exist_ok=True)
with open(DUPLICATE_MATCHED_LIST_PATH, "w", encoding="utf-8") as f:
f.write(archived_card.save_md_cards_as_archived_format(duplicate_matched_cards))
""" 没有匹配成功的卡,需要手动归档 """
if 0 != len(mismatched_cards) or 0 != len(duplicate_matched_cards):
raise RuntimeError(
f"mismatched_cards:{len(mismatched_cards)} duplicate_matched_cards:{len(duplicate_matched_cards)}")
pass