Compare commits

...

35 Commits
v6.8 ... v6.8.2

Author SHA1 Message Date
Koitharu
b57069c55f Merge remote-tracking branch 'weblate/devel' into devel 2024-03-30 09:18:41 +02:00
Koitharu
5b1a4d3ff5 Update dependencies 2024-03-30 09:15:20 +02:00
Koitharu
2b26f944d0 Fix background color in webttoon mode #832 2024-03-30 09:02:12 +02:00
Koitharu
a15197f69d Update suggestions after config changes #831 2024-03-30 08:47:08 +02:00
Koitharu
41f64b2e36 Handle NoDataReceivedException 2024-03-30 08:21:47 +02:00
Koitharu
bec032c7dc Fix TransactionTooLargeException when using WebView 2024-03-30 08:13:02 +02:00
maryush
0ffefddb86 Translated using Weblate (Polish)
Currently translated at 100.0% (636 of 636 strings)

Co-authored-by: maryush <maryush@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/pl/
Translation: Kotatsu/Strings
2024-03-23 16:38:21 +02:00
Anton Prevrhal
09b154c997 Translated using Weblate (German)
Currently translated at 100.0% (636 of 636 strings)

Co-authored-by: Anton Prevrhal <anton.prevrhal@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/de/
Translation: Kotatsu/Strings
2024-03-23 16:38:21 +02:00
jonathan | ヨナタン
d9f3b4f76e Translated using Weblate (German)
Currently translated at 100.0% (636 of 636 strings)

Co-authored-by: jonathan | ヨナタン <jonathan.evertz@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/de/
Translation: Kotatsu/Strings
2024-03-23 16:38:21 +02:00
Anon
8ebb3ef804 Translated using Weblate (Serbian)
Currently translated at 99.8% (635 of 636 strings)

Co-authored-by: Anon <anonymousprivate76@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/sr/
Translation: Kotatsu/Strings
2024-03-23 16:38:21 +02:00
ReksaTresna
b03682a81f Translated using Weblate (Indonesian)
Currently translated at 95.1% (605 of 636 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (9 of 9 strings)

Co-authored-by: ReksaTresna <ilham151096@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/plurals/id/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/id/
Translation: Kotatsu/Strings
Translation: Kotatsu/plurals
2024-03-23 16:38:21 +02:00
Infy's Tagalog Translations
5dd54be06c Translated using Weblate (Filipino)
Currently translated at 100.0% (636 of 636 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-03-23 16:38:21 +02:00
Scrambled777
98c0b60207 Translated using Weblate (Hindi)
Currently translated at 100.0% (636 of 636 strings)

Co-authored-by: Scrambled777 <weblate.scrambled777@simplelogin.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/hi/
Translation: Kotatsu/Strings
2024-03-23 16:38:21 +02:00
gekka
10a0009532 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (636 of 636 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (636 of 636 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (636 of 636 strings)

Co-authored-by: gekka <1778962971@qq.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/zh_Hans/
Translation: Kotatsu/Strings
2024-03-23 16:38:21 +02:00
Oğuz Ersen
5e203f0b27 Translated using Weblate (Turkish)
Currently translated at 100.0% (636 of 636 strings)

Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/tr/
Translation: Kotatsu/Strings
2024-03-23 16:38:21 +02:00
gallegonovato
46fc48cfd7 Translated using Weblate (Spanish)
Currently translated at 100.0% (636 of 636 strings)

Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/es/
Translation: Kotatsu/Strings
2024-03-23 16:38:21 +02:00
Макар Разин
e8a17708d2 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (636 of 636 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (636 of 636 strings)

Translated using Weblate (Belarusian)

Currently translated at 100.0% (636 of 636 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (636 of 636 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (636 of 636 strings)

Translated using Weblate (Belarusian)

Currently translated at 100.0% (636 of 636 strings)

Co-authored-by: Макар Разин <makarrazin14@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/be/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/ru/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/uk/
Translation: Kotatsu/Strings
2024-03-23 16:38:21 +02:00
maryush
061eaa2a56 Translated using Weblate (Polish)
Currently translated at 100.0% (636 of 636 strings)

Co-authored-by: maryush <maryush@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/pl/
Translation: Kotatsu/Strings
2024-03-23 15:36:15 +01:00
Anton Prevrhal
bc6e29b562 Translated using Weblate (German)
Currently translated at 100.0% (636 of 636 strings)

Co-authored-by: Anton Prevrhal <anton.prevrhal@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/de/
Translation: Kotatsu/Strings
2024-03-23 15:36:15 +01:00
jonathan | ヨナタン
d8c1dcef29 Translated using Weblate (German)
Currently translated at 100.0% (636 of 636 strings)

Co-authored-by: jonathan | ヨナタン <jonathan.evertz@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/de/
Translation: Kotatsu/Strings
2024-03-23 15:36:15 +01:00
Anon
ca281afba1 Translated using Weblate (Serbian)
Currently translated at 99.8% (635 of 636 strings)

Co-authored-by: Anon <anonymousprivate76@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/sr/
Translation: Kotatsu/Strings
2024-03-23 15:36:15 +01:00
ReksaTresna
cde07a60d7 Translated using Weblate (Indonesian)
Currently translated at 95.1% (605 of 636 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (9 of 9 strings)

Co-authored-by: ReksaTresna <ilham151096@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/plurals/id/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/id/
Translation: Kotatsu/Strings
Translation: Kotatsu/plurals
2024-03-23 15:36:15 +01:00
Infy's Tagalog Translations
e31af0f43f Translated using Weblate (Filipino)
Currently translated at 100.0% (638 of 638 strings)

Translated using Weblate (Filipino)

Currently translated at 100.0% (636 of 636 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-03-23 15:36:15 +01:00
Scrambled777
15dd0f38e7 Translated using Weblate (Hindi)
Currently translated at 100.0% (638 of 638 strings)

Translated using Weblate (Hindi)

Currently translated at 100.0% (636 of 636 strings)

Co-authored-by: Scrambled777 <weblate.scrambled777@simplelogin.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/hi/
Translation: Kotatsu/Strings
2024-03-23 15:36:15 +01:00
gekka
d93647e889 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (636 of 636 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (636 of 636 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (636 of 636 strings)

Co-authored-by: gekka <1778962971@qq.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/zh_Hans/
Translation: Kotatsu/Strings
2024-03-23 15:36:15 +01:00
Oğuz Ersen
509d9a2fba Translated using Weblate (Turkish)
Currently translated at 100.0% (638 of 638 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (636 of 636 strings)

Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/tr/
Translation: Kotatsu/Strings
2024-03-23 15:36:15 +01:00
gallegonovato
879d05f1a6 Translated using Weblate (Spanish)
Currently translated at 100.0% (638 of 638 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (636 of 636 strings)

Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/es/
Translation: Kotatsu/Strings
2024-03-23 15:36:15 +01:00
Макар Разин
ecf6bbfb66 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (636 of 636 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (636 of 636 strings)

Translated using Weblate (Belarusian)

Currently translated at 100.0% (636 of 636 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (636 of 636 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (636 of 636 strings)

Translated using Weblate (Belarusian)

Currently translated at 100.0% (636 of 636 strings)

Co-authored-by: Макар Разин <makarrazin14@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/be/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/ru/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/uk/
Translation: Kotatsu/Strings
2024-03-23 15:36:15 +01:00
Koitharu
bc42fda786 Update parsers 2024-03-23 16:36:01 +02:00
Koitharu
d3590372f3 Disable reporting of ParseException 2024-03-23 16:22:25 +02:00
Koitharu
88f55997fa Fix stats chart color 2024-03-23 16:18:01 +02:00
Koitharu
0a1bc6716b Fix crashes 2024-03-23 15:59:49 +02:00
Koitharu
559e546462 Fix favorites migration 2024-03-23 10:05:01 +02:00
Koitharu
6c5775a2ed Option to disable Pages tab on details screen 2024-03-23 09:54:10 +02:00
Koitharu
4858adbbe7 Fix chapters selection 2024-03-20 07:23:17 +02:00
45 changed files with 406 additions and 210 deletions

View File

@@ -16,8 +16,8 @@ android {
applicationId 'org.koitharu.kotatsu'
minSdk = 21
targetSdk = 34
versionCode = 630
versionName = '6.8'
versionCode = 632
versionName = '6.8.2'
generatedDensities = []
testInstrumentationRunner 'org.koitharu.kotatsu.HiltTestRunner'
ksp {
@@ -82,7 +82,7 @@ afterEvaluate {
}
dependencies {
//noinspection GradleDependency
implementation('com.github.KotatsuApp:kotatsu-parsers:639895f511') {
implementation('com.github.KotatsuApp:kotatsu-parsers:44ea9fe709') {
exclude group: 'org.json', module: 'json'
}
@@ -104,7 +104,7 @@ dependencies {
implementation 'androidx.viewpager2:viewpager2:1.1.0-beta02'
implementation 'androidx.preference:preference-ktx:1.2.1'
implementation 'androidx.biometric:biometric-ktx:1.2.0-alpha05'
implementation 'com.google.android.material:material:1.12.0-alpha03'
implementation 'com.google.android.material:material:1.12.0-beta01'
implementation 'androidx.lifecycle:lifecycle-common-java8:2.7.0'
implementation 'androidx.webkit:webkit:1.10.0'
@@ -127,8 +127,8 @@ dependencies {
implementation 'com.hannesdorfmann:adapterdelegates4-kotlin-dsl:4.3.2'
implementation 'com.hannesdorfmann:adapterdelegates4-kotlin-dsl-viewbinding:4.3.2'
implementation 'com.google.dagger:hilt-android:2.51'
kapt 'com.google.dagger:hilt-compiler:2.51'
implementation 'com.google.dagger:hilt-android:2.51.1'
kapt 'com.google.dagger:hilt-compiler:2.51.1'
implementation 'androidx.hilt:hilt-work:1.2.0'
kapt 'androidx.hilt:hilt-compiler:1.2.0'
@@ -161,6 +161,6 @@ dependencies {
androidTestImplementation 'androidx.room:room-testing:2.6.1'
androidTestImplementation 'com.squareup.moshi:moshi-kotlin:1.15.1'
androidTestImplementation 'com.google.dagger:hilt-android-testing:2.51'
kaptAndroidTest 'com.google.dagger:hilt-android-compiler:2.51'
androidTestImplementation 'com.google.dagger:hilt-android-testing:2.51.1'
kaptAndroidTest 'com.google.dagger:hilt-android-compiler:2.51.1'
}

View File

@@ -5,9 +5,7 @@ import org.koitharu.kotatsu.core.db.MangaDatabase
import org.koitharu.kotatsu.core.model.getPreferredBranch
import org.koitharu.kotatsu.core.parser.MangaDataRepository
import org.koitharu.kotatsu.core.parser.MangaRepository
import org.koitharu.kotatsu.details.domain.DetailsLoadUseCase
import org.koitharu.kotatsu.details.domain.ProgressUpdateUseCase
import org.koitharu.kotatsu.favourites.data.FavouriteEntity
import org.koitharu.kotatsu.history.data.HistoryEntity
import org.koitharu.kotatsu.history.data.PROGRESS_NONE
import org.koitharu.kotatsu.history.data.toMangaHistory
@@ -21,7 +19,6 @@ class MigrateUseCase @Inject constructor(
private val mangaDataRepository: MangaDataRepository,
private val database: MangaDatabase,
private val progressUpdateUseCase: ProgressUpdateUseCase,
private val useCase: DetailsLoadUseCase
) {
suspend operator fun invoke(oldManga: Manga, newManga: Manga) {
@@ -41,16 +38,12 @@ class MigrateUseCase @Inject constructor(
database.withTransaction {
// replace favorites
val favoritesDao = database.getFavouritesDao()
val oldFavourite = favoritesDao.find(oldDetails.id)
if (oldFavourite != null) {
val oldFavourites = favoritesDao.findAllRaw(oldDetails.id)
if (oldFavourites.isNotEmpty()) {
favoritesDao.delete(oldManga.id)
for (f in oldFavourite.categories) {
val e = FavouriteEntity(
for (f in oldFavourites) {
val e = f.copy(
mangaId = newManga.id,
categoryId = f.categoryId.toLong(),
sortKey = f.sortKey,
createdAt = f.createdAt,
deletedAt = 0,
)
favoritesDao.upsert(e)
}

View File

@@ -1,6 +1,5 @@
package org.koitharu.kotatsu.browser
import android.annotation.SuppressLint
import android.content.ActivityNotFoundException
import android.content.Context
import android.content.Intent
@@ -13,17 +12,25 @@ import androidx.core.graphics.Insets
import androidx.core.view.isVisible
import androidx.core.view.updatePadding
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.network.CommonHeaders
import org.koitharu.kotatsu.core.parser.MangaRepository
import org.koitharu.kotatsu.core.parser.RemoteMangaRepository
import org.koitharu.kotatsu.core.ui.BaseActivity
import org.koitharu.kotatsu.core.util.ext.configureForParser
import org.koitharu.kotatsu.core.util.ext.getSerializableExtraCompat
import org.koitharu.kotatsu.core.util.ext.toUriOrNull
import org.koitharu.kotatsu.databinding.ActivityBrowserBinding
import org.koitharu.kotatsu.parsers.model.MangaSource
import javax.inject.Inject
import com.google.android.material.R as materialR
@SuppressLint("SetJavaScriptEnabled")
class BrowserActivity : BaseActivity<ActivityBrowserBinding>(), BrowserCallback {
private lateinit var onBackPressedCallback: WebViewBackPressedCallback
@Inject
lateinit var mangaRepositoryFactory: MangaRepository.Factory
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (!setContentViewWebViewSafe { ActivityBrowserBinding.inflate(layoutInflater) }) {
@@ -33,7 +40,11 @@ class BrowserActivity : BaseActivity<ActivityBrowserBinding>(), BrowserCallback
setDisplayHomeAsUpEnabled(true)
setHomeAsUpIndicator(materialR.drawable.abc_ic_clear_material)
}
viewBinding.webView.configureForParser(null)
val userAgent = intent?.getSerializableExtraCompat<MangaSource>(EXTRA_SOURCE)?.let { source ->
val repository = mangaRepositoryFactory.create(source) as? RemoteMangaRepository
repository?.headers?.get(CommonHeaders.USER_AGENT)
}
viewBinding.webView.configureForParser(userAgent)
CookieManager.getInstance().setAcceptThirdPartyCookies(viewBinding.webView, true)
viewBinding.webView.webViewClient = BrowserClient(this)
viewBinding.webView.webChromeClient = ProgressChromeClient(viewBinding.progressBar)
@@ -54,16 +65,6 @@ class BrowserActivity : BaseActivity<ActivityBrowserBinding>(), BrowserCallback
}
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
viewBinding.webView.saveState(outState)
}
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
viewBinding.webView.restoreState(savedInstanceState)
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
super.onCreateOptionsMenu(menu)
menuInflater.inflate(R.menu.opt_browser, menu)
@@ -136,11 +137,13 @@ class BrowserActivity : BaseActivity<ActivityBrowserBinding>(), BrowserCallback
companion object {
private const val EXTRA_TITLE = "title"
private const val EXTRA_SOURCE = "source"
fun newIntent(context: Context, url: String, title: String?): Intent {
fun newIntent(context: Context, url: String, source: MangaSource?, title: String?): Intent {
return Intent(context, BrowserActivity::class.java)
.setData(Uri.parse(url))
.putExtra(EXTRA_TITLE, title)
.putExtra(EXTRA_SOURCE, source)
}
}
}

View File

@@ -20,7 +20,7 @@ class CaptchaNotifier(
) : EventListener {
fun notify(exception: CloudFlareProtectedException) {
if (!context.checkNotificationPermission()) {
if (!context.checkNotificationPermission(CHANNEL_ID)) {
return
}
val manager = NotificationManagerCompat.from(context)

View File

@@ -81,16 +81,6 @@ class CloudFlareActivity : BaseActivity<ActivityBrowserBinding>(), CloudFlareCal
super.onDestroy()
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
viewBinding.webView.saveState(outState)
}
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
viewBinding.webView.restoreState(savedInstanceState)
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.opt_captcha, menu)
return super.onCreateOptionsMenu(menu)

View File

@@ -0,0 +1,7 @@
package org.koitharu.kotatsu.core.exceptions
import okio.IOException
class NoDataReceivedException(
private val url: String,
) : IOException("No data has been received from $url")

View File

@@ -82,7 +82,7 @@ class ExceptionResolver : ActivityResultCallback<TaggedActivityResult> {
private fun openInBrowser(url: String) {
val context = activity ?: fragment?.activity ?: return
context.startActivity(BrowserActivity.newIntent(context, url, null))
context.startActivity(BrowserActivity.newIntent(context, url, null, null))
}
private fun openAlternatives(manga: Manga) {

View File

@@ -16,6 +16,7 @@ import org.koitharu.kotatsu.core.network.cookies.MutableCookieJar
import org.koitharu.kotatsu.core.prefs.SourceSettings
import org.koitharu.kotatsu.core.util.ext.configureForParser
import org.koitharu.kotatsu.core.util.ext.printStackTraceDebug
import org.koitharu.kotatsu.core.util.ext.sanitizeHeaderValue
import org.koitharu.kotatsu.core.util.ext.toList
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.config.MangaSourceConfig
@@ -41,7 +42,7 @@ class MangaLoaderContextImpl @Inject constructor(
private val userAgentLazy = SuspendLazy {
withContext(Dispatchers.Main) {
obtainWebView().settings.userAgentString
}
}.sanitizeHeaderValue()
}
@SuppressLint("SetJavaScriptEnabled")

View File

@@ -221,8 +221,15 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) {
val isUnstableUpdatesAllowed: Boolean
get() = prefs.getBoolean(KEY_UPDATES_UNSTABLE, false)
val isPagesTabEnabled: Boolean
get() = prefs.getBoolean(KEY_PAGES_TAB, true)
val defaultDetailsTab: Int
get() = prefs.getString(KEY_DETAILS_TAB, null)?.toIntOrNull()?.coerceIn(0, 1) ?: 0
get() = if (isPagesTabEnabled) {
prefs.getString(KEY_DETAILS_TAB, null)?.toIntOrNull()?.coerceIn(0, 1) ?: 0
} else {
0
}
val isContentPrefetchEnabled: Boolean
get() {
@@ -622,6 +629,7 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) {
const val KEY_CF_INVERTED = "cf_inverted"
const val KEY_CF_GRAYSCALE = "cf_grayscale"
const val KEY_IGNORE_DOZE = "ignore_dose"
const val KEY_PAGES_TAB = "pages_tab"
const val KEY_DETAILS_TAB = "details_tab"
const val KEY_READING_TIME = "reading_time"
const val KEY_PAGES_SAVE_DIR = "pages_dir"

View File

@@ -3,9 +3,11 @@ package org.koitharu.kotatsu.core.prefs
import android.content.Context
import android.content.SharedPreferences.OnSharedPreferenceChangeListener
import androidx.core.content.edit
import okhttp3.internal.isSensitiveHeader
import org.koitharu.kotatsu.core.util.ext.getEnumValue
import org.koitharu.kotatsu.core.util.ext.ifNullOrEmpty
import org.koitharu.kotatsu.core.util.ext.putEnumValue
import org.koitharu.kotatsu.core.util.ext.sanitizeHeaderValue
import org.koitharu.kotatsu.parsers.config.ConfigKey
import org.koitharu.kotatsu.parsers.config.MangaSourceConfig
import org.koitharu.kotatsu.parsers.model.MangaSource
@@ -25,7 +27,10 @@ class SourceSettings(context: Context, source: MangaSource) : MangaSourceConfig
@Suppress("UNCHECKED_CAST")
override fun <T> get(key: ConfigKey<T>): T {
return when (key) {
is ConfigKey.UserAgent -> prefs.getString(key.key, key.defaultValue).ifNullOrEmpty { key.defaultValue }
is ConfigKey.UserAgent -> prefs.getString(key.key, key.defaultValue)
.ifNullOrEmpty { key.defaultValue }
.sanitizeHeaderValue()
is ConfigKey.Domain -> prefs.getString(key.key, key.defaultValue).ifNullOrEmpty { key.defaultValue }
is ConfigKey.ShowSuspiciousContent -> prefs.getBoolean(key.key, key.defaultValue)
is ConfigKey.SplitByTranslations -> prefs.getBoolean(key.key, key.defaultValue)
@@ -36,7 +41,7 @@ class SourceSettings(context: Context, source: MangaSource) : MangaSourceConfig
when (key) {
is ConfigKey.Domain -> putString(key.key, value as String?)
is ConfigKey.ShowSuspiciousContent -> putBoolean(key.key, value as Boolean)
is ConfigKey.UserAgent -> putString(key.key, value as String?)
is ConfigKey.UserAgent -> putString(key.key, (value as String?)?.sanitizeHeaderValue())
is ConfigKey.SplitByTranslations -> putBoolean(key.key, value as Boolean)
}
}

View File

@@ -33,7 +33,7 @@ object KotatsuColors {
val hue = (manga.id.absoluteValue % 360).toFloat()
ColorUtils.HSLToColor(floatArrayOf(hue, 0.5f, 0.5f))
} else {
context.getThemeColor(R.attr.colorSurface)
context.getThemeColor(R.attr.colorOutline)
}
val backgroundColor = context.getThemeColor(R.attr.colorSurfaceContainerHigh)
return MaterialColors.harmonize(color, backgroundColor)

View File

@@ -14,7 +14,7 @@ import android.content.ContextWrapper
import android.content.OperationApplicationException
import android.content.SharedPreferences
import android.content.SyncResult
import android.content.pm.PackageManager
import android.content.pm.PackageManager.PERMISSION_GRANTED
import android.content.pm.ResolveInfo
import android.database.SQLException
import android.graphics.Bitmap
@@ -216,10 +216,19 @@ fun Context.findActivity(): Activity? = when (this) {
else -> null
}
fun Context.checkNotificationPermission(): Boolean = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED
} else {
NotificationManagerCompat.from(this).areNotificationsEnabled()
fun Context.checkNotificationPermission(channelId: String?): Boolean {
val hasPermission = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) == PERMISSION_GRANTED
} else {
NotificationManagerCompat.from(this).areNotificationsEnabled()
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && hasPermission && channelId != null) {
val channel = NotificationManagerCompat.from(this).getNotificationChannel(channelId)
if (channel != null && channel.importance == NotificationManagerCompat.IMPORTANCE_NONE) {
return false
}
}
return hasPermission
}
@WorkerThread

View File

@@ -1,11 +1,13 @@
package org.koitharu.kotatsu.core.util.ext
import okhttp3.Cookie
import okhttp3.Headers
import okhttp3.HttpUrl
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.RequestBody.Companion.toRequestBody
import okhttp3.Response
import okhttp3.internal.closeQuietly
import okhttp3.internal.isSensitiveHeader
import okio.IOException
import org.json.JSONObject
import org.jsoup.HttpStatusException
@@ -59,3 +61,16 @@ fun Cookie.newBuilder(): Cookie.Builder = Cookie.Builder().also { c ->
c.httpOnly()
}
}
fun String.sanitizeHeaderValue(): String {
return if (all(Char::isValidForHeaderValue)) {
this // fast path
} else {
filter(Char::isValidForHeaderValue)
}
}
private fun Char.isValidForHeaderValue(): Boolean {
// from okhttp3.Headers$Companion.checkValue
return this == '\t' || this in '\u0020'..'\u007e'
}

View File

@@ -8,12 +8,12 @@ import coil.network.HttpException
import okio.FileNotFoundException
import okio.IOException
import org.acra.ktx.sendWithAcra
import org.json.JSONException
import org.jsoup.HttpStatusException
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.exceptions.CaughtException
import org.koitharu.kotatsu.core.exceptions.CloudFlareProtectedException
import org.koitharu.kotatsu.core.exceptions.EmptyHistoryException
import org.koitharu.kotatsu.core.exceptions.NoDataReceivedException
import org.koitharu.kotatsu.core.exceptions.SyncApiException
import org.koitharu.kotatsu.core.exceptions.TooManyRequestExceptions
import org.koitharu.kotatsu.core.exceptions.UnsupportedFileException
@@ -55,6 +55,8 @@ fun Throwable.getDisplayMessage(resources: Resources): String = when (this) {
is SocketTimeoutException,
-> resources.getString(R.string.network_error)
is NoDataReceivedException -> resources.getString(R.string.error_no_data_received)
is WrongPasswordException -> resources.getString(R.string.wrong_password)
is NotFoundException -> resources.getString(R.string.not_found_404)
is UnsupportedSourceException -> resources.getString(R.string.unsupported_source)
@@ -110,13 +112,12 @@ fun Throwable.report() {
}
private val reportableExceptions = arraySetOf<Class<*>>(
ParseException::class.java,
JSONException::class.java,
RuntimeException::class.java,
IllegalStateException::class.java,
IllegalArgumentException::class.java,
ConcurrentModificationException::class.java,
UnsupportedOperationException::class.java,
NoDataReceivedException::class.java,
)
fun Throwable.isWebViewUnavailable(): Boolean {

View File

@@ -376,12 +376,13 @@ class DetailsActivity :
}
private fun initPager() {
val adapter = DetailsPagerAdapter(this)
val adapter = DetailsPagerAdapter(this, settings)
viewBinding.pager.recyclerView?.isNestedScrollingEnabled = false
viewBinding.pager.offscreenPageLimit = 1
viewBinding.pager.adapter = adapter
TabLayoutMediator(viewBinding.tabs, viewBinding.pager, adapter).attach()
viewBinding.pager.setCurrentItem(settings.defaultDetailsTab, false)
viewBinding.tabs.isVisible = adapter.itemCount > 1
}
private fun showBottomSheet(isVisible: Boolean) {

View File

@@ -189,7 +189,7 @@ class DetailsFragment :
isVisible = false
}
}
if (manga.source == MangaSource.LOCAL) {
if (manga.source == MangaSource.LOCAL || manga.source == MangaSource.DUMMY) {
infoLayout.textViewSource.isVisible = false
} else {
infoLayout.textViewSource.text = manga.source.title
@@ -223,7 +223,7 @@ class DetailsFragment :
}
binding.approximateReadTime.text = time.format(resources)
binding.approximateReadTimeTitle.setText(
if (time.isContinue) R.string.approximate_remaining_time else R.string.approximate_reading_time
if (time.isContinue) R.string.approximate_remaining_time else R.string.approximate_reading_time,
)
binding.approximateReadTimeLayout.isVisible = true
}

View File

@@ -89,7 +89,7 @@ class DetailsMenuProvider(
R.id.action_browser -> {
viewModel.manga.value?.let {
activity.startActivity(BrowserActivity.newIntent(activity, it.publicUrl, it.title))
activity.startActivity(BrowserActivity.newIntent(activity, it.publicUrl, it.source, it.title))
}
}

View File

@@ -36,7 +36,7 @@ class ChaptersSelectionDecoration(context: Context) : AbstractSelectionItemDecor
98,
)
paint.style = Paint.Style.FILL
hasBackground = false
hasBackground = true
hasForeground = true
isIncludeDecorAndMargins = false

View File

@@ -6,13 +6,19 @@ import androidx.viewpager2.adapter.FragmentStateAdapter
import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayoutMediator
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.prefs.AppSettings
import org.koitharu.kotatsu.details.ui.pager.chapters.ChaptersFragment
import org.koitharu.kotatsu.details.ui.pager.pages.PagesFragment
class DetailsPagerAdapter(activity: FragmentActivity) : FragmentStateAdapter(activity),
class DetailsPagerAdapter(
activity: FragmentActivity,
settings: AppSettings,
) : FragmentStateAdapter(activity),
TabLayoutMediator.TabConfigurationStrategy {
override fun getItemCount(): Int = 2
val isPagesTabEnabled = settings.isPagesTabEnabled
override fun getItemCount(): Int = if (isPagesTabEnabled) 2 else 1
override fun createFragment(position: Int): Fragment = when (position) {
0 -> ChaptersFragment()

View File

@@ -118,6 +118,9 @@ abstract class FavouritesDao {
@Query("SELECT * FROM favourites WHERE manga_id = :id AND deleted_at = 0 GROUP BY manga_id")
abstract suspend fun find(id: Long): FavouriteManga?
@Query("SELECT * FROM favourites WHERE manga_id = :mangaId AND deleted_at = 0")
abstract suspend fun findAllRaw(mangaId: Long): List<FavouriteEntity>
@Transaction
@Deprecated("Ignores order")
@Query("SELECT * FROM favourites WHERE manga_id = :id AND deleted_at = 0 GROUP BY manga_id")

View File

@@ -12,6 +12,7 @@ import okio.Source
import okio.buffer
import okio.sink
import okio.use
import org.koitharu.kotatsu.core.exceptions.NoDataReceivedException
import org.koitharu.kotatsu.core.util.FileSize
import org.koitharu.kotatsu.core.util.ext.compressToPNG
import org.koitharu.kotatsu.core.util.ext.longHashCode
@@ -62,7 +63,9 @@ class PagesCache @Inject constructor(@ApplicationContext context: Context) {
val bytes = file.sink(append = false).buffer().use {
it.writeAllCancellable(source)
}
check(bytes != 0L) { "No data has been written" }
if (bytes == 0L) {
throw NoDataReceivedException(url)
}
lruCache.get().put(url, file)
} finally {
file.delete()

View File

@@ -50,7 +50,7 @@ class ImportWorker @AssistedInject constructor(
val result = runCatchingCancellable {
importer.import(uri).manga
}
if (applicationContext.checkNotificationPermission()) {
if (applicationContext.checkNotificationPermission(CHANNEL_ID)) {
val notification = buildNotification(result)
notificationManager.notify(uri.hashCode(), notification)
}

View File

@@ -59,6 +59,9 @@ class WebtoonReaderFragment : BaseReaderFragment<FragmentReaderWebtoonBinding>()
viewModel.defaultWebtoonZoomOut.take(1).observe(viewLifecycleOwner) {
binding.frame.zoom = 1f - it
}
viewModel.readerSettings.observe(viewLifecycleOwner) {
it.applyBackground(binding.root)
}
}
override fun onDestroyView() {

View File

@@ -4,6 +4,7 @@ import android.content.SharedPreferences
import android.os.Bundle
import androidx.lifecycle.lifecycleScope
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.prefs.AppSettings
@@ -15,8 +16,7 @@ import org.koitharu.kotatsu.suggestions.ui.SuggestionsWorker
import javax.inject.Inject
@AndroidEntryPoint
class SuggestionsSettingsFragment :
BasePreferenceFragment(R.string.suggestions),
class SuggestionsSettingsFragment : BasePreferenceFragment(R.string.suggestions),
SharedPreferences.OnSharedPreferenceChangeListener {
@Inject
@@ -48,16 +48,17 @@ class SuggestionsSettingsFragment :
}
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
if (key == AppSettings.KEY_SUGGESTIONS && settings.isSuggestionsEnabled) {
onSuggestionsEnabled()
if (settings.isSuggestionsEnabled && (key == AppSettings.KEY_SUGGESTIONS
|| key == AppSettings.KEY_SUGGESTIONS_EXCLUDE_TAGS
|| key == AppSettings.KEY_SUGGESTIONS_EXCLUDE_NSFW)
) {
updateSuggestions()
}
}
private fun onSuggestionsEnabled() {
lifecycleScope.launch {
if (repository.isEmpty()) {
suggestionsScheduler.startNow()
}
private fun updateSuggestions() {
lifecycleScope.launch(Dispatchers.Default) {
suggestionsScheduler.startNow()
}
}
}

View File

@@ -82,16 +82,6 @@ class SourceAuthActivity : BaseActivity<ActivityBrowserBinding>(), BrowserCallba
viewBinding.webView.loadUrl(url)
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
viewBinding.webView.saveState(outState)
}
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
viewBinding.webView.restoreState(savedInstanceState)
}
override fun onDestroy() {
super.onDestroy()
viewBinding.webView.destroy()

View File

@@ -13,13 +13,16 @@ import androidx.core.graphics.Insets
import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams
import androidx.core.view.updatePadding
import com.google.android.material.snackbar.Snackbar
import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter
import dagger.hilt.android.AndroidEntryPoint
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.exceptions.resolve.SnackbarErrorObserver
import org.koitharu.kotatsu.core.ui.BaseActivity
import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener
import org.koitharu.kotatsu.core.util.ext.observe
import org.koitharu.kotatsu.core.util.ext.observeEvent
import org.koitharu.kotatsu.core.util.ext.tryLaunch
import org.koitharu.kotatsu.databinding.ActivityMangaDirectoriesBinding
import org.koitharu.kotatsu.settings.storage.DirectoryDiffCallback
import org.koitharu.kotatsu.settings.storage.DirectoryModel
@@ -42,7 +45,11 @@ class MangaDirectoriesActivity : BaseActivity<ActivityMangaDirectoriesBinding>()
) {
if (it) {
viewModel.updateList()
pickFileTreeLauncher.launch(null)
if (!pickFileTreeLauncher.tryLaunch(null)) {
Snackbar.make(
viewBinding.recyclerView, R.string.operation_not_supported, Snackbar.LENGTH_SHORT,
).show()
}
}
}
@@ -68,7 +75,11 @@ class MangaDirectoriesActivity : BaseActivity<ActivityMangaDirectoriesBinding>()
}
override fun onClick(v: View?) {
permissionRequestLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE)
if (!permissionRequestLauncher.tryLaunch(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
Snackbar.make(
viewBinding.recyclerView, R.string.operation_not_supported, Snackbar.LENGTH_SHORT,
).show()
}
}
override fun onWindowInsetsChanged(insets: Insets) {

View File

@@ -64,6 +64,8 @@ class SuggestionsViewModel @Inject constructor(
override fun onRetry() = Unit
fun updateSuggestions() {
suggestionsScheduler.startNow()
launchJob(Dispatchers.Default) {
suggestionsScheduler.startNow()
}
}
}

View File

@@ -1,11 +1,12 @@
package org.koitharu.kotatsu.suggestions.ui
import android.annotation.SuppressLint
import android.Manifest
import android.app.PendingIntent
import android.content.Context
import android.content.pm.ServiceInfo
import android.os.Build
import androidx.annotation.FloatRange
import androidx.annotation.RequiresPermission
import androidx.core.app.NotificationChannelCompat
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
@@ -50,6 +51,7 @@ import org.koitharu.kotatsu.core.prefs.AppSettings
import org.koitharu.kotatsu.core.util.ext.almostEquals
import org.koitharu.kotatsu.core.util.ext.asArrayList
import org.koitharu.kotatsu.core.util.ext.awaitUniqueWorkInfoByName
import org.koitharu.kotatsu.core.util.ext.awaitWorkInfosByTag
import org.koitharu.kotatsu.core.util.ext.checkNotificationPermission
import org.koitharu.kotatsu.core.util.ext.flatten
import org.koitharu.kotatsu.core.util.ext.printStackTraceDebug
@@ -189,7 +191,9 @@ class SuggestionsWorker @AssistedInject constructor(
.sortedBy { it.relevance }
.take(MAX_RESULTS)
suggestionRepository.replace(suggestions)
if (appSettings.isSuggestionsNotificationAvailable && applicationContext.checkNotificationPermission()) {
if (appSettings.isSuggestionsNotificationAvailable
&& applicationContext.checkNotificationPermission(MANGA_CHANNEL_ID)
) {
for (i in 0..3) {
try {
val manga = suggestions[Random.nextInt(0, suggestions.size / 3)]
@@ -252,7 +256,7 @@ class SuggestionsWorker @AssistedInject constructor(
e.printStackTraceDebug()
}.getOrDefault(emptyList())
@SuppressLint("MissingPermission")
@RequiresPermission(Manifest.permission.POST_NOTIFICATIONS)
private suspend fun showNotification(manga: Manga) {
val channel = NotificationChannelCompat.Builder(MANGA_CHANNEL_ID, NotificationManagerCompat.IMPORTANCE_DEFAULT)
.setName(applicationContext.getString(R.string.suggestions))
@@ -393,7 +397,10 @@ class SuggestionsWorker @AssistedInject constructor(
.any { !it.state.isFinished }
}
fun startNow() {
suspend fun startNow() {
if (workManager.awaitWorkInfosByTag(TAG_ONESHOT).any { !it.state.isFinished }) {
return
}
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
@@ -402,7 +409,7 @@ class SuggestionsWorker @AssistedInject constructor(
.addTag(TAG_ONESHOT)
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
.build()
workManager.enqueue(request)
workManager.enqueue(request).await()
}
private fun createConstraints() = Constraints.Builder()

View File

@@ -168,7 +168,7 @@ class TrackWorker @AssistedInject constructor(
}
}
}.onEachIndexed { index, it ->
if (applicationContext.checkNotificationPermission()) {
if (applicationContext.checkNotificationPermission(WORKER_CHANNEL_ID)) {
notificationManager.notify(WORKER_NOTIFICATION_ID, createWorkerNotification(tracks.size, index + 1))
}
when (it) {
@@ -197,7 +197,7 @@ class TrackWorker @AssistedInject constructor(
channelId: String?,
newChapters: List<MangaChapter>,
) {
if (newChapters.isEmpty() || channelId == null || !applicationContext.checkNotificationPermission()) {
if (newChapters.isEmpty() || channelId == null || !applicationContext.checkNotificationPermission(channelId)) {
return
}
val id = manga.url.hashCode()

View File

@@ -607,7 +607,7 @@
<string name="day">Дзень</string>
<string name="empty_stats_text">Статыстыка за абраны перыяд адсутнічае</string>
<string name="pages_read_s">Прачытана старонак: %s</string>
<string name="automatic">Аўтаматычна</string>
<string name="automatic">Аўтаматычны</string>
<string name="three_months">Тры месяцы</string>
<string name="clear_stats_confirm">Вы сапраўды хочаце ачысціць усю статыстыку чытання? Гэта дзеянне нельга адмяніць.</string>
<string name="preferred_download_format">Пераважны фармат для загрузак</string>
@@ -631,4 +631,6 @@
<string name="order_oldest">Самы стары</string>
<string name="unread">Непрачытаная</string>
<string name="delete_read_chapters_auto">Аўтаматычна выдаляць прачытаныя раздзелы</string>
</resources>
<string name="enable_source">Ўключыць крыніцу</string>
<string name="unsupported_source">Гэтая крыніца мангі не падтрымліваецца</string>
</resources>

View File

@@ -273,7 +273,7 @@
<string name="exclude_nsfw_from_history_summary">Als NSFW markierte Manga werden nicht in den Verlauf aufgenommen und Ihr Fortschritt wird nicht gespeichert</string>
<string name="data_deletion">Datenlöschung</string>
<string name="invalid_domain_message">Ungültige Domain</string>
<string name="status_reading">Lese</string>
<string name="status_reading">Lesen</string>
<string name="select_range">Bereich auswählen</string>
<string name="not_found_404">Inhalt nicht gefunden oder entfernt</string>
<string name="manga_error_description_pattern">Fehlerdetails:&lt;br&gt;&lt;tt&gt;%1$s&lt;/tt&gt;&lt;br&gt;&lt;br&gt;1. Versuche, &lt;a href=%2$s&gt;den Manga in einem Webbrowser zu öffnen&lt;/a&gt;, um sicherzustellen, dass er bei seiner Quelle verfügbar ist&lt;br&gt;2. Stelle sicher, dass du die &lt;a href=kotatsu://about&gt;neueste Kotatsu-Version&lt;/a&gt;&lt;br&gt;3 benutzt. Wenn er verfügbar ist, sende einen Fehlerbericht an die Entwickler.</string>
@@ -338,7 +338,7 @@
<string name="different_languages">Verschiedene Sprachen</string>
<string name="network_unavailable">Netzwerk ist nicht verfügbar</string>
<string name="reader_control_ltr">Ergonomische Lesekontrolle</string>
<string name="reader_control_ltr_summary">Tippe auf den rechten Rand oder drücke die rechte Taste, um immer zur nächsten Seite zu wechseln</string>
<string name="reader_control_ltr_summary">Tippe auf den rechten Rand oder drücke die rechte Taste, um immer zur nächsten Seite zu wechseln.</string>
<string name="reader_slider">Zeige Seitenwechsel-Schieber</string>
<string name="source_disabled">Quelle deaktiviert</string>
<string name="prefetch_content">Inhalte vorladen</string>
@@ -358,7 +358,7 @@
<string name="nothing_here">Hier ist nichts</string>
<string name="services">Dienste</string>
<string name="theme_name_kanade">Kanade</string>
<string name="scrobbling_empty_hint">Um deinen Lesefortschritt nachzuverfolgen, wähle Menü → Lesefortschritt aufzeichnen auf dem Manga Details Bildschirm.</string>
<string name="scrobbling_empty_hint">Um deinen Lesefortschritt zu tracken, wähle Menü → Lesefortschritt tracken auf dem Manga Details Bildschirm.</string>
<string name="find_similar">Ähnliche finden</string>
<string name="theme_name_sakura">Sakura</string>
<string name="allow_unstable_updates_summary">Benachrichtigungen über instabile Versionen erhalten</string>
@@ -383,7 +383,7 @@
<string name="sync_host_description">Du kannst einen Standard- oder einen selbst gehosteten Synchronisations-Server verwenden. Ändere diese Einstellungen nicht, wenn du dich nicht auskennst.</string>
<string name="ignore_ssl_errors">Ignoriere SSL Errors</string>
<string name="mirror_switching_summary">Automatischer Domain-Wechsel für Manga-Quellen, falls Spiegelserver verfügbar sind</string>
<string name="status_re_reading">Lese erneut</string>
<string name="status_re_reading">Erneut Lesen</string>
<string name="sync_auth_hint">Du kannst dich mit einem bestehenden Account anmelden oder einen neuen erstellen</string>
<string name="user_agent">UserAgent-Kopfzeile</string>
<string name="enable">Aktivieren</string>
@@ -458,7 +458,7 @@
<string name="view_list">Liste ansehen</string>
<string name="show">Anzeigen</string>
<string name="images_procy_description">Wenn möglich bitte den Dienst wsrv.nl nutzen, um den Datenverkehr zu reduzieren und das Laden von Bildern zu beschleunigen</string>
<string name="clear_network_cache">Netzwerkcache löschen</string>
<string name="clear_network_cache">Netzwerk-Cache löschen</string>
<string name="captcha_required_summary">%s erfordert ein Captcha, das gelöst werden muss, um richtig zu funktionieren</string>
<string name="languages">Sprachen</string>
<string name="unknown">Unbekannt</string>
@@ -549,7 +549,7 @@
\n
\nAchtung: Der aktuelle Lesefortschritt geht verloren.</string>
<string name="main_screen_sections">Hauptbildschirm - Abschnitte</string>
<string name="disable_nsfw_summary">Deaktiviere NSFW - Quellen und verberge Erwachsenen-Manga von der Liste, wenn möglich</string>
<string name="disable_nsfw_summary">Deaktiviere NSFW-Quellen und verstecke 18+ Manga aus der Liste, wenn möglich</string>
<string name="disable_battery_optimization_summary_downloads">Könnte dir damit helfen, den Download zu starten, wenn du Probleme damit hast</string>
<string name="state_abandoned">Verworfen</string>
<string name="enhanced_colors_summary">Reduziert das Banding (harte Farbverläufe), kann aber die Leistung beeinträchtigen</string>
@@ -585,7 +585,7 @@
<string name="show_labels_in_navbar">Beschriftungen in der Navigationsleiste anzeigen</string>
<string name="pages_saving">Seiten werden gespeichert</string>
<string name="ask_for_dest_dir_every_time">Jedes Mal nach dem Zielverzeichnis fragen</string>
<string name="default_page_save_dir">Standard-Seitenspeicherordner</string>
<string name="default_page_save_dir">Standard Speicherordner für Seiten</string>
<string name="remove_from_history">Aus der Historie entfernen</string>
<string name="preferred_download_format">Bevorzugtes Download-Format</string>
<string name="fullscreen_mode">Vollbildmodus</string>
@@ -596,5 +596,41 @@
<string name="check_for_new_chapters_disabled">Die Überprüfung auf neue Kapitel ist deaktiviert</string>
<string name="reading_time_estimation">Geschätzte Lesezeit anzeigen</string>
<string name="reading_time_estimation_summary">Die geschätzte Zeitangabe kann ungenau sein</string>
<string name="location">Ort</string>
<string name="location">Speicherort</string>
<string name="default_webtoon_zoom_out">Standard Zoom Out für Webtoons</string>
<string name="other_manga">Andere Mangas</string>
<string name="less_than_minute">Weniger als eine Minute</string>
<string name="migration_completed">Migrierung abgeschlossen</string>
<string name="chapters_grid_view">Rasteransicht</string>
<string name="stats_enabled">Statistiken einschalten</string>
<string name="reading_stats">Lesestatistiken</string>
<string name="statistics">Statistiken</string>
<string name="clear_stats">Statistiken löschen</string>
<string name="stats_cleared">Statistiken gelöscht</string>
<string name="clear_stats_confirm">Willst du wirklich alle Statistiken löschen? Die Prozedur kann nicht rückgängig gemacht werden.</string>
<string name="all_time">Immer</string>
<string name="day">Tag</string>
<string name="alternatives">Alternativen</string>
<string name="migrate">Migrieren</string>
<string name="migrate_confirmation">Manga \"%1$s\" aus \"%2$s\" wird mit \"%3$s\" aus \"%4$s\" in deinem Verlauf und Favoriten (sofern vorhanden) ersetzt</string>
<string name="manga_migration">Manga Migrierung</string>
<string name="delete_read_chapters_auto">Lösche gelesene Kapitel automatisch</string>
<string name="runs_on_app_start">Wird ausgeführt wenn die App gestartet wird</string>
<string name="week">Woche</string>
<string name="month">Monat</string>
<string name="empty_stats_text">Es sind keine Statistiken für die ausgewählte Zeitspanne vorhanden</string>
<string name="three_months">Drei Monate</string>
<string name="pages_read_s">Gelesene Seiten:%s</string>
<string name="split_by_translations">Aufgeteilt nach Übersetzungen</string>
<string name="split_by_translations_summary">Zeige Kapitel mit unterschiedlichen Übersetzungen separiert anstatt in einer Liste</string>
<string name="order_oldest">Älteste</string>
<string name="long_ago_read">vor einer langen Zeit gelesen</string>
<string name="unread">Ungelesen</string>
<string name="delete_read_chapters">Gelesene Kapitel löschen</string>
<string name="no_chapters_deleted">Keine Kapitel wurden gelöscht</string>
<string name="delete_read_chapters_summary">Lösche schon gelesene Kapitel um Speicher freizugeben</string>
<string name="delete_read_chapters_prompt">Die Aktion wird alle als gelesen markierte Kapitel dauerhaft von deinem Speicher löschen. Du kannst sie später neu herunterladen, aber die importierten Kapitel können trotzdem verloren sein</string>
<string name="chapters_deleted_pattern">%1$s entfernt, %2$s gelöscht</string>
<string name="enable_source">Quelle aktivieren</string>
<string name="unsupported_source">Diese Manga-Quelle wird nicht unterstützt</string>
</resources>

View File

@@ -631,4 +631,8 @@
<string name="order_oldest">Más antigua</string>
<string name="long_ago_read">Leído hace mucho tiempo</string>
<string name="unread">Sin leer</string>
</resources>
<string name="enable_source">Activar fuente</string>
<string name="unsupported_source">Esta fuente del manga no es compatible</string>
<string name="show_pages_thumbs">Mostrar miniaturas de las páginas</string>
<string name="show_pages_thumbs_summary">Habilite la pestaña \"Páginas\" en la pantalla de detalles</string>
</resources>

View File

@@ -613,4 +613,26 @@
<string name="month">Buwan</string>
<string name="three_months">Tatlong buwan</string>
<string name="empty_stats_text">Walang mga istatistika para sa napiling panahon</string>
</resources>
<string name="migrate_confirmation">Ang manga \"%1$s\" mula sa \"%2$s\" ay papalitan ng \"%3$s\" mula sa \"%4$s\" sa iyong kasaysayan at mga paborito (kung mayroon)</string>
<string name="delete_read_chapters">Tanggalin ang mga binasang kabanata</string>
<string name="no_chapters_deleted">Walang kabanata ang natanggal</string>
<string name="chapters_deleted_pattern">Natanggal %1$s, nalinisan %2$s</string>
<string name="delete_read_chapters_auto">Awtomatikong tanggalin ang mga nabasang kabanata</string>
<string name="long_ago_read">Matagal nang nabasa</string>
<string name="unread">Di pa nababasa</string>
<string name="chapters_grid_view">View na grid</string>
<string name="alternatives">Alternatibo</string>
<string name="migrate">Lumipat</string>
<string name="manga_migration">Paglilipat ng manga</string>
<string name="migration_completed">Natapos na ang paglilipat</string>
<string name="delete_read_chapters_summary">Tanggalin ang mga kabanata na nabasa mo na mula sa lokal na storage upang magbakante ng espasyo</string>
<string name="delete_read_chapters_prompt">Permanente nitong tatanggalin ang lahat ng kabanata na minarkahan bilang nabasa mula sa iyong lokal na storage. Maaari mong muling i-download ito sa ibang pagkakataon, ngunit ang mga na-import na kabanata ay maaaring mawala nang tuluyan</string>
<string name="runs_on_app_start">Tatakbo kapag nagsimula ang aplikasyon</string>
<string name="split_by_translations">Hatiin ayon sa mga pagsasalin</string>
<string name="split_by_translations_summary">Magpakita ng mga kabanata na may iba\'t ibang pagsasalin nang hiwalay, sa halip na sa isang listahan</string>
<string name="order_oldest">Pinakaluma</string>
<string name="enable_source">Paganahin ang source</string>
<string name="unsupported_source">Ang manga source na ito ay hindi suportado</string>
<string name="show_pages_thumbs">Ipakita ang mga thumbnail ng pahina</string>
<string name="show_pages_thumbs_summary">Paganahin ang tab na \"Mga Pahina\" sa screen ng mga detalye</string>
</resources>

View File

@@ -631,4 +631,8 @@
<string name="order_oldest">सबसे पुराना</string>
<string name="long_ago_read">बहुत पहले पढ़ा था</string>
<string name="unread">अपठित</string>
</resources>
<string name="unsupported_source">यह मंगा स्रोत समर्थित नहीं है</string>
<string name="enable_source">स्रोत सक्षम करें</string>
<string name="show_pages_thumbs_summary">विवरण स्क्रीन पर \"पेज\" टैब सक्षम करें</string>
<string name="show_pages_thumbs">पेज थंबनेल दिखाएँ</string>
</resources>

View File

@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="items">
<item quantity="other">%1$d item</item>
<item quantity="other">%1$d butir</item>
</plurals>
<plurals name="new_chapters">
<item quantity="other">%1$d chapter baru</item>
<item quantity="other">%1$d bab baru</item>
</plurals>
<plurals name="chapters">
<item quantity="other">%1$d chapter</item>
<item quantity="other">%1$d bab</item>
</plurals>
<plurals name="minutes_ago">
<item quantity="other">%1$d menit yang lalu</item>
@@ -19,7 +19,7 @@
<item quantity="other">%1$d hari yang lalu</item>
</plurals>
<plurals name="months_ago">
<item quantity="other">%1$d bulan lalu</item>
<item quantity="other">%1$d bulan yang lalu</item>
</plurals>
<plurals name="hours">
<item quantity="other">%1$d jam</item>

View File

@@ -3,11 +3,11 @@
<string name="local_storage">Penyimpanan lokal</string>
<string name="favourites">Favorit</string>
<string name="history">Riwayat</string>
<string name="error_occurred">Terjadi kesalahan</string>
<string name="network_error">Kesalahan jaringan</string>
<string name="error_occurred">Terjadi galat</string>
<string name="network_error">Galat jaringan</string>
<string name="details">Detail</string>
<string name="grid">Kotak</string>
<string name="list_mode">Gaya list</string>
<string name="grid">Kisi</string>
<string name="list_mode">Mode daftar</string>
<string name="settings">Pengaturan</string>
<string name="remote_sources">Sumber manga</string>
<string name="loading_">Memuat…</string>
@@ -38,7 +38,7 @@
<string name="newest">Terbaru</string>
<string name="by_rating">Nilai</string>
<string name="sort_order">Urutkan</string>
<string name="filter">Saring</string>
<string name="filter">Filter</string>
<string name="theme">Tema</string>
<string name="light">Terang</string>
<string name="dark">Gelap</string>
@@ -56,7 +56,7 @@
<string name="page_saved">Disimpan</string>
<string name="share_image">Bagikan gambar</string>
<string name="_import">Impor</string>
<string name="clear_pages_cache">Bersihkan cache halaman</string>
<string name="clear_pages_cache">Bersihkan singgahan halaman</string>
<string name="text_file_sizes">B|kB|MB|GB|TB</string>
<string name="standard">Standar</string>
<string name="grid_size">Ukuran kisi</string>
@@ -73,7 +73,7 @@
<string name="read_mode">Mode baca</string>
<string name="volume_buttons">Tombol volume</string>
<string name="_continue">Lanjut</string>
<string name="clear_thumbs_cache">Bersihkan cache gambar mini</string>
<string name="clear_thumbs_cache">Bersihkan singgahan gambar mini</string>
<string name="clear_search_history">Bersihkan riwayat pencarian</string>
<string name="search_history_cleared">Dibersihkan</string>
<string name="domain">Domain</string>
@@ -82,7 +82,7 @@
<string name="save_manga">Simpan</string>
<string name="notifications">Pemberitahuan</string>
<string name="enabled_d_of_d" tools:ignore="PluralsCandidate">%1$d dari %2$d diaktifkan</string>
<string name="new_chapters">Chapter baru</string>
<string name="new_chapters">Bab baru</string>
<string name="download">Unduh</string>
<string name="notifications_settings">Pengaturan pemberitahuan</string>
<string name="notification_sound">Suara pemberitahuan</string>
@@ -120,7 +120,7 @@
<string name="data_restored_with_errors">Data berhasil dipulihkan, tapi ada kesalahan</string>
<string name="backup_information">Anda dapat membuat cadangan riwayat dan favorit Anda dan memulihkannya</string>
<string name="just_now">Baru saja</string>
<string name="long_ago">Lama</string>
<string name="long_ago">Lawas</string>
<string name="group">Kelompok</string>
<string name="today">Hari ini</string>
<string name="tap_to_try_again">Ketuk untuk coba lagi</string>
@@ -146,16 +146,16 @@
<string name="auth_not_supported_by">Masuk pada %s tidak didukung</string>
<string name="text_clear_cookies_prompt">Anda akan keluar dari semua sumber</string>
<string name="genres">Genre</string>
<string name="state_finished">Selesai</string>
<string name="state_ongoing">Sedang berlangsung</string>
<string name="system_default">Standar</string>
<string name="state_finished">Tamat</string>
<string name="state_ongoing">Masih lanjut</string>
<string name="system_default">Bawaan</string>
<string name="exclude_nsfw_from_history">Kecualikan komik NSFW dari riwayat</string>
<string name="show_pages_numbers">Nomor halaman</string>
<string name="enabled_sources">Sumber yang digunakan</string>
<string name="available_sources">Sumber yang tersedia</string>
<string name="screenshots_policy">Kebijakan tangkapan layar</string>
<string name="screenshots_allow">Bolehkan</string>
<string name="screenshots_block_nsfw">Blokir pada NSFW</string>
<string name="screenshots_block_nsfw">Blokir NSFW</string>
<string name="screenshots_block_all">Selalu blokir</string>
<string name="suggestions">Saran</string>
<string name="suggestions_enable">Aktifkan saran</string>
@@ -204,7 +204,7 @@
<string name="bookmark_added">Markah ditambahkan</string>
<string name="undo">Urung</string>
<string name="removed_from_history">Dihapus dari riwayat</string>
<string name="default_mode">Mode baca</string>
<string name="default_mode">Mode bawaan</string>
<string name="detect_reader_mode">Otomatis deteksi mode pembaca</string>
<string name="detect_reader_mode_summary">Secara otomatis mendeteksi jika komik itu webtoon</string>
<string name="create_category">Kategori baru</string>
@@ -215,7 +215,7 @@
<string name="clear_updates_feed">Bersihkan aliran pembaruan</string>
<string name="right_to_left">Kanan-ke-kiri</string>
<string name="rotate_screen">Putar layar</string>
<string name="feed_will_update_soon">Pembaruan aliran akan dimulai</string>
<string name="feed_will_update_soon">Pembaruan umpan akan dimulai</string>
<string name="enter_password">Masukkan kata sandi</string>
<string name="protect_application_summary">Tanya kata sandi ketika memulai Kotatsu</string>
<string name="about">Tentang</string>
@@ -244,7 +244,7 @@
<string name="zoom_mode_fit_height">Pas tinggi</string>
<string name="zoom_mode_fit_width">Pas lebar</string>
<string name="reverse">Balik</string>
<string name="queued">Mengantri</string>
<string name="queued">Mengantre</string>
<string name="auth_complete">Resmi</string>
<string name="text_local_holder_secondary">Simpan dari sumber daring atau berkas impor.</string>
<string name="text_shelf_holder_primary">Komik Anda akan ditampilkan di sini</string>
@@ -255,14 +255,14 @@
<string name="status_planned">Direncanakan</string>
<string name="status_completed">Selesai</string>
<string name="canceled">Dibatalkan</string>
<string name="sync_title">Sinkronisasi data Anda</string>
<string name="sync_title">Sinkronkan data Anda</string>
<string name="tracking">Pelacakan</string>
<string name="logout">Keluar</string>
<string name="sync">Sinkronisasi</string>
<string name="send">Kirim</string>
<string name="status_reading">Dibaca</string>
<string name="status_on_hold">Ditunda</string>
<string name="invalid_domain_message">Domain tidak valid</string>
<string name="invalid_domain_message">Domain tak sah</string>
<string name="no_bookmarks_yet">Belum ada markah</string>
<string name="no_bookmarks_summary">Anda bisa membuat markah ketika membaca komik</string>
<string name="bookmarks_removed">Markah dihapus</string>
@@ -271,7 +271,7 @@
<string name="empty">Kosong</string>
<string name="reader_info_bar">Tampilkan bilah informasi di pembaca</string>
<string name="importing_manga">Mengimpor komik</string>
<string name="last_2_hours">Dua jam terakhir</string>
<string name="last_2_hours">2 jam terakhir</string>
<string name="show_all">Tampilkan semua</string>
<string name="history_cleared">Riwayat dihapus</string>
<string name="clear_all_history">Hapus semua riwayat</string>
@@ -282,8 +282,8 @@
<string name="not_found_404">Konten tidak ditemukan atau dihapus</string>
<string name="exit_confirmation_summary">Tekan Kembali dua kali untuk keluar dari aplikasi</string>
<string name="exit_confirmation">Konfirmasi keluar</string>
<string name="pages_cache">Cache halaman</string>
<string name="other_cache">Cache lainnya</string>
<string name="pages_cache">Singgahan halaman</string>
<string name="other_cache">Singgahan lainnya</string>
<string name="storage_usage">Penggunaan penyimpanan</string>
<string name="available">Tersedia</string>
<string name="incognito_mode">Mode penyamaran</string>
@@ -292,12 +292,12 @@
<string name="folder_with_images">Folder dengan gambar</string>
<string name="import_completed_hint">Anda bisa menghapus berkas asli dari penyimpanan untuk menghemat ruang</string>
<string name="feed">Umpan</string>
<string name="manga_error_description_pattern">Rincian error:&lt;tt&gt;%1$s&lt;/tt&gt;&lt;br&gt;&lt;br&gt;1. Coba &lt;a href=%2$s&gt;buka manga di peramban web&lt;/a&gt; untuk memastikan manga tersebut tersedia di sumbernya&lt;/a&gt;2. Pastikan Anda menggunakan &lt;a href= &gt;manga versi terbaru&lt;/a&gt;&lt;br&gt;3. Jika tersedia, kirimkan laporan kesalahan ke pengembang. Pastikan Anda menggunakan &lt;a href=kotatsu://about&gt;versi terbaru Kotatsu&lt;/a&gt;&lt;br&gt;3. Jika tersedia, kirimkan laporan kesalahan ke pengembang.</string>
<string name="manga_error_description_pattern">Rincian galat:&lt;tt&gt;%1$s&lt;/tt&gt;&lt;br&gt;&lt;br&gt;1. Coba &lt;a href=%2$s&gt;buka manga di peramban web&lt;/a&gt; untuk memastikan manga tersebut tersedia di sumbernya&lt;/a&gt;2. Pastikan Anda menggunakan Kotatsu &lt;a href=kotatsu://about&gt;versi terbaru&lt;/a&gt;&lt;br&gt;3. Jika itu tersedia, kirimkan laporan kesalahan ke pengembang.</string>
<string name="brightness">Kecerahan</string>
<string name="contrast">Kontras</string>
<string name="reset">Atur Ulang</string>
<string name="color_correction_hint">Pengaturan warna yang dipilih akan diingat untuk komik ini</string>
<string name="text_unsaved_changes_prompt">Menyimpan atau membuang perubahan yang belum disimpan\?</string>
<string name="text_unsaved_changes_prompt">Simpan atau buang perubahan yang belum disimpan?</string>
<string name="discard">Buang</string>
<string name="use_fingerprint">Gunakan sidik jari jika tersedia</string>
<string name="appwidget_shelf_description">Komik dari favorit Anda</string>
@@ -306,7 +306,7 @@
<string name="account_already_exists">Akun sudah ada</string>
<string name="back">Kembali</string>
<string name="disable_battery_optimization_summary">Membantu pemeriksaan pembaruan di latar belakang</string>
<string name="crash_text">Ada sesuatu yang salah. Mohon untuk mengirim laporan kutu (bug) ke pengembang untuk membantu kami memperbaikinya.</string>
<string name="crash_text">Ada sesuatu yang salah. Mohon untuk mengirim laporan kutu ke pengembang untuk membantu kami memperbaikinya.</string>
<string name="report">Lapor</string>
<string name="exclude_nsfw_from_history_summary">Komik yang ditandai sebagai NSFW tidak akan ditambahkan ke riwayat dan progres Anda tidak akan disimpan</string>
<string name="clear_cookies_summary">Bisa membantu dalam beberapa masalah. Seluruh otorisasi akan menjadi tidak valid</string>
@@ -320,14 +320,14 @@
<string name="no_chapters">Tidak ada bab</string>
<string name="history_shortcuts">Tampilkan pintasan komik baru-baru ini</string>
<string name="history_shortcuts_summary">Buat komik baru-baru ini tersedia dengan menekan panjang pada ikon aplikasi</string>
<string name="select_range">Pilih jangkauan</string>
<string name="select_range">Pilih rentang</string>
<string name="disable_all">Matikan semua</string>
<string name="gestures_only">Hanya gestur</string>
<string name="dns_over_https">DNS over HTTPS</string>
<string name="status_dropped">Istirahat</string>
<string name="status_dropped">Didrop</string>
<string name="theme_name_mamimi">Mamimi</string>
<string name="server_error">Kesalahan sisi server (%1$d). Silakan coba lagi nanti</string>
<string name="compact">kompak</string>
<string name="server_error">Galat sisi server (%1$d). Silakan coba lagi nanti</string>
<string name="compact">Padat</string>
<string name="prefetch_content">Pramuat konten</string>
<string name="memory_usage_pattern">%s - %s</string>
<string name="nothing_here">Tidak ada apapun di sini</string>
@@ -335,7 +335,7 @@
<string name="source_disabled">Sumber dinonaktifkan</string>
<string name="mark_as_current">Tandai sebagai saat ini</string>
<string name="show_suspicious_content">Tampilkan konten yang mencurigakan</string>
<string name="scrobbling_empty_hint">Untuk melacak kemajuan membaca, pilih Menu → Lacak di layar detail komik.</string>
<string name="scrobbling_empty_hint">Untuk melacak progres membaca, pilih Menu → Lacak di layar detail komik.</string>
<string name="services">Layanan</string>
<string name="clear_new_chapters_counters">Juga informasi yang jelas tentang bab baru</string>
<string name="network_unavailable_hint">Nyalakan Wi-Fi atau jaringan seluler untuk membaca komik daring</string>
@@ -346,15 +346,15 @@
<string name="error_no_space_left">Tidak ada ruang tersisa di perangkat</string>
<string name="allow_unstable_updates">Izinkan pembaruan yang tidak stabil</string>
<string name="allow_unstable_updates_summary">Terima pemberitahuan tentang build yang tidak stabil</string>
<string name="download_started">Unduh dimulai</string>
<string name="show_reading_indicators">Tampilkan indikator kemajuan membaca</string>
<string name="download_started">Unduhan dimulai</string>
<string name="show_reading_indicators">Tampilkan indikator progres membaca</string>
<string name="show_reading_indicators_summary">Tampilkan persentase baca dalam riwayat dan favorit</string>
<string name="language">Bahasa</string>
<string name="text_search_holder_secondary">Cobalah untuk memformulasi ulang kueri.</string>
<string name="zoom_mode_keep_start">Tetap di awal</string>
<string name="reader_info_pattern">Bab. %1$d/%2$d Hal. %3$d/%4$d</string>
<string name="reader_info_pattern">Bab %1$d/%2$d Hlm. %3$d/%4$d</string>
<string name="enable_logging">Aktifkan pencatatan</string>
<string name="enable_logging_summary">Rekam beberapa tindakan untuk tujuan debug. Jangan nyalakan jika Anda tidak yakin dengan apa yang Anda lakukan</string>
<string name="enable_logging_summary">Rekam beberapa tindakan untuk tujuan awakutu. Jangan nyalakan jika Anda tidak yakin dengan apa yang Anda lakukan</string>
<string name="theme_name_dynamic">Dinamis</string>
<string name="color_theme">Skema warna</string>
<string name="show_in_grid_view">Perlihatkan dalam tampilan kisi</string>
@@ -368,12 +368,12 @@
<string name="reader_control_ltr">Kontrol pembaca ergonomis</string>
<string name="color_correction">Koreksi warna</string>
<string name="reader_slider">Perlihatkan penggeser peralihan halaman</string>
<string name="webtoon_zoom">Zoom webtoon</string>
<string name="webtoon_zoom">Zum Webtoon</string>
<string name="different_languages">Berbagai bahasa</string>
<string name="network_unavailable">Jaringan tidak tersedia</string>
<string name="got_it">Oke</string>
<string name="sources_reorder_tip">Ketuk dan tahan item untuk menyusun ulang</string>
<string name="comics_archive_import_description">Anda dapat memilih satu atau beberapa file .cbz atau .zip, setiap file akan dikenali sebagai komik terpisah.</string>
<string name="comics_archive_import_description">Anda dapat memilih satu atau beberapa berkas .cbz atau .zip, setiap file akan dikenali sebagai komik terpisah.</string>
<string name="folder_with_images_import_description">Anda dapat memilih direktori yang berisi arsip atau gambar. Setiap arsip (atau subdirektori) akan dikenali sebagai sebuah bab.</string>
<string name="speed">Kecepatan</string>
<string name="restore_backup_description">Impor cadangan data pengguna yang telah dibuat sebelumnya</string>
@@ -386,10 +386,10 @@
<string name="enable">Aktifkan</string>
<string name="no_thanks">Tidak, terima kasih</string>
<string name="sync_settings">Pengaturan sinkronisasi</string>
<string name="sync_host_description">Anda dapat menggunakan server sinkronisasi yang dihosting sendiri atau server default. Jangan ubah ini jika Anda tidak yakin dengan apa yang Anda lakukan.</string>
<string name="ignore_ssl_errors">Abaikan kesalahan SSL</string>
<string name="sync_host_description">Anda dapat menggunakan server sinkronisasi yang dihos sendiri atau server bawaan. Jangan ubah ini jika Anda tidak yakin dengan apa yang Anda lakukan.</string>
<string name="ignore_ssl_errors">Abaikan galat SSL</string>
<string name="mirror_switching">Pilih cermin secara otomatis</string>
<string name="mirror_switching_summary">Alihkan domain secara otomatis ke sumber lain saat terjadi kesalahan (jika alternatif tersedia)</string>
<string name="mirror_switching_summary">Alihkan domain secara otomatis ke sumber lain saat terjadi kesalahan jika alternatif tersedia</string>
<string name="pause">Jeda</string>
<string name="resume">Lanjut</string>
<string name="paused">Dijeda</string>
@@ -399,7 +399,7 @@
<string name="suggestion_manga">Saran: %s</string>
<string name="suggestions_notifications_summary">Terkadang menampilkan notifikasi dengan manga yang disarankan</string>
<string name="more">Lebih</string>
<string name="cancel_all_downloads_confirm">Semua pengunduhan yang aktif akan dibatalkan, data yang sudah terunduh sebagian akan hilang</string>
<string name="cancel_all_downloads_confirm">Semua unduhan aktif akan dibatalkan, data yang sudah terunduh sebagian akan hilang</string>
<string name="remove_completed_downloads_confirm">Riwayat unduhan Anda akan dihapus secara permanen</string>
<string name="text_downloads_list_holder">Anda tidak memiliki unduhan apa pun</string>
<string name="downloads_resumed">Unduhan telah dilanjutkan</string>
@@ -408,12 +408,12 @@
<string name="suggestions_enable_prompt">Apakah Anda ingin menerima saran manga yang dipersonalisasi\?</string>
<string name="translations">Terjemahan</string>
<string name="web_view_unavailable">WebView tidak tersedia: periksa apakah penyedia WebView telah diinstal</string>
<string name="clear_network_cache">Hapus cache jaringan</string>
<string name="clear_network_cache">Hapus singgahan jaringan</string>
<string name="type">Tipe</string>
<string name="address">Alamat</string>
<string name="port">Port</string>
<string name="port">Porta</string>
<string name="proxy">Proksi</string>
<string name="invalid_value_message">Nilai tidak valid</string>
<string name="invalid_value_message">Nilai tidak sah</string>
<string name="manga_branch_title_template">%1$s (%2$s)</string>
<string name="images_procy_description">Gunakan layanan wsrv.nl untuk mengurangi penggunaan lalu lintas dan mempercepat pemuatan gambar jika memungkinkan</string>
<string name="images_proxy_title">Proksi pengoptimalan gambar</string>
@@ -425,13 +425,13 @@
<string name="details_button_tip">Tekan dan tahan tombol Baca untuk melihat opsi lainnya</string>
<string name="data_and_privacy">Data dan privasi</string>
<string name="restore_summary">Pulihkan cadangan yang dibuat sebelumnya</string>
<string name="invalid_port_number">Nomor port tidak valid</string>
<string name="invalid_port_number">Nomor porta tak sah</string>
<string name="network">Jaringan</string>
<string name="show_pages_numbers_summary">Tampilkan nomor halaman di pojok bawah</string>
<string name="webtoon_zoom_summary">Izinkan gerakan zoom in dalam mode webtoon</string>
<string name="reader_info_bar_summary">Tampilkan waktu saat ini dan kemajuan pembacaan di bagian atas layar</string>
<string name="webtoon_zoom_summary">Izinkan gestur zum pada mode webtoon</string>
<string name="reader_info_bar_summary">Tampilkan waktu saat ini dan progres bacaan di bagian atas layar</string>
<string name="pages_animation_summary">Animasikan peralihan halaman</string>
<string name="clear_source_cookies_summary">Hapus cookie hanya untuk domain tertentu. Dalam kebanyakan kasus akan membatalkan otorisasi</string>
<string name="clear_source_cookies_summary">Hapus kuki hanya untuk domain tertentu. Dalam kebanyakan kasus akan membatalkan otorisasi</string>
<string name="download_option_whole_manga">Seluruh manga</string>
<string name="download_option_first_n_chapters">Pertama %s</string>
<string name="download_option_all_unread">Semua bab yang belum dibaca</string>
@@ -470,24 +470,24 @@
<string name="unknown">Tidak diketahui</string>
<string name="in_progress">Dalam progres</string>
<string name="advanced">Lanjutan</string>
<string name="default_section">Bagian default</string>
<string name="default_section">Bagian bawaan</string>
<string name="manga_list">Daftar manga</string>
<string name="error_corrupted_file">Data yang dikembalikan tidak valid atau file rusak</string>
<string name="error_corrupted_file">Data yang dikembalikan tak sah atau berkas rusak</string>
<string name="on_device">Dari perangkat</string>
<string name="items_limit_exceeded">Tidak ada lagi item yang bisa ditambahkan</string>
<string name="directories">Direktori</string>
<string name="main_screen_sections">Bagian layar utama</string>
<string name="to_top">Ke atas</string>
<string name="zoom_in">Perbesar</string>
<string name="frequency_every_day">Setiap Hari</string>
<string name="frequency_every_day">Setiap hari</string>
<string name="categories">Kategori</string>
<string name="frequency_every_2_days">Setiap 2 Hari</string>
<string name="online_variant">Variasi Online</string>
<string name="online_variant">Varian daring</string>
<string name="keep_screen_on">Biarkan Layar Menyala</string>
<string name="zoom_out">Perkecil</string>
<string name="keep_screen_on_summary">Jangan Matikan Layar Saat Membaca Komik</string>
<string name="list_options">Opsi daftar</string>
<string name="reader_zoom_buttons_summary">Apakah menampilkan tombol kontrol zoom di sudut kanan bawah</string>
<string name="reader_zoom_buttons_summary">Apakah menampilkan tombol kontrol zum di sudut kanan bawah</string>
<string name="backup_frequency">Frekuensi pembuatan cadangan</string>
<string name="suggest_new_sources">Sumber baru yang disarankan setelah pembaruan aplikasi</string>
<string name="periodic_backups_enable">Aktifkan pencadangan berkala</string>
@@ -495,10 +495,10 @@
<string name="enhanced_colors_summary">Mengurangi banding, tetapi dapat mempengaruhi kinerja</string>
<string name="frequency_once_per_week">Sekali dalam seminggu</string>
<string name="periodic_backups">Pencadangan berkala</string>
<string name="reader_zoom_buttons">Tampilkan tombol zoom</string>
<string name="reader_zoom_buttons">Tampilkan tombol zum</string>
<string name="frequency_twice_per_month">Dua kali sebulan</string>
<string name="by_relevance">Relevansi</string>
<string name="state_abandoned">Istirahat</string>
<string name="state_abandoned">Ditinggalkan</string>
<string name="frequency_once_per_month">Sebulan sekali</string>
<string name="enhanced_colors">mode warna 32-bit</string>
<string name="speed_value">x%.1f</string>
@@ -523,28 +523,28 @@
<string name="genres_search_hint">Ketik nama genre</string>
<string name="globally">Secara global</string>
<string name="rating_adult">Dewasa</string>
<string name="error_multiple_genres_not_supported">Filter berdasarkan banyak genre sekaligus tidak di dukung berdasarkan sumber manga ini</string>
<string name="error_multiple_genres_not_supported">Filter berdasarkan banyak genre sekaligus tidak didukung berdasarkan sumber manga ini</string>
<string name="this_manga">Manga ini</string>
<string name="lock_screen_rotation">Kunci rotasi layar</string>
<string name="skip">Lewati</string>
<string name="error_search_not_supported">Pencarian tidak didukung untuk sumber komik ini</string>
<string name="state_upcoming">Mendatang</string>
<string name="color_correction_apply_text">Pengaturan ini dapat diterapkan secara menyeluruh atau hanya pada sumber manga saat ini. Jika diterapkan secara menyeluruh, pengaturan pada suatu sumber manga tidak akan di ubah / ditimpa.</string>
<string name="color_correction_apply_text">Pengaturan ini dapat diterapkan secara menyeluruh atau hanya pada manga saat ini. Jika diterapkan secara menyeluruh, pengaturan pada manga tidak akan ditimpa.</string>
<string name="source_enabled">Sumber yang diaktifkan</string>
<string name="disable_nsfw_summary">Matikan sumber NSFW and sembunyikan komik dewasa dari daftar jika memungkinkan</string>
<string name="content_rating">Peringkat konten</string>
<string name="backup_date_">Tanggal dicadangkan %s</string>
<string name="available_d">Tersedia:%1$d</string>
<string name="state">Status</string>
<string name="state_paused">Di jeda</string>
<string name="state_paused">Dijeda</string>
<string name="content_type_other">Lainnya</string>
<string name="sync_auth">Masuk untuk sinkronisasi akun</string>
<string name="sync_auth">Masuk untuk sinkronkan akun</string>
<string name="source_summary_pattern">%1$s, %2$s</string>
<string name="downloads_settings_info">Anda dapat mengaktifkan perlambatan pengunduhan untuk setiap sumber manga satu per satu di pengaturan sumber, jika Anda mengalami masalah dengan pemblokiran sisi server</string>
<string name="default_tab">Tab bawaan</string>
<string name="category_hidden_done">Kategori ini telah disembunyikan dari tampilan utama dan dapat di akses melalui Menu -&gt; Manage categoties</string>
<string name="grayscale">Skala abuabu</string>
<string name="manual">Dilakukan sendiri</string>
<string name="grayscale">Skala abu-abu</string>
<string name="manual">Manual</string>
<string name="no_manga_sources_catalog_text">Tidak ada sumber yang tersedia di bagian ini, atau semuanya mungkin sudah ditambahkan.
\nPantau terus</string>
<string name="mark_as_completed">Tandai telah selesai</string>
@@ -557,7 +557,7 @@
<string name="by_name_reverse">Nama terbalik</string>
<string name="volume_">Volume%d</string>
<string name="volume_unknown">Volume tidak diketahui</string>
<string name="approximate_reading_time">Perkiraan waktu pembacaan</string>
<string name="approximate_reading_time">Perkiraan waktu baca</string>
<string name="incognito_mode_hint">Progres membaca Anda tidak akan tersimpan</string>
<string name="rating_suggestive">Disarankan</string>
<string name="vertical">Vertikal</string>
@@ -566,19 +566,43 @@
<string name="approximate_remaining_time">Perkiraan waktu yang tersisa</string>
<string name="remaining_time_pattern">%1$s%2$s</string>
<string name="toggle_ui">Tampilkan/Sembunyikan UI</string>
<string name="prev_chapter">Chapter sebelumnya</string>
<string name="prev_chapter">Bab sebelumnya</string>
<string name="switch_pages_volume_buttons">Aktifkan tombol volume</string>
<string name="reader_actions_summary">Konfigurasikan tindakan untuk area layar yang dapat diketuk</string>
<string name="tap_action">Tindakan saat diketuk</string>
<string name="reader_actions">Tindakan saat membaca</string>
<string name="long_tap_action">Tindakan saat diketuk lama</string>
<string name="none">Tidak ada</string>
<string name="next_chapter">Chapter selanjutnya</string>
<string name="next_chapter">Bab selanjutnya</string>
<string name="prev_page">Halaman sebelumnya</string>
<string name="next_page">Halaman selanjutnya</string>
<string name="switch_pages_volume_buttons_summary">Gunakan tombol volume untuk berpindah halaman</string>
<string name="show_menu">Tampilkan menu</string>
<string name="config_reset_confirm">Kembalikan pengaturan ke bawaan? Tindakan ini tidak bisa dibatalkan.</string>
<string name="use_two_pages_landscape">Gunakan tata letak dua halaman pada orientasi landscape (beta)</string>
<string name="email_password_enter_hint">Masukkan email dan sandi untuk melanjutkan</string>
</resources>
<string name="use_two_pages_landscape">Gunakan tata letak dua halaman pada orientasi lanskap (beta)</string>
<string name="email_password_enter_hint">Masukkan surel dan kata sandi untuk melanjutkan</string>
<string name="reading_time_estimation_summary">Perkiraan waktu mungkin tidak akurat</string>
<string name="suggestions_unavailable_text">Fitur saran dinonaktifkan</string>
<string name="check_for_new_chapters_disabled">Memeriksa bab baru dinonaktifkan</string>
<string name="show_labels_in_navbar">Tampilkan label di bilah navigasi</string>
<string name="pages_saving">Menyimpan halaman</string>
<string name="location">Lokasi</string>
<string name="remove_from_history">Hapus dari riwayat</string>
<string name="less_than_minute">Kurang dari semenit</string>
<string name="statistics">Statistik</string>
<string name="chapters_grid_view">Tampilan kisi</string>
<string name="reading_time_estimation">Tampilkan perkiraan waktu membaca</string>
<string name="ask_for_dest_dir_every_time">Tanya terus direktori tujuan</string>
<string name="month">Bulan</string>
<string name="day">Hari</string>
<string name="three_months">Tiga bulan</string>
<string name="alternatives">Alternatif</string>
<string name="all_time">Sepanjang waktu</string>
<string name="stats_cleared">Statistik dibersihkan</string>
<string name="stats_enabled">Aktifkan statistik</string>
<string name="clear_stats_confirm">Apakah Anda benar-benar ingin menghapus semua statistik membaca? Tindakan ini tidak bisa dikembalikan.</string>
<string name="week">Pekan</string>
<string name="fullscreen_mode">Mode layar penuh</string>
<string name="reader_fullscreen_summary">Sembunyikan status sistem dan bilah navigasi</string>
<string name="automatic">Otomatis</string>
</resources>

View File

@@ -623,4 +623,14 @@
<string name="no_chapters_deleted">Żadne rozdziały nie zostały usunięte</string>
<string name="chapters_deleted_pattern">Usunięto %1$s, wyczyszczono %2$s</string>
<string name="delete_read_chapters_prompt">Spowoduje to trwałe usunięcie wszystkich rozdziałów oznaczonych jako przeczytane z pamięci lokalnej. Możesz je pobrać ponownie później, ale zaimportowane rozdziały mogą zostać utracone na zawsze</string>
<string name="chapters_grid_view">Widok siatki</string>
<string name="delete_read_chapters_auto">Automatyczne usuwanie przeczytanych rozdziałów</string>
<string name="runs_on_app_start">Wykonaj podczas uruchamiania aplikacji</string>
<string name="split_by_translations">Podziel według tłumaczeń</string>
<string name="split_by_translations_summary">Wyświetlaj rozdziały z różnymi tłumaczeniami osobno, a nie razem w jednej liście</string>
<string name="order_oldest">Najstarszy</string>
<string name="long_ago_read">Przeczytane dawno temu</string>
<string name="unread">Nieprzeczytany</string>
<string name="enable_source">Włącz źródło</string>
<string name="unsupported_source">To źródło mangi nie jest obsługiwane</string>
</resources>

View File

@@ -408,7 +408,7 @@
<string name="suggestions_enable_prompt">Хотите ли Вы получать персонализированные рекомендации манги\?</string>
<string name="translations">Переводы</string>
<string name="web_view_unavailable">WebView недоступен: проверьте, установлен ли провайдер WebView</string>
<string name="clear_network_cache">Очистить сетевой кеш</string>
<string name="clear_network_cache">Очистить сетевой кэш</string>
<string name="address">Адрес</string>
<string name="type">Тип</string>
<string name="proxy">Прокси</string>
@@ -594,7 +594,7 @@
<string name="show_labels_in_navbar">Показывать подписи на панели навигации</string>
<string name="default_page_save_dir">Папка для сохранений по умолчанию</string>
<string name="location">Расположение</string>
<string name="automatic">Автоматически</string>
<string name="automatic">Автоматический</string>
<string name="single_cbz_file">Один файл CBZ</string>
<string name="multiple_cbz_files">Несколько файлов CBZ</string>
<string name="preferred_download_format">Предпочтительный формат загрузок</string>
@@ -631,4 +631,6 @@
<string name="split_by_translations_summary">Показывать главы с разными переводами отдельно, а не одним списком</string>
<string name="order_oldest">Самые старые</string>
<string name="delete_read_chapters_prompt">Это приведёт к безвозвратному удалению всех глав, помеченных как прочитанные, из вашего локального хранилища. Вы можете повторно загрузить их позже, но импортированные главы могут быть потеряны навсегда</string>
</resources>
<string name="enable_source">Включить источник</string>
<string name="unsupported_source">Этот источник манги не поддерживается</string>
</resources>

View File

@@ -618,4 +618,19 @@
<string name="alternatives">Замене</string>
<string name="migrate">Премести</string>
<string name="migrate_confirmation">Манга „%1$s“ из „%2$s“ ће бити замењена са „%3$s“ из „%4$s“ у вашој Историји и Омиљеним (ако постоји)</string>
<string name="delete_read_chapters_summary">Избриши поглавља која си већ прочитао из локалне меморије да би ослободио простор</string>
<string name="delete_read_chapters_prompt">Ово ће трајно избрисати сва поглавља означена као прочитана из твог локалног складишта. Можеш их поново преузети касније, али увезена поглавља могу бити изгубљена заувек</string>
<string name="long_ago_read">Давно прочитано</string>
<string name="unread">Непрочитано</string>
<string name="chapters_grid_view">Мрежни приказ</string>
<string name="delete_read_chapters">Избриши прочитана поглавља</string>
<string name="no_chapters_deleted">Ниједно поглавље није избрисано</string>
<string name="chapters_deleted_pattern">Уклоњено %1$s, избрисано %2$s</string>
<string name="delete_read_chapters_auto">Аутоматски избриши прочитана поглавља</string>
<string name="runs_on_app_start">Ради када се апликација покрене</string>
<string name="split_by_translations">Подели по преводима</string>
<string name="split_by_translations_summary">Прикажи поглавља са различитим преводима одвојено, а не на једној листи</string>
<string name="order_oldest">Најстарије</string>
<string name="enable_source">Омогући извор</string>
<string name="unsupported_source">Овај извор манге није подржан</string>
</resources>

View File

@@ -631,4 +631,8 @@
<string name="order_oldest">En eski</string>
<string name="long_ago_read">Uzun zaman önce okundu</string>
<string name="unread">Okunmadı</string>
</resources>
<string name="unsupported_source">Bu manga kaynağı desteklenmiyor</string>
<string name="enable_source">Kaynağı etkinleştir</string>
<string name="show_pages_thumbs_summary">Ayrıntılar ekranında \"Sayfalar\" sekmesini etkinleştir</string>
<string name="show_pages_thumbs">Sayfa küçük resimlerini göster</string>
</resources>

View File

@@ -594,7 +594,7 @@
<string name="show_labels_in_navbar">Показувати мітки на панелі навігації</string>
<string name="default_page_save_dir">Директорія збереження сторінки за замовчуванням</string>
<string name="location">Розташування</string>
<string name="automatic">Автоматично</string>
<string name="automatic">Автоматичний</string>
<string name="multiple_cbz_files">Декілька файлів CBZ</string>
<string name="preferred_download_format">Бажаний формат для завантажень</string>
<string name="single_cbz_file">Один файл CBZ</string>
@@ -631,4 +631,6 @@
<string name="runs_on_app_start">Запускається під час запуску застосунка</string>
<string name="delete_read_chapters_auto">Автоматично видаляти прочитані розділи</string>
<string name="delete_read_chapters_prompt">Це призведе до остаточного видалення всіх розділів, позначених як прочитані, з вашого локального сховища. Ви можете завантажити їх пізніше, але імпортовані розділи можуть бути втрачені назавжди</string>
</resources>
<string name="enable_source">Увімкнути джерело</string>
<string name="unsupported_source">Це джерело манги не підтримується</string>
</resources>

View File

@@ -12,7 +12,7 @@
<string name="processing_">正在处理…</string>
<string name="newest">最新</string>
<string name="by_rating">评分</string>
<string name="cookies_cleared">已清除所有 Cookies</string>
<string name="cookies_cleared">Cookies 已清除</string>
<string name="data_restored_success">数据已全部恢复</string>
<string name="silent">无声</string>
<string name="preparing_">准备中…</string>
@@ -202,7 +202,7 @@
<string name="state_finished">已完结</string>
<string name="system_default">默认</string>
<string name="exclude_nsfw_from_history">屏蔽成人漫画阅读记录</string>
<string name="show_pages_numbers">页码</string>
<string name="show_pages_numbers">显示页码</string>
<string name="enabled_sources">已用图源</string>
<string name="available_sources">可用图源</string>
<string name="screenshots_policy">阅读时截图限制</string>
@@ -213,7 +213,7 @@
<string name="suggestions_enable">开启漫画推荐</string>
<string name="text_suggestion_holder">开始阅读漫画,即可获取个性化推荐</string>
<string name="exclude_nsfw_from_suggestions">禁止推荐成人漫画</string>
<string name="enabled"></string>
<string name="enabled"></string>
<string name="disabled">关闭</string>
<string name="filter_load_error">无法加载分类列表</string>
<string name="reset_filter">重置筛选</string>
@@ -228,7 +228,7 @@
<string name="text_delete_local_manga_batch">确定从设备中永久删除所选漫画?</string>
<string name="removal_completed">删除成功</string>
<string name="download_slowdown">限速下载</string>
<string name="download_slowdown_summary">有助于避免封禁你的IP地址</string>
<string name="download_slowdown_summary">帮助避免封禁你的IP地址</string>
<string name="local_manga_processing">正在处理已保存漫画</string>
<string name="chapters_will_removed_background">下载章节将在后台进行删除</string>
<string name="hide">隐藏</string>
@@ -250,7 +250,7 @@
<string name="detect_reader_mode">自动检测条漫模式</string>
<string name="detect_reader_mode_summary">阅读条漫时自动应用条漫阅读模式</string>
<string name="disable_battery_optimization">关闭电池优化</string>
<string name="disable_battery_optimization_summary">有助于检查更新的后台运行</string>
<string name="disable_battery_optimization_summary">帮助保持检查更新的后台运行</string>
<string name="crash_text">出错了,请向开发人员提交错误报告以帮助修复问题。</string>
<string name="send">发送</string>
<string name="disable_all">全部关闭</string>
@@ -268,8 +268,8 @@
<string name="show_reading_indicators_summary">在历史和收藏中显示阅读百分比</string>
<string name="show_reading_indicators">显示阅读进度</string>
<string name="data_deletion">数据删除</string>
<string name="exclude_nsfw_from_history_summary">标记为含有成人内容的漫画将不会记录阅读历史及阅读进度</string>
<string name="clear_cookies_summary">帮助稍微解决部分问题,所有网站的授权将会失效</string>
<string name="exclude_nsfw_from_history_summary">标记为含有成人内容的漫画将不会记录阅读历史及阅读进度</string>
<string name="clear_cookies_summary">帮助解决部分问题,所有网站的授权将会失效</string>
<string name="show_all">显示全部</string>
<string name="manga_error_description_pattern">错误详情:&lt;br&gt;&lt;tt&gt;%1$s&lt;/tt&gt;&lt;br&gt;&lt;br&gt;1.尝试&lt;a href=%2$s&gt;在浏览器中打开漫画&lt;/a&gt;确保漫画在图源中正常显示&lt;br&gt;2.确认正在使用的是&lt;a href=kotatsu://about&gt;最新版本的Kotatsu&lt;/a&gt;&lt;br&gt;3.若已排除以上问题,请向开发人员发送错误报告。</string>
<string name="invalid_domain_message">无效域名</string>
@@ -375,7 +375,7 @@
<string name="got_it">知道了</string>
<string name="speed">速度</string>
<string name="restore_backup_description">导入先前创建的用户数据备份</string>
<string name="show_on_shelf">在书架显示</string>
<string name="show_on_shelf">在书架显示</string>
<string name="comics_archive_import_description">可选择一个或多个 CBZ 或 ZIP 文件,每个文件都将识别为一个单独的漫画。</string>
<string name="folder_with_images_import_description">可选择一个包含压缩包或图片的文件夹,每个压缩包 (或子文件夹) 都会被识别为一个章节。</string>
<string name="find_similar">搜索相似漫画</string>
@@ -389,13 +389,13 @@
<string name="remove_completed">清除已完成任务</string>
<string name="cancel_all">取消所有下载中的任务</string>
<string name="downloads_wifi_only">仅在连接 Wi-Fi 时下载</string>
<string name="enable"></string>
<string name="enable"></string>
<string name="no_thanks">不了谢谢</string>
<string name="sync_settings">同步设定</string>
<string name="server_address">服务器地址</string>
<string name="pause">暂停</string>
<string name="resume">继续</string>
<string name="ignore_ssl_errors">忽略 SSL 错误</string>
<string name="ignore_ssl_errors">忽略 SSL 证书错误</string>
<string name="text_downloads_list_holder">暂无下载任务</string>
<string name="downloads_resumed">下载已继续</string>
<string name="downloads_paused">下载已暂停</string>
@@ -458,10 +458,10 @@
<string name="data_not_restored_text">备份文件不正确</string>
<string name="unknown">未知</string>
<string name="in_progress">进行中</string>
<string name="items_limit_exceeded">没有可添加项目</string>
<string name="items_limit_exceeded">已达项目添加上限</string>
<string name="data_not_restored">数据恢复失败</string>
<string name="directories">目录</string>
<string name="manage_categories">管理分类</string>
<string name="manage_categories">分类管理</string>
<string name="color_light">浅色</string>
<string name="search_hint">输入漫画标题、分类或图源名称</string>
<string name="main_screen_sections">主页底部导航栏</string>
@@ -555,7 +555,7 @@
<string name="mark_as_completed_prompt">确定将选定漫画标记为已读?
\n
\n警告 当前的阅读进度将会丢失。</string>
<string name="category_hidden_done">此分类已从主页隐藏,可通过菜单 → 管理分类来访问</string>
<string name="category_hidden_done">此分类已从主页隐藏,可通过菜单 → 收藏分类管理来访问</string>
<string name="approximate_reading_time">估计所需阅读时间</string>
<string name="approximate_remaining_time">估计剩余阅读时间</string>
<string name="remaining_time_pattern">%1$s %2$s</string>
@@ -588,7 +588,7 @@
<string name="check_for_new_chapters_disabled">漫画更新功能已被关闭</string>
<string name="reading_time_estimation">在漫画详情页显示估计阅读时间</string>
<string name="reading_time_estimation_summary">估计阅读时间可能会不准确</string>
<string name="show_labels_in_navbar">显示底部导航栏名称</string>
<string name="show_labels_in_navbar">显示底部导航栏标签名称</string>
<string name="ask_for_dest_dir_every_time">保存图片时总是询问保存目录</string>
<string name="pages_saving">图片保存</string>
<string name="default_page_save_dir">图片默认保存目录</string>
@@ -602,7 +602,7 @@
<string name="reading_stats">阅读统计</string>
<string name="other_manga">其他漫画</string>
<string name="less_than_minute">不到1分钟</string>
<string name="statistics">统计</string>
<string name="statistics">阅读统计</string>
<string name="month"></string>
<string name="clear_stats_confirm">确定清除所有统计记录?清除后无法恢复。</string>
<string name="pages_read_s">已读页数: %s</string>
@@ -615,20 +615,22 @@
<string name="empty_stats_text">选择的时间段没有阅读统计记录</string>
<string name="migrate">换源</string>
<string name="delete_read_chapters">删除已读章节</string>
<string name="no_chapters_deleted">尚未删除章节</string>
<string name="chapters_deleted_pattern">已删除 %1$s, 清除了 %2$s</string>
<string name="no_chapters_deleted">没有章节可供删除</string>
<string name="chapters_deleted_pattern">已删除 %1$s, 释放了 %2$s 的存储空间</string>
<string name="delete_read_chapters_summary">从本地设备中删除已读章节来释放存储空间</string>
<string name="alternatives">其他版本</string>
<string name="manga_migration">漫画换源</string>
<string name="alternatives">漫画换源</string>
<string name="manga_migration">即将换源</string>
<string name="migration_completed">换源完成</string>
<string name="chapters_grid_view">网格视图</string>
<string name="delete_read_chapters_prompt">将会删除所有在本地设备内标记为已读的章节可之后再重新下载,但已导入的章节将永久丢失</string>
<string name="chapters_grid_view">切换为网格视图</string>
<string name="delete_read_chapters_prompt">将会删除所有储存在本地并被标记为已读的章节可之后再重新下载,但已导入的章节将永久丢失</string>
<string name="delete_read_chapters_auto">自动删除已读章节</string>
<string name="runs_on_app_start">启应用时运行</string>
<string name="migrate_confirmation">\"%2$s\" 图源的 \"%1$s\" 漫画将会在你的历史记录和收藏中替换 \"%4$s\" 图源的 \"%3$s\" 漫画(若资源存在)</string>
<string name="runs_on_app_start">应用时开始删除</string>
<string name="migrate_confirmation">将会把历史记录和收藏中 \"%2$s\" 图源的 \"%1$s\" 替换 \"%4$s\" 图源的 \"%3$s\"(若资源存在)</string>
<string name="unread">未读</string>
<string name="order_oldest">最旧</string>
<string name="long_ago_read">很久以前阅读</string>
<string name="split_by_translations">翻译版本分开显示</string>
<string name="split_by_translations_summary">分开显示不同的翻译版本,而不是只合并成一个列表</string>
<string name="split_by_translations_summary">分开显示不同的翻译版本,而合并成一个列表</string>
<string name="enable_source">开启图源</string>
<string name="unsupported_source">不支持此漫画图源</string>
</resources>

View File

@@ -638,4 +638,7 @@
<string name="unread">Unread</string>
<string name="enable_source">Enable source</string>
<string name="unsupported_source">This manga source is not supported</string>
<string name="show_pages_thumbs">Show pages thumbnails</string>
<string name="show_pages_thumbs_summary">Enable the \"Pages\" tab on the details screen</string>
<string name="error_no_data_received">No data was received from server</string>
</resources>

View File

@@ -48,8 +48,15 @@
<PreferenceCategory android:title="@string/details">
<SwitchPreferenceCompat
android:defaultValue="true"
android:key="pages_tab"
android:summary="@string/show_pages_thumbs_summary"
android:title="@string/show_pages_thumbs" />
<ListPreference
android:defaultValue="0"
android:dependency="pages_tab"
android:entries="@array/details_tabs"
android:entryValues="@array/details_tabs_values"
android:key="details_tab"

View File

@@ -4,9 +4,9 @@ buildscript {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:8.3.0'
classpath 'com.android.tools.build:gradle:8.3.1'
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.23'
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.51'
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.51.1'
classpath 'com.google.devtools.ksp:symbol-processing-gradle-plugin:1.9.23-1.0.19'
}
}