---@class Youdao: TransOnlineBackend ---@field uri string api uri ---@field salt string ---@field app_id string ---@field app_passwd string ---@field disable boolean local M = { uri = 'https://openapi.youdao.com/api', salt = tostring(math.random(bit.lshift(1, 15))), name = 'youdao', method = 'get', } ---@class YoudaoQuery ---@field q string ---@field from string ---@field to string ---@field appid string ---@field salt string ---@field sign string ---Get content for query ---@param data TransData ---@return YoudaoQuery function M.get_query(data) local str = data.str local app_id = M.app_id local salt = M.salt local curtime = tostring(os.time()) local chars = vim.str_utf_pos(str) local count = #chars local input = count <= 20 and str or str:sub(1, chars[11] - 1) .. #chars .. str:sub(chars[count - 9]) -- sign=sha256(应用ID+input+salt+curtime+应用密钥); 一二三四五六七八九十 local hash = app_id .. input .. salt .. curtime .. M.app_passwd local sign = vim.fn.sha256(hash) return { q = str, to = data.from == 'zh' and 'en' or 'zh-CHS', from = 'auto', signType = 'v3', appKey = app_id, salt = M.salt, curtime = curtime, sign = sign, } end local function check_untracked_field(body) local field = { "phonetic", 'usPhonetic', "ukPhonetic", "text", -- text 短语 "explain", -- String Array 词义解释列表 "wordFormats", -- Object Array 单词形式变化列表 "name", -- String 形式名称,例如:复数 "phrase", -- String 词组 "meaning", -- String 含义 "synonyms", -- JSONObject 近义词 "pos", -- String 词性 "words", -- String Array 近义词列表 "trans", -- String 释义 "antonyms", -- ObjectArray 反义词 "relatedWords", -- JSONArray 相关词 "wordNet", -- JSONObject 汉语词典网络释义 "phonetic", -- String 发音 "meanings", -- ObjectArray 释义 "meaning", -- String 释义 "example", -- array 示例 "sentenceSample", -- text 例句 "sentence", -- text 例句 "sentenceBold", -- text 将查询内容加粗的例句 "wfs", -- text 单词形式变化 "exam_type", -- text 考试类型 } for _, f in ipairs(field) do if body[f] then print(('%s found : %s'):format(f, vim.inspect(body[f]))) end end end function M.debug(body) if not body then vim.notify('Unknown errors, nil body', vim.log.levels.ERROR) end local debug_msg = ({ [101] = "缺少必填的参数,首先确保必填参数齐全,然后确认参数书写是否正确。", [102] = "不支持的语言类型", [103] = "翻译文本过长", [104] = "不支持的API类型", [105] = "不支持的签名类型", [106] = "不支持的响应类型", [107] = "不支持的传输加密类型", [108] = "应用ID无效,注册账号,登录后台创建应用和实例并完成绑定,可获得应用ID和应用密钥等信息", [109] = "batchLog格式不正确", [110] = "无相关服务的有效实例,应用没有绑定服务实例,可以新建服务实例,绑定服务实例。注:某些服务的翻译结果发音需要tts实例,需要在控制台创建语音合成实例绑定应用后方能使用。", [111] = "开发者账号无效", [113] = "q不能为空", [120] = "不是词,或未收录", [201] = "解密失败,可能为DES,BASE64,URLDecode的错误", [202] = "签名检验失败", [203] = "访问IP地址不在可访问IP列表", [205] = "请求的接口与应用的平台类型不一致,确保接入方式(Android SDK、IOS SDK、API)与创建的应用平台类型一致。如有疑问请参考入门指南", [206] = "因为时间戳无效导致签名校验失败", [207] = "重放请求", [301] = "辞典查询失败", [302] = "翻译查询失败", [303] = "服务端的其它异常", [305] = "批量翻译部分成功", [401] = "账户已经欠费,请进行账户充值", [411] = "访问频率受限,请稍后访问", [412] = "长请求过于频繁,请稍后访问", [390001] = "词典名称不正确", })[tonumber(body.errorCode)] vim.notify('Youdao API Error: ' .. (debug_msg or vim.inspect(body)), vim.log.levels.ERROR) end ---@overload fun(TransData): TransResult ---Query Using Youdao API ---@param body table Youdao ouput ---@param data TransData Data obj ---@return table|false? function M.formatter(body, data) if body.errorCode ~= "0" then return false end check_untracked_field(body) if not body.isWord then return { title = body.query, [data.from == 'en' and 'translation' or 'definition'] = body.translation, } end return { title = { word = body.query, phonetic = body.basic.phonetic, }, web = body.web, explains = body.basic.explains, -- phrases = body.phrases, -- synonyms = body.synonyms, -- sentenceSample = body.sentenceSample, [data.from == 'en' and 'translation' or 'definition'] = body.translation, } end ---@class TransBackend ---@field youdao Youdao return M -- INFO :Query Result Example -- { -- basic = { -- explains = { "normal", "regular", "normality" }, -- phonetic = "zhèng cháng" -- }, -- dict = { -- url = "yddict://m.youdao.com/dict?le=eng&q=%E6%AD%A3%E5%B8%B8" -- }, -- errorCode = "0", -- isWord = true, -- l = "zh-CHS2en", -- mTerminalDict = { -- url = "https://m.youdao.com/m/result?lang=zh-CHS&word=%E6%AD%A3%E5%B8%B8" -- }, -- query = "正常", -- requestId = "a8a40c0e-0d3b-49d5-a8fe-b1cd211ff5db", -- returnPhrase = { "正常" }, -- speakUrl = "https://openapi.youdao.com/ttsapi?q=%E6%AD%A3%E5%B8%B8&langType=zh-CHS&sign=164F6EFF2EFFC7626FB70DBCF796AE70&salt=1678931501049&voice=4&format=mp3&appKey=1858465a8708c121&ttsVoiceStrict=false", -- tSpeakUrl = "https://openapi.youdao.com/ttsapi?q=normal&langType=en-USA&sign=6A0CF2EF076EA8D82453956B33F69A51&salt=1678931501049&voice=4&format=mp3&appKey=1858465a8708c121&ttsVoiceStrict=false", -- translation = { "normal" }, -- web = { { -- key = "正常", -- value = { "normal", "ordinary", "normo", "regular" } -- }, { -- key = "正常利润", -- value = { "normal profits" } -- }, { -- key = "邦交正常化", -- value = { "normalize relations", "normalization of diplomatic relations" } -- } }, -- webdict = { -- url = "http://mobile.youdao.com/dict?le=eng&q=%E6%AD%A3%E5%B8%B8" -- } -- } -- { -- basic = { -- explains = { "normal profit" } -- }, -- dict = { -- url = "yddict://m.youdao.com/dict?le=eng&q=%E6%AD%A3%E5%B8%B8%E5%88%A9%E6%B6%A6" -- }, -- errorCode = "0", -- isWord = true, -- l = "zh-CHS2en", -- mTerminalDict = { -- url = "https://m.youdao.com/m/result?lang=zh-CHS&word=%E6%AD%A3%E5%B8%B8%E5%88%A9%E6%B6%A6" -- }, -- query = "正常利润", -- requestId = "87a0b1bf-a5a2-46d1-8604-cd765cd06a90", -- returnPhrase = { "正常利润" }, -- speakUrl = "https://openapi.youdao.com/ttsapi?q=%E6%AD%A3%E5%B8%B8%E5%88%A9%E6%B6%A6&langType=zh-CHS&sign=5DC3A57D7D4CB21892D0D77E6968F03D&salt=1678950274137&voice=4&format=mp3&appKey=1858465a8708c121&ttsVoiceStrict=false", -- tSpeakUrl = "https://openapi.youdao.com/ttsapi?q=Normal+profit&langType=en-USA&sign=325FA5994D5D3B859DF21E3522577AFB&salt=1678950274137&voice=4&format=mp3&appKey=1858465a8708c121&ttsVoiceStrict=false", -- translation = { "Normal profit" }, -- web = { { -- key = "正常利润", -- value = { "normal profits" } -- }, { -- key = "非正常利润", -- value = { "abnormal profits" } -- }, { -- key = "正常利润率", -- value = { "normal profit rate" } -- } }, -- webdict = { -- url = "http://mobile.youdao.com/dict?le=eng&q=%E6%AD%A3%E5%B8%B8%E5%88%A9%E6%B6%A6" -- } -- }