Compare commits

...

22 Commits

Author SHA1 Message Date
Koitharu
6b1240fccb Fix crashes 2024-02-24 14:26:31 +02:00
Koitharu
e00a5b7505 Fix open Kitsu auth #773 2024-02-24 13:50:48 +02:00
Koitharu
2c07d2c8e1 Increase Kitsu password max length #774 2024-02-24 13:17:03 +02:00
Koitharu
45c3c05f01 Fix updating history in incognito mode #783 2024-02-24 13:13:35 +02:00
Koitharu
e97a745713 Fix filter ui issue #779 2024-02-24 12:50:59 +02:00
Koitharu
2dc4de0a3c Update dependencies 2024-02-24 12:25:44 +02:00
Koitharu
3cf2c58058 Local manga info dialog 2024-02-24 12:16:26 +02:00
Scrambled777
1e19f32fc5 Translated using Weblate (Hindi)
Currently translated at 22.6% (135 of 596 strings)

Co-authored-by: Scrambled777 <weblate.scrambled777@simplelogin.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/hi/
Translation: Kotatsu/Strings
2024-02-24 12:14:04 +02:00
Naga
99e4359523 Translated using Weblate (English)
Currently translated at 100.0% (596 of 596 strings)

Co-authored-by: Naga <yz2000.pro@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/en/
Translation: Kotatsu/Strings
2024-02-24 12:14:04 +02:00
Alex Georgiou
04868488cc Translated using Weblate (English)
Currently translated at 100.0% (596 of 596 strings)

Co-authored-by: Alex Georgiou <alexandrosgeorgiou35@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/en/
Translation: Kotatsu/Strings
2024-02-24 12:14:04 +02:00
Naga
2b3b406b84 Translated using Weblate (French)
Currently translated at 100.0% (596 of 596 strings)

Translated using Weblate (French)

Currently translated at 100.0% (9 of 9 strings)

Translated using Weblate (French)

Currently translated at 99.4% (593 of 596 strings)

Co-authored-by: Naga <yz2000.pro@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/plurals/fr/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fr/
Translation: Kotatsu/Strings
Translation: Kotatsu/plurals
2024-02-24 12:14:04 +02:00
Infy's Tagalog Translations
7ab3c75232 Translated using Weblate (Filipino)
Currently translated at 100.0% (596 of 596 strings)

Translated using Weblate (Filipino)

Currently translated at 100.0% (9 of 9 strings)

Co-authored-by: Infy's Tagalog Translations <ced.paltep10@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/plurals/fil/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fil/
Translation: Kotatsu/Strings
Translation: Kotatsu/plurals
2024-02-24 12:14:04 +02:00
Макар Разин
61f7755465 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (596 of 596 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (596 of 596 strings)

Translated using Weblate (Belarusian)

Currently translated at 100.0% (596 of 596 strings)

Translated using Weblate (Belarusian)

Currently translated at 100.0% (596 of 596 strings)

Co-authored-by: Макар Разин <makarrazin14@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/be/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/ru/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/uk/
Translation: Kotatsu/Strings
2024-02-24 12:14:04 +02:00
GpixeL
9389015ab9 Translated using Weblate (Indonesian)
Currently translated at 97.6% (582 of 596 strings)

Co-authored-by: GpixeL <gamesfire313@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/id/
Translation: Kotatsu/Strings
2024-02-24 12:14:04 +02:00
Сергій
bc56a94aa6 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (596 of 596 strings)

Co-authored-by: Сергій <sergiy.goncharuk.1@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/uk/
Translation: Kotatsu/Strings
2024-02-24 12:14:04 +02:00
Madaraki
7cfcaec6dd Translated using Weblate (Russian)
Currently translated at 100.0% (596 of 596 strings)

Co-authored-by: Madaraki <115705267+Madaraki-chan@users.noreply.github.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/ru/
Translation: Kotatsu/Strings
2024-02-24 12:14:04 +02:00
LaFouine-38
39c7ae31cd Translated using Weblate (French)
Currently translated at 92.6% (552 of 596 strings)

Co-authored-by: LaFouine-38 <thomasjb0208@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fr/
Translation: Kotatsu/Strings
2024-02-24 12:14:04 +02:00
Sergio Varela
9349eccc0c Translated using Weblate (Spanish)
Currently translated at 100.0% (596 of 596 strings)

Co-authored-by: Sergio Varela <sergitroll9@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/es/
Translation: Kotatsu/Strings
2024-02-24 12:14:04 +02:00
gekka
8204934359 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (596 of 596 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.8% (595 of 596 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (596 of 596 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (596 of 596 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (596 of 596 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (596 of 596 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.4% (592 of 595 strings)

Co-authored-by: gekka <1778962971@qq.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/zh_Hans/
Translation: Kotatsu/Strings
2024-02-24 12:14:04 +02:00
Oğuz Ersen
b5497c571e Translated using Weblate (Turkish)
Currently translated at 100.0% (596 of 596 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (596 of 596 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (595 of 595 strings)

Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/tr/
Translation: Kotatsu/Strings
2024-02-24 12:14:04 +02:00
Koitharu
b4d52f1367 Fix track worker notification behavior 2024-02-20 12:46:12 +02:00
Zakhar Timoshenko
325a8be484 Fix wrong sources count if NSFW sources are disabled 2024-02-18 23:56:19 +03:00
43 changed files with 1121 additions and 792 deletions

View File

@@ -16,8 +16,8 @@ android {
applicationId 'org.koitharu.kotatsu'
minSdk = 21
targetSdk = 34
versionCode = 624
versionName = '6.7.2'
versionCode = 625
versionName = '6.7.3'
generatedDensities = []
testInstrumentationRunner 'org.koitharu.kotatsu.HiltTestRunner'
ksp {
@@ -82,7 +82,7 @@ afterEvaluate {
}
dependencies {
//noinspection GradleDependency
implementation('com.github.KotatsuApp:kotatsu-parsers:3ff028c4e9') {
implementation('com.github.KotatsuApp:kotatsu-parsers:103f578c61') {
exclude group: 'org.json', module: 'json'
}
@@ -128,11 +128,11 @@ dependencies {
implementation 'com.google.dagger:hilt-android:2.50'
kapt 'com.google.dagger:hilt-compiler:2.50'
implementation 'androidx.hilt:hilt-work:1.1.0'
kapt 'androidx.hilt:hilt-compiler:1.1.0'
implementation 'androidx.hilt:hilt-work:1.2.0'
kapt 'androidx.hilt:hilt-compiler:1.2.0'
implementation 'io.coil-kt:coil-base:2.5.0'
implementation 'io.coil-kt:coil-svg:2.5.0'
implementation 'io.coil-kt:coil-base:2.6.0'
implementation 'io.coil-kt:coil-svg:2.6.0'
implementation 'com.github.KotatsuApp:subsampling-scale-image-view:02e6d6cfe9'
implementation 'com.github.solkin:disk-lru-cache:1.4'
implementation 'io.noties.markwon:core:4.6.2'

View File

@@ -57,6 +57,7 @@ class AppShortcutManagerTest {
page = 4,
scroll = 2,
percent = 0.3f,
force = false,
)
awaitUpdate()

View File

@@ -7,7 +7,9 @@ import dagger.hilt.android.testing.HiltAndroidRule
import dagger.hilt.android.testing.HiltAndroidTest
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.test.runTest
import org.junit.Assert.*
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNull
import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Rule
import org.junit.Test
@@ -61,6 +63,7 @@ class AppBackupAgentTest {
page = 3,
scroll = 40,
percent = 0.2f,
force = false,
)
val history = checkNotNull(historyRepository.getOne(SampleData.manga))

View File

@@ -14,7 +14,6 @@ import androidx.core.view.isVisible
import androidx.core.view.updatePadding
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.ui.BaseActivity
import org.koitharu.kotatsu.core.util.ext.catchingWebViewUnavailability
import org.koitharu.kotatsu.databinding.ActivityBrowserBinding
import org.koitharu.kotatsu.parsers.network.UserAgents
import com.google.android.material.R as materialR
@@ -26,7 +25,7 @@ class BrowserActivity : BaseActivity<ActivityBrowserBinding>(), BrowserCallback
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (!catchingWebViewUnavailability { setContentView(ActivityBrowserBinding.inflate(layoutInflater)) }) {
if (!setContentViewWebViewSafe { ActivityBrowserBinding.inflate(layoutInflater) }) {
return
}
supportActionBar?.run {

View File

@@ -27,7 +27,6 @@ import org.koitharu.kotatsu.core.network.CommonHeaders
import org.koitharu.kotatsu.core.network.cookies.MutableCookieJar
import org.koitharu.kotatsu.core.ui.BaseActivity
import org.koitharu.kotatsu.core.util.TaggedActivityResult
import org.koitharu.kotatsu.core.util.ext.catchingWebViewUnavailability
import org.koitharu.kotatsu.databinding.ActivityBrowserBinding
import org.koitharu.kotatsu.parsers.network.UserAgents
import javax.inject.Inject
@@ -45,13 +44,7 @@ class CloudFlareActivity : BaseActivity<ActivityBrowserBinding>(), CloudFlareCal
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (!catchingWebViewUnavailability {
setContentView(
ActivityBrowserBinding.inflate(
layoutInflater,
),
)
}) {
if (!setContentViewWebViewSafe { ActivityBrowserBinding.inflate(layoutInflater) }) {
return
}
supportActionBar?.run {

View File

@@ -430,7 +430,7 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) {
fun getPagesSaveDir(context: Context): DocumentFile? =
prefs.getString(KEY_PAGES_SAVE_DIR, null)?.toUriOrNull()?.let {
DocumentFile.fromTreeUri(context, it)
DocumentFile.fromTreeUri(context, it)?.takeIf { it.canWrite() }
}
fun setPagesSaveDir(uri: Uri?) {

View File

@@ -8,6 +8,7 @@ import android.os.Bundle
import android.view.KeyEvent
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.annotation.CallSuper
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.view.ActionMode
@@ -29,6 +30,7 @@ import org.koitharu.kotatsu.core.ui.util.ActionModeDelegate
import org.koitharu.kotatsu.core.ui.util.BaseActivityEntryPoint
import org.koitharu.kotatsu.core.ui.util.WindowInsetsDelegate
import org.koitharu.kotatsu.core.util.ext.getThemeColor
import org.koitharu.kotatsu.core.util.ext.isWebViewUnavailable
@Suppress("LeakingThis")
abstract class BaseActivity<B : ViewBinding> :
@@ -164,6 +166,21 @@ abstract class BaseActivity<B : ViewBinding> :
intent?.putExtra(EXTRA_DATA, intent.data)
}
protected fun setContentViewWebViewSafe(viewBindingProducer: () -> B): Boolean {
return try {
setContentView(viewBindingProducer())
true
} catch (e: Exception) {
if (e.isWebViewUnavailable()) {
Toast.makeText(this, R.string.web_view_unavailable, Toast.LENGTH_LONG).show()
finishAfterTransition()
false
} else {
throw e
}
}
}
companion object {
const val EXTRA_DATA = "data"

View File

@@ -68,6 +68,14 @@ class RecyclerViewAlertDialog private constructor(
return this
}
fun setNeutralButton(
@StringRes textId: Int,
listener: DialogInterface.OnClickListener,
): Builder<T> {
delegate.setNeutralButton(textId, listener)
return this
}
fun setCancelable(isCancelable: Boolean): Builder<T> {
delegate.setCancelable(isCancelable)
return this

View File

@@ -16,6 +16,7 @@ import androidx.core.graphics.ColorUtils
import androidx.core.graphics.withClip
import com.google.android.material.color.MaterialColors
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.util.Colors
import kotlin.math.absoluteValue
class FaviconDrawable(
@@ -44,7 +45,7 @@ class FaviconDrawable(
}
paint.textAlign = Paint.Align.CENTER
paint.isFakeBoldText = true
colorForeground = MaterialColors.harmonize(colorOfString(name), colorBackground)
colorForeground = MaterialColors.harmonize(Colors.random(name), colorBackground)
}
override fun draw(canvas: Canvas) {
@@ -104,9 +105,4 @@ class FaviconDrawable(
paint.getTextBounds(text, 0, text.length, tempRect)
return testTextSize * width / tempRect.width()
}
private fun colorOfString(str: String): Int {
val hue = (str.hashCode() % 360).absoluteValue.toFloat()
return ColorUtils.HSLToColor(floatArrayOf(hue, 0.5f, 0.5f))
}
}

View File

@@ -0,0 +1,41 @@
package org.koitharu.kotatsu.core.util
import android.content.Context
import androidx.annotation.AttrRes
import androidx.annotation.ColorInt
import androidx.core.graphics.ColorUtils
import com.google.android.material.R
import com.google.android.material.color.MaterialColors
import org.koitharu.kotatsu.core.util.ext.getThemeColor
import kotlin.math.absoluteValue
object Colors {
@ColorInt
fun segmentColor(context: Context, @AttrRes resId: Int): Int {
val colorHex = String.format("%06x", context.getThemeColor(resId))
val hue = getHue(colorHex)
val color = ColorUtils.HSLToColor(floatArrayOf(hue, 0.5f, 0.5f))
val backgroundColor = context.getThemeColor(R.attr.colorSurfaceContainerHigh)
return MaterialColors.harmonize(color, backgroundColor)
}
fun random(seed: Any): Int {
val hue = (seed.hashCode() % 360).absoluteValue.toFloat()
return ColorUtils.HSLToColor(floatArrayOf(hue, 0.5f, 0.5f))
}
private fun getHue(hex: String): Float {
val r = (hex.substring(0, 2).toInt(16)).toFloat()
val g = (hex.substring(2, 4).toInt(16)).toFloat()
val b = (hex.substring(4, 6).toInt(16)).toFloat()
var hue = 0F
if ((r >= g) && (g >= b)) {
hue = 60 * (g - b) / (r - b)
} else if ((g > r) && (r >= b)) {
hue = 60 * (2 - (r - b) / (g - b))
}
return hue
}
}

View File

@@ -27,7 +27,6 @@ import android.provider.Settings
import android.view.View
import android.view.ViewPropertyAnimator
import android.view.Window
import android.widget.Toast
import androidx.activity.result.ActivityResultLauncher
import androidx.annotation.IntegerRes
import androidx.annotation.WorkerThread
@@ -216,21 +215,6 @@ fun Context.findActivity(): Activity? = when (this) {
else -> null
}
inline fun Activity.catchingWebViewUnavailability(block: () -> Unit): Boolean {
return try {
block()
true
} catch (e: Exception) {
if (e.isWebViewUnavailable()) {
Toast.makeText(this, R.string.web_view_unavailable, Toast.LENGTH_LONG).show()
finishAfterTransition()
false
} else {
throw e
}
}
}
fun Context.checkNotificationPermission(): Boolean = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED
} else {

View File

@@ -2,7 +2,6 @@ package org.koitharu.kotatsu.core.util.ext
import android.content.ActivityNotFoundException
import android.content.res.Resources
import android.util.AndroidRuntimeException
import androidx.annotation.DrawableRes
import androidx.collection.arraySetOf
import coil.network.HttpException
@@ -115,8 +114,8 @@ private val reportableExceptions = arraySetOf<Class<*>>(
)
fun Throwable.isWebViewUnavailable(): Boolean {
return (this is AndroidRuntimeException && message?.contains("WebView") == true) ||
cause?.isWebViewUnavailable() == true
val trace = stackTraceToString()
return trace.contains("android.webkit.WebView.<init>")
}
@Suppress("FunctionName")

View File

@@ -62,6 +62,7 @@ import org.koitharu.kotatsu.list.ui.adapter.mangaGridItemAD
import org.koitharu.kotatsu.list.ui.model.ListModel
import org.koitharu.kotatsu.list.ui.model.MangaItemModel
import org.koitharu.kotatsu.list.ui.size.StaticItemSizeResolver
import org.koitharu.kotatsu.local.ui.info.LocalInfoDialog
import org.koitharu.kotatsu.main.ui.owners.NoModalBottomSheetOwner
import org.koitharu.kotatsu.parsers.model.Manga
import org.koitharu.kotatsu.parsers.model.MangaSource
@@ -102,6 +103,7 @@ class DetailsFragment :
binding.buttonScrobblingMore.setOnClickListener(this)
binding.buttonRelatedMore.setOnClickListener(this)
binding.infoLayout.textViewSource.setOnClickListener(this)
binding.infoLayout.textViewSize.setOnClickListener(this)
binding.textViewDescription.addOnLayoutChangeListener(this)
binding.textViewDescription.viewTreeObserver.addOnDrawListener(this)
binding.textViewDescription.movementMethod = LinkMovementMethodCompat.getInstance()
@@ -324,6 +326,10 @@ class DetailsFragment :
)
}
R.id.textView_size -> {
LocalInfoDialog.show(parentFragmentManager, manga)
}
R.id.imageView_cover -> {
startActivity(
ImageActivity.newIntent(

View File

@@ -320,6 +320,7 @@ class DetailsViewModel @Inject constructor(
page = 0,
scroll = 0,
percent = percent,
force = true,
)
}
}

View File

@@ -8,6 +8,7 @@ import org.koitharu.kotatsu.core.ui.dialog.RecyclerViewAlertDialog
import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener
import org.koitharu.kotatsu.download.ui.dialog.DownloadOption
import org.koitharu.kotatsu.download.ui.dialog.downloadOptionAD
import org.koitharu.kotatsu.settings.SettingsActivity
class DownloadDialogHelper(
private val host: View,
@@ -57,6 +58,9 @@ class DownloadDialogHelper(
.setCancelable(true)
.setTitle(R.string.download)
.setNegativeButton(android.R.string.cancel)
.setNeutralButton(R.string.settings) { _, _ ->
host.context.startActivity(SettingsActivity.newDownloadsSettingsIntent(host.context))
}
.setItems(options)
.create()
.also { it.show() }

View File

@@ -57,7 +57,7 @@ class MangaSourcesRepository @Inject constructor(
observeIsNsfwDisabled(),
dao.observeEnabled(SourcesSortOrder.MANUAL),
) { skipNsfw, sources ->
sources.count { skipNsfw || !MangaSource(it.source).isNsfw() }
sources.count { !skipNsfw || !MangaSource(it.source).isNsfw() }
}.distinctUntilChanged()
}

View File

@@ -90,8 +90,8 @@ class HistoryRepository @Inject constructor(
.distinctUntilChanged()
}
suspend fun addOrUpdate(manga: Manga, chapterId: Long, page: Int, scroll: Int, percent: Float) {
if (shouldSkip(manga)) {
suspend fun addOrUpdate(manga: Manga, chapterId: Long, page: Int, scroll: Int, percent: Float, force: Boolean) {
if (!force && shouldSkip(manga)) {
return
}
db.withTransaction {

View File

@@ -24,6 +24,7 @@ class HistoryUpdateUseCase @Inject constructor(
page = readerState.page,
scroll = readerState.scroll,
percent = percent,
force = false,
)
}

View File

@@ -30,6 +30,7 @@ class MarkAsReadUseCase @Inject constructor(
page = pages.lastIndex,
scroll = 0,
percent = 1f,
force = true,
)
}

View File

@@ -0,0 +1,100 @@
package org.koitharu.kotatsu.local.ui.info
import android.content.res.ColorStateList
import android.os.Bundle
import android.os.Parcelable
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.AttrRes
import androidx.annotation.ColorInt
import androidx.annotation.StringRes
import androidx.core.graphics.ColorUtils
import androidx.core.widget.TextViewCompat
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.viewModels
import com.google.android.material.color.MaterialColors
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.combine
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.model.parcelable.ParcelableManga
import org.koitharu.kotatsu.core.ui.AlertDialogFragment
import org.koitharu.kotatsu.core.ui.widgets.SegmentedBarView
import org.koitharu.kotatsu.core.util.Colors
import org.koitharu.kotatsu.core.util.FileSize
import org.koitharu.kotatsu.core.util.ext.combine
import org.koitharu.kotatsu.core.util.ext.getThemeColor
import org.koitharu.kotatsu.core.util.ext.observe
import org.koitharu.kotatsu.core.util.ext.showDistinct
import org.koitharu.kotatsu.core.util.ext.withArgs
import org.koitharu.kotatsu.databinding.DialogLocalInfoBinding
import org.koitharu.kotatsu.parsers.model.Manga
import org.koitharu.kotatsu.settings.userdata.StorageUsage
import com.google.android.material.R as materialR
@AndroidEntryPoint
class LocalInfoDialog : AlertDialogFragment<DialogLocalInfoBinding>() {
private val viewModel: LocalInfoViewModel by viewModels()
override fun onBuildDialog(builder: MaterialAlertDialogBuilder): MaterialAlertDialogBuilder {
return super.onBuildDialog(builder)
.setTitle(R.string.saved_manga)
.setNegativeButton(R.string.close, null)
}
override fun onCreateViewBinding(inflater: LayoutInflater, container: ViewGroup?): DialogLocalInfoBinding {
return DialogLocalInfoBinding.inflate(inflater, container, false)
}
override fun onViewBindingCreated(binding: DialogLocalInfoBinding, savedInstanceState: Bundle?) {
super.onViewBindingCreated(binding, savedInstanceState)
viewModel.path.observe(this) {
binding.textViewPath.text = it
}
combine(viewModel.size, viewModel.availableSize, ::Pair).observe(this) {
if (it.first >= 0 && it.second >= 0) {
setSegments(it.first, it.second)
} else {
binding.barView.animateSegments(emptyList())
}
}
}
private fun setSegments(size: Long, available: Long) {
val view = viewBinding?.barView ?: return
val total = size + available
val segment = SegmentedBarView.Segment(
percent = (size.toDouble() / total.toDouble()).toFloat(),
color = Colors.segmentColor(view.context, materialR.attr.colorPrimary),
)
requireViewBinding().labelUsed.text = view.context.getString(
R.string.memory_usage_pattern,
getString(R.string.this_manga),
FileSize.BYTES.format(view.context, size),
)
requireViewBinding().labelAvailable.text = view.context.getString(
R.string.memory_usage_pattern,
getString(R.string.available),
FileSize.BYTES.format(view.context, available),
)
TextViewCompat.setCompoundDrawableTintList(
requireViewBinding().labelUsed,
ColorStateList.valueOf(segment.color),
)
view.animateSegments(listOf(segment))
}
companion object {
const val ARG_MANGA = "manga"
private const val TAG = "LocalInfoDialog"
fun show(fm: FragmentManager, manga: Manga) {
LocalInfoDialog().withArgs(1) {
putParcelable(ARG_MANGA, ParcelableManga(manga))
}.showDistinct(fm, TAG)
}
}
}

View File

@@ -0,0 +1,41 @@
package org.koitharu.kotatsu.local.ui.info
import androidx.core.net.toFile
import androidx.core.net.toUri
import androidx.lifecycle.SavedStateHandle
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import org.koitharu.kotatsu.core.model.parcelable.ParcelableManga
import org.koitharu.kotatsu.core.ui.BaseViewModel
import org.koitharu.kotatsu.core.ui.widgets.SegmentedBarView
import org.koitharu.kotatsu.core.util.ext.computeSize
import org.koitharu.kotatsu.core.util.ext.require
import org.koitharu.kotatsu.core.util.ext.toFileOrNull
import org.koitharu.kotatsu.local.data.LocalMangaRepository
import org.koitharu.kotatsu.local.data.LocalStorageManager
import javax.inject.Inject
@HiltViewModel
class LocalInfoViewModel @Inject constructor(
savedStateHandle: SavedStateHandle,
private val localMangaRepository: LocalMangaRepository,
private val storageManager: LocalStorageManager,
) : BaseViewModel() {
private val manga = savedStateHandle.require<ParcelableManga>(LocalInfoDialog.ARG_MANGA).manga
val path = MutableStateFlow<String?>(null)
val size = MutableStateFlow(-1L)
val availableSize = MutableStateFlow(-1L)
init {
launchLoadingJob(Dispatchers.Default) {
val file = manga.url.toUri().toFileOrNull() ?: localMangaRepository.findSavedManga(manga)?.file
requireNotNull(file)
path.value = file.path
size.value = file.computeSize()
availableSize.value = storageManager.computeAvailableSize()
}
}
}

View File

@@ -32,7 +32,8 @@ class TapGridDispatcher(
if (!isDispatching) {
return true
}
return listener.onGridTouch(getArea(event.rawX, event.rawY))
val area = getArea(event.rawX, event.rawY) ?: return false
return listener.onGridTouch(area)
}
override fun onDoubleTapEvent(e: MotionEvent): Boolean {
@@ -42,11 +43,12 @@ class TapGridDispatcher(
override fun onLongPress(event: MotionEvent) {
if (isDispatching) {
listener.onGridLongTouch(getArea(event.rawX, event.rawY))
val area = getArea(event.rawX, event.rawY) ?: return
listener.onGridLongTouch(area)
}
}
private fun getArea(x: Float, y: Float): TapGridArea {
private fun getArea(x: Float, y: Float): TapGridArea? {
val xIndex = (x * 2f / width).roundToInt()
val yIndex = (y * 2f / height).roundToInt()
val area = when (xIndex) {
@@ -73,7 +75,8 @@ class TapGridDispatcher(
else -> null
}
return checkNotNull(area) { "Invalid area ($xIndex, $yIndex)" }
assert(area != null) { "Invalid area ($xIndex, $yIndex)" }
return area
}
interface OnGridTouchListener {

View File

@@ -28,6 +28,7 @@ import org.koitharu.kotatsu.scrobbling.shikimori.data.ShikimoriRepository
import org.koitharu.kotatsu.sync.domain.SyncController
import org.koitharu.kotatsu.sync.ui.SyncSettingsIntent
import org.koitharu.kotatsu.core.util.ext.printStackTraceDebug
import org.koitharu.kotatsu.scrobbling.kitsu.ui.KitsuAuthActivity
import javax.inject.Inject
@AndroidEntryPoint
@@ -111,7 +112,7 @@ class ServicesSettingsFragment : BasePreferenceFragment(R.string.services),
AppSettings.KEY_KITSU -> {
if (!kitsuRepository.isAuthorized) {
launchScrobblerAuth(kitsuRepository)
startActivity(Intent(preference.context, KitsuAuthActivity::class.java))
} else {
startActivity(ScrobblerConfigActivity.newIntent(preference.context, ScrobblerService.KITSU))
}

View File

@@ -22,7 +22,6 @@ 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.TaggedActivityResult
import org.koitharu.kotatsu.core.util.ext.catchingWebViewUnavailability
import org.koitharu.kotatsu.core.util.ext.getSerializableExtraCompat
import org.koitharu.kotatsu.databinding.ActivityBrowserBinding
import org.koitharu.kotatsu.parsers.MangaParserAuthProvider
@@ -43,7 +42,7 @@ class SourceAuthActivity : BaseActivity<ActivityBrowserBinding>(), BrowserCallba
@SuppressLint("SetJavaScriptEnabled")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (!catchingWebViewUnavailability { setContentView(ActivityBrowserBinding.inflate(layoutInflater)) }) {
if (!setContentViewWebViewSafe { ActivityBrowserBinding.inflate(layoutInflater) }) {
return
}
val source = intent?.getSerializableExtraCompat<MangaSource>(EXTRA_SOURCE)

View File

@@ -14,6 +14,7 @@ import com.google.android.material.color.MaterialColors
import kotlinx.coroutines.flow.FlowCollector
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.ui.widgets.SegmentedBarView
import org.koitharu.kotatsu.core.util.Colors
import org.koitharu.kotatsu.core.util.FileSize
import org.koitharu.kotatsu.core.util.ext.getThemeColor
import org.koitharu.kotatsu.databinding.PreferenceMemoryUsageBinding
@@ -38,15 +39,15 @@ class StorageUsagePreference @JvmOverloads constructor(
val binding = PreferenceMemoryUsageBinding.bind(holder.itemView)
val storageSegment = SegmentedBarView.Segment(
usage?.savedManga?.percent ?: 0f,
segmentColor(materialR.attr.colorPrimary),
Colors.segmentColor(context, materialR.attr.colorPrimary),
)
val pagesSegment = SegmentedBarView.Segment(
usage?.pagesCache?.percent ?: 0f,
segmentColor(materialR.attr.colorSecondary),
Colors.segmentColor(context, materialR.attr.colorSecondary),
)
val otherSegment = SegmentedBarView.Segment(
usage?.otherCache?.percent ?: 0f,
segmentColor(materialR.attr.colorTertiary),
Colors.segmentColor(context, materialR.attr.colorTertiary),
)
with(binding) {
@@ -81,27 +82,4 @@ class StorageUsagePreference @JvmOverloads constructor(
context.getString(emptyResId)
}
}
private fun getHue(hex: String): Float {
val r = (hex.substring(0, 2).toInt(16)).toFloat()
val g = (hex.substring(2, 4).toInt(16)).toFloat()
val b = (hex.substring(4, 6).toInt(16)).toFloat()
var hue = 0F
if ((r >= g) && (g >= b)) {
hue = 60 * (g - b) / (r - b)
} else if ((g > r) && (r >= b)) {
hue = 60 * (2 - (r - b) / (g - b))
}
return hue
}
@ColorInt
private fun segmentColor(@AttrRes resId: Int): Int {
val colorHex = String.format("%06x", context.getThemeColor(resId))
val hue = getHue(colorHex)
val color = ColorUtils.HSLToColor(floatArrayOf(hue, 0.5f, 0.5f))
val backgroundColor = context.getThemeColor(materialR.attr.colorSurfaceContainerHigh)
return MaterialColors.harmonize(color, backgroundColor)
}
}

View File

@@ -293,6 +293,7 @@ class TrackWorker @AssistedInject constructor(
setCategory(NotificationCompat.CATEGORY_SERVICE)
setDefaults(0)
setOngoing(false)
setOnlyAlertOnce(true)
setSilent(true)
setContentIntent(
PendingIntentCompat.getActivity(

View File

@@ -58,6 +58,7 @@
android:autofillHints="emailAddress"
android:imeOptions="actionDone"
android:inputType="textEmailAddress"
android:maxLength="512"
android:singleLine="true"
android:textSize="16sp"
tools:hint="Email" />
@@ -84,7 +85,7 @@
android:autofillHints="password"
android:imeOptions="actionDone"
android:inputType="textPassword"
android:maxLength="24"
android:maxLength="512"
android:singleLine="true"
android:textSize="16sp"
tools:hint="Password" />

View File

@@ -0,0 +1,54 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="?dialogPreferredPadding">
<TextView
android:id="@+id/textView_path_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:text="@string/location"
android:textAppearance="?textAppearanceLabelMedium" />
<TextView
android:id="@+id/textView_path"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:textAppearance="?textAppearanceBodyMedium"
tools:text="/storage/emulated/0/Manga/lorem.cbz" />
<org.koitharu.kotatsu.core.ui.widgets.SegmentedBarView
android:id="@+id/barView"
android:layout_width="match_parent"
android:layout_height="18dp"
android:layout_marginTop="12dp"
android:background="?colorSecondaryContainer" />
<TextView
android:id="@+id/label_used"
style="@style/Widget.Kotatsu.TextView.Indicator"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_normal"
android:text="@string/this_manga"
app:drawableStartCompat="@drawable/bg_rounded_square"
tools:drawableTint="?colorPrimary" />
<TextView
android:id="@+id/label_available"
style="@style/Widget.Kotatsu.TextView.Indicator"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_small"
android:text="@string/available"
app:drawableStartCompat="@drawable/bg_rounded_square"
app:drawableTint="?colorSecondaryContainer" />
</LinearLayout>

View File

@@ -3,7 +3,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/scrollView"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipToPadding="false"
android:paddingHorizontal="12dp"
@@ -13,6 +13,8 @@
android:id="@+id/chips_tags"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clipChildren="false"
android:clipToPadding="false"
android:paddingVertical="@dimen/margin_small"
app:chipStyle="@style/Widget.Kotatsu.Chip.Filter"
app:selectionRequired="false"

View File

@@ -66,6 +66,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/custom_selectable_item_background"
android:visibility="gone"
app:drawableTopCompat="@drawable/ic_storage"
tools:text="1.8 GiB"

View File

@@ -313,7 +313,7 @@
<string name="manga_error_description_pattern">Дэталі памылкі:&lt;br&gt;&lt;tt&gt;%1$s&lt;/tt&gt;&lt;br&gt;&lt;br&gt;1. Паспрабуйце &lt;a href=%2$s&gt;адкрыць мангу ў вэб-браўзеры&lt;/a&gt;, каб пераканацца, што яна даступная ў крыніцы&lt;br&gt;2. Упэўніцеся, што вы выкарыстоўваеце &lt;a href=kotatsu://about&gt;апошнюю версію Kotatsu&lt;/a&gt;&lt;br&gt;3. Калі ён даступны, адпраўце распрацоўнікам справаздачу аб памылцы.</string>
<string name="history_shortcuts">Паказаць апошнія ярлыкі мангі</string>
<string name="history_shortcuts_summary">Зрабіце нядаўнюю мангу даступнай, доўга націскаючы на значок праграмы</string>
<string name="reader_control_ltr_summary">Навігацыя \"Далей\" заўсёды прыводзіць да наступнай старонцы пры выкарыстанні мышы і клавіятуры.</string>
<string name="reader_control_ltr_summary">Націск на правы край або націск правай клавішы заўсёды перамыкае на наступную старонку.</string>
<string name="reader_control_ltr">Эрганамічны упраўленне чытаннем</string>
<string name="color_correction">Карэкцыя колеру</string>
<string name="brightness">Яркасць</string>
@@ -588,4 +588,9 @@
<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="ask_for_dest_dir_every_time">Кожны раз запытваць каталог прызначэння</string>
<string name="default_page_save_dir">Каталог захавання старонкі па змаўчанні</string>
<string name="remove_from_history">Выдаліць з гісторыі</string>
<string name="pages_saving">Захаванне старонак</string>
</resources>

View File

@@ -328,7 +328,7 @@
<string name="color_correction_hint">Los ajustes de color elegidos serán recordados para este manga</string>
<string name="feed">Fuente</string>
<string name="history_shortcuts">Mostrar los accesos directos a los mangas recientes</string>
<string name="reader_control_ltr_summary">Tocando el borde derecho o pulsando la tecla derecha se pasa siempre a la página siguiente</string>
<string name="reader_control_ltr_summary">Navegar a continuación siempre te lleva a la página siguiente cuando utilizas el ratón y el teclado.</string>
<string name="reader_control_ltr">Control ergonómico del lector</string>
<string name="color_correction">Corrección del color</string>
<string name="brightness">Brillo</string>
@@ -588,4 +588,9 @@
<string name="reading_time_estimation_summary">El valor estimado puede ser inexacto</string>
<string name="check_for_new_chapters_disabled">La búsqueda de nuevos capítulos está desactivada</string>
<string name="suggestions_unavailable_text">Sugerencias desactivadas</string>
<string name="show_labels_in_navbar">Mostrar etiquetas en la barra de navegación</string>
<string name="ask_for_dest_dir_every_time">Preguntar siempre por el directorio de destino</string>
<string name="remove_from_history">Eliminar del historial</string>
<string name="pages_saving">Guardar páginas</string>
<string name="default_page_save_dir">Directorio predeterminado para guardar páginas</string>
</resources>

View File

@@ -1,27 +1,39 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="items">
<item quantity="one">%1$d aytem</item>
<item quantity="other">%1$d (na) aytem</item>
</plurals>
<plurals name="minutes_ago">
<item quantity="one">%1$d minutong nakakalipas</item>
<item quantity="other">%1$d (na) minutong nakakalipas</item>
</plurals>
<plurals name="new_chapters">
<item quantity="one">%1$d bagong kabanata</item>
<item quantity="other">%1$d mga bagong kabanata</item>
</plurals>
<plurals name="chapters">
<item quantity="one">"%1$d kabanata"</item>
<item quantity="other">%1$d (na) kabanata</item>
</plurals>
<plurals name="hours_ago">
<item quantity="one">%1$d oras ang nakalipas</item>
<item quantity="other">%1$d (na) oras ang nakalipas</item>
</plurals>
<plurals name="days_ago">
<item quantity="one">%1$d araw ang nakalipas</item>
<item quantity="other">%1$d (na) araw ang nakalipas</item>
</plurals>
</resources>
<plurals name="items">
<item quantity="one">%1$d aytem</item>
<item quantity="other">%1$d (na) aytem</item>
</plurals>
<plurals name="minutes_ago">
<item quantity="one">%1$d minutong nakakalipas</item>
<item quantity="other">%1$d (na) minutong nakakalipas</item>
</plurals>
<plurals name="new_chapters">
<item quantity="one">%1$d bagong kabanata</item>
<item quantity="other">%1$d mga bagong kabanata</item>
</plurals>
<plurals name="chapters">
<item quantity="one">"%1$d kabanata"</item>
<item quantity="other">%1$d (na) kabanata</item>
</plurals>
<plurals name="hours_ago">
<item quantity="one">%1$d oras ang nakalipas</item>
<item quantity="other">%1$d (na) oras ang nakalipas</item>
</plurals>
<plurals name="days_ago">
<item quantity="one">%1$d araw ang nakalipas</item>
<item quantity="other">%1$d (na) araw ang nakalipas</item>
</plurals>
<plurals name="months_ago">
<item quantity="one">%1$d buwan nakakalipas</item>
<item quantity="other">%1$d (na) buwan nakakalipas</item>
</plurals>
<plurals name="hours">
<item quantity="one">%1$d oras</item>
<item quantity="other">%1$d (na) oras</item>
</plurals>
<plurals name="minutes">
<item quantity="one">%1$d minuto</item>
<item quantity="other">%1$d (na) minuto</item>
</plurals>
</resources>

View File

@@ -346,7 +346,7 @@
<string name="allow_unstable_updates_summary">Makakuha ng paunawa tungkol sa mga unstable build</string>
<string name="network_unavailable">Hindi magagamit ang network</string>
<string name="network_unavailable_hint">I-on ang Wi-Fi o mobile network para magbasa ng manga online</string>
<string name="reader_control_ltr_summary">Mag-tap sa kanang gilid o ang pagpindot sa kanang key ay palaging lilipat sa susunod na pahina</string>
<string name="reader_control_ltr_summary">Ang susunod na pag-navigate ay palaging magdadala sa iyo sa susunod na pahina kapag gumagamit ng mouse at keyboard.</string>
<string name="reader_slider">Ipakita ang slider ng paglipat ng pahina</string>
<string name="manga_error_description_pattern">Mga detalye ng error:&lt;br&gt;&lt;tt&gt;%1$s&lt;/tt&gt;&lt;br&gt;&lt;br&gt;1. Subukang &lt;a href=%2$s&gt;magbukas ng manga sa isang web browser&lt;/a&gt; upang matiyak na available ito sa souce&lt;br&gt;2. Tiyaking ginagamit mo ang &lt;a href=kotatsu://about&gt;pinakabagong bersyon ng Kotatsu&lt;/a&gt;&lt;br&gt;3. Kung available ito, magpadala ng ulat ng error sa mga developer.</string>
<string name="enable_logging">Paganahin ang pag-log</string>
@@ -377,7 +377,7 @@
<string name="show_on_shelf">Ipakita sa Istante</string>
<string name="speed">Bilis</string>
<string name="comics_archive_import_description">Maaari kang pumili ng isa o higit pang .cbz o .zip file, ang bawat file ay makikilala bilang isang hiwalay na manga.</string>
<string name="folder_with_images_import_description">Maaari kang pumili ng isang directory na may mga archive o mga larawan. Ang bawat archive (o subdirectory) ay makikilala bilang isang kabanata.</string>
<string name="folder_with_images_import_description">Maaari kang pumili ng isang direktoryo na may mga archive o mga larawan. Ang bawat archive (o subdirectory) ay makikilala bilang isang kabanata.</string>
<string name="find_similar">Maghanap ng katulad</string>
<string name="sync_auth_hint">Maaari kang mag-sign in sa isang umiiral na account o lumikha ng bago</string>
<string name="translations">Mga pagsasalin</string>
@@ -438,7 +438,7 @@
<string name="download_option_manual_selection">Manu-manong pumili ng mga kabanata</string>
<string name="invert_colors">Baliktarin ang mga kulay</string>
<string name="custom_directory">Custom na direktoryo</string>
<string name="pick_custom_directory">Pumili ng Custom na direktoryo</string>
<string name="pick_custom_directory">Pumili ng custom na direktoryo</string>
<string name="no_access_to_file">Wala kang access sa file o direktoryo na ito</string>
<string name="local_manga_directories">Mga lokal na direktoryo ng manga</string>
<string name="password">Password</string>
@@ -478,7 +478,7 @@
<string name="on_device">Sa device</string>
<string name="moved_to_top">Nailipat sa itaas</string>
<string name="items_limit_exceeded">Wala nang mga aytem na pwedeng idagdag</string>
<string name="directories">Mga Directory</string>
<string name="directories">Mga direktoryo</string>
<string name="reader_zoom_buttons">Ipakita ang mga button ng pag-zoom</string>
<string name="main_screen_sections">Mga pangunahing seksyon ng screen</string>
<string name="zoom_out">Mag-zoom palabas</string>
@@ -502,7 +502,7 @@
<string name="periodic_backups">Mga periodic na pag-backup</string>
<string name="frequency_twice_per_month">Dalawang beses bawat buwan</string>
<string name="frequency_once_per_month">Isang beses bawat buwan</string>
<string name="backups_output_directory">Output directory ng mga backup</string>
<string name="backups_output_directory">Output na direktoryo sa mga backup</string>
<string name="last_successful_backup">Huling matagumpay na pag-backup: %s</string>
<string name="speed_value">x%.1f</string>
<string name="sources_catalog">Katalugo ng mga source</string>
@@ -557,4 +557,40 @@
\n
\nBabala: mawawala ang kasalukuyang progress sa pagbabasa.</string>
<string name="category_hidden_done">Nakatago ang kategoryang ito mula sa pangunahing screen at naa-access sa pamamagitan ng Menu → Ayusin ang mga kategorya</string>
<string name="remove_from_history">Alisin sa kasaysayan</string>
<string name="incognito_mode_hint">Hindi mase-save ang iyong progress sa pagbabasa</string>
<string name="last_read">Huling nabasa</string>
<string name="default_webtoon_zoom_out">Default zoom out sa webtoon</string>
<string name="show_labels_in_navbar">Ipakita ang mga label sa navigation bar</string>
<string name="pages_saving">Nagse-save ng mga pahina</string>
<string name="ask_for_dest_dir_every_time">Laging magtanong sa direktoryo ng patutunguhan</string>
<string name="default_page_save_dir">Default na direktoryo ng pag-save ng pahina</string>
<string name="email_password_enter_hint">Ilagay ang iyong email at password upang magpatuloy</string>
<string name="remaining_time_pattern">%1$s %2$s</string>
<string name="volume_">Volume %d</string>
<string name="volume_unknown">Hindi kilalang volume</string>
<string name="approximate_remaining_time">Tinatayang natitirang oras</string>
<string name="vertical">Patayo</string>
<string name="show_menu">Ipakita ang menu</string>
<string name="tap_action">Aksyon sa pag-tap</string>
<string name="long_tap_action">Aksyon sa matagal na pag-tap</string>
<string name="none">Wala</string>
<string name="config_reset_confirm">I-reset ang mga setting sa mga default na value? Ang gawaing ito ay hindi pwedeng bawiin.</string>
<string name="use_two_pages_landscape">Gumamit ng dalawang page na layout sa landscape na oryentasyon (beta)</string>
<string name="fullscreen_mode">Fullscreen mode</string>
<string name="reader_fullscreen_summary">Itago ang status ng system at mga navigation bar</string>
<string name="two_pages">Dalawang pahina</string>
<string name="toggle_ui">Ipakita/itago ang UI</string>
<string name="prev_chapter">Nakaraang kabanata</string>
<string name="next_chapter">Sunod na kabanata</string>
<string name="prev_page">Nakaraang pahina</string>
<string name="next_page">Susunod na pahina</string>
<string name="reader_actions">Mga aksyon sa reader</string>
<string name="reader_actions_summary">Ayusin ang mga pagkilos para sa mga nata-tap na lugar ng screen</string>
<string name="switch_pages_volume_buttons">Paganahin ang mga volume button</string>
<string name="switch_pages_volume_buttons_summary">Gumamit ng mga volume button para sa paglipat ng mga pahina</string>
<string name="suggestions_unavailable_text">Naka-disable ang feature na Mga suhestiyon</string>
<string name="check_for_new_chapters_disabled">Naka-disable ang pagsuri para sa mga bagong kabanata</string>
<string name="reading_time_estimation">Ipakita ang tinantyang oras ng pagbabasa</string>
<string name="reading_time_estimation_summary">Maaaring hindi tumpak ang halaga ng pagtatantya ng oras</string>
</resources>

View File

@@ -36,13 +36,13 @@
<item quantity="other">Il y a %1$d mois</item>
</plurals>
<plurals name="hours">
<item quantity="one">heure</item>
<item quantity="many">heures</item>
<item quantity="other">heures</item>
<item quantity="one">%1$d heure</item>
<item quantity="many">%1$d heures</item>
<item quantity="other">%1$d heures</item>
</plurals>
<plurals name="minutes">
<item quantity="one">minute</item>
<item quantity="many">minutes</item>
<item quantity="other">minutes</item>
<item quantity="one">%1$d minute</item>
<item quantity="many">%1$d minutes</item>
<item quantity="other">%1$d minutes</item>
</plurals>
</resources>

View File

@@ -66,7 +66,7 @@
<string name="size_s">Taille : %s</string>
<string name="new_version_s">Nouvelle version : %s</string>
<string name="search_results">Résultats de la recherche</string>
<string name="text_feed_holder">Les nouveaux chapitres de ce que vous lisez sont présentés ici</string>
<string name="text_feed_holder">Les nouveaux chapitres de ce que vous lisez sont affichés ici</string>
<string name="updates">Mises à jour</string>
<string name="read_later">Lire plus tard</string>
<string name="favourites_category_empty">Catégorie vide</string>
@@ -328,7 +328,7 @@
<string name="text_unsaved_changes_prompt">Sauvegarde ou abandon des modifications non sauvegardées \?</string>
<string name="discard">Abandonner</string>
<string name="history_shortcuts_summary">Rendre les mangas récents disponibles en appuyant longuement sur l\'icône de l\'application</string>
<string name="reader_control_ltr_summary">Taper sur le bord droit ou appuyer sur la touche droite permet toujours de passer à la page suivante</string>
<string name="reader_control_ltr_summary">Taper sur le bord droit ou appuyer sur la touche droite permet toujours de passer à la page suivante.</string>
<string name="reader_control_ltr">Contrôle ergonomique du lecteur</string>
<string name="history_shortcuts">Afficher les raccourcis des mangas récents</string>
<string name="color_correction">Correction des couleurs</string>
@@ -424,7 +424,7 @@
<string name="authorization_optional">Autorisation (optionnel)</string>
<string name="invalid_port_number">Numéro de port invalide</string>
<string name="restore_summary">Restaurer la sauvegarde précédemment créée</string>
<string name="webtoon_zoom_summary">Autoriser le geste de zoom avant en mode webtoon</string>
<string name="webtoon_zoom_summary">Autoriser le geste de zoom en mode webtoon</string>
<string name="reader_info_bar_summary">Afficher l\'heure actuelle et la progression de la lecture en haut de l\'écran</string>
<string name="pages_animation_summary">Animation de tournage de page</string>
<string name="details_button_tip">Appuyez et maintenez le bouton Lire pour voir plus d\'options</string>
@@ -543,8 +543,8 @@
<string name="this_manga">Ce manga</string>
<string name="apply">Appliqué</string>
<string name="genres_search_hint">Commence a écrit un nom de genre</string>
<string name="downloads_settings_info">Vous pouvez activer la vitesse de téléchargement réduite individuellement pour chaque source de manga dans les paramètres si vous rencontrez des problèmes de bloquage avec le serveur.</string>
<string name="backup_date_">Date de sauvegarde: %s</string>
<string name="downloads_settings_info">Vous pouvez réduire la vitesse de téléchargement individuellement pour chaque source de manga dans les paramètres si vous rencontrez des problèmes de blocage avec le serveur</string>
<string name="backup_date_">Date de sauvegarde: %s</string>
<string name="by_name_reverse">Nom inversé</string>
<string name="mark_as_completed">Marquer comme terminé</string>
<string name="mark_as_completed_prompt">Marquer le manga sélectionné comme terminé?
@@ -570,12 +570,27 @@
<string name="switch_pages_volume_buttons">Activer les boutons de volume</string>
<string name="switch_pages_volume_buttons_summary">Utiliser les boutons de volume pour changer de page</string>
<string name="none">Aucun</string>
<string name="config_reset_confirm">Revenir aux paramètres par défaut?
\nCette action ne pourra pas être annulée.</string>
<string name="config_reset_confirm">Revenir aux paramètres par défaut? Cette action ne pourra pas être annulée.</string>
<string name="use_two_pages_landscape">Utiliser la disposition pages doubles en orientation paysage (bêta)</string>
<string name="fullscreen_mode">Mode plein écran</string>
<string name="category_hidden_done">Cette catégorie a été cachée du menu principal et est accessible via Menu → Gérer les catégories</string>
<string name="two_pages">Pages doubles</string>
<string name="reading_time_estimation">Afficher le temps de lecture estimé</string>
<string name="reading_time_estimation_summary">Le temps estimé peut être inexact</string>
<string name="ask_for_dest_dir_every_time">Demander pour le répertoire de destination à chaque fois</string>
<string name="default_page_save_dir">Répertoire par défaut pour les pages sauvegardées</string>
<string name="remove_from_history">Retirer de l\'historique</string>
<string name="reader_actions">Actions du lecteur</string>
<string name="reader_fullscreen_summary">Cache la barre d\'état et les barres de navigations</string>
<string name="suggestions_unavailable_text">La fonctionnalité de suggestions est désactivée</string>
<string name="check_for_new_chapters_disabled">La vérification des nouveaux chapitres est désactivée</string>
<string name="rating_suggestive">Suggestif</string>
<string name="disable_battery_optimization_summary_downloads">Peut aider à démarrer le téléchargement si vous avez des problèmes avec</string>
<string name="remaining_time_pattern">%1$s %2$s</string>
<string name="reader_actions_summary">Configurer les actions pour les zones décran tactiles</string>
<string name="tap_action">Action de tapoter</string>
<string name="long_tap_action">Action d\'appuyez longuement</string>
<string name="show_labels_in_navbar">Afficher les étiquettes dans la barre de navigation</string>
<string name="pages_saving">Sauvegarder les pages</string>
<string name="default_webtoon_zoom_out">Zoom webtoon par défaut</string>
</resources>

View File

@@ -93,7 +93,7 @@
<string name="new_version_s">नया संस्करण: %s</string>
<string name="text_delete_local_manga">डिवाइस से \"%s\" को स्थायी रूप से हटाएं?</string>
<string name="text_history_holder_primary">जो भी आप पढ़ोगे वे सब यहां दिखेगा</string>
<string name="delete_manga">ंगा को नष्ट करे</string>
<string name="delete_manga">मंगा हटाएं</string>
<string name="notification_sound">सूचना की ध्वनि</string>
<string name="search_history_cleared">साफ हो गया</string>
<string name="open_in_browser">ब्राउसर में खोले</string>

View File

@@ -107,7 +107,7 @@
<string name="new_version_s">Versi baru: %s</string>
<string name="size_s">Ukuran: %s</string>
<string name="updates_feed_cleared">Dibersihkan</string>
<string name="update">Pembaruan</string>
<string name="update">Perbarui</string>
<string name="track_sources">Mencari pembaruan</string>
<string name="dont_check">Jangan periksa</string>
<string name="wrong_password">Kata sandi salah</string>

View File

@@ -327,7 +327,7 @@
<string name="manga_error_description_pattern">Сведения об ошибке:&lt;br&gt;&lt;tt&gt;%1$s&lt;/tt&gt;&lt;br&gt;&lt;br&gt;1. Попробуйте &lt;a href=%2$s&gt;открыть мангу в веб-браузере&lt;/a&gt;, чтобы убедиться, что она доступна в источнике&lt;br&gt;2. Убедитесь, что вы используете &lt;a href=kotatsu://about&gt;последнюю версию Kotatsu&lt;/a&gt;&lt;br&gt;3. Если возможно, отправьте отчёт об ошибке разработчикам.</string>
<string name="history_shortcuts">Показывать ярлыки последней прочитанной манги</string>
<string name="history_shortcuts_summary">Сделать недавно прочитанную мангу доступной по долгому нажатию на иконку приложения</string>
<string name="reader_control_ltr_summary">Навигация «Далее» всегда приводит к следующей странице при использовании мыши и клавиатуры.</string>
<string name="reader_control_ltr_summary">Нажатие на правый край или нажатие правой клавиши всегда переключает на следующую страницу.</string>
<string name="reader_control_ltr">Эргономичное управление режимом чтения</string>
<string name="reset">Сбросить</string>
<string name="discard">Отклонить</string>
@@ -588,4 +588,9 @@
<string name="reading_time_estimation_summary">Данное значение может быть неточным</string>
<string name="check_for_new_chapters_disabled">Проверка новых глав отключена</string>
<string name="suggestions_unavailable_text">Функция предложения отключена</string>
<string name="pages_saving">Сохранение страниц</string>
<string name="ask_for_dest_dir_every_time">Спрашивать папку для сохранения каждый раз</string>
<string name="remove_from_history">Убрать из истории</string>
<string name="show_labels_in_navbar">Показывать подписи на панели навигации</string>
<string name="default_page_save_dir">Папка для сохранений по умолчанию</string>
</resources>

View File

@@ -344,7 +344,7 @@
<string name="server_error">Sunucu hatası (%1$d). Lütfen daha sonra tekrar deneyin</string>
<string name="saved_manga">Kaydedilen mangalar</string>
<string name="history_shortcuts_summary">Uygulama simgesine uzun basarak son mangaları kullanılabilir hale getirin</string>
<string name="reader_control_ltr_summary">Fare ve klavye kullanırken sonraki seçeneği sizi her zaman bir sonraki sayfaya götürür.</string>
<string name="reader_control_ltr_summary">Sağ kenara dokunulduğunda veya sağ tuşa basıldığında her zaman bir sonraki sayfaya geçilir.</string>
<string name="source_disabled">Kaynak devre dışı</string>
<string name="prefetch_content">İçerik ön yüklemesi</string>
<string name="mark_as_current">Geçerli olarak işaretle</string>
@@ -588,4 +588,9 @@
<string name="check_for_new_chapters_disabled">Yeni bölümlerin denetlenmesi devre dışı</string>
<string name="reading_time_estimation">Tahmini okuma süresini göster</string>
<string name="reading_time_estimation_summary">Süre tahmin değeri yanlış olabilir</string>
<string name="show_labels_in_navbar">Gezinme çubuğunda etiketleri göster</string>
<string name="pages_saving">Sayfalar kaydediliyor</string>
<string name="ask_for_dest_dir_every_time">Her seferinde hedef dizini sor</string>
<string name="default_page_save_dir">Öntanımlı sayfa kaydetme dizini</string>
<string name="remove_from_history">Geçmişten kaldır</string>
</resources>

View File

@@ -327,7 +327,7 @@
<string name="manga_error_description_pattern">Деталі помилки:&lt;br&gt;&lt;tt&gt;%1$s&lt;/tt&gt;&lt;br&gt;&lt;br&gt;1. Спробуйте &lt;a href=%2$s&gt;відкрити манґу у веб-браузері&lt;/a&gt;, щоб переконатися, що вона доступна в джерелі&lt;br&gt;2. Переконайтеся, що ви використовуєте &lt;a href=kotatsu://about&gt;останню версію Kotatsu&lt;/a&gt;&lt;br&gt;3. Якщо він доступний, надішліть звіт про помилку розробникам.</string>
<string name="history_shortcuts">Показувати ярлики останньої прочитаної манґи</string>
<string name="history_shortcuts_summary">Зробити нещодавно прочитану манґу доступною за довгим натисканням на іконку застосунку</string>
<string name="reader_control_ltr_summary">Навігація «Далі» завжди веде до наступної сторінки під час використання миші та клавіатури.</string>
<string name="reader_control_ltr_summary">Натискання на правий край або натискання правої клавіші завжди перемикається на наступну сторінку.</string>
<string name="reader_control_ltr">Ергономічне керування режимом читання</string>
<string name="brightness">Яскравість</string>
<string name="color_correction">Корекція кольору</string>
@@ -588,4 +588,9 @@
<string name="reading_time_estimation_summary">Це значення може бути неточним</string>
<string name="check_for_new_chapters_disabled">Перевірка нових глав вимкнена</string>
<string name="suggestions_unavailable_text">Функція пропозицій вимкнена</string>
<string name="pages_saving">Збереження сторінок</string>
<string name="ask_for_dest_dir_every_time">Щоразу запитувати директорію призначення</string>
<string name="remove_from_history">Видалити з історії</string>
<string name="show_labels_in_navbar">Показувати мітки на панелі навігації</string>
<string name="default_page_save_dir">Директорія збереження сторінки за замовчуванням</string>
</resources>

View File

@@ -4,11 +4,11 @@
<string name="local_storage">本地</string>
<string name="favourites">收藏</string>
<string name="history">历史</string>
<string name="error_occurred">发生错误</string>
<string name="error_occurred">出错了</string>
<string name="network_error">网络错误</string>
<string name="chapters">章节</string>
<string name="list">列表</string>
<string name="data_restored_with_errors">数据已恢复,但发生了一些错误</string>
<string name="data_restored_with_errors">数据已恢复,但出现了一些错误</string>
<string name="processing_">正在处理…</string>
<string name="newest">最新</string>
<string name="by_rating">评分</string>
@@ -24,13 +24,13 @@
<string name="group">分组</string>
<string name="tap_to_try_again">点击重试</string>
<string name="reader_mode_hint">所选模式只会在此漫画上使用</string>
<string name="captcha_required">需要通过验证</string>
<string name="captcha_required">需要通过人机身份验证</string>
<string name="captcha_solve">开始验证</string>
<string name="today">今天</string>
<string name="clear_cookies">清除 Cookies</string>
<string name="new_sources_text">有新的可用图源</string>
<string name="suggestions_summary">根据你的喜好推荐漫画</string>
<string name="suggestions_info">所有数据都在本地设备上进行分析,不会发送到其他地方。</string>
<string name="suggestions_info">所有数据都在本地分析,不会发送到其他地方。</string>
<string name="never">从不</string>
<string name="show_notification_new_chapters_on">发送正在阅读漫画的更新通知</string>
<string name="nsfw">R18</string>
@@ -49,13 +49,13 @@
<string name="chapter_d_of_d">%1$d/%2$d 章</string>
<string name="close">关闭</string>
<string name="try_again">重试</string>
<string name="clear_history">清除历史</string>
<string name="clear_history">清除历史记录</string>
<string name="nothing_found">结果为空</string>
<string name="history_is_empty">暂无历史记录</string>
<string name="read">阅读</string>
<string name="you_have_not_favourites_yet">暂无漫画收藏</string>
<string name="add_to_favourites">收藏此漫画</string>
<string name="add_new_category">新分类</string>
<string name="add_new_category">添加新分类</string>
<string name="add">添加</string>
<string name="save">保存</string>
<string name="share">分享</string>
@@ -77,10 +77,10 @@
<string name="automatic">跟随系统</string>
<string name="pages">页面</string>
<string name="clear">清除</string>
<string name="text_clear_history_prompt">永久清除所有阅读历史吗?</string>
<string name="text_clear_history_prompt">确定永久清除所有阅读历史吗?</string>
<string name="remove">删除</string>
<string name="_s_deleted_from_local_storage">已从本地存储中删除“%s”</string>
<string name="save_page">保存本页</string>
<string name="save_page">保存图片</string>
<string name="page_saved">保存成功</string>
<string name="share_image">分享图片</string>
<string name="_import">导入</string>
@@ -96,7 +96,7 @@
<string name="grid_size">网格大小</string>
<string name="search_on_s">在%s上搜索</string>
<string name="delete_manga">删除漫画</string>
<string name="text_delete_local_manga">从设备中永久删除\"%s\"吗?</string>
<string name="text_delete_local_manga">确定从设备中永久删除\"%s\"吗?</string>
<string name="reader_settings">阅读</string>
<string name="switch_pages">翻页方式</string>
<string name="volume_buttons">音量键</string>
@@ -104,7 +104,7 @@
<string name="taps_on_edges">点击边缘</string>
<string name="error">错误</string>
<string name="clear_thumbs_cache">清除缩略图缓存</string>
<string name="clear_search_history">清除搜索历史</string>
<string name="clear_search_history">清除搜索记录</string>
<string name="search_history_cleared">清除完毕</string>
<string name="gestures_only">仅限滑动手势</string>
<string name="internal_storage">内部存储</string>
@@ -112,7 +112,7 @@
<string name="domain">图源域名</string>
<string name="app_update_available">发现新版本</string>
<string name="open_in_browser">在浏览器中打开</string>
<string name="large_manga_save_confirm">这部漫画有 %s 要全部保存吗?</string>
<string name="large_manga_save_confirm">这部漫画有 %s 要全部保存吗?</string>
<string name="save_manga">保存</string>
<string name="notifications">通知</string>
<string name="new_chapters">新章节</string>
@@ -126,9 +126,9 @@
<string name="text_empty_holder_primary">什么都没有…</string>
<string name="text_search_holder_secondary">试试换一个词再搜索。</string>
<string name="text_history_holder_primary">看过的漫画将在这里显示</string>
<string name="text_history_holder_secondary">&lt;浏览&gt;页面搜索读的漫画</string>
<string name="text_local_holder_primary">请先在线下载或进行本地导入</string>
<string name="text_local_holder_secondary">下载图源内容或通过本地文件导入</string>
<string name="text_history_holder_secondary">&lt;浏览&gt;页面搜索读的漫画</string>
<string name="text_local_holder_primary">存点什么吧</string>
<string name="text_local_holder_secondary">下载在线图源里的漫画或导入本地漫画文件</string>
<string name="manga_shelf">书架</string>
<string name="recent_manga">最近</string>
<string name="pages_animation">翻页动画</string>
@@ -141,7 +141,7 @@
<string name="favourites_category_empty">目前分类为空</string>
<string name="read_later">稍后阅读</string>
<string name="updates">更新内容</string>
<string name="text_feed_holder">正在阅读漫画的新章节将在这里显示</string>
<string name="text_feed_holder">读漫画的新章节将在这里显示</string>
<string name="search_results">搜索结果</string>
<string name="new_version_s">新版本: %s</string>
<string name="clear_updates_feed">清除订阅更新记录</string>
@@ -160,9 +160,9 @@
<string name="about">关于</string>
<string name="app_version">版本 %s</string>
<string name="check_for_updates">检查更新</string>
<string name="no_update_available">无可用更新</string>
<string name="no_update_available">已是最新版本</string>
<string name="right_to_left">从右到左</string>
<string name="create_category">新分类</string>
<string name="create_category">添加新分类</string>
<string name="scale_mode">显示模式</string>
<string name="zoom_mode_fit_center">填充屏幕</string>
<string name="zoom_mode_fit_height">适应高度</string>
@@ -175,7 +175,7 @@
<string name="restore_backup">恢复备份</string>
<string name="data_restored">恢复完成</string>
<string name="clear_feed">清除订阅</string>
<string name="text_clear_updates_feed_prompt">要永久清除所有的更新历史吗?</string>
<string name="text_clear_updates_feed_prompt">确定要永久清除所有的更新历史吗?</string>
<string name="check_for_new_chapters">章节更新</string>
<string name="reverse">倒序</string>
<string name="sign_in">登录</string>
@@ -185,10 +185,10 @@
<string name="protect_application_subtitle">输入密码以解锁</string>
<string name="confirm">确认</string>
<string name="password_length_hint">密码必须大于或等于4个字符</string>
<string name="text_clear_search_history_prompt">要永久除所有搜索记录吗?</string>
<string name="text_clear_search_history_prompt">确定要永久除所有搜索记录吗?</string>
<string name="welcome">欢迎</string>
<string name="backup_saved">备份已保存</string>
<string name="tracker_warning">不同设备导致不同的系统调度可能会杀掉本应用的后台任务。</string>
<string name="tracker_warning">不同设备不同的系统调度可能会杀掉本应用的后台任务。</string>
<string name="read_more">了解详情</string>
<string name="queued">等待</string>
<string name="chapter_is_missing">该章缺失</string>
@@ -205,7 +205,7 @@
<string name="show_pages_numbers">页码</string>
<string name="enabled_sources">已用图源</string>
<string name="available_sources">可用图源</string>
<string name="screenshots_policy">截图限制</string>
<string name="screenshots_policy">阅读时截图限制</string>
<string name="screenshots_allow">无限制</string>
<string name="screenshots_block_nsfw">仅阅读成人内容时禁止</string>
<string name="screenshots_block_all">总是禁止截图</string>
@@ -214,10 +214,10 @@
<string name="text_suggestion_holder">开始阅读漫画,即可获取个性化推荐</string>
<string name="exclude_nsfw_from_suggestions">禁止推荐成人漫画</string>
<string name="enabled">启用</string>
<string name="disabled">禁用</string>
<string name="disabled">关闭</string>
<string name="filter_load_error">无法加载分类列表</string>
<string name="reset_filter">重置筛选</string>
<string name="onboard_text">选择想要阅读漫画的语言可之后在设置中更改。</string>
<string name="onboard_text">选择想要阅读漫画的语言可之后在设置中更改。</string>
<string name="only_using_wifi">仅连接 Wi-Fi 时</string>
<string name="always">总是</string>
<string name="preload_pages">页面预加载</string>
@@ -225,7 +225,7 @@
<string name="chapters_empty">此漫画没有章节</string>
<string name="appearance">外观</string>
<string name="suggestions_excluded_genres_summary">输入不希望在推荐中看到的分类</string>
<string name="text_delete_local_manga_batch">从系统中永久删除所选项目吗?</string>
<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>
@@ -244,16 +244,16 @@
<string name="bookmark_removed">书签已删除</string>
<string name="bookmark_added">书签已添加</string>
<string name="undo">撤销</string>
<string name="removed_from_history">已从历史记录删除</string>
<string name="removed_from_history">历史记录删除</string>
<string name="dns_over_https">基于 HTTPS 的 DNS</string>
<string name="default_mode">默认阅读模式</string>
<string name="detect_reader_mode">自动检测阅读模式</string>
<string name="detect_reader_mode_summary">自动检测是否应用条漫模式</string>
<string name="disable_battery_optimization">禁用电池优化</string>
<string name="disable_battery_optimization">关闭电池优化</string>
<string name="disable_battery_optimization_summary">有助于进行后台更新检查</string>
<string name="crash_text">出错了请向开发人员提交错误报告以帮助修复问题。</string>
<string name="crash_text">出错了请向开发人员提交错误报告以帮助修复问题。</string>
<string name="send">发送</string>
<string name="disable_all">全部禁用</string>
<string name="disable_all">全部关闭</string>
<string name="status_planned">想读</string>
<string name="status_on_hold">休刊中</string>
<string name="report">报告</string>
@@ -269,12 +269,12 @@
<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="clear_cookies_summary">可帮助稍微解决部分问题,所有网站的授权将会失效</string>
<string name="show_all">显示全部</string>
<string name="manga_error_description_pattern">错误详情:&lt;br&gt;&lt;tt&gt;%1$s&lt;/tt&gt;&lt;br&gt;&lt;br&gt;1.尝试&lt;a href=%2$s&gt;在网络浏览器中打开漫画&lt;/a&gt;以确保在其图源中可用&lt;br&gt;2.请确保使用的是&lt;a href=kotatsu://about&gt;最新版本的Kotatsu&lt;/a&gt;&lt;br&gt;3.若图源没有问题,请向开发人员发送错误报告。</string>
<string name="invalid_domain_message">无效域名</string>
<string name="text_shelf_holder_primary">此处将显示你的漫画</string>
<string name="text_shelf_holder_secondary">&lt;浏览&gt;页面搜索读的漫画</string>
<string name="text_shelf_holder_secondary">&lt;浏览&gt;页面搜索读的漫画</string>
<string name="percent_string_pattern">%1$s%%</string>
<string name="canceled">已取消</string>
<string name="account_already_exists">账号已存在</string>
@@ -284,17 +284,17 @@
<string name="email_enter_hint">输入邮箱地址以继续</string>
<string name="status_dropped">已腰斩</string>
<string name="select_range">选择范围</string>
<string name="clear_all_history">清除所有历史</string>
<string name="clear_all_history">清除所有历史记录</string>
<string name="last_2_hours">过去2小时</string>
<string name="bookmarks_removed">书签已删除</string>
<string name="history_cleared">历史记录已清除</string>
<string name="manage">管理</string>
<string name="no_bookmarks_yet">暂无书签</string>
<string name="no_bookmarks_summary">可在阅读漫画时创建书签</string>
<string name="no_manga_sources">没有图源</string>
<string name="no_manga_sources_text">启用图源即可在线阅读漫画</string>
<string name="no_manga_sources">暂无图源</string>
<string name="no_manga_sources_text">开启一个图源即可在线阅读漫画</string>
<string name="random">随机</string>
<string name="categories_delete_confirm">确定要删除选的分类吗?
<string name="categories_delete_confirm">确定要删除选的分类吗?
\n该分类中的所有漫画将丢失且无法恢复。</string>
<string name="reorder">重新排序</string>
<string name="empty">分类为空</string>
@@ -315,7 +315,7 @@
<string name="other_cache">其他缓存</string>
<string name="storage_usage">存储占用</string>
<string name="available">可用</string>
<string name="removed_from_favourites">从收藏中删除</string>
<string name="removed_from_favourites">收藏漫画已删除</string>
<string name="options">选项</string>
<string name="incognito_mode">无痕模式</string>
<string name="no_chapters">没有章节</string>
@@ -325,8 +325,8 @@
<string name="feed">订阅</string>
<string name="memory_usage_pattern">%s - %s</string>
<string name="not_found_404">没有章节或已被删除</string>
<string name="reader_control_ltr_summary">当使用鼠标或键盘时,向下导航更改为下一页</string>
<string name="reader_control_ltr">简易控制</string>
<string name="reader_control_ltr_summary">点击屏幕右侧边缘或按下右键都会翻到下一页</string>
<string name="reader_control_ltr">阅读简易操作</string>
<string name="history_shortcuts_summary">长按应用图标显示最近阅读的漫画</string>
<string name="history_shortcuts">显示最近阅读漫画的快捷方式</string>
<string name="reset">重置</string>
@@ -345,7 +345,7 @@
<string name="clear_new_chapters_counters">同时清除新章节信息</string>
<string name="server_error">服务器错误 (%1$d)。请稍后重试</string>
<string name="compact">列表</string>
<string name="source_disabled">图源已禁用</string>
<string name="source_disabled">图源已关闭</string>
<string name="prefetch_content">内容预加载</string>
<string name="mark_as_current">标为当前</string>
<string name="language">语言</string>
@@ -365,23 +365,23 @@
<string name="theme_name_mamimi">Mamimi</string>
<string name="theme_name_kanade">Kanade</string>
<string name="nothing_here">这里什么也没有</string>
<string name="scrobbling_empty_hint">要记录阅读进度,在漫画详情选中【菜单】→【进度记录】。</string>
<string name="scrobbling_empty_hint">要记录阅读进度,在漫画详情页里选中【菜单】→【进度记录】。</string>
<string name="allow_unstable_updates">允许更新不稳定版本</string>
<string name="allow_unstable_updates_summary">接收不稳定版本的更新通知</string>
<string name="download_started">已开始下载</string>
<string name="download_started">下载已开始</string>
<string name="user_agent">UserAgent 标识</string>
<string name="settings_apply_restart_required">要应用这些更改请重启程序</string>
<string name="settings_apply_restart_required">重启程序后更改</string>
<string name="sources_reorder_tip">点击并长按项目排序</string>
<string name="got_it">知道了</string>
<string name="speed">速度</string>
<string name="restore_backup_description">导入先前创建的用户数据备份</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="comics_archive_import_description">可选择一个或多个 cbz 或 zip 文件,每个文件都将识别为一个单独的漫画。</string>
<string name="folder_with_images_import_description">可选择一个包含压缩包或图片的文件夹每个压缩包 (或子文件夹) 都会被识别为一个章节。</string>
<string name="find_similar">搜索相似漫画</string>
<string name="translations">翻译</string>
<string name="web_view_unavailable">WebView不可用检查是否已安装WebView</string>
<string name="sync_host_description">可使用自建同步服务器或默认同步服务器若不知道有何用处请不要自行修改。</string>
<string name="sync_host_description">可使用自建同步服务器或默认同步服务器若不知道有何用处请不要自行修改。</string>
<string name="mirror_switching">自动选择镜像网址</string>
<string name="mirror_switching_summary">若存在可用的镜像网址,在出错时开始自动切换</string>
<string name="paused">已暂停</string>
@@ -399,13 +399,13 @@
<string name="text_downloads_list_holder">暂无下载任务</string>
<string name="downloads_resumed">下载已继续</string>
<string name="downloads_paused">下载已暂停</string>
<string name="downloads_removed">下载记录已全部清除</string>
<string name="downloads_removed">下载记录已清除</string>
<string name="downloads_cancelled">下载已取消</string>
<string name="suggestions_enable_prompt">想要接收个性化的漫画推荐吗?</string>
<string name="suggestion_manga">推荐:%s</string>
<string name="suggestions_notifications_summary">偶尔显示漫画推荐通知</string>
<string name="more">更多</string>
<string name="cancel_all_downloads_confirm">将取消所有进行中的下载,部分下载完成的数据将会删除</string>
<string name="cancel_all_downloads_confirm">将取消所有进行中的下载,部分下载完成的数据将会丢失</string>
<string name="remove_completed_downloads_confirm">所有已完成的下载记录将会永久清除</string>
<string name="sync_auth_hint">可登陆已有账号或创建新账号</string>
<string name="address">地址</string>
@@ -417,7 +417,7 @@
<string name="restore_summary">从以前创建的备份恢复</string>
<string name="show_pages_numbers_summary">在右下角显示页码</string>
<string name="details_button_tip">长按阅读按钮可显示更多选项</string>
<string name="clear_source_cookies_summary">仅清除特定域名的 Cookies大多数情况下会使网站授权失效</string>
<string name="clear_source_cookies_summary">仅清除特定域名的 Cookies大多数情况下会使网站授权失效</string>
<string name="data_and_privacy">数据与隐私</string>
<string name="reader_info_bar_summary">在屏幕顶部显示当前时间和阅读进度</string>
<string name="webtoon_zoom_summary">允许在条漫模式下使用缩放手势</string>
@@ -447,10 +447,10 @@
<string name="voice_search">语音搜索</string>
<string name="this_month">本月</string>
<string name="languages">语言</string>
<string name="captcha_required_summary">%s 需要通过验证才能正常运行</string>
<string name="captcha_required_summary">%s 需要通过人机身份验证才能正常运行</string>
<string name="progress">阅读进度</string>
<string name="error_corrupted_file">回传的数据无效或文件已损坏</string>
<string name="related_manga_summary">显示相关漫画可能并不准确或缺失</string>
<string name="related_manga_summary">显示相关漫画可能并不相关或没有相关漫画</string>
<string name="tracker_wifi_only_summary">使用移动网络时停止检查新章节</string>
<string name="order_added">添加日期</string>
<string name="on_device">本地</string>
@@ -502,7 +502,7 @@
<string name="backups_output_directory">备份保存路径</string>
<string name="download_option_all_chapters">所有已翻译的章节 (%s)</string>
<string name="state_upcoming">即将推出</string>
<string name="by_name_reverse">名称倒序</string>
<string name="by_name_reverse">名称 (倒序)</string>
<string name="manage_sources">管理图源</string>
<string name="catalog">图源目录</string>
<string name="content_type_comics">美漫</string>
@@ -510,14 +510,14 @@
<string name="content_type_manga">日漫</string>
<string name="source_summary_pattern">%1$s%2$s</string>
<string name="sources_catalog">图源目录</string>
<string name="source_enabled">已启用图源</string>
<string name="source_enabled">图源已开启</string>
<string name="content_type_hentai">成人</string>
<string name="no_manga_sources_found">本次搜索未发现可用图源</string>
<string name="no_manga_sources_catalog_text">此页面没有可用图源,或可能已添加所有可用图源。
<string name="no_manga_sources_catalog_text">此页面暂无可用图源,或可能已添加所有可用图源。
\n敬请期待后续更新</string>
<string name="welcome_text">请选择需要开启的图源内容。可稍后在设置选项中设定</string>
<string name="welcome_text">请选择需要开启的图源内容,可之后在设置中更改</string>
<string name="sync_auth">网络同步</string>
<string name="downloads_settings_info">遇到服务器阻塞,可在图源设置中为每个图源单独开启限速下载功能</string>
<string name="downloads_settings_info">出现服务器阻塞的情况,可在图源设置中为每个图源单独开启限速下载功能</string>
<string name="skip">跳过</string>
<string name="backup_date_">备份日期:%s</string>
<string name="content_rating">内容分级</string>
@@ -526,7 +526,7 @@
<string name="rating_suggestive">R15</string>
<string name="rating_adult">R18</string>
<string name="lock_screen_rotation">锁定屏幕方向</string>
<string name="default_tab">作品详情页默认界面</string>
<string name="default_tab">漫画详情页默认界面</string>
<string name="grayscale">灰度</string>
<string name="globally">全局</string>
<string name="this_manga">此漫画</string>
@@ -537,22 +537,22 @@
<string name="state_abandoned">已腰斩</string>
<string name="manual">手动</string>
<string name="available_d">%1$d 个可用</string>
<string name="disable_nsfw_summary">禁用含有成人内容的图源并尽可能从列表中隐藏成人漫画</string>
<string name="disable_nsfw_summary">关闭含有成人内容的图源并尽可能从列表中隐藏成人漫画</string>
<string name="speed_value">x%.1f</string>
<string name="error_filter_locale_genre_not_supported">此图源不支持同时按分类和区域筛选</string>
<string name="error_filter_states_genre_not_supported">此图源不支持同时按分类和状态筛选</string>
<string name="genres_search_hint">开始输入分类名称</string>
<string name="state_paused">休刊中</string>
<string name="reader_optimize">降低内存占用测试</string>
<string name="reader_optimize">降低内存占用 (测试)</string>
<string name="reader_optimize_summary">降低当前画面外的页面质量以减少内存占用</string>
<string name="disable_battery_optimization_summary_downloads">能帮助解决下载过程相关的问题</string>
<string name="disable_battery_optimization_summary_downloads">也许能帮助解决下载过程相关的问题</string>
<string name="error_search_not_supported">此图源不支持搜索</string>
<string name="state">状态</string>
<string name="error_multiple_genres_not_supported">此图源不支持按多个分类筛选</string>
<string name="error_multiple_states_not_supported">此图源不支持按多个状态筛选</string>
<string name="by_relevance">关联</string>
<string name="mark_as_completed">标记为已读</string>
<string name="mark_as_completed_prompt">将选定的漫画标记为已读吗?
<string name="mark_as_completed_prompt">确定将选定的漫画标记为已读吗?
\n
\n警告 当前的阅读进度将会丢失。</string>
<string name="category_hidden_done">此分类已从主页隐藏,可通过菜单 → 管理分类来访问</string>
@@ -578,14 +578,19 @@
<string name="reader_actions_summary">配置屏幕点按区域的操作</string>
<string name="reader_actions">阅读操作</string>
<string name="tap_action">点按操作</string>
<string name="use_two_pages_landscape">横屏时开启双页模式测试</string>
<string name="config_reset_confirm">恢复为默认设置吗?恢复后无法撤销。</string>
<string name="use_two_pages_landscape">横屏时开启双页模式 (测试)</string>
<string name="config_reset_confirm">确定恢复为默认设置吗?恢复后无法撤销。</string>
<string name="email_password_enter_hint">输入邮箱和密码以继续</string>
<string name="fullscreen_mode">全屏模式</string>
<string name="default_webtoon_zoom_out">条漫默认缩小值</string>
<string name="reader_fullscreen_summary">将系统状态栏与通知栏隐藏</string>
<string name="suggestions_unavailable_text">漫画推荐功能已被禁用</string>
<string name="check_for_new_chapters_disabled">章节更新功能已被禁用</string>
<string name="reading_time_estimation">作品详情页显示估计阅读时间</string>
<string name="suggestions_unavailable_text">漫画推荐功能已被关闭</string>
<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="ask_for_dest_dir_every_time">保存时总是询问图片保存目录</string>
<string name="pages_saving">图片保存</string>
<string name="default_page_save_dir">图片默认保存目录</string>
<string name="remove_from_history">删除阅读历史</string>
</resources>

File diff suppressed because it is too large Load Diff