翻译接口文档
本接口提供文本翻译能力:调用成功将返回翻译结果,并自动扣减该 appid
的可用额度(1 次调用 = 1 点)。
1. 概览
接口地址 | POST https://fy-api.zaofont.com |
请求格式 | application/json |
鉴权方式 | 必须携带 appid + key |
扣点规则 | 成功翻译一次扣 1 点(可自定义扩展) |
字符集 | UTF-8 |
超时建议 | 连接 5s / 总 15s |
2. 请求说明
请求 JSON 结构:
{
"appid": "demoApp1",
"key": "secretKeyAbc",
"text": "你好,世界!",
"target_language": "en",
"source_language": "auto" // 可选,当前内部自动检测,可省略
}
字段 | 类型 | 必填 | 说明 |
---|---|---|---|
appid | string | 是 | 应用 ID |
key | string | 是 | 与 appid 配对的 API 密钥 |
text | string | 是 | 待翻译文本(建议 ≤ 5000 字符) |
target_language | string | 是 | 目标语言代码(如 en / zh / ja / fr / de 等) |
source_language | string | 否 | 源语言(支持 auto;当前忽略自动检测) |
3. 响应说明
成功响应:
{
"translatedText": "Hello, world!"
}
失败响应:
{
"error": "no credits"
}
4. 常见错误
error | 说明 | 解决建议 |
---|---|---|
missing required fields | 缺少参数 | 检查 JSON 字段 |
empty appid/key/text/target_language | 某字段为空字符串 | 不要传空 |
appid not found | appid 不存在 | 核对或申请 |
key invalid | key 不匹配 | 重新复制 |
ip not allowed | IP 不在白名单 | 添加白名单 |
no credits | 额度不足 | 充值/增加次数 |
no credits (concurrent) | 并发下额度被抢 | 重试或降并发 |
upstream request fail | 上游翻译不可用 | 稍后重试 |
translation failed | 上游结构异常 | 记录 detail 联系支持 |
db connect fail | 数据库连接失败 | 检查后端配置 |
5. 示例代码
5.1 cURL
curl -X POST "https://fy-api.zaofont.com" \
-H "Content-Type: application/json" \
-d '{
"appid": "demoApp1",
"key": "secretKeyAbc",
"text": "今天天气很好,我们去公园散步吧。",
"target_language": "en"
}'
5.2 Python (requests)
import requests
API_URL = "https://fy-api.zaofont.com"
APPID = "demoApp1"
KEY = "secretKeyAbc"
def translate(text, target="en", source=None):
payload = {
"appid": APPID,
"key": KEY,
"text": text,
"target_language": target
}
if source:
payload["source_language"] = source
r = requests.post(API_URL, json=payload, timeout=15)
r.raise_for_status()
data = r.json()
if "translatedText" in data:
return data["translatedText"]
raise RuntimeError(data)
print(translate("你好,世界!", "en"))
5.3 Node.js (fetch)
const API_URL = "https://fy-api.zaofont.com";
const APPID = "demoApp1";
const KEY = "secretKeyAbc";
async function translate(text, target = "en", source) {
const body = {
appid: APPID,
key: KEY,
text,
target_language: target
};
if (source) body.source_language = source;
const res = await fetch(API_URL, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(body)
});
const data = await res.json();
if (!res.ok || !data.translatedText) {
throw new Error(data.error || "Translate failed");
}
return data.translatedText;
}
translate("测试一下接口", "en")
.then(console.log)
.catch(console.error);
5.4 PHP (cURL)
<?php
$apiUrl = "https://fy-api.zaofont.com";
$payload = [
"appid" => "demoApp1",
"key" => "secretKeyAbc",
"text" => "欢迎使用翻译接口",
"target_language" => "en"
];
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $apiUrl,
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
CURLOPT_POSTFIELDS => json_encode($payload, JSON_UNESCAPED_UNICODE),
CURLOPT_TIMEOUT => 15,
]);
$res = curl_exec($ch);
if ($res === false) { die("Curl error: ".curl_error($ch)); }
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$data = json_decode($res, true);
if ($code >= 400) { var_dump($data); exit; }
echo $data["translatedText"] ?? "failed";
5.5 Java (HttpClient)
import java.net.http.*;
import java.net.URI;
import java.time.Duration;
public class TranslateClient {
static final String API_URL = "https://fy-api.zaofont.com";
static final String APPID = "demoApp1";
static final String KEY = "secretKeyAbc";
public static void main(String[] args) throws Exception {
String text = "这是一个测试";
String json = String.format(
"{\"appid\":\"%s\",\"key\":\"%s\",\"text\":\"%s\",\"target_language\":\"en\"}",
APPID, KEY, escape(text)
);
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(5))
.build();
HttpRequest req = HttpRequest.newBuilder()
.uri(URI.create(API_URL))
.timeout(Duration.ofSeconds(15))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(json))
.build();
HttpResponse<String> resp = client.send(req, HttpResponse.BodyHandlers.ofString());
System.out.println(resp.body());
}
static String escape(String s){
return s.replace("\\", "\\\\").replace("\"","\\\"");
}
}
6. 最佳实践 & 建议
- 分段翻译: 超长文本自行按段拆分,合并结果。
- 本地缓存: 相同文本 hash 后命中缓存,减少额度消耗。
- 错误重试: 仅对网络类错误做指数退避;业务错误勿重试。
- 安全: 不在公开前端硬编码真实
key
,建议后端代理。 - 限频: 客户端自行节流(如 <= 5 QPS),避免被封禁。
- 监控: 统计成功率、耗时、错误分布,及剩余额度预警。
7. FAQ
是否支持多段一次翻译?
当前仅支持单字段 text
。请自行分段循环调用。
为什么没有返回剩余额度?
为保持轻量未返回。需要可扩展后端添加 remaining
字段。
出现 no credits (concurrent)
怎么办?
表示并发竞争导致额度被其它请求先扣,减少并发或扩充额度后重试。
支持的语言列表在哪里?
当前接口后端调用 Google 兼容翻译服务,支持其大部分语言代码。以下为常见与更多示例:
常用:auto
(自动检测), zh-CN
(简体),zh-TW
(繁体), en
(英语),ja
(日语),ko
(韩语), fr
(法语),de
(德语),es
(西班牙语), ru
(俄语),pt
(葡萄牙语),it
(意大利语), ar
(阿拉伯语),vi
(越南语),th
(泰语), tr
(土耳其语),id
(印尼语),hi
(印地语)。
更多(部分示例):nl
(荷兰)、pl
(波兰)、sv
(瑞典)、fi
(芬兰)、da
(丹麦)、no
(挪威)、 uk
(乌克兰)、he
(希伯来)、el
(希腊)、cs
(捷克)、hu
(匈牙利)、ro
(罗马尼亚)、 bg
(保加利亚)、sk
(斯洛伐克)、sl
(斯洛文尼亚)、lt
(立陶宛)、lv
(拉脱维亚)、et
(爱沙尼亚)、 fa
(波斯)、ur
(乌尔都)、bn
(孟加拉)、pa
(旁遮普)、ta
(泰米尔)、te
(泰卢固)、 ml
(马拉雅拉姆)、mr
(马拉地)、gu
(古吉拉特)、kn
(卡纳达)、km
(高棉)、lo
(老挝)、 my
(缅甸)、ne
(尼泊尔)、si
(僧伽罗)、sw
(斯瓦希里)、am
(阿姆哈拉)、zu
(祖鲁)等。
说明:
1)auto
不是语言本身,表示自动检测。
2)zh
一般等价于 zh-CN
(可根据需要显示为“中文”)。
3)如需严格校验或动态更新,建议在后端维护一份语言列表 JSON 并提供获取接口。
4)个别小语种支持情况可能随时间增减,遇到报错可先尝试主流语言验证服务是否正常。
最后更新: