Compare commits

...

36 Commits

Author SHA1 Message Date
Koitharu
1bd916371a Update parsers 2024-12-14 09:36:50 +02:00
Koitharu
cd40dab8a4 Error handling fixes 2024-12-10 14:29:55 +02:00
Koitharu
d2ed8a1ace Update parsers 2024-12-07 15:18:18 +02:00
حيدر العراقي
024e3c11ee Translated using Weblate (Arabic)
Currently translated at 88.0% (668 of 759 strings)

Co-authored-by: حيدر العراقي <haiderdc12@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/ar/
Translation: Kotatsu/Strings
2024-12-07 15:17:34 +02:00
return_null
23ba302df8 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (759 of 759 strings)

Co-authored-by: return_null <demolang@dismail.de>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/zh_Hans/
Translation: Kotatsu/Strings
2024-12-07 15:17:34 +02:00
maryush
34e54e43e0 Translated using Weblate (Polish)
Currently translated at 100.0% (759 of 759 strings)

Co-authored-by: maryush <maryush@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/pl/
Translation: Kotatsu/Strings
2024-12-07 15:17:34 +02:00
Anon
07a8de6225 Translated using Weblate (Serbian)
Currently translated at 99.6% (756 of 759 strings)

Co-authored-by: Anon <anonymousprivate76@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/sr/
Translation: Kotatsu/Strings
2024-12-07 15:17:34 +02:00
gallegonovato
a3df6f799c Translated using Weblate (Spanish)
Currently translated at 100.0% (759 of 759 strings)

Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/es/
Translation: Kotatsu/Strings
2024-12-07 15:17:34 +02:00
Maple Javora
d5722790ef Translated using Weblate (Czech)
Currently translated at 89.0% (676 of 759 strings)

Co-authored-by: Maple Javora <jindrous101@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/cs/
Translation: Kotatsu/Strings
2024-12-07 15:17:34 +02:00
johan
8bf540abbe Translated using Weblate (Czech)
Currently translated at 89.0% (676 of 759 strings)

Co-authored-by: johan <jqb4@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/cs/
Translation: Kotatsu/Strings
2024-12-07 15:17:34 +02:00
gekka
5241fa0d13 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (759 of 759 strings)

Co-authored-by: gekka <1778962971@qq.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/zh_Hans/
Translation: Kotatsu/Strings
2024-12-07 15:17:34 +02:00
Dragibus Noir
87e0c931a2 Translated using Weblate (French)
Currently translated at 100.0% (759 of 759 strings)

Co-authored-by: Dragibus Noir <dragibusnoir@pm.me>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fr/
Translation: Kotatsu/Strings
2024-12-07 15:17:34 +02:00
Infy's Tagalog Translations
a51412801a Translated using Weblate (Filipino)
Currently translated at 100.0% (759 of 759 strings)

Co-authored-by: Infy's Tagalog Translations <ced.paltep10@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fil/
Translation: Kotatsu/Strings
2024-12-07 15:17:34 +02:00
TheOneWhoCares
a6c188d647 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (759 of 759 strings)

Co-authored-by: TheOneWhoCares <266nre4gw@mozmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/pt_BR/
Translation: Kotatsu/Strings
2024-12-07 15:17:34 +02:00
Frosted
831632cb8f Translated using Weblate (Turkish)
Currently translated at 100.0% (759 of 759 strings)

Co-authored-by: Frosted <frosted@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/tr/
Translation: Kotatsu/Strings
2024-12-07 15:17:34 +02:00
Koitharu
ad59bf50f4 Fix loading local manga without index #1192 2024-12-05 18:39:31 +02:00
Koitharu
6fe6c05327 Update parsers 2024-12-05 18:38:47 +02:00
Koitharu
b5053b7820 Update parsers 2024-11-29 09:31:46 +02:00
Koitharu
e4df81495d Merge pull request #1184 from weblate/weblate-kotatsu-strings 2024-11-28 16:10:45 +02:00
Anon
295c5bed9f Translated using Weblate (Serbian)
Currently translated at 99.6% (755 of 758 strings)

Co-authored-by: Anon <anonymousprivate76@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/sr/
Translation: Kotatsu/Strings
2024-11-28 12:24:33 +01:00
TheOneWhoCares
5fd1cbadcd Translated using Weblate (Portuguese (Brazil))
Currently translated at 97.4% (739 of 758 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 95.6% (725 of 758 strings)

Co-authored-by: TheOneWhoCares <266nre4gw@mozmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/pt_BR/
Translation: Kotatsu/Strings
2024-11-28 12:24:33 +01:00
Gabriel Vasconcelos
9dd86f57e6 Translated using Weblate (Portuguese (Brazil))
Currently translated at 95.6% (725 of 758 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 93.6% (710 of 758 strings)

Co-authored-by: Gabriel Vasconcelos <gabriels.v9@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/pt_BR/
Translation: Kotatsu/Strings
2024-11-28 12:24:33 +01:00
TheOneWhoCares
bce6d71743 Translated using Weblate (Portuguese (Brazil))
Currently translated at 93.6% (710 of 758 strings)

Co-authored-by: TheOneWhoCares <266nre4gw@mozmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/pt_BR/
Translation: Kotatsu/Strings
2024-11-28 12:24:33 +01:00
Frosted
6367c06f49 Translated using Weblate (Turkish)
Currently translated at 100.0% (758 of 758 strings)

Co-authored-by: Frosted <frosted@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/tr/
Translation: Kotatsu/Strings
2024-11-28 12:24:32 +01:00
Dragibus Noir
3aa8e9d6d3 Translated using Weblate (French)
Currently translated at 100.0% (758 of 758 strings)

Co-authored-by: Dragibus Noir <dragibusnoir@pm.me>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fr/
Translation: Kotatsu/Strings
2024-11-28 12:24:32 +01:00
Draken
ac2b367312 Translated using Weblate (Vietnamese)
Currently translated at 100.0% (758 of 758 strings)

Co-authored-by: Draken <premieregirl26@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/vi/
Translation: Kotatsu/Strings
2024-11-28 12:24:32 +01:00
Justine Kyle Cobar
5cd9b02159 Translated using Weblate (Filipino)
Currently translated at 100.0% (758 of 758 strings)

Co-authored-by: Justine Kyle Cobar <cobarjustinekyle583@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fil/
Translation: Kotatsu/Strings
2024-11-28 12:24:32 +01:00
Infy's Tagalog Translations
0bd62c6925 Translated using Weblate (Filipino)
Currently translated at 100.0% (758 of 758 strings)

Co-authored-by: Infy's Tagalog Translations <ced.paltep10@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fil/
Translation: Kotatsu/Strings
2024-11-28 12:24:32 +01:00
gekka
d657216a69 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (758 of 758 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (758 of 758 strings)

Co-authored-by: gekka <1778962971@qq.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/zh_Hans/
Translation: Kotatsu/Strings
2024-11-28 12:24:32 +01:00
大王叫我来巡山
39f91464dc Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (758 of 758 strings)

Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/zh_Hans/
Translation: Kotatsu/Strings
2024-11-28 12:24:32 +01:00
gallegonovato
05422b95a1 Translated using Weblate (Spanish)
Currently translated at 100.0% (758 of 758 strings)

Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/es/
Translation: Kotatsu/Strings
2024-11-28 12:24:31 +01:00
arasseo.
554e3c1b61 Change ZERO_MS DNS
Switch to the primary DNS because the performance is better
2024-11-27 10:11:57 +02:00
Koitharu
56ece80f2a Bump version 2024-11-25 10:03:00 +02:00
Koitharu
3ebde0284d Kitsu fixes #1151 2024-11-24 13:42:52 +02:00
Koitharu
c993488fe7 Option to disable link handling #1149 2024-11-24 10:47:06 +02:00
Koitharu
e65a3b43f6 Fixes 2024-11-24 09:37:46 +02:00
31 changed files with 290 additions and 86 deletions

1
.gitignore vendored
View File

@@ -26,3 +26,4 @@
.cxx .cxx
/.idea/deviceManager.xml /.idea/deviceManager.xml
/.kotlin/ /.kotlin/
/.idea/AndroidProjectSystem.xml

View File

@@ -18,8 +18,8 @@ android {
applicationId 'org.koitharu.kotatsu' applicationId 'org.koitharu.kotatsu'
minSdk = 21 minSdk = 21
targetSdk = 35 targetSdk = 35
versionCode = 690 versionCode = 694
versionName = '7.7-beta2' versionName = '7.7.2'
generatedDensities = [] generatedDensities = []
testInstrumentationRunner 'org.koitharu.kotatsu.HiltTestRunner' testInstrumentationRunner 'org.koitharu.kotatsu.HiltTestRunner'
ksp { ksp {

View File

@@ -402,7 +402,7 @@
android:value="@bool/com_samsung_android_icon_container_has_icon_container" /> android:value="@bool/com_samsung_android_icon_container_has_icon_container" />
<activity-alias <activity-alias
android:name="org.koitharu.kotatsu.details.ui.DetailsBYLinkActivity" android:name="org.koitharu.kotatsu.details.ui.DetailsByLinkActivity"
android:exported="true" android:exported="true"
android:targetActivity="org.koitharu.kotatsu.details.ui.DetailsActivity"> android:targetActivity="org.koitharu.kotatsu.details.ui.DetailsActivity">

View File

@@ -78,6 +78,9 @@ open class BaseApp : Application(), Configuration.Provider {
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
if (ACRA.isACRASenderServiceProcess()) {
return
}
AppCompatDelegate.setDefaultNightMode(settings.theme) AppCompatDelegate.setDefaultNightMode(settings.theme)
AppCompatDelegate.setApplicationLocales(settings.appLocales) AppCompatDelegate.setApplicationLocales(settings.appLocales)
// TLS 1.3 support for Android < 10 // TLS 1.3 support for Android < 10

View File

@@ -1,3 +1,3 @@
package org.koitharu.kotatsu.core.exceptions package org.koitharu.kotatsu.core.exceptions
class CaughtException(cause: Throwable, override val message: String?) : RuntimeException(cause) class CaughtException(cause: Throwable) : RuntimeException("${cause.javaClass.simpleName}(${cause.message})", cause)

View File

@@ -85,7 +85,7 @@ class DoHManager(
).build() ).build()
DoHProvider.ZERO_MS -> DnsOverHttps.Builder().client(bootstrapClient) DoHProvider.ZERO_MS -> DnsOverHttps.Builder().client(bootstrapClient)
.url("https://2ca4h4crra.cloudflare-gateway.com/dns-query".toHttpUrl()) .url("https://0ms.dev/dns-query".toHttpUrl())
.resolvePublicAddresses(true) .resolvePublicAddresses(true)
.build() .build()
} }

View File

@@ -79,7 +79,9 @@ class ParserMangaRepository(
} }
override suspend fun getPageUrl(page: MangaPage): String = mirrorSwitchInterceptor.withMirrorSwitching { override suspend fun getPageUrl(page: MangaPage): String = mirrorSwitchInterceptor.withMirrorSwitching {
parser.getPageUrl(page) parser.getPageUrl(page).also { result ->
check(result.isNotEmpty()) { "Page url is empty" }
}
} }
override suspend fun getFilterOptions(): MangaListFilterOptions = filterOptionsLazy.get() override suspend fun getFilterOptions(): MangaListFilterOptions = filterOptionsLazy.get()

View File

@@ -727,6 +727,7 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) {
const val KEY_LINK_MANUAL = "about_help" const val KEY_LINK_MANUAL = "about_help"
const val KEY_PROXY_TEST = "proxy_test" const val KEY_PROXY_TEST = "proxy_test"
const val KEY_OPEN_BROWSER = "open_browser" const val KEY_OPEN_BROWSER = "open_browser"
const val KEY_HANDLE_LINKS = "handle_links"
// old keys are for migration only // old keys are for migration only
private const val KEY_IMAGES_PROXY_OLD = "images_proxy" private const val KEY_IMAGES_PROXY_OLD = "images_proxy"

View File

@@ -58,7 +58,7 @@ class ErrorDetailsDialog : AlertDialogFragment<DialogErrorDetailsBinding>() {
if (exception.isReportable()) { if (exception.isReportable()) {
builder.setPositiveButton(R.string.report) { _, _ -> builder.setPositiveButton(R.string.report) { _, _ ->
dismiss() dismiss()
exception.report() exception.report(silent = true)
} }
} }
return builder return builder

View File

@@ -9,6 +9,7 @@ import okhttp3.Response
import okio.FileNotFoundException import okio.FileNotFoundException
import okio.IOException import okio.IOException
import okio.ProtocolException import okio.ProtocolException
import org.acra.ktx.sendSilentlyWithAcra
import org.acra.ktx.sendWithAcra import org.acra.ktx.sendWithAcra
import org.jsoup.HttpStatusException import org.jsoup.HttpStatusException
import org.koitharu.kotatsu.R import org.koitharu.kotatsu.R
@@ -37,14 +38,16 @@ import org.koitharu.kotatsu.parsers.exception.NotFoundException
import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.exception.ParseException
import org.koitharu.kotatsu.parsers.exception.TooManyRequestExceptions import org.koitharu.kotatsu.parsers.exception.TooManyRequestExceptions
import org.koitharu.kotatsu.scrobbling.common.domain.ScrobblerAuthRequiredException import org.koitharu.kotatsu.scrobbling.common.domain.ScrobblerAuthRequiredException
import java.io.ObjectOutputStream
import java.net.ConnectException import java.net.ConnectException
import java.net.NoRouteToHostException import java.net.NoRouteToHostException
import java.io.ObjectOutputStream import java.net.SocketException
import java.net.SocketTimeoutException import java.net.SocketTimeoutException
import java.net.UnknownHostException import java.net.UnknownHostException
import java.util.Locale import java.util.Locale
private const val MSG_NO_SPACE_LEFT = "No space left on device" private const val MSG_NO_SPACE_LEFT = "No space left on device"
private const val MSG_CONNECTION_RESET = "Connection reset"
private const val IMAGE_FORMAT_NOT_SUPPORTED = "Image format not supported" private const val IMAGE_FORMAT_NOT_SUPPORTED = "Image format not supported"
fun Throwable.getDisplayMessage(resources: Resources): String = getDisplayMessageOrNull(resources) fun Throwable.getDisplayMessage(resources: Resources): String = getDisplayMessageOrNull(resources)
@@ -57,7 +60,7 @@ private fun Throwable.getDisplayMessageOrNull(resources: Resources): String? = w
) )
is AuthRequiredException -> resources.getString(R.string.auth_required) is AuthRequiredException -> resources.getString(R.string.auth_required)
is CloudFlareProtectedException -> resources.getString(R.string.captcha_required) is CloudFlareProtectedException -> resources.getString(R.string.captcha_required_message)
is CloudFlareBlockedException -> resources.getString(R.string.blocked_by_server_message) is CloudFlareBlockedException -> resources.getString(R.string.blocked_by_server_message)
is ActivityNotFoundException, is ActivityNotFoundException,
is UnsupportedOperationException, is UnsupportedOperationException,
@@ -116,7 +119,7 @@ private fun Throwable.getDisplayMessageOrNull(resources: Resources): String? = w
is HttpException -> getHttpDisplayMessage(response.code, resources) is HttpException -> getHttpDisplayMessage(response.code, resources)
is HttpStatusException -> getHttpDisplayMessage(statusCode, resources) is HttpStatusException -> getHttpDisplayMessage(statusCode, resources)
else -> getDisplayMessage(message, resources) ?: message else -> mapDisplayMessage(message, resources) ?: message
}.takeUnless { it.isNullOrBlank() } }.takeUnless { it.isNullOrBlank() }
@DrawableRes @DrawableRes
@@ -153,10 +156,11 @@ private fun getHttpDisplayMessage(statusCode: Int, resources: Resources): String
else -> null else -> null
} }
private fun getDisplayMessage(msg: String?, resources: Resources): String? = when { private fun mapDisplayMessage(msg: String?, resources: Resources): String? = when {
msg.isNullOrEmpty() -> null msg.isNullOrEmpty() -> null
msg.contains(MSG_NO_SPACE_LEFT) -> resources.getString(R.string.error_no_space_left) msg.contains(MSG_NO_SPACE_LEFT) -> resources.getString(R.string.error_no_space_left)
msg.contains(IMAGE_FORMAT_NOT_SUPPORTED) -> resources.getString(R.string.error_corrupted_file) msg.contains(IMAGE_FORMAT_NOT_SUPPORTED) -> resources.getString(R.string.error_corrupted_file)
msg == MSG_CONNECTION_RESET -> resources.getString(R.string.error_connection_reset)
msg == FILTER_MULTIPLE_GENRES_NOT_SUPPORTED -> resources.getString(R.string.error_multiple_genres_not_supported) msg == FILTER_MULTIPLE_GENRES_NOT_SUPPORTED -> resources.getString(R.string.error_multiple_genres_not_supported)
msg == FILTER_MULTIPLE_STATES_NOT_SUPPORTED -> resources.getString(R.string.error_multiple_states_not_supported) msg == FILTER_MULTIPLE_STATES_NOT_SUPPORTED -> resources.getString(R.string.error_multiple_states_not_supported)
msg == SEARCH_NOT_SUPPORTED -> resources.getString(R.string.error_search_not_supported) msg == SEARCH_NOT_SUPPORTED -> resources.getString(R.string.error_search_not_supported)
@@ -183,6 +187,7 @@ fun Throwable.isReportable(): Boolean {
|| this is WrongPasswordException || this is WrongPasswordException
|| this is TooManyRequestExceptions || this is TooManyRequestExceptions
|| this is HttpStatusException || this is HttpStatusException
|| this is SocketException
) { ) {
return false return false
} }
@@ -193,9 +198,13 @@ fun Throwable.isNetworkError(): Boolean {
return this is UnknownHostException || this is SocketTimeoutException return this is UnknownHostException || this is SocketTimeoutException
} }
fun Throwable.report() { fun Throwable.report(silent: Boolean = false) {
val exception = CaughtException(this, "${javaClass.simpleName}($message)") val exception = CaughtException(this)
exception.sendWithAcra() if (silent) {
exception.sendSilentlyWithAcra()
} else {
exception.sendWithAcra()
}
} }
fun Throwable.isWebViewUnavailable(): Boolean { fun Throwable.isWebViewUnavailable(): Boolean {

View File

@@ -26,6 +26,7 @@ import org.koitharu.kotatsu.core.util.ext.longHashCode
import org.koitharu.kotatsu.core.util.ext.printStackTraceDebug import org.koitharu.kotatsu.core.util.ext.printStackTraceDebug
import org.koitharu.kotatsu.core.util.ext.toListSorted import org.koitharu.kotatsu.core.util.ext.toListSorted
import org.koitharu.kotatsu.local.data.MangaIndex import org.koitharu.kotatsu.local.data.MangaIndex
import org.koitharu.kotatsu.local.data.hasZipExtension
import org.koitharu.kotatsu.local.data.isZipArchive import org.koitharu.kotatsu.local.data.isZipArchive
import org.koitharu.kotatsu.local.data.output.LocalMangaOutput.Companion.ENTRY_NAME_INDEX import org.koitharu.kotatsu.local.data.output.LocalMangaOutput.Companion.ENTRY_NAME_INDEX
import org.koitharu.kotatsu.local.domain.model.LocalManga import org.koitharu.kotatsu.local.domain.model.LocalManga
@@ -94,10 +95,12 @@ class LocalMangaParser(private val uri: Uri) {
chapters = if (withDetails) { chapters = if (withDetails) {
val chapters = fileSystem.listRecursively(rootPath) val chapters = fileSystem.listRecursively(rootPath)
.mapNotNullTo(HashSet()) { path -> .mapNotNullTo(HashSet()) { path ->
if (path != coverEntry && fileSystem.isRegularFile(path) && mimeTypeMap.isImage(path)) { when {
path.parent path == coverEntry -> null
} else { !fileSystem.isRegularFile(path) -> null
null mimeTypeMap.isImage(path) -> path.parent
hasZipExtension(path.name) -> path
else -> null
} }
}.sortedWith(compareBy(AlphanumComparator()) { x -> x.toString() }) }.sortedWith(compareBy(AlphanumComparator()) { x -> x.toString() })
chapters.mapIndexed { i, p -> chapters.mapIndexed { i, p ->

View File

@@ -60,7 +60,7 @@ class ScrobblingSelectorSheet :
lateinit var coil: ImageLoader lateinit var coil: ImageLoader
private var collapsibleActionViewCallback: CollapseActionViewCallback? = null private var collapsibleActionViewCallback: CollapseActionViewCallback? = null
private var paginationScrollListener: PaginationScrollListener? = null
private val viewModel by viewModels<ScrobblingSelectorViewModel>() private val viewModel by viewModels<ScrobblingSelectorViewModel>()
override fun onCreateViewBinding(inflater: LayoutInflater, container: ViewGroup?): SheetScrobblingSelectorBinding { override fun onCreateViewBinding(inflater: LayoutInflater, container: ViewGroup?): SheetScrobblingSelectorBinding {
@@ -77,7 +77,11 @@ class ScrobblingSelectorSheet :
adapter = listAdapter adapter = listAdapter
addItemDecoration(decoration) addItemDecoration(decoration)
addItemDecoration(TypedListSpacingDecoration(context, false)) addItemDecoration(TypedListSpacingDecoration(context, false))
addOnScrollListener(PaginationScrollListener(4, this@ScrobblingSelectorSheet)) addOnScrollListener(
PaginationScrollListener(4, this@ScrobblingSelectorSheet).also {
paginationScrollListener = it
},
)
} }
binding.buttonDone.setOnClickListener(this) binding.buttonDone.setOnClickListener(this)
initOptionsMenu() initOptionsMenu()
@@ -112,6 +116,7 @@ class ScrobblingSelectorSheet :
override fun onDestroyView() { override fun onDestroyView() {
super.onDestroyView() super.onDestroyView()
collapsibleActionViewCallback = null collapsibleActionViewCallback = null
paginationScrollListener = null
} }
override fun onCurrentListChanged(previousList: MutableList<ListModel>, currentList: MutableList<ListModel>) { override fun onCurrentListChanged(previousList: MutableList<ListModel>, currentList: MutableList<ListModel>) {
@@ -124,6 +129,7 @@ class ScrobblingSelectorSheet :
currentList.indexOfFirst { it is ScrobblerManga && it.id == selectedId }.coerceAtLeast(0) currentList.indexOfFirst { it is ScrobblerManga && it.id == selectedId }.coerceAtLeast(0)
} }
rv.post(RecyclerViewScrollCallback(rv, target, if (target == 0) 0 else rv.height / 3)) rv.post(RecyclerViewScrollCallback(rv, target, if (target == 0) 0 else rv.height / 3))
paginationScrollListener?.postInvalidate(rv)
} }
} }

View File

@@ -10,7 +10,6 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.plus import kotlinx.coroutines.plus
import org.koitharu.kotatsu.R import org.koitharu.kotatsu.R
@@ -59,7 +58,7 @@ class ScrobblingSelectorViewModel @Inject constructor(
get() = availableScrobblers[selectedScrobblerIndex.requireValue()] get() = availableScrobblers[selectedScrobblerIndex.requireValue()]
val content: StateFlow<List<ListModel>> = combine( val content: StateFlow<List<ListModel>> = combine(
scrobblerMangaList.map { it.distinctBy { x -> x.id } }, scrobblerMangaList,
listError, listError,
hasNextPage, hasNextPage,
) { list, error, isHasNextPage -> ) { list, error, isHasNextPage ->
@@ -127,14 +126,17 @@ class ScrobblingSelectorViewModel @Inject constructor(
runCatchingCancellable { runCatchingCancellable {
currentScrobbler.findManga(checkNotNull(searchQuery.value), offset) currentScrobbler.findManga(checkNotNull(searchQuery.value), offset)
}.onSuccess { list -> }.onSuccess { list ->
if (!append) { val newList = (if (append) {
scrobblerMangaList.value = list scrobblerMangaList.value + list
} else if (list.isNotEmpty()) { } else {
scrobblerMangaList.value += list list
} }).distinctBy { x -> x.id }
hasNextPage.value = list.isNotEmpty() val changed = newList != scrobblerMangaList.value
scrobblerMangaList.value = newList
hasNextPage.value = changed && newList.isNotEmpty()
}.onFailure { error -> }.onFailure { error ->
error.printStackTraceDebug() error.printStackTraceDebug()
hasNextPage.value = false
listError.value = error listError.value = error
} }
} }

View File

@@ -1,8 +1,14 @@
package org.koitharu.kotatsu.scrobbling.kitsu.data package org.koitharu.kotatsu.scrobbling.kitsu.data
import okhttp3.Interceptor import okhttp3.Interceptor
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.Response import okhttp3.Response
import okhttp3.internal.closeQuietly
import okio.IOException
import org.koitharu.kotatsu.core.network.CommonHeaders import org.koitharu.kotatsu.core.network.CommonHeaders
import org.koitharu.kotatsu.parsers.util.mimeType
import org.koitharu.kotatsu.parsers.util.parseHtml
import org.koitharu.kotatsu.parsers.util.runCatchingCancellable
import org.koitharu.kotatsu.scrobbling.common.data.ScrobblerStorage import org.koitharu.kotatsu.scrobbling.common.data.ScrobblerStorage
import org.koitharu.kotatsu.scrobbling.common.domain.ScrobblerAuthRequiredException import org.koitharu.kotatsu.scrobbling.common.domain.ScrobblerAuthRequiredException
import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblerService import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblerService
@@ -23,13 +29,23 @@ class KitsuInterceptor(private val storage: ScrobblerStorage) : Interceptor {
} }
val response = chain.proceed(request.build()) val response = chain.proceed(request.build())
if (!isAuthRequest && response.code == HttpURLConnection.HTTP_UNAUTHORIZED) { if (!isAuthRequest && response.code == HttpURLConnection.HTTP_UNAUTHORIZED) {
response.closeQuietly()
throw ScrobblerAuthRequiredException(ScrobblerService.KITSU) throw ScrobblerAuthRequiredException(ScrobblerService.KITSU)
} }
if (response.mimeType?.toMediaTypeOrNull()?.subtype == SUBTYPE_HTML) {
val message = runCatchingCancellable {
response.parseHtml().title().takeUnless { it.isEmpty() }
}.onFailure {
response.closeQuietly()
}.getOrNull() ?: "Invalid response (${response.code})"
throw IOException(message)
}
return response return response
} }
companion object { companion object {
const val VND_JSON = "application/vnd.api+json" const val VND_JSON = "application/vnd.api+json"
const val SUBTYPE_HTML = "html"
} }
} }

View File

@@ -6,6 +6,7 @@ import android.view.View
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.preference.ListPreference import androidx.preference.ListPreference
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.TwoStatePreference
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import org.koitharu.kotatsu.R import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.AppSettings
@@ -50,6 +51,11 @@ class SourcesSettingsFragment : BasePreferenceFragment(R.string.remote_sources)
} }
} }
} }
findPreference<TwoStatePreference>(AppSettings.KEY_HANDLE_LINKS)?.let { pref ->
viewModel.isLinksEnabled.observe(viewLifecycleOwner) {
pref.isChecked = it
}
}
} }
override fun onPreferenceTreeClick(preference: Preference): Boolean = when (preference.key) { override fun onPreferenceTreeClick(preference: Preference): Boolean = when (preference.key) {
@@ -58,6 +64,11 @@ class SourcesSettingsFragment : BasePreferenceFragment(R.string.remote_sources)
true true
} }
AppSettings.KEY_HANDLE_LINKS -> {
viewModel.setLinksEnabled((preference as TwoStatePreference).isChecked)
true
}
else -> super.onPreferenceTreeClick(preference) else -> super.onPreferenceTreeClick(preference)
} }
} }

View File

@@ -1,8 +1,16 @@
package org.koitharu.kotatsu.settings.sources package org.koitharu.kotatsu.settings.sources
import android.content.ComponentName
import android.content.Context
import android.content.pm.PackageManager
import android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT
import android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED
import android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.plus import kotlinx.coroutines.plus
@@ -13,8 +21,11 @@ import javax.inject.Inject
@HiltViewModel @HiltViewModel
class SourcesSettingsViewModel @Inject constructor( class SourcesSettingsViewModel @Inject constructor(
sourcesRepository: MangaSourcesRepository, sourcesRepository: MangaSourcesRepository,
@ApplicationContext private val context: Context,
) : BaseViewModel() { ) : BaseViewModel() {
private val linksHandlerActivity = ComponentName(context, "org.koitharu.kotatsu.details.ui.DetailsByLinkActivity")
val enabledSourcesCount = sourcesRepository.observeEnabledSourcesCount() val enabledSourcesCount = sourcesRepository.observeEnabledSourcesCount()
.withErrorHandling() .withErrorHandling()
.stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Eagerly, -1) .stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Eagerly, -1)
@@ -22,4 +33,20 @@ class SourcesSettingsViewModel @Inject constructor(
val availableSourcesCount = sourcesRepository.observeAvailableSourcesCount() val availableSourcesCount = sourcesRepository.observeAvailableSourcesCount()
.withErrorHandling() .withErrorHandling()
.stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Eagerly, -1) .stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Eagerly, -1)
val isLinksEnabled = MutableStateFlow(isLinksEnabled())
fun setLinksEnabled(isEnabled: Boolean) {
context.packageManager.setComponentEnabledSetting(
linksHandlerActivity,
if (isEnabled) COMPONENT_ENABLED_STATE_ENABLED else COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP,
)
isLinksEnabled.value = isLinksEnabled()
}
private fun isLinksEnabled(): Boolean {
val state = context.packageManager.getComponentEnabledSetting(linksHandlerActivity)
return state == COMPONENT_ENABLED_STATE_ENABLED || state == COMPONENT_ENABLED_STATE_DEFAULT
}
} }

View File

@@ -56,12 +56,12 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:autofillHints="emailAddress" android:autofillHints="emailAddress"
android:hint="@string/email"
android:imeOptions="actionDone" android:imeOptions="actionDone"
android:inputType="textEmailAddress" android:inputType="textEmailAddress"
android:maxLength="512" android:maxLength="512"
android:singleLine="true" android:singleLine="true"
android:textSize="16sp" android:textSize="16sp" />
tools:hint="Email" />
</com.google.android.material.textfield.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>
@@ -83,12 +83,12 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:autofillHints="password" android:autofillHints="password"
android:hint="@string/password"
android:imeOptions="actionDone" android:imeOptions="actionDone"
android:inputType="textPassword" android:inputType="textPassword"
android:maxLength="512" android:maxLength="512"
android:singleLine="true" android:singleLine="true"
android:textSize="16sp" android:textSize="16sp" />
tools:hint="Password" />
</com.google.android.material.textfield.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>

View File

@@ -659,4 +659,7 @@
<string name="external_source">خارجي/إضافي</string> <string name="external_source">خارجي/إضافي</string>
<string name="plugin_incompatible">مكون إضافي غير متوافق أو خطأ داخلي. تأكد من استخدام أحدث إصدار من المكون الإضافي وKotatsu</string> <string name="plugin_incompatible">مكون إضافي غير متوافق أو خطأ داخلي. تأكد من استخدام أحدث إصدار من المكون الإضافي وKotatsu</string>
<string name="invalid_server_address_message">mangatime.org</string> <string name="invalid_server_address_message">mangatime.org</string>
</resources> <string name="retry">حاول مجدداً</string>
<string name="pages_saved">الصفحات المحفوظة</string>
<string name="too_many_requests_message_retry">هنالك الكثير من الطلبات. حاول مرة أخرى بعد%s</string>
</resources>

View File

@@ -203,7 +203,7 @@
<string name="status_on_hold">Pozastaveno</string> <string name="status_on_hold">Pozastaveno</string>
<string name="status_dropped">Zahozeno</string> <string name="status_dropped">Zahozeno</string>
<string name="disable_all">Vypnout vše</string> <string name="disable_all">Vypnout vše</string>
<string name="use_fingerprint">Pokud lze, použijte otisk prstu</string> <string name="use_fingerprint">Pokud lze, použijte biometrii</string>
<string name="appwidget_shelf_description">Manga z vašich oblíbených</string> <string name="appwidget_shelf_description">Manga z vašich oblíbených</string>
<string name="appwidget_recent_description">Vaše nedávno čtená manga</string> <string name="appwidget_recent_description">Vaše nedávno čtená manga</string>
<string name="report">Hlášení</string> <string name="report">Hlášení</string>
@@ -251,7 +251,7 @@
<string name="manga_error_description_pattern">Podrobnosti chyby:&lt;br&gt;&lt;tt&gt;%1$s&lt;/tt&gt;&lt;br&gt;&lt;br&gt;1. Zkuste &lt;a href=%2$s&gt;otveřít mangu v prohlížeči&lt;/a&gt; abyste se ujistili že je dostupná na zdroji&lt;br&gt;2. Ujistěte se že používáte &lt;a href=kotatsu://about&gt;nejnovější verzi Kotatsu&lt;/a&gt;&lt;br&gt;3. Pokud je dostupná, pošlete hlášení o chybě vývojářům.</string> <string name="manga_error_description_pattern">Podrobnosti chyby:&lt;br&gt;&lt;tt&gt;%1$s&lt;/tt&gt;&lt;br&gt;&lt;br&gt;1. Zkuste &lt;a href=%2$s&gt;otveřít mangu v prohlížeči&lt;/a&gt; abyste se ujistili že je dostupná na zdroji&lt;br&gt;2. Ujistěte se že používáte &lt;a href=kotatsu://about&gt;nejnovější verzi Kotatsu&lt;/a&gt;&lt;br&gt;3. Pokud je dostupná, pošlete hlášení o chybě vývojářům.</string>
<string name="history_shortcuts">Zobrazovat zkratky nedávných mang</string> <string name="history_shortcuts">Zobrazovat zkratky nedávných mang</string>
<string name="history_shortcuts_summary">Udělejte nedávné mangy dostupné dlouhým kliknutím na ikonu aplikace</string> <string name="history_shortcuts_summary">Udělejte nedávné mangy dostupné dlouhým kliknutím na ikonu aplikace</string>
<string name="reader_control_ltr_summary">Kliknutí do pravého rohu nebo stisknutí pravého tlačítka vždy zobrazí následující stranu.</string> <string name="reader_control_ltr_summary">Neměň směr přepínání stránek v režimu čtení, například stisknutí pravé klávesy vždy přepne na další stránku. Tato volba ovlivňuje pouze hardwarová vstupní zařízení.</string>
<string name="reader_control_ltr">Ovládání ergonomické čtečky</string> <string name="reader_control_ltr">Ovládání ergonomické čtečky</string>
<string name="color_correction">Korekce barev</string> <string name="color_correction">Korekce barev</string>
<string name="brightness">Jas</string> <string name="brightness">Jas</string>
@@ -654,4 +654,21 @@
<string name="unpin">Odepnout</string> <string name="unpin">Odepnout</string>
<string name="too_many_requests_message_retry">Server přetížen. Zkuste to za %s</string> <string name="too_many_requests_message_retry">Server přetížen. Zkuste to za %s</string>
<string name="minutes_seconds_short">%1$d m %2$d s</string> <string name="minutes_seconds_short">%1$d m %2$d s</string>
<string name="invalid_proxy_configuration">Nesprávná proxy konfigurace</string>
<string name="plugin_incompatible_with_cause">Plugin error:%s\nUjisti se, že používáš poslední verzi Kotatsu a pluginu</string>
<string name="percent_left">Procent zbývá</string>
<string name="plugin_incompatible">Nekompatibilní plugin nebo vnitřní chyba. Ujistěte se, že používáte nejnovější verzi pluginu a aplikace Kotatsu.</string>
<string name="external_source">Externí zdroj/plugin</string>
<string name="retry">Opakovat</string>
<string name="connection_ok">Připojení je OK</string>
<string name="recent_sources">Nedávné zdroje</string>
<string name="image_server">Preferovaný server pro média</string>
<string name="crop_pages">Oříznout stránky</string>
<string name="show_quick_filters">Zobrazit rychlé filtry</string>
<string name="source_unpinned">Zdroj odepnut</string>
<string name="sources_unpinned">Zdroje odepnuty</string>
<string name="sources_pinned">Zdroje připnuty</string>
<string name="percent_read">Procenta přečtených</string>
<string name="chapters_read">Kapitol přečtených</string>
<string name="chapters_left">Kapitol zbývajících</string>
</resources> </resources>

View File

@@ -749,4 +749,8 @@
<string name="pages_saved">Páginas guardadas</string> <string name="pages_saved">Páginas guardadas</string>
<string name="delete_old_backups_summary">Elimina automáticamente los archivos de copia de seguridad antiguos para ahorrar espacio de almacenamiento</string> <string name="delete_old_backups_summary">Elimina automáticamente los archivos de copia de seguridad antiguos para ahorrar espacio de almacenamiento</string>
<string name="delete_old_backups">Eliminar copias de seguridad antiguas</string> <string name="delete_old_backups">Eliminar copias de seguridad antiguas</string>
<string name="email">Correo electrónico</string>
<string name="handle_links">Gestionar enlaces</string>
<string name="handle_links_summary">Gestionar enlaces de manga desde aplicaciones externas (por ejemplo, navegador web). También puede ser necesario habilitarlo manualmente en la configuración de la aplicación</string>
<string name="captcha_required_message">Esta fuente requiere resolver un captcha para continuar</string>
</resources> </resources>

View File

@@ -746,4 +746,11 @@
<string name="error_not_image">Imbalidong pormat: inaasahang larawan ngunit nakakuha ng %s</string> <string name="error_not_image">Imbalidong pormat: inaasahang larawan ngunit nakakuha ng %s</string>
<string name="access_denied_403">Tinanggihan ang pag-access (403)</string> <string name="access_denied_403">Tinanggihan ang pag-access (403)</string>
<string name="max_backups_count">Pinakamataas na bilang ng mga backup</string> <string name="max_backups_count">Pinakamataas na bilang ng mga backup</string>
<string name="pages_saved">Na-save na mga pahina</string>
<string name="delete_old_backups">Tanggalin ang mga lumang backup</string>
<string name="delete_old_backups_summary">Awtomatikong tanggalin ang mga lumang backup file upang makatipid ng storage space</string>
<string name="handle_links">Pangasiwaan ang mga link</string>
<string name="handle_links_summary">Pangasiwaan ang manga link mula sa mga panlabas na application (hal. web browser). Maaaring kailanganin mo rin itong manual na paganahin sa mga setting ng system ng aplikasyon</string>
<string name="email">Ang email</string>
<string name="captcha_required_message">Ang source na ito ay kinakailang lutasin ang captcha para magpatuloy</string>
</resources> </resources>

View File

@@ -746,4 +746,8 @@
<string name="pages_saved">Pages sauvegardées</string> <string name="pages_saved">Pages sauvegardées</string>
<string name="delete_old_backups_summary">Suppression automatique des anciens fichiers de sauvegarde pour économiser de l\'espace de stockage</string> <string name="delete_old_backups_summary">Suppression automatique des anciens fichiers de sauvegarde pour économiser de l\'espace de stockage</string>
<string name="delete_old_backups">Supprimer les anciennes sauvegardes</string> <string name="delete_old_backups">Supprimer les anciennes sauvegardes</string>
<string name="handle_links">Gérer les liens</string>
<string name="email">Courriel</string>
<string name="handle_links_summary">Gérer les liens vers des mangas à partir d\'applications externes (par exemple, un navigateur web). Il se peut que vous deviez également l\'activer manuellement dans les paramètres système de l\'application</string>
<string name="captcha_required_message">Cette source nécessite la résolution d\'un captcha pour continuer</string>
</resources> </resources>

View File

@@ -50,7 +50,7 @@
<string name="processing_">Przetwarzanie…</string> <string name="processing_">Przetwarzanie…</string>
<string name="updated">Zaktualizowane</string> <string name="updated">Zaktualizowane</string>
<string name="save_page">Zapisz stronę</string> <string name="save_page">Zapisz stronę</string>
<string name="page_saved">Zapisano</string> <string name="page_saved">Zapisano stronę</string>
<string name="vibration">Wibracje</string> <string name="vibration">Wibracje</string>
<string name="manga_shelf">Biblioteka</string> <string name="manga_shelf">Biblioteka</string>
<string name="recent_manga">Ostatnie</string> <string name="recent_manga">Ostatnie</string>
@@ -739,4 +739,18 @@
<string name="allow_always">Zezwalaj zawsze</string> <string name="allow_always">Zezwalaj zawsze</string>
<string name="allow_once">Zezwól raz</string> <string name="allow_once">Zezwól raz</string>
<string name="ask_every_time">Pytaj za każdym razem</string> <string name="ask_every_time">Pytaj za każdym razem</string>
<string name="pages_saved">Zapisane strony</string>
<string name="portrait">Portret</string>
<string name="access_denied_403">Odmowa dostępu (403)</string>
<string name="captcha_required_message">To źródło wymaga rozwiązania captcha, aby kontynuować</string>
<string name="handle_links">Obsługa linków</string>
<string name="email">E-mail</string>
<string name="max_backups_count">Maksymalna liczba kopii zapasowych</string>
<string name="delete_old_backups">Usuń stare kopie zapasowe</string>
<string name="delete_old_backups_summary">Automatycznie usuwaj stare pliki kopii zapasowych, aby zaoszczędzić miejsce na dysku</string>
<string name="plugin_incompatible_with_cause">Błąd wtyczki: %s\nUpewnij się, że używasz najnowszej wersji wtyczki i Kotatsu</string>
<string name="error_not_image">Błędny format: oczekiwany obraz, ale pobrano %s</string>
<string name="screen_orientation">Orientacja ekranu</string>
<string name="landscape">Poziomo</string>
<string name="handle_links_summary">Obsługuj linki do mangi z zewnętrznych aplikacji (np. przeglądarki internetowej). Może być również konieczne ręczne włączenie go w ustawieniach systemowych aplikacji</string>
</resources> </resources>

View File

@@ -7,7 +7,7 @@
<string name="history">Histórico</string> <string name="history">Histórico</string>
<string name="error_occurred">Ocorreu um erro</string> <string name="error_occurred">Ocorreu um erro</string>
<string name="network_error">Erro de rede</string> <string name="network_error">Erro de rede</string>
<string name="details">Detalhado</string> <string name="details">Detalhes</string>
<string name="chapters">Capítulos</string> <string name="chapters">Capítulos</string>
<string name="list">Lista</string> <string name="list">Lista</string>
<string name="detailed_list">Lista detalhada</string> <string name="detailed_list">Lista detalhada</string>
@@ -32,7 +32,7 @@
<string name="manga_downloading_">Baixando…</string> <string name="manga_downloading_">Baixando…</string>
<string name="processing_">Processando…</string> <string name="processing_">Processando…</string>
<string name="download_complete">Baixado</string> <string name="download_complete">Baixado</string>
<string name="downloads">Transferências</string> <string name="downloads">Baixados</string>
<string name="computing_">Processando…</string> <string name="computing_">Processando…</string>
<string name="add_to_favourites">Favoritar obra</string> <string name="add_to_favourites">Favoritar obra</string>
<string name="by_name">Nome</string> <string name="by_name">Nome</string>
@@ -50,7 +50,7 @@
<string name="remove">Remover</string> <string name="remove">Remover</string>
<string name="_s_deleted_from_local_storage">“%s” excluído do armazenamento local</string> <string name="_s_deleted_from_local_storage">“%s” excluído do armazenamento local</string>
<string name="save_page">Salvar página</string> <string name="save_page">Salvar página</string>
<string name="page_saved">Salva</string> <string name="page_saved">Página salva</string>
<string name="share_image">Compartilhar imagem</string> <string name="share_image">Compartilhar imagem</string>
<string name="_import">Importar</string> <string name="_import">Importar</string>
<string name="delete">Deletar</string> <string name="delete">Deletar</string>
@@ -61,8 +61,8 @@
<string name="standard">Padrão</string> <string name="standard">Padrão</string>
<string name="read_mode">Modo de leitura</string> <string name="read_mode">Modo de leitura</string>
<string name="grid_size">Tamanho da grade</string> <string name="grid_size">Tamanho da grade</string>
<string name="search_on_s">Pesquisar em %s</string> <string name="search_on_s">Procurar em %s</string>
<string name="delete_manga">Excluir mangá</string> <string name="delete_manga">Excluir obra</string>
<string name="text_delete_local_manga">Excluir “%s” do dispositivo permanentemente?</string> <string name="text_delete_local_manga">Excluir “%s” do dispositivo permanentemente?</string>
<string name="reader_settings">Configurações do leitor</string> <string name="reader_settings">Configurações do leitor</string>
<string name="_continue">Continuar</string> <string name="_continue">Continuar</string>
@@ -73,7 +73,7 @@
<string name="external_storage">Armazenamento externo</string> <string name="external_storage">Armazenamento externo</string>
<string name="domain">Domínio</string> <string name="domain">Domínio</string>
<string name="app_update_available">Uma nova versão do aplicativo está disponível</string> <string name="app_update_available">Uma nova versão do aplicativo está disponível</string>
<string name="open_in_browser">Abrir no navegador da web</string> <string name="open_in_browser">Abrir no navegador</string>
<string name="notifications">Notificações</string> <string name="notifications">Notificações</string>
<string name="new_chapters">Novos capítulos</string> <string name="new_chapters">Novos capítulos</string>
<string name="download">Baixar</string> <string name="download">Baixar</string>
@@ -99,7 +99,7 @@
<string name="favourites_category_empty">Categoria vazia</string> <string name="favourites_category_empty">Categoria vazia</string>
<string name="read_later">Ler depois</string> <string name="read_later">Ler depois</string>
<string name="updates">Atualizações</string> <string name="updates">Atualizações</string>
<string name="search_results">Resultados encontrados</string> <string name="search_results">Resultados da busca</string>
<string name="new_version_s">Nova versão: %s</string> <string name="new_version_s">Nova versão: %s</string>
<string name="size_s">Tamanho: %s</string> <string name="size_s">Tamanho: %s</string>
<string name="clear_updates_feed">Limpar o fluxo de atualizações</string> <string name="clear_updates_feed">Limpar o fluxo de atualizações</string>
@@ -114,7 +114,7 @@
<string name="repeat_password">Repita a senha</string> <string name="repeat_password">Repita a senha</string>
<string name="passwords_mismatch">Senhas incompatíveis</string> <string name="passwords_mismatch">Senhas incompatíveis</string>
<string name="about">Sobre</string> <string name="about">Sobre</string>
<string name="backup_information">Você pode criar um backup do seu histórico e favoritas e restaurá-lo</string> <string name="backup_information">Você pode criar um backup do seu histórico e obras favoritas e restaurá-lo</string>
<string name="just_now">Agora mesmo</string> <string name="just_now">Agora mesmo</string>
<string name="yesterday">Ontem</string> <string name="yesterday">Ontem</string>
<string name="long_ago">Há muito tempo</string> <string name="long_ago">Há muito tempo</string>
@@ -129,7 +129,7 @@
<string name="cookies_cleared">Todos os cookies foram removidos</string> <string name="cookies_cleared">Todos os cookies foram removidos</string>
<string name="clear_feed">Limpar fluxo</string> <string name="clear_feed">Limpar fluxo</string>
<string name="text_clear_updates_feed_prompt">Limpar todo o histórico de atualizações permanentemente\?</string> <string name="text_clear_updates_feed_prompt">Limpar todo o histórico de atualizações permanentemente\?</string>
<string name="check_for_new_chapters">Verificando se há novos capítulos</string> <string name="check_for_new_chapters">Verificar se há novos capítulos</string>
<string name="reverse">Reverter</string> <string name="reverse">Reverter</string>
<string name="sign_in">Entrar</string> <string name="sign_in">Entrar</string>
<string name="auth_required">Faça login para ver este conteúdo</string> <string name="auth_required">Faça login para ver este conteúdo</string>
@@ -180,7 +180,7 @@
<string name="various_languages">Vários idiomas</string> <string name="various_languages">Vários idiomas</string>
<string name="operation_not_supported">Esta operação não é suportada</string> <string name="operation_not_supported">Esta operação não é suportada</string>
<string name="follow_system">Automático (segue o sistema)</string> <string name="follow_system">Automático (segue o sistema)</string>
<string name="enabled_d_of_d" tools:ignore="PluralsCandidate">%1$d de %2$d em</string> <string name="enabled_d_of_d" tools:ignore="PluralsCandidate">%1$d de %2$d habilitados</string>
<string name="webtoon">Webtoon</string> <string name="webtoon">Webtoon</string>
<string name="switch_pages">Mudar páginas</string> <string name="switch_pages">Mudar páginas</string>
<string name="clear_thumbs_cache">Limpar cache das miniaturas (capas, etc.)</string> <string name="clear_thumbs_cache">Limpar cache das miniaturas (capas, etc.)</string>
@@ -192,8 +192,8 @@
<string name="black_dark_theme_summary">Consome menos bateria em telas AMOLED</string> <string name="black_dark_theme_summary">Consome menos bateria em telas AMOLED</string>
<string name="create_backup">Criar backup de dados</string> <string name="create_backup">Criar backup de dados</string>
<string name="text_local_holder_secondary">Salve algo do catálogo online ou importe de um arquivo.</string> <string name="text_local_holder_secondary">Salve algo do catálogo online ou importe de um arquivo.</string>
<string name="check_for_updates">Verificar se há atualização</string> <string name="check_for_updates">Verificar se há atualizações</string>
<string name="text_feed_holder">Novos capítulos da(s) obra(s) que você tá lendo serão mostrados aqui</string> <string name="text_feed_holder">Novos capítulos da(s) obra(s) que você serão mostrados aqui</string>
<string name="app_version">Versão %s</string> <string name="app_version">Versão %s</string>
<string name="zoom_mode_fit_width">Ajustar à largura</string> <string name="zoom_mode_fit_width">Ajustar à largura</string>
<string name="preparing_">Preparando…</string> <string name="preparing_">Preparando…</string>
@@ -288,8 +288,7 @@
<string name="history_shortcuts_summary">Torne as obras recentes disponíveis ao pressionar e segurar o ícone do aplicativo</string> <string name="history_shortcuts_summary">Torne as obras recentes disponíveis ao pressionar e segurar o ícone do aplicativo</string>
<string name="no_manga_sources_text">Habilite fontes para ler obras online</string> <string name="no_manga_sources_text">Habilite fontes para ler obras online</string>
<string name="random">Aleatória</string> <string name="random">Aleatória</string>
<string name="categories_delete_confirm">Você tem certeza de que deseja excluir as categorias favoritas selecionadas? <string name="categories_delete_confirm">Você tem certeza de que deseja excluir as categorias favoritas selecionadas?\nTodas as obras nelas serão perdidas e isso não pode ser desfeito.</string>
\nTodas as obras nelas serão perdidas e isso não pode ser desfeito</string>
<string name="reorder">Reordenar</string> <string name="reorder">Reordenar</string>
<string name="empty">Vazio</string> <string name="empty">Vazio</string>
<string name="explore">Explorar</string> <string name="explore">Explorar</string>
@@ -315,7 +314,7 @@
<string name="import_completed_hint">Você pode excluir o arquivo original do armazenamento para economizar espaço</string> <string name="import_completed_hint">Você pode excluir o arquivo original do armazenamento para economizar espaço</string>
<string name="import_will_start_soon">A importação começará em breve</string> <string name="import_will_start_soon">A importação começará em breve</string>
<string name="history_shortcuts">Mostrar atalhos de obras recentes</string> <string name="history_shortcuts">Mostrar atalhos de obras recentes</string>
<string name="reader_control_ltr_summary">Tocar na borda direita ou pressionar a tecla direita sempre muda para a próxima página.</string> <string name="reader_control_ltr_summary">Não ajustar a direção da troca de páginas para o modo leitor, ex: pressionar a \"tecla\" direita sempre muda para a próxima página. Essa opção apenas afeta dispositivos de entrada hardware</string>
<string name="reader_control_ltr">Controle de leitura ergonômico</string> <string name="reader_control_ltr">Controle de leitura ergonômico</string>
<string name="color_correction">Correção de cor</string> <string name="color_correction">Correção de cor</string>
<string name="brightness">Brilho</string> <string name="brightness">Brilho</string>
@@ -375,7 +374,7 @@
<string name="more">Mais</string> <string name="more">Mais</string>
<string name="enable">Permitir</string> <string name="enable">Permitir</string>
<string name="no_thanks">Não, valeu</string> <string name="no_thanks">Não, valeu</string>
<string name="remove_completed_downloads_confirm">Seu histórico de baixados será excluído permanentemente</string> <string name="remove_completed_downloads_confirm">Seu histórico de baixados será excluído permanentemente. Nenhum arquivo baixado será afetado</string>
<string name="text_downloads_list_holder">Você ainda não baixou nada</string> <string name="text_downloads_list_holder">Você ainda não baixou nada</string>
<string name="downloads_paused">\"Baixando foi pausado\"</string> <string name="downloads_paused">\"Baixando foi pausado\"</string>
<string name="downloads_removed">Os baixados foram removidos</string> <string name="downloads_removed">Os baixados foram removidos</string>
@@ -393,7 +392,7 @@
<string name="network">Rede</string> <string name="network">Rede</string>
<string name="data_and_privacy">Dados e privacidade</string> <string name="data_and_privacy">Dados e privacidade</string>
<string name="restore_summary">Restaurar backup criado anteriormente</string> <string name="restore_summary">Restaurar backup criado anteriormente</string>
<string name="webtoon_zoom_summary">Permitir zoom no gesto no modo webtoon</string> <string name="webtoon_zoom_summary">Permitir zoom em gesto no modo webtoon</string>
<string name="reader_info_bar_summary">Mostrar a hora atual e o progresso da leitura na parte superior da tela</string> <string name="reader_info_bar_summary">Mostrar a hora atual e o progresso da leitura na parte superior da tela</string>
<string name="clear_source_cookies_summary">Limpar cookies apenas para o domínio especificado. Na maioria dos casos invalidará a autorização</string> <string name="clear_source_cookies_summary">Limpar cookies apenas para o domínio especificado. Na maioria dos casos invalidará a autorização</string>
<string name="download_option_all_chapters">Todos os capítulos com tradução %s</string> <string name="download_option_all_chapters">Todos os capítulos com tradução %s</string>
@@ -501,8 +500,7 @@
<string name="source_enabled">Fonte habilitada</string> <string name="source_enabled">Fonte habilitada</string>
<string name="disable_nsfw_summary">Desative as fontes NSFW e oculte as obras adultas da lista, se possível</string> <string name="disable_nsfw_summary">Desative as fontes NSFW e oculte as obras adultas da lista, se possível</string>
<string name="speed_value">x%.1f</string> <string name="speed_value">x%.1f</string>
<string name="no_manga_sources_catalog_text">Não há fontes disponíveis nesta seção, ou todas elas podem já ter sido habilitadas. <string name="no_manga_sources_catalog_text">Não há fontes disponíveis nesta seção, ou todas elas podem já ter sido habilitadas.\nFique atento</string>
\nFique atento</string>
<string name="available_d">Disponível: %1$d</string> <string name="available_d">Disponível: %1$d</string>
<string name="state">Situação</string> <string name="state">Situação</string>
<string name="state_paused">Pausada</string> <string name="state_paused">Pausada</string>
@@ -530,9 +528,7 @@
<string name="rating_adult">Adulta</string> <string name="rating_adult">Adulta</string>
<string name="default_tab">Aba padrão</string> <string name="default_tab">Aba padrão</string>
<string name="content_rating">Classificação do Conteúdo</string> <string name="content_rating">Classificação do Conteúdo</string>
<string name="mark_as_completed_prompt">Deseja marcar a obra selecionado como completa? <string name="mark_as_completed_prompt">Deseja marcar a obra selecionada como completa?\n\nAviso: o progresso de leitura atual será perdido.</string>
\n
\nAviso: o progresso de leitura atual será perdido.</string>
<string name="mark_as_completed">Marcar como completa</string> <string name="mark_as_completed">Marcar como completa</string>
<string name="category_hidden_done">Esta categoria foi ocultada da tela inicial e pode ser acessada novamente através de Menu → Gerenciar categorias</string> <string name="category_hidden_done">Esta categoria foi ocultada da tela inicial e pode ser acessada novamente através de Menu → Gerenciar categorias</string>
<string name="volume_">Volume %d</string> <string name="volume_">Volume %d</string>
@@ -557,7 +553,7 @@
<string name="use_two_pages_landscape">Usar layout de duas páginas na orientação paisagem (beta)</string> <string name="use_two_pages_landscape">Usar layout de duas páginas na orientação paisagem (beta)</string>
<string name="last_read">Última leitura</string> <string name="last_read">Última leitura</string>
<string name="none">Nenhum</string> <string name="none">Nenhum</string>
<string name="default_webtoon_zoom_out">Diminuir zoom padrão do webtoon</string> <string name="default_webtoon_zoom_out">Diminuir zoom padrão da webtoon</string>
<string name="fullscreen_mode">Modo tela cheia</string> <string name="fullscreen_mode">Modo tela cheia</string>
<string name="reader_fullscreen_summary">Ocultar a barra de status e navegação</string> <string name="reader_fullscreen_summary">Ocultar a barra de status e navegação</string>
<string name="remove_from_history">Remover do histórico</string> <string name="remove_from_history">Remover do histórico</string>
@@ -612,7 +608,7 @@
<string name="order_oldest">Mais velho</string> <string name="order_oldest">Mais velho</string>
<string name="long_ago_read">Lido há muito tempo atrás</string> <string name="long_ago_read">Lido há muito tempo atrás</string>
<string name="split_by_translations">Separar por traduções</string> <string name="split_by_translations">Separar por traduções</string>
<string name="fix">Fixar</string> <string name="fix">Corrigir</string>
<string name="error_no_data_received">Nenhum dado foi recebido do servidor</string> <string name="error_no_data_received">Nenhum dado foi recebido do servidor</string>
<string name="enable_source">Habilitar fonte</string> <string name="enable_source">Habilitar fonte</string>
<string name="unsupported_source">Esta fonte não é suportada</string> <string name="unsupported_source">Esta fonte não é suportada</string>
@@ -622,10 +618,10 @@
<string name="disable_connectivity_check">Desativar a verificação de conectividade</string> <string name="disable_connectivity_check">Desativar a verificação de conectividade</string>
<string name="disable_connectivity_check_summary">Ignore a verificação de conectividade caso tenha problemas com ela (por exemplo, entrar no modo off-line mesmo que a rede esteja conectada)</string> <string name="disable_connectivity_check_summary">Ignore a verificação de conectividade caso tenha problemas com ela (por exemplo, entrar no modo off-line mesmo que a rede esteja conectada)</string>
<string name="webtoon_gaps">Lacunas no modo webtoon</string> <string name="webtoon_gaps">Lacunas no modo webtoon</string>
<string name="webtoon_gaps_summary">Mostrar espaços verticais entre as páginas no modo webtoon</string> <string name="webtoon_gaps_summary">Mostrar lacunas verticais entre as páginas no modo webtoon</string>
<string name="authors">Autores</string> <string name="authors">Autores</string>
<string name="ignore_ssl_errors_summary">Você pode desativar a verificação de certificados SSL caso tenha problemas relacionados a SSL ao acessar recursos de rede. Isso pode afetar sua segurança. É necessário reiniciar o aplicativo após alterar essa configuração.</string> <string name="ignore_ssl_errors_summary">Você pode desativar a verificação de certificados SSL caso tenha problemas relacionados a SSL ao acessar recursos de rede. Isso pode afetar sua segurança. É necessário reiniciar o aplicativo após alterar essa configuração.</string>
<string name="search_suggestions">Sugestões de Pesquisa</string> <string name="search_suggestions">Sugestões de pesquisa</string>
<string name="recent_queries">Consultas recentes</string> <string name="recent_queries">Consultas recentes</string>
<string name="suggested_queries">Consultas sugeridas</string> <string name="suggested_queries">Consultas sugeridas</string>
<string name="disable">Desativar</string> <string name="disable">Desativar</string>
@@ -649,21 +645,21 @@
<string name="chapters_read">Capítulos lidos</string> <string name="chapters_read">Capítulos lidos</string>
<string name="chapters_left">Capítulos restantes</string> <string name="chapters_left">Capítulos restantes</string>
<string name="pin">Fixar</string> <string name="pin">Fixar</string>
<string name="unpin">Desfixar</string> <string name="unpin">Desafixar</string>
<string name="source_pinned">Fonte fixada</string> <string name="source_pinned">Fonte fixada</string>
<string name="source_unpinned">Fonte desfixada</string> <string name="source_unpinned">Fonte desafixada</string>
<string name="sources_pinned">Fontes fixadas</string> <string name="sources_pinned">Fontes fixadas</string>
<string name="recent_sources">Fontes recentes</string> <string name="recent_sources">Fontes recentes</string>
<string name="external_source">Plugin/Externo</string> <string name="external_source">Plugin/Externo</string>
<string name="sources_unpinned">Fontes desfixadas</string> <string name="sources_unpinned">Fontes desafixadas</string>
<string name="tracker_debug_info">Checando por novos logs de capítulos</string> <string name="tracker_debug_info">Checando por novos logs de capítulos</string>
<string name="tracker_debug_info_summary">Informações de Debug sobre a checagem de fundo para novos capítulos</string> <string name="tracker_debug_info_summary">Informações de Debug sobre a checagem de fundo para novos capítulos</string>
<string name="plugin_incompatible">Plugin incompatível ou erro interno. Certifique-se de que está usando a versão mais recente do plugin e do Kotatsu</string> <string name="plugin_incompatible">Plugin incompatível ou erro interno. Certifique-se de que está usando a versão mais recente do plugin e do Kotatsu</string>
<string name="show_quick_filters_summary">Habilitar filtros em todas as fontes compatíveis</string> <string name="show_quick_filters_summary">Habilitar filtros em todas as fontes compatíveis</string>
<string name="show_quick_filters">Mostrar filtros</string> <string name="show_quick_filters">Mostrar filtros</string>
<string name="scrobbler_auth_required">Faça login em %s para continuar</string> <string name="scrobbler_auth_required">Faça login em %s para continuar</string>
<string name="scrobbler_auth_intro">Faça login para configurar a integração com %s. Isso permitirá que você acompanhe o progresso e o status de sua leitura de mangás</string> <string name="scrobbler_auth_intro">Faça login para configurar a integração com %s. Isso permitirá que você acompanhe o progresso e o status de sua leitura</string>
<string name="unstable_feature_summary">Essa função é experimental. Certifique-se de que você tenha um backup para evitar a perda de dados</string> <string name="unstable_feature_summary">Essa função é experimental. Certifique-se de que você tenha um backup para evitar a perca de dados</string>
<string name="recently_added">Adicionado recentemente</string> <string name="recently_added">Adicionado recentemente</string>
<string name="added_long_ago">Adicionado há muito tempo</string> <string name="added_long_ago">Adicionado há muito tempo</string>
<string name="popular_today">Popular hoje</string> <string name="popular_today">Popular hoje</string>
@@ -674,33 +670,83 @@
<string name="low_rating">Classificação baixa</string> <string name="low_rating">Classificação baixa</string>
<string name="original_language">Idioma original</string> <string name="original_language">Idioma original</string>
<string name="year">Ano</string> <string name="year">Ano</string>
<string name="source_code">Códico fonte</string> <string name="source_code">Código fonte</string>
<string name="user_manual">Manual do Usuário</string> <string name="user_manual">Manual do usuário</string>
<string name="telegram_group">Grupo do Telegram</string> <string name="telegram_group">Grupo do Telegram</string>
<string name="skip_all">Pular Todos</string> <string name="skip_all">Pular todas</string>
<string name="by_date">Data</string> <string name="by_date">Data</string>
<string name="popularity">Popularidade</string> <string name="popularity">Popularidade</string>
<string name="popular_in_month">Popular neste mês</string> <string name="popular_in_month">Popular neste mês</string>
<string name="sort_order_asc">Ascendente</string> <string name="sort_order_asc">Ascendente</string>
<string name="years">Anos</string> <string name="years">Anos</string>
<string name="any">Todos</string> <string name="any">Qualquer</string>
<string name="filter_search_warning">Esta fonte não oferece suporte à pesquisa com filtros. Seus filtros foram limpos</string> <string name="filter_search_warning">Esta fonte não oferece suporte à pesquisa com filtros. Seus filtros foram limpos</string>
<string name="start_download">Iniciar download</string> <string name="start_download">Comecar a baixar</string>
<string name="save_manga_confirm">Salvar o mangá selecionado? Isso pode consumir dados e armazenamento</string> <string name="save_manga_confirm">Salvar a obra selecionada? Isso pode consumir dados e armazenamento</string>
<string name="save_manga">Salvar o mangá</string> <string name="save_manga">Salvar a obra</string>
<string name="genre">Gênero</string> <string name="genre">Gênero</string>
<string name="error_not_image">Formato inválido: esperava imagem, mas obteve %s</string> <string name="error_not_image">Formato inválido: esperava-se imagem, mas obtivemos %s</string>
<string name="invalid_proxy_configuration">Configuração de proxy inválida</string> <string name="invalid_proxy_configuration">Configuração de proxy inválida</string>
<string name="error_image_format">Formato de imagem não suportado: %s</string> <string name="error_image_format">Formato de imagem não suportado: %s</string>
<string name="manga_with_downloaded_chapters">Mangá com capítulos baixados</string> <string name="manga_with_downloaded_chapters">Obras com capítulos baixados</string>
<string name="manga_fix_prompt">Essa função encontrará fontes alternativas para o mangá selecionado. A tarefa levará algum tempo e será executada em segundo plano</string> <string name="manga_fix_prompt">Essa função encontrará fontes alternativas para a obra selecionada. A tarefa levará algum tempo e será executada em segundo plano</string>
<string name="manga_replaced">Mangá “%1$s” (%2$s) substituído por “%3$s” (%4$s)</string> <string name="manga_replaced">Obra “%1$s” (%2$s) substituída por “%3$s” (%4$s)</string>
<string name="no_alternatives_found">Não foi encontrado alternativas para “%s”</string> <string name="no_alternatives_found">Não foi encontrado alternativas para “%s”</string>
<string name="pages_saved">Páginas Salvas</string> <string name="pages_saved">Páginas salvas</string>
<string name="text_empty_holder_secondary_filtered">Não foi possível encontrar Mangás com os filtros selecionado</string> <string name="text_empty_holder_secondary_filtered">Não existem obras que correspondam aos filtros selecionados</string>
<string name="plugin_incompatible_with_cause">Plugin error: %s\n Verifique se você está usando a versão mais recente do plug-in e do Kotatsu</string> <string name="plugin_incompatible_with_cause">Erro de plugin: %s\n· Certifique-se de que você está usando a versão mais recente do plugin e Kotatsu</string>
<string name="sort_order_desc">Descendente</string> <string name="sort_order_desc">Descendente</string>
<string name="download_new_chapters">Baixar novos capítulos</string> <string name="download_new_chapters">Baixar novos capítulos</string>
<string name="retry">Retentativa</string> <string name="retry">Retentar</string>
<string name="connection_ok">Conexão OK</string> <string name="connection_ok">Conexão OK</string>
<string name="too_many_requests_message_retry">Muitas solicitações. Tente novamente depois de %s</string>
<string name="unstable_feature">Recurso instável</string>
<string name="popular_in_hour">Popular no momento</string>
<string name="updated_long_ago">Atualizado há muito tempo</string>
<string name="downloads_background">Baixando em segundo plano</string>
<string name="content_type_novel">Novel</string>
<string name="content_type_manhua">Manhua</string>
<string name="content_type_manhwa">Manhwa</string>
<string name="seconds_short">%d s</string>
<string name="minutes_seconds_short">%1$d min %2$d s</string>
<string name="unpopular">Impopular</string>
<string name="stuck">Preso</string>
<string name="not_in_favorites">Não está nas favoritas</string>
<string name="fixing_manga">Corrigindo a obra</string>
<string name="fixed">Corrigida</string>
<string name="no_fix_required">Nenhuma correção necessária para \"%s\"</string>
<string name="handle_links_summary">Lidar com links de mangá de aplicações externas (ex: navegador). Você talvez precise habilitar isso manualmente nas configurações da aplicação</string>
<string name="demographic_kodomo">Kodomo</string>
<string name="content_type_one_shot">One shot</string>
<string name="handle_links">Lidar com links</string>
<string name="email">Email</string>
<string name="demographics">Demografia</string>
<string name="demographic_shounen">Shounen</string>
<string name="demographic_shoujo">Shoujo</string>
<string name="demographic_seinen">Seinen</string>
<string name="demographic_josei">Josei</string>
<string name="access_denied_403">Acesso negado (403)</string>
<string name="max_backups_count">Número máximo de backups</string>
<string name="delete_old_backups">Apagar backups antigos</string>
<string name="delete_old_backups_summary">Automaticamente apagar backups antigos para liberar espaço</string>
<string name="screen_orientation">Orientação de tela</string>
<string name="portrait">Portrato</string>
<string name="landscape">Paisagem</string>
<string name="content_type_game_cg">Jogo CG</string>
<string name="captcha_required_message">Essa fonte requisita que você resolva um captcha para continuar</string>
<string name="content_type_image_set">Imagens</string>
<string name="content_type_doujinshi">Doujinshi</string>
<string name="debug">Depurar (para desenvolvedores)</string>
<string name="content_type_artist_cg">Artista CG</string>
<string name="more_options">Mais opções</string>
<string name="download_added">Baixando</string>
<string name="chapter_selection_hint">Você pode selecionar capítulos para baixar pressionando-os na lista de capítulos.</string>
<string name="destination_directory">Diretório de destinação</string>
<string name="chapters_all">Todos</string>
<string name="dont_allow">Não permitir</string>
<string name="allow_always">Permitir sempre</string>
<string name="allow_once">Permitir uma vez</string>
<string name="ask_every_time">Sempre pergunte</string>
<string name="download_over_cellular">Baixando pelos dados móveis</string>
<string name="download_cellular_confirm">Permitir baixar pelos dados móveis?</string>
</resources> </resources>

View File

@@ -749,4 +749,8 @@
<string name="access_denied_403">Приступ одбијен (403)</string> <string name="access_denied_403">Приступ одбијен (403)</string>
<string name="delete_old_backups">Избриши старе резервне копије</string> <string name="delete_old_backups">Избриши старе резервне копије</string>
<string name="delete_old_backups_summary">Аутоматски избриши старе датотеке резервних копија да бис уштедео простор за складиштење</string> <string name="delete_old_backups_summary">Аутоматски избриши старе датотеке резервних копија да бис уштедео простор за складиштење</string>
<string name="handle_links_summary">Руковање манга везама из спољних апликација (нпр. из прегледача). Можда ћеш морати да је омогућиш и ручно у системским поставкама апликације</string>
<string name="handle_links">Руковање везама</string>
<string name="email">Е-пошта</string>
<string name="captcha_required_message">Овај извор захтева решавање CAPTCHA за наставак</string>
</resources> </resources>

View File

@@ -749,4 +749,8 @@
<string name="pages_saved">Sayfalar kaydedildi</string> <string name="pages_saved">Sayfalar kaydedildi</string>
<string name="delete_old_backups">Eski yedekleri sil</string> <string name="delete_old_backups">Eski yedekleri sil</string>
<string name="delete_old_backups_summary">Depolama kullanımını azaltmak için eski yedek dosyalarını otomatik olarak sil</string> <string name="delete_old_backups_summary">Depolama kullanımını azaltmak için eski yedek dosyalarını otomatik olarak sil</string>
<string name="email">E-posta</string>
<string name="handle_links">Bağlantıları</string>
<string name="handle_links_summary">Harici uygulamalardaki (örn. web tarayıcısı) manga bağlantılarını uygulamada açın. Uygulamanın sistem ayarlarından bunu aktifleştirmeniz gerekebilir</string>
<string name="captcha_required_message">Bu kaynağın kullanılabilmesi için bir captcha çözülmesi gerekiyor</string>
</resources> </resources>

View File

@@ -749,4 +749,7 @@
<string name="pages_saved">Đã lưu trang</string> <string name="pages_saved">Đã lưu trang</string>
<string name="delete_old_backups">Xóa bản sao lưu cũ</string> <string name="delete_old_backups">Xóa bản sao lưu cũ</string>
<string name="delete_old_backups_summary">Tự động xóa các bản sao lưu cũ để tiết kiệm bộ nhớ của thiết bị</string> <string name="delete_old_backups_summary">Tự động xóa các bản sao lưu cũ để tiết kiệm bộ nhớ của thiết bị</string>
<string name="handle_links">Xử lí liên kết (Link)</string>
<string name="handle_links_summary">Xử lý các liên kết (Link) manga từ các ứng dụng bên ngoài (Ví dụ: trình duyệt web,...). Có thể bạn cũng cần phải bật thủ công trong cài đặt hệ thống</string>
<string name="email">E-mail</string>
</resources> </resources>

View File

@@ -621,7 +621,7 @@
<string name="show_updated">显示更新</string> <string name="show_updated">显示更新</string>
<string name="webtoon_gaps_summary">在条漫模式下添加页与页之间的横向缝隙</string> <string name="webtoon_gaps_summary">在条漫模式下添加页与页之间的横向缝隙</string>
<string name="webtoon_gaps">缝隙条漫模式</string> <string name="webtoon_gaps">缝隙条漫模式</string>
<string name="pin_navigation_ui">置顶导航 UI</string> <string name="pin_navigation_ui">固定导航 UI</string>
<string name="frequency_of_check">自动检查更新频率</string> <string name="frequency_of_check">自动检查更新频率</string>
<string name="new_chapters_pattern">%1$s: %2$d</string> <string name="new_chapters_pattern">%1$s: %2$d</string>
<string name="pin_navigation_ui_summary">当上下滑动时不隐藏导航栏和搜索框</string> <string name="pin_navigation_ui_summary">当上下滑动时不隐藏导航栏和搜索框</string>
@@ -749,4 +749,8 @@
<string name="pages_saved">图片已保存</string> <string name="pages_saved">图片已保存</string>
<string name="delete_old_backups">删除旧备份文件</string> <string name="delete_old_backups">删除旧备份文件</string>
<string name="delete_old_backups_summary">自动删除旧备份文件以释放存储空间</string> <string name="delete_old_backups_summary">自动删除旧备份文件以释放存储空间</string>
<string name="handle_links">处理链接</string>
<string name="handle_links_summary">处理来自外部程序的漫画链接(如 Web 浏览器), 可能需要在程序的系统设置中手动开启</string>
<string name="email">电子邮箱</string>
<string name="captcha_required_message">此图源需要通过验证以继续操作</string>
</resources> </resources>

View File

@@ -765,4 +765,9 @@
<string name="max_backups_count">Max number of backups</string> <string name="max_backups_count">Max number of backups</string>
<string name="delete_old_backups">Delete old backups</string> <string name="delete_old_backups">Delete old backups</string>
<string name="delete_old_backups_summary">Automatically delete old backup files to save storage space</string> <string name="delete_old_backups_summary">Automatically delete old backup files to save storage space</string>
<string name="handle_links">Handle links</string>
<string name="handle_links_summary">Handle manga links from external applications (e.g. web browser). You may also need to enable it manually in the application\'s system settings</string>
<string name="email">Email</string>
<string name="captcha_required_message">This source requires solving a captcha to continue</string>
<string name="error_connection_reset">Connection reset by remote host</string>
</resources> </resources>

View File

@@ -32,4 +32,11 @@
android:summary="@string/disable_nsfw_summary" android:summary="@string/disable_nsfw_summary"
android:title="@string/disable_nsfw" /> android:title="@string/disable_nsfw" />
<SwitchPreferenceCompat
android:key="handle_links"
android:persistent="false"
android:summary="@string/handle_links_summary"
android:title="@string/handle_links"
app:allowDividerAbove="true" />
</androidx.preference.PreferenceScreen> </androidx.preference.PreferenceScreen>

View File

@@ -5,9 +5,10 @@ adapterdelegates = "4.3.2"
appcompat = "1.7.0" appcompat = "1.7.0"
avifDecoder = "1.1.1.14d8e3c4" avifDecoder = "1.1.1.14d8e3c4"
biometric = "1.2.0-alpha05" biometric = "1.2.0-alpha05"
coil = "3.0.3" coil = "3.0.4"
collections = "1.4.5" collections = "1.4.5"
conscrypt = "2.5.3" #noinspection GradleDependency - 2.5.3 cause crashes
conscrypt = "2.5.2"
constraintlayout = "2.2.0" constraintlayout = "2.2.0"
coreKtx = "1.15.0" coreKtx = "1.15.0"
coroutines = "1.9.0" coroutines = "1.9.0"
@@ -30,7 +31,7 @@ material = "1.12.0"
moshi = "1.15.1" moshi = "1.15.1"
okhttp = "4.12.0" okhttp = "4.12.0"
okio = "3.9.1" okio = "3.9.1"
parsers = "8bc51b3b79" parsers = "fece09b781"
preference = "1.2.1" preference = "1.2.1"
recyclerview = "1.3.2" recyclerview = "1.3.2"
room = "2.6.1" room = "2.6.1"