diff --git a/Data/Text_EnUS/Z-INPUTER.py b/Data/Text_EnUS/Z-INPUTER.py new file mode 100644 index 0000000..58eae50 --- /dev/null +++ b/Data/Text_EnUS/Z-INPUTER.py @@ -0,0 +1,164 @@ +import os +import json +import traceback + +def load_json(path): + """讀取JSON檔案,順便在控制台顯示加載狀態""" + if not os.path.exists(path): + print(f"⚠ 檔案不存在,已略過:{path}") + return {} + try: + with open(path, "r", encoding="utf-8") as f: + data = json.load(f) + print(f"✔ 已從 {os.path.basename(path)} 載入 {len(data)} 條翻譯項") + return data + except Exception as e: + print(f"❌ 載入 {path} 時發生錯誤:{str(e)}") + return {} + +def apply_translation(dirpath): + """把翻譯內容實際套用到檔案裡""" + print(f"\n🔍 正在處理目錄:{dirpath}") + + # 準備三個翻譯檔案的路徑 + trans_paths = { + "normal": os.path.join(dirpath, "translate", "translation.json"), + "special": os.path.join(dirpath, "translate", "translation_special.json"), + "namedesc": os.path.join(dirpath, "translate", "translation_namedesc.json") + } + + # 把三個翻譯檔案的內容都讀進來 + translations = { + "normal": load_json(trans_paths["normal"]), + "special": load_json(trans_paths["special"]), + "namedesc": load_json(trans_paths["namedesc"]) + } + + # 先把普通和特殊翻譯混在一起 + combined = {} + combined.update(translations["normal"]) + combined.update(translations["special"]) + print(f"📦 合併普通+特殊翻譯共 {len(combined)} 條") + + # 處理那些有前綴的翻譯內容(像是name:、desc:這種的) + namedesc_count = 0 + for key, value in translations["namedesc"].items(): + try: + # 把key拆成檔案名稱和行號 + filename, line_no = key.split("__") + line_no = int(line_no) + src_path = os.path.join(dirpath, filename) + + # 檢查原始檔案是否存在 + if not os.path.exists(src_path): + print(f"⚠ 注意!找不到來源檔案:{src_path}") + continue + + # 把原始檔案內容全部讀出來 + with open(src_path, "r", encoding="utf-8") as f: + lines = f.readlines() + + # 檢查行號是不是在合理範圍 + if line_no >= len(lines): + print(f"⚠ 行號 {line_no} 在 {filename} 超出範圍(最大 {len(lines)-1})") + continue + + # 找出原本的前綴是name:、desc:還是menuDesc: + original = lines[line_no].strip() + prefix = "" + for field in ["name:", "desc:", "menuDesc:"]: + if original.startswith(field): + prefix = field + break + + if prefix: + # 把前綴和翻譯值組合起來 + combined[key] = prefix + value + namedesc_count += 1 + else: + print(f"⚠ 在 {filename} 第 {line_no} 行找不到前綴:{original}") + except Exception as e: + print(f"❌ 處理 namedesc 鍵值 '{key}' 時出錯:{str(e)}") + + print(f"📦 新增 {namedesc_count} 條名稱描述翻譯") + + # 建立檔案修改對照表 + file_map = {} + total_updates = 0 + for key, value in combined.items(): + try: + # 再次拆分鍵值取得檔案資訊 + filename, line_no = key.split("__") + line_no = int(line_no) + + # 如果還沒讀過這個檔案,就先讀取內容 + if filename not in file_map: + src_path = os.path.join(dirpath, filename) + if not os.path.exists(src_path): + print(f"⚠ 注意!找不到目標檔案:{src_path}") + continue + with open(src_path, "r", encoding="utf-8") as f: + file_map[filename] = { + "path": src_path, + "lines": f.readlines(), + "modified": False # 用來記錄是否有修改 + } + + # 再次檢查行號是否有效 + if line_no >= len(file_map[filename]["lines"]): + print(f"⚠ 行號 {line_no} 在 {filename} 超出範圍(最大 {len(file_map[filename]['lines'])-1})") + continue + + # 準備要替換的新內容 + original = file_map[filename]["lines"][line_no].strip() + new_line = f"{value}\n" + + # 只有當內容確實不同時才修改 + if file_map[filename]["lines"][line_no] != new_line: + file_map[filename]["lines"][line_no] = new_line + file_map[filename]["modified"] = True + total_updates += 1 + print(f"✏ 已更新 {filename} 第 {line_no} 行:") + print(f" 原始內容:{original[:50]}...") + print(f" 新內容:{new_line.strip()[:50]}...") + except Exception as e: + print(f"❌ 套用翻譯 '{key}' 時發生錯誤:{str(e)}") + + # 開始正式寫入修改 + success_count = 0 + for filename, data in file_map.items(): + if data["modified"]: + try: + # 先建立備份檔案(安全起見) + backup_path = data["path"] + ".bak" + os.replace(data["path"], backup_path) + + # 寫入新內容 + with open(data["path"], "w", encoding="utf-8") as f: + f.writelines(data["lines"]) + + print(f"✔ 成功更新檔案:{filename}(已建立備份)") + success_count += 1 + except Exception as e: + print(f"❌ 寫入 {filename} 失敗:{str(e)}") + traceback.print_exc() + + print(f"\n🎯 總共套用 {total_updates} 處更新") + print(f"✅ 成功修改 {success_count}/{len(file_map)} 個檔案") + +def walk_and_apply(root="."): + """自動掃描資料夾找需要處理的目錄""" + print(f"🔎 開始從以下路徑進行翻譯作業:{os.path.abspath(root)}") + for dirpath, dirnames, filenames in os.walk(root): + if "translate" in dirnames: + print(f"\n{'='*50}") + try: + apply_translation(dirpath) + except Exception as e: + print(f"❌ 在 {dirpath} 發生嚴重錯誤:{str(e)}") + traceback.print_exc() + print(f"{'='*50}") + +if __name__ == "__main__": + walk_and_apply() + print("\n🏁 翻譯作業執行完畢!") \ No newline at end of file diff --git a/Data/Text_EnUS/output.py b/Data/Text_EnUS/Z-OUTPUTER.py similarity index 53% rename from Data/Text_EnUS/output.py rename to Data/Text_EnUS/Z-OUTPUTER.py index 05f16c1..893f119 100644 --- a/Data/Text_EnUS/output.py +++ b/Data/Text_EnUS/Z-OUTPUTER.py @@ -2,61 +2,82 @@ import os import json def should_ignore(line): + """檢查這行是不是要跳過不處理的(比如註解或特殊標記)""" line = line.strip() return line.startswith(("@", ">", ".", "END")) or line == "" def collect_texts_from_txt(path): - normal_texts = {} - special_texts = {} - namedesc_texts = {} + """從目錄下的所有txt檔案裡收集需要翻譯的文字""" + normal_texts = {} # 存普通對話文本 + special_texts = {} # 存星號開頭的特殊文本 + namedesc_texts = {} # 存名稱和描述類的文本 + # 掃描目錄裡所有txt檔案 for filename in os.listdir(path): if filename.endswith(".txt"): file_path = os.path.join(path, filename) + # 讀取檔案全部內容 with open(file_path, "r", encoding="utf-8") as f: lines = f.readlines() + # 逐行分析內容 for i, line in enumerate(lines): stripped = line.strip() if should_ignore(stripped): - continue + continue # 跳過不需要處理的行 + # 生成唯一鍵值(檔案名+行號) key = f"{filename}__{i}" + # 遇到名稱或描述類的文本(name:/desc:/menuDesc:) if stripped.startswith(("name:", "desc:", "menuDesc:")): - # 把开头的 name:/desc:/menuDesc: 去掉,只保留后面的文本 + # 把開頭的標記切掉,只留內容文字 idx = stripped.find(":") namedesc_texts[key] = stripped[idx + 1:].strip() + # 遇到星號開頭的就是特殊文本 elif stripped.startswith("*"): special_texts[key] = stripped + # 剩下的都當普通文本處理 else: normal_texts[key] = stripped return normal_texts, special_texts, namedesc_texts def save_json(data, path, name): + """把整理好的資料存成JSON檔案""" + # 先建立放翻譯檔的目錄(如果不存在就自動創建) translate_dir = os.path.join(path, "translate") os.makedirs(translate_dir, exist_ok=True) + + # 組合完整檔案路徑 json_path = os.path.join(translate_dir, name) + # 寫入JSON格式(保持非ASCII字原樣顯示) with open(json_path, "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False, indent=2) def walk_and_process(root="."): + """開始掃描整個資料夾結構,找出需要處理的目錄""" + # 走訪所有子目錄 for dirpath, dirnames, filenames in os.walk(root): + # 檢查目錄裡是否有txt檔案 txts_in_dir = [f for f in filenames if f.endswith(".txt")] if not txts_in_dir: - continue + continue # 跳過沒有txt檔的目錄 + # 收集三類文本資料 normal, special, namedesc = collect_texts_from_txt(dirpath) + + # 分別儲存不同類型的翻譯文件 if normal: save_json(normal, dirpath, "translation.json") - print(f"✔ Saved translation.json for {dirpath}") + print(f"✔ 已生成 translation.json 於 {dirpath}") # 提示 if special: save_json(special, dirpath, "translation_special.json") - print(f"✔ Saved translation_special.json for {dirpath}") + print(f"✔ 已生成 translation_special.json 於 {dirpath}") if namedesc: save_json(namedesc, dirpath, "translation_namedesc.json") - print(f"✔ Saved translation_namedesc.json for {dirpath}") + print(f"✔ 已生成 translation_namedesc.json 於 {dirpath}") if __name__ == "__main__": walk_and_process() + print("\n🏁 文本收集作業完成!") # 結尾提示 \ No newline at end of file diff --git a/Data/Text_EnUS/input.py b/Data/Text_EnUS/input.py deleted file mode 100644 index f2902cf..0000000 --- a/Data/Text_EnUS/input.py +++ /dev/null @@ -1,67 +0,0 @@ -import os -import json - -def load_json(path): - if not os.path.exists(path): - return {} - with open(path, "r", encoding="utf-8") as f: - return json.load(f) - -def apply_translation(dirpath): - normal_path = os.path.join(dirpath, "translate", "translation.json") - special_path = os.path.join(dirpath, "translate", "translation_special.json") - namedesc_path = os.path.join(dirpath, "translate", "translation_namedesc.json") - - normal = load_json(normal_path) - special = load_json(special_path) - namedesc = load_json(namedesc_path) - - combined = {} - for key, value in normal.items(): - combined[key] = value - for key, value in special.items(): - combined[key] = value - for key, value in namedesc.items(): - # 判断 key 是属于 name: / desc: / menuDesc: 的 - filename, line_no = key.split("__") - line_no = int(line_no) - with open(os.path.join(dirpath, filename), "r", encoding="utf-8") as f: - lines = f.readlines() - if line_no >= len(lines): - continue - original_line = lines[line_no].strip() - if original_line.startswith("name:"): - prefix = "name:" - elif original_line.startswith("desc:"): - prefix = "desc:" - elif original_line.startswith("menuDesc:"): - prefix = "menuDesc:" - else: - prefix = "" - combined[key] = prefix + value - - file_line_map = {} - for key, value in combined.items(): - filename, line_no = key.split("__") - line_no = int(line_no) - - if filename not in file_line_map: - file_path = os.path.join(dirpath, filename) - with open(file_path, "r", encoding="utf-8") as f: - file_line_map[filename] = f.readlines() - - file_line_map[filename][line_no] = value + "\n" - - for filename, lines in file_line_map.items(): - file_path = os.path.join(dirpath, filename) - with open(file_path, "w", encoding="utf-8") as f: - f.writelines(lines) - print(f"✔ Updated: {file_path}") - -def walk_and_apply(root="."): - for dirpath, dirnames, filenames in os.walk(root): - if "translate" in dirnames: - apply_translation(dirpath) - -if __name__ == "__main__": - walk_and_apply()