Compare commits
22 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6b1240fccb | ||
|
|
e00a5b7505 | ||
|
|
2c07d2c8e1 | ||
|
|
45c3c05f01 | ||
|
|
e97a745713 | ||
|
|
2dc4de0a3c | ||
|
|
3cf2c58058 | ||
|
|
1e19f32fc5 | ||
|
|
99e4359523 | ||
|
|
04868488cc | ||
|
|
2b3b406b84 | ||
|
|
7ab3c75232 | ||
|
|
61f7755465 | ||
|
|
9389015ab9 | ||
|
|
bc56a94aa6 | ||
|
|
7cfcaec6dd | ||
|
|
39c7ae31cd | ||
|
|
9349eccc0c | ||
|
|
8204934359 | ||
|
|
b5497c571e | ||
|
|
b4d52f1367 | ||
|
|
325a8be484 |
@@ -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'
|
||||
|
||||
@@ -57,6 +57,7 @@ class AppShortcutManagerTest {
|
||||
page = 4,
|
||||
scroll = 2,
|
||||
percent = 0.3f,
|
||||
force = false,
|
||||
)
|
||||
awaitUpdate()
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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?) {
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
41
app/src/main/kotlin/org/koitharu/kotatsu/core/util/Colors.kt
Normal file
41
app/src/main/kotlin/org/koitharu/kotatsu/core/util/Colors.kt
Normal 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
|
||||
}
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -320,6 +320,7 @@ class DetailsViewModel @Inject constructor(
|
||||
page = 0,
|
||||
scroll = 0,
|
||||
percent = percent,
|
||||
force = true,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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() }
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -24,6 +24,7 @@ class HistoryUpdateUseCase @Inject constructor(
|
||||
page = readerState.page,
|
||||
scroll = readerState.scroll,
|
||||
percent = percent,
|
||||
force = false,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@ class MarkAsReadUseCase @Inject constructor(
|
||||
page = pages.lastIndex,
|
||||
scroll = 0,
|
||||
percent = 1f,
|
||||
force = true,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -293,6 +293,7 @@ class TrackWorker @AssistedInject constructor(
|
||||
setCategory(NotificationCompat.CATEGORY_SERVICE)
|
||||
setDefaults(0)
|
||||
setOngoing(false)
|
||||
setOnlyAlertOnce(true)
|
||||
setSilent(true)
|
||||
setContentIntent(
|
||||
PendingIntentCompat.getActivity(
|
||||
|
||||
@@ -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" />
|
||||
|
||||
54
app/src/main/res/layout/dialog_local_info.xml
Normal file
54
app/src/main/res/layout/dialog_local_info.xml
Normal 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>
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -313,7 +313,7 @@
|
||||
<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="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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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:<br><tt>%1$s</tt><br><br>1. Subukang <a href=%2$s>magbukas ng manga sa isang web browser</a> upang matiyak na available ito sa souce<br>2. Tiyaking ginagamit mo ang <a href=kotatsu://about>pinakabagong bersyon ng Kotatsu</a><br>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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -327,7 +327,7 @@
|
||||
<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="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>
|
||||
@@ -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>
|
||||
@@ -327,7 +327,7 @@
|
||||
<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="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>
|
||||
@@ -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">在<浏览>页面搜索要读的漫画</string>
|
||||
<string name="text_local_holder_primary">请先在线下载或进行本地导入</string>
|
||||
<string name="text_local_holder_secondary">下载图源内容或通过本地文件导入。</string>
|
||||
<string name="text_history_holder_secondary">在<浏览>页面搜索想读的漫画</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">错误详情:<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>
|
||||
<string name="text_shelf_holder_primary">此处将显示你的漫画</string>
|
||||
<string name="text_shelf_holder_secondary">在<浏览>页面搜索要读的漫画</string>
|
||||
<string name="text_shelf_holder_secondary">在<浏览>页面搜索想读的漫画</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
Reference in New Issue
Block a user