AI 工具开发实战(1):开发一个命令行 AI 翻译工具——支持中英互译、多语言、文件翻译
一个轻量的命令行翻译工具,不依赖任何第三方翻译 API,直接用大模型的能力做翻译。
本篇从零开始,写完你就能在终端里用 aitrans 命令翻译文本和文件。
为什么不用 Google 翻译 API
Google 翻译 API 按字符收费,量大不便宜。而且把文本发给 Google,数据隐私方面有些场景不适合。用大模型 API 替代的好处是:选国产模型(DeepSeek ¥2/百万 token),翻译一万字只要几分钱。
项目结构
aitrans/
├── aitrans.py # 主程序(Click CLI)
├── translators.py # 翻译引擎
├── config.py # 配置管理
├── requirements.txt
└── .env # API Key
安装依赖
mkdir aitrans && cd aitrans
python -m venv venv && source venv/bin/activate
# requirements.txt
click==8.1.7
python-dotenv==1.0.0
openai==1.50.0
pip install -r requirements.txt
配置文件
# config.py
import os
from dotenv import load_dotenv
load_dotenv()
# 支持多个模型后端,按需切换
MODELS = {
"deepseek": {
"api_key": os.getenv("DEEPSEEK_API_KEY", ""),
"base_url": "https://api.deepseek.com/v1",
"model": "deepseek-chat",
},
"doubao": {
"api_key": os.getenv("DOUBAO_API_KEY", ""),
"base_url": "https://ark.cn-beijing.volces.com/api/v3",
"model": "doubao-2.1-pro",
},
}
DEFAULT_BACKEND = os.getenv("AI_BACKEND", "deepseek")
DEFAULT_TARGET = os.getenv("AI_DEFAULT_LANG", "中文")
翻译引擎
# translators.py
from openai import OpenAI
from config import MODELS, DEFAULT_BACKEND
class AITranslator:
"""AI 翻译引擎。"""
def __init__(self, backend=None):
backend = backend or DEFAULT_BACKEND
cfg = MODELS[backend]
self.client = OpenAI(
api_key=cfg["api_key"],
base_url=cfg["base_url"],
)
self.model = cfg["model"]
def translate(self, text, target_lang="中文", source_lang=None):
"""翻译文本。"""
source_hint = f",源语言是{source_lang}" if source_lang else ""
prompt = f"将以下文本翻译成{target_lang}{source_hint}。只输出译文,不要解释:\n\n{text}"
response = self.client.chat.completions.create(
model=self.model,
messages=[
{"role": "system", "content": f"你是一个专业的翻译助手。输出简洁的译文,不添加任何解释。"},
{"role": "user", "content": prompt},
],
temperature=0.1, # 翻译场景用低温度
max_tokens=min(len(text) * 2, 4096),
)
return response.choices[0].message.content.strip()
def batch_translate(self, texts, target_lang="中文"):
"""批量翻译(一次调用完成)。"""
numbered = "\n\n---\n\n".join(
f"[{i+1}] {t}" for i, t in enumerate(texts)
)
prompt = f"将以下{len(texts)}段文本分别翻译成{target_lang},保持编号:\n\n{numbered}"
response = self.client.chat.completions.create(
model=self.model,
messages=[{"role": "user", "content": prompt}],
temperature=0.1,
)
# 解析带编号的返回
result = response.choices[0].message.content
return self._parse_batch(result, len(texts))
def _parse_batch(self, response, count):
"""解析批量翻译结果。"""
import re
translations = []
for i in range(1, count + 1):
pattern = rf"\[{i}\](.*?)(?=\[\d+\]|$)"
match = re.search(pattern, response, re.DOTALL)
if match:
translations.append(match.group(1).strip())
else:
translations.append("")
return translations
CLI 主程序
#!/usr/bin/env python3
# aitrans.py
import click
from translators import AITranslator
LANG_MAP = {
"en": "英文", "zh": "中文", "ja": "日文",
"ko": "韩文", "fr": "法文", "de": "德文",
"es": "西班牙文", "ru": "俄文", "ar": "阿拉伯文",
}
@click.group()
def cli():
"""aitrans - AI 驱动的命令行翻译工具"""
pass
@cli.command()
@click.argument("text")
@click.option("--to", "-t", default="中文", help="目标语言")
@click.option("--from", "-f", "from_lang", default=None, help="源语言(可选)")
@click.option("--backend", "-b", default=None, help="模型后端(deepseek/doubao)")
def trans(text, to, from_lang, backend):
"""翻译一段文本。"""
t = AITranslator(backend)
result = t.translate(text, target_lang=to, source_lang=from_lang)
click.echo(result)
@cli.command()
@click.argument("filepath", type=click.Path(exists=True))
@click.option("--to", "-t", default="中文", help="目标语言")
@click.option("--output", "-o", default=None, help="输出文件(默认覆盖原文件加 .trans 后缀)")
@click.option("--backend", "-b", default=None)
def file(filepath, to, output, backend):
"""翻译一个文件。"""
with open(filepath, "r", encoding="utf-8") as f:
content = f.read()
t = AITranslator(backend)
# 分段翻译长文件
chunks = content.split("\n\n")
if len(content) > 3000 and len(chunks) > 1:
results = t.batch_translate(chunks[:10], target_lang=to)
translated = "\n\n".join(results)
else:
translated = t.translate(content, target_lang=to)
output = output or f"{filepath}.trans"
with open(output, "w", encoding="utf-8") as f:
f.write(translated)
click.echo(f"✅ 已翻译并保存到 {output}")
@cli.command()
@click.option("--backend", "-b", default=None)
def repl(backend):
"""交互式翻译模式。"""
t = AITranslator(backend)
click.echo("交互翻译模式(输入 :q 退出,:en 切换目标为英文,:zh 切换为中文)")
target = "中文"
while True:
text = click.prompt(">", prompt_suffix=" ")
if text == ":q":
break
elif text.startswith(":"):
lang = LANG_MAP.get(text[1:], text[1:])
click.echo(f" 目标语言切换为:{lang}")
target = lang
continue
result = t.translate(text, target_lang=target)
click.echo(f" {result}")
click.echo()
if __name__ == "__main__":
cli()
使用方式
# .env 配置
DEEPSEEK_API_KEY=sk-your-key
AI_BACKEND=deepseek
# 翻译文本
python aitrans.py trans "Hello, this is a test message"
# → 你好,这是一条测试消息。
# 指定目标语言
python aitrans.py trans "Hello world" --to 日文
# → こんにちは、世界
# 翻译文件
python aitrans.py file README.md --to 中文
# → ✅ 已翻译并保存到 README.md.trans
# 交互模式
python aitrans.py repl
> The transformer architecture is widely used
转换器架构被广泛应用于自然语言处理。
> :en # 切换目标为英文
目标语言切换为:英文
> 今天天气真好
The weather is really nice today.
设为全局命令
# 在 ~/.zshrc 或 ~/.bashrc 中加
alias aitrans='python /path/to/aitrans/aitrans.py'
# 之后直接在终端用
aitrans trans "Hello world"
成本分析
翻译一本 10 万字的英文小说到中文,用 DeepSeek-V4(¥2/1M token):
- 输入约 15 万 token + 输出约 12 万 token
- 费用:约 ¥0.54
对比 Google Translate API(约 ¥20/百万字符,同样 10 万字约 ¥2),价格接近但翻译质量更好、支持批量操作。
总结
这个工具的核心功能就三个:
1. aitrans trans:翻译文本
2. aitrans file:翻译文件
3. aitrans repl:交互式翻译
你可以根据自己的需要扩展:加语音输入、加流式输出、加缓存机制、加更多语言支持。
下一篇将开发一个本地 RAG 知识库工具——丢给它一个文件夹,直接问答。
本文是 《AI 开发者工具链实战》 系列的第 1 篇。
本文由 Zyentor(智元界)原创发布