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
This commit is contained in:
Chopper 2025-08-22 12:52:58 -03:00 committed by Draff
parent 15cc2c886d
commit 86e982fa3f
Signed by: Draff
GPG Key ID: E8A89F3211677653
6 changed files with 51 additions and 16 deletions

View File

@ -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_title=Disable word break
disable_word_break_summary=This feature prevents words from being automatically broken in the middle of a line. 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_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_title=Translator
translate_dialog_box_summary=Engine used to translate dialog boxes translate_dialog_box_summary=Engine used to translate dialog boxes
translate_dialog_box_toast=The translator has been changed to 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

View File

@ -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_title=Desativar quebra de palavras
disable_word_break_summary=Esse recurso impede que palavras sejam quebradas automaticamente no meio da linha. disable_word_break_summary=Esse recurso impede que palavras sejam quebradas automaticamente no meio da linha.
disable_translator_title=Desativar tradutor 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_title=Tradutor
translate_dialog_box_summary=Motor utilizado para traduzir caixas de diálogo translate_dialog_box_summary=Motor utilizado para traduzir caixas de diálogo
translate_dialog_box_toast=O tradutor foi alterado para 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

View File

@ -2,7 +2,7 @@ plugins {
id("lib-multisrc") id("lib-multisrc")
} }
baseVersionCode = 6 baseVersionCode = 7
dependencies { dependencies {
api(project(":lib:i18n")) api(project(":lib:i18n"))

View File

@ -85,6 +85,10 @@ abstract class MachineTranslations(
get() = preferences.getBoolean(DISABLE_SOURCE_SETTINGS_PREF, language.disableSourceSettings) get() = preferences.getBoolean(DISABLE_SOURCE_SETTINGS_PREF, language.disableSourceSettings)
set(value) = preferences.edit().putBoolean(DISABLE_SOURCE_SETTINGS_PREF, value).apply() 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( private val intl = Intl(
language = language.lang, language = language.lang,
baseLanguage = "en", baseLanguage = "en",
@ -95,6 +99,7 @@ abstract class MachineTranslations(
private val settings get() = language.apply { private val settings get() = language.apply {
fontSize = this@MachineTranslations.fontSize fontSize = this@MachineTranslations.fontSize
disableWordBreak = this@MachineTranslations.disableWordBreak disableWordBreak = this@MachineTranslations.disableWordBreak
disableSourceSettings = this@MachineTranslations.disableSourceSettings
} }
override val client: OkHttpClient get() = clientInstance!! override val client: OkHttpClient get() = clientInstance!!
@ -123,8 +128,10 @@ abstract class MachineTranslations(
.rateLimit(3, 2, TimeUnit.SECONDS) .rateLimit(3, 2, TimeUnit.SECONDS)
.build() .build()
private lateinit var translator: TranslatorEngine
protected fun clientBuilder(): OkHttpClient.Builder { protected fun clientBuilder(): OkHttpClient.Builder {
val translator: TranslatorEngine = when (provider) { translator = when (provider) {
"Google" -> GoogleTranslator(clientUtils, headers) "Google" -> GoogleTranslator(clientUtils, headers)
else -> BingTranslator(clientUtils, headers) else -> BingTranslator(clientUtils, headers)
} }
@ -219,10 +226,10 @@ abstract class MachineTranslations(
// =========================== Manga Details ============================ // =========================== Manga Details ============================
override fun mangaDetailsParse(document: Document) = SManga.create().apply { override fun mangaDetailsParse(document: Document) = SManga.create().apply {
title = document.selectFirst("h1")!!.text() title = document.selectFirst("h1")!!.text().i18n()
description = document.selectFirst("p:has(span:contains(Synopsis))")?.ownText() description = document.selectFirst("p:has(span:contains(Synopsis))")?.ownText()?.i18n()
author = document.selectFirst("p:has(span:contains(Author))")?.ownText() 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") thumbnail_url = document.selectFirst("img.object-cover")?.absUrl("src")
document.selectFirst("p:has(span:contains(Status))")?.ownText()?.let { document.selectFirst("p:has(span:contains(Status))")?.ownText()?.let {
status = when (it.lowercase()) { status = when (it.lowercase()) {
@ -291,6 +298,11 @@ abstract class MachineTranslations(
return json.decodeFromString(this) return json.decodeFromString(this)
} }
private fun String.i18n(): String = when {
enableMangaDetailsTranslation -> translator.translate(language.origin, language.target, this)
else -> this
}
// =============================== Filters ================================ // =============================== Filters ================================
override fun getFilterList(): FilterList { override fun getFilterList(): FilterList {
@ -306,6 +318,9 @@ abstract class MachineTranslations(
override fun setupPreferenceScreen(screen: PreferenceScreen) { override fun setupPreferenceScreen(screen: PreferenceScreen) {
// Some libreoffice font sizes // Some libreoffice font sizes
val sizes = arrayOf( val sizes = arrayOf(
"12", "13", "14",
"15", "16", "18",
"20", "21", "22",
"24", "26", "28", "24", "26", "28",
"32", "36", "40", "32", "36", "40",
"42", "44", "48", "42", "44", "48",
@ -322,6 +337,8 @@ abstract class MachineTranslations(
entryValues = sizes entryValues = sizes
summary = intl["font_size_summary"] summary = intl["font_size_summary"]
setDefaultValue(fontSize.toString())
setOnPreferenceChange { _, newValue -> setOnPreferenceChange { _, newValue ->
val selected = newValue as String val selected = newValue as String
val index = this.findIndexOfValue(selected) val index = this.findIndexOfValue(selected)
@ -339,7 +356,7 @@ abstract class MachineTranslations(
} }
}.also(screen::addPreference) }.also(screen::addPreference)
if (language.disableSourceSettings.not()) { if (!language.disableSourceSettings) {
SwitchPreferenceCompat(screen.context).apply { SwitchPreferenceCompat(screen.context).apply {
key = DISABLE_SOURCE_SETTINGS_PREF key = DISABLE_SOURCE_SETTINGS_PREF
title = "${intl["disable_website_setting_title"]}" title = "${intl["disable_website_setting_title"]}"
@ -367,6 +384,17 @@ abstract class MachineTranslations(
return 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) { if (language.supportNativeTranslation) {
SwitchPreferenceCompat(screen.context).apply { SwitchPreferenceCompat(screen.context).apply {
key = DISABLE_TRANSLATOR_PREF key = DISABLE_TRANSLATOR_PREF
@ -380,7 +408,7 @@ abstract class MachineTranslations(
}.also(screen::addPreference) }.also(screen::addPreference)
} }
if (!disableTranslator && language.supportNativeTranslation) { if (!disableTranslator) {
ListPreference(screen.context).apply { ListPreference(screen.context).apply {
key = TRANSLATOR_PROVIDER_PREF key = TRANSLATOR_PROVIDER_PREF
title = intl["translate_dialog_box_title"] title = intl["translate_dialog_box_title"]
@ -429,7 +457,8 @@ abstract class MachineTranslations(
private const val FONT_SIZE_PREF = "fontSizePref" private const val FONT_SIZE_PREF = "fontSizePref"
private const val DISABLE_SOURCE_SETTINGS_PREF = "disableSourceSettingsPref" private const val DISABLE_SOURCE_SETTINGS_PREF = "disableSourceSettingsPref"
private const val DISABLE_WORD_BREAK_PREF = "disableWordBreakPref" 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 TRANSLATOR_PROVIDER_PREF = "translatorProviderPref"
private const val DEFAULT_FONT_SIZE = "24" private const val DEFAULT_FONT_SIZE = "24"

View File

@ -14,8 +14,8 @@ private val languageList = listOf(
Language("ar", disableSourceSettings = true), Language("ar", disableSourceSettings = true),
Language("en"), Language("en"),
Language("es"), Language("es"),
Language("fr"), Language("fr", supportNativeTranslation = true),
Language("id"), Language("id", supportNativeTranslation = true),
Language("it"), Language("it"),
Language("pt-BR", "pt"), Language("pt-BR", "pt", supportNativeTranslation = true),
) )

View File

@ -13,7 +13,9 @@ class SolarmtlFactory : SourceFactory {
private val languageList = listOf( private val languageList = listOf(
Language("ar", disableSourceSettings = true), Language("ar", disableSourceSettings = true),
Language("en"), Language("en"),
Language("fr", disableTranslator = true, supportNativeTranslation = true), Language("es"),
Language("id"), Language("fr", supportNativeTranslation = true),
Language("pt-BR", "pt", disableTranslator = true, supportNativeTranslation = true), Language("id", supportNativeTranslation = true),
Language("it"),
Language("pt-BR", "pt", supportNativeTranslation = true),
) )