diff --git a/.github/workflows/build_pull_request.yml b/.github/workflows/build_pull_request.yml index da79440dc..5a7bfdd10 100644 --- a/.github/workflows/build_pull_request.yml +++ b/.github/workflows/build_pull_request.yml @@ -28,7 +28,7 @@ jobs: uses: actions/dependency-review-action@v3 - name: Set up JDK - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: 17 distribution: adopt diff --git a/.github/workflows/build_push.yml b/.github/workflows/build_push.yml index e43c229a0..6127d3f30 100644 --- a/.github/workflows/build_push.yml +++ b/.github/workflows/build_push.yml @@ -23,7 +23,7 @@ jobs: uses: gradle/wrapper-validation-action@v1 - name: Set up JDK - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: 17 distribution: adopt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index a48438b57..6eb320050 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -22,7 +22,7 @@ android { defaultConfig { applicationId = "eu.kanade.tachiyomi" - versionCode = 110 + versionCode = 111 versionName = "0.14.7" buildConfigField("String", "COMMIT_COUNT", "\"${getCommitCount()}\"") @@ -196,7 +196,6 @@ dependencies { // RxJava implementation(libs.rxjava) - implementation(libs.flowreactivenetwork) // Networking implementation(libs.bundles.okhttp) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fe6f4a6c7..e7d560094 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,6 +7,9 @@ + + + @@ -21,6 +24,8 @@ + + @@ -151,10 +158,6 @@ android:name=".data.notification.NotificationReceiver" android:exported="false" /> - - @@ -168,6 +171,11 @@ android:value="true" /> + + SourceSwitchPreference( + modifier = Modifier.animateItemPlacement(), source = source, onClickSourcePreferences = onClickSourcePreferences, onClickSource = onClickSource, diff --git a/app/src/main/java/eu/kanade/presentation/browse/ExtensionFilterScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/ExtensionFilterScreen.kt index 51acdfccf..c65f0d0b1 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/ExtensionFilterScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/ExtensionFilterScreen.kt @@ -58,6 +58,7 @@ private fun ExtensionFilterContent( ) { items(state.languages) { language -> SwitchPreferenceWidget( + modifier = Modifier.animateItemPlacement(), title = LocaleHelper.getSourceDisplayName(language, context), checked = language in state.enabledLanguages, onCheckedChanged = { onClickLang(language) }, diff --git a/app/src/main/java/eu/kanade/presentation/browse/ExtensionsScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/ExtensionsScreen.kt index 3469af6ca..2e4c6fc0b 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/ExtensionsScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/ExtensionsScreen.kt @@ -148,12 +148,14 @@ private fun ExtensionContent( } ExtensionHeader( textRes = header.textRes, + modifier = Modifier.animateItemPlacement(), action = action, ) } is ExtensionUiModel.Header.Text -> { ExtensionHeader( text = header.text, + modifier = Modifier.animateItemPlacement(), ) } } @@ -165,6 +167,7 @@ private fun ExtensionContent( key = { "extension-${it.hashCode()}" }, ) { item -> ExtensionItem( + modifier = Modifier.animateItemPlacement(), item = item, onClickItem = { when (it) { diff --git a/app/src/main/java/eu/kanade/presentation/browse/MigrateSourceScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/MigrateSourceScreen.kt index b7dc70ebb..e45ca5189 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/MigrateSourceScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/MigrateSourceScreen.kt @@ -132,6 +132,7 @@ private fun MigrateSourceList( key = { (source, _) -> "migrate-${source.id}" }, ) { (source, count) -> MigrateSourceItem( + modifier = Modifier.animateItemPlacement(), source = source, count = count, onClickItem = { onClickItem(source) }, diff --git a/app/src/main/java/eu/kanade/presentation/browse/SourcesFilterScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/SourcesFilterScreen.kt index 6306800b8..e334a451e 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/SourcesFilterScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/SourcesFilterScreen.kt @@ -68,6 +68,7 @@ private fun SourcesFilterContent( contentType = "source-filter-header", ) { SourcesFilterHeader( + modifier = Modifier.animateItemPlacement(), language = language, enabled = enabled, onClickItem = onClickLanguage, @@ -80,6 +81,7 @@ private fun SourcesFilterContent( contentType = { "source-filter-item" }, ) { source -> SourcesFilterItem( + modifier = Modifier.animateItemPlacement(), source = source, enabled = "${source.id}" !in state.disabledSources, onClickItem = onClickSource, diff --git a/app/src/main/java/eu/kanade/presentation/browse/SourcesScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/SourcesScreen.kt index 94cca357d..d0411b7a8 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/SourcesScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/SourcesScreen.kt @@ -74,10 +74,12 @@ fun SourcesScreen( when (model) { is SourceUiModel.Header -> { SourceHeader( + modifier = Modifier.animateItemPlacement(), language = model.language, ) } is SourceUiModel.Item -> SourceItem( + modifier = Modifier.animateItemPlacement(), source = model.source, onClickItem = onClickItem, onLongClickItem = onLongClickItem, diff --git a/app/src/main/java/eu/kanade/presentation/category/CategoryScreen.kt b/app/src/main/java/eu/kanade/presentation/category/CategoryScreen.kt index 471ec7fc9..34a6a1217 100644 --- a/app/src/main/java/eu/kanade/presentation/category/CategoryScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/category/CategoryScreen.kt @@ -107,6 +107,7 @@ private fun CategoryContent( key = { _, category -> "category-${category.id}" }, ) { index, category -> CategoryListItem( + modifier = Modifier.animateItemPlacement(), category = category, canMoveUp = index != 0, canMoveDown = index != categories.lastIndex, diff --git a/app/src/main/java/eu/kanade/presentation/history/HistoryScreen.kt b/app/src/main/java/eu/kanade/presentation/history/HistoryScreen.kt index ec6416480..ce6871e13 100644 --- a/app/src/main/java/eu/kanade/presentation/history/HistoryScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/history/HistoryScreen.kt @@ -123,6 +123,7 @@ private fun HistoryScreenContent( when (item) { is HistoryUiModel.Header -> { RelativeDateHeader( + modifier = Modifier.animateItemPlacement(), date = item.date, relativeTime = relativeTime, dateFormat = dateFormat, @@ -131,6 +132,7 @@ private fun HistoryScreenContent( is HistoryUiModel.Item -> { val value = item.item HistoryItem( + modifier = Modifier.animateItemPlacement(), history = value, onClickCover = { onClickCover(value) }, onClickResume = { onClickResume(value) }, diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDataScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDataScreen.kt index 04d1137a0..87eceb99e 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDataScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDataScreen.kt @@ -114,7 +114,8 @@ object SettingsDataScreen : SearchableSettings { return Preference.PreferenceItem.TextPreference( title = stringResource(MR.strings.pref_storage_location), subtitle = remember(storageDir) { - (UniFile.fromUri(context, storageDir.toUri())?.filePath) + val file = UniFile.fromUri(context, storageDir.toUri()) + file?.filePath ?: file?.uri?.toString() } ?: stringResource(MR.strings.invalid_location, storageDir), onClick = { try { diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/DebugInfoScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/DebugInfoScreen.kt index b4be0ebd9..3eecee438 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/DebugInfoScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/DebugInfoScreen.kt @@ -13,7 +13,6 @@ import eu.kanade.presentation.more.settings.Preference import eu.kanade.presentation.more.settings.PreferenceScaffold import eu.kanade.presentation.more.settings.screen.about.AboutScreen import eu.kanade.presentation.util.Screen -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.util.system.DeviceUtil import eu.kanade.tachiyomi.util.system.WebViewUtil import kotlinx.coroutines.guava.await diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/WorkerInfoScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/WorkerInfoScreen.kt index 2c891e271..ea8db81e8 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/WorkerInfoScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/WorkerInfoScreen.kt @@ -18,17 +18,18 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.unit.dp import androidx.compose.ui.util.fastForEach -import androidx.lifecycle.asFlow import androidx.work.WorkInfo import androidx.work.WorkQuery import cafe.adriel.voyager.core.model.ScreenModel import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow +import eu.kanade.domain.ui.UiPreferences import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.util.Screen import eu.kanade.presentation.util.ioCoroutineScope +import eu.kanade.tachiyomi.util.lang.toDateTimestampString import eu.kanade.tachiyomi.util.system.copyToClipboard import eu.kanade.tachiyomi.util.system.workManager import kotlinx.collections.immutable.persistentListOf @@ -39,6 +40,9 @@ import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.plus +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get +import java.util.Date class WorkerInfoScreen : Screen() { @@ -116,22 +120,19 @@ class WorkerInfoScreen : Screen() { private val workManager = context.workManager val finished = workManager - .getWorkInfosLiveData( + .getWorkInfosFlow( WorkQuery.fromStates(WorkInfo.State.SUCCEEDED, WorkInfo.State.FAILED, WorkInfo.State.CANCELLED), ) - .asFlow() .map(::constructString) .stateIn(ioCoroutineScope, SharingStarted.WhileSubscribed(), "") val running = workManager - .getWorkInfosLiveData(WorkQuery.fromStates(WorkInfo.State.RUNNING)) - .asFlow() + .getWorkInfosFlow(WorkQuery.fromStates(WorkInfo.State.RUNNING)) .map(::constructString) .stateIn(ioCoroutineScope, SharingStarted.WhileSubscribed(), "") val enqueued = workManager - .getWorkInfosLiveData(WorkQuery.fromStates(WorkInfo.State.ENQUEUED)) - .asFlow() + .getWorkInfosFlow(WorkQuery.fromStates(WorkInfo.State.ENQUEUED)) .map(::constructString) .stateIn(ioCoroutineScope, SharingStarted.WhileSubscribed(), "") @@ -146,6 +147,16 @@ class WorkerInfoScreen : Screen() { appendLine(" - $it") } appendLine("State: ${workInfo.state}") + if (workInfo.state == WorkInfo.State.ENQUEUED) { + appendLine( + "Next scheduled run: ${Date(workInfo.nextScheduleTimeMillis).toDateTimestampString( + UiPreferences.dateFormat( + Injekt.get().dateFormat().get(), + ), + )}", + ) + appendLine("Attempt #${workInfo.runAttemptCount + 1}") + } appendLine() } } diff --git a/app/src/main/java/eu/kanade/presentation/reader/BrightnessOverlay.kt b/app/src/main/java/eu/kanade/presentation/reader/BrightnessOverlay.kt deleted file mode 100644 index b945906a4..000000000 --- a/app/src/main/java/eu/kanade/presentation/reader/BrightnessOverlay.kt +++ /dev/null @@ -1,27 +0,0 @@ -package eu.kanade.presentation.reader - -import androidx.annotation.IntRange -import androidx.compose.foundation.Canvas -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.graphicsLayer -import kotlin.math.abs - -@Composable -fun BrightnessOverlay( - @IntRange(from = -100, to = 100) value: Int, -) { - if (value >= 0) return - - Canvas( - modifier = Modifier - .fillMaxSize() - .graphicsLayer { - alpha = abs(value) / 100f - }, - ) { - drawRect(Color.Black) - } -} diff --git a/app/src/main/java/eu/kanade/presentation/reader/OrientationSelectDialog.kt b/app/src/main/java/eu/kanade/presentation/reader/OrientationSelectDialog.kt index ea6f3d58f..22a02444c 100644 --- a/app/src/main/java/eu/kanade/presentation/reader/OrientationSelectDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/reader/OrientationSelectDialog.kt @@ -11,8 +11,6 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.res.vectorResource import androidx.compose.ui.tooling.preview.PreviewLightDark import dev.icerock.moko.resources.StringResource import eu.kanade.domain.manga.model.readerOrientation @@ -72,7 +70,7 @@ private fun DialogContent( selected = mode }, modifier = Modifier.fillMaxWidth(), - imageVector = ImageVector.vectorResource(mode.iconRes), + imageVector = mode.icon, title = stringResource(mode.stringRes), ) } diff --git a/app/src/main/java/eu/kanade/presentation/reader/ReaderContentOverlay.kt b/app/src/main/java/eu/kanade/presentation/reader/ReaderContentOverlay.kt new file mode 100644 index 000000000..4f72ac9af --- /dev/null +++ b/app/src/main/java/eu/kanade/presentation/reader/ReaderContentOverlay.kt @@ -0,0 +1,49 @@ +package eu.kanade.presentation.reader + +import androidx.annotation.ColorInt +import androidx.annotation.IntRange +import androidx.compose.foundation.Canvas +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.BlendMode +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.graphicsLayer +import kotlin.math.abs + +@Composable +fun ReaderContentOverlay( + @IntRange(from = -100, to = 100) brightness: Int, + @ColorInt color: Int?, + colorBlendMode: BlendMode?, + modifier: Modifier = Modifier, +) { + if (brightness < 0) { + val brightnessAlpha = remember(brightness) { + abs(brightness) / 100f + } + + Canvas( + modifier = modifier + .fillMaxSize() + .graphicsLayer { + alpha = brightnessAlpha + }, + ) { + drawRect(Color.Black) + } + } + + if (color != null) { + Canvas( + modifier = modifier + .fillMaxSize(), + ) { + drawRect( + color = Color(color), + blendMode = colorBlendMode ?: BlendMode.SrcOver, + ) + } + } +} diff --git a/app/src/main/java/eu/kanade/presentation/reader/appbars/BottomReaderBar.kt b/app/src/main/java/eu/kanade/presentation/reader/appbars/BottomReaderBar.kt index b1f7189ed..8d0cae57b 100644 --- a/app/src/main/java/eu/kanade/presentation/reader/appbars/BottomReaderBar.kt +++ b/app/src/main/java/eu/kanade/presentation/reader/appbars/BottomReaderBar.kt @@ -49,7 +49,7 @@ fun BottomReaderBar( IconButton(onClick = onClickOrientation) { Icon( - painter = painterResource(orientation.iconRes), + imageVector = orientation.icon, contentDescription = stringResource(MR.strings.rotation_type), ) } diff --git a/app/src/main/java/eu/kanade/presentation/reader/settings/ColorFilterPage.kt b/app/src/main/java/eu/kanade/presentation/reader/settings/ColorFilterPage.kt index 1e7324956..1c5a9c6fb 100644 --- a/app/src/main/java/eu/kanade/presentation/reader/settings/ColorFilterPage.kt +++ b/app/src/main/java/eu/kanade/presentation/reader/settings/ColorFilterPage.kt @@ -1,6 +1,5 @@ package eu.kanade.presentation.reader.settings -import android.os.Build import androidx.compose.foundation.layout.ColumnScope import androidx.compose.material3.FilterChip import androidx.compose.material3.Text @@ -10,6 +9,7 @@ import androidx.core.graphics.alpha import androidx.core.graphics.blue import androidx.core.graphics.green import androidx.core.graphics.red +import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences.Companion.ColorFilterMode import eu.kanade.tachiyomi.ui.reader.setting.ReaderSettingsScreenModel import tachiyomi.core.preference.getAndSet import tachiyomi.i18n.MR @@ -21,25 +21,6 @@ import tachiyomi.presentation.core.util.collectAsState @Composable internal fun ColumnScope.ColorFilterPage(screenModel: ReaderSettingsScreenModel) { - val colorFilterModes = buildList { - addAll( - listOf( - MR.strings.label_default, - MR.strings.filter_mode_multiply, - MR.strings.filter_mode_screen, - ), - ) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - addAll( - listOf( - MR.strings.filter_mode_overlay, - MR.strings.filter_mode_lighten, - MR.strings.filter_mode_darken, - ), - ) - } - }.map { stringResource(it) } - val customBrightness by screenModel.preferences.customBrightness().collectAsState() CheckboxItem( label = stringResource(MR.strings.pref_custom_brightness), @@ -118,11 +99,11 @@ internal fun ColumnScope.ColorFilterPage(screenModel: ReaderSettingsScreenModel) val colorFilterMode by screenModel.preferences.colorFilterMode().collectAsState() SettingsChipRow(MR.strings.pref_color_filter_mode) { - colorFilterModes.mapIndexed { index, it -> + ColorFilterMode.mapIndexed { index, it -> FilterChip( selected = colorFilterMode == index, onClick = { screenModel.preferences.colorFilterMode().set(index) }, - label = { Text(it) }, + label = { Text(stringResource(it.first)) }, ) } } diff --git a/app/src/main/java/eu/kanade/presentation/track/TrackerSearch.kt b/app/src/main/java/eu/kanade/presentation/track/TrackerSearch.kt index f2aa4fb16..ea5a81010 100644 --- a/app/src/main/java/eu/kanade/presentation/track/TrackerSearch.kt +++ b/app/src/main/java/eu/kanade/presentation/track/TrackerSearch.kt @@ -193,6 +193,7 @@ fun TrackerSearch( type = it.publishing_type.toLowerCase(Locale.current).capitalize(Locale.current), startDate = it.start_date, status = it.publishing_status.toLowerCase(Locale.current).capitalize(Locale.current), + score = it.score, description = it.summary.trim(), selected = it == selected, onClick = { onSelectedChange(it) }, @@ -218,6 +219,7 @@ private fun SearchResultItem( type: String, startDate: String, status: String, + score: Float, description: String, selected: Boolean, onClick: () -> Unit, @@ -279,6 +281,12 @@ private fun SearchResultItem( text = status, ) } + if (score != -1f) { + SearchResultItemDetails( + title = stringResource(MR.strings.score), + text = score.toString(), + ) + } } } if (description.isNotBlank()) { diff --git a/app/src/main/java/eu/kanade/presentation/updates/UpdatesUiItem.kt b/app/src/main/java/eu/kanade/presentation/updates/UpdatesUiItem.kt index ad2e0dbc3..eeaee2008 100644 --- a/app/src/main/java/eu/kanade/presentation/updates/UpdatesUiItem.kt +++ b/app/src/main/java/eu/kanade/presentation/updates/UpdatesUiItem.kt @@ -53,6 +53,7 @@ internal fun LazyListScope.updatesLastUpdatedItem( item(key = "updates-lastUpdated") { Box( modifier = Modifier + .animateItemPlacement() .padding(horizontal = MaterialTheme.padding.medium, vertical = MaterialTheme.padding.small), ) { Text( @@ -89,12 +90,14 @@ internal fun LazyListScope.updatesUiItems( when (item) { is UpdatesUiModel.Header -> { ListGroupHeader( + modifier = Modifier.animateItemPlacement(), text = item.date, ) } is UpdatesUiModel.Item -> { val updatesItem = item.item UpdatesUiItem( + modifier = Modifier.animateItemPlacement(), update = updatesItem.update, selected = updatesItem.selected, readProgress = updatesItem.update.lastPageRead diff --git a/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt b/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt index c55ce35da..1c7887dca 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt @@ -416,6 +416,11 @@ object Migrations { newKey = { Preference.appStateKey(it) }, ) } + if (oldVersion < 111) { + File(context.cacheDir, "dl_index_cache") + .takeIf { it.exists() } + ?.delete() + } return true } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreateJob.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreateJob.kt index bc37b8c75..f6fe367f3 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreateJob.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreateJob.kt @@ -17,6 +17,7 @@ import com.hippo.unifile.UniFile import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.util.system.cancelNotification import eu.kanade.tachiyomi.util.system.isRunning +import eu.kanade.tachiyomi.util.system.setForegroundSafely import eu.kanade.tachiyomi.util.system.workManager import logcat.LogPriority import tachiyomi.core.util.system.logcat @@ -39,19 +40,14 @@ class BackupCreateJob(private val context: Context, workerParams: WorkerParamete if (isAutoBackup && BackupRestoreJob.isRunning(context)) return Result.retry() - val backupPreferences = Injekt.get() - val uri = inputData.getString(LOCATION_URI_KEY)?.toUri() ?: getAutomaticBackupLocation() ?: return Result.failure() - val flags = inputData.getInt(BACKUP_FLAGS_KEY, BackupCreateFlags.AutomaticDefaults) + setForegroundSafely() - try { - setForeground(getForegroundInfo()) - } catch (e: IllegalStateException) { - logcat(LogPriority.ERROR, e) { "Not allowed to run on foreground service" } - } + val flags = inputData.getInt(BACKUP_FLAGS_KEY, BackupCreateFlags.AutomaticDefaults) + val backupPreferences = Injekt.get() return try { val location = BackupCreator(context).createBackup(uri, flags, isAutoBackup) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreator.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreator.kt index 1c335ae6e..113cae002 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreator.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreator.kt @@ -1,6 +1,5 @@ package eu.kanade.tachiyomi.data.backup -import android.Manifest import android.content.Context import android.net.Uri import com.hippo.unifile.UniFile @@ -31,7 +30,6 @@ import eu.kanade.tachiyomi.data.backup.models.backupTrackMapper import eu.kanade.tachiyomi.source.ConfigurableSource import eu.kanade.tachiyomi.source.preferenceKey import eu.kanade.tachiyomi.source.sourcePreferences -import eu.kanade.tachiyomi.util.system.hasPermission import kotlinx.serialization.protobuf.ProtoBuf import logcat.LogPriority import okio.buffer @@ -73,10 +71,6 @@ class BackupCreator( * @param isAutoBackup backup called from scheduled backup job */ suspend fun createBackup(uri: Uri, flags: Int, isAutoBackup: Boolean): String { - if (!context.hasPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)) { - throw IllegalStateException(context.stringResource(MR.strings.missing_storage_permission)) - } - val databaseManga = getFavorites.await() val backup = Backup( backupMangas(databaseManga, flags), diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupNotifier.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupNotifier.kt index 835796898..71bdbcc08 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupNotifier.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupNotifier.kt @@ -79,11 +79,7 @@ class BackupNotifier(private val context: Context) { addAction( R.drawable.ic_share_24dp, context.stringResource(MR.strings.action_share), - NotificationReceiver.shareBackupPendingBroadcast( - context, - unifile.uri, - Notifications.ID_BACKUP_COMPLETE, - ), + NotificationReceiver.shareBackupPendingBroadcast(context, unifile.uri), ) show(Notifications.ID_BACKUP_COMPLETE) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestoreJob.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestoreJob.kt index f9b41c330..e4595a4b5 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestoreJob.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestoreJob.kt @@ -12,6 +12,7 @@ import androidx.work.workDataOf import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.util.system.cancelNotification import eu.kanade.tachiyomi.util.system.isRunning +import eu.kanade.tachiyomi.util.system.setForegroundSafely import eu.kanade.tachiyomi.util.system.workManager import kotlinx.coroutines.CancellationException import logcat.LogPriority @@ -29,11 +30,7 @@ class BackupRestoreJob(private val context: Context, workerParams: WorkerParamet ?: return Result.failure() val sync = inputData.getBoolean(SYNC_KEY, false) - try { - setForeground(getForegroundInfo()) - } catch (e: IllegalStateException) { - logcat(LogPriority.ERROR, e) { "Not allowed to run on foreground service" } - } + setForegroundSafely() return try { val restorer = BackupRestorer(context, notifier) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/coil/MangaCoverFetcher.kt b/app/src/main/java/eu/kanade/tachiyomi/data/coil/MangaCoverFetcher.kt index f3c8cc60a..561d32b91 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/coil/MangaCoverFetcher.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/coil/MangaCoverFetcher.kt @@ -1,5 +1,6 @@ package eu.kanade.tachiyomi.data.coil +import androidx.core.net.toUri import coil.ImageLoader import coil.decode.DataSource import coil.decode.ImageSource @@ -10,6 +11,7 @@ import coil.fetch.SourceResult import coil.network.HttpException import coil.request.Options import coil.request.Parameters +import com.hippo.unifile.UniFile import eu.kanade.tachiyomi.data.cache.CoverCache import eu.kanade.tachiyomi.data.coil.MangaCoverFetcher.Companion.USE_CUSTOM_COVER import eu.kanade.tachiyomi.network.await @@ -24,6 +26,7 @@ import okio.Path.Companion.toOkioPath import okio.Source import okio.buffer import okio.sink +import okio.source import tachiyomi.core.util.system.logcat import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.manga.model.MangaCover @@ -69,8 +72,9 @@ class MangaCoverFetcher( // diskCacheKey is thumbnail_url if (url == null) error("No cover specified") return when (getResourceType(url)) { - Type.URL -> httpLoader() Type.File -> fileLoader(File(url.substringAfter("file://"))) + Type.URI -> fileUriLoader(url) + Type.URL -> httpLoader() null -> error("Invalid image") } } @@ -83,6 +87,18 @@ class MangaCoverFetcher( ) } + private fun fileUriLoader(uri: String): FetchResult { + val source = UniFile.fromUri(options.context, uri.toUri())!! + .openInputStream() + .source() + .buffer() + return SourceResult( + source = ImageSource(source = source, context = options.context), + mimeType = "image/*", + dataSource = DataSource.DISK, + ) + } + private suspend fun httpLoader(): FetchResult { // Only cache separately if it's a library item val libraryCoverCacheFile = if (isLibraryManga) { @@ -256,12 +272,15 @@ class MangaCoverFetcher( cover.isNullOrEmpty() -> null cover.startsWith("http", true) || cover.startsWith("Custom-", true) -> Type.URL cover.startsWith("/") || cover.startsWith("file://") -> Type.File + cover.startsWith("content") -> Type.URI else -> null } } private enum class Type { - File, URL + File, + URI, + URL, } class MangaFactory( diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadCache.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadCache.kt index 9fe7dbfee..17930a89e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadCache.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadCache.kt @@ -94,7 +94,7 @@ class DownloadCache( .stateIn(scope, SharingStarted.WhileSubscribed(), false) private val diskCacheFile: File - get() = File(context.cacheDir, "dl_index_cache") + get() = File(context.cacheDir, "dl_index_cache_v2") private val rootDownloadsDirLock = Mutex() private var rootDownloadsDir = RootDirectory(provider.downloadsDir) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadJob.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadJob.kt new file mode 100644 index 000000000..93826afe0 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadJob.kt @@ -0,0 +1,117 @@ +package eu.kanade.tachiyomi.data.download + +import android.content.Context +import android.content.pm.ServiceInfo +import android.os.Build +import androidx.lifecycle.asFlow +import androidx.work.CoroutineWorker +import androidx.work.ExistingWorkPolicy +import androidx.work.ForegroundInfo +import androidx.work.OneTimeWorkRequestBuilder +import androidx.work.WorkInfo +import androidx.work.WorkManager +import androidx.work.WorkerParameters +import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.data.notification.Notifications +import eu.kanade.tachiyomi.util.system.isConnectedToWifi +import eu.kanade.tachiyomi.util.system.isOnline +import eu.kanade.tachiyomi.util.system.notificationBuilder +import eu.kanade.tachiyomi.util.system.setForegroundSafely +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map +import tachiyomi.domain.download.service.DownloadPreferences +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get + +/** + * This worker is used to manage the downloader. The system can decide to stop the worker, in + * which case the downloader is also stopped. It's also stopped while there's no network available. + */ +class DownloadJob(context: Context, workerParams: WorkerParameters) : CoroutineWorker(context, workerParams) { + + private val downloadManager: DownloadManager = Injekt.get() + private val downloadPreferences: DownloadPreferences = Injekt.get() + + override suspend fun getForegroundInfo(): ForegroundInfo { + val notification = applicationContext.notificationBuilder(Notifications.CHANNEL_DOWNLOADER_PROGRESS) { + setContentTitle(applicationContext.getString(R.string.download_notifier_downloader_title)) + setSmallIcon(android.R.drawable.stat_sys_download) + }.build() + return ForegroundInfo( + Notifications.ID_DOWNLOAD_CHAPTER_PROGRESS, + notification, + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC + } else { + 0 + }, + ) + } + + override suspend fun doWork(): Result { + var active = checkConnectivity() && downloadManager.downloaderStart() + + if (!active) { + return Result.failure() + } + + setForegroundSafely() + + // Keep the worker running when needed + while (active) { + delay(100) + active = !isStopped && downloadManager.isRunning && checkConnectivity() + } + + return Result.success() + } + + private fun checkConnectivity(): Boolean { + return with(applicationContext) { + if (isOnline()) { + val noWifi = downloadPreferences.downloadOnlyOverWifi().get() && !isConnectedToWifi() + if (noWifi) { + downloadManager.downloaderStop( + applicationContext.getString(R.string.download_notifier_text_only_wifi), + ) + } + !noWifi + } else { + downloadManager.downloaderStop(applicationContext.getString(R.string.download_notifier_no_network)) + false + } + } + } + + companion object { + private const val TAG = "Downloader" + + fun start(context: Context) { + val request = OneTimeWorkRequestBuilder() + .addTag(TAG) + .build() + WorkManager.getInstance(context) + .enqueueUniqueWork(TAG, ExistingWorkPolicy.REPLACE, request) + } + + fun stop(context: Context) { + WorkManager.getInstance(context) + .cancelUniqueWork(TAG) + } + + fun isRunning(context: Context): Boolean { + return WorkManager.getInstance(context) + .getWorkInfosForUniqueWork(TAG) + .get() + .let { list -> list.count { it.state == WorkInfo.State.RUNNING } == 1 } + } + + fun isRunningFlow(context: Context): Flow { + return WorkManager.getInstance(context) + .getWorkInfosForUniqueWorkLiveData(TAG) + .asFlow() + .map { list -> list.count { it.state == WorkInfo.State.RUNNING } == 1 } + } + } +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt index ba5c4d81a..3e447f4ab 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt @@ -46,6 +46,9 @@ class DownloadManager( */ private val downloader = Downloader(context, provider, cache) + val isRunning: Boolean + get() = downloader.isRunning + /** * Queue to delay the deletion of a list of chapters until triggered. */ @@ -59,13 +62,19 @@ class DownloadManager( fun downloaderStop(reason: String? = null) = downloader.stop(reason) val isDownloaderRunning - get() = DownloadService.isRunning + get() = DownloadJob.isRunningFlow(context) /** * Tells the downloader to begin downloads. */ fun startDownloads() { - DownloadService.start(context) + if (downloader.isRunning) return + + if (DownloadJob.isRunning(context)) { + downloader.start() + } else { + DownloadJob.start(context) + } } /** @@ -94,22 +103,16 @@ class DownloadManager( return queueState.value.find { it.chapter.id == chapterId } } - fun startDownloadNow(chapterId: Long?) { - if (chapterId == null) return - val download = getQueuedDownloadOrNull(chapterId) + fun startDownloadNow(chapterId: Long) { + val existingDownload = getQueuedDownloadOrNull(chapterId) // If not in queue try to start a new download - val toAdd = download ?: runBlocking { Download.fromChapterId(chapterId) } ?: return - val queue = queueState.value.toMutableList() - download?.let { queue.remove(it) } - queue.add(0, toAdd) - reorderQueue(queue) - if (!downloader.isRunning) { - if (DownloadService.isRunning(context)) { - downloader.start() - } else { - DownloadService.start(context) - } + val toAdd = existingDownload ?: runBlocking { Download.fromChapterId(chapterId) } ?: return + queueState.value.toMutableList().apply { + existingDownload?.let { remove(it) } + add(0, toAdd) + reorderQueue(this) } + startDownloads() } /** @@ -143,7 +146,7 @@ class DownloadManager( addAll(0, downloads) reorderQueue(this) } - if (!DownloadService.isRunning(context)) DownloadService.start(context) + if (!DownloadJob.isRunning(context)) startDownloads() } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadService.kt deleted file mode 100644 index 9ce5c5b2a..000000000 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadService.kt +++ /dev/null @@ -1,151 +0,0 @@ -package eu.kanade.tachiyomi.data.download - -import android.app.Notification -import android.app.Service -import android.content.Context -import android.content.Intent -import android.os.IBinder -import android.os.PowerManager -import androidx.core.content.ContextCompat -import dev.icerock.moko.resources.StringResource -import eu.kanade.tachiyomi.data.notification.Notifications -import eu.kanade.tachiyomi.util.system.acquireWakeLock -import eu.kanade.tachiyomi.util.system.isConnectedToWifi -import eu.kanade.tachiyomi.util.system.isOnline -import eu.kanade.tachiyomi.util.system.isServiceRunning -import eu.kanade.tachiyomi.util.system.notificationBuilder -import eu.kanade.tachiyomi.util.system.toast -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.SupervisorJob -import kotlinx.coroutines.cancel -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.catch -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach -import logcat.LogPriority -import ru.beryukhov.reactivenetwork.ReactiveNetwork -import tachiyomi.core.i18n.stringResource -import tachiyomi.core.util.lang.withUIContext -import tachiyomi.core.util.system.logcat -import tachiyomi.domain.download.service.DownloadPreferences -import tachiyomi.i18n.MR -import uy.kohesive.injekt.injectLazy - -/** - * This service is used to manage the downloader. The system can decide to stop the service, in - * which case the downloader is also stopped. It's also stopped while there's no network available. - * While the downloader is running, a wake lock will be held. - */ -class DownloadService : Service() { - - companion object { - - private val _isRunning = MutableStateFlow(false) - val isRunning = _isRunning.asStateFlow() - - /** - * Starts this service. - * - * @param context the application context. - */ - fun start(context: Context) { - val intent = Intent(context, DownloadService::class.java) - ContextCompat.startForegroundService(context, intent) - } - - /** - * Stops this service. - * - * @param context the application context. - */ - fun stop(context: Context) { - context.stopService(Intent(context, DownloadService::class.java)) - } - - /** - * Returns the status of the service. - * - * @param context the application context. - * @return true if the service is running, false otherwise. - */ - fun isRunning(context: Context): Boolean { - return context.isServiceRunning(DownloadService::class.java) - } - } - - private val downloadManager: DownloadManager by injectLazy() - private val downloadPreferences: DownloadPreferences by injectLazy() - - /** - * Wake lock to prevent the device to enter sleep mode. - */ - private lateinit var wakeLock: PowerManager.WakeLock - - private lateinit var scope: CoroutineScope - - override fun onCreate() { - scope = CoroutineScope(SupervisorJob() + Dispatchers.IO) - startForeground(Notifications.ID_DOWNLOAD_CHAPTER_PROGRESS, getPlaceholderNotification()) - wakeLock = acquireWakeLock(javaClass.name) - _isRunning.value = true - listenNetworkChanges() - } - - override fun onDestroy() { - scope.cancel() - _isRunning.value = false - downloadManager.downloaderStop() - if (wakeLock.isHeld) { - wakeLock.release() - } - } - - // Not used - override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { - return START_NOT_STICKY - } - - // Not used - override fun onBind(intent: Intent): IBinder? { - return null - } - - private fun downloaderStop(string: StringResource) { - downloadManager.downloaderStop(stringResource(string)) - } - - private fun listenNetworkChanges() { - ReactiveNetwork() - .observeNetworkConnectivity(applicationContext) - .onEach { - withUIContext { - if (isOnline()) { - if (downloadPreferences.downloadOnlyOverWifi().get() && !isConnectedToWifi()) { - downloaderStop(MR.strings.download_notifier_text_only_wifi) - } else { - val started = downloadManager.downloaderStart() - if (!started) stopSelf() - } - } else { - downloaderStop(MR.strings.download_notifier_no_network) - } - } - } - .catch { error -> - withUIContext { - logcat(LogPriority.ERROR, error) - toast(MR.strings.download_queue_error) - stopSelf() - } - } - .launchIn(scope) - } - - private fun getPlaceholderNotification(): Notification { - return notificationBuilder(Notifications.CHANNEL_DOWNLOADER_PROGRESS) { - setContentTitle(stringResource(MR.strings.download_notifier_downloader_title)) - }.build() - } -} diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt index 5e58d4f6a..1dd117f41 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt @@ -161,10 +161,7 @@ class Downloader( isPaused = false - // Prevent recursion when DownloadService.onDestroy() calls downloader.stop() - if (DownloadService.isRunning.value) { - DownloadService.stop(context) - } + DownloadJob.stop(context) } /** @@ -310,7 +307,7 @@ class Downloader( ) } } - DownloadService.start(context) + DownloadJob.start(context) } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateJob.kt b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateJob.kt index 89fd40dcc..d733f176e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateJob.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateJob.kt @@ -1,6 +1,8 @@ package eu.kanade.tachiyomi.data.library import android.content.Context +import android.content.pm.ServiceInfo +import android.os.Build import androidx.work.BackoffPolicy import androidx.work.Constraints import androidx.work.CoroutineWorker @@ -28,6 +30,7 @@ import eu.kanade.tachiyomi.util.storage.getUriCompat import eu.kanade.tachiyomi.util.system.createFileInCacheDir import eu.kanade.tachiyomi.util.system.isConnectedToWifi import eu.kanade.tachiyomi.util.system.isRunning +import eu.kanade.tachiyomi.util.system.setForegroundSafely import eu.kanade.tachiyomi.util.system.workManager import kotlinx.coroutines.CancellationException import kotlinx.coroutines.async @@ -106,11 +109,7 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet } } - try { - setForeground(getForegroundInfo()) - } catch (e: IllegalStateException) { - logcat(LogPriority.ERROR, e) { "Not allowed to set foreground job" } - } + setForegroundSafely() libraryPreferences.lastUpdatedTimestamp().set(Date().time) @@ -140,6 +139,11 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet return ForegroundInfo( Notifications.ID_LIBRARY_PROGRESS, notifier.progressNotificationBuilder.build(), + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC + } else { + 0 + }, ) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/library/MetadataUpdateJob.kt b/app/src/main/java/eu/kanade/tachiyomi/data/library/MetadataUpdateJob.kt index c2121ccf9..fc8de7617 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/library/MetadataUpdateJob.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/library/MetadataUpdateJob.kt @@ -1,6 +1,8 @@ package eu.kanade.tachiyomi.data.library import android.content.Context +import android.content.pm.ServiceInfo +import android.os.Build import androidx.work.CoroutineWorker import androidx.work.ExistingWorkPolicy import androidx.work.ForegroundInfo @@ -16,6 +18,7 @@ import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.source.UnmeteredSource import eu.kanade.tachiyomi.util.prepUpdateCover import eu.kanade.tachiyomi.util.system.isRunning +import eu.kanade.tachiyomi.util.system.setForegroundSafely import eu.kanade.tachiyomi.util.system.workManager import kotlinx.coroutines.CancellationException import kotlinx.coroutines.async @@ -51,11 +54,7 @@ class MetadataUpdateJob(private val context: Context, workerParams: WorkerParame private var mangaToUpdate: List = mutableListOf() override suspend fun doWork(): Result { - try { - setForeground(getForegroundInfo()) - } catch (e: IllegalStateException) { - logcat(LogPriority.ERROR, e) { "Not allowed to set foreground job" } - } + setForegroundSafely() addMangaToQueue() @@ -82,6 +81,11 @@ class MetadataUpdateJob(private val context: Context, workerParams: WorkerParame return ForegroundInfo( Notifications.ID_LIBRARY_PROGRESS, notifier.progressNotificationBuilder.build(), + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC + } else { + 0 + }, ) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt b/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt index e3da3b7e3..51a5bdc72 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt @@ -7,6 +7,7 @@ import android.content.Intent import android.net.Uri import android.os.Build import androidx.core.net.toUri +import com.hippo.unifile.UniFile import eu.kanade.tachiyomi.data.backup.BackupRestoreJob import eu.kanade.tachiyomi.data.download.DownloadManager import eu.kanade.tachiyomi.data.library.LibraryUpdateJob @@ -15,7 +16,6 @@ import eu.kanade.tachiyomi.data.updater.AppUpdateDownloadJob import eu.kanade.tachiyomi.ui.main.MainActivity import eu.kanade.tachiyomi.ui.reader.ReaderActivity import eu.kanade.tachiyomi.util.storage.DiskUtil -import eu.kanade.tachiyomi.util.storage.getUriCompat import eu.kanade.tachiyomi.util.system.cancelNotification import eu.kanade.tachiyomi.util.system.getParcelableExtraCompat import eu.kanade.tachiyomi.util.system.notificationManager @@ -36,7 +36,6 @@ import tachiyomi.i18n.MR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import uy.kohesive.injekt.injectLazy -import java.io.File import eu.kanade.tachiyomi.BuildConfig.APPLICATION_ID as ID /** @@ -65,15 +64,13 @@ class NotificationReceiver : BroadcastReceiver() { ACTION_SHARE_IMAGE -> shareImage( context, - intent.getStringExtra(EXTRA_FILE_LOCATION)!!, - intent.getIntExtra(EXTRA_NOTIFICATION_ID, -1), + intent.getStringExtra(EXTRA_URI)!!.toUri(), ) // Delete image from path and dismiss notification ACTION_DELETE_IMAGE -> deleteImage( context, - intent.getStringExtra(EXTRA_FILE_LOCATION)!!, - intent.getIntExtra(EXTRA_NOTIFICATION_ID, -1), + intent.getStringExtra(EXTRA_URI)!!.toUri(), ) // Share backup file ACTION_SHARE_BACKUP -> @@ -81,7 +78,6 @@ class NotificationReceiver : BroadcastReceiver() { context, intent.getParcelableExtraCompat(EXTRA_URI)!!, "application/x-protobuf+gzip", - intent.getIntExtra(EXTRA_NOTIFICATION_ID, -1), ) ACTION_CANCEL_RESTORE -> cancelRestore(context) @@ -140,12 +136,10 @@ class NotificationReceiver : BroadcastReceiver() { * Called to start share intent to share image * * @param context context of application - * @param path path of file - * @param notificationId id of notification + * @param uri path of file */ - private fun shareImage(context: Context, path: String, notificationId: Int) { - dismissNotification(context, notificationId) - context.startActivity(File(path).getUriCompat(context).toShareIntent(context)) + private fun shareImage(context: Context, uri: Uri) { + context.startActivity(uri.toShareIntent(context)) } /** @@ -153,10 +147,8 @@ class NotificationReceiver : BroadcastReceiver() { * * @param context context of application * @param path path of file - * @param notificationId id of notification */ - private fun shareFile(context: Context, uri: Uri, fileMimeType: String, notificationId: Int) { - dismissNotification(context, notificationId) + private fun shareFile(context: Context, uri: Uri, fileMimeType: String) { context.startActivity(uri.toShareIntent(context, fileMimeType)) } @@ -183,17 +175,11 @@ class NotificationReceiver : BroadcastReceiver() { /** * Called to delete image * - * @param path path of file - * @param notificationId id of notification + * @param uri path of file */ - private fun deleteImage(context: Context, path: String, notificationId: Int) { - dismissNotification(context, notificationId) - - // Delete file - val file = File(path) - file.delete() - - DiskUtil.scanMedia(context, file.toUri()) + private fun deleteImage(context: Context, uri: Uri) { + UniFile.fromUri(context, uri)?.delete() + DiskUtil.scanMedia(context, uri) } /** @@ -423,18 +409,17 @@ class NotificationReceiver : BroadcastReceiver() { } /** - * Returns [PendingIntent] that starts a service which cancels the notification and starts a share activity + * Returns [PendingIntent] that starts a share activity * * @param context context of application - * @param path location path of file + * @param uri location path of file * @param notificationId id of notification * @return [PendingIntent] */ - internal fun shareImagePendingBroadcast(context: Context, path: String, notificationId: Int): PendingIntent { + internal fun shareImagePendingBroadcast(context: Context, uri: Uri): PendingIntent { val intent = Intent(context, NotificationReceiver::class.java).apply { action = ACTION_SHARE_IMAGE - putExtra(EXTRA_FILE_LOCATION, path) - putExtra(EXTRA_NOTIFICATION_ID, notificationId) + putExtra(EXTRA_URI, uri.toString()) } return PendingIntent.getBroadcast( context, @@ -448,15 +433,13 @@ class NotificationReceiver : BroadcastReceiver() { * Returns [PendingIntent] that starts a service which removes an image from disk * * @param context context of application - * @param path location path of file - * @param notificationId id of notification + * @param uri location path of file * @return [PendingIntent] */ - internal fun deleteImagePendingBroadcast(context: Context, path: String, notificationId: Int): PendingIntent { + internal fun deleteImagePendingBroadcast(context: Context, uri: Uri): PendingIntent { val intent = Intent(context, NotificationReceiver::class.java).apply { action = ACTION_DELETE_IMAGE - putExtra(EXTRA_FILE_LOCATION, path) - putExtra(EXTRA_NOTIFICATION_ID, notificationId) + putExtra(EXTRA_URI, uri.toString()) } return PendingIntent.getBroadcast( context, @@ -639,14 +622,12 @@ class NotificationReceiver : BroadcastReceiver() { * * @param context context of application * @param uri uri of backup file - * @param notificationId id of notification * @return [PendingIntent] */ - internal fun shareBackupPendingBroadcast(context: Context, uri: Uri, notificationId: Int): PendingIntent { + internal fun shareBackupPendingBroadcast(context: Context, uri: Uri): PendingIntent { val intent = Intent(context, NotificationReceiver::class.java).apply { action = ACTION_SHARE_BACKUP putExtra(EXTRA_URI, uri) - putExtra(EXTRA_NOTIFICATION_ID, notificationId) } return PendingIntent.getBroadcast( context, diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt index b1142c74d..c1d0a855b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt @@ -153,6 +153,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { |month |day |} + |averageScore |} |} |} @@ -309,6 +310,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { struct["status"]!!.jsonPrimitive.contentOrNull ?: "", parseDate(struct, "startDate"), struct["chapters"]!!.jsonPrimitive.intOrNull ?: 0, + struct["averageScore"]?.jsonPrimitive?.intOrNull ?: -1, ) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistModels.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistModels.kt index e0103371e..eb2f15ab2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistModels.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistModels.kt @@ -19,6 +19,7 @@ data class ALManga( val publishing_status: String, val start_date_fuzzy: Long, val total_chapters: Int, + val average_score: Int, ) { fun toTrack() = TrackSearch.create(TrackerManager.ANILIST).apply { @@ -27,6 +28,7 @@ data class ALManga( total_chapters = this@ALManga.total_chapters cover_url = image_url_lge summary = description?.htmlDecode() ?: "" + score = average_score.toFloat() tracking_url = AnilistApi.mangaUrl(media_id) publishing_status = this@ALManga.publishing_status publishing_type = format diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiApi.kt index 6762fdcaf..29db49ec5 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiApi.kt @@ -11,6 +11,7 @@ import eu.kanade.tachiyomi.network.parseAs import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.contentOrNull +import kotlinx.serialization.json.floatOrNull import kotlinx.serialization.json.int import kotlinx.serialization.json.jsonArray import kotlinx.serialization.json.jsonObject @@ -108,11 +109,13 @@ class BangumiApi( } else { 0 } + val rating = obj["rating"]?.jsonObject?.get("score")?.jsonPrimitive?.floatOrNull ?: -1f return TrackSearch.create(trackId).apply { media_id = obj["id"]!!.jsonPrimitive.long title = obj["name_cn"]!!.jsonPrimitive.content cover_url = coverUrl summary = obj["name"]!!.jsonPrimitive.content + score = rating tracking_url = obj["url"]!!.jsonPrimitive.content total_chapters = totalChapters } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt index 2d54b266b..5406be0ad 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt @@ -279,7 +279,7 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) private const val algoliaAppId = "AWQO5J657S" private const val algoliaFilter = "&facetFilters=%5B%22kind%3Amanga%22%5D&attributesToRetrieve=" + - "%5B%22synopsis%22%2C%22canonicalTitle%22%2C%22chapterCount%22%2C%22" + + "%5B%22synopsis%22%2C%22averageRating%22%2C%22canonicalTitle%22%2C%22chapterCount%22%2C%22" + "posterImage%22%2C%22startDate%22%2C%22subtype%22%2C%22endDate%22%2C%20%22id%22%5D" fun mangaUrl(remoteId: Long): String { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuModels.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuModels.kt index 1cbf16c71..156f6d8f3 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuModels.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuModels.kt @@ -28,6 +28,7 @@ class KitsuSearchManga(obj: JsonObject) { null } private val synopsis = obj["synopsis"]?.jsonPrimitive?.contentOrNull + private val rating = obj["averageRating"]?.jsonPrimitive?.contentOrNull?.toFloatOrNull() private var startDate = obj["startDate"]?.jsonPrimitive?.contentOrNull?.let { val outputDf = SimpleDateFormat("yyyy-MM-dd", Locale.US) outputDf.format(Date(it.toLong() * 1000)) @@ -42,6 +43,7 @@ class KitsuSearchManga(obj: JsonObject) { cover_url = original ?: "" summary = synopsis ?: "" tracking_url = KitsuApi.mangaUrl(media_id) + score = rating ?: -1f publishing_status = if (endDate == null) { "Publishing" } else { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/model/TrackSearch.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/model/TrackSearch.kt index 2f930b50c..7151aab62 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/model/TrackSearch.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/model/TrackSearch.kt @@ -20,7 +20,7 @@ class TrackSearch : Track { override var total_chapters: Int = 0 - override var score: Float = 0f + override var score: Float = -1f override var status: Int = 0 diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListApi.kt index db89bcc11..444c5512f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListApi.kt @@ -16,6 +16,7 @@ import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.boolean import kotlinx.serialization.json.contentOrNull import kotlinx.serialization.json.float +import kotlinx.serialization.json.floatOrNull import kotlinx.serialization.json.int import kotlinx.serialization.json.jsonArray import kotlinx.serialization.json.jsonObject @@ -103,7 +104,7 @@ class MyAnimeListApi( .appendPath(id.toString()) .appendQueryParameter( "fields", - "id,title,synopsis,num_chapters,main_picture,status,media_type,start_date", + "id,title,synopsis,num_chapters,mean,main_picture,status,media_type,start_date", ) .build() with(json) { @@ -117,6 +118,7 @@ class MyAnimeListApi( title = obj["title"]!!.jsonPrimitive.content summary = obj["synopsis"]?.jsonPrimitive?.content ?: "" total_chapters = obj["num_chapters"]!!.jsonPrimitive.int + score = obj["mean"]?.jsonPrimitive?.floatOrNull ?: -1f cover_url = obj["main_picture"]?.jsonObject?.get("large")?.jsonPrimitive?.content ?: "" diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriApi.kt index 8ae22f3c9..0a5bba772 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriApi.kt @@ -107,6 +107,7 @@ class ShikimoriApi( total_chapters = obj["chapters"]!!.jsonPrimitive.int cover_url = baseUrl + obj["image"]!!.jsonObject["preview"]!!.jsonPrimitive.content summary = "" + score = obj["score"]!!.jsonPrimitive.float tracking_url = baseUrl + obj["url"]!!.jsonPrimitive.content publishing_status = obj["status"]!!.jsonPrimitive.content publishing_type = obj["kind"]!!.jsonPrimitive.content diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateDownloadJob.kt b/app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateDownloadJob.kt index 581f15a12..a242485c4 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateDownloadJob.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateDownloadJob.kt @@ -17,13 +17,12 @@ import eu.kanade.tachiyomi.network.await import eu.kanade.tachiyomi.network.newCachelessCallWithProgress import eu.kanade.tachiyomi.util.storage.getUriCompat import eu.kanade.tachiyomi.util.storage.saveTo +import eu.kanade.tachiyomi.util.system.setForegroundSafely import eu.kanade.tachiyomi.util.system.workManager -import logcat.LogPriority import okhttp3.internal.http2.ErrorCode import okhttp3.internal.http2.StreamResetException import tachiyomi.core.i18n.stringResource import tachiyomi.core.util.lang.withIOContext -import tachiyomi.core.util.system.logcat import tachiyomi.i18n.MR import uy.kohesive.injekt.injectLazy import java.io.File @@ -43,11 +42,7 @@ class AppUpdateDownloadJob(private val context: Context, workerParams: WorkerPar return Result.failure() } - try { - setForeground(getForegroundInfo()) - } catch (e: IllegalStateException) { - logcat(LogPriority.ERROR, e) { "Not allowed to run on foreground service" } - } + setForegroundSafely() withIOContext { downloadApk(title, url) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegate.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegate.kt index dc017c328..02589cec9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegate.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegate.kt @@ -10,7 +10,6 @@ import eu.kanade.tachiyomi.core.security.SecurityPreferences import eu.kanade.tachiyomi.ui.security.UnlockActivity import eu.kanade.tachiyomi.util.system.AuthenticatorUtil import eu.kanade.tachiyomi.util.system.AuthenticatorUtil.isAuthenticationSupported -import eu.kanade.tachiyomi.util.system.overridePendingTransitionCompat import eu.kanade.tachiyomi.util.view.setSecureScreen import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.launchIn @@ -107,7 +106,7 @@ class SecureActivityDelegateImpl : SecureActivityDelegate, DefaultLifecycleObser if (activity.isAuthenticationSupported()) { if (!SecureActivityDelegate.requireUnlock) return activity.startActivity(Intent(activity, UnlockActivity::class.java)) - activity.overridePendingTransitionCompat(0, 0) + activity.overridePendingTransition(0, 0) } else { securityPreferences.useAuthenticator().set(false) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MigrationFlags.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MigrationFlags.kt index c79c111fc..3064ad60f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MigrationFlags.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MigrationFlags.kt @@ -6,7 +6,6 @@ import eu.kanade.tachiyomi.data.cache.CoverCache import eu.kanade.tachiyomi.data.download.DownloadCache import tachiyomi.domain.manga.model.Manga import tachiyomi.i18n.MR -import uy.kohesive.injekt.api.get import uy.kohesive.injekt.injectLazy data class MigrationFlag( diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadQueueScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadQueueScreenModel.kt index 3cfb3ff1a..3f8896632 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadQueueScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadQueueScreenModel.kt @@ -11,12 +11,14 @@ import eu.kanade.tachiyomi.source.model.Page import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import uy.kohesive.injekt.Injekt @@ -137,8 +139,8 @@ class DownloadQueueScreenModel( adapter = null } - val isDownloaderRunning - get() = downloadManager.isDownloaderRunning + val isDownloaderRunning = downloadManager.isDownloaderRunning + .stateIn(screenModelScope, SharingStarted.WhileSubscribed(5000), false) fun getDownloadStatusFlow() = downloadManager.statusFlow() fun getDownloadProgressFlow() = downloadManager.progressFlow() diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt index 7900b377c..c67a49084 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt @@ -34,17 +34,16 @@ import androidx.core.transition.doOnEnd import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsControllerCompat -import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView import com.google.android.material.elevation.SurfaceColors import com.google.android.material.transition.platform.MaterialContainerTransform import dev.chrisbanes.insetter.applyInsetter import eu.kanade.domain.base.BasePreferences -import eu.kanade.presentation.reader.BrightnessOverlay import eu.kanade.presentation.reader.DisplayRefreshHost import eu.kanade.presentation.reader.OrientationSelectDialog import eu.kanade.presentation.reader.PageIndicatorText +import eu.kanade.presentation.reader.ReaderContentOverlay import eu.kanade.presentation.reader.ReaderPageActionsDialog import eu.kanade.presentation.reader.ReadingModeSelectDialog import eu.kanade.presentation.reader.appbars.ReaderAppBars @@ -70,7 +69,6 @@ import eu.kanade.tachiyomi.ui.reader.viewer.ReaderProgressIndicator import eu.kanade.tachiyomi.ui.webview.WebViewActivity import eu.kanade.tachiyomi.util.system.hasDisplayCutout import eu.kanade.tachiyomi.util.system.isNightMode -import eu.kanade.tachiyomi.util.system.overridePendingTransitionCompat import eu.kanade.tachiyomi.util.system.toShareIntent import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.util.view.setComposeContent @@ -90,7 +88,6 @@ import tachiyomi.core.util.lang.launchIO import tachiyomi.core.util.lang.launchNonCancellable import tachiyomi.core.util.lang.withUIContext import tachiyomi.core.util.system.logcat -import tachiyomi.domain.manga.model.Manga import tachiyomi.i18n.MR import tachiyomi.presentation.core.util.collectAsState import uy.kohesive.injekt.Injekt @@ -139,7 +136,7 @@ class ReaderActivity : BaseActivity() { */ override fun onCreate(savedInstanceState: Bundle?) { registerSecureActivity(this) - overridePendingTransitionCompat(R.anim.shared_axis_x_push_enter, R.anim.shared_axis_x_push_exit) + overridePendingTransition(R.anim.shared_axis_x_push_enter, R.anim.shared_axis_x_push_exit) super.onCreate(savedInstanceState) @@ -185,7 +182,7 @@ class ReaderActivity : BaseActivity() { .map { it.manga } .distinctUntilChanged() .filterNotNull() - .onEach(::setManga) + .onEach { updateViewer() } .launchIn(lifecycleScope) viewModel.state @@ -270,7 +267,7 @@ class ReaderActivity : BaseActivity() { override fun finish() { viewModel.onActivityFinish() super.finish() - overridePendingTransitionCompat(R.anim.shared_axis_x_pop_enter, R.anim.shared_axis_x_pop_exit) + overridePendingTransition(R.anim.shared_axis_x_pop_enter, R.anim.shared_axis_x_pop_exit) } override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean { @@ -332,11 +329,24 @@ class ReaderActivity : BaseActivity() { val isFullscreen by readerPreferences.fullscreen().collectAsState() val flashOnPageChange by readerPreferences.flashOnPageChange().collectAsState() + val colorOverlayEnabled by readerPreferences.colorFilter().collectAsState() + val colorOverlay by readerPreferences.colorFilterValue().collectAsState() + val colorOverlayMode by readerPreferences.colorFilterMode().collectAsState() + val colorOverlayBlendMode = remember(colorOverlayMode) { + ReaderPreferences.ColorFilterMode.getOrNull(colorOverlayMode)?.second + } + val cropBorderPaged by readerPreferences.cropBorders().collectAsState() val cropBorderWebtoon by readerPreferences.cropBordersWebtoon().collectAsState() val isPagerType = ReadingMode.isPagerType(viewModel.getMangaReadingMode()) val cropEnabled = if (isPagerType) cropBorderPaged else cropBorderWebtoon + ReaderContentOverlay( + brightness = state.brightnessOverlayValue, + color = colorOverlay.takeIf { colorOverlayEnabled }, + colorBlendMode = colorOverlayBlendMode, + ) + ReaderAppBars( visible = state.menuVisible, fullscreen = isFullscreen, @@ -379,10 +389,6 @@ class ReaderActivity : BaseActivity() { onClickSettings = viewModel::openSettingsDialog, ) - BrightnessOverlay( - value = state.brightnessOverlayValue, - ) - if (flashOnPageChange) { DisplayRefreshHost( hostState = displayRefreshHost, @@ -479,10 +485,9 @@ class ReaderActivity : BaseActivity() { } /** - * Called from the presenter when a manga is ready. Used to instantiate the appropriate viewer - * and the toolbar title. + * Called from the presenter when a manga is ready. Used to instantiate the appropriate viewer. */ - private fun setManga(manga: Manga) { + private fun updateViewer() { val prevViewer = viewModel.state.value.viewer val newViewer = ReadingMode.toViewer(viewModel.getMangaReadingMode(), this) @@ -806,14 +811,6 @@ class ReaderActivity : BaseActivity() { .onEach(::setCustomBrightness) .launchIn(lifecycleScope) - readerPreferences.colorFilter().changes() - .onEach(::setColorFilter) - .launchIn(lifecycleScope) - - readerPreferences.colorFilterMode().changes() - .onEach { setColorFilter(readerPreferences.colorFilter().get()) } - .launchIn(lifecycleScope) - merge(readerPreferences.grayscale().changes(), readerPreferences.invertedColors().changes()) .onEach { setLayerPaint(readerPreferences.grayscale().get(), readerPreferences.invertedColors().get()) } .launchIn(lifecycleScope) @@ -885,20 +882,6 @@ class ReaderActivity : BaseActivity() { } } - /** - * Sets the color filter overlay according to [enabled]. - */ - private fun setColorFilter(enabled: Boolean) { - if (enabled) { - readerPreferences.colorFilterValue().changes() - .sample(100) - .onEach(::setColorFilterValue) - .launchIn(lifecycleScope) - } else { - binding.colorOverlay.isVisible = false - } - } - /** * Sets the brightness of the screen. Range is [-75, 100]. * From -75 to -1 a semi-transparent black view is overlaid with the minimum brightness. @@ -920,15 +903,6 @@ class ReaderActivity : BaseActivity() { viewModel.setBrightnessOverlayValue(value) } - - /** - * Sets the color filter [value]. - */ - private fun setColorFilterValue(value: Int) { - binding.colorOverlay.isVisible = true - binding.colorOverlay.setFilterColor(value, readerPreferences.colorFilterMode().get()) - } - private fun setLayerPaint(grayscale: Boolean, invertedColors: Boolean) { val paint = if (grayscale || invertedColors) getCombinedPaint(grayscale, invertedColors) else null binding.viewerContainer.setLayerType(LAYER_TYPE_HARDWARE, paint) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderColorFilterView.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderColorFilterView.kt deleted file mode 100644 index 6266ab239..000000000 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderColorFilterView.kt +++ /dev/null @@ -1,36 +0,0 @@ -package eu.kanade.tachiyomi.ui.reader - -import android.content.Context -import android.graphics.Canvas -import android.graphics.Paint -import android.graphics.PorterDuff -import android.util.AttributeSet -import android.view.View -import androidx.core.graphics.toXfermode - -class ReaderColorFilterView( - context: Context, - attrs: AttributeSet? = null, -) : View(context, attrs) { - - private val colorFilterPaint: Paint = Paint() - - fun setFilterColor(color: Int, filterMode: Int) { - colorFilterPaint.color = color - colorFilterPaint.xfermode = when (filterMode) { - 1 -> PorterDuff.Mode.MULTIPLY - 2 -> PorterDuff.Mode.SCREEN - 3 -> PorterDuff.Mode.OVERLAY - 4 -> PorterDuff.Mode.LIGHTEN - 5 -> PorterDuff.Mode.DARKEN - else -> PorterDuff.Mode.SRC_OVER - }.toXfermode() - - invalidate() - } - - override fun onDraw(canvas: Canvas) { - super.onDraw(canvas) - canvas.drawPaint(colorFilterPaint) - } -} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/SaveImageNotifier.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/SaveImageNotifier.kt index 56813b714..de5b5f011 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/SaveImageNotifier.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/SaveImageNotifier.kt @@ -81,13 +81,13 @@ class SaveImageNotifier(private val context: Context) { addAction( R.drawable.ic_share_24dp, context.stringResource(MR.strings.action_share), - NotificationReceiver.shareImagePendingBroadcast(context, uri.path!!, notificationId), + NotificationReceiver.shareImagePendingBroadcast(context, uri), ) // Delete action addAction( R.drawable.ic_delete_24dp, context.stringResource(MR.strings.action_delete), - NotificationReceiver.deleteImagePendingBroadcast(context, uri.path!!, notificationId), + NotificationReceiver.deleteImagePendingBroadcast(context, uri), ) updateNotification() diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderOrientation.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderOrientation.kt index 01073cd60..ad0e58a15 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderOrientation.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderOrientation.kt @@ -1,57 +1,62 @@ package eu.kanade.tachiyomi.ui.reader.setting import android.content.pm.ActivityInfo -import androidx.annotation.DrawableRes +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ScreenLockLandscape +import androidx.compose.material.icons.filled.ScreenLockPortrait +import androidx.compose.material.icons.filled.ScreenRotation +import androidx.compose.material.icons.filled.StayCurrentLandscape +import androidx.compose.material.icons.filled.StayCurrentPortrait +import androidx.compose.ui.graphics.vector.ImageVector import dev.icerock.moko.resources.StringResource -import eu.kanade.tachiyomi.R import tachiyomi.i18n.MR enum class ReaderOrientation( val flag: Int, val stringRes: StringResource, - @DrawableRes val iconRes: Int, + val icon: ImageVector, val flagValue: Int, ) { DEFAULT( ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED, MR.strings.label_default, - R.drawable.ic_screen_rotation_24dp, + Icons.Default.ScreenRotation, 0x00000000, ), FREE( ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED, MR.strings.rotation_free, - R.drawable.ic_screen_rotation_24dp, + Icons.Default.ScreenRotation, 0x00000008, ), PORTRAIT( ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT, MR.strings.rotation_portrait, - R.drawable.ic_stay_current_portrait_24dp, + Icons.Default.StayCurrentPortrait, 0x00000010, ), LANDSCAPE( ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE, MR.strings.rotation_landscape, - R.drawable.ic_stay_current_landscape_24dp, + Icons.Default.StayCurrentLandscape, 0x00000018, ), LOCKED_PORTRAIT( ActivityInfo.SCREEN_ORIENTATION_PORTRAIT, MR.strings.rotation_force_portrait, - R.drawable.ic_screen_lock_portrait_24dp, + Icons.Default.ScreenLockPortrait, 0x00000020, ), LOCKED_LANDSCAPE( ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE, MR.strings.rotation_force_landscape, - R.drawable.ic_screen_lock_landscape_24dp, + Icons.Default.ScreenLockLandscape, 0x00000028, ), REVERSE_PORTRAIT( ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT, MR.strings.rotation_reverse_portrait, - R.drawable.ic_stay_current_portrait_24dp, + Icons.Default.StayCurrentPortrait, 0x00000030, ), ; diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences.kt index f4992dbc0..4de0ecd94 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences.kt @@ -1,5 +1,7 @@ package eu.kanade.tachiyomi.ui.reader.setting +import android.os.Build +import androidx.compose.ui.graphics.BlendMode import dev.icerock.moko.resources.StringResource import tachiyomi.core.preference.PreferenceStore import tachiyomi.core.preference.getEnum @@ -178,5 +180,24 @@ class ReaderPreferences( MR.strings.zoom_start_right, MR.strings.zoom_start_center, ) + + val ColorFilterMode = buildList { + addAll( + listOf( + MR.strings.label_default to BlendMode.SrcOver, + MR.strings.filter_mode_multiply to BlendMode.Modulate, + MR.strings.filter_mode_screen to BlendMode.Screen, + ), + ) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + addAll( + listOf( + MR.strings.filter_mode_overlay to BlendMode.Overlay, + MR.strings.filter_mode_lighten to BlendMode.Lighten, + MR.strings.filter_mode_darken to BlendMode.Darken, + ), + ) + } + } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/webview/WebViewActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/webview/WebViewActivity.kt index 5afd8364c..61d09dc79 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/webview/WebViewActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/webview/WebViewActivity.kt @@ -13,7 +13,6 @@ import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.ui.base.activity.BaseActivity import eu.kanade.tachiyomi.util.system.WebViewUtil import eu.kanade.tachiyomi.util.system.openInBrowser -import eu.kanade.tachiyomi.util.system.overridePendingTransitionCompat import eu.kanade.tachiyomi.util.system.toShareIntent import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.util.view.setComposeContent @@ -36,7 +35,7 @@ class WebViewActivity : BaseActivity() { } override fun onCreate(savedInstanceState: Bundle?) { - overridePendingTransitionCompat(R.anim.shared_axis_x_push_enter, R.anim.shared_axis_x_push_exit) + overridePendingTransition(R.anim.shared_axis_x_push_enter, R.anim.shared_axis_x_push_exit) super.onCreate(savedInstanceState) if (!WebViewUtil.supportsWebView(this)) { @@ -78,7 +77,7 @@ class WebViewActivity : BaseActivity() { override fun finish() { super.finish() - overridePendingTransitionCompat(R.anim.shared_axis_x_pop_enter, R.anim.shared_axis_x_pop_exit) + overridePendingTransition(R.anim.shared_axis_x_pop_enter, R.anim.shared_axis_x_pop_exit) } private fun shareWebpage(url: String) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/system/ActivityExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/system/ActivityExtensions.kt deleted file mode 100644 index c145f0e28..000000000 --- a/app/src/main/java/eu/kanade/tachiyomi/util/system/ActivityExtensions.kt +++ /dev/null @@ -1,14 +0,0 @@ -package eu.kanade.tachiyomi.util.system - -import android.app.Activity -import android.os.Build -import androidx.annotation.AnimRes - -fun Activity.overridePendingTransitionCompat(@AnimRes enterAnim: Int, @AnimRes exitAnim: Int) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { - overrideActivityTransition(Activity.OVERRIDE_TRANSITION_OPEN, enterAnim, exitAnim) - } else { - @Suppress("DEPRECATION") - overridePendingTransition(enterAnim, exitAnim) - } -} diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt index 5f91bfbac..05c0971fd 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt @@ -1,18 +1,15 @@ package eu.kanade.tachiyomi.util.system -import android.app.ActivityManager import android.content.ClipData import android.content.ClipboardManager import android.content.Context import android.content.Intent import android.content.pm.PackageManager import android.content.res.Configuration -import android.graphics.drawable.Drawable import android.net.Uri import android.os.Build import android.os.PowerManager import androidx.appcompat.view.ContextThemeWrapper -import androidx.core.content.PermissionChecker import androidx.core.content.getSystemService import androidx.core.net.toUri import com.hippo.unifile.UniFile @@ -55,39 +52,9 @@ fun Context.copyToClipboard(label: String, content: String) { } } -/** - * Checks if the give permission is granted. - * - * @param permission the permission to check. - * @return true if it has permissions. - */ -fun Context.hasPermission( - permission: String, -) = PermissionChecker.checkSelfPermission(this, permission) == PermissionChecker.PERMISSION_GRANTED - val Context.powerManager: PowerManager get() = getSystemService()!! -/** - * Convenience method to acquire a partial wake lock. - */ -fun Context.acquireWakeLock(tag: String): PowerManager.WakeLock { - val wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "$tag:WakeLock") - wakeLock.acquire() - return wakeLock -} - -/** - * Returns true if the given service class is running. - */ -fun Context.isServiceRunning(serviceClass: Class<*>): Boolean { - val className = serviceClass.name - val manager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager - @Suppress("DEPRECATION") - return manager.getRunningServices(Integer.MAX_VALUE) - .any { className == it.service.className } -} - fun Context.openInBrowser(url: String, forceDefaultBrowser: Boolean = false) { this.openInBrowser(url.toUri(), forceDefaultBrowser) } @@ -200,11 +167,3 @@ fun Context.isInstalledFromFDroid(): Boolean { // F-Droid builds typically disable the updater (!BuildConfig.INCLUDE_UPDATER && !isDevFlavor) } - -fun Context.getApplicationIcon(pkgName: String): Drawable? { - return try { - packageManager.getApplicationIcon(pkgName) - } catch (e: PackageManager.NameNotFoundException) { - null - } -} diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/system/WorkManagerExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/system/WorkManagerExtensions.kt index 02d721725..e565921db 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/system/WorkManagerExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/system/WorkManagerExtensions.kt @@ -1,8 +1,12 @@ package eu.kanade.tachiyomi.util.system import android.content.Context +import androidx.work.CoroutineWorker import androidx.work.WorkInfo import androidx.work.WorkManager +import kotlinx.coroutines.delay +import logcat.LogPriority +import tachiyomi.core.util.system.logcat val Context.workManager: WorkManager get() = WorkManager.getInstance(this) @@ -11,3 +15,21 @@ fun WorkManager.isRunning(tag: String): Boolean { val list = this.getWorkInfosByTag(tag).get() return list.any { it.state == WorkInfo.State.RUNNING } } + +/** + * Makes this worker run in the context of a foreground service. + * + * Note that this function is a no-op if the process is subject to foreground + * service restrictions. + * + * Moving to foreground service context requires the worker to run a bit longer, + * allowing Service.startForeground() to be called and avoiding system crash. + */ +suspend fun CoroutineWorker.setForegroundSafely() { + try { + setForeground(getForegroundInfo()) + delay(500) + } catch (e: IllegalStateException) { + logcat(LogPriority.ERROR, e) { "Not allowed to set foreground job" } + } +} diff --git a/app/src/main/res/color/ripple_toolbar_fainter.xml b/app/src/main/res/color/ripple_toolbar_fainter.xml deleted file mode 100644 index e7fb4ba66..000000000 --- a/app/src/main/res/color/ripple_toolbar_fainter.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/app/src/main/res/color/slider_active_track.xml b/app/src/main/res/color/slider_active_track.xml deleted file mode 100644 index 764d21bf3..000000000 --- a/app/src/main/res/color/slider_active_track.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/color/slider_inactive_track.xml b/app/src/main/res/color/slider_inactive_track.xml deleted file mode 100644 index 0f624c117..000000000 --- a/app/src/main/res/color/slider_inactive_track.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_blank_24dp.xml b/app/src/main/res/drawable/ic_blank_24dp.xml deleted file mode 100644 index 940db069f..000000000 --- a/app/src/main/res/drawable/ic_blank_24dp.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/ic_offline_pin_24dp.xml b/app/src/main/res/drawable/ic_offline_pin_24dp.xml deleted file mode 100644 index f3dcb3625..000000000 --- a/app/src/main/res/drawable/ic_offline_pin_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_screen_lock_landscape_24dp.xml b/app/src/main/res/drawable/ic_screen_lock_landscape_24dp.xml deleted file mode 100644 index 6c46c7b8a..000000000 --- a/app/src/main/res/drawable/ic_screen_lock_landscape_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_screen_lock_portrait_24dp.xml b/app/src/main/res/drawable/ic_screen_lock_portrait_24dp.xml deleted file mode 100644 index c7ee82f6b..000000000 --- a/app/src/main/res/drawable/ic_screen_lock_portrait_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_screen_rotation_24dp.xml b/app/src/main/res/drawable/ic_screen_rotation_24dp.xml deleted file mode 100644 index 04460bd85..000000000 --- a/app/src/main/res/drawable/ic_screen_rotation_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_stay_current_landscape_24dp.xml b/app/src/main/res/drawable/ic_stay_current_landscape_24dp.xml deleted file mode 100644 index a36b366c4..000000000 --- a/app/src/main/res/drawable/ic_stay_current_landscape_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_stay_current_portrait_24dp.xml b/app/src/main/res/drawable/ic_stay_current_portrait_24dp.xml deleted file mode 100644 index 25ce49739..000000000 --- a/app/src/main/res/drawable/ic_stay_current_portrait_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_webview_24dp.xml b/app/src/main/res/drawable/ic_webview_24dp.xml deleted file mode 100644 index 9400f45ed..000000000 --- a/app/src/main/res/drawable/ic_webview_24dp.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/transparent_tabs_background.xml b/app/src/main/res/drawable/transparent_tabs_background.xml deleted file mode 100644 index a503ef698..000000000 --- a/app/src/main/res/drawable/transparent_tabs_background.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/reader_activity.xml b/app/src/main/res/layout/reader_activity.xml index da843c09f..ed289767a 100644 --- a/app/src/main/res/layout/reader_activity.xml +++ b/app/src/main/res/layout/reader_activity.xml @@ -21,12 +21,6 @@ - - - 24dp - diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index e82288767..af52b6c3d 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -1,6 +1,4 @@ - 16dp - 16dp 12dp diff --git a/gradle/androidx.versions.toml b/gradle/androidx.versions.toml index 7ef758874..09c6b0e77 100644 --- a/gradle/androidx.versions.toml +++ b/gradle/androidx.versions.toml @@ -1,5 +1,5 @@ [versions] -agp_version = "8.1.4" +agp_version = "8.2.0" lifecycle_version = "2.6.2" paging_version = "3.2.1" @@ -20,14 +20,14 @@ lifecycle-common = { module = "androidx.lifecycle:lifecycle-common", version.ref lifecycle-process = { module = "androidx.lifecycle:lifecycle-process", version.ref = "lifecycle_version" } lifecycle-runtimektx = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "lifecycle_version" } -workmanager = "androidx.work:work-runtime-ktx:2.8.1" +workmanager = "androidx.work:work-runtime:2.9.0" paging-runtime = { module = "androidx.paging:paging-runtime", version.ref = "paging_version" } paging-compose = { module = "androidx.paging:paging-compose", version.ref = "paging_version" } -benchmark-macro = "androidx.benchmark:benchmark-macro-junit4:1.2.1" -test-ext = "androidx.test.ext:junit-ktx:1.2.0-alpha01" -test-espresso-core = "androidx.test.espresso:espresso-core:3.6.0-alpha01" +benchmark-macro = "androidx.benchmark:benchmark-macro-junit4:1.2.2" +test-ext = "androidx.test.ext:junit-ktx:1.2.0-alpha02" +test-espresso-core = "androidx.test.espresso:espresso-core:3.6.0-alpha02" test-uiautomator = "androidx.test.uiautomator:uiautomator:2.3.0-alpha05" [bundles] diff --git a/gradle/compose.versions.toml b/gradle/compose.versions.toml index ce7b074bf..6bfad292f 100644 --- a/gradle/compose.versions.toml +++ b/gradle/compose.versions.toml @@ -1,6 +1,6 @@ [versions] -compiler = "1.5.4" -compose-bom = "2023.12.00-alpha02" +compiler = "1.5.5" +compose-bom = "2023.12.00-alpha03" accompanist = "0.33.2-alpha" [libraries] diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c556a1674..6d27bb4dc 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -15,7 +15,6 @@ android-shortcut-gradle = "com.github.zellius:android-shortcut-gradle-plugin:0.1 google-services-gradle = "com.google.gms:google-services:4.4.0" rxjava = "io.reactivex:rxjava:1.3.8" -flowreactivenetwork = "ru.beryukhov:flowreactivenetwork:1.0.4" okhttp-core = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp_version" } okhttp-logging = { module = "com.squareup.okhttp3:logging-interceptor", version.ref = "okhttp_version" } @@ -27,7 +26,7 @@ conscrypt-android = "org.conscrypt:conscrypt-android:2.5.2" quickjs-android = "app.cash.quickjs:quickjs-android:0.9.2" -jsoup = "org.jsoup:jsoup:1.16.2" +jsoup = "org.jsoup:jsoup:1.17.1" disklrucache = "com.jakewharton:disklrucache:2.0.2" unifile = "com.github.tachiyomiorg:unifile:7c257e1c64" @@ -94,11 +93,10 @@ voyager-navigator = { module = "cafe.adriel.voyager:voyager-navigator", version. voyager-tab-navigator = { module = "cafe.adriel.voyager:voyager-tab-navigator", version.ref = "voyager" } voyager-transitions = { module = "cafe.adriel.voyager:voyager-transitions", version.ref = "voyager" } -ktlint = "org.jlleitschuh.gradle:ktlint-gradle:11.6.1" +ktlint = "org.jlleitschuh.gradle:ktlint-gradle:12.0.2" 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.34.1" - [bundles] okhttp = ["okhttp-core", "okhttp-logging", "okhttp-brotli", "okhttp-dnsoverhttps"] js-engine = ["quickjs-android"] diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 3fa8f862f..1af9e0930 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/i18n/src/commonMain/resources/MR/am/strings.xml b/i18n/src/commonMain/resources/MR/am/strings.xml index 4a07d01ac..b829f44db 100644 --- a/i18n/src/commonMain/resources/MR/am/strings.xml +++ b/i18n/src/commonMain/resources/MR/am/strings.xml @@ -158,12 +158,10 @@ ማስተካከያዎች ተጨማሪ ስም - ብጁ አካባቢ ዕልባት የተደረገባቸውን ምዕራፎች ሰርዝ ካነበብኩ በኋላ በእጅ እንደተነበበ ምልክት ከተደረገ በኋላ ምዕራፎችን ሰርዝ - አካባቢን ያውርዱ የጎን ሽፋን ንባብ የንባብ ሁነታ @@ -246,9 +244,7 @@ ልክ ያልሆነ የመጠባበቂያ ፋይል ምትኬ ተፈጥሯል - ከፍተኛ መጠባበቂያዎች የመጠባበቂያ ድግግሞሽ - የመጠባበቂያ ቦታ ቤተ-መጽሐፍት ከመጠባበቂያ ፋይል ይመልሱ ምትኬ ወደነበረበት የአሁኑን ቤተ-መጽሐፍት ወደነበረበት ለመመለስ ሊያገለግል ይችላል diff --git a/i18n/src/commonMain/resources/MR/ar/strings.xml b/i18n/src/commonMain/resources/MR/ar/strings.xml index ec7204278..7040a74da 100644 --- a/i18n/src/commonMain/resources/MR/ar/strings.xml +++ b/i18n/src/commonMain/resources/MR/ar/strings.xml @@ -116,10 +116,8 @@ حر الوضع الرأسي اﻹجباري الوضع الأفقي الإجباري - موقع التنزيل بعد وضع علامة \"مقروءة\" يدوياً الحذف تلقائيا بعد القراءة - مجلد مخصص معطل آخر فصل مقروء من الفصل الثاني قبل الأخير @@ -132,9 +130,7 @@ يمكن استخدامها لإستعادة المكتبة الحالية إستعادة النسخة الإحتياطية إستعادة مكتبة من ملف نسخة إحتياطية - موقع النسخ الإحتياطي معدل النسخ الاحتياطي التلقائي - أقصى عدد للنسخ الاحتياطية التلقائية أُنشئت نسخة احتياطية اكتملت الاستعادة ما الذي تريد نسخه احتياطيّاً؟ @@ -350,7 +346,6 @@ الفصول %1$s الفصل %1$s و%2$d فصول أخرى الفصل %1$s - جارٍ التحقق من وجود فصول جديدة الفصل %1$s - %2$s تُحدَّث المكتبة وضع القراءة @@ -768,4 +763,10 @@ لم يُعثَر على مترجمين المترجم احجب بعض المترجمين + خيارات أكثر + محدَّد + غير مُحدَّد + اصعد + مكان التخزين + يُستخدَم في الاحتياط وتنزيل الفصول والمصدر المحليِّ. \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/be/strings.xml b/i18n/src/commonMain/resources/MR/be/strings.xml index 2e94d6897..e1799953d 100644 --- a/i18n/src/commonMain/resources/MR/be/strings.xml +++ b/i18n/src/commonMain/resources/MR/be/strings.xml @@ -288,12 +288,10 @@ Перадапошняя частка Апошняя прачытаная частка Адключана - Карыстацкая дырэкторыя Дазволіць выдаленне частак з закладкамі Аўтаматычна пасля чытання Пасля таго, як пазначана як \"Прачытанае\" Выдаліць часткі - Каталог загрузак Найнізкая Нізкая Высокая diff --git a/i18n/src/commonMain/resources/MR/bg/strings.xml b/i18n/src/commonMain/resources/MR/bg/strings.xml index 2ff68ca60..8efd0173d 100644 --- a/i18n/src/commonMain/resources/MR/bg/strings.xml +++ b/i18n/src/commonMain/resources/MR/bg/strings.xml @@ -106,10 +106,8 @@ G B A - Директория на изтеглянията След маркиране като прочетено След прочитане автоматично изтрийте - Персонализирана директория Изключено Последно прочетена глава Предпоследна прочетена глава @@ -214,9 +212,7 @@ Може да се използва за възстановяване на текущата библиотека Възстанови резервно копие Възстанови библиотеката от резервно копие - Директория за резервното копие Честота на запазване - Максимален брой копия Резервно копие създадено Възстановяването завършено Какво искате да запазите? @@ -310,7 +306,6 @@ Глави %1$s Глава %1$s и %2$d още Глава %1$s - Проверяване за нови глави Гл. %1$s - %2$s Обновяване на библиотеката Добави проследяване diff --git a/i18n/src/commonMain/resources/MR/bn/strings.xml b/i18n/src/commonMain/resources/MR/bn/strings.xml index 8605763b0..07728c4bb 100644 --- a/i18n/src/commonMain/resources/MR/bn/strings.xml +++ b/i18n/src/commonMain/resources/MR/bn/strings.xml @@ -122,10 +122,8 @@ নী - ডাউনলোডের স্থান পঠিত হিসেবে চিহ্নিত করার পর পড়ার পর স্বয়ংক্রিয়ভাবে - স্বনির্ধারিত নির্দেশক নিষ্ক্রিয় শেষ পঠিত অধ্যায় ২য় থেকে শেষ অধ্যায় @@ -138,9 +136,7 @@ বর্তমান সংগ্রহশালা পুনরুদ্ধারের জন্য ব্যাবহার করা যাবে ব্যাকআপ পুনরুদ্ধার ব্যাকআপ ফাইল থেকে সংগ্রহশালা পুনরুদ্ধার করুন - ব্যাকআপের স্থান ব্যাকআপ ফ্রিকোয়েন্সি - সর্বোচ্চ ব্যাকআপ ব্যাকআপ তৈরী হয়েছে পুনরুদ্ধার সম্পন্ন হয়েছে আপনি কি ব্যাকআপ করতে ইচ্ছুক? @@ -393,7 +389,6 @@ অধ্যায়গুলি %1$s অধ্যায় %1$s এবং %2$d আরও অধ্যায় %1$s - নতুন অধ্যায়ের জন্য অনুসন্ধান করা হচ্ছে কম সঞ্চয়স্থানের কারণে অধ্যায়গুলি ডাউনলোড করা যায়নি অঃ %1$s - %2$s সংগ্রহশালার হালনাগাদ হচ্ছে diff --git a/i18n/src/commonMain/resources/MR/ca/plurals.xml b/i18n/src/commonMain/resources/MR/ca/plurals.xml index 0309ac347..a8c2ffa28 100644 --- a/i18n/src/commonMain/resources/MR/ca/plurals.xml +++ b/i18n/src/commonMain/resources/MR/ca/plurals.xml @@ -2,66 +2,82 @@ Després d’%1$s minut + Després de %1$s minuts Després de %1$s minuts %1$d capítol nou + %1$d capítols nous %1$d capítols nous Capítols %1$s i 1 més + Capítols %1$s i %2$d més Capítols %1$s i %2$d més Per a %d element + Per a %d elements Per a %d elements Hi ha una actualització d’una extensió + Hi ha actualitzacions de %d extensions Hi ha actualitzacions de %d extensions En resta %1$s + En resten %1$s En resten %1$s Fet en %1$s amb %2$s error + Fet en %1$s amb %2$s errors Fet en %1$s amb %2$s errors %d categoria + %d categories %d categories %1$s capítol + %1$s capítols %1$s capítols %d servei de seguiment + %d serveis de seguiment %d serveis de seguiment S’ha omès %d capítol. És possible que manqui a la font o que hagi estat filtrat + S’han omès %d capítols. És possible que manquin a la font o que hagin estat filtrats S’han omès %d capítols. És possible que manquin a la font o que hagin estat filtrats Ahir + Fa %1$d dies Fa %1$d dies El següent capítol no llegit + Els següents %d capítols no llegits Els següents %d capítols no llegits El següent capítol + Els següents %d capítols Els següents %d capítols Manca %1$s capítol + Manquen %1$s capítols Manquen %1$s capítols 1 dia + %d dies %d dies \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/ca/strings.xml b/i18n/src/commonMain/resources/MR/ca/strings.xml index 3740982d9..b132407c8 100644 --- a/i18n/src/commonMain/resources/MR/ca/strings.xml +++ b/i18n/src/commonMain/resources/MR/ca/strings.xml @@ -144,11 +144,9 @@ G B A - Ubicació de les baixades Després de marcar com a llegit de manera manual Suprimeix automàticament després de llegir Velocitat de l’animació del doble toc - Ubicació personalitzada Desactivat Darrer capítol llegit Penúltim capítol llegit @@ -161,9 +159,7 @@ Es pot utilitzar per a restaurar la biblioteca actual Restaura una còpia de seguretat Restaura la biblioteca del fitxer de còpia de seguretat - Ubicació de la còpia de seguretat Freqüència de la còpia de seguretat automàtica - Màxim de còpies de seguretat automàtiques S’ha creat la còpia de seguretat S’ha completat la restauració De què voleu fer una còpia de seguretat\? @@ -327,7 +323,6 @@ Capítol %1$s i %2$d més Capítols %1$s Amaga el contingut de les notificacions - S’està comprovant si hi ha capítols nous Desactiva l’optimització de la bateria Fa que funcionin millor les actualitzacions de la biblioteca en segon pla i les còpies de seguretat L’optimització de la bateria ja està desactivada @@ -768,4 +763,10 @@ Puntuació del servei de seguiment Dades i emmagatzematge Exclou scanlators + Seleccionat + No seleccionat + Ubicació de l’emmagatzematge + S’utilitza per a les còpies de seguretat automàtiques, les baixades de capítols i la font local. + Més opcions + Navega cap amunt \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/ceb/strings.xml b/i18n/src/commonMain/resources/MR/ceb/strings.xml index 2ab18919f..01b4ce101 100644 --- a/i18n/src/commonMain/resources/MR/ceb/strings.xml +++ b/i18n/src/commonMain/resources/MR/ceb/strings.xml @@ -297,13 +297,11 @@ Pagbasa Taas Ubos - Lokasyon sa pag-download Pagtangtang sa mga kapitulo Human gimarkahan sa mano-mano ingon nabasa na Human sa pagbasa awtomatikong tangtangon Tugoti ang pagtangtang sa gimarkahan nga mga kapitulo Wala iapil nga mga kategorya - Pasadya nga lokasyon Nabaldado Ikalima hangtod sa kataposang pagbasa sa kapitulo Awtomatikong pag-download @@ -350,8 +348,6 @@ Uri sa sukdanan sa hulagway Ibalik ang backup Ibalik ang librarya gikan sa backup file - Backup nga lokasyon - Maximum nga pag-backup Gihimo ang backup Kadaghanon sa pag-backup Dili balido nga backup file diff --git a/i18n/src/commonMain/resources/MR/cs/strings.xml b/i18n/src/commonMain/resources/MR/cs/strings.xml index a770c0c64..a752f5af0 100644 --- a/i18n/src/commonMain/resources/MR/cs/strings.xml +++ b/i18n/src/commonMain/resources/MR/cs/strings.xml @@ -84,10 +84,8 @@ G B A - Umístění pro stažení Po ručním označení jako přečtené Po přečtení automaticky smazat - Vlastní umístění Stahovat nové kapitoly Uživatelské jméno Heslo @@ -207,7 +205,6 @@ Sledovače Vytvořit zálohu Obnovit zálohu - Místo zálohy Frekvence automatických záloh Záloha vytvořena Obnova dokončena @@ -258,7 +255,6 @@ Pátá předposlední přečtená kapitola Lze použít k obnovení aktuální knihovny Obnovit knihovnu ze záložního souboru - Maximum automatických záloh Přihlásit se do %1$s Název zdroje Číslo kapitoly @@ -420,7 +416,6 @@ Kapitoly %1$s Kapitola %1$s a %2$d dalších Kapitola %1$s - Hledám nové kapitoly Nelze stáhnout kapitoly kvůli nedostatku místa Návod k přesunu zdrojů Jste si jistý/á\? Všechna historie bude navždy ztracena. diff --git a/i18n/src/commonMain/resources/MR/cv/strings.xml b/i18n/src/commonMain/resources/MR/cv/strings.xml index 9ded14d5d..d0401db23 100644 --- a/i18n/src/commonMain/resources/MR/cv/strings.xml +++ b/i18n/src/commonMain/resources/MR/cv/strings.xml @@ -11,7 +11,6 @@ Юлашки вуланӑ сыпăк Сӳнтернӗ Вуланӑ хыҫҫӑн - Тийев вырӑнӗ Вулани Кӑвак Симӗс @@ -190,7 +189,6 @@ Вуланӑ сыпӑкран тӑваттӑмӗшӗ Вуланӑ сыпӑкран виҫҫӗмӗшӗ Юлашкинчен маларахри - Усӑҫ палӑртнӑ вырӑнӗ Вуланӑ пек палӑртнӑ хыҫҫӑн катерт Хӑйӗн виҫе Елсерен @@ -275,7 +273,6 @@ Хуплашкана ҫӗнетеймерӗ %1$s сыпӑкӗ тата ытти %2$d %1$s сыпӑкӗсем - Ҫӗнӗ сыпӑксен пуррине тӗрӗслени Сыпӑксене тийесе илме пулмасть. Тийевсем пайӗнче ҫӗнӗрен хӑтланса пӑхма пултаратӑн Ӑтавла Куҫар @@ -401,8 +398,6 @@ Хальхи вулавăша тавӑрма усӑ курма пулать Янтӑвра манкӑсем ҫук. Янтӑв тӑвӑннӑ - Май килнӗ таран янтӑвсем - Янтӑв вырнаҫни Вулавӑша янтӑвран тавӑр Янтӑв тавӑр Янтӑв ту diff --git a/i18n/src/commonMain/resources/MR/da/strings.xml b/i18n/src/commonMain/resources/MR/da/strings.xml index 3362db563..cb2a3bea7 100644 --- a/i18n/src/commonMain/resources/MR/da/strings.xml +++ b/i18n/src/commonMain/resources/MR/da/strings.xml @@ -286,7 +286,6 @@ Læser Udvidelsesopdateringer Sikkerhedskopiering mislykkedes - Placering af sikkerhedskopi Fri Fejl Gendannelse fuldført @@ -300,7 +299,6 @@ Læsetilstand Du er ved at fjerne \"%s\" fra dit bibliotek Højeste - Maksimale antal automatiske sikkerhedskopier Lav Kildeindstillinger App-indstillinger diff --git a/i18n/src/commonMain/resources/MR/de/strings.xml b/i18n/src/commonMain/resources/MR/de/strings.xml index 58231342e..737264efe 100644 --- a/i18n/src/commonMain/resources/MR/de/strings.xml +++ b/i18n/src/commonMain/resources/MR/de/strings.xml @@ -118,10 +118,8 @@ G B A - Speicherort Nachdem manuell als gelesen markiert Automatisch nach dem Lesen löschen - Eigener Speicherort Deaktiviert Ab zuletzt gelesenem Kapitel Ab zweitletzt gelesenem Kapitel @@ -134,9 +132,7 @@ Kann benutzt werden, um die aktuelle Bibliothek wiederherzustellen Datensicherung wiederherstellen Bibliothek mit Hilfe einer Datensicherung wiederherstellen - Sicherungsspeicherort Automatische Datensicherungshäufigkeit - Maximale Anzahl automatischer Datensicherungen Datensicherung erstellt Wiederherstellen abgeschlossen Was möchtest du sichern\? @@ -327,7 +323,6 @@ Kapitel %1$s und %2$d mehr Kapitel %1$s Benachrichtigungsinhalt verbergen - Überprüfe auf neue Kapitel Akkuverbrauch-Optimierung deaktivieren Hilft bei Bibliotheksaktualisierungen und -sicherungen im Hintergrund Akkuverbrauch-Optimierung ist bereits deaktiviert @@ -768,4 +763,10 @@ Speichernutzung Tracker-Bewertung Scanlatoren ausschließen + Ausgewählt + Nicht ausgewählt + Speicherort + Wird für automatische Datensicherungen, heruntergeladene Kapitel und lokale Quellen verwendet. + Weitere Optionen + Nach oben navigieren \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/el/strings.xml b/i18n/src/commonMain/resources/MR/el/strings.xml index 9d086ba05..d27a7219e 100644 --- a/i18n/src/commonMain/resources/MR/el/strings.xml +++ b/i18n/src/commonMain/resources/MR/el/strings.xml @@ -145,10 +145,8 @@ G B A - Τοποθεσία λήψεων Αφού επισημανθεί χειροκίνητα ως αναγνωσμένο Αυτόματη διαγραφή μετά την ανάγνωση - Προσαρμοσμένη τοποθεσία Απενεργοποιημένο Τελευταίο αναγνωσμένο κεφάλαιο Προτελευταίο αναγνωσμένο κεφάλαιο @@ -161,9 +159,7 @@ Μπορεί να χρησιμοποιηθεί για επαναφορά τρέχουσας βιβλιοθήκης Επαναφορά αντιγράφου ασφαλείας Επαναφορά βιβλιοθήκης από αρχείο αντιγράφου ασφαλείας - Τοποθεσία αντιγράφων ασφαλείας Συχνότητα αυτόματων αντιγράφων ασφαλείας - Μέγιστα αυτόματα αντίγραφα ασφαλείας Δημιουργήθηκε αντίγραφο ασφαλείας Η επαναφορά ολοκληρώθηκε Τι αντίγραφο ασφαλείας θέλετε να δημιουργήσετε; @@ -308,7 +304,6 @@ Κεφάλαιο %1$s και %2$d ακόμη Κεφάλαια %1$s Κεφάλαιο %1$s - Έλεγχος για νέα κεφάλαια Κεφ. %1$s - %2$s Ενημέρωση βιβλιοθήκης Σε παύση @@ -768,4 +763,10 @@ Δε βρέθηκαν scanlators Scanlator Εξαίρεση scanlator + Περισσότερες επιλογές + Επιλεγμένο + Μη επιλεγμένο + Πλοήγηση προς τα πάνω + Τοποθεσία αποθήκευσης + Χρησιμοποιείται για αυτόματα αντίγραφα ασφαλείας, λήψη κεφαλαίων και τοπική πηγή. \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/eo/strings.xml b/i18n/src/commonMain/resources/MR/eo/strings.xml index ef4cf570f..03555cbfc 100644 --- a/i18n/src/commonMain/resources/MR/eo/strings.xml +++ b/i18n/src/commonMain/resources/MR/eo/strings.xml @@ -108,12 +108,10 @@ Ĉiutage Nevalida savkopia dosiero Savkopio kreita - Savkopiejo Krei savkopion Elŝuti novajn ĉapitrojn Malŝaltita Forigi ĉapitrojn - Elŝutejo Sen animacioj Originala grando Streĉi @@ -132,7 +130,6 @@ En biblioteko Aldonita al biblioteko Aldoni al biblioteko - Propra dosierujo Aŭtomate post legado Legada Legada reĝimo @@ -364,7 +361,6 @@ Kromaĵaj ĝisdatigoj Elŝutito paŭzigita Elŝutilo - Kontrolas por trovi novajn ĉapitrojn Por ĉi-serion Propra filtrilo Fonto ne subtenita @@ -386,7 +382,6 @@ Restaŭras savkopion Restaŭrado kompletita Savkopio enhavas neniun mangaon. - Maksimume savkopioj Deviga horizontala Deviga vertikala Vertikala diff --git a/i18n/src/commonMain/resources/MR/es/strings.xml b/i18n/src/commonMain/resources/MR/es/strings.xml index 764824f21..4fc2ae17d 100644 --- a/i18n/src/commonMain/resources/MR/es/strings.xml +++ b/i18n/src/commonMain/resources/MR/es/strings.xml @@ -87,10 +87,8 @@ Cualquier dirección Forzar en vertical Forzar en horizontal - Carpeta de descarga Borrarlos tras marcarlos como leídos de forma manual Borrar capítulos terminados de forma automática - Ubicación personalizada Servicios de seguimiento Vaciar la caché de capítulos Usado: %1$s @@ -205,9 +203,7 @@ Se puede utilizar para restaurar la biblioteca actual Restaurar copia de seguridad Restaurar la biblioteca a partir de una copia de seguridad - Ubicación de la copia de respaldo - Frecuencia de la copia de seguridad automática - Copias de seguridad automáticas máximas + Frecuencia de respaldo automático Copia de seguridad creada Restauración completada ¿De qué quieres hacer una copia de seguridad\? @@ -328,7 +324,6 @@ Capítulo %1$s y %2$d más Capítulos %1$s Ocultar el contenido de las notificaciones - Buscando nuevos capítulos Desactivar la optimización de batería Correo electrónico Mejora la cadencia de las actualizaciones y las copias de respaldo que se hagan en segundo plano @@ -398,7 +393,7 @@ No se ha encontrado la fuente Desactivar Es necesario reiniciar la aplicación para que surja efecto - Networking + Red Estado desconocido Ambos Vertical @@ -486,7 +481,7 @@ Mostrar el número de elementos Fecha de obtención del capítulo Tipo de rotación - Crea carpetas según el título de las entradas + Crea carpetas según el título de la obra Guardar las páginas en carpetas independientes Acciones Escala de grises @@ -554,7 +549,7 @@ Advertencia Las actualizaciones grandes pueden implicar un mayor uso de la batería y que los distintos servicios bloqueen o ralenticen el acceso a tu dispositivo. Toca aquí para más información. Idioma - También deberías guardar las copias de seguridad en otros lugares. Las copias de seguridad pueden contener datos confidenciales, incluidas las contraseñas almacenadas. + Es una buena idea tener copias de respaldo fuera de tu dispositivo. También incluyen contraseñas y otros datos privados que seguramente no quieras compartir. Solo con Wi-Fi Cada 3 días Advertencia: Las descargas grandes pueden llevar a que las fuentes se vuelvan cada vez más lentas y en casos extremos que los servidores limiten o impidan el acceso a Tachiyomi. Toca aquí para más información. @@ -653,7 +648,7 @@ Temas de colores y formatos de fecha Volcar datos del cuelgue y estado de ahorro de batería Pantalla segura y desbloqueo biométrico - Copias de seguridad manuales y automáticas, y el espacio de almacenamiento + Copias de seguridad manuales y automáticas, almacenamiento Fuentes, extensiones y búsqueda global ¡Vaya! Reiniciar la aplicación @@ -730,7 +725,7 @@ Intervalo de descarga personalizado Comprobar de forma mensual (28 días) Aceptar - ¿Quitar el rastreo de %s\? + ¿Quieres desvincular %s? Esto eliminará el seguimiento localmente. Quitar también de %s Borrar los ya descargados @@ -754,18 +749,24 @@ Ajustes de la aplicación Ordenar categorías ¿Quieres ordenar las categorías de forma alfabética\? - Ningún archivo seleccionado + No has elegido ningún archivo Nunca - Reducir el ghosting en las pantallas de tinta electrónica - Última copia de seguridad automática: %s - Parpadeo en blanco al cambiar de página + Esta transición minimiza las manchas y el efecto de retención de imagen en pantallas de tinta electrónica + Última copia automática: %s + Parpadear a blanco al cambiar de página Datos y almacenamiento Almacenamiento utilizado Puntuación del rastreador Aplicar Volver a la configuración predeterminada Crear - Sin ningún scanlators - Scanlator - Omitir a los scanlators + Sin escanducciones + Escanductor + Excluir escanducciones + Seleccionado + Sin seleccionar + Más opciones + Subir un nivel + Ubicación del almacenamiento + Se utiliza para las copias de seguridad automáticas, las descargas de capítulos y la fuente local. \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/eu/strings.xml b/i18n/src/commonMain/resources/MR/eu/strings.xml index 9d5e9a0b3..a56f0df97 100644 --- a/i18n/src/commonMain/resources/MR/eu/strings.xml +++ b/i18n/src/commonMain/resources/MR/eu/strings.xml @@ -118,7 +118,6 @@ Alboko betegarria Erakutsi beti kapituluaren trantsizioa Azkenik irakurritako kapitulua - Deskarga kokapena Ezabatu kapituluak Atzetik hasita laugarren irakurritako kapitulua Saioa hasi gabeko jarraitzaileak: @@ -223,7 +222,6 @@ Irakurria bezala eskuz markatu ondoren Baimendu laster-markadun kapituluak ezabatzea Irakurri ondoren automatikoki ezabatu - Kokapen pertsonalizatua Zerbitzu hobetuak Lagundu itzultzen Ez da aurkitu fitxategiak hautatzeko aplikaziorik @@ -431,7 +429,6 @@ Ziur zaude\? Historia guztia galduko da. Iturrien migrazio gida Hautatu sartu nahi dituzun datuak - Kapitulu berriak bilatzen Kapitulu berriak aurkituak Ez da ezer irakurri azkenaldian Deskargarik ez @@ -458,9 +455,7 @@ Altuena Babeskopia erabili Berreskuratu liburutegia babeskopia fitxategitik - Babeskopiaren kokapena Babeskopien maiztasuna - Gehienezko babeskopiak Alfabetikoki Oharra Autentifikatu aldaketa berresteko diff --git a/i18n/src/commonMain/resources/MR/fa/plurals.xml b/i18n/src/commonMain/resources/MR/fa/plurals.xml index 560caa806..d6516ab44 100644 --- a/i18n/src/commonMain/resources/MR/fa/plurals.xml +++ b/i18n/src/commonMain/resources/MR/fa/plurals.xml @@ -52,4 +52,16 @@ قسمت خوانده نشده بعدی %d قسمت خوانده نشده بعدی + + قسمت بعدی + %d قسمت بعدی + + + %1$s قسمت گم شده + %1$s قسمت گم شده + + + 1 روز + %d روز + \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/fa/strings.xml b/i18n/src/commonMain/resources/MR/fa/strings.xml index 48505584c..35996b2cc 100644 --- a/i18n/src/commonMain/resources/MR/fa/strings.xml +++ b/i18n/src/commonMain/resources/MR/fa/strings.xml @@ -14,7 +14,6 @@ قسمت %1$s و %2$d قسمت دیگر قسمت %1$s قسمت‌های جدید پیدا شدند - درحال بررسی برای قسمت‌های جدید دانلود قسمت ها با خطا مواجه شد. با مراجعه به بخش دانلودها می توانید دوباره تلاش کنید کپی تغییر منبع @@ -120,9 +119,7 @@ هیچ نتیجه ای یافت نشد نتیجه بیشتری یافت نشد تب ها - حداکثر تعداد نسخه‌های پشتیبان زمان پشتیبان گیری - محل پشتیبان گیری بازگرداندن کتابخانه از فایل پشتیبان برگرداندن نسخه پشتیبان می تواند برای بازگرداندن کتابخانه فعلی استفاده شود @@ -144,8 +141,6 @@ برای این مجموعه بازکردن عکس با خطا مواجه شد قصد خواندن دارم(Plan to read) - مکان سفارشی - مکان دانلود هم اندازه حالت هوشمند Multiply Overlay @@ -601,4 +596,22 @@ شما باید از پشتیبانی ها در جا های دیگر هم کپی داشته باشید. بروزرسانی دسته بندی کپی کردن به کلیپ‌برد + فرمت RARv5 پشتیبانی نشده + متوقف شده + باز گشایی %s + پاک کردن قسمت های دانلود شده + ذخیره + باز نشانی به حالت اولیه + منظم کردن دسته بندی ها + گزینه های بیشتر + انتخاب شده + انتخاب نشده + مجموعه ها را به پایین منطقل کن + برو به بالا + امتیاز رهگیز + داده های و ذخیره سازی + آیا مایلید که دسته بندی ها را به ترتیب الفبا منظم کنید؟ + باشه + به روز رسانی مورد انتظار بعدی + هشدار: حجم زیاد بارگیری ممکن است باعث اهسته تر شدن سرعت ویا مسدود کردن Tachiyomi از منبع شود. برای اطلاعات بیشتر لمس کنید. \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/fi/strings.xml b/i18n/src/commonMain/resources/MR/fi/strings.xml index ac27efe69..bb54521b9 100644 --- a/i18n/src/commonMain/resources/MR/fi/strings.xml +++ b/i18n/src/commonMain/resources/MR/fi/strings.xml @@ -192,10 +192,8 @@ Vihreä Sininen Alpha - Lataus kansio Manuaalisesti luetuksi merkitsemisen jälkeen Lukemisen jälkeen - Mukautettu kansio Pois käytöstä Viimeksi luettu luku Toiseksi viimeinen luku @@ -207,7 +205,6 @@ Voidaan käyttää nykyisen kirjaston palauttamiseen Palauta kirjasto varmuuskopiointi-tiedostosta Varmuuskopioinnin tiheys - Varmuuskopioiden enimmäismäärä Varmuuskopio luotu Palautus valmis Mitä haluat varmuuskopioida\? @@ -260,7 +257,6 @@ Kategoriat poistettu Luo varmuuskopio Palauta varmuuskopio - Varmuuskopio kansio Paikalliset lähteet Muut Viimeisimmät @@ -323,7 +319,6 @@ Luku %1$s ja %2$d lisää Luvut %1$s Piilota ilmoitusten sisältö - Etsitään uusia lukuja Lukitse käyttämättömänä Salaa näyttö Turvallinen ruutu piilottaa sovelluksen sisällön sovelluksia vaihdettaessa ja estää kuvakaappauksen ottamisen diff --git a/i18n/src/commonMain/resources/MR/fil/strings.xml b/i18n/src/commonMain/resources/MR/fil/strings.xml index c1c0b0be9..82ae744d6 100644 --- a/i18n/src/commonMain/resources/MR/fil/strings.xml +++ b/i18n/src/commonMain/resources/MR/fil/strings.xml @@ -115,10 +115,8 @@ Pangalawa sa huling nabasa Huling nabasang kabanata Sarado - Pinili kong lugar Pagkamarkahang nabasa na Pagkatapos basahin, kusang burahin - Lokasyon sa pag-download Kapal ng gilid Pagbabasa Ipakita palagi ang paglipat-kabanata @@ -229,9 +227,7 @@ Hindi naglalaman ang backup ng kahit anong mga entry sa Aklatan. Invalid na backup Nai-backup na - Pinakamarami na awtomatikong pag-backup Awtomatikong dalas ng pag-backup - Lokasyon ng backup I-restore ang Aklatan mula sa backup I-restore ang backup Magagamit para ma-restore ang kasalukuyang Aklatan @@ -276,7 +272,6 @@ Kabanata %1$s at karagdagang %2$d pa Kabanata %1$s May mga bagong kabanata - Naghahanap ng mga bagong kabanata Di ma-download ang mga kabanata dahil sa mababang espasyo Di ma-download ang mga kabanata. Subukan mo uli ito sa Dina-download Kopyahin @@ -768,4 +763,10 @@ Scanlator Ibukod ang mga scanlator Lumikha + Lokasyon ng storage + Ginagamit para sa automatikong pa-backup, pag-download ng mga kabanata, at lokal na source. + Ibang opsiyon + Napili + Di napili + Mag-navigate pataas \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/fr/strings.xml b/i18n/src/commonMain/resources/MR/fr/strings.xml index 11311ee49..ce6307a12 100644 --- a/i18n/src/commonMain/resources/MR/fr/strings.xml +++ b/i18n/src/commonMain/resources/MR/fr/strings.xml @@ -105,7 +105,6 @@ V B O - Répertoire de téléchargement Suppression automatique après lecture Désactivé Dernier chapitre lu @@ -186,7 +185,6 @@ Aucune connexion disponible Êtes-vous sûr(e) \? Les chapitres lus et la progression des entrées non présentes dans la bibliothèque seront perdues Supprimer les chapitres sélectionnés \? - Répertoire personnalisé Impossible de télécharger le chapitre en raison d\'une erreur inattendue Cinquième chapitre avant le dernier lu Connecté @@ -208,7 +206,6 @@ En pause Ouvrir le fichier Restaurer - Dossier de sauvegarde Restauration terminée Que voulez-vous sauvegarder \? Supprimer les chapitres téléchargés ? @@ -219,7 +216,6 @@ Restaurer une sauvegarde Restaurer la bibliothèque à partir d\'un fichier de sauvegarde Fréquence de sauvegarde - Nombre maximal de sauvegardes Sauvegarde créée Restauration de sauvegarde en cours Création de sauvegarde en cours @@ -327,7 +323,6 @@ Chapitre %1$s et %2$d autres Chapitres %1$s Cacher le contenu des notifications - Recherche de nouveaux chapitres Désactiver la fonction d\'optimisation de la batterie Facilite les mises à jour et sauvegardes de la bibliothèque en arrière-plan La fonction d\'optimisation de la batterie est déjà désactivée @@ -742,4 +737,20 @@ Déplacer la série vers le bas Supprimez également de %s Impossible de joindre %s + Paramètres de l\'application + Supprimer le(s) téléchargement(s) + Appliquer + Réintialiser les valeurs par défaut + Trier les catégories + Plus d\'options + Sélectionné + Pas sélectionné(e) + Scanlator + Faire l\'écran clignoter sur le changement de page + Naviguer vers le haut + Score du service de suivi + Données et stockage + Voulez-vous trier les catégories par ordre alphabétique ? + Se connecter au service de suivi + « %1$s » au lieu de « %2$s » \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/gl/strings.xml b/i18n/src/commonMain/resources/MR/gl/strings.xml index 0babeef68..e46e0b145 100644 --- a/i18n/src/commonMain/resources/MR/gl/strings.xml +++ b/i18n/src/commonMain/resources/MR/gl/strings.xml @@ -10,12 +10,10 @@ Cola de baixadas Último capítulo lido Deshabilitado - Ubicación personalizada Permitir eliminar os capítulos marcados como favoritos Eliminar automaticamente despois de ler Despois de marcar manualmente como lido Eliminar capítulos - Localización das baixadas Recheo lateral Lendo Modo de lectura @@ -274,7 +272,6 @@ Imaxe gardada Restaurar a copia de seguridade Frecuencia das copias de seguridade - Máximo de copias de seguridade Fontes faltantes: Invalidar o índice de baixadas Garda os rexistros de erros nun ficheiro para compartilo cos desenvolvedores @@ -370,7 +367,6 @@ Clasificación por idades Servizos mellorados Estes servizos proporcionan funcións melloradas para fontes concretas. Faise un seguemento automático dos elementos ao engadilos á biblioteca. - Localización da copia de seguridade Xa se está facendo unha copia de seguridade Compartir os rexistros de erros Error ao compartir a portada @@ -592,7 +588,6 @@ Fonte local En seguimento Lendo - Procurando capítulos novos Non hai ningunha conexión Wi-Fi dispoñible %s pechouse por un problema inesperado. Aconsellámoste que compartas os rexistros de erros na canle de soporte no Discord (en inglés). Reinicia a aplicación diff --git a/i18n/src/commonMain/resources/MR/he/strings.xml b/i18n/src/commonMain/resources/MR/he/strings.xml index 0b08ea497..3e28e22e7 100644 --- a/i18n/src/commonMain/resources/MR/he/strings.xml +++ b/i18n/src/commonMain/resources/MR/he/strings.xml @@ -27,7 +27,6 @@ פרק %1$s ו-%2$d נוספים פרק %1$s נמצאו פרקים חדשים - מחפש פרקים חדשים לא ניתן להוריד פרקים. אפשר לנסות שוב בדף ההורדות העתק העברה @@ -206,9 +205,7 @@ מה אתה רוצה לגבות\? השחזור הושלם גיבוי נוצר - מספר גיבויים מקסימלי תדירות גיבוי - מיקום גיבוי שחזר ספרייה מקובץ גיבוי שחזור גיבוי ניתן לשימוש על מנת לשחזר את הספרייה הנוכחית @@ -221,10 +218,8 @@ הפרק השלישי מהסוף שנקרא הפרק השני מהסוף שנקרא פרק שנקרא בפעם האחרונה - מיקום מותאם אישית אוטומטי לאחר סיום הקריאה אחרי שמסומן ידנית כנקרא - מיקום ההורדה הצג תמיד מעברי פרקים אלפא כחול diff --git a/i18n/src/commonMain/resources/MR/hi/strings.xml b/i18n/src/commonMain/resources/MR/hi/strings.xml index 040bb7f72..2c41fa2cb 100644 --- a/i18n/src/commonMain/resources/MR/hi/strings.xml +++ b/i18n/src/commonMain/resources/MR/hi/strings.xml @@ -122,10 +122,8 @@ G B A - डाउनलोड निर्देशिका \'पढ़ें\' के रूप में खुद से चिह्नित करने के बाद पढ़ने के बाद स्वचालित रूप से हटाएं - इच्छा अनुसार निर्देशिका बंद करें अंतिम पढ़ा अध्याय दूसरा से अंतिम पढ़ा गया अध्याय @@ -138,9 +136,7 @@ वर्तमान पुस्तकालय को पुनर्स्थापित करने के लिए उपयोग किया जा सकता है बैकअप पुनर्स्थापित करे बैकअप फ़ाइल से लाइब्रेरी पुनर्स्थापित करें - बैकअप निर्देशिका बैकअप फ़्रीक्वेंसी - अधिकतम बैकअप बैकअप बनाया गया है पुनर्स्थापना पूर्ण हुआ आप बैकअप के लिए क्या चाहते हैं? @@ -327,7 +323,6 @@ अध्याय %1$s और %2$d अधिक अध्याय %1$s अधिसूचना सामग्री छुपाएं - नए अध्यायों के लिए जांच बैटरी अनुकूलन को अक्षम करना पृष्ठभूमि पुस्तकालय अपडेट और बैकअप के साथ मदद करता है बैटरी अनुकूलन पहले से ही अक्षम है diff --git a/i18n/src/commonMain/resources/MR/hr/strings.xml b/i18n/src/commonMain/resources/MR/hr/strings.xml index 4f4aa4532..091f32522 100644 --- a/i18n/src/commonMain/resources/MR/hr/strings.xml +++ b/i18n/src/commonMain/resources/MR/hr/strings.xml @@ -148,9 +148,7 @@ %02d min, %02d s Obnavljanje je završeno Sigurnosna kopija je stvorena - Maksimalni broj sigurnosnih kopija Učestalost automatskog spremanja sigurnosnih kopija - Mjesto spremanja sigurnosnih kopija Obnovi biblioteku iz sigurnosne kopije Obnovi sigurnosnu kopiju Može se koristiti za obnavljanje trenutačne biblioteke @@ -164,10 +162,8 @@ Predzadnje pročitano poglavlje Zadnje pročitano poglavlje Deaktivirano - Prilagođeno mjesto Automatski izbriši nakon čitanja Nakon ručnog označivanja kao pročitano - Mjesto preuzimanja Odmak od ruba Čitanje Uvijek prikaži prijelaze između poglavlja @@ -241,7 +237,6 @@ Poglavlje %1$s i još %2$d Poglavlje %1$s Pronađena su nova poglavlja - Traženje novih poglavlja Neuspjelo preuzimanje poglavlja. Pokušaj ponovo u odjeljku preuzimanja Kopiraj Migriraj @@ -768,4 +763,10 @@ Korištenje memorije Rezultat tragača Isključi amaterske prevoditelje + Mjesto spremanja + Koristi se za automatske sigurnosne kopije, preuzimanje poglavlja i lokalni izvor. + Više opcija + Odabrano + Neodabrano + Navigiraj prema gore \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/hu/plurals.xml b/i18n/src/commonMain/resources/MR/hu/plurals.xml index 1ed5bf5a5..535bbf3a1 100644 --- a/i18n/src/commonMain/resources/MR/hu/plurals.xml +++ b/i18n/src/commonMain/resources/MR/hu/plurals.xml @@ -60,4 +60,8 @@ Hiányzó %1$s fejezet Hiányzó %1$s fejezetek + + 1 nap + %d nap + \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/hu/strings.xml b/i18n/src/commonMain/resources/MR/hu/strings.xml index 3d0cc6ccd..97faaa878 100644 --- a/i18n/src/commonMain/resources/MR/hu/strings.xml +++ b/i18n/src/commonMain/resources/MR/hu/strings.xml @@ -50,7 +50,6 @@ Hangerőszabályzó gombokkal Gombok felcserélése Háttérszín - Letöltések helye Verzió Összeomlás-jelentések küldése Befejezett @@ -340,7 +339,6 @@ Utolsó előtti előtti befejezett fejezet Utolsó előtti befejezett fejezet Kikapcsolva - Egyedi hely Tiltott kategóriák Könyvjelzőzött fejezetek törlésének engedélyezése Automatikus törlés olvasás után @@ -452,8 +450,6 @@ Nem lehetett a fejezeteket letölteni. Próbálja újra a letöltések menüpontban Válaszon ki egy forrást, ahonnan importálni szeretne Nem lehetett letölteni kevés tárhely miatt - Biztonsági mentés helye - Maximális biztonsági mentések száma Biztonsági mentés létrehozása Biztonsági mentés sikertelen Sütik törlése @@ -517,7 +513,6 @@ Biztonsági mentés már folyamatban van Nincs telepítve Figyelmeztetés: a tömeges letöltések a források lelassulásához és/vagy a Tachiyomi leállásához vezethetnek. Koppintson további információért. - Új fejezetek keresése %1$d frissítés kihagyva Koppintson további információért Nem sikerült a fedlap frissítése @@ -715,4 +710,46 @@ Jobbra csúsztatási cselekmény Forgatott széles oldalak megfordítása Ok + Tárolási hely + Érints ide, ha Cloudflare segítségre van szükséged + Soha + Átlépve, mert a sorozatot nem kell frissíteni + E-ink képernyőkön csökkenti a visszamaradó képet + %s feloldása + Automatikus biztonsági mentésekhez, fejezetek letöltéséhez, és helyi forráshoz használt. + Frissítés beállítása minden + Könyvtár szinkronizálása + Biztonsági mentés készítése nem sikerült + Intervallumok + Visszaállítás alapértelmezettre + Felhasználói ágens (user agent) szöveg nem lehet üres + Kategória alapján + További lehetőségek + Könyvtár szinkronizálása elkészült + Utolsó automatikus biztonsági mentés: %s + Intervallum testreszabása + Kiválasztott + Nincs szkennelő-fordító találat + Nem kiválasztott + Sorozat alulra küldése + Szkennelő-fordító + Villantson fehéren lap változtatáskor + Nincs internet kapcsolat + Tárolóhely felhasználás + Könyvtár frissítése ... (%s) + Bejegyzések + Felnavigálás + Adat és tárolás + Szeretnéd a kategóriákat betűrendbe rendezni? + Átlépve, mert ma nem várható kiadás + Nincs fájl kiválasztva + Érvénytelen felhasználói ágens (user agent) szöveg + Forrás beállítások + Applikáció beállítások + Vannak eredmények + Relatív időbélyegek + HTTP %d, nézd meg a honlapot WebViewban + \"%1$s\", ahelyett hogy \"%2$s\" + %s nem elérhető + Szkennelő-fordítók tiltása \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/in/strings.xml b/i18n/src/commonMain/resources/MR/in/strings.xml index 2424833ee..57178454c 100644 --- a/i18n/src/commonMain/resources/MR/in/strings.xml +++ b/i18n/src/commonMain/resources/MR/in/strings.xml @@ -110,7 +110,7 @@ Kiri Kanan Tengah - rotasi bawaan + Rotasi bawaan Bebas Terkunci tegak Terkunci mendatar @@ -118,10 +118,8 @@ G B A - Lokasi unduhan Setelah secara manual ditandai telah dibaca Otomatis hapus setelah dibaca - Lokasi kustom Tidak Aktif Bab terakhir yang dibaca Bab kedua dari terakhir dibaca @@ -134,9 +132,7 @@ Dapat digunakan untuk memulihkan isi pustaka saat ini Pulihkan cadangan Pulihkan isi pustaka dari berkas cadangan - Tempat pencadangan Frekuensi pencadangan otomatis - Jumlah maksimum pencadangan otomatis Cadangan dibuat Pemulihan selesai Apa saja yang ingin Anda cadangkan\? @@ -325,7 +321,6 @@ Gagal untuk menembus Cloudflare Harap perbarui aplikasi WebView untuk kompatibilitas yang lebih baik Pembaruan bab - Memeriksa bab baru Nonaktifkan optimisasi baterai Optimalisasi baterai sudah dimatikan Alamat surel @@ -768,4 +763,10 @@ Skor pelacak Data dan penyimpanan Kecualikan pemindai + Opsi lebih lanjut + Dipilih + Tidak dipilih + Navigasi ke atas + Lokasi penyimpanan + Digunakan untuk pencadangan otomatis, pengunduhan bab, dan sumber lokal. \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/it/strings.xml b/i18n/src/commonMain/resources/MR/it/strings.xml index f9191305f..2171a2e97 100644 --- a/i18n/src/commonMain/resources/MR/it/strings.xml +++ b/i18n/src/commonMain/resources/MR/it/strings.xml @@ -102,10 +102,8 @@ G B A - Posizione dei download Dopo averli contrassegnati manualmente come letti Cancella automaticamente dopo la lettura - Posizione personalizzata Disabilitato Ultimo capitolo letto Penultimo capitolo letto @@ -209,9 +207,7 @@ Può essere utilizzato per ripristinare la libreria attuale Ripristina backup Ripristina la libreria da un file di backup - Posizione dei backup Frequenza dei backup automatici - Massimo numero di backup automatici Backup creato Ripristino completato Di cosa vuoi fare il backup\? @@ -327,7 +323,6 @@ Capitoli %1$s Capitolo %1$s e altri %2$d Capitolo %1$s - Cercando nuovi capitoli Indirizzo e-mail Ottimizzazione batteria già disattivata Facilita gli aggiornamenti e i backup in secondo piano diff --git a/i18n/src/commonMain/resources/MR/ja/plurals.xml b/i18n/src/commonMain/resources/MR/ja/plurals.xml index 8c6bfcfac..cac385e17 100644 --- a/i18n/src/commonMain/resources/MR/ja/plurals.xml +++ b/i18n/src/commonMain/resources/MR/ja/plurals.xml @@ -4,22 +4,22 @@ %1$s分後 - %1$d新しい章 + %1$d件の新しい章 残り%1$s件 - %1$sで完成済み %2$s件のエラーが発生しました + %1$sで完了しました (%2$s件のエラー) %d件のカテゴリー - %d件の拡張機能の更新が利用可能 + %d件の拡張機能の更新が利用可能です - 第%1$s章とその他%2$d章 + %1$s章と他%2$d章 %d件の項目 @@ -31,7 +31,7 @@ %d個のトラッカー - ソースには存在しないか、フィルターによって排除されたため、%d章がスキップされました + %d章をスキップします。ソースに章が存在しないか、フィルタリングされています。 %1$d日前 @@ -43,7 +43,7 @@ 次の%d章 - %1$s章が欠けています + %1$s章が存在しません %d日 diff --git a/i18n/src/commonMain/resources/MR/ja/strings.xml b/i18n/src/commonMain/resources/MR/ja/strings.xml index e78c82161..5f8249a50 100644 --- a/i18n/src/commonMain/resources/MR/ja/strings.xml +++ b/i18n/src/commonMain/resources/MR/ja/strings.xml @@ -100,9 +100,9 @@ ブラック 既定のビューアモード - ページに分ける(左から右) - ページに分ける(右から左) - ページに分ける(上から下) + ページ分割 (左から右) + ページ分割 (右から左) + ページ分割 (上から下) 縦長のストリップ ページに分ける スケールの種類 @@ -125,10 +125,8 @@ G B A - ダウンロードフォルダ 手動で既読にした後 読んだ後自動で削除 - カスタムディレクトリ 無効 最後に読んだ章の2番目 新しい章をダウンロード @@ -136,9 +134,7 @@ 現在のライブラリを復元するために使用できます バックアップを復元 バックアップファイルからライブラリを復元する - バックアップディレクトリ 自動バックアップの頻度 - 最大の自動バックアップ数 バックアップが作成されました チャプタキャッシュをクリア 消去中にエラーが発生しました @@ -204,7 +200,7 @@ 次をクリップボードにコピーしました: \n%1$s 第%1$s章 - ダウンロード中(%1$d/%2$d) + ダウンロード中 (%1$d/%2$d) エラー 一時停止済み ソースタイトル @@ -295,7 +291,7 @@ ログアウト ログアウトしました 一時停止 - + その他 その他 最新章の更新順 章を見る @@ -373,7 +369,6 @@ 章の更新 WebViewアプリを更新して互換性を向上させてください WebViewが必要です - 新しい章を確認中 ライブラリを更新中 ビューアモード 詳細を非表示 @@ -391,7 +386,7 @@ ライブラリ内 ローカルソースガイド ピン留め済み - 最近に使用済み + 最近に使用 現在のビューアモードを、ビューアが立ち上がるとしばらく表示します ビューアモードを表示 ソースが見つかりませんでした @@ -472,7 +467,7 @@ 前へ ビューアが立ち上がるとしばらく表示します タップ可能なゾーンを表示 - DNS over HTTPS(DoH) + DNS over HTTPS (DoH) 含まれているカテゴリーに入っていても、除外対象カテゴリーにある項目は更新されません。 自動ダウンロード 下記を除外: %s @@ -522,7 +517,7 @@ ダウンロードを開始します ダイナミック 一部のスマホメーカーはバックグラウンドサービスを終了する追加のアプリ制限を施しています。修正する方法についてはこのWebサイトをご覧ください。 - 背景活動 + バックグラウンドアクティビティ MIUI最適化が有効な場合はバックアップ・復元が正常に機能しない恐れがあります。 最低 低い @@ -585,7 +580,7 @@ タップでもっと詳しく スキップ済み %1$d件の更新に失敗しました - 縦向き(反転) + 縦向き (反転) シリーズをトップに移動 無効 バックアップできるライブラリ項目はありません @@ -675,12 +670,12 @@ ローカル 開始済み 閲覧時間 - 項目 - グローバルアップデート対象 - 総計 + 作品 + グローバルアップデート + 合計 閲覧済み トラッカー - 追跡中の作品 + トラッキング中の作品 使用中 N/A %d時間 @@ -688,9 +683,9 @@ %d秒 統計情報 概要 - 読了した作品 + 読み終わった作品 ダウンロード済み - 平均点数 + 平均 %d日 後で カテゴリが空です @@ -732,7 +727,7 @@ %s からも削除 ダウンロードを削除 10+チェック後半 - 落とした\? 20歳以上後半と2ヶ月 + 落とした? 20歳以上後半と2ヶ月 チェック期間を過ぎました OK ライブラリを同期しています @@ -750,7 +745,7 @@ 相対的なタイムスタンプ 「%2$s」の代わりに「%1$s」を使用 カテゴリの並べ替え - ライブラリの更新中…(%s) + ライブラリの更新中… (%s) カテゴリをアルファベット順で並べ替えますか? ソース設定 アプリ設定 @@ -768,4 +763,10 @@ スキャンレーターが見つかりませんでした スキャンレーター スキャンレーターを除外 + その他のオプション + 選択済み + 未選択 + 上に移動 + 保存場所 + 自動バックアップ、章のダウンロード、ローカル ソースの保存位置となります。 \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/jv/strings.xml b/i18n/src/commonMain/resources/MR/jv/strings.xml index 743d80f42..ae0ef92e8 100644 --- a/i18n/src/commonMain/resources/MR/jv/strings.xml +++ b/i18n/src/commonMain/resources/MR/jv/strings.xml @@ -13,7 +13,6 @@ Versi DNS liwat HTTPS Dipateni - Lokasi donlot T B I @@ -312,4 +311,7 @@ Diwiwiti Diundhuh Telusuri… + Ngehapus downloadan + Dipilih + Gak dipilih \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/ka-rGE/strings.xml b/i18n/src/commonMain/resources/MR/ka-rGE/strings.xml index a34b277fc..9d4038b90 100644 --- a/i18n/src/commonMain/resources/MR/ka-rGE/strings.xml +++ b/i18n/src/commonMain/resources/MR/ka-rGE/strings.xml @@ -173,10 +173,8 @@ ყოველთვის აჩვენე თავებს შორის გადასვლა კითხვა ცარიელი არეა გვერდებზე - გადმოწერის ადგილი დისკზე წაშალე წაკითხულად მონიშვნის შემდეგ წაკკითხვის შემდეგ წაშალე - ინდივიდუალური ადგილმდებარეობა გამორთული ბოლო წაკითხული თავი ბოლოს წინა წაკითხული თავი @@ -190,9 +188,7 @@ შესაძლებელია გამოყენებულ იქნას ახლანდელი ბიბლიოთეკის ასადგენად რეზერვის აღდგენა ბიბლიოთეკის აღდგენა რეზერვიდან - რეზერვის ლოკაცია რეზერვის შექმნის სიხშირე - მაქსიმალური რეზერვი რეზერვი შექმნილია არასწორი სარეზერვო ფაილი მარქაფი ბიბლიოთეკის ჩანაწერებს არ შეიცავს. @@ -314,7 +310,6 @@ მიგრაცია კოპირება ვერ მოხერხდა თავების გადმოწერა. შეგიძლია სცადო თავიდან გადმოწერების სექციაში - ახალი თავების ძებნა ახალი თავები მოიძებნა თავი %1$s თავი %1$s და %2$d მეტი diff --git a/i18n/src/commonMain/resources/MR/kk/strings.xml b/i18n/src/commonMain/resources/MR/kk/strings.xml index 6721346ce..190113347 100644 --- a/i18n/src/commonMain/resources/MR/kk/strings.xml +++ b/i18n/src/commonMain/resources/MR/kk/strings.xml @@ -291,9 +291,7 @@ Сұр Әдепкі оқу режимі Ең жоғары - Жүктеу орны Саналмайтын санаттар - Реттелетін орын Қолмен оқылған деп белгіленгеннен кейін Оқығаннан кейін автоматты түрде жою Бетбелгіленген тарауларды жоюға рұқсат беру @@ -408,7 +406,6 @@ Туындылар мұқабасын жаңарту Cloudflare айналып өтілмеді Жақсырақ үйлесімділік үшін WebView-ді жаңартыңыз - Сақтық көшірме бумасы Бақылау қызметіне кірілмеген: Соңғы Сұрыптау @@ -419,7 +416,6 @@ Күн Шығып жатыр Қалпына келтіру әлдеқашан орындалуда - Сақтық көшірме саны Сақтық көшірмесіне нені қалайсыз\? Сақтық көшірмесін қалпына келтіру Сақтық көшірмесі әлдеқашан орындалуда @@ -587,7 +583,6 @@ Қолданбаны өшіріп қосу Тараулар жүктелмеді. Жүктеулер кезегіне барып, сол жерден байқап көре аласыз Жадта орын аз болғандықтан тараулар жүктелмейді - Жаңа тараулар бар ма екенін тексеру %1$s тарау мен %2$d Бұны істер алдыңда жазбаны кітапханаңызға қосыңыз Туынды аяқталған үшін өткізіп жіберілді diff --git a/i18n/src/commonMain/resources/MR/kn/strings.xml b/i18n/src/commonMain/resources/MR/kn/strings.xml index 8e7407d7b..1ea09b5a9 100644 --- a/i18n/src/commonMain/resources/MR/kn/strings.xml +++ b/i18n/src/commonMain/resources/MR/kn/strings.xml @@ -115,9 +115,7 @@ %02d ನಿಮಿಷ, %02d ಸೆಕೆಂಡು ಮರುಸ್ಥಾಪನೆ ಪೂರ್ಣಗೊಂಡಿದೆ ಬ್ಯಾಕಪ್ ರಚಿಸಲಾಗಿದೆ - ಗರಿಷ್ಠ ಬ್ಯಾಕಪ್‌ಗಳು ಬ್ಯಾಕಪ್ ಆವರ್ತನ - ಬ್ಯಾಕಪ್ ಸ್ಥಳ ಬ್ಯಾಕಪ್ ಫೈಲ್‌ನಿಂದ ಗ್ರಂಥಾಲಯವನ್ನು ಮರುಸ್ಥಾಪಿಸಿ ಬ್ಯಾಕಪ್ ಮರುಸ್ಥಾಪಿಸಿ ಪ್ರಸ್ತುತ ಗ್ರಂಥಾಲಯವನ್ನು ಪುನಃಸ್ಥಾಪಿಸಲು ಬಳಸಬಹುದು @@ -132,10 +130,8 @@ ಕೊನೆಯ ಅಧ್ಯಾಯದಿಂದ ಎರಡನೆಯದು ಕೊನೆಯದಾಗಿ ಓದಿದ ಅಧ್ಯಾಯ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ - ಕಸ್ಟಮ್ ಸ್ಥಳ ಓದಿದ ನಂತರ ಓದಿದಂತೆ ಗುರುತಿಸಿದಾಗ ತೆಗೆದುಹಾಕಿ - ಡೌನ್‌ಲೋಡ್ ಸ್ಥಳ ಸೈಡ್ ಪ್ಯಾಡಿಂಗ್ ಓದುತ್ತಿರುವ ಅಧ್ಯಾಯ ಪರಿವರ್ತನೆಯನ್ನು ಯಾವಾಗಲೂ ತೋರಿಸಿ @@ -254,7 +250,6 @@ ಅಧ್ಯಾಯ %1$s ಮತ್ತು %2$d ಹೆಚ್ಚು ಅಧ್ಯಾಯ %1$s ಹೊಸ ಅಧ್ಯಾಯಗಳು ಕಂಡುಬಂದಿವೆ - ಹೊಸ ಅಧ್ಯಾಯಗಳಿಗಾಗಿ ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ ಅಧ್ಯಾಯಗಳನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ಡೌನ್‌ಲೋಡ್‌ಗಳ ವಿಭಾಗದಲ್ಲಿ ನೀವು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಬಹುದು ನಕಲಿಸಿ ಸ್ಥಳಾಂತರಿಸಿ diff --git a/i18n/src/commonMain/resources/MR/ko/strings.xml b/i18n/src/commonMain/resources/MR/ko/strings.xml index 371f76e50..af2e5cf34 100644 --- a/i18n/src/commonMain/resources/MR/ko/strings.xml +++ b/i18n/src/commonMain/resources/MR/ko/strings.xml @@ -137,9 +137,7 @@ 백업 생성 백업 복원 백업 파일에서 서재 복원 - 백업 위치 백업 주기 - 최대 백업 백업 생성됨 복원 완료 백업 복원중 @@ -243,8 +241,6 @@ G B A - 다운로드 폴더 - 사용자 정의 위치 끝에서 두번째 회차 끝에서 세번째 회차 끝에서 네번째 회차 @@ -476,7 +472,6 @@ 기록이 삭제되었습니다 저장 공간이 부족하여 회차를 다운로드 할 수 없습니다 경고: 대량 다운로드는 소스가 느려지거나 Tachiyomi를 차단할 수 있습니다. 탭하여 자세히 알아보기. - 새로운 회차 확인 중 대규모 업데이트는 소스에 피해를 입히고 업데이트가 느려지고 배터리 사용량이 증가할 수 있습니다. 탭하여 자세히 알아보기. %1$s화 %1$d개의 업데이트가 실패했습니다 diff --git a/i18n/src/commonMain/resources/MR/lt/strings.xml b/i18n/src/commonMain/resources/MR/lt/strings.xml index 92c7f2bf2..7905d0f18 100644 --- a/i18n/src/commonMain/resources/MR/lt/strings.xml +++ b/i18n/src/commonMain/resources/MR/lt/strings.xml @@ -320,24 +320,20 @@ Leisti naikinti žymėtus skyrius Penktas nuo paskutinio skaityto Automatinis atsisiuntimas - Maksimalus atsarginių kopijų skaičius Sukurta atsarginė kopija aukštas - Atsisiuntimo vieta Naikinti skyrius Mažiausias Rankinių būdu pažymėtas, kaip skaitytas Perskaičius automatiškai naikinti Patobulintos paslaugos Atkurti biblioteką iš atsarginės failo kopijos - Atsarginės kopijos vieta Atsarginėje kopijoje nėra jokių bibliotekos įrašų. Netinkamas atsarginės kopijos failas Aukščiausias Kurti atsarginę kopiją Atkurti atsarginę kopiją Neįtrauktos kategorijos - Pasirinktina vieta Paskiausiai skaitytas skyrius Įrašai neįtrauktose kategorijose nebus atsisiųsti, net jei jie taip pat yra įtraukti į kategorijas. Palieskite, kad sužinotumėte daugiau @@ -358,7 +354,6 @@ Priskirti šiai serijai Baigta: Dabartinis: - Ieškoma naujų skyrių Nepavyko atnaujinti %1$d Prieš atlikdami šį veiksmą, pridėkite įrašą į savo biblioteką Praleista, nes nėra perskaitytų skyrių diff --git a/i18n/src/commonMain/resources/MR/lv/strings.xml b/i18n/src/commonMain/resources/MR/lv/strings.xml index e1686922c..22ec8a73d 100644 --- a/i18n/src/commonMain/resources/MR/lv/strings.xml +++ b/i18n/src/commonMain/resources/MR/lv/strings.xml @@ -163,7 +163,6 @@ Vēl turpinās Nosaukums Izdzēst nodaļas - Lejuplādes vieta Automātiska lejupielāde Atjaunot dublējumu Sekotāji, kas nav pieteikušies: @@ -348,7 +347,6 @@ Augstākais Brīdinājums Izlaist izlasītās nodaļas - Pielāgota lokācija Invertēts Reizināt Ekrāns @@ -372,7 +370,6 @@ Uzlabo lasītāja veiktspēju, sadalot garus lejupielādētus attēlus Pakalpojumi, kas nodrošina uzlabotus līdzekļus konkrētiem avotiem. Pievienojot bibliotēkai, ieraksts tiks automātiski izsekots. Izveidot dublējumu - Dublējuma atrašanās vieta Nederīgs dublējuma fails Dublējumu biežums Kopijas vajadzētu glabāt arī citās vietās. @@ -400,7 +397,6 @@ Nav ko tīrīt Atspējot akumulatora optimizāciju Atjaunot bibliotēku no dublējuma faila - Maksimālais dublējumu skaits Notīrīt sīkfailus Izvēlēties DNS pār HTTPS (DoH) Sīkfaili notīrīti @@ -513,7 +509,6 @@ Lasīšanas režīms Nākošā nodaļa nav atrasta Nu, šis ir neveikli - Pārbauda, vai nav jaunu nodaļu %1$d atjauninājums(-i) izlaists(-i) Atvērt vietnē GitHub Šī Android versija vairs netiek atbalstīta diff --git a/i18n/src/commonMain/resources/MR/ms/strings.xml b/i18n/src/commonMain/resources/MR/ms/strings.xml index 1cb6c1a59..c9d4ea92d 100644 --- a/i18n/src/commonMain/resources/MR/ms/strings.xml +++ b/i18n/src/commonMain/resources/MR/ms/strings.xml @@ -121,10 +121,8 @@ G B A - Lokasi muat turun Selepas secara manual ditandakan sebagai dibaca Selepas membaca padam secara automatik - Lokasi tersuai Dinyahkan Bab terakhir dibaca Bab kedua terakhir dibaca @@ -137,9 +135,7 @@ Boleh digunakan untuk memulihkan pustaka semasa Pulihkan sandaran Pulihkan pustaka daripada fail sandaran - Lokasi sandaran Kekerapan sandaran - Sandaran maksimum Sandaran dicipta Pemulihan selesai Apakah yang ingin anda sandarkan? @@ -327,7 +323,6 @@ Bab %1$s dan %2$d lagi Bab %1$s Sembunyikan kandungan pemberitahuan - Mencari bab baharu Nyahdaya pengoptimuman bateri Membantu dengan pengemaskinian latar belakang pustaka dan sandaran Pengoptimuman bateri sudah dinyahdayakan diff --git a/i18n/src/commonMain/resources/MR/nb-rNO/strings.xml b/i18n/src/commonMain/resources/MR/nb-rNO/strings.xml index 71d9d6e9c..90f0c92fe 100644 --- a/i18n/src/commonMain/resources/MR/nb-rNO/strings.xml +++ b/i18n/src/commonMain/resources/MR/nb-rNO/strings.xml @@ -140,10 +140,8 @@ G B A - Nedlastingsmappe Etter manuelt markert som lest Slett automatisk etter lesing - Egendefinert mappe Avskrudd Sist leste kapittel Nest sist leste kapittel @@ -156,9 +154,7 @@ Kan brukes til å gjenopprette nåværende bibliotek Gjenopprett sikkerhetskopi Gjenopprett bibliotek fra sikkerhetskopifil - Sikkerhetskopi-mappe Sikkerhetskopieringsfrekvens - Maks antall sikkerhetskopier Sikkerhetskopi opprettet Gjenoppretting fullført Hva ønsker du å sikkerhetskopiere\? @@ -363,7 +359,6 @@ Loddrett vannrett Ingen - Søker etter nye kapitler Kilden ikke funnet For denne serien Ukjent status @@ -754,4 +749,24 @@ Programinnstillinger Relative tidsstempler \"%1$s\" istedenfor \"%2$s\" + Lagringsplass + Opprett + Aldri + Reduserer etterbilde på e-ink skjermer + Brukt for automatiske sikkerhetskopier, nedlastede kapitler og lokal kilde. + Bruk + Gjenopprett standardinnstillinger + Flere valg + Siste automatisk sikkerhetskopi: %s + Valgt + Ingen skanningsoversettere funnet + Ikke valgt + Skanningsoversetter + Blink hvitt ved sidebytte + Lagringsbruk + Naviger opp + Sporer poengsum + Data og lagring + Ingen fil valgt + Ekskluder skanningsoversettere \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/ne/strings.xml b/i18n/src/commonMain/resources/MR/ne/strings.xml index 5e977a022..40f3508f7 100644 --- a/i18n/src/commonMain/resources/MR/ne/strings.xml +++ b/i18n/src/commonMain/resources/MR/ne/strings.xml @@ -295,7 +295,6 @@ G पढ्ने मोड स्क्रोलमा मेनु लुकाउनका लागि संवेदनशीलता - डाउनलोड स्थान अन्तिम पढिएको अध्याय भन्दा पहिले १ अध्याय स्वत: डाउनलोड गर्नुहोस् ट्र्याकिङ गाइड @@ -348,7 +347,6 @@ उच्च सबैभन्दा कम अध्यायहरू हटाउनुहोस् - कस्टम स्थान आफै पढिएको रूपमा चिन्ह लगाइएपछि पढिसकेपछि स्वचालित रूपमा हटाउनुहोस् CBZ अभिलेख को रूपमा सेभ गर्नुहोस् @@ -371,7 +369,6 @@ डेटा खाली गर्दा त्रुटि भयो स्थिति - नयाँ अध्यायहरूको लागि जाँच गर्दै डाउनलोड गर्दै… अपडेट स्थापना गर्न ट्याप गर्नुहोस् अप्रत्याशित त्रुटिका कारण अध्याय डाउनलोड गर्न सकिएन @@ -394,9 +391,7 @@ ब्याकअप रिस्टोर गर्नुहोस् ब्याकअप फाइलबाट पुस्तकालय रिस्टोर गर्नुहोस् ब्याकअपमा कुनै पनि पुस्तकालयका इन्ट्री समावेश छैन। - ब्याकअप स्थान स्वचालित ब्याकअप फ्रिक्वेन्सी - अधिकतम स्वचालित ब्याकअपहरू प्रयोग गरिएको: %1$s क्यास खाली गरियो। %1$d फाइलहरू हटाएका छन् अध्याय %1$s र %2$d अरू diff --git a/i18n/src/commonMain/resources/MR/nl/strings.xml b/i18n/src/commonMain/resources/MR/nl/strings.xml index cf5c4d9d7..f894c0132 100644 --- a/i18n/src/commonMain/resources/MR/nl/strings.xml +++ b/i18n/src/commonMain/resources/MR/nl/strings.xml @@ -101,8 +101,6 @@ G B A - Downloadlocatie - Aangepaste locatie Laatst gelezen hoofdstuk Een-na-laatste gelezen hoofdstuk Twee-na-laatste gelezen hoofdstuk @@ -112,9 +110,7 @@ Kan worden gebruikt om de huidige bibliotheek te herstellen Back-up herstellen Herstellen van back-up bestand - Back-uplocatie Frequentie van automatische back-ups - Maximaal aantal automatische back-ups Back-up gemaakt Herstellen voltooid Wat wil je back-uppen? @@ -337,7 +333,6 @@ Hoofdstukken %1$s Hoofdstuk %1$s en %2$d meer Hoofdstuk %1$s - Zoeken naar nieuwe hoofdstukken Hfst. %1$s - %2$s Bibliotheek bijwerken Tracking toevoegen diff --git a/i18n/src/commonMain/resources/MR/nn/strings.xml b/i18n/src/commonMain/resources/MR/nn/strings.xml index 71ca74d36..4579d3fb0 100644 --- a/i18n/src/commonMain/resources/MR/nn/strings.xml +++ b/i18n/src/commonMain/resources/MR/nn/strings.xml @@ -190,7 +190,6 @@ Spor Lag reservekopi Gjenopprett reservekopi - Reservekopifil-mappe Reservekopi oppretta Ugyldig reservekopifil Reservekopi inneheld ingen manga. diff --git a/i18n/src/commonMain/resources/MR/pl/strings.xml b/i18n/src/commonMain/resources/MR/pl/strings.xml index 9e28dfc11..96c824b8c 100644 --- a/i18n/src/commonMain/resources/MR/pl/strings.xml +++ b/i18n/src/commonMain/resources/MR/pl/strings.xml @@ -160,10 +160,8 @@ G B A - Lokalizacja pobierania Po ręcznym oznaczeniu jako przeczytane Usuwaj rozdziały automatycznie po przeczytaniu - Niestandardowa lokalizacja Wyłączone Ostatnio czytany rozdział Przedostatnio czytany rozdział @@ -178,9 +176,7 @@ Może być użyta do przywrócenia aktualnej biblioteki Przywróć kopię zapasową Przywraca bibliotekę z pliku kopii zapasowej - Lokalizacja kopii zapasowych Częstotliwość tworzenia kopii - Maks. ilość kopii automatycznych Co zawrzeć w kopii zapasowej? Przywracanie kopii zapasowej Tworzenie kopii zapasowej @@ -365,7 +361,6 @@ WebView jest wymagany do poprawnego działania aplikacji Rozdziały %1$s Rozdział %1$s i %2$d więcej - Poszukiwanie nowych rozdziałów Tryb czytania Źródła lokalne - poradnik Pokazuj zawartość w strefie odcięcia @@ -736,4 +731,7 @@ W miesiącu (28 dni) OK To usunie śledzenie lokalne. + Zatwierdź + Przywróć do domyślnych + Przenieś serię na dół \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/pt-rBR/strings.xml b/i18n/src/commonMain/resources/MR/pt-rBR/strings.xml index 861bb7a70..cde48563d 100644 --- a/i18n/src/commonMain/resources/MR/pt-rBR/strings.xml +++ b/i18n/src/commonMain/resources/MR/pt-rBR/strings.xml @@ -120,10 +120,8 @@ G B A - Local de download Após marcado como lido manualmente Excluir automaticamente após a leitura - Local personalizado Desativado Último capítulo lido Penúltimo capítulo lido @@ -136,9 +134,7 @@ Pode ser usado para restaurar a biblioteca atual Restaurar backup Restaura a biblioteca de um arquivo de backup - Local de backup Frequência de backup automático - Máximo de backups automáticos Backup criado Restauração concluída Do que você deseja fazer backup\? @@ -327,7 +323,6 @@ Capítulo %1$s e mais %2$d Capítulos %1$s Ocultar conteúdo da notificação - Verificando por novos capítulos Desativar a otimização de bateria Ajuda com as atualizações e os backups da biblioteca em segundo plano A otimização de bateria já está desativada @@ -768,4 +763,10 @@ Scanlator Excluir scanlators Criar + Selecionado + Não selecionado + Local de armazenamento + Usado para backups automáticos, downloads de capítulos e na fonte local. + Mais opções + Navegar para cima \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/pt/strings.xml b/i18n/src/commonMain/resources/MR/pt/strings.xml index 1ee6c095e..a5a8f59fe 100644 --- a/i18n/src/commonMain/resources/MR/pt/strings.xml +++ b/i18n/src/commonMain/resources/MR/pt/strings.xml @@ -87,10 +87,8 @@ Livre Vertical bloqueado Horizontal bloqueado - Localização das Transferências Após marcado como lido manualmente Eliminar automaticamente após a leitura - Localização personalizada Desativado Último capítulo Penúltimo capítulo lido @@ -226,11 +224,9 @@ Velocidade de animação de toque duplo Paginação R - Localização de cópia de segurança Cópia de segurança criada Restauro completo O que pretende fazer cópia de segurança\? - Máximo de cópias de segurança Capítulos transferidos Confiar Não confiável @@ -326,7 +322,6 @@ Capítulo %1$s e %2$d mais Capítulos %1$s Esconder conteúdo das notificações - Verificando por novos capítulos Desativar otimização de bateria Ajuda com a atualização e cópia de segurança da biblioteca em segundo plano A otimização de bateria já está desativada diff --git a/i18n/src/commonMain/resources/MR/ro/strings.xml b/i18n/src/commonMain/resources/MR/ro/strings.xml index c0ce88489..47afbd831 100644 --- a/i18n/src/commonMain/resources/MR/ro/strings.xml +++ b/i18n/src/commonMain/resources/MR/ro/strings.xml @@ -145,10 +145,8 @@ G B A - Locația descărcărilor După ce a fost marcat manual ca citit După citire ștergeți automat - Locație personalizată Deactivat Ultimul capitol citit Penultimul capitol citit @@ -161,9 +159,7 @@ Poate fii folosit pentru a restaura biblioteca curentă Restaurează copia de rezervă Restaurează biblioteca din fișierul copiei de rezervă - Locația copiei de rezervă Frecventă de creere a copiilor de rezervă - Numărul maxim de copii de rezervă Backup creat Restaurare completă Doriți să creați o copie de rezervă\? @@ -327,7 +323,6 @@ Capitolul %1$s și %2$d în plus Capitolele %1$s Ascunde conținutul notificării - Verificând pentru capitole noi Dezactivați optimizarea bateriei Ajută la actualizările și copiile de rezervă ale bibliotecii în fundal Optimizarea bateriei este deja dezactivată diff --git a/i18n/src/commonMain/resources/MR/ru/strings.xml b/i18n/src/commonMain/resources/MR/ru/strings.xml index 1eb0b2e28..7f78bef3c 100644 --- a/i18n/src/commonMain/resources/MR/ru/strings.xml +++ b/i18n/src/commonMain/resources/MR/ru/strings.xml @@ -61,7 +61,6 @@ Использовать это изображение как обложку\? Cookies очищены Обложка обновлена - Пользовательская папка Пользовательский фильтр Не удалось загрузить изображение Это действие удалит дату прочтения этой главы. Вы уверены\? @@ -126,7 +125,6 @@ Удалить историю для серий, которые не находятся в библиотеке Пользовательская яркость Пользовательский светофильтр - Папка загрузок Загружать новые главы Отправлять отчёты об ошибках Анимированные переходы страниц @@ -209,9 +207,7 @@ Источник на устройстве Серии библиотеки Больше нет результатов - Папка резервной копии Частота автоматических резервных копий - Количество автоматических резервных копий Создать резервную копию Можно использовать для восстановления текущей библиотеки Обрезать поля @@ -325,7 +321,6 @@ Главы %1$s Глава %1$s Отображение - Проверка наличия новых глав Обновление библиотеки Оптимизация батареи уже выключена Помогает с обновлением библиотеки и резервной копией в фоне @@ -768,4 +763,10 @@ Переводчики не найдены Переводчик Исключить переводчиков + Выбрано + Не выбрано + Другие опции + Перейти вверх + Путь хранилища + Используется для автоматических резевных копии, загрузок глав и источнике на устройстве. \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/sa/strings.xml b/i18n/src/commonMain/resources/MR/sa/strings.xml index a5e057ba0..ba0d9e5a6 100644 --- a/i18n/src/commonMain/resources/MR/sa/strings.xml +++ b/i18n/src/commonMain/resources/MR/sa/strings.xml @@ -303,13 +303,11 @@ उच्चतमम् पुटचिह्नकृतानाम् अध्यायानां नाशयितुम् अनुमन्यताम् वर्जितवर्गाः - स्वकृतस्थलम् अशक्तं कृतम् अन्तिमपठितः अध्यायः अन्तिमपठितात् अध्यायात् पूर्वम् अन्तिमपठितात् अध्यायात् द्वितीयपूर्वम् सेवाः - अवारोपणस्थलम् पठितमिति स्वीयचिह्नितात् परम् पठनात् परं स्वयञ्चालितं नाशयतु CBZ-लेखागारम् इव अमुकनाम्ना रक्षतु @@ -326,9 +324,7 @@ प्रतिलेखनं निर्मातु एतत् उपयुज्य वर्तमानग्रन्थालयं समादातुं शक्यते प्रतिलेखनं समाददातु - प्रतिलेखनस्थलम् प्रतिलेखनस्य आवर्तनता - अधिकतमप्रतिलेखनानि प्रतिलेखनं पूर्वमेव प्रगतौ अस्ति %02d निमेषाः %02d क्षणाः च प्रतिलेखनस्य समादानम् अनुत्तीर्णम् @@ -515,7 +511,6 @@ अध्यायः %1$s – %2$s अग्रिमाध्यायः नास्ति पूर्वाध्यायः नास्ति - नूतनाध्यायेभ्यः मार्गति %1$s: %2$s पुटः च %3$d पठिताः अध्यायाः न सन्ति नूतननवीकरणानि न उपलभ्यानि diff --git a/i18n/src/commonMain/resources/MR/sah/strings.xml b/i18n/src/commonMain/resources/MR/sah/strings.xml index e33dbadb3..c8300a91c 100644 --- a/i18n/src/commonMain/resources/MR/sah/strings.xml +++ b/i18n/src/commonMain/resources/MR/sah/strings.xml @@ -237,9 +237,7 @@ Хаппаас куопуйа маангата суох. Хаппаас куопуйа алдьаммыт билэтэ Хаппаас куопуйа оҥоһуллунна - Муҥутугар дылы хаппаас куопуйалар Хаппаас куопуйа оҥоһуутун түргэнэ - Хаппаас куопуйа сурунаала Бэбэлэтиэкэни хаппаас куопуйа билэтиттэн төнүҥнэрии Хаппаас куопуйаны куолутунан туруоруу Билиҥни бибилиотеканы төнүннэрэргэ туттуохха сөп @@ -254,10 +252,8 @@ Бүтэһик түһүмэх иннинээҕи Бүтэһигинэн ааҕыллыбыт түһүмэх Араарыллыбыт - Туттааччы ыйдарыыта Ааҕы кэннэ Ааҕыллыбыт диэн суруллубутун кэннэ - Хачайдааһын сурунаала Уларыйыы киирэрин гына эбилиги хос холбоо Кээс сотторуутугар сыыһааһын буолла Кээс ыраастанна. %1$d билэ сотторуллубут этэ diff --git a/i18n/src/commonMain/resources/MR/sc/strings.xml b/i18n/src/commonMain/resources/MR/sc/strings.xml index c54c10a42..9153343cf 100644 --- a/i18n/src/commonMain/resources/MR/sc/strings.xml +++ b/i18n/src/commonMain/resources/MR/sc/strings.xml @@ -146,10 +146,8 @@ G B A - Cartella de sos iscarrigamentos A pustis de l\'àere marcadu manualmente comente lèghidu Iscantzella in automàticu a pustis de sa leghidura - Cartella personalizada Disabilitadu Leghe s\'ùrtimu capìtulu Penùrtimu capìtulu lèghidu @@ -162,9 +160,7 @@ Podet èssere impreada pro ripristinare sa biblioteca atuale Riprìstina una còpia de seguresa Riprìstina sa biblioteca dae una còpia de seguresa - Cartella de sa còpia de seguresa Frecuèntzia de sarvatàgiu de sas còpias de seguresa - Màssimu de còpias de seguresa Còpia de seguresa creada Riprìstinu acabadu De ite cheres fàghere una còpia de seguresa\? @@ -327,7 +323,6 @@ Capìtulu %1$s e àteros %2$d Capìtulos %1$s Cua su cuntenutu de sas notìficas - Chirchende capìtulos noos Disabìlita s\'otimizatzione de sa bateria Agiudat cun sos agiornamentos de sa biblioteca e sas còpias de seguresa S\'otimizatzione de sa bateria est giai disabilitada @@ -749,4 +744,29 @@ HTTP %d, verìfica su situ in WebView \"%1$s\" in càmbiu de \"%2$s\" Non s\'est pòdidu atzèdere a %s + Positzione de archiviatzione + Crea + Mai + Mìnimat s\'efetu pantasma in ischermos cun tinta eletrònica + Impreadu pro sas còpias de seguresa automàticas, sos iscarrigamentos de sos capìtulos e s\'orìgine locale. + Àplica + Riprìstina a sos valores predefinidos + Òrdina sas categorias + Prus optziones + Ùrtima còpia de seguresa automàtica: %s + Seletzionadu + Perunu iscandutore agatadu + Non seletzionadu + Iscandutore (iscansidore+tradutore) + Lampìgia in biancu in su càmbiu de pàgina + Impreu de sa memòria + Agiornende sa biblioteca… (%s) + Nàviga cara a subra + Votu de s\'arrastadore + Datos e archiviatzione + Boles ordinare sas categorias in manera alfabètica? + Perunu archìviu seletzionadu + Impostatziones de sas fontes + Impostatziones de s\'aplicatzione + Esclude sos iscandutores (iscansidores+tradutores) \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/sdh/strings.xml b/i18n/src/commonMain/resources/MR/sdh/strings.xml index 6172e7469..9b4a4a81c 100644 --- a/i18n/src/commonMain/resources/MR/sdh/strings.xml +++ b/i18n/src/commonMain/resources/MR/sdh/strings.xml @@ -55,7 +55,6 @@ هیچ مانگایەکت لەم دواییانە نەخوێندووەتەوە زانیاری زیادکراو یارمەتی - گەڕان بە دوای چاپتەری نوێدا تۆماری ڕابردووەکەت بەتاڵە گەڕان لە ناو سازکارییەکان وەک نەخوێندراوێک ئاماژەی پێبکە @@ -189,7 +188,6 @@ کردنە ناو کۆکراوەکان تکایە مانگا بۆ کۆکراوەکان زیاد بکە پێش کردنی ئەمە زیادکردنی مانگا بۆ کۆکراوەکان؟ - شوێنی داونلۆد داونلۆدکردن تەنها داونلۆدکراوەکان ئەمە ڕێگری ناکات لە دەرکەوتنی بابەتی سەروو 18 ی نا فەرمی لە بەرنامەکە. diff --git a/i18n/src/commonMain/resources/MR/sk/strings.xml b/i18n/src/commonMain/resources/MR/sk/strings.xml index b095dc1f1..46fbb2b33 100644 --- a/i18n/src/commonMain/resources/MR/sk/strings.xml +++ b/i18n/src/commonMain/resources/MR/sk/strings.xml @@ -156,10 +156,8 @@ G B A - Kam stahovať Po manuálnom označení ako prečítané Po prečítaní automaticky odstrániť - Vlastný adresár Zakázané Naposledy čítaná kapitola Predposledná prečítaná kapitola @@ -172,9 +170,7 @@ Možno použiť na obnovenie aktuálnej knižnice Obnoviť zálohu Obnoviť knižnicu zo záložného súboru - Adresár na zálohy Frekvencia zálohovania - Maximálny počet záloh Záloha bola vytvorená Obnovenie dokončené Čo chcete zálohovať\? @@ -306,7 +302,6 @@ Nepodarilo sa obísť službu Cloudflare Pozastavené Neprečítané - Hľadám nové kapitoly Skryť obsah upozornení Zakázať všetko Povoliť všetko diff --git a/i18n/src/commonMain/resources/MR/sq/strings.xml b/i18n/src/commonMain/resources/MR/sq/strings.xml index eeed53f50..ceda2b70d 100644 --- a/i18n/src/commonMain/resources/MR/sq/strings.xml +++ b/i18n/src/commonMain/resources/MR/sq/strings.xml @@ -341,10 +341,8 @@ Modaliteti i leximit Më e larta E ulët - Shkarko vendndodhjen Fshi kapitujt Kategoritë e përjashtuara - Vendndodhja e personalizuar Vendndodhja e pavlefshme: %s Kapitulli i fundit i lexuar Kapitulli i katërt deri tek i fundit i lexuar @@ -401,7 +399,6 @@ Shërbime që ofrojnë veçori të përmirësuara për burime specifike. Regjistrimet gjurmohen automatikisht kur shtohen në bibliotekën tuaj. Pista Frekuenca rezervë - Rezervimet maksimale Gjurmuesit nuk kanë hyrë në: %02d min, %02d sek Rezervimi/rivendosja mund të mos funksionojë siç duhet nëse Optimizimi MIUI është i çaktivizuar. @@ -502,7 +499,6 @@ Krijo kopje rezervë Mund të përdoret për të rivendosur bibliotekën aktuale Rivendos kopjen rezervë - Vendndodhja rezervë U krijua një kopje rezervë Burimet që mungojnë: Rivendosja përfundoi @@ -629,7 +625,6 @@ Rinisni aplikacionin Kapitujt nuk mund të shkarkoheshin për shkak të hapësirës së ulët të ruajtjes Paralajmërim: shkarkimet e mëdha me shumicë mund të çojnë në ngadalësimin e burimeve dhe/ose bllokimin e Tachiyomi. Trokit për të mësuar më shumë. - Duke kontrolluar për kapituj të rinj U gjetën kapituj të rinj Trokit për të mësuar më shumë Përditësimi i kopertinës dështoi diff --git a/i18n/src/commonMain/resources/MR/sr/strings.xml b/i18n/src/commonMain/resources/MR/sr/strings.xml index 8106d435b..8cab68641 100644 --- a/i18n/src/commonMain/resources/MR/sr/strings.xml +++ b/i18n/src/commonMain/resources/MR/sr/strings.xml @@ -145,10 +145,8 @@ G B A - Локација преузимања Када су означена као прочитана Аутоматски обриши након читања - Друга локација Онемогућено Последње прочитано поглавље Претпоследње прочитано поглавље @@ -161,9 +159,7 @@ Може се користити за враћање на тренутно стање колекције Врати се на резервну копију Врати се на колекцију из резервне копије - Локација резервних копија Учесталост прављења резервних копија - Максималан број резервних копија Направљена је резервна копија Враћање је завршено Шта све желите да буде у резервној копији\? @@ -276,7 +272,6 @@ Поглавље %1$s и још %2$d Поглавље %1$s Пронађена су нова поглавља - Тражење нових поглавља Неуспешно преузимање поглавља. Покушајте поново у секцији за преузимања Копирај Мигрирај diff --git a/i18n/src/commonMain/resources/MR/sv/strings.xml b/i18n/src/commonMain/resources/MR/sv/strings.xml index d871040a1..747b406f0 100644 --- a/i18n/src/commonMain/resources/MR/sv/strings.xml +++ b/i18n/src/commonMain/resources/MR/sv/strings.xml @@ -145,10 +145,8 @@ G B A - Nedladdningsplats Efter manuellt markerad som läst Ta bort automatiskt efter läsning - Anpassad plats Inaktiverad Senaste lästa kapitel Näst sist lästa kapitel @@ -161,9 +159,7 @@ Kan användas för att återställa biblioteket Återställ säkerhetskopia Återställ biblioteket från en säkerhetskopia - Säkerhetskopieringsplats Automatisk säkerhetskopieringsfrekvens - Max antal automatiska säkerhetskopior Säkerhetskopia skapad Återställning slutförd Vad vill du säkerhetskopiera\? @@ -327,7 +323,6 @@ Kapitel %1$s och %2$d till Kapitlen %1$s Dölj notisinnehåll - Letar efter nya kapitel Inaktivera batterioptimering Hjälper till med uppdateringar och säkerhetskopior i bakgrunden Batterioptimering är redan inaktiverat @@ -768,4 +763,10 @@ Data och lagring Ingen fil vald Exkludera scanlatorer + Lagringsplats + Används för automatisk säkerhetskopiering, kapitelnedladdningar och lokal källa. + Mer alternativ + Vald + Inte vald + Navigera upp \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/th/strings.xml b/i18n/src/commonMain/resources/MR/th/strings.xml index ea8c8cdb4..524645175 100644 --- a/i18n/src/commonMain/resources/MR/th/strings.xml +++ b/i18n/src/commonMain/resources/MR/th/strings.xml @@ -146,10 +146,8 @@ เขียว น้ำเงิน โปร่งใส - ตําแหน่งที่ดาวน์โหลด หลังจากทําเครื่องหมายว่าอ่านแล้วด้วยตนเอง ลบอัตโนมัติหลังจากที่อ่านแล้ว - ตําแหน่งกําหนดเอง ปิดการใช้งาน ตอนที่อ่านล่าสุด ตอนรองก่อนตอนที่อ่านล่าสุด @@ -162,9 +160,7 @@ สามารถใช้ในการเรียกคืนค่าคลังปัจจุบัน เรียกคืนค่าการสำรองข้อมูล เรียกคืนค่าคลังจากแฟ้มข้อมูลสำรอง - ตําแหน่งที่ตั้งข้อมูลสํารอง ความถี่ในการสำรองข้อมูลอัตโนมัติ - จำนวนการสำรองข้อมูลอัตโนมัติสูงสุด สร้างการสำรองข้อมูลแล้ว คืนค่าเสร็จสมบูรณ์ ต้องการสำรองข้อมูลใดบ้าง\? @@ -475,7 +471,6 @@ ซิงค์ทางเดียวเพื่ออัปเดตความคืบหน้าของตอนกับตัวติดตามภายนอก ตั้งค่าการติดตามรายการในแต่ละรายการได้จากปุ่มติดตาม รายการในหมวดหมู่ที่ยกเว้นไว้จะไม่ถูกดาวน์โหลดแม้ว่าจะอยู่ในหมวดหมู่ที่รวมอยู่ด้วยก็ตาม ดาวน์โหลดอัตโนมัติ - กำลังตรวจสอบตอนหาใหม่ ไม่สามารถดาวน์โหลดตอนได้เนื่องจากพื้นที่จัดเก็บเหลือน้อย ไม่รองรับ Android เวอร์ชันนี้อีกต่อไป ไม่พบแอปเลือกแฟ้ม @@ -768,4 +763,10 @@ ผู้แปล คะแนนจากตัวติดตาม ผู้แปลที่เว้นไว้ + ตำแหน่งที่จัดเก็บ + ใช้สำหรับการสำรองข้อมูลอัตโนมัติ การดาวน์โหลดตอน และแหล่งที่มาในเครื่อง + ตัวเลือกเพิ่มเติม + เลือกแล้ว + ยังไม่ได้เลือก + ขึ้นไปข้างบน \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/tr/strings.xml b/i18n/src/commonMain/resources/MR/tr/strings.xml index 1dadacd74..620e77364 100644 --- a/i18n/src/commonMain/resources/MR/tr/strings.xml +++ b/i18n/src/commonMain/resources/MR/tr/strings.xml @@ -145,10 +145,8 @@ Y M A - İndirme konumu Elle okundu olarak imlenince Okunduktan sonra kendiliğinden sil - Özel konum Devre dışı Son okunan bölüm Okunan sondan ikinci bölüm @@ -161,9 +159,7 @@ Şu anki kitaplığı geri yüklemek için kullanılabilir Yedeği geri yükle Kitaplığı yedek dosyasından geri yükle - Yedekleme konumu Kendiliğinden yedekleme sıklığı - En fazla kendiliğinden yedek Yedek oluşturuldu Geri yükleme tamamlandı Neyi yedeklemek istiyorsunuz? @@ -327,7 +323,6 @@ Bölüm %1$s ve %2$d daha Bölüm %1$s Bildirim içeriğini gizle - Yeni bölümler aranıyor Pil iyileştirmeyi devre dışı bırak Arka plan kitaplık güncellemelerine ve yedeklemelerine yardım eder Pil iyileştirme zaten devre dışı @@ -768,4 +763,10 @@ Veri ve depolama Tarevirileri hariç tut Oluştur + Seçilmedi + Diğer seçenekler + Seçili + Depolama yeri + Kendiliğinden yedeklemeler, bölüm indirmeleri ve yerel kaynak için kullanılır. + Yukarı git \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/uk/strings.xml b/i18n/src/commonMain/resources/MR/uk/strings.xml index b2ebae4be..5ed5a3f12 100644 --- a/i18n/src/commonMain/resources/MR/uk/strings.xml +++ b/i18n/src/commonMain/resources/MR/uk/strings.xml @@ -145,10 +145,8 @@ G B A - Директорія завантажень Після того, як було відмічено прочитаним вручну Автоматично видаляти після прочитання - Користувацька директорія Вимкнено Останній прочитаний розділ Передостанній прочитаний розділ @@ -161,9 +159,7 @@ Можна використовувати для відновлення поточної бібліотеки Відновити резервну копію Відновити бібліотеку з резервної копії - Директорія резервної копії Частота автоматичних бекапів - Максимальна кількість автоматичних бекапів Резервна копія створена Відновлення завершено Що ви хочете зберегти до резервної копії\? @@ -327,7 +323,6 @@ Розділ %1$s та ще %2$d Розділи %1$s Приховати вміст сповіщень - Перевірка нових розділів Вимкнути збереження батареї Допомагає фоновому оновленню бібліотеки та резервним копіям Збереження батареї вже вимкнено diff --git a/i18n/src/commonMain/resources/MR/uz/strings.xml b/i18n/src/commonMain/resources/MR/uz/strings.xml index f7e264530..b0edbd333 100644 --- a/i18n/src/commonMain/resources/MR/uz/strings.xml +++ b/i18n/src/commonMain/resources/MR/uz/strings.xml @@ -335,12 +335,10 @@ Boblarni o\'chirish Noto\'g\'ri joylashuv: %s Past - Foydalanuvchi papkasi «O\'qilgan» deb belgilangandan so\'ng o\'chirish Avtomatik Portret O\'zgarmas portret - Yuklamalar papkasi Aylantirish vaqtida menyu yashirish sezuvchanligi O\'zgarmas landshaft Kattalashtirish diff --git a/i18n/src/commonMain/resources/MR/vi/strings.xml b/i18n/src/commonMain/resources/MR/vi/strings.xml index c2d0ad164..d94f2b7d9 100644 --- a/i18n/src/commonMain/resources/MR/vi/strings.xml +++ b/i18n/src/commonMain/resources/MR/vi/strings.xml @@ -106,10 +106,8 @@ G B A - Đường dẫn tải xuống Sau khi đánh dấu thủ công là đã đọc Tự động xóa sau khi đọc - Đường dẫn tùy chỉnh Vô hiệu hóa Chương đã đọc gần nhất Hai chương đã đọc gần nhất @@ -241,9 +239,7 @@ Có thể sử dụng để khôi phục thư viện hiện tại Khôi phục sao lưu Khôi phục thư viện từ tập tin sao lưu - Nơi lưu trữ Lịch sao lưu - Số sao lưu tối đa Sao lưu đã được tạo Khôi phục hoàn tất Bạn có muốn sao lưu không\? @@ -290,7 +286,6 @@ Vui lòng cập nhật WebView để tương thích tốt hơn Bỏ qua Cloudflare thất bại Chương %1$s - Kiểm tra các chương cập nhật mới Đang cập nhật thư viện Đã tạm ngưng Bạn đã đăng xuất diff --git a/i18n/src/commonMain/resources/MR/zh-rCN/strings.xml b/i18n/src/commonMain/resources/MR/zh-rCN/strings.xml index 15b841174..73b5d1e1c 100644 --- a/i18n/src/commonMain/resources/MR/zh-rCN/strings.xml +++ b/i18n/src/commonMain/resources/MR/zh-rCN/strings.xml @@ -145,10 +145,8 @@ G B A - 下载路径 手动标记为已读后 阅毕自动删除 - 自定义路径 关闭 最后阅读的章节 倒数第二已读章节 @@ -161,9 +159,7 @@ 可用于还原当前书架数据 还原备份 从备份文件中还原 - 备份路径 自动备份频率 - 最大自动备份数 已创建备份 还原完毕 需要备份什么? @@ -327,7 +323,6 @@ 第 %1$s 章 第 %1$s 章及另外 %2$d 章 第 %1$s 章 - 正在检查新章节 关闭电池优化 有助于后台更新书架和备份 电池优化已被关闭 diff --git a/i18n/src/commonMain/resources/MR/zh-rTW/strings.xml b/i18n/src/commonMain/resources/MR/zh-rTW/strings.xml index 59a113b81..699a6c910 100644 --- a/i18n/src/commonMain/resources/MR/zh-rTW/strings.xml +++ b/i18n/src/commonMain/resources/MR/zh-rTW/strings.xml @@ -108,15 +108,12 @@ G B A - 下載位置 手動標示為已讀後 - 自訂位置 已停用 自動下載新章節 歷程平台 建立備份 還原備份 - 備份位置 自動備份頻率 已建立備份 還原成功 @@ -267,7 +264,6 @@ \n \n若選擇信任該憑證,即表示你願意承擔上述風險。 最後閱畢的章節 - 最大自動備份數量 您確定要這樣做嗎?未收藏的漫畫的閱讀進度和章節會被刪除 新上架 歷程 @@ -390,7 +386,6 @@ 垂直 水平 反轉輕觸區域 - 正在檢查是否有新章節 捲動式 (頁間留空) %02d 分 %02d 秒 @@ -768,4 +763,10 @@ 掃譯者 排除掃譯者 建立 + 更多選項 + 已勾選 + 尚未勾選 + 向上瀏覽 + 儲存位置 + 供自動備份、章節下載和本機來源使用。 \ No newline at end of file diff --git a/presentation-core/src/main/java/tachiyomi/presentation/core/components/material/PullRefresh.kt b/presentation-core/src/main/java/tachiyomi/presentation/core/components/material/PullRefresh.kt index b24baec43..9642cec71 100644 --- a/presentation-core/src/main/java/tachiyomi/presentation/core/components/material/PullRefresh.kt +++ b/presentation-core/src/main/java/tachiyomi/presentation/core/components/material/PullRefresh.kt @@ -47,22 +47,11 @@ fun PullRefresh( content: @Composable () -> Unit, ) { val state = rememberPullToRefreshState( - initialRefreshing = refreshing, + isRefreshing = refreshing, extraVerticalOffset = indicatorPadding.calculateTopPadding(), enabled = enabled, + onRefresh = onRefresh, ) - if (state.isRefreshing) { - LaunchedEffect(true) { - onRefresh() - } - } - LaunchedEffect(refreshing) { - if (refreshing && !state.isRefreshing) { - state.startRefreshAnimated() - } else if (!refreshing && state.isRefreshing) { - state.endRefreshAnimated() - } - } Box(modifier.nestedScroll(state.nestedScrollConnection)) { content() @@ -94,10 +83,11 @@ fun PullRefresh( @Composable private fun rememberPullToRefreshState( - initialRefreshing: Boolean, + isRefreshing: Boolean, extraVerticalOffset: Dp, positionalThreshold: Dp = 64.dp, enabled: () -> Boolean = { true }, + onRefresh: () -> Unit, ): PullToRefreshStateImpl { val density = LocalDensity.current val extraVerticalOffsetPx = with(density) { extraVerticalOffset.toPx() } @@ -106,18 +96,29 @@ private fun rememberPullToRefreshState( extraVerticalOffset, positionalThresholdPx, enabled, + onRefresh, saver = PullToRefreshStateImpl.Saver( extraVerticalOffset = extraVerticalOffsetPx, positionalThreshold = positionalThresholdPx, enabled = enabled, + onRefresh = onRefresh, ), ) { PullToRefreshStateImpl( - initialRefreshing = initialRefreshing, + initialRefreshing = isRefreshing, extraVerticalOffset = extraVerticalOffsetPx, positionalThreshold = positionalThresholdPx, enabled = enabled, + onRefresh = onRefresh, ) + }.also { + LaunchedEffect(isRefreshing) { + if (isRefreshing && !it.isRefreshing) { + it.startRefreshAnimated() + } else if (!isRefreshing && it.isRefreshing) { + it.endRefreshAnimated() + } + } } } @@ -128,6 +129,7 @@ private fun rememberPullToRefreshState( * @param extraVerticalOffset Extra vertical offset, in pixels, for the "refreshing" state * @param initialRefreshing The initial refreshing value of [PullToRefreshState] * @param enabled a callback used to determine whether scroll events are to be handled by this + * @param onRefresh a callback to run when pull-to-refresh action is triggered by user * [PullToRefreshState] */ private class PullToRefreshStateImpl( @@ -135,6 +137,7 @@ private class PullToRefreshStateImpl( private val extraVerticalOffset: Float, override val positionalThreshold: Float, enabled: () -> Boolean, + private val onRefresh: () -> Unit, ) : PullToRefreshState { override val progress get() = adjustedDistancePulled / positionalThreshold @@ -215,6 +218,7 @@ private class PullToRefreshStateImpl( if (isRefreshing) return 0f // Already refreshing, do nothing // Trigger refresh if (adjustedDistancePulled > positionalThreshold) { + onRefresh() startRefreshAnimated() } else { animateTo(0f) @@ -263,6 +267,7 @@ private class PullToRefreshStateImpl( extraVerticalOffset: Float, positionalThreshold: Float, enabled: () -> Boolean, + onRefresh: () -> Unit, ) = Saver( save = { it.isRefreshing }, restore = { isRefreshing -> @@ -271,6 +276,7 @@ private class PullToRefreshStateImpl( extraVerticalOffset = extraVerticalOffset, positionalThreshold = positionalThreshold, enabled = enabled, + onRefresh = onRefresh, ) }, ) diff --git a/source-local/src/androidMain/kotlin/tachiyomi/source/local/LocalSource.kt b/source-local/src/androidMain/kotlin/tachiyomi/source/local/LocalSource.kt index 1305001f5..6177e7746 100644 --- a/source-local/src/androidMain/kotlin/tachiyomi/source/local/LocalSource.kt +++ b/source-local/src/androidMain/kotlin/tachiyomi/source/local/LocalSource.kt @@ -127,7 +127,7 @@ actual class LocalSource( // Try to find the cover coverManager.find(mangaDir.name.orEmpty())?.let { - thumbnail_url = it.filePath + thumbnail_url = it.uri.toString() } } } @@ -140,7 +140,7 @@ actual class LocalSource( // Manga details related override suspend fun getMangaDetails(manga: SManga): SManga = withIOContext { coverManager.find(manga.url)?.let { - manga.thumbnail_url = it.filePath + manga.thumbnail_url = it.uri.toString() } // Augment manga details based on metadata files