Compare commits

...

25 Commits

Author SHA1 Message Date
Jobobby04 263c0fae8c Release v1.8.3 2022-04-22 19:39:42 -04:00
Howard Wu 7756f25312 Add Simplified Chinese translation (#584)
* Add Simplified Chinese translation

Work In Program
Part 1

* Add more translate

* Add more translate

* Add more translate

* Add more translate

* Fix

* Minor changes

* Fix some strings

* Fix some strings
2022-04-22 19:38:51 -04:00
Jobobby04 6a0b523e86 Revert history Compose/SQLDelight changes 2022-04-22 19:27:15 -04:00
arkon 070e2d94c7 Temporarily remove chapter name cleaning
To be added back in a more consistent manner later around the app. Probably when more things are Compose-y with less repetition.

(cherry picked from commit c0214103a9)
2022-04-22 19:23:45 -04:00
arkon 743482dfd2 Add advanced setting to clear WebView data
(cherry picked from commit 2b76a97989)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedController.kt
2022-04-22 19:23:37 -04:00
Andreas f6b7f9e29f Enable verbose logging in dev flavor by default (#6979)
(cherry picked from commit 9d77052d9c)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/App.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedController.kt
2022-04-22 19:22:12 -04:00
Andreas 5c9f98bff1 Add indexes to creational tables (#6974)
(cherry picked from commit b4981058a2)
2022-04-22 19:21:09 -04:00
arkon d375d7d8c8 Lift Compose theme to abstract controller
(cherry picked from commit 032aa64195)
2022-04-22 19:21:01 -04:00
arkon a88bcb0fa2 Simplify history item description building
(cherry picked from commit 7c8e8317a8)
2022-04-22 19:20:54 -04:00
arkon 5512c6eb79 Add abstract ComposeController
(cherry picked from commit eb1cfc4cd4)
2022-04-22 19:20:46 -04:00
arkon 97e4b0e248 Add placeholder color for Compose manga covers
(cherry picked from commit f1e5cccee7)
2022-04-22 19:20:39 -04:00
arkon 99a94150ea Default auto backups to 2
(cherry picked from commit bc2ed763bd)
2022-04-22 19:20:32 -04:00
Jobobby04 26b30adf4a Migrate saved search and feed saved search to SQLDelight 2022-04-22 19:19:50 -04:00
Jobobby04 4a115785eb Add SY specific queries to sqldelight files 2022-04-22 19:16:48 -04:00
Andreas a8cb77cc7e Migrate History screen database calls to SQLDelight (#6933)
* Migrate History screen database call to SQLDelight

- Move all migrations to SQLDelight
- Move all tables to SQLDelight

Co-authored-by: inorichi <3521738+inorichi@users.noreply.github.com>

* Changes from review comments

* Add adapters to database

* Remove logging of database version in App

* Change query name for paging source queries

* Update migrations

* Make SQLite Callback handle migration

- To ensure it updates the database

* Use SQLDelight Schema version for Callback database version

Co-authored-by: inorichi <3521738+inorichi@users.noreply.github.com>
(cherry picked from commit b1f46ed830)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/data/database/DatabaseHelper.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/database/DbOpenCallback.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/database/queries/HistoryQueries.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/database/tables/CategoryTable.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/database/tables/MangaTable.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/setting/database/ClearDatabasePresenter.kt
#	build.gradle.kts
2022-04-22 10:08:31 -04:00
arkon c44c37383d Make links in new update dialog clickable
Co-authored-by: Jays2Kings <Jays2Kings@users.noreply.github.com>
(cherry picked from commit 6c1565a7d4)
2022-04-21 17:07:12 -04:00
arkon 8e72394910 Replace ignore button in new update dialog with link to GitHub page
Not enough room for 3 buttons. Users can still tap outside or back out of the dialog if they want to ignore it.

(cherry picked from commit 2ca6b655ad)
2022-04-21 17:06:57 -04:00
arkon e5349a3d33 Update junrar
(cherry picked from commit a83a481ac8)
2022-04-21 17:06:50 -04:00
arkon e6aa6f02e4 Move chapter name cleaning logic to holder (fixes #6955)
(cherry picked from commit 65a8b63b3b)
2022-04-21 17:06:39 -04:00
Andreas 231c75df65 Fix AppBar not unlifting when scrolling using ComposeView (#6952)
(cherry picked from commit b20ca36db9)
2022-04-21 17:06:31 -04:00
arkon 08c2bfd263 Show better error message when empty backup creation is attempted (closes #6941)
(cherry picked from commit 189f92d7e8)
2022-04-21 17:06:25 -04:00
arkon 33bdf011b4 Increase default OkHttp call timeout to 2 minutes
Which is still stupidly high, but maybe it'll be lenient enough for certain people.

(cherry picked from commit cdd4ec6233)
2022-04-21 17:06:18 -04:00
arkon 26deb46219 Show parsed Markdown for new version info (closes #6940)
(cherry picked from commit ef1bb4e800)
2022-04-21 17:06:11 -04:00
Andreas 45bfd5f72c Migrate History screen to Compose (#6922)
* Migrate History screen to Compose

- Migrate screen
- Strip logic from presenter into use cases and repository
- Setup for other screen being able to migrate to Compose with Theme

* Changes from review comments

(cherry picked from commit c475acd1ea)

# Conflicts:
#	app/build.gradle.kts
#	app/src/main/java/eu/kanade/tachiyomi/App.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/database/queries/HistoryQueries.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt
#	settings.gradle.kts
2022-04-21 17:06:03 -04:00
CrepeTF 32d81eb1fa Add elevation to navigation rails (#6947)
Co-authored-by: CrepeTF <trungnguyen02@outlookcom>
(cherry picked from commit 7d50d7ff52)
2022-04-21 17:01:34 -04:00
20 changed files with 831 additions and 76 deletions
+1 -1
View File
@@ -3,7 +3,7 @@
I acknowledge that: I acknowledge that:
- I have updated: - I have updated:
- To the latest version of the app (stable is v1.8.2) - To the latest version of the app (stable is v1.8.3)
- All extensions - All extensions
- I have tried the troubleshooting guide: https://tachiyomi.org/help/guides/troubleshooting-problems/ - I have tried the troubleshooting guide: https://tachiyomi.org/help/guides/troubleshooting-problems/
- If this is an issue with an extension, that I should be opening an issue in https://github.com/tachiyomiorg/tachiyomi-extensions - If this is an issue with an extension, that I should be opening an issue in https://github.com/tachiyomiorg/tachiyomi-extensions
+2 -2
View File
@@ -53,7 +53,7 @@ body:
label: Tachiyomi version label: Tachiyomi version
description: You can find your Tachiyomi version in **More → About**. description: You can find your Tachiyomi version in **More → About**.
placeholder: | placeholder: |
Example: "1.8.2" Example: "1.8.3"
validations: validations:
required: true required: true
@@ -98,7 +98,7 @@ body:
required: true required: true
- label: I have tried the [troubleshooting guide](https://tachiyomi.org/help/guides/troubleshooting/). - label: I have tried the [troubleshooting guide](https://tachiyomi.org/help/guides/troubleshooting/).
required: true required: true
- label: I have updated the app to version **[1.8.2](https://github.com/jobobby04/tachiyomisy/releases/latest)**. - label: I have updated the app to version **[1.8.3](https://github.com/jobobby04/tachiyomisy/releases/latest)**.
required: true required: true
- label: I have updated all installed extensions. - label: I have updated all installed extensions.
required: true required: true
+1 -1
View File
@@ -33,7 +33,7 @@ body:
required: true required: true
- label: If this is an issue with an extension, I should be opening an issue in the [extensions repository](https://github.com/tachiyomiorg/tachiyomi-extensions/issues/new/choose). - label: If this is an issue with an extension, I should be opening an issue in the [extensions repository](https://github.com/tachiyomiorg/tachiyomi-extensions/issues/new/choose).
required: true required: true
- label: I have updated the app to version **[1.8.2](https://github.com/jobobby04/tachiyomisy/releases/latest)**. - label: I have updated the app to version **[1.8.3](https://github.com/jobobby04/tachiyomisy/releases/latest)**.
required: true required: true
- label: I will fill out all of the requested information in this form. - label: I will fill out all of the requested information in this form.
required: true required: true
+3 -2
View File
@@ -25,8 +25,8 @@ android {
applicationId = "eu.kanade.tachiyomi.sy" applicationId = "eu.kanade.tachiyomi.sy"
minSdk = AndroidConfig.minSdk minSdk = AndroidConfig.minSdk
targetSdk = AndroidConfig.targetSdk targetSdk = AndroidConfig.targetSdk
versionCode = 33 versionCode = 34
versionName = "1.8.2" versionName = "1.8.3"
buildConfigField("String", "COMMIT_COUNT", "\"${getCommitCount()}\"") buildConfigField("String", "COMMIT_COUNT", "\"${getCommitCount()}\"")
buildConfigField("String", "COMMIT_SHA", "\"${getGitSha()}\"") buildConfigField("String", "COMMIT_SHA", "\"${getGitSha()}\"")
@@ -202,6 +202,7 @@ dependencies {
exclude(group = "androidx.viewpager", module = "viewpager") exclude(group = "androidx.viewpager", module = "viewpager")
} }
implementation(libs.insetter) implementation(libs.insetter)
implementation(libs.markwon)
// Conductor // Conductor
implementation(libs.bundles.conductor) implementation(libs.bundles.conductor)
@@ -3,6 +3,7 @@ package eu.kanade.tachiyomi.data.backup.full
import android.content.Context import android.content.Context
import android.net.Uri import android.net.Uri
import com.hippo.unifile.UniFile import com.hippo.unifile.UniFile
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.backup.AbstractBackupManager import eu.kanade.tachiyomi.data.backup.AbstractBackupManager
import eu.kanade.tachiyomi.data.backup.BackupConst.BACKUP_CATEGORY import eu.kanade.tachiyomi.data.backup.BackupConst.BACKUP_CATEGORY
import eu.kanade.tachiyomi.data.backup.BackupConst.BACKUP_CATEGORY_MASK import eu.kanade.tachiyomi.data.backup.BackupConst.BACKUP_CATEGORY_MASK
@@ -111,6 +112,10 @@ class FullBackupManager(context: Context) : AbstractBackupManager(context) {
} }
val byteArray = parser.encodeToByteArray(BackupSerializer, backup!!) val byteArray = parser.encodeToByteArray(BackupSerializer, backup!!)
if (byteArray.isEmpty()) {
throw IllegalStateException(context.getString(R.string.empty_backup_error))
}
file.openOutputStream().also { file.openOutputStream().also {
// Force overwrite old file // Force overwrite old file
(it as? FileOutputStream)?.channel?.truncate(0) (it as? FileOutputStream)?.channel?.truncate(0)
@@ -7,6 +7,7 @@ import androidx.core.content.edit
import androidx.core.net.toUri import androidx.core.net.toUri
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import com.fredporciuncula.flow.preferences.FlowSharedPreferences import com.fredporciuncula.flow.preferences.FlowSharedPreferences
import eu.kanade.tachiyomi.BuildConfig
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.track.TrackService import eu.kanade.tachiyomi.data.track.TrackService
@@ -28,6 +29,7 @@ import java.text.SimpleDateFormat
import java.util.Locale import java.util.Locale
import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys
import eu.kanade.tachiyomi.data.preference.PreferenceValues as Values import eu.kanade.tachiyomi.data.preference.PreferenceValues as Values
import eu.kanade.tachiyomi.util.system.isDevFlavor
class PreferencesHelper(val context: Context) { class PreferencesHelper(val context: Context) {
@@ -216,7 +218,7 @@ class PreferencesHelper(val context: Context) {
fun folderPerManga() = prefs.getBoolean(Keys.folderPerManga, false) fun folderPerManga() = prefs.getBoolean(Keys.folderPerManga, false)
fun numberOfBackups() = flowPrefs.getInt("backup_slots", 1) fun numberOfBackups() = flowPrefs.getInt("backup_slots", 2)
fun backupInterval() = flowPrefs.getInt("backup_interval", 0) fun backupInterval() = flowPrefs.getInt("backup_interval", 0)
@@ -330,7 +332,7 @@ class PreferencesHelper(val context: Context) {
if (DeviceUtil.isMiui) Values.ExtensionInstaller.LEGACY else Values.ExtensionInstaller.PACKAGEINSTALLER, if (DeviceUtil.isMiui) Values.ExtensionInstaller.LEGACY else Values.ExtensionInstaller.PACKAGEINSTALLER,
) )
fun verboseLogging() = prefs.getBoolean(Keys.verboseLogging, false) fun verboseLogging() = prefs.getBoolean(Keys.verboseLogging, isDevFlavor)
fun autoClearChapterCache() = prefs.getBoolean(Keys.autoClearChapterCache, false) fun autoClearChapterCache() = prefs.getBoolean(Keys.autoClearChapterCache, false)
@@ -30,7 +30,7 @@ open /* SY <-- */ class NetworkHelper(context: Context) {
.cookieJar(cookieManager) .cookieJar(cookieManager)
.connectTimeout(30, TimeUnit.SECONDS) .connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS)
.callTimeout(90, TimeUnit.SECONDS) .callTimeout(2, TimeUnit.MINUTES)
// .fastFallback(true) // TODO: re-enable when OkHttp 5 is stabler // .fastFallback(true) // TODO: re-enable when OkHttp 5 is stabler
.addInterceptor(UserAgentInterceptor()) .addInterceptor(UserAgentInterceptor())
@@ -1118,7 +1118,7 @@ class MangaController :
chaptersHeader.setNumChapters(chapters.size) chaptersHeader.setNumChapters(chapters.size)
val adapter = chaptersAdapter ?: return val adapter = chaptersAdapter ?: return
adapter.updateDataSet(presenter.cleanChapterNames(chapters)) adapter.updateDataSet(chapters)
if (selectedChapters.isNotEmpty()) { if (selectedChapters.isNotEmpty()) {
adapter.clearSelection() // we need to start from a clean state, index may have changed adapter.clearSelection() // we need to start from a clean state, index may have changed
@@ -781,17 +781,6 @@ class MangaPresenter(
} }
} }
fun cleanChapterNames(chapters: List<ChapterItem>): List<ChapterItem> {
chapters.forEach {
it.name = it.name
.trim()
.removePrefix(manga.title)
.trim(*CHAPTER_TRIM_CHARS)
}
return chapters
}
/** /**
* Updates the UI after applying the filters. * Updates the UI after applying the filters.
*/ */
@@ -1281,38 +1270,3 @@ class MangaPresenter(
// Track sheet - end // Track sheet - end
} }
private val CHAPTER_TRIM_CHARS = arrayOf(
// Whitespace
' ',
'\u0009',
'\u000A',
'\u000B',
'\u000C',
'\u000D',
'\u0020',
'\u0085',
'\u00A0',
'\u1680',
'\u2000',
'\u2001',
'\u2002',
'\u2003',
'\u2004',
'\u2005',
'\u2006',
'\u2007',
'\u2008',
'\u2009',
'\u200A',
'\u2028',
'\u2029',
'\u202F',
'\u205F',
'\u3000',
// Separators
'-',
'_',
',',
':',
).toCharArray()
@@ -6,6 +6,7 @@ import androidx.core.text.buildSpannedString
import androidx.core.text.color import androidx.core.text.color
import androidx.core.view.isVisible import androidx.core.view.isVisible
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Chapter
import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.databinding.ChaptersItemBinding import eu.kanade.tachiyomi.databinding.ChaptersItemBinding
import eu.kanade.tachiyomi.source.LocalSource import eu.kanade.tachiyomi.source.LocalSource
@@ -37,6 +38,8 @@ class ChapterHolder(
itemView.context.getString(R.string.display_mode_chapter, number) itemView.context.getString(R.string.display_mode_chapter, number)
} }
else -> chapter.name else -> chapter.name
// TODO: show cleaned name consistently around the app
// else -> cleanChapterName(chapter, manga)
} }
// Set correct text color // Set correct text color
@@ -85,4 +88,47 @@ class ChapterHolder(
binding.download.isVisible = item.manga.source != LocalSource.ID binding.download.isVisible = item.manga.source != LocalSource.ID
binding.download.setState(item.status, item.progress) binding.download.setState(item.status, item.progress)
} }
private fun cleanChapterName(chapter: Chapter, manga: Manga): String {
return chapter.name
.trim()
.removePrefix(manga.title)
.trim(*CHAPTER_TRIM_CHARS)
}
} }
private val CHAPTER_TRIM_CHARS = arrayOf(
// Whitespace
' ',
'\u0009',
'\u000A',
'\u000B',
'\u000C',
'\u000D',
'\u0020',
'\u0085',
'\u00A0',
'\u1680',
'\u2000',
'\u2001',
'\u2002',
'\u2003',
'\u2004',
'\u2005',
'\u2006',
'\u2007',
'\u2008',
'\u2009',
'\u200A',
'\u2028',
'\u2029',
'\u202F',
'\u205F',
'\u3000',
// Separators
'-',
'_',
',',
':',
).toCharArray()
@@ -116,6 +116,7 @@ class AboutController : SettingsController(), NoAppBarElevationController {
is AppUpdateResult.NoNewUpdate -> { is AppUpdateResult.NoNewUpdate -> {
activity?.toast(R.string.update_check_no_new_updates) activity?.toast(R.string.update_check_no_new_updates)
} }
else -> {}
} }
} catch (error: Exception) { } catch (error: Exception) {
activity?.toast(error.message) activity?.toast(error.message)
@@ -2,35 +2,58 @@ package eu.kanade.tachiyomi.ui.more
import android.app.Dialog import android.app.Dialog
import android.os.Bundle import android.os.Bundle
import android.text.method.LinkMovementMethod
import android.view.View
import android.widget.TextView
import androidx.core.os.bundleOf import androidx.core.os.bundleOf
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.updater.AppUpdateResult import eu.kanade.tachiyomi.data.updater.AppUpdateResult
import eu.kanade.tachiyomi.data.updater.AppUpdateService import eu.kanade.tachiyomi.data.updater.AppUpdateService
import eu.kanade.tachiyomi.ui.base.controller.DialogController import eu.kanade.tachiyomi.ui.base.controller.DialogController
import eu.kanade.tachiyomi.ui.base.controller.openInBrowser
import io.noties.markwon.Markwon
class NewUpdateDialogController(bundle: Bundle? = null) : DialogController(bundle) { class NewUpdateDialogController(bundle: Bundle? = null) : DialogController(bundle) {
constructor(update: AppUpdateResult.NewUpdate) : this( constructor(update: AppUpdateResult.NewUpdate) : this(
bundleOf(BODY_KEY to update.release.info, URL_KEY to update.release.getDownloadLink()), bundleOf(
BODY_KEY to update.release.info,
RELEASE_URL_KEY to update.release.releaseLink,
DOWNLOAD_URL_KEY to update.release.getDownloadLink(),
),
) )
override fun onCreateDialog(savedViewState: Bundle?): Dialog { override fun onCreateDialog(savedViewState: Bundle?): Dialog {
val releaseBody = args.getString(BODY_KEY)!!
.replace("""---(\R|.)*Checksums(\R|.)*""".toRegex(), "")
val info = Markwon.create(activity!!).toMarkdown(releaseBody)
return MaterialAlertDialogBuilder(activity!!) return MaterialAlertDialogBuilder(activity!!)
.setTitle(R.string.update_check_notification_update_available) .setTitle(R.string.update_check_notification_update_available)
.setMessage(args.getString(BODY_KEY) ?: "") .setMessage(info)
.setPositiveButton(R.string.update_check_confirm) { _, _ -> .setPositiveButton(R.string.update_check_confirm) { _, _ ->
val appContext = applicationContext applicationContext?.let { context ->
if (appContext != null) {
// Start download // Start download
val url = args.getString(URL_KEY) ?: "" val url = args.getString(DOWNLOAD_URL_KEY)!!
AppUpdateService.start(appContext, url) AppUpdateService.start(context, url)
} }
} }
.setNegativeButton(R.string.update_check_ignore, null) .setNeutralButton(R.string.update_check_open) { _, _ ->
openInBrowser(args.getString(RELEASE_URL_KEY)!!)
}
.create() .create()
} }
override fun onAttach(view: View) {
super.onAttach(view)
// Make links in Markdown text clickable
(dialog?.findViewById(android.R.id.message) as? TextView)?.movementMethod =
LinkMovementMethod.getInstance()
}
} }
private const val BODY_KEY = "NewUpdateDialogController.body" private const val BODY_KEY = "NewUpdateDialogController.body"
private const val URL_KEY = "NewUpdateDialogController.key" private const val RELEASE_URL_KEY = "NewUpdateDialogController.release_url"
private const val DOWNLOAD_URL_KEY = "NewUpdateDialogController.download_url"
@@ -6,6 +6,8 @@ import android.content.ActivityNotFoundException
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.provider.Settings import android.provider.Settings
import android.webkit.WebStorage
import android.webkit.WebView
import android.widget.Toast import android.widget.Toast
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.core.net.toUri import androidx.core.net.toUri
@@ -49,7 +51,9 @@ import eu.kanade.tachiyomi.util.preference.titleRes
import eu.kanade.tachiyomi.util.storage.DiskUtil import eu.kanade.tachiyomi.util.storage.DiskUtil
import eu.kanade.tachiyomi.util.system.DeviceUtil import eu.kanade.tachiyomi.util.system.DeviceUtil
import eu.kanade.tachiyomi.util.system.isPackageInstalled import eu.kanade.tachiyomi.util.system.isPackageInstalled
import eu.kanade.tachiyomi.util.system.logcat
import eu.kanade.tachiyomi.util.system.powerManager import eu.kanade.tachiyomi.util.system.powerManager
import eu.kanade.tachiyomi.util.system.setDefaultSettings
import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.util.system.toast
import exh.debug.SettingsDebugController import exh.debug.SettingsDebugController
import exh.log.EHLogLevel import exh.log.EHLogLevel
@@ -57,6 +61,7 @@ import exh.source.BlacklistedSources
import exh.source.EH_SOURCE_ID import exh.source.EH_SOURCE_ID
import exh.source.EXH_SOURCE_ID import exh.source.EXH_SOURCE_ID
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import logcat.LogPriority
import rikka.sui.Sui import rikka.sui.Sui
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
@@ -87,7 +92,7 @@ class SettingsAdvancedController : SettingsController() {
key = Keys.verboseLogging key = Keys.verboseLogging
titleRes = R.string.pref_verbose_logging titleRes = R.string.pref_verbose_logging
summaryRes = R.string.pref_verbose_logging_summary summaryRes = R.string.pref_verbose_logging_summary
defaultValue = false defaultValue = isDevFlavor
onChange { onChange {
activity?.toast(R.string.requires_app_restart) activity?.toast(R.string.requires_app_restart)
@@ -147,6 +152,12 @@ class SettingsAdvancedController : SettingsController() {
titleRes = R.string.pref_auto_clear_chapter_cache titleRes = R.string.pref_auto_clear_chapter_cache
defaultValue = false defaultValue = false
} }
preference {
key = "pref_clear_webview_data"
titleRes = R.string.pref_clear_webview_data
onClick { clearWebViewData() }
}
preference { preference {
key = "pref_clear_database" key = "pref_clear_database"
titleRes = R.string.pref_clear_database titleRes = R.string.pref_clear_database
@@ -486,11 +497,29 @@ class SettingsAdvancedController : SettingsController() {
resources?.getString(R.string.used_cache, chapterCache.readableSize) resources?.getString(R.string.used_cache, chapterCache.readableSize)
} }
} catch (e: Throwable) { } catch (e: Throwable) {
logcat(LogPriority.ERROR, e)
withUIContext { activity?.toast(R.string.cache_delete_error) } withUIContext { activity?.toast(R.string.cache_delete_error) }
} }
} }
} }
private fun clearWebViewData() {
if (activity == null) return
try {
val webview = WebView(activity!!)
webview.setDefaultSettings()
webview.clearCache(true)
webview.clearFormData()
webview.clearHistory()
webview.clearSslPreferences()
WebStorage.getInstance().deleteAllData()
activity?.toast(R.string.webview_data_deleted)
} catch (e: Throwable) {
logcat(LogPriority.ERROR, e)
activity?.toast(R.string.cache_delete_error)
}
}
private companion object { private companion object {
// SY --> // SY -->
private var job: Job? = null private var job: Job? = null
@@ -0,0 +1,6 @@
package eu.kanade.tachiyomi.util.system
import eu.kanade.tachiyomi.BuildConfig
val isDevFlavor: Boolean
get() = BuildConfig.FLAVOR == "dev"
@@ -25,7 +25,7 @@ class ThemesPreferenceAdapter(private val clickListener: OnItemClickListener) :
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ThemeViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ThemeViewHolder {
val themeResIds = ThemingDelegate.getThemeResIds(themes[viewType], preferences.themeDarkAmoled().get()) val themeResIds = ThemingDelegate.getThemeResIds(themes[viewType], preferences.themeDarkAmoled().get())
val themedContext = themeResIds.fold(parent.context) { val themedContext = themeResIds.fold(parent.context) {
context, themeResId -> context, themeResId ->
ContextThemeWrapper(context, themeResId) ContextThemeWrapper(context, themeResId)
} }
@@ -17,7 +17,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:fitsSystemWindows="true" android:fitsSystemWindows="true"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toEndOf="@id/side_nav"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.appbar.MaterialToolbar <com.google.android.material.appbar.MaterialToolbar
@@ -35,7 +35,7 @@
android:background="?attr/colorTertiary" android:background="?attr/colorTertiary"
android:visibility="gone" android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toEndOf="@id/side_nav"
app:layout_constraintTop_toBottomOf="@+id/appbar" app:layout_constraintTop_toBottomOf="@+id/appbar"
tools:visibility="visible"> tools:visibility="visible">
@@ -56,7 +56,7 @@
android:background="?attr/colorPrimary" android:background="?attr/colorPrimary"
android:visibility="gone" android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toEndOf="@id/side_nav"
app:layout_constraintTop_toBottomOf="@+id/downloaded_only" app:layout_constraintTop_toBottomOf="@+id/downloaded_only"
tools:visibility="visible"> tools:visibility="visible">
@@ -73,11 +73,10 @@
<com.google.android.material.navigationrail.NavigationRailView <com.google.android.material.navigationrail.NavigationRailView
android:id="@+id/side_nav" android:id="@+id/side_nav"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="0dp" android:layout_height="match_parent"
app:elevation="0dp" android:paddingTop="?attr/actionBarSize"
app:layout_constraintBottom_toBottomOf="parent" app:elevation="1dp"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/incognito_mode"
app:menu="@menu/main_nav" /> app:menu="@menu/main_nav" />
<com.google.android.material.tabs.TabLayout <com.google.android.material.tabs.TabLayout
@@ -1,5 +1,9 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<changelog bulletedList="true"> <changelog bulletedList="true">
<changelogversion versionName="1.8.2" changeDate="Apr 22,2022">
<changelogtext>[b]Based on Tachiyomi stable 0.13.4(from 0.13.3)[/b]</changelogtext>
<changelogtext>Added chinese simplified translation(By Howard20181)</changelogtext>
</changelogversion>
<changelogversion versionName="1.8.2" changeDate="Apr 15,2022"> <changelogversion versionName="1.8.2" changeDate="Apr 15,2022">
<changelogtext>[b]Based on Tachiyomi stable 0.13.3(from 0.13.1)[/b]</changelogtext> <changelogtext>[b]Based on Tachiyomi stable 0.13.3(from 0.13.1)[/b]</changelogtext>
<changelogtext>[b]New[/b] Replace Latest tab with Feed menu for using saved searches</changelogtext> <changelogtext>[b]New[/b] Replace Latest tab with Feed menu for using saved searches</changelogtext>
@@ -0,0 +1,680 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Actions -->
<string name="action_sort_drag_and_drop">拖动和放置</string>
<string name="action_sort_enabled">启用</string>
<string name="action_skip_manga">不要迁移</string>
<string name="action_search_manually">手动搜索</string>
<string name="action_migrate_now">开始迁移</string>
<string name="action_copy_now">开始复制</string>
<string name="action_clean_titles">清除标题</string>
<string name="action_start_reading_button">开始阅读按钮</string>
<string name="action_display_no_title_grid">无标题栏</string>
<string name="action_start_reading">开始阅读</string>
<string name="action_edit_info">编辑信息</string>
<!-- Library fragment -->
<string name="buttons_header">按钮</string>
<!-- Manga Type -->
<string name="manhwa">韩漫</string>
<string name="manhua">漫画</string>
<string name="comic">喜剧</string>
<string name="webtoon">网络漫画</string>
<!-- Captcha -->
<string name="captcha_solve_failure">解决验证码失败</string>
<string name="captcha_solve_failure_message">自动通过验证失败!</string>
<string name="please_login">请登录!</string>
<!-- Preferences -->
<!-- Subsections -->
<string name="pref_category_all_sources">所有来源</string>
<string name="pref_category_fork">分支特色设置</string>
<!-- EH Settings -->
<string name="ehentai_prefs_account_settings">E-Hentai 网站账户设置</string>
<string name="enable_exhentai">启用 ExHentai</string>
<string name="requires_login">要求登录</string>
<string name="use_hentai_at_home">使用 Hentai@Home 网络</string>
<string name="use_hentai_at_home_summary">如果可用,您是否希望通过 Hentai@Home 网络加载图像?禁用此选项将减少您能够浏览的页面数量。\n选项:\n- 任何客户端(推荐)\n- 使用默认端口的客户端(可能会比较慢。如果防火墙或代理阻止非标准端口的出站,则应启用)</string>
<string name="use_hentai_at_home_option_1">任何客户端(推荐)</string>
<string name="use_hentai_at_home_option_2">仅使用默认端口的客户端</string>
<string name="show_japanese_titles">在搜索结果中显示日文标题</string>
<string name="show_japanese_titles_option_1">目前在搜索结果中显示日文标题。更改后请在高级设置清除章节缓存。</string>
<string name="show_japanese_titles_option_2">目前在搜索结果中显示英文/罗马化的标题。更改后请在高级设置清除章节缓存。</string>
<string name="use_original_images">使用原图</string>
<string name="use_original_images_on">目前使用的是原图</string>
<string name="use_original_images_off">目前使用的是重采样图像</string>
<string name="watched_tags">查看 Tags</string>
<string name="watched_tags_summary">在 WebView 中查看 E/ExHentai 关注的 Tags</string>
<string name="watched_tags_exh">ExHentai 关注的 Tags</string>
<string name="watched_tags_eh">E-Hentai 关注的 Tags</string>
<string name="tag_filtering_threshold">标签过滤阈值</string>
<string name="tag_filtering_threshhold_error">必须介于 -9999 和 0</string>
<string name="tag_filtering_threshhold_summary">你可以通过在 \"我的 Tags E/ExHentai\" 页面添加负的权重来软过滤标签。如果一个画廊的标签加起来的权重低于这个值,它就会被过滤掉。这个阈值可以在 -9999 和 0 之间设置。 目前:%1$d</string>
<string name="tag_watching_threshhold">Tags 关注阈值</string>
<string name="tag_watching_threshhold_error">必须介于 0 和 9999</string>
<string name="tag_watching_threshhold_summary">如果最近上传的画廊至少有一个权重为正的被关注标签,并且其被关注标签的权重之和达到这个值或更高,就会被列入被关注的屏幕。这个阈值可以在 0 到 9999 之间设置。目前:%1$d</string>
<string name="language_filtering">语言过滤</string>
<string name="language_filtering_summary">如果您想在画廊列表和搜索中隐藏某些语言的画廊,请在弹出的对话框中选择它们。\n请注意,无论您的搜索条件如何,匹配的画廊都不会出现。\n勾选 = 排除</string>
<string name="frong_page_categories">首页类别</string>
<string name="fromt_page_categories_summary">你希望在首页和搜索中默认显示哪些类别?它们仍然可以通过激活它们的过滤器而被启用</string>
<string name="watched_list_default">监视列表过滤器默认状态</string>
<string name="watched_list_state_summary">在浏览 ExHentai/E-Hentai 时,是否应默认启用监视列表过滤器</string>
<string name="eh_image_quality_summary">下载图像质量</string>
<string name="eh_image_quality">图像质量</string>
<string name="eh_image_quality_auto">自动</string>
<string name="pref_enhanced_e_hentai_view">增强的 E/ExHentai 浏览</string>
<string name="pref_enhanced_e_hentai_view_summary">启用或禁用为 E/ExHentai 制作的增强型浏览菜单。</string>
<string name="favorites_sync">E-Hentai 收藏同步</string>
<string name="disable_favorites_uploading">禁用收藏上传</string>
<string name="disable_favorites_uploading_summary">仅从 ExHentai 下载收藏夹。应用中对收藏夹的任何更改都不会被上传。防止 ExHentai 上的收藏夹意外丢失。请注意,删除的内容仍会被下载(如果您在 ExHentai 上删除了一个收藏夹,它也会在应用程序中被删除)。</string>
<string name="show_favorite_sync_notes">显示收藏夹同步信息</string>
<string name="show_favorite_sync_notes_summary">显示一些关于收藏夹同步功能的信息</string>
<string name="ignore_sync_errors">尽可能忽略同步错误</string>
<string name="ignore_sync_errors_summary">在同步过程中遇到错误时,不要立即中止。当同步完成时,错误仍然会显示。在某些情况下可能会导致收藏夹的丢失。在同步大型资料库时很有用。</string>
<string name="force_sync_state_reset">强制重置同步状态</string>
<string name="force_sync_state_reset_summary">在下次同步时执行完全的重新同步。删除的内容将不会被同步。应用中所有收藏夹将被重新上传到 ExHentai,ExHentai 上的所有收藏夹将被重新下载。有助于在同步被中断后修复同步。</string>
<string name="sync_state_reset">同步状态重置</string>
<string name="gallery_update_checker">画廊更新检查器</string>
<string name="auto_update_restrictions">自动更新限制</string>
<string name="time_between_batches">更新批次之间的间隔时间</string>
<string name="time_between_batches_never">从不更新画廊</string>
<string name="time_between_batches_1_hour">1 小时</string>
<string name="time_between_batches_2_hours">2 小时</string>
<string name="time_between_batches_3_hours">3 小时</string>
<string name="time_between_batches_6_hours">6 小时</string>
<string name="time_between_batches_12_hours">12 小时</string>
<string name="time_between_batches_24_hours">24 小时</string>
<string name="time_between_batches_48_hours">48 小时</string>
<string name="time_between_batches_summary_1">在 %1$s 以内不会检查您库中的画廊是否有更新。</string>
<string name="time_between_batches_summary_2">%1$s 会分批检查/更新画廊。这意味着它将等待 %2$d 小时,检查 %3$d 画廊,等待 %2$d 小时,检查 %3$d ……</string>
<string name="show_updater_statistics">显示更新器的统计数据</string>
<string name="gallery_updater_statistics_collection">收集统计数据中……</string>
<string name="gallery_updater_statistics">画廊更新器统计</string>
<string name="gallery_updater_stats_text">更新器最后运行于 %1$s,检查了可检查的 %3$d 个画廊中的 %2$d 个。</string>
<string name="gallery_updater_not_ran_yet">更新器从未运行。</string>
<string name="gallery_updater_stats_time">\n上一次检查的画廊:\n- 1 小时: %1$d\n- 6 小时: %2$d\n- 12 小时: %3$d\n- 1 天: %4$d\n- 2 天: %5$d\n- 1 周: %6$d\n- 1 个月: %7$d\n- 1 年: %8$d</string>
<!-- EH Settings Upload Dialogs -->
<string name="settings_profile_note">设置配置文件说明</string>
<string name="settings_profile_note_message">该应用程序现在将在 E-Hentai 和 ExHentai 上添加一个新的设置配置文件,以优化应用程序的性能。请确保您在这两个网站上拥有少于三个配置文件。\n\n如果你不知道什么是配置文件,那么对你无影响,只需点击“确定”。</string>
<string name="eh_settings_successfully_uploaded">配置上传成功!</string>
<string name="eh_settings_configuration_failed">配置失败!</string>
<string name="eh_settings_configuration_failed_message">在配置过程中出现错误:%1$s</string>
<string name="eh_settings_uploading_to_server">配置上传中</string>
<string name="eh_settings_uploading_to_server_message">请稍后,这可能需要一些时间……</string>
<string name="eh_settings_out_of_slots_error">您在 %1$s 上的配置数量已用完,请删除一个配置!</string>
<!-- EH Settings Login Activity -->
<string name="recheck_login_status">重新检查登录状态</string>
<string name="alternative_login_page">备选登录页面</string>
<string name="skip_page_restyling">跳过页面重排</string>
<string name="custom_igneous_cookie">自定义 igneous cookie</string>
<string name="custom_igneous_cookie_message">某些用户无法正常访问 ExHentai,必须输入特定的 igneous cookie,此选项为这些用户设计。</string>
<!-- Advanced Settings -->
<string name="developer_tools">开发者工具</string>
<string name="toggle_hentai_features">启用集成的 hentai 特性</string>
<string name="toggle_hentai_features_summary">这是一个试验性功能,如果关闭则关闭所有 hentai 特性</string>
<string name="toggle_delegated_sources">启用委托来源</string>
<string name="toggle_delegated_sources_summary">应用 %1$s 增强到来源如果已安装: %2$s</string>
<string name="log_level">日志级别</string>
<string name="log_level_summary">更改此选项会影响应用性能。变更在完全重启应用后生效。现在的值:%s</string>
<string name="enable_source_blacklist">启用来源黑名单</string>
<string name="enable_source_blacklist_summary">隐藏扩展或来源如果与 %1$s 不兼容。变更在完全重启应用后生效。</string>
<string name="open_debug_menu">打开 Debug 菜单</string>
<string name="open_debug_menu_summary"><![CDATA[如果你不知道你在干什么不要点击此菜单!<font color=\'red\'>这会污染你的书架!</font>]]></string>
<string name="starting_cleanup">开始清理</string>
<string name="clean_up_downloaded_chapters">清理已下载的章节</string>
<string name="delete_unused_chapters">删除不存在的、部分下载的和已读章节的文件夹</string>
<string name="no_folders_to_cleanup">没有可清理的文件夹</string>
<string name="clean_orphaned_downloads">清理孤立的下载</string>
<string name="clean_read_downloads">清理已读</string>
<string name="clean_read_manga_not_in_library">清理不在书架中的漫画</string>
<plurals name="cleanup_done">
<item quantity="other">清理完成。清理了 %d 个文件夹</item>
</plurals>
<string name="data_saver">流量节省程序</string>
<string name="data_saver_summary">在阅读器下载图像前压缩,需要一个 Bandwidth Hero 代理服务器</string>
<string name="data_saver_downloader">在下载器中使用流量节省程序</string>
<string name="data_saver_ignore_jpeg">忽略 JPEG 图像</string>
<string name="data_saver_ignore_gif">忽略 Gif 动画</string>
<string name="data_saver_image_quality">图像质量</string>
<string name="data_saver_image_quality_summary">更高值意味着更高的保存的图像质量,但这意味着更大的文件大小,80% 可以很好地平衡图片质量和文件大小</string>
<string name="data_saver_image_format">压缩为 JPEG</string>
<string name="data_saver_image_format_summary_on">JPEG 文件的大小要比 Webp 小得多(意味着节省了更多的流量),但它也会使图像损失更多的质量。\n目前压缩为 JPEG</string>
<string name="data_saver_image_format_summary_off">JPEG 文件的大小要比 Webp 小得多(意味着节省了更多的流量),但它也会使图像损失更多的质量。\n目前压缩为 Webp</string>
<string name="data_saver_color_bw">转换为黑白</string>
<string name="data_saver_server">Bandwidth Hero 代理服务器</string>
<string name="data_saver_server_summary">填写 Bandwidth Hero 代理服务器 URL 到此</string>
<string name="clear_db_exclude_read">保留已阅读章节的漫画</string>
<!-- Log Level -->
<string name="log_minimal">最小</string>
<string name="log_extra">额外</string>
<string name="log_extreme">极端</string>
<string name="log_minimal_desc">仅限关键错误</string>
<string name="log_extra_desc">记录所有</string>
<string name="log_extreme_desc">网络检查模式</string>
<!-- General Settings -->
<string name="toggle_expand_search_filters">默认情况下展开所有搜索过滤器</string>
<string name="auto_solve_captchas">自动解决验证码</string>
<string name="auto_solve_captchas_summary">使用高度实验性的自动 ReCAPTCHA 解决器。如果您的设备不支持,则会显示为灰色。</string>
<string name="put_recommends_in_overflow">在菜单显示推荐</string>
<string name="put_recommends_in_overflow_summary">将推荐按钮放在弹出菜单而不是漫画页面</string>
<!-- Appearance Settings -->
<string name="pref_category_navbar">导航栏</string>
<string name="pref_hide_updates_button">在导航栏显示更新</string>
<string name="pref_hide_history_button">在导航栏显示历史</string>
<string name="pref_show_bottom_bar_labels">总是显示导航栏标签</string>
<!-- Library settings -->
<string name="pref_sorting_settings">排序设置</string>
<string name="pref_skip_pre_migration_summary">使用最后保存的预迁移偏好和来源进行大规模迁移</string>
<string name="library_settings_sheet">书架设置表</string>
<string name="library_settings_sheet_summary">更多书架显示设置</string>
<string name="library_group_updates">书架动态目录更新</string>
<string name="library_group_updates_global">总是加载全局更新</string>
<string name="library_group_updates_all_but_ungrouped">仅为未分组的项目加载全局更新,为其他加载目录更新</string>
<string name="library_group_updates_all">每次启动后加载目录更新</string>
<!-- Browse settings -->
<string name="pref_feed_position">订阅标签位置</string>
<string name="pref_feed_position_summery">你想让订阅标签成为浏览中的第一个标签吗?这将使它成为打开浏览时的默认标签,如果你使用的是数据或计费网络,则不建议使用。</string>
<string name="pref_source_source_filtering">在目录中过滤来源</string>
<string name="pref_source_source_filtering_summery">筛选属于类别的来源,使属于某个类别的来源不会被放在语言下</string>
<string name="pref_source_navigation">替换最新按钮</string>
<string name="pref_source_navigation_summery">用一个包括最新和浏览的自定义浏览视图取代最新按钮</string>
<string name="pref_local_source_hidden_folders">本地来源隐藏文件夹</string>
<string name="pref_local_source_hidden_folders_summery">允许本地源读取隐藏文件夹</string>
<!-- Backup settings -->
<string name="custom_manga_info">自定义漫画信息</string>
<string name="all_read_manga">所有已阅读的漫画</string>
<!-- Security settings -->
<string name="biometric_lock_times">生物识别锁定时间</string>
<string name="action_edit_biometric_lock_times">编辑锁定时间</string>
<string name="biometric_lock_times_empty">你有生物识别锁时间。点击加号创建一个。</string>
<string name="biometric_lock_time_conflicts">锁定时间与已经存在的时间冲突!</string>
<plurals name="num_lock_times">
<item quantity="other">%d 锁定时间</item>
</plurals>
<string name="biometric_lock_start_time">输入开始时间</string>
<string name="biometric_lock_end_time">输入结束时间</string>
<string name="biometric_lock_time_deleted_snack">生物识别锁定时间已删除</string>
<string name="biometric_lock_days">生物识别锁天数</string>
<string name="biometric_lock_days_summary">应用已锁定天数</string>
<string name="sunday">周日</string>
<string name="monday">周一</string>
<string name="tuesday">周二</string>
<string name="wednesday">周三</string>
<string name="thursday">周四</string>
<string name="friday">周五</string>
<string name="saturday">周六</string>
<!-- Reader Settings -->
<string name="page_downloading">页面下载</string>
<string name="download_threads">下载线程</string>
<string name="download_threads_summary">较高的值可以明显加快页面加载速度,同时容易触发封禁。推荐值为 2 或 3。现在的值为:%s</string>
<string name="aggressively_load_pages">积极地加载页面</string>
<string name="aggressively_load_pages_summary">在阅读时缓慢地下载整个章节,而不是只加载你正在阅读的页面。</string>
<string name="skip_queue_on_retry">重试时跳过队列</string>
<string name="skip_queue_on_retry_summary">通常情况下,在下载失败时按下重试按钮,将等待下载器完成最后一页的下载,然后开始重新下载失败的页面。启用此功能将迫使下载器在你按下重试按钮后立即开始重新下载失败的页面。</string>
<string name="reader_preload_amount">预加载页面数量</string>
<string name="reader_preload_amount_4_pages">4 页</string>
<string name="reader_preload_amount_6_pages">6 页</string>
<string name="reader_preload_amount_8_pages">8 页</string>
<string name="reader_preload_amount_10_pages">10 页</string>
<string name="reader_preload_amount_12_pages">12 页</string>
<string name="reader_preload_amount_14_pages">14 页</string>
<string name="reader_preload_amount_16_pages">16 页</string>
<string name="reader_preload_amount_20_pages">20 页</string>
<string name="reader_preload_amount_summary">要预读的的页面数量。更高的值将带来更流畅的阅读体验,但代价是更高的缓存使用量,建议在使用更大的值时增加你分配的缓存量。</string>
<string name="reader_cache_size">阅读器缓存大小</string>
<string name="reader_cache_size_summary">阅读时保存在设备上的图像量。更高的值将带来更流畅的阅读体验,但代价是更高的存储空间使用率。</string>
<string name="preserve_reading_position">保留已阅读漫画的阅读位置</string>
<string name="auto_webtoon_mode">自动 Webtoon 模式</string>
<string name="auto_webtoon_mode_summary">对被检测到可能使用长条形格式的漫画使用自动 Webtoon 模式</string>
<string name="enable_zoom_out">启用缩放功能</string>
<string name="tap_scroll_page">点按按页滚动</string>
<string name="tap_scroll_page_summary">启用该选项后,点击将按页面而不是屏幕大小滚动</string>
<string name="reader_bottom_buttons">阅读器底部按钮</string>
<string name="reader_bottom_buttons_summary">自定义显示在阅读器底部的按钮</string>
<string name="pref_show_vert_seekbar_landscape">横屏时显示垂直进度条</string>
<string name="pref_show_vert_seekbar_landscape_summary">在横屏时启用垂直进度条</string>
<string name="pref_left_handed_vertical_seekbar">左侧的垂直进度条</string>
<string name="pref_left_handed_vertical_seekbar_summary">切换进度条的方位</string>
<string name="pref_force_horz_seekbar">强制使用水平进度条</string>
<string name="pref_force_horz_seekbar_summary">完全删除垂直进度条,改用水平进度条。</string>
<!-- Reader -->
<!-- Reader Actions -->
<string name="eh_autoscroll">自动滚动</string>
<string name="eh_retry_all">全部重试</string>
<string name="eh_boost_page">加速页面</string>
<string name="eh_autoscroll_help">自动翻页帮助</string>
<string name="eh_autoscroll_help_message">在指定的时间间隔内自动滚动到下一页。间隔的单位是秒。</string>
<string name="eh_autoscroll_freq_invalid">无效频次</string>
<string name="eh_retry_all_help">重试所有帮助</string>
<string name="eh_retry_all_help_message">重新添加失败的页面到下载队列</string>
<plurals name="eh_retry_toast">
<item quantity="other">重试 %1$d 个失败的页面……</item>
</plurals>
<string name="eh_boost_page_help">加速页面帮助</string>
<string name="eh_boost_page_help_message">通常情况下,下载器在同一时间只能下载特定数量的页面。这意味着你需要等待一个页面的下载,但不会立即开始下载该页面,直到有一个空闲的下载槽。激活“Boost 页面”将迫使下载器立即开始下载,而不管是否有可用的下载槽。</string>
<string name="eh_boost_page_invalid">该页面无法加速(无效页面)!</string>
<string name="eh_boost_page_errored">页面加载失败,请按重试按钮!</string>
<string name="eh_boost_page_downloading">该页面已经在下载了!</string>
<string name="eh_boost_page_downloaded">该页面已下载完成!</string>
<string name="eh_boost_boosted">加速该页面!</string>
<string name="eh_boost_invalid_loader">该页面无法加速(无效的页面加载器)!</string>
<string name="pref_crop_borders_pager">页面模式切边</string>
<string name="pref_crop_borders_continuous_vertical">连续垂直切边</string>
<string name="pref_crop_borders_webtoon">Webtoon 切边</string>
<string name="action_set_first_page_cover">设置第一页为封面</string>
<string name="action_set_second_page_cover">设置第二页为封面</string>
<string name="action_save_first_page">保存第一页</string>
<string name="action_save_second_page">保存第二页</string>
<string name="action_share_first_page">分享第一页</string>
<string name="action_share_second_page">分享第二页</string>
<string name="action_save_combined_page">保存合并页面</string>
<string name="action_share_combined_page">分享合并页面</string>
<!-- Reader Sharing -->
<string name="share_pages_info">%1$s: %2$s, 页 %3$s</string>
<!-- Auto Webtoon Mode -->
<string name="eh_auto_webtoon_snack">正处于 Webtoon 样式</string>
<!-- Double page spread -->
<string name="page_layout">页面布局</string>
<string name="shift_double_pages">位移一页</string>
<string name="double_pages">双页</string>
<string name="single_page">单页</string>
<string name="automatic_orientation">自动(基于方向)</string>
<string name="automatic_can_still_switch">在使用自动页面布局时,你仍然可以在阅读时切换布局,而不需要重设这一设置</string>
<string name="invert_double_pages">反向双页</string>
<!-- Manga Page -->
<!-- Manga Info -->
<string name="az_recommends">查看推荐</string>
<string name="merge">合并</string>
<string name="merge_with_another_source">与其他合并</string>
<string name="manga_merged">漫画已合并!</string>
<string name="failed_merge">漫画合并失败:%1$s</string>
<string name="merge_unknown_manga">未知漫画 ID: %1$d</string>
<string name="merged_already">该漫画已与当前漫画合并!</string>
<string name="merge_duplicate">该已合并的漫画重复了!</string>
<!-- Manga Info Edit -->
<string name="reset_tags">重置标签</string>
<string name="add_tag">添加标签</string>
<string name="title_hint">标题:%1$s</string>
<string name="description_hint">描述:%1$s</string>
<string name="author_hint">作者:%1$s</string>
<string name="artist_hint">艺术家:%1$s</string>
<!-- Browse -->
<!-- Sources Tab -->
<string name="find_in_another_source">查找其他来源</string>
<string name="data_saver_exclude">排除在流量节省程序之外</string>
<string name="data_saver_stop_exclude">停止排除在流量节省程序之外</string>
<!-- Smart Search -->
<string name="searching_source">查找来源中……</string>
<string name="could_not_find_manga">未在来源中找到此漫画!</string>
<string name="automatic_search_error">进行自动搜索过程中出现错误!</string>
<!-- Saved Searches -->
<string name="saved_searches">保存搜索</string>
<string name="save_search">保存当前搜索查询?</string>
<string name="save_search_hint">我的搜索名称</string>
<string name="save_search_failed_to_load">加载已保存的搜索失败!</string>
<string name="save_search_failed_to_load_message">加载已保存的搜索过程中出现问题。</string>
<string name="save_search_failed_to_delete">删除已保存的搜索失败!</string>
<string name="save_search_failed_to_delete_message">删除已保存的搜索过程中出现问题。</string>
<string name="save_search_delete">删除已保存的搜索查询?</string>
<string name="save_search_delete_message">你确定要删除你的搜索查询:\'%1$s\'</string>
<string name="save_search_invalid">保存的搜索无效,过滤器已经改变</string>
<string name="save_search_invalid_name">无效的搜索名称</string>
<!-- Source Categories -->
<string name="no_source_categories">没有可用的来源类别</string>
<string name="invalid_category_name">无效的类别名称</string>
<!-- Feed Tab -->
<string name="feed">订阅</string>
<string name="feed_delete">删除订阅项?</string>
<string name="too_many_in_feed">你订阅的来源太多了,不能大于 10</string>
<string name="feed_tab_empty">订阅中没有任何来源,导航到右上角添加一个</string>
<string name="feed_add">添加 %1$s 到订阅?</string>
<!-- Sort by tags -->
<string name="pref_tag_sorting">标签排序标签</string>
<string name="tag_sorting">标签排序</string>
<plurals name="pref_tag_sorting_desc">
<item quantity="other">%1$d 个标签在排序列表中。 这在书架中增加了一个选项,以基于优先级的标签列表进行排序,这意味着漫画将以你想要的标签优先的方式进行排序。</item>
</plurals>
<string name="action_add_tags_message">看这里!标签必须是精确的,不支持模糊匹配,你不能用类似 netorare 过滤 female:netorare\n命名空间标签的风格是\n“female: sole female”\n不需要引号!\n支持添加同一标签的多个变体,所以随意为 NHentai 添加 \"tag: netorare\" 或者为 E-Hentai 添加 \"female: netorare\" </string>
<string name="action_edit_tags">编辑标签</string>
<string name="information_empty_tags">你没有标签。点按+按钮以创建一个标签用来将书架排序</string>
<string name="error_tag_exists">该标签已存在!</string>
<string name="snack_tags_deleted">标签已删除</string>
<!-- Extension section -->
<string name="ext_redundant">过时</string>
<string name="redundant_extension_message">该扩展是过时的,将不会在此版本的 Tachiyomi 工作。</string>
<!-- Extension Repos -->
<string name="information_empty_repos">你没有额外的仓库。点击加号按钮以创建一个用于添加外部扩展。</string>
<string name="action_add_repo">增加仓库</string>
<string name="action_add_repo_message">在 Tachiyomi 中添加额外的仓库,仓库的格式是 \'username/repo\'username是仓库所有者,repo是仓库名称。</string>
<string name="action_edit_repos">编辑仓库</string>
<plurals name="num_repos">
<item quantity="other">%d 额外的仓库</item>
</plurals>
<string name="error_repo_exists">该仓库已存在!</string>
<string name="snack_repo_deleted">已删除仓库</string>
<string name="invalid_repo_name">无效的仓库名称</string>
<string name="repo_source">仓库来源</string>
<!-- Migration -->
<string name="select_sources">选择来源</string>
<string name="select_none">未选择</string>
<string name="source_migration">迁移来源</string>
<string name="migration">迁移</string>
<string name="skip_pre_migration">跳过预迁移</string>
<string name="pre_migration_skip_toast">要重新显示该页面,请到设置 -> 书架.</string>
<string name="select_a_source_to_migrate_from">选择一个要迁移的来源</string>
<string name="use_intelligent_search">搜索标题 +标题关键词</string>
<string name="data_to_include_in_migration">迁移中包含的数据</string>
<string name="include_extra_search_parameter">搜索时包含额外的搜索参数</string>
<string name="use_most_chapters">使用具有最多章节的来源(较慢)。</string>
<string name="use_first_source">使用第一个来源的备选方案</string>
<string name="skip_this_step_next_time">下次跳过此步骤</string>
<string name="hide_not_found_manga">隐藏未找到的漫画</string>
<string name="search_parameter">搜索参数(例如:language:chinese</string>
<string name="latest_">最新:%1$s</string>
<string name="migrating_to">迁移到</string>
<string name="match_pinned_sources">匹配置顶的来源</string>
<string name="match_enabled_sources">匹配启用的来源</string>
<string name="no_chapters_found_for_migration">未找到章节,该漫画无法用于迁移</string>
<string name="no_alternatives_found">未找到替代方案</string>
<string name="stop_migrating">停止迁移?</string>
<plurals name="migrate_manga">
<item quantity="other">迁移 %1$d%2$s 漫画?</item>
</plurals>
<plurals name="copy_manga">
<item quantity="other">复制 %1$d%2$s 漫画?</item>
</plurals>
<string name="skipping_">(跳过 %1$d</string>
<plurals name="manga_migrated">
<item quantity="other">%d 漫画已迁移</item>
</plurals>
<!-- Library -->
<!-- Library Actions -->
<string name="no_valid_manga">未选择有效的漫画</string>
<!-- Library Sheet -->
<string name="lewd">淫乱</string>
<string name="started">已开始</string>
<!-- Library Grouping -->
<string name="tracking_status">追踪状态</string>
<string name="ungrouped">未归类</string>
<string name="not_tracked">未追踪</string>
<!-- Favorites Sync -->
<string name="sync_favorites">同步 EH 收藏夹</string>
<string name="favorites_sync_error">收藏夹同步错误</string>
<string name="show_gallery">展示画廊</string>
<string name="favorites_sync_bad_library_state">%1$s 直到画廊属于一个分类同步将不会开始</string>
<string name="favorites_syncing">收藏夹同步中</string>
<string name="favorites_sync_error_string">同步过程中出现问题:%1$s</string>
<string name="favorites_sync_done_errors">收藏品同步完成,但有错误</string>
<string name="favorites_sync_done_errors_message">同步过程中被忽略的错误:\n%1$s</string>
<string name="favorites_sync_verifying_library">本地书架验证中</string>
<string name="favorites_sync_manga_multiple_categories_error">漫画 %1$d 在多个类别中!</string>
<string name="favorites_sync_downloading">从远程服务器下载收藏夹中</string>
<string name="favorites_sync_failed_to_featch">从远程服务器获取收藏夹失败!</string>
<string name="favorites_sync_could_not_fetch">无法获取收藏夹!</string>
<string name="favorites_sync_calculating_remote_changes">计算远程变更中</string>
<string name="favorites_sync_calculating_local_changes">计算本地变更中</string>
<string name="favorites_sync_syncing_category_names">更新分类名称</string>
<string name="favorites_sync_cleaning_up">清理中</string>
<string name="favorites_sync_complete">同步完成!</string>
<string name="favorites_sync_ignoring_exception">无视例外情况!</string>
<string name="favorites_sync_sync_error">同步错误!</string>
<string name="favorites_sync_unknown_error">未知错误:%1$s</string>
<string name="favorites_sync_network_error">同步网络错误!</string>
<string name="favorites_sync_removing_galleries">从远程服务器移除 %1$d 画廊</string>
<string name="favorites_sync_unable_to_delete">无法从远程服务器上删除画廊!</string>
<string name="favorites_sync_adding_to_remote">增加 %1$d 个画廊(已完成 %2$d 个) 到远程服务器</string>
<string name="favorites_sync_remove_from_local">从远程服务器移除 %1$d 个画廊(已移除 %2$d 个)</string>
<string name="favorites_sync_add_to_local">增加 %1$d 个画廊(已完成 %2$d 个) 到本地数据库</string>
<string name="favorites_sync_remote_not_exist">远程画廊不存在,跳过:%1$s</string>
<string name="favorites_sync_failed_to_add_to_local">向本地数据库添加画廊失败:</string>
<string name="favorites_sync_failed_to_add_to_local_error">\'%1$s\' %2$s</string>
<string name="favorites_sync_failed_to_add_to_local_unknown_type">\'%1$s\' (%2$s) 不是一个有效的画廊!</string>
<string name="favorites_sync_waiting_for_start">等待同步开始</string>
<string name="favorites_sync_manga_in_multiple_categories">画廊:%1$s 在多于一个类别中(%2$s)!</string>
<string name="favorites_sync_initializing">初始化同步</string>
<string name="favorites_sync_processing_throttle">%1$s\n\n同步工作目前正在限速(以避免被ExHentai禁止),可能需要很长时间才能完成。</string>
<string name="favorites_sync_notes">重要的收藏夹同步注意事项</string>
<string name="favorites_sync_notes_message"><![CDATA[1. 在应用中修改分类名称是<b>不</b>同步的!请<i>在 ExHentai 上更改名称</i>。分类名称会在每次同步时从 ExHentai 服务器上复制<br><br>2. <b>应用中前10个类别与</b> ExHentai 上的最爱类别相对应(除了 \'默认\' 类别)。<i>在其他类别的画廊将<b>不会</b>被同步!</i><br><br>3. <font color=\'red\'><b>在同步过程中请确保有稳定的网络连接!</b></font>如果在同步过程中网络连接中断,你的收藏夹可能会停留在<i>部分同步状态</i>。<br><br>4. 当在同步时保持应用在前台。Android 有时会关闭后台应用,如果正在同步这会很糟糕。<br><br>5. <b>不要将收藏夹放到多个类别</b>(该应用支持这样做)。 这可能会导致同步算法混乱,因为 ExHentai 只允许每个收藏夹在一个类别中。<br><br>该对话框仅会弹出一次。你可以到 \'设置 > E-Hentai > 显示收藏夹同步注意事项\' 阅读多次。]]></string>
<string name="favorites_sync_reset">你确定吗?</string>
<string name="favorites_sync_reset_message">重置同步状态会导致下一次同步变得非常慢。</string>
<!-- Gallery Adder -->
<!-- Batch Add -->
<string name="eh_batch_add">批量添加</string>
<string name="eh_batch_add_description">示例:\n\nhttp://e-hentai.org/g/12345/1a2b3c4e\nhttp://g.e-hentai.org/g/67890/6f7g8h9i\nhttp://exhentai.org/g/13579/1a3b5c7e\nhttps://exhentai.org/g/24680/2f4g6h8i\n\n它还支持 E-H 访问过的导出数据\n</string>
<string name="eh_batch_add_title">输入要添加的画廊(每行一个):</string>
<string name="eh_batch_add_button">添加画廊</string>
<string name="eh_batch_add_adding_galleries">添加画廊中……</string>
<string name="eh_batch_add_finish">完成</string>
<string name="batch_add_no_valid_galleries">没有可添加的画廊!</string>
<string name="batch_add_no_valid_galleries_message">你必须选择至少一个画廊以添加!</string>
<string name="batch_add">批量增加</string>
<string name="batch_add_summary">\n摘要:\n已添加:%1$d 个画廊\n失败:%2$d 个画廊</string>
<string name="batch_add_success_log_message">已添加漫画:%1$s</string>
<string name="batch_add_unknown_type_log_message">未知漫画类型的漫画:%1$s</string>
<string name="batch_add_unknown_source_log_message">未知来源的漫画:%1$s</string>
<string name="batch_add_not_exist_log_message">漫画不存在:%1$s</string>
<string name="gallery_adder_importing_manga">导入漫画(地址:%1$s,收藏夹:%2$s,强制使用来源:%3$s)……</string>
<string name="gallery_adder_source_uri_must_match">来源 URI 匹配检查错误!</string>
<string name="gallery_adder_uri_map_to_manga_error">来源 URI 映射到漫画错误!</string>
<string name="gallery_adder_uri_map_to_chapter_error">来源 URI 映射到章节错误!</string>
<string name="gallery_adder_uri_clean_error">来源 URI 清理错误!</string>
<string name="gallery_adder_chapter_fetch_error">未能更新漫画的章节:%1$s</string>
<string name="gallery_adder_could_not_add_manga">无法添加漫画(地址:%1$s)!</string>
<string name="gallery_adder_could_not_identify_chapter">无法识别章节(地址:%1$s)!</string>
<!-- Intercept Activity -->
<string name="launching_app">应用启动中……</string>
<string name="error_with_reason">错误:%1$s</string>
<string name="could_not_open_manga">无法打开该漫画:\n\n%1$s</string>
<string name="manga_id_is_null">漫画 ID 为空!</string>
<string name="loading_manga">漫画加载中……</string>
<!-- Rating 0-10 (0, 0.5, 1, 1.5 and so fourth) -->
<string name="rating10">杰作</string>
<string name="rating9">惊人</string>
<string name="rating8">优秀</string>
<string name="rating7">很好</string>
<string name="rating6"></string>
<string name="rating5">中等</string>
<string name="rating4"></string>
<string name="rating3">糟糕</string>
<string name="rating2">痛苦</string>
<string name="rating1">无法忍受</string>
<string name="rating0">灾难</string>
<string name="no_rating">没有评分</string>
<!-- Gallery types -->
<string name="doujinshi">Doujinshi</string>
<string name="artist_cg">艺术 CG</string>
<string name="game_cg">游戏 CG</string>
<string name="western">Western</string>
<string name="non_h">Non-H</string>
<string name="image_set">图片集</string>
<string name="cosplay">Cosplay</string>
<string name="asian_porn">亚洲色情</string>
<string name="misc">杂项</string>
<string name="artbook">Artbook</string>
<string name="video">视频</string>
<!-- More Info Menu -->
<string name="more_info">更多信息</string>
<string name="alt_title">其他标题</string>
<string name="is_exhentai_gallery">是 Exhentai 画廊</string>
<string name="thumbnail_url">预览地址</string>
<string name="genre">类型</string>
<string name="date_posted">发布日期</string>
<string name="page_count">页数</string>
<string name="parent">父链接</string>
<string name="visible">可见性</string>
<string name="language">语言</string>
<string name="gallery_size">画廊大小</string>
<string name="total_favorites">总收藏数</string>
<string name="total_ratings">总评分数</string>
<string name="average_rating">平均评分</string>
<string name="last_update_check">最近一次更新检查</string>
<string name="path">路径</string>
<string name="artist">艺术家</string>
<string name="characters">角色</string>
<string name="group">团体</string>
<string name="media_id">媒体 id</string>
<string name="japanese_title">日文标题</string>
<string name="english_title">英语标题</string>
<string name="short_title">短标题</string>
<string name="cover_image_file_type">转换图像类型</string>
<string name="thumbnail_image_file_type">缓存图像类型</string>
<string name="scanlator">扫描仪</string>
<string name="alt_titles">其他标题</string>
<string name="uploader_capital">上传者名字</string>
<string name="uploader">上传者</string>
<string name="rating_string">评分字符串</string>
<string name="collection">集合</string>
<string name="parodies">Parodies</string>
<string name="author">作者</string>
<string name="last_chapter_number">最后一章编号</string>
<string name="follow_status">关注状态</string>
<string name="manga_updates_id">Manga 更新 id</string>
<string name="translated">已翻译</string>
<!-- Extra gallery info -->
<plurals name="num_pages">
<item quantity="other">%1$d 页</item>
</plurals>
<string name="is_visible">可见:%1$s</string>
<string name="language_translated">%1$s TR</string>
<!-- Enhanced E/ExHentai Browse View -->
<plurals name="browse_language_and_pages">
<item quantity="other">%2$s, %1$d 页</item>
</plurals>
<!-- Merged manga -->
<string name="merge_settings">合并设置</string>
<string name="fetch_chapter_updates">获取章节更新</string>
<string name="delete_merged_manga">你确定吗?</string>
<string name="delete_merged_manga_desc">这将从合并中删除该漫画,使用这个方法会丢失任何应用于合并后的漫画的未保存的修改。</string>
<string name="chapter_updates_merged_manga">切换章节更新</string>
<string name="chapter_updates_merged_manga_desc">更改此项将禁用或启用该合并漫画的章节更新</string>
<string name="download_merged_manga">切换新章节下载</string>
<string name="download_merged_manga_desc">更改此项将禁用或启用此合并漫画的章节下载</string>
<string name="merged_references_invalid">合并后的引用无效</string>
<string name="merged_chapter_updates_error">切换章节更新错误</string>
<string name="merged_references">引用已合并</string>
<string name="merged_toggle_chapter_updates_find_error">找不到漫画,无法切换章节更新</string>
<string name="merged_toggle_download_chapters_error">切换下载章节错误</string>
<string name="merged_toggle_download_chapters_find_error">找不到漫画来切换章节下载</string>
<string name="allow_deduplication">允许删除重复数据:</string>
<string name="deduplication_mode">去重模式:</string>
<string name="manga_info_manga">漫画信息:</string>
<string name="toggle_dedupe">切换去重</string>
<string name="refresh_merge">刷新以获取正确信息</string>
<string name="no_dedupe">无重复</string>
<string name="dedupe_priority">按优先级去重</string>
<string name="dedupe_most_chapters">显示有最多章节的来源</string>
<string name="dedupe_highest_chapter">显示章数最多的来源</string>
<!-- MangaDex -->
<string name="md_follows_unfollowed">取消关注</string>
<string name="mangadex_specific_settings">MangaDex 设置</string>
<string name="mangadex_sync_follows_to_library">同步 Mangadex 中的漫画到书架</string>
<string name="mangadex_sync_follows_to_library_summary">如果未被添加则从 MangaDex 拉取漫画到你的书架</string>
<string name="mangadex_preffered_source">首选 MangaDex 来源</string>
<string name="mangadex_preffered_source_summary">设置你所选择的 mangadex 来源,这将用于关注和应用中一系列其他功能。</string>
<string name="two_factor">2FA 验证码</string>
<string name="fields_cannot_be_blank">字段不能为空</string>
<string name="mangadex_add_to_follows">添加到 MangaDex 关注</string>
<string name="mangadex_follows">MangaDex 关注</string>
<string name="random">随机</string>
<string name="mangadex_push_favorites_to_mangadex">同步书架中的漫画到 MangaDex</string>
<string name="mangadex_push_favorites_to_mangadex_summary">将任何 MdList 未跟踪的漫画同步到 MangaDex 用于阅读。</string>
<string name="mangadex_similar">MangaDex 相似</string>
<string name="community_recommendations">社区建议</string>
<!-- Scanlator filters -->
<string name="select_scanlators">Scanlator 组展示</string>
<!-- Similar -->
<string name="similar">与 %1$s 相似</string>
<string name="similar_no_results">未找到相似漫画</string>
<!-- Mangadex relations-->
<string name="relation_similar">相似</string>
<string name="relation_monochrome">单色</string>
<string name="relation_main_story">主要故事</string>
<string name="relation_adapted_from">改编自</string>
<string name="relation_based_on">基于</string>
<string name="relation_prequel">前篇</string>
<string name="relation_side_story">外传</string>
<string name="relation_doujinshi">同人志</string>
<string name="relation_same_franchise">同一系列</string>
<string name="relation_shared_universe">平行宇宙</string>
<string name="relation_sequel">续篇</string>
<string name="relation_spin_off">Spin-off</string>
<string name="relation_alternate_story">Alternate story</string>
<string name="relation_preserialization">Pre-serialization</string>
<string name="relation_colored">全彩</string>
<string name="relation_serialization">系列</string>
<string name="relation_alternate_version">候补版本</string>
<!-- Humanize time -->
<plurals name="humanize_year">
<item quantity="other">%1$d 年前</item>
</plurals>
<plurals name="humanize_month">
<item quantity="other">%1$d 月前</item>
</plurals>
<plurals name="humanize_week">
<item quantity="other">%1$d 周前</item>
</plurals>
<plurals name="humanize_day">
<item quantity="other">%1$d 天前</item>
</plurals>
<plurals name="humanize_hour">
<item quantity="other">%1$d 小时前</item>
</plurals>
<plurals name="humanize_minute">
<item quantity="other">%1$d 分钟前</item>
</plurals>
<plurals name="humanize_second">
<item quantity="other">%1$d 秒前</item>
</plurals>
<string name="humanize_fallback">前不久</string>
</resources>
+5 -2
View File
@@ -451,6 +451,7 @@
<string name="backup_choice">What do you want to backup?</string> <string name="backup_choice">What do you want to backup?</string>
<string name="creating_backup">Creating backup</string> <string name="creating_backup">Creating backup</string>
<string name="creating_backup_error">Backup failed</string> <string name="creating_backup_error">Backup failed</string>
<string name="empty_backup_error">No library entries to back up</string>
<string name="restore_miui_warning">Backup/restore may not function properly if MIUI Optimization is disabled.</string> <string name="restore_miui_warning">Backup/restore may not function properly if MIUI Optimization is disabled.</string>
<string name="restore_in_progress">Restore is already in progress</string> <string name="restore_in_progress">Restore is already in progress</string>
<string name="restoring_backup">Restoring backup</string> <string name="restoring_backup">Restoring backup</string>
@@ -468,7 +469,7 @@
<string name="pref_clear_chapter_cache">Clear chapter cache</string> <string name="pref_clear_chapter_cache">Clear chapter cache</string>
<string name="used_cache">Used: %1$s</string> <string name="used_cache">Used: %1$s</string>
<string name="cache_deleted">Cache cleared. %1$d files have been deleted</string> <string name="cache_deleted">Cache cleared. %1$d files have been deleted</string>
<string name="cache_delete_error">An error occurred while clearing cache</string> <string name="cache_delete_error">Error occurred while clearing</string>
<string name="pref_auto_clear_chapter_cache">Clear chapter cache on app close</string> <string name="pref_auto_clear_chapter_cache">Clear chapter cache on app close</string>
<string name="pref_clear_database">Clear database</string> <string name="pref_clear_database">Clear database</string>
<string name="pref_clear_database_summary">Delete history for manga that are not saved in your library</string> <string name="pref_clear_database_summary">Delete history for manga that are not saved in your library</string>
@@ -476,6 +477,8 @@
<string name="clear_database_confirmation">Are you sure? Read chapters and progress of non-library manga will be lost</string> <string name="clear_database_confirmation">Are you sure? Read chapters and progress of non-library manga will be lost</string>
<string name="clear_database_completed">Entries deleted</string> <string name="clear_database_completed">Entries deleted</string>
<string name="database_clean">Database clean</string> <string name="database_clean">Database clean</string>
<string name="pref_clear_webview_data">Clear WebView data</string>
<string name="webview_data_deleted">WebView data cleared</string>
<string name="pref_refresh_library_covers">Refresh library manga covers</string> <string name="pref_refresh_library_covers">Refresh library manga covers</string>
<string name="pref_refresh_library_tracking">Refresh tracking</string> <string name="pref_refresh_library_tracking">Refresh tracking</string>
<string name="pref_refresh_library_tracking_summary">Updates status, score and last chapter read from the tracking services</string> <string name="pref_refresh_library_tracking_summary">Updates status, score and last chapter read from the tracking services</string>
@@ -756,7 +759,7 @@
<!--UpdateCheck--> <!--UpdateCheck-->
<string name="update_check_confirm">Download</string> <string name="update_check_confirm">Download</string>
<string name="update_check_ignore">Ignore</string> <string name="update_check_open">Open on GitHub</string>
<string name="update_check_eol">This Android version is no longer supported</string> <string name="update_check_eol">This Android version is no longer supported</string>
<string name="update_check_no_new_updates">No new updates available</string> <string name="update_check_no_new_updates">No new updates available</string>
<string name="update_check_look_for_updates">Searching for updates…</string> <string name="update_check_look_for_updates">Searching for updates…</string>
+3 -1
View File
@@ -34,7 +34,7 @@ jsoup = "org.jsoup:jsoup:1.14.3"
disklrucache = "com.jakewharton:disklrucache:2.0.2" disklrucache = "com.jakewharton:disklrucache:2.0.2"
unifile = "com.github.tachiyomiorg:unifile:17bec43" unifile = "com.github.tachiyomiorg:unifile:17bec43"
junrar = "com.github.junrar:junrar:7.4.0" junrar = "com.github.junrar:junrar:7.5.0"
sqlitektx = "androidx.sqlite:sqlite-ktx:2.3.0-alpha02" sqlitektx = "androidx.sqlite:sqlite-ktx:2.3.0-alpha02"
sqlite-android = "com.github.requery:sqlite-android:3.36.0" sqlite-android = "com.github.requery:sqlite-android:3.36.0"
@@ -55,6 +55,8 @@ image-decoder = "com.github.tachiyomiorg:image-decoder:7481a4a"
natural-comparator = "com.github.gpanther:java-nat-sort:natural-comparator-1.1" natural-comparator = "com.github.gpanther:java-nat-sort:natural-comparator-1.1"
markwon = "io.noties.markwon:core:4.6.2"
material = "com.google.android.material:material:1.7.0-alpha01" material = "com.google.android.material:material:1.7.0-alpha01"
androidprocessbutton = "com.github.dmytrodanylyk.android-process-button:library:1.0.4" androidprocessbutton = "com.github.dmytrodanylyk.android-process-button:library:1.0.4"
flexible-adapter-core = "com.github.arkon.FlexibleAdapter:flexible-adapter:c8013533" flexible-adapter-core = "com.github.arkon.FlexibleAdapter:flexible-adapter:c8013533"