基于python的小翻译工具

这里的翻译接口是基于百度翻译的API

这里的方案是利用百度翻译开放平台实现的

会稍微麻烦点,但是更加方便个性化翻译

也可以通过爬虫的形式,直接操作百度翻译网页来实现


前期准备,需要注册百度开发者账户,然后开通通用文本翻译功能
到达这个界面找到appid以及密钥

这里就不说明注册开通过程了

开发者文档

python代码部分

import random
import requests
from hashlib import md5


def fanyi(q, from_lang="auto", to_lang="en"):
    if q.strip() == "":
        return "未输入"
    url = "https://fanyi-api.baidu.com/api/trans/vip/translate"
    appid = "XXXXXX" #换成自己的appid
    salt = random.randint(32768, 65536)
    key = "XXXXXXX"  #换成自己的密钥

    def make_sign(s):
        return md5(bytes(s, "utf-8")).hexdigest()

    sign = make_sign(appid + q + str(salt) + key)

    params = {
        "q": q.encode("utf-8"),
        "from": from_lang,
        "to": to_lang,
        "appid": appid,
        "salt": salt,
        "sign": sign
    }
    with requests.post(url=url, headers={"Content-Type": "application/x-www-form-urlencoded"}, params=params) as res:
        if res.status_code != 200:
            raise ("翻译出错!")
        return res.json()


# appid+q+salt+密钥
lang = """名称          代码
自动检测      auto	
中文          zh	
英语          en
粤语          yue	
文言文        wyw	
繁体中文    cht
日语          jp
韩语          kor	
法语          fra	
西班牙语      spa
泰语          th	
阿拉伯语      ara	
俄语          ru"""
map_lang = {
    "zh": "中文",
    "en": "英语",
    "yue": "粤语",
    "wyw": "文言文",
    "cht": "繁体中文",
    "jp": "日语",
    "kor": "韩语",
    "fra": "法语",
    "spa": "西班牙语",
    "th": "泰语",
    "ara": "阿拉伯语",
    "ru": "俄语",
    "pt": "葡萄牙语",
    "de": "德语",
    "it": "意大利语",
    "el": "希腊语",
    "nl": "荷兰语",
    "pl": "波兰语",
    "bul": "保加利亚语",
    "est": "爱沙尼亚语",
    "dan": "丹麦语",
    "fin": "芬兰语",
    "cs": "捷克语",
    "rom": "罗马尼亚语",
    "slo": "斯洛文尼亚语",
    "swe": "瑞典语",
    "hu": "匈牙利语",
    "vie": "越南语"
}


def run():
    while True:
        en = input("翻译为何种语言(默认英文,h查看帮助,q退出): ").strip()
        if en == "q":
            break
        elif en == "h":
            print(lang)
            continue
        else:
            if en !=""and map_lang.get(en) is None:
                print("输入有误")
                continue
            else:
                from_lang = 'auto'
                to_lang = 'en'
                if en != "":
                    to_lang = en
                while True:
                    s = input("请输入待翻译文本(lang选择语言,q退出): ").strip()
                    if s == "lang":
                        break
                    elif s == "q":
                        exit()
                    elif s == "":
                        continue
                    else:
                        res = fanyi(q=s, from_lang=from_lang, to_lang=to_lang)
                        print("{}=====>{}".format(map_lang.get(res.get("from"),"未能自动解析"), map_lang.get(res.get("to"))))
                        print("翻译结果为:",res.get("trans_result")[0].get("dst"))


if __name__ == '__main__':
    run()

注意事项

  • 待翻译文本(q)需为 UTF-8 编码;
  • 在生成签名后,发送 HTTP 请求时,如果将 query 拼接在URL上,需要对 query 做 URL encode。
  • 请求方式: 可使用 GET 或 POST 方式,如使用 POST 方式,Content-Type 请指定为:application/x-www-form-urlencoded
  • 字符编码:统一采用 UTF-8 编码格式
  • query 长度:为保证翻译质量,请将单次请求长度控制在 6000 bytes以内(汉字约为输入参数 2000 个)

其他语言的demo

返回数据的样式
query=apple,语言方向为英到中
未接入资源时,返回结果为:

{
    "from": "en", 
    "to": "zh", 
    "trans_result": [
        {
            "src": "apple", 
            "dst": "苹果"
        }
    ]
}

接入词典、语音合成资源后,返回结果为:

{
  "from": "en",
  "to": "zh",
  "trans_result": [
    {
      "src": "apple",
      "dst": "苹果",
      "src_tts": "https:\/\/fanyiapp.cdn.bcebos.com\/api\/tts\/95e906875b87d342d7325a36a4e1ab42.mp3",
      "dst_tts": "https:\/\/fanyiapp.cdn.bcebos.com\/api\/tts\/62f4ff87617655bc1f65e24cf4ed4963.mp3",
      "dict": "{\"lang\":\"1\",\"word_result\":{\"simple_means\":{\"word_name\":\"apple\",\"from\":\"original\",\"word_means\":[\"苹果\"],\"exchange\":{\"word_pl\":[\"apples\"]},\"tags\":{\"core\":[\"高考\",\"考研\"],\"other\":[\"\"]},\"symbols\":[{\"ph_en\":\"ˈæpl\",\"ph_am\":\"ˈæpl\",\"parts\":[{\"part\":\"n.\",\"means\":[\"苹果\"]}],\"ph_other\":\"\"}]}}}"
    }
  ]
}
posted @ 2023-02-03 16:20  厚礼蝎  阅读(193)  评论(0)    收藏  举报