Translator: add "Translate from book language" option (#8094)

When enabled, if the book has some supported language tag
in its metadata, use it as the source language. Otherwise,
fallback to the current settings (auto-detect or selected
source language).
reviewable/pr8100/r1
poire-z 3 years ago committed by GitHub
parent 4e65b74b73
commit 1a12e8555e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -113,6 +113,8 @@ for __, v in ipairs(LANGUAGES) do
ReaderTypography.HYPH_DICT_NAME_TO_LANG_NAME_TAG[hyph_filename] = { lang_name, lang_tag }
end
end
-- Make lang aliases available to other modules (can be used by Translator)
ReaderTypography.LANG_ALIAS_TO_LANG_TAG = LANG_ALIAS_TO_LANG_TAG
function ReaderTypography:init()
self.menu_table = {}

@ -183,13 +183,13 @@ end
function Translator:getLanguageName(lang, default_string)
if SUPPORTED_LANGUAGES[lang] then
return SUPPORTED_LANGUAGES[lang]
return SUPPORTED_LANGUAGES[lang], true
elseif ALT_LANGUAGE_CODES[lang] then
return SUPPORTED_LANGUAGES[ALT_LANGUAGE_CODES[lang]]
return SUPPORTED_LANGUAGES[ALT_LANGUAGE_CODES[lang]], true
elseif lang then
return lang:upper()
return lang:upper(), false
end
return default_string
return default_string, false
end
-- Will be called by ReaderHighlight to make it available in Reader menu
@ -220,6 +220,10 @@ function Translator:genSettingsMenu()
sub_item_table = {
{
text = _("Auto-detect source language"),
help_text = _("This setting is best suited for foreign text found in books written in your native language."),
enabled_func = function()
return not (G_reader_settings:isTrue("translator_from_doc_lang") and self:getDocumentLanguage() ~= nil)
end,
checked_func = function()
return G_reader_settings:nilOrTrue("translator_from_auto_detect")
end,
@ -232,11 +236,33 @@ function Translator:genSettingsMenu()
local lang = G_reader_settings:readSetting("translator_from_language")
return T(_("Translate from: %1"), self:getLanguageName(lang, ""))
end,
help_text = _("If a specific source language is manually selected, it will be used everywhere, in all your books."),
enabled_func = function()
return not G_reader_settings:nilOrTrue("translator_from_auto_detect")
and not (G_reader_settings:isTrue("translator_from_doc_lang") and self:getDocumentLanguage() ~= nil)
end,
sub_item_table = genLanguagesItems("translator_from_language"),
keep_menu_open = true,
},
{
text_func = function()
local __, name = self:getDocumentLanguage()
return T(_("Translate from book language: %1"), name or _("N/A"))
end,
help_text = _([[
With books that specify their main language in their metadata (most EPUBs and FB2s), enabling this option will make this language the source language. Otherwise, auto-detection or the selected language will be used.
This is useful:
- For books in a foreign language, where consistent translation is needed and words in other languages are rare.
- For books in familiar languages, to get definitions for words from the translation service.]]),
enabled_func = function()
return self:getDocumentLanguage() ~= nil
end,
checked_func = function()
return G_reader_settings:isTrue("translator_from_doc_lang")
end,
callback = function()
G_reader_settings:flipTrue("translator_from_doc_lang")
end,
separator = true,
},
{
@ -251,7 +277,45 @@ function Translator:genSettingsMenu()
}
end
function Translator:getDocumentLanguage()
local ReaderUI = require("apps/reader/readerui")
local ui = ReaderUI:_getRunningInstance()
if not ui or not ui.document then
return
end
local props = ui.document:getProps()
if not props or not props.language or props.language == "" then
return
end
local lang = props.language
lang = lang:match("(.*)-") or lang
lang = lang:lower()
local name, supported = self:getLanguageName(lang, "")
if supported then
return lang, name
end
-- ReaderTypography has a map of lang aliases (that we may meet
-- in book metadata) to their normalized lang tag: use it
local ReaderTypography = require("apps/reader/modules/readertypography")
lang = ReaderTypography.LANG_ALIAS_TO_LANG_TAG[lang]
if not lang then
return
end
name, supported = self:getLanguageName(lang, "")
if supported then
return lang, name
end
end
function Translator:getSourceLanguage()
if G_reader_settings:isTrue("translator_from_doc_lang") then
local lang = self:getDocumentLanguage()
if lang then
return lang
end
-- No document or metadata lang tag not supported:
-- fallback to other settings
end
if G_reader_settings:isFalse("translator_from_auto_detect") and
G_reader_settings:has("translator_from_language") then
return G_reader_settings:readSetting("translator_from_language")

Loading…
Cancel
Save