Compare commits

...

39 Commits

Author SHA1 Message Date
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
45 changed files with 3904 additions and 3406 deletions

View File

@@ -8,15 +8,15 @@ plugins {
android { android {
compileSdk = 33 compileSdk = 33
buildToolsVersion = '33.0.1' buildToolsVersion = '33.0.2'
namespace = 'org.koitharu.kotatsu' namespace = 'org.koitharu.kotatsu'
defaultConfig { defaultConfig {
applicationId 'org.koitharu.kotatsu' applicationId 'org.koitharu.kotatsu'
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 33 targetSdkVersion 33
versionCode 518 versionCode 522
versionName '4.4.2' versionName '4.4.6'
generatedDensities = [] generatedDensities = []
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
@@ -25,15 +25,6 @@ android {
arg 'room.schemaLocation', "$projectDir/schemas".toString() 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 { buildTypes {
debug { debug {
@@ -87,7 +78,8 @@ afterEvaluate {
} }
} }
dependencies { dependencies {
implementation('com.github.KotatsuApp:kotatsu-parsers:1093584202') { //noinspection GradleDependency
implementation('com.github.KotatsuApp:kotatsu-parsers:cc418570d5') {
exclude group: 'org.json', module: 'json' exclude group: 'org.json', module: 'json'
} }
@@ -141,7 +133,7 @@ dependencies {
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.10' debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.10'
testImplementation 'junit:junit:4.13.2' 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' testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4'
androidTestImplementation 'androidx.test:runner:1.5.2' androidTestImplementation 'androidx.test:runner:1.5.2'

View File

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

View File

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

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

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

View File

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

View File

@@ -60,6 +60,9 @@ fun mangaListDetailedItemAD(
lifecycle(lifecycleOwner) lifecycle(lifecycleOwner)
enqueueWith(coil) enqueueWith(coil)
} }
if (payloads.isEmpty()) {
binding.scrollViewTags.scrollTo(0, 0)
}
binding.chipsTags.setChips(item.tags) binding.chipsTags.setChips(item.tags)
binding.ratingBar.isVisible = item.manga.hasRating binding.ratingBar.isVisible = item.manga.hasRating
binding.ratingBar.rating = binding.ratingBar.numStars * item.manga.rating 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 com.tomclaw.cache.DiskLruCache
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runInterruptible
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.koitharu.kotatsu.utils.FileSize import org.koitharu.kotatsu.utils.FileSize
import org.koitharu.kotatsu.utils.ext.copyToSuspending 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), size = FileSize.MEGABYTES.convert(200, FileSize.BYTES),
) )
operator fun get(url: String): File? { suspend fun get(url: String): File? = runInterruptible(Dispatchers.IO) {
return lruCache.get(url)?.takeIfReadable() lruCache.get(url)?.takeIfReadable()
} }
suspend fun put(url: String, inputStream: InputStream): File = withContext(Dispatchers.IO) { 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(), id = entryUri.longHashCode(),
url = entryUri, url = entryUri,
preview = null, preview = null,
referer = chapter.url,
source = MangaSource.LOCAL, source = MangaSource.LOCAL,
) )
} }

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,12 +1,14 @@
package org.koitharu.kotatsu.scrobbling.anilist.data package org.koitharu.kotatsu.scrobbling.anilist.data
import android.content.Context
import dagger.hilt.android.qualifiers.ApplicationContext
import okhttp3.FormBody import okhttp3.FormBody
import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody import okhttp3.RequestBody.Companion.toRequestBody
import org.json.JSONObject 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.core.db.MangaDatabase
import org.koitharu.kotatsu.parsers.exception.GraphQLException import org.koitharu.kotatsu.parsers.exception.GraphQLException
import org.koitharu.kotatsu.parsers.model.MangaChapter 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.json.mapJSON
import org.koitharu.kotatsu.parsers.util.parseJson import org.koitharu.kotatsu.parsers.util.parseJson
import org.koitharu.kotatsu.parsers.util.toIntUp 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.ScrobblerStorage
import org.koitharu.kotatsu.scrobbling.common.data.ScrobblingEntity import org.koitharu.kotatsu.scrobbling.common.data.ScrobblingEntity
import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblerManga 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" private const val KEY_SCORE_FORMAT = "score_format"
class AniListRepository( class AniListRepository(
@ApplicationContext context: Context,
private val okHttp: OkHttpClient, private val okHttp: OkHttpClient,
private val storage: ScrobblerStorage, private val storage: ScrobblerStorage,
private val db: MangaDatabase, 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 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" "redirect_uri=${REDIRECT_URI}&response_type=code"
override val isAuthorized: Boolean override val isAuthorized: Boolean
@@ -48,8 +55,8 @@ class AniListRepository(
override suspend fun authorize(code: String?) { override suspend fun authorize(code: String?) {
val body = FormBody.Builder() val body = FormBody.Builder()
body.add("client_id", BuildConfig.ANILIST_CLIENT_ID) body.add("client_id", clientId)
body.add("client_secret", BuildConfig.ANILIST_CLIENT_SECRET) body.add("client_secret", clientSecret)
if (code != null) { if (code != null) {
body.add("grant_type", "authorization_code") body.add("grant_type", "authorization_code")
body.add("redirect_uri", REDIRECT_URI) body.add("redirect_uri", REDIRECT_URI)

View File

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

View File

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

View File

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

View File

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

View File

@@ -52,7 +52,7 @@ abstract class SyncProvider : ContentProvider() {
.selection(selection, selectionArgs) .selection(selection, selectionArgs)
.orderBy(sortOrder) .orderBy(sortOrder)
.create() .create()
logger.log("query: ${sqlQuery.sql}") logger.log("query: ${sqlQuery.sql} (${selectionArgs.contentToString()})")
return database.openHelper.readableDatabase.query(sqlQuery) return database.openHelper.readableDatabase.query(sqlQuery)
} }
@@ -75,7 +75,7 @@ abstract class SyncProvider : ContentProvider() {
override fun delete(uri: Uri, selection: String?, selectionArgs: Array<out String>?): Int { override fun delete(uri: Uri, selection: String?, selectionArgs: Array<out String>?): Int {
val table = getTableName(uri) ?: return 0 val table = getTableName(uri) ?: return 0
logger.log { "delete: $table ($selection) : ($selectionArgs)" } logger.log { "delete: $table ($selection) : (${selectionArgs.contentToString()})" }
return database.openHelper.writableDatabase.delete(table, selection, selectionArgs) return database.openHelper.writableDatabase.delete(table, selection, selectionArgs)
} }
@@ -84,7 +84,7 @@ abstract class SyncProvider : ContentProvider() {
if (values == null || table == null) { if (values == null || table == null) {
return 0 return 0
} }
logger.log { "update: $table ($selection) : ($selectionArgs) [$values]" } logger.log { "update: $table ($selection) : (${selectionArgs.contentToString()}) [$values]" }
return database.openHelper.writableDatabase return database.openHelper.writableDatabase
.update(table, SQLiteDatabase.CONFLICT_IGNORE, values, selection, selectionArgs) .update(table, SQLiteDatabase.CONFLICT_IGNORE, values, selection, selectionArgs)
} }

View File

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

View File

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

View File

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

View File

@@ -403,7 +403,5 @@
<string name="show_suspicious_content">Verdächtige Inhalte anzeigen</string> <string name="show_suspicious_content">Verdächtige Inhalte anzeigen</string>
<string name="status_dropped">Abgebrochen</string> <string name="status_dropped">Abgebrochen</string>
<string name="color_theme">Farbschema</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> <string name="theme_name_dynamic">Dynamisch</string>
</resources> </resources>

View File

@@ -360,7 +360,6 @@
<string name="explore">Explorar</string> <string name="explore">Explorar</string>
<string name="memory_usage_pattern">%s - %s</string> <string name="memory_usage_pattern">%s - %s</string>
<string name="changelog">Registro de cambios</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_summary">Pulse dos veces «Atrás» para salir de la aplicación</string>
<string name="exit_confirmation">Confirmación de salida</string> <string name="exit_confirmation">Confirmación de salida</string>
<string name="pages_cache">Caché de páginas</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_summary">Grabar algunas acciones para depurar</string>
<string name="enable_logging">Activar el registro</string> <string name="enable_logging">Activar el registro</string>
<string name="show_suspicious_content">Mostrar contenido sospechoso</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="theme_name_dynamic">Dinámico</string>
<string name="color_theme">Esquema de colores</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="show_in_grid_view">Mostrar en vista de cuadrícula</string>
<string name="theme_name_asuka">Asuka</string> <string name="theme_name_asuka">Asuka</string>
<string name="theme_name_mion">Mion</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_summary">Actualizaciones propuestas para las versiones beta de la aplicación</string>
<string name="allow_unstable_updates">Permitir actualizaciones inestables</string> <string name="allow_unstable_updates">Permitir actualizaciones inestables</string>
<string name="download_started">Descarga iniciada</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> </resources>

View File

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

View File

@@ -41,7 +41,7 @@
<string name="large_manga_save_confirm">Ang manga na ito ay may %s. I-save ang lahat ng ito\?</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="notifications">Mga abiso</string>
<string name="enabled_d_of_d" tools:ignore="PluralsCandidate">%1$d ng %2$d sa</string> <string name="enabled_d_of_d" tools:ignore="PluralsCandidate">%1$d ng %2$d sa</string>
<string name="new_chapters">Bagong mga kabanata</string> <string name="new_chapters">Mga bagong kabanata</string>
<string name="read_from_start">Basahin mula sa simula</string> <string name="read_from_start">Basahin mula sa simula</string>
<string name="restart">I-restart</string> <string name="restart">I-restart</string>
<string name="categories_">Mga kategorya…</string> <string name="categories_">Mga kategorya…</string>

View File

@@ -403,10 +403,8 @@
<string name="enable_logging_summary">Enregistrer certaines actions à des fins de débogage</string> <string name="enable_logging_summary">Enregistrer certaines actions à des fins de débogage</string>
<string name="language">Langue</string> <string name="language">Langue</string>
<string name="show_suspicious_content">Afficher le contenu suspect</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="theme_name_dynamic">Dynamique</string>
<string name="color_theme">Schéma de couleurs</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="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="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="services">Prestations de service</string>
@@ -421,4 +419,6 @@
<string name="download_started">Téléchargement commencé</string> <string name="download_started">Téléchargement commencé</string>
<string name="theme_name_kanade">Kanade</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="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> </resources>

View File

@@ -5,8 +5,8 @@
<string name="local_storage">Penyimpanan lokal</string> <string name="local_storage">Penyimpanan lokal</string>
<string name="favourites">Favorit</string> <string name="favourites">Favorit</string>
<string name="history">Riwayat</string> <string name="history">Riwayat</string>
<string name="error_occurred">Terjadi galat</string> <string name="error_occurred">Terjadi kesalahan</string>
<string name="network_error">Tidak bisa menyambung ke internet</string> <string name="network_error">Kesalahan jaringan</string>
<string name="details">Detail</string> <string name="details">Detail</string>
<string name="grid">Kisi</string> <string name="grid">Kisi</string>
<string name="list_mode">Mode daftar</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="chapter_d_of_d">Bab %1$d dari %2$d</string>
<string name="close">Tutup</string> <string name="close">Tutup</string>
<string name="try_again">Coba lagi</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="history_is_empty">Belum ada riwayat</string>
<string name="read">Baca</string> <string name="read">Baca</string>
<string name="you_have_not_favourites_yet">Belum ada favorit</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="create_shortcut">Buat pintasan…</string>
<string name="share_s">Bagikan %s</string> <string name="share_s">Bagikan %s</string>
<string name="search">Cari</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="manga_downloading_">Mengunduh…</string>
<string name="processing_">Memproses…</string> <string name="processing_">Memproses…</string>
<string name="download_complete">Diunduh</string> <string name="download_complete">Diunduh</string>
@@ -39,9 +39,9 @@
<string name="popular">Populer</string> <string name="popular">Populer</string>
<string name="updated">Diperbarui</string> <string name="updated">Diperbarui</string>
<string name="newest">Terbaru</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="sort_order">Urutan penyortiran</string>
<string name="filter">Filter</string> <string name="filter">Saring</string>
<string name="theme">Tema</string> <string name="theme">Tema</string>
<string name="light">Terang</string> <string name="light">Terang</string>
<string name="dark">Gelap</string> <string name="dark">Gelap</string>
@@ -61,14 +61,14 @@
<string name="page_saved">Disimpan</string> <string name="page_saved">Disimpan</string>
<string name="share_image">Bagikan gambar</string> <string name="share_image">Bagikan gambar</string>
<string name="_import">Impor</string> <string name="_import">Impor</string>
<string name="history_and_cache">Riwayat dan tembolok</string> <string name="history_and_cache">Riwayat dan cache</string>
<string name="clear_pages_cache">Bersihkan tembolok halaman</string> <string name="clear_pages_cache">Bersihkan cache halaman</string>
<string name="cache">Tembolok</string> <string name="cache">Cache</string>
<string name="text_file_sizes">B|kB|MB|GB|TB</string> <string name="text_file_sizes">B|kB|MB|GB|TB</string>
<string name="standard">Standar</string> <string name="standard">Standar</string>
<string name="grid_size">Ukuran kisi</string> <string name="grid_size">Ukuran kisi</string>
<string name="search_on_s">Cari di %s</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="text_delete_local_manga">Hapus \"%s\" dari perangkat secara permanen\?</string>
<string name="reader_settings">Pengaturan pembaca</string> <string name="reader_settings">Pengaturan pembaca</string>
<string name="switch_pages">Ganti halaman</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="network_consumption_warning">Ini mungkin akan mentransfer banyak data</string>
<string name="dont_ask_again">Jangan tanya lagi</string> <string name="dont_ask_again">Jangan tanya lagi</string>
<string name="cancelling_">Membatalkan…</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="clear_search_history">Bersihkan riwayat pencarian</string>
<string name="search_history_cleared">Dibersihkan</string> <string name="search_history_cleared">Dibersihkan</string>
<string name="domain">Domain</string> <string name="domain">Domain</string>
@@ -103,7 +103,7 @@
<string name="categories_">Kategori…</string> <string name="categories_">Kategori…</string>
<string name="rename">Ubah Nama</string> <string name="rename">Ubah Nama</string>
<string name="category_delete_confirm">Hapus kategori \"%s\" dari favorit Anda\? <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_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_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> <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="manga_shelf">Rak</string>
<string name="recent_manga">Baru-baru ini</string> <string name="recent_manga">Baru-baru ini</string>
<string name="pages_animation">Animasi halaman</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="not_available">Tidak tersedia</string>
<string name="cannot_find_available_storage">Tidak ada penyimpanan yang tersedia</string> <string name="cannot_find_available_storage">Tidak ada penyimpanan yang tersedia</string>
<string name="other_storage">Penyimpanan lain</string> <string name="other_storage">Penyimpanan lain</string>
@@ -133,20 +133,20 @@
<string name="wrong_password">Kata sandi salah</string> <string name="wrong_password">Kata sandi salah</string>
<string name="protect_application">Lindungi aplikasi</string> <string name="protect_application">Lindungi aplikasi</string>
<string name="repeat_password">Ulangi kata sandi</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="scale_mode">Mode skala</string>
<string name="create_backup">Buat cadangan data</string> <string name="create_backup">Buat cadangan data</string>
<string name="data_restored">Dipulihkan</string> <string name="data_restored">Dipulihkan</string>
<string name="report_github">Buat isu di GitHub</string> <string name="report_github">Buat isu di GitHub</string>
<string name="data_restored_success">Semua data dipulihkan</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="data_restored_with_errors">Data berhasil dipulihkan, tapi ada kesalahan</string>
<string name="backup_information">Anda bisa membuat cadangan riwayat dan favorit Anda dan memulihkannya</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="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="group">Kelompok</string>
<string name="today">Hari ini</string> <string name="today">Hari ini</string>
<string name="tap_to_try_again">Ketuk untuk coba lagi</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="silent">Diam</string>
<string name="captcha_required">CAPTCHA diperlukan</string> <string name="captcha_required">CAPTCHA diperlukan</string>
<string name="captcha_solve">Selesaikan</string> <string name="captcha_solve">Selesaikan</string>
@@ -156,7 +156,7 @@
<string name="clear_feed">Bersihkan umpan</string> <string name="clear_feed">Bersihkan umpan</string>
<string name="check_for_new_chapters">Periksa bab baru</string> <string name="check_for_new_chapters">Periksa bab baru</string>
<string name="auth_required">Masuk untuk melihat konten ini</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="next">Selanjutnya</string>
<string name="protect_application_subtitle">Masukkan kata sandi untuk memulai aplikasi</string> <string name="protect_application_subtitle">Masukkan kata sandi untuk memulai aplikasi</string>
<string name="confirm">Konfirmasi</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="text_clear_cookies_prompt">Anda akan keluar dari semua sumber</string>
<string name="genres">Genre</string> <string name="genres">Genre</string>
<string name="state_finished">Selesai</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="date_format">Format tanggal</string>
<string name="system_default">Standar</string> <string name="system_default">Standar</string>
<string name="exclude_nsfw_from_history">Kecualikan manga NSFW dari riwayat</string> <string name="exclude_nsfw_from_history">Kecualikan komik NSFW dari riwayat</string>
<string name="show_pages_numbers">Halaman bernomor</string> <string name="show_pages_numbers">Nomor halaman</string>
<string name="enabled_sources">Sumber yang digunakan</string> <string name="enabled_sources">Sumber yang digunakan</string>
<string name="available_sources">Sumber yang tersedia</string> <string name="available_sources">Sumber yang tersedia</string>
<string name="dynamic_theme">Tema dinamis</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="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_policy">Kebijakan tangkapan layar</string>
<string name="screenshots_allow">Bolehkan</string> <string name="screenshots_allow">Bolehkan</string>
<string name="screenshots_block_nsfw">Blokir pada NSFW</string> <string name="screenshots_block_nsfw">Blokir pada NSFW</string>
<string name="screenshots_block_all">Selalu blokir</string> <string name="screenshots_block_all">Selalu blokir</string>
<string name="suggestions">Saran</string> <string name="suggestions">Saran</string>
<string name="suggestions_enable">Aktifkan 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="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="text_suggestion_holder">Mulai membaca komik dan Anda akan mendapatkan saran yang dipersonalisasi</string>
<string name="exclude_nsfw_from_suggestions">Jangan menyarankan manga NSFW</string> <string name="exclude_nsfw_from_suggestions">Jangan menyarankan komik NSFW</string>
<string name="always">Selalu</string> <string name="always">Selalu</string>
<string name="preload_pages">Muat ulang halaman</string> <string name="preload_pages">Muat ulang halaman</string>
<string name="logged_in_as">Masuk sebagai %s</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="filter_load_error">Tidak bisa memuat daftar genre</string>
<string name="reset_filter">Atur ulang filter</string> <string name="reset_filter">Atur ulang filter</string>
<string name="find_genre">Cari genre</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="never">Jangan Pernah</string>
<string name="only_using_wifi">Hanya di Wi-Fi</string> <string name="only_using_wifi">Hanya di Wi-Fi</string>
<string name="nsfw">18+</string> <string name="nsfw">18+</string>
<string name="various_languages">Berbagai bahasa</string> <string name="various_languages">Berbagai bahasa</string>
<string name="search_chapters">Cari bab</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="percent_string_pattern">%1$s%%</string>
<string name="appearance">Tampilan</string> <string name="appearance">Tampilan</string>
<string name="content">Konten</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="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="text_delete_local_manga_batch">Hapus yang dipilih dari perangkat secara permanen\?</string>
<string name="removal_completed">Selesai menghapus</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="parallel_downloads">Unduhan paralel</string>
<string name="download_slowdown">Perlambatan unduhan</string> <string name="download_slowdown">Perlambat unduhan</string>
<string name="suggestions_updating">Saran diperbarui</string> <string name="suggestions_updating">Pembaruan saran</string>
<string name="download_slowdown_summary">Membantu menghidari pemblokiran alamat IP Anda</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="chapters_will_removed_background">Bab akan dihapus di latar belakang. Akan memakan beberapa waktu</string>
<string name="hide">Sembunyikan</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="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="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="notifications_enable">Aktifkan pemberitahuan</string>
<string name="name">Nama</string> <string name="name">Nama</string>
@@ -240,9 +240,9 @@
<string name="bookmark_added">Markah ditambahkan</string> <string name="bookmark_added">Markah ditambahkan</string>
<string name="undo">Urung</string> <string name="undo">Urung</string>
<string name="removed_from_history">Dihapus dari riwayat</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">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="create_category">Kategori baru</string>
<string name="show_notification_app_update">Tampilkan pemberitahuan ketika versi baru tersedia</string> <string name="show_notification_app_update">Tampilkan pemberitahuan ketika versi baru tersedia</string>
<string name="light_indicator">Indikator LED</string> <string name="light_indicator">Indikator LED</string>
@@ -250,7 +250,7 @@
<string name="favourites_categories">Kategori favorit</string> <string name="favourites_categories">Kategori favorit</string>
<string name="remove_category">Hapus</string> <string name="remove_category">Hapus</string>
<string name="clear_updates_feed">Bersihkan umpan pembaruan</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="waiting_for_network">Menunggu jaringan…</string>
<string name="rotate_screen">Putar layar</string> <string name="rotate_screen">Putar layar</string>
<string name="feed_will_update_soon">Pembaruan umpan akan dimulai</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="app_version">Versi %s</string>
<string name="internal_storage">Penyimpanan internal</string> <string name="internal_storage">Penyimpanan internal</string>
<string name="external_storage">Penyimpanan eksternal</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="checking_for_updates">Memeriksa pembaruan…</string>
<string name="no_update_available">Tidak ada pembaruan yang tersedia</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> <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="about_feedback">Umpan Balik</string>
<string name="error_empty_name">Anda harus memasukkan sebuah nama</string> <string name="error_empty_name">Anda harus memasukkan sebuah nama</string>
<string name="taps_on_edges">Tekan di tepi</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="large_manga_save_confirm">Komik ini memiliki %s. Simpan semuanya\?</string>
<string name="zoom_mode_fit_center">Cocokkan tengah</string> <string name="zoom_mode_fit_center">Pas tengah</string>
<string name="zoom_mode_fit_height">Cocokkan dengan tinggi</string> <string name="zoom_mode_fit_height">Pas tinggi</string>
<string name="zoom_mode_fit_width">Cocokkan dengan lebar</string> <string name="zoom_mode_fit_width">Pas lebar</string>
<string name="reverse">Balik</string> <string name="reverse">Balik</string>
<string name="queued">Diantrikan</string> <string name="queued">Antri</string>
<string name="auth_complete">Berhasil Diotorisasi</string> <string name="auth_complete">Diotorisasi</string>
<string name="text_local_holder_secondary">Simpan dari sumber daring atau berkas impor.</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="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="email_enter_hint">Masukkan surel Anda untuk melanjutkan</string>
<string name="status_re_reading">Dibaca ulang</string> <string name="status_re_reading">Dibaca ulang</string>
@@ -307,17 +307,17 @@
<string name="status_on_hold">Ditunda</string> <string name="status_on_hold">Ditunda</string>
<string name="invalid_domain_message">Domain tidak valid</string> <string name="invalid_domain_message">Domain tidak valid</string>
<string name="no_bookmarks_yet">Belum ada markah</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="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="random">Acak</string>
<string name="empty">Kosong</string> <string name="empty">Kosong</string>
<string name="changelog">Daftar Perubahan</string> <string name="changelog">Daftar Perubahan</string>
<string name="removed_from_s">Dihapus dari \"%s\"</string> <string name="removed_from_s">Dihapus dari \"%s\"</string>
<string name="reader_info_bar">Tampilkan bilah informasi di pembaca</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="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="show_all">Tampilkan semua</string>
<string name="history_cleared">Riwayat dihapus</string> <string name="history_cleared">Riwayat dihapus</string>
<string name="clear_all_history">Hapus semua riwayat</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="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_summary">Tekan Kembali dua kali untuk keluar dari aplikasi</string>
<string name="exit_confirmation">Konfirmasi keluar</string> <string name="exit_confirmation">Konfirmasi keluar</string>
<string name="pages_cache">Tembolok halaman</string> <string name="pages_cache">Cache halaman</string>
<string name="other_cache">Tembolok lainnya</string> <string name="other_cache">Cache lainnya</string>
<string name="storage_usage">Penggunaan penyimpanan</string> <string name="storage_usage">Penggunaan penyimpanan</string>
<string name="available">Tersedia</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="app_update_available_s">Pembaruan aplikasi tersedia: %s</string>
<string name="automatic_scroll">Gulir otomatis</string> <string name="automatic_scroll">Gulir otomatis</string>
<string name="comics_archive">Arsip komik</string> <string name="comics_archive">Arsip komik</string>
<string name="folder_with_images">Folder dengan gambar</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="import_completed_hint">Anda bisa menghapus berkas asli dari penyimpanan untuk menghemat ruang</string>
<string name="feed">Umpan</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="brightness">Kecerahan</string>
<string name="contrast">Kontras</string> <string name="contrast">Kontras</string>
<string name="reset">Atur Ulang</string> <string name="reset">Atur Ulang</string>
<string name="color_correction_hint">Pengaturan warna yang dipilih akan diingat untuk manga ini</string> <string name="color_correction_hint">Pengaturan warna yang dipilih akan diingat untuk komik ini</string>
<string name="text_unsaved_changes_prompt">Anda memiliki perubahan belum tersimpan, apakah Anda ingin menyimpannya atau membuangnya\?</string> <string name="text_unsaved_changes_prompt">Menyimpan atau membuang perubahan yang belum disimpan\?</string>
<string name="discard">Buang</string> <string name="discard">Buang</string>
<string name="use_fingerprint">Gunakan sidik jari jika tersedia</string> <string name="use_fingerprint">Gunakan sidik jari jika tersedia</string>
<string name="appwidget_shelf_description">Manga dari favorit Anda</string> <string name="appwidget_shelf_description">Komik dari favorit Anda</string>
<string name="appwidget_recent_description">Manga yang baru-baru ini Anda baca</string> <string name="appwidget_recent_description">Komik yang baru-baru ini Anda baca</string>
<string name="data_deletion">Penghapusan data</string> <string name="data_deletion">Penghapusan data</string>
<string name="account_already_exists">Akun sudah ada</string> <string name="account_already_exists">Akun sudah ada</string>
<string name="back">Kembali</string> <string name="back">Kembali</string>
<string name="disable_battery_optimization_summary">Membantu pemeriksaan pembaruan di latar belakang</string> <string name="disable_battery_optimization_summary">Membantu pemeriksaan pembaruan di latar belakang</string>
<string name="crash_text">Ada sesuatu yang salah. Mohon untuk mengirim laporan kutu (bug) ke pengembang untuk membantu kami memperbaikinya.</string> <string name="crash_text">Ada sesuatu yang salah. Mohon untuk mengirim laporan kutu (bug) ke pengembang untuk membantu kami memperbaikinya.</string>
<string name="report">Lapor</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="clear_cookies_summary">Bisa membantu dalam beberapa masalah. Seluruh otorisasi akan menjadi tidak valid</string>
<string name="manage">Kelola</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\? <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="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="confirm_exit">Tekan Kembali lagi untuk keluar</string>
<string name="no_chapters">Tidak ada bab</string> <string name="no_chapters">Tidak ada bab</string>
<string name="history_shortcuts">Tampilkan pintasan manga baru-baru ini</string> <string name="history_shortcuts">Tampilkan pintasan komik 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_summary">Buat komik baru-baru ini tersedia dengan menekan panjang pada ikon aplikasi</string>
<string name="select_range">Pilih jangkauan</string> <string name="select_range">Pilih jangkauan</string>
<string name="disable_all">Matikan semua</string> <string name="disable_all">Matikan semua</string>
<string name="gestures_only">Hanya gestur</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="status_dropped">Istirahat</string>
<string name="off_short">Mati</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> </resources>

View File

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

View File

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

View File

@@ -86,7 +86,7 @@
<string name="webtoon">웹툰</string> <string name="webtoon">웹툰</string>
<string name="clear_search_history">검색 기록 지우기</string> <string name="clear_search_history">검색 기록 지우기</string>
<string name="reader_settings">읽기 모드</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="clear_thumbs_cache">썸네일 캐시 지우기</string>
<string name="dont_ask_again">다시 묻지 않음</string> <string name="dont_ask_again">다시 묻지 않음</string>
<string name="cancelling_">취소 중…</string> <string name="cancelling_">취소 중…</string>
@@ -105,4 +105,250 @@
<string name="read_later">나중에 읽기</string> <string name="read_later">나중에 읽기</string>
<string name="search_results">검색 결과</string> <string name="search_results">검색 결과</string>
<string name="size_s">크기: %s</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> </resources>

View File

@@ -341,7 +341,6 @@
<string name="exit_confirmation">Avsluttingsbekreftelse</string> <string name="exit_confirmation">Avsluttingsbekreftelse</string>
<string name="invalid_domain_message">Ugyldig daomene</string> <string name="invalid_domain_message">Ugyldig daomene</string>
<string name="share_logs">Del loggføring</string> <string name="share_logs">Del loggføring</string>
<string name="theme_name_october">Oktober</string>
<string name="color_theme">Fargedrakt</string> <string name="color_theme">Fargedrakt</string>
<string name="theme_name_dynamic">Dynamisk</string> <string name="theme_name_dynamic">Dynamisk</string>
<string name="language">Språk</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="favourites">Favoritos</string>
<string name="history">Histórico</string> <string name="history">Histórico</string>
<string name="error_occurred">Um erro ocorreu</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="details">Detalhes</string>
<string name="chapters">Capítulos</string> <string name="chapters">Capítulos</string>
<string name="list">Lista</string> <string name="list">Lista</string>
@@ -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="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="discard">Descartar</string>
<string name="not_found_404">Conteúdo não encontrado ou removido</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> </resources>

View File

@@ -396,4 +396,23 @@
<string name="reader_control_ltr">Controle de leitura ergonômico</string> <string name="reader_control_ltr">Controle de leitura ergonômico</string>
<string name="color_correction_hint">As configurações de cor escolhidas serão lembradas para esse mangá</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="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> </resources>

View File

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

View File

@@ -409,4 +409,16 @@
<string name="theme_name_dynamic">Dinamik</string> <string name="theme_name_dynamic">Dinamik</string>
<string name="color_theme">renk vurgusu</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="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> </resources>

View File

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

View File

@@ -421,4 +421,6 @@
<string name="allow_unstable_updates">允许不稳定更新</string> <string name="allow_unstable_updates">允许不稳定更新</string>
<string name="allow_unstable_updates_summary">提示更新到测试版</string> <string name="allow_unstable_updates_summary">提示更新到测试版</string>
<string name="download_started">已开始下载</string> <string name="download_started">已开始下载</string>
<string name="user_agent">UserAgent 标头</string>
<string name="settings_apply_restart_required">要应用这些更改请重启程序</string>
</resources> </resources>

View File

@@ -6,9 +6,16 @@
<string name="url_twitter" translatable="false">https://twitter.com/kotatsuapp</string> <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_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_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="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"> <string-array name="values_theme" translatable="false">
<item>-1</item> <item>-1</item>
<item>1</item> <item>1</item>

View File

@@ -425,4 +425,5 @@
<string name="allow_unstable_updates_summary">Propose updates to beta versions of the app</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="download_started">Download started</string>
<string name="user_agent">UserAgent header</string> <string name="user_agent">UserAgent header</string>
<string name="settings_apply_restart_required">Please restart the application to apply these changes</string>
</resources> </resources>

View File

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

View File

@@ -4,7 +4,7 @@ buildscript {
mavenCentral() mavenCentral()
} }
dependencies { 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 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.10'
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.45' 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() { String currentBranch() {
def branchName = "" def branchName = ""
try { try {