From 8d81d6100af012b64cc797e7e79e4e275a4e6f3a Mon Sep 17 00:00:00 2001 From: muxueqz Date: Thu, 28 Apr 2022 16:53:57 +0800 Subject: [PATCH 1/7] Translator: You can use fanyi.youdao.com as a translator --- frontend/ui/translator.lua | 119 +++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) diff --git a/frontend/ui/translator.lua b/frontend/ui/translator.lua index d3c0c5abb..d3da837dc 100644 --- a/frontend/ui/translator.lua +++ b/frontend/ui/translator.lua @@ -146,6 +146,7 @@ local Translator = { trans_servers = { "https://translate.googleapis.com/", -- "http://translate.google.cn", + "https://fanyi.youdao.com", }, trans_path = "/translate_a/single", trans_params = { @@ -215,6 +216,7 @@ function Translator:genSettingsMenu() end return items_table end + return { text = _("Translation settings"), sub_item_table = { @@ -349,6 +351,122 @@ Returns decoded JSON table from translate server. @treturn string result, or nil --]] function Translator:loadPage(text, target_lang, source_lang) + local trans_server = self:getTransServer() + if trans_server == "https://fanyi.youdao.com" then + return self:loadPageByYoudao(text, target_lang, source_lang) + end + return self:loadPageByGoogle(text, target_lang, source_lang) +end + +local function http_request(s_url, method, headers, request) + local socket = require('socket') + local socketutil = require("socketutil") + local http = require('socket.http') + local ltn12 = require("ltn12") + + local sink = {} + if request == nil then + request = {} + end + socketutil:set_timeout() + + request['url'] = s_url + request['method'] = method + request['sink'] = ltn12.sink.table(sink) + request['headers'] = headers + + http.TIMEOUT = 5 + -- https.TIMEOUT = 5 + http.USERAGENT = 'Mozilla/5.0 (X11; Linux i686 (x86_64)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2950.0 Iron Safari/537.36' + local httpRequest = http.request + + local code, response_headers, status = socket.skip( + 1, httpRequest(request)) + + socketutil:reset_timeout() + if response_headers == nil then + return { + code = code, + response_headers = response_headers, + status = status, + response_body = nil + } + end + local xml = table.concat(sink) + + return { + code = code, + response_headers = response_headers, + status = status, + response_body = xml + } +end + +--[[-- +Returns decoded JSON table from translate server. + +@string text +@string target_lang +@string source_lang +@treturn string result, or nil +--]] + +function Translator:loadPageByYoudao(text, target_lang, source_lang) + local ltn12 = require("ltn12") + local headers = {} + headers['content-type'] = 'application/x-www-form-urlencoded' + local query = string.format( + 'from=%s&to=%s&i=%s&doctype=json&xmlVersion=1.4&keyfrom=fanyi.web&ue=UTF-8&typoResult=true&flag=false', + source_lang, target_lang, text) + logger.dbg("query", query) + headers["content-length"] = string.len(query) + local request = { + source = ltn12.source.string(query) + } + + local s_url = "https://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=dict.top" + local resp = http_request(s_url, "POST", headers, request) + local ok, youdao_result = pcall(JSON.decode, resp.response_body, JSON.decode.simple) + if ok and youdao_result then + logger.dbg("translator json:", youdao_result) + else + logger.warn("translator error:", youdao_result) + end + local google_result_6 = {} + local translateResult = {} + for _, v1 in ipairs(youdao_result.translateResult) do + for _, v2 in ipairs(v1) do + table.insert(translateResult, + { v2.tgt, v2.src } + ) + table.insert(google_result_6, + { + [1] = v2.src, + [3] = { + [1] = { + [1] = v2.tgt, + [2] = 0, + } + } + }) + end + end + local google_result = {} + google_result[1] = translateResult + google_result[6] = google_result_6 + logger.dbg("translator json fake google:", google_result) + return google_result +end + +--[[-- +Returns decoded JSON table from translate server. + +@string text +@string target_lang +@string source_lang +@treturn string result, or nil +--]] +function Translator:loadPageByGoogle(text, target_lang, source_lang) local socket = require("socket") local socketutil = require("socketutil") local url = require("socket.url") @@ -412,6 +530,7 @@ function Translator:loadPage(text, target_lang, source_lang) logger.warn("not JSON in translator response:", content) end end + -- The JSON result is a list of 9 to 15 items: -- 1: translation -- 2: all-translations From 103e0a3cc460afcdbd93fb49618bc6e71b962afc Mon Sep 17 00:00:00 2001 From: muxueqz Date: Fri, 29 Apr 2022 14:18:16 +0800 Subject: [PATCH 2/7] 4 spaces for indentation --- frontend/ui/translator.lua | 164 ++++++++++++++++++------------------- 1 file changed, 82 insertions(+), 82 deletions(-) diff --git a/frontend/ui/translator.lua b/frontend/ui/translator.lua index d3da837dc..5dd782ad7 100644 --- a/frontend/ui/translator.lua +++ b/frontend/ui/translator.lua @@ -146,7 +146,7 @@ local Translator = { trans_servers = { "https://translate.googleapis.com/", -- "http://translate.google.cn", - "https://fanyi.youdao.com", + "https://fanyi.youdao.com", }, trans_path = "/translate_a/single", trans_params = { @@ -351,55 +351,55 @@ Returns decoded JSON table from translate server. @treturn string result, or nil --]] function Translator:loadPage(text, target_lang, source_lang) - local trans_server = self:getTransServer() - if trans_server == "https://fanyi.youdao.com" then - return self:loadPageByYoudao(text, target_lang, source_lang) - end - return self:loadPageByGoogle(text, target_lang, source_lang) + local trans_server = self:getTransServer() + if trans_server == "https://fanyi.youdao.com" then + return self:loadPageByYoudao(text, target_lang, source_lang) + end + return self:loadPageByGoogle(text, target_lang, source_lang) end local function http_request(s_url, method, headers, request) - local socket = require('socket') - local socketutil = require("socketutil") - local http = require('socket.http') - local ltn12 = require("ltn12") + local socket = require('socket') + local socketutil = require("socketutil") + local http = require('socket.http') + local ltn12 = require("ltn12") - local sink = {} - if request == nil then - request = {} - end - socketutil:set_timeout() + local sink = {} + if request == nil then + request = {} + end + socketutil:set_timeout() - request['url'] = s_url - request['method'] = method - request['sink'] = ltn12.sink.table(sink) - request['headers'] = headers + request['url'] = s_url + request['method'] = method + request['sink'] = ltn12.sink.table(sink) + request['headers'] = headers - http.TIMEOUT = 5 - -- https.TIMEOUT = 5 - http.USERAGENT = 'Mozilla/5.0 (X11; Linux i686 (x86_64)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2950.0 Iron Safari/537.36' - local httpRequest = http.request + http.TIMEOUT = 5 + -- https.TIMEOUT = 5 + http.USERAGENT = 'Mozilla/5.0 (X11; Linux i686 (x86_64)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2950.0 Iron Safari/537.36' + local httpRequest = http.request - local code, response_headers, status = socket.skip( - 1, httpRequest(request)) + local code, response_headers, status = socket.skip( + 1, httpRequest(request)) + + socketutil:reset_timeout() + if response_headers == nil then + return { + code = code, + response_headers = response_headers, + status = status, + response_body = nil + } + end + local xml = table.concat(sink) - socketutil:reset_timeout() - if response_headers == nil then return { - code = code, - response_headers = response_headers, - status = status, - response_body = nil + code = code, + response_headers = response_headers, + status = status, + response_body = xml } - end - local xml = table.concat(sink) - - return { - code = code, - response_headers = response_headers, - status = status, - response_body = xml - } end --[[-- @@ -412,50 +412,50 @@ Returns decoded JSON table from translate server. --]] function Translator:loadPageByYoudao(text, target_lang, source_lang) - local ltn12 = require("ltn12") - local headers = {} - headers['content-type'] = 'application/x-www-form-urlencoded' - local query = string.format( - 'from=%s&to=%s&i=%s&doctype=json&xmlVersion=1.4&keyfrom=fanyi.web&ue=UTF-8&typoResult=true&flag=false', - source_lang, target_lang, text) - logger.dbg("query", query) - headers["content-length"] = string.len(query) - local request = { - source = ltn12.source.string(query) - } + local ltn12 = require("ltn12") + local headers = {} + headers['content-type'] = 'application/x-www-form-urlencoded' + local query = string.format( + 'from=%s&to=%s&i=%s&doctype=json&xmlVersion=1.4&keyfrom=fanyi.web&ue=UTF-8&typoResult=true&flag=false', + source_lang, target_lang, text) + logger.dbg("query", query) + headers["content-length"] = string.len(query) + local request = { + source = ltn12.source.string(query) + } - local s_url = "https://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=dict.top" - local resp = http_request(s_url, "POST", headers, request) - local ok, youdao_result = pcall(JSON.decode, resp.response_body, JSON.decode.simple) - if ok and youdao_result then - logger.dbg("translator json:", youdao_result) - else - logger.warn("translator error:", youdao_result) - end - local google_result_6 = {} - local translateResult = {} - for _, v1 in ipairs(youdao_result.translateResult) do - for _, v2 in ipairs(v1) do - table.insert(translateResult, - { v2.tgt, v2.src } - ) - table.insert(google_result_6, - { - [1] = v2.src, - [3] = { - [1] = { - [1] = v2.tgt, - [2] = 0, - } - } - }) + local s_url = "https://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=dict.top" + local resp = http_request(s_url, "POST", headers, request) + local ok, youdao_result = pcall(JSON.decode, resp.response_body, JSON.decode.simple) + if ok and youdao_result then + logger.dbg("translator json:", youdao_result) + else + logger.warn("translator error:", youdao_result) + end + local google_result_6 = {} + local translateResult = {} + for _, v1 in ipairs(youdao_result.translateResult) do + for _, v2 in ipairs(v1) do + table.insert(translateResult, + { v2.tgt, v2.src } + ) + table.insert(google_result_6, + { + [1] = v2.src, + [3] = { + [1] = { + [1] = v2.tgt, + [2] = 0, + } + } + }) + end end - end - local google_result = {} - google_result[1] = translateResult - google_result[6] = google_result_6 - logger.dbg("translator json fake google:", google_result) - return google_result + local google_result = {} + google_result[1] = translateResult + google_result[6] = google_result_6 + logger.dbg("translator json fake google:", google_result) + return google_result end --[[-- From ac8cd3ade642d151dd71b6faa7e2b56c4d01d818 Mon Sep 17 00:00:00 2001 From: muxueqz Date: Fri, 29 Apr 2022 14:28:03 +0800 Subject: [PATCH 3/7] replace to clearer --- frontend/ui/translator.lua | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/frontend/ui/translator.lua b/frontend/ui/translator.lua index 5dd782ad7..2d9743347 100644 --- a/frontend/ui/translator.lua +++ b/frontend/ui/translator.lua @@ -432,14 +432,14 @@ function Translator:loadPageByYoudao(text, target_lang, source_lang) else logger.warn("translator error:", youdao_result) end - local google_result_6 = {} + local resultAlternative = {} local translateResult = {} for _, v1 in ipairs(youdao_result.translateResult) do for _, v2 in ipairs(v1) do table.insert(translateResult, { v2.tgt, v2.src } ) - table.insert(google_result_6, + table.insert(resultAlternative, { [1] = v2.src, [3] = { @@ -451,11 +451,11 @@ function Translator:loadPageByYoudao(text, target_lang, source_lang) }) end end - local google_result = {} - google_result[1] = translateResult - google_result[6] = google_result_6 - logger.dbg("translator json fake google:", google_result) - return google_result + local resultAsGoogleTranslate = {} + resultAsGoogleTranslate[1] = translateResult + resultAsGoogleTranslate[6] = resultAlternative + logger.dbg("translator json as google translate format:", resultAsGoogleTranslate) + return resultAsGoogleTranslate end --[[-- From 80a594b9c228d511904997dc2ed342d0aa8c2646 Mon Sep 17 00:00:00 2001 From: muxueqz Date: Fri, 29 Apr 2022 16:18:34 +0800 Subject: [PATCH 4/7] use getTransFunc to decide translate function --- frontend/ui/translator.lua | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/frontend/ui/translator.lua b/frontend/ui/translator.lua index 2d9743347..b88be0c5d 100644 --- a/frontend/ui/translator.lua +++ b/frontend/ui/translator.lua @@ -178,10 +178,16 @@ local Translator = { default_lang = "en", } +local TRANS_FUNCS = {} + function Translator:getTransServer() return G_reader_settings:readSetting("trans_server") or self.trans_servers[1] end +function Translator:getTransFunc(server) + return TRANS_FUNCS[server] or Translator.loadPageByGoogle +end + function Translator:getLanguageName(lang, default_string) if SUPPORTED_LANGUAGES[lang] then return SUPPORTED_LANGUAGES[lang], true @@ -352,16 +358,14 @@ Returns decoded JSON table from translate server. --]] function Translator:loadPage(text, target_lang, source_lang) local trans_server = self:getTransServer() - if trans_server == "https://fanyi.youdao.com" then - return self:loadPageByYoudao(text, target_lang, source_lang) - end - return self:loadPageByGoogle(text, target_lang, source_lang) + local trans_func = self:getTransFunc(trans_server) + return trans_func(text, target_lang, source_lang) end local function http_request(s_url, method, headers, request) - local socket = require('socket') + local socket = require("socket") local socketutil = require("socketutil") - local http = require('socket.http') + local http = require("socket.http") local ltn12 = require("ltn12") local sink = {} @@ -370,14 +374,13 @@ local function http_request(s_url, method, headers, request) end socketutil:set_timeout() - request['url'] = s_url - request['method'] = method - request['sink'] = ltn12.sink.table(sink) - request['headers'] = headers + request["url"] = s_url + request["method"] = method + request["sink"] = ltn12.sink.table(sink) + request["headers"] = headers http.TIMEOUT = 5 - -- https.TIMEOUT = 5 - http.USERAGENT = 'Mozilla/5.0 (X11; Linux i686 (x86_64)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2950.0 Iron Safari/537.36' + http.USERAGENT = "Mozilla/5.0 (X11; Linux i686 (x86_64)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2950.0 Iron Safari/537.36" local httpRequest = http.request local code, response_headers, status = socket.skip( @@ -457,6 +460,7 @@ function Translator:loadPageByYoudao(text, target_lang, source_lang) logger.dbg("translator json as google translate format:", resultAsGoogleTranslate) return resultAsGoogleTranslate end +TRANS_FUNCS["https://fanyi.youdao.com"] = Translator.loadPageByYoudao --[[-- Returns decoded JSON table from translate server. From d2b49055f91879e89bb827a79a984ef94d7eaf94 Mon Sep 17 00:00:00 2001 From: muxueqz Date: Fri, 29 Apr 2022 22:03:52 +0800 Subject: [PATCH 5/7] add self parm --- frontend/ui/translator.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/ui/translator.lua b/frontend/ui/translator.lua index b88be0c5d..0b0a738b8 100644 --- a/frontend/ui/translator.lua +++ b/frontend/ui/translator.lua @@ -359,7 +359,7 @@ Returns decoded JSON table from translate server. function Translator:loadPage(text, target_lang, source_lang) local trans_server = self:getTransServer() local trans_func = self:getTransFunc(trans_server) - return trans_func(text, target_lang, source_lang) + return trans_func(self, text, target_lang, source_lang) end local function http_request(s_url, method, headers, request) From b717058409aa2f99483a0571d9bafcc41fc5de70 Mon Sep 17 00:00:00 2001 From: muxueqz Date: Sat, 30 Apr 2022 00:04:34 +0800 Subject: [PATCH 6/7] feat: Select Translate Server on UI --- frontend/ui/translator.lua | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/frontend/ui/translator.lua b/frontend/ui/translator.lua index 0b0a738b8..46522c3ee 100644 --- a/frontend/ui/translator.lua +++ b/frontend/ui/translator.lua @@ -145,7 +145,7 @@ ALT_LANGUAGE_CODES["iw"] = "he" local Translator = { trans_servers = { "https://translate.googleapis.com/", - -- "http://translate.google.cn", + "https://translate.google.cn", "https://fanyi.youdao.com", }, trans_path = "/translate_a/single", @@ -201,27 +201,37 @@ end -- Will be called by ReaderHighlight to make it available in Reader menu function Translator:genSettingsMenu() - local function genLanguagesItems(setting_name, default_checked_item) + local function genItems(items, setting_name, default_checked_item) local items_table = {} - for lang_key, lang_name in ffiutil.orderedPairs(SUPPORTED_LANGUAGES) do + for key, value in ffiutil.orderedPairs(items) do table.insert(items_table, { text_func = function() - return T("%1 (%2)", lang_name, lang_key) + return T("%1 (%2)", value, key) end, checked_func = function() if G_reader_settings:has(setting_name) then - return lang_key == G_reader_settings:readSetting(setting_name) + return key == G_reader_settings:readSetting(setting_name) else - return lang_key == default_checked_item + return key == default_checked_item end end, callback = function() - G_reader_settings:saveSetting(setting_name, lang_key) + G_reader_settings:saveSetting(setting_name, key) end, }) end return items_table end + local function genLanguagesItems(setting_name, default_checked_item) + return genItems(SUPPORTED_LANGUAGES, setting_name, default_checked_item) + end + local function genServersItems(setting_name, default_checked_item) + local servers = {} + for _, value in ipairs(self.trans_servers) do + servers[value] = "" + end + return genItems(servers, setting_name, default_checked_item) + end return { text = _("Translation settings"), @@ -281,6 +291,14 @@ This is useful: sub_item_table = genLanguagesItems("translator_to_language", self:getTargetLanguage()), keep_menu_open = true, }, + { + text_func = function() + local value = self:getTransServer() + return T(_("Translate Server: %1"), value) + end, + sub_item_table = genServersItems("trans_server", self:getTransServer()), + keep_menu_open = true, + }, }, } end From 7925fee26c1b9f7c369e2b05d4dd21b123de8c8a Mon Sep 17 00:00:00 2001 From: Frans de Jonge Date: Fri, 26 Jan 2024 19:53:34 +0100 Subject: [PATCH 7/7] update string to "Translation server" --- frontend/ui/translator.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/ui/translator.lua b/frontend/ui/translator.lua index 46522c3ee..9cb4c0a80 100644 --- a/frontend/ui/translator.lua +++ b/frontend/ui/translator.lua @@ -294,7 +294,7 @@ This is useful: { text_func = function() local value = self:getTransServer() - return T(_("Translate Server: %1"), value) + return T(_("Translation server: %1"), value) end, sub_item_table = genServersItems("trans_server", self:getTransServer()), keep_menu_open = true,