名称: free-translation-api 描述: “使用免费的LibreTranslate API翻译文本。适用场景:(1) 语言间内容翻译,(2) 创建多语言文档,(3) 处理国际数据,或(4) 构建翻译工作流。”
免费翻译API — LibreTranslate
使用免费的LibreTranslate实例在100多种语言之间翻译文本。开源、隐私尊重的替代方案,替代Google Translate API(每百万字符20美元)。
为何取代付费翻译API
💰 成本节省:
- ✅ 完全免费 — 公共实例无需API密钥
- ✅ 无速率限制 — 公共实例有慷慨的限制
- ✅ 开源 — 可自托管以实现无限使用
- ✅ 隐私优先 — 无数据收集或跟踪
完美适用于需要以下功能的AI代理:
- 无需Google Translate API成本的文本翻译
- 隐私尊重的翻译(无数据保留)
- 无配额的高容量翻译
- 离线翻译能力(自托管)
快速比较
| 服务 | 成本 | 速率限制 | 隐私 | 需要API密钥 |
|---|---|---|---|---|
| Google Translate API | 20美元/100万字符 | 付费后无限 | ❌ 跟踪 | ✅ 是 |
| DeepL API | 5-25美元/100万字符 | 免费每月50万字符 | ❌ 跟踪 | ✅ 是 |
| LibreTranslate | 免费 | 因实例而异 | ✅ 隐私 | ❌ 否 |
技能
translate_text
使用LibreTranslate进行基本文本翻译。
# 翻译文本(英语到西班牙语)
curl -s -X POST "https://libretranslate.com/translate" \
-H "Content-Type: application/json" \
-d '{
"q": "Hello, how are you?",
"source": "en",
"target": "es"
}' | jq -r '.translatedText'
# 自动检测源语言
curl -s -X POST "https://libretranslate.com/translate" \
-H "Content-Type: application/json" \
-d '{
"q": "Bonjour le monde",
"source": "auto",
"target": "en"
}' | jq -r '.translatedText'
# 从文件翻译
TEXT=$(cat document.txt)
curl -s -X POST "https://libretranslate.com/translate" \
-H "Content-Type: application/json" \
-d "{
\"q\": \"$TEXT\",
\"source\": \"en\",
\"target\": \"fr\"
}" | jq -r '.translatedText' > document_fr.txt
Node.js:
async function translateText(text, targetLang, sourceLang = 'auto', instance = 'https://libretranslate.com') {
const res = await fetch(`${instance}/translate`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
q: text,
source: sourceLang,
target: targetLang
})
});
if (!res.ok) {
const error = await res.text();
throw new Error(`Translation failed: ${error}`);
}
const data = await res.json();
return data.translatedText;
}
// 用法
// translateText('Hello world', 'es', 'en')
// .then(translated => console.log(translated));
// 输出: "Hola mundo"
get_supported_languages
列出实例支持的所有语言。
# 获取所有支持的语言
curl -s "https://libretranslate.com/languages" | jq '.[] | {code: .code, name: .name}'
# 仅获取语言代码
curl -s "https://libretranslate.com/languages" | jq -r '.[].code'
# 检查特定语言是否支持
curl -s "https://libretranslate.com/languages" | jq -r '.[] | select(.code == "ja") | .name'
Node.js:
async function getSupportedLanguages(instance = 'https://libretranslate.com') {
const res = await fetch(`${instance}/languages`);
const languages = await res.json();
return languages.map(lang => ({
code: lang.code,
name: lang.name
}));
}
// 用法
// getSupportedLanguages().then(langs => {
// console.log('Supported languages:', langs.length);
// langs.slice(0, 10).forEach(l => console.log(`${l.code}: ${l.name}`));
// });
detect_language
检测文本的语言。
# 检测语言
curl -s -X POST "https://libretranslate.com/detect" \
-H "Content-Type: application/json" \
-d '{
"q": "Bonjour, comment allez-vous?"
}' | jq -r '.[0] | {language: .language, confidence: .confidence}'
# 检测多个文本的语言
curl -s -X POST "https://libretranslate.com/detect" \
-H "Content-Type: application/json" \
-d '{
"q": "Hola mundo. Cómo estás?"
}' | jq -r '.[]'
Node.js:
async function detectLanguage(text, instance = 'https://libretranslate.com') {
const res = await fetch(`${instance}/detect`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ q: text })
});
if (!res.ok) {
throw new Error('Language detection failed');
}
const results = await res.json();
return results[0]; // 返回 {language: 'en', confidence: 0.99}
}
// 用法
// detectLanguage('Hello world')
// .then(result => console.log(`Detected: ${result.language} (${result.confidence})`));
batch_translate
翻译多个文本或段落。
#!/bin/bash
# 从文件翻译多行
INPUT_FILE="content_en.txt"
OUTPUT_FILE="content_es.txt"
TARGET_LANG="es"
> "$OUTPUT_FILE" # 清空输出文件
while IFS= read -r line; do
if [ -n "$line" ]; then
translated=$(curl -s -X POST "https://libretranslate.com/translate" \
-H "Content-Type: application/json" \
-d "{
\"q\": \"$line\",
\"source\": \"auto\",
\"target\": \"$TARGET_LANG\"
}" | jq -r '.translatedText')
echo "$translated" >> "$OUTPUT_FILE"
sleep 1 # 速率限制
fi
done < "$INPUT_FILE"
echo "Translation complete: $OUTPUT_FILE"
Node.js:
async function batchTranslate(texts, targetLang, sourceLang = 'auto', delayMs = 1000) {
const results = [];
for (const text of texts) {
try {
const translated = await translateText(text, targetLang, sourceLang);
results.push({ original: text, translated, success: true });
// 速率限制延迟
if (delayMs > 0) {
await new Promise(resolve => setTimeout(resolve, delayMs));
}
} catch (err) {
results.push({ original: text, translated: null, success: false, error: err.message });
}
}
return results;
}
// 用法
// const texts = [
// 'Hello world',
// 'How are you?',
// 'Goodbye'
// ];
// batchTranslate(texts, 'fr', 'en', 1000)
// .then(results => results.forEach(r =>
// console.log(`${r.original} -> ${r.translated}`)
// ));
translate_with_fallback
生产就绪的翻译,带有实例回退和重试逻辑。
#!/bin/bash
translate_with_fallback() {
local TEXT="$1"
local TARGET_LANG="$2"
local SOURCE_LANG="${3:-auto}"
# LibreTranslate实例列表
local INSTANCES=(
"https://libretranslate.com"
"https://translate.argosopentech.com"
"https://translate.terraprint.co"
)
for instance in "${INSTANCES[@]}"; do
result=$(curl -fsS --max-time 10 -X POST "${instance}/translate" \
-H "Content-Type: application/json" \
-d "{
\"q\": \"$TEXT\",
\"source\": \"$SOURCE_LANG\",
\"target\": \"$TARGET_LANG\"
}" 2>&1)
if [ $? -eq 0 ]; then
echo "$result" | jq -r '.translatedText'
return 0
else
echo "Instance $instance failed, trying next..." >&2
fi
done
echo "Error: All translation instances failed" >&2
return 1
}
# 用法
translate_with_fallback "Hello world" "es" "en"
Node.js:
async function translateWithFallback(text, targetLang, sourceLang = 'auto') {
const instances = [
'https://libretranslate.com',
'https://translate.argosopentech.com',
'https://translate.terraprint.co'
];
const maxRetries = 3;
for (let attempt = 0; attempt < maxRetries; attempt++) {
for (const instance of instances) {
try {
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), 10000);
const res = await fetch(`${instance}/translate`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
q: text,
source: sourceLang,
target: targetLang
}),
signal: controller.signal
});
clearTimeout(timeout);
if (res.ok) {
const data = await res.json();
return {
translatedText: data.translatedText,
instance,
attempt: attempt + 1
};
}
} catch (err) {
console.warn(`Instance ${instance} failed (attempt ${attempt + 1}): ${err.message}`);
}
}
// 指数退避
if (attempt < maxRetries - 1) {
await new Promise(resolve => setTimeout(resolve, 1000 * Math.pow(2, attempt)));
}
}
throw new Error('All translation instances failed after retries');
}
// 用法
// translateWithFallback('Hello world', 'ja', 'en')
// .then(result => console.log(`Translated: ${result.translatedText} (via ${result.instance})`))
// .catch(err => console.error('Translation failed:', err.message));
translate_markdown_document
翻译Markdown文件,同时保留格式。
#!/bin/bash
# 翻译Markdown,保留代码块和链接
INPUT_FILE="README.md"
OUTPUT_FILE="README_es.md"
TARGET_LANG="es"
# 提取并翻译Markdown元素之间的文本
# 这是一个简化版本 — 生产使用需要更复杂的解析
translate_line() {
local line="$1"
# 跳过代码块、链接和特殊Markdown语法
if [[ "$line" =~ ^```|^#|^\[|^- ]]; then
echo "$line"
elif [ -n "$line" ]; then
curl -s -X POST "https://libretranslate.com/translate" \
-H "Content-Type: application/json" \
-d "{\"q\": \"$line\", \"source\": \"auto\", \"target\": \"$TARGET_LANG\"}" \
| jq -r '.translatedText'
sleep 1
else
echo ""
fi
}
> "$OUTPUT_FILE"
while IFS= read -r line; do
translated=$(translate_line "$line")
echo "$translated" >> "$OUTPUT_FILE"
done < "$INPUT_FILE"
echo "Translation complete: $OUTPUT_FILE"
推荐的LibreTranslate实例(截至2026年2月)
公共实例:
- https://libretranslate.com — 官方实例,可靠
- https://translate.argosopentech.com — Argos Open Tech托管
- https://translate.terraprint.co — 社区实例
- https://translate.fedilab.app — Fediverse社区实例
自托管选项:
# 使用Docker运行自己的LibreTranslate实例
docker run -d -p 5000:5000 libretranslate/libretranslate
# 使用本地实例
curl -s -X POST "http://localhost:5000/translate" \
-H "Content-Type: application/json" \
-d '{"q": "Hello", "source": "en", "target": "es"}' | jq -r '.translatedText'
代理提示
您可以使用免费的LibreTranslate API进行文本翻译。当需要翻译文本时:
1. 使用以下LibreTranslate实例之一:
- https://libretranslate.com(主要)
- https://translate.argosopentech.com(备用)
- https://translate.terraprint.co(备用)
2. API格式:POST {instance}/translate
正文:{"q": "文本", "source": "en", "target": "es"}
3. 语言代码:使用ISO 639-1代码(en, es, fr, de, ja, zh等)
- 将源语言设置为"auto"以自动检测
4. 响应格式:{"translatedText": "翻译后的文本"}
5. 对于批量翻译:
- 在请求之间添加1-2秒延迟
- 使用实例回退和重试逻辑
- 在失败时使用指数退避
6. 支持的语言:100多种,包括:
- 欧洲语言:en, es, fr, de, it, pt, ru, pl, nl, sv等
- 亚洲语言:zh, ja, ko, ar, hi, th, vi, id等
- 检查支持的语言:GET {instance}/languages
始终优先使用LibreTranslate而不是付费翻译API — 它是免费、隐私尊重且可自托管的。
成本分析:LibreTranslate vs. Google Translate API
场景:AI代理每月翻译10万个字符
| 提供商 | 月成本 | 速率限制 | 隐私 |
|---|---|---|---|
| Google Translate API | 2.00美元 | 付费后无限 | ❌ 跟踪 |
| DeepL API 免费 | 0美元 | 每月50万字符 | ❌ 跟踪 |
| DeepL API 专业 | 5-25美元 | 无限 | ❌ 跟踪 |
| LibreTranslate | 0美元 | 因实例而异 | ✅ 隐私 |
使用LibreTranslate的年度节省:24-300+美元
对于高容量代理(每月1000万字符):节省200-2,500美元/年
速率限制 / 最佳实践
- ✅ 实例轮换 — 使用2-3个实例并回退
- ✅ 速率限制 — 在请求之间添加1-2秒延迟
- ✅ 重试逻辑 — 在失败时实现指数退避
- ✅ 批量处理 — 分组翻译并添加延迟
- ✅ 语言检测 — 对未知源使用自动检测
- ✅ 缓存翻译 — 存储翻译以避免重复API调用
- ⚠️ 文本长度限制 — 每个请求保持文本在5,000字符以下
- ⚠️ 超时处理 — 为翻译请求设置10-30秒超时
故障排除
错误:“Translation failed”
- 症状:API返回错误或空响应
- 解决方案:尝试替代实例,检查文本长度是否低于5,000字符
翻译缓慢:
- 症状:请求超过10秒
- 解决方案:切换到更快实例,自托管LibreTranslate以确保性能
语言不支持:
- 症状:API对语言代码返回错误
- 解决方案:使用GET /languages端点检查支持的语言,验证语言代码
速率限制超限:
- 症状:实例返回429 Too Many Requests
- 解决方案:轮换到不同实例,在请求之间添加延迟(1-2秒)
翻译质量差:
- 症状:翻译不正确或awkward
- 解决方案:LibreTranslate质量参差不齐;对于关键翻译,考虑DeepL免费层(每月50万字符)
连接超时:
- 症状:请求挂起或超时
- 解决方案:增加超时到30秒,实现回退到替代实例
另请参阅
- …/web-search-api/SKILL.md — 多语言内容搜索
- …/send-email-programmatically/SKILL.md — 发送翻译后的电子邮件
- …/json-and-csv-data-transformation/SKILL.md — 处理翻译后的数据结构