Compare commits

..

55 Commits
v4.4 ... v4.4.7

Author SHA1 Message Date
Koitharu
865f335b25 Fix lint errors 2023-03-25 16:26:24 +02:00
Koitharu
6b1e89eda8 Update parsers 2023-03-25 16:04:57 +02:00
Koitharu
0dbaf919e2 Remove pages duplicates #309 2023-03-25 15:48:39 +02:00
Koitharu
7431f46117 Update acra url 2023-03-25 08:59:47 +02:00
Koitharu
48ac417189 Remove referrer field 2023-03-25 08:56:41 +02:00
Koitharu
98453c34a7 Update parsers 2023-03-25 08:47:00 +02:00
FateXBlood
c62e29d995 Translated using Weblate (Nepali)
Currently translated at 14.0% (60 of 426 strings)

Translated using Weblate (Nepali)

Currently translated at 100.0% (8 of 8 strings)

Added translation using Weblate (Nepali)

Added translation using Weblate (Nepali)

Co-authored-by: FateXBlood <zecrofelix@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/plurals/ne/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/ne/
Translation: Kotatsu/Strings
Translation: Kotatsu/plurals
2023-03-25 08:15:52 +02:00
J. Lavoie
4d0bd9538b Translated using Weblate (French)
Currently translated at 100.0% (426 of 426 strings)

Co-authored-by: J. Lavoie <j.lavoie@net-c.ca>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fr/
Translation: Kotatsu/Strings
2023-03-25 08:15:52 +02:00
ssantos
fdb4e5098e Translated using Weblate (Portuguese)
Currently translated at 98.3% (419 of 426 strings)

Translated using Weblate (Portuguese)

Currently translated at 98.3% (419 of 426 strings)

Co-authored-by: ssantos <ssantos@web.de>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/pt/
Translation: Kotatsu/Strings
2023-03-25 08:15:52 +02:00
Макар Разин
758d3c55d4 Translated using Weblate (Belarusian)
Currently translated at 100.0% (426 of 426 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (426 of 426 strings)

Translated using Weblate (Belarusian)

Currently translated at 100.0% (426 of 426 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (8 of 8 strings)

Co-authored-by: Макар Разин <makarrazin14@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/plurals/ru/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/be/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/uk/
Translation: Kotatsu/Strings
Translation: Kotatsu/plurals
2023-03-25 08:15:52 +02:00
GpixeL
f40ff12250 Translated using Weblate (Indonesian)
Currently translated at 96.2% (410 of 426 strings)

Co-authored-by: GpixeL <gamesfire313@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/id/
Translation: Kotatsu/Strings
2023-03-25 08:15:52 +02:00
Koitharu
4f3721beea Update parsers 2023-03-09 07:46:09 +02:00
Макар Разин
346526267e Translated using Weblate (Russian)
Currently translated at 100.0% (8 of 8 strings)

Co-authored-by: Макар Разин <makarrazin14@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/plurals/ru/
Translation: Kotatsu/plurals
2023-03-09 07:36:33 +02:00
Jeffrey
6c82c6e9f5 Translated using Weblate (Korean)
Currently translated at 83.5% (356 of 426 strings)

Co-authored-by: Jeffrey <kjw5608kjw@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/ko/
Translation: Kotatsu/Strings
2023-03-09 07:36:33 +02:00
InfinityDouki56
11dabd7426 Translated using Weblate (Filipino)
Currently translated at 92.0% (392 of 426 strings)

Co-authored-by: InfinityDouki56 <ced.paltep10@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fil/
Translation: Kotatsu/Strings
2023-03-09 07:36:33 +02:00
GpixeL
056a26b55c Translated using Weblate (Indonesian)
Currently translated at 99.7% (425 of 426 strings)

Translated using Weblate (Indonesian)

Currently translated at 98.3% (419 of 426 strings)

Translated using Weblate (Indonesian)

Currently translated at 98.3% (419 of 426 strings)

Co-authored-by: GpixeL <gamesfire313@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/id/
Translation: Kotatsu/Strings
2023-03-09 07:36:33 +02:00
Felipe Nogueira
f1863ddc71 Translated using Weblate (Portuguese (Brazil))
Currently translated at 97.8% (417 of 426 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 97.4% (415 of 426 strings)

Co-authored-by: Felipe Nogueira <contato.fnog@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/pt_BR/
Translation: Kotatsu/Strings
2023-03-09 07:36:33 +02:00
Koitharu
437ae4cdae Add mission import 2023-03-07 19:49:56 +02:00
ViAnh
98f5615d77 Apply suggestions from code review
Co-authored-by: Koitharu <nvasya95@gmail.com>
2023-03-07 19:45:08 +02:00
vianh
44ce3ce66d Move get cache page to background thread 2023-03-07 19:45:08 +02:00
Koitharu
080c2724cd Update parsers 2023-03-05 08:14:10 +02:00
Koitharu
43872ffe01 Upgrade AGP 2023-03-05 08:11:15 +02:00
Koitharu
5cfad9ab8a Reveal services secrets #313 #317 2023-03-05 07:30:47 +02:00
Koitharu
866f9272ef Fix handling sync server errors 2023-03-05 07:14:56 +02:00
Koitharu
f5a6e1e124 Merge remote-tracking branch 'weblate/devel' into devel 2023-03-04 08:45:52 +02:00
Макар Разин
5595bc6971 Translated using Weblate (Russian)
Currently translated at 100.0% (426 of 426 strings)

Co-authored-by: Макар Разин <makarrazin14@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/ru/
Translation: Kotatsu/Strings
2023-03-04 06:41:08 +01:00
Felipe Nogueira
e6ed353211 Translated using Weblate (Portuguese (Brazil))
Currently translated at 97.1% (414 of 426 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 96.0% (409 of 426 strings)

Translated using Weblate (Portuguese)

Currently translated at 94.1% (401 of 426 strings)

Co-authored-by: Felipe Nogueira <contato.fnog@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/pt/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/pt_BR/
Translation: Kotatsu/Strings
2023-03-04 06:41:08 +01:00
Eric
4e10908015 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (426 of 426 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (425 of 425 strings)

Co-authored-by: Eric <hamburger2048@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/zh_Hans/
Translation: Kotatsu/Strings
2023-03-04 06:41:07 +01:00
Oğuz Ersen
087ececfdd Translated using Weblate (Turkish)
Currently translated at 100.0% (426 of 426 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (425 of 425 strings)

Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/tr/
Translation: Kotatsu/Strings
2023-03-04 06:41:07 +01:00
J. Lavoie
c090018acd Translated using Weblate (French)
Currently translated at 100.0% (425 of 425 strings)

Co-authored-by: J. Lavoie <j.lavoie@net-c.ca>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fr/
Translation: Kotatsu/Strings
2023-03-04 06:41:06 +01:00
gallegonovato
5f6256a5c6 Translated using Weblate (Spanish)
Currently translated at 100.0% (426 of 426 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (425 of 425 strings)

Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/es/
Translation: Kotatsu/Strings
2023-03-04 06:41:06 +01:00
Dpper
9e6be12707 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (424 of 424 strings)

Co-authored-by: Dpper <ruslan20020401@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/uk/
Translation: Kotatsu/Strings
2023-03-04 06:41:05 +01:00
Eric
737ca4a916 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (425 of 425 strings)

Co-authored-by: Eric <hamburger2048@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/zh_Hans/
Translation: Kotatsu/Strings
2023-03-04 07:41:04 +02:00
Oğuz Ersen
b2958d03e4 Translated using Weblate (Turkish)
Currently translated at 100.0% (425 of 425 strings)

Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/tr/
Translation: Kotatsu/Strings
2023-03-04 07:41:04 +02:00
J. Lavoie
af8550744f Translated using Weblate (French)
Currently translated at 100.0% (425 of 425 strings)

Co-authored-by: J. Lavoie <j.lavoie@net-c.ca>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fr/
Translation: Kotatsu/Strings
2023-03-04 07:41:04 +02:00
gallegonovato
2f5fd71bb1 Translated using Weblate (Spanish)
Currently translated at 100.0% (425 of 425 strings)

Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/es/
Translation: Kotatsu/Strings
2023-03-04 07:41:04 +02:00
Dpper
271750ad93 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (424 of 424 strings)

Co-authored-by: Dpper <ruslan20020401@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/uk/
Translation: Kotatsu/Strings
2023-03-04 07:41:04 +02:00
Koitharu
0281c09dde Update version 2023-03-04 07:40:43 +02:00
Koitharu
f2ac3c331c Limit favourite category name length 2023-03-03 18:51:58 +02:00
Koitharu
4fc56f9786 Fix detailed list genres scrolling 2023-03-03 07:54:59 +02:00
Koitharu
a13c498d00 Fix ThemeChooserPreference memory leak 2023-03-02 18:42:48 +02:00
Koitharu
e15934bdc6 Option to inore SSL errors 2023-03-02 18:38:11 +02:00
Koitharu
4ec50f83d2 Update parsers 2023-02-25 18:44:31 +02:00
Koitharu
d0b9412559 Revert "Highlight suspicious genres"
This reverts commit 9adf209445.
2023-02-25 17:20:06 +02:00
Koitharu
9adf209445 Highlight suspicious genres 2023-02-25 17:15:07 +02:00
InfinityDouki56
5d2395b569 Translated using Weblate (Filipino)
Currently translated at 92.4% (392 of 424 strings)

Translated using Weblate (Filipino)

Currently translated at 100.0% (8 of 8 strings)

Co-authored-by: InfinityDouki56 <ced.paltep10@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/plurals/fil/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fil/
Translation: Kotatsu/Strings
Translation: Kotatsu/plurals
2023-02-23 19:48:42 +02:00
Koitharu
29114ae8a7 Sync logger 2023-02-22 20:20:57 +02:00
Koitharu
47f80085d1 Temporary disable sync for release builds 2023-02-22 07:56:30 +02:00
Koitharu
73c1d2a616 Show error details for pages 2023-02-21 18:59:52 +02:00
InfinityDouki56
35366ac660 Translated using Weblate (Filipino)
Currently translated at 56.1% (238 of 424 strings)

Translated using Weblate (Filipino)

Currently translated at 0.0% (0 of 8 strings)

Added translation using Weblate (Filipino)

Added translation using Weblate (Filipino)

Co-authored-by: InfinityDouki56 <ced.paltep10@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/plurals/fil/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fil/
Translation: Kotatsu/Strings
Translation: Kotatsu/plurals
2023-02-21 18:32:13 +02:00
J. Lavoie
dc2dd4e3c9 Translated using Weblate (Greek)
Currently translated at 21.6% (92 of 424 strings)

Translated using Weblate (French)

Currently translated at 100.0% (424 of 424 strings)

Translated using Weblate (French)

Currently translated at 98.8% (419 of 424 strings)

Co-authored-by: J. Lavoie <j.lavoie@net-c.ca>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/el/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fr/
Translation: Kotatsu/Strings
2023-02-21 18:32:13 +02:00
Koitharu
66817ae545 Fix search bar hint font 2023-02-17 20:03:57 +02:00
Koitharu
b6e3cb929b Fix explore buttons color 2023-02-17 19:43:38 +02:00
Koitharu
6f29259395 Add "Grid mode" option to explore options menu 2023-02-17 18:58:37 +02:00
Koitharu
c520699f9f Fix crash with invalid domain 2023-02-17 07:39:59 +02:00
78 changed files with 4607 additions and 3490 deletions

View File

@@ -8,15 +8,15 @@ plugins {
android {
compileSdk = 33
buildToolsVersion = '33.0.1'
buildToolsVersion = '33.0.2'
namespace = 'org.koitharu.kotatsu'
defaultConfig {
applicationId 'org.koitharu.kotatsu'
minSdkVersion 21
targetSdkVersion 33
versionCode 516
versionName '4.4'
versionCode 523
versionName '4.4.7'
generatedDensities = []
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
@@ -25,15 +25,6 @@ android {
arg 'room.schemaLocation', "$projectDir/schemas".toString()
}
}
// define this values in your local.properties file
buildConfigField 'String', 'SHIKIMORI_CLIENT_ID', "\"${localProperty('shikimori.clientId')}\""
buildConfigField 'String', 'SHIKIMORI_CLIENT_SECRET', "\"${localProperty('shikimori.clientSecret')}\""
buildConfigField 'String', 'ANILIST_CLIENT_ID', "\"${localProperty('anilist.clientId')}\""
buildConfigField 'String', 'ANILIST_CLIENT_SECRET', "\"${localProperty('anilist.clientSecret')}\""
buildConfigField 'String', 'MAL_CLIENT_ID', "\"${localProperty('mal.clientId')}\""
resValue "string", "acra_login", "${localProperty('acra.login')}"
resValue "string", "acra_password", "${localProperty('acra.password')}"
}
buildTypes {
debug {
@@ -68,7 +59,7 @@ android {
]
}
lint {
abortOnError false
abortOnError true
disable 'MissingTranslation', 'PrivateResource', 'NotifyDataSetChanged'
}
testOptions {
@@ -87,7 +78,8 @@ afterEvaluate {
}
}
dependencies {
implementation('com.github.KotatsuApp:kotatsu-parsers:cf345d2d0c') {
//noinspection GradleDependency
implementation('com.github.KotatsuApp:kotatsu-parsers:a3ffecc00f') {
exclude group: 'org.json', module: 'json'
}
@@ -124,8 +116,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.44.2'
kapt 'com.google.dagger:hilt-compiler:2.44.2'
implementation 'com.google.dagger:hilt-android:2.45'
kapt 'com.google.dagger:hilt-compiler:2.45'
implementation 'androidx.hilt:hilt-work:1.0.0'
kapt 'androidx.hilt:hilt-compiler:1.0.0'
@@ -141,7 +133,7 @@ dependencies {
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.10'
testImplementation 'junit:junit:4.13.2'
testImplementation 'org.json:json:20220924'
testImplementation 'org.json:json:20230227'
testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4'
androidTestImplementation 'androidx.test:runner:1.5.2'
@@ -154,6 +146,6 @@ dependencies {
androidTestImplementation 'androidx.room:room-testing:2.5.0'
androidTestImplementation 'com.squareup.moshi:moshi-kotlin:1.14.0'
androidTestImplementation 'com.google.dagger:hilt-android-testing:2.44.2'
kaptAndroidTest 'com.google.dagger:hilt-android-compiler:2.44.2'
androidTestImplementation 'com.google.dagger:hilt-android-testing:2.45'
kaptAndroidTest 'com.google.dagger:hilt-android-compiler:2.45'
}

View File

@@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<bool name="leak_canary_add_launcher_icon" tools:node="replace">false</bool>
<bool name="is_sync_enabled">true</bool>
</resources>

View File

@@ -96,6 +96,9 @@ interface AppModule {
writeTimeout(20, TimeUnit.SECONDS)
cookieJar(cookieJar)
dns(DoHManager(cache, settings))
if (settings.isSSLBypassEnabled) {
bypassSSLErrors()
}
cache(cache)
addInterceptor(GZipInterceptor())
addInterceptor(commonHeadersInterceptor)

View File

@@ -1,11 +1,15 @@
package org.koitharu.kotatsu.core.exceptions.resolve
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import androidx.activity.result.ActivityResultCallback
import androidx.activity.result.ActivityResultLauncher
import androidx.annotation.StringRes
import androidx.collection.ArrayMap
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlinx.coroutines.suspendCancellableCoroutine
import okhttp3.Headers
import org.koitharu.kotatsu.R
@@ -17,6 +21,7 @@ import org.koitharu.kotatsu.parsers.exception.NotFoundException
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.settings.sources.auth.SourceAuthActivity
import org.koitharu.kotatsu.utils.TaggedActivityResult
import org.koitharu.kotatsu.utils.ext.getDisplayMessage
import org.koitharu.kotatsu.utils.isSuccess
import kotlin.coroutines.Continuation
import kotlin.coroutines.resume
@@ -95,5 +100,21 @@ class ExceptionResolver private constructor(
}
fun canResolve(e: Throwable) = getResolveStringId(e) != 0
fun showDetails(context: Context, e: Throwable) {
val stackTrace = e.stackTraceToString()
val dialog = MaterialAlertDialogBuilder(context)
.setTitle(e.getDisplayMessage(context.resources))
.setMessage(stackTrace)
.setPositiveButton(androidx.preference.R.string.copy) { _, _ ->
val clipboardManager = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
clipboardManager.setPrimaryClip(
ClipData.newPlainText(context.getString(R.string.error), stackTrace),
)
}
.setNegativeButton(R.string.close, null)
.create()
dialog.show()
}
}
}

View File

@@ -68,6 +68,12 @@ class FileLogger(
postFlush()
}
inline fun log(messageProducer: () -> String) {
if (isEnabled) {
log(messageProducer())
}
}
suspend fun flush() {
if (!isEnabled) {
return

View File

@@ -5,3 +5,7 @@ import javax.inject.Qualifier
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class TrackerLogger
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class SyncLogger

View File

@@ -21,11 +21,20 @@ object LoggersModule {
settings: AppSettings,
) = FileLogger(context, settings, "tracker")
@Provides
@SyncLogger
fun provideSyncLogger(
@ApplicationContext context: Context,
settings: AppSettings,
) = FileLogger(context, settings, "sync")
@Provides
@ElementsIntoSet
fun provideAllLoggers(
@TrackerLogger trackerLogger: FileLogger,
@SyncLogger syncLogger: FileLogger,
): Set<@JvmSuppressWildcards FileLogger> = arraySetOf(
trackerLogger,
syncLogger,
)
}

View File

@@ -52,7 +52,6 @@ fun Parcel.readManga() = Manga(
fun MangaPage.writeToParcel(out: Parcel) {
out.writeLong(id)
out.writeString(url)
out.writeString(referer)
out.writeString(preview)
out.writeSerializable(source)
}
@@ -60,7 +59,6 @@ fun MangaPage.writeToParcel(out: Parcel) {
fun Parcel.readMangaPage() = MangaPage(
id = readLong(),
url = requireNotNull(readString()),
referer = requireNotNull(readString()),
preview = readString(),
source = checkNotNull(readSerializableCompat()),
)

View File

@@ -3,6 +3,7 @@ package org.koitharu.kotatsu.core.network
import android.os.Build
import android.util.Log
import dagger.Lazy
import okhttp3.Headers
import okhttp3.Interceptor
import okhttp3.Request
import okhttp3.Response
@@ -11,6 +12,7 @@ import org.koitharu.kotatsu.core.parser.MangaRepository
import org.koitharu.kotatsu.core.parser.RemoteMangaRepository
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.util.mergeWith
import org.koitharu.kotatsu.utils.ext.printStackTraceDebug
import java.util.Locale
import javax.inject.Inject
import javax.inject.Singleton
@@ -39,12 +41,18 @@ class CommonHeadersInterceptor @Inject constructor(
headersBuilder[CommonHeaders.USER_AGENT] = userAgentFallback
}
if (headersBuilder[CommonHeaders.REFERER] == null && repository != null) {
headersBuilder[CommonHeaders.REFERER] = "https://${repository.domain}/"
headersBuilder.trySet(CommonHeaders.REFERER, "https://${repository.domain}/")
}
val newRequest = request.newBuilder().headers(headersBuilder.build()).build()
return repository?.intercept(ProxyChain(chain, newRequest)) ?: chain.proceed(newRequest)
}
private fun Headers.Builder.trySet(name: String, value: String) = try {
set(name, value)
} catch (e: IllegalArgumentException) {
e.printStackTraceDebug()
}
private class ProxyChain(
private val delegate: Interceptor.Chain,
private val request: Request,

View File

@@ -0,0 +1,30 @@
package org.koitharu.kotatsu.core.network
import android.annotation.SuppressLint
import okhttp3.OkHttpClient
import org.koitharu.kotatsu.utils.ext.printStackTraceDebug
import java.security.SecureRandom
import java.security.cert.X509Certificate
import javax.net.ssl.SSLContext
import javax.net.ssl.SSLSocketFactory
import javax.net.ssl.X509TrustManager
@SuppressLint("CustomX509TrustManager")
fun OkHttpClient.Builder.bypassSSLErrors() = also { builder ->
runCatching {
val trustAllCerts = object : X509TrustManager {
override fun checkClientTrusted(chain: Array<X509Certificate>, authType: String) = Unit
override fun checkServerTrusted(chain: Array<X509Certificate>, authType: String) = Unit
override fun getAcceptedIssuers(): Array<X509Certificate> = emptyArray()
}
val sslContext = SSLContext.getInstance("SSL")
sslContext.init(null, arrayOf(trustAllCerts), SecureRandom())
val sslSocketFactory: SSLSocketFactory = sslContext.socketFactory
builder.sslSocketFactory(sslSocketFactory, trustAllCerts)
builder.hostnameVerifier { _, _ -> true }
}.onFailure {
it.printStackTraceDebug()
}
}

View File

@@ -1,5 +1,6 @@
package org.koitharu.kotatsu.core.parser
import android.util.Log
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@@ -9,6 +10,7 @@ import kotlinx.coroutines.currentCoroutineContext
import okhttp3.Headers
import okhttp3.Interceptor
import okhttp3.Response
import org.koitharu.kotatsu.BuildConfig
import org.koitharu.kotatsu.core.cache.ContentCache
import org.koitharu.kotatsu.core.cache.SafeDeferred
import org.koitharu.kotatsu.core.prefs.SourceSettings
@@ -77,7 +79,7 @@ class RemoteMangaRepository(
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
cache.getPages(source, chapter.url)?.let { return it }
val pages = asyncSafe {
parser.getPages(chapter)
parser.getPages(chapter).distinctById()
}
cache.putPages(source, chapter.url, pages)
return pages.await()
@@ -108,4 +110,20 @@ class RemoteMangaRepository(
},
)
}
private fun List<MangaPage>.distinctById(): List<MangaPage> {
if (isEmpty()) {
return emptyList()
}
val result = ArrayList<MangaPage>(size)
val set = HashSet<Long>(size)
for (page in this) {
if (set.add(page.id)) {
result.add(page)
} else if (BuildConfig.DEBUG) {
Log.w(null, "Duplicate page: $page")
}
}
return result
}
}

View File

@@ -255,6 +255,9 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) {
val dnsOverHttps: DoHProvider
get() = prefs.getEnumValue(KEY_DOH, DoHProvider.NONE)
val isSSLBypassEnabled: Boolean
get() = prefs.getBoolean(KEY_SSL_BYPASS, false)
var localListOrder: SortOrder
get() = prefs.getEnumValue(KEY_LOCAL_LIST_ORDER, SortOrder.NEWEST)
set(value) = prefs.edit { putEnumValue(KEY_LOCAL_LIST_ORDER, value) }
@@ -380,6 +383,7 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) {
const val KEY_LOGS_SHARE = "logs_share"
const val KEY_SOURCES_GRID = "sources_grid"
const val KEY_UPDATES_UNSTABLE = "updates_unstable"
const val KEY_SSL_BYPASS = "ssl_bypass"
// About
const val KEY_APP_UPDATE = "app_update"

View File

@@ -23,6 +23,7 @@ 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.Domain -> prefs.getString(key.key, key.defaultValue).ifNullOrEmpty { key.defaultValue }
is ConfigKey.ShowSuspiciousContent -> prefs.getBoolean(key.key, key.defaultValue)
} as T

View File

@@ -117,7 +117,7 @@ class DownloadManager @AssistedInject constructor(
val data = if (manga.chapters.isNullOrEmpty()) repo.getDetails(manga) else manga
output = CbzMangaOutput.get(destination, data)
val coverUrl = data.largeCoverUrl ?: data.coverUrl
downloadFile(coverUrl, data.publicUrl, destination, tempFileName, repo.source).let { file ->
downloadFile(coverUrl, destination, tempFileName, repo.source).let { file ->
output.addCover(file, MimeTypeMap.getFileExtensionFromUrl(coverUrl))
}
val chapters = checkNotNull(
@@ -138,8 +138,8 @@ class DownloadManager @AssistedInject constructor(
for ((pageIndex, page) in pages.withIndex()) {
runFailsafe(outState, pausingHandle) {
val url = repo.getPageUrl(page)
val file = cache[url]
?: downloadFile(url, page.referer, destination, tempFileName, repo.source)
val file = cache.get(url)
?: downloadFile(url, destination, tempFileName, repo.source)
output.addPage(
chapter = chapter,
file = file,
@@ -211,14 +211,12 @@ class DownloadManager @AssistedInject constructor(
private suspend fun downloadFile(
url: String,
referer: String,
destination: File,
tempFileName: String,
source: MangaSource,
): File {
val request = Request.Builder()
.url(url)
.header(CommonHeaders.REFERER, referer)
.tag(MangaSource::class.java, source)
.cacheControl(CommonHeaders.CACHE_CONTROL_DISABLED)
.get()

View File

@@ -36,6 +36,7 @@ import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.search.ui.MangaListActivity
import org.koitharu.kotatsu.settings.SettingsActivity
import org.koitharu.kotatsu.suggestions.ui.SuggestionsActivity
import org.koitharu.kotatsu.utils.ext.addMenuProvider
import org.koitharu.kotatsu.utils.ext.getDisplayMessage
import javax.inject.Inject
@@ -70,6 +71,7 @@ class ExploreFragment :
val spacing = resources.getDimensionPixelOffset(R.dimen.list_spacing)
paddingHorizontal = spacing
}
addMenuProvider(ExploreMenuProvider(view.context, viewModel))
viewModel.content.observe(viewLifecycleOwner) {
exploreAdapter?.items = it
}
@@ -162,6 +164,7 @@ class ExploreFragment :
} else {
LinearLayoutManager(requireContext())
}
activity?.invalidateOptionsMenu()
}
private inner class SourceMenuListener(

View File

@@ -0,0 +1,34 @@
package org.koitharu.kotatsu.explore.ui
import android.content.Context
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import androidx.core.view.MenuProvider
import org.koitharu.kotatsu.R
class ExploreMenuProvider(
private val context: Context,
private val viewModel: ExploreViewModel,
) : MenuProvider {
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
menuInflater.inflate(R.menu.opt_explore, menu)
}
override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
return when (menuItem.itemId) {
R.id.action_grid -> {
viewModel.setGridMode(!menuItem.isChecked)
true
}
else -> false
}
}
override fun onPrepareMenu(menu: Menu) {
super.onPrepareMenu(menu)
menu.findItem(R.id.action_grid)?.isChecked = viewModel.isGrid.value == true
}
}

View File

@@ -69,6 +69,10 @@ class ExploreViewModel @Inject constructor(
}
}
fun setGridMode(value: Boolean) {
settings.isSourcesGridMode = value
}
private fun createContentFlow() = settings.observe()
.filter {
it == AppSettings.KEY_SOURCES_HIDDEN ||

View File

@@ -60,6 +60,9 @@ fun mangaListDetailedItemAD(
lifecycle(lifecycleOwner)
enqueueWith(coil)
}
if (payloads.isEmpty()) {
binding.scrollViewTags.scrollTo(0, 0)
}
binding.chipsTags.setChips(item.tags)
binding.ratingBar.isVisible = item.manga.hasRating
binding.ratingBar.rating = binding.ratingBar.numStars * item.manga.rating

View File

@@ -4,6 +4,7 @@ import android.content.Context
import com.tomclaw.cache.DiskLruCache
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runInterruptible
import kotlinx.coroutines.withContext
import org.koitharu.kotatsu.utils.FileSize
import org.koitharu.kotatsu.utils.ext.copyToSuspending
@@ -30,8 +31,8 @@ class PagesCache @Inject constructor(@ApplicationContext context: Context) {
size = FileSize.MEGABYTES.convert(200, FileSize.BYTES),
)
operator fun get(url: String): File? {
return lruCache.get(url)?.takeIfReadable()
suspend fun get(url: String): File? = runInterruptible(Dispatchers.IO) {
lruCache.get(url)?.takeIfReadable()
}
suspend fun put(url: String, inputStream: InputStream): File = withContext(Dispatchers.IO) {

View File

@@ -118,7 +118,6 @@ class LocalMangaRepository @Inject constructor(private val storageManager: Local
id = entryUri.longHashCode(),
url = entryUri,
preview = null,
referer = chapter.url,
source = MangaSource.LOCAL,
)
}

View File

@@ -327,10 +327,12 @@ class MainActivity :
TrackWorker.setup(applicationContext)
SuggestionsWorker.setup(applicationContext)
}
whenResumed {
MangaPrefetchService.prefetchLast(this@MainActivity)
requestNotificationsPermission()
}
}
}
private fun adjustFabVisibility(
isResumeEnabled: Boolean = viewModel.isResumeEnabled.value == true,

View File

@@ -5,7 +5,6 @@ import android.graphics.BitmapFactory
import android.net.Uri
import androidx.collection.LongSparseArray
import androidx.collection.set
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@@ -13,7 +12,7 @@ import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.async
import kotlinx.coroutines.cancel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
import kotlinx.coroutines.runInterruptible
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
@@ -54,11 +53,11 @@ class PageLoader @Inject constructor(
private val tasks = LongSparseArray<ProgressDeferred<File, Float>>()
private val convertLock = Mutex()
private val prefetchLock = Mutex()
private var repository: MangaRepository? = null
private val prefetchQueue = LinkedList<MangaPage>()
private val counter = AtomicInteger(0)
private var prefetchQueueLimit = PREFETCH_LIMIT_DEFAULT // TODO adaptive
private val emptyProgressFlow: StateFlow<Float> = MutableStateFlow(-1f)
override fun close() {
loaderScope.cancel()
@@ -71,8 +70,8 @@ class PageLoader @Inject constructor(
return repository is RemoteMangaRepository && settings.isPagesPreloadEnabled()
}
fun prefetch(pages: List<ReaderPage>) {
synchronized(prefetchQueue) {
fun prefetch(pages: List<ReaderPage>) = loaderScope.launch {
prefetchLock.withLock {
for (page in pages.asReversed()) {
if (tasks.containsKey(page.id)) {
continue
@@ -89,18 +88,13 @@ class PageLoader @Inject constructor(
}
fun loadPageAsync(page: MangaPage, force: Boolean): ProgressDeferred<File, Float> {
if (!force) {
cache[page.url]?.let {
return getCompletedTask(it)
}
}
var task = tasks[page.id]
if (force) {
task?.cancel()
} else if (task?.isCancelled == false) {
return task
}
task = loadPageAsyncImpl(page)
task = loadPageAsyncImpl(page, force)
synchronized(tasks) {
tasks[page.id] = task
}
@@ -130,23 +124,26 @@ class PageLoader @Inject constructor(
return getRepository(page.source).getPageUrl(page)
}
private fun onIdle() {
synchronized(prefetchQueue) {
private fun onIdle() = loaderScope.launch {
prefetchLock.withLock {
while (prefetchQueue.isNotEmpty()) {
val page = prefetchQueue.pollFirst() ?: return
if (cache[page.url] == null) {
val page = prefetchQueue.pollFirst() ?: return@launch
if (cache.get(page.url) == null) {
synchronized(tasks) {
tasks[page.id] = loadPageAsyncImpl(page)
tasks[page.id] = loadPageAsyncImpl(page, false)
}
return
return@launch
}
}
}
}
private fun loadPageAsyncImpl(page: MangaPage): ProgressDeferred<File, Float> {
private fun loadPageAsyncImpl(page: MangaPage, skipCache: Boolean): ProgressDeferred<File, Float> {
val progress = MutableStateFlow(PROGRESS_UNDEFINED)
val deferred = loaderScope.async {
if (!skipCache) {
cache.get(page.url)?.let { return@async it }
}
counter.incrementAndGet()
try {
loadPageImpl(page, progress)
@@ -188,7 +185,6 @@ class PageLoader @Inject constructor(
val request = Request.Builder()
.url(pageUrl)
.get()
.header(CommonHeaders.REFERER, page.referer)
.header(CommonHeaders.ACCEPT, "image/webp,image/png;q=0.9,image/jpeg,*/*;q=0.8")
.cacheControl(CommonHeaders.CACHE_CONTROL_DISABLED)
.tag(MangaSource::class.java, page.source)
@@ -207,11 +203,6 @@ class PageLoader @Inject constructor(
}
}
private fun getCompletedTask(file: File): ProgressDeferred<File, Float> {
val deferred = CompletableDeferred(file)
return ProgressDeferred(deferred, emptyProgressFlow)
}
private class InternalErrorHandler : AbstractCoroutineContextElement(CoroutineExceptionHandler),
CoroutineExceptionHandler {

View File

@@ -38,7 +38,6 @@ class ColorFilterConfigViewModel @AssistedInject constructor(
preview.value = MangaPage(
id = page.id,
url = url,
referer = page.referer,
preview = page.preview,
source = page.source,
)

View File

@@ -1,5 +1,6 @@
package org.koitharu.kotatsu.reader.ui.pager
import android.content.Context
import android.net.Uri
import androidx.core.net.toUri
import androidx.lifecycle.Observer
@@ -59,6 +60,11 @@ class PageHolderDelegate(
}
}
fun showErrorDetails(context: Context) {
val e = error ?: return
ExceptionResolver.showDetails(context, e)
}
fun onAttachedToWindow() {
readerSettings.observeForever(this)
}
@@ -87,6 +93,7 @@ class PageHolderDelegate(
}
override fun onImageLoadError(e: Throwable) {
e.printStackTraceDebug()
val file = this.file
error = e
if (state == State.LOADED && e is IOException && file != null && file.exists()) {

View File

@@ -9,7 +9,6 @@ import org.koitharu.kotatsu.parsers.model.MangaSource
data class ReaderPage(
val id: Long,
val url: String,
val referer: String,
val preview: String?,
val chapterId: Long,
val index: Int,
@@ -19,7 +18,6 @@ data class ReaderPage(
constructor(page: MangaPage, index: Int, chapterId: Long) : this(
id = page.id,
url = page.url,
referer = page.referer,
preview = page.preview,
chapterId = chapterId,
index = index,
@@ -29,7 +27,6 @@ data class ReaderPage(
fun toMangaPage() = MangaPage(
id = id,
url = url,
referer = referer,
preview = preview,
source = source,
)

View File

@@ -33,8 +33,8 @@ open class PageHolder(
binding.ssiv.bindToLifecycle(owner)
binding.ssiv.isEagerLoadingEnabled = !isLowRamDevice(context)
binding.ssiv.addOnImageEventListener(delegate)
@Suppress("LeakingThis")
bindingInfo.buttonRetry.setOnClickListener(this)
bindingInfo.buttonErrorDetails.setOnClickListener(this)
binding.textViewNumber.isVisible = settings.isPagesNumbersEnabled
}
@@ -115,6 +115,7 @@ open class PageHolder(
override fun onClick(v: View) {
when (v.id) {
R.id.button_retry -> delegate.retry(boundData?.toMangaPage() ?: return)
R.id.button_error_details -> delegate.showErrorDetails(v.context)
}
}

View File

@@ -19,7 +19,6 @@ import org.koitharu.kotatsu.utils.GoneOnInvisibleListener
import org.koitharu.kotatsu.utils.ext.getDisplayMessage
import org.koitharu.kotatsu.utils.ext.hideCompat
import org.koitharu.kotatsu.utils.ext.ifZero
import org.koitharu.kotatsu.utils.ext.setProgressCompat
import org.koitharu.kotatsu.utils.ext.showCompat
class WebtoonHolder(
@@ -40,6 +39,7 @@ class WebtoonHolder(
binding.ssiv.regionDecoderFactory = SkiaPooledImageRegionDecoder.Factory()
binding.ssiv.addOnImageEventListener(delegate)
bindingInfo.buttonRetry.setOnClickListener(this)
bindingInfo.buttonErrorDetails.setOnClickListener(this)
}
override fun onBind(data: ReaderPage) {
@@ -104,6 +104,7 @@ class WebtoonHolder(
override fun onClick(v: View) {
when (v.id) {
R.id.button_retry -> delegate.retry(boundData?.toMangaPage() ?: return)
R.id.button_error_details -> delegate.showErrorDetails(v.context)
}
}

View File

@@ -36,6 +36,7 @@ object ScrobblingModule {
@Provides
@Singleton
fun provideShikimoriRepository(
@ApplicationContext context: Context,
@ScrobblerType(ScrobblerService.SHIKIMORI) storage: ScrobblerStorage,
database: MangaDatabase,
authenticator: ShikimoriAuthenticator,
@@ -47,12 +48,13 @@ object ScrobblingModule {
addInterceptor(CurlLoggingInterceptor())
}
}.build()
return ShikimoriRepository(okHttp, storage, database)
return ShikimoriRepository(context, okHttp, storage, database)
}
@Provides
@Singleton
fun provideMALRepository(
@ApplicationContext context: Context,
@ScrobblerType(ScrobblerService.MAL) storage: ScrobblerStorage,
database: MangaDatabase,
authenticator: MALAuthenticator,
@@ -64,12 +66,13 @@ object ScrobblingModule {
addInterceptor(CurlLoggingInterceptor())
}
}.build()
return MALRepository(okHttp, storage, database)
return MALRepository(context, okHttp, storage, database)
}
@Provides
@Singleton
fun provideAniListRepository(
@ApplicationContext context: Context,
@ScrobblerType(ScrobblerService.ANILIST) storage: ScrobblerStorage,
database: MangaDatabase,
authenticator: AniListAuthenticator,
@@ -81,7 +84,7 @@ object ScrobblingModule {
addInterceptor(CurlLoggingInterceptor())
}
}.build()
return AniListRepository(okHttp, storage, database)
return AniListRepository(context, okHttp, storage, database)
}
@Provides

View File

@@ -1,12 +1,14 @@
package org.koitharu.kotatsu.scrobbling.anilist.data
import android.content.Context
import dagger.hilt.android.qualifiers.ApplicationContext
import okhttp3.FormBody
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody
import org.json.JSONObject
import org.koitharu.kotatsu.BuildConfig
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.db.MangaDatabase
import org.koitharu.kotatsu.parsers.exception.GraphQLException
import org.koitharu.kotatsu.parsers.model.MangaChapter
@@ -15,6 +17,7 @@ import org.koitharu.kotatsu.parsers.util.json.getStringOrNull
import org.koitharu.kotatsu.parsers.util.json.mapJSON
import org.koitharu.kotatsu.parsers.util.parseJson
import org.koitharu.kotatsu.parsers.util.toIntUp
import org.koitharu.kotatsu.scrobbling.common.data.ScrobblerRepository
import org.koitharu.kotatsu.scrobbling.common.data.ScrobblerStorage
import org.koitharu.kotatsu.scrobbling.common.data.ScrobblingEntity
import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblerManga
@@ -32,13 +35,17 @@ private const val REQUEST_MUTATION = "mutation"
private const val KEY_SCORE_FORMAT = "score_format"
class AniListRepository(
@ApplicationContext context: Context,
private val okHttp: OkHttpClient,
private val storage: ScrobblerStorage,
private val db: MangaDatabase,
) : org.koitharu.kotatsu.scrobbling.common.data.ScrobblerRepository {
) : ScrobblerRepository {
private val clientId = context.getString(R.string.anilist_clientId)
private val clientSecret = context.getString(R.string.anilist_clientSecret)
override val oauthUrl: String
get() = "${BASE_URL}oauth/authorize?client_id=${BuildConfig.ANILIST_CLIENT_ID}&" +
get() = "${BASE_URL}oauth/authorize?client_id=$clientId&" +
"redirect_uri=${REDIRECT_URI}&response_type=code"
override val isAuthorized: Boolean
@@ -48,8 +55,8 @@ class AniListRepository(
override suspend fun authorize(code: String?) {
val body = FormBody.Builder()
body.add("client_id", BuildConfig.ANILIST_CLIENT_ID)
body.add("client_secret", BuildConfig.ANILIST_CLIENT_SECRET)
body.add("client_id", clientId)
body.add("client_secret", clientSecret)
if (code != null) {
body.add("grant_type", "authorization_code")
body.add("redirect_uri", REDIRECT_URI)

View File

@@ -1,16 +1,19 @@
package org.koitharu.kotatsu.scrobbling.mal.data
import android.content.Context
import dagger.hilt.android.qualifiers.ApplicationContext
import okhttp3.FormBody
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import org.json.JSONObject
import org.koitharu.kotatsu.BuildConfig
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.db.MangaDatabase
import org.koitharu.kotatsu.parsers.model.MangaChapter
import org.koitharu.kotatsu.parsers.util.await
import org.koitharu.kotatsu.parsers.util.json.mapJSONNotNull
import org.koitharu.kotatsu.parsers.util.parseJson
import org.koitharu.kotatsu.scrobbling.common.data.ScrobblerRepository
import org.koitharu.kotatsu.scrobbling.common.data.ScrobblerStorage
import org.koitharu.kotatsu.scrobbling.common.data.ScrobblingEntity
import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblerManga
@@ -25,17 +28,19 @@ private const val BASE_API_URL = "https://api.myanimelist.net/v2"
private const val AVATAR_STUB = "https://cdn.myanimelist.net/images/questionmark_50.gif"
class MALRepository(
@ApplicationContext context: Context,
private val okHttp: OkHttpClient,
private val storage: ScrobblerStorage,
private val db: MangaDatabase,
) : org.koitharu.kotatsu.scrobbling.common.data.ScrobblerRepository {
) : ScrobblerRepository {
private val clientId = context.getString(R.string.mal_clientId)
private var codeVerifier: String = getPKCEChallengeCode()
override val oauthUrl: String
get() = "$BASE_WEB_URL/v1/oauth2/authorize?" +
"response_type=code" +
"&client_id=${BuildConfig.MAL_CLIENT_ID}" +
"&client_id=$clientId" +
"&redirect_uri=$REDIRECT_URI" +
"&code_challenge=$codeVerifier" +
"&code_challenge_method=plain"
@@ -51,7 +56,7 @@ class MALRepository(
override suspend fun authorize(code: String?) {
val body = FormBody.Builder()
if (code != null) {
body.add("client_id", BuildConfig.MAL_CLIENT_ID)
body.add("client_id", clientId)
body.add("grant_type", "authorization_code")
body.add("code", code)
body.add("redirect_uri", REDIRECT_URI)
@@ -205,5 +210,4 @@ class MALRepository(
avatar = json.getString("picture") ?: AVATAR_STUB,
service = ScrobblerService.MAL,
)
}

View File

@@ -1,11 +1,13 @@
package org.koitharu.kotatsu.scrobbling.shikimori.data
import android.content.Context
import dagger.hilt.android.qualifiers.ApplicationContext
import okhttp3.FormBody
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import org.json.JSONObject
import org.koitharu.kotatsu.BuildConfig
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.db.MangaDatabase
import org.koitharu.kotatsu.parsers.model.MangaChapter
import org.koitharu.kotatsu.parsers.util.await
@@ -28,13 +30,17 @@ private const val BASE_URL = "https://shikimori.one/"
private const val MANGA_PAGE_SIZE = 10
class ShikimoriRepository(
@ApplicationContext context: Context,
private val okHttp: OkHttpClient,
private val storage: ScrobblerStorage,
private val db: MangaDatabase,
) : ScrobblerRepository {
private val clientId = context.getString(R.string.shikimori_clientId)
private val clientSecret = context.getString(R.string.shikimori_clientSecret)
override val oauthUrl: String
get() = "${BASE_URL}oauth/authorize?client_id=${BuildConfig.SHIKIMORI_CLIENT_ID}&" +
get() = "${BASE_URL}oauth/authorize?client_id=$clientId&" +
"redirect_uri=$REDIRECT_URI&response_type=code&scope="
override val isAuthorized: Boolean
@@ -42,8 +48,8 @@ class ShikimoriRepository(
override suspend fun authorize(code: String?) {
val body = FormBody.Builder()
body.add("client_id", BuildConfig.SHIKIMORI_CLIENT_ID)
body.add("client_secret", BuildConfig.SHIKIMORI_CLIENT_SECRET)
body.add("client_id", clientId)
body.add("client_secret", clientSecret)
if (code != null) {
body.add("grant_type", "authorization_code")
body.add("redirect_uri", REDIRECT_URI)
@@ -98,13 +104,13 @@ class ShikimoriRepository(
return if (pageOffset != 0) list.drop(pageOffset) else list
}
override suspend fun createRate(mangaId: Long, shikiMangaId: Long) {
override suspend fun createRate(mangaId: Long, scrobblerMangaId: Long) {
val user = cachedUser ?: loadUser()
val payload = JSONObject()
payload.put(
"user_rate",
JSONObject().apply {
put("target_id", shikiMangaId)
put("target_id", scrobblerMangaId)
put("target_type", "Manga")
put("user_id", user.id)
},

View File

@@ -3,6 +3,9 @@ package org.koitharu.kotatsu.search.ui.widget
import android.annotation.SuppressLint
import android.content.Context
import android.os.Parcelable
import android.text.Spannable
import android.text.SpannableString
import android.text.style.TextAppearanceSpan
import android.util.AttributeSet
import android.view.KeyEvent
import android.view.MotionEvent
@@ -12,11 +15,11 @@ import android.view.inputmethod.EditorInfo
import androidx.annotation.AttrRes
import androidx.appcompat.widget.AppCompatEditText
import androidx.core.content.ContextCompat
import com.google.android.material.R as materialR
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.search.ui.suggestion.SearchSuggestionListener
import org.koitharu.kotatsu.utils.ext.drawableEnd
import org.koitharu.kotatsu.utils.ext.drawableStart
import com.google.android.material.R as materialR
private const val DRAWABLE_END = 2
@@ -31,6 +34,10 @@ class SearchEditText @JvmOverloads constructor(
private val voiceIcon = ContextCompat.getDrawable(context, R.drawable.ic_voice_input)
private var isEmpty = text.isNullOrEmpty()
init {
wrapHint()
}
var isVoiceSearchEnabled: Boolean = false
set(value) {
field = value
@@ -124,4 +131,16 @@ class SearchEditText @JvmOverloads constructor(
setCompoundDrawablesRelativeWithIntrinsicBounds(drawableStart, null, icon, null)
}
}
private fun wrapHint() {
val rawHint = hint?.toString() ?: return
val formatted = SpannableString(rawHint)
formatted.setSpan(
TextAppearanceSpan(context, materialR.style.TextAppearance_Material3_SearchView),
0,
formatted.length,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE,
)
hint = formatted
}
}

View File

@@ -5,6 +5,7 @@ import android.os.Bundle
import android.view.View
import androidx.preference.ListPreference
import androidx.preference.Preference
import com.google.android.material.snackbar.Snackbar
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import org.koitharu.kotatsu.R
@@ -85,6 +86,10 @@ class ContentSettingsFragment :
AppSettings.KEY_SOURCES_HIDDEN -> {
bindRemoteSourcesSummary()
}
AppSettings.KEY_SSL_BYPASS -> {
Snackbar.make(listView, R.string.settings_apply_restart_required, Snackbar.LENGTH_INDEFINITE).show()
}
}
}

View File

@@ -7,14 +7,24 @@ import org.koitharu.kotatsu.utils.EditTextValidator
class DomainValidator : EditTextValidator() {
override fun validate(text: String): ValidationResult {
if (text.isBlank()) {
val trimmed = text.trim()
if (trimmed.isEmpty()) {
return ValidationResult.Success
}
val host = text.trim().toCanonicalHost()
return if (host == null) {
return if (!checkCharacters(trimmed) || trimmed.toCanonicalHost() == null) {
ValidationResult.Failed(context.getString(R.string.invalid_domain_message))
} else {
ValidationResult.Success
}
}
private fun checkCharacters(value: String): Boolean {
for (i in value.indices) {
val c = value[i]
if (c !in '\u0020'..'\u007e') {
return false
}
}
return true
}
}

View File

@@ -37,6 +37,21 @@ fun PreferenceFragmentCompat.addPreferencesFromRepository(repository: RemoteMang
}
}
is ConfigKey.UserAgent -> {
EditTextPreference(requireContext()).apply {
summaryProvider = EditTextDefaultSummaryProvider(key.defaultValue)
setOnBindEditTextListener(
EditTextBindListener(
inputType = EditorInfo.TYPE_CLASS_TEXT,
hint = key.defaultValue,
validator = null,
),
)
setTitle(R.string.user_agent)
setDialogTitle(R.string.user_agent)
}
}
is ConfigKey.ShowSuspiciousContent -> {
SwitchPreferenceCompat(requireContext()).apply {
setDefaultValue(key.defaultValue)

View File

@@ -19,6 +19,7 @@ import androidx.preference.PreferenceViewHolder
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.prefs.ColorScheme
import org.koitharu.kotatsu.databinding.ItemColorSchemeBinding
import java.lang.ref.WeakReference
class ThemeChooserPreference @JvmOverloads constructor(
context: Context,
@@ -68,7 +69,7 @@ class ThemeChooserPreference @JvmOverloads constructor(
}
scrollView.viewTreeObserver.run {
scrollPersistListener?.let { removeOnScrollChangedListener(it) }
scrollPersistListener = ScrollPersistListener(scrollView, lastScrollPosition)
scrollPersistListener = ScrollPersistListener(WeakReference(scrollView), lastScrollPosition)
addOnScrollChangedListener(scrollPersistListener)
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
@@ -106,7 +107,6 @@ class ThemeChooserPreference @JvmOverloads constructor(
}
super.onRestoreInstanceState(state.superState)
lastScrollPosition[0] = state.scrollPosition
// notifyChanged()
}
private fun setValueInternal(enumName: String, notifyChanged: Boolean) {
@@ -152,11 +152,12 @@ class ThemeChooserPreference @JvmOverloads constructor(
}
private class ScrollPersistListener(
private val scrollView: HorizontalScrollView,
private val scrollViewRef: WeakReference<HorizontalScrollView>,
private val lastScrollPosition: IntArray,
) : ViewTreeObserver.OnScrollChangedListener {
override fun onScrollChanged() {
val scrollView = scrollViewRef.get() ?: return
lastScrollPosition[0] = scrollView.scrollX
}
}

View File

@@ -14,15 +14,17 @@ import dagger.hilt.InstallIn
import dagger.hilt.android.EntryPointAccessors
import dagger.hilt.components.SingletonComponent
import org.koitharu.kotatsu.core.db.*
import org.koitharu.kotatsu.core.logs.FileLogger
import org.koitharu.kotatsu.core.logs.SyncLogger
import java.util.concurrent.Callable
abstract class SyncProvider : ContentProvider() {
private val database by lazy {
val appContext = checkNotNull(context?.applicationContext)
val entryPoint = EntryPointAccessors.fromApplication(appContext, SyncProviderEntryPoint::class.java)
entryPoint.database()
private val entryPoint by lazy {
EntryPointAccessors.fromApplication(checkNotNull(context), SyncProviderEntryPoint::class.java)
}
private val database by lazy { entryPoint.database }
private val logger by lazy { entryPoint.logger }
private val supportedTables = setOf(
TABLE_FAVOURITES,
@@ -50,6 +52,7 @@ abstract class SyncProvider : ContentProvider() {
.selection(selection, selectionArgs)
.orderBy(sortOrder)
.create()
logger.log("query: ${sqlQuery.sql} (${selectionArgs.contentToString()})")
return database.openHelper.readableDatabase.query(sqlQuery)
}
@@ -62,6 +65,7 @@ abstract class SyncProvider : ContentProvider() {
if (values == null || table == null) {
return null
}
logger.log { "insert: $table [$values]" }
val db = database.openHelper.writableDatabase
if (db.insert(table, SQLiteDatabase.CONFLICT_IGNORE, values) < 0) {
db.update(table, values)
@@ -71,6 +75,7 @@ abstract class SyncProvider : ContentProvider() {
override fun delete(uri: Uri, selection: String?, selectionArgs: Array<out String>?): Int {
val table = getTableName(uri) ?: return 0
logger.log { "delete: $table ($selection) : (${selectionArgs.contentToString()})" }
return database.openHelper.writableDatabase.delete(table, selection, selectionArgs)
}
@@ -79,6 +84,7 @@ abstract class SyncProvider : ContentProvider() {
if (values == null || table == null) {
return 0
}
logger.log { "update: $table ($selection) : (${selectionArgs.contentToString()}) [$values]" }
return database.openHelper.writableDatabase
.update(table, SQLiteDatabase.CONFLICT_IGNORE, values, selection, selectionArgs)
}
@@ -119,6 +125,10 @@ abstract class SyncProvider : ContentProvider() {
@EntryPoint
@InstallIn(SingletonComponent::class)
interface SyncProviderEntryPoint {
fun database(): MangaDatabase
val database: MangaDatabase
@get:SyncLogger
val logger: FileLogger
}
}

View File

@@ -6,6 +6,7 @@ import android.content.ContentProviderClient
import android.content.Context
import android.content.SyncResult
import android.os.Bundle
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.sync.domain.SyncController
import org.koitharu.kotatsu.sync.domain.SyncHelper
import org.koitharu.kotatsu.utils.ext.onError
@@ -20,6 +21,9 @@ class FavouritesSyncAdapter(context: Context) : AbstractThreadedSyncAdapter(cont
provider: ContentProviderClient,
syncResult: SyncResult,
) {
if (!context.resources.getBoolean(R.bool.is_sync_enabled)) {
return
}
val syncHelper = SyncHelper(context, account, provider)
runCatchingCancellable {
syncHelper.syncFavourites(syncResult)

View File

@@ -6,6 +6,7 @@ import android.content.ContentProviderClient
import android.content.Context
import android.content.SyncResult
import android.os.Bundle
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.sync.domain.SyncController
import org.koitharu.kotatsu.sync.domain.SyncHelper
import org.koitharu.kotatsu.utils.ext.onError
@@ -20,6 +21,9 @@ class HistorySyncAdapter(context: Context) : AbstractThreadedSyncAdapter(context
provider: ContentProviderClient,
syncResult: SyncResult,
) {
if (!context.resources.getBoolean(R.bool.is_sync_enabled)) {
return
}
val syncHelper = SyncHelper(context, account, provider)
runCatchingCancellable {
syncHelper.syncHistory(syncResult)

View File

@@ -3,8 +3,9 @@ package org.koitharu.kotatsu.utils.ext
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.RequestBody.Companion.toRequestBody
import okhttp3.Response
import okhttp3.internal.closeQuietly
import okio.IOException
import org.json.JSONObject
import org.koitharu.kotatsu.parsers.util.parseJson
import java.net.HttpURLConnection
private val TYPE_JSON = "application/json".toMediaType()
@@ -12,9 +13,13 @@ private val TYPE_JSON = "application/json".toMediaType()
fun JSONObject.toRequestBody() = toString().toRequestBody(TYPE_JSON)
fun Response.parseJsonOrNull(): JSONObject? {
return if (code == HttpURLConnection.HTTP_NO_CONTENT) {
null
} else {
parseJson()
return try {
when {
!isSuccessful -> throw IOException(body?.string())
code == HttpURLConnection.HTTP_NO_CONTENT -> null
else -> JSONObject(body?.string() ?: return null)
}
} finally {
closeQuietly()
}
}

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:alpha="0.08" android:color="?attr/elevationOverlayColor" />
</selector>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:alpha="0.08" android:color="@color/kotatsu_onSurface" />
</selector>

View File

@@ -2,6 +2,6 @@
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/toolbar_background_scrim" />
<solid android:color="@color/colored_button" />
<corners android:radius="100dp" />
</shape>

View File

@@ -1,50 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<merge
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:parentTag="android.widget.FrameLayout">
<com.google.android.material.progressindicator.CircularProgressIndicator
android:id="@+id/progressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:indeterminate="true"
android:max="100"
tools:viewBindingType="android.widget.ProgressBar" />
<LinearLayout
android:id="@+id/layout_error"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginStart="60dp"
android:layout_marginEnd="60dp"
android:gravity="center_horizontal"
android:orientation="vertical"
android:visibility="gone"
tools:visibility="visible">
<TextView
android:id="@+id/textView_error"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawablePadding="12dp"
android:gravity="center_horizontal"
android:textAlignment="center"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
app:drawableTopCompat="@drawable/ic_error_large"
tools:text="@tools:sample/lorem[6]" />
<Button
android:id="@+id/button_retry"
style="@style/Widget.Material3.Button.TonalButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="@string/try_again" />
</LinearLayout>
</merge>

View File

@@ -47,7 +47,8 @@
android:layout_height="wrap_content"
android:hint="@string/name"
android:imeOptions="actionDone"
android:inputType="textCapSentences" />
android:inputType="textCapSentences"
android:maxLength="120" />
</com.google.android.material.textfield.TextInputLayout>

View File

@@ -5,15 +5,13 @@
xmlns:tools="http://schemas.android.com/tools"
tools:parentTag="android.widget.FrameLayout">
<!-- https://github.com/material-components/material-components-android/issues/2028 -->
<ProgressBar
<com.google.android.material.progressindicator.CircularProgressIndicator
android:id="@+id/progressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:indeterminate="true"
android:max="100"
tools:viewBindingType="android.widget.ProgressBar" />
android:max="100" />
<LinearLayout
android:id="@+id/layout_error"
@@ -46,6 +44,12 @@
android:layout_marginTop="16dp"
android:text="@string/try_again" />
</LinearLayout>
<Button
android:id="@+id/button_error_details"
style="@style/Widget.Material3.Button.TextButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/details" />
</LinearLayout>
</merge>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/action_grid"
android:checkable="true"
android:title="@string/show_in_grid_view"
android:titleCondensed="@string/grid" />
</menu>

View File

@@ -326,7 +326,8 @@
<string name="clear_all_history">Ачысціць усю гісторыю</string>
<string name="history_cleared">Гісторыя ачышчана</string>
<string name="incognito_mode">Рэжым інкогніта</string>
<string name="categories_delete_confirm">Вы ўпэўнены, што хочаце выдаліць выбраныя абраныя катэгорыі\? Уся манга ў ім будзе страчана, і гэта нельга будзе адрабіць.</string>
<string name="categories_delete_confirm">Вы ўпэўнены, што хочаце выдаліць выбраныя абраныя катэгорыі\?
\nУся манга ў ім будзе страчана, і гэта нельга будзе адрабіць.</string>
<string name="no_bookmarks_summary">Вы можаце стварыць закладку падчас чытання мангі</string>
<string name="saved_manga">Захаваная манга</string>
<string name="enter_email_text">Каб працягнуць, увядзіце свой адрас электроннай пошты</string>
@@ -415,4 +416,9 @@
<string name="options">Параметры</string>
<string name="downloading_manga">Спампоўка мангі</string>
<string name="seconds_pattern">%s с</string>
<string name="user_agent">Загаловак UserAgent</string>
<string name="allow_unstable_updates">Дазволіць нестабільныя абнаўленні</string>
<string name="allow_unstable_updates_summary">Прапануйце абнаўленні да бэта-версій праграмы</string>
<string name="download_started">Спампоўка пачалася</string>
<string name="settings_apply_restart_required">Калі ласка, перазапусціце праграму каб прымяніць змены</string>
</resources>

View File

@@ -403,7 +403,5 @@
<string name="show_suspicious_content">Verdächtige Inhalte anzeigen</string>
<string name="status_dropped">Abgebrochen</string>
<string name="color_theme">Farbschema</string>
<string name="theme_name_october">Oktober</string>
<string name="theme_name_mint">Minze</string>
<string name="theme_name_dynamic">Dynamisch</string>
</resources>

View File

@@ -78,4 +78,12 @@
<string name="operation_not_supported">Αυτή η λειτουργία δεν υποστηρίζεται</string>
<string name="read_mode">Λειτουργία ανάγνωσης</string>
<string name="grid_size">Μέγεθος πλέγματος</string>
<string name="theme_name_mamimi">Μαμίμι</string>
<string name="theme_name_kanade">Κανάντε</string>
<string name="nothing_here">Δεν υπάρχει τίποτα εδώ</string>
<string name="theme_name_miku">Μίκου</string>
<string name="theme_name_asuka">Άσουκα</string>
<string name="theme_name_mion">Μιόν</string>
<string name="theme_name_rikka">Ρίκκα</string>
<string name="theme_name_sakura">Σακούρα</string>
</resources>

View File

@@ -360,7 +360,6 @@
<string name="explore">Explorar</string>
<string name="memory_usage_pattern">%s - %s</string>
<string name="changelog">Registro de cambios</string>
<string name="tools">Herramientas</string>
<string name="exit_confirmation_summary">Pulse dos veces «Atrás» para salir de la aplicación</string>
<string name="exit_confirmation">Confirmación de salida</string>
<string name="pages_cache">Caché de páginas</string>
@@ -404,10 +403,8 @@
<string name="enable_logging_summary">Grabar algunas acciones para depurar</string>
<string name="enable_logging">Activar el registro</string>
<string name="show_suspicious_content">Mostrar contenido sospechoso</string>
<string name="theme_name_mint">Mint</string>
<string name="theme_name_dynamic">Dinámico</string>
<string name="color_theme">Esquema de colores</string>
<string name="theme_name_october">Octubre</string>
<string name="show_in_grid_view">Mostrar en vista de cuadrícula</string>
<string name="theme_name_asuka">Asuka</string>
<string name="theme_name_mion">Mion</string>
@@ -422,4 +419,6 @@
<string name="allow_unstable_updates_summary">Actualizaciones propuestas para las versiones beta de la aplicación</string>
<string name="allow_unstable_updates">Permitir actualizaciones inestables</string>
<string name="download_started">Descarga iniciada</string>
<string name="user_agent">Encabezado del agente de usuario</string>
<string name="settings_apply_restart_required">Por favor, reinicie la aplicación para aplicar estos cambios</string>
</resources>

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View File

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="items">
<item quantity="one">%1$d aytem</item>
<item quantity="other">%1$d (na) aytem</item>
</plurals>
<plurals name="pages">
<item quantity="one">"Kabuuang %1$d pahina"</item>
<item quantity="other">Kabuuang %1$d (na) pahina</item>
</plurals>
<plurals name="minutes_ago">
<item quantity="one">%1$d minutong nakakalipas</item>
<item quantity="other">%1$d (na) minutong nakakalipas</item>
</plurals>
<plurals name="new_chapters">
<item quantity="one">%1$d bagong kabanata</item>
<item quantity="other">%1$d mga bagong kabanata</item>
</plurals>
<plurals name="chapters">
<item quantity="one">"%1$d kabanata"</item>
<item quantity="other">%1$d (na) kabanata</item>
</plurals>
<plurals name="chapters_from_x">
<item quantity="one">%1$d kabanata mula sa %2$d</item>
<item quantity="other">%1$d (na) kabanata mula sa %2$d</item>
</plurals>
<plurals name="hours_ago">
<item quantity="one">%1$d oras ang nakalipas</item>
<item quantity="other">%1$d (na) oras ang nakalipas</item>
</plurals>
<plurals name="days_ago">
<item quantity="one">%1$d araw ang nakalipas</item>
<item quantity="other">%1$d (na) araw ang nakalipas</item>
</plurals>
</resources>

View File

@@ -0,0 +1,411 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<string name="updated">Na-update</string>
<string name="newest">Pinakabago</string>
<string name="light">Maliwanag</string>
<string name="by_rating">Marka</string>
<string name="filter">Pansala</string>
<string name="theme">Tema</string>
<string name="dark">Madilim</string>
<string name="automatic">Sundan ang sistema</string>
<string name="error_occurred">May nangyaring error</string>
<string name="network_error">Error sa network</string>
<string name="details">Mga detalye</string>
<string name="chapters">Mga kabanata</string>
<string name="list">Listahan</string>
<string name="page_saved">Na-save</string>
<string name="share_image">I-share ang larawan</string>
<string name="_import">Mag-angkat</string>
<string name="delete">Tanggalin</string>
<string name="operation_not_supported">Hindi suportado ang operasyong ito</string>
<string name="text_file_not_supported">Pumili ng ZIP o CBZ file.</string>
<string name="history_and_cache">Kasaysayan at cache</string>
<string name="no_description">Walang paglalarawan</string>
<string name="grid_size">Laki ng grid</string>
<string name="search_on_s">Hanapin sa %s</string>
<string name="delete_manga">Tanggalin ang manga</string>
<string name="text_delete_local_manga">Permanenteng tanggalin ang \"%s\" sa device\?</string>
<string name="reader_settings">Mga setting sa pagbasa</string>
<string name="switch_pages">Magpalit ng (mga) pahina</string>
<string name="volume_buttons">Pindutan ng volume</string>
<string name="_continue">Magpatuloy</string>
<string name="warning">Babala</string>
<string name="dont_ask_again">Huwag na magtanong muli</string>
<string name="cancelling_">Kinakansela…</string>
<string name="clear_thumbs_cache">I-clear ang cache ng mga thumbnail</string>
<string name="search_history_cleared">Na-clear</string>
<string name="gestures_only">Mga kilos lang</string>
<string name="application_update">Tingnan kung may mga bagong bersyon ng app</string>
<string name="app_update_available">Available ang isang bagong bersyon ng app</string>
<string name="open_in_browser">Buksan sa web browser</string>
<string name="large_manga_save_confirm">Ang manga na ito ay may %s. I-save ang lahat ng ito\?</string>
<string name="notifications">Mga abiso</string>
<string name="enabled_d_of_d" tools:ignore="PluralsCandidate">%1$d ng %2$d sa</string>
<string name="new_chapters">Mga bagong kabanata</string>
<string name="read_from_start">Basahin mula sa simula</string>
<string name="restart">I-restart</string>
<string name="categories_">Mga kategorya…</string>
<string name="rename">Palitan ang pangalan</string>
<string name="text_search_holder_secondary">Subukang i-reformulate ang query.</string>
<string name="text_history_holder_primary">Ang iyong nabasa ay ipapakita dito</string>
<string name="text_shelf_holder_primary">Ang iyong manga ay ipapakita dito</string>
<string name="text_local_holder_primary">Mag-save muna ng isang bagay</string>
<string name="text_local_holder_secondary">I-save ito mula sa mga online na source o mag import ng mga file.</string>
<string name="manga_shelf">Istante</string>
<string name="pages_animation">Animasyon ng pahina</string>
<string name="not_available">Hindi magagamit</string>
<string name="cannot_find_available_storage">Walang available na storage</string>
<string name="other_storage">Iba pang storage</string>
<string name="done">Tapos na</string>
<string name="all_favourites">Lahat ng paborito</string>
<string name="favourites_category_empty">Walang laman ang kategorya</string>
<string name="read_later">Basahin mamaya</string>
<string name="updates">Mga update</string>
<string name="search_results">Mga resulta ng paghahanap</string>
<string name="related">Kaugnay</string>
<string name="size_s">Laki: %s</string>
<string name="waiting_for_network">Naghihintay ng network…</string>
<string name="clear_updates_feed">I-clear ang feed ng mga update</string>
<string name="updates_feed_cleared">Na-clear</string>
<string name="update">Update</string>
<string name="feed_will_update_soon">Ang pag update ng feed ay magsisimula sa lalong madaling panahon</string>
<string name="track_sources">Maghanap ng mga update</string>
<string name="enter_password">Ilagay ang password</string>
<string name="protect_application_summary">Humingi ng password kapag sinimulan ang Kotatsu</string>
<string name="about">Tungkol rito</string>
<string name="check_for_updates">Maghanap ng update</string>
<string name="checking_for_updates">Naghahanap ng update…</string>
<string name="update_check_failed">Hindi makahanap ng mga update</string>
<string name="right_to_left">Kanan sa kaliwa</string>
<string name="create_category">Bagong Kategorya</string>
<string name="zoom_mode_fit_center">Pagkasyahin sa gitna</string>
<string name="zoom_mode_keep_start">Panatilihin sa simula</string>
<string name="black_dark_theme_summary">Gumagamit ng mas kaunting power sa mga AMOLED na screen</string>
<string name="backup_restore">I-backup at i-restore</string>
<string name="data_restored">Naibalik na</string>
<string name="preparing_">Naghahanda…</string>
<string name="report_github">Lumikha ng isyu sa GitHub</string>
<string name="file_not_found">Hindi nahanap ang file</string>
<string name="backup_information">Maaari kang lumikha ng backup ng iyong kasaysayan at mga paborito at ibalik ito</string>
<string name="just_now">Ngayon lang</string>
<string name="yesterday">Kahapon</string>
<string name="long_ago">Matagal na ang nakalipas</string>
<string name="today">Ngayong araw</string>
<string name="tap_to_try_again">I-tap para subukang muli</string>
<string name="captcha_solve">Lutasin</string>
<string name="cookies_cleared">Inalis ang lahat ng mga cookie</string>
<string name="chapters_checking_progress">Sinusuri ang mga bagong kabanata: %1$d ng %2$d</string>
<string name="clear_feed">I-clear ang feed</string>
<string name="check_for_new_chapters">Suriin ang mga bagong kabanata</string>
<string name="sign_in">Mag-sign in</string>
<string name="auth_required">Mag-sign in upang tingnan ang nilalamang ito</string>
<string name="default_s">Default: %s</string>
<string name="next">Susunod</string>
<string name="confirm">Kumpirmahin</string>
<string name="password_length_hint">Ang password ay dapat na 4 na character o higit pa</string>
<string name="search_only_on_s">Maghanap lamang sa %s</string>
<string name="other">Iba pa</string>
<string name="welcome">Maligayang pagdating</string>
<string name="backup_saved">Na-save ang backup</string>
<string name="read_more">Magbasa pa</string>
<string name="text_downloads_holder">Walang aktibong pag-download</string>
<string name="chapter_is_missing">Kulang ang kabanata</string>
<string name="about_feedback">Feedback</string>
<string name="about_feedback_4pda">Paksa sa 4PDA</string>
<string name="auth_not_supported_by">Ang pag-log in sa %s ay hindi suportado</string>
<string name="genres">Mga genre</string>
<string name="state_ongoing">Patuloy</string>
<string name="system_default">Default</string>
<string name="exclude_nsfw_from_history">Hindi isali ang NSFW manga mula sa kasaysayan</string>
<string name="show_pages_numbers">Mga pahinang may bilang</string>
<string name="importing_progress">Ini-import ang manga: %1$d ng %2$d</string>
<string name="screenshots_policy">Patakaran sa screenshot</string>
<string name="screenshots_allow">Payagan</string>
<string name="screenshots_block_all">Palaging i-block</string>
<string name="suggestions">Mga mungkahi</string>
<string name="suggestions_enable">Paganahin ang mga mungkahi</string>
<string name="text_suggestion_holder">Simulan ang pagbabasa ng manga at makakakuha ka ng mga personalized na mungkahi</string>
<string name="exclude_nsfw_from_suggestions">Huwag magmungkahi ng NSFW manga</string>
<string name="enabled">Pinagana</string>
<string name="find_genre">Maghanap ng genre</string>
<string name="onboard_text">Pumili ng mga wika na gusto mong basahin ang manga. Maaari mo itong baguhin sa ibang pagkakataon sa mga setting.</string>
<string name="open_menu">Buksan ang menu</string>
<string name="local_storage">Lokal na storage</string>
<string name="favourites">Mga paborito</string>
<string name="history">Nakaraan</string>
<string name="list_mode">Mode na listahan</string>
<string name="detailed_list">Detalyadong listahan</string>
<string name="grid">Grid</string>
<string name="settings">Mga setting</string>
<string name="remote_sources">Mga remote na source</string>
<string name="loading_">Naglo-load…</string>
<string name="close">Isara</string>
<string name="nothing_found">Walang nahanap</string>
<string name="remove">Tanggalin</string>
<string name="add_new_category">Bagong Kategorya</string>
<string name="enter_category_name">Ipasok ang pangalan ng kategorya</string>
<string name="read">Nabasa</string>
<string name="you_have_not_favourites_yet">Wala pang paborito</string>
<string name="add_to_favourites">I-paborito ito</string>
<string name="add">Idagdag</string>
<string name="save">I-save</string>
<string name="share">Ibahagi</string>
<string name="create_shortcut">Lumikha ng shortcut…</string>
<string name="share_s">Ibahagi sa %s</string>
<string name="search">Maghanap</string>
<string name="search_manga">Maghanap ng manga</string>
<string name="manga_downloading_">Nagda-download…</string>
<string name="processing_">Nagpoproseso…</string>
<string name="download_complete">Na-download</string>
<string name="downloads">Mga download</string>
<string name="by_name">Pangalan</string>
<string name="popular">Sikat</string>
<string name="pages">Mga pahina</string>
<string name="clear_history">I-clear ang kasaysayan</string>
<string name="clear_search_history">I-clear ang kasaysayan ng paghahanap</string>
<string name="network_consumption_warning">Maaari itong maglipat ng maraming data</string>
<string name="new_version_s">Bagong bersyon: %s</string>
<string name="passwords_mismatch">Hindi tumutugma sa mga password</string>
<string name="clear_cookies">I-clear ang mga cookie</string>
<string name="clear_pages_cache">I-clear ang page cache</string>
<string name="save_manga">I-save</string>
<string name="show_notification_app_update">Ipakita ang abiso kung may available na bagong bersyon</string>
<string name="download">I-download</string>
<string name="notifications_settings">Mga setting ng abiso</string>
<string name="notification_sound">Tunog ng abiso</string>
<string name="favourites_categories">Mga paboritong kategorya</string>
<string name="category_delete_confirm">Alisin ang kategoryang \"%s\" sa iyong mga paborito\?
\nMawawala ang lahat ng manga sa loob nito.</string>
<string name="remove_category">Tanggalin</string>
<string name="text_empty_holder_primary">Parang walang laman dito…</string>
<string name="text_categories_holder">Maaari kang gumamit ng mga kategorya upang ayusin ang iyong mga paborito. Pindutin ang «+» upang lumikha ng kategorya</string>
<string name="text_history_holder_secondary">Hanapin kung ano ang babasahin sa side menu.</string>
<string name="text_shelf_holder_secondary">Hanapin kung ano ang babasahin sa seksyong «Mag-explore»</string>
<string name="recent_manga">Kamakailan</string>
<string name="manga_save_location">Folder para sa mga download</string>
<string name="save_page">I-save ang pahina</string>
<string name="_s_deleted_from_local_storage">Natanggal ang \"%s\" sa lokal na storage</string>
<string name="history_is_empty">Wala pang kasaysayan</string>
<string name="wait_for_loading_finish">Hintaying matapos ang paglo-load…</string>
<string name="text_clear_history_prompt">Permanenteng i-clear ang lahat ng kasaysayan ng pagbabasa\?</string>
<string name="dont_check">Huwag suriin</string>
<string name="repeat_password">Ulitin ang password</string>
<string name="protect_application">Protektahan ang app</string>
<string name="wrong_password">Maling password</string>
<string name="app_version">Bersyon %s</string>
<string name="scale_mode">Mode ng scale</string>
<string name="no_update_available">Walang available na update</string>
<string name="reverse">Baliktarin</string>
<string name="group">Grupo</string>
<string name="silent">Tahimik</string>
<string name="zoom_mode_fit_width">Pagkasyahin sa lapad</string>
<string name="black_dark_theme">Itim</string>
<string name="create_backup">Lumikha ng data backup</string>
<string name="restore_backup">Ibalik mula sa backup</string>
<string name="data_restored_success">Naibalik ang lahat ng data</string>
<string name="data_restored_with_errors">Ang data ay naibalik, ngunit may mga error</string>
<string name="reader_mode_hint">Ang napiling pagsasaayos ay maaalala para sa manga na ito</string>
<string name="about_app_translation_summary">Isalin ang app na ito</string>
<string name="auth_complete">Awtorisado na</string>
<string name="captcha_required">Kinakailangan ang CAPTCHA</string>
<string name="text_clear_updates_feed_prompt">I-clear nang permanente ang lahat ng update history\?</string>
<string name="_and_x_more">…at %1$d higit pa</string>
<string name="protect_application_subtitle">Maglagay ng password para simulan ang app</string>
<string name="tracker_warning">Ang ilang device ay may iba\'t ibang gawi ng system, na maaaring masira ang mga gawain sa background.</string>
<string name="queued">Nakapila na</string>
<string name="chapter_is_missing_text">I-download o basahin ang nawawalang kabanata online.</string>
<string name="text_clear_cookies_prompt">Mala-log out ka mula sa lahat ng source</string>
<string name="state_finished">Tapos na</string>
<string name="text_clear_search_history_prompt">Alisin ang lahat ng kamakailang query sa paghahanap nang permanente\?</string>
<string name="about_app_translation">Pagsasalin</string>
<string name="error_empty_name">Kailangan mong maglagay ng pangalan</string>
<string name="date_format">Format ng petsa</string>
<string name="dynamic_theme">Dynamic na tema</string>
<string name="dynamic_theme_summary">Naglalapat ng temang ginawa sa scheme ng kulay ng iyong wallpaper</string>
<string name="screenshots_block_nsfw">I-block sa NSFW</string>
<string name="suggestions_summary">Magmungkahi ng manga batay sa iyong mga kagustuhan</string>
<string name="suggestions_info">Ang lahat ng data ay sinusuri nang lokal sa aparatong ito. Walang paglipat ng iyong personal na data sa anumang mga serbisyo</string>
<string name="disabled">Hindi pinagana</string>
<string name="filter_load_error">Hindi ma-load ang listahan ng mga genre</string>
<string name="reset_filter">I-reset ang filter</string>
<string name="text_feed_holder">Ang mga bagong kabanata ng iyong binabasa ay makikita dito</string>
<string name="rotate_screen">I-rotate ang screen</string>
<string name="zoom_mode_fit_height">Pagkasyahin sa tangkad</string>
<string name="never">Hindi kailanman</string>
<string name="only_using_wifi">Sa Wi-Fi lang</string>
<string name="close_menu">Isara ang menu</string>
<string name="computing_">Nagco-compute…</string>
<string name="chapter_d_of_d">Kabanata %1$d ng %2$d</string>
<string name="try_again">Subukan ulit</string>
<string name="sort_order">Pag-aayos ng order</string>
<string name="clear">I-clear</string>
<string name="_s_removed_from_history">Natanggal ang \"%s\" sa kasaysayan</string>
<string name="taps_on_edges">Mga taps ng gilid</string>
<string name="enabled_sources">Mga ginamit na source</string>
<string name="available_sources">Magagamit na mga source</string>
<string name="always">Lagi na lang</string>
<string name="preload_pages">I-preload ang mga pahina</string>
<string name="logged_in_as">Naka-log in bilang %s</string>
<string name="various_languages">Iba\'t ibang wika</string>
<string name="search_chapters">Maghanap ng kabanata</string>
<string name="percent_string_pattern">%1$s%%</string>
<string name="appearance">Hitsura</string>
<string name="suggestions_excluded_genres">Hindi isali ang mga genre</string>
<string name="suggestions_excluded_genres_summary">Tukuyin ang mga genre na hindi mo nais na makita sa mga mungkahi</string>
<string name="removal_completed">Nakumpleto na ang pagtanggal</string>
<string name="download_slowdown_summary">Tumutulong na maiwasan ang pag-block ng iyong IP address</string>
<string name="local_manga_processing">Naka-save na pagproseso ng manga</string>
<string name="account_already_exists">Mayroon nang account</string>
<string name="back">Bumalik</string>
<string name="sync">Pag-synchronize</string>
<string name="email_enter_hint">Ilagay ang iyong email upang magpatuloy</string>
<string name="hide">Itago</string>
<string name="new_sources_text">May mga bagong source ng manga</string>
<string name="show_notification_new_chapters_off">Hindi ka makakatanggap ng mga abiso ngunit ang mga bagong kabanata ay iha-highlight sa mga listahan</string>
<string name="notifications_enable">Paganahin ang mga abiso</string>
<string name="edit_category">Ayusin ang kategorya</string>
<string name="tracking">Tina-track</string>
<string name="empty_favourite_categories">Walang mga paboritong kategorya</string>
<string name="logout">Mag-log out</string>
<string name="bookmark_add">Magdagdag ng bookmark</string>
<string name="bookmark_removed">Tinanggal ang bookmark</string>
<string name="removed_from_history">Inalis sa kasaysayan</string>
<string name="dns_over_https">DNS sa HTTPS</string>
<string name="default_mode">Default na mode</string>
<string name="detect_reader_mode">Automatikong matukoy ang reader mode</string>
<string name="crash_text">May nangyaring mali. Mangyaring magsumite ng isang bug report sa mga developer upang matulungan kaming ayusin ito.</string>
<string name="send">Ipadala</string>
<string name="status_re_reading">Muling pagbabasa</string>
<string name="status_dropped">Binitawan</string>
<string name="appwidget_shelf_description">Manga mula sa iyong mga paborito</string>
<string name="appwidget_recent_description">Ang iyong kamakailang nabasa na manga</string>
<string name="data_deletion">Pagtanggal ng data</string>
<string name="show_reading_indicators_summary">Ipakita ang porsyento na nabasa sa kasaysayan at mga paborito</string>
<string name="show_all">Ipakita lahat</string>
<string name="select_range">Pumili ng saklaw</string>
<string name="clear_all_history">I-clear ang lahat ng kasaysayan</string>
<string name="no_bookmarks_summary">Maaari kang lumikha ng bookmark habang nagbabasa ng manga</string>
<string name="bookmarks_removed">Tinanggal ang mga bookmark</string>
<string name="random">Random</string>
<string name="no_manga_sources">Walang mga source ng manga</string>
<string name="no_manga_sources_text">Paganahin ang mga source ng manga upang basahin ang manga online</string>
<string name="reorder">Ayusin muli</string>
<string name="empty">Walang laman</string>
<string name="changelog">Changelog</string>
<string name="confirm_exit">Pindutin muli ang Bumalik upang lumabas</string>
<string name="exit_confirmation_summary">Pindutin ang Bumalik nang dalawang beses upang lumabas sa app</string>
<string name="exit_confirmation">Pagkumpirma ng paglabas</string>
<string name="saved_manga">Na-save na manga</string>
<string name="explore">Mag-Explore</string>
<string name="other_cache">Iba pang cache</string>
<string name="storage_usage">Paggamit ng storage</string>
<string name="available">Magagamit na</string>
<string name="memory_usage_pattern">%s - %s</string>
<string name="removed_from_favourites">Inalis sa mga paborito</string>
<string name="removed_from_s">Inalis mula sa \"%s\"</string>
<string name="options">Mga pagpipilian</string>
<string name="downloading_manga">Nagda-download ng manga</string>
<string name="incognito_mode">Incognito mode</string>
<string name="app_update_available_s">Magagamit ang pag update ng application: %s</string>
<string name="no_chapters">Walang mga kabanata</string>
<string name="automatic_scroll">Awtomatikong pag-scroll</string>
<string name="reader_info_pattern">Ch. %1$d/%2$d Pg. %3$d/%4$d</string>
<string name="reader_info_bar">Ipakita ang information bar sa pagbasa</string>
<string name="comics_archive">Archive ng mga comics</string>
<string name="folder_with_images">Folder na may mga larawan</string>
<string name="import_completed">Nakumpleto na ang pag-import</string>
<string name="import_will_start_soon">Magsisimula na ang pag-import</string>
<string name="feed">Feed</string>
<string name="history_shortcuts_summary">Gawing magagamit ang kamakailang manga sa pamamagitan ng mahabang pagpindot sa icon ng application</string>
<string name="history_shortcuts">Ipakita ang mga kamakailang manga shortcut</string>
<string name="reader_control_ltr">Ergonomic na kontrol sa mambabasa</string>
<string name="color_correction">Pagwawasto ng kulay</string>
<string name="brightness">Liwanag</string>
<string name="contrast">Kaibahan</string>
<string name="text_unsaved_changes_prompt">I-save o kalimutan ang mga hindi na-save na pagbabago\?</string>
<string name="discard">Kalimutan</string>
<string name="error_no_space_left">Walang natitirang espasyo sa device</string>
<string name="webtoon_zoom">Pag-zoom sa webtoon</string>
<string name="different_languages">Iba\'t ibang wika</string>
<string name="server_error">Server side error (%1$d). Subukang muli mamaya</string>
<string name="clear_new_chapters_counters">I-clear din ang impormasyon tungkol sa mga bagong kabanata</string>
<string name="prefetch_content">Preloading ng nilalaman</string>
<string name="mark_as_current">Markahan bilang kasalukuyan</string>
<string name="language">Wika</string>
<string name="share_logs">Ibahagi ang mga log</string>
<string name="show_suspicious_content">Magpakita ng kahina-hinalang nilalaman</string>
<string name="theme_name_dynamic">Dynamic</string>
<string name="show_in_grid_view">Ipakita sa grid view</string>
<string name="theme_name_asuka">Asuka</string>
<string name="theme_name_mion">Mion</string>
<string name="theme_name_rikka">Rikka</string>
<string name="theme_name_sakura">Sakura</string>
<string name="theme_name_mamimi">Mamimi</string>
<string name="theme_name_kanade">Kanade</string>
<string name="nothing_here">Wala naman dito</string>
<string name="services">Mga serbisyo</string>
<string name="allow_unstable_updates">Payagan ang mga hindi stable na update</string>
<string name="show_reading_indicators">Ipakita ang mga tagapagpahiwatig ng progress ng pagbabasa</string>
<string name="exclude_nsfw_from_history_summary">Manga na minarkahan bilang NSFW ay hindi kailanman idadagdag sa kasaysayan at ang iyong progress ay hindi mase-save</string>
<string name="clear_cookies_summary">Maaaring makatulong sa kaso ng ilang mga isyu. Ang lahat ng pahintulot ay mawawalan ng bisa</string>
<string name="invalid_domain_message">Imbalidong domain</string>
<string name="last_2_hours">Huling 2 oras</string>
<string name="history_cleared">Nabura ang kasaysayan</string>
<string name="manage">Pamahalaan</string>
<string name="no_bookmarks_yet">Wala pang bookmark</string>
<string name="nsfw">18+</string>
<string name="not_found_404">Hindi natagpuan o inalis ang nilalaman</string>
<string name="enable_logging_summary">Magtala ng ilang pagkilos para sa mga layunin ng pag-debug</string>
<string name="text_delete_local_manga_batch">Permanenteng tanggalin ang mga napiling item sa device\?</string>
<string name="chapters_empty">Walang mga kabanata sa manga na ito</string>
<string name="suggestions_updating">Nag-a-update ang mga mungkahi</string>
<string name="content">Nilalaman</string>
<string name="batch_manga_save_confirm">I-download ang lahat ng napiling manga at ang mga kabanata nito\? Maaari itong kumonsumo ng maraming trapiko at storage.</string>
<string name="parallel_downloads">Mga parallel na pag-download</string>
<string name="download_slowdown">Pagbagal ng pag-download</string>
<string name="chapters_will_removed_background">Tatanggalin ang mga chapters sa background. Maaari itong tumagal ng ilang oras</string>
<string name="canceled">Kinansela</string>
<string name="sync_title">I-sync ang iyong data</string>
<string name="check_new_chapters_title">Tingnan ang mga bagong kabanata at ipaalam ang tungkol dito</string>
<string name="name">Pangalan</string>
<string name="edit">I-edit</string>
<string name="bookmark_remove">Tanggalin ang bookmark</string>
<string name="show_notification_new_chapters_on">Makakatanggap ka ng mga abiso tungkol sa mga update ng manga na iyong binabasa</string>
<string name="undo">Mag-undo</string>
<string name="status_reading">Nagbabasa</string>
<string name="pages_cache">Cache ng mga pahina</string>
<string name="bookmarks">Mga bookmark</string>
<string name="categories_delete_confirm">Sigurado ka bang gusto mong tanggalin ang mga napiling paboritong kategorya\?
\nAng lahat ng manga sa loob nito ay mawawala at hindi na ito mababawi.</string>
<string name="bookmark_added">Idinagdag ang bookmark</string>
<string name="detect_reader_mode_summary">Awtomatikong matukoy kung ang manga ay webtoon</string>
<string name="disable_battery_optimization">Huwag paganahin ang pag-optimize ng baterya</string>
<string name="disable_battery_optimization_summary">Tumutulong sa mga pagsusuri sa mga update sa background</string>
<string name="status_planned">Nakaplano</string>
<string name="status_completed">Nakumpleto na</string>
<string name="status_on_hold">Naka-hold</string>
<string name="disable_all">Huwag paganahin ang lahat</string>
<string name="use_fingerprint">Gumamit ng fingerprint kung magagamit</string>
<string name="report">Ulat</string>
<string name="enter_email_text">Ilagay ang iyong email upang magpatuloy</string>
<string name="reset">I-reset</string>
<string name="allow_unstable_updates_summary">Magmungkahi ng mga update sa mga beta na bersyon ng app</string>
<string name="network_unavailable">Hindi magagamit ang network</string>
<string name="network_unavailable_hint">I-on ang Wi-Fi o mobile network para magbasa ng manga online</string>
<string name="off_short">Naka-off</string>
<string name="seconds_pattern">%ss</string>
<string name="reader_control_ltr_summary">Mag-tap sa kanang gilid o ang pagpindot sa kanang key ay palaging lilipat sa susunod na pahina</string>
<string name="reader_slider">Ipakita ang slider ng paglipat ng pahina</string>
<string name="manga_error_description_pattern">Mga detalye ng error:&lt;br&gt;&lt;tt&gt;%1$s&lt;/tt&gt;&lt;br&gt;&lt;br&gt;1. Subukang &lt;a href=%2$s&gt;buksan ang manga sa isang web browser&lt;/a&gt; upang matiyak na magagamit ito sa source&lt;br&gt;nito 2. Kung magagamit ito, magpadala ng isang ulat ng error sa mga developer.</string>
<string name="enable_logging">Paganahin ang pag-log</string>
<string name="source_disabled">Hindi pinagana ang source</string>
<string name="importing_manga">Pag-import ng manga</string>
<string name="import_completed_hint">Maaari mong tanggalin ang orihinal na file mula sa storage upang makatipid ng espasyo</string>
<string name="color_correction_hint">Ang napiling mga setting ng kulay ay matatandaan para sa manga na ito</string>
<string name="webtoon_zoom_summary">Payagan ang pag-zoom in/zoom out na galaw sa webtoon mode (beta)</string>
<string name="compact">Compact</string>
<string name="scrobbling_empty_hint">Upang subaybayan ang pag unlad ng pagbabasa, piliin ang Menu → Track sa screen ng mga detalye ng manga.</string>
<string name="download_started">Nagsimula na ang pag-download</string>
<string name="color_theme">Scheme ng kulay</string>
<string name="theme_name_miku">Miku</string>
</resources>

View File

@@ -403,12 +403,22 @@
<string name="enable_logging_summary">Enregistrer certaines actions à des fins de débogage</string>
<string name="language">Langue</string>
<string name="show_suspicious_content">Afficher le contenu suspect</string>
<string name="theme_name_mint">Menthe</string>
<string name="theme_name_dynamic">Dynamique</string>
<string name="color_theme">Schéma de couleurs</string>
<string name="theme_name_october">Octobre</string>
<string name="show_in_grid_view">Afficher en vue grille</string>
<string name="scrobbling_empty_hint">Pour suivre la progression de la lecture, sélectionnez Menu → Suivre sur l\'écran des détails du manga.</string>
<string name="services">Prestations de service</string>
<string name="nothing_here">Il n\'y a rien ici</string>
<string name="theme_name_sakura">Sakura</string>
<string name="theme_name_rikka">Rikka</string>
<string name="theme_name_miku">Miku</string>
<string name="theme_name_asuka">Asuka</string>
<string name="theme_name_mion">Mion</string>
<string name="theme_name_mamimi">Mamimi</string>
<string name="allow_unstable_updates">Autoriser les mises à jour instables</string>
<string name="download_started">Téléchargement commencé</string>
<string name="theme_name_kanade">Kanade</string>
<string name="allow_unstable_updates_summary">Proposer des mises à jour des versions bêta de l\'application</string>
<string name="user_agent">En-tête UserAgent</string>
<string name="settings_apply_restart_required">Veuillez redémarrer l\'application pour appliquer ces changements</string>
</resources>

View File

@@ -5,8 +5,8 @@
<string name="local_storage">Penyimpanan lokal</string>
<string name="favourites">Favorit</string>
<string name="history">Riwayat</string>
<string name="error_occurred">Terjadi galat</string>
<string name="network_error">Tidak bisa menyambung ke internet</string>
<string name="error_occurred">Terjadi kesalahan</string>
<string name="network_error">Kesalahan jaringan</string>
<string name="details">Detail</string>
<string name="grid">Kisi</string>
<string name="list_mode">Mode daftar</string>
@@ -17,7 +17,7 @@
<string name="chapter_d_of_d">Bab %1$d dari %2$d</string>
<string name="close">Tutup</string>
<string name="try_again">Coba lagi</string>
<string name="nothing_found">Tidak ditemukan apa-apa</string>
<string name="nothing_found">Tidak ada yang ditemukan</string>
<string name="history_is_empty">Belum ada riwayat</string>
<string name="read">Baca</string>
<string name="you_have_not_favourites_yet">Belum ada favorit</string>
@@ -30,7 +30,7 @@
<string name="create_shortcut">Buat pintasan…</string>
<string name="share_s">Bagikan %s</string>
<string name="search">Cari</string>
<string name="search_manga">Cari manga</string>
<string name="search_manga">Cari komik</string>
<string name="manga_downloading_">Mengunduh…</string>
<string name="processing_">Memproses…</string>
<string name="download_complete">Diunduh</string>
@@ -39,9 +39,9 @@
<string name="popular">Populer</string>
<string name="updated">Diperbarui</string>
<string name="newest">Terbaru</string>
<string name="by_rating">Rating</string>
<string name="by_rating">Peringkat</string>
<string name="sort_order">Urutan penyortiran</string>
<string name="filter">Filter</string>
<string name="filter">Saring</string>
<string name="theme">Tema</string>
<string name="light">Terang</string>
<string name="dark">Gelap</string>
@@ -61,14 +61,14 @@
<string name="page_saved">Disimpan</string>
<string name="share_image">Bagikan gambar</string>
<string name="_import">Impor</string>
<string name="history_and_cache">Riwayat dan tembolok</string>
<string name="clear_pages_cache">Bersihkan tembolok halaman</string>
<string name="cache">Tembolok</string>
<string name="history_and_cache">Riwayat dan cache</string>
<string name="clear_pages_cache">Bersihkan cache halaman</string>
<string name="cache">Cache</string>
<string name="text_file_sizes">B|kB|MB|GB|TB</string>
<string name="standard">Standar</string>
<string name="grid_size">Ukuran kisi</string>
<string name="search_on_s">Cari di %s</string>
<string name="delete_manga">Hapus manga</string>
<string name="delete_manga">Hapus komik</string>
<string name="text_delete_local_manga">Hapus \"%s\" dari perangkat secara permanen\?</string>
<string name="reader_settings">Pengaturan pembaca</string>
<string name="switch_pages">Ganti halaman</string>
@@ -84,7 +84,7 @@
<string name="network_consumption_warning">Ini mungkin akan mentransfer banyak data</string>
<string name="dont_ask_again">Jangan tanya lagi</string>
<string name="cancelling_">Membatalkan…</string>
<string name="clear_thumbs_cache">Bersihkan tembolok keluku</string>
<string name="clear_thumbs_cache">Bersihkan cache gambar mini</string>
<string name="clear_search_history">Bersihkan riwayat pencarian</string>
<string name="search_history_cleared">Dibersihkan</string>
<string name="domain">Domain</string>
@@ -103,7 +103,7 @@
<string name="categories_">Kategori…</string>
<string name="rename">Ubah Nama</string>
<string name="category_delete_confirm">Hapus kategori \"%s\" dari favorit Anda\?
\nSemua manga di situ akan hilang.</string>
\nSemua komik di dalamnya akan hilang.</string>
<string name="text_empty_holder_primary">Sepi juga di sini…</string>
<string name="text_categories_holder">Anda bisa menggunakan kategori untuk mengelola favorit Anda. Tekan «+» untuk membuat kategori</string>
<string name="text_history_holder_primary">Apa yang Anda baca akan ditampilkan di sini</string>
@@ -112,7 +112,7 @@
<string name="manga_shelf">Rak</string>
<string name="recent_manga">Baru-baru ini</string>
<string name="pages_animation">Animasi halaman</string>
<string name="manga_save_location">Folder untuk unduhan</string>
<string name="manga_save_location">Folder unduhan</string>
<string name="not_available">Tidak tersedia</string>
<string name="cannot_find_available_storage">Tidak ada penyimpanan yang tersedia</string>
<string name="other_storage">Penyimpanan lain</string>
@@ -133,20 +133,20 @@
<string name="wrong_password">Kata sandi salah</string>
<string name="protect_application">Lindungi aplikasi</string>
<string name="repeat_password">Ulangi kata sandi</string>
<string name="update_check_failed">Tidak bisa mencari pembaruan</string>
<string name="update_check_failed">Tidak dapat mencari pembaruan</string>
<string name="scale_mode">Mode skala</string>
<string name="create_backup">Buat cadangan data</string>
<string name="data_restored">Dipulihkan</string>
<string name="report_github">Buat isu di GitHub</string>
<string name="data_restored_success">Semua data dipulihkan</string>
<string name="data_restored_with_errors">Data berhasil dipulihkan, tapi ada galat</string>
<string name="backup_information">Anda bisa membuat cadangan riwayat dan favorit Anda dan memulihkannya</string>
<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">Dulu kala</string>
<string name="long_ago">Lama</string>
<string name="group">Kelompok</string>
<string name="today">Hari ini</string>
<string name="tap_to_try_again">Ketuk untuk coba lagi</string>
<string name="reader_mode_hint">Konfigurasi yang dipilih akan diingat untuk manga ini</string>
<string name="reader_mode_hint">Konfigurasi yang dipilih akan diingat untuk komik ini</string>
<string name="silent">Diam</string>
<string name="captcha_required">CAPTCHA diperlukan</string>
<string name="captcha_solve">Selesaikan</string>
@@ -156,7 +156,7 @@
<string name="clear_feed">Bersihkan umpan</string>
<string name="check_for_new_chapters">Periksa bab baru</string>
<string name="auth_required">Masuk untuk melihat konten ini</string>
<string name="_and_x_more">…dan %1$d lagi</string>
<string name="_and_x_more">…dan %1$d lainnya</string>
<string name="next">Selanjutnya</string>
<string name="protect_application_subtitle">Masukkan kata sandi untuk memulai aplikasi</string>
<string name="confirm">Konfirmasi</string>
@@ -175,26 +175,26 @@
<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 dibaca</string>
<string name="state_ongoing">Berlanjut</string>
<string name="date_format">Format tanggal</string>
<string name="system_default">Standar</string>
<string name="exclude_nsfw_from_history">Kecualikan manga NSFW dari riwayat</string>
<string name="show_pages_numbers">Halaman bernomor</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="dynamic_theme">Tema dinamis</string>
<string name="dynamic_theme_summary">Gunakan tema yang dibuat pada skema warna gambar latar belakang Anda</string>
<string name="importing_progress">Mengimpor manga: %1$d dari %2$d</string>
<string name="importing_progress">Mengimpor komik: %1$d dari %2$d</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_all">Selalu blokir</string>
<string name="suggestions">Saran</string>
<string name="suggestions_enable">Aktifkan saran</string>
<string name="suggestions_summary">Sarankan manga berdasarkan preferensi Anda</string>
<string name="suggestions_summary">Sarankan komik berdasarkan preferensi Anda</string>
<string name="suggestions_info">Semua data dianalisis secara lokal di perangkat ini. Tidak ada transfer data personal ke layanan apa pun</string>
<string name="text_suggestion_holder">Mulai membaca manga dan Anda akan mendapatkan saran yang dipersonalisasi</string>
<string name="exclude_nsfw_from_suggestions">Jangan menyarankan manga NSFW</string>
<string name="text_suggestion_holder">Mulai membaca komik dan Anda akan mendapatkan saran yang dipersonalisasi</string>
<string name="exclude_nsfw_from_suggestions">Jangan menyarankan komik NSFW</string>
<string name="always">Selalu</string>
<string name="preload_pages">Muat ulang halaman</string>
<string name="logged_in_as">Masuk sebagai %s</string>
@@ -203,13 +203,13 @@
<string name="filter_load_error">Tidak bisa memuat daftar genre</string>
<string name="reset_filter">Atur ulang filter</string>
<string name="find_genre">Cari genre</string>
<string name="onboard_text">Pilih bahasa manga yang ingin Anda baca. Anda bisa mengubahnya nanti di pengaturan.</string>
<string name="onboard_text">Pilih bahasa komik yang ingin Anda baca. Anda bisa mengubahnya nanti di pengaturan.</string>
<string name="never">Jangan Pernah</string>
<string name="only_using_wifi">Hanya di Wi-Fi</string>
<string name="nsfw">18+</string>
<string name="various_languages">Berbagai bahasa</string>
<string name="search_chapters">Cari bab</string>
<string name="chapters_empty">Tidak ada bab di manga ini</string>
<string name="chapters_empty">Tidak ada bab di komik ini</string>
<string name="percent_string_pattern">%1$s%%</string>
<string name="appearance">Tampilan</string>
<string name="content">Konten</string>
@@ -217,16 +217,16 @@
<string name="suggestions_excluded_genres_summary">Tentukan genre yang Anda tidak ingin lihat di saran</string>
<string name="text_delete_local_manga_batch">Hapus yang dipilih dari perangkat secara permanen\?</string>
<string name="removal_completed">Selesai menghapus</string>
<string name="batch_manga_save_confirm">Apakah Anda yakin ingin mengunduh semua manga yang dipilih dengan semua babnya\? Tindakan ini akan memakan banyak data dan penyimpanan</string>
<string name="batch_manga_save_confirm">Unduh semua komik yang dipilih dan babnya\? Ini dapat mengkonsumsi banyak lalu lintas jaringan dan penyimpanan.</string>
<string name="parallel_downloads">Unduhan paralel</string>
<string name="download_slowdown">Perlambatan unduhan</string>
<string name="suggestions_updating">Saran diperbarui</string>
<string name="download_slowdown">Perlambat unduhan</string>
<string name="suggestions_updating">Pembaruan saran</string>
<string name="download_slowdown_summary">Membantu menghidari pemblokiran alamat IP Anda</string>
<string name="chapters_will_removed_background">Bab akan dihapus di latar belakang. Akan memakan beberapa waktu</string>
<string name="hide">Sembunyikan</string>
<string name="new_sources_text">Sumber manga baru tersedia</string>
<string name="new_sources_text">Tersedia sumber komik baru</string>
<string name="check_new_chapters_title">Periksa bab baru dan beri tahu tentang itu</string>
<string name="show_notification_new_chapters_on">Anda akan menerima pemberitahuan tentang pembaruan manga yang Anda baca</string>
<string name="show_notification_new_chapters_on">Anda akan menerima pemberitahuan tentang pembaruan komik yang Anda baca</string>
<string name="show_notification_new_chapters_off">Anda tidak akan menerima pemberitahuan, tapi bab baru akan disorot di daftar</string>
<string name="notifications_enable">Aktifkan pemberitahuan</string>
<string name="name">Nama</string>
@@ -240,9 +240,9 @@
<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 standar</string>
<string name="default_mode">Mode pembaca</string>
<string name="detect_reader_mode">Otomatis deteksi mode pembaca</string>
<string name="detect_reader_mode_summary">Secara otomatis mendeteksi jika manga itu webtoon</string>
<string name="detect_reader_mode_summary">Secara otomatis mendeteksi jika komik itu webtoon</string>
<string name="create_category">Kategori baru</string>
<string name="show_notification_app_update">Tampilkan pemberitahuan ketika versi baru tersedia</string>
<string name="light_indicator">Indikator LED</string>
@@ -250,7 +250,7 @@
<string name="favourites_categories">Kategori favorit</string>
<string name="remove_category">Hapus</string>
<string name="clear_updates_feed">Bersihkan umpan pembaruan</string>
<string name="right_to_left">Kanan ke kiri (←)</string>
<string name="right_to_left">Kanan ke kiri</string>
<string name="waiting_for_network">Menunggu jaringan…</string>
<string name="rotate_screen">Putar layar</string>
<string name="feed_will_update_soon">Pembaruan umpan akan dimulai</string>
@@ -262,7 +262,7 @@
<string name="app_version">Versi %s</string>
<string name="internal_storage">Penyimpanan internal</string>
<string name="external_storage">Penyimpanan eksternal</string>
<string name="error">Galat</string>
<string name="error">Kesalahan</string>
<string name="checking_for_updates">Memeriksa pembaruan…</string>
<string name="no_update_available">Tidak ada pembaruan yang tersedia</string>
<string name="black_dark_theme_summary">Menggunakan daya lebih sedikit pada layar AMOLED</string>
@@ -281,15 +281,15 @@
<string name="about_feedback">Umpan Balik</string>
<string name="error_empty_name">Anda harus memasukkan sebuah nama</string>
<string name="taps_on_edges">Tekan di tepi</string>
<string name="large_manga_save_confirm">Manga ini memiliki %s. Simpan semuanya\?</string>
<string name="zoom_mode_fit_center">Cocokkan tengah</string>
<string name="zoom_mode_fit_height">Cocokkan dengan tinggi</string>
<string name="zoom_mode_fit_width">Cocokkan dengan lebar</string>
<string name="large_manga_save_confirm">Komik ini memiliki %s. Simpan semuanya\?</string>
<string name="zoom_mode_fit_center">Pas tengah</string>
<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">Diantrikan</string>
<string name="auth_complete">Berhasil Diotorisasi</string>
<string name="queued">Antri</string>
<string name="auth_complete">Diotorisasi</string>
<string name="text_local_holder_secondary">Simpan dari sumber daring atau berkas impor.</string>
<string name="text_shelf_holder_primary">Manga Anda akan ditampilkan di sini</string>
<string name="text_shelf_holder_primary">Komik Anda akan ditampilkan di sini</string>
<string name="text_shelf_holder_secondary">Cari apa untuk dibaca di bagian «Jelajah»</string>
<string name="email_enter_hint">Masukkan surel Anda untuk melanjutkan</string>
<string name="status_re_reading">Dibaca ulang</string>
@@ -307,17 +307,17 @@
<string name="status_on_hold">Ditunda</string>
<string name="invalid_domain_message">Domain tidak valid</string>
<string name="no_bookmarks_yet">Belum ada markah</string>
<string name="no_bookmarks_summary">Anda bisa membuat markah ketika membaca manga</string>
<string name="no_bookmarks_summary">Anda bisa membuat markah ketika membaca komik</string>
<string name="bookmarks_removed">Markah dihapus</string>
<string name="no_manga_sources">Tidak ada sumber manga</string>
<string name="no_manga_sources">Tidak ada sumber komik</string>
<string name="random">Acak</string>
<string name="empty">Kosong</string>
<string name="changelog">Daftar Perubahan</string>
<string name="removed_from_s">Dihapus dari \"%s\"</string>
<string name="reader_info_bar">Tampilkan bilah informasi di pembaca</string>
<string name="importing_manga">Mengimpor manga</string>
<string name="importing_manga">Mengimpor komik</string>
<string name="last_2_hours">Dua jam terakhir</string>
<string name="downloading_manga">Mengunduh manga</string>
<string name="downloading_manga">Mengunduh komik</string>
<string name="show_all">Tampilkan semua</string>
<string name="history_cleared">Riwayat dihapus</string>
<string name="clear_all_history">Hapus semua riwayat</string>
@@ -328,49 +328,97 @@
<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">Tembolok halaman</string>
<string name="other_cache">Tembolok lainnya</string>
<string name="pages_cache">Cache halaman</string>
<string name="other_cache">Cache lainnya</string>
<string name="storage_usage">Penggunaan penyimpanan</string>
<string name="available">Tersedia</string>
<string name="incognito_mode">Mode Incognito</string>
<string name="incognito_mode">Mode penyamaran</string>
<string name="app_update_available_s">Pembaruan aplikasi tersedia: %s</string>
<string name="automatic_scroll">Gulir otomatis</string>
<string name="comics_archive">Arsip komik</string>
<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">Detail galat:&lt;br&gt;&lt;tt&gt;%1$s&lt;/tt&gt;&lt;br&gt;&lt;br&gt;1. Coba untuk &lt;a href=%2$s&gt;membuka manga di peramban web&lt;/a&gt; untuk memastikan bahwa itu tersedia di sumbernya&lt;br&gt;2. Jika tersedia, kirim laporan galat ke pengembang.</string>
<string name="manga_error_description_pattern">Detail kesalahan:&lt;br&gt;&lt;tt&gt;%1$s&lt;/tt&gt;&lt;br&gt;&lt;br&gt;1. Coba untuk &lt;a href=%2$s&gt;membuka komik di peramban web&lt;/a&gt; untuk memastikan bahwa itu tersedia di sumbernya&lt;br&gt;2. Jika tersedia, kirim 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 manga ini</string>
<string name="text_unsaved_changes_prompt">Anda memiliki perubahan belum tersimpan, apakah Anda ingin menyimpannya atau membuangnya\?</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="discard">Buang</string>
<string name="use_fingerprint">Gunakan sidik jari jika tersedia</string>
<string name="appwidget_shelf_description">Manga dari favorit Anda</string>
<string name="appwidget_recent_description">Manga yang baru-baru ini Anda baca</string>
<string name="appwidget_shelf_description">Komik dari favorit Anda</string>
<string name="appwidget_recent_description">Komik yang baru-baru ini Anda baca</string>
<string name="data_deletion">Penghapusan data</string>
<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="report">Lapor</string>
<string name="exclude_nsfw_from_history_summary">Manga yang ditandai sebagai NSFW tidak akan ditambahkan ke riwayat dan progres Anda tidak akan disimpan</string>
<string name="exclude_nsfw_from_history_summary">Komik yang ditandai sebagai NSFW tidak akan ditambahkan ke riwayat dan pencapaian Anda tidak akan disimpan</string>
<string name="clear_cookies_summary">Bisa membantu dalam beberapa masalah. Seluruh otorisasi akan menjadi tidak valid</string>
<string name="manage">Kelola</string>
<string name="no_manga_sources_text">Aktifkan sumber manga untuk membaca manga daring</string>
<string name="no_manga_sources_text">Aktifkan sumber komik untuk membaca komik daring</string>
<string name="categories_delete_confirm">Apakah Anda yakin ingin menghapus kategori favorit yang dipilih\?
\n Semua manga di sana akan hilang dan ini tidak bisa diurungkan.</string>
\nSemua komik di sana akan hilang dan ini tidak bisa diurungkan.</string>
<string name="reorder">Atur Ulang</string>
<string name="saved_manga">Manga tersimpan</string>
<string name="saved_manga">Komik tersimpan</string>
<string name="confirm_exit">Tekan Kembali lagi untuk keluar</string>
<string name="no_chapters">Tidak ada bab</string>
<string name="history_shortcuts">Tampilkan pintasan manga baru-baru ini</string>
<string name="history_shortcuts_summary">Buat manga baru-baru ini tersedia dengan menekan panjang pada ikon aplikasi</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="disable_all">Matikan semua</string>
<string name="gestures_only">Hanya gestur</string>
<string name="dns_over_https">DNS melalui HTTPS</string>
<string name="dns_over_https">DNS over HTTPS</string>
<string name="status_dropped">Istirahat</string>
<string name="off_short">Mati</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="prefetch_content">Pramuat konten</string>
<string name="memory_usage_pattern">%s - %s</string>
<string name="nothing_here">Tidak ada apapun di sini</string>
<string name="reader_control_ltr_summary">Ketuk di tepi kanan atau menekan tombol kanan akan selalu beralih ke halaman berikutnya</string>
<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="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>
<string name="user_agent">Tajuk Agen Pengguna</string>
<string name="settings_apply_restart_required">Mulai ulang aplikasi untuk menerapkan perubahan ini</string>
<string name="theme_name_kanade">Kanade</string>
<string name="share_logs">Bagikan log</string>
<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">Usulkan pembaruan ke versi beta</string>
<string name="download_started">Unduh dimulai</string>
<string name="show_reading_indicators">Tampilkan indikator kemajuan 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 merubah kueri.</string>
<string name="zoom_mode_keep_start">Tetap di awal</string>
<string name="seconds_pattern">%ss</string>
<string name="reader_info_pattern">Bab. %1$d/%2$d Hal. %3$d/%4$d</string>
<string name="enable_logging">Aktifkan pencatatan</string>
<string name="enable_logging_summary">Rekam beberapa tindakan untuk tujuan debug</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>
<string name="theme_name_miku">Miku</string>
<string name="theme_name_asuka">Asuka</string>
<string name="theme_name_mion">Mion</string>
<string name="theme_name_rikka">Rikka</string>
<string name="theme_name_sakura">Sakura</string>
<string name="local_manga_processing">Pemrosesan komik tersimpan</string>
<string name="disable_battery_optimization">Nonaktifkan pengoptimalan baterai</string>
<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_summary">Izinkan gerakan memperbesar/memperkecil tampilan dalam mode webtoon (beta)</string>
<string name="different_languages">Berbagai bahasa</string>
<string name="network_unavailable">Jaringan tidak tersedia</string>
</resources>

View File

@@ -403,8 +403,6 @@
<string name="enable_logging_summary">Registra alcune azioni a scopo di debug</string>
<string name="enable_logging">Abilita la registrazione</string>
<string name="show_suspicious_content">Mostra il contenuto sospetto</string>
<string name="theme_name_mint">Menta</string>
<string name="theme_name_october">Ottobre</string>
<string name="theme_name_dynamic">Dinamico</string>
<string name="color_theme">Schema colori</string>
<string name="show_in_grid_view">Mostra nella vista griglia</string>

View File

@@ -327,7 +327,6 @@
<string name="empty"></string>
<string name="changelog">変更ログ</string>
<string name="explore">探検</string>
<string name="tools">ツール</string>
<string name="exit_confirmation_summary">アプリを終了するには、戻るを2回押してください</string>
<string name="saved_manga">保存したマンガ</string>
<string name="app_update_available_s">アプリケーションのアップデートが利用可能: %s</string>

View File

@@ -86,7 +86,7 @@
<string name="webtoon">웹툰</string>
<string name="clear_search_history">검색 기록 지우기</string>
<string name="reader_settings">읽기 모드</string>
<string name="network_consumption_warning">이 동작은 많은 데이터 사용을</string>
<string name="network_consumption_warning">이 동작은 많은 데이터 사용을 야기할 수 있습니다</string>
<string name="clear_thumbs_cache">썸네일 캐시 지우기</string>
<string name="dont_ask_again">다시 묻지 않음</string>
<string name="cancelling_">취소 중…</string>
@@ -105,4 +105,250 @@
<string name="read_later">나중에 읽기</string>
<string name="search_results">검색 결과</string>
<string name="size_s">크기: %s</string>
<string name="computing_">계산중…</string>
<string name="clear">지우기</string>
<string name="text_clear_history_prompt">모든 기록을 영구적으로 삭제하시겠어요\?</string>
<string name="restart">재시작</string>
<string name="text_categories_holder">카테고리를 이용하여 선호작을 관리하세요. «+»을 눌러 카테고리를 만들 수 있습니다</string>
<string name="text_local_holder_primary">먼저 아무거나 저장해보세요</string>
<string name="text_feed_holder">여기서 읽고 있는 만화의 새로운 챕터들을 확인할 수 있습니다</string>
<string name="related">연관된</string>
<string name="protect_application">앱 잠금 활성화</string>
<string name="protect_application_summary">Kotatsu를 실행할 때마다 비밀번호 묻기</string>
<string name="check_for_updates">업데이트 확인하기</string>
<string name="update_check_failed">업데이트를 찾을 수 없음</string>
<string name="right_to_left">오른쪽에서 왼쪽</string>
<string name="zoom_mode_fit_center">가운데 맞춤</string>
<string name="no_update_available">가능한 업데이트 없음</string>
<string name="zoom_mode_fit_height">세로 맞춤</string>
<string name="tap_to_try_again">탭해서 재시도</string>
<string name="restore_backup">백업한 데이터 복원하기</string>
<string name="create_backup">백업하기</string>
<string name="data_restored">복원됨</string>
<string name="preparing_">준비중…</string>
<string name="welcome">환영합니다</string>
<string name="auth_complete">인증됨</string>
<string name="error_empty_name">이름을 입력해야 합니다</string>
<string name="about_feedback">피드백</string>
<string name="about_app_translation">번역</string>
<string name="about_app_translation_summary">이 앱을 번역하기</string>
<string name="dynamic_theme_summary">기기의 배경화면 색상을 기반으로 한 테마</string>
<string name="screenshots_block_nsfw">성인 컨텐츠에서만 차단</string>
<string name="screenshots_allow">항상 허용</string>
<string name="exclude_nsfw_from_suggestions">성인 만화(NSFW)는 추천하지 않기</string>
<string name="disabled">비활성화됨</string>
<string name="filter_load_error">장르 목록을 불러올 수 없음</string>
<string name="chapters_empty">이 만화는 챕터로 나눠져 있지 않습니다</string>
<string name="search_chapters">챕터 찾아보기</string>
<string name="chapters_will_removed_background">챕터들이 백그라운드에서 제거됩니다. 이 작업은 많은 시간이 소요될 수 있습니다</string>
<string name="download_slowdown_summary">IP 차단을 회피할 수 있게 합니다</string>
<string name="check_new_chapters_title">새로운 챕터가 나오면 알려주기</string>
<string name="standard">스탠다드</string>
<string name="text_local_holder_secondary">온라인 소스 혹은 직접 파일을 불러와 저장하기.</string>
<string name="suggestions_info">모든 데이터는 기기 안에서만 분석 및 사용되며 어떠한 서드파티 서비스들과도 공유되지 않습니다</string>
<string name="suggestions_summary">당신의 선호도를 바탕으로 만화를 추천합니다</string>
<string name="bookmark_add">북마크에 추가</string>
<string name="bookmark_remove">북마크 제거</string>
<string name="bookmarks">북마크</string>
<string name="data_deletion">데이터 삭제</string>
<string name="no_manga_sources">만화 소스 사이트 없음</string>
<string name="changelog">체인지로그</string>
<string name="history">최근에 본 만화</string>
<string name="error_occurred">오류 발생</string>
<string name="details">세부정보</string>
<string name="chapters">챕터</string>
<string name="detailed_list">자세한 목록</string>
<string name="list_mode">설정</string>
<string name="grid">그리드</string>
<string name="remote_sources">소스 사이트 관리</string>
<string name="clear_history">기록 삭제</string>
<string name="add">추가</string>
<string name="history_is_empty">아직 기록이 없습니다</string>
<string name="enter_category_name">카테고리 이름 추가</string>
<string name="create_shortcut">바로가기 추가…</string>
<string name="theme">테마</string>
<string name="_s_removed_from_history">\"%s\"가 라이브러리에서 삭제됨</string>
<string name="_s_deleted_from_local_storage">\"%s\"가 로컬 저장소에서 삭제됨</string>
<string name="operation_not_supported">지원되지 않는 동작입니다</string>
<string name="no_description">설명없음</string>
<string name="_continue">계속</string>
<string name="search_history_cleared">삭제됨</string>
<string name="gestures_only">제스쳐만 사용</string>
<string name="new_chapters">새로운 챕터</string>
<string name="text_empty_holder_primary">이 항목은 비어있는 것 같습니다…</string>
<string name="recent_manga">최근에 추가된</string>
<string name="manga_save_location">다운로드를 저장하기 위한 폴더</string>
<string name="manga_shelf">책장</string>
<string name="other_storage">기타 저장소</string>
<string name="updates_feed_cleared">삭제됨</string>
<string name="update">업데이트</string>
<string name="feed_will_update_soon">피드가 곧 업데이트 됩니다</string>
<string name="dont_check">확인하지 않기</string>
<string name="enter_password">비밀번호를 입력하세요</string>
<string name="wrong_password">잘못된 비밀번호</string>
<string name="rotate_screen">화면 회전</string>
<string name="track_sources">업데이트 확인하기</string>
<string name="repeat_password">비밀번호 재입력</string>
<string name="passwords_mismatch">일치하지 않는 비밀번호</string>
<string name="app_version">%s 버전</string>
<string name="about">정보</string>
<string name="checking_for_updates">업데이트 확인중…</string>
<string name="create_category">새로운 카테고리</string>
<string name="scale_mode">확대 설정</string>
<string name="zoom_mode_fit_width">가로 맞춤</string>
<string name="black_dark_theme">검은색</string>
<string name="black_dark_theme_summary">AMOLED 화면에서의 전력소모를 줄입니다</string>
<string name="backup_restore">백업 및 복원</string>
<string name="file_not_found">파일을 찾을 수 없음</string>
<string name="data_restored_success">모든 데이터 복원됨</string>
<string name="data_restored_with_errors">데이터가 복원되었지만 오류가 존재합니다</string>
<string name="backup_information">선호작이나 읽은 기록들을 백업 및 복원할 수 있습니다</string>
<string name="yesterday">어제</string>
<string name="long_ago">오래전</string>
<string name="group">그룹</string>
<string name="today">오늘</string>
<string name="captcha_required">CAPTCHA 설정이 필요합니다</string>
<string name="captcha_solve">해결됨</string>
<string name="clear_cookies">쿠키 삭제</string>
<string name="zoom_mode_keep_start">첫 칸에 맞춤</string>
<string name="report_github">Github에 문제 제기하기</string>
<string name="silent">무음</string>
<string name="reader_mode_hint">선택된 설정값이 항상 이 만화에 적용됩니다</string>
<string name="cookies_cleared">모든 쿠키가 삭제되었습니다</string>
<string name="text_clear_updates_feed_prompt">모든 업데이트 기록을 영구적으로 삭제하시겠습니까\?</string>
<string name="chapters_checking_progress">새로운 챕터 확인중: %2$d의 %1$d</string>
<string name="clear_feed">피드 정리</string>
<string name="check_for_new_chapters">새로운 챕터 확인하기</string>
<string name="sign_in">로그인</string>
<string name="auth_required">로그인이 필요합니다</string>
<string name="default_s">기본값: %s</string>
<string name="next">다음</string>
<string name="protect_application_subtitle">비밀번호를 입력하세요</string>
<string name="confirm">확인</string>
<string name="password_length_hint">최소 4자리 이상의 비밀번호를 입력해 주세요</string>
<string name="backup_saved">백업 저장됨</string>
<string name="tracker_warning">몇몇 기기들은 시스템이 백그라운드 작업을 방해할 수 있습니다.</string>
<string name="text_downloads_holder">다운로드 중인 도서 없음</string>
<string name="_and_x_more">…그리고 %1$d만큼 더</string>
<string name="search_only_on_s">%s에 대해서만 검색하기</string>
<string name="text_clear_search_history_prompt">모든 검색 기록을 영구적으로 삭제 하시겠어요\?</string>
<string name="other">기타</string>
<string name="read_more">더 읽기</string>
<string name="queued">대기열</string>
<string name="chapter_is_missing_text">이 챕터는 다운로드 하거나 온라인으로 읽어야 합니다.</string>
<string name="text_clear_cookies_prompt">모든 사이트에서 로그아웃됩니다</string>
<string name="genres">장르</string>
<string name="state_finished">완료됨</string>
<string name="date_format">날짜 초기화</string>
<string name="system_default">기본</string>
<string name="exclude_nsfw_from_history">기록에서 성인 만화(NSFW) 제외하기</string>
<string name="chapter_is_missing">찾으시는 챕터가 존재하지 않습니다</string>
<string name="about_feedback_4pda">4PDA에 토픽 생성하기</string>
<string name="auth_not_supported_by">%s에 로그인은 지원되지 않습니다</string>
<string name="available_sources">사용 가능한 소스 사이트</string>
<string name="dynamic_theme">동적 테마</string>
<string name="screenshots_policy">스크린샷 규칙</string>
<string name="screenshots_block_all">항상 차단</string>
<string name="suggestions">추천</string>
<string name="suggestions_enable">추천 켜기</string>
<string name="importing_progress">만화를 추가하는 중: %2$d의 %1$d</string>
<string name="text_suggestion_holder">아무 만화나 읽어보세요 당신의 기록을 바탕으로 개인화된 추천 만화를 제공합니다</string>
<string name="enabled">활성화됨</string>
<string name="reset_filter">필터 초기화</string>
<string name="find_genre">장르 찾기</string>
<string name="only_using_wifi">와이파이에 연결된 경우에만</string>
<string name="always">항상</string>
<string name="onboard_text">무슨 언어의 만화를 읽을지 선택하세요. 나중에 설정에서 이를 변경할 수 있습니다.</string>
<string name="nsfw">18+</string>
<string name="percent_string_pattern">%1$s%%</string>
<string name="content">컨텐츠</string>
<string name="preload_pages">페이지 미리 로드하기</string>
<string name="logged_in_as">%s로 로그인 됨</string>
<string name="appearance">외관</string>
<string name="suggestions_excluded_genres">제외할 장르 선택</string>
<string name="suggestions_excluded_genres_summary">추천 목록에서 보고 싶지 않은 장르를 특정합니다</string>
<string name="text_delete_local_manga_batch">선택된 항목을 기기에서 영구히 제거하시겠어요\?</string>
<string name="removal_completed">제거 완료</string>
<string name="batch_manga_save_confirm">선택된 모든 만화와 챕터들을 다운로드 받으시겠어요\? 많은 데이터와 기기 저장소 용량을 소비합니다.</string>
<string name="suggestions_updating">추천 항목 업데이트 중</string>
<string name="canceled">취소됨</string>
<string name="name">이름</string>
<string name="disable_battery_optimization">배터리 최적화 해제하기</string>
<string name="disable_battery_optimization_summary">백그라운드에서의 업데이트 확인이 안드로이드 시스템에 의해 중지되지 않습니다</string>
<string name="send">보내기</string>
<string name="use_fingerprint">가능할 경우 지문 사용</string>
<string name="select_range">범위 선택</string>
<string name="history_cleared">기록 삭제됨</string>
<string name="random">랜덤</string>
<string name="not_found_404">컨텐츠를 찾을 수 없거나 제거되었습니다</string>
<string name="downloading_manga">만화 다운로드 중</string>
<string name="incognito_mode">사생활 보호 모드</string>
<string name="app_update_available_s">애플리케이션 업데이트가 가능합니다: %s</string>
<string name="no_chapters">챕터 없음</string>
<string name="automatic_scroll">자동 스크롤</string>
<string name="reader_info_bar">리더 안에서 만화 정보 보여주기</string>
<string name="feed">피드</string>
<string name="show_notification_new_chapters_on">읽고 있는 만화의 업데이트 알림을 수신할 수 있게 됩니다</string>
<string name="show_notification_new_chapters_off">알림은 받지 못하지만 여전히 새로운 챕터들이 목록 상에서 강조 표시되어 보여집니다</string>
<string name="notifications_enable">알림 활성화</string>
<string name="edit">수정</string>
<string name="edit_category">카테고리 수정</string>
<string name="tracking">새로운 소식 추적</string>
<string name="empty_favourite_categories">선호 표시된 카테고리 없음</string>
<string name="logout">로그아웃</string>
<string name="bookmark_removed">북마크 제거됨</string>
<string name="bookmark_added">북마크 추가됨</string>
<string name="undo">실행취소</string>
<string name="removed_from_history">기록에서 지우기</string>
<string name="dns_over_https">DNS over HTTPS 활성화</string>
<string name="default_mode">기본 모드</string>
<string name="detect_reader_mode_summary">왭툰 자동 감지</string>
<string name="crash_text">오류. 저희가 고칠 수 있게 버그 정보를 보내주세요.</string>
<string name="status_planned">계획됨</string>
<string name="status_reading">읽는 중</string>
<string name="status_re_reading">다시 읽는 중</string>
<string name="status_completed">완료됨</string>
<string name="disable_all">모두 비활성화</string>
<string name="appwidget_shelf_description">선호작 목록에 존재하는 만화</string>
<string name="appwidget_recent_description">최근에 본 만화</string>
<string name="report">제보하기</string>
<string name="show_reading_indicators">읽기 진행 상황 표시</string>
<string name="exclude_nsfw_from_history_summary">성인 만화는 읽은 기록에 포함되지 않으며 읽기 진행 상황은 저장되지 않습니다</string>
<string name="show_all">모두 보여주기</string>
<string name="invalid_domain_message">유효하지 않은 도메인</string>
<string name="clear_all_history">모든 기록 삭제</string>
<string name="last_2_hours">지난 2시간</string>
<string name="manage">관리</string>
<string name="no_bookmarks_yet">아직 추가된 븍마크가 없습니다</string>
<string name="no_bookmarks_summary">만화를 읽는 도중 북마크를 추가할 수 있습니다</string>
<string name="bookmarks_removed">북마크 제거됨</string>
<string name="no_manga_sources_text">만화를 읽기 위해 만화 소스 사이트를 활성화 하세요</string>
<string name="categories_delete_confirm">정말 선택된 즐겨 찾는 카테고리를 삭제하시겠습니까\?
\n해당 카테고리의 모든 만화가 손실되며 취소할 수 없습니다.</string>
<string name="empty">비어있음</string>
<string name="confirm_exit">뒤로가기 버튼을 다시 눌러 나가기</string>
<string name="exit_confirmation_summary">뒤로가기 버튼을 두 번 눌러 앱을 종료할 수 있습니다</string>
<string name="exit_confirmation">앱 종료 확인</string>
<string name="saved_manga">저장된 만화</string>
<string name="pages_cache">페이지 캐시</string>
<string name="other_cache">기타 캐시</string>
<string name="storage_usage">저장소 사용량</string>
<string name="memory_usage_pattern">%s -%s</string>
<string name="enter_email_text">이메일을 입력하여 계속</string>
<string name="removed_from_favourites">즐겨찾기 목록에서 제거됨</string>
<string name="removed_from_s">\"%s\"에서 제거됨</string>
<string name="reader_info_pattern">챕터.%1$d/%2$d 페이지.%3$d/%4$d</string>
<string name="comics_archive">코믹스 모음</string>
<string name="import_completed">가져오기 완료</string>
<string name="import_completed_hint">본 파일을 제거함으로써 저장소 공간을 아낄 수 있습니다</string>
<string name="import_will_start_soon">가져오기가 곧 시작됩니다</string>
<string name="history_shortcuts">최근 추가된 만화 바로가기 보여주기</string>
<string name="hide">숨기기</string>
<string name="new_sources_text">새로운 만화 소스 사이트 사용 가능</string>
<string name="account_already_exists">계정이 이미 존재합니다</string>
<string name="back">뒤로가기</string>
<string name="sync">동기화</string>
<string name="sync_title">데이터 동기화 하기</string>
<string name="email_enter_hint">이메일을 입력하여 계속</string>
<string name="download_slowdown">다운로드 속도 늦추기</string>
</resources>

View File

@@ -341,7 +341,6 @@
<string name="exit_confirmation">Avsluttingsbekreftelse</string>
<string name="invalid_domain_message">Ugyldig daomene</string>
<string name="share_logs">Del loggføring</string>
<string name="theme_name_october">Oktober</string>
<string name="color_theme">Fargedrakt</string>
<string name="theme_name_dynamic">Dynamisk</string>
<string name="language">Språk</string>

View File

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="pages">
<item quantity="one">कुल %1$d पृष्ठ</item>
<item quantity="other">कुल %1$d पृष्ठहरू</item>
</plurals>
<plurals name="new_chapters">
<item quantity="one">%1$d नयाँ अध्याय</item>
<item quantity="other">%1$d नयाँ अध्यायहरू</item>
</plurals>
<plurals name="chapters">
<item quantity="one">%1$d अध्याय</item>
<item quantity="other">%1$d अध्यायहरू</item>
</plurals>
<plurals name="minutes_ago">
<item quantity="one">%1$d मिनेट पहिले</item>
<item quantity="other">%1$d मिनेट पहिले</item>
</plurals>
<plurals name="hours_ago">
<item quantity="one">%1$d घण्टा पहिले</item>
<item quantity="other">%1$d घण्टा पहिले</item>
</plurals>
<plurals name="items">
<item quantity="one">%1$d वस्तु</item>
<item quantity="other">%1$d वस्तुहरू</item>
</plurals>
<plurals name="chapters_from_x">
<item quantity="one">%2$d बाट %1$d अध्याय</item>
<item quantity="other">%2$d बाट %1$d अध्यायहरू</item>
</plurals>
<plurals name="days_ago">
<item quantity="one">%1$d दिन अघि</item>
<item quantity="other">%1$d दिन पहिले</item>
</plurals>
</resources>

View File

@@ -0,0 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="manga_downloading_">डाउनलोड गर्दै…</string>
<string name="download_complete">डाउनलोड गरेको</string>
<string name="filter">फिल्टर</string>
<string name="dark">अँध्यारो</string>
<string name="clear">खाली गर्नुहोस्</string>
<string name="pages">पृष्ठहरू</string>
<string name="error_occurred">एउटा त्रुटि भयो</string>
<string name="list_mode">सूची मोड</string>
<string name="list">सूची</string>
<string name="try_again">पुनः प्रयास गर्नुहोस्</string>
<string name="nothing_found">केही पनि फेला परेन</string>
<string name="read">पढ्नुहोस्</string>
<string name="local_storage">लोकल भण्डारण</string>
<string name="history">इतिहास</string>
<string name="network_error">नेटवर्क त्रुटि</string>
<string name="chapters">अध्यायहरू</string>
<string name="settings">सेटिङहरू</string>
<string name="remote_sources">रिमोट स्रोतहरू</string>
<string name="loading_">लोड हुँदै…</string>
<string name="clear_history">इतिहास खाली गर्नुहोस्</string>
<string name="you_have_not_favourites_yet">अहिले कुनै मनपर्ने छैन</string>
<string name="add_to_favourites">मनपर्ने मा राख्नुहोस्</string>
<string name="add_new_category">नयाँ वर्ग</string>
<string name="enter_category_name">वर्ग को नाम लेख्नुहोस्</string>
<string name="share_s">%s साझा गर्नुहोस्</string>
<string name="search">खोज्नुहोस्</string>
<string name="search_manga">माङ्गा खोज्नुहोस्</string>
<string name="processing_">प्रक्रिया गर्दैछ…</string>
<string name="downloads">डाउनलोडहरू</string>
<string name="by_name">नाम</string>
<string name="updated">अपडेट गरियो</string>
<string name="newest">नवीनतम</string>
<string name="sort_order">क्रमबद्ध क्रम</string>
<string name="theme">थीम</string>
<string name="light">उज्यालो</string>
<string name="automatic">सिस्टम पालना गर्नुहोस्</string>
<string name="computing_">कम्प्युटिङ…</string>
<string name="close_menu">मेनु बन्द गर्नुहोस्</string>
<string name="open_menu">मेनु खोल्नुहोस्</string>
<string name="favourites">मनपर्नेहरू</string>
<string name="details">विवरणहरू</string>
<string name="detailed_list">विस्तृत सूची</string>
<string name="grid">ग्रिड</string>
<string name="chapter_d_of_d">%2$d को अध्याय %1$d</string>
<string name="close">बन्द गर्नुहोस्</string>
<string name="history_is_empty">अहिलेसम्म इतिहास छैन</string>
<string name="add">थप्नुहोस्</string>
<string name="save">बचत गर्नुहोस्</string>
<string name="share">साझा गर्नुहोस्</string>
<string name="create_shortcut">सर्टकट सिर्जना गर्नुहोस्…</string>
<string name="popular">लोकप्रिय</string>
<string name="by_rating">मूल्याङ्कन</string>
<string name="new_chapters">नयाँ अध्यायहरू</string>
</resources>

View File

@@ -8,7 +8,7 @@
<string name="favourites">Favoritos</string>
<string name="history">Histórico</string>
<string name="error_occurred">Um erro ocorreu</string>
<string name="network_error">Não foi possível conectar à Internet</string>
<string name="network_error">Erro de rede</string>
<string name="details">Detalhes</string>
<string name="chapters">Capítulos</string>
<string name="list">Lista</string>
@@ -385,4 +385,32 @@
<string name="text_unsaved_changes_prompt">Você tem alterações não salvas, deseja salvá-las ou descartá-las\?</string>
<string name="discard">Descartar</string>
<string name="not_found_404">Conteúdo não encontrado ou removido</string>
<string name="services">Serviços</string>
<string name="nothing_here">Não há nada aqui</string>
<string name="server_error">Erro do lado do servidor (%1$d). Por favor, tente novamente mais tarde</string>
<string name="compact">Compactar</string>
<string name="enable_logging">Habilitar registros</string>
<string name="share_logs">Compartilhar registros</string>
<string name="error_no_space_left">Não há espaço disponível no aparelho</string>
<string name="network_unavailable">A rede não está disponível</string>
<string name="network_unavailable_hint">Ative o Wi-Fi ou a rede móvel para ler mangá online</string>
<string name="allow_unstable_updates">Permitir atualizações instáveis</string>
<string name="download_started">Download iniciado</string>
<string name="language">Idioma</string>
<string name="mark_as_current">Marcar como atual</string>
<string name="show_in_grid_view">Mostrar na visualização em grade</string>
<string name="color_theme">Esquema de cores</string>
<string name="show_suspicious_content">Exibir conteúdo suspeito</string>
<string name="prefetch_content">Pré-carregamento de conteúdo</string>
<string name="theme_name_dynamic">Dinâmico</string>
<string name="settings_apply_restart_required">Por favor, reinicie o app para aplicar essas mudanças</string>
<string name="different_languages">Idiomas diferentes</string>
<string name="theme_name_asuka">Asuka</string>
<string name="theme_name_mion">Mion</string>
<string name="theme_name_rikka">Rikka</string>
<string name="theme_name_sakura">Sakura</string>
<string name="source_disabled">Fonte desativada</string>
<string name="enable_logging_summary">Gravar algumas ações para propósitos de depuração</string>
<string name="theme_name_mamimi">Mamimi</string>
<string name="theme_name_miku">Miku</string>
</resources>

View File

@@ -396,4 +396,23 @@
<string name="reader_control_ltr">Controle de leitura ergonômico</string>
<string name="color_correction_hint">As configurações de cor escolhidas serão lembradas para esse mangá</string>
<string name="discard">Descartar</string>
<string name="language">Idioma</string>
<string name="theme_name_mamimi">Mamimi</string>
<string name="nothing_here">Não há nada aqui</string>
<string name="services">Serviços</string>
<string name="enable_logging_summary">Gravar algumas ações para propósitos de depuração</string>
<string name="allow_unstable_updates">Permitir atualizações instáveis</string>
<string name="download_started">Descarga iniciada</string>
<string name="share_logs">Compartilhar registos</string>
<string name="enable_logging">Ativar registos</string>
<string name="theme_name_miku">Miku</string>
<string name="theme_name_rikka">Rikka</string>
<string name="theme_name_sakura">Sakura</string>
<string name="show_suspicious_content">Exibir conteúdo suspeito</string>
<string name="theme_name_dynamic">Dinâmico</string>
<string name="color_theme">Esquema de cores</string>
<string name="show_in_grid_view">Mostrar na visualização em grade</string>
<string name="theme_name_asuka">Asuka</string>
<string name="theme_name_mion">Mion</string>
<string name="settings_apply_restart_required">Por favor, reinicie o app para aplicar essas mudanças</string>
</resources>

View File

@@ -331,7 +331,6 @@
<string name="reorder">Упорядочить</string>
<string name="empty">Пусто</string>
<string name="explore">Обзор</string>
<string name="tools">Инструменты</string>
<string name="confirm_exit">Нажмите Назад ещё раз, чтобы выйти</string>
<string name="exit_confirmation_summary">Нажмите Назад 2 раза для выхода из приложения</string>
<string name="other_cache">Другой кэш</string>
@@ -404,10 +403,8 @@
<string name="enable_logging">Включить логирование</string>
<string name="enable_logging_summary">Записывать некоторые действия для отладки</string>
<string name="show_suspicious_content">Отображать сомнительный контент</string>
<string name="theme_name_mint">Мята</string>
<string name="theme_name_dynamic">Динамическая</string>
<string name="color_theme">Цветовая схема</string>
<string name="theme_name_october">Октябрь</string>
<string name="show_in_grid_view">Показать в виде сетки</string>
<string name="theme_name_miku">Мику</string>
<string name="theme_name_asuka">Аска</string>
@@ -422,4 +419,6 @@
<string name="download_started">Загрузка началась</string>
<string name="allow_unstable_updates">Разрешить нестабильные обновления</string>
<string name="allow_unstable_updates_summary">Предлагать обновления до бета-версий приложения</string>
<string name="settings_apply_restart_required">Пожалуйста, перезапустите приложение, чтобы применить эти изменения</string>
<string name="user_agent">Заголовок UserAgent</string>
</resources>

View File

@@ -409,4 +409,16 @@
<string name="theme_name_dynamic">Dinamik</string>
<string name="color_theme">renk vurgusu</string>
<string name="show_in_grid_view">Izgara görünümünde göster</string>
<string name="theme_name_mamimi">Mamimi</string>
<string name="theme_name_kanade">Kanade</string>
<string name="user_agent">UserAgent başlığı</string>
<string name="allow_unstable_updates_summary">Uygulamanın beta sürümleri için güncellemeler öner</string>
<string name="allow_unstable_updates">Kararsız güncellemelere izin ver</string>
<string name="download_started">İndirme başladı</string>
<string name="theme_name_miku">Miku</string>
<string name="theme_name_asuka">Asuka</string>
<string name="theme_name_mion">Mion</string>
<string name="theme_name_rikka">Rikka</string>
<string name="theme_name_sakura">Sakura</string>
<string name="settings_apply_restart_required">Bu değişiklikleri uygulamak için lütfen uygulamayı yeniden başlatın</string>
</resources>

View File

@@ -20,7 +20,7 @@
<string name="favourites">Уподобання</string>
<string name="history">Історія</string>
<string name="error_occurred">Сталася помилка</string>
<string name="chapters">Глави</string>
<string name="chapters">Розділи</string>
<string name="list">Список</string>
<string name="detailed_list">Детальний список</string>
<string name="list_mode">Режим списку</string>
@@ -64,7 +64,7 @@
<string name="cache">Кеш</string>
<string name="text_file_sizes">Б|кБ|МБ|ГБ|ТБ</string>
<string name="standard">Стандартний</string>
<string name="webtoon">Вебтун</string>
<string name="webtoon">Манхва</string>
<string name="read_mode">Режим читання</string>
<string name="grid_size">Розмір сітки</string>
<string name="search_on_s">Пошук по %s</string>
@@ -88,7 +88,7 @@
<string name="save_manga">Зберегти</string>
<string name="notifications">Сповіщення</string>
<string name="enabled_d_of_d" tools:ignore="PluralsCandidate">Увімкнено %1$d з %2$d</string>
<string name="new_chapters">Нові глави</string>
<string name="new_chapters">Нові розділи</string>
<string name="download">Завантажити</string>
<string name="read_from_start">Читати з початку</string>
<string name="restart">Перезавантажити</string>
@@ -416,4 +416,9 @@
<string name="theme_name_dynamic">Динамічний</string>
<string name="color_theme">Колірний акцент</string>
<string name="show_in_grid_view">Показати у вигляді сітки</string>
<string name="allow_unstable_updates">Дозволити нестабільні оновлення</string>
<string name="allow_unstable_updates_summary">Пропонувати оновлення до бета-версій додатку</string>
<string name="download_started">Завантаження розпочато</string>
<string name="user_agent">Заголовок UserAgent</string>
<string name="settings_apply_restart_required">Перезапустіть програму, щоб застосувати зміни</string>
</resources>

View File

@@ -4,5 +4,4 @@
<dimen name="grid_spacing_outer">2dp</dimen>
<dimen name="preferred_grid_width">140dp</dimen>
<dimen name="bottom_sheet_width">420dp</dimen>
<dimen name="fragment_horizontal_margin">48dp</dimen>
</resources>

View File

@@ -405,8 +405,6 @@
<string name="show_suspicious_content">显示可疑内容</string>
<string name="theme_name_dynamic">动态</string>
<string name="color_theme">颜色方案</string>
<string name="theme_name_mint">薄荷绿</string>
<string name="theme_name_october">October</string>
<string name="show_in_grid_view">用网格视图显示</string>
<string name="theme_name_miku">Miku</string>
<string name="theme_name_asuka">Asuka</string>
@@ -421,4 +419,6 @@
<string name="allow_unstable_updates">允许不稳定更新</string>
<string name="allow_unstable_updates_summary">提示更新到测试版</string>
<string name="download_started">已开始下载</string>
<string name="user_agent">UserAgent 标头</string>
<string name="settings_apply_restart_required">要应用这些更改请重启程序</string>
</resources>

View File

@@ -5,4 +5,5 @@
<bool name="light_navigation_bar">false</bool>
<bool name="com_samsung_android_icon_container_has_icon_container">true</bool>
<bool name="is_color_themes_available">false</bool>
<bool name="is_sync_enabled">false</bool>
</resources>

View File

@@ -6,9 +6,16 @@
<string name="url_twitter" translatable="false">https://twitter.com/kotatsuapp</string>
<string name="url_reddit" translatable="false">https://reddit.com/user/kotatsuapp</string>
<string name="url_weblate" translatable="false">https://hosted.weblate.org/engage/kotatsu</string>
<string name="url_error_report" translatable="false">https://acra.rumblur.space/report</string>
<string name="url_error_report" translatable="false">https://acra.kotatsu.app/report</string>
<string name="account_type_sync" translatable="false">org.kotatsu.sync</string>
<string name="url_sync_server" translatable="false">http://86.57.183.214:8081</string>
<string name="url_sync_server" translatable="false">https://sync.kotatsu.app</string>
<string name="shikimori_clientId" translatable="false">Mw6F0tPEOgyV7F9U9Twg50Q8SndMY7hzIOfXg0AX_XU</string>
<string name="shikimori_clientSecret" translatable="false">euBMt1GGRSDpVIFQVPxZrO7Kh6X4gWyv0dABuj4B-M8</string>
<string name="anilist_clientId" translatable="false">9887</string>
<string name="anilist_clientSecret" translatable="false">wrMqFosItQWsmB8dtAHfIFPDt15FfQi2ZGiKkJoW</string>
<string name="mal_clientId" translatable="false">6cd8e6349e9a36bc1fc1ab97703c9fd1</string>
<string name="acra_login" translatable="false">SxhkCVnqVLbGogvi</string>
<string name="acra_password" translatable="false">xPDACTLHnHU9Nfjv</string>
<string-array name="values_theme" translatable="false">
<item>-1</item>
<item>1</item>

View File

@@ -424,4 +424,6 @@
<string name="allow_unstable_updates">Allow unstable updates</string>
<string name="allow_unstable_updates_summary">Propose updates to beta versions of the app</string>
<string name="download_started">Download started</string>
<string name="user_agent">UserAgent header</string>
<string name="settings_apply_restart_required">Please restart the application to apply these changes</string>
</resources>

View File

@@ -86,7 +86,6 @@
<style name="Widget.Kotatsu.SearchView" parent="@style/Widget.AppCompat.SearchView">
<item name="iconifiedByDefault">false</item>
<item name="searchIcon">@null</item>
<item name="hintTextAppearance">?textAppearanceBodyMedium</item>
<item name="queryBackground">@null</item>
<item name="android:textColorHint">?attr/colorControlNormal</item>
<item name="android:textSize">18sp</item>
@@ -164,9 +163,10 @@
<item name="iconGravity">start</item>
<item name="android:insetTop">2dp</item>
<item name="android:insetBottom">2dp</item>
<item name="iconTint">?attr/colorSecondary</item>
<item name="iconTint">?attr/colorPrimaryDark</item>
<item name="android:gravity">start|center_vertical</item>
<item name="android:textAppearance">?textAppearanceButton</item>
<item name="backgroundTint">@color/colored_button</item>
</style>
<style name="Widget.Kotatsu.TextView.Indicator" parent="Widget.MaterialComponents.TextView">

View File

@@ -20,12 +20,6 @@
android:title="@string/suggestions"
app:allowDividerAbove="true" />
<ListPreference
android:entries="@array/doh_providers"
android:key="doh"
android:title="@string/dns_over_https"
app:useSimpleSummaryProvider="true" />
<ListPreference
android:defaultValue="0"
android:entries="@array/network_policy"
@@ -56,6 +50,17 @@
android:valueTo="5"
app:defaultValue="2" />
<ListPreference
android:entries="@array/doh_providers"
android:key="doh"
android:title="@string/dns_over_https"
app:allowDividerAbove="true"
app:useSimpleSummaryProvider="true" />
<SwitchPreferenceCompat
android:key="ssl_bypass"
android:title="Ignore SSL errors" />
<PreferenceScreen
android:fragment="org.koitharu.kotatsu.settings.backup.BackupSettingsFragment"
android:title="@string/backup_restore"

View File

@@ -4,6 +4,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto">
<Preference
android:enabled="@bool/is_sync_enabled"
android:key="sync"
android:persistent="false"
android:summary="@string/sync_title"

View File

@@ -4,9 +4,9 @@ buildscript {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.4.1'
classpath 'com.android.tools.build:gradle:7.4.2'
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.10'
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.44.2'
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.45'
}
}
@@ -20,15 +20,6 @@ allprojects {
}
}
String localProperty(String name, String defaultValue = 'null') {
Properties localProperties = new Properties()
project.rootProject.file('local.properties').withInputStream { localProperties.load(it) }
def value = localProperties[name]
return value != null ? value : defaultValue
}
String currentBranch() {
def branchName = ""
try {

View File

@@ -1,7 +1,7 @@
#Fri Jan 20 14:35:39 EET 2023
#Sat Feb 25 17:16:02 EET 2023
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionSha256Sum=7ba68c54029790ab444b39d7e293d3236b2632631fb5f2e012bb28b4ff669e4b
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
distributionSha256Sum=6147605a23b4eff6c334927a86ff3508cb5d6722cd624c97ded4c2e8640f1f87
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists