Files
SFX-Library-Automation/translate_folders.py
2025-11-20 14:28:23 +08:00

128 lines
4.4 KiB
Python

import os
import requests
import sys
# ================= 配置区域 =================
MODEL_NAME = "gemma3:12b"
OLLAMA_API_URL = "http://localhost:11434/api/chat"
# 翻译缓存
translation_cache = {}
# ===========================================
def get_translation(text, model):
if text in translation_cache:
return translation_cache[text]
system_prompt = (
"You are a professional translator for Audio/Video asset libraries. "
"Translate the category/folder name into concise Simplified Chinese. "
"Rules: 1. Only output the Chinese translation. 2. Do not explain. "
"3. Keep terms like 'SFX', 'BGM', 'Foley' accurate."
)
payload = {
"model": model,
"messages": [
{"role": "system", "content": system_prompt},
{"role": "user", "content": f'Translate folder name: "{text}"'}
],
"stream": False,
"options": {"temperature": 0.1}
}
try:
response = requests.post(OLLAMA_API_URL, json=payload, timeout=60)
if response.status_code == 200:
translated_text = response.json()['message']['content'].strip()
# 清洗特殊字符
for char in '<>:"/\|?*\'"“”。':
translated_text = translated_text.replace(char, '')
if translated_text:
translation_cache[text] = translated_text
return translated_text
except:
pass
return None
def is_already_chinese(text):
"""只要包含任意一个中文字符,就认为是中文命名的"""
for char in text:
if '\u4e00' <= char <= '\u9fff':
return True
return False
def process_folder_renaming():
while True:
target_dir = input("\n请拖入(或粘贴)要处理文件夹的【根目录路径】: ").strip().strip('"').strip("'")
if os.path.exists(target_dir):
break
print("❌ 路径不存在,请重试。")
print("\n请选择模式:")
print("1. 仅模拟 (推荐先看一眼)")
print("2. 直接执行")
is_dry_run = input("请输入数字 (默认1): ").strip() != '2'
if not is_dry_run:
print("\n>>> ⚠️ 警告:即将修改文件夹名称! <<<")
count = 0
success_count = 0
skipped_chinese_count = 0
print(f"\n正在扫描并分析目录结构 (倒序模式)...")
# topdown=False 确保先处理最里面的子文件夹
for root, dirs, files in os.walk(target_dir, topdown=False):
for dirname in dirs:
# 【核心保护机制】
# 如果文件夹名字里已经有中文,直接跳过,并在控制台显示灰色/提示信息
if is_already_chinese(dirname):
# 这里为了不刷屏,只在 dry_run 或者特定情况下打印,或者只计数
# 既然你担心根目录被改,我们可以把跳过的信息打印出来让你放心
# print(f"[跳过-已含中文] {dirname}")
skipped_chinese_count += 1
continue
count += 1
print(f"[{count}] 正在思考: {dirname} ...", end="\r")
cn_name = get_translation(dirname, MODEL_NAME)
padding = " " * 40
if cn_name:
new_dirname = f"{cn_name}{dirname}"
old_path = os.path.join(root, dirname)
new_path = os.path.join(root, new_dirname)
if is_dry_run:
print(f"[模拟] {dirname} -> 【{cn_name}{dirname}{padding}")
else:
try:
os.rename(old_path, new_path)
print(f"[成功] {new_dirname}{padding}")
success_count += 1
except Exception as e:
print(f"[失败] {dirname}: {e}{padding}")
print("\n" + "-"*30)
print(f"✅ 完成!")
print(f" - 翻译并重命名: {success_count} 个文件夹")
print(f" - 智能避开已汉化目录: {skipped_chinese_count}")
def main():
print("=== 子目录智能汉化工具 (保护根目录版) ===")
print(f"当前模型: {MODEL_NAME}")
while True:
process_folder_renaming()
if input("\n🔄 是否继续处理其他位置?(y/n): ").lower() != 'y':
break
if __name__ == "__main__":
main()