Compare commits

..

27 Commits

Author SHA1 Message Date
Jobobby04 5742d2e3fe Release 1.12.0 2025-05-11 14:24:22 -04:00
BrutuZ c2d0308ac0 Populate Author field and clear Description on a couple of delegated (#1432) 2025-05-11 14:16:43 -04:00
Callum Wong 84c7da5a7d Add QR code scan button for sync API key (#1430)
* Add dependency com.journeyapps:zxing-android-embedded:4.3.0

* Add widget parameter to EditTextPreferenceWidget

* Add QR code scanner icon button to sync API key preference which launches a ScanContract

* Remove screenOrientation property from CaptureActivity manifest

* Allow scanning both normal and inverted codes

* store values and make code more concise

Co-authored-by: jobobby04 <jobobby04@users.noreply.github.com>

* Import local context

---------

Co-authored-by: jobobby04 <jobobby04@users.noreply.github.com>
2025-05-11 14:15:05 -04:00
cfouche 274350c118 Change for t1 for better hit rate (#1425) 2025-05-11 14:12:44 -04:00
Weblate (bot) 6bd978eef1 Translations update from Hosted Weblate (#1422)
Translate-URL: https://hosted.weblate.org/projects/mihon/tachiyomisy-plurals/vi/
Translate-URL: https://hosted.weblate.org/projects/mihon/tachiyomisy/
Translate-URL: https://hosted.weblate.org/projects/mihon/tachiyomisy/ar/
Translate-URL: https://hosted.weblate.org/projects/mihon/tachiyomisy/de/
Translate-URL: https://hosted.weblate.org/projects/mihon/tachiyomisy/es/
Translate-URL: https://hosted.weblate.org/projects/mihon/tachiyomisy/fr/
Translate-URL: https://hosted.weblate.org/projects/mihon/tachiyomisy/it/
Translate-URL: https://hosted.weblate.org/projects/mihon/tachiyomisy/ru/
Translate-URL: https://hosted.weblate.org/projects/mihon/tachiyomisy/tr/
Translate-URL: https://hosted.weblate.org/projects/mihon/tachiyomisy/uk/
Translate-URL: https://hosted.weblate.org/projects/mihon/tachiyomisy/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/mihon/tachiyomisy/zh_Hant/
Translation: Mihon/TachiyomiSY
Translation: Mihon/TachiyomiSY Plurals

Co-authored-by: Alex Maryson Jr <akamar87@gmail.com>
Co-authored-by: B4LiN7 <87660017+B4LiN7@users.noreply.github.com>
Co-authored-by: Frosted <frosted@users.noreply.hosted.weblate.org>
Co-authored-by: Hualiang <642615676@qq.com>
Co-authored-by: Kosťantin Horovij <lg096066587039@gmail.com>
Co-authored-by: Sky children of the Light <tu25261@gmail.com>
Co-authored-by: Swyter <swyterzone@gmail.com>
Co-authored-by: ZerOriSama <godarms2010@live.com>
Co-authored-by: edgole <test.backache009@aleeas.com>
Co-authored-by: fl0k1 <michele.carnova@gmail.com>
Co-authored-by: ɴᴇᴋᴏ <s99095lkjjim@gmail.com>
Co-authored-by: Георгій Обушенков <heorhii.obushenkov@gmail.com>
Co-authored-by: ابومسلم <linuxmint1978@gmail.com>
2025-05-11 13:49:55 -04:00
Weblate (bot) e0f40fad8c Translations update from Hosted Weblate (#1408)
Translate-URL: https://hosted.weblate.org/projects/mihon/tachiyomisy-plurals/tr/
Translate-URL: https://hosted.weblate.org/projects/mihon/tachiyomisy/
Translate-URL: https://hosted.weblate.org/projects/mihon/tachiyomisy/as/
Translate-URL: https://hosted.weblate.org/projects/mihon/tachiyomisy/de/
Translate-URL: https://hosted.weblate.org/projects/mihon/tachiyomisy/es/
Translate-URL: https://hosted.weblate.org/projects/mihon/tachiyomisy/fil/
Translate-URL: https://hosted.weblate.org/projects/mihon/tachiyomisy/id/
Translate-URL: https://hosted.weblate.org/projects/mihon/tachiyomisy/it/
Translate-URL: https://hosted.weblate.org/projects/mihon/tachiyomisy/ja/
Translate-URL: https://hosted.weblate.org/projects/mihon/tachiyomisy/ne/
Translate-URL: https://hosted.weblate.org/projects/mihon/tachiyomisy/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/mihon/tachiyomisy/ru/
Translate-URL: https://hosted.weblate.org/projects/mihon/tachiyomisy/tr/
Translate-URL: https://hosted.weblate.org/projects/mihon/tachiyomisy/vi/
Translate-URL: https://hosted.weblate.org/projects/mihon/tachiyomisy/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/mihon/tachiyomisy/zh_Hant/
Translation: Mihon/TachiyomiSY
Translation: Mihon/TachiyomiSY Plurals

Co-authored-by: Champ0999 <il.migliore0999@gmail.com>
Co-authored-by: Corrado Belmonte <corrado.spam@gmail.com>
Co-authored-by: Dexroneum <Rozhenkov69@gmail.com>
Co-authored-by: Eji-san <ejierubani@gmail.com>
Co-authored-by: FateXBlood <fatexblood@gmail.com>
Co-authored-by: Frosted <frosted@users.noreply.hosted.weblate.org>
Co-authored-by: Infy's Tagalog Translations <ced.paltep10@gmail.com>
Co-authored-by: Itsmechinmoy <itsmechinmoy@users.noreply.hosted.weblate.org>
Co-authored-by: Lyfja <45209212+lyfja@users.noreply.github.com>
Co-authored-by: Nam Pai <namhg911@gmail.com>
Co-authored-by: Renan Sarto <app@renansg.com>
Co-authored-by: Sepultrex <sepultrex@gmail.com>
Co-authored-by: Shiratori <kuromaruhatake@gmail.com>
Co-authored-by: Swyter <swyterzone@gmail.com>
Co-authored-by: Tim Schneeberger <tim.schneeberger@outlook.de>
Co-authored-by: ZerOriSama <godarms2010@live.com>
Co-authored-by: dianisaac <muhandreop@gmail.com>
Co-authored-by: quangpao <ddquangbao@gmail.com>
Co-authored-by: ɴᴇᴋᴏ <s99095lkjjim@gmail.com>
2025-03-18 18:17:56 -04:00
renovate[bot] 5647665782 Update dependency com.google.oauth-client:google-oauth-client to v1.39.0 (#1410)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-18 18:16:40 -04:00
Jobobby04 df99e7ee49 SpotlessApply 2025-03-18 18:04:23 -04:00
cfouche dbd4437474 Update base URL and host for Pururin to pururin.me (#1415) 2025-03-18 17:43:03 -04:00
AntsyLich 9c198d0c33 Seperate mark duplicate read chapters as read behaviors as options (#1870)
(cherry picked from commit 8a3b6107755c768924a31c2b58d705296133839c)

# Conflicts:
#	CHANGELOG.md
#	app/src/main/java/eu/kanade/domain/chapter/interactor/SyncChaptersWithSource.kt
#	app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsLibraryScreen.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt
2025-03-18 17:37:58 -04:00
AntsyLich d62a8a138c Add back option to hide unread chapter badge in library (#1871)
(cherry picked from commit ac432e2e941f4689caad246bab6aa7d303c83bfa)

# Conflicts:
#	CHANGELOG.md
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt
2025-03-18 17:31:02 -04:00
Cuong-Tran f8a57ec98c Add back build tools version to sign-android-release (#1842)
(cherry picked from commit 7028b8673a6b78dc6ccc19f5b3242bf1b37ca908)
2025-03-18 17:29:07 -04:00
Mend Renovate aa6339df06 Update dependency org.jsoup:jsoup to v1.19.1 (#1822)
(cherry picked from commit 2dc8cf000b871b8ffe07016d76a4bc7114d6ea49)
2025-03-18 17:28:57 -04:00
Mend Renovate 3fbbfbd9cb Update dependency androidx.compose:compose-bom to v2025.03.00 (#1857)
(cherry picked from commit f76a3ad15ad3954c512c20d99337a207f2e2d37a)
2025-03-18 17:28:49 -04:00
AntsyLich 31d6bf1967 Remove closed issue/pr auto lock workflow [skip ci]
(cherry picked from commit f33aa1ac9223393d0921df2902e4b59589ab7d2d)

# Conflicts:
#	.github/workflows/lock.yml
2025-03-18 17:28:41 -04:00
MajorTanya 226b3f2ff4 Add app ID to debug info (#1847)
This will avoid the need to know which forks has which version numbers
and avoid confusion in support.

(cherry picked from commit eddf07f9ac31bab57d06515e42df9c854bc50eed)

# Conflicts:
#	CHANGELOG.md
#	app/src/main/java/eu/kanade/tachiyomi/util/CrashLogUtil.kt
2025-03-18 17:27:55 -04:00
AntsyLich ac8dab75fe Make option to mark duplicate chapter as read apply when reading (#1839)
(cherry picked from commit 22b5fb58ff8e89635d646f8fa29256b53c41ffbf)

# Conflicts:
#	CHANGELOG.md
#	app/src/main/java/eu/kanade/domain/chapter/interactor/SyncChaptersWithSource.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt
2025-03-18 17:27:12 -04:00
AntsyLich aad2bf4645 Make more sliders discrete and ensure they don't look out of place (#1840)
Also cleanup the underlying code

(cherry picked from commit 4f06c1cc09d15245b26b8a862738cb6a859fedcc)

# Conflicts:
#	CHANGELOG.md
2025-03-18 17:24:05 -04:00
AntsyLich 7f71296e1c Change label of setting to always use SSIV in long strip reader (#1834)
(cherry picked from commit 85d168ed5e201134558cc843aba896306617c9ca)

# Conflicts:
#	CHANGELOG.md
2025-03-18 16:57:58 -04:00
AntsyLich 9137170fb8 Bump default user agent (#1833)
(cherry picked from commit d3691cc2563815490683cc69cbc3260e4561906c)

# Conflicts:
#	CHANGELOG.md
2025-03-18 16:57:37 -04:00
FlaminSarge 0af667c9aa Attempt to fix crash when migrating or removing entries from library (#1828)
Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com>
(cherry picked from commit 563bc02113a5ebc53650fdfdd13f408284a0cdc8)

# Conflicts:
#	CHANGELOG.md
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/MigrateDialog.kt
#	domain/src/main/java/tachiyomi/domain/manga/interactor/GetLibraryManga.kt
2025-03-18 16:57:00 -04:00
NarwhalHorns 8dc6a95ce6 Display staff information on Anilist tracker search results (#1810)
Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com>
(cherry picked from commit b702603965044cfe3ee852f8d0c970b6eb93b97a)

# Conflicts:
#	CHANGELOG.md
2025-03-18 16:55:40 -04:00
Roshan Varughese 1eb64d117e Fix an issue where tracker reading progress is changed to a lower value (#1795)
(cherry picked from commit 2e2f1ed82d63a93ebf87ee8494434c1bad2e268c)

# Conflicts:
#	CHANGELOG.md
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt
2025-03-18 16:55:21 -04:00
Mend Renovate 8f48a80bc4 Update dependency com.android.tools.build:gradle to v8.9.0 (#1824)
(cherry picked from commit b2765a00d285040531619a287d5144718959dd49)
2025-03-18 16:54:37 -04:00
NarwhalHorns e76dd7fab0 Update track search preview (#1825)
(cherry picked from commit 0e6d6c087e5a4d889b9153b390d8335d7add1e87)
2025-03-18 16:54:29 -04:00
Smol Ame b53a9ce5ae Tweak and adjust issue template (#1817)
Co-authored-by: BrutuZ <brutuz@users.noreply.github.com>
(cherry picked from commit 4f7122d6f09f87930ccd7dae7c557f4b236bbc4b)
2025-03-18 16:54:22 -04:00
Mend Renovate 952f26929c Update dependency io.mockk:mockk to v1.13.17 (#1786)
(cherry picked from commit b763d3e2c24caac6898981395aece2984b3e03a3)
2025-03-18 16:54:12 -04:00
67 changed files with 1227 additions and 253 deletions
+3
View File
@@ -1,5 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: ❌ Help with Extensions
url: https://mihon.app/docs/faq/browse/extensions
about: For extension-related questions/issues
- name: 🖥️ Mihon website
url: https://mihon.app/
about: Guides, troubleshooting, and answers to common questions
+3 -3
View File
@@ -53,7 +53,7 @@ body:
label: TachiyomiSY version
description: You can find your TachiyomiSY version in **More → About**.
placeholder: |
Example: "1.11.0"
Example: "1.12.0"
validations:
required: true
@@ -96,9 +96,9 @@ body:
required: true
- label: I have gone through the [FAQ](https://mihon.app/docs/faq/general) and [troubleshooting guide](https://mihon.app/docs/guides/troubleshooting/).
required: true
- label: I have updated the app to version **[1.11.0](https://github.com/jobobby04/tachiyomisy/releases/latest)**.
- label: I have updated the app to version **[1.12.0](https://github.com/jobobby04/tachiyomisy/releases/latest)**.
required: true
- label: I have filled out all of the requested information in this form, including specific version numbers.
required: true
- label: I understand that extensions are unaffiliated to Mihon, and will not receive any help for any source and/or extension-related issues.
- label: I understand that **Mihon does not have or fix any extensions**, and I **will not receive help** for any issues related to sources or extensions.
required: true
+1 -1
View File
@@ -31,7 +31,7 @@ body:
required: true
- label: I have written a short but informative title.
required: true
- label: I have updated the app to version **[1.11.0](https://github.com/jobobby04/tachiyomisy/releases/latest)**.
- label: I have updated the app to version **[1.12.0](https://github.com/jobobby04/tachiyomisy/releases/latest)**.
required: true
- label: I will fill out all of the requested information in this form.
required: true
+2
View File
@@ -63,6 +63,8 @@ jobs:
alias: ${{ secrets.ALIAS }}
keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }}
keyPassword: ${{ secrets.KEY_PASSWORD }}
env:
BUILD_TOOLS_VERSION: '35.0.1'
- name: Clean up build artifacts
run: |
-19
View File
@@ -1,19 +0,0 @@
name: Lock threads
on:
# Daily
schedule:
- cron: '0 0 * * *'
# Manual trigger
workflow_dispatch:
inputs:
jobs:
lock:
runs-on: ubuntu-latest
steps:
- uses: dessant/lock-threads@v5
with:
github-token: ${{ github.token }}
issue-inactive-days: '2'
pr-inactive-days: '2'
+5 -2
View File
@@ -31,8 +31,8 @@ android {
defaultConfig {
applicationId = "eu.kanade.tachiyomi.sy"
versionCode = 72
versionName = "1.11.0"
versionCode = 73
versionName = "1.12.0"
buildConfigField("String", "COMMIT_COUNT", "\"${getCommitCount()}\"")
buildConfigField("String", "COMMIT_SHA", "\"${getGitSha()}\"")
@@ -307,6 +307,9 @@ dependencies {
// Koin
implementation(sylibs.koin.core)
implementation(sylibs.koin.android)
// ZXing Android Embedded
implementation(sylibs.zxing.android.embedded)
}
androidComponents {
+5 -1
View File
@@ -359,7 +359,7 @@
<data android:scheme="https" />
<data android:scheme="http" />
<data android:host="pururin.io" />
<data android:host="pururin.me" />
<data android:pathPattern="/gallery/..*" />
</intent-filter>
@@ -413,6 +413,10 @@
android:scheme="tachiyomisy" />
</intent-filter>
</activity>
<activity
android:name="com.journeyapps.barcodescanner.CaptureActivity"
tools:remove="screenOrientation" />
</application>
<uses-sdk tools:overrideLibrary="rikka.shizuku.api"
@@ -173,7 +173,8 @@ class SyncChaptersWithSource(
val deletedChapterNumberDateFetchMap = removedChapters.sortedByDescending { it.dateFetch }
.associate { it.chapterNumber to it.dateFetch }
val markDuplicateAsRead = libraryPreferences.markDuplicateChapterRead().get()
val markDuplicateAsRead = libraryPreferences.markDuplicateReadChapterAsRead().get()
.contains(LibraryPreferences.MARK_DUPLICATE_CHAPTER_READ_NEW)
// Date fetch is set in such a way that the upper ones will have bigger value than the lower ones
// Sources MUST return the chapters from most to less recent, which is common.
@@ -310,9 +310,9 @@ private fun ColumnScope.DisplayPage(
val columns by columnPreference.collectAsState()
SliderItem(
label = stringResource(MR.strings.pref_library_columns),
max = 10,
value = columns,
valueRange = 0..10,
label = stringResource(MR.strings.pref_library_columns),
valueText = if (columns > 0) {
columns.toString()
} else {
@@ -328,6 +328,10 @@ private fun ColumnScope.DisplayPage(
label = stringResource(MR.strings.action_display_download_badge),
pref = screenModel.libraryPreferences.downloadBadge(),
)
CheckboxItem(
label = stringResource(MR.strings.action_display_unread_badge),
pref = screenModel.libraryPreferences.unreadBadge(),
)
CheckboxItem(
label = stringResource(MR.strings.action_display_local_badge),
pref = screenModel.libraryPreferences.localBadge(),
@@ -1,5 +1,6 @@
package eu.kanade.presentation.more.settings
import androidx.annotation.IntRange
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.graphics.vector.ImageVector
@@ -53,10 +54,9 @@ sealed class Preference {
*/
data class SliderPreference(
val value: Int,
val max: Int,
val min: Int = 0,
val steps: Int = 0,
override val title: String,
val valueRange: IntProgression = 0..1,
@IntRange(from = 0) val steps: Int = with(valueRange) { (last - first) - 1 },
override val subtitle: String? = null,
override val enabled: Boolean = true,
override val onValueChanged: suspend (value: Int) -> Boolean = { true },
@@ -5,6 +5,7 @@ import androidx.compose.animation.expandVertically
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.animation.shrinkVertically
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
@@ -13,16 +14,20 @@ import androidx.compose.runtime.compositionLocalOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.structuralEqualityPolicy
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import eu.kanade.presentation.more.settings.widget.EditTextPreferenceWidget
import eu.kanade.presentation.more.settings.widget.InfoWidget
import eu.kanade.presentation.more.settings.widget.ListPreferenceWidget
import eu.kanade.presentation.more.settings.widget.MultiSelectListPreferenceWidget
import eu.kanade.presentation.more.settings.widget.PrefsHorizontalPadding
import eu.kanade.presentation.more.settings.widget.PrefsVerticalPadding
import eu.kanade.presentation.more.settings.widget.SwitchPreferenceWidget
import eu.kanade.presentation.more.settings.widget.TextPreferenceWidget
import eu.kanade.presentation.more.settings.widget.TitleFontSize
import eu.kanade.presentation.more.settings.widget.TrackingPreferenceWidget
import kotlinx.coroutines.launch
import tachiyomi.presentation.core.components.SliderItem
import tachiyomi.presentation.core.components.BaseSliderItem
import tachiyomi.presentation.core.util.collectAsState
val LocalPreferenceHighlighted = compositionLocalOf(structuralEqualityPolicy()) { false }
@@ -77,19 +82,22 @@ internal fun PreferenceItem(
)
}
is Preference.PreferenceItem.SliderPreference -> {
SliderItem(
BaseSliderItem(
label = item.title,
min = item.min,
max = item.max,
steps = item.steps,
value = item.value,
valueRange = item.valueRange,
valueText = item.subtitle.takeUnless { it.isNullOrEmpty() } ?: item.value.toString(),
steps = item.steps,
labelStyle = MaterialTheme.typography.titleLarge.copy(fontSize = TitleFontSize),
onChange = {
scope.launch {
item.onValueChanged(it)
}
},
labelStyle = MaterialTheme.typography.titleLarge,
modifier = Modifier.padding(
horizontal = PrefsHorizontalPadding,
vertical = PrefsVerticalPadding,
),
)
}
is Preference.PreferenceItem.ListPreference<*> -> {
@@ -393,7 +393,7 @@ object SettingsAdvancedScreen : SearchableSettings {
),
Preference.PreferenceItem.SwitchPreference(
preference = basePreferences.alwaysDecodeLongStripWithSSIV(),
title = stringResource(MR.strings.pref_always_decode_long_strip_with_ssiv),
title = stringResource(MR.strings.pref_always_decode_long_strip_with_ssiv_2),
subtitle = stringResource(MR.strings.pref_always_decode_long_strip_with_ssiv_summary),
),
Preference.PreferenceItem.TextPreference(
@@ -189,8 +189,7 @@ object SettingsAppearanceScreen : SearchableSettings {
} else {
stringResource(MR.strings.disabled)
},
min = 0,
max = 10,
valueRange = 0..10,
onValueChanged = {
uiPreferences.previewsRowCount().set(it)
true
@@ -17,6 +17,7 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.outlined.HelpOutline
import androidx.compose.material.icons.filled.QrCodeScanner
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Checkbox
import androidx.compose.material3.Icon
@@ -42,7 +43,10 @@ import androidx.compose.ui.platform.LocalUriHandler
import androidx.core.net.toUri
import cafe.adriel.voyager.navigator.LocalNavigator
import cafe.adriel.voyager.navigator.currentOrThrow
import com.google.zxing.client.android.Intents
import com.hippo.unifile.UniFile
import com.journeyapps.barcodescanner.ScanContract
import com.journeyapps.barcodescanner.ScanOptions
import eu.kanade.domain.sync.SyncPreferences
import eu.kanade.presentation.more.settings.Preference
import eu.kanade.presentation.more.settings.screen.data.CreateBackupScreen
@@ -51,7 +55,9 @@ import eu.kanade.presentation.more.settings.screen.data.StorageInfo
import eu.kanade.presentation.more.settings.screen.data.SyncSettingsSelector
import eu.kanade.presentation.more.settings.screen.data.SyncTriggerOptionsScreen
import eu.kanade.presentation.more.settings.widget.BasePreferenceWidget
import eu.kanade.presentation.more.settings.widget.EditTextPreferenceWidget
import eu.kanade.presentation.more.settings.widget.PrefsHorizontalPadding
import eu.kanade.presentation.more.settings.widget.TrailingWidgetBuffer
import eu.kanade.presentation.util.relativeTimeSpanString
import eu.kanade.tachiyomi.data.backup.create.BackupCreateJob
import eu.kanade.tachiyomi.data.backup.restore.BackupRestoreJob
@@ -82,7 +88,6 @@ import tachiyomi.domain.manga.model.Manga
import tachiyomi.domain.storage.service.StoragePreferences
import tachiyomi.i18n.MR
import tachiyomi.i18n.sy.SYMR
import tachiyomi.presentation.core.components.material.TextButton
import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.util.collectAsState
import uy.kohesive.injekt.Injekt
@@ -504,7 +509,7 @@ object SettingsDataScreen : SearchableSettings {
)
}
//SY -->
// SY -->
@Composable
private fun getSyncPreferences(syncPreferences: SyncPreferences, syncService: Int): List<Preference> {
return listOf(
@@ -652,6 +657,22 @@ object SettingsDataScreen : SearchableSettings {
@Composable
private fun getSelfHostPreferences(syncPreferences: SyncPreferences): List<Preference> {
val scope = rememberCoroutineScope()
val qrScanLauncher = rememberLauncherForActivityResult(ScanContract()) {
if (it.contents != null && it.contents.isNotEmpty()) {
syncPreferences.clientAPIKey().set(it.contents)
}
}
val context = LocalContext.current
val scanOptions = remember {
ScanOptions().apply {
setDesiredBarcodeFormats(ScanOptions.QR_CODE)
setOrientationLocked(false)
setPrompt(SYMR.strings.scan_qr_code.getString(context))
addExtra(Intents.Scan.SCAN_TYPE, Intents.Scan.MIXED_SCAN)
}
}
return listOf(
Preference.PreferenceItem.EditTextPreference(
title = stringResource(SYMR.strings.pref_sync_host),
@@ -667,11 +688,32 @@ object SettingsDataScreen : SearchableSettings {
true
},
),
Preference.PreferenceItem.EditTextPreference(
Preference.PreferenceItem.CustomPreference(
title = stringResource(SYMR.strings.pref_sync_api_key),
subtitle = stringResource(SYMR.strings.pref_sync_api_key_summ),
preference = syncPreferences.clientAPIKey(),
),
) {
val values by syncPreferences.clientAPIKey().collectAsState()
EditTextPreferenceWidget(
title = stringResource(SYMR.strings.pref_sync_api_key),
subtitle = stringResource(SYMR.strings.pref_sync_api_key_summ),
onConfirm = {
syncPreferences.clientAPIKey().set(it)
true
},
icon = null,
value = values,
widget = {
IconButton(
onClick = { qrScanLauncher.launch(scanOptions) },
modifier = Modifier.padding(start = TrailingWidgetBuffer),
) {
Icon(
Icons.Filled.QrCodeScanner,
contentDescription = stringResource(SYMR.strings.scan_qr_code),
)
}
},
)
},
)
}
@@ -38,6 +38,8 @@ import tachiyomi.domain.library.service.LibraryPreferences.Companion.MANGA_HAS_U
import tachiyomi.domain.library.service.LibraryPreferences.Companion.MANGA_NON_COMPLETED
import tachiyomi.domain.library.service.LibraryPreferences.Companion.MANGA_NON_READ
import tachiyomi.domain.library.service.LibraryPreferences.Companion.MANGA_OUTSIDE_RELEASE_PERIOD
import tachiyomi.domain.library.service.LibraryPreferences.Companion.MARK_DUPLICATE_CHAPTER_READ_EXISTING
import tachiyomi.domain.library.service.LibraryPreferences.Companion.MARK_DUPLICATE_CHAPTER_READ_NEW
import tachiyomi.i18n.MR
import tachiyomi.i18n.sy.SYMR
import tachiyomi.presentation.core.i18n.pluralStringResource
@@ -64,7 +66,7 @@ object SettingsLibraryScreen : SearchableSettings {
return listOf(
getCategoriesGroup(LocalNavigator.currentOrThrow, allCategories, libraryPreferences),
getGlobalUpdateGroup(allCategories, libraryPreferences),
getChapterSwipeActionsGroup(libraryPreferences),
getBehaviorGroup(libraryPreferences),
// SY -->
getSortingCategory(LocalNavigator.currentOrThrow, libraryPreferences),
getMigrationCategory(unsortedPreferences),
@@ -228,20 +230,16 @@ object SettingsLibraryScreen : SearchableSettings {
preference = libraryPreferences.newShowUpdatesCount(),
title = stringResource(MR.strings.pref_library_update_show_tab_badge),
),
Preference.PreferenceItem.SwitchPreference(
preference = libraryPreferences.markDuplicateChapterRead(),
title = stringResource(MR.strings.pref_mark_duplicate_chapter_read),
),
),
)
}
@Composable
private fun getChapterSwipeActionsGroup(
private fun getBehaviorGroup(
libraryPreferences: LibraryPreferences,
): Preference.PreferenceGroup {
return Preference.PreferenceGroup(
title = stringResource(MR.strings.pref_chapter_swipe),
title = stringResource(MR.strings.pref_behavior),
preferenceItems = persistentListOf(
Preference.PreferenceItem.ListPreference(
preference = libraryPreferences.swipeToStartAction(),
@@ -271,6 +269,16 @@ object SettingsLibraryScreen : SearchableSettings {
),
title = stringResource(MR.strings.pref_chapter_swipe_end),
),
Preference.PreferenceItem.MultiSelectListPreference(
preference = libraryPreferences.markDuplicateReadChapterAsRead(),
entries = persistentMapOf(
MARK_DUPLICATE_CHAPTER_READ_EXISTING to
stringResource(MR.strings.pref_mark_duplicate_read_chapter_read_existing),
MARK_DUPLICATE_CHAPTER_READ_NEW to
stringResource(MR.strings.pref_mark_duplicate_read_chapter_read_new),
),
title = stringResource(MR.strings.pref_mark_duplicate_read_chapter_read),
),
),
)
}
@@ -175,9 +175,7 @@ object SettingsReaderScreen : SearchableSettings {
),
Preference.PreferenceItem.SliderPreference(
value = flashMillis / ReaderPreferences.MILLI_CONVERSION,
max = 15,
min = 1,
steps = 13,
valueRange = 1..15,
title = stringResource(MR.strings.pref_flash_duration),
subtitle = stringResource(MR.strings.pref_flash_duration_summary, flashMillis),
enabled = flashPageState,
@@ -188,9 +186,7 @@ object SettingsReaderScreen : SearchableSettings {
),
Preference.PreferenceItem.SliderPreference(
value = flashInterval,
max = 10,
min = 1,
steps = 8,
valueRange = 1..10,
title = stringResource(MR.strings.pref_flash_page_interval),
subtitle = pluralStringResource(MR.plurals.pref_pages, flashInterval, flashInterval),
enabled = flashPageState,
@@ -389,8 +385,9 @@ object SettingsReaderScreen : SearchableSettings {
),
Preference.PreferenceItem.SliderPreference(
value = webtoonSidePadding,
max = ReaderPreferences.WEBTOON_PADDING_MAX,
min = ReaderPreferences.WEBTOON_PADDING_MIN,
valueRange = ReaderPreferences.let {
it.WEBTOON_PADDING_MIN..it.WEBTOON_PADDING_MAX
},
title = stringResource(MR.strings.pref_webtoon_side_padding),
subtitle = numberFormat.format(webtoonSidePadding / 100f),
onValueChanged = {
@@ -31,6 +31,7 @@ fun EditTextPreferenceWidget(
subtitle: String?,
icon: ImageVector?,
value: String,
widget: @Composable (() -> Unit)? = null,
onConfirm: suspend (String) -> Boolean,
) {
var isDialogShown by remember { mutableStateOf(false) }
@@ -39,6 +40,7 @@ fun EditTextPreferenceWidget(
title = title,
subtitle = subtitle?.format(value),
icon = icon,
widget = widget,
onPreferenceClick = { isDialogShown = true },
)
@@ -37,11 +37,10 @@ internal fun ColumnScope.ColorFilterPage(screenModel: ReaderSettingsScreenModel)
if (customBrightness) {
val customBrightnessValue by screenModel.preferences.customBrightnessValue().collectAsState()
SliderItem(
label = stringResource(MR.strings.pref_custom_brightness),
min = -75,
max = 100,
value = customBrightnessValue,
valueText = customBrightnessValue.toString(),
valueRange = -75..100,
steps = 0,
label = stringResource(MR.strings.pref_custom_brightness),
onChange = { screenModel.preferences.customBrightnessValue().set(it) },
pillColor = MaterialTheme.colorScheme.surfaceContainerHighest,
)
@@ -55,10 +54,10 @@ internal fun ColumnScope.ColorFilterPage(screenModel: ReaderSettingsScreenModel)
if (colorFilter) {
val colorFilterValue by screenModel.preferences.colorFilterValue().collectAsState()
SliderItem(
label = stringResource(MR.strings.color_filter_r_value),
max = 255,
value = colorFilterValue.red,
valueText = colorFilterValue.red.toString(),
valueRange = 0..255,
steps = 0,
label = stringResource(MR.strings.color_filter_r_value),
onChange = { newRValue ->
screenModel.preferences.colorFilterValue().getAndSet {
getColorValue(it, newRValue, RED_MASK, 16)
@@ -67,10 +66,10 @@ internal fun ColumnScope.ColorFilterPage(screenModel: ReaderSettingsScreenModel)
pillColor = MaterialTheme.colorScheme.surfaceContainerHighest,
)
SliderItem(
label = stringResource(MR.strings.color_filter_g_value),
max = 255,
value = colorFilterValue.green,
valueText = colorFilterValue.green.toString(),
valueRange = 0..255,
steps = 0,
label = stringResource(MR.strings.color_filter_g_value),
onChange = { newGValue ->
screenModel.preferences.colorFilterValue().getAndSet {
getColorValue(it, newGValue, GREEN_MASK, 8)
@@ -79,10 +78,10 @@ internal fun ColumnScope.ColorFilterPage(screenModel: ReaderSettingsScreenModel)
pillColor = MaterialTheme.colorScheme.surfaceContainerHighest,
)
SliderItem(
label = stringResource(MR.strings.color_filter_b_value),
max = 255,
value = colorFilterValue.blue,
valueText = colorFilterValue.blue.toString(),
valueRange = 0..255,
steps = 0,
label = stringResource(MR.strings.color_filter_b_value),
onChange = { newBValue ->
screenModel.preferences.colorFilterValue().getAndSet {
getColorValue(it, newBValue, BLUE_MASK, 0)
@@ -91,10 +90,10 @@ internal fun ColumnScope.ColorFilterPage(screenModel: ReaderSettingsScreenModel)
pillColor = MaterialTheme.colorScheme.surfaceContainerHighest,
)
SliderItem(
label = stringResource(MR.strings.color_filter_a_value),
max = 255,
value = colorFilterValue.alpha,
valueText = colorFilterValue.alpha.toString(),
valueRange = 0..255,
steps = 0,
label = stringResource(MR.strings.color_filter_a_value),
onChange = { newAValue ->
screenModel.preferences.colorFilterValue().getAndSet {
getColorValue(it, newAValue, ALPHA_MASK, 24)
@@ -120,24 +120,20 @@ internal fun ColumnScope.GeneralPage(screenModel: ReaderSettingsScreenModel) {
if (flashPageState) {
SliderItem(
value = flashMillis / ReaderPreferences.MILLI_CONVERSION,
valueRange = 1..15,
label = stringResource(MR.strings.pref_flash_duration),
valueText = stringResource(MR.strings.pref_flash_duration_summary, flashMillis),
onChange = { flashMillisPref.set(it * ReaderPreferences.MILLI_CONVERSION) },
min = 1,
max = 15,
steps = 13,
pillColor = MaterialTheme.colorScheme.surfaceContainerHighest,
)
SliderItem(
value = flashInterval,
valueRange = 1..10,
label = stringResource(MR.strings.pref_flash_page_interval),
valueText = pluralStringResource(MR.plurals.pref_pages, flashInterval, flashInterval),
onChange = {
flashIntervalPref.set(it)
},
min = 1,
max = 10,
steps = 8,
pillColor = MaterialTheme.colorScheme.surfaceContainerHighest,
)
SettingsChipRow(MR.strings.pref_flash_with) {
@@ -193,10 +193,9 @@ private fun ColumnScope.WebtoonViewerSettings(screenModel: ReaderSettingsScreenM
val webtoonSidePadding by screenModel.preferences.webtoonSidePadding().collectAsState()
SliderItem(
label = stringResource(MR.strings.pref_webtoon_side_padding),
min = ReaderPreferences.WEBTOON_PADDING_MIN,
max = ReaderPreferences.WEBTOON_PADDING_MAX,
value = webtoonSidePadding,
valueRange = ReaderPreferences.let { it.WEBTOON_PADDING_MIN..it.WEBTOON_PADDING_MAX },
label = stringResource(MR.strings.pref_webtoon_side_padding),
valueText = numberFormat.format(webtoonSidePadding / 100f),
onChange = {
screenModel.preferences.webtoonSidePadding().set(it)
@@ -304,6 +304,15 @@ private fun SearchResultItem(
}
},
)
if (trackSearch.authors.isNotEmpty() || trackSearch.artists.isNotEmpty()) {
Text(
text = (trackSearch.authors + trackSearch.artists).distinct().joinToString(),
modifier = Modifier.secondaryItemAlpha(),
maxLines = 1,
overflow = TextOverflow.Ellipsis,
style = MaterialTheme.typography.bodySmall,
)
}
if (type.isNotBlank()) {
SearchResultItemDetails(
title = stringResource(MR.strings.track_type),
@@ -5,8 +5,11 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import androidx.compose.ui.tooling.preview.datasource.LoremIpsum
import eu.kanade.tachiyomi.data.track.model.TrackSearch
import java.text.SimpleDateFormat
import java.time.Instant
import java.time.temporal.ChronoUnit
import java.util.Date
import java.util.Locale
import kotlin.random.Random
internal class TrackerSearchPreviewProvider : PreviewParameterProvider<@Composable () -> Unit> {
@@ -73,6 +76,8 @@ internal class TrackerSearchPreviewProvider : PreviewParameterProvider<@Composab
}
}
private val formatter: SimpleDateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault())
private fun randTrackSearch() = TrackSearch().let {
it.id = Random.nextLong()
it.manga_id = Random.nextLong()
@@ -88,11 +93,17 @@ internal class TrackerSearchPreviewProvider : PreviewParameterProvider<@Composab
it.finished_reading_date = 0L
it.tracking_url = "https://example.com/tracker-example"
it.cover_url = "https://example.com/cover.png"
it.start_date = Instant.now().minus((1L..365).random(), ChronoUnit.DAYS).toString()
it.start_date = formatter.format(Date.from(Instant.now().minus((1L..365).random(), ChronoUnit.DAYS)))
it.summary = lorem((0..40).random()).joinToString()
it.publishing_status = if (Random.nextBoolean()) "Finished" else ""
it.publishing_type = if (Random.nextBoolean()) "Oneshot" else ""
it.artists = randomNames()
it.authors = randomNames()
it
}
private fun randomNames(): List<String> = (0..(0..3).random()).map { lorem((3..5).random()).joinToString() }
private fun lorem(words: Int): Sequence<String> =
LoremIpsum(words).values
}
@@ -27,6 +27,9 @@ interface Chapter : SChapter, Serializable {
var version: Long
}
val Chapter.isRecognizedNumber: Boolean
get() = chapter_number >= 0f
fun Chapter.toDomainChapter(): DomainChapter? {
if (id == null || manga_id == null) return null
return DomainChapter(
@@ -144,6 +144,19 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) {
|Page (perPage: 50) {
|media(search: ${'$'}query, type: MANGA, format_not_in: [NOVEL]) {
|id
|staff {
|edges {
|role
|id
|node {
|name {
|full
|userPreferred
|native
|}
|}
|}
|}
|title {
|userPreferred
|}
@@ -224,6 +237,19 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) {
|month
|day
|}
|staff {
|edges {
|role
|id
|node {
|name {
|full
|userPreferred
|native
|}
|}
|}
|}
|}
|}
|}
@@ -19,6 +19,7 @@ data class ALManga(
val startDateFuzzy: Long,
val totalChapters: Long,
val averageScore: Int,
val staff: ALStaff,
) {
fun toTrack() = TrackSearch.create(TrackerManager.ANILIST).apply {
remote_id = remoteId
@@ -38,6 +39,11 @@ data class ALManga(
""
}
}
staff.edges.forEach {
val name = it.node.name() ?: return@forEach
if ("Story" in it.role) authors += name
if ("Art" in it.role) artists += name
}
}
}
@@ -17,24 +17,8 @@ data class ALMangaMetadataData(
@Serializable
data class ALMangaMetadataMedia(
val id: Long,
val title: ALItemTitle,
val title: ALStaffName,
val coverImage: ItemCover,
val description: String?,
val staff: ALStaff,
)
@Serializable
data class ALStaff(
val edges: List<ALStaffEdge>,
)
@Serializable
data class ALStaffEdge(
val role: String,
val node: ALStaffNode,
)
@Serializable
data class ALStaffNode(
val name: ALItemTitle,
)
@@ -13,6 +13,7 @@ data class ALSearchItem(
val startDate: ALFuzzyDate,
val chapters: Long?,
val averageScore: Int?,
val staff: ALStaff,
) {
fun toALManga(): ALManga = ALManga(
remoteId = id,
@@ -24,6 +25,7 @@ data class ALSearchItem(
startDateFuzzy = startDate.toEpochMilli(),
totalChapters = chapters ?: 0,
averageScore = averageScore ?: -1,
staff = staff,
)
}
@@ -36,3 +38,31 @@ data class ALItemTitle(
data class ItemCover(
val large: String,
)
@Serializable
data class ALStaff(
val edges: List<ALEdge>,
)
@Serializable
data class ALEdge(
val role: String,
val id: Int,
val node: ALStaffNode,
)
@Serializable
data class ALStaffNode(
val name: ALStaffName,
)
@Serializable
data class ALStaffName(
val userPreferred: String? = null,
val native: String? = null,
val full: String? = null,
) {
operator fun invoke(): String? {
return userPreferred ?: full ?: native
}
}
@@ -34,6 +34,10 @@ class TrackSearch : Track {
override lateinit var tracking_url: String
var authors: List<String> = emptyList()
var artists: List<String> = emptyList()
var cover_url: String = ""
var summary: String = ""
@@ -199,7 +199,7 @@ class NHentai(delegate: HttpSource, val context: Context) :
private fun thumbnailUrlFromType(mediaId: String, page: Int, t: String) =
NHentaiSearchMetadata.typeToExtension(t)?.let {
"https://t3.nhentai.net/galleries/$mediaId/${page}t.$it"
"https://t1.nhentai.net/galleries/$mediaId/${page}t.$it"
}
override suspend fun fetchPreviewImage(page: PagePreviewInfo, cacheControl: CacheControl?): Response {
@@ -126,8 +126,7 @@ class Pururin(delegate: HttpSource, val context: Context) :
}
override val matchingHosts = listOf(
"pururin.io",
"www.pururin.io",
"pururin.me",
)
override suspend fun mapUrlToMangaUrl(uri: Uri): String {
@@ -497,6 +497,7 @@ class LibraryScreenModel(
private fun getLibraryItemPreferencesFlow(): Flow<ItemPreferences> {
return combine(
libraryPreferences.downloadBadge().changes(),
libraryPreferences.unreadBadge().changes(),
libraryPreferences.localBadge().changes(),
libraryPreferences.languageBadge().changes(),
libraryPreferences.autoUpdateMangaRestrictions().changes(),
@@ -514,18 +515,19 @@ class LibraryScreenModel(
) {
ItemPreferences(
downloadBadge = it[0] as Boolean,
localBadge = it[1] as Boolean,
languageBadge = it[2] as Boolean,
skipOutsideReleasePeriod = LibraryPreferences.MANGA_OUTSIDE_RELEASE_PERIOD in (it[3] as Set<*>),
globalFilterDownloaded = it[4] as Boolean,
filterDownloaded = it[5] as TriState,
filterUnread = it[6] as TriState,
filterStarted = it[7] as TriState,
filterBookmarked = it[8] as TriState,
filterCompleted = it[9] as TriState,
filterIntervalCustom = it[10] as TriState,
unreadBadge = it[1] as Boolean,
localBadge = it[2] as Boolean,
languageBadge = it[3] as Boolean,
skipOutsideReleasePeriod = LibraryPreferences.MANGA_OUTSIDE_RELEASE_PERIOD in (it[4] as Set<*>),
globalFilterDownloaded = it[5] as Boolean,
filterDownloaded = it[6] as TriState,
filterUnread = it[7] as TriState,
filterStarted = it[8] as TriState,
filterBookmarked = it[9] as TriState,
filterCompleted = it[10] as TriState,
filterIntervalCustom = it[11] as TriState,
// SY -->
filterLewd = it[11] as TriState,
filterLewd = it[12] as TriState,
// SY <--
)
}
@@ -558,7 +560,7 @@ class LibraryScreenModel(
} else {
0
},
unreadCount = libraryManga.unreadCount,
unreadCount = if (prefs.unreadBadge) libraryManga.unreadCount else 0,
isLocal = if (prefs.localBadge) libraryManga.manga.isLocal() else false,
sourceLanguage = if (prefs.languageBadge) {
sourceManager.getOrStub(libraryManga.manga.source).lang
@@ -1363,6 +1365,7 @@ class LibraryScreenModel(
@Immutable
private data class ItemPreferences(
val downloadBadge: Boolean,
val unreadBadge: Boolean,
val localBadge: Boolean,
val languageBadge: Boolean,
val skipOutsideReleasePeriod: Boolean,
@@ -28,6 +28,7 @@ import eu.kanade.domain.manga.model.downloadedFilter
import eu.kanade.domain.manga.model.toSManga
import eu.kanade.domain.source.service.SourcePreferences
import eu.kanade.domain.track.interactor.AddTracks
import eu.kanade.domain.track.interactor.RefreshTracks
import eu.kanade.domain.track.interactor.TrackChapter
import eu.kanade.domain.track.model.AutoTrackState
import eu.kanade.domain.track.model.toDomainTrack
@@ -139,6 +140,8 @@ import tachiyomi.source.local.isLocal
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import uy.kohesive.injekt.injectLazy
import kotlin.collections.filter
import kotlin.collections.forEach
import kotlin.math.floor
class MangaScreenModel(
@@ -1274,6 +1277,8 @@ class MangaScreenModel(
return@launchIO
}
refreshTrackers()
val tracks = getTracks.await(mangaId)
val maxChapterNumber = chapters.maxOf { it.chapterNumber }
val shouldPromptTrackingUpdate = tracks.any { track -> maxChapterNumber > track.lastChapterRead }
@@ -1300,6 +1305,27 @@ class MangaScreenModel(
}
}
private suspend fun refreshTrackers(
refreshTracks: RefreshTracks = Injekt.get(),
) {
refreshTracks.await(mangaId)
.filter { it.first != null }
.forEach { (track, e) ->
logcat(LogPriority.ERROR, e) {
"Failed to refresh track data mangaId=$mangaId for service ${track!!.id}"
}
withUIContext {
context.toast(
context.stringResource(
MR.strings.track_error,
track!!.name,
e.message ?: "",
),
)
}
}
}
/**
* Downloads the given list of chapters with the manager.
* @param chapters the list of chapters to download.
@@ -19,6 +19,7 @@ import eu.kanade.domain.sync.SyncPreferences
import eu.kanade.domain.track.interactor.TrackChapter
import eu.kanade.domain.track.service.TrackPreferences
import eu.kanade.domain.ui.UiPreferences
import eu.kanade.tachiyomi.data.database.models.isRecognizedNumber
import eu.kanade.tachiyomi.data.database.models.toDomainChapter
import eu.kanade.tachiyomi.data.download.DownloadManager
import eu.kanade.tachiyomi.data.download.DownloadProvider
@@ -94,6 +95,7 @@ import tachiyomi.domain.download.service.DownloadPreferences
import tachiyomi.domain.history.interactor.GetNextChapters
import tachiyomi.domain.history.interactor.UpsertHistory
import tachiyomi.domain.history.model.HistoryUpdate
import tachiyomi.domain.library.service.LibraryPreferences
import tachiyomi.domain.manga.interactor.GetFlatMetadataById
import tachiyomi.domain.manga.interactor.GetManga
import tachiyomi.domain.manga.interactor.GetMergedMangaById
@@ -128,6 +130,7 @@ class ReaderViewModel @JvmOverloads constructor(
private val updateChapter: UpdateChapter = Injekt.get(),
private val setMangaViewerFlags: SetMangaViewerFlags = Injekt.get(),
private val getIncognitoState: GetIncognitoState = Injekt.get(),
private val libraryPreferences: LibraryPreferences = Injekt.get(),
// SY -->
private val syncPreferences: SyncPreferences = Injekt.get(),
private val uiPreferences: UiPreferences = Injekt.get(),
@@ -699,39 +702,7 @@ class ReaderViewModel @JvmOverloads constructor(
(hasExtraPage && readerChapter.pages?.lastIndex?.minus(1) == page.index)
) {
// SY <--
readerChapter.chapter.read = true
// SY -->
if (readerChapter.chapter.chapter_number >= 0 && readerPreferences.markReadDupe().get()) {
getChaptersByMangaId.await(manga!!.id).sortedByDescending { it.sourceOrder }
.filter {
it.id != readerChapter.chapter.id &&
!it.read &&
it.chapterNumber.toFloat() == readerChapter.chapter.chapter_number
}
.ifEmpty { null }
?.also {
setReadStatus.await(true, *it.toTypedArray())
it.forEach { chapter ->
deleteChapterIfNeeded(ReaderChapter(chapter))
}
}
}
if (manga?.isEhBasedManga() == true) {
viewModelScope.launchNonCancellable {
val chapterUpdates = chapterList
.filter { it.chapter.source_order > readerChapter.chapter.source_order }
.map { chapter ->
ChapterUpdate(
id = chapter.chapter.id!!,
read = true,
)
}
updateChapter.awaitAll(chapterUpdates)
}
}
// SY <--
updateTrackChapterRead(readerChapter)
deleteChapterIfNeeded(readerChapter)
updateChapterProgressOnComplete(readerChapter)
// Check if syncing is enabled for chapter read:
if (isSyncEnabled && syncTriggerOpt.syncOnChapterRead) {
@@ -747,13 +718,59 @@ class ReaderViewModel @JvmOverloads constructor(
),
)
// SY -->
// Check if syncing is enabled for chapter open:
if (isSyncEnabled && syncTriggerOpt.syncOnChapterOpen && readerChapter.chapter.last_page_read == 0) {
SyncDataJob.startNow(Injekt.get<Application>())
}
// SY <--
}
}
private suspend fun updateChapterProgressOnComplete(readerChapter: ReaderChapter) {
readerChapter.chapter.read = true
// SY -->
if (manga?.isEhBasedManga() == true) {
viewModelScope.launchNonCancellable {
val chapterUpdates = chapterList
.filter { it.chapter.source_order > readerChapter.chapter.source_order }
.map { chapter ->
ChapterUpdate(
id = chapter.chapter.id!!,
read = true,
)
}
updateChapter.awaitAll(chapterUpdates)
}
}
// SY <--
updateTrackChapterRead(readerChapter)
deleteChapterIfNeeded(readerChapter)
val markDuplicateAsRead = libraryPreferences.markDuplicateReadChapterAsRead().get()
.contains(LibraryPreferences.MARK_DUPLICATE_CHAPTER_READ_EXISTING)
if (!markDuplicateAsRead) return
val duplicateUnreadChapters = chapterList
.mapNotNull {
val chapter = it.chapter
if (
!chapter.read &&
chapter.isRecognizedNumber &&
chapter.chapter_number == readerChapter.chapter.chapter_number
) {
ChapterUpdate(id = chapter.id!!, read = true)
// SY -->
.also { deleteChapterIfNeeded(ReaderChapter(chapter)) }
// SY <--
} else {
null
}
}
updateChapter.awaitAll(duplicateUnreadChapters)
}
fun restartReadTimer() {
chapterReadStartTime = Instant.now().toEpochMilli()
}
@@ -41,6 +41,7 @@ class CrashLogUtil(
fun getDebugInfo(): String {
return """
App ID: ${BuildConfig.APPLICATION_ID}
App version: ${BuildConfig.VERSION_NAME} (${BuildConfig.FLAVOR}, ${BuildConfig.COMMIT_SHA}, ${BuildConfig.VERSION_CODE}, ${BuildConfig.BUILD_TIME})
Preview build: $syDebugVersion
Android version: ${Build.VERSION.RELEASE} (SDK ${Build.VERSION.SDK_INT}; build ${Build.DISPLAY})
@@ -1,5 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<changelog bulletedList="true">
<changelogversion versionName="1.12.0" changeDate="May 11,2025">
<changelogtext>[b]Based on Mihon stable 0.18.0(from 0.17.0)[/b]</changelogtext>
<changelogtext>Use Complete Category for sync completion(Thanks @lord-ne)</changelogtext>
<changelogtext>Maintain sort order when receiving chapters from sync (Thanks @Lolle2000la)</changelogtext>
<changelogtext>Don't sync when not connected to a network (Thanks @NGB-Was-Taken)</changelogtext>
<changelogtext>Add QR code scan button for sync API key (Thanks @65-7a)</changelogtext>
<changelogtext>Update NHentai Subdomain for cdn (Thanks @BrutuZ)</changelogtext>
<changelogtext>Use the NHentai t1 cdn subdomain (Thanks @cfouche3005)</changelogtext>
<changelogtext>Fix crash with migration list screen going into the background</changelogtext>
<changelogtext>Improve recommendation screens for multi-recommendations (Thanks @timschneeb)</changelogtext>
<changelogtext>Add global search shortcut to SmartSearch for merge (Thanks @timschneeb)</changelogtext>
<changelogtext>Add notifications to the gallery updater</changelogtext>
<changelogtext>Fix the gallery updater never updating in the background</changelogtext>
<changelogtext>Update E-Hentai tags list</changelogtext>
<changelogtext>Populate Author field and clear Description on a couple sources (Thanks @BrutuZ)</changelogtext>
<changelogtext>Use Mangadex tracker links to associate mangas automatically with trackers (Thanks @timschneeb)</changelogtext>
<changelogtext>Fix Mangadex alt title being removed by cleanDescription (Thanks @spicemace)</changelogtext>
</changelogversion>
<changelogversion versionName="1.11.0" changeDate="Oct 27,2024">
<changelogtext>[b]Based on Mihon stable 0.17.0(from 0.16.4)[/b]</changelogtext>
<changelogtext>[b]Add Cross-Device Sync (Thanks @kaiserbh)[/b]</changelogtext>
@@ -19,7 +19,7 @@ class NetworkPreferences(
fun defaultUserAgent(): Preference<String> {
return preferenceStore.getString(
"default_user_agent",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:132.0) Gecko/20100101 Firefox/132.0",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:136.0) Gecko/20100101 Firefox/136.0",
)
}
}
@@ -60,6 +60,8 @@ class LibraryPreferences(
false,
)
fun markDuplicateReadChapterAsRead() = preferenceStore.getStringSet("mark_duplicate_read_chapter_read", emptySet())
// region Filter
fun filterDownloaded() = preferenceStore.getEnum(
@@ -107,6 +109,8 @@ class LibraryPreferences(
fun downloadBadge() = preferenceStore.getBoolean("display_download_badge", false)
fun unreadBadge() = preferenceStore.getBoolean("display_unread_badge", true)
fun localBadge() = preferenceStore.getBoolean("display_local_badge", true)
fun languageBadge() = preferenceStore.getBoolean("display_language_badge", false)
@@ -128,8 +132,6 @@ class LibraryPreferences(
fun categorizedDisplaySettings() = preferenceStore.getBoolean("categorized_display", false)
fun markDuplicateChapterRead() = preferenceStore.getBoolean("mark_duplicate_chapter_read", false)
fun updateCategories() = preferenceStore.getStringSet(LIBRARY_UPDATE_CATEGORIES_PREF_KEY, emptySet())
fun updateCategoriesExclude() = preferenceStore.getStringSet(LIBRARY_UPDATE_CATEGORIES_EXCLUDE_PREF_KEY, emptySet())
@@ -225,6 +227,9 @@ class LibraryPreferences(
const val MANGA_NON_READ = "manga_started"
const val MANGA_OUTSIDE_RELEASE_PERIOD = "manga_outside_release_period"
const val MARK_DUPLICATE_CHAPTER_READ_NEW = "new"
const val MARK_DUPLICATE_CHAPTER_READ_EXISTING = "existing"
const val DEFAULT_CATEGORY_PREF_KEY = "default_category"
private const val LIBRARY_UPDATE_CATEGORIES_PREF_KEY = "library_update_categories"
private const val LIBRARY_UPDATE_CATEGORIES_EXCLUDE_PREF_KEY = "library_update_categories_exclude"
@@ -2,7 +2,10 @@ package tachiyomi.domain.manga.interactor
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.retry
import logcat.LogPriority
import tachiyomi.core.common.util.system.logcat
import tachiyomi.domain.library.model.LibraryManga
import tachiyomi.domain.manga.repository.MangaRepository
import kotlin.time.Duration.Companion.seconds
@@ -17,15 +20,15 @@ class GetLibraryManga(
fun subscribe(): Flow<List<LibraryManga>> {
return mangaRepository.getLibraryMangaAsFlow()
// SY -->
.retry {
if (it is NullPointerException) {
delay(5.seconds)
delay(0.5.seconds)
true
} else {
false
}
}.catch {
this@GetLibraryManga.logcat(LogPriority.ERROR, it)
}
// SY <--
}
}
+1 -1
View File
@@ -1,5 +1,5 @@
[versions]
agp_version = "8.8.2"
agp_version = "8.9.0"
lifecycle_version = "2.8.7"
paging_version = "3.3.6"
interpolator_version = "1.0.0"
+1 -1
View File
@@ -1,5 +1,5 @@
[versions]
compose-bom = "2025.02.00"
compose-bom = "2025.03.00"
[libraries]
activity = "androidx.activity:activity-compose:1.10.1"
+2 -2
View File
@@ -28,7 +28,7 @@ conscrypt-android = "org.conscrypt:conscrypt-android:2.5.3"
quickjs-android = "app.cash.quickjs:quickjs-android:0.9.2"
jsoup = "org.jsoup:jsoup:1.18.3"
jsoup = "org.jsoup:jsoup:1.19.1"
disklrucache = "com.jakewharton:disklrucache:2.0.2"
unifile = "com.github.tachiyomiorg:unifile:e0def6b3dc"
@@ -92,7 +92,7 @@ sqldelight-dialects-sql = { module = "app.cash.sqldelight:sqlite-3-38-dialect",
junit = "org.junit.jupiter:junit-jupiter:5.11.4"
kotest-assertions = "io.kotest:kotest-assertions-core:5.9.1"
mockk = "io.mockk:mockk:1.13.16"
mockk = "io.mockk:mockk:1.13.17"
voyager-navigator = { module = "cafe.adriel.voyager:voyager-navigator", version.ref = "voyager" }
voyager-screenmodel = { module = "cafe.adriel.voyager:voyager-screenmodel", version.ref = "voyager" }
+4 -2
View File
@@ -15,7 +15,9 @@ sqlcipher = "net.zetetic:sqlcipher-android:4.6.1"
exifinterface = "androidx.exifinterface:exifinterface:1.3.7"
google-api-services-drive = "com.google.apis:google-api-services-drive:v3-rev197-1.25.0"
google-api-client-oauth = "com.google.oauth-client:google-oauth-client:1.38.0"
google-api-client-oauth = "com.google.oauth-client:google-oauth-client:1.39.0"
koin-core = { module = "io.insert-koin:koin-core", version.ref = "koin" }
koin-android = { module = "io.insert-koin:koin-android", version.ref = "koin" }
koin-android = { module = "io.insert-koin:koin-android", version.ref = "koin" }
zxing-android-embedded = "com.journeyapps:zxing-android-embedded:4.3.0"
@@ -260,7 +260,7 @@
<string name="eh_settings_configuration_failed_message">حدث خطأ أثناء عملية التكوين:%1$s</string>
<string name="custom_igneous_cookie_message">لا يستطيع بعض المستخدمين الوصول إلى ExHentai بالطريقة العادية، ويتعين عليهم تمرير قيمة محددة لملفات تعريف الارتباط، وهذا الخيار مخصص لهؤلاء المستخدمين.</string>
<string name="enable_source_blacklist_summary">إخفاء المصادر غير المتوافقة مع %1$s . فرض إعادة تشغيل التطبيق بعد التغيير.</string>
<string name="open_debug_menu_summary">لا تلمس هذه القائمة إلا إذا كنت تعرف ما تفعله!<font color="red">يمكن أن يفسد مكتبتك!</font></string>
<string name="open_debug_menu_summary">تهكمية</string>
<string name="data_saver_image_quality_summary">تعني القيم الأعلى أنه تم حفظ نسبة أعلى من جودة الصورة، ولكنها تعني أيضًا أن حجم الملف أكبر، ونسبة ٨٠ بالمائة هي متوسط جيد بين حجم الملف وجودة الصورة</string>
<string name="pref_category_eh">E- Hentai</string>
<string name="clear_db_exclude_read">الحفاظ على الإدخالات مع فصول مقروءه</string>
@@ -451,4 +451,90 @@
<string name="action_copy_combined_page">نسخ الصفحة المجمعة</string>
<string name="only_show_updated_entries">إظهار الإدخالات التي تحتوي على فصول جديدة فقط</string>
<string name="pref_crop_borders_pager">قص اطراف الصفحات</string>
</resources>
<string name="pref_tracker_resolve_using_source_metadata_summary">يحدد العنوان المطابق تلقائيا إذا كان المصدر يوفر روابط لأدوات التتبع. مدعوم حاليا من قبل MangaDex</string>
<string name="rec_hide_library_entries">إخفاء النتائج الموجودة بالفعل في مكتبتك</string>
<string name="rec_search_short">البحث عن التوصيات</string>
<string name="rec_group_tracker">توصيات المتتبع</string>
<string name="rec_processing_state">إدخال المعالجة ٪1$d من ٪2$d</string>
<string name="gallery_size">حجم المعرض</string>
<string name="aged">مُسن</string>
<string name="rec_services_to_search">خدمات التوصية للبحث</string>
<string name="entry_not_tracked">لم يتم تتبع الإدخال.</string>
<string name="rec_group_source">توصيات المصدر</string>
<string name="page_count">عدد الصفحات</string>
<string name="total_favorites">إجمالي المفضلة</string>
<string name="short_title">عنوان قصير</string>
<string name="follow_status">متابعة الحالة</string>
<string name="anilist_id">معرف Anilist</string>
<string name="add_tags">إضافة علامات</string>
<string name="multi_tags_comma_separated">أدخل العلامة (العلامات) ، مفصولة بفواصل.</string>
<string name="favorites_sync_adding_to_remote">إضافة معرض ٪1$d من ٪2$d إلى الخادم البعيد</string>
<string name="media_id">معرف الوسائط</string>
<string name="thumbnail_image_file_type">نوع ملف الصورة المصغرة</string>
<string name="manga_updates_id">معرف Manga updates</string>
<string name="delete_merged_entry">هل أنت متأكد</string>
<string name="translated">مُتَرْجَم</string>
<string name="author">الكاتب</string>
<string name="japanese_title">العنوان الياباني</string>
<string name="english_title">العنوان الإنجليزي</string>
<string name="uploader_capital">تم كتابة المُحمل بأحرف كبيرة</string>
<string name="uploader">الرافع</string>
<string name="rating_string">سلسلة التصنيف</string>
<string name="parodies">تهكمية</string>
<string name="kitsu_id">معرف Kitsu</string>
<string name="delete_merged_entry_desc">سيؤدي هذا إلى إزالة الإدخال من الدمج، وسيؤدي استخدام هذا أيضا إلى فقدان أي تغييرات غير محفوظة مطبقة على الإدخال المدمج</string>
<string name="pref_tracker_resolve_using_source_metadata">تحديد الإدخالات باستخدام بيانات تعريف المصدر</string>
<string name="select_tracker">حدد أداة تعقب</string>
<string name="fill_from_tracker">ملء من تعقب</string>
<string name="rec_search">البحث عن التوصيات الشائعة</string>
<string name="rec_common_recommendations">التوصيات الشائعة</string>
<string name="rec_no_results">لم يتم العثور على توصيات</string>
<string name="rec_error_title">فشل البحث</string>
<string name="rec_error_string">حدث خطأ أثناء عملية البحث: ٪1$s</string>
<string name="rec_collecting">جمع التوصيات</string>
<string name="rec_initializing">تهيئه</string>
<string name="parent">الوالد</string>
<string name="visible">ظاهر</string>
<string name="language">اللغة</string>
<string name="average_rating">متوسط التقييم</string>
<string name="last_update_check">التحقق من آخر تحديث</string>
<string name="path">مسار</string>
<string name="artist">فنان</string>
<string name="group">مجموعة</string>
<string name="cover_image_file_type">نوع ملف صورة الغلاف</string>
<string name="url">الرابط</string>
<string name="last_chapter_number">رقم الفصل الأخير</string>
<string name="mal_id">معرف Mal</string>
<string name="anime_planet_id">معرف Anime planet</string>
<string name="is_visible">مرئي: ٪1$s</string>
<string name="merge_settings">دمج الإعداد</string>
<string name="chapter_updates_merged_entry">تبديل تحديثات الفصل</string>
<string name="collection">مجموعة</string>
<string name="characters">الاحرف</string>
<string name="favorites_sync_initializing">تهيئة المزامنة</string>
<string name="favorites_sync_reset_message">يمكن أن تؤدي إعادة تعيين حالة المزامنة إلى أن تكون المزامنة التالية بطيئة للغاية.</string>
<string name="eh_batch_add">إضافة دفعة</string>
<string name="batch_add_ok">[موافق]</string>
<string name="batch_add_error">[خطأ]</string>
<string name="favorites_sync_notes_message"><![CDATA[1. تغييرات أسماء الفئات في التطبيق <b>لا</b> تتم مزامنتها! يُرجى <i>تغيير أسماء الفئات على موقع ExHentai بدلاً من ذلك</i>. حيث سيتم نسخ أسماء الفئات من خوادم ExHentai في كل مزامنة.<br><br>2. فئات المفضلة على ExHentai تتوافق مع <b>أول 10 فئات في التطبيق</b> (باستثناء فئة 'الافتراضي'). <i>المعروضات في الفئات الأخرى <b>لن</b> تتم مزامنتها!</i><br><br>3. <font color='red'><b>تأكد من وجود اتصال إنترنت مستقر أثناء عملية المزامنة!</b></font> إذا انقطع الاتصال بالإنترنت أثناء مزامنة التطبيق، فقد تبقى مفضلاتك في حالة <i>مزامنة جزئية</i>.<br><br>4. حافظ على فتح التطبيق أثناء مزامنة المفضلات. قد يقوم نظام أندرويد بإغلاق التطبيقات التي تعمل في الخلفية أحياناً، مما قد يكون سيئاً إذا حدث ذلك أثناء مزامنة التطبيق.<br><br>5. <b>لا تضع المفضلات في فئات متعددة</b> (على الرغم من أن التطبيق يدعم هذه الميزة). لأن هذا قد يربك خوارزمية المزامنة حيث يسمح ExHentai فقط بوضع كل مفضلة في فئة واحدة.<br><br>ستظهر هذه النافذة مرة واحدة فقط. يمكنك قراءة هذه الملاحظات مرة أخرى بالذهاب إلى 'الإعدادات > E-Hentai > عرض ملاحظات مزامنة المفضلات'.]]></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="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_conformation_message">هل أنت متأكد من أنك ترغب في مزامنة مفضلاتك مع E-Hentai؟</string>
<string name="favorites_sync_reset">هل أنت متأكد</string>
<string name="batch_add_no_valid_galleries_message">يجب عليك تحديد معرض واحد على الأقل لإضافته!</string>
<string name="batch_add">إضافة دفعة</string>
<string name="favorites_sync_unable_to_add_to_remote">تعذر إضافة معرض إلى الخادم البعيد</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="batch_add_no_valid_galleries">لا توجد معارض لإضافتها!</string>
<string name="favorites_sync_failed_to_add_to_local_unknown_type">ليس معرضا صالحا!</string>
<string name="favorites_sync_waiting_for_start">في انتظار بدء المزامنة</string>
<string name="favorites_sync_gallery_in_multiple_categories">المعرض: ٪1$s في أكثر من فئة (٪2$s)!</string>
<string name="favorites_sync_processing_throttle">٪1$s\n\nيتم اختناق المزامنة حاليا (لتجنب حظرها من ExHentai) وقد يستغرق وقتا طويلا حتى يكتمل.</string>
<string name="favorites_sync_notes">ملاحظات مزامنة المفضلة الهامة</string>
<string name="eh_batch_add_finish">إنهاء</string>
</resources>
@@ -631,4 +631,18 @@
<string name="favorites_sync_unable_to_add_to_remote">গ্যালাৰীটো ৰিম\'ট ছাৰ্ভাৰত যোগ কৰিব পৰা নগ\'ল: \'%1$s\' (GID: %2$s)!</string>
<string name="entry_not_tracked">প্ৰৱেশটো অনুসৰণ কৰা হোৱা নাই।</string>
<string name="similar_titles">একেধৰণৰ শিৰোনামসমূহ</string>
<string name="rec_collecting">পৰামৰ্শ সংগ্ৰহ কৰা</string>
<string name="pref_tracker_resolve_using_source_metadata_summary">স্বয়ংক্ৰিয়ভাৱে মিল থকা শিৰোনাম নিৰ্ব্বাচন কৰে যদি উৎসই ট্ৰেকাৰসমূহলে সংযোগসমূহ প্ৰদান কৰে। বৰ্তমান MangaDex দ্বাৰা সমৰ্থিত</string>
<string name="pref_tracker_resolve_using_source_metadata">উৎস মেটাডাটা ব্যৱহাৰ কৰি প্ৰৱেশসমূহ নিৰ্ব্বাচন কৰক</string>
<string name="rec_search">সাধাৰণ পৰামৰ্শ বিচাৰি উলিয়াওক</string>
<string name="rec_hide_library_entries">আপোনাৰ লাইব্ৰেৰীত ইতিমধ্যে ফলাফল লুকুৱাওক</string>
<string name="rec_services_to_search">সন্ধান কৰিবলৈ পৰামৰ্শ সেৱা</string>
<string name="rec_group_source">উৎসৰ পৰামৰ্শ</string>
<string name="rec_group_tracker">ট্ৰেকাৰৰ পৰামৰ্শ</string>
<string name="rec_common_recommendations">সাধাৰণ পৰামৰ্শ</string>
<string name="rec_search_short">পৰামৰ্শ বিচাৰি উলিয়াওক</string>
<string name="rec_no_results">কোনো পৰামৰ্শ পোৱা নগ\'ল</string>
<string name="rec_error_title">সন্ধান বিফল হ\'ল</string>
<string name="rec_error_string">সন্ধান প্ৰক্ৰিয়াৰ সময়ত এটা ভুল হৈছে: %1$s</string>
<string name="rec_processing_state">%2$d ৰ %1$d প্ৰৱেশ প্ৰক্ৰিয়া কৰা হৈছে</string>
</resources>
@@ -229,6 +229,7 @@
<string name="pref_sync_interval">Synchronization frequency</string>
<string name="pref_choose_what_to_sync">Choose what to sync</string>
<string name="syncyomi">SyncYomi</string>
<string name="scan_qr_code">Scan a QR code</string>
<string name="last_synchronization">Last Synchronization: %1$s</string>
<string name="google_drive">Google Drive</string>
<string name="pref_google_drive_sign_in">Sign in</string>
@@ -604,4 +604,19 @@
<string name="disable_favorites_uploading_summary">Favoriten werden nur von ExHentai heruntergeladen. Alle Änderungen an den Favoriten in der App werden nicht hochgeladen. Verhindert den versehentlichen Verlust von Favoriten auf ExHentai. Beachten Sie, dass entfernte Favoriten weiterhin heruntergeladen werden (wenn Sie einen Favoriten auf ExHentai entfernen, wird er auch in der App entfernt).</string>
<string name="action_add_tags_message">Wichtig! Tags müssen exakt sein, es gibt keine Teilübereinstimmungen, Sie können nicht netorare verwenden, um female:netorare oder ähnliches herauszufiltern!\nDer Stil für Namespace-Tags ist\n„female: sole female“\nohne Anführungszeichen!\nDas Hinzufügen mehrerer Varianten desselben Tags wird unterstützt, Sie können also „tag: netorare“ für NHentai und „female: netorare“ für E-Hentai verwenden!</string>
<string name="favorites_sync_notes_message"><![CDATA[1. Änderungen an Kategorienamen in der App werden <b>NICHT</b> synchronisiert! Bitte <i>ändern Sie stattdessen die Kategorienamen auf ExHentai</i>. Die Kategorienamen werden bei jeder Synchronisierung von den ExHentai-Servern kopiert.<br><br>2. Die Favoritenkategorien auf ExHentai entsprechen den <b>ersten 10 Kategorien in der App</b> (ausgenommen die Kategorie \'Standard\'). <i>Galerien in anderen Kategorien werden <b>NICHT</b> synchronisiert!</i><br><br>3. <font color=\'red\'><b>STELLEN SIE SICHER, DASS SIE WÄHREND DER SYNCHRONISATION EINE STABILE INTERNETVERBINDUNG HABEN!</b></font> Wenn die Internetverbindung während der Synchronisierung der App unterbrochen wird, bleiben Ihre Favoriten möglicherweise in einem <i>teilweise synchronisierten Zustand</i>.<br><br>4. Lassen Sie die App geöffnet, während die Favoriten synchronisiert werden. Android schließt manchmal Apps, die im Hintergrund laufen, und das kann problematisch sein, wenn es passiert, während die App synchronisiert wird.<br><br>5. <b>Legen Sie Favoriten NICHT in mehrere Kategorien</b> (die App unterstützt dies). Dies kann den Synchronisierungsalgorithmus verwirren, da ExHentai jedem Favoriten nur eine Kategorie zulässt.<br><br>Dieses Dialogfeld wird nur einmal angezeigt. Sie können diese Hinweise erneut lesen, indem Sie zu \'Einstellungen > E-Hentai > Synchronisierungshinweise für Favoriten anzeigen\' gehen.]]></string>
<string name="pref_tracker_resolve_using_source_metadata_summary">Wählt automatisch den passenden Titel aus, wenn die Quelle Links zu Trackern enthält. Derzeit unterstützt von MangaDex</string>
<string name="rec_search_short">Empfehlungen finden</string>
<string name="pref_tracker_resolve_using_source_metadata">Auswählen von Einträgen mithilfe von Quellmetadaten</string>
<string name="rec_error_string">Während des Suchvorgangs ist ein Fehler aufgetreten: %1$s</string>
<string name="rec_search">Suchen allgemeiner Empfehlungen</string>
<string name="rec_hide_library_entries">Ausblenden von Ergebnissen, die sich bereits in Ihrer Bibliothek befinden</string>
<string name="rec_services_to_search">Empfehlungsdienste für die Suche</string>
<string name="rec_group_source">Quellenempfehlungen</string>
<string name="rec_group_tracker">Tracker-Empfehlungen</string>
<string name="rec_common_recommendations">Allgemeine Empfehlungen</string>
<string name="rec_no_results">Keine Empfehlungen gefunden</string>
<string name="rec_error_title">Suche fehlgeschlagen</string>
<string name="rec_processing_state">Verarbeitungseintrag %1$d von %2$d</string>
<string name="rec_collecting">Sammeln von Empfehlungen</string>
<string name="rec_initializing">Initialisierend</string>
</resources>
@@ -141,7 +141,7 @@
<string name="bandwidth_hero">Bandwidth Hero ( Requiere un servidor proxy )</string>
<string name="wsrv">wsrv.nl</string>
<string name="data_saver_server_summary">Pom aqui la URl del Servidor Proxy de Bandwidth Hero</string>
<string name="clear_db_exclude_read">Mantenga las entradas con capitulos leidos</string>
<string name="clear_db_exclude_read">Conservar obras con capítulos leídos</string>
<string name="bandwidth_data_saver_server">Servidor Proxy de Bandwidth Hero</string>
<string name="log_minimal">Minimo</string>
<string name="log_extra">Extra</string>
@@ -351,7 +351,7 @@
<string name="add_tags">Añadir etiquetas</string>
<string name="action_share_combined_page">Compartir página combinada</string>
<string name="entry_merged">¡Entrada unida!</string>
<string name="multi_tags_comma_separated">Introducir etiqueta(s), separada(s) por comas.</string>
<string name="multi_tags_comma_separated">Escribe una o más etiquetas separadas por comas.</string>
<string name="add_tag">Añadir etiqueta</string>
<string name="find_in_another_source">Buscar en otra fuente</string>
<string name="save_search_failed_to_load_message">Un error ocurrió mientras se cargaban tus búsquedas guardadas.</string>
@@ -482,11 +482,11 @@
<string name="manga_updates_id">Id de Manga updates</string>
<string name="anime_planet_id">Id de Anime planet</string>
<string name="translated">Traducido</string>
<string name="mangadex_sync_follows_to_library_summary">Baja las entradas de MangaDex a tu biblioteca si no se han añadido ya.</string>
<string name="mangadex_sync_follows_to_library_summary">Descarga los títulos de MangaDex que falten y los añade a tu biblioteca.</string>
<string name="community_recommendations">Recomendaciones de la comunidad</string>
<string name="relation_main_story">Historia principal</string>
<string name="relation_sequel">Secuela</string>
<string name="relation_spin_off">Spin-off</string>
<string name="relation_spin_off">Derivado de</string>
<string name="relation_alternate_story">Historia alternativa</string>
<string name="relation_alternate_version">Versión alternativa</string>
<string name="feed_add">¿Añadir %1$s al feed?</string>
@@ -516,15 +516,15 @@
<string name="delete_merged_entry">¿Estás seguro?</string>
<string name="delete_merged_entry_desc">Esto eliminará la entrada de la combinación, al usarlo también se perderá cualquier cambio sin guardar aplicado a la entrada combinada</string>
<string name="md_follows_unfollowed">No seguida</string>
<string name="mangadex_sync_follows_to_library">Sincronizar las entradas de MangaDex en tu biblioteca</string>
<string name="mangadex_sync_follows_to_library">Sincronizar títulos de MangaDex con los de tu biblioteca</string>
<string name="alt_titles">Títulos alternativos</string>
<string name="select_scanlators">Grupos de traductores a mostrar</string>
<string name="relation_based_on">Basada en</string>
<string name="relation_shared_universe">Universo compartido</string>
<string name="relation_colored">Coloreada</string>
<string name="relation_serialization">Publicación por entregas</string>
<string name="include_all_read_entries">Incluir todas las entradas leídas</string>
<string name="ignore_non_library_entries">Ignorar entradas que no pertenecen a la biblioteca</string>
<string name="include_all_read_entries">Incluir todos los títulos ya leídos</string>
<string name="ignore_non_library_entries">Ignorar títulos que no estén en la biblioteca</string>
<string name="asian_porn">Porno asiático</string>
<string name="rating3">Horrible</string>
<string name="rating7">Bueno</string>
@@ -534,10 +534,10 @@
<string name="short_title">Título corto</string>
<string name="artist">Artista</string>
<string name="characters">Personajes</string>
<string name="relation_adapted_from">Adaptada de</string>
<string name="relation_adapted_from">Adaptada a partir de</string>
<string name="relation_doujinshi">Doujinshi</string>
<string name="relation_prequel">Precuela</string>
<string name="relation_same_franchise">Misma franquicia</string>
<string name="relation_same_franchise">Comparten franquicia</string>
<string name="japanese_title">Título en japonés</string>
<string name="rating0">Desastroso</string>
<string name="alt_title">Título alternativo</string>
@@ -567,11 +567,11 @@
<string name="aged">Envejecido</string>
<string name="media_id">Identificación de medios</string>
<string name="rating_string">Cadena de valoración</string>
<string name="no_dedupe">No deduplicado</string>
<string name="no_dedupe">Sin deduplicar</string>
<string name="dedupe_priority">Eliminar duplicados por prioridad</string>
<string name="dedupe_most_chapters">Mostrar fuentes con la mayor cantidad de capítulos</string>
<string name="dedupe_highest_chapter">Mostrar fuente con el número de capítulo más alto</string>
<string name="mangadex_preffered_source">Fuente preferida MangaDex</string>
<string name="mangadex_preffered_source">Fuente preferida de MangaDex</string>
<string name="relation_preserialization">Pre-serialización</string>
<string name="gallery_adder_uri_map_to_chapter_error">¡Error en el mapa URI de origen al capítulo!</string>
<string name="gallery_adder_uri_clean_error">¡Error al limpiar la URL de origen!</string>
@@ -600,16 +600,32 @@
<string name="deduplication_entry_info">Entrada de información:</string>
<string name="mangadex_add_to_follows">Añadir a seguidores MangaDex</string>
<string name="random">Aleatorio</string>
<string name="mangadex_push_favorites_to_mangadex">Sincronizar entradas de la biblioteca con MangaDex</string>
<string name="mangadex_push_favorites_to_mangadex">Sincronizar títulos de la biblioteca con MangaDex</string>
<string name="similar">Similar a %1$s</string>
<string name="download_merged_entry_desc">Activar esta opción se activará o desactivará la descarga de capítulos para esta entrada combinada</string>
<string name="mangadex_preffered_source_summary">Establecer tu fuente MangaDex preferida, se usará para seguidores y otras funciones en la aplicación</string>
<string name="mangadex_preffered_source_summary">Establece tu fuente MangaDex preferida, se usará para seguidores y otras funciones en la aplicación</string>
<string name="mangadex_follows">Seguidores MangaDex</string>
<string name="mangadex_push_favorites_to_mangadex_summary">Sincroniza cualquier entrada rastreada no incluida en MdList con MangaDex como lectura.</string>
<string name="mangadex_push_favorites_to_mangadex_summary">Sincroniza todos los títulos que todavía no estén en tu MdList de MangaDex y los pone como «leyendo».</string>
<string name="relation_similar">Similar</string>
<string name="relation_monochrome">Monocromo</string>
<string name="entry_not_tracked">La entrada no se rastrea.</string>
<string name="select_tracker">Seleccione un rastreador</string>
<string name="fill_from_tracker">Llenar desde el rastreador</string>
<string name="favorites_sync_unable_to_add_to_remote">No se puede agregar la galería al servidor remoto: \'%1$s\' (GID: %2$s)!</string>
<string name="entry_not_tracked">El título no tiene seguimiento.</string>
<string name="select_tracker">Elige un servicio de seguimiento</string>
<string name="fill_from_tracker">Rellenar desde el serv. de seguimiento</string>
<string name="favorites_sync_unable_to_add_to_remote">No se puede añadir la galería al servidor remoto: \'%1$s\' (GID: %2$s)!</string>
<string name="rec_error_title">La búsqueda no se ha podido completar</string>
<string name="rec_common_recommendations">Recomendaciones en común</string>
<string name="rec_group_tracker">Recomendaciones del serv. de seguimiento</string>
<string name="rec_error_string">Hubo un error al buscar: %1$s</string>
<string name="rec_no_results">No se ha encontrado ninguna recomendación</string>
<string name="rec_search_short">Buscar recomendaciones</string>
<string name="rec_initializing">Preparando</string>
<string name="rec_collecting">Obteniendo recomendaciones</string>
<string name="rec_processing_state">Procesando elemento %1$d de %2$d</string>
<string name="similar_titles">Títulos similares</string>
<string name="rec_search">Buscar recomendaciones en común</string>
<string name="rec_group_source">Recomendaciones de la fuente</string>
<string name="rec_services_to_search">Servicios de recomendación en los que buscar</string>
<string name="rec_hide_library_entries">Ocultar elementos que ya estén en la biblioteca</string>
<string name="pref_tracker_resolve_using_source_metadata_summary">Encuentra el título automáticamente si la fuente ya enlaza con el servicio de seguimiento. De momento solo funciona en MangaDex</string>
<string name="pref_tracker_resolve_using_source_metadata">Elegir títulos a través de los metadatos de la fuente</string>
</resources>
@@ -631,4 +631,19 @@
<string name="visible">Visible</string>
<string name="aged">Aged</string>
<string name="rating_string">Rating string</string>
<string name="rec_error_title">Bigong nakahanap</string>
<string name="rec_common_recommendations">Mga karaniwang rekomendasyon</string>
<string name="rec_search_short">Maghanap ng mga rekomendasyon</string>
<string name="rec_error_string">Nagkaroon ng error sa proseso ng paghahanap: %1$s</string>
<string name="pref_tracker_resolve_using_source_metadata_summary">Awtomatikong pinipili ang katugmang pamagat kung ang pinagmulan ay nagbibigay ng mga link sa mga tracker. Kasalukuyang sinusuportahan ng MangaDex</string>
<string name="pref_tracker_resolve_using_source_metadata">Napiling mga entry gamit ang source metadata</string>
<string name="rec_search">Maghanap ng mga karaniwang rekomendasyon</string>
<string name="rec_hide_library_entries">Itago ang mga resulta na mayroon sa iyong aklatan</string>
<string name="rec_services_to_search">Mga serbisyo ng rekomendasyon sa paghahanap</string>
<string name="rec_group_source">Mga rekomendasyon ng Source</string>
<string name="rec_group_tracker">Mga rekomendasyon ng Tracker</string>
<string name="rec_no_results">Walang nahanap na mga rekomendasyon</string>
<string name="rec_processing_state">Pinoprosesong entry %1$d ng %2$d</string>
<string name="rec_collecting">Nangongolekta ng mga rekomendasyon</string>
<string name="rec_initializing">Sinisimulan</string>
</resources>
@@ -558,7 +558,7 @@
<string name="google_drive_sync_data_purged">Données de synchronisation supprimées de Google Drive</string>
<string name="delete_time_range">Supprimer un intervalle de temps</string>
<string name="delete_cbz_archive_password">Supprimer le mot de passe de l\'archive CBZ</string>
<string name="clear_db_exclude_read">Conserver les entrées avec des chapitres lus</string>
<string name="clear_db_exclude_read">Conserver les entrées avec les chapitres lus</string>
<string name="sunday">Dimanche</string>
<string name="eh_boost_boosted">Page actuelle boostée!</string>
<string name="pref_show_bottom_bar_labels">Toujours afficher les étiquettes de navigation</string>
@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
@@ -454,7 +454,7 @@
<string name="aged">Aged</string>
<string name="last_update_check">Last update check</string>
<string name="path">Path</string>
<string name="artist">Artist</string>
<string name="artist">Seniman</string>
<string name="characters">Characters</string>
<string name="group">Group</string>
<string name="media_id">Media id</string>
@@ -469,7 +469,7 @@
<string name="rating_string">Rating string</string>
<string name="collection">Collection</string>
<string name="parodies">Parodies</string>
<string name="author">Author</string>
<string name="author">Penulis</string>
<string name="last_chapter_number">Last chapter number</string>
<string name="follow_status">Follow status</string>
<string name="anilist_id">Anilist id</string>
@@ -653,4 +653,19 @@
<string name="select_tracker">Pilih pelacak</string>
<string name="fill_from_tracker">Isi melalui pelacak</string>
<string name="similar_titles">Judul serupa</string>
<string name="pref_tracker_resolve_using_source_metadata">Pilih entri dengan sumber metadata</string>
<string name="pref_tracker_resolve_using_source_metadata_summary">Secara otomatis memilih judul yang cocok bila sumber menyediakan tautan ke trackers. Saat ini didukung oleh MangaDex</string>
<string name="rec_search">Temukan rekomendasi umum</string>
<string name="rec_hide_library_entries">Sembunyikan hasil yang terdapat di pustaka</string>
<string name="rec_services_to_search">Layanan rekomendasi untuk dicari</string>
<string name="rec_group_source">Layanan rekomendasi</string>
<string name="rec_group_tracker">Rekomendasi pelacak</string>
<string name="rec_common_recommendations">Rekomendasi umum</string>
<string name="rec_search_short">Temukan rekomendasi</string>
<string name="rec_no_results">Rekomendasi tidak ditemukan</string>
<string name="rec_error_title">Pencarian gagal</string>
<string name="rec_error_string">Terjadi sebuah error saat melakukan pencarian: %1$s</string>
<string name="rec_processing_state">Memproses entri %1$d dari %2$d</string>
<string name="rec_collecting">Mengumpulkan rekomendasi</string>
<string name="rec_initializing">Inisialisasi</string>
</resources>
@@ -143,4 +143,168 @@
<string name="update_3hour">Ogni 3 ore</string>
<string name="all_read_entries">Tutte le voci lette</string>
<string name="sync_state_reset">Reset dello stato di sincronizzazione</string>
<string name="pref_sync_service">Servizio</string>
<string name="pref_sync_now_subtitle">Inizia la sincronizzazione immediata dei tuoi dati</string>
<string name="pref_sync_automatic_category">Sincronizzazione Automatica</string>
<string name="pref_sync_interval">Frequenza di sincronizzazione</string>
<string name="pref_choose_what_to_sync">Scegli cosa sincronizzare</string>
<string name="last_synchronization">Ultima Sincronizzazione: %1$s</string>
<string name="google_drive">Google Drive</string>
<string name="aes_256">AES 256</string>
<string name="aes_128">AES 128</string>
<string name="reader_preload_amount_4_pages">4 Pagine</string>
<string name="reader_preload_amount_6_pages">6 Pagine</string>
<string name="reader_preload_amount_8_pages">8 Pagine</string>
<string name="reader_preload_amount_10_pages">10 Pagine</string>
<string name="reader_preload_amount_12_pages">12 Pagine</string>
<string name="reader_preload_amount_14_pages">14 Pagine</string>
<string name="sunday">Domenica</string>
<string name="saturday">Sabato</string>
<string name="artist">Artista</string>
<string name="monday">Lunedì</string>
<string name="tuesday">Martedì</string>
<string name="wednesday">Mercoledì</string>
<string name="thursday">Giovedì</string>
<string name="friday">Venerdì</string>
<string name="author">Autore</string>
<string name="syncyomi">SyncYomi</string>
<string name="error_before_sync_gdrive">Errore prima della sincronizzazione: %s</string>
<string name="biometric_lock_end_time">Inserisci l\'orario di fine</string>
<string name="similar_titles">Titoli simili</string>
<string name="anime_planet_id">Id Anime planet</string>
<string name="eh_batch_add_finish">Fine</string>
<string name="video">Video</string>
<string name="anilist_id">Id Anilist</string>
<string name="translated">Tradotto</string>
<string name="language_translated">%1$s TR</string>
<string name="is_visible">Visibile: %1$s</string>
<string name="relation_adapted_from">Adattato da</string>
<string name="rating9">Fantastico</string>
<string name="eh_autoscroll_freq_invalid">Frequenza non valida</string>
<string name="eh_boost_page_downloaded">Questa pagina è già stata scaricata!</string>
<string name="action_share_second_page">Condividi la seconda pagina</string>
<string name="center_margin_double_and_wide_page">Aggiungi a entrambi</string>
<string name="az_recommends">Visualizza Suggerimenti</string>
<string name="merge">Unisci</string>
<string name="title_hint">Titolo: %1$s</string>
<string name="description_hint">Descrizione: %1$s</string>
<string name="author_hint">Autore: %1$s</string>
<string name="artist_hint">Artista: %1$s</string>
<string name="action_edit_tags">Modifica etichette</string>
<string name="ext_redundant">Ridondante</string>
<string name="latest_">Ultimo: %1$s</string>
<string name="no_alternatives_found">Nessuna Alternativa Trovata</string>
<string name="stop_migrating">Fermare la migrazione?</string>
<string name="action_stop">Stop</string>
<string name="favorites_sync_sync_error">Errore di sincronizzazione!</string>
<string name="favorites_sync_unknown_error">Errore sconosciuto: %1$s</string>
<string name="favorites_sync_reset">Sei sicuro?</string>
<string name="eh_batch_add_button">Aggiungi Gallerie</string>
<string name="batch_add_ok">[OK]</string>
<string name="batch_add_error">[ERRORE]</string>
<string name="batch_add_success_log_message">Galleria aggiunta: %1$s</string>
<string name="rating3">Terribile</string>
<string name="rating7">Buono</string>
<string name="rating6">Accettabile</string>
<string name="rating5">Mediocre</string>
<string name="more_info">Più informazioni</string>
<string name="alt_title">Titolo alternativo</string>
<string name="mal_id">Id Mal</string>
<string name="similar">Simile a %1$s</string>
<string name="relation_similar">Simile</string>
<string name="relation_monochrome">Monocromatico</string>
<string name="relation_shared_universe">Universo condiviso</string>
<string name="relation_sequel">Sequel</string>
<string name="relation_spin_off">Spin-off</string>
<string name="reader_preload_amount_16_pages">16 Pagine</string>
<string name="reader_preload_amount_20_pages">20 Pagine</string>
<string name="eh_retry_all">Ritenta tutto</string>
<string name="action_save_first_page">Salva la prima pagina</string>
<string name="action_save_second_page">Salva la seconda pagina</string>
<string name="action_share_first_page">Condividi la prima pagina</string>
<string name="action_copy_first_page">Copia la prima pagina</string>
<string name="action_copy_second_page">Copia la seconda pagina</string>
<string name="add_tag">Aggiungi Etichetta</string>
<string name="rec_error_title">Ricerca non riuscita</string>
<string name="show_gallery">Mostra Galleria</string>
<string name="favorites_sync_conformation_message">Confermi di voler sincronizzare i tuoi preferiti con E-Hentai?</string>
<string name="error_with_reason">Errore: %1$s</string>
<string name="page_preview_page_go_to">Vai a</string>
<string name="rating10">Capolavoro</string>
<string name="rating1">Insopportabile</string>
<string name="rating0">Disastroso</string>
<string name="no_rating">Nessun voto</string>
<string name="doujinshi">Doujinshi</string>
<string name="artist_cg">Artista CG</string>
<string name="western">Occidentale</string>
<string name="cosplay">Cosplay</string>
<string name="asian_porn">Pornografia Asiatica</string>
<string name="misc">Miscellaneo</string>
<string name="id">Id</string>
<string name="token">Token</string>
<string name="japanese_title">Titolo giapponese</string>
<string name="english_title">Titolo inglese</string>
<string name="short_title">Titolo breve</string>
<string name="kitsu_id">Id Kitsu</string>
<string name="delete_merged_entry">Sei sicuro?</string>
<string name="relation_based_on">Basato su</string>
<string name="relation_prequel">Prequel</string>
<string name="relation_doujinshi">Doujinshi</string>
<string name="relation_same_franchise">Stesso franchise</string>
<string name="relation_alternate_story">Storia alternativa</string>
<string name="center_margin_none">Nessuno</string>
<string name="favorites_sync_complete">Sincronizzazione completata!</string>
<string name="genre">Genere</string>
<string name="page_count">Numero di pagine</string>
<string name="visible">Visibile</string>
<string name="language">Lingua</string>
<string name="gallery_size">Dimensioni della galleria</string>
<string name="characters">Personaggi</string>
<string name="group">Gruppo</string>
<string name="url">Url</string>
<string name="collection">Collezione</string>
<string name="parodies">Parodie</string>
<string name="random">Casuale</string>
<string name="alt_titles">Titoli Alternativi</string>
<string name="relation_main_story">Storia principale</string>
<string name="relation_alternate_version">Versione alternativa</string>
<string name="time_between_batches_summary_2">"%1$s controlla/aggiorna le gallerie in blocco. Questo significa che aspetterà %2$d ore (s), controllerà %3$d gallerie, aspetterà %2$d ore (s), controlla %3$d e così via…"</string>
<string name="put_recommends_in_overflow">Raccomandazioni in overflow</string>
<string name="force_sync_state_reset">Forza reset sincronizzazione</string>
<string name="force_sync_state_reset_summary">Esegue una risincronizzazione completa durante la sincronizzazione successiva. Le rimozioni non saranno sincronizzate. Tutti i preferiti nell\'app verranno ricaricati su ExHentai e tutti i preferiti su ExHentai verranno scaricati nuovamente nell\'app. Utile per riparare la sincronizzazione dopo che la sincronizzazione è stata interrotta.</string>
<string name="gallery_update_checker">Controllo aggiornamento galleria</string>
<string name="gallery_updater_statistics">Statistiche aggiornamento galleria</string>
<string name="gallery_updater_stats_text">L\'ultimo aggiornamento è stato eseguito %1$s, e ha controllato %2$d di %3$d gallerie che erano pronte per il controllo.</string>
<string name="settings_profile_note_message">L\'app aggiungerà un nuovo profilo su E-Hentai e ExHentai per ottimizzare le prestazioni dell\'app. Si prega di assicurarsi di avere meno di tre profili su entrambi i siti.\n\nSe non hai idea di cosa siano i profili, allora probabilmente non importa, premi solo \"OK\".</string>
<string name="custom_igneous_cookie">Cookie igneo personalizzato</string>
<string name="toggle_delegated_sources">Abilitare le fonti delegate</string>
<string name="toggle_delegated_sources_summary">Applicare %1$s miglioramenti alle seguenti fonti se sono installate: %2$s</string>
<string name="log_level_summary">Modificare può avere un impatto sulle prestazioni dell\'app. Forza riavvio dell\'app dopo la modifica. Valore corrente: %s</string>
<string name="enable_source_blacklist_summary">Nascondi estensioni/fonti che sono incompatibili con %1$s. Forza riavvio dell\'app dopo la modifica.</string>
<string name="delete_unused_chapters">Eliminare le cartelle dei capitoli inesistenti, parzialmente scaricati e letti</string>
<string name="data_saver">Risparmio dati</string>
<string name="data_saver_summary">Comprimi immagini prima di scaricarle o caricarle nel lettore</string>
<string name="data_saver_downloader">Usa risparmio dati nel downloader</string>
<string name="data_saver_image_quality_summary">Valori più alti significano che viene salvata un\'immagine con qualità più elevata, ma significa anche che la dimensione del file è più grande, 80% è un buon compromesso tra dimensione file e qualità dell\'immagine</string>
<string name="data_saver_image_format_summary_on">La dimensione del file Jpeg è notevolmente più piccola di quella di Webp (il che significa che vengono risparmiati più dati), ma l\'immagine ha una qualità inferiore.\nAttualmente utilizza Jpeg</string>
<string name="data_saver_image_format_summary_off">La dimensione del file Jpeg è notevolmente più piccola di quella di Webp (il che significa che vengono risparmiati più dati), ma l\'immagine ha una qualità inferiore.\nAttualmente utilizza Webp</string>
<string name="bandwidth_hero">Bandwidth Hero (necessita di un server proxy Bandwidth Hero)</string>
<string name="bandwidth_data_saver_server">Server Proxy Bandwidth Hero Proxy</string>
<string name="data_saver_server_summary">Inserisci l\'url del proxy server Bandwidth Hero</string>
<string name="clear_db_exclude_read">Mantieni i capitoli letti</string>
<string name="put_recommends_in_overflow_summary">Inserisci il pulsante Raccomandazioni nel menu Overflow invece che nella pagina iniziale</string>
<string name="put_merge_in_overflow">Unisci in overflow</string>
<string name="put_merge_in_overflow_summary">Inserisci il pulsante di unione nel menu di overflow invece che nella pagina iniziale</string>
<string name="pref_previews_row_count">Anteprima conteggio righe</string>
<string name="pref_hide_history_button">Visualizza cronologia nella barra di navigazione</string>
<string name="pref_show_bottom_bar_labels">Visualizza sempre le etichette nella barra di navigazione</string>
<string name="pref_hide_updates_button">Visualizza aggiornamenti nella barra di navigazione</string>
<string name="pref_skip_pre_migration_summary">Utilizza le ultime preferenze e fonti salvate per eseguire la migrazione di massa</string>
<string name="library_group_updates_all_but_ungrouped">Avviare aggiornamenti globali solo per i non raggruppati, aggiornamento di categorie per gli altri</string>
<string name="rating8">Ottimo</string>
<string name="rating4">Scarso</string>
<string name="pref_tracker_resolve_using_source_metadata">Seleziona le voci utilizzando i metadati di origine</string>
<string name="pref_tracker_resolve_using_source_metadata_summary">Seleziona automaticamente il titolo corrispondente se la fonte fornisce collegamenti ai tracker. Attualmente supportato da MangaDex</string>
<string name="library_group_updates">Aggiornamenti dinamici categorie della libreria</string>
<string name="library_group_updates_all">Avvia aggiornamento categorie tutte le volte</string>
</resources>
@@ -40,4 +40,6 @@
<string name="watched_tags_exh">ExHentai मा हेरिएको ट्यागहरू</string>
<string name="tag_filtering_threshold">ट्याग फिल्टरिङ थ्रेसहोल्ड</string>
<string name="tag_filtering_threshhold_error">-9999 र 0 को बीचमा हुनुपर्छ!</string>
</resources>
<string name="artist">कलाकार</string>
<string name="author">लेखक</string>
</resources>
@@ -531,7 +531,7 @@
<string name="bandwidth_hero">Bandwidth Hero (Requer um servidor proxy Bandwidth Hero)</string>
<string name="wsrv">wsrv.nl</string>
<string name="put_merge_in_overflow">Mesclar em transborde</string>
<string name="put_merge_in_overflow_summary">Colocar o botão de mesclar no menu de transborde ao invés da pagina inicial</string>
<string name="put_merge_in_overflow_summary">Colocar o botão de mesclar no menu flutuante ao invés da pagina inicial</string>
<string name="pref_feed_position_summery">Você quer que a aba Feed seja a primeira aba em Navegar? Isso irá fazer dela a aba principal ao abrir Navegar, não é recomendado se você estiver usando uma rede medida ou dados móveis</string>
<string name="label_triggers">Gatilhos</string>
<string name="pref_sync_now_group_title">Sincronizar Ações</string>
@@ -544,7 +544,7 @@
<string name="sync_on_chapter_read">Sincronizar após Leitura de Capitulo</string>
<string name="pref_purge_confirmation_title">Confirmação de Limpeza</string>
<string name="pref_sync_options">Criar gatilhos de sincronização</string>
<string name="sync_on_chapter_open">Sincronizar após Capítulo Aberto</string>
<string name="sync_on_chapter_open">Sincronizar após abrir capítulo</string>
<string name="sync_on_app_start">Sincronizar na Abertura da Aplicação</string>
<string name="pref_ehentai_summary">E/ExHentai login, sincronizar galeria</string>
<string name="pref_mangadex_summary">MangaDex login, segue sincronização</string>
@@ -617,7 +617,7 @@
<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="mangadex_preffered_source_summary">Установить языковой источник MangaDex. Этот источник будет использовать приложение для некоторых функций</string>
<string name="mangadex_add_to_follows">Добавить отслеживание (MangaDex)</string>
<string name="mangadex_follows">Отслеживание MangaDex</string>
<string name="random">Случайная</string>
@@ -674,4 +674,19 @@
<string name="entry_not_tracked">Введённая запись не является сервисом отслеживания</string>
<string name="favorites_sync_unable_to_add_to_remote">Невозможно добавить галерею на удалённый сервер: \'%1$s\' (GID: %2$s)!</string>
<string name="similar_titles">Похожие имена</string>
<string name="rec_hide_library_entries">Скрыть серии которые находятся в библиотеке</string>
<string name="rec_group_tracker">Рекомендации по службам отслеживания</string>
<string name="rec_search_short">Найти рекомендации</string>
<string name="rec_error_title">Ошибка поиска</string>
<string name="rec_error_string">В процессе поиска произошла ошибка: %1$s</string>
<string name="rec_collecting">Сбор рекомендаций</string>
<string name="rec_processing_state">Обрабатывается серия %1$d из %2$d</string>
<string name="rec_services_to_search">Службы по поиску рекомендаций</string>
<string name="rec_group_source">Рекомендации по источникам</string>
<string name="pref_tracker_resolve_using_source_metadata">Выбрать серии использовав метаданные источника</string>
<string name="rec_no_results">Рекомендации не найдены</string>
<string name="pref_tracker_resolve_using_source_metadata_summary">Автоматически выбирать соответствующую серию, если источник предоставляет ссылки на сервисы отслеживания. В данный момент поддерживается MangaDex</string>
<string name="rec_search">Найти общие рекомендации</string>
<string name="rec_initializing">Идёт подготовка</string>
<string name="rec_common_recommendations">Общие рекомендации</string>
</resources>
@@ -0,0 +1,71 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="migrate_entry">
<item quantity="one">%1$d%2$s girdi taşınsın mı?</item>
<item quantity="other">%1$d%2$s girdi taşınsın mı?</item>
</plurals>
<plurals name="humanize_month">
<item quantity="one">%1$d ay önce</item>
<item quantity="other">%1$d ay önce</item>
</plurals>
<plurals name="humanize_week">
<item quantity="one">%1$d hafta önce</item>
<item quantity="other">%1$d hafta önce</item>
</plurals>
<plurals name="humanize_day">
<item quantity="one">%1$d gün önce</item>
<item quantity="other">%1$d gün önce</item>
</plurals>
<plurals name="row_count">
<item quantity="one">%d satır</item>
<item quantity="other">%d satır</item>
</plurals>
<plurals name="num_pages">
<item quantity="one">%1$d sayfa</item>
<item quantity="other">%1$d sayfa</item>
</plurals>
<plurals name="humanize_hour">
<item quantity="one">%1$d saat önce</item>
<item quantity="other">%1$d saat önce</item>
</plurals>
<plurals name="eh_retry_toast">
<item quantity="one">%1$d başarısız sayfa tekrar deneniyor…</item>
<item quantity="other">%1$d başarısız sayfa tekrar deneniyor…</item>
</plurals>
<plurals name="browse_language_and_pages">
<item quantity="one">%2$s, %1$d sayfa</item>
<item quantity="other">%2$s, %1$d sayfa</item>
</plurals>
<plurals name="cleanup_done">
<item quantity="one">Temizleme tamamlandı. %d klasör kaldırıldı</item>
<item quantity="other">Temizleme tamamlandı. %d klasör kaldırıldı</item>
</plurals>
<plurals name="entry_migrated">
<item quantity="one">%d girdi taşındı</item>
<item quantity="other">%d girdi taşındı</item>
</plurals>
<plurals name="copy_entry">
<item quantity="one">%1$d%2$s girdi kopyalansın mı?</item>
<item quantity="other">%1$d%2$s girdi kopyalansın mı?</item>
</plurals>
<plurals name="humanize_minute">
<item quantity="one">%1$d dakika önce</item>
<item quantity="other">%1$d dakika önce</item>
</plurals>
<plurals name="num_lock_times">
<item quantity="one">%d kilit zamanı</item>
<item quantity="other">%d kilit zamanı</item>
</plurals>
<plurals name="pref_tag_sorting_desc">
<item quantity="one">Sıralama listesinde %1$d etiket. Bu, kitaplığa önceliğe dayalı bir sıralama seçeneği ekler. Girdiler, istediğiniz etiketlere sahip olma durumuna göre öncelik alacaktır</item>
<item quantity="other">Sıralama listesinde %1$d etiket. Bu, kitaplığa önceliğe dayalı bir sıralama seçeneği ekler. Girdiler, istediğiniz etiketlere sahip olma durumuna göre öncelik alacaktır</item>
</plurals>
<plurals name="humanize_year">
<item quantity="one">%1$d yıl önce</item>
<item quantity="other">%1$d yıl önce</item>
</plurals>
<plurals name="humanize_second">
<item quantity="one">%1$d saniye önce</item>
<item quantity="other">%1$d saniye önce</item>
</plurals>
</resources>
@@ -134,7 +134,7 @@
<string name="bandwidth_hero">Bandwidth Hero (Bandwidth Hero ara sunucusu gerektirir)</string>
<string name="wsrv">wsrv.nl</string>
<string name="bandwidth_data_saver_server">Bandwidth Hero Ara Sunucusu</string>
<string name="clear_db_exclude_read">Okunmuş bölümleri olan girdileri tut</string>
<string name="clear_db_exclude_read">Okunmuş bölümleri olan girdileri koru</string>
<string name="log_minimal">En düşük</string>
<string name="log_extra">Daha fazla</string>
<string name="log_extreme">En yüksek</string>
@@ -604,4 +604,19 @@
<string name="relation_serialization">Yayın</string>
<string name="ignore_non_library_entries">Kitaplıkta olmayan girdileri görmezden gel</string>
<string name="humanize_fallback">az önce</string>
<string name="pref_tracker_resolve_using_source_metadata_summary">Eğer kaynak, izleyiciler için bağlantılar sağlıyorsa eşleşen içeriği otomatik olarak seçer. Şu anda MangaDex tarafından destekleniyor</string>
<string name="rec_group_source">Kaynak önerileri</string>
<string name="rec_services_to_search">Arama yapılacak öneri hizmetleri</string>
<string name="rec_hide_library_entries">Zaten kitaplıkta olan sonuçları gizle</string>
<string name="rec_group_tracker">İzleyici önerileri</string>
<string name="pref_tracker_resolve_using_source_metadata">Kaynak meta verilerine göre girdileri seç</string>
<string name="rec_search">Sık rastlanan önerileri bul</string>
<string name="rec_common_recommendations">Sık rastlanan öneriler</string>
<string name="rec_search_short">Önerileri bul</string>
<string name="rec_no_results">Öneri bulunamadı</string>
<string name="rec_error_title">Arama başarsız oldu</string>
<string name="rec_error_string">Arama süreci sırasında bir hata oluştu: %1$s</string>
<string name="rec_processing_state">%2$d girdiden %1$d. girdi işleniyor</string>
<string name="rec_collecting">Öneriler toplanıyor</string>
<string name="rec_initializing">Başlatılıyor</string>
</resources>
@@ -0,0 +1,231 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="watched_tags_summary">Відкриває веб-перегляд на вашу сторінку переглянутих тегів E/ExHentai</string>
<string name="action_migrate_now">Мігрувати зараз</string>
<string name="eh_image_quality_2400">2400x</string>
<string name="please_login">Будь ласка, увійдіть!</string>
<string name="show_updater_statistics">Показати статистику оновлень</string>
<string name="pref_category_fork">Налаштування форка</string>
<string name="enable_exhentai">Увімкнути ExHentai</string>
<string name="changelog_version">Версія %1$s</string>
<string name="pref_enhanced_e_hentai_view">Покращений перегляд E/ExHentai</string>
<string name="action_search_manually">Пошук вручну</string>
<string name="pref_mangadex_summary">MangaDex логін, синхронізація галереї</string>
<string name="ignore_sync_errors_summary">Не переривати синхронізацію одразу, якщо під час неї виникають помилки. Помилки все одно відображатимуться після завершення синхронізації. У деяких випадках може призвести до втрати вибраного. Корисно під час синхронізації великих бібліотек.</string>
<string name="use_original_images_off">Наразі використовується ресемплінг зображень</string>
<string name="time_between_batches_2_hours">2 години</string>
<string name="entry_type_manga">Манґа</string>
<string name="requires_login">Потрібен логін</string>
<string name="watched_list_default">Стан фільтра списку спостереження за замовчуванням</string>
<string name="use_hentai_at_home_option_2">Тільки клієнти портів за замовчуванням</string>
<string name="action_skip_entry">Не мігрувати</string>
<string name="action_copy_now">Скопіювати зараз</string>
<string name="action_clean_titles">Очистити назви</string>
<string name="action_start_reading">Почати читати</string>
<string name="action_edit_info">Редагувати дані</string>
<string name="entry_type_manhwa">Манхва</string>
<string name="entry_type_manhua">Маньхва</string>
<string name="entry_type_comic">Комікс</string>
<string name="entry_type_webtoon">Вебтун</string>
<string name="pref_category_all_sources">Всі джерела</string>
<string name="pref_category_mangadex">MangaDex</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_original_images">Використовувати оригінальні зображення</string>
<string name="use_original_images_on">Наразі використовуються оригінальні зображення</string>
<string name="watched_tags">Переглянуті теги</string>
<string name="tag_filtering_threshold">Поріг фільтрації тегів</string>
<string name="tag_watching_threshhold">Поріг Перегляду тегів</string>
<string name="tag_watching_threshhold_error">Має бути від 0 до 9999!</string>
<string name="language_filtering">Фільтрація мов</string>
<string name="frong_page_categories">Категорії на головній сторінці</string>
<string name="fromt_page_categories_summary">Які категорії ви хотіли б показувати за замовчуванням на головній сторінці та в пошуку? Їх все ще можна увімкнути, увімкнувши їх у фільтрах</string>
<string name="watched_list_state_summary">При перегляді ExHentai/E-Hentai чи повинен фільтр списку перегляду бути ввімкненим за замовчуванням</string>
<string name="eh_image_quality_summary">Якість завантажених зображень</string>
<string name="eh_image_quality_auto">Автоматично</string>
<string name="eh_image_quality_1600">1600x</string>
<string name="eh_image_quality_980">980x</string>
<string name="eh_image_quality_780">780x</string>
<string name="favorites_sync">Синхронізація обраного E-Hentai</string>
<string name="disable_favorites_uploading">Вимкнути завантаження обраного</string>
<string name="force_sync_state_reset">Примусове скидання стану синхронізації</string>
<string name="force_sync_state_reset_summary">Виконує повну ресинхронізацію під час наступної синхронізації. Видалені не будуть синхронізовані. Всі обрані в додатку будуть повторно завантажені в ExHentai, а всі обрані на ExHentai будуть повторно завантажені в додаток. Корисно для відновлення синхронізації після того, як її було перервано.</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_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="gallery_updater_statistics">Статистика оновлення галереї</string>
<string name="gallery_updater_stats_text">Востаннє оновлювач запустив %1$s і перевірив %2$d з %3$d галерей, які були готові до перевірки.</string>
<string name="gallery_updater_not_ran_yet">Оновлювач ще не запущено.</string>
<string name="settings_profile_note">Примітка до профілю налаштувань</string>
<string name="eh_settings_successfully_uploaded">Налаштування успішно завантажено!</string>
<string name="eh_settings_uploading_to_server">Завантаження налаштувань на сервер</string>
<string name="ehentai_prefs_account_settings">E-Hentai: Налаштування облікового запису</string>
<string name="show_japanese_titles">Показувати японські назви в результатах пошуку</string>
<string name="show_japanese_titles_option_2">Наразі в результатах пошуку показуються англійські/латинські назви. Очистіть кеш розділів після зміни цього параметра (у розділі Розширені)</string>
<string name="tag_filtering_threshhold_error">Має бути між -9999 та 0!</string>
<string name="pref_category_eh">E-Hentai</string>
<string name="time_between_batches_1_hour">1 година</string>
<string name="pref_ehentai_summary">E/ExHentai логін, синхронізація галереї</string>
<string name="show_japanese_titles_option_1">Наразі показує японські назви в результатах пошуку. Очистіть кеш розділів після зміни цього параметра (у розділі Розширені)</string>
<string name="eh_settings_configuration_failed">Помилка конфігурації!</string>
<string name="use_hentai_at_home">Скористайтеся мережею Hentai@Home</string>
<string name="watched_tags_exh">ExHentai: Переглянуті теги</string>
<string name="tag_filtering_threshhold_summary">Ви можете м\'яко фільтрувати теги, додаючи їх на сторінку Мої теги E/ExHentai з від\'ємним значенням. Якщо в галереї є теги, значення яких менше за те яке стоїть наразі, воно буде відфільтровано з перегляду. Цей поріг можна встановити в діапазоні від -9999 до 0. Наразі: %1$d</string>
<string name="eh_image_quality_1280">1280x</string>
<string name="tag_watching_threshhold_summary">Нещодавно додані галереї будуть показані на екрані перегляду, якщо вони мають хоча б один тег з позитивним значенням, а сума всіх значень їхніх тегів дорівнює цьому значенню або перевищує його. Цей поріг можна встановити в діапазоні від 0 до 9999. Наразі: %1$d</string>
<string name="show_favorite_sync_notes_summary">Показати деяку інформацію про функцію синхронізації вибраного</string>
<string name="language_filtering_summary">Якщо ви хочете приховати галереї певними мовами зі списку галерей та пошуку, виберіть їх у діалоговому вікні, що з\'явиться.\nЗауважте, що відповідні галереї ніколи не з\'являться незалежно від вашого пошукового запиту.\nКоротко кажучи, увімкнено = значить вилучено</string>
<string name="eh_settings_configuration_failed_message">Під час конфігурування сталася помилка: %1$s</string>
<string name="eh_image_quality">Якість зображень</string>
<string name="pref_enhanced_e_hentai_view_summary">Увімкнути/вимкнути розширене меню перегляду, створене для E/ExHentai</string>
<string name="disable_favorites_uploading_summary">Вибране завантажується тільки з ExHentai. Будь-які зміни до обраного в додатку не будуть завантажені. Запобігає випадковій втраті обраного на ExHentai. Зверніть увагу, що видалені обрані все одно будуть завантажені (якщо ви видалите обране на ExHentai, воно також буде видалене в додатку).</string>
<string name="ignore_sync_errors">Ігнорувати помилки синхронізації, коли це можливо</string>
<string name="show_favorite_sync_notes">Показувати нотатки синхронізації обраного</string>
<string name="gallery_update_checker">Перевірка оновлення галереї</string>
<string name="sync_state_reset">Скидання стану синхронізації</string>
<string name="settings_profile_note_message">Тепер додаток додасть новий профіль налаштувань на E-Hentai та ExHentai для оптимізації роботи програми. Будь ласка, переконайтеся, що у вас не більше трьох профілів на обох сайтах.\n\nЯкщо ви не знаєте, що таке профілі налаштувань, то це не має значення, просто натисніть «ОК».</string>
<string name="time_between_batches_3_hours">3 години</string>
<string name="gallery_updater_statistics_collection">Збір статистики…</string>
<string name="gallery_updater_stats_time">\nГалереї, які відвідували останніми:\n- 1 година: %1$d\n- 6 годин: %2$d\n- 12 годин: %3$d\n- Добу: %4$d\n- 2 дні: %5$d\n- Тиждень: %6$d\n- Місяць: %7$d\n- Рік: %8$d</string>
<string name="eh_settings_uploading_to_server_message">Будь ласка, зачекайте, це може зайняти деякий час…</string>
<string name="eh_settings_out_of_slots_error">У вас закінчилися слоти профілю на %1$s, будь ласка, видаліть профіль!</string>
<string name="recheck_login_status">Перевірте статус входу</string>
<string name="alternative_login_page">Альтернативна сторінка входу</string>
<string name="skip_page_restyling">Пропустити редизайн сторінки</string>
<string name="custom_igneous_cookie">Користувацькі кукі</string>
<string name="custom_igneous_cookie_message">Деякі користувачі не можуть отримати доступ до ExHentai звичайним способом, і їм доводиться вводити спеціальне значення користувацькиї кукі, ця опція призначена для таких користувачів.</string>
<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="log_level">Рівень логу</string>
<string name="enable_source_blacklist">Увімкнути чорний список джерел</string>
<string name="enable_source_blacklist_summary">Приховати розширення/джерела, несумісні з %1$s. Примусово перезавантажить програму після зміни.</string>
<string name="open_debug_menu">Відкрити меню налагодження</string>
<string name="starting_cleanup">Початок очищення</string>
<string name="clean_up_downloaded_chapters">Очищення завантажених розділів</string>
<string name="delete_unused_chapters">Видалення відсутніх, частково завантажених та прочитаних тек з розділами</string>
<string name="clean_orphaned_downloads">Видалення файлів без зв\'язку з батьківськими елементами</string>
<string name="clean_read_downloads">Очистити прочитане</string>
<string name="clean_read_entries_not_in_library">Очистити від записів, відсутніх у бібліотеці</string>
<string name="data_saver">Зберігач даних</string>
<string name="data_saver_downloader">Використовувати збереження даних у завантажувачі</string>
<string name="data_saver_ignore_jpeg">Ігнорувати зображення Jpeg</string>
<string name="data_saver_image_quality">Якість зображення</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_color_bw">Перетворити на чорно-білий</string>
<string name="bandwidth_hero">Bandwidth Hero (потрібен проксі-сервер Bandwidth Hero)</string>
<string name="wsrv">wsrv.nl</string>
<string name="bandwidth_data_saver_server">Проксі-сервер Bandwidth Hero</string>
<string name="data_saver_server_summary">Введіть адресу проксі-сервера Bandwidth Hero тут</string>
<string name="clear_db_exclude_read">Зберегти записи з прочитаними розділами</string>
<string name="log_extra">Екстра</string>
<string name="log_minimal">Мінімальний</string>
<string name="log_extreme">Екстрім</string>
<string name="log_minimal_desc">Тільки критичні помилки</string>
<string name="log_extra_desc">Логувати все</string>
<string name="log_extreme_desc">Режим перевірки мережі</string>
<string name="artist">Художник</string>
<string name="author">Автор</string>
<string name="toggle_delegated_sources_summary">Застосувати покращення %1$s до наступних джерел, якщо вони встановлені: %2$s</string>
<string name="no_folders_to_cleanup">Немає тек для очищення</string>
<string name="log_level_summary">Зміна цього параметра може вплинути на продуктивність програми. Примусово перезавантажить програму після зміни. Поточне значення: %s</string>
<string name="open_debug_menu_summary"><![CDATA[DO NOT TOUCH THIS MENU UNLESS YOU KNOW WHAT YOU ARE DOING! <font color=\'red\'>ЦЕ МОЖЕ ПОШКОДИТИ ВАШУ БІБЛІОТЕКУ!</font>]]></string>
<string name="data_saver_summary">Стискати зображення перед завантаженням або показуванням у читалці</string>
<string name="data_saver_ignore_gif">Ігнорувати Gif-анімації</string>
<string name="data_saver_image_quality_summary">Вищі значення означають, що зберігається більший відсоток якості зображення, але це також означає, що розмір файлу більший, 80% - це хороший компроміс між розміром файлу та якістю зображення</string>
<string name="data_saver_image_format_summary_off">Розмір файлу Jpeg значно менший, ніж Webp (тобто зберігається більше даних), але при цьому зображення втрачають більшу якість.\nНаразі стискається в Webp</string>
<string name="toggle_expand_search_filters">Розгорнути всі фільтри пошуку за замовчуванням</string>
<string name="pref_tracker_resolve_using_source_metadata">Вибирати записи за метаданими джерела</string>
<string name="pref_mark_read_dupe_chapters">Позначити повторювані розділи як прочитані</string>
<string name="pref_mark_read_dupe_chapters_summary">Після закінчення читання позначає повторювані розділи як прочитані</string>
<string name="pref_library_mark_duplicate_chapters">Позначати нові дублікати розділів як прочитані</string>
<string name="pref_library_mark_duplicate_chapters_summary">Автоматично позначати нові розділи як прочитані, якщо їх уже прочитали раніше</string>
<string name="update_30min">Кожні 30 хвилин</string>
<string name="update_1hour">Щогодини</string>
<string name="update_3hour">Кожні 3 години</string>
<string name="pref_local_source_hidden_folders">Приховані теки у локальних джерелах</string>
<string name="pref_local_source_hidden_folders_summery">Дозволяє локальним джерелам читати приховані теки</string>
<string name="sync_on_chapter_open">Синхронізація під час відкриття розділу</string>
<string name="set_cbz_zip_password">Встановити пароль для CBZ архівів</string>
<string name="password_protect_downloads">Захист завантажень паролем</string>
<string name="password_protect_downloads_summary">Шифрує завантажені архіви CBZ вказаним паролем.\n ПОПЕРЕДЖЕННЯ: ЯКЩО ВИ ЗАБУДЕТЕ ПАРОЛЬ ДАНІ ВСЕРЕДИНІ АРХІВУ БУДУТЬ ВТРАЧЕНІ НАЗАВЖДИ</string>
<string name="encryption_type">Тип шифрування</string>
<string name="standard_zip_encryption">Стандартне шифрування zip (швидке, але ненадійне)</string>
<string name="page_downloading">Завантаження сторінок</string>
<string name="download_threads">Потоки завантаження</string>
<string name="download_threads_summary">Вищі значення здатні значно пришвидшити завантаження зображень, але також можуть спровокувати бан. Рекомендоване значення - 2 або 3. Поточне значення: %s</string>
<string name="skip_queue_on_retry">Пропускати чергу повторної спроби</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_clear_page_preview_cache">Очистити кеш сторінок</string>
<string name="pref_tracker_resolve_using_source_metadata_summary">Автоматично вибирає відповідну назву, якщо джерело надає посилання на трекери. Наразі підтримується MangaDex</string>
<string name="label_sync">Синхронізація</string>
<string name="label_triggers">Сценарії</string>
<string name="pref_sync_now_group_title">Дії синхронізації</string>
<string name="pref_sync_now">Синхронізувати зараз</string>
<string name="pref_sync_service">Послуга</string>
<string name="pref_sync_service_category">Синхронізація</string>
<string name="pref_sync_automatic_category">Автоматична синхронізація</string>
<string name="pref_sync_interval">Частота синхронізації</string>
<string name="pref_choose_what_to_sync">Виберіть, що синхронізувати</string>
<string name="google_drive_login_success">Вхід до Google Диску</string>
<string name="pref_sync_options">Створити сценарії синхронізації</string>
<string name="google_drive">Google Диск</string>
<string name="pref_google_drive_sign_in">Увійти</string>
<string name="pref_google_drive_purge_sync_data">Очистити дані синхронізації з Google Диска</string>
<string name="pref_sync_options_summ">Можна використовувати для встановлення сценаріїв синхронізації</string>
<string name="sync_on_chapter_read">Синхронізація після прочитання розділу</string>
<string name="sync_on_app_start">Синхронізація під час запуску програми</string>
<string name="biometric_lock_times">Час біометричного блокування</string>
<string name="action_edit_biometric_lock_times">Редагувати час блокування</string>
<string name="biometric_lock_start_time">Уведіть час початку</string>
<string name="biometric_lock_end_time">Уведіть час закінчення</string>
<string name="biometric_lock_days">Дні біометричних блокувань</string>
<string name="biometric_lock_days_summary">Дні, протягом яких застосунок буде заблоковано</string>
<string name="delete_cbz_archive_password">Видалити пароль для CBZ архіву</string>
<string name="aggressively_load_pages">Агресивне завантаження сторінок</string>
<string name="aggressively_load_pages_summary">Повільно завантажує весь розділ під час читання замість того, щоб просто довантажувати сторінки, які ви переглядаєте.</string>
<string name="skip_queue_on_retry_summary">Типово, якщо натиснути кнопку повторити завантаження, програма чекатиме, доки завантажувач завершить завантажувати останню сторінку, а потім перейде до сторінки, на якій стався збій. Увімкнення цієї опції змусить програму почати перезавантаження невдалої сторінки, щойно ви натиснете кнопку.</string>
<string name="reader_preload_amount">Кількість перезавантажених сторінок</string>
<string name="reader_cache_size">Розмір кешу читалки</string>
<string name="reader_cache_size_summary">Кількість зображень збережених на пристрої під час читання. Вищі значення забезпечать більш плавне читання, але збільшать використання дискового простору.</string>
<string name="preserve_reading_position">Зберігати позицію читання для прочитаних розділів</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="auto_webtoon_mode">Автоматично визначити webtoon</string>
<string name="auto_webtoon_mode_summary">Автоматично використовує довгу смугу, якщо запис імовірно є webtoon.</string>
<string name="tap_scroll_page">Натисніть для прокручування сторінки</string>
<string name="tap_scroll_page_summary">Якщо цю опцію увімкнено, прокручування відбуватиметься за розміром сторінки, а не екрана</string>
<string name="reader_bottom_buttons">Нижні кнопки читалки</string>
<string name="pref_force_horz_seekbar">Примусити горизонтальний рядок пошуку</string>
<string name="page_layout">Макет сторінок</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>
<string name="archive_mode_load_from_file">Завантажити з файлу</string>
<string name="archive_mode_load_into_memory">Завантажити в пам\'ять</string>
<string name="archive_mode_cache_to_disk">Скопіювати на диск</string>
<string name="pref_archive_reader_mode">Режим читання архівів</string>
<string name="pref_archive_reader_mode_summary">Спосіб завантаження зображень всередині архівів, таких як CBZ або CBR</string>
<string name="az_recommends">Див. рекомендації</string>
<string name="information_empty_tags">У вас немає тегів. Натисніть кнопку плюс, щоб створити їх для сортування бібліотеки за тегами</string>
</resources>
@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="humanize_week">
<item quantity="other">%1$d tuần trước</item>
</plurals>
<plurals name="humanize_second">
<item quantity="other">%1$d giây trước</item>
</plurals>
<plurals name="num_lock_times">
<item quantity="other">%d Số lần khóa</item>
</plurals>
<plurals name="eh_retry_toast">
<item quantity="other">Đang thử lại %1$d trang bị lỗi…</item>
</plurals>
<plurals name="copy_entry">
<item quantity="other">Sao chép %1$d%2$s mục?</item>
</plurals>
<plurals name="entry_migrated">
<item quantity="other">Đã di chuyển %d mục</item>
</plurals>
<plurals name="num_pages">
<item quantity="other">%1$d trang</item>
</plurals>
<plurals name="humanize_year">
<item quantity="other">%1$d năm trước</item>
</plurals>
<plurals name="humanize_day">
<item quantity="other">%1$d ngày trước</item>
</plurals>
<plurals name="humanize_minute">
<item quantity="other">%1$d phút trước</item>
</plurals>
<plurals name="browse_language_and_pages">
<item quantity="other">%2$s, %1$d trang</item>
</plurals>
<plurals name="humanize_month">
<item quantity="other">%1$d Tháng trước</item>
</plurals>
<plurals name="pref_tag_sorting_desc">
<item quantity="other">%1$d tag in sorting list. This adds a option in the library to sort by a priority based tag list, which means entries will be sorted in a way to prioritise the ones with the tags you want</item>
</plurals>
<plurals name="humanize_hour">
<item quantity="other">%1$d tiếng trước</item>
</plurals>
<plurals name="cleanup_done">
<item quantity="other">Xong. Đã xóa %d thư mục khỏi hệ thống</item>
</plurals>
<plurals name="migrate_entry">
<item quantity="other">Di chuyển %1$d%2$s mục?</item>
</plurals>
</resources>
@@ -134,7 +134,7 @@
<string name="bandwidth_hero">Bandwidth Hero(需要一个 Bandwidth Hero 代理服务器)</string>
<string name="bandwidth_data_saver_server">Bandwidth Hero 代理服务器</string>
<string name="data_saver_server_summary">填写 Bandwidth Hero 代理服务器地址到此</string>
<string name="clear_db_exclude_read">保留有已读章节的作品</string>
<string name="clear_db_exclude_read">保留有已读章节的作品</string>
<!-- Log Level -->
<string name="log_minimal">最小</string>
<string name="log_extra">额外</string>
@@ -505,7 +505,7 @@
<string name="average_rating">平均评分</string>
<string name="last_update_check">最近一次更新检查</string>
<string name="path">路径</string>
<string name="artist">艺术家</string>
<string name="artist">画师</string>
<string name="characters">角色</string>
<string name="group">分组</string>
<string name="media_id">媒体 id</string>
@@ -661,4 +661,20 @@
<string name="entry_not_tracked">条目还未登录历程。</string>
<string name="select_tracker">选择一个历程平台</string>
<string name="favorites_sync_unable_to_add_to_remote">无法将图库新增到远程服务器:“%1$s”(GID: %2$s)!</string>
<string name="pref_tracker_resolve_using_source_metadata">选择条目时使用来源元数据</string>
<string name="pref_tracker_resolve_using_source_metadata_summary">如果来源提供记录平台的链接,则会自动选择匹配的标题,目前支持 MangaDex</string>
<string name="rec_search">查找共同推荐</string>
<string name="rec_hide_library_entries">隐藏已添加到书架中的作品</string>
<string name="rec_services_to_search">用于搜索的推荐服务</string>
<string name="rec_group_source">来源的推荐</string>
<string name="rec_group_tracker">记录平台的推荐</string>
<string name="rec_common_recommendations">常见推荐</string>
<string name="rec_search_short">查找推荐</string>
<string name="rec_no_results">找不到推荐内容</string>
<string name="rec_error_title">搜索失败</string>
<string name="rec_error_string">搜索过程中发生错误:%1$s</string>
<string name="rec_processing_state">正在处理第 %1$d / %2$d 个作品</string>
<string name="rec_collecting">正在搜集推荐</string>
<string name="rec_initializing">正在初始化</string>
<string name="similar_titles">相似标题</string>
</resources>
@@ -41,14 +41,14 @@
<string name="watched_tags_exh">ExHentai 收藏的標籤</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_filtering_threshhold_summary">可以透過在「我的 Tags E/ExHentai」頁面新增負的權重來軟過濾標籤,如果一個畫廊的標籤加起來的權重低於這個值,它就會被過濾掉,這個臨界值可以在 -9999 和 0 之間設定, 目前:%1$d</string>
<string name="tag_watching_threshhold">標籤收藏臨界值</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="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>
@@ -89,7 +89,7 @@
<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="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>
@@ -113,7 +113,7 @@
<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="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>
@@ -135,7 +135,7 @@
<string name="bandwidth_hero">Bandwidth Hero(需要一個 Bandwidth Hero 代理伺服器)</string>
<string name="bandwidth_data_saver_server">Bandwidth Hero 代理伺服器</string>
<string name="data_saver_server_summary">填寫 Bandwidth Hero 代理伺服器網址到此</string>
<string name="clear_db_exclude_read">保留有已讀章節的作品</string>
<string name="clear_db_exclude_read">保留有已讀章節的作品</string>
<!-- Log Level -->
<string name="log_minimal">最小</string>
<string name="log_extra">額外</string>
@@ -226,7 +226,7 @@
<!-- 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_times_empty">未設定生物識別鎖時間表,點擊加號建立一個。</string>
<string name="biometric_lock_time_conflicts">鎖定時間與已經存在的時間衝突!</string>
<string name="biometric_lock_start_time">輸入開始時間</string>
<string name="biometric_lock_end_time">輸入結束時間</string>
@@ -243,12 +243,10 @@
<string name="saturday">週六</string>
<string name="encrypt_database">加密資料庫</string>
<string name="encrypt_database_subtitle">變更需要重新啟動應用程式才能生效</string>
<string name="encrypt_database_message">
<![CDATA[<font color=\'red\'>啟用此選項會建立一個新資料庫。使用以下步驟以保留你的資料<br>1、設定 -> 備份和還原 -> 建立備份<br>2、系統設定 -> 清除應用程式資料<br>3、開啟應用程式然後啟用此選項<br>4、系統設定 -> 強行停止應用程式<br>5、設定 -> 備份和還原 -> 還原備份</font>]]>
</string>
<string name="encrypt_database_message"><![CDATA[<font color=\'red\'>啟用此選項會建立一個新資料庫。使用以下步驟以保留您的資料<br>1、設定 -> 備份和還原 -> 建立備份<br>2、系統設定 -> 清除應用程式資料<br>3、開啟應用程式然後啟用此選項<br>4、系統設定 -> 強行停止應用程式<br>5、設定 -> 備份和還原 -> 還原備份</font>]]></string>
<string name="set_cbz_zip_password">設定 CBZ 檔案密碼</string>
<string name="password_protect_downloads">使用密碼保護下載的檔案</string>
<string name="password_protect_downloads_summary">使用提供的密碼加密 CBZ 檔案。\n警告:如果忘記密碼,檔案中的資料將會遺失</string>
<string name="password_protect_downloads_summary">使用提供的密碼加密 CBZ 檔案。\n警告:如果忘記密碼,檔案中的資料將會遺失</string>
<string name="delete_cbz_archive_password">移除 CBZ 檔案密碼</string>
<string name="cbz_archive_password">CBZ 檔案密碼</string>
<string name="wrong_cbz_archive_password">CBZ 檔案密碼錯誤</string>
@@ -259,9 +257,9 @@
<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="aggressively_load_pages_summary">在閱讀時緩慢地下載整個章節,而不是只載入正在閱讀的頁面。</string>
<string name="skip_queue_on_retry">重試時跳過佇列</string>
<string name="skip_queue_on_retry_summary">通常情況下,在下載失敗時按下重試按鈕,將等待下載器完成最後一頁的下載,然後開始重新下載失敗的頁面。啟用此功能將迫使下載器在按下重試按鈕後立即開始重新下載失敗的頁面。</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>
@@ -300,7 +298,7 @@
<string name="eh_retry_all_help">重試所有說明</string>
<string name="eh_retry_all_help_message">將所有下載失敗的頁面重新加入下載佇列。</string>
<string name="eh_boost_page_help">加速頁面說明</string>
<string name="eh_boost_page_help_message">通常情況下,下載器在同一時間只能下載特定數量的頁面。這代表在等待頁面下載時不會立即開始下載,直到有一個空閒的下載執行緒。啟用「加速頁面」將迫使下載器立即開始下載,而不管是否有可用的執行緒。</string>
<string name="eh_boost_page_help_message">通常情況下,下載器在同一時間只能下載特定數量的頁面。這代表在等待頁面下載時不會立即開始下載,直到有一個空閒的下載執行緒。啟用「加速頁面」將迫使下載器立即開始下載,而不管是否有可用的執行緒。</string>
<string name="eh_boost_page_invalid">此頁面無法加速(無效頁面)!</string>
<string name="eh_boost_page_errored">頁面載入失敗,請按重試按鈕!</string>
<string name="eh_boost_page_downloading">此頁面已經在下載了!</string>
@@ -328,7 +326,7 @@
<string name="double_pages">雙頁</string>
<string name="single_page">單頁</string>
<string name="automatic_orientation">自動(基於方向)</string>
<string name="automatic_can_still_switch">在使用自動頁面版面配置時,仍然可以在閱讀時變更版面配置,而不需要重設這一設定</string>
<string name="automatic_can_still_switch">在使用自動頁面版面配置時,仍然可以在閱讀時變更版面配置,而不需要重設這一設定</string>
<string name="invert_double_pages">反向雙頁</string>
<!-- Center margin -->
<string name="center_margin">中間空白</string>
@@ -379,7 +377,7 @@
<string name="save_search_failed_to_load">載入已儲存的搜尋失敗!</string>
<string name="save_search_failed_to_load_message">載入已儲存的搜尋過程中出現問題。</string>
<string name="save_search_delete">刪除已儲存的搜尋查詢?</string>
<string name="save_search_delete_message">確定要刪除的搜尋查詢:\'%1$s\'</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 -->
@@ -394,12 +392,12 @@
<!-- Sort by tags -->
<string name="pref_tag_sorting">標籤排序標籤</string>
<string name="tag_sorting">標籤排序</string>
<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_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="information_empty_tags">沒有標籤。點按+按鈕以建立一個標籤用來將書櫃排序</string>
<string name="error_tag_exists">此標籤已存在!</string>
<string name="delete_tag">刪除標籤</string>
<string name="delete_tag_confirmation">想要刪除標籤 %s 嗎?</string>
<string name="delete_tag_confirmation">想要刪除標籤 %s 嗎?</string>
<!-- Extension section -->
<string name="ext_redundant">廢棄</string>
<string name="redundant_extension_message">此擴充套件已廢棄,將不會在此版本的 TachiyomiSY 上執行。</string>
@@ -472,10 +470,10 @@
<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_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>
<string name="favorites_sync_conformation_message">確定要與 E-Hentai 同步收藏嗎?</string>
<string name="favorites_sync_conformation_message">確定要與 E-Hentai 同步收藏嗎?</string>
<!-- Gallery Adder -->
<!-- Batch Add -->
<string name="eh_batch_add">批次匯入</string>
@@ -485,7 +483,7 @@
<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_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>
@@ -577,7 +575,7 @@
<!-- Merged entry -->
<string name="merge_settings">合併設定</string>
<string name="fetch_chapter_updates">取得章節更新</string>
<string name="delete_merged_entry">確定嗎?</string>
<string name="delete_merged_entry">確定嗎?</string>
<string name="delete_merged_entry_desc">這將從合併中移除該項目,使用此功能時也會遺失對合併項目所做的任何未儲存更改</string>
<string name="chapter_updates_merged_entry">變更章節更新</string>
<string name="chapter_updates_merged_entry_desc">變更此項將停用或啟用此已合併的漫畫的章節更新</string>
@@ -664,4 +662,19 @@
<string name="fill_from_tracker">從歷程平臺獲取資訊</string>
<string name="favorites_sync_unable_to_add_to_remote">無法將圖庫新增到遠端伺服器:「%1$s」 (GID:%2$s)</string>
<string name="similar_titles">相近標題</string>
<string name="rec_search">尋找共同推薦</string>
<string name="pref_tracker_resolve_using_source_metadata">選擇條目時使用來源元資料</string>
<string name="pref_tracker_resolve_using_source_metadata_summary">如果來源提供歷程平臺的連結,則會自動選擇匹配的標題,目前支持 MangaDex</string>
<string name="rec_services_to_search">用於搜尋的推薦系統</string>
<string name="rec_hide_library_entries">隱藏已在您書櫃中的結果</string>
<string name="rec_common_recommendations">常見推薦</string>
<string name="rec_search_short">尋找推薦</string>
<string name="rec_group_tracker">歷程平臺的推薦</string>
<string name="rec_no_results">找不到推薦內容</string>
<string name="rec_error_title">搜尋失敗</string>
<string name="rec_error_string">搜尋過程中發生錯誤:%1$s</string>
<string name="rec_processing_state">正在處理第 %1$d/%2$d 項條目</string>
<string name="rec_initializing">初始化中</string>
<string name="rec_collecting">正在收集推薦</string>
<string name="rec_group_source">來源的推薦</string>
</resources>
@@ -122,6 +122,7 @@
<string name="action_display_list">List</string>
<string name="action_display_cover_only_grid">Cover-only grid</string>
<string name="action_display_download_badge">Downloaded chapters</string>
<string name="action_display_unread_badge">Unread chapters</string>
<string name="action_display_local_badge">Local source</string>
<string name="action_display_language_badge">Language</string>
<string name="action_display_show_tabs">Show category tabs</string>
@@ -292,7 +293,6 @@
<string name="pref_update_only_started">Skip unstarted entries</string>
<string name="pref_update_only_in_release_period">Predict next release time</string>
<string name="pref_library_update_show_tab_badge">Show unread count on Updates icon</string>
<string name="pref_mark_duplicate_chapter_read">Mark new duplicate read chapters as read</string>
<string name="pref_library_update_refresh_metadata">Automatically refresh metadata</string>
<string name="pref_library_update_refresh_metadata_summary">Check for new cover and details when updating library</string>
@@ -306,11 +306,14 @@
<string name="include">Include: %s</string>
<string name="exclude">Exclude: %s</string>
<string name="pref_chapter_swipe">Chapter swipe</string>
<string name="pref_behavior">Behavior</string>
<!-- This should be to the left for RTL locales -->
<string name="pref_chapter_swipe_end">Swipe to right action</string>
<string name="pref_chapter_swipe_end">Chapter on swipe to right</string>
<!-- This should be to the right for RTL locales -->
<string name="pref_chapter_swipe_start">Swipe to left action</string>
<string name="pref_chapter_swipe_start">Chapter on swipe to left</string>
<string name="pref_mark_duplicate_read_chapter_read">Mark duplicate read chapter as read</string>
<string name="pref_mark_duplicate_read_chapter_read_existing">After reading a chapter</string>
<string name="pref_mark_duplicate_read_chapter_read_new">After fetching new chapter</string>
<!-- Extension section -->
<string name="multi_lang">Multi</string>
@@ -394,7 +397,7 @@
<string name="pref_hardware_bitmap_threshold">Custom hardware bitmap threshold</string>
<string name="pref_hardware_bitmap_threshold_default">Default (%d)</string>
<string name="pref_hardware_bitmap_threshold_summary">If reader loads a blank image incrementally reduce the threshold.\nSelected: %s</string>
<string name="pref_always_decode_long_strip_with_ssiv">Always decode long strip images with SSIV</string>
<string name="pref_always_decode_long_strip_with_ssiv_2">Use legacy decoder for long strip reader</string>
<string name="pref_always_decode_long_strip_with_ssiv_summary">Affects performance. Only enable if reducing bitmap threshold doesn\'t fix blank image issues</string>
<string name="pref_display_profile">Custom display profile</string>
<string name="pref_crop_borders">Crop borders</string>
@@ -36,6 +36,7 @@ import androidx.compose.material3.darkColorScheme
import androidx.compose.material3.lightColorScheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
@@ -173,25 +174,49 @@ fun RadioItem(label: String, selected: Boolean, onClick: () -> Unit) {
@Composable
fun SliderItem(
label: String,
value: Int,
valueText: String,
valueRange: IntProgression,
label: String,
onChange: (Int) -> Unit,
max: Int,
min: Int = 0,
steps: Int = 0,
steps: Int = with(valueRange) { (last - first) - 1 },
valueText: String = value.toString(),
labelStyle: TextStyle = MaterialTheme.typography.bodyMedium,
pillColor: Color = MaterialTheme.colorScheme.surfaceContainerHigh,
) {
BaseSliderItem(
value = value,
valueRange = valueRange,
steps = steps,
label = label,
valueText = valueText,
onChange = onChange,
labelStyle = labelStyle,
pillColor = pillColor,
modifier = Modifier.padding(
horizontal = SettingsItemsPaddings.Horizontal,
vertical = SettingsItemsPaddings.Vertical,
),
)
}
@Composable
fun BaseSliderItem(
value: Int,
valueRange: IntProgression,
label: String,
onChange: (Int) -> Unit,
modifier: Modifier = Modifier,
steps: Int = with(valueRange) { (last - first) - 1 },
valueText: String = value.toString(),
labelStyle: TextStyle = MaterialTheme.typography.bodyMedium,
pillColor: Color = MaterialTheme.colorScheme.surfaceContainerHigh,
) {
val haptic = LocalHapticFeedback.current
Column(
modifier = Modifier
.fillMaxWidth()
.padding(
horizontal = SettingsItemsPaddings.Horizontal,
vertical = SettingsItemsPaddings.Vertical,
),
.then(modifier),
verticalArrangement = Arrangement.spacedBy(2.dp),
) {
Row(
verticalAlignment = Alignment.CenterVertically,
@@ -215,7 +240,7 @@ fun SliderItem(
onChange(it)
haptic.performHapticFeedback(HapticFeedbackType.TextHandleMove)
},
valueRange = min..max,
valueRange = valueRange,
steps = steps,
)
}
@@ -225,15 +250,14 @@ fun SliderItem(
@PreviewLightDark
fun SliderItemPreview() {
MaterialTheme(if (isSystemInDarkTheme()) darkColorScheme() else lightColorScheme()) {
var value by remember { mutableIntStateOf(0) }
Surface {
SliderItem(
value = value,
valueRange = 0..10,
label = "Item per row",
valueText = "Auto",
value = 0,
onChange = {},
min = 0,
max = 10,
steps = 8,
valueText = if (value == 0) "Auto" else value.toString(),
onChange = { value = it },
)
}
}
@@ -17,8 +17,8 @@ fun Slider(
onValueChange: (Int) -> Unit,
modifier: Modifier = Modifier,
enabled: Boolean = true,
valueRange: ClosedRange<Int> = 0..1,
@IntRange(from = 0) steps: Int = 0,
valueRange: IntProgression = 0..1,
@IntRange(from = 0) steps: Int = with(valueRange) { (last - first) - 1 },
onValueChangeFinished: (() -> Unit)? = null,
colors: SliderColors = SliderDefaults.colors(),
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
@@ -38,7 +38,7 @@ fun Slider(
onValueChange = { onValueChange(it.roundToInt()) },
modifier = modifier,
enabled = enabled,
valueRange = with(valueRange) { start.toFloat()..endInclusive.toFloat() },
valueRange = with(valueRange) { first.toFloat()..last.toFloat() },
steps = steps,
onValueChangeFinished = onValueChangeFinished,
colors = colors,
@@ -66,6 +66,11 @@ class EHentaiSearchMetadata : RaisedSearchMetadata() {
.ifEmpty { null }
?.joinToString { it.name }
// Set group (if we can find one)
val group = tags.ofNamespace(EH_GROUP_NAMESPACE)
.ifEmpty { null }
?.joinToString { it.name }
// Copy tags -> genres
val genres = tagsToGenreString()
@@ -80,13 +85,12 @@ class EHentaiSearchMetadata : RaisedSearchMetadata() {
}
}
val description = "meta"
return manga.copy(
url = key ?: manga.url,
title = title ?: manga.title,
artist = artist ?: manga.artist,
description = description,
artist = group ?: manga.artist,
author = artist ?: manga.artist,
description = null,
genre = genres,
status = status,
thumbnail_url = cover ?: manga.thumbnail_url,
@@ -145,6 +149,7 @@ class EHentaiSearchMetadata : RaisedSearchMetadata() {
const val EH_GENRE_NAMESPACE = "genre"
private const val EH_ARTIST_NAMESPACE = "artist"
private const val EH_GROUP_NAMESPACE = "group"
const val EH_LANGUAGE_NAMESPACE = "language"
const val EH_META_NAMESPACE = "meta"
const val EH_UPLOADER_NAMESPACE = "uploader"
@@ -46,7 +46,7 @@ class NHentaiSearchMetadata : RaisedSearchMetadata() {
val cover = if (mediaId != null) {
typeToExtension(coverImageType)?.let {
"https://t3.nhentai.net/galleries/$mediaId/cover.$it"
"https://t1.nhentai.net/galleries/$mediaId/cover.$it"
}
} else {
null
@@ -63,6 +63,11 @@ class NHentaiSearchMetadata : RaisedSearchMetadata() {
if (tags.isNotEmpty()) tags.joinToString(transform = { it.name }) else null
}
// Set group (if we can find one)
val group = tags.ofNamespace(NHENTAI_GROUP_NAMESPACE).let { tags ->
if (tags.isNotEmpty()) tags.joinToString(transform = { it.name }) else null
}
// Copy tags -> genres
val genres = tagsToGenreString()
@@ -77,16 +82,15 @@ class NHentaiSearchMetadata : RaisedSearchMetadata() {
}
}
val description = "meta"
return manga.copy(
url = key ?: manga.url,
thumbnail_url = cover ?: manga.thumbnail_url,
title = title,
artist = artist ?: manga.artist,
artist = group ?: manga.artist,
author = artist ?: manga.artist,
genre = genres,
status = status,
description = description,
description = null,
)
}
@@ -126,6 +130,7 @@ class NHentaiSearchMetadata : RaisedSearchMetadata() {
const val BASE_URL = "https://nhentai.net"
private const val NHENTAI_ARTIST_NAMESPACE = "artist"
private const val NHENTAI_GROUP_NAMESPACE = "group"
const val NHENTAI_CATEGORIES_NAMESPACE = "category"
fun typeToExtension(t: String?) =
@@ -81,6 +81,6 @@ class PururinSearchMetadata : RaisedSearchMetadata() {
private const val TAG_NAMESPACE_ARTIST = "artist"
const val TAG_NAMESPACE_CATEGORY = "category"
const val BASE_URL = "https://pururin.io"
const val BASE_URL = "https://pururin.me"
}
}