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_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

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_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

View File

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

View File

@ -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"

View File

@ -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),
)

View File

@ -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),
)