Compare commits
35 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b57069c55f | ||
|
|
5b1a4d3ff5 | ||
|
|
2b26f944d0 | ||
|
|
a15197f69d | ||
|
|
41f64b2e36 | ||
|
|
bec032c7dc | ||
|
|
0ffefddb86 | ||
|
|
09b154c997 | ||
|
|
d9f3b4f76e | ||
|
|
8ebb3ef804 | ||
|
|
b03682a81f | ||
|
|
5dd54be06c | ||
|
|
98c0b60207 | ||
|
|
10a0009532 | ||
|
|
5e203f0b27 | ||
|
|
46fc48cfd7 | ||
|
|
e8a17708d2 | ||
|
|
061eaa2a56 | ||
|
|
bc6e29b562 | ||
|
|
d8c1dcef29 | ||
|
|
ca281afba1 | ||
|
|
cde07a60d7 | ||
|
|
e31af0f43f | ||
|
|
15dd0f38e7 | ||
|
|
d93647e889 | ||
|
|
509d9a2fba | ||
|
|
879d05f1a6 | ||
|
|
ecf6bbfb66 | ||
|
|
bc42fda786 | ||
|
|
d3590372f3 | ||
|
|
88f55997fa | ||
|
|
0a1bc6716b | ||
|
|
559e546462 | ||
|
|
6c5775a2ed | ||
|
|
4858adbbe7 |
@@ -16,8 +16,8 @@ android {
|
||||
applicationId 'org.koitharu.kotatsu'
|
||||
minSdk = 21
|
||||
targetSdk = 34
|
||||
versionCode = 630
|
||||
versionName = '6.8'
|
||||
versionCode = 632
|
||||
versionName = '6.8.2'
|
||||
generatedDensities = []
|
||||
testInstrumentationRunner 'org.koitharu.kotatsu.HiltTestRunner'
|
||||
ksp {
|
||||
@@ -82,7 +82,7 @@ afterEvaluate {
|
||||
}
|
||||
dependencies {
|
||||
//noinspection GradleDependency
|
||||
implementation('com.github.KotatsuApp:kotatsu-parsers:639895f511') {
|
||||
implementation('com.github.KotatsuApp:kotatsu-parsers:44ea9fe709') {
|
||||
exclude group: 'org.json', module: 'json'
|
||||
}
|
||||
|
||||
@@ -104,7 +104,7 @@ dependencies {
|
||||
implementation 'androidx.viewpager2:viewpager2:1.1.0-beta02'
|
||||
implementation 'androidx.preference:preference-ktx:1.2.1'
|
||||
implementation 'androidx.biometric:biometric-ktx:1.2.0-alpha05'
|
||||
implementation 'com.google.android.material:material:1.12.0-alpha03'
|
||||
implementation 'com.google.android.material:material:1.12.0-beta01'
|
||||
implementation 'androidx.lifecycle:lifecycle-common-java8:2.7.0'
|
||||
implementation 'androidx.webkit:webkit:1.10.0'
|
||||
|
||||
@@ -127,8 +127,8 @@ dependencies {
|
||||
implementation 'com.hannesdorfmann:adapterdelegates4-kotlin-dsl:4.3.2'
|
||||
implementation 'com.hannesdorfmann:adapterdelegates4-kotlin-dsl-viewbinding:4.3.2'
|
||||
|
||||
implementation 'com.google.dagger:hilt-android:2.51'
|
||||
kapt 'com.google.dagger:hilt-compiler:2.51'
|
||||
implementation 'com.google.dagger:hilt-android:2.51.1'
|
||||
kapt 'com.google.dagger:hilt-compiler:2.51.1'
|
||||
implementation 'androidx.hilt:hilt-work:1.2.0'
|
||||
kapt 'androidx.hilt:hilt-compiler:1.2.0'
|
||||
|
||||
@@ -161,6 +161,6 @@ dependencies {
|
||||
androidTestImplementation 'androidx.room:room-testing:2.6.1'
|
||||
androidTestImplementation 'com.squareup.moshi:moshi-kotlin:1.15.1'
|
||||
|
||||
androidTestImplementation 'com.google.dagger:hilt-android-testing:2.51'
|
||||
kaptAndroidTest 'com.google.dagger:hilt-android-compiler:2.51'
|
||||
androidTestImplementation 'com.google.dagger:hilt-android-testing:2.51.1'
|
||||
kaptAndroidTest 'com.google.dagger:hilt-android-compiler:2.51.1'
|
||||
}
|
||||
|
||||
@@ -5,9 +5,7 @@ import org.koitharu.kotatsu.core.db.MangaDatabase
|
||||
import org.koitharu.kotatsu.core.model.getPreferredBranch
|
||||
import org.koitharu.kotatsu.core.parser.MangaDataRepository
|
||||
import org.koitharu.kotatsu.core.parser.MangaRepository
|
||||
import org.koitharu.kotatsu.details.domain.DetailsLoadUseCase
|
||||
import org.koitharu.kotatsu.details.domain.ProgressUpdateUseCase
|
||||
import org.koitharu.kotatsu.favourites.data.FavouriteEntity
|
||||
import org.koitharu.kotatsu.history.data.HistoryEntity
|
||||
import org.koitharu.kotatsu.history.data.PROGRESS_NONE
|
||||
import org.koitharu.kotatsu.history.data.toMangaHistory
|
||||
@@ -21,7 +19,6 @@ class MigrateUseCase @Inject constructor(
|
||||
private val mangaDataRepository: MangaDataRepository,
|
||||
private val database: MangaDatabase,
|
||||
private val progressUpdateUseCase: ProgressUpdateUseCase,
|
||||
private val useCase: DetailsLoadUseCase
|
||||
) {
|
||||
|
||||
suspend operator fun invoke(oldManga: Manga, newManga: Manga) {
|
||||
@@ -41,16 +38,12 @@ class MigrateUseCase @Inject constructor(
|
||||
database.withTransaction {
|
||||
// replace favorites
|
||||
val favoritesDao = database.getFavouritesDao()
|
||||
val oldFavourite = favoritesDao.find(oldDetails.id)
|
||||
if (oldFavourite != null) {
|
||||
val oldFavourites = favoritesDao.findAllRaw(oldDetails.id)
|
||||
if (oldFavourites.isNotEmpty()) {
|
||||
favoritesDao.delete(oldManga.id)
|
||||
for (f in oldFavourite.categories) {
|
||||
val e = FavouriteEntity(
|
||||
for (f in oldFavourites) {
|
||||
val e = f.copy(
|
||||
mangaId = newManga.id,
|
||||
categoryId = f.categoryId.toLong(),
|
||||
sortKey = f.sortKey,
|
||||
createdAt = f.createdAt,
|
||||
deletedAt = 0,
|
||||
)
|
||||
favoritesDao.upsert(e)
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package org.koitharu.kotatsu.browser
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.ActivityNotFoundException
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
@@ -13,17 +12,25 @@ import androidx.core.graphics.Insets
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.core.view.updatePadding
|
||||
import org.koitharu.kotatsu.R
|
||||
import org.koitharu.kotatsu.core.network.CommonHeaders
|
||||
import org.koitharu.kotatsu.core.parser.MangaRepository
|
||||
import org.koitharu.kotatsu.core.parser.RemoteMangaRepository
|
||||
import org.koitharu.kotatsu.core.ui.BaseActivity
|
||||
import org.koitharu.kotatsu.core.util.ext.configureForParser
|
||||
import org.koitharu.kotatsu.core.util.ext.getSerializableExtraCompat
|
||||
import org.koitharu.kotatsu.core.util.ext.toUriOrNull
|
||||
import org.koitharu.kotatsu.databinding.ActivityBrowserBinding
|
||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||
import javax.inject.Inject
|
||||
import com.google.android.material.R as materialR
|
||||
|
||||
@SuppressLint("SetJavaScriptEnabled")
|
||||
class BrowserActivity : BaseActivity<ActivityBrowserBinding>(), BrowserCallback {
|
||||
|
||||
private lateinit var onBackPressedCallback: WebViewBackPressedCallback
|
||||
|
||||
@Inject
|
||||
lateinit var mangaRepositoryFactory: MangaRepository.Factory
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
if (!setContentViewWebViewSafe { ActivityBrowserBinding.inflate(layoutInflater) }) {
|
||||
@@ -33,7 +40,11 @@ class BrowserActivity : BaseActivity<ActivityBrowserBinding>(), BrowserCallback
|
||||
setDisplayHomeAsUpEnabled(true)
|
||||
setHomeAsUpIndicator(materialR.drawable.abc_ic_clear_material)
|
||||
}
|
||||
viewBinding.webView.configureForParser(null)
|
||||
val userAgent = intent?.getSerializableExtraCompat<MangaSource>(EXTRA_SOURCE)?.let { source ->
|
||||
val repository = mangaRepositoryFactory.create(source) as? RemoteMangaRepository
|
||||
repository?.headers?.get(CommonHeaders.USER_AGENT)
|
||||
}
|
||||
viewBinding.webView.configureForParser(userAgent)
|
||||
CookieManager.getInstance().setAcceptThirdPartyCookies(viewBinding.webView, true)
|
||||
viewBinding.webView.webViewClient = BrowserClient(this)
|
||||
viewBinding.webView.webChromeClient = ProgressChromeClient(viewBinding.progressBar)
|
||||
@@ -54,16 +65,6 @@ class BrowserActivity : BaseActivity<ActivityBrowserBinding>(), BrowserCallback
|
||||
}
|
||||
}
|
||||
|
||||
override fun onSaveInstanceState(outState: Bundle) {
|
||||
super.onSaveInstanceState(outState)
|
||||
viewBinding.webView.saveState(outState)
|
||||
}
|
||||
|
||||
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
|
||||
super.onRestoreInstanceState(savedInstanceState)
|
||||
viewBinding.webView.restoreState(savedInstanceState)
|
||||
}
|
||||
|
||||
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
||||
super.onCreateOptionsMenu(menu)
|
||||
menuInflater.inflate(R.menu.opt_browser, menu)
|
||||
@@ -136,11 +137,13 @@ class BrowserActivity : BaseActivity<ActivityBrowserBinding>(), BrowserCallback
|
||||
companion object {
|
||||
|
||||
private const val EXTRA_TITLE = "title"
|
||||
private const val EXTRA_SOURCE = "source"
|
||||
|
||||
fun newIntent(context: Context, url: String, title: String?): Intent {
|
||||
fun newIntent(context: Context, url: String, source: MangaSource?, title: String?): Intent {
|
||||
return Intent(context, BrowserActivity::class.java)
|
||||
.setData(Uri.parse(url))
|
||||
.putExtra(EXTRA_TITLE, title)
|
||||
.putExtra(EXTRA_SOURCE, source)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ class CaptchaNotifier(
|
||||
) : EventListener {
|
||||
|
||||
fun notify(exception: CloudFlareProtectedException) {
|
||||
if (!context.checkNotificationPermission()) {
|
||||
if (!context.checkNotificationPermission(CHANNEL_ID)) {
|
||||
return
|
||||
}
|
||||
val manager = NotificationManagerCompat.from(context)
|
||||
|
||||
@@ -81,16 +81,6 @@ class CloudFlareActivity : BaseActivity<ActivityBrowserBinding>(), CloudFlareCal
|
||||
super.onDestroy()
|
||||
}
|
||||
|
||||
override fun onSaveInstanceState(outState: Bundle) {
|
||||
super.onSaveInstanceState(outState)
|
||||
viewBinding.webView.saveState(outState)
|
||||
}
|
||||
|
||||
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
|
||||
super.onRestoreInstanceState(savedInstanceState)
|
||||
viewBinding.webView.restoreState(savedInstanceState)
|
||||
}
|
||||
|
||||
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
|
||||
menuInflater.inflate(R.menu.opt_captcha, menu)
|
||||
return super.onCreateOptionsMenu(menu)
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
package org.koitharu.kotatsu.core.exceptions
|
||||
|
||||
import okio.IOException
|
||||
|
||||
class NoDataReceivedException(
|
||||
private val url: String,
|
||||
) : IOException("No data has been received from $url")
|
||||
@@ -82,7 +82,7 @@ class ExceptionResolver : ActivityResultCallback<TaggedActivityResult> {
|
||||
|
||||
private fun openInBrowser(url: String) {
|
||||
val context = activity ?: fragment?.activity ?: return
|
||||
context.startActivity(BrowserActivity.newIntent(context, url, null))
|
||||
context.startActivity(BrowserActivity.newIntent(context, url, null, null))
|
||||
}
|
||||
|
||||
private fun openAlternatives(manga: Manga) {
|
||||
|
||||
@@ -16,6 +16,7 @@ import org.koitharu.kotatsu.core.network.cookies.MutableCookieJar
|
||||
import org.koitharu.kotatsu.core.prefs.SourceSettings
|
||||
import org.koitharu.kotatsu.core.util.ext.configureForParser
|
||||
import org.koitharu.kotatsu.core.util.ext.printStackTraceDebug
|
||||
import org.koitharu.kotatsu.core.util.ext.sanitizeHeaderValue
|
||||
import org.koitharu.kotatsu.core.util.ext.toList
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.config.MangaSourceConfig
|
||||
@@ -41,7 +42,7 @@ class MangaLoaderContextImpl @Inject constructor(
|
||||
private val userAgentLazy = SuspendLazy {
|
||||
withContext(Dispatchers.Main) {
|
||||
obtainWebView().settings.userAgentString
|
||||
}
|
||||
}.sanitizeHeaderValue()
|
||||
}
|
||||
|
||||
@SuppressLint("SetJavaScriptEnabled")
|
||||
|
||||
@@ -221,8 +221,15 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) {
|
||||
val isUnstableUpdatesAllowed: Boolean
|
||||
get() = prefs.getBoolean(KEY_UPDATES_UNSTABLE, false)
|
||||
|
||||
val isPagesTabEnabled: Boolean
|
||||
get() = prefs.getBoolean(KEY_PAGES_TAB, true)
|
||||
|
||||
val defaultDetailsTab: Int
|
||||
get() = prefs.getString(KEY_DETAILS_TAB, null)?.toIntOrNull()?.coerceIn(0, 1) ?: 0
|
||||
get() = if (isPagesTabEnabled) {
|
||||
prefs.getString(KEY_DETAILS_TAB, null)?.toIntOrNull()?.coerceIn(0, 1) ?: 0
|
||||
} else {
|
||||
0
|
||||
}
|
||||
|
||||
val isContentPrefetchEnabled: Boolean
|
||||
get() {
|
||||
@@ -622,6 +629,7 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) {
|
||||
const val KEY_CF_INVERTED = "cf_inverted"
|
||||
const val KEY_CF_GRAYSCALE = "cf_grayscale"
|
||||
const val KEY_IGNORE_DOZE = "ignore_dose"
|
||||
const val KEY_PAGES_TAB = "pages_tab"
|
||||
const val KEY_DETAILS_TAB = "details_tab"
|
||||
const val KEY_READING_TIME = "reading_time"
|
||||
const val KEY_PAGES_SAVE_DIR = "pages_dir"
|
||||
|
||||
@@ -3,9 +3,11 @@ package org.koitharu.kotatsu.core.prefs
|
||||
import android.content.Context
|
||||
import android.content.SharedPreferences.OnSharedPreferenceChangeListener
|
||||
import androidx.core.content.edit
|
||||
import okhttp3.internal.isSensitiveHeader
|
||||
import org.koitharu.kotatsu.core.util.ext.getEnumValue
|
||||
import org.koitharu.kotatsu.core.util.ext.ifNullOrEmpty
|
||||
import org.koitharu.kotatsu.core.util.ext.putEnumValue
|
||||
import org.koitharu.kotatsu.core.util.ext.sanitizeHeaderValue
|
||||
import org.koitharu.kotatsu.parsers.config.ConfigKey
|
||||
import org.koitharu.kotatsu.parsers.config.MangaSourceConfig
|
||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||
@@ -25,7 +27,10 @@ class SourceSettings(context: Context, source: MangaSource) : MangaSourceConfig
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
override fun <T> get(key: ConfigKey<T>): T {
|
||||
return when (key) {
|
||||
is ConfigKey.UserAgent -> prefs.getString(key.key, key.defaultValue).ifNullOrEmpty { key.defaultValue }
|
||||
is ConfigKey.UserAgent -> prefs.getString(key.key, key.defaultValue)
|
||||
.ifNullOrEmpty { key.defaultValue }
|
||||
.sanitizeHeaderValue()
|
||||
|
||||
is ConfigKey.Domain -> prefs.getString(key.key, key.defaultValue).ifNullOrEmpty { key.defaultValue }
|
||||
is ConfigKey.ShowSuspiciousContent -> prefs.getBoolean(key.key, key.defaultValue)
|
||||
is ConfigKey.SplitByTranslations -> prefs.getBoolean(key.key, key.defaultValue)
|
||||
@@ -36,7 +41,7 @@ class SourceSettings(context: Context, source: MangaSource) : MangaSourceConfig
|
||||
when (key) {
|
||||
is ConfigKey.Domain -> putString(key.key, value as String?)
|
||||
is ConfigKey.ShowSuspiciousContent -> putBoolean(key.key, value as Boolean)
|
||||
is ConfigKey.UserAgent -> putString(key.key, value as String?)
|
||||
is ConfigKey.UserAgent -> putString(key.key, (value as String?)?.sanitizeHeaderValue())
|
||||
is ConfigKey.SplitByTranslations -> putBoolean(key.key, value as Boolean)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ object KotatsuColors {
|
||||
val hue = (manga.id.absoluteValue % 360).toFloat()
|
||||
ColorUtils.HSLToColor(floatArrayOf(hue, 0.5f, 0.5f))
|
||||
} else {
|
||||
context.getThemeColor(R.attr.colorSurface)
|
||||
context.getThemeColor(R.attr.colorOutline)
|
||||
}
|
||||
val backgroundColor = context.getThemeColor(R.attr.colorSurfaceContainerHigh)
|
||||
return MaterialColors.harmonize(color, backgroundColor)
|
||||
|
||||
@@ -14,7 +14,7 @@ import android.content.ContextWrapper
|
||||
import android.content.OperationApplicationException
|
||||
import android.content.SharedPreferences
|
||||
import android.content.SyncResult
|
||||
import android.content.pm.PackageManager
|
||||
import android.content.pm.PackageManager.PERMISSION_GRANTED
|
||||
import android.content.pm.ResolveInfo
|
||||
import android.database.SQLException
|
||||
import android.graphics.Bitmap
|
||||
@@ -216,10 +216,19 @@ fun Context.findActivity(): Activity? = when (this) {
|
||||
else -> null
|
||||
}
|
||||
|
||||
fun Context.checkNotificationPermission(): Boolean = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
||||
ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED
|
||||
} else {
|
||||
NotificationManagerCompat.from(this).areNotificationsEnabled()
|
||||
fun Context.checkNotificationPermission(channelId: String?): Boolean {
|
||||
val hasPermission = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
||||
ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) == PERMISSION_GRANTED
|
||||
} else {
|
||||
NotificationManagerCompat.from(this).areNotificationsEnabled()
|
||||
}
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && hasPermission && channelId != null) {
|
||||
val channel = NotificationManagerCompat.from(this).getNotificationChannel(channelId)
|
||||
if (channel != null && channel.importance == NotificationManagerCompat.IMPORTANCE_NONE) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return hasPermission
|
||||
}
|
||||
|
||||
@WorkerThread
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
package org.koitharu.kotatsu.core.util.ext
|
||||
|
||||
import okhttp3.Cookie
|
||||
import okhttp3.Headers
|
||||
import okhttp3.HttpUrl
|
||||
import okhttp3.MediaType.Companion.toMediaType
|
||||
import okhttp3.RequestBody.Companion.toRequestBody
|
||||
import okhttp3.Response
|
||||
import okhttp3.internal.closeQuietly
|
||||
import okhttp3.internal.isSensitiveHeader
|
||||
import okio.IOException
|
||||
import org.json.JSONObject
|
||||
import org.jsoup.HttpStatusException
|
||||
@@ -59,3 +61,16 @@ fun Cookie.newBuilder(): Cookie.Builder = Cookie.Builder().also { c ->
|
||||
c.httpOnly()
|
||||
}
|
||||
}
|
||||
|
||||
fun String.sanitizeHeaderValue(): String {
|
||||
return if (all(Char::isValidForHeaderValue)) {
|
||||
this // fast path
|
||||
} else {
|
||||
filter(Char::isValidForHeaderValue)
|
||||
}
|
||||
}
|
||||
|
||||
private fun Char.isValidForHeaderValue(): Boolean {
|
||||
// from okhttp3.Headers$Companion.checkValue
|
||||
return this == '\t' || this in '\u0020'..'\u007e'
|
||||
}
|
||||
|
||||
@@ -8,12 +8,12 @@ import coil.network.HttpException
|
||||
import okio.FileNotFoundException
|
||||
import okio.IOException
|
||||
import org.acra.ktx.sendWithAcra
|
||||
import org.json.JSONException
|
||||
import org.jsoup.HttpStatusException
|
||||
import org.koitharu.kotatsu.R
|
||||
import org.koitharu.kotatsu.core.exceptions.CaughtException
|
||||
import org.koitharu.kotatsu.core.exceptions.CloudFlareProtectedException
|
||||
import org.koitharu.kotatsu.core.exceptions.EmptyHistoryException
|
||||
import org.koitharu.kotatsu.core.exceptions.NoDataReceivedException
|
||||
import org.koitharu.kotatsu.core.exceptions.SyncApiException
|
||||
import org.koitharu.kotatsu.core.exceptions.TooManyRequestExceptions
|
||||
import org.koitharu.kotatsu.core.exceptions.UnsupportedFileException
|
||||
@@ -55,6 +55,8 @@ fun Throwable.getDisplayMessage(resources: Resources): String = when (this) {
|
||||
is SocketTimeoutException,
|
||||
-> resources.getString(R.string.network_error)
|
||||
|
||||
is NoDataReceivedException -> resources.getString(R.string.error_no_data_received)
|
||||
|
||||
is WrongPasswordException -> resources.getString(R.string.wrong_password)
|
||||
is NotFoundException -> resources.getString(R.string.not_found_404)
|
||||
is UnsupportedSourceException -> resources.getString(R.string.unsupported_source)
|
||||
@@ -110,13 +112,12 @@ fun Throwable.report() {
|
||||
}
|
||||
|
||||
private val reportableExceptions = arraySetOf<Class<*>>(
|
||||
ParseException::class.java,
|
||||
JSONException::class.java,
|
||||
RuntimeException::class.java,
|
||||
IllegalStateException::class.java,
|
||||
IllegalArgumentException::class.java,
|
||||
ConcurrentModificationException::class.java,
|
||||
UnsupportedOperationException::class.java,
|
||||
NoDataReceivedException::class.java,
|
||||
)
|
||||
|
||||
fun Throwable.isWebViewUnavailable(): Boolean {
|
||||
|
||||
@@ -376,12 +376,13 @@ class DetailsActivity :
|
||||
}
|
||||
|
||||
private fun initPager() {
|
||||
val adapter = DetailsPagerAdapter(this)
|
||||
val adapter = DetailsPagerAdapter(this, settings)
|
||||
viewBinding.pager.recyclerView?.isNestedScrollingEnabled = false
|
||||
viewBinding.pager.offscreenPageLimit = 1
|
||||
viewBinding.pager.adapter = adapter
|
||||
TabLayoutMediator(viewBinding.tabs, viewBinding.pager, adapter).attach()
|
||||
viewBinding.pager.setCurrentItem(settings.defaultDetailsTab, false)
|
||||
viewBinding.tabs.isVisible = adapter.itemCount > 1
|
||||
}
|
||||
|
||||
private fun showBottomSheet(isVisible: Boolean) {
|
||||
|
||||
@@ -189,7 +189,7 @@ class DetailsFragment :
|
||||
isVisible = false
|
||||
}
|
||||
}
|
||||
if (manga.source == MangaSource.LOCAL) {
|
||||
if (manga.source == MangaSource.LOCAL || manga.source == MangaSource.DUMMY) {
|
||||
infoLayout.textViewSource.isVisible = false
|
||||
} else {
|
||||
infoLayout.textViewSource.text = manga.source.title
|
||||
@@ -223,7 +223,7 @@ class DetailsFragment :
|
||||
}
|
||||
binding.approximateReadTime.text = time.format(resources)
|
||||
binding.approximateReadTimeTitle.setText(
|
||||
if (time.isContinue) R.string.approximate_remaining_time else R.string.approximate_reading_time
|
||||
if (time.isContinue) R.string.approximate_remaining_time else R.string.approximate_reading_time,
|
||||
)
|
||||
binding.approximateReadTimeLayout.isVisible = true
|
||||
}
|
||||
|
||||
@@ -89,7 +89,7 @@ class DetailsMenuProvider(
|
||||
|
||||
R.id.action_browser -> {
|
||||
viewModel.manga.value?.let {
|
||||
activity.startActivity(BrowserActivity.newIntent(activity, it.publicUrl, it.title))
|
||||
activity.startActivity(BrowserActivity.newIntent(activity, it.publicUrl, it.source, it.title))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ class ChaptersSelectionDecoration(context: Context) : AbstractSelectionItemDecor
|
||||
98,
|
||||
)
|
||||
paint.style = Paint.Style.FILL
|
||||
hasBackground = false
|
||||
hasBackground = true
|
||||
hasForeground = true
|
||||
isIncludeDecorAndMargins = false
|
||||
|
||||
|
||||
@@ -6,13 +6,19 @@ import androidx.viewpager2.adapter.FragmentStateAdapter
|
||||
import com.google.android.material.tabs.TabLayout
|
||||
import com.google.android.material.tabs.TabLayoutMediator
|
||||
import org.koitharu.kotatsu.R
|
||||
import org.koitharu.kotatsu.core.prefs.AppSettings
|
||||
import org.koitharu.kotatsu.details.ui.pager.chapters.ChaptersFragment
|
||||
import org.koitharu.kotatsu.details.ui.pager.pages.PagesFragment
|
||||
|
||||
class DetailsPagerAdapter(activity: FragmentActivity) : FragmentStateAdapter(activity),
|
||||
class DetailsPagerAdapter(
|
||||
activity: FragmentActivity,
|
||||
settings: AppSettings,
|
||||
) : FragmentStateAdapter(activity),
|
||||
TabLayoutMediator.TabConfigurationStrategy {
|
||||
|
||||
override fun getItemCount(): Int = 2
|
||||
val isPagesTabEnabled = settings.isPagesTabEnabled
|
||||
|
||||
override fun getItemCount(): Int = if (isPagesTabEnabled) 2 else 1
|
||||
|
||||
override fun createFragment(position: Int): Fragment = when (position) {
|
||||
0 -> ChaptersFragment()
|
||||
|
||||
@@ -118,6 +118,9 @@ abstract class FavouritesDao {
|
||||
@Query("SELECT * FROM favourites WHERE manga_id = :id AND deleted_at = 0 GROUP BY manga_id")
|
||||
abstract suspend fun find(id: Long): FavouriteManga?
|
||||
|
||||
@Query("SELECT * FROM favourites WHERE manga_id = :mangaId AND deleted_at = 0")
|
||||
abstract suspend fun findAllRaw(mangaId: Long): List<FavouriteEntity>
|
||||
|
||||
@Transaction
|
||||
@Deprecated("Ignores order")
|
||||
@Query("SELECT * FROM favourites WHERE manga_id = :id AND deleted_at = 0 GROUP BY manga_id")
|
||||
|
||||
@@ -12,6 +12,7 @@ import okio.Source
|
||||
import okio.buffer
|
||||
import okio.sink
|
||||
import okio.use
|
||||
import org.koitharu.kotatsu.core.exceptions.NoDataReceivedException
|
||||
import org.koitharu.kotatsu.core.util.FileSize
|
||||
import org.koitharu.kotatsu.core.util.ext.compressToPNG
|
||||
import org.koitharu.kotatsu.core.util.ext.longHashCode
|
||||
@@ -62,7 +63,9 @@ class PagesCache @Inject constructor(@ApplicationContext context: Context) {
|
||||
val bytes = file.sink(append = false).buffer().use {
|
||||
it.writeAllCancellable(source)
|
||||
}
|
||||
check(bytes != 0L) { "No data has been written" }
|
||||
if (bytes == 0L) {
|
||||
throw NoDataReceivedException(url)
|
||||
}
|
||||
lruCache.get().put(url, file)
|
||||
} finally {
|
||||
file.delete()
|
||||
|
||||
@@ -50,7 +50,7 @@ class ImportWorker @AssistedInject constructor(
|
||||
val result = runCatchingCancellable {
|
||||
importer.import(uri).manga
|
||||
}
|
||||
if (applicationContext.checkNotificationPermission()) {
|
||||
if (applicationContext.checkNotificationPermission(CHANNEL_ID)) {
|
||||
val notification = buildNotification(result)
|
||||
notificationManager.notify(uri.hashCode(), notification)
|
||||
}
|
||||
|
||||
@@ -59,6 +59,9 @@ class WebtoonReaderFragment : BaseReaderFragment<FragmentReaderWebtoonBinding>()
|
||||
viewModel.defaultWebtoonZoomOut.take(1).observe(viewLifecycleOwner) {
|
||||
binding.frame.zoom = 1f - it
|
||||
}
|
||||
viewModel.readerSettings.observe(viewLifecycleOwner) {
|
||||
it.applyBackground(binding.root)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDestroyView() {
|
||||
|
||||
@@ -4,6 +4,7 @@ import android.content.SharedPreferences
|
||||
import android.os.Bundle
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import org.koitharu.kotatsu.R
|
||||
import org.koitharu.kotatsu.core.prefs.AppSettings
|
||||
@@ -15,8 +16,7 @@ import org.koitharu.kotatsu.suggestions.ui.SuggestionsWorker
|
||||
import javax.inject.Inject
|
||||
|
||||
@AndroidEntryPoint
|
||||
class SuggestionsSettingsFragment :
|
||||
BasePreferenceFragment(R.string.suggestions),
|
||||
class SuggestionsSettingsFragment : BasePreferenceFragment(R.string.suggestions),
|
||||
SharedPreferences.OnSharedPreferenceChangeListener {
|
||||
|
||||
@Inject
|
||||
@@ -48,16 +48,17 @@ class SuggestionsSettingsFragment :
|
||||
}
|
||||
|
||||
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
|
||||
if (key == AppSettings.KEY_SUGGESTIONS && settings.isSuggestionsEnabled) {
|
||||
onSuggestionsEnabled()
|
||||
if (settings.isSuggestionsEnabled && (key == AppSettings.KEY_SUGGESTIONS
|
||||
|| key == AppSettings.KEY_SUGGESTIONS_EXCLUDE_TAGS
|
||||
|| key == AppSettings.KEY_SUGGESTIONS_EXCLUDE_NSFW)
|
||||
) {
|
||||
updateSuggestions()
|
||||
}
|
||||
}
|
||||
|
||||
private fun onSuggestionsEnabled() {
|
||||
lifecycleScope.launch {
|
||||
if (repository.isEmpty()) {
|
||||
suggestionsScheduler.startNow()
|
||||
}
|
||||
private fun updateSuggestions() {
|
||||
lifecycleScope.launch(Dispatchers.Default) {
|
||||
suggestionsScheduler.startNow()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -82,16 +82,6 @@ class SourceAuthActivity : BaseActivity<ActivityBrowserBinding>(), BrowserCallba
|
||||
viewBinding.webView.loadUrl(url)
|
||||
}
|
||||
|
||||
override fun onSaveInstanceState(outState: Bundle) {
|
||||
super.onSaveInstanceState(outState)
|
||||
viewBinding.webView.saveState(outState)
|
||||
}
|
||||
|
||||
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
|
||||
super.onRestoreInstanceState(savedInstanceState)
|
||||
viewBinding.webView.restoreState(savedInstanceState)
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
viewBinding.webView.destroy()
|
||||
|
||||
@@ -13,13 +13,16 @@ import androidx.core.graphics.Insets
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.core.view.updateLayoutParams
|
||||
import androidx.core.view.updatePadding
|
||||
import com.google.android.material.snackbar.Snackbar
|
||||
import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
import org.koitharu.kotatsu.R
|
||||
import org.koitharu.kotatsu.core.exceptions.resolve.SnackbarErrorObserver
|
||||
import org.koitharu.kotatsu.core.ui.BaseActivity
|
||||
import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener
|
||||
import org.koitharu.kotatsu.core.util.ext.observe
|
||||
import org.koitharu.kotatsu.core.util.ext.observeEvent
|
||||
import org.koitharu.kotatsu.core.util.ext.tryLaunch
|
||||
import org.koitharu.kotatsu.databinding.ActivityMangaDirectoriesBinding
|
||||
import org.koitharu.kotatsu.settings.storage.DirectoryDiffCallback
|
||||
import org.koitharu.kotatsu.settings.storage.DirectoryModel
|
||||
@@ -42,7 +45,11 @@ class MangaDirectoriesActivity : BaseActivity<ActivityMangaDirectoriesBinding>()
|
||||
) {
|
||||
if (it) {
|
||||
viewModel.updateList()
|
||||
pickFileTreeLauncher.launch(null)
|
||||
if (!pickFileTreeLauncher.tryLaunch(null)) {
|
||||
Snackbar.make(
|
||||
viewBinding.recyclerView, R.string.operation_not_supported, Snackbar.LENGTH_SHORT,
|
||||
).show()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -68,7 +75,11 @@ class MangaDirectoriesActivity : BaseActivity<ActivityMangaDirectoriesBinding>()
|
||||
}
|
||||
|
||||
override fun onClick(v: View?) {
|
||||
permissionRequestLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE)
|
||||
if (!permissionRequestLauncher.tryLaunch(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
|
||||
Snackbar.make(
|
||||
viewBinding.recyclerView, R.string.operation_not_supported, Snackbar.LENGTH_SHORT,
|
||||
).show()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onWindowInsetsChanged(insets: Insets) {
|
||||
|
||||
@@ -64,6 +64,8 @@ class SuggestionsViewModel @Inject constructor(
|
||||
override fun onRetry() = Unit
|
||||
|
||||
fun updateSuggestions() {
|
||||
suggestionsScheduler.startNow()
|
||||
launchJob(Dispatchers.Default) {
|
||||
suggestionsScheduler.startNow()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
package org.koitharu.kotatsu.suggestions.ui
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.Manifest
|
||||
import android.app.PendingIntent
|
||||
import android.content.Context
|
||||
import android.content.pm.ServiceInfo
|
||||
import android.os.Build
|
||||
import androidx.annotation.FloatRange
|
||||
import androidx.annotation.RequiresPermission
|
||||
import androidx.core.app.NotificationChannelCompat
|
||||
import androidx.core.app.NotificationCompat
|
||||
import androidx.core.app.NotificationManagerCompat
|
||||
@@ -50,6 +51,7 @@ import org.koitharu.kotatsu.core.prefs.AppSettings
|
||||
import org.koitharu.kotatsu.core.util.ext.almostEquals
|
||||
import org.koitharu.kotatsu.core.util.ext.asArrayList
|
||||
import org.koitharu.kotatsu.core.util.ext.awaitUniqueWorkInfoByName
|
||||
import org.koitharu.kotatsu.core.util.ext.awaitWorkInfosByTag
|
||||
import org.koitharu.kotatsu.core.util.ext.checkNotificationPermission
|
||||
import org.koitharu.kotatsu.core.util.ext.flatten
|
||||
import org.koitharu.kotatsu.core.util.ext.printStackTraceDebug
|
||||
@@ -189,7 +191,9 @@ class SuggestionsWorker @AssistedInject constructor(
|
||||
.sortedBy { it.relevance }
|
||||
.take(MAX_RESULTS)
|
||||
suggestionRepository.replace(suggestions)
|
||||
if (appSettings.isSuggestionsNotificationAvailable && applicationContext.checkNotificationPermission()) {
|
||||
if (appSettings.isSuggestionsNotificationAvailable
|
||||
&& applicationContext.checkNotificationPermission(MANGA_CHANNEL_ID)
|
||||
) {
|
||||
for (i in 0..3) {
|
||||
try {
|
||||
val manga = suggestions[Random.nextInt(0, suggestions.size / 3)]
|
||||
@@ -252,7 +256,7 @@ class SuggestionsWorker @AssistedInject constructor(
|
||||
e.printStackTraceDebug()
|
||||
}.getOrDefault(emptyList())
|
||||
|
||||
@SuppressLint("MissingPermission")
|
||||
@RequiresPermission(Manifest.permission.POST_NOTIFICATIONS)
|
||||
private suspend fun showNotification(manga: Manga) {
|
||||
val channel = NotificationChannelCompat.Builder(MANGA_CHANNEL_ID, NotificationManagerCompat.IMPORTANCE_DEFAULT)
|
||||
.setName(applicationContext.getString(R.string.suggestions))
|
||||
@@ -393,7 +397,10 @@ class SuggestionsWorker @AssistedInject constructor(
|
||||
.any { !it.state.isFinished }
|
||||
}
|
||||
|
||||
fun startNow() {
|
||||
suspend fun startNow() {
|
||||
if (workManager.awaitWorkInfosByTag(TAG_ONESHOT).any { !it.state.isFinished }) {
|
||||
return
|
||||
}
|
||||
val constraints = Constraints.Builder()
|
||||
.setRequiredNetworkType(NetworkType.CONNECTED)
|
||||
.build()
|
||||
@@ -402,7 +409,7 @@ class SuggestionsWorker @AssistedInject constructor(
|
||||
.addTag(TAG_ONESHOT)
|
||||
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
|
||||
.build()
|
||||
workManager.enqueue(request)
|
||||
workManager.enqueue(request).await()
|
||||
}
|
||||
|
||||
private fun createConstraints() = Constraints.Builder()
|
||||
|
||||
@@ -168,7 +168,7 @@ class TrackWorker @AssistedInject constructor(
|
||||
}
|
||||
}
|
||||
}.onEachIndexed { index, it ->
|
||||
if (applicationContext.checkNotificationPermission()) {
|
||||
if (applicationContext.checkNotificationPermission(WORKER_CHANNEL_ID)) {
|
||||
notificationManager.notify(WORKER_NOTIFICATION_ID, createWorkerNotification(tracks.size, index + 1))
|
||||
}
|
||||
when (it) {
|
||||
@@ -197,7 +197,7 @@ class TrackWorker @AssistedInject constructor(
|
||||
channelId: String?,
|
||||
newChapters: List<MangaChapter>,
|
||||
) {
|
||||
if (newChapters.isEmpty() || channelId == null || !applicationContext.checkNotificationPermission()) {
|
||||
if (newChapters.isEmpty() || channelId == null || !applicationContext.checkNotificationPermission(channelId)) {
|
||||
return
|
||||
}
|
||||
val id = manga.url.hashCode()
|
||||
|
||||
@@ -607,7 +607,7 @@
|
||||
<string name="day">Дзень</string>
|
||||
<string name="empty_stats_text">Статыстыка за абраны перыяд адсутнічае</string>
|
||||
<string name="pages_read_s">Прачытана старонак: %s</string>
|
||||
<string name="automatic">Аўтаматычна</string>
|
||||
<string name="automatic">Аўтаматычны</string>
|
||||
<string name="three_months">Тры месяцы</string>
|
||||
<string name="clear_stats_confirm">Вы сапраўды хочаце ачысціць усю статыстыку чытання? Гэта дзеянне нельга адмяніць.</string>
|
||||
<string name="preferred_download_format">Пераважны фармат для загрузак</string>
|
||||
@@ -631,4 +631,6 @@
|
||||
<string name="order_oldest">Самы стары</string>
|
||||
<string name="unread">Непрачытаная</string>
|
||||
<string name="delete_read_chapters_auto">Аўтаматычна выдаляць прачытаныя раздзелы</string>
|
||||
</resources>
|
||||
<string name="enable_source">Ўключыць крыніцу</string>
|
||||
<string name="unsupported_source">Гэтая крыніца мангі не падтрымліваецца</string>
|
||||
</resources>
|
||||
@@ -273,7 +273,7 @@
|
||||
<string name="exclude_nsfw_from_history_summary">Als NSFW markierte Manga werden nicht in den Verlauf aufgenommen und Ihr Fortschritt wird nicht gespeichert</string>
|
||||
<string name="data_deletion">Datenlöschung</string>
|
||||
<string name="invalid_domain_message">Ungültige Domain</string>
|
||||
<string name="status_reading">Lese</string>
|
||||
<string name="status_reading">Lesen</string>
|
||||
<string name="select_range">Bereich auswählen</string>
|
||||
<string name="not_found_404">Inhalt nicht gefunden oder entfernt</string>
|
||||
<string name="manga_error_description_pattern">Fehlerdetails:<br><tt>%1$s</tt><br><br>1. Versuche, <a href=%2$s>den Manga in einem Webbrowser zu öffnen</a>, um sicherzustellen, dass er bei seiner Quelle verfügbar ist<br>2. Stelle sicher, dass du die <a href=kotatsu://about>neueste Kotatsu-Version</a><br>3 benutzt. Wenn er verfügbar ist, sende einen Fehlerbericht an die Entwickler.</string>
|
||||
@@ -338,7 +338,7 @@
|
||||
<string name="different_languages">Verschiedene Sprachen</string>
|
||||
<string name="network_unavailable">Netzwerk ist nicht verfügbar</string>
|
||||
<string name="reader_control_ltr">Ergonomische Lesekontrolle</string>
|
||||
<string name="reader_control_ltr_summary">Tippe auf den rechten Rand oder drücke die rechte Taste, um immer zur nächsten Seite zu wechseln</string>
|
||||
<string name="reader_control_ltr_summary">Tippe auf den rechten Rand oder drücke die rechte Taste, um immer zur nächsten Seite zu wechseln.</string>
|
||||
<string name="reader_slider">Zeige Seitenwechsel-Schieber</string>
|
||||
<string name="source_disabled">Quelle deaktiviert</string>
|
||||
<string name="prefetch_content">Inhalte vorladen</string>
|
||||
@@ -358,7 +358,7 @@
|
||||
<string name="nothing_here">Hier ist nichts</string>
|
||||
<string name="services">Dienste</string>
|
||||
<string name="theme_name_kanade">Kanade</string>
|
||||
<string name="scrobbling_empty_hint">Um deinen Lesefortschritt nachzuverfolgen, wähle Menü → Lesefortschritt aufzeichnen auf dem Manga Details Bildschirm.</string>
|
||||
<string name="scrobbling_empty_hint">Um deinen Lesefortschritt zu tracken, wähle Menü → Lesefortschritt tracken auf dem Manga Details Bildschirm.</string>
|
||||
<string name="find_similar">Ähnliche finden</string>
|
||||
<string name="theme_name_sakura">Sakura</string>
|
||||
<string name="allow_unstable_updates_summary">Benachrichtigungen über instabile Versionen erhalten</string>
|
||||
@@ -383,7 +383,7 @@
|
||||
<string name="sync_host_description">Du kannst einen Standard- oder einen selbst gehosteten Synchronisations-Server verwenden. Ändere diese Einstellungen nicht, wenn du dich nicht auskennst.</string>
|
||||
<string name="ignore_ssl_errors">Ignoriere SSL Errors</string>
|
||||
<string name="mirror_switching_summary">Automatischer Domain-Wechsel für Manga-Quellen, falls Spiegelserver verfügbar sind</string>
|
||||
<string name="status_re_reading">Lese erneut</string>
|
||||
<string name="status_re_reading">Erneut Lesen</string>
|
||||
<string name="sync_auth_hint">Du kannst dich mit einem bestehenden Account anmelden oder einen neuen erstellen</string>
|
||||
<string name="user_agent">UserAgent-Kopfzeile</string>
|
||||
<string name="enable">Aktivieren</string>
|
||||
@@ -458,7 +458,7 @@
|
||||
<string name="view_list">Liste ansehen</string>
|
||||
<string name="show">Anzeigen</string>
|
||||
<string name="images_procy_description">Wenn möglich bitte den Dienst wsrv.nl nutzen, um den Datenverkehr zu reduzieren und das Laden von Bildern zu beschleunigen</string>
|
||||
<string name="clear_network_cache">Netzwerkcache löschen</string>
|
||||
<string name="clear_network_cache">Netzwerk-Cache löschen</string>
|
||||
<string name="captcha_required_summary">%s erfordert ein Captcha, das gelöst werden muss, um richtig zu funktionieren</string>
|
||||
<string name="languages">Sprachen</string>
|
||||
<string name="unknown">Unbekannt</string>
|
||||
@@ -549,7 +549,7 @@
|
||||
\n
|
||||
\nAchtung: Der aktuelle Lesefortschritt geht verloren.</string>
|
||||
<string name="main_screen_sections">Hauptbildschirm - Abschnitte</string>
|
||||
<string name="disable_nsfw_summary">Deaktiviere NSFW - Quellen und verberge Erwachsenen-Manga von der Liste, wenn möglich</string>
|
||||
<string name="disable_nsfw_summary">Deaktiviere NSFW-Quellen und verstecke 18+ Manga aus der Liste, wenn möglich</string>
|
||||
<string name="disable_battery_optimization_summary_downloads">Könnte dir damit helfen, den Download zu starten, wenn du Probleme damit hast</string>
|
||||
<string name="state_abandoned">Verworfen</string>
|
||||
<string name="enhanced_colors_summary">Reduziert das Banding (harte Farbverläufe), kann aber die Leistung beeinträchtigen</string>
|
||||
@@ -585,7 +585,7 @@
|
||||
<string name="show_labels_in_navbar">Beschriftungen in der Navigationsleiste anzeigen</string>
|
||||
<string name="pages_saving">Seiten werden gespeichert</string>
|
||||
<string name="ask_for_dest_dir_every_time">Jedes Mal nach dem Zielverzeichnis fragen</string>
|
||||
<string name="default_page_save_dir">Standard-Seitenspeicherordner</string>
|
||||
<string name="default_page_save_dir">Standard Speicherordner für Seiten</string>
|
||||
<string name="remove_from_history">Aus der Historie entfernen</string>
|
||||
<string name="preferred_download_format">Bevorzugtes Download-Format</string>
|
||||
<string name="fullscreen_mode">Vollbildmodus</string>
|
||||
@@ -596,5 +596,41 @@
|
||||
<string name="check_for_new_chapters_disabled">Die Überprüfung auf neue Kapitel ist deaktiviert</string>
|
||||
<string name="reading_time_estimation">Geschätzte Lesezeit anzeigen</string>
|
||||
<string name="reading_time_estimation_summary">Die geschätzte Zeitangabe kann ungenau sein</string>
|
||||
<string name="location">Ort</string>
|
||||
<string name="location">Speicherort</string>
|
||||
<string name="default_webtoon_zoom_out">Standard Zoom Out für Webtoons</string>
|
||||
<string name="other_manga">Andere Mangas</string>
|
||||
<string name="less_than_minute">Weniger als eine Minute</string>
|
||||
<string name="migration_completed">Migrierung abgeschlossen</string>
|
||||
<string name="chapters_grid_view">Rasteransicht</string>
|
||||
<string name="stats_enabled">Statistiken einschalten</string>
|
||||
<string name="reading_stats">Lesestatistiken</string>
|
||||
<string name="statistics">Statistiken</string>
|
||||
<string name="clear_stats">Statistiken löschen</string>
|
||||
<string name="stats_cleared">Statistiken gelöscht</string>
|
||||
<string name="clear_stats_confirm">Willst du wirklich alle Statistiken löschen? Die Prozedur kann nicht rückgängig gemacht werden.</string>
|
||||
<string name="all_time">Immer</string>
|
||||
<string name="day">Tag</string>
|
||||
<string name="alternatives">Alternativen</string>
|
||||
<string name="migrate">Migrieren</string>
|
||||
<string name="migrate_confirmation">Manga \"%1$s\" aus \"%2$s\" wird mit \"%3$s\" aus \"%4$s\" in deinem Verlauf und Favoriten (sofern vorhanden) ersetzt</string>
|
||||
<string name="manga_migration">Manga Migrierung</string>
|
||||
<string name="delete_read_chapters_auto">Lösche gelesene Kapitel automatisch</string>
|
||||
<string name="runs_on_app_start">Wird ausgeführt wenn die App gestartet wird</string>
|
||||
<string name="week">Woche</string>
|
||||
<string name="month">Monat</string>
|
||||
<string name="empty_stats_text">Es sind keine Statistiken für die ausgewählte Zeitspanne vorhanden</string>
|
||||
<string name="three_months">Drei Monate</string>
|
||||
<string name="pages_read_s">Gelesene Seiten:%s</string>
|
||||
<string name="split_by_translations">Aufgeteilt nach Übersetzungen</string>
|
||||
<string name="split_by_translations_summary">Zeige Kapitel mit unterschiedlichen Übersetzungen separiert anstatt in einer Liste</string>
|
||||
<string name="order_oldest">Älteste</string>
|
||||
<string name="long_ago_read">vor einer langen Zeit gelesen</string>
|
||||
<string name="unread">Ungelesen</string>
|
||||
<string name="delete_read_chapters">Gelesene Kapitel löschen</string>
|
||||
<string name="no_chapters_deleted">Keine Kapitel wurden gelöscht</string>
|
||||
<string name="delete_read_chapters_summary">Lösche schon gelesene Kapitel um Speicher freizugeben</string>
|
||||
<string name="delete_read_chapters_prompt">Die Aktion wird alle als gelesen markierte Kapitel dauerhaft von deinem Speicher löschen. Du kannst sie später neu herunterladen, aber die importierten Kapitel können trotzdem verloren sein</string>
|
||||
<string name="chapters_deleted_pattern">%1$s entfernt, %2$s gelöscht</string>
|
||||
<string name="enable_source">Quelle aktivieren</string>
|
||||
<string name="unsupported_source">Diese Manga-Quelle wird nicht unterstützt</string>
|
||||
</resources>
|
||||
@@ -631,4 +631,8 @@
|
||||
<string name="order_oldest">Más antigua</string>
|
||||
<string name="long_ago_read">Leído hace mucho tiempo</string>
|
||||
<string name="unread">Sin leer</string>
|
||||
</resources>
|
||||
<string name="enable_source">Activar fuente</string>
|
||||
<string name="unsupported_source">Esta fuente del manga no es compatible</string>
|
||||
<string name="show_pages_thumbs">Mostrar miniaturas de las páginas</string>
|
||||
<string name="show_pages_thumbs_summary">Habilite la pestaña \"Páginas\" en la pantalla de detalles</string>
|
||||
</resources>
|
||||
|
||||
@@ -613,4 +613,26 @@
|
||||
<string name="month">Buwan</string>
|
||||
<string name="three_months">Tatlong buwan</string>
|
||||
<string name="empty_stats_text">Walang mga istatistika para sa napiling panahon</string>
|
||||
</resources>
|
||||
<string name="migrate_confirmation">Ang manga \"%1$s\" mula sa \"%2$s\" ay papalitan ng \"%3$s\" mula sa \"%4$s\" sa iyong kasaysayan at mga paborito (kung mayroon)</string>
|
||||
<string name="delete_read_chapters">Tanggalin ang mga binasang kabanata</string>
|
||||
<string name="no_chapters_deleted">Walang kabanata ang natanggal</string>
|
||||
<string name="chapters_deleted_pattern">Natanggal %1$s, nalinisan %2$s</string>
|
||||
<string name="delete_read_chapters_auto">Awtomatikong tanggalin ang mga nabasang kabanata</string>
|
||||
<string name="long_ago_read">Matagal nang nabasa</string>
|
||||
<string name="unread">Di pa nababasa</string>
|
||||
<string name="chapters_grid_view">View na grid</string>
|
||||
<string name="alternatives">Alternatibo</string>
|
||||
<string name="migrate">Lumipat</string>
|
||||
<string name="manga_migration">Paglilipat ng manga</string>
|
||||
<string name="migration_completed">Natapos na ang paglilipat</string>
|
||||
<string name="delete_read_chapters_summary">Tanggalin ang mga kabanata na nabasa mo na mula sa lokal na storage upang magbakante ng espasyo</string>
|
||||
<string name="delete_read_chapters_prompt">Permanente nitong tatanggalin ang lahat ng kabanata na minarkahan bilang nabasa mula sa iyong lokal na storage. Maaari mong muling i-download ito sa ibang pagkakataon, ngunit ang mga na-import na kabanata ay maaaring mawala nang tuluyan</string>
|
||||
<string name="runs_on_app_start">Tatakbo kapag nagsimula ang aplikasyon</string>
|
||||
<string name="split_by_translations">Hatiin ayon sa mga pagsasalin</string>
|
||||
<string name="split_by_translations_summary">Magpakita ng mga kabanata na may iba\'t ibang pagsasalin nang hiwalay, sa halip na sa isang listahan</string>
|
||||
<string name="order_oldest">Pinakaluma</string>
|
||||
<string name="enable_source">Paganahin ang source</string>
|
||||
<string name="unsupported_source">Ang manga source na ito ay hindi suportado</string>
|
||||
<string name="show_pages_thumbs">Ipakita ang mga thumbnail ng pahina</string>
|
||||
<string name="show_pages_thumbs_summary">Paganahin ang tab na \"Mga Pahina\" sa screen ng mga detalye</string>
|
||||
</resources>
|
||||
|
||||
@@ -631,4 +631,8 @@
|
||||
<string name="order_oldest">सबसे पुराना</string>
|
||||
<string name="long_ago_read">बहुत पहले पढ़ा था</string>
|
||||
<string name="unread">अपठित</string>
|
||||
</resources>
|
||||
<string name="unsupported_source">यह मंगा स्रोत समर्थित नहीं है</string>
|
||||
<string name="enable_source">स्रोत सक्षम करें</string>
|
||||
<string name="show_pages_thumbs_summary">विवरण स्क्रीन पर \"पेज\" टैब सक्षम करें</string>
|
||||
<string name="show_pages_thumbs">पेज थंबनेल दिखाएँ</string>
|
||||
</resources>
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<plurals name="items">
|
||||
<item quantity="other">%1$d item</item>
|
||||
<item quantity="other">%1$d butir</item>
|
||||
</plurals>
|
||||
<plurals name="new_chapters">
|
||||
<item quantity="other">%1$d chapter baru</item>
|
||||
<item quantity="other">%1$d bab baru</item>
|
||||
</plurals>
|
||||
<plurals name="chapters">
|
||||
<item quantity="other">%1$d chapter</item>
|
||||
<item quantity="other">%1$d bab</item>
|
||||
</plurals>
|
||||
<plurals name="minutes_ago">
|
||||
<item quantity="other">%1$d menit yang lalu</item>
|
||||
@@ -19,7 +19,7 @@
|
||||
<item quantity="other">%1$d hari yang lalu</item>
|
||||
</plurals>
|
||||
<plurals name="months_ago">
|
||||
<item quantity="other">%1$d bulan lalu</item>
|
||||
<item quantity="other">%1$d bulan yang lalu</item>
|
||||
</plurals>
|
||||
<plurals name="hours">
|
||||
<item quantity="other">%1$d jam</item>
|
||||
|
||||
@@ -3,11 +3,11 @@
|
||||
<string name="local_storage">Penyimpanan lokal</string>
|
||||
<string name="favourites">Favorit</string>
|
||||
<string name="history">Riwayat</string>
|
||||
<string name="error_occurred">Terjadi kesalahan</string>
|
||||
<string name="network_error">Kesalahan jaringan</string>
|
||||
<string name="error_occurred">Terjadi galat</string>
|
||||
<string name="network_error">Galat jaringan</string>
|
||||
<string name="details">Detail</string>
|
||||
<string name="grid">Kotak</string>
|
||||
<string name="list_mode">Gaya list</string>
|
||||
<string name="grid">Kisi</string>
|
||||
<string name="list_mode">Mode daftar</string>
|
||||
<string name="settings">Pengaturan</string>
|
||||
<string name="remote_sources">Sumber manga</string>
|
||||
<string name="loading_">Memuat…</string>
|
||||
@@ -38,7 +38,7 @@
|
||||
<string name="newest">Terbaru</string>
|
||||
<string name="by_rating">Nilai</string>
|
||||
<string name="sort_order">Urutkan</string>
|
||||
<string name="filter">Saring</string>
|
||||
<string name="filter">Filter</string>
|
||||
<string name="theme">Tema</string>
|
||||
<string name="light">Terang</string>
|
||||
<string name="dark">Gelap</string>
|
||||
@@ -56,7 +56,7 @@
|
||||
<string name="page_saved">Disimpan</string>
|
||||
<string name="share_image">Bagikan gambar</string>
|
||||
<string name="_import">Impor</string>
|
||||
<string name="clear_pages_cache">Bersihkan cache halaman</string>
|
||||
<string name="clear_pages_cache">Bersihkan singgahan halaman</string>
|
||||
<string name="text_file_sizes">B|kB|MB|GB|TB</string>
|
||||
<string name="standard">Standar</string>
|
||||
<string name="grid_size">Ukuran kisi</string>
|
||||
@@ -73,7 +73,7 @@
|
||||
<string name="read_mode">Mode baca</string>
|
||||
<string name="volume_buttons">Tombol volume</string>
|
||||
<string name="_continue">Lanjut</string>
|
||||
<string name="clear_thumbs_cache">Bersihkan cache gambar mini</string>
|
||||
<string name="clear_thumbs_cache">Bersihkan singgahan gambar mini</string>
|
||||
<string name="clear_search_history">Bersihkan riwayat pencarian</string>
|
||||
<string name="search_history_cleared">Dibersihkan</string>
|
||||
<string name="domain">Domain</string>
|
||||
@@ -82,7 +82,7 @@
|
||||
<string name="save_manga">Simpan</string>
|
||||
<string name="notifications">Pemberitahuan</string>
|
||||
<string name="enabled_d_of_d" tools:ignore="PluralsCandidate">%1$d dari %2$d diaktifkan</string>
|
||||
<string name="new_chapters">Chapter baru</string>
|
||||
<string name="new_chapters">Bab baru</string>
|
||||
<string name="download">Unduh</string>
|
||||
<string name="notifications_settings">Pengaturan pemberitahuan</string>
|
||||
<string name="notification_sound">Suara pemberitahuan</string>
|
||||
@@ -120,7 +120,7 @@
|
||||
<string name="data_restored_with_errors">Data berhasil dipulihkan, tapi ada kesalahan</string>
|
||||
<string name="backup_information">Anda dapat membuat cadangan riwayat dan favorit Anda dan memulihkannya</string>
|
||||
<string name="just_now">Baru saja</string>
|
||||
<string name="long_ago">Lama</string>
|
||||
<string name="long_ago">Lawas</string>
|
||||
<string name="group">Kelompok</string>
|
||||
<string name="today">Hari ini</string>
|
||||
<string name="tap_to_try_again">Ketuk untuk coba lagi</string>
|
||||
@@ -146,16 +146,16 @@
|
||||
<string name="auth_not_supported_by">Masuk pada %s tidak didukung</string>
|
||||
<string name="text_clear_cookies_prompt">Anda akan keluar dari semua sumber</string>
|
||||
<string name="genres">Genre</string>
|
||||
<string name="state_finished">Selesai</string>
|
||||
<string name="state_ongoing">Sedang berlangsung</string>
|
||||
<string name="system_default">Standar</string>
|
||||
<string name="state_finished">Tamat</string>
|
||||
<string name="state_ongoing">Masih lanjut</string>
|
||||
<string name="system_default">Bawaan</string>
|
||||
<string name="exclude_nsfw_from_history">Kecualikan komik NSFW dari riwayat</string>
|
||||
<string name="show_pages_numbers">Nomor halaman</string>
|
||||
<string name="enabled_sources">Sumber yang digunakan</string>
|
||||
<string name="available_sources">Sumber yang tersedia</string>
|
||||
<string name="screenshots_policy">Kebijakan tangkapan layar</string>
|
||||
<string name="screenshots_allow">Bolehkan</string>
|
||||
<string name="screenshots_block_nsfw">Blokir pada NSFW</string>
|
||||
<string name="screenshots_block_nsfw">Blokir NSFW</string>
|
||||
<string name="screenshots_block_all">Selalu blokir</string>
|
||||
<string name="suggestions">Saran</string>
|
||||
<string name="suggestions_enable">Aktifkan saran</string>
|
||||
@@ -204,7 +204,7 @@
|
||||
<string name="bookmark_added">Markah ditambahkan</string>
|
||||
<string name="undo">Urung</string>
|
||||
<string name="removed_from_history">Dihapus dari riwayat</string>
|
||||
<string name="default_mode">Mode baca</string>
|
||||
<string name="default_mode">Mode bawaan</string>
|
||||
<string name="detect_reader_mode">Otomatis deteksi mode pembaca</string>
|
||||
<string name="detect_reader_mode_summary">Secara otomatis mendeteksi jika komik itu webtoon</string>
|
||||
<string name="create_category">Kategori baru</string>
|
||||
@@ -215,7 +215,7 @@
|
||||
<string name="clear_updates_feed">Bersihkan aliran pembaruan</string>
|
||||
<string name="right_to_left">Kanan-ke-kiri</string>
|
||||
<string name="rotate_screen">Putar layar</string>
|
||||
<string name="feed_will_update_soon">Pembaruan aliran akan dimulai</string>
|
||||
<string name="feed_will_update_soon">Pembaruan umpan akan dimulai</string>
|
||||
<string name="enter_password">Masukkan kata sandi</string>
|
||||
<string name="protect_application_summary">Tanya kata sandi ketika memulai Kotatsu</string>
|
||||
<string name="about">Tentang</string>
|
||||
@@ -244,7 +244,7 @@
|
||||
<string name="zoom_mode_fit_height">Pas tinggi</string>
|
||||
<string name="zoom_mode_fit_width">Pas lebar</string>
|
||||
<string name="reverse">Balik</string>
|
||||
<string name="queued">Mengantri</string>
|
||||
<string name="queued">Mengantre</string>
|
||||
<string name="auth_complete">Resmi</string>
|
||||
<string name="text_local_holder_secondary">Simpan dari sumber daring atau berkas impor.</string>
|
||||
<string name="text_shelf_holder_primary">Komik Anda akan ditampilkan di sini</string>
|
||||
@@ -255,14 +255,14 @@
|
||||
<string name="status_planned">Direncanakan</string>
|
||||
<string name="status_completed">Selesai</string>
|
||||
<string name="canceled">Dibatalkan</string>
|
||||
<string name="sync_title">Sinkronisasi data Anda</string>
|
||||
<string name="sync_title">Sinkronkan data Anda</string>
|
||||
<string name="tracking">Pelacakan</string>
|
||||
<string name="logout">Keluar</string>
|
||||
<string name="sync">Sinkronisasi</string>
|
||||
<string name="send">Kirim</string>
|
||||
<string name="status_reading">Dibaca</string>
|
||||
<string name="status_on_hold">Ditunda</string>
|
||||
<string name="invalid_domain_message">Domain tidak valid</string>
|
||||
<string name="invalid_domain_message">Domain tak sah</string>
|
||||
<string name="no_bookmarks_yet">Belum ada markah</string>
|
||||
<string name="no_bookmarks_summary">Anda bisa membuat markah ketika membaca komik</string>
|
||||
<string name="bookmarks_removed">Markah dihapus</string>
|
||||
@@ -271,7 +271,7 @@
|
||||
<string name="empty">Kosong</string>
|
||||
<string name="reader_info_bar">Tampilkan bilah informasi di pembaca</string>
|
||||
<string name="importing_manga">Mengimpor komik</string>
|
||||
<string name="last_2_hours">Dua jam terakhir</string>
|
||||
<string name="last_2_hours">2 jam terakhir</string>
|
||||
<string name="show_all">Tampilkan semua</string>
|
||||
<string name="history_cleared">Riwayat dihapus</string>
|
||||
<string name="clear_all_history">Hapus semua riwayat</string>
|
||||
@@ -282,8 +282,8 @@
|
||||
<string name="not_found_404">Konten tidak ditemukan atau dihapus</string>
|
||||
<string name="exit_confirmation_summary">Tekan Kembali dua kali untuk keluar dari aplikasi</string>
|
||||
<string name="exit_confirmation">Konfirmasi keluar</string>
|
||||
<string name="pages_cache">Cache halaman</string>
|
||||
<string name="other_cache">Cache lainnya</string>
|
||||
<string name="pages_cache">Singgahan halaman</string>
|
||||
<string name="other_cache">Singgahan lainnya</string>
|
||||
<string name="storage_usage">Penggunaan penyimpanan</string>
|
||||
<string name="available">Tersedia</string>
|
||||
<string name="incognito_mode">Mode penyamaran</string>
|
||||
@@ -292,12 +292,12 @@
|
||||
<string name="folder_with_images">Folder dengan gambar</string>
|
||||
<string name="import_completed_hint">Anda bisa menghapus berkas asli dari penyimpanan untuk menghemat ruang</string>
|
||||
<string name="feed">Umpan</string>
|
||||
<string name="manga_error_description_pattern">Rincian error:<tt>%1$s</tt><br><br>1. Coba <a href=%2$s>buka manga di peramban web</a> untuk memastikan manga tersebut tersedia di sumbernya</a>2. Pastikan Anda menggunakan <a href= >manga versi terbaru</a><br>3. Jika tersedia, kirimkan laporan kesalahan ke pengembang. Pastikan Anda menggunakan <a href=kotatsu://about>versi terbaru Kotatsu</a><br>3. Jika tersedia, kirimkan laporan kesalahan ke pengembang.</string>
|
||||
<string name="manga_error_description_pattern">Rincian galat:<tt>%1$s</tt><br><br>1. Coba <a href=%2$s>buka manga di peramban web</a> untuk memastikan manga tersebut tersedia di sumbernya</a>2. Pastikan Anda menggunakan Kotatsu <a href=kotatsu://about>versi terbaru</a><br>3. Jika itu tersedia, kirimkan laporan kesalahan ke pengembang.</string>
|
||||
<string name="brightness">Kecerahan</string>
|
||||
<string name="contrast">Kontras</string>
|
||||
<string name="reset">Atur Ulang</string>
|
||||
<string name="color_correction_hint">Pengaturan warna yang dipilih akan diingat untuk komik ini</string>
|
||||
<string name="text_unsaved_changes_prompt">Menyimpan atau membuang perubahan yang belum disimpan\?</string>
|
||||
<string name="text_unsaved_changes_prompt">Simpan atau buang perubahan yang belum disimpan?</string>
|
||||
<string name="discard">Buang</string>
|
||||
<string name="use_fingerprint">Gunakan sidik jari jika tersedia</string>
|
||||
<string name="appwidget_shelf_description">Komik dari favorit Anda</string>
|
||||
@@ -306,7 +306,7 @@
|
||||
<string name="account_already_exists">Akun sudah ada</string>
|
||||
<string name="back">Kembali</string>
|
||||
<string name="disable_battery_optimization_summary">Membantu pemeriksaan pembaruan di latar belakang</string>
|
||||
<string name="crash_text">Ada sesuatu yang salah. Mohon untuk mengirim laporan kutu (bug) ke pengembang untuk membantu kami memperbaikinya.</string>
|
||||
<string name="crash_text">Ada sesuatu yang salah. Mohon untuk mengirim laporan kutu ke pengembang untuk membantu kami memperbaikinya.</string>
|
||||
<string name="report">Lapor</string>
|
||||
<string name="exclude_nsfw_from_history_summary">Komik yang ditandai sebagai NSFW tidak akan ditambahkan ke riwayat dan progres Anda tidak akan disimpan</string>
|
||||
<string name="clear_cookies_summary">Bisa membantu dalam beberapa masalah. Seluruh otorisasi akan menjadi tidak valid</string>
|
||||
@@ -320,14 +320,14 @@
|
||||
<string name="no_chapters">Tidak ada bab</string>
|
||||
<string name="history_shortcuts">Tampilkan pintasan komik baru-baru ini</string>
|
||||
<string name="history_shortcuts_summary">Buat komik baru-baru ini tersedia dengan menekan panjang pada ikon aplikasi</string>
|
||||
<string name="select_range">Pilih jangkauan</string>
|
||||
<string name="select_range">Pilih rentang</string>
|
||||
<string name="disable_all">Matikan semua</string>
|
||||
<string name="gestures_only">Hanya gestur</string>
|
||||
<string name="dns_over_https">DNS over HTTPS</string>
|
||||
<string name="status_dropped">Istirahat</string>
|
||||
<string name="status_dropped">Didrop</string>
|
||||
<string name="theme_name_mamimi">Mamimi</string>
|
||||
<string name="server_error">Kesalahan sisi server (%1$d). Silakan coba lagi nanti</string>
|
||||
<string name="compact">kompak</string>
|
||||
<string name="server_error">Galat sisi server (%1$d). Silakan coba lagi nanti</string>
|
||||
<string name="compact">Padat</string>
|
||||
<string name="prefetch_content">Pramuat konten</string>
|
||||
<string name="memory_usage_pattern">%s - %s</string>
|
||||
<string name="nothing_here">Tidak ada apapun di sini</string>
|
||||
@@ -335,7 +335,7 @@
|
||||
<string name="source_disabled">Sumber dinonaktifkan</string>
|
||||
<string name="mark_as_current">Tandai sebagai saat ini</string>
|
||||
<string name="show_suspicious_content">Tampilkan konten yang mencurigakan</string>
|
||||
<string name="scrobbling_empty_hint">Untuk melacak kemajuan membaca, pilih Menu → Lacak di layar detail komik.</string>
|
||||
<string name="scrobbling_empty_hint">Untuk melacak progres membaca, pilih Menu → Lacak di layar detail komik.</string>
|
||||
<string name="services">Layanan</string>
|
||||
<string name="clear_new_chapters_counters">Juga informasi yang jelas tentang bab baru</string>
|
||||
<string name="network_unavailable_hint">Nyalakan Wi-Fi atau jaringan seluler untuk membaca komik daring</string>
|
||||
@@ -346,15 +346,15 @@
|
||||
<string name="error_no_space_left">Tidak ada ruang tersisa di perangkat</string>
|
||||
<string name="allow_unstable_updates">Izinkan pembaruan yang tidak stabil</string>
|
||||
<string name="allow_unstable_updates_summary">Terima pemberitahuan tentang build yang tidak stabil</string>
|
||||
<string name="download_started">Unduh dimulai</string>
|
||||
<string name="show_reading_indicators">Tampilkan indikator kemajuan membaca</string>
|
||||
<string name="download_started">Unduhan dimulai</string>
|
||||
<string name="show_reading_indicators">Tampilkan indikator progres membaca</string>
|
||||
<string name="show_reading_indicators_summary">Tampilkan persentase baca dalam riwayat dan favorit</string>
|
||||
<string name="language">Bahasa</string>
|
||||
<string name="text_search_holder_secondary">Cobalah untuk memformulasi ulang kueri.</string>
|
||||
<string name="zoom_mode_keep_start">Tetap di awal</string>
|
||||
<string name="reader_info_pattern">Bab. %1$d/%2$d Hal. %3$d/%4$d</string>
|
||||
<string name="reader_info_pattern">Bab %1$d/%2$d Hlm. %3$d/%4$d</string>
|
||||
<string name="enable_logging">Aktifkan pencatatan</string>
|
||||
<string name="enable_logging_summary">Rekam beberapa tindakan untuk tujuan debug. Jangan nyalakan jika Anda tidak yakin dengan apa yang Anda lakukan</string>
|
||||
<string name="enable_logging_summary">Rekam beberapa tindakan untuk tujuan awakutu. Jangan nyalakan jika Anda tidak yakin dengan apa yang Anda lakukan</string>
|
||||
<string name="theme_name_dynamic">Dinamis</string>
|
||||
<string name="color_theme">Skema warna</string>
|
||||
<string name="show_in_grid_view">Perlihatkan dalam tampilan kisi</string>
|
||||
@@ -368,12 +368,12 @@
|
||||
<string name="reader_control_ltr">Kontrol pembaca ergonomis</string>
|
||||
<string name="color_correction">Koreksi warna</string>
|
||||
<string name="reader_slider">Perlihatkan penggeser peralihan halaman</string>
|
||||
<string name="webtoon_zoom">Zoom webtoon</string>
|
||||
<string name="webtoon_zoom">Zum Webtoon</string>
|
||||
<string name="different_languages">Berbagai bahasa</string>
|
||||
<string name="network_unavailable">Jaringan tidak tersedia</string>
|
||||
<string name="got_it">Oke</string>
|
||||
<string name="sources_reorder_tip">Ketuk dan tahan item untuk menyusun ulang</string>
|
||||
<string name="comics_archive_import_description">Anda dapat memilih satu atau beberapa file .cbz atau .zip, setiap file akan dikenali sebagai komik terpisah.</string>
|
||||
<string name="comics_archive_import_description">Anda dapat memilih satu atau beberapa berkas .cbz atau .zip, setiap file akan dikenali sebagai komik terpisah.</string>
|
||||
<string name="folder_with_images_import_description">Anda dapat memilih direktori yang berisi arsip atau gambar. Setiap arsip (atau subdirektori) akan dikenali sebagai sebuah bab.</string>
|
||||
<string name="speed">Kecepatan</string>
|
||||
<string name="restore_backup_description">Impor cadangan data pengguna yang telah dibuat sebelumnya</string>
|
||||
@@ -386,10 +386,10 @@
|
||||
<string name="enable">Aktifkan</string>
|
||||
<string name="no_thanks">Tidak, terima kasih</string>
|
||||
<string name="sync_settings">Pengaturan sinkronisasi</string>
|
||||
<string name="sync_host_description">Anda dapat menggunakan server sinkronisasi yang dihosting sendiri atau server default. Jangan ubah ini jika Anda tidak yakin dengan apa yang Anda lakukan.</string>
|
||||
<string name="ignore_ssl_errors">Abaikan kesalahan SSL</string>
|
||||
<string name="sync_host_description">Anda dapat menggunakan server sinkronisasi yang dihos sendiri atau server bawaan. Jangan ubah ini jika Anda tidak yakin dengan apa yang Anda lakukan.</string>
|
||||
<string name="ignore_ssl_errors">Abaikan galat SSL</string>
|
||||
<string name="mirror_switching">Pilih cermin secara otomatis</string>
|
||||
<string name="mirror_switching_summary">Alihkan domain secara otomatis ke sumber lain saat terjadi kesalahan (jika alternatif tersedia)</string>
|
||||
<string name="mirror_switching_summary">Alihkan domain secara otomatis ke sumber lain saat terjadi kesalahan jika alternatif tersedia</string>
|
||||
<string name="pause">Jeda</string>
|
||||
<string name="resume">Lanjut</string>
|
||||
<string name="paused">Dijeda</string>
|
||||
@@ -399,7 +399,7 @@
|
||||
<string name="suggestion_manga">Saran: %s</string>
|
||||
<string name="suggestions_notifications_summary">Terkadang menampilkan notifikasi dengan manga yang disarankan</string>
|
||||
<string name="more">Lebih</string>
|
||||
<string name="cancel_all_downloads_confirm">Semua pengunduhan yang aktif akan dibatalkan, data yang sudah terunduh sebagian akan hilang</string>
|
||||
<string name="cancel_all_downloads_confirm">Semua unduhan aktif akan dibatalkan, data yang sudah terunduh sebagian akan hilang</string>
|
||||
<string name="remove_completed_downloads_confirm">Riwayat unduhan Anda akan dihapus secara permanen</string>
|
||||
<string name="text_downloads_list_holder">Anda tidak memiliki unduhan apa pun</string>
|
||||
<string name="downloads_resumed">Unduhan telah dilanjutkan</string>
|
||||
@@ -408,12 +408,12 @@
|
||||
<string name="suggestions_enable_prompt">Apakah Anda ingin menerima saran manga yang dipersonalisasi\?</string>
|
||||
<string name="translations">Terjemahan</string>
|
||||
<string name="web_view_unavailable">WebView tidak tersedia: periksa apakah penyedia WebView telah diinstal</string>
|
||||
<string name="clear_network_cache">Hapus cache jaringan</string>
|
||||
<string name="clear_network_cache">Hapus singgahan jaringan</string>
|
||||
<string name="type">Tipe</string>
|
||||
<string name="address">Alamat</string>
|
||||
<string name="port">Port</string>
|
||||
<string name="port">Porta</string>
|
||||
<string name="proxy">Proksi</string>
|
||||
<string name="invalid_value_message">Nilai tidak valid</string>
|
||||
<string name="invalid_value_message">Nilai tidak sah</string>
|
||||
<string name="manga_branch_title_template">%1$s (%2$s)</string>
|
||||
<string name="images_procy_description">Gunakan layanan wsrv.nl untuk mengurangi penggunaan lalu lintas dan mempercepat pemuatan gambar jika memungkinkan</string>
|
||||
<string name="images_proxy_title">Proksi pengoptimalan gambar</string>
|
||||
@@ -425,13 +425,13 @@
|
||||
<string name="details_button_tip">Tekan dan tahan tombol Baca untuk melihat opsi lainnya</string>
|
||||
<string name="data_and_privacy">Data dan privasi</string>
|
||||
<string name="restore_summary">Pulihkan cadangan yang dibuat sebelumnya</string>
|
||||
<string name="invalid_port_number">Nomor port tidak valid</string>
|
||||
<string name="invalid_port_number">Nomor porta tak sah</string>
|
||||
<string name="network">Jaringan</string>
|
||||
<string name="show_pages_numbers_summary">Tampilkan nomor halaman di pojok bawah</string>
|
||||
<string name="webtoon_zoom_summary">Izinkan gerakan zoom in dalam mode webtoon</string>
|
||||
<string name="reader_info_bar_summary">Tampilkan waktu saat ini dan kemajuan pembacaan di bagian atas layar</string>
|
||||
<string name="webtoon_zoom_summary">Izinkan gestur zum pada mode webtoon</string>
|
||||
<string name="reader_info_bar_summary">Tampilkan waktu saat ini dan progres bacaan di bagian atas layar</string>
|
||||
<string name="pages_animation_summary">Animasikan peralihan halaman</string>
|
||||
<string name="clear_source_cookies_summary">Hapus cookie hanya untuk domain tertentu. Dalam kebanyakan kasus akan membatalkan otorisasi</string>
|
||||
<string name="clear_source_cookies_summary">Hapus kuki hanya untuk domain tertentu. Dalam kebanyakan kasus akan membatalkan otorisasi</string>
|
||||
<string name="download_option_whole_manga">Seluruh manga</string>
|
||||
<string name="download_option_first_n_chapters">Pertama %s</string>
|
||||
<string name="download_option_all_unread">Semua bab yang belum dibaca</string>
|
||||
@@ -470,24 +470,24 @@
|
||||
<string name="unknown">Tidak diketahui</string>
|
||||
<string name="in_progress">Dalam progres</string>
|
||||
<string name="advanced">Lanjutan</string>
|
||||
<string name="default_section">Bagian default</string>
|
||||
<string name="default_section">Bagian bawaan</string>
|
||||
<string name="manga_list">Daftar manga</string>
|
||||
<string name="error_corrupted_file">Data yang dikembalikan tidak valid atau file rusak</string>
|
||||
<string name="error_corrupted_file">Data yang dikembalikan tak sah atau berkas rusak</string>
|
||||
<string name="on_device">Dari perangkat</string>
|
||||
<string name="items_limit_exceeded">Tidak ada lagi item yang bisa ditambahkan</string>
|
||||
<string name="directories">Direktori</string>
|
||||
<string name="main_screen_sections">Bagian layar utama</string>
|
||||
<string name="to_top">Ke atas</string>
|
||||
<string name="zoom_in">Perbesar</string>
|
||||
<string name="frequency_every_day">Setiap Hari</string>
|
||||
<string name="frequency_every_day">Setiap hari</string>
|
||||
<string name="categories">Kategori</string>
|
||||
<string name="frequency_every_2_days">Setiap 2 Hari</string>
|
||||
<string name="online_variant">Variasi Online</string>
|
||||
<string name="online_variant">Varian daring</string>
|
||||
<string name="keep_screen_on">Biarkan Layar Menyala</string>
|
||||
<string name="zoom_out">Perkecil</string>
|
||||
<string name="keep_screen_on_summary">Jangan Matikan Layar Saat Membaca Komik</string>
|
||||
<string name="list_options">Opsi daftar</string>
|
||||
<string name="reader_zoom_buttons_summary">Apakah menampilkan tombol kontrol zoom di sudut kanan bawah</string>
|
||||
<string name="reader_zoom_buttons_summary">Apakah menampilkan tombol kontrol zum di sudut kanan bawah</string>
|
||||
<string name="backup_frequency">Frekuensi pembuatan cadangan</string>
|
||||
<string name="suggest_new_sources">Sumber baru yang disarankan setelah pembaruan aplikasi</string>
|
||||
<string name="periodic_backups_enable">Aktifkan pencadangan berkala</string>
|
||||
@@ -495,10 +495,10 @@
|
||||
<string name="enhanced_colors_summary">Mengurangi banding, tetapi dapat mempengaruhi kinerja</string>
|
||||
<string name="frequency_once_per_week">Sekali dalam seminggu</string>
|
||||
<string name="periodic_backups">Pencadangan berkala</string>
|
||||
<string name="reader_zoom_buttons">Tampilkan tombol zoom</string>
|
||||
<string name="reader_zoom_buttons">Tampilkan tombol zum</string>
|
||||
<string name="frequency_twice_per_month">Dua kali sebulan</string>
|
||||
<string name="by_relevance">Relevansi</string>
|
||||
<string name="state_abandoned">Istirahat</string>
|
||||
<string name="state_abandoned">Ditinggalkan</string>
|
||||
<string name="frequency_once_per_month">Sebulan sekali</string>
|
||||
<string name="enhanced_colors">mode warna 32-bit</string>
|
||||
<string name="speed_value">x%.1f</string>
|
||||
@@ -523,28 +523,28 @@
|
||||
<string name="genres_search_hint">Ketik nama genre</string>
|
||||
<string name="globally">Secara global</string>
|
||||
<string name="rating_adult">Dewasa</string>
|
||||
<string name="error_multiple_genres_not_supported">Filter berdasarkan banyak genre sekaligus tidak di dukung berdasarkan sumber manga ini</string>
|
||||
<string name="error_multiple_genres_not_supported">Filter berdasarkan banyak genre sekaligus tidak didukung berdasarkan sumber manga ini</string>
|
||||
<string name="this_manga">Manga ini</string>
|
||||
<string name="lock_screen_rotation">Kunci rotasi layar</string>
|
||||
<string name="skip">Lewati</string>
|
||||
<string name="error_search_not_supported">Pencarian tidak didukung untuk sumber komik ini</string>
|
||||
<string name="state_upcoming">Mendatang</string>
|
||||
<string name="color_correction_apply_text">Pengaturan ini dapat diterapkan secara menyeluruh atau hanya pada sumber manga saat ini. Jika diterapkan secara menyeluruh, pengaturan pada suatu sumber manga tidak akan di ubah / ditimpa.</string>
|
||||
<string name="color_correction_apply_text">Pengaturan ini dapat diterapkan secara menyeluruh atau hanya pada manga saat ini. Jika diterapkan secara menyeluruh, pengaturan pada manga tidak akan ditimpa.</string>
|
||||
<string name="source_enabled">Sumber yang diaktifkan</string>
|
||||
<string name="disable_nsfw_summary">Matikan sumber NSFW and sembunyikan komik dewasa dari daftar jika memungkinkan</string>
|
||||
<string name="content_rating">Peringkat konten</string>
|
||||
<string name="backup_date_">Tanggal dicadangkan %s</string>
|
||||
<string name="available_d">Tersedia:%1$d</string>
|
||||
<string name="state">Status</string>
|
||||
<string name="state_paused">Di jeda</string>
|
||||
<string name="state_paused">Dijeda</string>
|
||||
<string name="content_type_other">Lainnya</string>
|
||||
<string name="sync_auth">Masuk untuk sinkronisasi akun</string>
|
||||
<string name="sync_auth">Masuk untuk sinkronkan akun</string>
|
||||
<string name="source_summary_pattern">%1$s, %2$s</string>
|
||||
<string name="downloads_settings_info">Anda dapat mengaktifkan perlambatan pengunduhan untuk setiap sumber manga satu per satu di pengaturan sumber, jika Anda mengalami masalah dengan pemblokiran sisi server</string>
|
||||
<string name="default_tab">Tab bawaan</string>
|
||||
<string name="category_hidden_done">Kategori ini telah disembunyikan dari tampilan utama dan dapat di akses melalui Menu -> Manage categoties</string>
|
||||
<string name="grayscale">Skala abuabu</string>
|
||||
<string name="manual">Dilakukan sendiri</string>
|
||||
<string name="grayscale">Skala abu-abu</string>
|
||||
<string name="manual">Manual</string>
|
||||
<string name="no_manga_sources_catalog_text">Tidak ada sumber yang tersedia di bagian ini, atau semuanya mungkin sudah ditambahkan.
|
||||
\nPantau terus</string>
|
||||
<string name="mark_as_completed">Tandai telah selesai</string>
|
||||
@@ -557,7 +557,7 @@
|
||||
<string name="by_name_reverse">Nama terbalik</string>
|
||||
<string name="volume_">Volume%d</string>
|
||||
<string name="volume_unknown">Volume tidak diketahui</string>
|
||||
<string name="approximate_reading_time">Perkiraan waktu pembacaan</string>
|
||||
<string name="approximate_reading_time">Perkiraan waktu baca</string>
|
||||
<string name="incognito_mode_hint">Progres membaca Anda tidak akan tersimpan</string>
|
||||
<string name="rating_suggestive">Disarankan</string>
|
||||
<string name="vertical">Vertikal</string>
|
||||
@@ -566,19 +566,43 @@
|
||||
<string name="approximate_remaining_time">Perkiraan waktu yang tersisa</string>
|
||||
<string name="remaining_time_pattern">%1$s%2$s</string>
|
||||
<string name="toggle_ui">Tampilkan/Sembunyikan UI</string>
|
||||
<string name="prev_chapter">Chapter sebelumnya</string>
|
||||
<string name="prev_chapter">Bab sebelumnya</string>
|
||||
<string name="switch_pages_volume_buttons">Aktifkan tombol volume</string>
|
||||
<string name="reader_actions_summary">Konfigurasikan tindakan untuk area layar yang dapat diketuk</string>
|
||||
<string name="tap_action">Tindakan saat diketuk</string>
|
||||
<string name="reader_actions">Tindakan saat membaca</string>
|
||||
<string name="long_tap_action">Tindakan saat diketuk lama</string>
|
||||
<string name="none">Tidak ada</string>
|
||||
<string name="next_chapter">Chapter selanjutnya</string>
|
||||
<string name="next_chapter">Bab selanjutnya</string>
|
||||
<string name="prev_page">Halaman sebelumnya</string>
|
||||
<string name="next_page">Halaman selanjutnya</string>
|
||||
<string name="switch_pages_volume_buttons_summary">Gunakan tombol volume untuk berpindah halaman</string>
|
||||
<string name="show_menu">Tampilkan menu</string>
|
||||
<string name="config_reset_confirm">Kembalikan pengaturan ke bawaan? Tindakan ini tidak bisa dibatalkan.</string>
|
||||
<string name="use_two_pages_landscape">Gunakan tata letak dua halaman pada orientasi landscape (beta)</string>
|
||||
<string name="email_password_enter_hint">Masukkan email dan sandi untuk melanjutkan</string>
|
||||
</resources>
|
||||
<string name="use_two_pages_landscape">Gunakan tata letak dua halaman pada orientasi lanskap (beta)</string>
|
||||
<string name="email_password_enter_hint">Masukkan surel dan kata sandi untuk melanjutkan</string>
|
||||
<string name="reading_time_estimation_summary">Perkiraan waktu mungkin tidak akurat</string>
|
||||
<string name="suggestions_unavailable_text">Fitur saran dinonaktifkan</string>
|
||||
<string name="check_for_new_chapters_disabled">Memeriksa bab baru dinonaktifkan</string>
|
||||
<string name="show_labels_in_navbar">Tampilkan label di bilah navigasi</string>
|
||||
<string name="pages_saving">Menyimpan halaman</string>
|
||||
<string name="location">Lokasi</string>
|
||||
<string name="remove_from_history">Hapus dari riwayat</string>
|
||||
<string name="less_than_minute">Kurang dari semenit</string>
|
||||
<string name="statistics">Statistik</string>
|
||||
<string name="chapters_grid_view">Tampilan kisi</string>
|
||||
<string name="reading_time_estimation">Tampilkan perkiraan waktu membaca</string>
|
||||
<string name="ask_for_dest_dir_every_time">Tanya terus direktori tujuan</string>
|
||||
<string name="month">Bulan</string>
|
||||
<string name="day">Hari</string>
|
||||
<string name="three_months">Tiga bulan</string>
|
||||
<string name="alternatives">Alternatif</string>
|
||||
<string name="all_time">Sepanjang waktu</string>
|
||||
<string name="stats_cleared">Statistik dibersihkan</string>
|
||||
<string name="stats_enabled">Aktifkan statistik</string>
|
||||
<string name="clear_stats_confirm">Apakah Anda benar-benar ingin menghapus semua statistik membaca? Tindakan ini tidak bisa dikembalikan.</string>
|
||||
<string name="week">Pekan</string>
|
||||
<string name="fullscreen_mode">Mode layar penuh</string>
|
||||
<string name="reader_fullscreen_summary">Sembunyikan status sistem dan bilah navigasi</string>
|
||||
<string name="automatic">Otomatis</string>
|
||||
</resources>
|
||||
@@ -623,4 +623,14 @@
|
||||
<string name="no_chapters_deleted">Żadne rozdziały nie zostały usunięte</string>
|
||||
<string name="chapters_deleted_pattern">Usunięto %1$s, wyczyszczono %2$s</string>
|
||||
<string name="delete_read_chapters_prompt">Spowoduje to trwałe usunięcie wszystkich rozdziałów oznaczonych jako przeczytane z pamięci lokalnej. Możesz je pobrać ponownie później, ale zaimportowane rozdziały mogą zostać utracone na zawsze</string>
|
||||
<string name="chapters_grid_view">Widok siatki</string>
|
||||
<string name="delete_read_chapters_auto">Automatyczne usuwanie przeczytanych rozdziałów</string>
|
||||
<string name="runs_on_app_start">Wykonaj podczas uruchamiania aplikacji</string>
|
||||
<string name="split_by_translations">Podziel według tłumaczeń</string>
|
||||
<string name="split_by_translations_summary">Wyświetlaj rozdziały z różnymi tłumaczeniami osobno, a nie razem w jednej liście</string>
|
||||
<string name="order_oldest">Najstarszy</string>
|
||||
<string name="long_ago_read">Przeczytane dawno temu</string>
|
||||
<string name="unread">Nieprzeczytany</string>
|
||||
<string name="enable_source">Włącz źródło</string>
|
||||
<string name="unsupported_source">To źródło mangi nie jest obsługiwane</string>
|
||||
</resources>
|
||||
@@ -408,7 +408,7 @@
|
||||
<string name="suggestions_enable_prompt">Хотите ли Вы получать персонализированные рекомендации манги\?</string>
|
||||
<string name="translations">Переводы</string>
|
||||
<string name="web_view_unavailable">WebView недоступен: проверьте, установлен ли провайдер WebView</string>
|
||||
<string name="clear_network_cache">Очистить сетевой кеш</string>
|
||||
<string name="clear_network_cache">Очистить сетевой кэш</string>
|
||||
<string name="address">Адрес</string>
|
||||
<string name="type">Тип</string>
|
||||
<string name="proxy">Прокси</string>
|
||||
@@ -594,7 +594,7 @@
|
||||
<string name="show_labels_in_navbar">Показывать подписи на панели навигации</string>
|
||||
<string name="default_page_save_dir">Папка для сохранений по умолчанию</string>
|
||||
<string name="location">Расположение</string>
|
||||
<string name="automatic">Автоматически</string>
|
||||
<string name="automatic">Автоматический</string>
|
||||
<string name="single_cbz_file">Один файл CBZ</string>
|
||||
<string name="multiple_cbz_files">Несколько файлов CBZ</string>
|
||||
<string name="preferred_download_format">Предпочтительный формат загрузок</string>
|
||||
@@ -631,4 +631,6 @@
|
||||
<string name="split_by_translations_summary">Показывать главы с разными переводами отдельно, а не одним списком</string>
|
||||
<string name="order_oldest">Самые старые</string>
|
||||
<string name="delete_read_chapters_prompt">Это приведёт к безвозвратному удалению всех глав, помеченных как прочитанные, из вашего локального хранилища. Вы можете повторно загрузить их позже, но импортированные главы могут быть потеряны навсегда</string>
|
||||
</resources>
|
||||
<string name="enable_source">Включить источник</string>
|
||||
<string name="unsupported_source">Этот источник манги не поддерживается</string>
|
||||
</resources>
|
||||
@@ -618,4 +618,19 @@
|
||||
<string name="alternatives">Замене</string>
|
||||
<string name="migrate">Премести</string>
|
||||
<string name="migrate_confirmation">Манга „%1$s“ из „%2$s“ ће бити замењена са „%3$s“ из „%4$s“ у вашој Историји и Омиљеним (ако постоји)</string>
|
||||
<string name="delete_read_chapters_summary">Избриши поглавља која си већ прочитао из локалне меморије да би ослободио простор</string>
|
||||
<string name="delete_read_chapters_prompt">Ово ће трајно избрисати сва поглавља означена као прочитана из твог локалног складишта. Можеш их поново преузети касније, али увезена поглавља могу бити изгубљена заувек</string>
|
||||
<string name="long_ago_read">Давно прочитано</string>
|
||||
<string name="unread">Непрочитано</string>
|
||||
<string name="chapters_grid_view">Мрежни приказ</string>
|
||||
<string name="delete_read_chapters">Избриши прочитана поглавља</string>
|
||||
<string name="no_chapters_deleted">Ниједно поглавље није избрисано</string>
|
||||
<string name="chapters_deleted_pattern">Уклоњено %1$s, избрисано %2$s</string>
|
||||
<string name="delete_read_chapters_auto">Аутоматски избриши прочитана поглавља</string>
|
||||
<string name="runs_on_app_start">Ради када се апликација покрене</string>
|
||||
<string name="split_by_translations">Подели по преводима</string>
|
||||
<string name="split_by_translations_summary">Прикажи поглавља са различитим преводима одвојено, а не на једној листи</string>
|
||||
<string name="order_oldest">Најстарије</string>
|
||||
<string name="enable_source">Омогући извор</string>
|
||||
<string name="unsupported_source">Овај извор манге није подржан</string>
|
||||
</resources>
|
||||
@@ -631,4 +631,8 @@
|
||||
<string name="order_oldest">En eski</string>
|
||||
<string name="long_ago_read">Uzun zaman önce okundu</string>
|
||||
<string name="unread">Okunmadı</string>
|
||||
</resources>
|
||||
<string name="unsupported_source">Bu manga kaynağı desteklenmiyor</string>
|
||||
<string name="enable_source">Kaynağı etkinleştir</string>
|
||||
<string name="show_pages_thumbs_summary">Ayrıntılar ekranında \"Sayfalar\" sekmesini etkinleştir</string>
|
||||
<string name="show_pages_thumbs">Sayfa küçük resimlerini göster</string>
|
||||
</resources>
|
||||
|
||||
@@ -594,7 +594,7 @@
|
||||
<string name="show_labels_in_navbar">Показувати мітки на панелі навігації</string>
|
||||
<string name="default_page_save_dir">Директорія збереження сторінки за замовчуванням</string>
|
||||
<string name="location">Розташування</string>
|
||||
<string name="automatic">Автоматично</string>
|
||||
<string name="automatic">Автоматичний</string>
|
||||
<string name="multiple_cbz_files">Декілька файлів CBZ</string>
|
||||
<string name="preferred_download_format">Бажаний формат для завантажень</string>
|
||||
<string name="single_cbz_file">Один файл CBZ</string>
|
||||
@@ -631,4 +631,6 @@
|
||||
<string name="runs_on_app_start">Запускається під час запуску застосунка</string>
|
||||
<string name="delete_read_chapters_auto">Автоматично видаляти прочитані розділи</string>
|
||||
<string name="delete_read_chapters_prompt">Це призведе до остаточного видалення всіх розділів, позначених як прочитані, з вашого локального сховища. Ви можете завантажити їх пізніше, але імпортовані розділи можуть бути втрачені назавжди</string>
|
||||
</resources>
|
||||
<string name="enable_source">Увімкнути джерело</string>
|
||||
<string name="unsupported_source">Це джерело манги не підтримується</string>
|
||||
</resources>
|
||||
@@ -12,7 +12,7 @@
|
||||
<string name="processing_">正在处理…</string>
|
||||
<string name="newest">最新</string>
|
||||
<string name="by_rating">评分</string>
|
||||
<string name="cookies_cleared">已清除所有 Cookies</string>
|
||||
<string name="cookies_cleared">Cookies 已清除</string>
|
||||
<string name="data_restored_success">数据已全部恢复</string>
|
||||
<string name="silent">无声</string>
|
||||
<string name="preparing_">准备中…</string>
|
||||
@@ -202,7 +202,7 @@
|
||||
<string name="state_finished">已完结</string>
|
||||
<string name="system_default">默认</string>
|
||||
<string name="exclude_nsfw_from_history">屏蔽成人漫画阅读记录</string>
|
||||
<string name="show_pages_numbers">页码</string>
|
||||
<string name="show_pages_numbers">显示页码</string>
|
||||
<string name="enabled_sources">已用图源</string>
|
||||
<string name="available_sources">可用图源</string>
|
||||
<string name="screenshots_policy">阅读时截图限制</string>
|
||||
@@ -213,7 +213,7 @@
|
||||
<string name="suggestions_enable">开启漫画推荐</string>
|
||||
<string name="text_suggestion_holder">开始阅读漫画,即可获取个性化推荐</string>
|
||||
<string name="exclude_nsfw_from_suggestions">禁止推荐成人漫画</string>
|
||||
<string name="enabled">启用</string>
|
||||
<string name="enabled">开启</string>
|
||||
<string name="disabled">关闭</string>
|
||||
<string name="filter_load_error">无法加载分类列表</string>
|
||||
<string name="reset_filter">重置筛选</string>
|
||||
@@ -228,7 +228,7 @@
|
||||
<string name="text_delete_local_manga_batch">确定从设备中永久删除所选漫画?</string>
|
||||
<string name="removal_completed">删除成功</string>
|
||||
<string name="download_slowdown">限速下载</string>
|
||||
<string name="download_slowdown_summary">有助于避免封禁你的IP地址</string>
|
||||
<string name="download_slowdown_summary">帮助避免封禁你的IP地址</string>
|
||||
<string name="local_manga_processing">正在处理已保存漫画</string>
|
||||
<string name="chapters_will_removed_background">下载章节将在后台进行删除</string>
|
||||
<string name="hide">隐藏</string>
|
||||
@@ -250,7 +250,7 @@
|
||||
<string name="detect_reader_mode">自动检测条漫模式</string>
|
||||
<string name="detect_reader_mode_summary">阅读条漫时自动应用条漫阅读模式</string>
|
||||
<string name="disable_battery_optimization">关闭电池优化</string>
|
||||
<string name="disable_battery_optimization_summary">有助于检查更新的后台运行</string>
|
||||
<string name="disable_battery_optimization_summary">帮助保持检查更新时的后台运行</string>
|
||||
<string name="crash_text">出错了,请向开发人员提交错误报告以帮助修复问题。</string>
|
||||
<string name="send">发送</string>
|
||||
<string name="disable_all">全部关闭</string>
|
||||
@@ -268,8 +268,8 @@
|
||||
<string name="show_reading_indicators_summary">在历史和收藏中显示阅读百分比</string>
|
||||
<string name="show_reading_indicators">显示阅读进度</string>
|
||||
<string name="data_deletion">数据删除</string>
|
||||
<string name="exclude_nsfw_from_history_summary">标记为含有成人内容的漫画将不会记录阅读历史及阅读进度</string>
|
||||
<string name="clear_cookies_summary">可帮助稍微解决部分问题,所有网站的授权将会失效</string>
|
||||
<string name="exclude_nsfw_from_history_summary">被标记为含有成人内容的漫画将不会记录阅读历史及阅读进度</string>
|
||||
<string name="clear_cookies_summary">能帮助解决部分问题,所有网站的授权将会失效</string>
|
||||
<string name="show_all">显示全部</string>
|
||||
<string name="manga_error_description_pattern">错误详情:<br><tt>%1$s</tt><br><br>1.尝试<a href=%2$s>在浏览器中打开漫画</a>确保漫画在图源中正常显示<br>2.确认正在使用的是<a href=kotatsu://about>最新版本的Kotatsu</a><br>3.若已排除以上问题,请向开发人员发送错误报告。</string>
|
||||
<string name="invalid_domain_message">无效域名</string>
|
||||
@@ -375,7 +375,7 @@
|
||||
<string name="got_it">知道了</string>
|
||||
<string name="speed">速度</string>
|
||||
<string name="restore_backup_description">导入先前创建的用户数据备份</string>
|
||||
<string name="show_on_shelf">在书架上显示</string>
|
||||
<string name="show_on_shelf">在书架中显示</string>
|
||||
<string name="comics_archive_import_description">可选择一个或多个 CBZ 或 ZIP 文件,每个文件都将识别为一个单独的漫画。</string>
|
||||
<string name="folder_with_images_import_description">可选择一个包含压缩包或图片的文件夹,每个压缩包 (或子文件夹) 都会被识别为一个章节。</string>
|
||||
<string name="find_similar">搜索相似漫画</string>
|
||||
@@ -389,13 +389,13 @@
|
||||
<string name="remove_completed">清除已完成任务</string>
|
||||
<string name="cancel_all">取消所有下载中的任务</string>
|
||||
<string name="downloads_wifi_only">仅在连接 Wi-Fi 时下载</string>
|
||||
<string name="enable">启用</string>
|
||||
<string name="enable">开启</string>
|
||||
<string name="no_thanks">不了谢谢</string>
|
||||
<string name="sync_settings">同步设定</string>
|
||||
<string name="server_address">服务器地址</string>
|
||||
<string name="pause">暂停</string>
|
||||
<string name="resume">继续</string>
|
||||
<string name="ignore_ssl_errors">忽略 SSL 错误</string>
|
||||
<string name="ignore_ssl_errors">忽略 SSL 证书错误</string>
|
||||
<string name="text_downloads_list_holder">暂无下载任务</string>
|
||||
<string name="downloads_resumed">下载已继续</string>
|
||||
<string name="downloads_paused">下载已暂停</string>
|
||||
@@ -458,10 +458,10 @@
|
||||
<string name="data_not_restored_text">备份文件不正确</string>
|
||||
<string name="unknown">未知</string>
|
||||
<string name="in_progress">进行中</string>
|
||||
<string name="items_limit_exceeded">没有可添加项目</string>
|
||||
<string name="items_limit_exceeded">已达项目添加上限</string>
|
||||
<string name="data_not_restored">数据恢复失败</string>
|
||||
<string name="directories">目录</string>
|
||||
<string name="manage_categories">管理分类</string>
|
||||
<string name="manage_categories">分类管理</string>
|
||||
<string name="color_light">浅色</string>
|
||||
<string name="search_hint">输入漫画标题、分类或图源名称</string>
|
||||
<string name="main_screen_sections">主页底部导航栏</string>
|
||||
@@ -555,7 +555,7 @@
|
||||
<string name="mark_as_completed_prompt">确定将选定漫画标记为已读?
|
||||
\n
|
||||
\n警告: 当前的阅读进度将会丢失。</string>
|
||||
<string name="category_hidden_done">此分类已从主页隐藏,可通过菜单 → 管理分类来访问</string>
|
||||
<string name="category_hidden_done">此分类已从主页隐藏,可通过菜单 → 收藏分类管理来访问</string>
|
||||
<string name="approximate_reading_time">估计所需阅读时间</string>
|
||||
<string name="approximate_remaining_time">估计剩余阅读时间</string>
|
||||
<string name="remaining_time_pattern">%1$s %2$s</string>
|
||||
@@ -588,7 +588,7 @@
|
||||
<string name="check_for_new_chapters_disabled">漫画更新功能已被关闭</string>
|
||||
<string name="reading_time_estimation">在漫画详情页显示估计阅读时间</string>
|
||||
<string name="reading_time_estimation_summary">估计阅读时间可能会不准确</string>
|
||||
<string name="show_labels_in_navbar">显示底部导航栏名称</string>
|
||||
<string name="show_labels_in_navbar">显示底部导航栏标签名称</string>
|
||||
<string name="ask_for_dest_dir_every_time">保存图片时总是询问保存目录</string>
|
||||
<string name="pages_saving">图片保存</string>
|
||||
<string name="default_page_save_dir">图片默认保存目录</string>
|
||||
@@ -602,7 +602,7 @@
|
||||
<string name="reading_stats">阅读统计</string>
|
||||
<string name="other_manga">其他漫画</string>
|
||||
<string name="less_than_minute">不到1分钟</string>
|
||||
<string name="statistics">统计</string>
|
||||
<string name="statistics">阅读统计</string>
|
||||
<string name="month">月</string>
|
||||
<string name="clear_stats_confirm">确定清除所有统计记录?清除后无法恢复。</string>
|
||||
<string name="pages_read_s">已读页数: %s</string>
|
||||
@@ -615,20 +615,22 @@
|
||||
<string name="empty_stats_text">选择的时间段没有阅读统计记录</string>
|
||||
<string name="migrate">换源</string>
|
||||
<string name="delete_read_chapters">删除已读章节</string>
|
||||
<string name="no_chapters_deleted">尚未删除章节</string>
|
||||
<string name="chapters_deleted_pattern">已删除 %1$s, 清除了 %2$s</string>
|
||||
<string name="no_chapters_deleted">没有章节可供删除</string>
|
||||
<string name="chapters_deleted_pattern">已删除 %1$s, 释放了 %2$s 的存储空间</string>
|
||||
<string name="delete_read_chapters_summary">从本地设备中删除已读章节来释放存储空间</string>
|
||||
<string name="alternatives">其他版本</string>
|
||||
<string name="manga_migration">漫画换源</string>
|
||||
<string name="alternatives">漫画换源</string>
|
||||
<string name="manga_migration">即将换源</string>
|
||||
<string name="migration_completed">换源完成</string>
|
||||
<string name="chapters_grid_view">网格视图</string>
|
||||
<string name="delete_read_chapters_prompt">将会删除所有在本地设备内标记为已读的章节。可之后再重新下载,但已导入的章节将会永久丢失</string>
|
||||
<string name="chapters_grid_view">切换为网格视图</string>
|
||||
<string name="delete_read_chapters_prompt">将会删除所有储存在本地并被标记为已读的章节,可之后再重新下载,但已导入的章节将永久丢失</string>
|
||||
<string name="delete_read_chapters_auto">自动删除已读章节</string>
|
||||
<string name="runs_on_app_start">开启应用时运行</string>
|
||||
<string name="migrate_confirmation">\"%2$s\" 图源的 \"%1$s\" 漫画将会在你的历史记录和收藏中替换为 \"%4$s\" 图源的 \"%3$s\" 漫画(若资源存在)</string>
|
||||
<string name="runs_on_app_start">启动应用时开始删除</string>
|
||||
<string name="migrate_confirmation">将会把历史记录和收藏中 \"%2$s\" 图源的 \"%1$s\" 替换成 \"%4$s\" 图源的 \"%3$s\"(若资源存在)</string>
|
||||
<string name="unread">未读</string>
|
||||
<string name="order_oldest">最旧</string>
|
||||
<string name="long_ago_read">很久以前阅读</string>
|
||||
<string name="split_by_translations">翻译版本分开显示</string>
|
||||
<string name="split_by_translations_summary">分开显示不同的翻译版本,而不是只合并成一个列表</string>
|
||||
<string name="split_by_translations_summary">分开显示不同的翻译版本,而非合并成一个列表</string>
|
||||
<string name="enable_source">开启图源</string>
|
||||
<string name="unsupported_source">不支持此漫画图源</string>
|
||||
</resources>
|
||||
@@ -638,4 +638,7 @@
|
||||
<string name="unread">Unread</string>
|
||||
<string name="enable_source">Enable source</string>
|
||||
<string name="unsupported_source">This manga source is not supported</string>
|
||||
<string name="show_pages_thumbs">Show pages thumbnails</string>
|
||||
<string name="show_pages_thumbs_summary">Enable the \"Pages\" tab on the details screen</string>
|
||||
<string name="error_no_data_received">No data was received from server</string>
|
||||
</resources>
|
||||
|
||||
@@ -48,8 +48,15 @@
|
||||
|
||||
<PreferenceCategory android:title="@string/details">
|
||||
|
||||
<SwitchPreferenceCompat
|
||||
android:defaultValue="true"
|
||||
android:key="pages_tab"
|
||||
android:summary="@string/show_pages_thumbs_summary"
|
||||
android:title="@string/show_pages_thumbs" />
|
||||
|
||||
<ListPreference
|
||||
android:defaultValue="0"
|
||||
android:dependency="pages_tab"
|
||||
android:entries="@array/details_tabs"
|
||||
android:entryValues="@array/details_tabs_values"
|
||||
android:key="details_tab"
|
||||
|
||||
@@ -4,9 +4,9 @@ buildscript {
|
||||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:8.3.0'
|
||||
classpath 'com.android.tools.build:gradle:8.3.1'
|
||||
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.23'
|
||||
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.51'
|
||||
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.51.1'
|
||||
classpath 'com.google.devtools.ksp:symbol-processing-gradle-plugin:1.9.23-1.0.19'
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user