-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcli.py
More file actions
123 lines (103 loc) · 3.99 KB
/
cli.py
File metadata and controls
123 lines (103 loc) · 3.99 KB
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
"""
PPT Translator CLI
用法:
python cli.py input.pptx -o output.pptx --src 中文 --tgt 英文
python cli.py input.pptx --tgt 日文
python cli.py input.pptx --tgt 英文 --no-overflow
"""
import argparse
import os
import sys
from pathlib import Path
# 加载 .env 文件
def _load_env():
env_path = Path(__file__).parent / ".env"
if env_path.exists():
for line in env_path.read_text(encoding="utf-8").splitlines():
line = line.strip()
if line and not line.startswith("#") and "=" in line:
k, v = line.split("=", 1)
k, v = k.strip(), v.strip()
if k and v:
os.environ[k] = v
_load_env()
from translator import translate_pptx
LANG_ALIASES = {
"zh": "中文", "cn": "中文", "chinese": "中文",
"en": "英文", "english": "英文",
"ja": "日文", "jp": "日文", "japanese": "日文",
"ko": "韩文", "korean": "韩文",
"fr": "法文", "french": "法文",
"de": "德文", "german": "德文",
"es": "西班牙文", "spanish": "西班牙文",
}
def normalize_lang(lang: str) -> str:
return LANG_ALIASES.get(lang.lower(), lang)
def main():
parser = argparse.ArgumentParser(
description="PPT Translator — 保留布局的多语言 PPT 翻译工具",
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog="""
示例:
python cli.py 报告.pptx --tgt 英文
python cli.py report.pptx --src en --tgt zh -o 报告_中文.pptx
python cli.py deck.pptx --tgt 日文 --no-overflow
"""
)
parser.add_argument("input", help="输入 PPTX 文件路径")
parser.add_argument("-o", "--output", help="输出文件路径(默认:input_translated.pptx)")
parser.add_argument("--src", default="中文", help="源语言(默认:中文)")
parser.add_argument("--tgt", default="英文", help="目标语言(默认:英文)")
parser.add_argument("--no-overflow", action="store_true", help="禁用文字溢出自动缩小")
parser.add_argument("--no-expand", action="store_true", help="禁用文字框宽度自动扩展")
parser.add_argument("--api-key", help="Anthropic API Key(默认读取 ANTHROPIC_API_KEY 环境变量)")
parser.add_argument("-q", "--quiet", action="store_true", help="安静模式,不输出进度")
args = parser.parse_args()
# 检查输入文件
if not os.path.exists(args.input):
print(f"❌ 文件不存在:{args.input}")
sys.exit(1)
if not args.input.lower().endswith(".pptx"):
print(f"❌ 只支持 .pptx 格式")
sys.exit(1)
# 确定输出路径
if args.output:
output_path = args.output
else:
base = os.path.splitext(args.input)[0]
output_path = f"{base}_translated.pptx"
src = normalize_lang(args.src)
tgt = normalize_lang(args.tgt)
if not args.quiet:
print(f"📄 输入:{args.input}")
print(f"📝 翻译:{src} → {tgt}")
print(f"💾 输出:{output_path}")
print()
try:
report = translate_pptx(
input_path=args.input,
output_path=output_path,
src_lang=src,
tgt_lang=tgt,
api_key=args.api_key,
handle_text_overflow=not args.no_overflow,
expand_textboxes=not args.no_expand,
verbose=not args.quiet,
)
if not args.quiet:
print(f"\n📊 报告:")
print(f" 处理页面/文件:{report['slides_processed']}")
print(f" 翻译文字条数:{report['texts_translated']}")
if report["errors"]:
print(f" ⚠️ 错误 {len(report['errors'])} 个(见上方)")
print(f"\n✅ 已保存:{output_path}")
except KeyboardInterrupt:
print("\n已取消。")
sys.exit(1)
except Exception as e:
print(f"\n❌ 翻译失败:{e}")
import traceback
traceback.print_exc()
sys.exit(1)
if __name__ == "__main__":
main()