Linux CLI 翻译工具 trans 0.9.7 进阶:103种语言的脚本集成与API调用实战指南
在全球化协作和跨语言开发的日常工作中,命令行翻译工具已成为技术工作者的刚需。trans 0.9.7作为当前功能最强大的开源翻译工具之一,其支持103种语言的特性远超同类产品。本文将深入探讨如何将其集成到自动化工作流中,通过三个实战脚本展示批量处理、交互式翻译和API调用的高阶用法。
1. trans工具核心能力解析
trans(Translate Shell)是一个基于多引擎的命令行翻译工具,0.9.7版本在语言覆盖率和稳定性上有显著提升。与常见翻译工具相比,其独特优势在于:
- 多引擎支持:默认使用Google翻译,也可切换Bing、Yandex等引擎
- 语言覆盖广:支持从阿非利卡语到祖鲁语等103种语言
- 格式保留:完美处理代码片段、Markdown等特殊格式文本
- 发音功能:支持文本转语音输出(需festival或espeak)
安装方式如下:
# Debian/Ubuntu sudo apt install translate-shell # 源码编译(获取最新版) git clone https://github.com/soimort/translate-shell cd translate-shell make sudo make install验证安装成功:
trans -V # 应输出:Translate Shell 0.9.72. 批量文件翻译自动化脚本
处理多语言文档时,手动逐个文件翻译效率低下。以下脚本实现目录内所有文本文件的自动翻译:
#!/bin/bash # batch_translate.sh # 参数检查 if [ $# -lt 2 ]; then echo "Usage: $0 <source_lang> <target_lang> [input_dir] [output_dir]" exit 1 fi SRC_LANG=$1 TGT_LANG=$2 INPUT_DIR=${3:-./input} OUTPUT_DIR=${4:-./output} # 创建输出目录 mkdir -p "$OUTPUT_DIR" # 支持的文件类型扩展名 FILE_TYPES=("txt" "md" "csv" "html") # 核心处理函数 process_file() { local input_file=$1 local filename=$(basename "$input_file") local output_file="$OUTPUT_DIR/${filename%.*}_$TGT_LANG.${filename##*.}" echo "Translating $filename ($SRC_LANG → $TGT_LANG)..." # 保持原始格式的特殊处理 if [[ $input_file == *.html ]]; then trans -b "$SRC_LANG:$TGT_LANG" -i "$input_file" | \ awk '/^>/ {print substr($0, 3); next} {print}' > "$output_file" else trans -b "$SRC_Lang:$TGT_LANG" -i "$input_file" > "$output_file" fi # 保留原始文件权限 chmod --reference="$input_file" "$output_file" } # 主循环 find "$INPUT_DIR" -type f | while read -r file; do ext="${file##*.}" if [[ " ${FILE_TYPES[@]} " =~ " ${ext,,} " ]]; then process_file "$file" fi done echo "Batch translation completed. Results saved to $OUTPUT_DIR"使用示例:
# 将input目录下所有英文文件翻译为中文 ./batch_translate.sh en zh-CN ./input ./output提示:添加
-b参数使用简洁模式,避免输出冗余信息。对于大型文件,建议通过-split 500参数分块处理。
3. 交互式翻译终端工具
开发过程中常需要快速查询术语,以下脚本创建了一个持续运行的翻译控制台:
#!/usr/bin/env python3 # interactive_trans.py import subprocess import readline from pygments import highlight from pygments.lexers import get_lexer_by_name from pygments.formatters import TerminalFormatter def colorize(text, lang): try: lexer = get_lexer_by_name(lang, stripall=True) return highlight(text, lexer, TerminalFormatter()) except: return text def translate(text, src, tgt): cmd = f'trans -b {src}:{tgt} "{text}"' try: result = subprocess.check_output(cmd, shell=True, text=True) return result.strip() except subprocess.CalledProcessError as e: return f"Error: {e.output}" def main(): print("Interactive Translation Console (q to quit)") print("Supported languages: trans -T | less") src_lang = input("Source language (e.g. en): ").strip() or "auto" tgt_lang = input("Target language (e.g. zh-CN): ").strip() or "zh-CN" while True: try: query = input(f"{src_lang}→{tgt_lang}> ") if query.lower() in ('q', 'quit', 'exit'): break if query.startswith(":"): # 处理元命令 if query == ":switch": src_lang, tgt_lang = tgt_lang, src_lang print(f"Switched to {src_lang}→{tgt_lang}") continue result = translate(query, src_lang, tgt_lang) print(colorize(result, tgt_lang.split('-')[0])) except KeyboardInterrupt: print("\nUse 'q' to quit") except Exception as e: print(f"Error: {str(e)}") if __name__ == "__main__": main()功能亮点:
- 语法高亮显示翻译结果
- 支持快速切换源语言和目标语言(输入
:switch) - 保持会话历史(通过readline实现)
- 自动语言检测(当src_lang设为auto时)
安装依赖:
pip install pygments4. 作为微服务API集成
在大型系统中,可通过封装trans创建翻译API服务:
# trans_api.py from flask import Flask, request, jsonify import subprocess import threading app = Flask(__name__) lock = threading.Lock() def safe_translate(text, src, tgt): with lock: # 防止并发调用冲突 cmd = ['trans', '-b', f'{src}:{tgt}', text] try: result = subprocess.run(cmd, capture_output=True, text=True, timeout=10) return result.stdout.strip() if result.returncode == 0 else result.stderr except subprocess.TimeoutExpired: return "Translation timeout" @app.route('/translate', methods=['POST']) def handle_translate(): data = request.json text = data.get('text', '') src = data.get('src', 'auto') tgt = data.get('tgt', 'zh-CN') if not text: return jsonify({'error': 'Empty text'}), 400 translation = safe_translate(text, src, tgt) return jsonify({ 'src_text': text, 'translation': translation, 'src_lang': src, 'tgt_lang': tgt }) @app.route('/languages', methods=['GET']) def list_languages(): try: output = subprocess.check_output(['trans', '-T'], text=True) languages = [] for line in output.split('\n')[3:-3]: # 跳过表格边框 if '|' in line: lang, code = map(str.strip, line.split('|')[1:3]) languages.append({'language': lang, 'code': code}) return jsonify({'languages': languages}) except: return jsonify({'error': 'Failed to get language list'}), 500 if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, threaded=True)部署与使用:
# 启动服务 python trans_api.py # 测试调用 curl -X POST http://localhost:5000/translate \ -H "Content-Type: application/json" \ -d '{"text":"Hello World","src":"en","tgt":"zh-CN"}'性能优化建议:
- 使用gunicorn提升并发能力:
gunicorn -w 4 -b :5000 trans_api:app- 添加Redis缓存高频翻译结果
- 通过Nginx实现负载均衡
5. 高级技巧与故障排除
5.1 代理配置
当直接访问翻译服务不稳定时:
# 临时使用代理 trans -proxy http://proxy.example.com:8080 :zh-CN "Hello" # 永久配置(写入~/.config/translate-shell/init.trans) export HTTP_PROXY=http://proxy.example.com:8080 export HTTPS_PROXY=$HTTP_PROXY5.2 格式保留策略
不同内容类型的处理建议:
| 内容类型 | 推荐参数 | 说明 |
|---|---|---|
| 技术文档 | -no-ansi | 去除控制字符 |
| 代码片段 | -no-warn | 忽略警告信息 |
| 诗歌/歌词 | -split 10 | 保持分行结构 |
| 表格数据 | -no-autocorrect | 禁用自动修正 |
5.3 常见错误处理
# 错误1:语言代码无效 trans -list | grep -i 中文 # 确认正确代码 # 错误2:超时问题 trans -timeout 30 :zh "long text..." # 延长超时时间 # 错误3:编码问题 LC_ALL=en_US.UTF-8 trans :zh "text" # 强制UTF-8编码实际项目中,我们曾用这些脚本实现了国际化文档的自动同步系统。当源文档更新时,CI流水线会自动触发翻译流程,将更新推送到各语言版本仓库。这种方案比商业SAAS服务节省了75%的成本,同时保证了技术术语的一致性。