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
/.idea/deviceManager.xml
/.kotlin/
/.idea/AndroidProjectSystem.xml

View File

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

View File

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

View File

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

View File

@@ -1,3 +1,3 @@
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()
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)
.build()
}

View File

@@ -79,7 +79,9 @@ class ParserMangaRepository(
}
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()

View File

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

View File

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

View File

@@ -9,6 +9,7 @@ import okhttp3.Response
import okio.FileNotFoundException
import okio.IOException
import okio.ProtocolException
import org.acra.ktx.sendSilentlyWithAcra
import org.acra.ktx.sendWithAcra
import org.jsoup.HttpStatusException
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.TooManyRequestExceptions
import org.koitharu.kotatsu.scrobbling.common.domain.ScrobblerAuthRequiredException
import java.io.ObjectOutputStream
import java.net.ConnectException
import java.net.NoRouteToHostException
import java.io.ObjectOutputStream
import java.net.SocketException
import java.net.SocketTimeoutException
import java.net.UnknownHostException
import java.util.Locale
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"
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 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 ActivityNotFoundException,
is UnsupportedOperationException,
@@ -116,7 +119,7 @@ private fun Throwable.getDisplayMessageOrNull(resources: Resources): String? = w
is HttpException -> getHttpDisplayMessage(response.code, resources)
is HttpStatusException -> getHttpDisplayMessage(statusCode, resources)
else -> getDisplayMessage(message, resources) ?: message
else -> mapDisplayMessage(message, resources) ?: message
}.takeUnless { it.isNullOrBlank() }
@DrawableRes
@@ -153,10 +156,11 @@ private fun getHttpDisplayMessage(statusCode: Int, resources: Resources): String
else -> null
}
private fun getDisplayMessage(msg: String?, resources: Resources): String? = when {
private fun mapDisplayMessage(msg: String?, resources: Resources): String? = when {
msg.isNullOrEmpty() -> null
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 == 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_STATES_NOT_SUPPORTED -> resources.getString(R.string.error_multiple_states_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 TooManyRequestExceptions
|| this is HttpStatusException
|| this is SocketException
) {
return false
}
@@ -193,9 +198,13 @@ fun Throwable.isNetworkError(): Boolean {
return this is UnknownHostException || this is SocketTimeoutException
}
fun Throwable.report() {
val exception = CaughtException(this, "${javaClass.simpleName}($message)")
exception.sendWithAcra()
fun Throwable.report(silent: Boolean = false) {
val exception = CaughtException(this)
if (silent) {
exception.sendSilentlyWithAcra()
} else {
exception.sendWithAcra()
}
}
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.toListSorted
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.output.LocalMangaOutput.Companion.ENTRY_NAME_INDEX
import org.koitharu.kotatsu.local.domain.model.LocalManga
@@ -94,10 +95,12 @@ class LocalMangaParser(private val uri: Uri) {
chapters = if (withDetails) {
val chapters = fileSystem.listRecursively(rootPath)
.mapNotNullTo(HashSet()) { path ->
if (path != coverEntry && fileSystem.isRegularFile(path) && mimeTypeMap.isImage(path)) {
path.parent
} else {
null
when {
path == coverEntry -> null
!fileSystem.isRegularFile(path) -> null
mimeTypeMap.isImage(path) -> path.parent
hasZipExtension(path.name) -> path
else -> null
}
}.sortedWith(compareBy(AlphanumComparator()) { x -> x.toString() })
chapters.mapIndexed { i, p ->

View File

@@ -60,7 +60,7 @@ class ScrobblingSelectorSheet :
lateinit var coil: ImageLoader
private var collapsibleActionViewCallback: CollapseActionViewCallback? = null
private var paginationScrollListener: PaginationScrollListener? = null
private val viewModel by viewModels<ScrobblingSelectorViewModel>()
override fun onCreateViewBinding(inflater: LayoutInflater, container: ViewGroup?): SheetScrobblingSelectorBinding {
@@ -77,7 +77,11 @@ class ScrobblingSelectorSheet :
adapter = listAdapter
addItemDecoration(decoration)
addItemDecoration(TypedListSpacingDecoration(context, false))
addOnScrollListener(PaginationScrollListener(4, this@ScrobblingSelectorSheet))
addOnScrollListener(
PaginationScrollListener(4, this@ScrobblingSelectorSheet).also {
paginationScrollListener = it
},
)
}
binding.buttonDone.setOnClickListener(this)
initOptionsMenu()
@@ -112,6 +116,7 @@ class ScrobblingSelectorSheet :
override fun onDestroyView() {
super.onDestroyView()
collapsibleActionViewCallback = null
paginationScrollListener = null
}
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)
}
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.StateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.plus
import org.koitharu.kotatsu.R
@@ -59,7 +58,7 @@ class ScrobblingSelectorViewModel @Inject constructor(
get() = availableScrobblers[selectedScrobblerIndex.requireValue()]
val content: StateFlow<List<ListModel>> = combine(
scrobblerMangaList.map { it.distinctBy { x -> x.id } },
scrobblerMangaList,
listError,
hasNextPage,
) { list, error, isHasNextPage ->
@@ -127,14 +126,17 @@ class ScrobblingSelectorViewModel @Inject constructor(
runCatchingCancellable {
currentScrobbler.findManga(checkNotNull(searchQuery.value), offset)
}.onSuccess { list ->
if (!append) {
scrobblerMangaList.value = list
} else if (list.isNotEmpty()) {
scrobblerMangaList.value += list
}
hasNextPage.value = list.isNotEmpty()
val newList = (if (append) {
scrobblerMangaList.value + list
} else {
list
}).distinctBy { x -> x.id }
val changed = newList != scrobblerMangaList.value
scrobblerMangaList.value = newList
hasNextPage.value = changed && newList.isNotEmpty()
}.onFailure { error ->
error.printStackTraceDebug()
hasNextPage.value = false
listError.value = error
}
}

View File

@@ -1,8 +1,14 @@
package org.koitharu.kotatsu.scrobbling.kitsu.data
import okhttp3.Interceptor
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.Response
import okhttp3.internal.closeQuietly
import okio.IOException
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.domain.ScrobblerAuthRequiredException
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())
if (!isAuthRequest && response.code == HttpURLConnection.HTTP_UNAUTHORIZED) {
response.closeQuietly()
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
}
companion object {
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.preference.ListPreference
import androidx.preference.Preference
import androidx.preference.TwoStatePreference
import dagger.hilt.android.AndroidEntryPoint
import org.koitharu.kotatsu.R
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) {
@@ -58,6 +64,11 @@ class SourcesSettingsFragment : BasePreferenceFragment(R.string.remote_sources)
true
}
AppSettings.KEY_HANDLE_LINKS -> {
viewModel.setLinksEnabled((preference as TwoStatePreference).isChecked)
true
}
else -> super.onPreferenceTreeClick(preference)
}
}

View File

@@ -1,8 +1,16 @@
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 dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.plus
@@ -13,8 +21,11 @@ import javax.inject.Inject
@HiltViewModel
class SourcesSettingsViewModel @Inject constructor(
sourcesRepository: MangaSourcesRepository,
@ApplicationContext private val context: Context,
) : BaseViewModel() {
private val linksHandlerActivity = ComponentName(context, "org.koitharu.kotatsu.details.ui.DetailsByLinkActivity")
val enabledSourcesCount = sourcesRepository.observeEnabledSourcesCount()
.withErrorHandling()
.stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Eagerly, -1)
@@ -22,4 +33,20 @@ class SourcesSettingsViewModel @Inject constructor(
val availableSourcesCount = sourcesRepository.observeAvailableSourcesCount()
.withErrorHandling()
.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_height="wrap_content"
android:autofillHints="emailAddress"
android:hint="@string/email"
android:imeOptions="actionDone"
android:inputType="textEmailAddress"
android:maxLength="512"
android:singleLine="true"
android:textSize="16sp"
tools:hint="Email" />
android:textSize="16sp" />
</com.google.android.material.textfield.TextInputLayout>
@@ -83,12 +83,12 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:autofillHints="password"
android:hint="@string/password"
android:imeOptions="actionDone"
android:inputType="textPassword"
android:maxLength="512"
android:singleLine="true"
android:textSize="16sp"
tools:hint="Password" />
android:textSize="16sp" />
</com.google.android.material.textfield.TextInputLayout>

View File

@@ -659,4 +659,7 @@
<string name="external_source">خارجي/إضافي</string>
<string name="plugin_incompatible">مكون إضافي غير متوافق أو خطأ داخلي. تأكد من استخدام أحدث إصدار من المكون الإضافي وKotatsu</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_dropped">Zahozeno</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_recent_description">Vaše nedávno čtená manga</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="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="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="color_correction">Korekce barev</string>
<string name="brightness">Jas</string>
@@ -654,4 +654,21 @@
<string name="unpin">Odepnout</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="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>

View File

@@ -749,4 +749,8 @@
<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">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>

View File

@@ -746,4 +746,11 @@
<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="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>

View File

@@ -746,4 +746,8 @@
<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">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>

View File

@@ -50,7 +50,7 @@
<string name="processing_">Przetwarzanie…</string>
<string name="updated">Zaktualizowane</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="manga_shelf">Biblioteka</string>
<string name="recent_manga">Ostatnie</string>
@@ -739,4 +739,18 @@
<string name="allow_always">Zezwalaj zawsze</string>
<string name="allow_once">Zezwól raz</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>

View File

@@ -7,7 +7,7 @@
<string name="history">Histórico</string>
<string name="error_occurred">Ocorreu um erro</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="list">Lista</string>
<string name="detailed_list">Lista detalhada</string>
@@ -32,7 +32,7 @@
<string name="manga_downloading_">Baixando…</string>
<string name="processing_">Processando…</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="add_to_favourites">Favoritar obra</string>
<string name="by_name">Nome</string>
@@ -50,7 +50,7 @@
<string name="remove">Remover</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="page_saved">Salva</string>
<string name="page_saved">Página salva</string>
<string name="share_image">Compartilhar imagem</string>
<string name="_import">Importar</string>
<string name="delete">Deletar</string>
@@ -61,8 +61,8 @@
<string name="standard">Padrão</string>
<string name="read_mode">Modo de leitura</string>
<string name="grid_size">Tamanho da grade</string>
<string name="search_on_s">Pesquisar em %s</string>
<string name="delete_manga">Excluir mangá</string>
<string name="search_on_s">Procurar em %s</string>
<string name="delete_manga">Excluir obra</string>
<string name="text_delete_local_manga">Excluir “%s” do dispositivo permanentemente?</string>
<string name="reader_settings">Configurações do leitor</string>
<string name="_continue">Continuar</string>
@@ -73,7 +73,7 @@
<string name="external_storage">Armazenamento externo</string>
<string name="domain">Domínio</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="new_chapters">Novos capítulos</string>
<string name="download">Baixar</string>
@@ -99,7 +99,7 @@
<string name="favourites_category_empty">Categoria vazia</string>
<string name="read_later">Ler depois</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="size_s">Tamanho: %s</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="passwords_mismatch">Senhas incompatíveis</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="yesterday">Ontem</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="clear_feed">Limpar fluxo</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="sign_in">Entrar</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="operation_not_supported">Esta operação não é suportada</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="switch_pages">Mudar páginas</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="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="check_for_updates">Verificar se há atualização</string>
<string name="text_feed_holder">Novos capítulos da(s) obra(s) que você tá lendo serão mostrados aqui</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ê serão mostrados aqui</string>
<string name="app_version">Versão %s</string>
<string name="zoom_mode_fit_width">Ajustar à largura</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="no_manga_sources_text">Habilite fontes para ler obras online</string>
<string name="random">Aleatória</string>
<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>
<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>
<string name="reorder">Reordenar</string>
<string name="empty">Vazio</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_will_start_soon">A importação começará em breve</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="color_correction">Correção de cor</string>
<string name="brightness">Brilho</string>
@@ -375,7 +374,7 @@
<string name="more">Mais</string>
<string name="enable">Permitir</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="downloads_paused">\"Baixando foi pausado\"</string>
<string name="downloads_removed">Os baixados foram removidos</string>
@@ -393,7 +392,7 @@
<string name="network">Rede</string>
<string name="data_and_privacy">Dados e privacidade</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="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>
@@ -501,8 +500,7 @@
<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="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.
\nFique atento</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.\nFique atento</string>
<string name="available_d">Disponível: %1$d</string>
<string name="state">Situação</string>
<string name="state_paused">Pausada</string>
@@ -530,9 +528,7 @@
<string name="rating_adult">Adulta</string>
<string name="default_tab">Aba padrão</string>
<string name="content_rating">Classificação do Conteúdo</string>
<string name="mark_as_completed_prompt">Deseja marcar a obra selecionado como completa?
\n
\nAviso: o progresso de leitura atual será perdido.</string>
<string name="mark_as_completed_prompt">Deseja marcar a obra selecionada como completa?\n\nAviso: o progresso de leitura atual será perdido.</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="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="last_read">Última leitura</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="reader_fullscreen_summary">Ocultar a barra de status e navegação</string>
<string name="remove_from_history">Remover do histórico</string>
@@ -612,7 +608,7 @@
<string name="order_oldest">Mais velho</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="fix">Fixar</string>
<string name="fix">Corrigir</string>
<string name="error_no_data_received">Nenhum dado foi recebido do servidor</string>
<string name="enable_source">Habilitar fonte</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_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_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="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="suggested_queries">Consultas sugeridas</string>
<string name="disable">Desativar</string>
@@ -649,21 +645,21 @@
<string name="chapters_read">Capítulos lidos</string>
<string name="chapters_left">Capítulos restantes</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_unpinned">Fonte desfixada</string>
<string name="source_unpinned">Fonte desafixada</string>
<string name="sources_pinned">Fontes fixadas</string>
<string name="recent_sources">Fontes recentes</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_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="show_quick_filters_summary">Habilitar filtros em todas as fontes compatíveis</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_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="unstable_feature_summary">Essa função é experimental. Certifique-se de que você tenha um backup para evitar a perda de dados</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 perca de dados</string>
<string name="recently_added">Adicionado recentemente</string>
<string name="added_long_ago">Adicionado há muito tempo</string>
<string name="popular_today">Popular hoje</string>
@@ -674,33 +670,83 @@
<string name="low_rating">Classificação baixa</string>
<string name="original_language">Idioma original</string>
<string name="year">Ano</string>
<string name="source_code">Códico fonte</string>
<string name="user_manual">Manual do Usuário</string>
<string name="source_code">Código fonte</string>
<string name="user_manual">Manual do usuário</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="popularity">Popularidade</string>
<string name="popular_in_month">Popular neste mês</string>
<string name="sort_order_asc">Ascendente</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="start_download">Iniciar download</string>
<string name="save_manga_confirm">Salvar o mangá selecionado? Isso pode consumir dados e armazenamento</string>
<string name="save_manga">Salvar o mangá</string>
<string name="start_download">Comecar a baixar</string>
<string name="save_manga_confirm">Salvar a obra selecionada? Isso pode consumir dados e armazenamento</string>
<string name="save_manga">Salvar a obra</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="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_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_replaced">Mangá “%1$s” (%2$s) substituído por “%3$s” (%4$s)</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 a obra selecionada. A tarefa levará algum tempo e será executada em segundo plano</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="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="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="pages_saved">Páginas salvas</string>
<string name="text_empty_holder_secondary_filtered">Não existem obras que correspondam aos filtros selecionados</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="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="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>

View File

@@ -749,4 +749,8 @@
<string name="access_denied_403">Приступ одбијен (403)</string>
<string name="delete_old_backups">Избриши старе резервне копије</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>

View File

@@ -749,4 +749,8 @@
<string name="pages_saved">Sayfalar kaydedildi</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="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>

View File

@@ -749,4 +749,7 @@
<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_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>

View File

@@ -621,7 +621,7 @@
<string name="show_updated">显示更新</string>
<string name="webtoon_gaps_summary">在条漫模式下添加页与页之间的横向缝隙</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="new_chapters_pattern">%1$s: %2$d</string>
<string name="pin_navigation_ui_summary">当上下滑动时不隐藏导航栏和搜索框</string>
@@ -749,4 +749,8 @@
<string name="pages_saved">图片已保存</string>
<string name="delete_old_backups">删除旧备份文件</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>

View File

@@ -765,4 +765,9 @@
<string name="max_backups_count">Max number of 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="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>

View File

@@ -32,4 +32,11 @@
android:summary="@string/disable_nsfw_summary"
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>

View File

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