MachineTranslations: Fix bad fragments and settings (#10239)

* Fix bad fragments and settings

* Bump version

* Use keiyoushi.utils.parseAs

* Avoid replacing default settings
This commit is contained in:
Chopper 2025-08-23 12:03:13 -03:00 committed by Draff
parent 8059156500
commit 41a275917d
Signed by: Draff
GPG Key ID: E8A89F3211677653
8 changed files with 25 additions and 30 deletions

View File

@ -7,7 +7,7 @@ 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. This does not mean that a translation is available. disable_translator_summary=Disable auto translation and enable source translation. This does not mean that a translation is available. Make sure a translation is available before enabling this option.
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

View File

@ -7,7 +7,7 @@ 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. Isso não significa que há uma tradução disponivel. disable_translator_summary=Desativar tradução automática e ativar tradução da fonte. Isso não significa que há uma tradução disponivel. Certifique-se de que exista uma tradução antes de ativar esta opção no site.
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

View File

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

View File

@ -25,7 +25,7 @@ import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import keiyoushi.utils.getPreferencesLazy import keiyoushi.utils.getPreferencesLazy
import kotlinx.serialization.decodeFromString import keiyoushi.utils.parseAs
import kotlinx.serialization.encodeToString import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.HttpUrl.Companion.toHttpUrl
@ -96,11 +96,12 @@ abstract class MachineTranslations(
classLoader = this::class.java.classLoader!!, classLoader = this::class.java.classLoader!!,
) )
private val settings get() = language.apply { private val settings get() = language.copy(
fontSize = this@MachineTranslations.fontSize fontSize = this@MachineTranslations.fontSize,
disableWordBreak = this@MachineTranslations.disableWordBreak disableWordBreak = this@MachineTranslations.disableWordBreak,
disableSourceSettings = this@MachineTranslations.disableSourceSettings disableTranslator = this@MachineTranslations.disableTranslator,
} disableSourceSettings = this@MachineTranslations.disableSourceSettings,
)
override val client: OkHttpClient get() = clientInstance!! override val client: OkHttpClient get() = clientInstance!!
@ -267,7 +268,7 @@ abstract class MachineTranslations(
val fragment = json.encodeToString<List<Dialog>>( val fragment = json.encodeToString<List<Dialog>>(
dto.dialogues.filter { it.getTextBy(language).isNotBlank() }, dto.dialogues.filter { it.getTextBy(language).isNotBlank() },
) )
Page(index, imageUrl = "$imageUrl#$fragment") Page(index, imageUrl = "$imageUrl${fragment.toFragment()}")
} }
} }
@ -294,9 +295,8 @@ abstract class MachineTranslations(
} }
} }
private inline fun <reified T> String.parseAs(): T { // Prevent bad fragments
return json.decodeFromString(this) fun String.toFragment(): String = "#${this.replace("#", "*")}"
}
private fun String.i18n(): String = when { private fun String.i18n(): String = when {
enableMangaDetailsTranslation -> translator.translate(language.origin, language.target, this) enableMangaDetailsTranslation -> translator.translate(language.origin, language.target, this)

View File

@ -43,7 +43,10 @@ data class Dialog(
private val bgColor: List<Int> = emptyList(), private val bgColor: List<Int> = emptyList(),
) { ) {
val text: String get() = textByLanguage["text"] ?: throw Exception("Dialog not found") val text: String get() = textByLanguage["text"] ?: throw Exception("Dialog not found")
fun getTextBy(language: Language) = textByLanguage[language.target] ?: text fun getTextBy(language: Language) = when {
!language.disableTranslator -> textByLanguage[language.origin]
else -> textByLanguage[language.target]
} ?: text
val width get() = x2 - x1 val width get() = x2 - x1
val height get() = y2 - y1 val height get() = y2 - y1

View File

@ -2,13 +2,13 @@ package eu.kanade.tachiyomi.multisrc.machinetranslations
class MachineTranslationsFactoryUtils class MachineTranslationsFactoryUtils
class Language( data class Language(
val lang: String, val lang: String,
val target: String = lang, val target: String = lang,
val origin: String = "en", val origin: String = "en",
var fontSize: Int = 24, val fontSize: Int = 24,
var disableSourceSettings: Boolean = false, val disableSourceSettings: Boolean = false,
var disableWordBreak: Boolean = false, val disableWordBreak: Boolean = false,
var disableTranslator: Boolean = false, val disableTranslator: Boolean = false,
var supportNativeTranslation: Boolean = false, val supportNativeTranslation: Boolean = false,
) )

View File

@ -16,7 +16,7 @@ import eu.kanade.tachiyomi.multisrc.machinetranslations.Dialog
import eu.kanade.tachiyomi.multisrc.machinetranslations.Language import eu.kanade.tachiyomi.multisrc.machinetranslations.Language
import eu.kanade.tachiyomi.multisrc.machinetranslations.MachineTranslations.Companion.PAGE_REGEX import eu.kanade.tachiyomi.multisrc.machinetranslations.MachineTranslations.Companion.PAGE_REGEX
import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.GET
import kotlinx.serialization.decodeFromString import keiyoushi.utils.parseAs
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import okhttp3.Interceptor import okhttp3.Interceptor
import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaType
@ -244,10 +244,6 @@ class ComposedImageInterceptor(
}.build() }.build()
} }
private inline fun <reified T> String.parseAs(): T {
return json.decodeFromString(this)
}
private fun Canvas.draw(textPaint: TextPaint, layout: StaticLayout, dialog: Dialog, x: Float, y: Float) { private fun Canvas.draw(textPaint: TextPaint, layout: StaticLayout, dialog: Dialog, x: Float, y: Float) {
save() save()
translate(x, y) translate(x, y)

View File

@ -6,11 +6,11 @@ import eu.kanade.tachiyomi.multisrc.machinetranslations.Dialog
import eu.kanade.tachiyomi.multisrc.machinetranslations.Language import eu.kanade.tachiyomi.multisrc.machinetranslations.Language
import eu.kanade.tachiyomi.multisrc.machinetranslations.MachineTranslations.Companion.PAGE_REGEX import eu.kanade.tachiyomi.multisrc.machinetranslations.MachineTranslations.Companion.PAGE_REGEX
import eu.kanade.tachiyomi.multisrc.machinetranslations.translator.TranslatorEngine import eu.kanade.tachiyomi.multisrc.machinetranslations.translator.TranslatorEngine
import keiyoushi.utils.parseAs
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.encodeToString import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import okhttp3.Interceptor import okhttp3.Interceptor
@ -58,8 +58,4 @@ class TranslationInterceptor(
"text" to value, "text" to value,
), ),
) )
private inline fun <reified T> String.parseAs(): T {
return json.decodeFromString(this)
}
} }