128 lines
4.4 KiB
Python
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() |