翻译接口文档

本接口提供文本翻译能力:调用成功将返回翻译结果,并自动扣减该 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" // 可选,当前内部自动检测,可省略
  }
字段类型必填说明
appidstring应用 ID
keystring与 appid 配对的 API 密钥
textstring待翻译文本(建议 ≤ 5000 字符)
target_languagestring目标语言代码(如 en / zh / ja / fr / de 等)
source_languagestring源语言(支持 auto;当前忽略自动检测)

3. 响应说明

成功响应:

{
    "translatedText": "Hello, world!"
  }

失败响应:

{
    "error": "no credits"
  }

4. 常见错误

error说明解决建议
missing required fields缺少参数检查 JSON 字段
empty appid/key/text/target_language某字段为空字符串不要传空
appid not foundappid 不存在核对或申请
key invalidkey 不匹配重新复制
ip not allowedIP 不在白名单添加白名单
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)个别小语种支持情况可能随时间增减,遇到报错可先尝试主流语言验证服务是否正常。


最后更新: