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(智元界)原创发布