From 86e982fa3fcd9c3ae9629d936460d0c686a27b93 Mon Sep 17 00:00:00 2001 From: Chopper <156493704+choppeh@users.noreply.github.com> Date: Fri, 22 Aug 2025 12:52:58 -0300 Subject: [PATCH] Solarmtl/Snowmtl: Add support for Spanish and Italian, and fix settings (#10224) * Add support for Spanish and Italian * Bump version * Fix translator switch * Add more options for font size * Fix prefs * Fix font size default * Add support for translating manga details --- .../assets/i18n/messages_en.properties | 4 +- .../assets/i18n/messages_pt_br.properties | 4 +- .../machinetranslations/build.gradle.kts | 2 +- .../MachineTranslations.kt | 43 ++++++++++++++++--- .../extension/all/snowmtl/SnowmtlFactory.kt | 6 +-- .../extension/all/solarmtl/SolarmtlFactory.kt | 8 ++-- 6 files changed, 51 insertions(+), 16 deletions(-) diff --git a/lib-multisrc/machinetranslations/assets/i18n/messages_en.properties b/lib-multisrc/machinetranslations/assets/i18n/messages_en.properties index 5162eec62..8e77367a5 100644 --- a/lib-multisrc/machinetranslations/assets/i18n/messages_en.properties +++ b/lib-multisrc/machinetranslations/assets/i18n/messages_en.properties @@ -7,7 +7,9 @@ disable_website_setting_summary=Site fonts will be disabled and your device's fo disable_word_break_title=Disable word break disable_word_break_summary=This feature prevents words from being automatically broken in the middle of a line. disable_translator_title=Disable translator -disable_translator_summary=Disable auto translation and enable source translation +disable_translator_summary=Disable auto translation and enable source translation. This does not mean that a translation is available. translate_dialog_box_title=Translator translate_dialog_box_summary=Engine used to translate dialog boxes translate_dialog_box_toast=The translator has been changed to +enable_manga_details_translation_title=Enable translation of manga details +enable_manga_details_translation_summary=This option will slow down the loading of manga details diff --git a/lib-multisrc/machinetranslations/assets/i18n/messages_pt_br.properties b/lib-multisrc/machinetranslations/assets/i18n/messages_pt_br.properties index 0a1a6c95c..d4fa5ceda 100644 --- a/lib-multisrc/machinetranslations/assets/i18n/messages_pt_br.properties +++ b/lib-multisrc/machinetranslations/assets/i18n/messages_pt_br.properties @@ -7,7 +7,9 @@ disable_website_setting_summary=As fontes do site serão desativadas e as fontes disable_word_break_title=Desativar quebra de palavras disable_word_break_summary=Esse recurso impede que palavras sejam quebradas automaticamente no meio da linha. disable_translator_title=Desativar tradutor -disable_translator_summary=Desativar tradução automática e ativar tradução da fonte +disable_translator_summary=Desativar tradução automática e ativar tradução da fonte. Isso não significa que há uma tradução disponivel. translate_dialog_box_title=Tradutor translate_dialog_box_summary=Motor utilizado para traduzir caixas de diálogo translate_dialog_box_toast=O tradutor foi alterado para +enable_manga_details_translation_title=Habilitar tradução dos detalhes do manga +enable_manga_details_translation_summary=Esta opção tornará o carregamento dos detalhes do mangá mais lento diff --git a/lib-multisrc/machinetranslations/build.gradle.kts b/lib-multisrc/machinetranslations/build.gradle.kts index e07fe6e71..eb0cfd0f6 100644 --- a/lib-multisrc/machinetranslations/build.gradle.kts +++ b/lib-multisrc/machinetranslations/build.gradle.kts @@ -2,7 +2,7 @@ plugins { id("lib-multisrc") } -baseVersionCode = 6 +baseVersionCode = 7 dependencies { api(project(":lib:i18n")) diff --git a/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/MachineTranslations.kt b/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/MachineTranslations.kt index 0e20bb23e..8a8318813 100644 --- a/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/MachineTranslations.kt +++ b/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/MachineTranslations.kt @@ -85,6 +85,10 @@ abstract class MachineTranslations( get() = preferences.getBoolean(DISABLE_SOURCE_SETTINGS_PREF, language.disableSourceSettings) set(value) = preferences.edit().putBoolean(DISABLE_SOURCE_SETTINGS_PREF, value).apply() + protected var enableMangaDetailsTranslation: Boolean + get() = preferences.getBoolean(ENABLE_MANGA_DETAILS_TRANSLATION_PREF, false) + set(value) = preferences.edit().putBoolean(ENABLE_MANGA_DETAILS_TRANSLATION_PREF, value).apply() + private val intl = Intl( language = language.lang, baseLanguage = "en", @@ -95,6 +99,7 @@ abstract class MachineTranslations( private val settings get() = language.apply { fontSize = this@MachineTranslations.fontSize disableWordBreak = this@MachineTranslations.disableWordBreak + disableSourceSettings = this@MachineTranslations.disableSourceSettings } override val client: OkHttpClient get() = clientInstance!! @@ -123,8 +128,10 @@ abstract class MachineTranslations( .rateLimit(3, 2, TimeUnit.SECONDS) .build() + private lateinit var translator: TranslatorEngine + protected fun clientBuilder(): OkHttpClient.Builder { - val translator: TranslatorEngine = when (provider) { + translator = when (provider) { "Google" -> GoogleTranslator(clientUtils, headers) else -> BingTranslator(clientUtils, headers) } @@ -219,10 +226,10 @@ abstract class MachineTranslations( // =========================== Manga Details ============================ override fun mangaDetailsParse(document: Document) = SManga.create().apply { - title = document.selectFirst("h1")!!.text() - description = document.selectFirst("p:has(span:contains(Synopsis))")?.ownText() + title = document.selectFirst("h1")!!.text().i18n() + description = document.selectFirst("p:has(span:contains(Synopsis))")?.ownText()?.i18n() author = document.selectFirst("p:has(span:contains(Author))")?.ownText() - genre = document.select("h2:contains(Genres) + div span").joinToString { it.text() } + genre = document.select("h2:contains(Genres) + div span").joinToString { it.text() }.i18n() thumbnail_url = document.selectFirst("img.object-cover")?.absUrl("src") document.selectFirst("p:has(span:contains(Status))")?.ownText()?.let { status = when (it.lowercase()) { @@ -291,6 +298,11 @@ abstract class MachineTranslations( return json.decodeFromString(this) } + private fun String.i18n(): String = when { + enableMangaDetailsTranslation -> translator.translate(language.origin, language.target, this) + else -> this + } + // =============================== Filters ================================ override fun getFilterList(): FilterList { @@ -306,6 +318,9 @@ abstract class MachineTranslations( override fun setupPreferenceScreen(screen: PreferenceScreen) { // Some libreoffice font sizes val sizes = arrayOf( + "12", "13", "14", + "15", "16", "18", + "20", "21", "22", "24", "26", "28", "32", "36", "40", "42", "44", "48", @@ -322,6 +337,8 @@ abstract class MachineTranslations( entryValues = sizes summary = intl["font_size_summary"] + setDefaultValue(fontSize.toString()) + setOnPreferenceChange { _, newValue -> val selected = newValue as String val index = this.findIndexOfValue(selected) @@ -339,7 +356,7 @@ abstract class MachineTranslations( } }.also(screen::addPreference) - if (language.disableSourceSettings.not()) { + if (!language.disableSourceSettings) { SwitchPreferenceCompat(screen.context).apply { key = DISABLE_SOURCE_SETTINGS_PREF title = "⚠ ${intl["disable_website_setting_title"]}" @@ -367,6 +384,17 @@ abstract class MachineTranslations( return } + SwitchPreferenceCompat(screen.context).apply { + key = ENABLE_MANGA_DETAILS_TRANSLATION_PREF + title = "⚠ ${intl["enable_manga_details_translation_title"]}" + summary = intl["enable_manga_details_translation_summary"] + setDefaultValue(enableMangaDetailsTranslation) + setOnPreferenceChange { _, newValue -> + enableMangaDetailsTranslation = newValue as Boolean + true + } + }.also(screen::addPreference) + if (language.supportNativeTranslation) { SwitchPreferenceCompat(screen.context).apply { key = DISABLE_TRANSLATOR_PREF @@ -380,7 +408,7 @@ abstract class MachineTranslations( }.also(screen::addPreference) } - if (!disableTranslator && language.supportNativeTranslation) { + if (!disableTranslator) { ListPreference(screen.context).apply { key = TRANSLATOR_PROVIDER_PREF title = intl["translate_dialog_box_title"] @@ -429,7 +457,8 @@ abstract class MachineTranslations( private const val FONT_SIZE_PREF = "fontSizePref" private const val DISABLE_SOURCE_SETTINGS_PREF = "disableSourceSettingsPref" private const val DISABLE_WORD_BREAK_PREF = "disableWordBreakPref" - private const val DISABLE_TRANSLATOR_PREF = "disableWordBreakPref" + private const val DISABLE_TRANSLATOR_PREF = "disableTranslatorPref" + private const val ENABLE_MANGA_DETAILS_TRANSLATION_PREF = "enableMangaDetailsTranslationPref" private const val TRANSLATOR_PROVIDER_PREF = "translatorProviderPref" private const val DEFAULT_FONT_SIZE = "24" diff --git a/src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/SnowmtlFactory.kt b/src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/SnowmtlFactory.kt index 4592cc83e..930a308fc 100644 --- a/src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/SnowmtlFactory.kt +++ b/src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/SnowmtlFactory.kt @@ -14,8 +14,8 @@ private val languageList = listOf( Language("ar", disableSourceSettings = true), Language("en"), Language("es"), - Language("fr"), - Language("id"), + Language("fr", supportNativeTranslation = true), + Language("id", supportNativeTranslation = true), Language("it"), - Language("pt-BR", "pt"), + Language("pt-BR", "pt", supportNativeTranslation = true), ) diff --git a/src/all/solarmtl/src/eu/kanade/tachiyomi/extension/all/solarmtl/SolarmtlFactory.kt b/src/all/solarmtl/src/eu/kanade/tachiyomi/extension/all/solarmtl/SolarmtlFactory.kt index 98bb455a3..de54c3a70 100644 --- a/src/all/solarmtl/src/eu/kanade/tachiyomi/extension/all/solarmtl/SolarmtlFactory.kt +++ b/src/all/solarmtl/src/eu/kanade/tachiyomi/extension/all/solarmtl/SolarmtlFactory.kt @@ -13,7 +13,9 @@ class SolarmtlFactory : SourceFactory { private val languageList = listOf( Language("ar", disableSourceSettings = true), Language("en"), - Language("fr", disableTranslator = true, supportNativeTranslation = true), - Language("id"), - Language("pt-BR", "pt", disableTranslator = true, supportNativeTranslation = true), + Language("es"), + Language("fr", supportNativeTranslation = true), + Language("id", supportNativeTranslation = true), + Language("it"), + Language("pt-BR", "pt", supportNativeTranslation = true), )