diff --git a/app/src/main/java/eu/kanade/domain/source/interactor/GetEnabledSources.kt b/app/src/main/java/eu/kanade/domain/source/interactor/GetEnabledSources.kt index 34ad27236..28b6173b5 100644 --- a/app/src/main/java/eu/kanade/domain/source/interactor/GetEnabledSources.kt +++ b/app/src/main/java/eu/kanade/domain/source/interactor/GetEnabledSources.kt @@ -35,7 +35,8 @@ class GetEnabledSources( ) { pinnedSourceIds, (enabledLanguages, disabledSources, lastUsedSource), (excludedFromDataSaver, sourcesInCategories, sourceCategoriesFilter), - sources -> + sources, + -> val sourcesAndCategories = sourcesInCategories.map { it.split('|').let { (source, test) -> source.toLong() to test } diff --git a/app/src/main/java/eu/kanade/presentation/browse/BrowseSourceScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/BrowseSourceScreen.kt index fc4cb2a05..9f8c443d0 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/BrowseSourceScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/BrowseSourceScreen.kt @@ -104,7 +104,7 @@ fun BrowseSourceContent( // SY --> if (onWebViewClick != null) { EmptyScreenAction( - stringResId = R.string.action_open_in_web_view, + MR.strings.action_open_in_web_view, icon = Icons.Outlined.Public, onClick = onWebViewClick, ) @@ -113,7 +113,7 @@ fun BrowseSourceContent( }, if (onHelpClick != null) { EmptyScreenAction( - stringResId = R.string.label_help, + MR.strings.label_help, icon = Icons.AutoMirrored.Outlined.HelpOutline, onClick = onHelpClick, ) diff --git a/app/src/main/java/eu/kanade/presentation/browse/BrowseTabWrapper.kt b/app/src/main/java/eu/kanade/presentation/browse/BrowseTabWrapper.kt index f66648265..d16f82e7e 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/BrowseTabWrapper.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/BrowseTabWrapper.kt @@ -4,11 +4,11 @@ import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Composable import androidx.compose.runtime.remember -import androidx.compose.ui.res.stringResource import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.components.TabContent import tachiyomi.presentation.core.components.material.Scaffold +import tachiyomi.presentation.core.i18n.stringResource @Composable fun BrowseTabWrapper(tab: TabContent) { diff --git a/app/src/main/java/eu/kanade/presentation/browse/ExtensionDetailsScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/ExtensionDetailsScreen.kt index 0a8c34b19..5388c6a35 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/ExtensionDetailsScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/ExtensionDetailsScreen.kt @@ -39,7 +39,6 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalUriHandler -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign @@ -51,15 +50,17 @@ import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.components.WarningBanner import eu.kanade.presentation.more.settings.widget.TextPreferenceWidget import eu.kanade.presentation.more.settings.widget.TrailingWidgetBuffer -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.extension.model.Extension import eu.kanade.tachiyomi.source.ConfigurableSource import eu.kanade.tachiyomi.ui.browse.extension.details.ExtensionDetailsScreenModel import eu.kanade.tachiyomi.util.system.LocaleHelper import kotlinx.collections.immutable.persistentListOf +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.ScrollbarLazyColumn import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.padding +import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen @Composable @@ -78,7 +79,7 @@ fun ExtensionDetailsScreen( Scaffold( topBar = { scrollBehavior -> AppBar( - title = stringResource(R.string.label_extension_info), + title = stringResource(MR.strings.label_extension_info), navigateUp = navigateUp, actions = { AppBarActions( @@ -87,14 +88,14 @@ fun ExtensionDetailsScreen( if (state.extension?.isUnofficial == false) { add( AppBar.Action( - title = stringResource(R.string.whats_new), + title = stringResource(MR.strings.whats_new), icon = Icons.Outlined.History, onClick = onClickWhatsNew, ), ) add( AppBar.Action( - title = stringResource(R.string.action_faq_and_guides), + title = stringResource(MR.strings.action_faq_and_guides), icon = Icons.AutoMirrored.Outlined.HelpOutline, onClick = onClickReadme, ), @@ -103,15 +104,15 @@ fun ExtensionDetailsScreen( addAll( listOf( AppBar.OverflowAction( - title = stringResource(R.string.action_enable_all), + title = stringResource(MR.strings.action_enable_all), onClick = onClickEnableAll, ), AppBar.OverflowAction( - title = stringResource(R.string.action_disable_all), + title = stringResource(MR.strings.action_disable_all), onClick = onClickDisableAll, ), AppBar.OverflowAction( - title = stringResource(R.string.pref_clear_cookies), + title = stringResource(MR.strings.pref_clear_cookies), onClick = onClickClearCookies, ), ), @@ -126,7 +127,7 @@ fun ExtensionDetailsScreen( ) { paddingValues -> if (state.extension == null) { EmptyScreen( - textResource = R.string.empty_screen, + MR.strings.empty_screen, modifier = Modifier.padding(paddingValues), ) return@Scaffold @@ -162,13 +163,13 @@ private fun ExtensionDetails( // SY --> extension.isRedundant -> item { - WarningBanner(R.string.redundant_extension_message) + WarningBanner(SYMR.strings.redundant_extension_message) } extension.isRepoSource -> item { val uriHandler = LocalUriHandler.current WarningBanner( - R.string.repo_extension_message, + SYMR.strings.repo_extension_message, modifier = Modifier.clickable { extension.repoUrl ?: return@clickable uriHandler.openUri( @@ -182,11 +183,11 @@ private fun ExtensionDetails( // SY <-- extension.isUnofficial -> item { - WarningBanner(R.string.unofficial_extension_message) + WarningBanner(MR.strings.unofficial_extension_message) } extension.isObsolete -> item { - WarningBanner(R.string.obsolete_extension_message) + WarningBanner(MR.strings.obsolete_extension_message) } } @@ -282,7 +283,7 @@ private fun DetailsHeader( InfoText( modifier = Modifier.weight(1f), primaryText = extension.versionName, - secondaryText = stringResource(R.string.ext_info_version), + secondaryText = stringResource(MR.strings.ext_info_version), ) InfoDivider() @@ -290,7 +291,7 @@ private fun DetailsHeader( InfoText( modifier = Modifier.weight(if (extension.isNsfw) 1.5f else 1f), primaryText = LocaleHelper.getSourceDisplayName(extension.lang, context), - secondaryText = stringResource(R.string.ext_info_language), + secondaryText = stringResource(MR.strings.ext_info_language), ) if (extension.isNsfw) { @@ -298,12 +299,12 @@ private fun DetailsHeader( InfoText( modifier = Modifier.weight(1f), - primaryText = stringResource(R.string.ext_nsfw_short), + primaryText = stringResource(MR.strings.ext_nsfw_short), primaryTextStyle = MaterialTheme.typography.bodyLarge.copy( color = MaterialTheme.colorScheme.error, fontWeight = FontWeight.Medium, ), - secondaryText = stringResource(R.string.ext_info_age_rating), + secondaryText = stringResource(MR.strings.ext_info_age_rating), onClick = onClickAgeRating, ) } @@ -322,7 +323,7 @@ private fun DetailsHeader( modifier = Modifier.weight(1f), onClick = onClickUninstall, ) { - Text(stringResource(R.string.ext_uninstall)) + Text(stringResource(MR.strings.ext_uninstall)) } if (onClickAppInfo != null) { @@ -331,7 +332,7 @@ private fun DetailsHeader( onClick = onClickAppInfo, ) { Text( - text = stringResource(R.string.ext_app_info), + text = stringResource(MR.strings.ext_app_info), color = MaterialTheme.colorScheme.onPrimary, ) } @@ -409,7 +410,7 @@ private fun SourceSwitchPreference( IconButton(onClick = { onClickSourcePreferences(source.source.id) }) { Icon( imageVector = Icons.Outlined.Settings, - contentDescription = stringResource(R.string.label_settings), + contentDescription = stringResource(MR.strings.label_settings), tint = MaterialTheme.colorScheme.onSurface, ) } @@ -432,11 +433,11 @@ private fun NsfwWarningDialog( ) { AlertDialog( text = { - Text(text = stringResource(R.string.ext_nsfw_warning)) + Text(text = stringResource(MR.strings.ext_nsfw_warning)) }, confirmButton = { TextButton(onClick = onClickConfirm) { - Text(text = stringResource(R.string.action_ok)) + Text(text = stringResource(MR.strings.action_ok)) } }, onDismissRequest = onClickConfirm, 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 a2f5b1d80..6ed51fefc 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/ExtensionsScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/ExtensionsScreen.kt @@ -1,6 +1,5 @@ package eu.kanade.presentation.browse -import androidx.annotation.StringRes import androidx.compose.animation.core.animateDpAsState import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.Arrangement @@ -34,13 +33,12 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp +import dev.icerock.moko.resources.StringResource import eu.kanade.presentation.browse.components.BaseBrowseItem import eu.kanade.presentation.browse.components.ExtensionIcon import eu.kanade.presentation.manga.components.DotSeparatorNoSpaceText -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.extension.model.Extension import eu.kanade.tachiyomi.extension.model.InstallStep import eu.kanade.tachiyomi.source.ConfigurableSource @@ -48,10 +46,13 @@ import eu.kanade.tachiyomi.ui.browse.extension.ExtensionUiModel import eu.kanade.tachiyomi.ui.browse.extension.ExtensionsScreenModel import eu.kanade.tachiyomi.util.system.LocaleHelper import exh.source.anyIs +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.FastScrollLazyColumn import tachiyomi.presentation.core.components.material.PullRefresh import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.topSmallPaddingValues +import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.LoadingScreen import tachiyomi.presentation.core.theme.header @@ -82,12 +83,12 @@ fun ExtensionScreen( state.isLoading -> LoadingScreen(Modifier.padding(contentPadding)) state.isEmpty -> { val msg = if (!searchQuery.isNullOrEmpty()) { - R.string.no_results_found + MR.strings.no_results_found } else { - R.string.empty_screen + MR.strings.empty_screen } EmptyScreen( - textResource = msg, + msg, modifier = Modifier.padding(contentPadding), ) } @@ -135,11 +136,11 @@ private fun ExtensionContent( when (header) { is ExtensionUiModel.Header.Resource -> { val action: @Composable RowScope.() -> Unit = - if (header.textRes == R.string.ext_updates_pending) { + if (header.textRes == MR.strings.ext_updates_pending) { { Button(onClick = { onClickUpdateAll() }) { Text( - text = stringResource(R.string.ext_update_all), + text = stringResource(MR.strings.ext_update_all), style = LocalTextStyle.current.copy( color = MaterialTheme.colorScheme.onPrimary, ), @@ -304,15 +305,15 @@ private fun ExtensionItemContent( } val warning = when { - extension is Extension.Untrusted -> R.string.ext_untrusted + extension is Extension.Untrusted -> MR.strings.ext_untrusted // SY --> - extension is Extension.Installed && extension.isRepoSource -> R.string.repo_source - extension is Extension.Available && extension.isRepoSource -> R.string.repo_source + extension is Extension.Installed && extension.isRepoSource -> SYMR.strings.repo_source + extension is Extension.Available && extension.isRepoSource -> SYMR.strings.repo_source // SY <-- - extension is Extension.Installed && extension.isUnofficial -> R.string.ext_unofficial - extension is Extension.Installed && extension.isObsolete -> R.string.ext_obsolete - extension is Extension.Installed && extension.isRedundant -> R.string.ext_redundant - extension.isNsfw -> R.string.ext_nsfw_short + extension is Extension.Installed && extension.isUnofficial -> MR.strings.ext_unofficial + extension is Extension.Installed && extension.isObsolete -> MR.strings.ext_obsolete + extension is Extension.Installed && extension.isRedundant -> SYMR.strings.ext_redundant + extension.isNsfw -> MR.strings.ext_nsfw_short else -> null } if (warning != null) { @@ -328,9 +329,9 @@ private fun ExtensionItemContent( DotSeparatorNoSpaceText() Text( text = when (installStep) { - InstallStep.Pending -> stringResource(R.string.ext_pending) - InstallStep.Downloading -> stringResource(R.string.ext_downloading) - InstallStep.Installing -> stringResource(R.string.ext_installing) + InstallStep.Pending -> stringResource(MR.strings.ext_pending) + InstallStep.Downloading -> stringResource(MR.strings.ext_downloading) + InstallStep.Installing -> stringResource(MR.strings.ext_installing) else -> error("Must not show non-install process text") }, ) @@ -364,19 +365,19 @@ private fun ExtensionItemActions( ) { Text( text = when (installStep) { - InstallStep.Installed -> stringResource(R.string.ext_installed) - InstallStep.Error -> stringResource(R.string.action_retry) + InstallStep.Installed -> stringResource(MR.strings.ext_installed) + InstallStep.Error -> stringResource(MR.strings.action_retry) InstallStep.Idle -> { when (extension) { is Extension.Installed -> { if (extension.hasUpdate) { - stringResource(R.string.ext_update) + stringResource(MR.strings.ext_update) } else { - stringResource(R.string.action_settings) + stringResource(MR.strings.action_settings) } } - is Extension.Untrusted -> stringResource(R.string.ext_trust) - is Extension.Available -> stringResource(R.string.ext_install) + is Extension.Untrusted -> stringResource(MR.strings.ext_trust) + is Extension.Available -> stringResource(MR.strings.ext_install) } } else -> error("Must not show install process text") @@ -387,7 +388,7 @@ private fun ExtensionItemActions( IconButton(onClick = { onClickItemCancel(extension) }) { Icon( imageVector = Icons.Outlined.Close, - contentDescription = stringResource(R.string.action_cancel), + contentDescription = stringResource(MR.strings.action_cancel), ) } } @@ -396,7 +397,7 @@ private fun ExtensionItemActions( @Composable private fun ExtensionHeader( - @StringRes textRes: Int, + textRes: StringResource, modifier: Modifier = Modifier, action: @Composable RowScope.() -> Unit = {}, ) { @@ -436,19 +437,19 @@ private fun ExtensionTrustDialog( ) { AlertDialog( title = { - Text(text = stringResource(R.string.untrusted_extension)) + Text(text = stringResource(MR.strings.untrusted_extension)) }, text = { - Text(text = stringResource(R.string.untrusted_extension_message)) + Text(text = stringResource(MR.strings.untrusted_extension_message)) }, confirmButton = { TextButton(onClick = onClickConfirm) { - Text(text = stringResource(R.string.ext_trust)) + Text(text = stringResource(MR.strings.ext_trust)) } }, dismissButton = { TextButton(onClick = onClickDismiss) { - Text(text = stringResource(R.string.ext_uninstall)) + Text(text = stringResource(MR.strings.ext_uninstall)) } }, onDismissRequest = onDismissRequest, diff --git a/app/src/main/java/eu/kanade/presentation/browse/FeedScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/FeedScreen.kt index 147b766a4..27035bcae 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/FeedScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/FeedScreen.kt @@ -27,22 +27,26 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import eu.kanade.presentation.browse.components.GlobalSearchCardRow import eu.kanade.presentation.browse.components.GlobalSearchErrorResultItem import eu.kanade.presentation.browse.components.GlobalSearchLoadingResultItem import eu.kanade.presentation.browse.components.GlobalSearchResultItem -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.source.CatalogueSource import eu.kanade.tachiyomi.ui.browse.feed.FeedScreenState +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.delay +import tachiyomi.core.i18n.stringResource import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.source.model.FeedSavedSearch import tachiyomi.domain.source.model.SavedSearch +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.ScrollbarLazyColumn import tachiyomi.presentation.core.components.material.PullRefresh import tachiyomi.presentation.core.components.material.topSmallPaddingValues +import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.LoadingScreen import tachiyomi.presentation.core.util.plus @@ -71,7 +75,7 @@ fun FeedScreen( when { state.isLoading -> LoadingScreen() state.isEmpty -> EmptyScreen( - textResource = R.string.feed_tab_empty, + SYMR.strings.feed_tab_empty, modifier = Modifier.padding(contentPadding), ) else -> { @@ -137,7 +141,7 @@ fun FeedItem( GlobalSearchLoadingResultItem() } item.results.isEmpty() -> { - GlobalSearchErrorResultItem(message = stringResource(R.string.no_results_found)) + GlobalSearchErrorResultItem(message = stringResource(MR.strings.no_results_found)) } else -> { GlobalSearchCardRow( @@ -152,14 +156,14 @@ fun FeedItem( @Composable fun FeedAddDialog( - sources: List, + sources: ImmutableList, onDismiss: () -> Unit, onClickAdd: (CatalogueSource?) -> Unit, ) { var selected by remember { mutableStateOf(null) } AlertDialog( title = { - Text(text = stringResource(R.string.feed)) + Text(text = stringResource(SYMR.strings.feed)) }, text = { RadioSelector(options = sources, selected = selected) { @@ -169,7 +173,7 @@ fun FeedAddDialog( onDismissRequest = onDismiss, confirmButton = { TextButton(onClick = { onClickAdd(selected?.let { sources[it] }) }) { - Text(text = stringResource(R.string.action_ok)) + Text(text = stringResource(MR.strings.action_ok)) } }, ) @@ -178,7 +182,7 @@ fun FeedAddDialog( @Composable fun FeedAddSearchDialog( source: CatalogueSource, - savedSearches: List, + savedSearches: ImmutableList, onDismiss: () -> Unit, onClickAdd: (CatalogueSource, SavedSearch?) -> Unit, ) { @@ -191,8 +195,8 @@ fun FeedAddSearchDialog( val context = LocalContext.current val savedSearchStrings = remember { savedSearches.map { - it?.name ?: context.getString(R.string.latest) - } + it?.name ?: context.stringResource(MR.strings.latest) + }.toImmutableList() } RadioSelector( options = savedSearches, @@ -205,7 +209,7 @@ fun FeedAddSearchDialog( onDismissRequest = onDismiss, confirmButton = { TextButton(onClick = { onClickAdd(source, selected?.let { savedSearches[it] }) }) { - Text(text = stringResource(R.string.action_ok)) + Text(text = stringResource(MR.strings.action_ok)) } }, ) @@ -213,8 +217,8 @@ fun FeedAddSearchDialog( @Composable fun RadioSelector( - options: List, - optionStrings: List = remember { options.map { it.toString() } }, + options: ImmutableList, + optionStrings: ImmutableList = remember { options.map { it.toString() }.toImmutableList() }, selected: Int?, onSelectOption: (Int) -> Unit, ) { @@ -243,15 +247,15 @@ fun FeedDeleteConfirmDialog( ) { AlertDialog( title = { - Text(text = stringResource(R.string.feed)) + Text(text = stringResource(SYMR.strings.feed)) }, text = { - Text(text = stringResource(R.string.feed_delete)) + Text(text = stringResource(SYMR.strings.feed_delete)) }, onDismissRequest = onDismiss, confirmButton = { TextButton(onClick = { onClickDeleteConfirm(feed) }) { - Text(text = stringResource(R.string.action_delete)) + Text(text = stringResource(MR.strings.action_delete)) } }, ) diff --git a/app/src/main/java/eu/kanade/presentation/browse/GlobalSearchScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/GlobalSearchScreen.kt index 3150db722..3c79ac0f3 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/GlobalSearchScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/GlobalSearchScreen.kt @@ -14,6 +14,7 @@ import eu.kanade.tachiyomi.ui.browse.source.globalsearch.SearchItemResult import eu.kanade.tachiyomi.ui.browse.source.globalsearch.SearchScreenModel import eu.kanade.tachiyomi.ui.browse.source.globalsearch.SourceFilter import eu.kanade.tachiyomi.util.system.LocaleHelper +import kotlinx.collections.immutable.ImmutableMap import tachiyomi.domain.manga.model.Manga import tachiyomi.presentation.core.components.material.Scaffold @@ -60,7 +61,7 @@ fun GlobalSearchScreen( @Composable internal fun GlobalSearchContent( - items: Map, + items: ImmutableMap, contentPadding: PaddingValues, getManga: @Composable (Manga) -> State, onClickSource: (CatalogueSource) -> Unit, 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 2478ac591..e7f2f1bc9 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/MigrateSourceScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/MigrateSourceScreen.kt @@ -180,7 +180,7 @@ private fun MigrateSourceItem( // SY --> TextButton(onClick = onClickAll) { Text( - text = stringResource(id = R.string.all), + text = stringResource(MR.strings.all), style = LocalTextStyle.current.copy( color = MaterialTheme.colorScheme.primary, ), diff --git a/app/src/main/java/eu/kanade/presentation/browse/MigrationListScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/MigrationListScreen.kt index a7924b413..60f81f32d 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/MigrationListScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/MigrationListScreen.kt @@ -9,6 +9,7 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowForward import androidx.compose.material.icons.outlined.ArrowForward import androidx.compose.material.icons.outlined.ContentCopy import androidx.compose.material.icons.outlined.CopyAll @@ -21,26 +22,28 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.produceState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import eu.kanade.presentation.browse.components.MigrationActionIcon import eu.kanade.presentation.browse.components.MigrationItem import eu.kanade.presentation.browse.components.MigrationItemResult import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBarActions -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.browse.migration.advanced.process.MigratingManga +import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import tachiyomi.core.util.lang.withIOContext import tachiyomi.domain.manga.model.Manga +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.ScrollbarLazyColumn import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.topSmallPaddingValues +import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.plus @Composable fun MigrationListScreen( - items: List, + items: ImmutableList, migrationDone: Boolean, unfinishedCount: Int, getManga: suspend (MigratingManga.SearchResult.Result) -> Manga?, @@ -55,7 +58,7 @@ fun MigrationListScreen( ) { Scaffold( topBar = { scrollBehavior -> - val titleString = stringResource(R.string.migration) + val titleString = stringResource(SYMR.strings.migration) val title by produceState(initialValue = titleString, items, unfinishedCount, titleString) { withIOContext { value = "$titleString ($unfinishedCount/${items.size})" @@ -67,13 +70,13 @@ fun MigrationListScreen( AppBarActions( persistentListOf( AppBar.Action( - title = stringResource(R.string.copy), + title = stringResource(MR.strings.copy), icon = if (items.size == 1) Icons.Outlined.ContentCopy else Icons.Outlined.CopyAll, onClick = { openMigrationDialog(false) }, enabled = migrationDone, ), AppBar.Action( - title = stringResource(R.string.migrate), + title = stringResource(MR.strings.migrate), icon = if (items.size == 1) Icons.Outlined.Done else Icons.Outlined.DoneAll, onClick = { openMigrationDialog(false) }, enabled = migrationDone, @@ -112,8 +115,8 @@ fun MigrationListScreen( ) Icon( - Icons.Outlined.ArrowForward, - contentDescription = stringResource(R.string.migrating_to), + Icons.AutoMirrored.Outlined.ArrowForward, + contentDescription = stringResource(SYMR.strings.migrating_to), modifier = Modifier.weight(0.2f), ) diff --git a/app/src/main/java/eu/kanade/presentation/browse/SourceFeedScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/SourceFeedScreen.kt index 4af59feba..0c156e352 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/SourceFeedScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/SourceFeedScreen.kt @@ -8,7 +8,6 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.State import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import eu.kanade.presentation.browse.components.BrowseSourceFloatingActionButton import eu.kanade.presentation.browse.components.GlobalSearchCardRow import eu.kanade.presentation.browse.components.GlobalSearchErrorResultItem @@ -16,13 +15,15 @@ import eu.kanade.presentation.browse.components.GlobalSearchLoadingResultItem import eu.kanade.presentation.browse.components.GlobalSearchResultItem import eu.kanade.presentation.components.AppBarTitle import eu.kanade.presentation.components.SearchToolbar -import eu.kanade.tachiyomi.R +import kotlinx.collections.immutable.ImmutableList import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.source.model.FeedSavedSearch import tachiyomi.domain.source.model.SavedSearch +import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.ScrollbarLazyColumn import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.topSmallPaddingValues +import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.LoadingScreen import tachiyomi.presentation.core.util.plus @@ -43,7 +44,7 @@ sealed class SourceFeedUI { override val title: String @Composable @ReadOnlyComposable - get() = stringResource(R.string.latest) + get() = stringResource(MR.strings.latest) override fun withResults(results: List?): SourceFeedUI { return copy(results = results) @@ -54,7 +55,7 @@ sealed class SourceFeedUI { override val title: String @Composable @ReadOnlyComposable - get() = stringResource(R.string.browse) + get() = stringResource(MR.strings.browse) override fun withResults(results: List?): SourceFeedUI { return copy(results = results) @@ -83,7 +84,7 @@ sealed class SourceFeedUI { fun SourceFeedScreen( name: String, isLoading: Boolean, - items: List, + items: ImmutableList, hasFilters: Boolean, onFabClick: () -> Unit, onClickBrowse: () -> Unit, @@ -113,7 +114,7 @@ fun SourceFeedScreen( ) }, ) { paddingValues -> - Crossfade(targetState = isLoading) { state -> + Crossfade(targetState = isLoading, label = "source_feed") { state -> when (state) { true -> LoadingScreen() false -> { @@ -135,7 +136,7 @@ fun SourceFeedScreen( @Composable fun SourceFeedList( - items: List, + items: ImmutableList, paddingValues: PaddingValues, getMangaState: @Composable ((Manga) -> State), onClickBrowse: () -> Unit, @@ -192,7 +193,7 @@ fun SourceFeedItem( GlobalSearchLoadingResultItem() } results.isEmpty() -> { - GlobalSearchErrorResultItem(message = stringResource(R.string.no_results_found)) + GlobalSearchErrorResultItem(message = stringResource(MR.strings.no_results_found)) } else -> { GlobalSearchCardRow( @@ -220,6 +221,6 @@ fun SourceFeedToolbar( onSearch = onClickSearch, onClickCloseSearch = { onSearchQueryChange(null) }, scrollBehavior = scrollBehavior, - placeholderText = stringResource(R.string.action_search_hint), + placeholderText = stringResource(MR.strings.action_search_hint), ) } 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 b0de76ba4..3db7adb2a 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/SourcesFilterScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/SourcesFilterScreen.kt @@ -15,6 +15,7 @@ import eu.kanade.tachiyomi.ui.browse.source.SourcesFilterScreenModel import eu.kanade.tachiyomi.util.system.LocaleHelper import tachiyomi.domain.source.model.Source import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.FastScrollLazyColumn import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource @@ -141,7 +142,7 @@ fun SourcesFilterToggle( ) { SwitchPreferenceWidget( modifier = modifier, - title = stringResource(R.string.pref_category_all_sources), + title = stringResource(SYMR.strings.pref_category_all_sources), checked = isEnabled, onCheckedChanged = { onClickItem() }, ) 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 3e6cca30f..021473fdf 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/SourcesScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/SourcesScreen.kt @@ -23,20 +23,22 @@ import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import eu.kanade.presentation.browse.components.BaseSourceItem -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.browse.source.SourcesScreenModel import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceScreenModel.Listing import eu.kanade.tachiyomi.util.system.LocaleHelper +import kotlinx.collections.immutable.ImmutableList import tachiyomi.domain.source.model.Pin import tachiyomi.domain.source.model.Source +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.LabeledCheckbox import tachiyomi.presentation.core.components.ScrollbarLazyColumn import tachiyomi.presentation.core.components.material.SecondaryItemAlpha import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.topSmallPaddingValues +import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.LoadingScreen import tachiyomi.presentation.core.theme.header @@ -54,7 +56,7 @@ fun SourcesScreen( when { state.isLoading -> LoadingScreen(Modifier.padding(contentPadding)) state.isEmpty -> EmptyScreen( - textResource = R.string.source_empty_screen, + MR.strings.source_empty_screen, modifier = Modifier.padding(contentPadding), ) else -> { @@ -146,7 +148,7 @@ private fun SourceItem( if (source.supportsLatest /* SY --> */ && showLatest /* SY <-- */) { TextButton(onClick = { onClickItem(source, Listing.Latest) }) { Text( - text = stringResource(R.string.latest), + text = stringResource(MR.strings.latest), style = LocalTextStyle.current.copy( color = MaterialTheme.colorScheme.primary, ), @@ -178,7 +180,7 @@ private fun SourcePinButton( alpha = SecondaryItemAlpha, ) } - val description = if (isPinned) R.string.action_unpin else R.string.action_pin + val description = if (isPinned) MR.strings.action_unpin else MR.strings.action_pin IconButton(onClick = onClick) { Icon( imageVector = icon, @@ -205,7 +207,7 @@ fun SourceOptionsDialog( }, text = { Column { - val textId = if (Pin.Pinned in source.pin) R.string.action_unpin else R.string.action_pin + val textId = if (Pin.Pinned in source.pin) MR.strings.action_unpin else MR.strings.action_pin Text( text = stringResource(textId), modifier = Modifier @@ -215,7 +217,7 @@ fun SourceOptionsDialog( ) if (!source.isLocal()) { Text( - text = stringResource(R.string.action_disable), + text = stringResource(MR.strings.action_disable), modifier = Modifier .clickable(onClick = onClickDisable) .fillMaxWidth() @@ -225,7 +227,7 @@ fun SourceOptionsDialog( // SY --> if (onClickSetCategories != null) { Text( - text = stringResource(id = R.string.categories), + text = stringResource(MR.strings.categories), modifier = Modifier .clickable(onClick = onClickSetCategories) .fillMaxWidth() @@ -235,9 +237,9 @@ fun SourceOptionsDialog( if (onClickToggleDataSaver != null) { Text( text = if (source.isExcludedFromDataSaver) { - stringResource(id = R.string.data_saver_stop_exclude) + stringResource(SYMR.strings.data_saver_stop_exclude) } else { - stringResource(id = R.string.data_saver_exclude) + stringResource(SYMR.strings.data_saver_exclude) }, modifier = Modifier .clickable(onClick = onClickToggleDataSaver) @@ -262,7 +264,7 @@ sealed interface SourceUiModel { @Composable fun SourceCategoriesDialog( source: Source, - categories: List, + categories: ImmutableList, onClickCategories: (List) -> Unit, onDismissRequest: () -> Unit, ) { @@ -293,7 +295,7 @@ fun SourceCategoriesDialog( onDismissRequest = onDismissRequest, confirmButton = { TextButton(onClick = { onClickCategories(newCategories.toList()) }) { - Text(text = stringResource(R.string.action_ok)) + Text(text = stringResource(MR.strings.action_ok)) } }, ) diff --git a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceComfortableGrid.kt b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceComfortableGrid.kt index 2db9e6bb5..4eba62822 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceComfortableGrid.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceComfortableGrid.kt @@ -11,7 +11,6 @@ import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.paging.LoadState import androidx.paging.compose.LazyPagingItems @@ -24,6 +23,7 @@ import kotlinx.coroutines.flow.StateFlow import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.manga.model.MangaCover import tachiyomi.presentation.core.components.Badge +import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.plus @Composable @@ -114,7 +114,7 @@ private fun BrowseSourceComfortableGridItem( } metadata.relation?.let { Badge( - text = stringResource(it.resId), + text = stringResource(it.res), color = MaterialTheme.colorScheme.tertiary, textColor = MaterialTheme.colorScheme.onTertiary, ) diff --git a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceCompactGrid.kt b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceCompactGrid.kt index 80fc3730f..99d271025 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceCompactGrid.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceCompactGrid.kt @@ -11,7 +11,6 @@ import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.paging.LoadState import androidx.paging.compose.LazyPagingItems @@ -24,6 +23,7 @@ import kotlinx.coroutines.flow.StateFlow import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.manga.model.MangaCover import tachiyomi.presentation.core.components.Badge +import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.plus @Composable @@ -114,7 +114,7 @@ private fun BrowseSourceCompactGridItem( } metadata.relation?.let { Badge( - text = stringResource(it.resId), + text = stringResource(it.res), color = MaterialTheme.colorScheme.tertiary, textColor = MaterialTheme.colorScheme.onTertiary, ) diff --git a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceDialogs.kt b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceDialogs.kt index d996d141f..00935424d 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceDialogs.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceDialogs.kt @@ -12,13 +12,13 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.window.DialogProperties -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.util.system.toast +import kotlinx.collections.immutable.ImmutableList import tachiyomi.domain.manga.model.Manga import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.i18n.stringResource @Composable @@ -63,7 +63,7 @@ fun SavedSearchDeleteDialog( onDismissRequest = onDismissRequest, confirmButton = { TextButton(onClick = onDismissRequest) { - Text(text = stringResource(R.string.action_cancel)) + Text(text = stringResource(MR.strings.action_cancel)) } }, dismissButton = { @@ -73,14 +73,14 @@ fun SavedSearchDeleteDialog( onDismissRequest() }, ) { - Text(text = stringResource(R.string.action_ok)) + Text(text = stringResource(MR.strings.action_ok)) } }, title = { - Text(text = stringResource(R.string.save_search_delete)) + Text(text = stringResource(SYMR.strings.save_search_delete)) }, text = { - Text(text = stringResource(R.string.save_search_delete_message, name)) + Text(text = stringResource(SYMR.strings.save_search_delete_message, name)) }, ) } @@ -88,7 +88,7 @@ fun SavedSearchDeleteDialog( @Composable fun SavedSearchCreateDialog( onDismissRequest: () -> Unit, - currentSavedSearches: List, + currentSavedSearches: ImmutableList, saveSearch: (String) -> Unit, ) { var textFieldValue by rememberSaveable(stateSaver = TextFieldValue.Saver) { @@ -97,7 +97,7 @@ fun SavedSearchCreateDialog( val context = LocalContext.current AlertDialog( onDismissRequest = onDismissRequest, - title = { Text(text = stringResource(R.string.save_search)) }, + title = { Text(text = stringResource(SYMR.strings.save_search)) }, text = { OutlinedTextField( value = textFieldValue, @@ -105,7 +105,7 @@ fun SavedSearchCreateDialog( singleLine = true, modifier = Modifier.fillMaxWidth(), placeholder = { - Text(text = stringResource(R.string.save_search_hint)) + Text(text = stringResource(SYMR.strings.save_search_hint)) }, ) }, @@ -120,16 +120,16 @@ fun SavedSearchCreateDialog( saveSearch(searchName) onDismissRequest() } else { - context.toast(R.string.save_search_invalid_name) + context.toast(SYMR.strings.save_search_invalid_name) } }, ) { - Text(text = stringResource(R.string.action_ok)) + Text(text = stringResource(MR.strings.action_ok)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { - Text(text = stringResource(R.string.action_cancel)) + Text(text = stringResource(MR.strings.action_cancel)) } }, ) diff --git a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceEHentaiList.kt b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceEHentaiList.kt index 25fb703e2..e28bb0c96 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceEHentaiList.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceEHentaiList.kt @@ -25,7 +25,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.drawWithContent import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp @@ -33,8 +32,8 @@ import androidx.paging.LoadState import androidx.paging.compose.LazyPagingItems import com.gowtham.ratingbar.RatingBar import com.gowtham.ratingbar.RatingBarConfig +import dev.icerock.moko.resources.StringResource import eu.kanade.presentation.manga.components.MangaCover -import eu.kanade.tachiyomi.R import exh.metadata.MetadataUtil import exh.metadata.metadata.EHentaiSearchMetadata import exh.metadata.metadata.RaisedSearchMetadata @@ -42,11 +41,15 @@ import exh.util.SourceTagsUtil import exh.util.SourceTagsUtil.GenreColor import exh.util.floor import kotlinx.coroutines.flow.StateFlow +import tachiyomi.core.i18n.pluralStringResource import tachiyomi.core.util.lang.withIOContext import tachiyomi.domain.manga.model.Manga +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.Badge import tachiyomi.presentation.core.components.BadgeGroup import tachiyomi.presentation.core.components.material.padding +import tachiyomi.presentation.core.i18n.stringResource import java.util.Date @Composable @@ -100,7 +103,7 @@ fun BrowseSourceEHentaiListItem( if (metadata !is EHentaiSearchMetadata) return val overlayColor = MaterialTheme.colorScheme.background.copy(alpha = 0.66f) - val resources = LocalContext.current.resources + val context = LocalContext.current val languageText by produceState("", metadata) { value = withIOContext { val locale = SourceTagsUtil.getLocaleSourceUtil( @@ -110,14 +113,14 @@ fun BrowseSourceEHentaiListItem( ) val pageCount = metadata.length if (locale != null && pageCount != null) { - resources.getQuantityString( - R.plurals.browse_language_and_pages, + context.pluralStringResource( + SYMR.plurals.browse_language_and_pages, pageCount, pageCount, - locale.toLanguageTag().uppercase() + locale.toLanguageTag().uppercase(), ) } else if (pageCount != null) { - resources.getQuantityString(R.plurals.num_pages, pageCount, pageCount) + context.pluralStringResource(SYMR.plurals.num_pages, pageCount, pageCount) } else { locale?.toLanguageTag()?.uppercase().orEmpty() } @@ -130,19 +133,19 @@ fun BrowseSourceEHentaiListItem( .orEmpty() } } - val genre by produceState?>(null, metadata) { + val genre by produceState?>(null, metadata) { value = withIOContext { when (metadata.genre) { - "doujinshi" -> GenreColor.DOUJINSHI_COLOR to R.string.doujinshi - "manga" -> GenreColor.MANGA_COLOR to R.string.entry_type_manga - "artistcg" -> GenreColor.ARTIST_CG_COLOR to R.string.artist_cg - "gamecg" -> GenreColor.GAME_CG_COLOR to R.string.game_cg - "western" -> GenreColor.WESTERN_COLOR to R.string.western - "non-h" -> GenreColor.NON_H_COLOR to R.string.non_h - "imageset" -> GenreColor.IMAGE_SET_COLOR to R.string.image_set - "cosplay" -> GenreColor.COSPLAY_COLOR to R.string.cosplay - "asianporn" -> GenreColor.ASIAN_PORN_COLOR to R.string.asian_porn - "misc" -> GenreColor.MISC_COLOR to R.string.misc + "doujinshi" -> GenreColor.DOUJINSHI_COLOR to SYMR.strings.doujinshi + "manga" -> GenreColor.MANGA_COLOR to SYMR.strings.entry_type_manga + "artistcg" -> GenreColor.ARTIST_CG_COLOR to SYMR.strings.artist_cg + "gamecg" -> GenreColor.GAME_CG_COLOR to SYMR.strings.game_cg + "western" -> GenreColor.WESTERN_COLOR to SYMR.strings.western + "non-h" -> GenreColor.NON_H_COLOR to SYMR.strings.non_h + "imageset" -> GenreColor.IMAGE_SET_COLOR to SYMR.strings.image_set + "cosplay" -> GenreColor.COSPLAY_COLOR to SYMR.strings.cosplay + "asianporn" -> GenreColor.ASIAN_PORN_COLOR to SYMR.strings.asian_porn + "misc" -> GenreColor.MISC_COLOR to SYMR.strings.misc else -> null } } @@ -182,7 +185,7 @@ fun BrowseSourceEHentaiListItem( .padding(4.dp) .align(Alignment.TopStart), ) { - Badge(stringResource(R.string.in_library)) + Badge(stringResource(MR.strings.in_library)) } } } diff --git a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceFloatingActionButton.kt b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceFloatingActionButton.kt index f3f53c6ec..40b153c83 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceFloatingActionButton.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceFloatingActionButton.kt @@ -6,9 +6,10 @@ import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource -import eu.kanade.tachiyomi.R +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.material.ExtendedFloatingActionButton +import tachiyomi.presentation.core.i18n.stringResource @Composable fun BrowseSourceFloatingActionButton( @@ -21,9 +22,9 @@ fun BrowseSourceFloatingActionButton( text = { Text( text = if (isVisible) { - stringResource(R.string.action_filter) + stringResource(MR.strings.action_filter) } else { - stringResource(R.string.saved_searches) + stringResource(SYMR.strings.saved_searches) }, ) }, diff --git a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceList.kt b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceList.kt index 13c84171c..234576705 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceList.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceList.kt @@ -8,7 +8,6 @@ import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.paging.LoadState import androidx.paging.compose.LazyPagingItems @@ -21,6 +20,7 @@ import kotlinx.coroutines.flow.StateFlow import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.manga.model.MangaCover import tachiyomi.presentation.core.components.Badge +import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.plus @Composable @@ -105,7 +105,7 @@ private fun BrowseSourceListItem( } metadata.relation?.let { Badge( - text = stringResource(it.resId), + text = stringResource(it.res), color = MaterialTheme.colorScheme.tertiary, textColor = MaterialTheme.colorScheme.onTertiary, ) diff --git a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceSimpleToolbar.kt b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceSimpleToolbar.kt index e641879b2..341587fc5 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceSimpleToolbar.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceSimpleToolbar.kt @@ -12,13 +12,13 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue -import androidx.compose.ui.res.stringResource import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.components.DropdownMenu -import eu.kanade.tachiyomi.R import kotlinx.collections.immutable.persistentListOf import tachiyomi.domain.library.model.LibraryDisplayMode +import tachiyomi.i18n.MR +import tachiyomi.presentation.core.i18n.stringResource @Composable fun BrowseSourceSimpleToolbar( @@ -37,7 +37,7 @@ fun BrowseSourceSimpleToolbar( // SY --> actions = persistentListOf( AppBar.Action( - title = stringResource(id = R.string.action_display_mode), + title = stringResource(MR.strings.action_display_mode), icon = Icons.Outlined.ViewModule, onClick = { selectingDisplayMode = true }, ), @@ -48,7 +48,7 @@ fun BrowseSourceSimpleToolbar( onDismissRequest = { selectingDisplayMode = false }, ) { DropdownMenuItem( - text = { Text(text = stringResource(id = R.string.action_display_comfortable_grid)) }, + text = { Text(text = stringResource(MR.strings.action_display_comfortable_grid)) }, onClick = { onDisplayModeChange(LibraryDisplayMode.ComfortableGrid) }, trailingIcon = { if (displayMode == LibraryDisplayMode.ComfortableGrid) { @@ -60,7 +60,7 @@ fun BrowseSourceSimpleToolbar( }, ) DropdownMenuItem( - text = { Text(text = stringResource(id = R.string.action_display_grid)) }, + text = { Text(text = stringResource(MR.strings.action_display_grid)) }, onClick = { onDisplayModeChange(LibraryDisplayMode.CompactGrid) }, trailingIcon = { if (displayMode == LibraryDisplayMode.CompactGrid) { @@ -72,7 +72,7 @@ fun BrowseSourceSimpleToolbar( }, ) DropdownMenuItem( - text = { Text(text = stringResource(id = R.string.action_display_list)) }, + text = { Text(text = stringResource(MR.strings.action_display_list)) }, onClick = { onDisplayModeChange(LibraryDisplayMode.List) }, trailingIcon = { if (displayMode == LibraryDisplayMode.List) { diff --git a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceToolbar.kt b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceToolbar.kt index 63f12f91b..03575ed97 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceToolbar.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceToolbar.kt @@ -24,7 +24,7 @@ import exh.source.anyIs import kotlinx.collections.immutable.persistentListOf import tachiyomi.domain.library.model.LibraryDisplayMode import tachiyomi.i18n.MR -import tachiyomi.presentation.core.i18n.localize +import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.source.local.LocalSource @Composable @@ -62,7 +62,7 @@ fun BrowseSourceToolbar( if (displayMode != null) { add( AppBar.Action( - title = stringResource(R.string.action_display_mode), + title = stringResource(MR.strings.action_display_mode), icon = if (displayMode == LibraryDisplayMode.List) { Icons.AutoMirrored.Filled.ViewList } else { @@ -76,14 +76,14 @@ fun BrowseSourceToolbar( if (isConfigurableSource && displayMode != null) { add( AppBar.OverflowAction( - title = stringResource(R.string.label_help), + title = stringResource(MR.strings.label_help), onClick = onHelpClick, ), ) } else { add( AppBar.Action( - title = stringResource(R.string.label_help), + title = stringResource(MR.strings.label_help), icon = Icons.Outlined.Help, onClick = onHelpClick, ), @@ -93,17 +93,17 @@ fun BrowseSourceToolbar( if (isConfigurableSource && displayMode != null) { add( AppBar.OverflowAction( - title = stringResource(R.string.action_web_view), + title = stringResource(MR.strings.action_web_view), onClick = onWebViewClick, - ) + ), ) } else { add( AppBar.Action( - title = stringResource(R.string.action_web_view), + title = stringResource(MR.strings.action_web_view), icon = Icons.Outlined.Public, onClick = onWebViewClick, - ) + ), ) } } @@ -111,7 +111,7 @@ fun BrowseSourceToolbar( if (isConfigurableSource) { add( AppBar.OverflowAction( - title = localize(MR.strings.action_settings), + title = stringResource(MR.strings.action_settings), onClick = onSettingsClick, ), ) @@ -125,21 +125,21 @@ fun BrowseSourceToolbar( onDismissRequest = { selectingDisplayMode = false }, ) { RadioMenuItem( - text = { Text(text = localize(MR.strings.action_display_comfortable_grid)) }, + text = { Text(text = stringResource(MR.strings.action_display_comfortable_grid)) }, isChecked = displayMode == LibraryDisplayMode.ComfortableGrid, ) { selectingDisplayMode = false onDisplayModeChange(LibraryDisplayMode.ComfortableGrid) } RadioMenuItem( - text = { Text(text = localize(MR.strings.action_display_grid)) }, + text = { Text(text = stringResource(MR.strings.action_display_grid)) }, isChecked = displayMode == LibraryDisplayMode.CompactGrid, ) { selectingDisplayMode = false onDisplayModeChange(LibraryDisplayMode.CompactGrid) } RadioMenuItem( - text = { Text(text = localize(MR.strings.action_display_list)) }, + text = { Text(text = stringResource(MR.strings.action_display_list)) }, isChecked = displayMode == LibraryDisplayMode.List, ) { selectingDisplayMode = false diff --git a/app/src/main/java/eu/kanade/presentation/browse/components/MigrationActionIcon.kt b/app/src/main/java/eu/kanade/presentation/browse/components/MigrationActionIcon.kt index 76fd05097..e41c4eb19 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/components/MigrationActionIcon.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/components/MigrationActionIcon.kt @@ -15,11 +15,12 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.DpOffset import androidx.compose.ui.unit.dp -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.browse.migration.advanced.process.MigratingManga +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR +import tachiyomi.presentation.core.i18n.stringResource @Composable fun MigrationActionIcon( @@ -38,14 +39,14 @@ fun MigrationActionIcon( IconButton(onClick = skipManga) { Icon( imageVector = Icons.Outlined.Close, - contentDescription = stringResource(R.string.action_stop), + contentDescription = stringResource(SYMR.strings.action_stop), ) } } else if (result is MigratingManga.SearchResult.Result || result is MigratingManga.SearchResult.NotFound) { IconButton(onClick = { moreExpanded = !moreExpanded }) { Icon( imageVector = Icons.Outlined.MoreVert, - contentDescription = stringResource(R.string.abc_action_menu_overflow_description), + contentDescription = stringResource(MR.strings.action_menu_overflow_description), ) } DropdownMenu( @@ -54,14 +55,14 @@ fun MigrationActionIcon( offset = DpOffset(8.dp, (-56).dp), ) { DropdownMenuItem( - text = { Text(stringResource(R.string.action_search_manually)) }, + text = { Text(stringResource(SYMR.strings.action_search_manually)) }, onClick = { searchManually() closeMenu() }, ) DropdownMenuItem( - text = { Text(stringResource(R.string.action_skip_entry)) }, + text = { Text(stringResource(SYMR.strings.action_skip_entry)) }, onClick = { skipManga() closeMenu() @@ -69,14 +70,14 @@ fun MigrationActionIcon( ) if (result is MigratingManga.SearchResult.Result) { DropdownMenuItem( - text = { Text(stringResource(R.string.action_migrate_now)) }, + text = { Text(stringResource(SYMR.strings.action_migrate_now)) }, onClick = { migrateNow() closeMenu() }, ) DropdownMenuItem( - text = { Text(stringResource(R.string.action_copy_now)) }, + text = { Text(stringResource(SYMR.strings.action_copy_now)) }, onClick = { copyNow() closeMenu() diff --git a/app/src/main/java/eu/kanade/presentation/browse/components/MigrationExitDialog.kt b/app/src/main/java/eu/kanade/presentation/browse/components/MigrationExitDialog.kt index 832c15271..db9924bd9 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/components/MigrationExitDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/components/MigrationExitDialog.kt @@ -4,8 +4,9 @@ import androidx.compose.material3.AlertDialog import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable -import androidx.compose.ui.res.stringResource -import eu.kanade.tachiyomi.R +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR +import tachiyomi.presentation.core.i18n.stringResource @Composable fun MigrationExitDialog( @@ -16,16 +17,16 @@ fun MigrationExitDialog( onDismissRequest = onDismissRequest, confirmButton = { TextButton(onClick = exitMigration) { - Text(text = stringResource(R.string.action_stop)) + Text(text = stringResource(SYMR.strings.action_stop)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { - Text(text = stringResource(R.string.action_cancel)) + Text(text = stringResource(MR.strings.action_cancel)) } }, title = { - Text(text = stringResource(R.string.stop_migrating)) + Text(text = stringResource(SYMR.strings.stop_migrating)) }, ) } diff --git a/app/src/main/java/eu/kanade/presentation/browse/components/MigrationItem.kt b/app/src/main/java/eu/kanade/presentation/browse/components/MigrationItem.kt index dc33cba4f..42280bc9a 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/components/MigrationItem.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/components/MigrationItem.kt @@ -22,17 +22,17 @@ import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Shadow import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import eu.kanade.presentation.manga.components.MangaCover -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.browse.migration.advanced.process.MigratingManga import tachiyomi.core.util.lang.withIOContext import tachiyomi.domain.manga.model.Manga +import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.Badge import tachiyomi.presentation.core.components.BadgeGroup +import tachiyomi.presentation.core.i18n.stringResource @Composable fun MigrationItem( @@ -77,7 +77,7 @@ fun MigrationItem( modifier = Modifier .padding(8.dp) .align(Alignment.BottomStart), - text = manga.title.ifBlank { stringResource(R.string.unknown) }, + text = manga.title.ifBlank { stringResource(MR.strings.unknown) }, fontSize = 12.sp, lineHeight = 18.sp, maxLines = 2, diff --git a/app/src/main/java/eu/kanade/presentation/browse/components/MigrationItemResult.kt b/app/src/main/java/eu/kanade/presentation/browse/components/MigrationItemResult.kt index c7af8d261..9845e9db4 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/components/MigrationItemResult.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/components/MigrationItemResult.kt @@ -20,7 +20,6 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import eu.kanade.presentation.manga.components.MangaCover import eu.kanade.presentation.util.rememberResourceBitmapPainter @@ -28,6 +27,8 @@ import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.browse.migration.advanced.process.MigratingManga import tachiyomi.core.util.lang.withIOContext import tachiyomi.domain.manga.model.Manga +import tachiyomi.i18n.sy.SYMR +import tachiyomi.presentation.core.i18n.stringResource @Composable fun MigrationItemResult( @@ -66,7 +67,7 @@ fun MigrationItemResult( contentScale = ContentScale.Crop, ) Text( - text = stringResource(R.string.no_alternatives_found), + text = stringResource(SYMR.strings.no_alternatives_found), modifier = Modifier.padding(top = 4.dp, bottom = 1.dp, start = 8.dp), style = MaterialTheme.typography.titleSmall, ) diff --git a/app/src/main/java/eu/kanade/presentation/browse/components/MigrationMangaDialog.kt b/app/src/main/java/eu/kanade/presentation/browse/components/MigrationMangaDialog.kt index 0bb4c4caf..1f439e960 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/components/MigrationMangaDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/components/MigrationMangaDialog.kt @@ -4,9 +4,10 @@ import androidx.compose.material3.AlertDialog import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable -import androidx.compose.ui.res.pluralStringResource -import androidx.compose.ui.res.stringResource -import eu.kanade.tachiyomi.R +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR +import tachiyomi.presentation.core.i18n.pluralStringResource +import tachiyomi.presentation.core.i18n.stringResource @Composable fun MigrationMangaDialog( @@ -29,21 +30,21 @@ fun MigrationMangaDialog( } }, ) { - Text(text = stringResource(if (copy) R.string.copy else R.string.migrate)) + Text(text = stringResource(if (copy) MR.strings.copy else MR.strings.migrate)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { - Text(text = stringResource(R.string.action_cancel)) + Text(text = stringResource(MR.strings.action_cancel)) } }, text = { Text( text = pluralStringResource( - if (copy) R.plurals.copy_entry else R.plurals.migrate_entry, + if (copy) SYMR.plurals.copy_entry else SYMR.plurals.migrate_entry, count = mangaSet, mangaSet, - (if (mangaSkipped > 0) " " + stringResource(R.string.skipping_, mangaSkipped) else ""), + (if (mangaSkipped > 0) " " + stringResource(SYMR.strings.skipping_, mangaSkipped) else ""), ), ) }, diff --git a/app/src/main/java/eu/kanade/presentation/browse/components/MigrationProgressDialog.kt b/app/src/main/java/eu/kanade/presentation/browse/components/MigrationProgressDialog.kt index 765412ab7..a33dc4aab 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/components/MigrationProgressDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/components/MigrationProgressDialog.kt @@ -8,9 +8,9 @@ import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue -import androidx.compose.ui.res.stringResource import androidx.compose.ui.window.DialogProperties -import eu.kanade.tachiyomi.R +import tachiyomi.i18n.MR +import tachiyomi.presentation.core.i18n.stringResource @Composable fun MigrationProgressDialog( @@ -21,7 +21,7 @@ fun MigrationProgressDialog( onDismissRequest = {}, confirmButton = { TextButton(onClick = exitMigration) { - Text(text = stringResource(R.string.action_cancel)) + Text(text = stringResource(MR.strings.action_cancel)) } }, text = { @@ -29,8 +29,11 @@ fun MigrationProgressDialog( val progressAnimated by animateFloatAsState( targetValue = progress, animationSpec = ProgressIndicatorDefaults.ProgressAnimationSpec, + label = "migration_progress", + ) + LinearProgressIndicator( + progress = { progressAnimated }, ) - LinearProgressIndicator(progressAnimated) } }, properties = DialogProperties( diff --git a/app/src/main/java/eu/kanade/presentation/browse/components/SourceFeedDialogs.kt b/app/src/main/java/eu/kanade/presentation/browse/components/SourceFeedDialogs.kt index 505c3e98f..1e321f6c8 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/components/SourceFeedDialogs.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/components/SourceFeedDialogs.kt @@ -4,8 +4,9 @@ import androidx.compose.material3.AlertDialog import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable -import androidx.compose.ui.res.stringResource -import eu.kanade.tachiyomi.R +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR +import tachiyomi.presentation.core.i18n.stringResource @Composable fun SourceFeedAddDialog( @@ -17,19 +18,19 @@ fun SourceFeedAddDialog( onDismissRequest = onDismissRequest, confirmButton = { TextButton(onClick = addFeed) { - Text(text = stringResource(R.string.action_add)) + Text(text = stringResource(MR.strings.action_add)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { - Text(text = stringResource(R.string.action_cancel)) + Text(text = stringResource(MR.strings.action_cancel)) } }, title = { - Text(text = stringResource(R.string.feed)) + Text(text = stringResource(SYMR.strings.feed)) }, text = { - Text(text = stringResource(R.string.feed_add, name)) + Text(text = stringResource(SYMR.strings.feed_add, name)) }, ) } @@ -43,19 +44,19 @@ fun SourceFeedDeleteDialog( onDismissRequest = onDismissRequest, confirmButton = { TextButton(onClick = deleteFeed) { - Text(text = stringResource(R.string.action_delete)) + Text(text = stringResource(MR.strings.action_delete)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { - Text(text = stringResource(R.string.action_cancel)) + Text(text = stringResource(MR.strings.action_cancel)) } }, title = { - Text(text = stringResource(R.string.feed)) + Text(text = stringResource(SYMR.strings.feed)) }, text = { - Text(text = stringResource(R.string.feed_delete)) + Text(text = stringResource(SYMR.strings.feed_delete)) }, ) } diff --git a/app/src/main/java/eu/kanade/presentation/category/BiometricTimesScreen.kt b/app/src/main/java/eu/kanade/presentation/category/BiometricTimesScreen.kt index 8d2e43ae1..4a82ce90e 100644 --- a/app/src/main/java/eu/kanade/presentation/category/BiometricTimesScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/category/BiometricTimesScreen.kt @@ -6,16 +6,16 @@ import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import eu.kanade.presentation.category.components.CategoryFloatingActionButton import eu.kanade.presentation.category.components.biometric.BiometricTimesContent import eu.kanade.presentation.components.AppBar -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.category.biometric.BiometricTimesScreenState import eu.kanade.tachiyomi.ui.category.biometric.TimeRangeItem +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.topSmallPaddingValues +import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.util.plus @@ -31,7 +31,7 @@ fun BiometricTimesScreen( topBar = { scrollBehavior -> AppBar( navigateUp = navigateUp, - title = stringResource(R.string.biometric_lock_times), + title = stringResource(SYMR.strings.biometric_lock_times), scrollBehavior = scrollBehavior, ) }, @@ -44,7 +44,7 @@ fun BiometricTimesScreen( ) { paddingValues -> if (state.isEmpty) { EmptyScreen( - textResource = R.string.biometric_lock_times_empty, + SYMR.strings.biometric_lock_times_empty, modifier = Modifier.padding(paddingValues), ) return@Scaffold 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 ed3767010..a9f8814a5 100644 --- a/app/src/main/java/eu/kanade/presentation/category/CategoryScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/category/CategoryScreen.kt @@ -17,6 +17,7 @@ import eu.kanade.presentation.category.components.CategoryListItem import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBarActions import eu.kanade.tachiyomi.ui.category.CategoryScreenState +import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import tachiyomi.domain.category.model.Category import tachiyomi.i18n.MR @@ -88,7 +89,7 @@ fun CategoryScreen( @Composable private fun CategoryContent( - categories: List, + categories: ImmutableList, lazyListState: LazyListState, paddingValues: PaddingValues, onClickRename: (Category) -> Unit, diff --git a/app/src/main/java/eu/kanade/presentation/category/SortTagScreen.kt b/app/src/main/java/eu/kanade/presentation/category/SortTagScreen.kt index 2c0f1de92..51b4bdde6 100644 --- a/app/src/main/java/eu/kanade/presentation/category/SortTagScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/category/SortTagScreen.kt @@ -6,15 +6,15 @@ import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import eu.kanade.presentation.category.components.CategoryFloatingActionButton import eu.kanade.presentation.category.components.genre.SortTagContent import eu.kanade.presentation.components.AppBar -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.category.genre.SortTagScreenState +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.topSmallPaddingValues +import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.util.plus @@ -32,7 +32,7 @@ fun SortTagScreen( topBar = { scrollBehavior -> AppBar( navigateUp = navigateUp, - title = stringResource(R.string.action_edit_tags), + title = stringResource(SYMR.strings.action_edit_tags), scrollBehavior = scrollBehavior, ) }, @@ -45,7 +45,7 @@ fun SortTagScreen( ) { paddingValues -> if (state.isEmpty) { EmptyScreen( - textResource = R.string.information_empty_tags, + SYMR.strings.information_empty_tags, modifier = Modifier.padding(paddingValues), ) return@Scaffold diff --git a/app/src/main/java/eu/kanade/presentation/category/SourceCategoryScreen.kt b/app/src/main/java/eu/kanade/presentation/category/SourceCategoryScreen.kt index 7e5920288..c750f9f93 100644 --- a/app/src/main/java/eu/kanade/presentation/category/SourceCategoryScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/category/SourceCategoryScreen.kt @@ -6,15 +6,16 @@ import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import eu.kanade.presentation.category.components.CategoryFloatingActionButton import eu.kanade.presentation.category.components.sources.SourceCategoryContent import eu.kanade.presentation.components.AppBar -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.category.sources.SourceCategoryScreenState +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.topSmallPaddingValues +import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.util.plus @@ -31,7 +32,7 @@ fun SourceCategoryScreen( topBar = { scrollBehavior -> AppBar( navigateUp = navigateUp, - title = stringResource(R.string.action_edit_categories), + title = stringResource(MR.strings.action_edit_categories), scrollBehavior = scrollBehavior, ) }, @@ -44,7 +45,7 @@ fun SourceCategoryScreen( ) { paddingValues -> if (state.isEmpty) { EmptyScreen( - textResource = R.string.no_source_categories, + SYMR.strings.no_source_categories, modifier = Modifier.padding(paddingValues), ) return@Scaffold diff --git a/app/src/main/java/eu/kanade/presentation/category/SourceRepoScreen.kt b/app/src/main/java/eu/kanade/presentation/category/SourceRepoScreen.kt index 3252d9cf7..32e42a180 100644 --- a/app/src/main/java/eu/kanade/presentation/category/SourceRepoScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/category/SourceRepoScreen.kt @@ -6,15 +6,15 @@ import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import eu.kanade.presentation.category.components.CategoryFloatingActionButton import eu.kanade.presentation.category.components.repo.SourceRepoContent import eu.kanade.presentation.components.AppBar -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.category.repos.RepoScreenState +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.topSmallPaddingValues +import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.util.plus @@ -30,7 +30,7 @@ fun SourceRepoScreen( topBar = { scrollBehavior -> AppBar( navigateUp = navigateUp, - title = stringResource(R.string.action_edit_repos), + title = stringResource(SYMR.strings.action_edit_repos), scrollBehavior = scrollBehavior, ) }, @@ -43,7 +43,7 @@ fun SourceRepoScreen( ) { paddingValues -> if (state.isEmpty) { EmptyScreen( - textResource = R.string.information_empty_repos, + SYMR.strings.information_empty_repos, modifier = Modifier.padding(paddingValues), ) return@Scaffold diff --git a/app/src/main/java/eu/kanade/presentation/category/components/CategoryDialogs.kt b/app/src/main/java/eu/kanade/presentation/category/components/CategoryDialogs.kt index 642fdf992..19e06909f 100644 --- a/app/src/main/java/eu/kanade/presentation/category/components/CategoryDialogs.kt +++ b/app/src/main/java/eu/kanade/presentation/category/components/CategoryDialogs.kt @@ -25,14 +25,17 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester -import androidx.compose.ui.res.stringResource +import dev.icerock.moko.resources.StringResource import eu.kanade.core.preference.asToggleableState import eu.kanade.presentation.category.visualName -import eu.kanade.tachiyomi.R +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.delay import tachiyomi.core.preference.CheckboxState import tachiyomi.domain.category.model.Category +import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.padding +import tachiyomi.presentation.core.i18n.stringResource import kotlin.time.Duration.Companion.seconds @Composable @@ -40,10 +43,10 @@ fun CategoryCreateDialog( onDismissRequest: () -> Unit, onCreate: (String) -> Unit, // SY --> - categories: List, + categories: ImmutableList, title: String, extraMessage: String? = null, - alreadyExistsError: Int = R.string.error_category_exists, + alreadyExistsError: StringResource = MR.strings.error_category_exists, // SY <-- ) { var name by remember { mutableStateOf("") } @@ -61,12 +64,12 @@ fun CategoryCreateDialog( onDismissRequest() }, ) { - Text(text = stringResource(R.string.action_add)) + Text(text = stringResource(MR.strings.action_add)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { - Text(text = stringResource(R.string.action_cancel)) + Text(text = stringResource(MR.strings.action_cancel)) } }, title = { @@ -85,13 +88,13 @@ fun CategoryCreateDialog( value = name, onValueChange = { name = it }, label = { - Text(text = stringResource(R.string.name)) + Text(text = stringResource(MR.strings.name)) }, supportingText = { val msgRes = if (name.isNotEmpty() && nameAlreadyExists) { alreadyExistsError } else { - R.string.information_required_plain + MR.strings.information_required_plain } Text(text = stringResource(msgRes)) }, @@ -116,9 +119,9 @@ fun CategoryRenameDialog( onDismissRequest: () -> Unit, onRename: (String) -> Unit, // SY --> - categories: List, + categories: ImmutableList, category: String, - alreadyExistsError: Int = R.string.error_category_exists, + alreadyExistsError: StringResource = MR.strings.error_category_exists, // SY <-- ) { var name by remember { mutableStateOf(category) } @@ -136,16 +139,16 @@ fun CategoryRenameDialog( onDismissRequest() }, ) { - Text(text = stringResource(R.string.action_ok)) + Text(text = stringResource(MR.strings.action_ok)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { - Text(text = stringResource(R.string.action_cancel)) + Text(text = stringResource(MR.strings.action_cancel)) } }, title = { - Text(text = stringResource(R.string.action_rename_category)) + Text(text = stringResource(MR.strings.action_rename_category)) }, text = { OutlinedTextField( @@ -155,12 +158,12 @@ fun CategoryRenameDialog( valueHasChanged = name != it name = it }, - label = { Text(text = stringResource(R.string.name)) }, + label = { Text(text = stringResource(MR.strings.name)) }, supportingText = { val msgRes = if (valueHasChanged && nameAlreadyExists) { alreadyExistsError } else { - R.string.information_required_plain + MR.strings.information_required_plain } Text(text = stringResource(msgRes)) }, @@ -193,12 +196,12 @@ fun CategoryDeleteDialog( onDelete() onDismissRequest() }) { - Text(text = stringResource(R.string.action_ok)) + Text(text = stringResource(MR.strings.action_ok)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { - Text(text = stringResource(R.string.action_cancel)) + Text(text = stringResource(MR.strings.action_cancel)) } }, title = { @@ -222,26 +225,26 @@ fun CategorySortAlphabeticallyDialog( onSort() onDismissRequest() }) { - Text(text = stringResource(R.string.action_ok)) + Text(text = stringResource(MR.strings.action_ok)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { - Text(text = stringResource(R.string.action_cancel)) + Text(text = stringResource(MR.strings.action_cancel)) } }, title = { - Text(text = stringResource(R.string.action_sort_category)) + Text(text = stringResource(MR.strings.action_sort_category)) }, text = { - Text(text = stringResource(R.string.sort_category_confirmation)) + Text(text = stringResource(MR.strings.sort_category_confirmation)) }, ) } @Composable fun ChangeCategoryDialog( - initialSelection: List>, + initialSelection: ImmutableList>, onDismissRequest: () -> Unit, onEditCategories: () -> Unit, onConfirm: (List, List) -> Unit, @@ -256,14 +259,14 @@ fun ChangeCategoryDialog( onEditCategories() }, ) { - Text(text = stringResource(R.string.action_edit_categories)) + Text(text = stringResource(MR.strings.action_edit_categories)) } }, title = { - Text(text = stringResource(R.string.action_move_category)) + Text(text = stringResource(MR.strings.action_move_category)) }, text = { - Text(text = stringResource(R.string.information_empty_category_dialog)) + Text(text = stringResource(MR.strings.information_empty_category_dialog)) }, ) return @@ -277,11 +280,11 @@ fun ChangeCategoryDialog( onDismissRequest() onEditCategories() }) { - Text(text = stringResource(R.string.action_edit)) + Text(text = stringResource(MR.strings.action_edit)) } Spacer(modifier = Modifier.weight(1f)) tachiyomi.presentation.core.components.material.TextButton(onClick = onDismissRequest) { - Text(text = stringResource(R.string.action_cancel)) + Text(text = stringResource(MR.strings.action_cancel)) } tachiyomi.presentation.core.components.material.TextButton( onClick = { @@ -296,12 +299,12 @@ fun ChangeCategoryDialog( ) }, ) { - Text(text = stringResource(R.string.action_ok)) + Text(text = stringResource(MR.strings.action_ok)) } } }, title = { - Text(text = stringResource(R.string.action_move_category)) + Text(text = stringResource(MR.strings.action_move_category)) }, text = { Column( @@ -313,7 +316,7 @@ fun ChangeCategoryDialog( if (index != -1) { val mutableList = selection.toMutableList() mutableList[index] = it.next() - selection = mutableList.toList() + selection = mutableList.toList().toImmutableList() } } Row( diff --git a/app/src/main/java/eu/kanade/presentation/category/components/biometric/BiometricTimesContent.kt b/app/src/main/java/eu/kanade/presentation/category/components/biometric/BiometricTimesContent.kt index da3ea9370..d8465e295 100644 --- a/app/src/main/java/eu/kanade/presentation/category/components/biometric/BiometricTimesContent.kt +++ b/app/src/main/java/eu/kanade/presentation/category/components/biometric/BiometricTimesContent.kt @@ -9,11 +9,12 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import eu.kanade.tachiyomi.ui.category.biometric.TimeRangeItem +import kotlinx.collections.immutable.ImmutableList import tachiyomi.presentation.core.components.material.padding @Composable fun BiometricTimesContent( - timeRanges: List, + timeRanges: ImmutableList, lazyListState: LazyListState, paddingValues: PaddingValues, onClickDelete: (TimeRangeItem) -> Unit, diff --git a/app/src/main/java/eu/kanade/presentation/category/components/biometric/BiometricTimesListItem.kt b/app/src/main/java/eu/kanade/presentation/category/components/biometric/BiometricTimesListItem.kt index 57d1c1ee6..f1ffcb8ce 100644 --- a/app/src/main/java/eu/kanade/presentation/category/components/biometric/BiometricTimesListItem.kt +++ b/app/src/main/java/eu/kanade/presentation/category/components/biometric/BiometricTimesListItem.kt @@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.Label import androidx.compose.material.icons.outlined.Delete import androidx.compose.material.icons.outlined.Label import androidx.compose.material3.ElevatedCard @@ -33,11 +34,11 @@ fun BiometricTimesListItem( .padding( start = MaterialTheme.padding.medium, top = MaterialTheme.padding.medium, - end = MaterialTheme.padding.medium + end = MaterialTheme.padding.medium, ), verticalAlignment = Alignment.CenterVertically, ) { - Icon(imageVector = Icons.Outlined.Label, contentDescription = "") + Icon(imageVector = Icons.AutoMirrored.Outlined.Label, contentDescription = "") Text(text = timeRange.formattedString, modifier = Modifier.padding(start = MaterialTheme.padding.medium)) } Row { diff --git a/app/src/main/java/eu/kanade/presentation/category/components/genre/SortTagContent.kt b/app/src/main/java/eu/kanade/presentation/category/components/genre/SortTagContent.kt index a01c09c22..4700e1883 100644 --- a/app/src/main/java/eu/kanade/presentation/category/components/genre/SortTagContent.kt +++ b/app/src/main/java/eu/kanade/presentation/category/components/genre/SortTagContent.kt @@ -8,11 +8,12 @@ import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import kotlinx.collections.immutable.ImmutableList import tachiyomi.presentation.core.components.material.padding @Composable fun SortTagContent( - tags: List, + tags: ImmutableList, lazyListState: LazyListState, paddingValues: PaddingValues, onClickDelete: (String) -> Unit, diff --git a/app/src/main/java/eu/kanade/presentation/category/components/genre/SortTagListItem.kt b/app/src/main/java/eu/kanade/presentation/category/components/genre/SortTagListItem.kt index 581bb18ec..41045f18a 100644 --- a/app/src/main/java/eu/kanade/presentation/category/components/genre/SortTagListItem.kt +++ b/app/src/main/java/eu/kanade/presentation/category/components/genre/SortTagListItem.kt @@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.Label import androidx.compose.material.icons.outlined.ArrowDropDown import androidx.compose.material.icons.outlined.ArrowDropUp import androidx.compose.material.icons.outlined.Delete @@ -38,11 +39,11 @@ fun SortTagListItem( .padding( start = MaterialTheme.padding.medium, top = MaterialTheme.padding.medium, - end = MaterialTheme.padding.medium + end = MaterialTheme.padding.medium, ), verticalAlignment = Alignment.CenterVertically, ) { - Icon(imageVector = Icons.Outlined.Label, contentDescription = "") + Icon(imageVector = Icons.AutoMirrored.Outlined.Label, contentDescription = "") Text(text = tag, modifier = Modifier.padding(start = MaterialTheme.padding.medium)) } Row { diff --git a/app/src/main/java/eu/kanade/presentation/category/components/repo/SourceRepoContent.kt b/app/src/main/java/eu/kanade/presentation/category/components/repo/SourceRepoContent.kt index 40ff4a7a2..945b02370 100644 --- a/app/src/main/java/eu/kanade/presentation/category/components/repo/SourceRepoContent.kt +++ b/app/src/main/java/eu/kanade/presentation/category/components/repo/SourceRepoContent.kt @@ -8,11 +8,12 @@ import androidx.compose.foundation.lazy.items import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import kotlinx.collections.immutable.ImmutableList import tachiyomi.presentation.core.components.material.padding @Composable fun SourceRepoContent( - repos: List, + repos: ImmutableList, lazyListState: LazyListState, paddingValues: PaddingValues, onClickDelete: (String) -> Unit, diff --git a/app/src/main/java/eu/kanade/presentation/category/components/repo/SourceRepoListItem.kt b/app/src/main/java/eu/kanade/presentation/category/components/repo/SourceRepoListItem.kt index 08fd3ad78..c86470551 100644 --- a/app/src/main/java/eu/kanade/presentation/category/components/repo/SourceRepoListItem.kt +++ b/app/src/main/java/eu/kanade/presentation/category/components/repo/SourceRepoListItem.kt @@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.Label import androidx.compose.material.icons.outlined.Delete import androidx.compose.material.icons.outlined.Label import androidx.compose.material3.ElevatedCard @@ -32,11 +33,11 @@ fun SourceRepoListItem( .padding( start = MaterialTheme.padding.medium, top = MaterialTheme.padding.medium, - end = MaterialTheme.padding.medium + end = MaterialTheme.padding.medium, ), verticalAlignment = Alignment.CenterVertically, ) { - Icon(imageVector = Icons.Outlined.Label, contentDescription = "") + Icon(imageVector = Icons.AutoMirrored.Outlined.Label, contentDescription = "") Text(text = repo, modifier = Modifier.padding(start = MaterialTheme.padding.medium)) } Row { diff --git a/app/src/main/java/eu/kanade/presentation/category/components/sources/SourceCategoryContent.kt b/app/src/main/java/eu/kanade/presentation/category/components/sources/SourceCategoryContent.kt index 0313e7b6e..2f5b26b3e 100644 --- a/app/src/main/java/eu/kanade/presentation/category/components/sources/SourceCategoryContent.kt +++ b/app/src/main/java/eu/kanade/presentation/category/components/sources/SourceCategoryContent.kt @@ -8,11 +8,12 @@ import androidx.compose.foundation.lazy.items import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import kotlinx.collections.immutable.ImmutableList import tachiyomi.presentation.core.components.material.padding @Composable fun SourceCategoryContent( - categories: List, + categories: ImmutableList, lazyListState: LazyListState, paddingValues: PaddingValues, onClickRename: (String) -> Unit, diff --git a/app/src/main/java/eu/kanade/presentation/category/components/sources/SourceCategoryListItem.kt b/app/src/main/java/eu/kanade/presentation/category/components/sources/SourceCategoryListItem.kt index b0b220ba3..8e10a2544 100644 --- a/app/src/main/java/eu/kanade/presentation/category/components/sources/SourceCategoryListItem.kt +++ b/app/src/main/java/eu/kanade/presentation/category/components/sources/SourceCategoryListItem.kt @@ -6,6 +6,7 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.Label import androidx.compose.material.icons.outlined.Delete import androidx.compose.material.icons.outlined.Edit import androidx.compose.material.icons.outlined.Label @@ -36,11 +37,11 @@ fun SourceCategoryListItem( .padding( start = MaterialTheme.padding.medium, top = MaterialTheme.padding.medium, - end = MaterialTheme.padding.medium + end = MaterialTheme.padding.medium, ), verticalAlignment = Alignment.CenterVertically, ) { - Icon(imageVector = Icons.Outlined.Label, contentDescription = "") + Icon(imageVector = Icons.AutoMirrored.Outlined.Label, contentDescription = "") Text(text = category, modifier = Modifier.padding(start = MaterialTheme.padding.medium)) } Row { diff --git a/app/src/main/java/eu/kanade/presentation/components/AppBar.kt b/app/src/main/java/eu/kanade/presentation/components/AppBar.kt index 0bfd039eb..3421380d1 100644 --- a/app/src/main/java/eu/kanade/presentation/components/AppBar.kt +++ b/app/src/main/java/eu/kanade/presentation/components/AppBar.kt @@ -43,7 +43,6 @@ import androidx.compose.ui.graphics.SolidColor import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.LocalSoftwareKeyboardController -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.VisualTransformation diff --git a/app/src/main/java/eu/kanade/presentation/components/AroundLayout.kt b/app/src/main/java/eu/kanade/presentation/components/AroundLayout.kt index dfd9388fc..052d116ad 100644 --- a/app/src/main/java/eu/kanade/presentation/components/AroundLayout.kt +++ b/app/src/main/java/eu/kanade/presentation/components/AroundLayout.kt @@ -11,10 +11,10 @@ import androidx.compose.ui.util.fastMaxBy @Composable fun AroundLayout( - modifier: Modifier = Modifier, startLayout: @Composable () -> Unit, endLayout: @Composable () -> Unit, content: @Composable () -> Unit, + modifier: Modifier = Modifier, ) { SubcomposeLayout(modifier) { constraints -> val layoutWidth = constraints.maxWidth 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..b43cee7d8 100644 --- a/app/src/main/java/eu/kanade/presentation/history/HistoryScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/history/HistoryScreen.kt @@ -21,6 +21,7 @@ import eu.kanade.presentation.components.SearchToolbar import eu.kanade.presentation.history.components.HistoryItem import eu.kanade.presentation.theme.TachiyomiTheme import eu.kanade.tachiyomi.ui.history.HistoryScreenModel +import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import tachiyomi.core.preference.InMemoryPreferenceStore import tachiyomi.domain.history.model.HistoryWithRelations @@ -97,7 +98,7 @@ fun HistoryScreen( @Composable private fun HistoryScreenContent( - history: List, + history: ImmutableList, contentPadding: PaddingValues, onClickCover: (HistoryWithRelations) -> Unit, onClickResume: (HistoryWithRelations) -> Unit, diff --git a/app/src/main/java/eu/kanade/presentation/history/HistoryScreenModelStateProvider.kt b/app/src/main/java/eu/kanade/presentation/history/HistoryScreenModelStateProvider.kt index 291163a22..314d376bc 100644 --- a/app/src/main/java/eu/kanade/presentation/history/HistoryScreenModelStateProvider.kt +++ b/app/src/main/java/eu/kanade/presentation/history/HistoryScreenModelStateProvider.kt @@ -2,6 +2,8 @@ package eu.kanade.presentation.history import androidx.compose.ui.tooling.preview.PreviewParameterProvider import eu.kanade.tachiyomi.ui.history.HistoryScreenModel +import kotlinx.collections.immutable.persistentListOf +import kotlinx.collections.immutable.toImmutableList import tachiyomi.domain.history.model.HistoryWithRelations import tachiyomi.domain.manga.model.MangaCover import java.time.Instant @@ -14,20 +16,20 @@ class HistoryScreenModelStateProvider : PreviewParameterProvider - stringResource(R.string.group), + stringResource(SYMR.strings.group), // SY <-- ), ) { page -> @@ -93,7 +97,7 @@ private fun ColumnScope.FilterPage( val filterDownloaded by screenModel.libraryPreferences.filterDownloaded().collectAsState() val downloadedOnly by screenModel.preferences.downloadedOnly().collectAsState() TriStateItem( - label = stringResource(R.string.label_downloaded), + label = stringResource(MR.strings.label_downloaded), state = if (downloadedOnly) { TriState.ENABLED_IS } else { @@ -104,32 +108,32 @@ private fun ColumnScope.FilterPage( ) val filterUnread by screenModel.libraryPreferences.filterUnread().collectAsState() TriStateItem( - label = stringResource(R.string.action_filter_unread), + label = stringResource(MR.strings.action_filter_unread), state = filterUnread, onClick = { screenModel.toggleFilter(LibraryPreferences::filterUnread) }, ) val filterStarted by screenModel.libraryPreferences.filterStarted().collectAsState() TriStateItem( - label = stringResource(R.string.label_started), + label = stringResource(MR.strings.label_started), state = filterStarted, onClick = { screenModel.toggleFilter(LibraryPreferences::filterStarted) }, ) val filterBookmarked by screenModel.libraryPreferences.filterBookmarked().collectAsState() TriStateItem( - label = stringResource(R.string.action_filter_bookmarked), + label = stringResource(MR.strings.action_filter_bookmarked), state = filterBookmarked, onClick = { screenModel.toggleFilter(LibraryPreferences::filterBookmarked) }, ) val filterCompleted by screenModel.libraryPreferences.filterCompleted().collectAsState() TriStateItem( - label = stringResource(R.string.completed), + label = stringResource(MR.strings.completed), state = filterCompleted, onClick = { screenModel.toggleFilter(LibraryPreferences::filterCompleted) }, ) // SY --> val filterLewd by screenModel.libraryPreferences.filterLewd().collectAsState() TriStateItem( - label = stringResource(R.string.lewd), + label = stringResource(SYMR.strings.lewd), state = filterLewd, onClick = { screenModel.toggleFilter(LibraryPreferences::filterLewd) }, ) @@ -144,13 +148,13 @@ private fun ColumnScope.FilterPage( val service = trackers[0] val filterTracker by screenModel.libraryPreferences.filterTracking(service.id.toInt()).collectAsState() TriStateItem( - label = stringResource(R.string.action_filter_tracked), + label = stringResource(MR.strings.action_filter_tracked), state = filterTracker, onClick = { screenModel.toggleTracker(service.id.toInt()) }, ) } else -> { - HeadingItem(R.string.action_filter_tracked) + HeadingItem(MR.strings.action_filter_tracked) trackers.map { service -> val filterTracker by screenModel.libraryPreferences.filterTracking(service.id.toInt()).collectAsState() TriStateItem( @@ -190,21 +194,21 @@ private fun ColumnScope.SortPage( if (screenModel.trackers.isEmpty()) { emptyList() } else { - listOf(R.string.action_sort_tracker_score to LibrarySort.Type.TrackerMean) + listOf(MR.strings.action_sort_tracker_score to LibrarySort.Type.TrackerMean) } listOfNotNull( - R.string.action_sort_alpha to LibrarySort.Type.Alphabetical, - R.string.action_sort_total to LibrarySort.Type.TotalChapters, - R.string.action_sort_last_read to LibrarySort.Type.LastRead, - R.string.action_sort_last_manga_update to LibrarySort.Type.LastUpdate, - R.string.action_sort_unread_count to LibrarySort.Type.UnreadCount, - R.string.action_sort_latest_chapter to LibrarySort.Type.LatestChapter, - R.string.action_sort_chapter_fetch_date to LibrarySort.Type.ChapterFetchDate, - R.string.action_sort_date_added to LibrarySort.Type.DateAdded, + MR.strings.action_sort_alpha to LibrarySort.Type.Alphabetical, + MR.strings.action_sort_total to LibrarySort.Type.TotalChapters, + MR.strings.action_sort_last_read to LibrarySort.Type.LastRead, + MR.strings.action_sort_last_manga_update to LibrarySort.Type.LastUpdate, + MR.strings.action_sort_unread_count to LibrarySort.Type.UnreadCount, + MR.strings.action_sort_latest_chapter to LibrarySort.Type.LatestChapter, + MR.strings.action_sort_chapter_fetch_date to LibrarySort.Type.ChapterFetchDate, + MR.strings.action_sort_date_added to LibrarySort.Type.DateAdded, // SY --> if (hasSortTags) { - R.string.tag_sorting to LibrarySort.Type.TagList + SYMR.strings.tag_sorting to LibrarySort.Type.TagList } else { null }, @@ -230,10 +234,10 @@ private fun ColumnScope.SortPage( } private val displayModes = listOf( - R.string.action_display_grid to LibraryDisplayMode.CompactGrid, - R.string.action_display_comfortable_grid to LibraryDisplayMode.ComfortableGrid, - R.string.action_display_cover_only_grid to LibraryDisplayMode.CoverOnlyGrid, - R.string.action_display_list to LibraryDisplayMode.List, + MR.strings.action_display_grid to LibraryDisplayMode.CompactGrid, + MR.strings.action_display_comfortable_grid to LibraryDisplayMode.ComfortableGrid, + MR.strings.action_display_cover_only_grid to LibraryDisplayMode.CoverOnlyGrid, + MR.strings.action_display_list to LibraryDisplayMode.List, ) @Composable @@ -241,7 +245,7 @@ private fun ColumnScope.DisplayPage( screenModel: LibrarySettingsScreenModel, ) { val displayMode by screenModel.libraryPreferences.displayMode().collectAsState() - SettingsChipRow(R.string.action_display_mode) { + SettingsChipRow(MR.strings.action_display_mode) { displayModes.map { (titleRes, mode) -> FilterChip( selected = displayMode == mode, @@ -263,43 +267,43 @@ private fun ColumnScope.DisplayPage( val columns by columnPreference.collectAsState() SliderItem( - label = stringResource(R.string.pref_library_columns), + label = stringResource(MR.strings.pref_library_columns), max = 10, value = columns, valueText = if (columns > 0) { - stringResource(R.string.pref_library_columns_per_row, columns) + stringResource(MR.strings.pref_library_columns_per_row, columns) } else { - stringResource(R.string.label_default) + stringResource(MR.strings.label_default) }, onChange = columnPreference::set, ) } - HeadingItem(R.string.overlay_header) + HeadingItem(MR.strings.overlay_header) CheckboxItem( - label = stringResource(R.string.action_display_download_badge), + label = stringResource(MR.strings.action_display_download_badge), pref = screenModel.libraryPreferences.downloadBadge(), ) CheckboxItem( - label = stringResource(R.string.action_display_local_badge), + label = stringResource(MR.strings.action_display_local_badge), pref = screenModel.libraryPreferences.localBadge(), ) CheckboxItem( - label = stringResource(R.string.action_display_language_badge), + label = stringResource(MR.strings.action_display_language_badge), pref = screenModel.libraryPreferences.languageBadge(), ) CheckboxItem( - label = stringResource(R.string.action_display_show_continue_reading_button), + label = stringResource(MR.strings.action_display_show_continue_reading_button), pref = screenModel.libraryPreferences.showContinueReadingButton(), ) - HeadingItem(R.string.tabs_header) + HeadingItem(MR.strings.tabs_header) CheckboxItem( - label = stringResource(R.string.action_display_show_tabs), + label = stringResource(MR.strings.action_display_show_tabs), pref = screenModel.libraryPreferences.categoryTabs(), ) CheckboxItem( - label = stringResource(R.string.action_display_show_number_of_items), + label = stringResource(MR.strings.action_display_show_number_of_items), pref = screenModel.libraryPreferences.categoryNumberOfItems(), ) } @@ -307,7 +311,7 @@ private fun ColumnScope.DisplayPage( // SY --> data class GroupMode( val int: Int, - val nameRes: Int, + val nameRes: StringResource, val drawableRes: Int, ) @@ -343,7 +347,7 @@ private fun ColumnScope.GroupPage( LibraryGroup.groupTypeStringRes(it, hasCategories), groupTypeDrawableRes(it), ) - } + }.toImmutableList() } groups.fastForEach { diff --git a/app/src/main/java/eu/kanade/presentation/library/components/LibraryToolbar.kt b/app/src/main/java/eu/kanade/presentation/library/components/LibraryToolbar.kt index ddba36cf7..6d3ad947a 100644 --- a/app/src/main/java/eu/kanade/presentation/library/components/LibraryToolbar.kt +++ b/app/src/main/java/eu/kanade/presentation/library/components/LibraryToolbar.kt @@ -21,6 +21,7 @@ import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.components.SearchToolbar import kotlinx.collections.immutable.persistentListOf import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.Pill import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.theme.active @@ -130,9 +131,9 @@ private fun LibraryRegularToolbar( if (onClickSyncExh != null) { add( AppBar.OverflowAction( - title = stringResource(R.string.sync_favorites), + title = stringResource(SYMR.strings.sync_favorites), onClick = onClickSyncExh, - ) + ), ) } // SY <-- diff --git a/app/src/main/java/eu/kanade/presentation/library/components/StartReadingButton.kt b/app/src/main/java/eu/kanade/presentation/library/components/StartReadingButton.kt deleted file mode 100644 index 059a23160..000000000 --- a/app/src/main/java/eu/kanade/presentation/library/components/StartReadingButton.kt +++ /dev/null @@ -1,57 +0,0 @@ -package eu.kanade.presentation.library.components - -import androidx.compose.foundation.background -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.shape.CircleShape -import androidx.compose.material.Surface -import androidx.compose.material3.Icon -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import eu.kanade.tachiyomi.R - -@Composable -fun StartReadingButton( - modifier: Modifier = Modifier, - onOpenReader: () -> Unit, -) { - Box( - modifier then Modifier - .size(50.dp) - .clip(CircleShape), - contentAlignment = Alignment.Center, - ) { - Box( - Modifier - .size(32.dp) - .clip(CircleShape) - .background(Color(0xAD212121)) - .clickable(onClick = onOpenReader), - ) - Icon( - painter = painterResource(R.drawable.ic_start_reading_24dp), - contentDescription = stringResource(R.string.action_start_reading), - tint = Color.White, - modifier = Modifier - .size(24.dp) - .padding(3.dp), - ) - } -} - -@Preview -@Composable -fun StartReadingPreview() { - Surface { - StartReadingButton {} - } -} diff --git a/app/src/main/java/eu/kanade/presentation/library/components/SyncFavoritesConfirmDialog.kt b/app/src/main/java/eu/kanade/presentation/library/components/SyncFavoritesConfirmDialog.kt index 428485221..637f0cbe8 100644 --- a/app/src/main/java/eu/kanade/presentation/library/components/SyncFavoritesConfirmDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/library/components/SyncFavoritesConfirmDialog.kt @@ -4,9 +4,10 @@ import androidx.compose.material3.AlertDialog import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable -import androidx.compose.ui.res.stringResource import androidx.compose.ui.window.DialogProperties -import eu.kanade.tachiyomi.R +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR +import tachiyomi.presentation.core.i18n.stringResource @Composable fun SyncFavoritesConfirmDialog( @@ -17,19 +18,19 @@ fun SyncFavoritesConfirmDialog( onDismissRequest = onDismissRequest, confirmButton = { TextButton(onClick = onAccept) { - Text(text = stringResource(R.string.action_ok)) + Text(text = stringResource(MR.strings.action_ok)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { - Text(text = stringResource(R.string.action_cancel)) + Text(text = stringResource(MR.strings.action_cancel)) } }, title = { - Text(stringResource(R.string.favorites_sync)) + Text(stringResource(SYMR.strings.favorites_sync)) }, text = { - Text(text = stringResource(R.string.favorites_sync_conformation_message)) + Text(text = stringResource(SYMR.strings.favorites_sync_conformation_message)) }, properties = DialogProperties(dismissOnClickOutside = false), ) diff --git a/app/src/main/java/eu/kanade/presentation/library/components/SyncFavoritesProgressDialog.kt b/app/src/main/java/eu/kanade/presentation/library/components/SyncFavoritesProgressDialog.kt index dc0a2b876..9d76b5ecd 100644 --- a/app/src/main/java/eu/kanade/presentation/library/components/SyncFavoritesProgressDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/library/components/SyncFavoritesProgressDialog.kt @@ -12,10 +12,12 @@ import androidx.compose.runtime.produceState import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.window.DialogProperties -import eu.kanade.tachiyomi.R import exh.favorites.FavoritesSyncStatus import kotlinx.coroutines.delay +import tachiyomi.core.i18n.stringResource import tachiyomi.domain.manga.model.Manga +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import kotlin.time.Duration.Companion.seconds data class SyncFavoritesProgressProperties( @@ -38,42 +40,42 @@ fun SyncFavoritesProgressDialog( val properties by produceState(initialValue = null, status) { when (status) { is FavoritesSyncStatus.BadLibraryState.MangaInMultipleCategories -> value = SyncFavoritesProgressProperties( - title = context.getString(R.string.favorites_sync_error), - text = context.getString(R.string.favorites_sync_bad_library_state, status.message), + title = context.stringResource(SYMR.strings.favorites_sync_error), + text = context.stringResource(SYMR.strings.favorites_sync_bad_library_state, status.message), canDismiss = false, - positiveButtonText = context.getString(R.string.show_gallery), + positiveButtonText = context.stringResource(SYMR.strings.show_gallery), positiveButton = { openManga(status.manga) setStatusIdle() }, - negativeButtonText = context.getString(R.string.action_ok), + negativeButtonText = context.stringResource(MR.strings.action_ok), negativeButton = setStatusIdle, ) is FavoritesSyncStatus.CompleteWithErrors -> value = SyncFavoritesProgressProperties( - title = context.getString(R.string.favorites_sync_done_errors), - text = context.getString(R.string.favorites_sync_done_errors_message, status.message), + title = context.stringResource(SYMR.strings.favorites_sync_done_errors), + text = context.stringResource(SYMR.strings.favorites_sync_done_errors_message, status.message), canDismiss = false, - positiveButtonText = context.getString(R.string.action_ok), + positiveButtonText = context.stringResource(MR.strings.action_ok), positiveButton = setStatusIdle, ) is FavoritesSyncStatus.Error -> value = SyncFavoritesProgressProperties( - title = context.getString(R.string.favorites_sync_error), - text = context.getString(R.string.favorites_sync_error_string, status.message), + title = context.stringResource(SYMR.strings.favorites_sync_error), + text = context.stringResource(SYMR.strings.favorites_sync_error_string, status.message), canDismiss = false, - positiveButtonText = context.getString(R.string.action_ok), + positiveButtonText = context.stringResource(MR.strings.action_ok), positiveButton = setStatusIdle, ) is FavoritesSyncStatus.Idle -> value = null is FavoritesSyncStatus.Initializing, is FavoritesSyncStatus.Processing -> { value = SyncFavoritesProgressProperties( - title = context.getString(R.string.favorites_syncing), + title = context.stringResource(SYMR.strings.favorites_syncing), text = status.message, canDismiss = false, ) if (status is FavoritesSyncStatus.Processing && status.title != null) { delay(5.seconds) value = SyncFavoritesProgressProperties( - title = context.getString(R.string.favorites_syncing), + title = context.stringResource(SYMR.strings.favorites_syncing), text = status.delayedMessage ?: status.message, canDismiss = false, ) diff --git a/app/src/main/java/eu/kanade/presentation/library/components/SyncFavoritesWarningDialog.kt b/app/src/main/java/eu/kanade/presentation/library/components/SyncFavoritesWarningDialog.kt index de8acb082..007da89a8 100644 --- a/app/src/main/java/eu/kanade/presentation/library/components/SyncFavoritesWarningDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/library/components/SyncFavoritesWarningDialog.kt @@ -10,11 +10,13 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import androidx.compose.ui.window.DialogProperties import androidx.core.text.HtmlCompat -import eu.kanade.tachiyomi.R import exh.util.toAnnotatedString +import tachiyomi.core.i18n.stringResource +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR +import tachiyomi.presentation.core.i18n.stringResource @Composable fun SyncFavoritesWarningDialog( @@ -24,19 +26,19 @@ fun SyncFavoritesWarningDialog( val context = LocalContext.current val text = remember { HtmlCompat.fromHtml( - context.getString(R.string.favorites_sync_notes_message), - HtmlCompat.FROM_HTML_MODE_LEGACY + context.stringResource(SYMR.strings.favorites_sync_notes_message), + HtmlCompat.FROM_HTML_MODE_LEGACY, ).toAnnotatedString() } AlertDialog( onDismissRequest = onDismissRequest, confirmButton = { TextButton(onClick = onAccept) { - Text(text = stringResource(R.string.action_ok)) + Text(text = stringResource(MR.strings.action_ok)) } }, title = { - Text(stringResource(R.string.favorites_sync_notes)) + Text(stringResource(SYMR.strings.favorites_sync_notes)) }, text = { Column( diff --git a/app/src/main/java/eu/kanade/presentation/manga/components/MangaBottomActionMenu.kt b/app/src/main/java/eu/kanade/presentation/manga/components/MangaBottomActionMenu.kt index cf98a59f8..bcdf6ff9c 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/components/MangaBottomActionMenu.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/components/MangaBottomActionMenu.kt @@ -52,7 +52,6 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalHapticFeedback -import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp @@ -65,6 +64,9 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.isActive import kotlinx.coroutines.launch +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR +import tachiyomi.presentation.core.i18n.stringResource import kotlin.time.Duration.Companion.seconds @Composable @@ -113,7 +115,7 @@ fun MangaBottomActionMenu( ) { if (onBookmarkClicked != null) { Button( - title = stringResource(R.string.action_bookmark), + title = stringResource(MR.strings.action_bookmark), icon = Icons.Outlined.BookmarkAdd, toConfirm = confirm[0], onLongClick = { onLongClickItem(0) }, @@ -122,7 +124,7 @@ fun MangaBottomActionMenu( } if (onRemoveBookmarkClicked != null) { Button( - title = stringResource(R.string.action_remove_bookmark), + title = stringResource(MR.strings.action_remove_bookmark), icon = Icons.Outlined.BookmarkRemove, toConfirm = confirm[1], onLongClick = { onLongClickItem(1) }, @@ -131,7 +133,7 @@ fun MangaBottomActionMenu( } if (onMarkAsReadClicked != null) { Button( - title = stringResource(R.string.action_mark_as_read), + title = stringResource(MR.strings.action_mark_as_read), icon = Icons.Outlined.DoneAll, toConfirm = confirm[2], onLongClick = { onLongClickItem(2) }, @@ -140,7 +142,7 @@ fun MangaBottomActionMenu( } if (onMarkAsUnreadClicked != null) { Button( - title = stringResource(R.string.action_mark_as_unread), + title = stringResource(MR.strings.action_mark_as_unread), icon = Icons.Outlined.RemoveDone, toConfirm = confirm[3], onLongClick = { onLongClickItem(3) }, @@ -149,7 +151,7 @@ fun MangaBottomActionMenu( } if (onMarkPreviousAsReadClicked != null) { Button( - title = stringResource(R.string.action_mark_previous_as_read), + title = stringResource(MR.strings.action_mark_previous_as_read), icon = ImageVector.vectorResource(R.drawable.ic_done_prev_24dp), toConfirm = confirm[4], onLongClick = { onLongClickItem(4) }, @@ -158,7 +160,7 @@ fun MangaBottomActionMenu( } if (onDownloadClicked != null) { Button( - title = stringResource(R.string.action_download), + title = stringResource(MR.strings.action_download), icon = Icons.Outlined.Download, toConfirm = confirm[5], onLongClick = { onLongClickItem(5) }, @@ -167,7 +169,7 @@ fun MangaBottomActionMenu( } if (onDeleteClicked != null) { Button( - title = stringResource(R.string.action_delete), + title = stringResource(MR.strings.action_delete), icon = Icons.Outlined.Delete, toConfirm = confirm[6], onLongClick = { onLongClickItem(6) }, @@ -276,7 +278,7 @@ fun LibraryBottomActionMenu( .padding(horizontal = 8.dp, vertical = 12.dp), ) { Button( - title = stringResource(R.string.action_move_category), + title = stringResource(MR.strings.action_move_category), icon = Icons.AutoMirrored.Outlined.Label, toConfirm = confirm[0], onLongClick = { onLongClickItem(0) }, @@ -285,7 +287,7 @@ fun LibraryBottomActionMenu( if (onDownloadClicked != null) { var downloadExpanded by remember { mutableStateOf(false) } Button( - title = stringResource(R.string.action_download), + title = stringResource(MR.strings.action_download), icon = Icons.Outlined.Download, toConfirm = confirm[3], onLongClick = { onLongClickItem(3) }, @@ -300,7 +302,7 @@ fun LibraryBottomActionMenu( } } Button( - title = stringResource(R.string.action_delete), + title = stringResource(MR.strings.action_delete), icon = Icons.Outlined.Delete, toConfirm = confirm[4], onLongClick = { onLongClickItem(4) }, @@ -308,7 +310,7 @@ fun LibraryBottomActionMenu( ) // SY --> Button( - title = stringResource(R.string.action_mark_as_read), + title = stringResource(MR.strings.action_mark_as_read), icon = Icons.Outlined.DoneAll, toConfirm = confirm[1], onLongClick = { onLongClickItem(1) }, @@ -317,7 +319,7 @@ fun LibraryBottomActionMenu( if (showOverflow) { if (!moveMarkPrev) { Button( - title = stringResource(R.string.action_mark_as_unread), + title = stringResource(MR.strings.action_mark_as_unread), icon = Icons.Outlined.RemoveDone, toConfirm = confirm[2], onLongClick = { onLongClickItem(2) }, @@ -325,7 +327,7 @@ fun LibraryBottomActionMenu( ) } Button( - title = stringResource(R.string.label_more), + title = stringResource(MR.strings.label_more), icon = Icons.Outlined.MoreVert, toConfirm = confirm[5], onLongClick = { onLongClickItem(5) }, @@ -337,32 +339,32 @@ fun LibraryBottomActionMenu( ) { if (moveMarkPrev) { DropdownMenuItem( - text = { Text(stringResource(R.string.action_mark_as_unread)) }, + text = { Text(stringResource(MR.strings.action_mark_as_unread)) }, onClick = onMarkAsUnreadClicked, ) } if (onClickCleanTitles != null) { DropdownMenuItem( - text = { Text(stringResource(R.string.action_clean_titles)) }, + text = { Text(stringResource(SYMR.strings.action_clean_titles)) }, onClick = onClickCleanTitles, ) } if (onClickMigrate != null) { DropdownMenuItem( - text = { Text(stringResource(R.string.migrate)) }, + text = { Text(stringResource(MR.strings.migrate)) }, onClick = onClickMigrate, ) } if (onClickAddToMangaDex != null) { DropdownMenuItem( - text = { Text(stringResource(R.string.mangadex_add_to_follows)) }, + text = { Text(stringResource(SYMR.strings.mangadex_add_to_follows)) }, onClick = onClickAddToMangaDex, ) } } } else { Button( - title = stringResource(R.string.action_mark_as_unread), + title = stringResource(MR.strings.action_mark_as_unread), icon = Icons.Outlined.RemoveDone, toConfirm = confirm[2], onLongClick = { onLongClickItem(2) }, @@ -370,7 +372,7 @@ fun LibraryBottomActionMenu( ) if (onClickMigrate != null) { Button( - title = stringResource(R.string.migrate), + title = stringResource(MR.strings.migrate), icon = Icons.Outlined.SwapCalls, toConfirm = confirm[5], onLongClick = { onLongClickItem(5) }, diff --git a/app/src/main/java/eu/kanade/presentation/manga/components/MangaChapterListItem.kt b/app/src/main/java/eu/kanade/presentation/manga/components/MangaChapterListItem.kt index 43a93af3f..7aed6409b 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/components/MangaChapterListItem.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/components/MangaChapterListItem.kt @@ -189,7 +189,9 @@ fun MangaChapterListItem( readProgress != null || scanlator != null/* SY --> */ || sourceName != null/* SY <-- */ - ) DotSeparatorText() + ) { + DotSeparatorText() + } } if (readProgress != null) { Text( diff --git a/app/src/main/java/eu/kanade/presentation/manga/components/MangaDialogs.kt b/app/src/main/java/eu/kanade/presentation/manga/components/MangaDialogs.kt index d9e2e1d71..268928ebb 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/components/MangaDialogs.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/components/MangaDialogs.kt @@ -2,28 +2,23 @@ package eu.kanade.presentation.manga.components import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material3.AlertDialog import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf -import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue -import androidx.compose.runtime.toMutableStateList import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.DpSize import androidx.compose.ui.unit.dp -import androidx.compose.ui.window.DialogProperties -import eu.kanade.tachiyomi.R import kotlinx.collections.immutable.toImmutableList import tachiyomi.domain.manga.interactor.FetchInterval -import tachiyomi.presentation.core.components.LabeledCheckbox +import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.WheelTextPicker +import tachiyomi.presentation.core.i18n.stringResource @Composable fun DeleteChaptersDialog( @@ -34,7 +29,7 @@ fun DeleteChaptersDialog( onDismissRequest = onDismissRequest, dismissButton = { TextButton(onClick = onDismissRequest) { - Text(text = stringResource(R.string.action_cancel)) + Text(text = stringResource(MR.strings.action_cancel)) } }, confirmButton = { @@ -44,14 +39,14 @@ fun DeleteChaptersDialog( onConfirm() }, ) { - Text(text = stringResource(R.string.action_ok)) + Text(text = stringResource(MR.strings.action_ok)) } }, title = { - Text(text = stringResource(R.string.are_you_sure)) + Text(text = stringResource(MR.strings.are_you_sure)) }, text = { - Text(text = stringResource(R.string.confirm_delete_chapters)) + Text(text = stringResource(MR.strings.confirm_delete_chapters)) }, ) } @@ -66,7 +61,7 @@ fun SetIntervalDialog( AlertDialog( onDismissRequest = onDismissRequest, - title = { Text(text = stringResource(R.string.manga_modify_calculated_interval_title)) }, + title = { Text(text = stringResource(MR.strings.manga_modify_calculated_interval_title)) }, text = { BoxWithConstraints( modifier = Modifier.fillMaxWidth(), @@ -76,7 +71,7 @@ fun SetIntervalDialog( val items = (0..FetchInterval.MAX_INTERVAL) .map { if (it == 0) { - stringResource(R.string.label_default) + stringResource(MR.strings.label_default) } else { it.toString() } @@ -92,7 +87,7 @@ fun SetIntervalDialog( }, dismissButton = { TextButton(onClick = onDismissRequest) { - Text(text = stringResource(R.string.action_cancel)) + Text(text = stringResource(MR.strings.action_cancel)) } }, confirmButton = { @@ -100,68 +95,8 @@ fun SetIntervalDialog( onValueChanged(selectedInterval) onDismissRequest() }) { - Text(text = stringResource(R.string.action_ok)) + Text(text = stringResource(MR.strings.action_ok)) } }, ) } - -// SY --> -@Composable -fun SelectScanlatorsDialog( - onDismissRequest: () -> Unit, - availableScanlators: List, - initialSelectedScanlators: List, - onSelectScanlators: (List) -> Unit, -) { - val selected = remember { - initialSelectedScanlators.toMutableStateList() - } - AlertDialog( - onDismissRequest = onDismissRequest, - title = { Text(text = stringResource(R.string.select_scanlators)) }, - text = { - LazyColumn { - availableScanlators.forEach { current -> - item { - val isSelected = selected.contains(current) - LabeledCheckbox( - label = current, - checked = isSelected, - onCheckedChange = { - when (it) { - true -> selected.add(current) - false -> selected.remove(current) - } - }, - ) - } - } - } - }, - properties = DialogProperties( - usePlatformDefaultWidth = true, - ), - confirmButton = { - TextButton( - onClick = { - onSelectScanlators(selected.toList()) - onDismissRequest() - }, - ) { - Text(text = stringResource(R.string.action_ok)) - } - }, - dismissButton = { - TextButton( - onClick = { - onSelectScanlators(availableScanlators) - onDismissRequest() - }, - ) { - Text(text = stringResource(R.string.action_reset)) - } - }, - ) -} -// SY <-- diff --git a/app/src/main/java/eu/kanade/presentation/manga/components/MangaInfoButtons.kt b/app/src/main/java/eu/kanade/presentation/manga/components/MangaInfoButtons.kt index 3a99fd208..66f75c553 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/components/MangaInfoButtons.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/components/MangaInfoButtons.kt @@ -6,10 +6,10 @@ import androidx.compose.foundation.layout.padding import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import eu.kanade.tachiyomi.R +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.material.Button +import tachiyomi.presentation.core.i18n.stringResource @Composable fun MangaInfoButtons( @@ -27,7 +27,7 @@ fun MangaInfoButtons( .fillMaxWidth() .padding(horizontal = 16.dp, vertical = 4.dp), ) { - Text(stringResource(R.string.merge_with_another_source)) + Text(stringResource(SYMR.strings.merge_with_another_source)) } } if (showRecommendsButton) { @@ -37,7 +37,7 @@ fun MangaInfoButtons( .fillMaxWidth() .padding(horizontal = 16.dp, vertical = 4.dp), ) { - Text(stringResource(R.string.az_recommends)) + Text(stringResource(SYMR.strings.az_recommends)) } } } diff --git a/app/src/main/java/eu/kanade/presentation/manga/components/MangaInfoHeader.kt b/app/src/main/java/eu/kanade/presentation/manga/components/MangaInfoHeader.kt index e6ed97e90..53499e32b 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/components/MangaInfoHeader.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/components/MangaInfoHeader.kt @@ -23,6 +23,7 @@ import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.items import androidx.compose.foundation.text.selection.SelectionContainer import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.CallMerge import androidx.compose.material.icons.filled.Brush import androidx.compose.material.icons.filled.Favorite import androidx.compose.material.icons.filled.HourglassEmpty @@ -78,6 +79,7 @@ import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.util.system.copyToClipboard import tachiyomi.domain.manga.model.Manga import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.material.TextButton import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.pluralStringResource @@ -226,8 +228,8 @@ fun MangaActionRow( // SY --> if (onMergeClicked != null) { MangaActionButton( - title = stringResource(R.string.merge), - icon = Icons.Outlined.CallMerge, + title = stringResource(SYMR.strings.merge), + icon = Icons.AutoMirrored.Outlined.CallMerge, color = defaultActionButtonColor, onClick = onMergeClicked, ) @@ -292,7 +294,7 @@ fun ExpandableMangaDescription( ) // SY --> DropdownMenuItem( - text = { Text(text = stringResource(R.string.action_global_search)) }, + text = { Text(text = stringResource(MR.strings.action_global_search)) }, onClick = { doSearch(tagSelected, true) showMenu = false diff --git a/app/src/main/java/eu/kanade/presentation/manga/components/MangaToolbar.kt b/app/src/main/java/eu/kanade/presentation/manga/components/MangaToolbar.kt index 87c9ca2bf..a410fdb3a 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/components/MangaToolbar.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/components/MangaToolbar.kt @@ -30,6 +30,7 @@ import eu.kanade.presentation.components.UpIcon import eu.kanade.presentation.manga.DownloadAction import kotlinx.collections.immutable.persistentListOf import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.theme.active @@ -158,7 +159,7 @@ fun MangaToolbar( if (onClickMerge != null) { add( AppBar.OverflowAction( - title = stringResource(R.string.merge), + title = stringResource(SYMR.strings.merge), onClick = onClickMerge, ), ) @@ -166,7 +167,7 @@ fun MangaToolbar( if (onClickEditInfo != null) { add( AppBar.OverflowAction( - title = stringResource(R.string.action_edit_info), + title = stringResource(SYMR.strings.action_edit_info), onClick = onClickEditInfo, ), ) @@ -174,7 +175,7 @@ fun MangaToolbar( if (onClickRecommend != null) { add( AppBar.OverflowAction( - title = stringResource(R.string.az_recommends), + title = stringResource(SYMR.strings.az_recommends), onClick = onClickRecommend, ), ) @@ -182,7 +183,7 @@ fun MangaToolbar( if (onClickMergedSettings != null) { add( AppBar.OverflowAction( - title = stringResource(R.string.merge_settings), + title = stringResource(SYMR.strings.merge_settings), onClick = onClickMergedSettings, ), ) diff --git a/app/src/main/java/eu/kanade/presentation/manga/components/PagePreviews.kt b/app/src/main/java/eu/kanade/presentation/manga/components/PagePreviews.kt index ec3f35be9..6419d2fdf 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/components/PagePreviews.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/components/PagePreviews.kt @@ -26,16 +26,16 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.onGloballyPositioned import androidx.compose.ui.platform.LocalDensity -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import coil.compose.SubcomposeAsyncImage import coil.compose.SubcomposeAsyncImageContent import eu.kanade.domain.manga.model.PagePreview -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.manga.PagePreviewState import exh.util.floor +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.material.padding +import tachiyomi.presentation.core.i18n.stringResource @Composable fun PagePreviews( @@ -91,7 +91,7 @@ fun PagePreviews( } } TextButton(onClick = onMorePreviewsClicked) { - Text(stringResource(R.string.more_previews)) + Text(stringResource(SYMR.strings.more_previews)) } } } @@ -122,7 +122,9 @@ fun PagePreview( if (progress < 0) { CircularProgressIndicator() } else { - CircularProgressIndicator(progress / 0.01F) + CircularProgressIndicator( + progress = { progress / 0.01F }, + ) } } }, diff --git a/app/src/main/java/eu/kanade/presentation/manga/components/ScanlatorFilterDialog.kt b/app/src/main/java/eu/kanade/presentation/manga/components/ScanlatorFilterDialog.kt index d7c46e90d..497e66907 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/components/ScanlatorFilterDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/components/ScanlatorFilterDialog.kt @@ -27,6 +27,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.unit.dp import androidx.compose.ui.window.DialogProperties +import kotlinx.collections.immutable.ImmutableSet import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.TextButton import tachiyomi.presentation.core.components.material.padding @@ -36,8 +37,8 @@ import tachiyomi.presentation.core.util.isScrolledToStart @Composable fun ScanlatorFilterDialog( - availableScanlators: Set, - excludedScanlators: Set, + availableScanlators: ImmutableSet, + excludedScanlators: ImmutableSet, onDismissRequest: () -> Unit, onConfirm: (Set) -> Unit, ) { diff --git a/app/src/main/java/eu/kanade/presentation/more/MoreScreen.kt b/app/src/main/java/eu/kanade/presentation/more/MoreScreen.kt index 036eb3db8..8fc8a7af0 100644 --- a/app/src/main/java/eu/kanade/presentation/more/MoreScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/MoreScreen.kt @@ -11,6 +11,7 @@ import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.HelpOutline import androidx.compose.material.icons.automirrored.outlined.Label +import androidx.compose.material.icons.automirrored.outlined.PlaylistAdd import androidx.compose.material.icons.outlined.CloudOff import androidx.compose.material.icons.outlined.GetApp import androidx.compose.material.icons.outlined.HelpOutline @@ -27,8 +28,6 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalUriHandler -import androidx.compose.ui.res.pluralStringResource -import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource import eu.kanade.presentation.components.WarningBanner import eu.kanade.presentation.more.settings.widget.SwitchPreferenceWidget @@ -36,8 +35,12 @@ import eu.kanade.presentation.more.settings.widget.TextPreferenceWidget import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.more.DownloadQueueState import tachiyomi.core.Constants +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.ScrollbarLazyColumn import tachiyomi.presentation.core.components.material.Scaffold +import tachiyomi.presentation.core.i18n.pluralStringResource +import tachiyomi.presentation.core.i18n.stringResource @Composable fun MoreScreen( @@ -72,7 +75,7 @@ fun MoreScreen( ) { if (isFDroid) { WarningBanner( - textRes = R.string.fdroid_warning, + textRes = MR.strings.fdroid_warning, modifier = Modifier.clickable { uriHandler.openUri( "https://tachiyomi.org/docs/faq/general#how-do-i-update-from-the-f-droid-builds", @@ -91,8 +94,8 @@ fun MoreScreen( } item { SwitchPreferenceWidget( - title = stringResource(R.string.label_downloaded_only), - subtitle = stringResource(R.string.downloaded_only_summary), + title = stringResource(MR.strings.label_downloaded_only), + subtitle = stringResource(MR.strings.downloaded_only_summary), icon = Icons.Outlined.CloudOff, checked = downloadedOnly, onCheckedChanged = onDownloadedOnlyChange, @@ -100,8 +103,8 @@ fun MoreScreen( } item { SwitchPreferenceWidget( - title = stringResource(R.string.pref_incognito_mode), - subtitle = stringResource(R.string.pref_incognito_mode_summary), + title = stringResource(MR.strings.pref_incognito_mode), + subtitle = stringResource(MR.strings.pref_incognito_mode_summary), icon = ImageVector.vectorResource(R.drawable.ic_glasses_24dp), checked = incognitoMode, onCheckedChanged = onIncognitoModeChange, @@ -114,7 +117,7 @@ fun MoreScreen( if (!showNavUpdates) { item { TextPreferenceWidget( - title = stringResource(R.string.label_recent_updates), + title = stringResource(MR.strings.label_recent_updates), icon = Icons.Outlined.NewReleases, onPreferenceClick = onClickUpdates, ) @@ -123,7 +126,7 @@ fun MoreScreen( if (!showNavHistory) { item { TextPreferenceWidget( - title = stringResource(R.string.label_recent_manga), + title = stringResource(MR.strings.label_recent_manga), icon = Icons.Outlined.History, onPreferenceClick = onClickHistory, ) @@ -134,17 +137,17 @@ fun MoreScreen( item { val downloadQueueState = downloadQueueStateProvider() TextPreferenceWidget( - title = stringResource(R.string.label_download_queue), + title = stringResource(MR.strings.label_download_queue), subtitle = when (downloadQueueState) { DownloadQueueState.Stopped -> null is DownloadQueueState.Paused -> { val pending = downloadQueueState.pending if (pending == 0) { - stringResource(R.string.paused) + stringResource(MR.strings.paused) } else { - "${stringResource(R.string.paused)} • ${ + "${stringResource(MR.strings.paused)} • ${ pluralStringResource( - id = R.plurals.download_queue_summary, + MR.plurals.download_queue_summary, count = pending, pending, ) @@ -153,7 +156,7 @@ fun MoreScreen( } is DownloadQueueState.Downloading -> { val pending = downloadQueueState.pending - pluralStringResource(id = R.plurals.download_queue_summary, count = pending, pending) + pluralStringResource(MR.plurals.download_queue_summary, count = pending, pending) } }, icon = Icons.Outlined.GetApp, @@ -162,21 +165,21 @@ fun MoreScreen( } item { TextPreferenceWidget( - title = stringResource(R.string.categories), + title = stringResource(MR.strings.categories), icon = Icons.AutoMirrored.Outlined.Label, onPreferenceClick = onClickCategories, ) } item { TextPreferenceWidget( - title = stringResource(R.string.label_stats), + title = stringResource(MR.strings.label_stats), icon = Icons.Outlined.QueryStats, onPreferenceClick = onClickStats, ) } item { TextPreferenceWidget( - title = stringResource(R.string.label_data_storage), + title = stringResource(MR.strings.label_data_storage), icon = Icons.Outlined.Storage, onPreferenceClick = onClickDataAndStorage, ) @@ -184,8 +187,8 @@ fun MoreScreen( // SY --> item { TextPreferenceWidget( - title = stringResource(R.string.eh_batch_add), - icon = Icons.Outlined.PlaylistAdd, + title = stringResource(SYMR.strings.eh_batch_add), + icon = Icons.AutoMirrored.Outlined.PlaylistAdd, onPreferenceClick = onClickBatchAdd, ) } @@ -195,21 +198,21 @@ fun MoreScreen( item { TextPreferenceWidget( - title = stringResource(R.string.label_settings), + title = stringResource(MR.strings.label_settings), icon = Icons.Outlined.Settings, onPreferenceClick = onClickSettings, ) } item { TextPreferenceWidget( - title = stringResource(R.string.pref_category_about), + title = stringResource(MR.strings.pref_category_about), icon = Icons.Outlined.Info, onPreferenceClick = onClickAbout, ) } item { TextPreferenceWidget( - title = stringResource(R.string.label_help), + title = stringResource(MR.strings.label_help), icon = Icons.AutoMirrored.Outlined.HelpOutline, onPreferenceClick = { uriHandler.openUri(Constants.URL_HELP) }, ) diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/ConfigureExhDialog.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/ConfigureExhDialog.kt index 225c64606..d4fd5784c 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/ConfigureExhDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/ConfigureExhDialog.kt @@ -10,9 +10,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import androidx.compose.ui.window.DialogProperties -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.util.system.toast import exh.log.xLogE import exh.uconfig.EHConfigurator @@ -22,6 +20,9 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.withContext import tachiyomi.core.util.lang.launchUI import tachiyomi.domain.UnsortedPreferences +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR +import tachiyomi.presentation.core.i18n.stringResource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import kotlin.time.Duration.Companion.seconds @@ -61,14 +62,14 @@ fun ConfigureExhDialog(run: Boolean, onRunning: () -> Unit) { warnDialogOpen = false }, ) { - Text(text = stringResource(R.string.action_ok)) + Text(text = stringResource(MR.strings.action_ok)) } }, title = { - Text(text = stringResource(R.string.settings_profile_note)) + Text(text = stringResource(SYMR.strings.settings_profile_note)) }, text = { - Text(text = stringResource(R.string.settings_profile_note_message)) + Text(text = stringResource(SYMR.strings.settings_profile_note_message)) }, ) } @@ -80,7 +81,7 @@ fun ConfigureExhDialog(run: Boolean, onRunning: () -> Unit) { delay(0.2.seconds) EHConfigurator(context).configureAll() launchUI { - context.toast(R.string.eh_settings_successfully_uploaded) + context.toast(SYMR.strings.eh_settings_successfully_uploaded) } } catch (e: Exception) { configureFailedDialogOpen = e @@ -98,10 +99,10 @@ fun ConfigureExhDialog(run: Boolean, onRunning: () -> Unit) { ), confirmButton = {}, title = { - Text(text = stringResource(R.string.eh_settings_uploading_to_server)) + Text(text = stringResource(SYMR.strings.eh_settings_uploading_to_server)) }, text = { - Text(text = stringResource(R.string.eh_settings_uploading_to_server_message)) + Text(text = stringResource(SYMR.strings.eh_settings_uploading_to_server_message)) }, ) } @@ -110,18 +111,18 @@ fun ConfigureExhDialog(run: Boolean, onRunning: () -> Unit) { onDismissRequest = { configureFailedDialogOpen = null }, confirmButton = { TextButton(onClick = { configureFailedDialogOpen = null }) { - Text(text = stringResource(R.string.action_ok)) + Text(text = stringResource(MR.strings.action_ok)) } }, title = { - Text(text = stringResource(R.string.eh_settings_configuration_failed)) + Text(text = stringResource(SYMR.strings.eh_settings_configuration_failed)) }, text = { Text( text = stringResource( - R.string.eh_settings_configuration_failed_message, - configureFailedDialogOpen?.message.orEmpty() - ) + SYMR.strings.eh_settings_configuration_failed_message, + configureFailedDialogOpen?.message.orEmpty(), + ), ) }, ) diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAdvancedScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAdvancedScreen.kt index 490e6fb0b..ef9e7c439 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAdvancedScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAdvancedScreen.kt @@ -8,7 +8,6 @@ import android.provider.Settings import android.webkit.WebStorage import android.webkit.WebView import android.widget.Toast -import androidx.annotation.StringRes import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material3.AlertDialog import androidx.compose.material3.Text @@ -24,7 +23,6 @@ import androidx.compose.runtime.setValue import androidx.compose.runtime.toMutableStateList import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalUriHandler -import androidx.compose.ui.res.stringResource import androidx.compose.ui.window.DialogProperties import androidx.core.net.toUri import androidx.core.text.HtmlCompat @@ -73,6 +71,8 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.launch import logcat.LogPriority import okhttp3.Headers +import tachiyomi.core.i18n.pluralStringResource +import tachiyomi.core.i18n.stringResource import tachiyomi.core.util.lang.launchNonCancellable import tachiyomi.core.util.lang.withUIContext import tachiyomi.core.util.system.logcat @@ -81,7 +81,10 @@ import tachiyomi.domain.chapter.interactor.GetChaptersByMangaId import tachiyomi.domain.manga.interactor.GetAllManga import tachiyomi.domain.manga.interactor.ResetViewerFlags import tachiyomi.domain.source.service.SourceManager +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.LabeledCheckbox +import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.collectAsState import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -91,8 +94,7 @@ object SettingsAdvancedScreen : SearchableSettings { @ReadOnlyComposable @Composable - @StringRes - override fun getTitleRes() = R.string.pref_category_advanced + override fun getTitleRes() = MR.strings.pref_category_advanced @Composable override fun getPreferences(): List { @@ -108,13 +110,13 @@ object SettingsAdvancedScreen : SearchableSettings { listOf( /* SY --> Preference.PreferenceItem.SwitchPreference( pref = basePreferences.acraEnabled(), - title = stringResource(R.string.pref_enable_acra), - subtitle = stringResource(R.string.pref_acra_summary), + title = stringResource(MR.strings.pref_enable_acra), + subtitle = stringResource(MR.strings.pref_acra_summary), enabled = isPreviewBuildType || isReleaseBuildType, ), SY <-- */ Preference.PreferenceItem.TextPreference( - title = stringResource(R.string.pref_dump_crash_logs), - subtitle = stringResource(R.string.pref_dump_crash_logs_summary), + title = stringResource(MR.strings.pref_dump_crash_logs), + subtitle = stringResource(MR.strings.pref_dump_crash_logs_summary), onClick = { scope.launch { CrashLogUtil(context).dumpLogs() @@ -123,15 +125,15 @@ object SettingsAdvancedScreen : SearchableSettings { ), /* SY --> Preference.PreferenceItem.SwitchPreference( pref = networkPreferences.verboseLogging(), - title = stringResource(R.string.pref_verbose_logging), - subtitle = stringResource(R.string.pref_verbose_logging_summary), + title = stringResource(MR.strings.pref_verbose_logging), + subtitle = stringResource(MR.strings.pref_verbose_logging_summary), onValueChanged = { - context.toast(R.string.requires_app_restart) + context.toast(MR.strings.requires_app_restart) true }, ), SY <-- */ Preference.PreferenceItem.TextPreference( - title = stringResource(R.string.pref_debug_info), + title = stringResource(MR.strings.pref_debug_info), onClick = { navigator.push(DebugInfoScreen()) }, ), ), @@ -139,7 +141,7 @@ object SettingsAdvancedScreen : SearchableSettings { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { add( Preference.PreferenceItem.TextPreference( - title = stringResource(R.string.pref_manage_notifications), + title = stringResource(MR.strings.pref_manage_notifications), onClick = { val intent = Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS).apply { putExtra(Settings.EXTRA_APP_PACKAGE, context.packageName) @@ -172,11 +174,11 @@ object SettingsAdvancedScreen : SearchableSettings { val uriHandler = LocalUriHandler.current return Preference.PreferenceGroup( - title = stringResource(R.string.label_background_activity), + title = stringResource(MR.strings.label_background_activity), preferenceItems = listOf( Preference.PreferenceItem.TextPreference( - title = stringResource(R.string.pref_disable_battery_optimization), - subtitle = stringResource(R.string.pref_disable_battery_optimization_summary), + title = stringResource(MR.strings.pref_disable_battery_optimization), + subtitle = stringResource(MR.strings.pref_disable_battery_optimization_summary), onClick = { val packageName: String = context.packageName if (!context.powerManager.isIgnoringBatteryOptimizations(packageName)) { @@ -189,16 +191,16 @@ object SettingsAdvancedScreen : SearchableSettings { } context.startActivity(intent) } catch (e: ActivityNotFoundException) { - context.toast(R.string.battery_optimization_setting_activity_not_found) + context.toast(MR.strings.battery_optimization_setting_activity_not_found) } } else { - context.toast(R.string.battery_optimization_disabled) + context.toast(MR.strings.battery_optimization_disabled) } }, ), Preference.PreferenceItem.TextPreference( title = "Don't kill my app!", - subtitle = stringResource(R.string.about_dont_kill_my_app), + subtitle = stringResource(MR.strings.about_dont_kill_my_app), onClick = { uriHandler.openUri("https://dontkillmyapp.com/") }, ), ), @@ -211,19 +213,19 @@ object SettingsAdvancedScreen : SearchableSettings { val navigator = LocalNavigator.currentOrThrow return Preference.PreferenceGroup( - title = stringResource(R.string.label_data), + title = stringResource(MR.strings.label_data), preferenceItems = listOf( Preference.PreferenceItem.TextPreference( - title = stringResource(R.string.pref_invalidate_download_cache), - subtitle = stringResource(R.string.pref_invalidate_download_cache_summary), + title = stringResource(MR.strings.pref_invalidate_download_cache), + subtitle = stringResource(MR.strings.pref_invalidate_download_cache_summary), onClick = { Injekt.get().invalidateCache() - context.toast(R.string.download_cache_invalidated) + context.toast(MR.strings.download_cache_invalidated) }, ), Preference.PreferenceItem.TextPreference( - title = stringResource(R.string.pref_clear_database), - subtitle = stringResource(R.string.pref_clear_database_summary), + title = stringResource(MR.strings.pref_clear_database), + subtitle = stringResource(MR.strings.pref_clear_database_summary), onClick = { navigator.push(ClearDatabaseScreen()) }, ), ), @@ -241,17 +243,17 @@ object SettingsAdvancedScreen : SearchableSettings { val userAgent by userAgentPref.collectAsState() return Preference.PreferenceGroup( - title = stringResource(R.string.label_network), + title = stringResource(MR.strings.label_network), preferenceItems = listOf( Preference.PreferenceItem.TextPreference( - title = stringResource(R.string.pref_clear_cookies), + title = stringResource(MR.strings.pref_clear_cookies), onClick = { networkHelper.cookieJar.removeAll() - context.toast(R.string.cookies_cleared) + context.toast(MR.strings.cookies_cleared) }, ), Preference.PreferenceItem.TextPreference( - title = stringResource(R.string.pref_clear_webview_data), + title = stringResource(MR.strings.pref_clear_webview_data), onClick = { try { WebView(context).run { @@ -265,18 +267,18 @@ object SettingsAdvancedScreen : SearchableSettings { context.applicationInfo?.dataDir?.let { File("$it/app_webview/").deleteRecursively() } - context.toast(R.string.webview_data_deleted) + context.toast(MR.strings.webview_data_deleted) } catch (e: Throwable) { logcat(LogPriority.ERROR, e) - context.toast(R.string.cache_delete_error) + context.toast(MR.strings.cache_delete_error) } }, ), Preference.PreferenceItem.ListPreference( pref = networkPreferences.dohProvider(), - title = stringResource(R.string.pref_dns_over_https), + title = stringResource(MR.strings.pref_dns_over_https), entries = mapOf( - -1 to stringResource(R.string.disabled), + -1 to stringResource(MR.strings.disabled), PREF_DOH_CLOUDFLARE to "Cloudflare", PREF_DOH_GOOGLE to "Google", PREF_DOH_ADGUARD to "AdGuard", @@ -291,30 +293,30 @@ object SettingsAdvancedScreen : SearchableSettings { PREF_DOH_SHECAN to "Shecan", ), onValueChanged = { - context.toast(R.string.requires_app_restart) + context.toast(MR.strings.requires_app_restart) true }, ), Preference.PreferenceItem.EditTextPreference( pref = userAgentPref, - title = stringResource(R.string.pref_user_agent_string), + title = stringResource(MR.strings.pref_user_agent_string), onValueChanged = { try { // OkHttp checks for valid values internally Headers.Builder().add("User-Agent", it) } catch (_: IllegalArgumentException) { - context.toast(R.string.error_user_agent_string_invalid) + context.toast(MR.strings.error_user_agent_string_invalid) return@EditTextPreference false } true }, ), Preference.PreferenceItem.TextPreference( - title = stringResource(R.string.pref_reset_user_agent_string), + title = stringResource(MR.strings.pref_reset_user_agent_string), enabled = remember(userAgent) { userAgent != userAgentPref.defaultValue() }, onClick = { userAgentPref.delete() - context.toast(R.string.requires_app_restart) + context.toast(MR.strings.requires_app_restart) }, ), ), @@ -327,23 +329,23 @@ object SettingsAdvancedScreen : SearchableSettings { val context = LocalContext.current return Preference.PreferenceGroup( - title = stringResource(R.string.label_library), + title = stringResource(MR.strings.label_library), preferenceItems = listOf( Preference.PreferenceItem.TextPreference( - title = stringResource(R.string.pref_refresh_library_covers), + title = stringResource(MR.strings.pref_refresh_library_covers), onClick = { LibraryUpdateJob.startNow(context, target = LibraryUpdateJob.Target.COVERS) }, ), Preference.PreferenceItem.TextPreference( - title = stringResource(R.string.pref_reset_viewer_flags), - subtitle = stringResource(R.string.pref_reset_viewer_flags_summary), + title = stringResource(MR.strings.pref_reset_viewer_flags), + subtitle = stringResource(MR.strings.pref_reset_viewer_flags_summary), onClick = { scope.launchNonCancellable { val success = Injekt.get().await() withUIContext { val message = if (success) { - R.string.pref_reset_viewer_flags_success + MR.strings.pref_reset_viewer_flags_success } else { - R.string.pref_reset_viewer_flags_error + MR.strings.pref_reset_viewer_flags_error } context.toast(message) } @@ -367,11 +369,11 @@ object SettingsAdvancedScreen : SearchableSettings { val dismiss = { shizukuMissing = false } AlertDialog( onDismissRequest = dismiss, - title = { Text(text = stringResource(R.string.ext_installer_shizuku)) }, - text = { Text(text = stringResource(R.string.ext_installer_shizuku_unavailable_dialog)) }, + title = { Text(text = stringResource(MR.strings.ext_installer_shizuku)) }, + text = { Text(text = stringResource(MR.strings.ext_installer_shizuku_unavailable_dialog)) }, dismissButton = { TextButton(onClick = dismiss) { - Text(text = stringResource(R.string.action_cancel)) + Text(text = stringResource(MR.strings.action_cancel)) } }, confirmButton = { @@ -381,19 +383,19 @@ object SettingsAdvancedScreen : SearchableSettings { uriHandler.openUri("https://shizuku.rikka.app/download") }, ) { - Text(text = stringResource(R.string.action_ok)) + Text(text = stringResource(MR.strings.action_ok)) } }, ) } return Preference.PreferenceGroup( - title = stringResource(R.string.label_extensions), + title = stringResource(MR.strings.label_extensions), preferenceItems = listOf( Preference.PreferenceItem.ListPreference( pref = extensionInstallerPref, - title = stringResource(R.string.ext_installer_pref), + title = stringResource(MR.strings.ext_installer_pref), entries = extensionInstallerPref.entries - .associateWith { stringResource(it.titleResId) }, + .associateWith { stringResource(it.titleRes) }, onValueChanged = { if (it == BasePreferences.ExtensionInstaller.SHIZUKU && !context.isShizukuInstalled @@ -422,7 +424,7 @@ object SettingsAdvancedScreen : SearchableSettings { } AlertDialog( onDismissRequest = onDismissRequest, - title = { Text(text = stringResource(R.string.clean_up_downloaded_chapters)) }, + title = { Text(text = stringResource(SYMR.strings.clean_up_downloaded_chapters)) }, text = { LazyColumn { options.forEachIndexed { index, option -> @@ -452,12 +454,12 @@ object SettingsAdvancedScreen : SearchableSettings { onCleanupDownloads(removeRead, removeNonFavorite) }, ) { - Text(text = stringResource(R.string.action_ok)) + Text(text = stringResource(MR.strings.action_ok)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { - Text(text = stringResource(R.string.action_cancel)) + Text(text = stringResource(MR.strings.action_cancel)) } }, ) @@ -474,7 +476,7 @@ object SettingsAdvancedScreen : SearchableSettings { onCleanupDownloads = { removeRead, removeNonFavorite -> dialogOpen = false if (job?.isActive == true) return@CleanupDownloadsDialog - context.toast(R.string.starting_cleanup) + context.toast(SYMR.strings.starting_cleanup) job = scope.launchNonCancellable { val mangaList = Injekt.get().await() val downloadManager: DownloadManager = Injekt.get() @@ -514,10 +516,10 @@ object SettingsAdvancedScreen : SearchableSettings { withUIContext { val cleanupString = if (foldersCleared == 0) { - context.getString(R.string.no_folders_to_cleanup) + context.stringResource(SYMR.strings.no_folders_to_cleanup) } else { - context.resources!!.getQuantityString( - R.plurals.cleanup_done, + context.pluralStringResource( + SYMR.plurals.cleanup_done, foldersCleared, foldersCleared, ) @@ -529,11 +531,11 @@ object SettingsAdvancedScreen : SearchableSettings { ) } return Preference.PreferenceGroup( - title = stringResource(R.string.download_notifier_downloader_title), + title = stringResource(MR.strings.download_notifier_downloader_title), preferenceItems = listOf( Preference.PreferenceItem.TextPreference( - title = stringResource(R.string.clean_up_downloaded_chapters), - subtitle = stringResource(R.string.delete_unused_chapters), + title = stringResource(SYMR.strings.clean_up_downloaded_chapters), + subtitle = stringResource(SYMR.strings.delete_unused_chapters), onClick = { dialogOpen = true }, ), ), @@ -545,43 +547,43 @@ object SettingsAdvancedScreen : SearchableSettings { val sourcePreferences = remember { Injekt.get() } val dataSaver by sourcePreferences.dataSaver().collectAsState() return Preference.PreferenceGroup( - title = stringResource(R.string.data_saver), + title = stringResource(SYMR.strings.data_saver), preferenceItems = listOf( Preference.PreferenceItem.ListPreference( pref = sourcePreferences.dataSaver(), - title = stringResource(R.string.data_saver), - subtitle = stringResource(R.string.data_saver_summary), + title = stringResource(SYMR.strings.data_saver), + subtitle = stringResource(SYMR.strings.data_saver_summary), entries = mapOf( - DataSaver.NONE to stringResource(R.string.disabled), - DataSaver.BANDWIDTH_HERO to stringResource(R.string.bandwidth_hero), - DataSaver.WSRV_NL to stringResource(R.string.wsrv), + DataSaver.NONE to stringResource(MR.strings.disabled), + DataSaver.BANDWIDTH_HERO to stringResource(SYMR.strings.bandwidth_hero), + DataSaver.WSRV_NL to stringResource(SYMR.strings.wsrv), ), ), Preference.PreferenceItem.EditTextPreference( pref = sourcePreferences.dataSaverServer(), - title = stringResource(R.string.bandwidth_data_saver_server), - subtitle = stringResource(R.string.data_saver_server_summary), + title = stringResource(SYMR.strings.bandwidth_data_saver_server), + subtitle = stringResource(SYMR.strings.data_saver_server_summary), enabled = dataSaver == DataSaver.BANDWIDTH_HERO, ), Preference.PreferenceItem.SwitchPreference( pref = sourcePreferences.dataSaverDownloader(), - title = stringResource(R.string.data_saver_downloader), + title = stringResource(SYMR.strings.data_saver_downloader), enabled = dataSaver != DataSaver.NONE, ), Preference.PreferenceItem.SwitchPreference( pref = sourcePreferences.dataSaverIgnoreJpeg(), - title = stringResource(R.string.data_saver_ignore_jpeg), + title = stringResource(SYMR.strings.data_saver_ignore_jpeg), enabled = dataSaver != DataSaver.NONE, ), Preference.PreferenceItem.SwitchPreference( pref = sourcePreferences.dataSaverIgnoreGif(), - title = stringResource(R.string.data_saver_ignore_gif), + title = stringResource(SYMR.strings.data_saver_ignore_gif), enabled = dataSaver != DataSaver.NONE, ), Preference.PreferenceItem.ListPreference( pref = sourcePreferences.dataSaverImageQuality(), - title = stringResource(R.string.data_saver_image_quality), - subtitle = stringResource(R.string.data_saver_image_quality_summary), + title = stringResource(SYMR.strings.data_saver_image_quality), + subtitle = stringResource(SYMR.strings.data_saver_image_quality_summary), entries = listOf( "10%", "20%", @@ -599,18 +601,18 @@ object SettingsAdvancedScreen : SearchableSettings { .collectAsState() Preference.PreferenceItem.SwitchPreference( pref = sourcePreferences.dataSaverImageFormatJpeg(), - title = stringResource(R.string.data_saver_image_format), + title = stringResource(SYMR.strings.data_saver_image_format), subtitle = if (dataSaverImageFormatJpeg) { - stringResource(R.string.data_saver_image_format_summary_on) + stringResource(SYMR.strings.data_saver_image_format_summary_on) } else { - stringResource(R.string.data_saver_image_format_summary_off) + stringResource(SYMR.strings.data_saver_image_format_summary_off) }, enabled = dataSaver != DataSaver.NONE, ) }, Preference.PreferenceItem.SwitchPreference( pref = sourcePreferences.dataSaverColorBW(), - title = stringResource(R.string.data_saver_color_bw), + title = stringResource(SYMR.strings.data_saver_color_bw), enabled = dataSaver == DataSaver.BANDWIDTH_HERO, ), ), @@ -626,12 +628,12 @@ object SettingsAdvancedScreen : SearchableSettings { val delegateSourcePreferences = remember { Injekt.get() } val securityPreferences = remember { Injekt.get() } return Preference.PreferenceGroup( - title = stringResource(R.string.developer_tools), + title = stringResource(SYMR.strings.developer_tools), preferenceItems = listOf( Preference.PreferenceItem.SwitchPreference( pref = unsortedPreferences.isHentaiEnabled(), - title = stringResource(R.string.toggle_hentai_features), - subtitle = stringResource(R.string.toggle_hentai_features_summary), + title = stringResource(SYMR.strings.toggle_hentai_features), + subtitle = stringResource(SYMR.strings.toggle_hentai_features_summary), onValueChanged = { if (it) { BlacklistedSources.HIDDEN_SOURCES += EH_SOURCE_ID @@ -645,30 +647,30 @@ object SettingsAdvancedScreen : SearchableSettings { ), Preference.PreferenceItem.SwitchPreference( pref = delegateSourcePreferences.delegateSources(), - title = stringResource(R.string.toggle_delegated_sources), + title = stringResource(SYMR.strings.toggle_delegated_sources), subtitle = stringResource( - R.string.toggle_delegated_sources_summary, - stringResource(R.string.app_name), + SYMR.strings.toggle_delegated_sources_summary, + stringResource(MR.strings.app_name), AndroidSourceManager.DELEGATED_SOURCES.values.map { it.sourceName }.distinct() .joinToString(), ), ), Preference.PreferenceItem.ListPreference( pref = unsortedPreferences.logLevel(), - title = stringResource(R.string.log_level), - subtitle = stringResource(R.string.log_level_summary), + title = stringResource(SYMR.strings.log_level), + subtitle = stringResource(SYMR.strings.log_level_summary), entries = EHLogLevel.values().mapIndexed { index, ehLogLevel -> - index to "${context.getString(ehLogLevel.nameRes)} (${ - context.getString(ehLogLevel.description) + index to "${context.stringResource(ehLogLevel.nameRes)} (${ + context.stringResource(ehLogLevel.description) })" }.toMap(), ), Preference.PreferenceItem.SwitchPreference( pref = sourcePreferences.enableSourceBlacklist(), - title = stringResource(R.string.enable_source_blacklist), + title = stringResource(SYMR.strings.enable_source_blacklist), subtitle = stringResource( - R.string.enable_source_blacklist_summary, - stringResource(R.string.app_name), + SYMR.strings.enable_source_blacklist_summary, + stringResource(MR.strings.app_name), ), ), kotlin.run { @@ -678,20 +680,20 @@ object SettingsAdvancedScreen : SearchableSettings { val dismiss = { enableEncryptDatabase = false } AlertDialog( onDismissRequest = dismiss, - title = { Text(text = stringResource(R.string.encrypt_database)) }, + title = { Text(text = stringResource(SYMR.strings.encrypt_database)) }, text = { Text( text = remember { HtmlCompat.fromHtml( - context.getString(R.string.encrypt_database_message), - HtmlCompat.FROM_HTML_MODE_COMPACT + context.stringResource(SYMR.strings.encrypt_database_message), + HtmlCompat.FROM_HTML_MODE_COMPACT, ).toAnnotatedString() }, ) }, dismissButton = { TextButton(onClick = dismiss) { - Text(text = stringResource(R.string.action_cancel)) + Text(text = stringResource(MR.strings.action_cancel)) } }, confirmButton = { @@ -701,15 +703,15 @@ object SettingsAdvancedScreen : SearchableSettings { securityPreferences.encryptDatabase().set(true) }, ) { - Text(text = stringResource(R.string.action_ok)) + Text(text = stringResource(MR.strings.action_ok)) } }, ) } Preference.PreferenceItem.SwitchPreference( - title = stringResource(R.string.encrypt_database), + title = stringResource(SYMR.strings.encrypt_database), pref = securityPreferences.encryptDatabase(), - subtitle = stringResource(R.string.encrypt_database_subtitle), + subtitle = stringResource(SYMR.strings.encrypt_database_subtitle), onValueChanged = { if (it) { enableEncryptDatabase = true @@ -721,11 +723,11 @@ object SettingsAdvancedScreen : SearchableSettings { ) }, Preference.PreferenceItem.TextPreference( - title = stringResource(R.string.open_debug_menu), + title = stringResource(SYMR.strings.open_debug_menu), subtitle = remember { HtmlCompat.fromHtml( - context.getString(R.string.open_debug_menu_summary), - HtmlCompat.FROM_HTML_MODE_COMPACT + context.stringResource(SYMR.strings.open_debug_menu_summary), + HtmlCompat.FROM_HTML_MODE_COMPACT, ).toAnnotatedString() }, onClick = { navigator.push(SettingsDebugScreen()) }, diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAppearanceScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAppearanceScreen.kt index 6081ec45b..d8c40150e 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAppearanceScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAppearanceScreen.kt @@ -29,6 +29,7 @@ import kotlinx.coroutines.flow.merge import org.xmlpull.v1.XmlPullParser import tachiyomi.core.i18n.stringResource import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.collectAsState import uy.kohesive.injekt.Injekt @@ -214,21 +215,21 @@ object SettingsAppearanceScreen : SearchableSettings { @Composable fun getForkGroup(uiPreferences: UiPreferences): Preference.PreferenceGroup { return Preference.PreferenceGroup( - stringResource(R.string.pref_category_fork), + stringResource(SYMR.strings.pref_category_fork), preferenceItems = listOf( Preference.PreferenceItem.SwitchPreference( pref = uiPreferences.expandFilters(), - title = stringResource(R.string.toggle_expand_search_filters), + title = stringResource(SYMR.strings.toggle_expand_search_filters), ), Preference.PreferenceItem.SwitchPreference( pref = uiPreferences.recommendsInOverflow(), - title = stringResource(R.string.put_recommends_in_overflow), - subtitle = stringResource(R.string.put_recommends_in_overflow_summary), + title = stringResource(SYMR.strings.put_recommends_in_overflow), + subtitle = stringResource(SYMR.strings.put_recommends_in_overflow_summary), ), Preference.PreferenceItem.SwitchPreference( pref = uiPreferences.mergeInOverflow(), - title = stringResource(R.string.put_merge_in_overflow), - subtitle = stringResource(R.string.put_merge_in_overflow_summary), + title = stringResource(SYMR.strings.put_merge_in_overflow), + subtitle = stringResource(SYMR.strings.put_merge_in_overflow_summary), ), ), ) @@ -237,19 +238,19 @@ object SettingsAppearanceScreen : SearchableSettings { @Composable fun getNavbarGroup(uiPreferences: UiPreferences): Preference.PreferenceGroup { return Preference.PreferenceGroup( - stringResource(R.string.pref_category_navbar), + stringResource(SYMR.strings.pref_category_navbar), preferenceItems = listOf( Preference.PreferenceItem.SwitchPreference( pref = uiPreferences.showNavUpdates(), - title = stringResource(R.string.pref_hide_updates_button), + title = stringResource(SYMR.strings.pref_hide_updates_button), ), Preference.PreferenceItem.SwitchPreference( pref = uiPreferences.showNavHistory(), - title = stringResource(R.string.pref_hide_history_button), + title = stringResource(SYMR.strings.pref_hide_history_button), ), Preference.PreferenceItem.SwitchPreference( pref = uiPreferences.bottomBarLabels(), - title = stringResource(R.string.pref_show_bottom_bar_labels), + title = stringResource(SYMR.strings.pref_show_bottom_bar_labels), ), ), ) diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsBrowseScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsBrowseScreen.kt index 030a1cd27..0860b5e43 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsBrowseScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsBrowseScreen.kt @@ -1,24 +1,25 @@ package eu.kanade.presentation.more.settings.screen -import androidx.annotation.StringRes import androidx.compose.runtime.Composable import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.pluralStringResource -import androidx.compose.ui.res.stringResource import androidx.fragment.app.FragmentActivity import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.domain.ui.UiPreferences import eu.kanade.presentation.more.settings.Preference -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.category.repos.RepoScreen import eu.kanade.tachiyomi.ui.category.sources.SourceCategoryScreen import eu.kanade.tachiyomi.util.system.AuthenticatorUtil.authenticate +import tachiyomi.core.i18n.stringResource import tachiyomi.domain.UnsortedPreferences +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR +import tachiyomi.presentation.core.i18n.pluralStringResource +import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.collectAsState import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -27,8 +28,7 @@ object SettingsBrowseScreen : SearchableSettings { @ReadOnlyComposable @Composable - @StringRes - override fun getTitleRes() = R.string.browse + override fun getTitleRes() = MR.strings.browse @Composable override fun getPreferences(): List { @@ -41,14 +41,14 @@ object SettingsBrowseScreen : SearchableSettings { return listOf( // SY --> Preference.PreferenceGroup( - title = stringResource(R.string.label_sources), + title = stringResource(MR.strings.label_sources), preferenceItems = listOf( kotlin.run { val navigator = LocalNavigator.currentOrThrow val count by sourcePreferences.sourcesTabCategories().collectAsState() Preference.PreferenceItem.TextPreference( - title = stringResource(R.string.action_edit_categories), - subtitle = pluralStringResource(R.plurals.num_categories, count.size, count.size), + title = stringResource(MR.strings.action_edit_categories), + subtitle = pluralStringResource(MR.plurals.num_categories, count.size, count.size), onClick = { navigator.push(SourceCategoryScreen()) }, @@ -56,40 +56,40 @@ object SettingsBrowseScreen : SearchableSettings { }, Preference.PreferenceItem.SwitchPreference( pref = sourcePreferences.sourcesTabCategoriesFilter(), - title = stringResource(R.string.pref_source_source_filtering), - subtitle = stringResource(R.string.pref_source_source_filtering_summery), + title = stringResource(SYMR.strings.pref_source_source_filtering), + subtitle = stringResource(SYMR.strings.pref_source_source_filtering_summery), ), Preference.PreferenceItem.SwitchPreference( pref = uiPreferences.useNewSourceNavigation(), - title = stringResource(R.string.pref_source_navigation), - subtitle = stringResource(R.string.pref_source_navigation_summery), + title = stringResource(SYMR.strings.pref_source_navigation), + subtitle = stringResource(SYMR.strings.pref_source_navigation_summery), ), Preference.PreferenceItem.SwitchPreference( pref = unsortedPreferences.allowLocalSourceHiddenFolders(), - title = stringResource(R.string.pref_local_source_hidden_folders), - subtitle = stringResource(R.string.pref_local_source_hidden_folders_summery), + title = stringResource(SYMR.strings.pref_local_source_hidden_folders), + subtitle = stringResource(SYMR.strings.pref_local_source_hidden_folders_summery), ), ), ), Preference.PreferenceGroup( - title = stringResource(R.string.feed), + title = stringResource(SYMR.strings.feed), preferenceItems = listOf( Preference.PreferenceItem.SwitchPreference( pref = uiPreferences.feedTabInFront(), - title = stringResource(R.string.pref_feed_position), - subtitle = stringResource(R.string.pref_feed_position_summery), + title = stringResource(SYMR.strings.pref_feed_position), + subtitle = stringResource(SYMR.strings.pref_feed_position_summery), ), ), ), Preference.PreferenceGroup( - title = stringResource(R.string.label_extensions), + title = stringResource(MR.strings.label_extensions), preferenceItems = listOf( kotlin.run { val navigator = LocalNavigator.currentOrThrow val count by unsortedPreferences.extensionRepos().collectAsState() Preference.PreferenceItem.TextPreference( - title = stringResource(R.string.action_edit_repos), - subtitle = pluralStringResource(R.plurals.num_repos, count.size, count.size), + title = stringResource(SYMR.strings.action_edit_repos), + subtitle = pluralStringResource(SYMR.plurals.num_repos, count.size, count.size), onClick = { navigator.push(RepoScreen()) }, @@ -99,28 +99,28 @@ object SettingsBrowseScreen : SearchableSettings { ), // SY <-- Preference.PreferenceGroup( - title = stringResource(R.string.label_sources), + title = stringResource(MR.strings.label_sources), preferenceItems = listOf( Preference.PreferenceItem.SwitchPreference( pref = sourcePreferences.hideInLibraryItems(), - title = stringResource(R.string.pref_hide_in_library_items), + title = stringResource(MR.strings.pref_hide_in_library_items), ), ), ), Preference.PreferenceGroup( - title = stringResource(R.string.pref_category_nsfw_content), + title = stringResource(MR.strings.pref_category_nsfw_content), preferenceItems = listOf( Preference.PreferenceItem.SwitchPreference( pref = sourcePreferences.showNsfwSource(), - title = stringResource(R.string.pref_show_nsfw_source), - subtitle = stringResource(R.string.requires_app_restart), + title = stringResource(MR.strings.pref_show_nsfw_source), + subtitle = stringResource(MR.strings.requires_app_restart), onValueChanged = { (context as FragmentActivity).authenticate( - title = context.getString(R.string.pref_category_nsfw_content), + title = context.stringResource(MR.strings.pref_category_nsfw_content), ) }, ), - Preference.PreferenceItem.InfoPreference(stringResource(R.string.parental_controls_info)), + Preference.PreferenceItem.InfoPreference(stringResource(MR.strings.parental_controls_info)), ), ), ) 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 4900d47b8..7604016c8 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 @@ -51,6 +51,7 @@ import tachiyomi.core.util.system.logcat import tachiyomi.domain.backup.service.BackupPreferences import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.collectAsState import uy.kohesive.injekt.Injekt @@ -292,19 +293,19 @@ object SettingsDataScreen : SearchableSettings { ), // SY --> Preference.PreferenceItem.TextPreference( - title = stringResource(R.string.pref_clear_page_preview_cache), - subtitle = stringResource(R.string.used_cache, pagePreviewReadableSize), + title = stringResource(SYMR.strings.pref_clear_page_preview_cache), + subtitle = stringResource(MR.strings.used_cache, pagePreviewReadableSize), onClick = { scope.launchNonCancellable { try { val deletedFiles = pagePreviewCache.clear() withUIContext { - context.toast(context.getString(R.string.cache_deleted, deletedFiles)) + context.toast(context.stringResource(MR.strings.cache_deleted, deletedFiles)) pagePreviewReadableSizeSema++ } } catch (e: Throwable) { logcat(LogPriority.ERROR, e) - withUIContext { context.toast(R.string.cache_delete_error) } + withUIContext { context.toast(MR.strings.cache_delete_error) } } } }, diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsEhScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsEhScreen.kt index 6d4f3fc4e..3f7925155 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsEhScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsEhScreen.kt @@ -5,7 +5,6 @@ import android.content.Context import android.widget.Toast import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts -import androidx.annotation.StringRes import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -41,14 +40,12 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties import androidx.core.content.ContextCompat.startActivity import eu.kanade.presentation.library.components.SyncFavoritesWarningDialog import eu.kanade.presentation.more.settings.Preference -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.webview.WebViewActivity import eu.kanade.tachiyomi.util.system.toast import exh.eh.EHentaiUpdateWorker @@ -59,6 +56,8 @@ import exh.ui.login.EhLoginActivity import exh.util.nullIfBlank import kotlinx.serialization.json.Json import logcat.LogPriority +import tachiyomi.core.i18n.pluralStringResource +import tachiyomi.core.i18n.stringResource import tachiyomi.core.util.lang.launchNonCancellable import tachiyomi.core.util.lang.withIOContext import tachiyomi.core.util.lang.withUIContext @@ -69,6 +68,9 @@ import tachiyomi.domain.library.service.LibraryPreferences.Companion.DEVICE_ONLY import tachiyomi.domain.manga.interactor.DeleteFavoriteEntries import tachiyomi.domain.manga.interactor.GetExhFavoriteMangaWithMetadata import tachiyomi.domain.manga.interactor.GetFlatMetadataById +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR +import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.collectAsState import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -83,8 +85,7 @@ object SettingsEhScreen : SearchableSettings { @ReadOnlyComposable @Composable - @StringRes - override fun getTitleRes() = R.string.pref_category_eh + override fun getTitleRes() = SYMR.strings.pref_category_eh override fun isEnabled(): Boolean = Injekt.get().isHentaiEnabled().get() @@ -136,7 +137,7 @@ object SettingsEhScreen : SearchableSettings { return listOf( Preference.PreferenceGroup( - stringResource(R.string.ehentai_prefs_account_settings), + stringResource(SYMR.strings.ehentai_prefs_account_settings), preferenceItems = listOf( getLoginPreference(unsortedPreferences, openWarnConfigureDialogController), useHentaiAtHome(exhentaiEnabled, unsortedPreferences), @@ -153,7 +154,7 @@ object SettingsEhScreen : SearchableSettings { ), ), Preference.PreferenceGroup( - stringResource(R.string.favorites_sync), + stringResource(SYMR.strings.favorites_sync), preferenceItems = listOf( readOnlySync(unsortedPreferences), syncFavoriteNotes(), @@ -162,7 +163,7 @@ object SettingsEhScreen : SearchableSettings { ), ), Preference.PreferenceGroup( - stringResource(R.string.gallery_update_checker), + stringResource(SYMR.strings.gallery_update_checker), preferenceItems = listOf( updateCheckerFrequency(unsortedPreferences), autoUpdateRequirements(unsortedPreferences), @@ -192,9 +193,9 @@ object SettingsEhScreen : SearchableSettings { val value by unsortedPreferences.enableExhentai().collectAsState() return Preference.PreferenceItem.SwitchPreference( pref = unsortedPreferences.enableExhentai(), - title = stringResource(R.string.enable_exhentai), + title = stringResource(SYMR.strings.enable_exhentai), subtitle = if (!value) { - stringResource(R.string.requires_login) + stringResource(SYMR.strings.requires_login) } else { null }, @@ -217,11 +218,11 @@ object SettingsEhScreen : SearchableSettings { ): Preference.PreferenceItem.ListPreference { return Preference.PreferenceItem.ListPreference( pref = unsortedPreferences.useHentaiAtHome(), - title = stringResource(R.string.use_hentai_at_home), - subtitle = stringResource(R.string.use_hentai_at_home_summary), + title = stringResource(SYMR.strings.use_hentai_at_home), + subtitle = stringResource(SYMR.strings.use_hentai_at_home_summary), entries = mapOf( - 0 to stringResource(R.string.use_hentai_at_home_option_1), - 1 to stringResource(R.string.use_hentai_at_home_option_2), + 0 to stringResource(SYMR.strings.use_hentai_at_home_option_1), + 1 to stringResource(SYMR.strings.use_hentai_at_home_option_2), ), enabled = exhentaiEnabled, ) @@ -235,11 +236,11 @@ object SettingsEhScreen : SearchableSettings { val value by unsortedPreferences.useJapaneseTitle().collectAsState() return Preference.PreferenceItem.SwitchPreference( pref = unsortedPreferences.useJapaneseTitle(), - title = stringResource(R.string.show_japanese_titles), + title = stringResource(SYMR.strings.show_japanese_titles), subtitle = if (value) { - stringResource(R.string.show_japanese_titles_option_1) + stringResource(SYMR.strings.show_japanese_titles_option_1) } else { - stringResource(R.string.show_japanese_titles_option_2) + stringResource(SYMR.strings.show_japanese_titles_option_2) }, enabled = exhentaiEnabled, ) @@ -253,11 +254,11 @@ object SettingsEhScreen : SearchableSettings { val value by unsortedPreferences.exhUseOriginalImages().collectAsState() return Preference.PreferenceItem.SwitchPreference( pref = unsortedPreferences.exhUseOriginalImages(), - title = stringResource(R.string.use_original_images), + title = stringResource(SYMR.strings.use_original_images), subtitle = if (value) { - stringResource(R.string.use_original_images_on) + stringResource(SYMR.strings.use_original_images_on) } else { - stringResource(R.string.use_original_images_off) + stringResource(SYMR.strings.use_original_images_off) }, enabled = exhentaiEnabled, ) @@ -267,15 +268,15 @@ object SettingsEhScreen : SearchableSettings { fun watchedTags(exhentaiEnabled: Boolean): Preference.PreferenceItem.TextPreference { val context = LocalContext.current return Preference.PreferenceItem.TextPreference( - title = stringResource(R.string.watched_tags), - subtitle = stringResource(R.string.watched_tags_summary), + title = stringResource(SYMR.strings.watched_tags), + subtitle = stringResource(SYMR.strings.watched_tags_summary), onClick = { startActivity( context, WebViewActivity.newIntent( context, url = "https://exhentai.org/mytags", - title = context.getString(R.string.watched_tags_exh), + title = context.stringResource(SYMR.strings.watched_tags_exh), ), null, ) @@ -304,12 +305,12 @@ object SettingsEhScreen : SearchableSettings { onClick = { onValueChange(value.toIntOrNull() ?: return@TextButton) }, enabled = isValid, ) { - Text(text = stringResource(R.string.action_ok)) + Text(text = stringResource(MR.strings.action_ok)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { - Text(text = stringResource(R.string.action_cancel)) + Text(text = stringResource(MR.strings.action_cancel)) } }, title = { @@ -357,10 +358,10 @@ object SettingsEhScreen : SearchableSettings { if (dialogOpen) { TagThresholdDialog( onDismissRequest = { dialogOpen = false }, - title = stringResource(R.string.tag_filtering_threshold), + title = stringResource(SYMR.strings.tag_filtering_threshold), initialValue = value, valueRange = -9999..0, - outsideRangeError = stringResource(R.string.tag_filtering_threshhold_error), + outsideRangeError = stringResource(SYMR.strings.tag_filtering_threshhold_error), onValueChange = { dialogOpen = false unsortedPreferences.ehTagFilterValue().set(it) @@ -368,8 +369,8 @@ object SettingsEhScreen : SearchableSettings { ) } return Preference.PreferenceItem.TextPreference( - title = stringResource(R.string.tag_filtering_threshold), - subtitle = stringResource(R.string.tag_filtering_threshhold_summary, value), + title = stringResource(SYMR.strings.tag_filtering_threshold), + subtitle = stringResource(SYMR.strings.tag_filtering_threshhold_summary, value), onClick = { dialogOpen = true }, @@ -387,10 +388,10 @@ object SettingsEhScreen : SearchableSettings { if (dialogOpen) { TagThresholdDialog( onDismissRequest = { dialogOpen = false }, - title = stringResource(R.string.tag_watching_threshhold), + title = stringResource(SYMR.strings.tag_watching_threshhold), initialValue = value, valueRange = 0..9999, - outsideRangeError = stringResource(R.string.tag_watching_threshhold_error), + outsideRangeError = stringResource(SYMR.strings.tag_watching_threshhold_error), onValueChange = { dialogOpen = false unsortedPreferences.ehTagWatchingValue().set(it) @@ -398,8 +399,8 @@ object SettingsEhScreen : SearchableSettings { ) } return Preference.PreferenceItem.TextPreference( - title = stringResource(R.string.tag_watching_threshhold), - subtitle = stringResource(R.string.tag_watching_threshhold_summary, value), + title = stringResource(SYMR.strings.tag_watching_threshhold), + subtitle = stringResource(SYMR.strings.tag_watching_threshhold_summary, value), onClick = { dialogOpen = true }, @@ -549,14 +550,14 @@ object SettingsEhScreen : SearchableSettings { val state = remember(initialValue) { LanguageDialogState(initialValue) } AlertDialog( onDismissRequest = onDismissRequest, - title = { Text(stringResource(R.string.language_filtering)) }, + title = { Text(stringResource(SYMR.strings.language_filtering)) }, text = { Column( Modifier .fillMaxWidth() .verticalScroll(rememberScrollState()), ) { - Text(stringResource(R.string.language_filtering_summary)) + Text(stringResource(SYMR.strings.language_filtering_summary)) Row( modifier = Modifier.fillMaxWidth(), @@ -589,12 +590,12 @@ object SettingsEhScreen : SearchableSettings { }, confirmButton = { TextButton(onClick = { onValueChange(state.toPreference()) }) { - Text(text = stringResource(R.string.action_ok)) + Text(text = stringResource(MR.strings.action_ok)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { - Text(text = stringResource(R.string.action_cancel)) + Text(text = stringResource(MR.strings.action_cancel)) } }, ) @@ -618,8 +619,8 @@ object SettingsEhScreen : SearchableSettings { ) } return Preference.PreferenceItem.TextPreference( - title = stringResource(R.string.language_filtering), - subtitle = stringResource(R.string.language_filtering_summary), + title = stringResource(SYMR.strings.language_filtering), + subtitle = stringResource(SYMR.strings.language_filtering_summary), onClick = { dialogOpen = true }, @@ -684,14 +685,14 @@ object SettingsEhScreen : SearchableSettings { val state = remember(initialValue) { FrontPageCategoriesDialogState(initialValue) } AlertDialog( onDismissRequest = onDismissRequest, - title = { Text(stringResource(R.string.frong_page_categories)) }, + title = { Text(stringResource(SYMR.strings.frong_page_categories)) }, text = { Column( Modifier .fillMaxWidth() .verticalScroll(rememberScrollState()), ) { - Text(stringResource(R.string.fromt_page_categories_summary)) + Text(stringResource(SYMR.strings.fromt_page_categories_summary)) Row( modifier = Modifier.fillMaxWidth(), @@ -755,12 +756,12 @@ object SettingsEhScreen : SearchableSettings { }, confirmButton = { TextButton(onClick = { onValueChange(state.toPreference()) }) { - Text(text = stringResource(R.string.action_ok)) + Text(text = stringResource(MR.strings.action_ok)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { - Text(text = stringResource(R.string.action_cancel)) + Text(text = stringResource(MR.strings.action_cancel)) } }, ) @@ -784,8 +785,8 @@ object SettingsEhScreen : SearchableSettings { ) } return Preference.PreferenceItem.TextPreference( - title = stringResource(R.string.frong_page_categories), - subtitle = stringResource(R.string.fromt_page_categories_summary), + title = stringResource(SYMR.strings.frong_page_categories), + subtitle = stringResource(SYMR.strings.fromt_page_categories_summary), onClick = { dialogOpen = true }, @@ -800,8 +801,8 @@ object SettingsEhScreen : SearchableSettings { ): Preference.PreferenceItem.SwitchPreference { return Preference.PreferenceItem.SwitchPreference( pref = unsortedPreferences.exhWatchedListDefaultState(), - title = stringResource(R.string.watched_list_default), - subtitle = stringResource(R.string.watched_list_state_summary), + title = stringResource(SYMR.strings.watched_list_default), + subtitle = stringResource(SYMR.strings.watched_list_state_summary), enabled = exhentaiEnabled, ) } @@ -813,15 +814,15 @@ object SettingsEhScreen : SearchableSettings { ): Preference.PreferenceItem.ListPreference { return Preference.PreferenceItem.ListPreference( pref = unsortedPreferences.imageQuality(), - title = stringResource(R.string.eh_image_quality_summary), - subtitle = stringResource(R.string.eh_image_quality), + title = stringResource(SYMR.strings.eh_image_quality_summary), + subtitle = stringResource(SYMR.strings.eh_image_quality), entries = mapOf( - "auto" to stringResource(R.string.eh_image_quality_auto), - "ovrs_2400" to stringResource(R.string.eh_image_quality_2400), - "ovrs_1600" to stringResource(R.string.eh_image_quality_1600), - "high" to stringResource(R.string.eh_image_quality_1280), - "med" to stringResource(R.string.eh_image_quality_980), - "low" to stringResource(R.string.eh_image_quality_780), + "auto" to stringResource(SYMR.strings.eh_image_quality_auto), + "ovrs_2400" to stringResource(SYMR.strings.eh_image_quality_2400), + "ovrs_1600" to stringResource(SYMR.strings.eh_image_quality_1600), + "high" to stringResource(SYMR.strings.eh_image_quality_1280), + "med" to stringResource(SYMR.strings.eh_image_quality_980), + "low" to stringResource(SYMR.strings.eh_image_quality_780), ), enabled = exhentaiEnabled, ) @@ -831,8 +832,8 @@ object SettingsEhScreen : SearchableSettings { fun enhancedEhentaiView(unsortedPreferences: UnsortedPreferences): Preference.PreferenceItem.SwitchPreference { return Preference.PreferenceItem.SwitchPreference( pref = unsortedPreferences.enhancedEHentaiView(), - title = stringResource(R.string.pref_enhanced_e_hentai_view), - subtitle = stringResource(R.string.pref_enhanced_e_hentai_view_summary), + title = stringResource(SYMR.strings.pref_enhanced_e_hentai_view), + subtitle = stringResource(SYMR.strings.pref_enhanced_e_hentai_view_summary), ) } @@ -840,8 +841,8 @@ object SettingsEhScreen : SearchableSettings { fun readOnlySync(unsortedPreferences: UnsortedPreferences): Preference.PreferenceItem.SwitchPreference { return Preference.PreferenceItem.SwitchPreference( pref = unsortedPreferences.exhReadOnlySync(), - title = stringResource(R.string.disable_favorites_uploading), - subtitle = stringResource(R.string.disable_favorites_uploading_summary), + title = stringResource(SYMR.strings.disable_favorites_uploading), + subtitle = stringResource(SYMR.strings.disable_favorites_uploading_summary), ) } @@ -855,8 +856,8 @@ object SettingsEhScreen : SearchableSettings { ) } return Preference.PreferenceItem.TextPreference( - title = stringResource(R.string.show_favorite_sync_notes), - subtitle = stringResource(R.string.show_favorite_sync_notes_summary), + title = stringResource(SYMR.strings.show_favorite_sync_notes), + subtitle = stringResource(SYMR.strings.show_favorite_sync_notes_summary), onClick = { dialogOpen = true }, ) } @@ -865,8 +866,8 @@ object SettingsEhScreen : SearchableSettings { fun lenientSync(unsortedPreferences: UnsortedPreferences): Preference.PreferenceItem.SwitchPreference { return Preference.PreferenceItem.SwitchPreference( pref = unsortedPreferences.exhLenientSync(), - title = stringResource(R.string.ignore_sync_errors), - subtitle = stringResource(R.string.ignore_sync_errors_summary), + title = stringResource(SYMR.strings.ignore_sync_errors), + subtitle = stringResource(SYMR.strings.ignore_sync_errors_summary), ) } @@ -878,19 +879,19 @@ object SettingsEhScreen : SearchableSettings { AlertDialog( onDismissRequest = onDismissRequest, title = { - Text(text = stringResource(R.string.favorites_sync_reset)) + Text(text = stringResource(SYMR.strings.favorites_sync_reset)) }, text = { - Text(text = stringResource(R.string.favorites_sync_reset_message)) + Text(text = stringResource(SYMR.strings.favorites_sync_reset_message)) }, confirmButton = { TextButton(onClick = onStartReset) { - Text(text = stringResource(R.string.action_ok)) + Text(text = stringResource(MR.strings.action_ok)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { - Text(text = stringResource(R.string.action_cancel)) + Text(text = stringResource(MR.strings.action_cancel)) } }, properties = DialogProperties( @@ -914,7 +915,7 @@ object SettingsEhScreen : SearchableSettings { try { deleteFavoriteEntries.await() withUIContext { - context.toast(context.getString(R.string.sync_state_reset), Toast.LENGTH_LONG) + context.toast(context.stringResource(SYMR.strings.sync_state_reset), Toast.LENGTH_LONG) } } catch (e: Exception) { this@SettingsEhScreen.logcat(LogPriority.ERROR, e) @@ -924,8 +925,8 @@ object SettingsEhScreen : SearchableSettings { ) } return Preference.PreferenceItem.TextPreference( - title = stringResource(R.string.force_sync_state_reset), - subtitle = stringResource(R.string.force_sync_state_reset_summary), + title = stringResource(SYMR.strings.force_sync_state_reset), + subtitle = stringResource(SYMR.strings.force_sync_state_reset_summary), onClick = { dialogOpen = true }, @@ -940,26 +941,26 @@ object SettingsEhScreen : SearchableSettings { val context = LocalContext.current return Preference.PreferenceItem.ListPreference( pref = unsortedPreferences.exhAutoUpdateFrequency(), - title = stringResource(R.string.time_between_batches), + title = stringResource(SYMR.strings.time_between_batches), subtitle = if (value == 0) { - stringResource(R.string.time_between_batches_summary_1, stringResource(R.string.app_name)) + stringResource(SYMR.strings.time_between_batches_summary_1, stringResource(MR.strings.app_name)) } else { stringResource( - R.string.time_between_batches_summary_2, - stringResource(R.string.app_name), + SYMR.strings.time_between_batches_summary_2, + stringResource(MR.strings.app_name), value, EHentaiUpdateWorkerConstants.UPDATES_PER_ITERATION, ) }, entries = mapOf( - 0 to stringResource(R.string.time_between_batches_never), - 1 to stringResource(R.string.time_between_batches_1_hour), - 2 to stringResource(R.string.time_between_batches_2_hours), - 3 to stringResource(R.string.time_between_batches_3_hours), - 6 to stringResource(R.string.time_between_batches_6_hours), - 12 to stringResource(R.string.time_between_batches_12_hours), - 24 to stringResource(R.string.time_between_batches_24_hours), - 48 to stringResource(R.string.time_between_batches_48_hours), + 0 to stringResource(SYMR.strings.time_between_batches_never), + 1 to stringResource(SYMR.strings.time_between_batches_1_hour), + 2 to stringResource(SYMR.strings.time_between_batches_2_hours), + 3 to stringResource(SYMR.strings.time_between_batches_3_hours), + 6 to stringResource(SYMR.strings.time_between_batches_6_hours), + 12 to stringResource(SYMR.strings.time_between_batches_12_hours), + 24 to stringResource(SYMR.strings.time_between_batches_24_hours), + 48 to stringResource(SYMR.strings.time_between_batches_48_hours), ), onValueChanged = { interval -> EHentaiUpdateWorker.scheduleBackground(context, prefInterval = interval) @@ -976,27 +977,27 @@ object SettingsEhScreen : SearchableSettings { val context = LocalContext.current return Preference.PreferenceItem.MultiSelectListPreference( pref = unsortedPreferences.exhAutoUpdateRequirements(), - title = stringResource(R.string.auto_update_restrictions), + title = stringResource(SYMR.strings.auto_update_restrictions), subtitle = remember(value) { - context.getString( - R.string.restrictions, + context.stringResource( + MR.strings.restrictions, value.sorted() .map { when (it) { - DEVICE_ONLY_ON_WIFI -> context.getString(R.string.connected_to_wifi) - DEVICE_CHARGING -> context.getString(R.string.charging) + DEVICE_ONLY_ON_WIFI -> context.stringResource(MR.strings.connected_to_wifi) + DEVICE_CHARGING -> context.stringResource(MR.strings.charging) else -> it } } .ifEmpty { - listOf(context.getString(R.string.none)) + listOf(context.stringResource(MR.strings.none)) } .joinToString(), ) }, entries = mapOf( - DEVICE_ONLY_ON_WIFI to stringResource(R.string.connected_to_wifi), - DEVICE_CHARGING to stringResource(R.string.charging), + DEVICE_ONLY_ON_WIFI to stringResource(MR.strings.connected_to_wifi), + DEVICE_CHARGING to stringResource(MR.strings.charging), ), onValueChanged = { restrictions -> EHentaiUpdateWorker.scheduleBackground(context, prefRestrictions = restrictions) @@ -1019,7 +1020,7 @@ object SettingsEhScreen : SearchableSettings { shape = MaterialTheme.shapes.medium, ) { Text( - text = stringResource(R.string.gallery_updater_statistics_collection), + text = stringResource(SYMR.strings.gallery_updater_statistics_collection), style = MaterialTheme.typography.bodyMedium, modifier = Modifier.padding(40.dp), ) @@ -1035,14 +1036,14 @@ object SettingsEhScreen : SearchableSettings { AlertDialog( onDismissRequest = onDismissRequest, title = { - Text(text = stringResource(R.string.gallery_updater_statistics)) + Text(text = stringResource(SYMR.strings.gallery_updater_statistics)) }, text = { Text(text = updateInfo) }, confirmButton = { TextButton(onClick = onDismissRequest) { - Text(text = stringResource(R.string.action_ok)) + Text(text = stringResource(MR.strings.action_ok)) } }, ) @@ -1109,20 +1110,20 @@ object SettingsEhScreen : SearchableSettings { } private fun getRelativeTimeString(relativeTime: RelativeTime, context: Context): String { - return relativeTime.years?.let { context.resources.getQuantityString(R.plurals.humanize_year, it.toInt(), it) } + return relativeTime.years?.let { context.pluralStringResource(SYMR.plurals.humanize_year, it.toInt(), it) } ?: relativeTime.months?.let { - context.resources.getQuantityString(R.plurals.humanize_month, it.toInt(), it) + context.pluralStringResource(SYMR.plurals.humanize_month, it.toInt(), it) } - ?: relativeTime.weeks?.let { context.resources.getQuantityString(R.plurals.humanize_week, it.toInt(), it) } - ?: relativeTime.days?.let { context.resources.getQuantityString(R.plurals.humanize_day, it.toInt(), it) } - ?: relativeTime.hours?.let { context.resources.getQuantityString(R.plurals.humanize_hour, it.toInt(), it) } + ?: relativeTime.weeks?.let { context.pluralStringResource(SYMR.plurals.humanize_week, it.toInt(), it) } + ?: relativeTime.days?.let { context.pluralStringResource(SYMR.plurals.humanize_day, it.toInt(), it) } + ?: relativeTime.hours?.let { context.pluralStringResource(SYMR.plurals.humanize_hour, it.toInt(), it) } ?: relativeTime.minutes?.let { - context.resources.getQuantityString(R.plurals.humanize_minute, it.toInt(), it) + context.pluralStringResource(SYMR.plurals.humanize_minute, it.toInt(), it) } ?: relativeTime.seconds?.let { - context.resources.getQuantityString(R.plurals.humanize_second, it.toInt(), it) + context.pluralStringResource(SYMR.plurals.humanize_second, it.toInt(), it) } - ?: context.getString(R.string.humanize_fallback) + ?: context.stringResource(SYMR.strings.humanize_fallback) } data class RelativeTime( @@ -1154,14 +1155,14 @@ object SettingsEhScreen : SearchableSettings { } val statsText = if (stats != null) { - context.getString( - R.string.gallery_updater_stats_text, + context.stringResource( + SYMR.strings.gallery_updater_stats_text, getRelativeTimeString(getRelativeTimeFromNow(stats.startTime.milliseconds), context), stats.updateCount, stats.possibleUpdates, ) } else { - context.getString(R.string.gallery_updater_not_ran_yet) + context.stringResource(SYMR.strings.gallery_updater_not_ran_yet) } val allMeta = getExhFavoriteMangaWithMetadata.await() @@ -1177,8 +1178,8 @@ object SettingsEhScreen : SearchableSettings { }.count() } - statsText + "\n\n" + context.getString( - R.string.gallery_updater_stats_time, + statsText + "\n\n" + context.stringResource( + SYMR.strings.gallery_updater_stats_time, metaInRelativeDuration(1.hours), metaInRelativeDuration(6.hours), metaInRelativeDuration(12.hours), @@ -1204,7 +1205,7 @@ object SettingsEhScreen : SearchableSettings { } } return Preference.PreferenceItem.TextPreference( - title = stringResource(R.string.show_updater_statistics), + title = stringResource(SYMR.strings.show_updater_statistics), onClick = { dialogOpen = true }, diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsLibraryScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsLibraryScreen.kt index d4b19b282..7a4526c23 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsLibraryScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsLibraryScreen.kt @@ -1,6 +1,5 @@ package eu.kanade.presentation.more.settings.screen -import androidx.annotation.StringRes import androidx.compose.runtime.Composable import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.collectAsState @@ -11,8 +10,6 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.pluralStringResource -import androidx.compose.ui.res.stringResource import androidx.compose.ui.util.fastMap import androidx.core.content.ContextCompat import cafe.adriel.voyager.navigator.LocalNavigator @@ -21,7 +18,6 @@ import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.category.visualName import eu.kanade.presentation.more.settings.Preference import eu.kanade.presentation.more.settings.widget.TriStateListDialog -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.library.LibraryUpdateJob import eu.kanade.tachiyomi.ui.category.CategoryScreen import eu.kanade.tachiyomi.ui.category.genre.SortTagScreen @@ -40,6 +36,10 @@ import tachiyomi.domain.library.service.LibraryPreferences.Companion.MANGA_HAS_U import tachiyomi.domain.library.service.LibraryPreferences.Companion.MANGA_NON_COMPLETED import tachiyomi.domain.library.service.LibraryPreferences.Companion.MANGA_NON_READ import tachiyomi.domain.library.service.LibraryPreferences.Companion.MANGA_OUTSIDE_RELEASE_PERIOD +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR +import tachiyomi.presentation.core.i18n.pluralStringResource +import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.collectAsState import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -48,15 +48,14 @@ object SettingsLibraryScreen : SearchableSettings { @Composable @ReadOnlyComposable - @StringRes - override fun getTitleRes() = R.string.pref_category_library + override fun getTitleRes() = MR.strings.pref_category_library @Composable override fun getPreferences(): List { val getCategories = remember { Injekt.get() } val libraryPreferences = remember { Injekt.get() } val allCategories by getCategories.subscribe().collectAsState( - initial = runBlocking { getCategories.await() } + initial = runBlocking { getCategories.await() }, ) // SY --> val unsortedPreferences = remember { Injekt.get() } @@ -89,16 +88,16 @@ object SettingsLibraryScreen : SearchableSettings { // For default category val ids = listOf(libraryPreferences.defaultCategory().defaultValue()) + allCategories.fastMap { it.id.toInt() } - val labels = listOf(stringResource(R.string.default_category_summary)) + + val labels = listOf(stringResource(MR.strings.default_category_summary)) + allCategories.fastMap { it.visualName(context) } return Preference.PreferenceGroup( - title = stringResource(R.string.categories), + title = stringResource(MR.strings.categories), preferenceItems = listOf( Preference.PreferenceItem.TextPreference( - title = stringResource(R.string.action_edit_categories), + title = stringResource(MR.strings.action_edit_categories), subtitle = pluralStringResource( - id = R.plurals.num_categories, + MR.plurals.num_categories, count = userCategoriesCount, userCategoriesCount, ), @@ -106,13 +105,13 @@ object SettingsLibraryScreen : SearchableSettings { ), Preference.PreferenceItem.ListPreference( pref = libraryPreferences.defaultCategory(), - title = stringResource(R.string.default_category), - subtitle = selectedCategory?.visualName ?: stringResource(R.string.default_category_summary), + title = stringResource(MR.strings.default_category), + subtitle = selectedCategory?.visualName ?: stringResource(MR.strings.default_category_summary), entries = ids.zip(labels).toMap(), ), Preference.PreferenceItem.SwitchPreference( pref = libraryPreferences.categorizedDisplaySettings(), - title = stringResource(R.string.categorized_display_settings), + title = stringResource(MR.strings.categorized_display_settings), onValueChanged = { if (!it) { scope.launch { @@ -144,8 +143,8 @@ object SettingsLibraryScreen : SearchableSettings { var showCategoriesDialog by rememberSaveable { mutableStateOf(false) } if (showCategoriesDialog) { TriStateListDialog( - title = stringResource(R.string.categories), - message = stringResource(R.string.pref_library_update_categories_details), + title = stringResource(MR.strings.categories), + message = stringResource(MR.strings.pref_library_update_categories_details), items = allCategories, initialChecked = included.mapNotNull { id -> allCategories.find { it.id.toString() == id } }, initialInversed = excluded.mapNotNull { id -> allCategories.find { it.id.toString() == id } }, @@ -160,18 +159,18 @@ object SettingsLibraryScreen : SearchableSettings { } return Preference.PreferenceGroup( - title = stringResource(R.string.pref_category_library_update), + title = stringResource(MR.strings.pref_category_library_update), preferenceItems = listOf( Preference.PreferenceItem.ListPreference( pref = autoUpdateIntervalPref, - title = stringResource(R.string.pref_library_update_interval), + title = stringResource(MR.strings.pref_library_update_interval), entries = mapOf( - 0 to stringResource(R.string.update_never), - 12 to stringResource(R.string.update_12hour), - 24 to stringResource(R.string.update_24hour), - 48 to stringResource(R.string.update_48hour), - 72 to stringResource(R.string.update_72hour), - 168 to stringResource(R.string.update_weekly), + 0 to stringResource(MR.strings.update_never), + 12 to stringResource(MR.strings.update_12hour), + 24 to stringResource(MR.strings.update_24hour), + 48 to stringResource(MR.strings.update_48hour), + 72 to stringResource(MR.strings.update_72hour), + 168 to stringResource(MR.strings.update_weekly), ), onValueChanged = { LibraryUpdateJob.setupTask(context, it) @@ -181,12 +180,12 @@ object SettingsLibraryScreen : SearchableSettings { Preference.PreferenceItem.MultiSelectListPreference( pref = libraryPreferences.autoUpdateDeviceRestrictions(), enabled = autoUpdateInterval > 0, - title = stringResource(R.string.pref_library_update_restriction), - subtitle = stringResource(R.string.restrictions), + title = stringResource(MR.strings.pref_library_update_restriction), + subtitle = stringResource(MR.strings.restrictions), entries = mapOf( - DEVICE_ONLY_ON_WIFI to stringResource(R.string.connected_to_wifi), - DEVICE_NETWORK_NOT_METERED to stringResource(R.string.network_not_metered), - DEVICE_CHARGING to stringResource(R.string.charging), + DEVICE_ONLY_ON_WIFI to stringResource(MR.strings.connected_to_wifi), + DEVICE_NETWORK_NOT_METERED to stringResource(MR.strings.network_not_metered), + DEVICE_CHARGING to stringResource(MR.strings.charging), ), onValueChanged = { // Post to event looper to allow the preference to be updated. @@ -195,7 +194,7 @@ object SettingsLibraryScreen : SearchableSettings { }, ), Preference.PreferenceItem.TextPreference( - title = stringResource(R.string.categories), + title = stringResource(MR.strings.categories), subtitle = getCategoriesLabel( allCategories = allCategories, included = included, @@ -206,33 +205,33 @@ object SettingsLibraryScreen : SearchableSettings { // SY --> Preference.PreferenceItem.ListPreference( pref = libraryPreferences.groupLibraryUpdateType(), - title = stringResource(R.string.library_group_updates), + title = stringResource(SYMR.strings.library_group_updates), entries = mapOf( - GroupLibraryMode.GLOBAL to stringResource(R.string.library_group_updates_global), + GroupLibraryMode.GLOBAL to stringResource(SYMR.strings.library_group_updates_global), GroupLibraryMode.ALL_BUT_UNGROUPED to - stringResource(R.string.library_group_updates_all_but_ungrouped), - GroupLibraryMode.ALL to stringResource(R.string.library_group_updates_all), + stringResource(SYMR.strings.library_group_updates_all_but_ungrouped), + GroupLibraryMode.ALL to stringResource(SYMR.strings.library_group_updates_all), ), ), // SY <-- Preference.PreferenceItem.SwitchPreference( pref = libraryPreferences.autoUpdateMetadata(), - title = stringResource(R.string.pref_library_update_refresh_metadata), - subtitle = stringResource(R.string.pref_library_update_refresh_metadata_summary), + title = stringResource(MR.strings.pref_library_update_refresh_metadata), + subtitle = stringResource(MR.strings.pref_library_update_refresh_metadata_summary), ), Preference.PreferenceItem.MultiSelectListPreference( pref = libraryPreferences.autoUpdateMangaRestrictions(), - title = stringResource(R.string.pref_library_update_manga_restriction), + title = stringResource(MR.strings.pref_library_update_manga_restriction), entries = mapOf( - MANGA_HAS_UNREAD to stringResource(R.string.pref_update_only_completely_read), - MANGA_NON_READ to stringResource(R.string.pref_update_only_started), - MANGA_NON_COMPLETED to stringResource(R.string.pref_update_only_non_completed), - MANGA_OUTSIDE_RELEASE_PERIOD to stringResource(R.string.pref_update_only_in_release_period), + MANGA_HAS_UNREAD to stringResource(MR.strings.pref_update_only_completely_read), + MANGA_NON_READ to stringResource(MR.strings.pref_update_only_started), + MANGA_NON_COMPLETED to stringResource(MR.strings.pref_update_only_non_completed), + MANGA_OUTSIDE_RELEASE_PERIOD to stringResource(MR.strings.pref_update_only_in_release_period), ), ), Preference.PreferenceItem.SwitchPreference( pref = libraryPreferences.newShowUpdatesCount(), - title = stringResource(R.string.pref_library_update_show_tab_badge), + title = stringResource(MR.strings.pref_library_update_show_tab_badge), ), ), ) @@ -243,26 +242,26 @@ object SettingsLibraryScreen : SearchableSettings { libraryPreferences: LibraryPreferences, ): Preference.PreferenceGroup { return Preference.PreferenceGroup( - title = stringResource(R.string.pref_chapter_swipe), + title = stringResource(MR.strings.pref_chapter_swipe), preferenceItems = listOf( Preference.PreferenceItem.ListPreference( pref = libraryPreferences.swipeToStartAction(), - title = stringResource(R.string.pref_chapter_swipe_start), + title = stringResource(MR.strings.pref_chapter_swipe_start), entries = mapOf( - LibraryPreferences.ChapterSwipeAction.Disabled to stringResource(R.string.disabled), - LibraryPreferences.ChapterSwipeAction.ToggleBookmark to stringResource(R.string.action_bookmark), - LibraryPreferences.ChapterSwipeAction.ToggleRead to stringResource(R.string.action_mark_as_read), - LibraryPreferences.ChapterSwipeAction.Download to stringResource(R.string.action_download), + LibraryPreferences.ChapterSwipeAction.Disabled to stringResource(MR.strings.disabled), + LibraryPreferences.ChapterSwipeAction.ToggleBookmark to stringResource(MR.strings.action_bookmark), + LibraryPreferences.ChapterSwipeAction.ToggleRead to stringResource(MR.strings.action_mark_as_read), + LibraryPreferences.ChapterSwipeAction.Download to stringResource(MR.strings.action_download), ), ), Preference.PreferenceItem.ListPreference( pref = libraryPreferences.swipeToEndAction(), - title = stringResource(R.string.pref_chapter_swipe_end), + title = stringResource(MR.strings.pref_chapter_swipe_end), entries = mapOf( - LibraryPreferences.ChapterSwipeAction.Disabled to stringResource(R.string.disabled), - LibraryPreferences.ChapterSwipeAction.ToggleBookmark to stringResource(R.string.action_bookmark), - LibraryPreferences.ChapterSwipeAction.ToggleRead to stringResource(R.string.action_mark_as_read), - LibraryPreferences.ChapterSwipeAction.Download to stringResource(R.string.action_download), + LibraryPreferences.ChapterSwipeAction.Disabled to stringResource(MR.strings.disabled), + LibraryPreferences.ChapterSwipeAction.ToggleBookmark to stringResource(MR.strings.action_bookmark), + LibraryPreferences.ChapterSwipeAction.ToggleRead to stringResource(MR.strings.action_mark_as_read), + LibraryPreferences.ChapterSwipeAction.Download to stringResource(MR.strings.action_download), ), ), ), @@ -274,11 +273,11 @@ object SettingsLibraryScreen : SearchableSettings { fun getSortingCategory(navigator: Navigator, libraryPreferences: LibraryPreferences): Preference.PreferenceGroup { val tagCount by libraryPreferences.sortTagsForLibrary().collectAsState() return Preference.PreferenceGroup( - stringResource(R.string.pref_sorting_settings), + stringResource(SYMR.strings.pref_sorting_settings), preferenceItems = listOf( Preference.PreferenceItem.TextPreference( - title = stringResource(R.string.pref_tag_sorting), - subtitle = pluralStringResource(R.plurals.pref_tag_sorting_desc, tagCount.size, tagCount.size), + title = stringResource(SYMR.strings.pref_tag_sorting), + subtitle = pluralStringResource(SYMR.plurals.pref_tag_sorting_desc, tagCount.size, tagCount.size), onClick = { navigator.push(SortTagScreen()) }, @@ -292,13 +291,13 @@ object SettingsLibraryScreen : SearchableSettings { val skipPreMigration by unsortedPreferences.skipPreMigration().collectAsState() val migrationSources by unsortedPreferences.migrationSources().collectAsState() return Preference.PreferenceGroup( - stringResource(R.string.migration), + stringResource(SYMR.strings.migration), enabled = skipPreMigration || migrationSources.isNotEmpty(), preferenceItems = listOf( Preference.PreferenceItem.SwitchPreference( pref = unsortedPreferences.skipPreMigration(), - title = stringResource(R.string.skip_pre_migration), - subtitle = stringResource(R.string.pref_skip_pre_migration_summary), + title = stringResource(SYMR.strings.skip_pre_migration), + subtitle = stringResource(SYMR.strings.pref_skip_pre_migration_summary), ), ), ) diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsMainScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsMainScreen.kt index 82aff3d12..a3ebe8516 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsMainScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsMainScreen.kt @@ -1,6 +1,5 @@ package eu.kanade.presentation.more.settings.screen -import androidx.annotation.StringRes import androidx.compose.foundation.background import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.padding @@ -34,24 +33,26 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.core.graphics.ColorUtils import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.Navigator import cafe.adriel.voyager.navigator.currentOrThrow +import dev.icerock.moko.resources.StringResource import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.more.settings.screen.about.AboutScreen import eu.kanade.presentation.more.settings.widget.TextPreferenceWidget import eu.kanade.presentation.util.LocalBackPress import eu.kanade.presentation.util.Screen -import eu.kanade.tachiyomi.R import exh.assets.EhAssets import exh.assets.ehassets.EhLogo import exh.assets.ehassets.MangadexLogo import kotlinx.collections.immutable.persistentListOf +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.material.Scaffold +import tachiyomi.presentation.core.i18n.stringResource import cafe.adriel.voyager.core.screen.Screen as VoyagerScreen object SettingsMainScreen : Screen() { @@ -88,13 +89,13 @@ object SettingsMainScreen : Screen() { topBarScrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(topBarState), topBar = { scrollBehavior -> AppBar( - title = stringResource(R.string.label_settings), + title = stringResource(MR.strings.label_settings), navigateUp = backPress::invoke, actions = { AppBarActions( persistentListOf( AppBar.Action( - title = stringResource(R.string.action_search), + title = stringResource(MR.strings.action_search), icon = Icons.Outlined.Search, onClick = { navigator.navigate(SettingsSearchScreen(), twoPane) }, ), @@ -171,8 +172,8 @@ object SettingsMainScreen : Screen() { } private data class Item( - @StringRes val titleRes: Int, - @StringRes val subtitleRes: Int, + val titleRes: StringResource, + val subtitleRes: StringResource, val formatSubtitle: @Composable () -> String = { stringResource(subtitleRes) }, val icon: ImageVector, val screen: VoyagerScreen, @@ -180,78 +181,78 @@ object SettingsMainScreen : Screen() { private val items = listOf( Item( - titleRes = R.string.pref_category_appearance, - subtitleRes = R.string.pref_appearance_summary, + titleRes = MR.strings.pref_category_appearance, + subtitleRes = MR.strings.pref_appearance_summary, icon = Icons.Outlined.Palette, screen = SettingsAppearanceScreen, ), Item( - titleRes = R.string.pref_category_library, - subtitleRes = R.string.pref_library_summary, + titleRes = MR.strings.pref_category_library, + subtitleRes = MR.strings.pref_library_summary, icon = Icons.Outlined.CollectionsBookmark, screen = SettingsLibraryScreen, ), Item( - titleRes = R.string.pref_category_reader, - subtitleRes = R.string.pref_reader_summary, + titleRes = MR.strings.pref_category_reader, + subtitleRes = MR.strings.pref_reader_summary, icon = Icons.AutoMirrored.Outlined.ChromeReaderMode, screen = SettingsReaderScreen, ), Item( - titleRes = R.string.pref_category_downloads, - subtitleRes = R.string.pref_downloads_summary, + titleRes = MR.strings.pref_category_downloads, + subtitleRes = MR.strings.pref_downloads_summary, icon = Icons.Outlined.GetApp, screen = SettingsDownloadScreen, ), Item( - titleRes = R.string.pref_category_tracking, - subtitleRes = R.string.pref_tracking_summary, + titleRes = MR.strings.pref_category_tracking, + subtitleRes = MR.strings.pref_tracking_summary, icon = Icons.Outlined.Sync, screen = SettingsTrackingScreen, ), Item( - titleRes = R.string.browse, - subtitleRes = R.string.pref_browse_summary, + titleRes = MR.strings.browse, + subtitleRes = MR.strings.pref_browse_summary, icon = Icons.Outlined.Explore, screen = SettingsBrowseScreen, ), Item( - titleRes = R.string.label_data_storage, - subtitleRes = R.string.pref_backup_summary, + titleRes = MR.strings.label_data_storage, + subtitleRes = MR.strings.pref_backup_summary, icon = Icons.Outlined.Storage, screen = SettingsDataScreen, ), Item( - titleRes = R.string.pref_category_security, - subtitleRes = R.string.pref_security_summary, + titleRes = MR.strings.pref_category_security, + subtitleRes = MR.strings.pref_security_summary, icon = Icons.Outlined.Security, screen = SettingsSecurityScreen, ), // SY --> Item( - titleRes = R.string.pref_category_eh, - subtitleRes = R.string.pref_ehentai_summary, + titleRes = SYMR.strings.pref_category_eh, + subtitleRes = SYMR.strings.pref_ehentai_summary, icon = EhAssets.EhLogo, screen = SettingsEhScreen, ), Item( - titleRes = R.string.pref_category_mangadex, - subtitleRes = R.string.pref_mangadex_summary, + titleRes = SYMR.strings.pref_category_mangadex, + subtitleRes = SYMR.strings.pref_mangadex_summary, icon = EhAssets.MangadexLogo, screen = SettingsMangadexScreen, ), // SY <-- Item( - titleRes = R.string.pref_category_advanced, - subtitleRes = R.string.pref_advanced_summary, + titleRes = MR.strings.pref_category_advanced, + subtitleRes = MR.strings.pref_advanced_summary, icon = Icons.Outlined.Code, screen = SettingsAdvancedScreen, ), Item( - titleRes = R.string.pref_category_about, - subtitleRes = 0, + titleRes = MR.strings.pref_category_about, + subtitleRes = StringResource(0), formatSubtitle = { - "${stringResource(R.string.app_name)} ${AboutScreen.getVersionName(withBuildDate = false)}" + "${stringResource(MR.strings.app_name)} ${AboutScreen.getVersionName(withBuildDate = false)}" }, icon = Icons.Outlined.Info, screen = AboutScreen, diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsMangadexScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsMangadexScreen.kt index ea26ad0b0..9d425f386 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsMangadexScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsMangadexScreen.kt @@ -1,6 +1,5 @@ package eu.kanade.presentation.more.settings.screen -import androidx.annotation.StringRes import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -27,7 +26,6 @@ import androidx.compose.runtime.toMutableStateList import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.domain.track.service.TrackPreferences @@ -46,7 +44,10 @@ import tachiyomi.core.util.lang.launchIO import tachiyomi.core.util.lang.withUIContext import tachiyomi.core.util.system.logcat import tachiyomi.domain.UnsortedPreferences +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.material.padding +import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.collectAsState import tachiyomi.presentation.core.util.secondaryItemAlpha import uy.kohesive.injekt.Injekt @@ -56,8 +57,7 @@ object SettingsMangadexScreen : SearchableSettings { @ReadOnlyComposable @Composable - @StringRes - override fun getTitleRes() = R.string.pref_category_mangadex + override fun getTitleRes() = SYMR.strings.pref_category_mangadex override fun isEnabled(): Boolean = MdUtil.getEnabledMangaDexs(Injekt.get()).isNotEmpty() @@ -84,16 +84,16 @@ object SettingsMangadexScreen : SearchableSettings { AlertDialog( onDismissRequest = onDismissRequest, title = { - Text(text = stringResource(R.string.logout)) + Text(text = stringResource(MR.strings.logout)) }, confirmButton = { TextButton(onClick = onLogoutRequest) { - Text(text = stringResource(R.string.logout)) + Text(text = stringResource(MR.strings.logout)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { - Text(text = stringResource(R.string.action_cancel)) + Text(text = stringResource(MR.strings.action_cancel)) } }, ) @@ -117,17 +117,17 @@ object SettingsMangadexScreen : SearchableSettings { try { if (mdex.logout()) { withUIContext { - context.toast(R.string.logout_success) + context.toast(MR.strings.logout_success) } } else { withUIContext { - context.toast(R.string.unknown_error) + context.toast(MR.strings.unknown_error) } } } catch (e: Exception) { logcat(LogPriority.ERROR, e) { "Logout error" } withUIContext { - context.toast(R.string.unknown_error) + context.toast(MR.strings.unknown_error) } } } @@ -178,8 +178,8 @@ object SettingsMangadexScreen : SearchableSettings { ): Preference.PreferenceItem.ListPreference { return Preference.PreferenceItem.ListPreference( pref = unsortedPreferences.preferredMangaDexId(), - title = stringResource(R.string.mangadex_preffered_source), - subtitle = stringResource(R.string.mangadex_preffered_source_summary), + title = stringResource(SYMR.strings.mangadex_preffered_source), + subtitle = stringResource(SYMR.strings.mangadex_preffered_source_summary), entries = MdUtil.getEnabledMangaDexs(sourcePreferences) .associate { it.id.toString() to it.toString() }, ) @@ -203,7 +203,7 @@ object SettingsMangadexScreen : SearchableSettings { AlertDialog( onDismissRequest = onDismissRequest, title = { - Text(text = stringResource(R.string.mangadex_sync_follows_to_library)) + Text(text = stringResource(SYMR.strings.mangadex_sync_follows_to_library)) }, text = { Column( @@ -236,12 +236,12 @@ object SettingsMangadexScreen : SearchableSettings { }, confirmButton = { TextButton(onClick = { onSelectionConfirmed(items.filterIndexed { index, _ -> selection[index] }) }) { - Text(text = stringResource(R.string.action_ok)) + Text(text = stringResource(MR.strings.action_ok)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { - Text(text = stringResource(R.string.action_cancel)) + Text(text = stringResource(MR.strings.action_cancel)) } }, ) @@ -267,8 +267,8 @@ object SettingsMangadexScreen : SearchableSettings { ) } return Preference.PreferenceItem.TextPreference( - title = stringResource(R.string.mangadex_sync_follows_to_library), - subtitle = stringResource(R.string.mangadex_sync_follows_to_library_summary), + title = stringResource(SYMR.strings.mangadex_sync_follows_to_library), + subtitle = stringResource(SYMR.strings.mangadex_sync_follows_to_library_summary), onClick = { dialogOpen = true }, ) } @@ -277,8 +277,8 @@ object SettingsMangadexScreen : SearchableSettings { fun syncLibraryToMangaDex(): Preference.PreferenceItem.TextPreference { val context = LocalContext.current return Preference.PreferenceItem.TextPreference( - title = stringResource(R.string.mangadex_push_favorites_to_mangadex), - subtitle = stringResource(R.string.mangadex_push_favorites_to_mangadex_summary), + title = stringResource(SYMR.strings.mangadex_push_favorites_to_mangadex), + subtitle = stringResource(SYMR.strings.mangadex_push_favorites_to_mangadex_summary), onClick = { LibraryUpdateJob.startNow( context, diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsReaderScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsReaderScreen.kt index cd1b72ead..3e41df676 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsReaderScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsReaderScreen.kt @@ -1,20 +1,20 @@ package eu.kanade.presentation.more.settings.screen import android.os.Build -import androidx.annotation.StringRes import androidx.compose.runtime.Composable import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalView -import androidx.compose.ui.res.stringResource import eu.kanade.presentation.more.settings.Preference -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.reader.setting.ReaderBottomButton import eu.kanade.tachiyomi.ui.reader.setting.ReaderOrientation import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences import eu.kanade.tachiyomi.ui.reader.setting.ReadingMode import eu.kanade.tachiyomi.ui.reader.viewer.pager.PagerConfig +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR +import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.collectAsState import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -24,8 +24,7 @@ object SettingsReaderScreen : SearchableSettings { @ReadOnlyComposable @Composable - @StringRes - override fun getTitleRes() = R.string.pref_category_reader + override fun getTitleRes() = MR.strings.pref_category_reader @Composable override fun getPreferences(): List { @@ -36,64 +35,64 @@ object SettingsReaderScreen : SearchableSettings { return listOf( Preference.PreferenceItem.ListPreference( pref = readerPref.defaultReadingMode(), - title = stringResource(R.string.pref_viewer_type), + title = stringResource(MR.strings.pref_viewer_type), entries = ReadingMode.entries.drop(1) .associate { it.flagValue to stringResource(it.stringRes) }, ), Preference.PreferenceItem.ListPreference( pref = readerPref.doubleTapAnimSpeed(), - title = stringResource(R.string.pref_double_tap_anim_speed), + title = stringResource(MR.strings.pref_double_tap_anim_speed), entries = mapOf( - 1 to stringResource(R.string.double_tap_anim_speed_0), - 500 to stringResource(R.string.double_tap_anim_speed_normal), - 250 to stringResource(R.string.double_tap_anim_speed_fast), + 1 to stringResource(MR.strings.double_tap_anim_speed_0), + 500 to stringResource(MR.strings.double_tap_anim_speed_normal), + 250 to stringResource(MR.strings.double_tap_anim_speed_fast), ), ), Preference.PreferenceItem.SwitchPreference( pref = readerPref.showReadingMode(), - title = stringResource(R.string.pref_show_reading_mode), - subtitle = stringResource(R.string.pref_show_reading_mode_summary), + title = stringResource(MR.strings.pref_show_reading_mode), + subtitle = stringResource(MR.strings.pref_show_reading_mode_summary), ), Preference.PreferenceItem.SwitchPreference( pref = readerPref.showNavigationOverlayOnStart(), - title = stringResource(R.string.pref_show_navigation_mode), - subtitle = stringResource(R.string.pref_show_navigation_mode_summary), + title = stringResource(MR.strings.pref_show_navigation_mode), + subtitle = stringResource(MR.strings.pref_show_navigation_mode_summary), ), // SY --> Preference.PreferenceItem.SwitchPreference( pref = readerPref.forceHorizontalSeekbar(), - title = stringResource(R.string.pref_force_horz_seekbar), - subtitle = stringResource(R.string.pref_force_horz_seekbar_summary), + title = stringResource(SYMR.strings.pref_force_horz_seekbar), + subtitle = stringResource(SYMR.strings.pref_force_horz_seekbar_summary), ), Preference.PreferenceItem.SwitchPreference( pref = readerPref.landscapeVerticalSeekbar(), - title = stringResource(R.string.pref_show_vert_seekbar_landscape), - subtitle = stringResource(R.string.pref_show_vert_seekbar_landscape_summary), + title = stringResource(SYMR.strings.pref_show_vert_seekbar_landscape), + subtitle = stringResource(SYMR.strings.pref_show_vert_seekbar_landscape_summary), enabled = !forceHorizontalSeekbar, ), Preference.PreferenceItem.SwitchPreference( pref = readerPref.leftVerticalSeekbar(), - title = stringResource(R.string.pref_left_handed_vertical_seekbar), - subtitle = stringResource(R.string.pref_left_handed_vertical_seekbar_summary), + title = stringResource(SYMR.strings.pref_left_handed_vertical_seekbar), + subtitle = stringResource(SYMR.strings.pref_left_handed_vertical_seekbar_summary), enabled = !forceHorizontalSeekbar, ), // SY <-- Preference.PreferenceItem.SwitchPreference( pref = readerPref.trueColor(), - title = stringResource(R.string.pref_true_color), - subtitle = stringResource(R.string.pref_true_color_summary), + title = stringResource(MR.strings.pref_true_color), + subtitle = stringResource(MR.strings.pref_true_color_summary), enabled = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O, ), /* SY --> Preference.PreferenceItem.SwitchPreference( pref = readerPref.pageTransitions(), - title = stringResource(R.string.pref_page_transitions), + title = stringResource(MR.strings.pref_page_transitions), ), SY <-- */ Preference.PreferenceItem.SwitchPreference( pref = readerPref.flashOnPageChange(), - title = stringResource(R.string.pref_flash_page), - subtitle = stringResource(R.string.pref_flash_page_summ), + title = stringResource(MR.strings.pref_flash_page), + subtitle = stringResource(MR.strings.pref_flash_page_summ), ), getDisplayGroup(readerPreferences = readerPref), getReadingGroup(readerPreferences = readerPref), @@ -116,42 +115,42 @@ object SettingsReaderScreen : SearchableSettings { val fullscreenPref = readerPreferences.fullscreen() val fullscreen by fullscreenPref.collectAsState() return Preference.PreferenceGroup( - title = stringResource(R.string.pref_category_display), + title = stringResource(MR.strings.pref_category_display), preferenceItems = listOf( Preference.PreferenceItem.ListPreference( pref = readerPreferences.defaultOrientationType(), - title = stringResource(R.string.pref_rotation_type), + title = stringResource(MR.strings.pref_rotation_type), entries = ReaderOrientation.entries.drop(1) .associate { it.flagValue to stringResource(it.stringRes) }, ), Preference.PreferenceItem.ListPreference( pref = readerPreferences.readerTheme(), - title = stringResource(R.string.pref_reader_theme), + title = stringResource(MR.strings.pref_reader_theme), entries = mapOf( - 1 to stringResource(R.string.black_background), - 2 to stringResource(R.string.gray_background), - 0 to stringResource(R.string.white_background), - 3 to stringResource(R.string.automatic_background), + 1 to stringResource(MR.strings.black_background), + 2 to stringResource(MR.strings.gray_background), + 0 to stringResource(MR.strings.white_background), + 3 to stringResource(MR.strings.automatic_background), ), ), Preference.PreferenceItem.SwitchPreference( pref = fullscreenPref, - title = stringResource(R.string.pref_fullscreen), + title = stringResource(MR.strings.pref_fullscreen), ), Preference.PreferenceItem.SwitchPreference( pref = readerPreferences.cutoutShort(), - title = stringResource(R.string.pref_cutout_short), + title = stringResource(MR.strings.pref_cutout_short), enabled = fullscreen && Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && LocalView.current.rootWindowInsets?.displayCutout != null, // has cutout ), Preference.PreferenceItem.SwitchPreference( pref = readerPreferences.keepScreenOn(), - title = stringResource(R.string.pref_keep_screen_on), + title = stringResource(MR.strings.pref_keep_screen_on), ), Preference.PreferenceItem.SwitchPreference( pref = readerPreferences.showPageNumber(), - title = stringResource(R.string.pref_show_page_number), + title = stringResource(MR.strings.pref_show_page_number), ), ), ) @@ -160,23 +159,23 @@ object SettingsReaderScreen : SearchableSettings { @Composable private fun getReadingGroup(readerPreferences: ReaderPreferences): Preference.PreferenceGroup { return Preference.PreferenceGroup( - title = stringResource(R.string.pref_category_reading), + title = stringResource(MR.strings.pref_category_reading), preferenceItems = listOf( Preference.PreferenceItem.SwitchPreference( pref = readerPreferences.skipRead(), - title = stringResource(R.string.pref_skip_read_chapters), + title = stringResource(MR.strings.pref_skip_read_chapters), ), Preference.PreferenceItem.SwitchPreference( pref = readerPreferences.skipFiltered(), - title = stringResource(R.string.pref_skip_filtered_chapters), + title = stringResource(MR.strings.pref_skip_filtered_chapters), ), Preference.PreferenceItem.SwitchPreference( pref = readerPreferences.skipDupe(), - title = stringResource(R.string.pref_skip_dupe_chapters), + title = stringResource(MR.strings.pref_skip_dupe_chapters), ), Preference.PreferenceItem.SwitchPreference( pref = readerPreferences.alwaysShowChapterTransition(), - title = stringResource(R.string.pref_always_show_chapter_transition), + title = stringResource(MR.strings.pref_always_show_chapter_transition), ), ), ) @@ -195,63 +194,63 @@ object SettingsReaderScreen : SearchableSettings { val rotateToFit by rotateToFitPref.collectAsState() return Preference.PreferenceGroup( - title = stringResource(R.string.pager_viewer), + title = stringResource(MR.strings.pager_viewer), preferenceItems = listOf( Preference.PreferenceItem.ListPreference( pref = navModePref, - title = stringResource(R.string.pref_viewer_nav), + title = stringResource(MR.strings.pref_viewer_nav), entries = ReaderPreferences.TapZones .mapIndexed { index, it -> index to stringResource(it) } .toMap(), ), Preference.PreferenceItem.ListPreference( pref = readerPreferences.pagerNavInverted(), - title = stringResource(R.string.pref_read_with_tapping_inverted), + title = stringResource(MR.strings.pref_read_with_tapping_inverted), entries = mapOf( - ReaderPreferences.TappingInvertMode.NONE to stringResource(R.string.none), - ReaderPreferences.TappingInvertMode.HORIZONTAL to stringResource(R.string.tapping_inverted_horizontal), - ReaderPreferences.TappingInvertMode.VERTICAL to stringResource(R.string.tapping_inverted_vertical), - ReaderPreferences.TappingInvertMode.BOTH to stringResource(R.string.tapping_inverted_both), + ReaderPreferences.TappingInvertMode.NONE to stringResource(MR.strings.none), + ReaderPreferences.TappingInvertMode.HORIZONTAL to stringResource(MR.strings.tapping_inverted_horizontal), + ReaderPreferences.TappingInvertMode.VERTICAL to stringResource(MR.strings.tapping_inverted_vertical), + ReaderPreferences.TappingInvertMode.BOTH to stringResource(MR.strings.tapping_inverted_both), ), enabled = navMode != 5, ), Preference.PreferenceItem.ListPreference( pref = imageScaleTypePref, - title = stringResource(R.string.pref_image_scale_type), + title = stringResource(MR.strings.pref_image_scale_type), entries = ReaderPreferences.ImageScaleType .mapIndexed { index, it -> index + 1 to stringResource(it) } .toMap(), ), Preference.PreferenceItem.ListPreference( pref = readerPreferences.zoomStart(), - title = stringResource(R.string.pref_zoom_start), + title = stringResource(MR.strings.pref_zoom_start), entries = ReaderPreferences.ZoomStart .mapIndexed { index, it -> index + 1 to stringResource(it) } .toMap(), ), Preference.PreferenceItem.SwitchPreference( pref = readerPreferences.cropBorders(), - title = stringResource(R.string.pref_crop_borders), + title = stringResource(MR.strings.pref_crop_borders), ), // SY --> Preference.PreferenceItem.SwitchPreference( pref = readerPreferences.pageTransitionsPager(), - title = stringResource(R.string.pref_page_transitions), + title = stringResource(MR.strings.pref_page_transitions), ), // SY <-- Preference.PreferenceItem.SwitchPreference( pref = readerPreferences.landscapeZoom(), - title = stringResource(R.string.pref_landscape_zoom), + title = stringResource(MR.strings.pref_landscape_zoom), enabled = imageScaleType == 1, ), Preference.PreferenceItem.SwitchPreference( pref = readerPreferences.navigateToPan(), - title = stringResource(R.string.pref_navigate_pan), + title = stringResource(MR.strings.pref_navigate_pan), enabled = navMode != 5, ), Preference.PreferenceItem.SwitchPreference( pref = dualPageSplitPref, - title = stringResource(R.string.pref_dual_page_split), + title = stringResource(MR.strings.pref_dual_page_split), onValueChanged = { rotateToFitPref.set(false) true @@ -259,13 +258,13 @@ object SettingsReaderScreen : SearchableSettings { ), Preference.PreferenceItem.SwitchPreference( pref = readerPreferences.dualPageInvertPaged(), - title = stringResource(R.string.pref_dual_page_invert), - subtitle = stringResource(R.string.pref_dual_page_invert_summary), + title = stringResource(MR.strings.pref_dual_page_invert), + subtitle = stringResource(MR.strings.pref_dual_page_invert_summary), enabled = dualPageSplit, ), Preference.PreferenceItem.SwitchPreference( pref = rotateToFitPref, - title = stringResource(R.string.pref_page_rotate), + title = stringResource(MR.strings.pref_page_rotate), onValueChanged = { dualPageSplitPref.set(false) true @@ -273,7 +272,7 @@ object SettingsReaderScreen : SearchableSettings { ), Preference.PreferenceItem.SwitchPreference( pref = readerPreferences.dualPageRotateToFitInvert(), - title = stringResource(R.string.pref_page_rotate_invert), + title = stringResource(MR.strings.pref_page_rotate_invert), enabled = rotateToFit, ), ), @@ -293,29 +292,29 @@ object SettingsReaderScreen : SearchableSettings { val webtoonSidePadding by webtoonSidePaddingPref.collectAsState() return Preference.PreferenceGroup( - title = stringResource(R.string.webtoon_viewer), + title = stringResource(MR.strings.webtoon_viewer), preferenceItems = listOf( Preference.PreferenceItem.ListPreference( pref = navModePref, - title = stringResource(R.string.pref_viewer_nav), + title = stringResource(MR.strings.pref_viewer_nav), entries = ReaderPreferences.TapZones .mapIndexed { index, it -> index to stringResource(it) } .toMap(), ), Preference.PreferenceItem.ListPreference( pref = readerPreferences.webtoonNavInverted(), - title = stringResource(R.string.pref_read_with_tapping_inverted), + title = stringResource(MR.strings.pref_read_with_tapping_inverted), entries = mapOf( - ReaderPreferences.TappingInvertMode.NONE to stringResource(R.string.none), - ReaderPreferences.TappingInvertMode.HORIZONTAL to stringResource(R.string.tapping_inverted_horizontal), - ReaderPreferences.TappingInvertMode.VERTICAL to stringResource(R.string.tapping_inverted_vertical), - ReaderPreferences.TappingInvertMode.BOTH to stringResource(R.string.tapping_inverted_both), + ReaderPreferences.TappingInvertMode.NONE to stringResource(MR.strings.none), + ReaderPreferences.TappingInvertMode.HORIZONTAL to stringResource(MR.strings.tapping_inverted_horizontal), + ReaderPreferences.TappingInvertMode.VERTICAL to stringResource(MR.strings.tapping_inverted_vertical), + ReaderPreferences.TappingInvertMode.BOTH to stringResource(MR.strings.tapping_inverted_both), ), enabled = navMode != 5, ), Preference.PreferenceItem.SliderPreference( value = webtoonSidePadding, - title = stringResource(R.string.pref_webtoon_side_padding), + title = stringResource(MR.strings.pref_webtoon_side_padding), subtitle = numberFormat.format(webtoonSidePadding / 100f), min = ReaderPreferences.WEBTOON_PADDING_MIN, max = ReaderPreferences.WEBTOON_PADDING_MAX, @@ -326,41 +325,41 @@ object SettingsReaderScreen : SearchableSettings { ), Preference.PreferenceItem.ListPreference( pref = readerPreferences.readerHideThreshold(), - title = stringResource(R.string.pref_hide_threshold), + title = stringResource(MR.strings.pref_hide_threshold), entries = mapOf( - ReaderPreferences.ReaderHideThreshold.HIGHEST to stringResource(R.string.pref_highest), - ReaderPreferences.ReaderHideThreshold.HIGH to stringResource(R.string.pref_high), - ReaderPreferences.ReaderHideThreshold.LOW to stringResource(R.string.pref_low), - ReaderPreferences.ReaderHideThreshold.LOWEST to stringResource(R.string.pref_lowest), + ReaderPreferences.ReaderHideThreshold.HIGHEST to stringResource(MR.strings.pref_highest), + ReaderPreferences.ReaderHideThreshold.HIGH to stringResource(MR.strings.pref_high), + ReaderPreferences.ReaderHideThreshold.LOW to stringResource(MR.strings.pref_low), + ReaderPreferences.ReaderHideThreshold.LOWEST to stringResource(MR.strings.pref_lowest), ), ), Preference.PreferenceItem.SwitchPreference( pref = readerPreferences.cropBordersWebtoon(), - title = stringResource(R.string.pref_crop_borders), + title = stringResource(MR.strings.pref_crop_borders), ), Preference.PreferenceItem.SwitchPreference( pref = dualPageSplitPref, - title = stringResource(R.string.pref_dual_page_split), + title = stringResource(MR.strings.pref_dual_page_split), ), Preference.PreferenceItem.SwitchPreference( pref = readerPreferences.dualPageInvertWebtoon(), - title = stringResource(R.string.pref_dual_page_invert), - subtitle = stringResource(R.string.pref_dual_page_invert_summary), + title = stringResource(MR.strings.pref_dual_page_invert), + subtitle = stringResource(MR.strings.pref_dual_page_invert_summary), enabled = dualPageSplit, ), Preference.PreferenceItem.SwitchPreference( pref = readerPreferences.webtoonDoubleTapZoomEnabled(), - title = stringResource(R.string.pref_double_tap_zoom), + title = stringResource(MR.strings.pref_double_tap_zoom), enabled = true, ), // SY --> Preference.PreferenceItem.SwitchPreference( pref = readerPreferences.pageTransitionsWebtoon(), - title = stringResource(R.string.pref_page_transitions), + title = stringResource(MR.strings.pref_page_transitions), ), Preference.PreferenceItem.SwitchPreference( pref = readerPreferences.webtoonEnableZoomOut(), - title = stringResource(R.string.enable_zoom_out), + title = stringResource(SYMR.strings.enable_zoom_out), ), // SY <-- ), @@ -371,16 +370,16 @@ object SettingsReaderScreen : SearchableSettings { @Composable private fun getContinuousVerticalGroup(readerPreferences: ReaderPreferences): Preference.PreferenceGroup { return Preference.PreferenceGroup( - title = stringResource(R.string.vertical_plus_viewer), + title = stringResource(MR.strings.vertical_plus_viewer), preferenceItems = listOf( Preference.PreferenceItem.SwitchPreference( pref = readerPreferences.continuousVerticalTappingByPage(), - title = stringResource(R.string.tap_scroll_page), - subtitle = stringResource(R.string.tap_scroll_page_summary), + title = stringResource(SYMR.strings.tap_scroll_page), + subtitle = stringResource(SYMR.strings.tap_scroll_page_summary), ), Preference.PreferenceItem.SwitchPreference( pref = readerPreferences.cropBordersContinuousVertical(), - title = stringResource(R.string.pref_crop_borders), + title = stringResource(MR.strings.pref_crop_borders), ), ), ) @@ -392,15 +391,15 @@ object SettingsReaderScreen : SearchableSettings { val readWithVolumeKeysPref = readerPreferences.readWithVolumeKeys() val readWithVolumeKeys by readWithVolumeKeysPref.collectAsState() return Preference.PreferenceGroup( - title = stringResource(R.string.pref_reader_navigation), + title = stringResource(MR.strings.pref_reader_navigation), preferenceItems = listOf( Preference.PreferenceItem.SwitchPreference( pref = readWithVolumeKeysPref, - title = stringResource(R.string.pref_read_with_volume_keys), + title = stringResource(MR.strings.pref_read_with_volume_keys), ), Preference.PreferenceItem.SwitchPreference( pref = readerPreferences.readWithVolumeKeysInverted(), - title = stringResource(R.string.pref_read_with_volume_keys_inverted), + title = stringResource(MR.strings.pref_read_with_volume_keys_inverted), enabled = readWithVolumeKeys, ), ), @@ -410,16 +409,16 @@ object SettingsReaderScreen : SearchableSettings { @Composable private fun getActionsGroup(readerPreferences: ReaderPreferences): Preference.PreferenceGroup { return Preference.PreferenceGroup( - title = stringResource(R.string.pref_reader_actions), + title = stringResource(MR.strings.pref_reader_actions), preferenceItems = listOf( Preference.PreferenceItem.SwitchPreference( pref = readerPreferences.readWithLongTap(), - title = stringResource(R.string.pref_read_with_long_tap), + title = stringResource(MR.strings.pref_read_with_long_tap), ), Preference.PreferenceItem.SwitchPreference( pref = readerPreferences.folderPerManga(), - title = stringResource(R.string.pref_create_folder_per_manga), - subtitle = stringResource(R.string.pref_create_folder_per_manga_summary), + title = stringResource(MR.strings.pref_create_folder_per_manga), + subtitle = stringResource(MR.strings.pref_create_folder_per_manga_summary), ), ), ) @@ -429,33 +428,33 @@ object SettingsReaderScreen : SearchableSettings { @Composable private fun getPageDownloadingGroup(readerPreferences: ReaderPreferences): Preference.PreferenceGroup { return Preference.PreferenceGroup( - title = stringResource(R.string.page_downloading), + title = stringResource(SYMR.strings.page_downloading), preferenceItems = listOf( Preference.PreferenceItem.ListPreference( pref = readerPreferences.preloadSize(), - title = stringResource(R.string.reader_preload_amount), - subtitle = stringResource(R.string.reader_preload_amount_summary), + title = stringResource(SYMR.strings.reader_preload_amount), + subtitle = stringResource(SYMR.strings.reader_preload_amount_summary), entries = mapOf( - 4 to stringResource(R.string.reader_preload_amount_4_pages), - 6 to stringResource(R.string.reader_preload_amount_6_pages), - 8 to stringResource(R.string.reader_preload_amount_8_pages), - 10 to stringResource(R.string.reader_preload_amount_10_pages), - 12 to stringResource(R.string.reader_preload_amount_12_pages), - 14 to stringResource(R.string.reader_preload_amount_14_pages), - 16 to stringResource(R.string.reader_preload_amount_16_pages), - 20 to stringResource(R.string.reader_preload_amount_20_pages), + 4 to stringResource(SYMR.strings.reader_preload_amount_4_pages), + 6 to stringResource(SYMR.strings.reader_preload_amount_6_pages), + 8 to stringResource(SYMR.strings.reader_preload_amount_8_pages), + 10 to stringResource(SYMR.strings.reader_preload_amount_10_pages), + 12 to stringResource(SYMR.strings.reader_preload_amount_12_pages), + 14 to stringResource(SYMR.strings.reader_preload_amount_14_pages), + 16 to stringResource(SYMR.strings.reader_preload_amount_16_pages), + 20 to stringResource(SYMR.strings.reader_preload_amount_20_pages), ), ), Preference.PreferenceItem.ListPreference( pref = readerPreferences.readerThreads(), - title = stringResource(R.string.download_threads), - subtitle = stringResource(R.string.download_threads_summary), + title = stringResource(SYMR.strings.download_threads), + subtitle = stringResource(SYMR.strings.download_threads_summary), entries = List(5) { it }.associateWith { it.toString() }, ), Preference.PreferenceItem.ListPreference( pref = readerPreferences.cacheSize(), - title = stringResource(R.string.reader_cache_size), - subtitle = stringResource(R.string.reader_cache_size_summary), + title = stringResource(SYMR.strings.reader_cache_size), + subtitle = stringResource(SYMR.strings.reader_cache_size_summary), entries = mapOf( "50" to "50 MB", "75" to "75 MB", @@ -477,8 +476,8 @@ object SettingsReaderScreen : SearchableSettings { ), Preference.PreferenceItem.SwitchPreference( pref = readerPreferences.aggressivePageLoading(), - title = stringResource(R.string.aggressively_load_pages), - subtitle = stringResource(R.string.aggressively_load_pages_summary), + title = stringResource(SYMR.strings.aggressively_load_pages), + subtitle = stringResource(SYMR.strings.aggressively_load_pages_summary), ), ), ) @@ -488,54 +487,54 @@ object SettingsReaderScreen : SearchableSettings { private fun getForkSettingsGroup(readerPreferences: ReaderPreferences): Preference.PreferenceGroup { val pageLayout by readerPreferences.pageLayout().collectAsState() return Preference.PreferenceGroup( - title = stringResource(R.string.pref_category_fork), + title = stringResource(SYMR.strings.pref_category_fork), preferenceItems = listOf( Preference.PreferenceItem.SwitchPreference( pref = readerPreferences.readerInstantRetry(), - title = stringResource(R.string.skip_queue_on_retry), - subtitle = stringResource(R.string.skip_queue_on_retry_summary), + title = stringResource(SYMR.strings.skip_queue_on_retry), + subtitle = stringResource(SYMR.strings.skip_queue_on_retry_summary), ), Preference.PreferenceItem.SwitchPreference( pref = readerPreferences.preserveReadingPosition(), - title = stringResource(R.string.preserve_reading_position), + title = stringResource(SYMR.strings.preserve_reading_position), ), Preference.PreferenceItem.SwitchPreference( pref = readerPreferences.useAutoWebtoon(), - title = stringResource(R.string.auto_webtoon_mode), - subtitle = stringResource(R.string.auto_webtoon_mode_summary), + title = stringResource(SYMR.strings.auto_webtoon_mode), + subtitle = stringResource(SYMR.strings.auto_webtoon_mode_summary), ), Preference.PreferenceItem.MultiSelectListPreference( pref = readerPreferences.readerBottomButtons(), - title = stringResource(R.string.reader_bottom_buttons), - subtitle = stringResource(R.string.reader_bottom_buttons_summary), + title = stringResource(SYMR.strings.reader_bottom_buttons), + subtitle = stringResource(SYMR.strings.reader_bottom_buttons_summary), entries = ReaderBottomButton.values() .associate { it.value to stringResource(it.stringRes) }, ), Preference.PreferenceItem.ListPreference( pref = readerPreferences.pageLayout(), - title = stringResource(R.string.page_layout), - subtitle = stringResource(R.string.automatic_can_still_switch), + title = stringResource(SYMR.strings.page_layout), + subtitle = stringResource(SYMR.strings.automatic_can_still_switch), entries = ReaderPreferences.PageLayouts .mapIndexed { index, it -> index + 1 to stringResource(it) } .toMap(), ), Preference.PreferenceItem.SwitchPreference( pref = readerPreferences.invertDoublePages(), - title = stringResource(R.string.invert_double_pages), + title = stringResource(SYMR.strings.invert_double_pages), enabled = pageLayout != PagerConfig.PageLayout.SINGLE_PAGE, ), Preference.PreferenceItem.ListPreference( pref = readerPreferences.centerMarginType(), - title = stringResource(R.string.center_margin), - subtitle = stringResource(R.string.pref_center_margin_summary), + title = stringResource(SYMR.strings.center_margin), + subtitle = stringResource(SYMR.strings.pref_center_margin_summary), entries = ReaderPreferences.CenterMarginTypes .mapIndexed { index, it -> index + 1 to stringResource(it) } .toMap(), ), Preference.PreferenceItem.SwitchPreference( pref = readerPreferences.cacheArchiveMangaOnDisk(), - title = stringResource(R.string.cache_archived_manga_to_disk), - subtitle = stringResource(R.string.cache_archived_manga_to_disk_subtitle), + title = stringResource(SYMR.strings.cache_archived_manga_to_disk), + subtitle = stringResource(SYMR.strings.cache_archived_manga_to_disk_subtitle), ), ), ) diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsSecurityScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsSecurityScreen.kt index 28ae59c8a..03ffe4f19 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsSecurityScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsSecurityScreen.kt @@ -1,6 +1,5 @@ package eu.kanade.presentation.more.settings.screen -import androidx.annotation.StringRes import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth @@ -35,8 +34,6 @@ import androidx.compose.ui.input.key.Key import androidx.compose.ui.input.key.key import androidx.compose.ui.input.key.onKeyEvent import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.pluralStringResource -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.PasswordVisualTransformation @@ -46,14 +43,19 @@ import androidx.compose.ui.window.DialogProperties import androidx.fragment.app.FragmentActivity import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow +import dev.icerock.moko.resources.StringResource import eu.kanade.presentation.more.settings.Preference -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.core.security.SecurityPreferences import eu.kanade.tachiyomi.ui.base.delegate.SecureActivityDelegate import eu.kanade.tachiyomi.ui.category.biometric.BiometricTimesScreen import eu.kanade.tachiyomi.util.storage.CbzCrypto import eu.kanade.tachiyomi.util.system.AuthenticatorUtil.authenticate import eu.kanade.tachiyomi.util.system.AuthenticatorUtil.isAuthenticationSupported +import tachiyomi.core.i18n.stringResource +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR +import tachiyomi.presentation.core.i18n.pluralStringResource +import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.collectAsState import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -62,8 +64,7 @@ object SettingsSecurityScreen : SearchableSettings { @ReadOnlyComposable @Composable - @StringRes - override fun getTitleRes() = R.string.pref_category_security + override fun getTitleRes() = MR.strings.pref_category_security @Composable override fun getPreferences(): List { @@ -81,54 +82,54 @@ object SettingsSecurityScreen : SearchableSettings { return listOf( Preference.PreferenceItem.SwitchPreference( pref = useAuthPref, - title = stringResource(R.string.lock_with_biometrics), + title = stringResource(MR.strings.lock_with_biometrics), enabled = authSupported, onValueChanged = { (context as FragmentActivity).authenticate( - title = context.getString(R.string.lock_with_biometrics), + title = context.stringResource(MR.strings.lock_with_biometrics), ) }, ), Preference.PreferenceItem.ListPreference( pref = securityPreferences.lockAppAfter(), - title = stringResource(R.string.lock_when_idle), + title = stringResource(MR.strings.lock_when_idle), enabled = authSupported && useAuth, entries = LockAfterValues .associateWith { when (it) { - -1 -> stringResource(R.string.lock_never) - 0 -> stringResource(R.string.lock_always) - else -> pluralStringResource(id = R.plurals.lock_after_mins, count = it, it) + -1 -> stringResource(MR.strings.lock_never) + 0 -> stringResource(MR.strings.lock_always) + else -> pluralStringResource(MR.plurals.lock_after_mins, count = it, it) } }, onValueChanged = { (context as FragmentActivity).authenticate( - title = context.getString(R.string.lock_when_idle), + title = context.stringResource(MR.strings.lock_when_idle), ) }, ), Preference.PreferenceItem.SwitchPreference( pref = securityPreferences.hideNotificationContent(), - title = stringResource(R.string.hide_notification_content), + title = stringResource(MR.strings.hide_notification_content), ), Preference.PreferenceItem.ListPreference( pref = securityPreferences.secureScreen(), - title = stringResource(R.string.secure_screen), + title = stringResource(MR.strings.secure_screen), entries = SecurityPreferences.SecureScreenMode.entries - .associateWith { stringResource(it.titleResId) }, + .associateWith { stringResource(it.titleRes) }, ), // SY --> Preference.PreferenceItem.SwitchPreference( pref = securityPreferences.passwordProtectDownloads(), - title = stringResource(R.string.password_protect_downloads), - subtitle = stringResource(R.string.password_protect_downloads_summary), + title = stringResource(SYMR.strings.password_protect_downloads), + subtitle = stringResource(SYMR.strings.password_protect_downloads_summary), enabled = isCbzPasswordSet, ), Preference.PreferenceItem.ListPreference( pref = securityPreferences.encryptionType(), - title = stringResource(R.string.encryption_type), - entries = SecurityPreferences.EncryptionType.values() - .associateWith { stringResource(it.titleResId) }, + title = stringResource(SYMR.strings.encryption_type), + entries = SecurityPreferences.EncryptionType.entries + .associateWith { stringResource(it.titleRes) }, enabled = passwordProtectDownloads, ), @@ -146,14 +147,14 @@ object SettingsSecurityScreen : SearchableSettings { ) } Preference.PreferenceItem.TextPreference( - title = stringResource(R.string.set_cbz_zip_password), + title = stringResource(SYMR.strings.set_cbz_zip_password), onClick = { dialogOpen = true }, ) }, Preference.PreferenceItem.TextPreference( - title = stringResource(R.string.delete_cbz_archive_password), + title = stringResource(SYMR.strings.delete_cbz_archive_password), onClick = { CbzCrypto.deleteKeyCbz() securityPreferences.cbzPassword().set("") @@ -164,9 +165,9 @@ object SettingsSecurityScreen : SearchableSettings { val navigator = LocalNavigator.currentOrThrow val count by securityPreferences.authenticatorTimeRanges().collectAsState() Preference.PreferenceItem.TextPreference( - title = stringResource(R.string.action_edit_biometric_lock_times), + title = stringResource(SYMR.strings.action_edit_biometric_lock_times), subtitle = pluralStringResource( - R.plurals.num_lock_times, + SYMR.plurals.num_lock_times, count.size, count.size, ), @@ -190,26 +191,26 @@ object SettingsSecurityScreen : SearchableSettings { ) } Preference.PreferenceItem.TextPreference( - title = stringResource(R.string.biometric_lock_days), - subtitle = stringResource(R.string.biometric_lock_days_summary), + title = stringResource(SYMR.strings.biometric_lock_days), + subtitle = stringResource(SYMR.strings.biometric_lock_days_summary), onClick = { dialogOpen = true }, enabled = useAuth, ) }, // SY <-- - Preference.PreferenceItem.InfoPreference(stringResource(R.string.secure_screen_summary)), + Preference.PreferenceItem.InfoPreference(stringResource(MR.strings.secure_screen_summary)), ) } // SY --> - enum class DayOption(val day: Int, val stringRes: Int) { - Sunday(SecureActivityDelegate.LOCK_SUNDAY, R.string.sunday), - Monday(SecureActivityDelegate.LOCK_MONDAY, R.string.monday), - Tuesday(SecureActivityDelegate.LOCK_TUESDAY, R.string.tuesday), - Wednesday(SecureActivityDelegate.LOCK_WEDNESDAY, R.string.wednesday), - Thursday(SecureActivityDelegate.LOCK_THURSDAY, R.string.thursday), - Friday(SecureActivityDelegate.LOCK_FRIDAY, R.string.friday), - Saturday(SecureActivityDelegate.LOCK_SATURDAY, R.string.saturday), + enum class DayOption(val day: Int, val stringRes: StringResource) { + Sunday(SecureActivityDelegate.LOCK_SUNDAY, SYMR.strings.sunday), + Monday(SecureActivityDelegate.LOCK_MONDAY, SYMR.strings.monday), + Tuesday(SecureActivityDelegate.LOCK_TUESDAY, SYMR.strings.tuesday), + Wednesday(SecureActivityDelegate.LOCK_WEDNESDAY, SYMR.strings.wednesday), + Thursday(SecureActivityDelegate.LOCK_THURSDAY, SYMR.strings.thursday), + Friday(SecureActivityDelegate.LOCK_FRIDAY, SYMR.strings.friday), + Saturday(SecureActivityDelegate.LOCK_SATURDAY, SYMR.strings.saturday), } @Composable @@ -224,7 +225,7 @@ object SettingsSecurityScreen : SearchableSettings { } AlertDialog( onDismissRequest = onDismissRequest, - title = { Text(text = stringResource(R.string.biometric_lock_days)) }, + title = { Text(text = stringResource(SYMR.strings.biometric_lock_days)) }, text = { LazyColumn { DayOption.values().forEach { day -> @@ -269,12 +270,12 @@ object SettingsSecurityScreen : SearchableSettings { ) }, ) { - Text(text = stringResource(R.string.action_ok)) + Text(text = stringResource(MR.strings.action_ok)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { - Text(text = stringResource(R.string.action_cancel)) + Text(text = stringResource(MR.strings.action_cancel)) } }, ) @@ -290,15 +291,15 @@ object SettingsSecurityScreen : SearchableSettings { AlertDialog( onDismissRequest = onDismissRequest, - title = { Text(text = stringResource(R.string.cbz_archive_password)) }, + title = { Text(text = stringResource(SYMR.strings.cbz_archive_password)) }, text = { TextField( value = password, onValueChange = { password = it }, maxLines = 1, - placeholder = { Text(text = stringResource(R.string.password)) }, - label = { Text(text = stringResource(R.string.password)) }, + placeholder = { Text(text = stringResource(MR.strings.password)) }, + label = { Text(text = stringResource(MR.strings.password)) }, trailingIcon = { IconButton( onClick = { @@ -344,12 +345,12 @@ object SettingsSecurityScreen : SearchableSettings { onReturnPassword(password) }, ) { - Text(text = stringResource(R.string.action_ok)) + Text(text = stringResource(MR.strings.action_ok)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { - Text(text = stringResource(R.string.action_cancel)) + Text(text = stringResource(MR.strings.action_cancel)) } }, ) diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/AboutScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/AboutScreen.kt index 1fcd76579..5d753c5c5 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/AboutScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/AboutScreen.kt @@ -47,7 +47,7 @@ import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.LinkIcon import tachiyomi.presentation.core.components.ScrollbarLazyColumn import tachiyomi.presentation.core.components.material.Scaffold -import tachiyomi.presentation.core.i18n.localize +import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.icons.CustomIcons import tachiyomi.presentation.core.icons.Discord import tachiyomi.presentation.core.icons.Facebook @@ -79,7 +79,7 @@ object AboutScreen : Screen() { Scaffold( topBar = { scrollBehavior -> AppBar( - title = localize(MR.strings.pref_category_about), + title = stringResource(MR.strings.pref_category_about), navigateUp = if (handleBack != null) handleBack::invoke else null, scrollBehavior = scrollBehavior, ) @@ -94,7 +94,7 @@ object AboutScreen : Screen() { item { TextPreferenceWidget( - title = localize(MR.strings.version), + title = stringResource(MR.strings.version), subtitle = getVersionName(withBuildDate = true), onPreferenceClick = { val deviceInfo = CrashLogUtil(context).getDebugInfo() @@ -106,7 +106,7 @@ object AboutScreen : Screen() { if (BuildConfig.INCLUDE_UPDATER) { item { TextPreferenceWidget( - title = localize(MR.strings.check_for_updates), + title = stringResource(MR.strings.check_for_updates), widget = { AnimatedVisibility(visible = isCheckingUpdates) { CircularProgressIndicator( @@ -145,7 +145,7 @@ object AboutScreen : Screen() { if (!BuildConfig.DEBUG) { item { TextPreferenceWidget( - title = localize(MR.string.whats_new), + title = stringResource(MR.strings.whats_new), // SY --> onPreferenceClick = { showWhatsNewDialog = true }, // SY <-- @@ -155,21 +155,21 @@ object AboutScreen : Screen() { item { TextPreferenceWidget( - title = localize(MR.strings.help_translate), + title = stringResource(MR.strings.help_translate), onPreferenceClick = { uriHandler.openUri("https://tachiyomi.org/docs/contribute#translation") }, ) } item { TextPreferenceWidget( - title = localize(MR.strings.licenses), + title = stringResource(MR.strings.licenses), onPreferenceClick = { navigator.push(OpenSourceLicensesScreen()) }, ) } item { TextPreferenceWidget( - title = localize(MR.strings.privacy_policy), + title = stringResource(MR.strings.privacy_policy), onPreferenceClick = { uriHandler.openUri("https://tachiyomi.org/privacy/") }, ) } @@ -182,7 +182,7 @@ object AboutScreen : Screen() { horizontalArrangement = Arrangement.Center, ) { LinkIcon( - label = localize(MR.strings.website), + label = stringResource(MR.strings.website), icon = Icons.Outlined.Public, url = "https://tachiyomi.org", ) diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/WhatsNewDialog.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/WhatsNewDialog.kt index c1de511a6..94b5d6ffe 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/WhatsNewDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/WhatsNewDialog.kt @@ -17,7 +17,6 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.produceState import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.buildAnnotatedString @@ -31,7 +30,10 @@ import nl.adaptivity.xmlutil.serialization.XML import nl.adaptivity.xmlutil.serialization.XmlSerialName import nl.adaptivity.xmlutil.serialization.XmlValue import tachiyomi.core.util.lang.withIOContext +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.material.padding +import tachiyomi.presentation.core.i18n.stringResource @Composable fun WhatsNewDialog(onDismissRequest: () -> Unit) { @@ -39,11 +41,11 @@ fun WhatsNewDialog(onDismissRequest: () -> Unit) { onDismissRequest = onDismissRequest, confirmButton = { TextButton(onClick = onDismissRequest) { - Text(text = stringResource(R.string.action_cancel)) + Text(text = stringResource(MR.strings.action_cancel)) } }, title = { - Text(text = stringResource(R.string.whats_new)) + Text(text = stringResource(MR.strings.whats_new)) }, text = { Column { @@ -67,7 +69,7 @@ fun WhatsNewDialog(onDismissRequest: () -> Unit) { items(changelog.orEmpty()) { changelog -> Column(Modifier.fillMaxWidth()) { Text( - text = stringResource(R.string.changelog_version, changelog.version), + text = stringResource(SYMR.strings.changelog_version, changelog.version), color = MaterialTheme.colorScheme.primary, fontWeight = FontWeight.Bold, style = MaterialTheme.typography.titleSmall, diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/advanced/ClearDatabaseScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/advanced/ClearDatabaseScreen.kt index 9d2fb44f8..dd6cd15d4 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/advanced/ClearDatabaseScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/advanced/ClearDatabaseScreen.kt @@ -30,7 +30,6 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.compose.ui.util.fastMap import cafe.adriel.voyager.core.model.StateScreenModel @@ -42,7 +41,6 @@ import eu.kanade.presentation.browse.components.SourceIcon import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.util.Screen -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.util.system.toast import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.flow.collectLatest @@ -54,8 +52,11 @@ import tachiyomi.data.Database import tachiyomi.domain.source.interactor.GetSourcesWithNonLibraryManga import tachiyomi.domain.source.model.Source import tachiyomi.domain.source.model.SourceWithCount +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.LabeledCheckbox import tachiyomi.presentation.core.components.material.Scaffold +import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.LoadingScreen import tachiyomi.presentation.core.util.selectedBackground @@ -90,26 +91,26 @@ class ClearDatabaseScreen : Screen() { // SY <-- model.clearSelection() model.hideConfirmation() - context.toast(R.string.clear_database_completed) + context.toast(MR.strings.clear_database_completed) } }, ) { - Text(text = stringResource(R.string.action_ok)) + Text(text = stringResource(MR.strings.action_ok)) } }, dismissButton = { TextButton(onClick = model::hideConfirmation) { - Text(text = stringResource(R.string.action_cancel)) + Text(text = stringResource(MR.strings.action_cancel)) } }, text = { // SY --> Column { // SY <-- - Text(text = stringResource(R.string.clear_database_confirmation)) + Text(text = stringResource(MR.strings.clear_database_confirmation)) // SY --> LabeledCheckbox( - label = stringResource(R.string.clear_db_exclude_read), + label = stringResource(SYMR.strings.clear_db_exclude_read), checked = keepReadManga, onCheckedChange = { keepReadManga = it }, ) @@ -122,19 +123,19 @@ class ClearDatabaseScreen : Screen() { Scaffold( topBar = { scrollBehavior -> AppBar( - title = stringResource(R.string.pref_clear_database), + title = stringResource(MR.strings.pref_clear_database), navigateUp = navigator::pop, actions = { if (s.items.isNotEmpty()) { AppBarActions( actions = persistentListOf( AppBar.Action( - title = stringResource(R.string.action_select_all), + title = stringResource(MR.strings.action_select_all), icon = Icons.Outlined.SelectAll, onClick = model::selectAll, ), AppBar.Action( - title = stringResource(R.string.action_select_all), + title = stringResource(MR.strings.action_select_all), icon = Icons.Outlined.FlipToBack, onClick = model::invertSelection, ), @@ -148,7 +149,7 @@ class ClearDatabaseScreen : Screen() { ) { contentPadding -> if (s.items.isEmpty()) { EmptyScreen( - message = stringResource(R.string.database_clean), + message = stringResource(MR.strings.database_clean), modifier = Modifier.padding(contentPadding), ) } else { @@ -180,7 +181,7 @@ class ClearDatabaseScreen : Screen() { enabled = s.selection.isNotEmpty(), ) { Text( - text = stringResource(R.string.action_delete), + text = stringResource(MR.strings.action_delete), color = MaterialTheme.colorScheme.onPrimary, ) } @@ -216,7 +217,7 @@ class ClearDatabaseScreen : Screen() { text = source.visualName, style = MaterialTheme.typography.bodyMedium, ) - Text(text = stringResource(R.string.clear_database_source_item_count, count)) + Text(text = stringResource(MR.strings.clear_database_source_item_count, count)) } Checkbox( checked = isSelected, diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/data/CreateBackupScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/data/CreateBackupScreen.kt index e28a4ab15..926c4f604 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/data/CreateBackupScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/data/CreateBackupScreen.kt @@ -22,7 +22,6 @@ import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.rememberScreenModel @@ -30,7 +29,6 @@ import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.util.Screen -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.backup.BackupCreateFlags import eu.kanade.tachiyomi.data.backup.BackupCreateJob import eu.kanade.tachiyomi.data.backup.models.Backup @@ -41,9 +39,12 @@ import kotlinx.collections.immutable.minus import kotlinx.collections.immutable.plus import kotlinx.collections.immutable.toPersistentSet import kotlinx.coroutines.flow.update +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.LabeledCheckbox import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.padding +import tachiyomi.presentation.core.i18n.stringResource class CreateBackupScreen : Screen() { @@ -71,7 +72,7 @@ class CreateBackupScreen : Screen() { Scaffold( topBar = { AppBar( - title = stringResource(R.string.pref_create_backup), + title = stringResource(MR.strings.pref_create_backup), navigateUp = navigator::pop, scrollBehavior = it, ) @@ -89,7 +90,7 @@ class CreateBackupScreen : Screen() { ) { item { LabeledCheckbox( - label = stringResource(R.string.manga), + label = stringResource(MR.strings.manga), checked = true, onCheckedChange = {}, enabled = false, @@ -117,20 +118,20 @@ class CreateBackupScreen : Screen() { onClick = { if (!BackupCreateJob.isManualJobRunning(context)) { if (DeviceUtil.isMiui && DeviceUtil.isMiuiOptimizationDisabled()) { - context.toast(R.string.restore_miui_warning, Toast.LENGTH_LONG) + context.toast(MR.strings.restore_miui_warning, Toast.LENGTH_LONG) } try { chooseBackupDir.launch(Backup.getFilename()) } catch (e: ActivityNotFoundException) { - context.toast(R.string.file_picker_error) + context.toast(MR.strings.file_picker_error) } } else { - context.toast(R.string.backup_in_progress) + context.toast(MR.strings.backup_in_progress) } }, ) { Text( - text = stringResource(R.string.action_create), + text = stringResource(MR.strings.action_create), color = MaterialTheme.colorScheme.onPrimary, ) } @@ -163,14 +164,14 @@ private class CreateBackupScreenModel : StateScreenModel - BackupCreateFlags.BACKUP_CUSTOM_INFO to R.string.custom_entry_info, - BackupCreateFlags.BACKUP_READ_MANGA to R.string.all_read_entries, + BackupCreateFlags.BACKUP_CUSTOM_INFO to SYMR.strings.custom_entry_info, + BackupCreateFlags.BACKUP_READ_MANGA to SYMR.strings.all_read_entries, // SY <-- ) diff --git a/app/src/main/java/eu/kanade/presentation/reader/ChapterListDialog.kt b/app/src/main/java/eu/kanade/presentation/reader/ChapterListDialog.kt index 0137a59ea..29d93ac15 100644 --- a/app/src/main/java/eu/kanade/presentation/reader/ChapterListDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/reader/ChapterListDialog.kt @@ -19,6 +19,7 @@ import eu.kanade.tachiyomi.ui.reader.setting.ReaderSettingsScreenModel import eu.kanade.tachiyomi.util.lang.toRelativeString import exh.metadata.MetadataUtil import exh.source.isEhBasedManga +import kotlinx.collections.immutable.ImmutableList import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.library.service.LibraryPreferences import java.util.Date @@ -27,7 +28,7 @@ import java.util.Date fun ChapterListDialog( onDismissRequest: () -> Unit, screenModel: ReaderSettingsScreenModel, - chapters: List, + chapters: ImmutableList, onClickChapter: (Chapter) -> Unit, onBookmark: (Chapter) -> Unit, dateRelativeTime: Boolean, diff --git a/app/src/main/java/eu/kanade/presentation/reader/ReaderPageActionsDialog.kt b/app/src/main/java/eu/kanade/presentation/reader/ReaderPageActionsDialog.kt index 4873d4abe..afc45c1d6 100644 --- a/app/src/main/java/eu/kanade/presentation/reader/ReaderPageActionsDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/reader/ReaderPageActionsDialog.kt @@ -18,12 +18,13 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import eu.kanade.presentation.components.AdaptiveSheet -import eu.kanade.tachiyomi.R +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.ActionButton import tachiyomi.presentation.core.components.material.padding +import tachiyomi.presentation.core.i18n.stringResource @Composable fun ReaderPageActionsDialog( @@ -54,9 +55,9 @@ fun ReaderPageActionsDialog( title = stringResource( // SY --> if (hasExtraPage) { - R.string.action_set_first_page_cover + SYMR.strings.action_set_first_page_cover } else { - R.string.set_as_cover + MR.strings.set_as_cover }, // SY <-- ), @@ -68,9 +69,9 @@ fun ReaderPageActionsDialog( title = stringResource( // SY --> if (hasExtraPage) { - R.string.action_share_first_page + SYMR.strings.action_share_first_page } else { - R.string.action_share + MR.strings.action_share }, // SY <-- ), @@ -88,9 +89,9 @@ fun ReaderPageActionsDialog( title = stringResource( // SY --> if (hasExtraPage) { - R.string.action_save_first_page + SYMR.strings.action_save_first_page } else { - R.string.action_save + MR.strings.action_save }, // SY <-- ), @@ -109,7 +110,7 @@ fun ReaderPageActionsDialog( ) { ActionButton( modifier = Modifier.weight(1f), - title = stringResource(R.string.action_set_second_page_cover), + title = stringResource(SYMR.strings.action_set_second_page_cover), icon = Icons.Outlined.Photo, onClick = { showSetCoverDialog = true @@ -117,7 +118,7 @@ fun ReaderPageActionsDialog( ) ActionButton( modifier = Modifier.weight(1f), - title = stringResource(R.string.action_share_second_page), + title = stringResource(SYMR.strings.action_share_second_page), icon = Icons.Outlined.Share, onClick = { onShare(true) @@ -126,7 +127,7 @@ fun ReaderPageActionsDialog( ) ActionButton( modifier = Modifier.weight(1f), - title = stringResource(R.string.action_save_second_page), + title = stringResource(SYMR.strings.action_save_second_page), icon = Icons.Outlined.Save, onClick = { onSave(true) @@ -139,7 +140,7 @@ fun ReaderPageActionsDialog( ) { ActionButton( modifier = Modifier.weight(1f), - title = stringResource(R.string.action_share_combined_page), + title = stringResource(SYMR.strings.action_share_combined_page), icon = Icons.Outlined.Share, onClick = { onShareCombined() @@ -148,7 +149,7 @@ fun ReaderPageActionsDialog( ) ActionButton( modifier = Modifier.weight(1f), - title = stringResource(R.string.action_save_combined_page), + title = stringResource(SYMR.strings.action_save_combined_page), icon = Icons.Outlined.Save, onClick = { onSaveCombined() @@ -181,16 +182,16 @@ private fun SetCoverDialog( ) { AlertDialog( text = { - Text(stringResource(R.string.confirm_set_image_as_cover)) + Text(stringResource(MR.strings.confirm_set_image_as_cover)) }, confirmButton = { TextButton(onClick = onConfirm) { - Text(stringResource(R.string.action_ok)) + Text(stringResource(MR.strings.action_ok)) } }, dismissButton = { TextButton(onClick = onDismiss) { - Text(stringResource(R.string.action_cancel)) + Text(stringResource(MR.strings.action_cancel)) } }, onDismissRequest = onDismiss, 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 bbfb753d6..b5908c6ad 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 @@ -22,13 +22,15 @@ import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.reader.setting.ReaderBottomButton import eu.kanade.tachiyomi.ui.reader.setting.ReaderOrientation import eu.kanade.tachiyomi.ui.reader.setting.ReadingMode +import kotlinx.collections.immutable.ImmutableSet import tachiyomi.i18n.MR -import tachiyomi.presentation.core.i18n.localize +import tachiyomi.i18n.sy.SYMR +import tachiyomi.presentation.core.i18n.stringResource @Composable fun BottomReaderBar( // SY --> - enabledButtons: Set, + enabledButtons: ImmutableSet, // SY <-- backgroundColor: Color, readingMode: ReadingMode, @@ -61,7 +63,7 @@ fun BottomReaderBar( IconButton(onClick = onClickChapterList) { Icon( imageVector = Icons.Outlined.FormatListNumbered, - contentDescription = localize(MR.strings.chapters), + contentDescription = stringResource(MR.strings.chapters), ) } } @@ -70,7 +72,7 @@ fun BottomReaderBar( IconButton(onClick = onClickWebView) { Icon( imageVector = Icons.Outlined.Public, - contentDescription = localize(MR.strings.action_open_in_web_view), + contentDescription = stringResource(MR.strings.action_open_in_web_view), ) } } @@ -79,7 +81,7 @@ fun BottomReaderBar( IconButton(onClick = onClickShare) { Icon( imageVector = Icons.Outlined.Share, - contentDescription = localize(MR.strings.action_share), + contentDescription = stringResource(MR.strings.action_share), ) } } @@ -88,7 +90,7 @@ fun BottomReaderBar( IconButton(onClick = onClickReadingMode) { Icon( painter = painterResource(readingMode.iconRes), - contentDescription = localize(MR.strings.viewer), + contentDescription = stringResource(MR.strings.viewer), ) } } @@ -97,7 +99,7 @@ fun BottomReaderBar( IconButton(onClick = onClickOrientation) { Icon( painter = painterResource(orientation.iconRes), - contentDescription = localize(MR.strings.pref_rotation_type), + contentDescription = stringResource(MR.strings.pref_rotation_type), ) } } @@ -111,7 +113,7 @@ fun BottomReaderBar( IconButton(onClick = onClickCropBorder) { Icon( painter = painterResource(if (cropEnabled) R.drawable.ic_crop_24dp else R.drawable.ic_crop_off_24dp), - contentDescription = localize(MR.strings.pref_crop_borders), + contentDescription = stringResource(MR.strings.pref_crop_borders), ) } } @@ -124,7 +126,7 @@ fun BottomReaderBar( IconButton(onClick = onClickPageLayout) { Icon( painter = painterResource(R.drawable.ic_book_open_variant_24dp), - contentDescription = localize(MR.strings.page_layout), + contentDescription = stringResource(SYMR.strings.page_layout), ) } } @@ -133,7 +135,7 @@ fun BottomReaderBar( IconButton(onClick = onClickShiftPage) { Icon( painter = painterResource(R.drawable.ic_page_next_outline_24dp), - contentDescription = localize(MR.strings.shift_double_pages), + contentDescription = stringResource(SYMR.strings.shift_double_pages), ) } } @@ -141,7 +143,7 @@ fun BottomReaderBar( IconButton(onClick = onClickSettings) { Icon( imageVector = Icons.Outlined.Settings, - contentDescription = localize(MR.stringss.action_settings), + contentDescription = stringResource(MR.strings.action_settings), ) } // SY <-- diff --git a/app/src/main/java/eu/kanade/presentation/reader/appbars/ExhUtils.kt b/app/src/main/java/eu/kanade/presentation/reader/appbars/ExhUtils.kt index 2a1f7851e..da84fee5b 100644 --- a/app/src/main/java/eu/kanade/presentation/reader/appbars/ExhUtils.kt +++ b/app/src/main/java/eu/kanade/presentation/reader/appbars/ExhUtils.kt @@ -32,18 +32,17 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import eu.kanade.tachiyomi.R +import tachiyomi.i18n.sy.SYMR +import tachiyomi.presentation.core.i18n.stringResource @Composable fun ExhUtils( - modifier: Modifier = Modifier, isVisible: Boolean, onSetExhUtilsVisibility: (Boolean) -> Unit, backgroundColor: Color, @@ -57,6 +56,7 @@ fun ExhUtils( onClickRetryAllHelp: () -> Unit, onClickBoostPage: () -> Unit, onClickBoostPageHelp: () -> Unit, + modifier: Modifier = Modifier, ) { Column( modifier @@ -80,7 +80,7 @@ fun ExhUtils( verticalAlignment = Alignment.CenterVertically, ) { Text( - text = stringResource(R.string.eh_autoscroll), + text = stringResource(SYMR.strings.eh_autoscroll), color = MaterialTheme.colorScheme.onSurface, fontSize = 13.sp, fontFamily = FontFamily.SansSerif, @@ -123,7 +123,7 @@ fun ExhUtils( ) AnimatedVisibility(!isAutoScrollEnabled) { Text( - text = stringResource(R.string.eh_autoscroll_freq_invalid), + text = stringResource(SYMR.strings.eh_autoscroll_freq_invalid), color = MaterialTheme.colorScheme.error, style = MaterialTheme.typography.labelSmall, ) @@ -156,7 +156,7 @@ fun ExhUtils( modifier = Modifier.weight(3f), ) { Text( - text = stringResource(R.string.eh_retry_all), + text = stringResource(SYMR.strings.eh_retry_all), color = MaterialTheme.colorScheme.onSurface, fontSize = 13.sp, fontFamily = FontFamily.SansSerif, @@ -184,7 +184,7 @@ fun ExhUtils( modifier = Modifier.weight(3f), ) { Text( - text = stringResource(R.string.eh_boost_page), + text = stringResource(SYMR.strings.eh_boost_page), color = MaterialTheme.colorScheme.onSurface, fontSize = 13.sp, fontFamily = FontFamily.SansSerif, diff --git a/app/src/main/java/eu/kanade/presentation/reader/appbars/ReaderAppBars.kt b/app/src/main/java/eu/kanade/presentation/reader/appbars/ReaderAppBars.kt index bb7e81f74..4df1526c5 100644 --- a/app/src/main/java/eu/kanade/presentation/reader/appbars/ReaderAppBars.kt +++ b/app/src/main/java/eu/kanade/presentation/reader/appbars/ReaderAppBars.kt @@ -33,7 +33,7 @@ import eu.kanade.tachiyomi.ui.reader.setting.ReaderOrientation import eu.kanade.tachiyomi.ui.reader.setting.ReadingMode import eu.kanade.tachiyomi.ui.reader.viewer.Viewer import eu.kanade.tachiyomi.ui.reader.viewer.pager.R2LPagerViewer -import kotlinx.collections.immutable.persistentListOf +import kotlinx.collections.immutable.ImmutableSet private val animationSpec = tween(200) @@ -106,7 +106,7 @@ fun ReaderAppBars( onClickBoostPageHelp: () -> Unit, navBarType: NavBarType, currentPageText: String, - enabledButtons: Set, + enabledButtons: ImmutableSet, dualPageSplitEnabled: Boolean, doublePages: Boolean, onClickChapterList: () -> Unit, @@ -215,20 +215,20 @@ fun ReaderAppBars( listOfNotNull( AppBar.Action( title = stringResource( - if (bookmarked) R.string.action_remove_bookmark else R.string.action_bookmark + if (bookmarked) MR.strings.action_remove_bookmark else MR.strings.action_bookmark ), icon = if (bookmarked) Icons.Outlined.Bookmark else Icons.Outlined.BookmarkBorder, onClick = onToggleBookmarked, ), onOpenInWebView?.let { AppBar.OverflowAction( - title = stringResource(R.string.action_open_in_web_view), + title = stringResource(MR.strings.action_open_in_web_view), onClick = it, ) }, onShare?.let { AppBar.OverflowAction( - title = stringResource(R.string.action_share), + title = stringResource(MR.strings.action_share), onClick = it, ) }, diff --git a/app/src/main/java/eu/kanade/presentation/reader/components/ChapterNavigator.kt b/app/src/main/java/eu/kanade/presentation/reader/components/ChapterNavigator.kt index 5355f7a23..b338496bd 100644 --- a/app/src/main/java/eu/kanade/presentation/reader/components/ChapterNavigator.kt +++ b/app/src/main/java/eu/kanade/presentation/reader/components/ChapterNavigator.kt @@ -36,12 +36,12 @@ import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.layout.layout import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.platform.LocalLayoutDirection -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.Constraints import androidx.compose.ui.unit.LayoutDirection import androidx.compose.ui.unit.dp import eu.kanade.presentation.util.isTabletUi -import eu.kanade.tachiyomi.R +import tachiyomi.i18n.MR +import tachiyomi.presentation.core.i18n.stringResource import kotlin.math.roundToInt @Composable @@ -104,7 +104,7 @@ fun ChapterNavigator( Icon( imageVector = Icons.Outlined.SkipPrevious, contentDescription = stringResource( - if (isRtl) R.string.action_next_chapter else R.string.action_previous_chapter, + if (isRtl) MR.strings.action_next_chapter else MR.strings.action_previous_chapter, ), ) } @@ -158,7 +158,7 @@ fun ChapterNavigator( Icon( imageVector = Icons.Outlined.SkipNext, contentDescription = stringResource( - if (isRtl) R.string.action_previous_chapter else R.string.action_next_chapter, + if (isRtl) MR.strings.action_previous_chapter else MR.strings.action_next_chapter, ), ) } @@ -206,7 +206,7 @@ fun ChapterNavigatorVert( ) { Icon( imageVector = Icons.Outlined.SkipPrevious, - contentDescription = stringResource(R.string.action_previous_chapter), + contentDescription = stringResource(MR.strings.action_previous_chapter), modifier = Modifier.rotate(90f), ) } @@ -274,7 +274,7 @@ fun ChapterNavigatorVert( ) { Icon( imageVector = Icons.Outlined.SkipNext, - contentDescription = stringResource(R.string.action_next_chapter), + contentDescription = stringResource(MR.strings.action_next_chapter), modifier = Modifier.rotate(90f), ) } diff --git a/app/src/main/java/eu/kanade/presentation/reader/settings/GeneralSettingsPage.kt b/app/src/main/java/eu/kanade/presentation/reader/settings/GeneralSettingsPage.kt index f5f5644ea..f5e94d355 100644 --- a/app/src/main/java/eu/kanade/presentation/reader/settings/GeneralSettingsPage.kt +++ b/app/src/main/java/eu/kanade/presentation/reader/settings/GeneralSettingsPage.kt @@ -5,24 +5,25 @@ import androidx.compose.material3.FilterChip import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue -import androidx.compose.ui.res.stringResource -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.reader.setting.ReaderSettingsScreenModel +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.CheckboxItem import tachiyomi.presentation.core.components.SettingsChipRow +import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.collectAsState private val themes = listOf( - R.string.black_background to 1, - R.string.gray_background to 2, - R.string.white_background to 0, - R.string.automatic_background to 3, + MR.strings.black_background to 1, + MR.strings.gray_background to 2, + MR.strings.white_background to 0, + MR.strings.automatic_background to 3, ) @Composable internal fun ColumnScope.GeneralPage(screenModel: ReaderSettingsScreenModel) { val readerTheme by screenModel.preferences.readerTheme().collectAsState() - SettingsChipRow(R.string.pref_reader_theme) { + SettingsChipRow(MR.strings.pref_reader_theme) { themes.map { (labelRes, value) -> FilterChip( selected = readerTheme == value, @@ -33,71 +34,71 @@ internal fun ColumnScope.GeneralPage(screenModel: ReaderSettingsScreenModel) { } CheckboxItem( - label = stringResource(R.string.pref_show_page_number), + label = stringResource(MR.strings.pref_show_page_number), pref = screenModel.preferences.showPageNumber(), ) // SY --> val forceHorizontalSeekbar by screenModel.preferences.forceHorizontalSeekbar().collectAsState() CheckboxItem( - label = stringResource(R.string.pref_force_horz_seekbar), + label = stringResource(SYMR.strings.pref_force_horz_seekbar), pref = screenModel.preferences.forceHorizontalSeekbar(), ) if (!forceHorizontalSeekbar) { CheckboxItem( - label = stringResource(R.string.pref_show_vert_seekbar_landscape), + label = stringResource(SYMR.strings.pref_show_vert_seekbar_landscape), pref = screenModel.preferences.landscapeVerticalSeekbar(), ) CheckboxItem( - label = stringResource(R.string.pref_left_handed_vertical_seekbar), + label = stringResource(SYMR.strings.pref_left_handed_vertical_seekbar), pref = screenModel.preferences.leftVerticalSeekbar(), ) } // SY <-- CheckboxItem( - label = stringResource(R.string.pref_fullscreen), + label = stringResource(MR.strings.pref_fullscreen), pref = screenModel.preferences.fullscreen(), ) if (screenModel.hasDisplayCutout) { CheckboxItem( - label = stringResource(R.string.pref_cutout_short), + label = stringResource(MR.strings.pref_cutout_short), pref = screenModel.preferences.cutoutShort(), ) } CheckboxItem( - label = stringResource(R.string.pref_keep_screen_on), + label = stringResource(MR.strings.pref_keep_screen_on), pref = screenModel.preferences.keepScreenOn(), ) CheckboxItem( - label = stringResource(R.string.pref_read_with_long_tap), + label = stringResource(MR.strings.pref_read_with_long_tap), pref = screenModel.preferences.readWithLongTap(), ) CheckboxItem( - label = stringResource(R.string.pref_always_show_chapter_transition), + label = stringResource(MR.strings.pref_always_show_chapter_transition), pref = screenModel.preferences.alwaysShowChapterTransition(), ) // SY --> /*CheckboxItem( - label = stringResource(R.string.pref_page_transitions), + label = stringResource(MR.strings.pref_page_transitions), pref = screenModel.preferences.pageTransitions(), ) SY <-- */ CheckboxItem( - label = stringResource(R.string.pref_flash_page), + label = stringResource(MR.strings.pref_flash_page), pref = screenModel.preferences.flashOnPageChange(), ) // SY --> CheckboxItem( - label = stringResource(R.string.auto_webtoon_mode), + label = stringResource(SYMR.strings.auto_webtoon_mode), pref = screenModel.preferences.useAutoWebtoon(), ) // SY <-- diff --git a/app/src/main/java/eu/kanade/presentation/reader/settings/ReadingModePage.kt b/app/src/main/java/eu/kanade/presentation/reader/settings/ReadingModePage.kt index a991377b6..d486f53c3 100644 --- a/app/src/main/java/eu/kanade/presentation/reader/settings/ReadingModePage.kt +++ b/app/src/main/java/eu/kanade/presentation/reader/settings/ReadingModePage.kt @@ -15,6 +15,7 @@ import eu.kanade.tachiyomi.ui.reader.setting.ReaderSettingsScreenModel import eu.kanade.tachiyomi.ui.reader.setting.ReadingMode import eu.kanade.tachiyomi.ui.reader.viewer.webtoon.WebtoonViewer import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.CheckboxItem import tachiyomi.presentation.core.components.HeadingItem import tachiyomi.presentation.core.components.SettingsChipRow @@ -98,7 +99,7 @@ private fun ColumnScope.PagerViewerSettings(screenModel: ReaderSettingsScreenMod // SY --> val pageLayout by screenModel.preferences.pageLayout().collectAsState() - SettingsChipRow(R.string.page_layout) { + SettingsChipRow(SYMR.strings.page_layout) { ReaderPreferences.PageLayouts.mapIndexed { index, it -> FilterChip( selected = pageLayout == index, @@ -152,17 +153,17 @@ private fun ColumnScope.PagerViewerSettings(screenModel: ReaderSettingsScreenMod // SY --> CheckboxItem( - label = stringResource(R.string.pref_page_transitions), + label = stringResource(MR.strings.pref_page_transitions), pref = screenModel.preferences.pageTransitionsPager(), ) CheckboxItem( - label = stringResource(R.string.invert_double_pages), + label = stringResource(SYMR.strings.invert_double_pages), pref = screenModel.preferences.invertDoublePages(), ) val centerMarginType by screenModel.preferences.centerMarginType().collectAsState() - SettingsChipRow(R.string.pref_center_margin) { + SettingsChipRow(SYMR.strings.pref_center_margin) { ReaderPreferences.CenterMarginTypes.mapIndexed { index, it -> FilterChip( selected = centerMarginType == index, @@ -208,17 +209,17 @@ private fun ColumnScope.WebtoonViewerSettings(screenModel: ReaderSettingsScreenM // SY --> CheckboxItem( - label = stringResource(R.string.pref_smooth_scroll), + label = stringResource(SYMR.strings.pref_smooth_scroll), pref = screenModel.preferences.smoothAutoScroll(), ) CheckboxItem( - label = stringResource(R.string.pref_page_transitions), + label = stringResource(MR.strings.pref_page_transitions), pref = screenModel.preferences.pageTransitionsWebtoon(), ) CheckboxItem( - label = stringResource(R.string.enable_zoom_out), + label = stringResource(SYMR.strings.enable_zoom_out), pref = screenModel.preferences.webtoonEnableZoomOut(), ) // SY <-- @@ -245,10 +246,10 @@ private fun ColumnScope.WebtoonViewerSettings(screenModel: ReaderSettingsScreenM // SY --> @Composable private fun ColumnScope.WebtoonWithGapsViewerSettings(screenModel: ReaderSettingsScreenModel) { - HeadingItem(R.string.vertical_plus_viewer) + HeadingItem(MR.strings.vertical_plus_viewer) CheckboxItem( - label = stringResource(R.string.pref_crop_borders), + label = stringResource(MR.strings.pref_crop_borders), pref = screenModel.preferences.cropBordersContinuousVertical(), ) } diff --git a/app/src/main/java/eu/kanade/presentation/webview/EhLoginWebViewScreen.kt b/app/src/main/java/eu/kanade/presentation/webview/EhLoginWebViewScreen.kt index aa082865d..1a6fd4670 100644 --- a/app/src/main/java/eu/kanade/presentation/webview/EhLoginWebViewScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/webview/EhLoginWebViewScreen.kt @@ -28,7 +28,6 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import com.google.accompanist.web.AccompanistWebViewClient @@ -39,10 +38,12 @@ import com.google.accompanist.web.rememberWebViewNavigator import com.google.accompanist.web.rememberWebViewState import eu.kanade.presentation.components.AppBar import eu.kanade.tachiyomi.BuildConfig -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.util.system.setDefaultSettings +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.material.Button import tachiyomi.presentation.core.components.material.Scaffold +import tachiyomi.presentation.core.i18n.stringResource @Composable fun EhLoginWebViewScreen( @@ -81,9 +82,10 @@ fun EhLoginWebViewScreen( val animatedProgress by animateFloatAsState( (loadingState as? LoadingState.Loading)?.progress ?: 1f, animationSpec = ProgressIndicatorDefaults.ProgressAnimationSpec, + label = "webview_loading", ) LinearProgressIndicator( - progress = animatedProgress, + progress = { animatedProgress }, modifier = Modifier .fillMaxWidth() .align(Alignment.BottomCenter), @@ -139,10 +141,10 @@ fun EhLoginWebViewScreen( horizontalArrangement = Arrangement.SpaceBetween, ) { Button(onClick = onUp, Modifier.weight(0.5F)) { - Text(text = stringResource(R.string.action_cancel)) + Text(text = stringResource(MR.strings.action_cancel)) } Button(onClick = { showAdvancedOptions = true }, Modifier.weight(0.5F)) { - Text(text = stringResource(R.string.pref_category_advanced)) + Text(text = stringResource(MR.strings.pref_category_advanced)) } } } @@ -164,7 +166,7 @@ fun EhLoginWebViewScreen( }, modifier = Modifier.fillMaxWidth(), ) { - Text(text = stringResource(R.string.recheck_login_status)) + Text(text = stringResource(SYMR.strings.recheck_login_status)) } Button( onClick = { @@ -173,7 +175,7 @@ fun EhLoginWebViewScreen( }, modifier = Modifier.fillMaxWidth(), ) { - Text(text = stringResource(R.string.alternative_login_page)) + Text(text = stringResource(SYMR.strings.alternative_login_page)) } Button( onClick = { @@ -182,7 +184,7 @@ fun EhLoginWebViewScreen( }, modifier = Modifier.fillMaxWidth(), ) { - Text(text = stringResource(R.string.skip_page_restyling)) + Text(text = stringResource(SYMR.strings.skip_page_restyling)) } Button( onClick = { @@ -191,10 +193,10 @@ fun EhLoginWebViewScreen( }, modifier = Modifier.fillMaxWidth(), ) { - Text(text = stringResource(R.string.custom_igneous_cookie)) + Text(text = stringResource(SYMR.strings.custom_igneous_cookie)) } Button(onClick = { showAdvancedOptions = false }, Modifier.fillMaxWidth()) { - Text(text = stringResource(R.string.action_cancel)) + Text(text = stringResource(MR.strings.action_cancel)) } } } diff --git a/app/src/main/java/eu/kanade/presentation/webview/components/IgneousDialog.kt b/app/src/main/java/eu/kanade/presentation/webview/components/IgneousDialog.kt index eea66e168..6b4a6886f 100644 --- a/app/src/main/java/eu/kanade/presentation/webview/components/IgneousDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/webview/components/IgneousDialog.kt @@ -12,10 +12,11 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.window.DialogProperties -import eu.kanade.tachiyomi.R +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR +import tachiyomi.presentation.core.i18n.stringResource @Composable fun IgneousDialog( @@ -27,10 +28,10 @@ fun IgneousDialog( } AlertDialog( onDismissRequest = onDismissRequest, - title = { Text(text = stringResource(R.string.custom_igneous_cookie)) }, + title = { Text(text = stringResource(SYMR.strings.custom_igneous_cookie)) }, text = { Column { - Text(text = stringResource(R.string.custom_igneous_cookie_message)) + Text(text = stringResource(SYMR.strings.custom_igneous_cookie_message)) OutlinedTextField( value = textFieldValue, onValueChange = { textFieldValue = it }, @@ -49,12 +50,12 @@ fun IgneousDialog( onDismissRequest() }, ) { - Text(text = stringResource(R.string.action_ok)) + Text(text = stringResource(MR.strings.action_ok)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { - Text(text = stringResource(R.string.action_cancel)) + Text(text = stringResource(MR.strings.action_cancel)) } }, ) diff --git a/app/src/main/java/eu/kanade/tachiyomi/App.kt b/app/src/main/java/eu/kanade/tachiyomi/App.kt index 947badcc4..2739d61e4 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/App.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/App.kt @@ -251,7 +251,7 @@ class App : Application(), DefaultLifecycleObserver, ImageLoaderFactory { val logFolder = File( Environment.getExternalStorageDirectory().absolutePath + File.separator + - getString(R.string.app_name), + stringResource(MR.strings.app_name), "logs", ) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestorer.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestorer.kt index 865b82126..3eb9daac2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestorer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestorer.kt @@ -50,6 +50,7 @@ import tachiyomi.domain.manga.model.CustomMangaInfo import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.track.model.Track import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.io.File @@ -247,8 +248,8 @@ class BackupRestorer( showRestoreProgress( restoreProgress, restoreAmount, - context.getString(R.string.saved_searches), - context.getString(R.string.restoring_backup), + context.stringResource(SYMR.strings.saved_searches), + context.stringResource(MR.strings.restoring_backup), ) } // SY <-- 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 1b4fff9ae..851af4a26 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt @@ -2,7 +2,6 @@ package eu.kanade.tachiyomi.data.download import android.content.Context import com.hippo.unifile.UniFile -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.download.model.Download import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.model.Page @@ -18,6 +17,7 @@ import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.runBlocking import logcat.LogPriority +import tachiyomi.core.i18n.stringResource import tachiyomi.core.util.lang.launchIO import tachiyomi.core.util.system.logcat import tachiyomi.domain.category.interactor.GetCategories @@ -25,6 +25,7 @@ import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.download.service.DownloadPreferences import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.source.service.SourceManager +import tachiyomi.i18n.MR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -166,7 +167,7 @@ class DownloadManager( .filter { "image" in it.type.orEmpty() } if (files.isEmpty()) { - throw Exception(context.getString(R.string.page_list_empty_error)) + throw Exception(context.stringResource(MR.strings.page_list_empty_error)) } return files.sortedBy { it.name } 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 9e61a1b7c..cded8e97d 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt @@ -6,7 +6,6 @@ import com.hippo.unifile.UniFile import eu.kanade.domain.chapter.model.toSChapter import eu.kanade.domain.manga.model.getComicInfo import eu.kanade.domain.source.service.SourcePreferences -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.cache.ChapterCache import eu.kanade.tachiyomi.data.download.model.Download import eu.kanade.tachiyomi.data.library.LibraryUpdateNotifier @@ -48,6 +47,7 @@ import net.lingala.zip4j.ZipFile import net.lingala.zip4j.model.ZipParameters import nl.adaptivity.xmlutil.serialization.XML import okhttp3.Response +import tachiyomi.core.i18n.stringResource import tachiyomi.core.metadata.comicinfo.COMIC_INFO_FILE import tachiyomi.core.metadata.comicinfo.ComicInfo import tachiyomi.core.util.lang.launchIO @@ -61,6 +61,7 @@ import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.download.service.DownloadPreferences import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.source.service.SourceManager +import tachiyomi.i18n.MR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.io.BufferedOutputStream @@ -315,7 +316,7 @@ class Downloader( ) { withUIContext { notifier.onWarning( - context.getString(R.string.download_queue_size_warning), + context.stringResource(MR.strings.download_queue_size_warning), WARNING_NOTIF_TIMEOUT_MS, NotificationHandler.openUrl(context, LibraryUpdateNotifier.HELP_WARNING_URL), ) @@ -338,7 +339,7 @@ class Downloader( if (availSpace != -1L && availSpace < MIN_DISK_SPACE) { download.status = Download.State.ERROR notifier.onError( - context.getString(R.string.download_insufficient_space), + context.stringResource(MR.strings.download_insufficient_space), download.chapter.name, download.manga.title, ) @@ -355,7 +356,7 @@ class Downloader( val pages = download.source.getPageList(download.chapter.toSChapter()) if (pages.isEmpty()) { - throw Exception(context.getString(R.string.page_list_empty_error)) + throw Exception(context.stringResource(MR.strings.page_list_empty_error)) } // Don't trust index from source val reIndexedPages = pages.mapIndexed { index, page -> Page(index, page.url, page.imageUrl, page.uri) } @@ -570,7 +571,7 @@ class Downloader( try { val filenamePrefix = String.format("%03d", page.number) val imageFile = tmpDir.listFiles()?.firstOrNull { it.name.orEmpty().startsWith(filenamePrefix) } - ?: error(context.getString(R.string.download_notifier_split_page_not_found, page.number)) + ?: error(context.stringResource(MR.strings.download_notifier_split_page_not_found, page.number)) // If the original page was previously split, then skip if (imageFile.name.orEmpty().startsWith("${filenamePrefix}__")) return 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 a8438ac5e..5e17fde64 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateJob.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateJob.kt @@ -20,7 +20,6 @@ import eu.kanade.domain.manga.model.copyFrom import eu.kanade.domain.manga.model.toSManga import eu.kanade.domain.track.model.toDbTrack import eu.kanade.domain.track.model.toDomainTrack -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.cache.CoverCache import eu.kanade.tachiyomi.data.download.DownloadManager import eu.kanade.tachiyomi.data.notification.Notifications @@ -54,6 +53,7 @@ import kotlinx.coroutines.runBlocking import kotlinx.coroutines.sync.Semaphore import kotlinx.coroutines.sync.withPermit import logcat.LogPriority +import tachiyomi.core.i18n.stringResource import tachiyomi.core.preference.getAndSet import tachiyomi.core.util.lang.withIOContext import tachiyomi.core.util.system.logcat @@ -87,6 +87,7 @@ import tachiyomi.domain.source.model.SourceNotInstalledException import tachiyomi.domain.source.service.SourceManager import tachiyomi.domain.track.interactor.GetTracks import tachiyomi.domain.track.interactor.InsertTrack +import tachiyomi.i18n.MR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.io.File @@ -273,27 +274,27 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet .filter { when { it.manga.updateStrategy != UpdateStrategy.ALWAYS_UPDATE -> { - skippedUpdates.add(it.manga to context.getString(R.string.skipped_reason_not_always_update)) + skippedUpdates.add(it.manga to context.stringResource(MR.strings.skipped_reason_not_always_update)) false } MANGA_NON_COMPLETED in restrictions && it.manga.status.toInt() == SManga.COMPLETED -> { - skippedUpdates.add(it.manga to context.getString(R.string.skipped_reason_completed)) + skippedUpdates.add(it.manga to context.stringResource(MR.strings.skipped_reason_completed)) false } MANGA_HAS_UNREAD in restrictions && it.unreadCount != 0L -> { - skippedUpdates.add(it.manga to context.getString(R.string.skipped_reason_not_caught_up)) + skippedUpdates.add(it.manga to context.stringResource(MR.strings.skipped_reason_not_caught_up)) false } MANGA_NON_READ in restrictions && it.totalChapters > 0L && !it.hasStarted -> { - skippedUpdates.add(it.manga to context.getString(R.string.skipped_reason_not_started)) + skippedUpdates.add(it.manga to context.stringResource(MR.strings.skipped_reason_not_started)) false } MANGA_OUTSIDE_RELEASE_PERIOD in restrictions && it.manga.nextUpdate > fetchWindow.second -> { - skippedUpdates.add(it.manga to context.getString(R.string.skipped_reason_not_in_release_period)) + skippedUpdates.add(it.manga to context.stringResource(MR.strings.skipped_reason_not_in_release_period)) false } else -> true @@ -400,10 +401,10 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet } } catch (e: Throwable) { val errorMessage = when (e) { - is NoChaptersException -> context.getString(R.string.no_chapters_error) + is NoChaptersException -> context.stringResource(MR.strings.no_chapters_error) // failedUpdates will already have the source, don't need to copy it into the message - is SourceNotInstalledException -> context.getString( - R.string.loader_not_implemented_error, + is SourceNotInstalledException -> context.stringResource( + MR.strings.loader_not_implemented_error, ) else -> e.message } @@ -648,7 +649,7 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet if (errors.isNotEmpty()) { val file = context.createFileInCacheDir("tachiyomi_update_errors.txt") file.bufferedWriter().use { out -> - out.write(context.getString(R.string.library_errors_help, ERROR_LOG_HELP_URL) + "\n\n") + out.write(context.stringResource(MR.strings.library_errors_help, ERROR_LOG_HELP_URL) + "\n\n") // Error file format: // ! Error // # Source diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateNotifier.kt b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateNotifier.kt index cc3a0d8d3..dafff88ab 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateNotifier.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateNotifier.kt @@ -26,9 +26,12 @@ import eu.kanade.tachiyomi.util.system.getBitmapOrNull import eu.kanade.tachiyomi.util.system.notificationBuilder import eu.kanade.tachiyomi.util.system.notify import tachiyomi.core.Constants +import tachiyomi.core.i18n.pluralStringResource +import tachiyomi.core.i18n.stringResource import tachiyomi.core.util.lang.launchUI import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.manga.model.Manga +import tachiyomi.i18n.MR import uy.kohesive.injekt.injectLazy import java.text.NumberFormat @@ -58,12 +61,12 @@ class LibraryUpdateNotifier(private val context: Context) { */ val progressNotificationBuilder by lazy { context.notificationBuilder(Notifications.CHANNEL_LIBRARY_PROGRESS) { - setContentTitle(context.getString(R.string.app_name)) + setContentTitle(context.stringResource(MR.strings.app_name)) setSmallIcon(R.drawable.ic_refresh_24dp) setLargeIcon(notificationBitmap) setOngoing(true) setOnlyAlertOnce(true) - addAction(R.drawable.ic_close_24dp, context.getString(R.string.action_cancel), cancelIntent) + addAction(R.drawable.ic_close_24dp, context.stringResource(MR.strings.action_cancel), cancelIntent) } } @@ -77,14 +80,14 @@ class LibraryUpdateNotifier(private val context: Context) { fun showProgressNotification(manga: List, current: Int, total: Int) { if (preferences.hideNotificationContent().get()) { progressNotificationBuilder - .setContentTitle(context.getString(R.string.notification_check_updates)) + .setContentTitle(context.stringResource(MR.strings.notification_check_updates)) .setContentText("($current/$total)") } else { val updatingText = manga.joinToString("\n") { it.title.chop(40) } progressNotificationBuilder .setContentTitle( - context.getString( - R.string.notification_updating_progress, + context.stringResource( + MR.strings.notification_updating_progress, percentFormatter.format(current.toFloat() / total), ), ) @@ -104,8 +107,8 @@ class LibraryUpdateNotifier(private val context: Context) { Notifications.ID_LIBRARY_SIZE_WARNING, Notifications.CHANNEL_LIBRARY_PROGRESS, ) { - setContentTitle(context.getString(R.string.label_warning)) - setStyle(NotificationCompat.BigTextStyle().bigText(context.getString(R.string.notification_size_warning))) + setContentTitle(context.stringResource(MR.strings.label_warning)) + setStyle(NotificationCompat.BigTextStyle().bigText(context.stringResource(MR.strings.notification_size_warning))) setSmallIcon(R.drawable.ic_warning_white_24dp) setTimeoutAfter(Downloader.WARNING_NOTIF_TIMEOUT_MS) setContentIntent(NotificationHandler.openUrl(context, HELP_WARNING_URL)) @@ -127,8 +130,8 @@ class LibraryUpdateNotifier(private val context: Context) { Notifications.ID_LIBRARY_ERROR, Notifications.CHANNEL_LIBRARY_ERROR, ) { - setContentTitle(context.resources.getString(R.string.notification_update_error, failed)) - setContentText(context.getString(R.string.action_show_errors)) + setContentTitle(context.stringResource(MR.strings.notification_update_error, failed)) + setContentText(context.stringResource(MR.strings.action_show_errors)) setSmallIcon(R.drawable.ic_tachi) setContentIntent(NotificationReceiver.openErrorLogPendingActivity(context, uri)) @@ -149,8 +152,8 @@ class LibraryUpdateNotifier(private val context: Context) { Notifications.ID_LIBRARY_SKIPPED, Notifications.CHANNEL_LIBRARY_SKIPPED, ) { - setContentTitle(context.resources.getString(R.string.notification_update_skipped, skipped)) - setContentText(context.getString(R.string.learn_more)) + setContentTitle(context.stringResource(MR.strings.notification_update_skipped, skipped)) + setContentText(context.stringResource(MR.strings.learn_more)) setSmallIcon(R.drawable.ic_tachi) setContentIntent(NotificationHandler.openUrl(context, HELP_SKIPPED_URL)) } @@ -167,13 +170,13 @@ class LibraryUpdateNotifier(private val context: Context) { Notifications.ID_NEW_CHAPTERS, Notifications.CHANNEL_NEW_CHAPTERS, ) { - setContentTitle(context.getString(R.string.notification_new_chapters)) + setContentTitle(context.stringResource(MR.strings.notification_new_chapters)) if (updates.size == 1 && !preferences.hideNotificationContent().get()) { setContentText(updates.first().first.title.chop(NOTIF_TITLE_MAX_LEN)) } else { setContentText( - context.resources.getQuantityString( - R.plurals.notification_new_chapters_summary, + context.pluralStringResource( + MR.plurals.notification_new_chapters_summary, updates.size, updates.size, ), @@ -243,7 +246,7 @@ class LibraryUpdateNotifier(private val context: Context) { // Mark chapters as read action addAction( R.drawable.ic_glasses_24dp, - context.getString(R.string.action_mark_as_read), + context.stringResource(MR.strings.action_mark_as_read), NotificationReceiver.markAsReadPendingBroadcast( context, manga, @@ -254,7 +257,7 @@ class LibraryUpdateNotifier(private val context: Context) { // View chapters action addAction( R.drawable.ic_book_24dp, - context.getString(R.string.action_view_chapters), + context.stringResource(MR.strings.action_view_chapters), NotificationReceiver.openChapterPendingActivity( context, manga, @@ -266,7 +269,7 @@ class LibraryUpdateNotifier(private val context: Context) { if (chapters.size <= Downloader.CHAPTERS_PER_SOURCE_QUEUE_WARNING_THRESHOLD) { addAction( android.R.drawable.stat_sys_download_done, - context.getString(R.string.action_download), + context.stringResource(MR.strings.action_download), NotificationReceiver.downloadChaptersPendingBroadcast( context, manga, @@ -306,8 +309,8 @@ class LibraryUpdateNotifier(private val context: Context) { // No sensible chapter numbers to show (i.e. no chapters have parsed chapter number) 0 -> { // "1 new chapter" or "5 new chapters" - context.resources.getQuantityString( - R.plurals.notification_chapters_generic, + context.pluralStringResource( + MR.plurals.notification_chapters_generic, chapters.size, chapters.size, ) @@ -317,14 +320,14 @@ class LibraryUpdateNotifier(private val context: Context) { val remaining = chapters.size - displayableChapterNumbers.size if (remaining == 0) { // "Chapter 2.5" - context.resources.getString( - R.string.notification_chapters_single, + context.stringResource( + MR.strings.notification_chapters_single, displayableChapterNumbers.first(), ) } else { // "Chapter 2.5 and 10 more" - context.resources.getString( - R.string.notification_chapters_single_and_more, + context.stringResource( + MR.strings.notification_chapters_single_and_more, displayableChapterNumbers.first(), remaining, ) @@ -337,16 +340,16 @@ class LibraryUpdateNotifier(private val context: Context) { // "Chapters 1, 2.5, 3, 4, 5 and 10 more" val remaining = displayableChapterNumbers.size - NOTIF_MAX_CHAPTERS val joinedChapterNumbers = displayableChapterNumbers.take(NOTIF_MAX_CHAPTERS).joinToString(", ") - context.resources.getQuantityString( - R.plurals.notification_chapters_multiple_and_more, + context.pluralStringResource( + MR.plurals.notification_chapters_multiple_and_more, remaining, joinedChapterNumbers, remaining, ) } else { // "Chapters 1, 2.5, 3" - context.resources.getString( - R.string.notification_chapters_multiple, + context.stringResource( + MR.strings.notification_chapters_multiple, displayableChapterNumbers.joinToString(", "), ) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/TrackStatus.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/TrackStatus.kt index 77473cbe1..aaacedf01 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/TrackStatus.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/TrackStatus.kt @@ -1,7 +1,6 @@ package eu.kanade.tachiyomi.data.track -import androidx.annotation.StringRes -import eu.kanade.tachiyomi.R +import dev.icerock.moko.resources.StringResource import eu.kanade.tachiyomi.data.track.anilist.Anilist import eu.kanade.tachiyomi.data.track.bangumi.Bangumi import eu.kanade.tachiyomi.data.track.kitsu.Kitsu @@ -10,15 +9,17 @@ import eu.kanade.tachiyomi.data.track.mangaupdates.MangaUpdates import eu.kanade.tachiyomi.data.track.myanimelist.MyAnimeList import eu.kanade.tachiyomi.data.track.shikimori.Shikimori import exh.md.utils.FollowStatus +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR -enum class TrackStatus(val int: Int, @StringRes val res: Int) { - READING(1, R.string.reading), - REPEATING(2, R.string.repeating), - PLAN_TO_READ(3, R.string.plan_to_read), - PAUSED(4, R.string.on_hold), - COMPLETED(5, R.string.completed), - DROPPED(6, R.string.dropped), - OTHER(7, R.string.not_tracked), +enum class TrackStatus(val int: Int, val res: StringResource) { + READING(1, MR.strings.reading), + REPEATING(2, MR.strings.repeating), + PLAN_TO_READ(3, MR.strings.plan_to_read), + PAUSED(4, MR.strings.on_hold), + COMPLETED(5, MR.strings.completed), + DROPPED(6, MR.strings.dropped), + OTHER(7, SYMR.strings.not_tracked), ; companion object { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/mdlist/MdList.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/mdlist/MdList.kt index f2ef07239..607548f3a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/mdlist/MdList.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/mdlist/MdList.kt @@ -1,7 +1,7 @@ package eu.kanade.tachiyomi.data.track.mdlist import android.graphics.Color -import androidx.annotation.StringRes +import dev.icerock.moko.resources.StringResource import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.Track import eu.kanade.tachiyomi.data.track.BaseTracker @@ -16,6 +16,8 @@ import tachiyomi.core.util.lang.awaitSingle import tachiyomi.core.util.lang.runAsObservable import tachiyomi.core.util.lang.withIOContext import tachiyomi.domain.manga.model.Manga +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -43,15 +45,14 @@ class MdList(id: Long) : BaseTracker(id, "MDList") { return FollowStatus.values().map { it.int } } - @StringRes - override fun getStatus(status: Int): Int? = when (status) { - 0 -> R.string.md_follows_unfollowed - 1 -> R.string.reading - 2 -> R.string.completed - 3 -> R.string.on_hold - 4 -> R.string.plan_to_read - 5 -> R.string.dropped - 6 -> R.string.repeating + override fun getStatus(status: Int): StringResource? = when (status) { + 0 -> SYMR.strings.md_follows_unfollowed + 1 -> MR.strings.reading + 2 -> MR.strings.completed + 3 -> MR.strings.on_hold + 4 -> MR.strings.plan_to_read + 5 -> MR.strings.dropped + 6 -> MR.strings.repeating else -> null } diff --git a/app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt b/app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt index 97a159a27..2b0207f15 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt @@ -24,7 +24,6 @@ import eu.kanade.tachiyomi.network.NetworkHelper import eu.kanade.tachiyomi.source.AndroidSourceManager import eu.kanade.tachiyomi.util.storage.CbzCrypto import exh.eh.EHentaiUpdateHelper -import exh.pref.DelegateSourcePreferences import io.requery.android.database.sqlite.RequerySQLiteOpenHelperFactory import kotlinx.serialization.json.Json import net.zetetic.database.sqlcipher.SupportOpenHelperFactory @@ -39,7 +38,6 @@ import tachiyomi.data.History import tachiyomi.data.Mangas import tachiyomi.data.StringListColumnAdapter import tachiyomi.data.UpdateStrategyColumnAdapter -import tachiyomi.domain.UnsortedPreferences import tachiyomi.domain.manga.interactor.GetCustomMangaInfo import tachiyomi.domain.source.service.SourceManager import tachiyomi.source.local.image.LocalCoverManager @@ -178,4 +176,3 @@ class AppModule(val app: Application) : InjektModule { } } } - diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionManager.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionManager.kt index 3bf05d2c3..662543e3b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionManager.kt @@ -4,6 +4,7 @@ import android.content.Context import android.graphics.drawable.Drawable import androidx.core.content.ContextCompat import eu.kanade.domain.source.service.SourcePreferences +import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.extension.api.ExtensionGithubApi import eu.kanade.tachiyomi.extension.api.ExtensionUpdateNotifier import eu.kanade.tachiyomi.extension.model.Extension diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/BrowseTab.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/BrowseTab.kt index c78ef6b5c..7624cfa0b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/BrowseTab.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/BrowseTab.kt @@ -10,7 +10,6 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.Navigator import cafe.adriel.voyager.navigator.tab.LocalTabNavigator @@ -29,6 +28,8 @@ import eu.kanade.tachiyomi.ui.browse.source.globalsearch.GlobalSearchScreen import eu.kanade.tachiyomi.ui.browse.source.sourcesTab import eu.kanade.tachiyomi.ui.main.MainActivity import kotlinx.collections.immutable.persistentListOf +import tachiyomi.i18n.MR +import tachiyomi.presentation.core.i18n.stringResource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -43,7 +44,7 @@ data class BrowseTab( val image = AnimatedImageVector.animatedVectorResource(R.drawable.anim_browse_enter) return TabOptions( index = 3u, - title = stringResource(R.string.browse), + title = stringResource(MR.strings.browse), icon = rememberAnimatedVectorPainter(image, isSelected), ) } @@ -67,7 +68,7 @@ data class BrowseTab( val extensionsState by extensionsScreenModel.state.collectAsState() TabbedScreen( - titleRes = R.string.browse, + titleRes = MR.strings.browse, // SY --> tabs = if (feedTabInFront) { persistentListOf( diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/feed/FeedScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/feed/FeedScreenModel.kt index 0e02440bb..098ad35e4 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/feed/FeedScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/feed/FeedScreenModel.kt @@ -13,6 +13,9 @@ import eu.kanade.presentation.browse.FeedItemUI import eu.kanade.tachiyomi.source.CatalogueSource import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.util.system.LocaleHelper +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.persistentListOf +import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll @@ -124,7 +127,13 @@ open class FeedScreenModel( screenModelScope.launchIO { mutableState.update { state -> state.copy( - dialog = Dialog.AddFeedSearch(source, (if (source.supportsLatest) listOf(null) else emptyList()) + getSourceSavedSearches(source.id)), + dialog = Dialog.AddFeedSearch( + source, + ( + (if (source.supportsLatest) persistentListOf(null) else persistentListOf()) + + getSourceSavedSearches(source.id) + ).toImmutableList(), + ), ) } } @@ -144,7 +153,7 @@ open class FeedScreenModel( return countFeedSavedSearchGlobal.await() > 10 } - fun getEnabledSources(): List { + fun getEnabledSources(): ImmutableList { val languages = sourcePreferences.enabledLanguages().get() val pinnedSources = sourcePreferences.pinnedSources().get() val disabledSources = sourcePreferences.disabledSources().get() @@ -155,11 +164,11 @@ open class FeedScreenModel( .filterNot { it.id in disabledSources } .sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER) { "(${it.lang}) ${it.name}" }) - return list.sortedBy { it.id.toString() !in pinnedSources } + return list.sortedBy { it.id.toString() !in pinnedSources }.toImmutableList() } - suspend fun getSourceSavedSearches(sourceId: Long): List { - return getSavedSearchBySourceId.await(sourceId) + suspend fun getSourceSavedSearches(sourceId: Long): ImmutableList { + return getSavedSearchBySourceId.await(sourceId).toImmutableList() } fun createFeed(source: CatalogueSource, savedSearch: SavedSearch?) { @@ -290,8 +299,8 @@ open class FeedScreenModel( } sealed class Dialog { - data class AddFeed(val options: List) : Dialog() - data class AddFeedSearch(val source: CatalogueSource, val options: List) : Dialog() + data class AddFeed(val options: ImmutableList) : Dialog() + data class AddFeedSearch(val source: CatalogueSource, val options: ImmutableList) : Dialog() data class DeleteFeed(val feed: FeedSavedSearch) : Dialog() } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/feed/FeedTab.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/feed/FeedTab.kt index ac2a269d7..19723c3d8 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/feed/FeedTab.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/feed/FeedTab.kt @@ -7,7 +7,6 @@ import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue -import androidx.compose.ui.res.stringResource import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.core.screen.Screen import cafe.adriel.voyager.core.stack.StackEvent @@ -19,13 +18,15 @@ import eu.kanade.presentation.browse.FeedDeleteConfirmDialog import eu.kanade.presentation.browse.FeedScreen import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.TabContent -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceScreen import eu.kanade.tachiyomi.ui.manga.MangaScreen import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import tachiyomi.domain.source.interactor.GetRemoteManga +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR +import tachiyomi.presentation.core.i18n.stringResource @Composable fun Screen.feedTab(): TabContent { @@ -48,10 +49,10 @@ fun Screen.feedTab(): TabContent { } return TabContent( - titleRes = R.string.feed, + titleRes = SYMR.strings.feed, actions = persistentListOf( AppBar.Action( - title = stringResource(R.string.action_add), + title = stringResource(MR.strings.action_add), icon = Icons.Outlined.Add, onClick = { screenModel.openAddDialog() @@ -127,8 +128,8 @@ fun Screen.feedTab(): TabContent { } } - val internalErrString = stringResource(R.string.internal_error) - val tooManyFeedsString = stringResource(R.string.too_many_in_feed) + val internalErrString = stringResource(MR.strings.internal_error) + val tooManyFeedsString = stringResource(SYMR.strings.too_many_in_feed) LaunchedEffect(Unit) { screenModel.events.collectLatest { event -> when (event) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/design/MigrationBottomSheetDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/design/MigrationBottomSheetDialog.kt index eff92f531..fcdfc08f7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/design/MigrationBottomSheetDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/design/MigrationBottomSheetDialog.kt @@ -14,13 +14,13 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.viewinterop.AndroidView import androidx.core.view.isVisible import eu.kanade.presentation.components.AdaptiveSheet -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.databinding.MigrationBottomSheetBinding import eu.kanade.tachiyomi.ui.browse.migration.MigrationFlags import eu.kanade.tachiyomi.util.system.toast import tachiyomi.core.preference.Preference import tachiyomi.core.util.lang.toLong import tachiyomi.domain.UnsortedPreferences +import tachiyomi.i18n.sy.SYMR import uy.kohesive.injekt.injectLazy @Composable @@ -77,7 +77,7 @@ class MigrationBottomSheetDialogState(private val onStartMigration: State<(extra binding.skipStep.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { binding.root.context.toast( - R.string.pre_migration_skip_toast, + SYMR.strings.pre_migration_skip_toast, Toast.LENGTH_LONG, ) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/design/PreMigrationScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/design/PreMigrationScreen.kt index 8ce46902f..0d1874e20 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/design/PreMigrationScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/design/PreMigrationScreen.kt @@ -24,7 +24,6 @@ import androidx.compose.ui.input.nestedscroll.NestedScrollSource import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalLayoutDirection -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.Velocity import androidx.compose.ui.viewinterop.AndroidView import androidx.core.view.ViewCompat @@ -37,13 +36,15 @@ import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.util.Screen -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.databinding.PreMigrationListBinding import eu.kanade.tachiyomi.ui.browse.migration.advanced.process.MigrationListScreen import eu.kanade.tachiyomi.ui.browse.migration.advanced.process.MigrationProcedureConfig import kotlinx.collections.immutable.persistentListOf +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.material.ExtendedFloatingActionButton import tachiyomi.presentation.core.components.material.Scaffold +import tachiyomi.presentation.core.i18n.stringResource import kotlin.math.roundToInt class PreMigrationScreen(val mangaIds: List) : Screen() { @@ -79,28 +80,28 @@ class PreMigrationScreen(val mangaIds: List) : Screen() { Scaffold( topBar = { AppBar( - title = stringResource(R.string.select_sources), + title = stringResource(SYMR.strings.select_sources), navigateUp = navigator::pop, scrollBehavior = scrollBehavior, actions = { AppBarActions( persistentListOf( AppBar.Action( - title = stringResource(R.string.select_none), + title = stringResource(SYMR.strings.select_none), icon = Icons.Outlined.Deselect, onClick = { screenModel.massSelect(false) }, ), AppBar.Action( - title = stringResource(R.string.action_select_all), + title = stringResource(MR.strings.action_select_all), icon = Icons.Outlined.SelectAll, onClick = { screenModel.massSelect(true) }, ), AppBar.OverflowAction( - title = stringResource(R.string.match_enabled_sources), + title = stringResource(SYMR.strings.match_enabled_sources), onClick = { screenModel.matchSelection(true) }, ), AppBar.OverflowAction( - title = stringResource(R.string.match_pinned_sources), + title = stringResource(SYMR.strings.match_pinned_sources), onClick = { screenModel.matchSelection(false) }, ), ), @@ -110,11 +111,11 @@ class PreMigrationScreen(val mangaIds: List) : Screen() { }, floatingActionButton = { ExtendedFloatingActionButton( - text = { Text(text = stringResource(R.string.action_migrate)) }, + text = { Text(text = stringResource(MR.strings.action_migrate)) }, icon = { Icon( imageVector = Icons.Outlined.ArrowForward, - contentDescription = stringResource(R.string.action_migrate), + contentDescription = stringResource(MR.strings.action_migrate), ) }, onClick = { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigratingManga.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigratingManga.kt index 73c2b9c8d..4d4990a10 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigratingManga.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigratingManga.kt @@ -1,12 +1,14 @@ package eu.kanade.tachiyomi.ui.browse.migration.advanced.process import android.content.Context -import eu.kanade.tachiyomi.R import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.flow.MutableStateFlow +import tachiyomi.core.i18n.stringResource import tachiyomi.domain.manga.model.Manga +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import java.text.DecimalFormat import kotlin.coroutines.CoroutineContext @@ -24,8 +26,8 @@ class MigratingManga( val progress = MutableStateFlow(1 to 0) sealed class SearchResult { - object Searching : SearchResult() - object NotFound : SearchResult() + data object Searching : SearchResult() + data object NotFound : SearchResult() data class Result(val id: Long) : SearchResult() } @@ -35,14 +37,14 @@ class MigratingManga( ) { fun getFormattedLatestChapter(context: Context): String { return if (latestChapter != null && latestChapter > 0.0) { - context.getString( - R.string.latest_, + context.stringResource( + SYMR.strings.latest_, DecimalFormat("#.#").format(latestChapter), ) } else { - context.getString( - R.string.latest_, - context.getString(R.string.unknown), + context.stringResource( + SYMR.strings.latest_, + context.stringResource(MR.strings.unknown), ) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationListScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationListScreen.kt index f5b79f2ce..55318b57e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationListScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationListScreen.kt @@ -16,14 +16,16 @@ import eu.kanade.presentation.browse.components.MigrationExitDialog import eu.kanade.presentation.browse.components.MigrationMangaDialog import eu.kanade.presentation.browse.components.MigrationProgressDialog import eu.kanade.presentation.util.Screen -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.browse.migration.advanced.design.PreMigrationScreen import eu.kanade.tachiyomi.ui.browse.migration.search.MigrateSearchScreen import eu.kanade.tachiyomi.ui.manga.MangaScreen import eu.kanade.tachiyomi.util.system.toast import exh.util.overEq import exh.util.underEq +import kotlinx.collections.immutable.persistentListOf +import tachiyomi.core.i18n.pluralStringResource import tachiyomi.core.util.lang.withUIContext +import tachiyomi.i18n.sy.SYMR class MigrationListScreen(private val config: MigrationProcedureConfig) : Screen() { @@ -44,8 +46,8 @@ class MigrationListScreen(private val config: MigrationProcedureConfig) : Screen if (items?.isEmpty() == true) { val manualMigrations = screenModel.manualMigrations.value context.toast( - context.resources.getQuantityString( - R.plurals.entry_migrated, + context.pluralStringResource( + SYMR.plurals.entry_migrated, manualMigrations, manualMigrations, ), @@ -93,7 +95,7 @@ class MigrationListScreen(private val config: MigrationProcedureConfig) : Screen } } MigrationListScreen( - items = items.orEmpty(), + items = items ?: persistentListOf(), migrationDone = migrationDone, unfinishedCount = unfinishedCount, getManga = screenModel::getManga, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationListScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationListScreenModel.kt index c09bf3629..1bfd21454 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationListScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationListScreenModel.kt @@ -8,7 +8,6 @@ import eu.kanade.domain.chapter.interactor.SyncChaptersWithSource import eu.kanade.domain.manga.interactor.UpdateManga import eu.kanade.domain.manga.model.hasCustomCover import eu.kanade.domain.manga.model.toSManga -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.cache.CoverCache import eu.kanade.tachiyomi.data.download.DownloadManager import eu.kanade.tachiyomi.source.CatalogueSource @@ -20,6 +19,8 @@ import eu.kanade.tachiyomi.util.system.toast import exh.eh.EHentaiThrottleManager import exh.smartsearch.SmartSearchEngine import exh.source.MERGED_SOURCE_ID +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.CancellationException import kotlinx.coroutines.Job import kotlinx.coroutines.async @@ -55,6 +56,7 @@ import tachiyomi.domain.source.service.SourceManager import tachiyomi.domain.track.interactor.DeleteTrack import tachiyomi.domain.track.interactor.GetTracks import tachiyomi.domain.track.interactor.InsertTrack +import tachiyomi.i18n.sy.SYMR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.util.concurrent.atomic.AtomicInteger @@ -84,7 +86,7 @@ class MigrationListScreenModel( private val smartSearchEngine = SmartSearchEngine(config.extraSearchParams) private val throttleManager = EHentaiThrottleManager() - val migratingItems = MutableStateFlow?>(null) + val migratingItems = MutableStateFlow?>(null) val migrationDone = MutableStateFlow(false) val unfinishedCount = MutableStateFlow(0) @@ -125,7 +127,7 @@ class MigrationListScreenModel( .awaitAll() .filterNotNull() .also { - migratingItems.value = it + migratingItems.value = it.toImmutableList() }, ) } @@ -431,7 +433,7 @@ class MigrationListScreenModel( } else { migratingManga.searchResult.value = SearchResult.NotFound withUIContext { - context.toast(R.string.no_chapters_found_for_migration, Toast.LENGTH_LONG) + context.toast(SYMR.strings.no_chapters_found_for_migration, Toast.LENGTH_LONG) } } } @@ -527,7 +529,7 @@ class MigrationListScreenModel( ids.removeAt(index) config.mangaIds = ids val index2 = migratingItems.value.orEmpty().indexOf(item) - if (index2 > -1) migratingItems.value = migratingItems.value.orEmpty() - item + if (index2 > -1) migratingItems.value = (migratingItems.value.orEmpty() - item).toImmutableList() } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MigrateMangaScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MigrateMangaScreen.kt index 65d285cf0..d2b978354 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MigrateMangaScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MigrateMangaScreen.kt @@ -10,12 +10,12 @@ import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.browse.MigrateMangaScreen import eu.kanade.presentation.util.Screen -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.browse.migration.advanced.design.PreMigrationScreen import eu.kanade.tachiyomi.ui.manga.MangaScreen import eu.kanade.tachiyomi.util.system.toast import kotlinx.coroutines.flow.collectLatest import tachiyomi.domain.UnsortedPreferences +import tachiyomi.i18n.MR import tachiyomi.presentation.core.screens.LoadingScreen import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -57,7 +57,7 @@ data class MigrateMangaScreen( screenModel.events.collectLatest { event -> when (event) { MigrationMangaEvent.FailedFetchingFavorites -> { - context.toast(R.string.internal_error) + context.toast(MR.strings.internal_error) } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SourceSearchScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SourceSearchScreen.kt index 18c39a22c..e0728f0a7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SourceSearchScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SourceSearchScreen.kt @@ -22,6 +22,7 @@ import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceScreenModel import eu.kanade.tachiyomi.ui.browse.source.browse.SourceFilterDialog import eu.kanade.tachiyomi.ui.manga.MangaScreen import eu.kanade.tachiyomi.ui.webview.WebViewScreen +import kotlinx.collections.immutable.persistentListOf import tachiyomi.core.Constants import tachiyomi.domain.manga.model.Manga import tachiyomi.presentation.core.components.material.Scaffold @@ -112,7 +113,7 @@ data class SourceSearchScreen( // SY --> startExpanded = screenModel.startExpanded, onSave = {}, - savedSearches = emptyList(), + savedSearches = persistentListOf(), onSavedSearch = {}, onSavedSearchPress = {}, openMangaDexRandom = null, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/MigrateSourceTab.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/MigrateSourceTab.kt index b8d378b0a..c3cace5e2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/MigrateSourceTab.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/MigrateSourceTab.kt @@ -2,12 +2,10 @@ package eu.kanade.tachiyomi.ui.browse.migration.sources import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.HelpOutline -import androidx.compose.material.icons.outlined.HelpOutline import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalUriHandler -import androidx.compose.ui.res.stringResource import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.core.screen.Screen import cafe.adriel.voyager.navigator.LocalNavigator @@ -15,14 +13,15 @@ import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.browse.MigrateSourceScreen import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.TabContent -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.browse.migration.advanced.design.PreMigrationScreen import eu.kanade.tachiyomi.ui.browse.migration.manga.MigrateMangaScreen +import kotlinx.collections.immutable.persistentListOf import tachiyomi.core.util.lang.launchIO import tachiyomi.core.util.lang.withUIContext import tachiyomi.domain.UnsortedPreferences import tachiyomi.domain.manga.interactor.GetFavorites -import kotlinx.collections.immutable.persistentListOf +import tachiyomi.i18n.MR +import tachiyomi.presentation.core.i18n.stringResource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -34,10 +33,10 @@ fun Screen.migrateSourceTab(): TabContent { val state by screenModel.state.collectAsState() return TabContent( - titleRes = R.string.label_migration, + titleRes = MR.strings.label_migration, actions = persistentListOf( AppBar.Action( - title = stringResource(R.string.migration_help_guide), + title = stringResource(MR.strings.migration_help_guide), icon = Icons.AutoMirrored.Outlined.HelpOutline, onClick = { uriHandler.openUri("https://tachiyomi.org/docs/guides/source-migration") diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourcesTab.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourcesTab.kt index 50f182f82..347f7d45f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourcesTab.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourcesTab.kt @@ -7,7 +7,6 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue -import androidx.compose.ui.res.stringResource import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.core.screen.Screen import cafe.adriel.voyager.navigator.LocalNavigator @@ -17,7 +16,6 @@ import eu.kanade.presentation.browse.SourceOptionsDialog import eu.kanade.presentation.browse.SourcesScreen import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.TabContent -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.browse.source.SourcesScreen.SmartSearchConfig import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceScreen import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceScreenModel.Listing @@ -27,6 +25,9 @@ import exh.ui.smartsearch.SmartSearchScreen import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR +import tachiyomi.presentation.core.i18n.stringResource @Composable fun Screen.sourcesTab( @@ -39,18 +40,18 @@ fun Screen.sourcesTab( return TabContent( // SY --> titleRes = when (smartSearchConfig == null) { - true -> R.string.label_sources - false -> R.string.find_in_another_source + true -> MR.strings.label_sources + false -> SYMR.strings.find_in_another_source }, actions = if (smartSearchConfig == null) { persistentListOf( AppBar.Action( - title = stringResource(R.string.action_global_search), + title = stringResource(MR.strings.action_global_search), icon = Icons.Outlined.TravelExplore, onClick = { navigator.push(GlobalSearchScreen()) }, ), AppBar.Action( - title = stringResource(R.string.action_filter), + title = stringResource(MR.strings.action_filter), icon = Icons.Outlined.FilterList, onClick = { navigator.push(SourcesFilterScreen()) }, ), @@ -116,7 +117,7 @@ fun Screen.sourcesTab( null -> Unit } - val internalErrString = stringResource(R.string.internal_error) + val internalErrString = stringResource(MR.strings.internal_error) LaunchedEffect(Unit) { screenModel.events.collectLatest { event -> when (event) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/AutoCompleteItem.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/AutoCompleteItem.kt index d72f70530..9c773ac62 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/AutoCompleteItem.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/AutoCompleteItem.kt @@ -33,6 +33,7 @@ import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.util.fastForEach +import kotlinx.collections.immutable.ImmutableList import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import tachiyomi.presentation.core.components.SettingsItemsPaddings @@ -41,11 +42,11 @@ import tachiyomi.presentation.core.util.runOnEnterKeyPressed @Composable fun AutoCompleteItem( name: String, - state: List, + state: ImmutableList, hint: String, - values: List, - skipAutoFillTags: List, - validPrefixes: List, + values: ImmutableList, + skipAutoFillTags: ImmutableList, + validPrefixes: ImmutableList, onChange: (List) -> Unit, ) { Column( @@ -114,7 +115,7 @@ fun AutoCompleteItem( fun AutoCompleteTextField( label: String? = null, placeholder: String? = null, - values: List, + values: ImmutableList, onValueFilter: ((String) -> (Pair<(String) -> Boolean, String?>)), onSubmit: (String) -> Boolean, ) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreen.kt index 7e5b7be3e..f0a98d310 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreen.kt @@ -65,7 +65,7 @@ import tachiyomi.domain.source.model.StubSource import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.padding -import tachiyomi.presentation.core.i18n.localize +import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.source.local.LocalSource data class BrowseSourceScreen( @@ -174,7 +174,7 @@ data class BrowseSourceScreen( ) }, label = { - Text(text = localize(MR.strings.popular)) + Text(text = stringResource(MR.strings.popular)) }, ) if ((screenModel.source as CatalogueSource).supportsLatest) { @@ -193,7 +193,7 @@ data class BrowseSourceScreen( ) }, label = { - Text(text = localize(MR.strings.latest)) + Text(text = stringResource(MR.strings.latest)) }, ) } @@ -213,9 +213,9 @@ data class BrowseSourceScreen( // SY --> Text( text = if (state.filters.isNotEmpty()) { - stringResource(R.string.action_filter) + stringResource(MR.strings.action_filter) } else { - stringResource(R.string.action_search) + stringResource(MR.strings.action_search) }, ) // SY <-- diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreenModel.kt index 1aa4183d5..31b27b685 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreenModel.kt @@ -13,6 +13,7 @@ import androidx.paging.filter import androidx.paging.map import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope +import dev.icerock.moko.resources.StringResource import eu.kanade.core.preference.asState import eu.kanade.domain.base.BasePreferences import eu.kanade.domain.manga.interactor.UpdateManga @@ -22,7 +23,6 @@ import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.domain.track.interactor.AddTracks import eu.kanade.domain.ui.UiPreferences import eu.kanade.presentation.util.ioCoroutineScope -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.cache.CoverCache import eu.kanade.tachiyomi.source.CatalogueSource import eu.kanade.tachiyomi.source.model.FilterList @@ -32,6 +32,9 @@ import eu.kanade.tachiyomi.util.removeCovers import exh.metadata.metadata.RaisedSearchMetadata import exh.source.getMainSource import exh.source.mangaDexSourceIds +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.persistentListOf +import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.distinctUntilChanged @@ -47,7 +50,6 @@ import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking -import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonArray @@ -75,6 +77,7 @@ import tachiyomi.domain.source.model.EXHSavedSearch import tachiyomi.domain.source.model.SavedSearch import tachiyomi.domain.source.repository.SourcePagingSourceType import tachiyomi.domain.source.service.SourceManager +import tachiyomi.i18n.sy.SYMR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import xyz.nulldev.ts.api.http.serializer.FilterSerializer @@ -171,7 +174,7 @@ open class BrowseSourceScreenModel( getExhSavedSearch.subscribe(source.id, source::getFilterList) .map { it.sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER, EXHSavedSearch::name)) } .onEach { savedSearches -> - mutableState.update { it.copy(savedSearches = savedSearches) } + mutableState.update { it.copy(savedSearches = savedSearches.toImmutableList()) } } .launchIn(screenModelScope) } @@ -368,7 +371,7 @@ open class BrowseSourceScreenModel( else -> { val preselectedIds = getCategories.await(manga.id).map { it.id } setDialog( - Dialog.ChangeMangaCategory(manga, categories.mapAsCheckboxState { it.id in preselectedIds }), + Dialog.ChangeMangaCategory(manga, categories.mapAsCheckboxState { it.id in preselectedIds }.toImmutableList()), ) } } @@ -447,13 +450,13 @@ open class BrowseSourceScreenModel( data class AddDuplicateManga(val manga: Manga, val duplicate: Manga) : Dialog data class ChangeMangaCategory( val manga: Manga, - val initialSelection: List>, + val initialSelection: ImmutableList>, ) : Dialog data class Migrate(val newManga: Manga) : Dialog // SY --> data class DeleteSavedSearch(val idToDelete: Long, val name: String) : Dialog - data class CreateSavedSearch(val currentSavedSearches: List) : Dialog + data class CreateSavedSearch(val currentSavedSearches: ImmutableList) : Dialog // SY <-- } @@ -464,7 +467,7 @@ open class BrowseSourceScreenModel( val toolbarQuery: String? = null, val dialog: Dialog? = null, // SY --> - val savedSearches: List = emptyList(), + val savedSearches: ImmutableList = persistentListOf(), val filterable: Boolean = true, // SY <-- ) { @@ -474,21 +477,21 @@ open class BrowseSourceScreenModel( // EXH --> fun onSaveSearch() { screenModelScope.launchIO { - val names = state.value.savedSearches.map { it.name } + val names = state.value.savedSearches.map { it.name }.toImmutableList() mutableState.update { it.copy(dialog = Dialog.CreateSavedSearch(names)) } } } fun onSavedSearch( search: EXHSavedSearch, - onToast: (Int) -> Unit, + onToast: (StringResource) -> Unit, ) { screenModelScope.launchIO { if (source !is CatalogueSource) return@launchIO if (search.filterList == null && state.value.filters.isNotEmpty()) { withUIContext { - onToast(R.string.save_search_invalid) + onToast(SYMR.strings.save_search_invalid) } return@launchIO } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/MangaDexFilterHeader.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/MangaDexFilterHeader.kt index 669d4c639..095648661 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/MangaDexFilterHeader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/MangaDexFilterHeader.kt @@ -7,10 +7,10 @@ import androidx.compose.foundation.layout.padding import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource -import eu.kanade.tachiyomi.R +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.SettingsItemsPaddings import tachiyomi.presentation.core.components.material.TextButton +import tachiyomi.presentation.core.i18n.stringResource @Composable fun MangaDexFilterHeader( @@ -23,10 +23,10 @@ fun MangaDexFilterHeader( horizontalArrangement = Arrangement.SpaceBetween, ) { TextButton(onClick = openMangaDexRandom) { - Text(stringResource(R.string.random)) + Text(stringResource(SYMR.strings.random)) } TextButton(onClick = openMangaDexFollows) { - Text(stringResource(R.string.mangadex_follows)) + Text(stringResource(SYMR.strings.mangadex_follows)) } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SavedSearchItem.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SavedSearchItem.kt index 9a61c1a3f..ddb1a1606 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SavedSearchItem.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SavedSearchItem.kt @@ -9,18 +9,19 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import eu.kanade.presentation.components.SuggestionChip import eu.kanade.presentation.components.SuggestionChipDefaults -import eu.kanade.tachiyomi.R +import kotlinx.collections.immutable.ImmutableList import tachiyomi.domain.source.model.EXHSavedSearch +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.SettingsItemsPaddings +import tachiyomi.presentation.core.i18n.stringResource @Composable fun SavedSearchItem( - savedSearches: List, + savedSearches: ImmutableList, onSavedSearch: (EXHSavedSearch) -> Unit, onSavedSearchPress: (EXHSavedSearch) -> Unit, ) { @@ -34,7 +35,7 @@ fun SavedSearchItem( ), ) { Text( - text = stringResource(R.string.saved_searches), + text = stringResource(SYMR.strings.saved_searches), style = MaterialTheme.typography.bodySmall, ) FlowRow( diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceFilterDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceFilterDialog.kt index 7995f27ce..5bb2a42a4 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceFilterDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceFilterDialog.kt @@ -18,14 +18,15 @@ import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import eu.kanade.presentation.components.AdaptiveSheet -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.source.model.Filter import eu.kanade.tachiyomi.source.model.FilterList +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.toImmutableList import tachiyomi.core.preference.TriState import tachiyomi.domain.source.model.EXHSavedSearch +import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.CheckboxItem import tachiyomi.presentation.core.components.CollapsibleBox import tachiyomi.presentation.core.components.HeadingItem @@ -34,6 +35,7 @@ import tachiyomi.presentation.core.components.SortItem import tachiyomi.presentation.core.components.TextItem import tachiyomi.presentation.core.components.TriStateItem import tachiyomi.presentation.core.components.material.Button +import tachiyomi.presentation.core.i18n.stringResource @Composable fun SourceFilterDialog( @@ -44,7 +46,7 @@ fun SourceFilterDialog( onUpdate: (FilterList) -> Unit, // SY --> startExpanded: Boolean, - savedSearches: List, + savedSearches: ImmutableList, onSave: () -> Unit, onSavedSearch: (EXHSavedSearch) -> Unit, onSavedSearchPress: (EXHSavedSearch) -> Unit, @@ -66,7 +68,7 @@ fun SourceFilterDialog( ) { TextButton(onClick = onReset) { Text( - text = stringResource(R.string.action_reset), + text = stringResource(MR.strings.action_reset), style = LocalTextStyle.current.copy( color = MaterialTheme.colorScheme.primary, ), @@ -79,7 +81,7 @@ fun SourceFilterDialog( IconButton(onClick = onSave) { Icon( Icons.Default.Save, - contentDescription = stringResource(R.string.action_save), + contentDescription = stringResource(MR.strings.action_save), tint = MaterialTheme.colorScheme.onBackground, ) } @@ -88,7 +90,7 @@ fun SourceFilterDialog( onFilter() onDismissRequest() }) { - Text(stringResource(R.string.action_filter)) + Text(stringResource(MR.strings.action_filter)) } } HorizontalDivider() @@ -125,11 +127,11 @@ private fun FilterItem(filter: Filter<*>, onUpdate: () -> Unit/* SY --> */, star is Filter.AutoComplete -> { AutoCompleteItem( name = filter.name, - state = filter.state, + state = filter.state.toImmutableList(), hint = filter.hint, - values = filter.values, - skipAutoFillTags = filter.skipAutoFillTags, - validPrefixes = filter.validPrefixes, + values = filter.values.toImmutableList(), + skipAutoFillTags = filter.skipAutoFillTags.toImmutableList(), + validPrefixes = filter.validPrefixes.toImmutableList(), ) { filter.state = it onUpdate() diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/feed/SourceFeedScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/feed/SourceFeedScreenModel.kt index 8f4eccc9f..27a8988f6 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/feed/SourceFeedScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/feed/SourceFeedScreenModel.kt @@ -7,19 +7,22 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.produceState import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope +import dev.icerock.moko.resources.StringResource import eu.kanade.core.preference.asState import eu.kanade.domain.manga.interactor.UpdateManga import eu.kanade.domain.manga.model.toDomainManga import eu.kanade.domain.source.interactor.GetExhSavedSearch import eu.kanade.domain.ui.UiPreferences import eu.kanade.presentation.browse.SourceFeedUI -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.source.CatalogueSource import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.online.all.MangaDex import exh.source.getMainSource import exh.source.mangaDexSourceIds import exh.util.nullIfBlank +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.persistentListOf +import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll @@ -46,6 +49,7 @@ import tachiyomi.domain.source.model.EXHSavedSearch import tachiyomi.domain.source.model.FeedSavedSearch import tachiyomi.domain.source.model.SavedSearch import tachiyomi.domain.source.service.SourceManager +import tachiyomi.i18n.sy.SYMR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import xyz.nulldev.ts.api.http.serializer.FilterSerializer @@ -125,20 +129,23 @@ open class SourceFeedScreenModel( } } - private suspend fun getSourcesToGetFeed(feedSavedSearch: List): List { - if (source !is CatalogueSource) return emptyList() + private suspend fun getSourcesToGetFeed(feedSavedSearch: List): ImmutableList { + if (source !is CatalogueSource) return persistentListOf() val savedSearches = getSavedSearchBySourceIdFeed.await(source.id) .associateBy { it.id } - return listOfNotNull( - if (source.supportsLatest) { - SourceFeedUI.Latest(null) - } else { - null - }, - SourceFeedUI.Browse(null), - ) + feedSavedSearch - .map { SourceFeedUI.SourceSavedSearch(it, savedSearches[it.savedSearch]!!, null) } + return ( + listOfNotNull( + if (source.supportsLatest) { + SourceFeedUI.Latest(null) + } else { + null + }, + SourceFeedUI.Browse(null), + ) + feedSavedSearch + .map { SourceFeedUI.SourceSavedSearch(it, savedSearches[it.savedSearch]!!, null) } + ) + .toImmutableList() } /** @@ -175,7 +182,7 @@ open class SourceFeedScreenModel( state.copy( items = state.items.map { item -> if (item.id == sourceFeed.id) sourceFeed.withResults(titles) else item - }, + }.toImmutableList(), ) } } @@ -210,6 +217,7 @@ open class SourceFeedScreenModel( private suspend fun loadSearches() = getExhSavedSearch.await(source.id, (source as CatalogueSource)::getFilterList) .sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER, EXHSavedSearch::name)) + .toImmutableList() fun onFilter(onBrowseClick: (query: String?, filters: String?) -> Unit) { if (source !is CatalogueSource) return @@ -233,13 +241,13 @@ open class SourceFeedScreenModel( fun onSavedSearch( search: EXHSavedSearch, onBrowseClick: (query: String?, searchId: Long) -> Unit, - onToast: (Int) -> Unit, + onToast: (StringResource) -> Unit, ) { if (source !is CatalogueSource) return screenModelScope.launchIO { if (search.filterList == null && state.value.filters.isNotEmpty()) { withUIContext { - onToast(R.string.save_search_invalid) + onToast(SYMR.strings.save_search_invalid) } return@launchIO } @@ -258,12 +266,12 @@ open class SourceFeedScreenModel( fun onSavedSearchAddToFeed( search: EXHSavedSearch, - onToast: (Int) -> Unit, + onToast: (StringResource) -> Unit, ) { screenModelScope.launchIO { if (hasTooManyFeeds()) { withUIContext { - onToast(R.string.too_many_in_feed) + onToast(SYMR.strings.too_many_in_feed) } return@launchIO } @@ -314,9 +322,9 @@ open class SourceFeedScreenModel( @Immutable data class SourceFeedState( val searchQuery: String? = null, - val items: List = emptyList(), + val items: ImmutableList = persistentListOf(), val filters: FilterList = FilterList(), - val savedSearches: List = emptyList(), + val savedSearches: ImmutableList = persistentListOf(), val dialog: SourceFeedScreenModel.Dialog? = null, ) { val isLoading diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/SearchScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/SearchScreenModel.kt index d971af848..fe1fe79d1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/SearchScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/SearchScreenModel.kt @@ -12,6 +12,7 @@ import eu.kanade.tachiyomi.source.CatalogueSource import kotlinx.collections.immutable.PersistentMap import kotlinx.collections.immutable.mutate import kotlinx.collections.immutable.persistentMapOf +import kotlinx.collections.immutable.toImmutableMap import kotlinx.collections.immutable.toPersistentMap import kotlinx.coroutines.Job import kotlinx.coroutines.asCoroutineDispatcher @@ -203,6 +204,7 @@ abstract class SearchScreenModel( val progress: Int = items.count { it.value !is SearchItemResult.Loading } val total: Int = items.size val filteredItems = items.filter { (_, result) -> result.isVisible(onlyShowHasResults) } + .toImmutableMap() } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/category/CategoryScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/category/CategoryScreen.kt index eef69db8e..b71ca0c84 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/category/CategoryScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/category/CategoryScreen.kt @@ -5,7 +5,6 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import androidx.compose.ui.util.fastMap import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator @@ -16,9 +15,11 @@ import eu.kanade.presentation.category.components.CategoryDeleteDialog import eu.kanade.presentation.category.components.CategoryRenameDialog import eu.kanade.presentation.category.components.CategorySortAlphabeticallyDialog import eu.kanade.presentation.util.Screen -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.util.system.toast +import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.flow.collectLatest +import tachiyomi.i18n.MR +import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.LoadingScreen class CategoryScreen : Screen() { @@ -56,8 +57,8 @@ class CategoryScreen : Screen() { onDismissRequest = screenModel::dismissDialog, onCreate = screenModel::createCategory, // SY --> - categories = successState.categories.fastMap { it.name }, - title = stringResource(R.string.action_add_category), + categories = successState.categories.fastMap { it.name }.toImmutableList(), + title = stringResource(MR.strings.action_add_category), // SY <-- ) } @@ -66,7 +67,7 @@ class CategoryScreen : Screen() { onDismissRequest = screenModel::dismissDialog, onRename = { screenModel.renameCategory(dialog.category, it) }, // SY --> - categories = successState.categories.fastMap { it.name }, + categories = successState.categories.fastMap { it.name }.toImmutableList(), category = dialog.category.name, // SY <-- ) @@ -76,8 +77,8 @@ class CategoryScreen : Screen() { onDismissRequest = screenModel::dismissDialog, onDelete = { screenModel.deleteCategory(dialog.category.id) }, // SY --> - title = stringResource(R.string.delete_category), - text = stringResource(R.string.delete_category_confirmation, dialog.category.name), + title = stringResource(MR.strings.delete_category), + text = stringResource(MR.strings.delete_category_confirmation, dialog.category.name), // SY <-- ) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/category/biometric/BiometricTimesScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/category/biometric/BiometricTimesScreen.kt index 60385f2f3..e0c382034 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/category/biometric/BiometricTimesScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/category/biometric/BiometricTimesScreen.kt @@ -5,7 +5,6 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow @@ -13,10 +12,11 @@ import com.google.android.material.timepicker.MaterialTimePicker import eu.kanade.presentation.category.BiometricTimesScreen import eu.kanade.presentation.category.components.CategoryDeleteDialog import eu.kanade.presentation.util.Screen -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.main.MainActivity import eu.kanade.tachiyomi.util.system.toast import kotlinx.coroutines.flow.collectLatest +import tachiyomi.i18n.sy.SYMR +import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.LoadingScreen import kotlin.time.Duration import kotlin.time.Duration.Companion.hours @@ -48,7 +48,7 @@ class BiometricTimesScreen : Screen() { fun showTimePicker(startTime: Duration? = null) { val activity = context as? MainActivity ?: return val picker = MaterialTimePicker.Builder() - .setTitleText(if (startTime == null) R.string.biometric_lock_start_time else R.string.biometric_lock_end_time) + .setTitleText(if (startTime == null) SYMR.strings.biometric_lock_start_time.getString(context) else SYMR.strings.biometric_lock_end_time.getString(context)) .setInputMode(MaterialTimePicker.INPUT_MODE_CLOCK) .build() picker.addOnPositiveButtonClickListener { @@ -77,8 +77,8 @@ class BiometricTimesScreen : Screen() { CategoryDeleteDialog( onDismissRequest = screenModel::dismissDialog, onDelete = { screenModel.deleteTimeRanges(dialog.timeRange) }, - title = stringResource(R.string.delete_time_range), - text = stringResource(R.string.delete_time_range_confirmation, dialog.timeRange.formattedString), + title = stringResource(SYMR.strings.delete_time_range), + text = stringResource(SYMR.strings.delete_time_range_confirmation, dialog.timeRange.formattedString), ) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/category/biometric/BiometricTimesScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/category/biometric/BiometricTimesScreenModel.kt index b021a2a1f..313bb5fa4 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/category/biometric/BiometricTimesScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/category/biometric/BiometricTimesScreenModel.kt @@ -1,18 +1,21 @@ package eu.kanade.tachiyomi.ui.category.biometric import android.app.Application -import androidx.annotation.StringRes import androidx.compose.runtime.Immutable import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope -import eu.kanade.tachiyomi.R +import dev.icerock.moko.resources.StringResource import eu.kanade.tachiyomi.core.security.SecurityPreferences +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.update import tachiyomi.core.preference.plusAssign import tachiyomi.core.util.lang.launchIO +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -33,7 +36,8 @@ class BiometricTimesScreenModel( BiometricTimesScreenState.Success( timeRanges = times.toList() .mapNotNull(TimeRange::fromPreferenceString) - .map { TimeRangeItem(it, it.getFormattedString(context)) }, + .map { TimeRangeItem(it, it.getFormattedString(context)) } + .toImmutableList(), ) } } @@ -101,9 +105,9 @@ class BiometricTimesScreenModel( } sealed class BiometricTimesEvent { - sealed class LocalizedMessage(@StringRes val stringRes: Int) : BiometricTimesEvent() - object TimeConflicts : LocalizedMessage(R.string.biometric_lock_time_conflicts) - object InternalError : LocalizedMessage(R.string.internal_error) + sealed class LocalizedMessage(val stringRes: StringResource) : BiometricTimesEvent() + data object TimeConflicts : LocalizedMessage(SYMR.strings.biometric_lock_time_conflicts) + data object InternalError : LocalizedMessage(MR.strings.internal_error) } sealed class BiometricTimesDialog { @@ -114,11 +118,11 @@ sealed class BiometricTimesDialog { sealed class BiometricTimesScreenState { @Immutable - object Loading : BiometricTimesScreenState() + data object Loading : BiometricTimesScreenState() @Immutable data class Success( - val timeRanges: List, + val timeRanges: ImmutableList, val dialog: BiometricTimesDialog? = null, ) : BiometricTimesScreenState() { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagScreen.kt index 633ebc5e4..e0d4b2fd3 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagScreen.kt @@ -5,16 +5,16 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.category.components.CategoryCreateDialog import eu.kanade.presentation.category.components.CategoryDeleteDialog import eu.kanade.presentation.util.Screen -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.util.system.toast import kotlinx.coroutines.flow.collectLatest +import tachiyomi.i18n.sy.SYMR +import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.LoadingScreen class SortTagScreen : Screen() { @@ -49,17 +49,17 @@ class SortTagScreen : Screen() { onDismissRequest = screenModel::dismissDialog, onCreate = { screenModel.createTag(it) }, categories = successState.tags, - title = stringResource(R.string.add_tag), - extraMessage = stringResource(R.string.action_add_tags_message), - alreadyExistsError = R.string.error_tag_exists, + title = stringResource(SYMR.strings.add_tag), + extraMessage = stringResource(SYMR.strings.action_add_tags_message), + alreadyExistsError = SYMR.strings.error_tag_exists, ) } is SortTagDialog.Delete -> { CategoryDeleteDialog( onDismissRequest = screenModel::dismissDialog, onDelete = { screenModel.delete(dialog.tag) }, - title = stringResource(R.string.delete_tag), - text = stringResource(R.string.delete_tag_confirmation, dialog.tag), + title = stringResource(SYMR.strings.delete_tag), + text = stringResource(SYMR.strings.delete_tag_confirmation, dialog.tag), ) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagScreenModel.kt index 9345953dd..4446f0281 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagScreenModel.kt @@ -1,19 +1,22 @@ package eu.kanade.tachiyomi.ui.category.genre -import androidx.annotation.StringRes import androidx.compose.runtime.Immutable import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope +import dev.icerock.moko.resources.StringResource import eu.kanade.domain.manga.interactor.CreateSortTag import eu.kanade.domain.manga.interactor.DeleteSortTag import eu.kanade.domain.manga.interactor.GetSortTag import eu.kanade.domain.manga.interactor.ReorderSortTag -import eu.kanade.tachiyomi.R +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.update import tachiyomi.core.util.lang.launchIO +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -33,7 +36,7 @@ class SortTagScreenModel( .collectLatest { tags -> mutableState.update { SortTagScreenState.Success( - tags = tags, + tags = tags.toImmutableList(), ) } } @@ -93,9 +96,9 @@ class SortTagScreenModel( } sealed class SortTagEvent { - sealed class LocalizedMessage(@StringRes val stringRes: Int) : SortTagEvent() - object TagExists : LocalizedMessage(R.string.error_tag_exists) - object InternalError : LocalizedMessage(R.string.internal_error) + sealed class LocalizedMessage(val stringRes: StringResource) : SortTagEvent() + data object TagExists : LocalizedMessage(SYMR.strings.error_tag_exists) + data object InternalError : LocalizedMessage(MR.strings.internal_error) } sealed class SortTagDialog { @@ -110,7 +113,7 @@ sealed class SortTagScreenState { @Immutable data class Success( - val tags: List, + val tags: ImmutableList, val dialog: SortTagDialog? = null, ) : SortTagScreenState() { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/category/repos/RepoScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/category/repos/RepoScreen.kt index 3daf05439..0fa96f0d7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/category/repos/RepoScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/category/repos/RepoScreen.kt @@ -5,7 +5,6 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow @@ -13,9 +12,10 @@ import eu.kanade.presentation.category.SourceRepoScreen import eu.kanade.presentation.category.components.CategoryCreateDialog import eu.kanade.presentation.category.components.CategoryDeleteDialog import eu.kanade.presentation.util.Screen -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.util.system.toast import kotlinx.coroutines.flow.collectLatest +import tachiyomi.i18n.sy.SYMR +import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.LoadingScreen class RepoScreen : Screen() { @@ -48,17 +48,17 @@ class RepoScreen : Screen() { onDismissRequest = screenModel::dismissDialog, onCreate = { screenModel.createRepo(it) }, categories = successState.repos, - title = stringResource(R.string.action_add_repo), - extraMessage = stringResource(R.string.action_add_repo_message), - alreadyExistsError = R.string.error_repo_exists, + title = stringResource(SYMR.strings.action_add_repo), + extraMessage = stringResource(SYMR.strings.action_add_repo_message), + alreadyExistsError = SYMR.strings.error_repo_exists, ) } is RepoDialog.Delete -> { CategoryDeleteDialog( onDismissRequest = screenModel::dismissDialog, onDelete = { screenModel.deleteRepos(listOf(dialog.repo)) }, - title = stringResource(R.string.delete_repo), - text = stringResource(R.string.delete_repo_confirmation, dialog.repo), + title = stringResource(SYMR.strings.delete_repo), + text = stringResource(SYMR.strings.delete_repo_confirmation, dialog.repo), ) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/category/repos/RepoScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/category/repos/RepoScreenModel.kt index 20c098a1e..229ca6dae 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/category/repos/RepoScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/category/repos/RepoScreenModel.kt @@ -1,11 +1,12 @@ package eu.kanade.tachiyomi.ui.category.repos -import androidx.annotation.StringRes import androidx.compose.runtime.Immutable import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope +import dev.icerock.moko.resources.StringResource import eu.kanade.domain.source.interactor.CreateSourceRepo -import eu.kanade.tachiyomi.R +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.receiveAsFlow @@ -13,6 +14,8 @@ import kotlinx.coroutines.flow.update import tachiyomi.core.util.lang.launchIO import tachiyomi.domain.source.interactor.DeleteSourceRepos import tachiyomi.domain.source.interactor.GetSourceRepos +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -31,7 +34,7 @@ class RepoScreenModel( .collectLatest { repos -> mutableState.update { RepoScreenState.Success( - repos = repos, + repos = repos.toImmutableList(), ) } } @@ -83,9 +86,9 @@ class RepoScreenModel( } sealed class RepoEvent { - sealed class LocalizedMessage(@StringRes val stringRes: Int) : RepoEvent() - object InvalidName : LocalizedMessage(R.string.invalid_repo_name) - object InternalError : LocalizedMessage(R.string.internal_error) + sealed class LocalizedMessage(val stringRes: StringResource) : RepoEvent() + data object InvalidName : LocalizedMessage(SYMR.strings.invalid_repo_name) + data object InternalError : LocalizedMessage(MR.strings.internal_error) } sealed class RepoDialog { @@ -96,11 +99,11 @@ sealed class RepoDialog { sealed class RepoScreenState { @Immutable - object Loading : RepoScreenState() + data object Loading : RepoScreenState() @Immutable data class Success( - val repos: List, + val repos: ImmutableList, val dialog: RepoDialog? = null, ) : RepoScreenState() { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/category/sources/SourceCategoryScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/category/sources/SourceCategoryScreen.kt index 85d271c14..fa49d64f1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/category/sources/SourceCategoryScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/category/sources/SourceCategoryScreen.kt @@ -5,7 +5,6 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow @@ -14,9 +13,10 @@ import eu.kanade.presentation.category.components.CategoryCreateDialog import eu.kanade.presentation.category.components.CategoryDeleteDialog import eu.kanade.presentation.category.components.CategoryRenameDialog import eu.kanade.presentation.util.Screen -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.util.system.toast import kotlinx.coroutines.flow.collectLatest +import tachiyomi.i18n.MR +import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.LoadingScreen class SourceCategoryScreen : Screen() { @@ -52,7 +52,7 @@ class SourceCategoryScreen : Screen() { onCreate = { screenModel.createCategory(it) }, // SY --> categories = successState.categories, - title = stringResource(R.string.action_add_category), + title = stringResource(MR.strings.action_add_category), // SY <-- ) } @@ -71,8 +71,8 @@ class SourceCategoryScreen : Screen() { onDismissRequest = screenModel::dismissDialog, onDelete = { screenModel.deleteCategory(dialog.category) }, // SY --> - title = stringResource(R.string.delete_category), - text = stringResource(R.string.delete_category_confirmation, dialog.category), + title = stringResource(MR.strings.delete_category), + text = stringResource(MR.strings.delete_category_confirmation, dialog.category), // SY <-- ) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/category/sources/SourceCategoryScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/category/sources/SourceCategoryScreenModel.kt index 532dfeeb8..94a2fbb4d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/category/sources/SourceCategoryScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/category/sources/SourceCategoryScreenModel.kt @@ -1,19 +1,22 @@ package eu.kanade.tachiyomi.ui.category.sources -import androidx.annotation.StringRes import androidx.compose.runtime.Immutable import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope +import dev.icerock.moko.resources.StringResource import eu.kanade.domain.source.interactor.CreateSourceCategory import eu.kanade.domain.source.interactor.DeleteSourceCategory import eu.kanade.domain.source.interactor.GetSourceCategories import eu.kanade.domain.source.interactor.RenameSourceCategory -import eu.kanade.tachiyomi.R +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.update import tachiyomi.core.util.lang.launchIO +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -33,7 +36,7 @@ class SourceCategoryScreenModel( .collectLatest { categories -> mutableState.update { SourceCategoryScreenState.Success( - categories = categories, + categories = categories.toImmutableList(), ) } } @@ -100,9 +103,9 @@ class SourceCategoryScreenModel( } sealed class SourceCategoryEvent { - sealed class LocalizedMessage(@StringRes val stringRes: Int) : SourceCategoryEvent() - object InvalidName : LocalizedMessage(R.string.invalid_category_name) - object InternalError : LocalizedMessage(R.string.internal_error) + sealed class LocalizedMessage(val stringRes: StringResource) : SourceCategoryEvent() + object InvalidName : LocalizedMessage(SYMR.strings.invalid_category_name) + object InternalError : LocalizedMessage(MR.strings.internal_error) } sealed class SourceCategoryDialog { @@ -118,7 +121,7 @@ sealed class SourceCategoryScreenState { @Immutable data class Success( - val categories: List, + val categories: ImmutableList, val dialog: SourceCategoryDialog? = null, ) : SourceCategoryScreenState() { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/history/HistoryScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/history/HistoryScreenModel.kt index 960b66c3a..e495fd719 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/history/HistoryScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/history/HistoryScreenModel.kt @@ -6,6 +6,8 @@ import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.core.util.insertSeparators import eu.kanade.presentation.history.HistoryUiModel import eu.kanade.tachiyomi.util.lang.toDateKey +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.Flow @@ -50,7 +52,7 @@ class HistoryScreenModel( logcat(LogPriority.ERROR, error) _events.send(Event.InternalError) } - .map { it.toHistoryUiModels() } + .map { it.toHistoryUiModels().toImmutableList() } .flowOn(Dispatchers.IO) } .collect { newList -> mutableState.update { it.copy(list = newList) } } @@ -116,7 +118,7 @@ class HistoryScreenModel( @Immutable data class State( val searchQuery: String? = null, - val list: List? = null, + val list: ImmutableList? = null, val dialog: Dialog? = null, ) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/history/HistoryTab.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/history/HistoryTab.kt index da9e53b80..2950871c2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/history/HistoryTab.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/history/HistoryTab.kt @@ -12,7 +12,6 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.Navigator @@ -32,7 +31,10 @@ import eu.kanade.tachiyomi.ui.reader.ReaderActivity import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.receiveAsFlow +import tachiyomi.core.i18n.stringResource import tachiyomi.domain.chapter.model.Chapter +import tachiyomi.i18n.MR +import tachiyomi.presentation.core.i18n.stringResource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -49,7 +51,7 @@ object HistoryTab : Tab { val image = AnimatedImageVector.animatedVectorResource(R.drawable.anim_history_enter) return TabOptions( index = 2u, - title = stringResource(R.string.label_recent_manga), + title = stringResource(MR.strings.label_recent_manga), icon = rememberAnimatedVectorPainter(image, isSelected), ) } @@ -117,9 +119,9 @@ object HistoryTab : Tab { screenModel.events.collectLatest { e -> when (e) { HistoryScreenModel.Event.InternalError -> - snackbarHostState.showSnackbar(context.getString(R.string.internal_error)) + snackbarHostState.showSnackbar(context.stringResource(MR.strings.internal_error)) HistoryScreenModel.Event.HistoryCleared -> - snackbarHostState.showSnackbar(context.getString(R.string.clear_history_completed)) + snackbarHostState.showSnackbar(context.stringResource(MR.strings.clear_history_completed)) is HistoryScreenModel.Event.OpenChapter -> openChapter(context, e.chapter) } } @@ -137,7 +139,7 @@ object HistoryTab : Tab { val intent = ReaderActivity.newIntent(context, chapter.mangaId, chapter.id) context.startActivity(intent) } else { - snackbarHostState.showSnackbar(context.getString(R.string.no_next_chapter)) + snackbarHostState.showSnackbar(context.stringResource(MR.strings.no_next_chapter)) } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt index 46aac490c..61da9a0ef 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt @@ -25,7 +25,6 @@ import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.presentation.components.SEARCH_DEBOUNCE_MILLIS import eu.kanade.presentation.library.components.LibraryToolbarTitle import eu.kanade.presentation.manga.DownloadAction -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.cache.CoverCache import eu.kanade.tachiyomi.data.download.DownloadCache import eu.kanade.tachiyomi.data.download.DownloadManager @@ -55,9 +54,11 @@ import exh.source.nHentaiSourceIds import exh.util.cancellable import exh.util.isLewd import exh.util.nullIfBlank +import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.PersistentList import kotlinx.collections.immutable.mutate import kotlinx.collections.immutable.persistentListOf +import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.asFlow import kotlinx.coroutines.flow.collectLatest @@ -73,6 +74,7 @@ import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.toList import kotlinx.coroutines.flow.update import kotlinx.coroutines.runBlocking +import tachiyomi.core.i18n.stringResource import tachiyomi.core.preference.CheckboxState import tachiyomi.core.preference.TriState import tachiyomi.core.util.lang.compareToWithCollator @@ -107,6 +109,8 @@ import tachiyomi.domain.source.service.SourceManager import tachiyomi.domain.track.interactor.GetTracks import tachiyomi.domain.track.interactor.GetTracksPerManga import tachiyomi.domain.track.model.Track +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.source.local.LocalSource import tachiyomi.source.local.isLocal import uy.kohesive.injekt.Injekt @@ -549,7 +553,7 @@ class LibraryScreenModel( mapOf( Category( 0, - preferences.context.getString(R.string.ungrouped), + preferences.context.stringResource(SYMR.strings.ungrouped), 0, 0, ) to @@ -845,24 +849,24 @@ class LibraryScreenModel( ): String { return when (groupType) { LibraryGroup.BY_STATUS -> when (category?.id) { - SManga.ONGOING.toLong() -> context.getString(R.string.ongoing) - SManga.LICENSED.toLong() -> context.getString(R.string.licensed) - SManga.CANCELLED.toLong() -> context.getString(R.string.cancelled) - SManga.ON_HIATUS.toLong() -> context.getString(R.string.on_hiatus) - SManga.PUBLISHING_FINISHED.toLong() -> context.getString(R.string.publishing_finished) - SManga.COMPLETED.toLong() -> context.getString(R.string.completed) - else -> context.getString(R.string.unknown) + SManga.ONGOING.toLong() -> context.stringResource(MR.strings.ongoing) + SManga.LICENSED.toLong() -> context.stringResource(MR.strings.licensed) + SManga.CANCELLED.toLong() -> context.stringResource(MR.strings.cancelled) + SManga.ON_HIATUS.toLong() -> context.stringResource(MR.strings.on_hiatus) + SManga.PUBLISHING_FINISHED.toLong() -> context.stringResource(MR.strings.publishing_finished) + SManga.COMPLETED.toLong() -> context.stringResource(MR.strings.completed) + else -> context.stringResource(MR.strings.unknown) } LibraryGroup.BY_SOURCE -> if (category?.id == LocalSource.ID) { - context.getString(R.string.local_source) + context.stringResource(MR.strings.local_source) } else { categoryName } LibraryGroup.BY_TRACK_STATUS -> TrackStatus.values() .find { it.int.toLong() == category?.id } .let { it ?: TrackStatus.OTHER } - .let { context.getString(it.res) } - LibraryGroup.UNGROUPED -> context.getString(R.string.ungrouped) + .let { context.stringResource(it.res) } + LibraryGroup.UNGROUPED -> context.stringResource(SYMR.strings.ungrouped) else -> categoryName } } @@ -1003,7 +1007,7 @@ class LibraryScreenModel( val trackService = trackerManager.get(track.syncId) if (trackService != null) { val status = trackService.getStatus(track.status.toInt())?.let { - context.getString(it) + context.stringResource(it) } val name = trackerManager.get(track.syncId)?.name status?.contains(constraint, true) == true || name?.contains(constraint, true) == true @@ -1119,7 +1123,7 @@ class LibraryScreenModel( in mix -> CheckboxState.TriState.Exclude(it) else -> CheckboxState.State.None(it) } - } + }.toImmutableList() mutableState.update { it.copy(dialog = Dialog.ChangeCategory(mangaList, preselected)) } } } @@ -1135,7 +1139,10 @@ class LibraryScreenModel( sealed interface Dialog { data object SettingsSheet : Dialog - data class ChangeCategory(val manga: List, val initialSelection: List>) : Dialog + data class ChangeCategory( + val manga: List, + val initialSelection: ImmutableList>, + ) : Dialog data class DeleteManga(val manga: List) : Dialog object SyncFavoritesWarning : Dialog object SyncFavoritesConfirm : Dialog @@ -1167,7 +1174,7 @@ class LibraryScreenModel( name = TrackStatus.values() .find { it.int == id } .let { it ?: TrackStatus.OTHER } - .let { context.getString(it.res) }, + .let { context.stringResource(it.res) }, order = TrackStatus.values().indexOfFirst { it.int == id }.takeUnless { it == -1 }?.toLong() ?: TrackStatus.OTHER.ordinal.toLong(), @@ -1190,7 +1197,7 @@ class LibraryScreenModel( Category( id = it.key, name = if (it.key == LocalSource.ID) { - context.getString(R.string.local_source) + context.stringResource(MR.strings.local_source) } else { val source = sourceManager.getOrStub(it.key) source.name.ifBlank { source.id.toString() } @@ -1207,13 +1214,13 @@ class LibraryScreenModel( Category( id = it.key + 1, name = when (it.key) { - SManga.ONGOING.toLong() -> context.getString(R.string.ongoing) - SManga.LICENSED.toLong() -> context.getString(R.string.licensed) - SManga.CANCELLED.toLong() -> context.getString(R.string.cancelled) - SManga.ON_HIATUS.toLong() -> context.getString(R.string.on_hiatus) - SManga.PUBLISHING_FINISHED.toLong() -> context.getString(R.string.publishing_finished) - SManga.COMPLETED.toLong() -> context.getString(R.string.completed) - else -> context.getString(R.string.unknown) + SManga.ONGOING.toLong() -> context.stringResource(MR.strings.ongoing) + SManga.LICENSED.toLong() -> context.stringResource(MR.strings.licensed) + SManga.CANCELLED.toLong() -> context.stringResource(MR.strings.cancelled) + SManga.ON_HIATUS.toLong() -> context.stringResource(MR.strings.on_hiatus) + SManga.PUBLISHING_FINISHED.toLong() -> context.stringResource(MR.strings.publishing_finished) + SManga.COMPLETED.toLong() -> context.stringResource(MR.strings.completed) + else -> context.stringResource(MR.strings.unknown) }, order = when (it.key) { SManga.ONGOING.toLong() -> 1 diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryTab.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryTab.kt index d9c339dd7..752739e08 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryTab.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryTab.kt @@ -63,6 +63,7 @@ import tachiyomi.domain.library.model.LibraryGroup import tachiyomi.domain.library.model.LibraryManga import tachiyomi.domain.manga.model.Manga import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen @@ -191,7 +192,7 @@ object LibraryTab : Tab { selectedMangaIds, ) } else { - context.toast(R.string.no_valid_entry) + context.toast(SYMR.strings.no_valid_entry) } }, onClickAddToMangaDex = screenModel::syncMangaToDex.takeIf { state.showAddToMangadex }, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/EditMangaDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/EditMangaDialog.kt index ca6930bd6..7dc3c1abd 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/EditMangaDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/EditMangaDialog.kt @@ -17,7 +17,6 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.viewinterop.AndroidView import androidx.core.content.ContextCompat import androidx.core.view.children @@ -36,7 +35,11 @@ import exh.ui.metadata.adapters.MetadataUIUtil.getResourceColor import exh.util.dropBlank import exh.util.trimOrNull import kotlinx.coroutines.CoroutineScope +import tachiyomi.core.i18n.stringResource import tachiyomi.domain.manga.model.Manga +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR +import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.source.local.isLocal @Composable @@ -83,12 +86,12 @@ fun EditMangaDialog( onDismissRequest() }, ) { - Text(stringResource(R.string.action_save)) + Text(stringResource(MR.strings.action_save)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { - Text(stringResource(R.string.action_cancel)) + Text(stringResource(MR.strings.action_cancel)) } }, text = { @@ -120,14 +123,14 @@ private fun onViewCreated(manga: Manga, context: Context, binding: EditMangaDial context, android.R.layout.simple_spinner_dropdown_item, listOf( - R.string.label_default, - R.string.ongoing, - R.string.completed, - R.string.licensed, - R.string.publishing_finished, - R.string.cancelled, - R.string.on_hiatus, - ).map { context.getString(it) }, + MR.strings.label_default, + MR.strings.ongoing, + MR.strings.completed, + MR.strings.licensed, + MR.strings.publishing_finished, + MR.strings.cancelled, + MR.strings.on_hiatus, + ).map { context.stringResource(it) }, ) binding.status.adapter = statusAdapter @@ -151,7 +154,7 @@ private fun onViewCreated(manga: Manga, context: Context, binding: EditMangaDial binding.title.setText(manga.title) } - binding.title.hint = context.getString(R.string.title_hint, manga.url) + binding.title.hint = context.stringResource(SYMR.strings.title_hint, manga.url) binding.mangaAuthor.setText(manga.author.orEmpty()) binding.mangaArtist.setText(manga.artist.orEmpty()) binding.mangaDescription.setText(manga.description.orEmpty()) @@ -171,17 +174,17 @@ private fun onViewCreated(manga: Manga, context: Context, binding: EditMangaDial } binding.mangaGenresTags.setChips(manga.genre.orEmpty().dropBlank(), scope) - binding.title.hint = context.getString(R.string.title_hint, manga.ogTitle) + binding.title.hint = context.stringResource(SYMR.strings.title_hint, manga.ogTitle) if (manga.ogAuthor != null) { - binding.mangaAuthor.hint = context.getString(R.string.author_hint, manga.ogAuthor) + binding.mangaAuthor.hint = context.stringResource(SYMR.strings.author_hint, manga.ogAuthor!!) } if (manga.ogArtist != null) { - binding.mangaArtist.hint = context.getString(R.string.artist_hint, manga.ogArtist) + binding.mangaArtist.hint = context.stringResource(SYMR.strings.artist_hint, manga.ogArtist!!) } if (!manga.ogDescription.isNullOrBlank()) { binding.mangaDescription.hint = - context.getString( - R.string.description_hint, + context.stringResource( + SYMR.strings.description_hint, manga.ogDescription!!.replace("\n", " ").chop(20), ) } @@ -223,7 +226,7 @@ private fun ChipGroup.setChips(items: List, scope: CoroutineScope) { } val addTagChip = Chip(context).apply { - setText(R.string.add_tag) + setText(SYMR.strings.add_tag.getString(context)) chipIcon = ContextCompat.getDrawable(context, R.drawable.ic_add_24dp)?.apply { isChipIconVisible = true @@ -233,14 +236,14 @@ private fun ChipGroup.setChips(items: List, scope: CoroutineScope) { setOnClickListener { var newTag: String? = null MaterialAlertDialogBuilder(context) - .setTitle(R.string.add_tag) + .setTitle(SYMR.strings.add_tag.getString(context)) .setTextInput { newTag = it.trimOrNull() } - .setPositiveButton(R.string.action_ok) { _, _ -> + .setPositiveButton(MR.strings.action_ok.getString(context)) { _, _ -> if (newTag != null) setChips(items + listOfNotNull(newTag), scope) } - .setNegativeButton(R.string.action_cancel, null) + .setNegativeButton(MR.strings.action_cancel.getString(context), null) .show() } } @@ -248,7 +251,7 @@ private fun ChipGroup.setChips(items: List, scope: CoroutineScope) { } private fun ChipGroup.getTextStrings(): List = children.mapNotNull { - if (it is Chip && !it.text.toString().contains(context.getString(R.string.add_tag), ignoreCase = true)) { + if (it is Chip && !it.text.toString().contains(context.stringResource(SYMR.strings.add_tag), ignoreCase = true)) { it.text.toString() } else { null diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt index 073699f00..7fe55fa99 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt @@ -38,7 +38,6 @@ import eu.kanade.presentation.manga.components.SetIntervalDialog import eu.kanade.presentation.util.AssistContentScreen import eu.kanade.presentation.util.Screen import eu.kanade.presentation.util.isTabletUi -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.source.CatalogueSource import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.isLocalOrStub @@ -71,6 +70,7 @@ import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.take import kotlinx.coroutines.launch import logcat.LogPriority +import tachiyomi.core.i18n.stringResource import tachiyomi.core.util.lang.launchUI import tachiyomi.core.util.lang.withIOContext import tachiyomi.core.util.lang.withNonCancellableContext @@ -79,6 +79,8 @@ import tachiyomi.domain.UnsortedPreferences import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.source.service.SourceManager +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.screens.LoadingScreen import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -360,7 +362,7 @@ class MangaScreen( context.startActivity( Intent.createChooser( intent, - context.getString(R.string.action_share), + context.stringResource(MR.strings.action_share), ), ) } @@ -454,7 +456,7 @@ class MangaScreen( val mergedManga = mergedMangaData.manga.values.filterNot { it.source == MERGED_SOURCE_ID } val sources = mergedManga.map { sourceManager.getOrStub(it.source) } MaterialAlertDialogBuilder(context) - .setTitle(R.string.action_open_in_web_view) + .setTitle(MR.strings.action_open_in_web_view.getString(context)) .setSingleChoiceItems( Array(mergedManga.size) { index -> sources[index].toString() }, -1, @@ -462,7 +464,7 @@ class MangaScreen( dialog.dismiss() openMangaInWebView(navigator, mergedManga[index], sources[index] as? HttpSource) } - .setNegativeButton(R.string.action_cancel, null) + .setNegativeButton(MR.strings.action_cancel.getString(context), null) .show() } @@ -498,11 +500,11 @@ class MangaScreen( navigator.popUntil { it is SourcesScreen } navigator.pop() navigator replace MangaScreen(mergedManga.id, true) - context.toast(R.string.entry_merged) + context.toast(SYMR.strings.entry_merged) } catch (e: Exception) { if (e is CancellationException) throw e - context.toast(context.getString(R.string.failed_merge, e.message)) + context.toast(context.stringResource(SYMR.strings.failed_merge, e.message.orEmpty())) } } } @@ -513,11 +515,11 @@ class MangaScreen( source ?: return if (source.isMdBasedSource() && Injekt.get().delegateSources().get()) { MaterialAlertDialogBuilder(context) - .setTitle(R.string.az_recommends) + .setTitle(SYMR.strings.az_recommends.getString(context)) .setSingleChoiceItems( arrayOf( - context.getString(R.string.mangadex_similar), - context.getString(R.string.community_recommendations), + context.stringResource(SYMR.strings.mangadex_similar), + context.stringResource(SYMR.strings.community_recommendations), ), -1, ) { dialog, index -> diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt index 27c7a3291..a10bc09e4 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt @@ -30,7 +30,6 @@ import eu.kanade.domain.ui.UiPreferences import eu.kanade.presentation.manga.DownloadAction import eu.kanade.presentation.manga.components.ChapterDownloadAction import eu.kanade.presentation.util.formattedMessage -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.download.DownloadCache import eu.kanade.tachiyomi.data.download.DownloadManager import eu.kanade.tachiyomi.data.download.model.Download @@ -60,6 +59,10 @@ import exh.source.isEhBasedManga import exh.source.mangaDexSourceIds import exh.util.nullIfEmpty import exh.util.trimOrNull +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.ImmutableSet +import kotlinx.collections.immutable.toImmutableList +import kotlinx.collections.immutable.toImmutableSet import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.flow.MutableSharedFlow @@ -74,6 +77,7 @@ import kotlinx.coroutines.flow.update import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import logcat.LogPriority +import tachiyomi.core.i18n.stringResource import tachiyomi.core.preference.CheckboxState import tachiyomi.core.preference.TriState import tachiyomi.core.preference.mapAsCheckboxState @@ -120,6 +124,8 @@ import tachiyomi.domain.manga.repository.MangaRepository import tachiyomi.domain.source.service.SourceManager import tachiyomi.domain.track.interactor.GetTracks import tachiyomi.domain.track.interactor.InsertTrack +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.source.local.LocalSource import tachiyomi.source.local.isLocal import uy.kohesive.injekt.Injekt @@ -326,7 +332,7 @@ class MangaScreenModel( .distinctUntilChanged() .collectLatest { excludedScanlators -> updateSuccessState { - it.copy(excludedScanlators = excludedScanlators) + it.copy(excludedScanlators = excludedScanlators.toImmutableSet()) } } } @@ -336,7 +342,7 @@ class MangaScreenModel( .distinctUntilChanged() .collectLatest { availableScanlators -> updateSuccessState { - it.copy(availableScanlators = availableScanlators) + it.copy(availableScanlators = availableScanlators.toImmutableSet()) } } } @@ -374,8 +380,8 @@ class MangaScreenModel( source = source, isFromSource = isFromSource, chapters = chapters, - availableScanlators = getAvailableScanlators.await(mangaId), - excludedScanlators = getExcludedScanlators.await(mangaId), + availableScanlators = getAvailableScanlators.await(mangaId).toImmutableSet(), + excludedScanlators = getExcludedScanlators.await(mangaId).toImmutableSet(), isRefreshingData = needRefreshInfo || needRefreshChapter, dialog = null, // SY --> @@ -522,11 +528,11 @@ class MangaScreenModel( suspend fun smartSearchMerge(manga: Manga, originalMangaId: Long): Manga { val originalManga = getManga.await(originalMangaId) - ?: throw IllegalArgumentException(context.getString(R.string.merge_unknown_entry, originalMangaId)) + ?: throw IllegalArgumentException(context.stringResource(SYMR.strings.merge_unknown_entry, originalMangaId)) if (originalManga.source == MERGED_SOURCE_ID) { val children = getMergedReferencesById.await(originalMangaId) if (children.any { it.mangaSourceId == manga.source && it.mangaUrl == manga.url }) { - throw IllegalArgumentException(context.getString(R.string.merged_already)) + throw IllegalArgumentException(context.stringResource(SYMR.strings.merged_already)) } val mangaReferences = mutableListOf( @@ -567,7 +573,7 @@ class MangaScreenModel( return originalManga } else { if (manga.id == originalMangaId) { - throw IllegalArgumentException(context.getString(R.string.merged_already)) + throw IllegalArgumentException(context.stringResource(SYMR.strings.merged_already)) } var mergedManga = Manga.create() .copy( @@ -587,7 +593,7 @@ class MangaScreenModel( var existingManga = getManga.await(mergedManga.url, mergedManga.source) while (existingManga != null) { if (existingManga.favorite) { - throw IllegalArgumentException(context.getString(R.string.merge_duplicate)) + throw IllegalArgumentException(context.stringResource(SYMR.strings.merge_duplicate)) } else { withNonCancellableContext { existingManga?.id?.let { @@ -688,8 +694,8 @@ class MangaScreenModel( screenModelScope.launch { if (!hasDownloads()) return@launch val result = snackbarHostState.showSnackbar( - message = context.getString(R.string.delete_downloads_for_manga), - actionLabel = context.getString(R.string.action_delete), + message = context.stringResource(MR.strings.delete_downloads_for_manga), + actionLabel = context.stringResource(MR.strings.action_delete), withDismissAction = true, ) if (result == SnackbarResult.ActionPerformed) { @@ -770,7 +776,7 @@ class MangaScreenModel( successState.copy( dialog = Dialog.ChangeCategory( manga = manga, - initialSelection = categories.mapAsCheckboxState { it.id in selection }, + initialSelection = categories.mapAsCheckboxState { it.id in selection }.toImmutableList(), ), ) } @@ -1018,7 +1024,7 @@ class MangaScreenModel( } } catch (e: Throwable) { val message = if (e is NoChaptersException) { - context.getString(R.string.no_chapters_error) + context.stringResource(MR.strings.no_chapters_error) } else { logcat(LogPriority.ERROR, e) with(context) { e.formattedMessage } @@ -1120,8 +1126,8 @@ class MangaScreenModel( } screenModelScope.launch { val result = snackbarHostState.showSnackbar( - message = context.getString(R.string.snack_add_to_library), - actionLabel = context.getString(R.string.action_add), + message = context.stringResource(MR.strings.snack_add_to_library), + actionLabel = context.stringResource(MR.strings.action_add), withDismissAction = true, ) if (result == SnackbarResult.ActionPerformed && !isFavorited) { @@ -1345,7 +1351,7 @@ class MangaScreenModel( if (applyToExisting) { setMangaDefaultChapterFlags.awaitAll() } - snackbarHostState.showSnackbar(message = context.getString(R.string.chapter_settings_updated)) + snackbarHostState.showSnackbar(message = context.stringResource(MR.strings.chapter_settings_updated)) } } @@ -1506,7 +1512,10 @@ class MangaScreenModel( // Track sheet - end sealed interface Dialog { - data class ChangeCategory(val manga: Manga, val initialSelection: List>) : Dialog + data class ChangeCategory( + val manga: Manga, + val initialSelection: ImmutableList>, + ) : Dialog data class DeleteChapters(val chapters: List) : Dialog data class DuplicateManga(val manga: Manga, val duplicate: Manga) : Dialog data class SetFetchInterval(val manga: Manga) : Dialog @@ -1582,8 +1591,8 @@ class MangaScreenModel( val source: Source, val isFromSource: Boolean, val chapters: List, - val availableScanlators: Set, - val excludedScanlators: Set, + val availableScanlators: ImmutableSet, + val excludedScanlators: ImmutableSet, val trackItems: List = emptyList(), val isRefreshingData: Boolean = false, val dialog: MangaScreenModel.Dialog? = null, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/merged/EditMergedMangaItem.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/merged/EditMergedMangaItem.kt index 886be2241..95389d05f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/merged/EditMergedMangaItem.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/merged/EditMergedMangaItem.kt @@ -37,13 +37,13 @@ class EditMergedMangaItem(val mergedManga: Manga?, val mergedMangaReference: Mer } override fun hashCode(): Int { - return mergedMangaReference.id!!.hashCode() + return mergedMangaReference.id.hashCode() } override fun equals(other: Any?): Boolean { if (this === other) return true if (other is EditMergedMangaItem) { - return mergedMangaReference.id!! == other.mergedMangaReference.id!! + return mergedMangaReference.id == other.mergedMangaReference.id } return false } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/merged/EditMergedSettingsDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/merged/EditMergedSettingsDialog.kt index dbe9b0ffb..f012d1b39 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/merged/EditMergedSettingsDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/merged/EditMergedSettingsDialog.kt @@ -17,19 +17,20 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import androidx.compose.ui.viewinterop.AndroidView import androidx.compose.ui.window.DialogProperties import androidx.recyclerview.widget.ConcatAdapter import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.dialog.MaterialAlertDialogBuilder -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.databinding.EditMergedSettingsDialogBinding import eu.kanade.tachiyomi.ui.manga.MergedMangaData import eu.kanade.tachiyomi.util.system.toast import exh.source.MERGED_SOURCE_ID import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.manga.model.MergedMangaReference +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR +import tachiyomi.presentation.core.i18n.stringResource @Stable class EditMergedSettingsState( @@ -50,7 +51,7 @@ class EditMergedSettingsState( mergedReferences: List, ) { if (mergedReferences.isEmpty() || mergedReferences.size == 1) { - context.toast(R.string.merged_references_invalid) + context.toast(SYMR.strings.merged_references_invalid) onDismissRequest() } mergedMangas += mergedReferences.filter { @@ -91,24 +92,24 @@ class EditMergedSettingsState( val mergeMangaReference = mergedMangaAdapter.currentItems.getOrNull(position)?.mergedMangaReference ?: return MaterialAlertDialogBuilder(context) - .setTitle(R.string.delete_merged_entry) - .setMessage(R.string.delete_merged_entry_desc) - .setPositiveButton(R.string.action_ok) { _, _ -> + .setTitle(SYMR.strings.delete_merged_entry.getString(context)) + .setMessage(SYMR.strings.delete_merged_entry_desc.getString(context)) + .setPositiveButton(MR.strings.action_ok.getString(context)) { _, _ -> onDeleteClick(mergeMangaReference) onDismissRequest() } - .setNegativeButton(R.string.action_cancel, null) + .setNegativeButton(MR.strings.action_cancel.getString(context), null) .show() } override fun onToggleChapterUpdatesClicked(position: Int) { MaterialAlertDialogBuilder(context) - .setTitle(R.string.chapter_updates_merged_entry) - .setMessage(R.string.chapter_updates_merged_entry_desc) - .setPositiveButton(R.string.action_ok) { _, _ -> + .setTitle(SYMR.strings.chapter_updates_merged_entry.getString(context)) + .setMessage(SYMR.strings.chapter_updates_merged_entry_desc.getString(context)) + .setPositiveButton(MR.strings.action_ok.getString(context)) { _, _ -> toggleChapterUpdates(position) } - .setNegativeButton(R.string.action_cancel, null) + .setNegativeButton(MR.strings.action_cancel.getString(context), null) .show() } @@ -125,7 +126,7 @@ class EditMergedSettingsState( if (it is EditMergedMangaHolder) { it.updateChapterUpdatesIcon(!reference.getChapterUpdates) } - } ?: context.toast(R.string.merged_chapter_updates_error) + } ?: context.toast(SYMR.strings.merged_chapter_updates_error) manga to reference.copy(getChapterUpdates = !reference.getChapterUpdates) } @@ -133,12 +134,12 @@ class EditMergedSettingsState( override fun onToggleChapterDownloadsClicked(position: Int) { MaterialAlertDialogBuilder(context) - .setTitle(R.string.download_merged_entry) - .setMessage(R.string.download_merged_entry_desc) - .setPositiveButton(R.string.action_ok) { _, _ -> + .setTitle(SYMR.strings.download_merged_entry.getString(context)) + .setMessage(SYMR.strings.download_merged_entry_desc.getString(context)) + .setPositiveButton(MR.strings.action_ok.getString(context)) { _, _ -> toggleChapterDownloads(position) } - .setNegativeButton(R.string.action_cancel, null) + .setNegativeButton(MR.strings.action_cancel.getString(context), null) .show() } @@ -155,7 +156,7 @@ class EditMergedSettingsState( if (it is EditMergedMangaHolder) { it.updateDownloadChaptersIcon(!reference.downloadChapters) } - } ?: context.toast(R.string.merged_toggle_download_chapters_error) + } ?: context.toast(SYMR.strings.merged_toggle_download_chapters_error) manga to reference.copy(downloadChapters = !reference.downloadChapters) } @@ -182,12 +183,12 @@ fun EditMergedSettingsDialog( onDismissRequest = onDismissRequest, confirmButton = { TextButton(onClick = state::onPositiveButtonClick) { - Text(stringResource(R.string.action_save)) + Text(stringResource(MR.strings.action_save)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { - Text(stringResource(R.string.action_cancel)) + Text(stringResource(MR.strings.action_cancel)) } }, text = { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/merged/EditMergedSettingsHeaderAdapter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/merged/EditMergedSettingsHeaderAdapter.kt index 8a064f5e9..38bd69dbc 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/merged/EditMergedSettingsHeaderAdapter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/merged/EditMergedSettingsHeaderAdapter.kt @@ -6,11 +6,12 @@ import android.view.ViewGroup import android.widget.AdapterView import android.widget.ArrayAdapter import androidx.recyclerview.widget.RecyclerView -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.databinding.EditMergedSettingsHeaderBinding import exh.log.xLogD +import tachiyomi.core.i18n.stringResource import tachiyomi.domain.manga.model.MergedMangaReference import tachiyomi.domain.source.service.SourceManager +import tachiyomi.i18n.sy.SYMR import uy.kohesive.injekt.injectLazy class EditMergedSettingsHeaderAdapter(private val state: EditMergedSettingsState, adapter: EditMergedMangaAdapter) : RecyclerView.Adapter() { @@ -42,10 +43,10 @@ class EditMergedSettingsHeaderAdapter(private val state: EditMergedSettingsState itemView.context, android.R.layout.simple_spinner_item, listOfNotNull( - itemView.context.getString(R.string.no_dedupe), - itemView.context.getString(R.string.dedupe_priority), - itemView.context.getString(R.string.dedupe_most_chapters), - itemView.context.getString(R.string.dedupe_highest_chapter), + itemView.context.stringResource(SYMR.strings.no_dedupe), + itemView.context.stringResource(SYMR.strings.dedupe_priority), + itemView.context.stringResource(SYMR.strings.dedupe_most_chapters), + itemView.context.stringResource(SYMR.strings.dedupe_highest_chapter), ), ) dedupeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) 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 0713c21ca..1b8a517b4 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 @@ -33,7 +33,6 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.platform.LocalConfiguration -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.core.graphics.ColorUtils import androidx.core.net.toUri @@ -94,6 +93,9 @@ import eu.kanade.tachiyomi.util.view.setComposeContent import exh.source.isEhBasedSource import exh.util.defaultReaderType import exh.util.mangaType +import kotlinx.collections.immutable.persistentSetOf +import kotlinx.collections.immutable.toImmutableList +import kotlinx.collections.immutable.toImmutableSet import kotlinx.coroutines.delay import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged @@ -108,12 +110,16 @@ import kotlinx.coroutines.flow.sample import kotlinx.coroutines.launch import logcat.LogPriority import tachiyomi.core.Constants +import tachiyomi.core.i18n.pluralStringResource +import tachiyomi.core.i18n.stringResource 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.domain.source.service.SourceManager +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.util.collectAsState import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -386,7 +392,8 @@ class ReaderActivity : BaseActivity() { } else { cropBorderContinuousVertical } - val readerBottomButtons by readerPreferences.readerBottomButtons().collectAsState() + val readerBottomButtons by readerPreferences.readerBottomButtons().changes().map { it.toImmutableSet() } + .collectAsState(persistentSetOf()) val dualPageSplitPaged by readerPreferences.dualPageSplitPaged().collectAsState() val forceHorizontalSeekbar by readerPreferences.forceHorizontalSeekbar().collectAsState() @@ -441,7 +448,7 @@ class ReaderActivity : BaseActivity() { onClickCropBorder = { val enabled = viewModel.toggleCropBorders() menuToggleToast?.cancel() - menuToggleToast = toast(if (enabled) R.string.on else R.string.off) + menuToggleToast = toast(if (enabled) MR.strings.on else MR.strings.off) }, onClickSettings = viewModel::openSettingsDialog, // SY --> @@ -499,7 +506,7 @@ class ReaderActivity : BaseActivity() { verticalAlignment = Alignment.CenterVertically, ) { CircularProgressIndicator() - Text(stringResource(R.string.loading)) + Text(stringResource(MR.strings.loading)) } }, ) @@ -547,7 +554,7 @@ class ReaderActivity : BaseActivity() { } is ReaderViewModel.Dialog.ChapterList -> { var chapters by remember { - mutableStateOf(viewModel.getChapters()) + mutableStateOf(viewModel.getChapters().toImmutableList()) } ChapterListDialog( onDismissRequest = onDismissRequest, @@ -565,7 +572,7 @@ class ReaderActivity : BaseActivity() { } else { it } - } + }.toImmutableList() }, state.dateRelativeTime, ) @@ -575,31 +582,31 @@ class ReaderActivity : BaseActivity() { onDismissRequest = onDismissRequest, confirmButton = { TextButton(onClick = onDismissRequest) { - Text(text = stringResource(R.string.action_ok)) + Text(text = stringResource(MR.strings.action_ok)) } }, - title = { Text(text = stringResource(R.string.eh_autoscroll_help)) }, - text = { Text(text = stringResource(R.string.eh_autoscroll_help_message)) }, + title = { Text(text = stringResource(SYMR.strings.eh_autoscroll_help)) }, + text = { Text(text = stringResource(SYMR.strings.eh_autoscroll_help_message)) }, ) ReaderViewModel.Dialog.BoostPageHelp -> AlertDialog( onDismissRequest = onDismissRequest, confirmButton = { TextButton(onClick = onDismissRequest) { - Text(text = stringResource(R.string.action_ok)) + Text(text = stringResource(MR.strings.action_ok)) } }, - title = { Text(text = stringResource(R.string.eh_boost_page_help)) }, - text = { Text(text = stringResource(R.string.eh_boost_page_help_message)) }, + title = { Text(text = stringResource(SYMR.strings.eh_boost_page_help)) }, + text = { Text(text = stringResource(SYMR.strings.eh_boost_page_help_message)) }, ) ReaderViewModel.Dialog.RetryAllHelp -> AlertDialog( onDismissRequest = onDismissRequest, confirmButton = { TextButton(onClick = onDismissRequest) { - Text(text = stringResource(R.string.action_ok)) + Text(text = stringResource(MR.strings.action_ok)) } }, - title = { Text(text = stringResource(R.string.eh_retry_all_help)) }, - text = { Text(text = stringResource(R.string.eh_retry_all_help_message)) }, + title = { Text(text = stringResource(SYMR.strings.eh_retry_all_help)) }, + text = { Text(text = stringResource(SYMR.strings.eh_retry_all_help_message)) }, ) // SY <-- null -> {} @@ -693,29 +700,29 @@ class ReaderActivity : BaseActivity() { retried++ } - toast(resources.getQuantityString(R.plurals.eh_retry_toast, retried, retried)) + toast(pluralStringResource(SYMR.plurals.eh_retry_toast, retried, retried)) } private fun exhBoostPage() { viewModel.state.value.viewer ?: return val curPage = exhCurrentpage() ?: run { - toast(R.string.eh_boost_page_invalid) + toast(SYMR.strings.eh_boost_page_invalid) return } if (curPage.status == Page.State.ERROR) { - toast(R.string.eh_boost_page_errored) + toast(SYMR.strings.eh_boost_page_errored) } else if (curPage.status == Page.State.LOAD_PAGE || curPage.status == Page.State.DOWNLOAD_IMAGE) { - toast(R.string.eh_boost_page_downloading) + toast(SYMR.strings.eh_boost_page_downloading) } else if (curPage.status == Page.State.READY) { - toast(R.string.eh_boost_page_downloaded) + toast(SYMR.strings.eh_boost_page_downloaded) } else { val loader = (viewModel.state.value.viewerChapters?.currChapter?.pageLoader as? HttpPageLoader) if (loader != null) { loader.boostPage(curPage) - toast(R.string.eh_boost_boosted) + toast(SYMR.strings.eh_boost_boosted) } else { - toast(R.string.eh_boost_invalid_loader) + toast(SYMR.strings.eh_boost_invalid_loader) } } } @@ -827,7 +834,7 @@ class ReaderActivity : BaseActivity() { defaultReaderType == ReadingMode.WEBTOON.flagValue ) { readingModeToast?.cancel() - readingModeToast = toast(resources.getString(R.string.eh_auto_webtoon_snack)) + readingModeToast = toast(SYMR.strings.eh_auto_webtoon_snack) } else if (readerPreferences.showReadingMode().get()) { // SY <-- showReadingModeToast(viewModel.getMangaReadingMode()) @@ -863,7 +870,7 @@ class ReaderActivity : BaseActivity() { private fun shareChapter() { assistUrl?.let { val intent = it.toUri().toShareIntent(this, type = "text/plain") - startActivity(Intent.createChooser(intent, getString(R.string.action_share))) + startActivity(Intent.createChooser(intent, stringResource(MR.strings.action_share))) } } @@ -1043,9 +1050,9 @@ class ReaderActivity : BaseActivity() { // SY --> val text = if (secondPage != null) { - getString(R.string.share_pages_info, manga.title, chapter.name, if (resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_LTR) "${page.number}-${page.number + 1}" else "${page.number + 1}-${page.number}") + stringResource(SYMR.strings.share_pages_info, manga.title, chapter.name, if (resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_LTR) "${page.number}-${page.number + 1}" else "${page.number + 1}-${page.number}") } else { - getString(R.string.share_page_info, manga.title, chapter.name, page.number) + stringResource(MR.strings.share_page_info, manga.title, chapter.name, page.number) } // SY <-- @@ -1053,7 +1060,7 @@ class ReaderActivity : BaseActivity() { context = applicationContext, message = /* SY --> */ text, // SY <-- ) - startActivity(Intent.createChooser(intent, getString(R.string.action_share))) + startActivity(Intent.createChooser(intent, stringResource(MR.strings.action_share))) } /** @@ -1063,7 +1070,7 @@ class ReaderActivity : BaseActivity() { private fun onSaveImageResult(result: ReaderViewModel.SaveImageResult) { when (result) { is ReaderViewModel.SaveImageResult.Success -> { - toast(R.string.picture_saved) + toast(MR.strings.picture_saved) } is ReaderViewModel.SaveImageResult.Error -> { logcat(LogPriority.ERROR, result.error) @@ -1078,9 +1085,9 @@ class ReaderActivity : BaseActivity() { private fun onSetAsCoverResult(result: ReaderViewModel.SetAsCoverResult) { toast( when (result) { - Success -> R.string.cover_updated - AddToLibraryFirst -> R.string.notification_first_add_to_library - Error -> R.string.notification_cover_update_failed + Success -> MR.strings.cover_updated + AddToLibraryFirst -> MR.strings.notification_first_add_to_library + Error -> MR.strings.notification_cover_update_failed }, ) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ChapterLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ChapterLoader.kt index 9d6c28070..570cd3720 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ChapterLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ChapterLoader.kt @@ -2,7 +2,6 @@ package eu.kanade.tachiyomi.ui.reader.loader import android.content.Context import com.github.junrar.exception.UnsupportedRarV5Exception -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.download.DownloadManager import eu.kanade.tachiyomi.data.download.DownloadProvider import eu.kanade.tachiyomi.source.Source @@ -10,12 +9,14 @@ import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.source.online.all.MergedSource import eu.kanade.tachiyomi.ui.reader.model.ReaderChapter import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences +import tachiyomi.core.i18n.stringResource import tachiyomi.core.util.lang.withIOContext import tachiyomi.core.util.system.logcat import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.manga.model.MergedMangaReference import tachiyomi.domain.source.model.StubSource import tachiyomi.domain.source.service.SourceManager +import tachiyomi.i18n.MR import tachiyomi.source.local.LocalSource import tachiyomi.source.local.io.Format @@ -56,7 +57,7 @@ class ChapterLoader( .onEach { it.chapter = chapter } if (pages.isEmpty()) { - throw Exception(context.getString(R.string.page_list_empty_error)) + throw Exception(context.stringResource(MR.strings.page_list_empty_error)) } // If the chapter is partially read, set the starting page to the last the user read @@ -127,12 +128,12 @@ class ChapterLoader( is Format.Rar -> try { RarPageLoader(format.file) } catch (e: UnsupportedRarV5Exception) { - error(context.getString(R.string.loader_rar5_error)) + error(context.stringResource(MR.strings.loader_rar5_error)) } is Format.Epub -> EpubPageLoader(format.file) } } - else -> error(context.getString(R.string.loader_not_implemented_error)) + else -> error(context.stringResource(MR.strings.loader_not_implemented_error)) } } // SY <-- @@ -144,14 +145,14 @@ class ChapterLoader( is Format.Rar -> try { RarPageLoader(format.file) } catch (e: UnsupportedRarV5Exception) { - error(context.getString(R.string.loader_rar5_error)) + error(context.stringResource(MR.strings.loader_rar5_error)) } is Format.Epub -> EpubPageLoader(format.file) } } source is HttpSource -> HttpPageLoader(chapter, source) - source is StubSource -> error(context.getString(R.string.source_not_installed, source.toString())) - else -> error(context.getString(R.string.loader_not_implemented_error)) + source is StubSource -> error(context.stringResource(MR.strings.source_not_installed, source.toString())) + else -> error(context.stringResource(MR.strings.loader_not_implemented_error)) } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ZipPageLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ZipPageLoader.kt index 6cda0d1dd..4a61c6b13 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ZipPageLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ZipPageLoader.kt @@ -2,13 +2,14 @@ package eu.kanade.tachiyomi.ui.reader.loader import android.app.Application import android.os.Build -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.ui.reader.model.ReaderPage import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences import eu.kanade.tachiyomi.util.lang.compareToCaseInsensitiveNaturalOrder import eu.kanade.tachiyomi.util.storage.CbzCrypto +import tachiyomi.core.i18n.stringResource import tachiyomi.core.util.system.ImageUtil +import tachiyomi.i18n.sy.SYMR import uy.kohesive.injekt.injectLazy import java.io.File import java.nio.charset.StandardCharsets @@ -43,7 +44,7 @@ internal class ZipPageLoader(file: File) : PageLoader() { if (zip.isEncrypted) { if (!CbzCrypto.checkCbzPassword(zip, CbzCrypto.getDecryptedPasswordCbz())) { this.recycle() - throw IllegalStateException(context.getString(R.string.wrong_cbz_archive_password)) + throw IllegalStateException(context.stringResource(SYMR.strings.wrong_cbz_archive_password)) } zip4j.setPassword(CbzCrypto.getDecryptedPasswordCbz()) if (readerPreferences.cacheArchiveMangaOnDisk().get()) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderBottomButton.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderBottomButton.kt index 7d4f61304..c3f72f819 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderBottomButton.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderBottomButton.kt @@ -1,18 +1,19 @@ package eu.kanade.tachiyomi.ui.reader.setting -import androidx.annotation.StringRes -import eu.kanade.tachiyomi.R +import dev.icerock.moko.resources.StringResource +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR -enum class ReaderBottomButton(val value: String, @StringRes val stringRes: Int) { - ViewChapters("vc", R.string.action_view_chapters), - WebView("wb", R.string.action_open_in_web_view), - Share("sh", R.string.action_share), - ReadingMode("rm", R.string.viewer), - Rotation("rot", R.string.rotation_type), - CropBordersPager("cbp", R.string.pref_crop_borders_pager), - CropBordersContinuesVertical("cbc", R.string.pref_crop_borders_continuous_vertical), - CropBordersWebtoon("cbw", R.string.pref_crop_borders_webtoon), - PageLayout("pl", R.string.page_layout), +enum class ReaderBottomButton(val value: String, val stringRes: StringResource) { + ViewChapters("vc", MR.strings.action_view_chapters), + WebView("wb", MR.strings.action_open_in_web_view), + Share("sh", MR.strings.action_share), + ReadingMode("rm", MR.strings.viewer), + Rotation("rot", MR.strings.rotation_type), + CropBordersPager("cbp", SYMR.strings.pref_crop_borders_pager), + CropBordersContinuesVertical("cbc", SYMR.strings.pref_crop_borders_continuous_vertical), + CropBordersWebtoon("cbw", SYMR.strings.pref_crop_borders_webtoon), + PageLayout("pl", SYMR.strings.page_layout), ; fun isIn(buttons: Collection) = value in buttons 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 0fb0ace4c..2e3497ae3 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,10 +1,11 @@ package eu.kanade.tachiyomi.ui.reader.setting -import androidx.annotation.StringRes -import eu.kanade.tachiyomi.R +import dev.icerock.moko.resources.StringResource import eu.kanade.tachiyomi.ui.reader.viewer.pager.PagerConfig import tachiyomi.core.preference.PreferenceStore import tachiyomi.core.preference.getEnum +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR class ReaderPreferences( private val preferenceStore: PreferenceStore, @@ -177,14 +178,14 @@ class ReaderPreferences( // SY <-- enum class TappingInvertMode( - @StringRes val titleResId: Int, + val titleRes: StringResource, val shouldInvertHorizontal: Boolean = false, val shouldInvertVertical: Boolean = false, ) { - NONE(R.string.tapping_inverted_none), - HORIZONTAL(R.string.tapping_inverted_horizontal, shouldInvertHorizontal = true), - VERTICAL(R.string.tapping_inverted_vertical, shouldInvertVertical = true), - BOTH(R.string.tapping_inverted_both, shouldInvertHorizontal = true, shouldInvertVertical = true), + NONE(MR.strings.tapping_inverted_none), + HORIZONTAL(MR.strings.tapping_inverted_horizontal, shouldInvertHorizontal = true), + VERTICAL(MR.strings.tapping_inverted_vertical, shouldInvertVertical = true), + BOTH(MR.strings.tapping_inverted_both, shouldInvertHorizontal = true, shouldInvertVertical = true), } enum class ReaderHideThreshold(val threshold: Int) { @@ -199,42 +200,42 @@ class ReaderPreferences( const val WEBTOON_PADDING_MAX = 25 val TapZones = listOf( - R.string.label_default, - R.string.l_nav, - R.string.kindlish_nav, - R.string.edge_nav, - R.string.right_and_left_nav, - R.string.disabled_nav, + MR.strings.label_default, + MR.strings.l_nav, + MR.strings.kindlish_nav, + MR.strings.edge_nav, + MR.strings.right_and_left_nav, + MR.strings.disabled_nav, ) val ImageScaleType = listOf( - R.string.scale_type_fit_screen, - R.string.scale_type_stretch, - R.string.scale_type_fit_width, - R.string.scale_type_fit_height, - R.string.scale_type_original_size, - R.string.scale_type_smart_fit, + MR.strings.scale_type_fit_screen, + MR.strings.scale_type_stretch, + MR.strings.scale_type_fit_width, + MR.strings.scale_type_fit_height, + MR.strings.scale_type_original_size, + MR.strings.scale_type_smart_fit, ) val ZoomStart = listOf( - R.string.zoom_start_automatic, - R.string.zoom_start_left, - R.string.zoom_start_right, - R.string.zoom_start_center, + MR.strings.zoom_start_automatic, + MR.strings.zoom_start_left, + MR.strings.zoom_start_right, + MR.strings.zoom_start_center, ) // SY --> val PageLayouts = listOf( - R.string.single_page, - R.string.double_pages, - R.string.automatic_orientation, + SYMR.strings.single_page, + SYMR.strings.double_pages, + SYMR.strings.automatic_orientation, ) val CenterMarginTypes = listOf( - R.string.center_margin_none, - R.string.center_margin_double_page, - R.string.center_margin_wide_page, - R.string.center_margin_double_and_wide_page, + SYMR.strings.center_margin_none, + SYMR.strings.center_margin_double_page, + SYMR.strings.center_margin_wide_page, + SYMR.strings.center_margin_double_and_wide_page, ) // SY <-- } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/stats/StatsScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/stats/StatsScreen.kt index cce1fb57e..0bbb2fbc5 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/stats/StatsScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/stats/StatsScreen.kt @@ -3,7 +3,6 @@ package eu.kanade.tachiyomi.ui.stats import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue -import androidx.compose.ui.res.stringResource import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow @@ -12,9 +11,11 @@ import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.more.stats.StatsScreenContent import eu.kanade.presentation.more.stats.StatsScreenState import eu.kanade.presentation.util.Screen -import eu.kanade.tachiyomi.R import kotlinx.collections.immutable.persistentListOf +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.material.Scaffold +import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.LoadingScreen class StatsScreen : Screen() { @@ -29,7 +30,7 @@ class StatsScreen : Screen() { Scaffold( topBar = { scrollBehavior -> AppBar( - title = stringResource(R.string.label_stats), + title = stringResource(MR.strings.label_stats), navigateUp = navigator::pop, scrollBehavior = scrollBehavior, // SY --> @@ -39,9 +40,9 @@ class StatsScreen : Screen() { persistentListOf( AppBar.OverflowAction( title = if (allRead) { - stringResource(R.string.ignore_non_library_entries) + stringResource(SYMR.strings.ignore_non_library_entries) } else { - stringResource(R.string.include_all_read_entries) + stringResource(SYMR.strings.include_all_read_entries) }, onClick = screenModel::toggleReadManga, ), diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/updates/UpdatesTab.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/updates/UpdatesTab.kt index 9449997f0..b521c5764 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/updates/UpdatesTab.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/updates/UpdatesTab.kt @@ -11,7 +11,6 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.Navigator @@ -31,6 +30,9 @@ import eu.kanade.tachiyomi.ui.manga.MangaScreen import eu.kanade.tachiyomi.ui.reader.ReaderActivity import eu.kanade.tachiyomi.ui.updates.UpdatesScreenModel.Event import kotlinx.coroutines.flow.collectLatest +import tachiyomi.core.i18n.stringResource +import tachiyomi.i18n.MR +import tachiyomi.presentation.core.i18n.stringResource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -43,7 +45,7 @@ object UpdatesTab : Tab { val image = AnimatedImageVector.animatedVectorResource(R.drawable.anim_updates_enter) return TabOptions( index = 1u, - title = stringResource(R.string.label_recent_updates), + title = stringResource(MR.strings.label_recent_updates), icon = rememberAnimatedVectorPainter(image, isSelected), ) } @@ -107,15 +109,15 @@ object UpdatesTab : Tab { screenModel.events.collectLatest { event -> when (event) { Event.InternalError -> screenModel.snackbarHostState.showSnackbar( - context.getString(R.string.internal_error), + context.stringResource(MR.strings.internal_error), ) is Event.LibraryUpdateTriggered -> { val msg = if (event.started) { - R.string.updating_library + MR.strings.updating_library } else { - R.string.update_already_running + MR.strings.update_already_running } - screenModel.snackbarHostState.showSnackbar(context.getString(msg)) + screenModel.snackbarHostState.showSnackbar(context.stringResource(msg)) } } } diff --git a/app/src/main/java/exh/GalleryAdder.kt b/app/src/main/java/exh/GalleryAdder.kt index 4329ee886..e8e7707a4 100755 --- a/app/src/main/java/exh/GalleryAdder.kt +++ b/app/src/main/java/exh/GalleryAdder.kt @@ -6,17 +6,18 @@ import eu.kanade.domain.chapter.interactor.SyncChaptersWithSource import eu.kanade.domain.manga.interactor.UpdateManga import eu.kanade.domain.manga.model.toSManga import eu.kanade.domain.source.service.SourcePreferences -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.source.online.UrlImportableSource import eu.kanade.tachiyomi.source.online.all.EHentai import exh.log.xLogStack import exh.source.getMainSource +import tachiyomi.core.i18n.stringResource import tachiyomi.domain.chapter.interactor.GetChapter import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.manga.interactor.GetManga import tachiyomi.domain.manga.interactor.NetworkToLocalManga import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.source.service.SourceManager +import tachiyomi.i18n.sy.SYMR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -61,7 +62,7 @@ class GalleryAdder( throttleFunc: suspend () -> Unit = {}, retry: Int = 1, ): GalleryAddEvent { - logger.d(context.getString(R.string.gallery_adder_importing_gallery, url, fav.toString(), forceSource)) + logger.d(context.stringResource(SYMR.strings.gallery_adder_importing_gallery, url, fav.toString(), forceSource?.toString().orEmpty())) try { val uri = url.toUri() @@ -74,7 +75,7 @@ class GalleryAdder( return GalleryAddEvent.Fail.UnknownSource(url, context) } } catch (e: Exception) { - logger.e(context.getString(R.string.gallery_adder_source_uri_must_match), e) + logger.e(context.stringResource(SYMR.strings.gallery_adder_source_uri_must_match), e) return GalleryAddEvent.Fail.UnknownType(url, context) } } else { @@ -92,7 +93,7 @@ class GalleryAdder( val realChapterUrl = try { source.mapUrlToChapterUrl(uri) } catch (e: Exception) { - logger.e(context.getString(R.string.gallery_adder_uri_map_to_chapter_error), e) + logger.e(context.stringResource(SYMR.strings.gallery_adder_uri_map_to_chapter_error), e) null } @@ -100,7 +101,7 @@ class GalleryAdder( try { source.cleanChapterUrl(realChapterUrl) } catch (e: Exception) { - logger.e(context.getString(R.string.gallery_adder_uri_clean_error), e) + logger.e(context.stringResource(SYMR.strings.gallery_adder_uri_clean_error), e) null } } else { @@ -117,7 +118,7 @@ class GalleryAdder( val realMangaUrl = try { chapterMangaUrl ?: source.mapUrlToMangaUrl(uri) } catch (e: Exception) { - logger.e(context.getString(R.string.gallery_adder_uri_map_to_gallery_error), e) + logger.e(context.stringResource(SYMR.strings.gallery_adder_uri_map_to_gallery_error), e) null } ?: return GalleryAddEvent.Fail.UnknownType(url, context) @@ -125,7 +126,7 @@ class GalleryAdder( val cleanedMangaUrl = try { source.cleanMangaUrl(realMangaUrl) } catch (e: Exception) { - logger.e(context.getString(R.string.gallery_adder_uri_clean_error), e) + logger.e(context.stringResource(SYMR.strings.gallery_adder_uri_clean_error), e) null } ?: return GalleryAddEvent.Fail.UnknownType(url, context) @@ -162,8 +163,8 @@ class GalleryAdder( syncChaptersWithSource.await(chapterList, manga, source) } } catch (e: Exception) { - logger.w(context.getString(R.string.gallery_adder_chapter_fetch_error, manga.title), e) - return GalleryAddEvent.Fail.Error(url, context.getString(R.string.gallery_adder_chapter_fetch_error, url)) + logger.w(context.stringResource(SYMR.strings.gallery_adder_chapter_fetch_error, manga.title), e) + return GalleryAddEvent.Fail.Error(url, context.stringResource(SYMR.strings.gallery_adder_chapter_fetch_error, url)) } return if (cleanedChapterUrl != null) { @@ -171,13 +172,13 @@ class GalleryAdder( if (chapter != null) { GalleryAddEvent.Success(url, manga, context, chapter) } else { - GalleryAddEvent.Fail.Error(url, context.getString(R.string.gallery_adder_could_not_identify_chapter, url)) + GalleryAddEvent.Fail.Error(url, context.stringResource(SYMR.strings.gallery_adder_could_not_identify_chapter, url)) } } else { GalleryAddEvent.Success(url, manga, context) } } catch (e: Exception) { - logger.w(context.getString(R.string.gallery_adder_could_not_add_gallery, url), e) + logger.w(context.stringResource(SYMR.strings.gallery_adder_could_not_add_gallery, url), e) if (e is EHentai.GalleryNotFoundException) { return GalleryAddEvent.Fail.NotFound(url, context) @@ -226,12 +227,12 @@ sealed class GalleryAddEvent { val chapter: Chapter? = null, ) : GalleryAddEvent() { override val galleryTitle = manga.title - override val logMessage = context.getString(R.string.batch_add_success_log_message, galleryTitle) + override val logMessage = context.stringResource(SYMR.strings.batch_add_success_log_message, galleryTitle) } sealed class Fail : GalleryAddEvent() { class UnknownType(override val galleryUrl: String, val context: Context) : Fail() { - override val logMessage = context.getString(R.string.batch_add_unknown_type_log_message, galleryUrl) + override val logMessage = context.stringResource(SYMR.strings.batch_add_unknown_type_log_message, galleryUrl) } open class Error( @@ -240,10 +241,10 @@ sealed class GalleryAddEvent { ) : Fail() class NotFound(galleryUrl: String, context: Context) : - Error(galleryUrl, context.getString(R.string.batch_add_not_exist_log_message, galleryUrl)) + Error(galleryUrl, context.stringResource(SYMR.strings.batch_add_not_exist_log_message, galleryUrl)) class UnknownSource(override val galleryUrl: String, val context: Context) : Fail() { - override val logMessage = context.getString(R.string.batch_add_unknown_source_log_message, galleryUrl) + override val logMessage = context.stringResource(SYMR.strings.batch_add_unknown_source_log_message, galleryUrl) } } } diff --git a/app/src/main/java/exh/favorites/FavoritesSyncHelper.kt b/app/src/main/java/exh/favorites/FavoritesSyncHelper.kt index 058482f14..aa3c99858 100644 --- a/app/src/main/java/exh/favorites/FavoritesSyncHelper.kt +++ b/app/src/main/java/exh/favorites/FavoritesSyncHelper.kt @@ -4,7 +4,6 @@ import android.content.Context import android.net.wifi.WifiManager import android.os.PowerManager import eu.kanade.domain.manga.interactor.UpdateManga -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.network.POST import eu.kanade.tachiyomi.network.await import eu.kanade.tachiyomi.source.online.all.EHentai @@ -26,6 +25,7 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.launch import okhttp3.FormBody import okhttp3.Request +import tachiyomi.core.i18n.stringResource import tachiyomi.core.util.lang.withIOContext import tachiyomi.core.util.lang.withUIContext import tachiyomi.domain.UnsortedPreferences @@ -40,6 +40,7 @@ import tachiyomi.domain.manga.interactor.GetManga import tachiyomi.domain.manga.model.FavoriteEntry import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.source.service.SourceManager +import tachiyomi.i18n.sy.SYMR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import uy.kohesive.injekt.injectLazy @@ -89,12 +90,12 @@ class FavoritesSyncHelper(val context: Context) { private suspend fun beginSync() { // Check if logged in if (!prefs.enableExhentai().get()) { - status.value = FavoritesSyncStatus.Error(context.getString(R.string.please_login)) + status.value = FavoritesSyncStatus.Error(context.stringResource(SYMR.strings.please_login)) return } // Validate library state - status.value = FavoritesSyncStatus.Processing(context.getString(R.string.favorites_sync_verifying_library)) + status.value = FavoritesSyncStatus.Processing(context.stringResource(SYMR.strings.favorites_sync_verifying_library)) val libraryManga = getLibraryManga.await() val seenManga = HashSet(libraryManga.size) libraryManga.forEach { (manga) -> @@ -105,7 +106,7 @@ class FavoritesSyncHelper(val context: Context) { status.value = FavoritesSyncStatus.BadLibraryState .MangaInMultipleCategories(manga, inCategories, context) - logger.w(context.getString(R.string.favorites_sync_gallery_multiple_categories_error, manga.id)) + logger.w(context.stringResource(SYMR.strings.favorites_sync_gallery_multiple_categories_error, manga.id)) return } else { seenManga += manga.id @@ -114,11 +115,11 @@ class FavoritesSyncHelper(val context: Context) { // Download remote favorites val favorites = try { - status.value = FavoritesSyncStatus.Processing(context.getString(R.string.favorites_sync_downloading)) + status.value = FavoritesSyncStatus.Processing(context.stringResource(SYMR.strings.favorites_sync_downloading)) exh.fetchFavorites() } catch (e: Exception) { - status.value = FavoritesSyncStatus.Error(context.getString(R.string.favorites_sync_failed_to_featch)) - logger.e(context.getString(R.string.favorites_sync_could_not_fetch), e) + status.value = FavoritesSyncStatus.Error(context.stringResource(SYMR.strings.favorites_sync_failed_to_featch)) + logger.e(context.stringResource(SYMR.strings.favorites_sync_could_not_fetch), e) return } @@ -145,21 +146,21 @@ class FavoritesSyncHelper(val context: Context) { EHentaiUpdateWorker.cancelBackground(context) status.value = FavoritesSyncStatus.Processing( - context.getString(R.string.favorites_sync_calculating_remote_changes), + context.stringResource(SYMR.strings.favorites_sync_calculating_remote_changes), ) val remoteChanges = storage.getChangedRemoteEntries(favorites.first) val localChanges = if (prefs.exhReadOnlySync().get()) { null // Do not build local changes if they are not going to be applied } else { status.value = FavoritesSyncStatus.Processing( - context.getString(R.string.favorites_sync_calculating_local_changes), + context.stringResource(SYMR.strings.favorites_sync_calculating_local_changes), ) storage.getChangedDbEntries() } // Apply remote categories status.value = FavoritesSyncStatus.Processing( - context.getString(R.string.favorites_sync_syncing_category_names), + context.stringResource(SYMR.strings.favorites_sync_syncing_category_names), ) applyRemoteCategories(favorites.second) @@ -169,21 +170,21 @@ class FavoritesSyncHelper(val context: Context) { applyChangeSetToRemote(errorList, localChanges) } - status.value = FavoritesSyncStatus.Processing(context.getString(R.string.favorites_sync_cleaning_up)) + status.value = FavoritesSyncStatus.Processing(context.stringResource(SYMR.strings.favorites_sync_cleaning_up)) storage.snapshotEntries() withUIContext { - context.toast(R.string.favorites_sync_complete) + context.toast(SYMR.strings.favorites_sync_complete) } } catch (e: IgnoredException) { // Do not display error as this error has already been reported - logger.w(context.getString(R.string.favorites_sync_ignoring_exception), e) + logger.w(context.stringResource(SYMR.strings.favorites_sync_ignoring_exception), e) return } catch (e: Exception) { status.value = FavoritesSyncStatus.Error( - context.getString(R.string.favorites_sync_unknown_error, e.message), + context.stringResource(SYMR.strings.favorites_sync_unknown_error, e.message.orEmpty()), ) - logger.e(context.getString(R.string.favorites_sync_sync_error), e) + logger.e(context.stringResource(SYMR.strings.favorites_sync_sync_error), e) return } finally { // Release wake + wifi locks @@ -272,7 +273,7 @@ class FavoritesSyncHelper(val context: Context) { break } } catch (e: Exception) { - logger.w(context.getString(R.string.favorites_sync_network_error), e) + logger.w(context.stringResource(SYMR.strings.favorites_sync_network_error), e) } } @@ -283,7 +284,7 @@ class FavoritesSyncHelper(val context: Context) { // Apply removals if (changeSet.removed.isNotEmpty()) { status.value = FavoritesSyncStatus.Processing( - context.getString(R.string.favorites_sync_removing_galleries, changeSet.removed.size), + context.stringResource(SYMR.strings.favorites_sync_removing_galleries, changeSet.removed.size), ) val formBody = FormBody.Builder() @@ -301,7 +302,7 @@ class FavoritesSyncHelper(val context: Context) { ) if (!explicitlyRetryExhRequest(10, request)) { - val errorString = context.getString(R.string.favorites_sync_unable_to_delete) + val errorString = context.stringResource(SYMR.strings.favorites_sync_unable_to_delete) if (prefs.exhLenientSync().get()) { errorList += errorString @@ -316,7 +317,7 @@ class FavoritesSyncHelper(val context: Context) { throttleManager.resetThrottle() changeSet.added.forEachIndexed { index, it -> status.value = FavoritesSyncStatus.Processing( - message = context.getString(R.string.favorites_sync_adding_to_remote, index + 1, changeSet.added.size), + message = context.stringResource(SYMR.strings.favorites_sync_adding_to_remote, index + 1, changeSet.added.size), isThrottle = needWarnThrottle(), context = context, title = it.title, @@ -334,7 +335,7 @@ class FavoritesSyncHelper(val context: Context) { // Apply removals changeSet.removed.forEachIndexed { index, it -> status.value = FavoritesSyncStatus.Processing( - context.getString(R.string.favorites_sync_remove_from_local, index + 1, changeSet.removed.size), + context.stringResource(SYMR.strings.favorites_sync_remove_from_local, index + 1, changeSet.removed.size), title = it.title, ) val url = it.getUrl() @@ -366,7 +367,7 @@ class FavoritesSyncHelper(val context: Context) { throttleManager.resetThrottle() changeSet.added.forEachIndexed { index, it -> status.value = FavoritesSyncStatus.Processing( - message = context.getString(R.string.favorites_sync_add_to_local, index + 1, changeSet.added.size), + message = context.stringResource(SYMR.strings.favorites_sync_add_to_local, index + 1, changeSet.added.size), isThrottle = needWarnThrottle(), context = context, title = it.title, @@ -386,21 +387,21 @@ class FavoritesSyncHelper(val context: Context) { if (result is GalleryAddEvent.Fail) { if (result is GalleryAddEvent.Fail.NotFound) { - logger.e(context.getString(R.string.favorites_sync_remote_not_exist, it.getUrl())) + logger.e(context.stringResource(SYMR.strings.favorites_sync_remote_not_exist, it.getUrl())) // Skip this gallery, it no longer exists return@forEachIndexed } - val errorString = context.getString(R.string.favorites_sync_failed_to_add_to_local) + + val errorString = context.stringResource(SYMR.strings.favorites_sync_failed_to_add_to_local) + when (result) { - is GalleryAddEvent.Fail.Error -> context.getString( - R.string.favorites_sync_failed_to_add_to_local_error, it.title, result.logMessage, + is GalleryAddEvent.Fail.Error -> context.stringResource( + SYMR.strings.favorites_sync_failed_to_add_to_local_error, it.title, result.logMessage, ) - is GalleryAddEvent.Fail.UnknownType -> context.getString( - R.string.favorites_sync_failed_to_add_to_local_unknown_type, it.title, result.galleryUrl, + is GalleryAddEvent.Fail.UnknownType -> context.stringResource( + SYMR.strings.favorites_sync_failed_to_add_to_local_unknown_type, it.title, result.galleryUrl, ) - is GalleryAddEvent.Fail.UnknownSource -> context.getString( - R.string.favorites_sync_failed_to_add_to_local_unknown_type, it.title, result.galleryUrl, + is GalleryAddEvent.Fail.UnknownSource -> context.stringResource( + SYMR.strings.favorites_sync_failed_to_add_to_local_unknown_type, it.title, result.galleryUrl, ) } @@ -436,7 +437,7 @@ sealed class FavoritesSyncStatus() { data class Error(override val message: String) : FavoritesSyncStatus() data class Idle(override val message: String) : FavoritesSyncStatus() { - constructor(context: Context) : this(context.getString(R.string.favorites_sync_waiting_for_start)) + constructor(context: Context) : this(context.stringResource(SYMR.strings.favorites_sync_waiting_for_start)) } sealed class BadLibraryState : FavoritesSyncStatus() { data class MangaInMultipleCategories( @@ -448,8 +449,8 @@ sealed class FavoritesSyncStatus() { this( manga = manga, categories = categories, - message = context.getString( - R.string.favorites_sync_gallery_in_multiple_categories, manga.title, + message = context.stringResource( + SYMR.strings.favorites_sync_gallery_in_multiple_categories, manga.title, categories.joinToString { it.name }, @@ -458,7 +459,7 @@ sealed class FavoritesSyncStatus() { } } data class Initializing(override val message: String) : FavoritesSyncStatus() { - constructor(context: Context) : this(context.getString(R.string.favorites_sync_initializing)) + constructor(context: Context) : this(context.stringResource(SYMR.strings.favorites_sync_initializing)) } data class Processing( override val message: String, @@ -467,7 +468,7 @@ sealed class FavoritesSyncStatus() { constructor(message: String, isThrottle: Boolean, context: Context, title: String?) : this( if (isThrottle) { - context.getString(R.string.favorites_sync_processing_throttle, message) + context.stringResource(SYMR.strings.favorites_sync_processing_throttle, message) } else { message }, diff --git a/app/src/main/java/exh/log/EHDebugModeOverlay.kt b/app/src/main/java/exh/log/EHDebugModeOverlay.kt index db2cb947d..bf6061bd9 100644 --- a/app/src/main/java/exh/log/EHDebugModeOverlay.kt +++ b/app/src/main/java/exh/log/EHDebugModeOverlay.kt @@ -35,7 +35,8 @@ import androidx.compose.ui.unit.sp import eu.kanade.core.preference.asState import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.tachiyomi.BuildConfig -import eu.kanade.tachiyomi.R +import tachiyomi.core.i18n.stringResource +import tachiyomi.i18n.MR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.text.DecimalFormat @@ -103,7 +104,7 @@ private fun EHDebugModeOverlay() { private fun buildInfo(context: Context, sourceBlacklist: Boolean) = buildAnnotatedString { withStyle(SpanStyle(color = Color.Green)) { append("===[ ") - append(context.getString(R.string.app_name)) + append(context.stringResource(MR.strings.app_name)) append(" ]===") } append('\n') diff --git a/app/src/main/java/exh/md/follows/MangaDexFollowsScreen.kt b/app/src/main/java/exh/md/follows/MangaDexFollowsScreen.kt index 8b62b6865..0370c8ba9 100644 --- a/app/src/main/java/exh/md/follows/MangaDexFollowsScreen.kt +++ b/app/src/main/java/exh/md/follows/MangaDexFollowsScreen.kt @@ -10,7 +10,6 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalHapticFeedback -import androidx.compose.ui.res.stringResource import androidx.paging.compose.collectAsLazyPagingItems import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator @@ -21,12 +20,13 @@ import eu.kanade.presentation.browse.components.RemoveMangaDialog import eu.kanade.presentation.category.components.ChangeCategoryDialog import eu.kanade.presentation.manga.DuplicateMangaDialog import eu.kanade.presentation.util.Screen -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceScreenModel import eu.kanade.tachiyomi.ui.category.CategoryScreen import eu.kanade.tachiyomi.ui.manga.MangaScreen import tachiyomi.core.util.lang.launchIO +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.material.Scaffold +import tachiyomi.presentation.core.i18n.stringResource class MangaDexFollowsScreen(private val sourceId: Long) : Screen() { @@ -43,7 +43,7 @@ class MangaDexFollowsScreen(private val sourceId: Long) : Screen() { Scaffold( topBar = { scrollBehavior -> BrowseSourceSimpleToolbar( - title = stringResource(R.string.mangadex_follows), + title = stringResource(SYMR.strings.mangadex_follows), displayMode = screenModel.displayMode, onDisplayModeChange = { screenModel.displayMode = it }, navigateUp = navigator::pop, diff --git a/app/src/main/java/exh/md/similar/MangaDexSimilarScreen.kt b/app/src/main/java/exh/md/similar/MangaDexSimilarScreen.kt index 375e31e92..62394333b 100644 --- a/app/src/main/java/exh/md/similar/MangaDexSimilarScreen.kt +++ b/app/src/main/java/exh/md/similar/MangaDexSimilarScreen.kt @@ -7,7 +7,6 @@ import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalConfiguration -import androidx.compose.ui.res.stringResource import androidx.paging.compose.collectAsLazyPagingItems import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator @@ -15,10 +14,11 @@ import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.browse.BrowseSourceContent import eu.kanade.presentation.browse.components.BrowseSourceSimpleToolbar import eu.kanade.presentation.util.Screen -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.manga.MangaScreen import tachiyomi.domain.manga.model.Manga +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.material.Scaffold +import tachiyomi.presentation.core.i18n.stringResource class MangaDexSimilarScreen(val mangaId: Long, val sourceId: Long) : Screen() { @@ -38,7 +38,7 @@ class MangaDexSimilarScreen(val mangaId: Long, val sourceId: Long) : Screen() { topBar = { scrollBehavior -> BrowseSourceSimpleToolbar( navigateUp = navigator::pop, - title = stringResource(R.string.similar, screenModel.manga.title), + title = stringResource(SYMR.strings.similar, screenModel.manga.title), displayMode = screenModel.displayMode, onDisplayModeChange = { screenModel.displayMode = it }, scrollBehavior = scrollBehavior, diff --git a/app/src/main/java/exh/pagepreview/PagePreviewScreenModel.kt b/app/src/main/java/exh/pagepreview/PagePreviewScreenModel.kt index 6fcef3411..9f7d89fa1 100644 --- a/app/src/main/java/exh/pagepreview/PagePreviewScreenModel.kt +++ b/app/src/main/java/exh/pagepreview/PagePreviewScreenModel.kt @@ -92,7 +92,7 @@ class PagePreviewScreenModel( } sealed class PagePreviewState { - object Loading : PagePreviewState() + data object Loading : PagePreviewState() data class Success( val page: Int, diff --git a/app/src/main/java/exh/pagepreview/components/PagePreviewScreen.kt b/app/src/main/java/exh/pagepreview/components/PagePreviewScreen.kt index b3a3db91f..8abae74e0 100644 --- a/app/src/main/java/exh/pagepreview/components/PagePreviewScreen.kt +++ b/app/src/main/java/exh/pagepreview/components/PagePreviewScreen.kt @@ -26,20 +26,21 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.components.AroundLayout import eu.kanade.presentation.manga.components.PagePreview -import eu.kanade.tachiyomi.R import exh.pagepreview.PagePreviewState import exh.util.floor import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.launch +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.ScrollbarLazyColumn import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.topSmallPaddingValues +import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.LoadingScreen import tachiyomi.presentation.core.util.plus @@ -59,7 +60,7 @@ fun PagePreviewScreen( topBar = { scrollBehavior -> PagePreviewTopAppBar( navigateUp = navigateUp, - title = stringResource(R.string.page_previews), + title = stringResource(SYMR.strings.page_previews), onOpenPageDialog = onOpenPageDialog, showOpenPageDialog = state is PagePreviewState.Success && (state.pageCount != null && state.pageCount > 1 /* TODO support unknown pageCount || state.hasNextPage*/), @@ -137,39 +138,40 @@ fun PagePreviewPageDialog( onPageSelected(page.roundToInt()) onDismissPageDialog() }) { - Text(stringResource(R.string.action_ok)) + Text(stringResource(MR.strings.action_ok)) } }, dismissButton = { TextButton(onClick = onDismissPageDialog) { - Text(stringResource(R.string.action_cancel)) + Text(stringResource(MR.strings.action_cancel)) } }, title = { - Text(stringResource(R.string.page_preview_page_go_to)) + Text(stringResource(SYMR.strings.page_preview_page_go_to)) }, text = { AroundLayout( startLayout = { Text(text = page.roundToInt().toString()) }, endLayout = { Text(text = pageCount.toString()) }, - ) { - Slider( - modifier = Modifier.fillMaxWidth(), - value = page, - onValueChange = { page = it }, - onValueChangeFinished = { - scope.launch { - val newPage = page - AnimationState( - newPage, - ).animateTo(newPage.roundToInt().toFloat()) { - page = value + content = { + Slider( + modifier = Modifier.fillMaxWidth(), + value = page, + onValueChange = { page = it }, + onValueChangeFinished = { + scope.launch { + val newPage = page + AnimationState( + newPage, + ).animateTo(newPage.roundToInt().toFloat()) { + page = value + } } - } - }, - valueRange = 1F..pageCount.toFloat(), - ) - } + }, + valueRange = 1F..pageCount.toFloat(), + ) + }, + ) }, ) } @@ -189,7 +191,7 @@ fun PagePreviewTopAppBar( if (showOpenPageDialog) { persistentListOf( AppBar.Action( - title = stringResource(R.string.page_preview_page_go_to), + title = stringResource(SYMR.strings.page_preview_page_go_to), icon = Icons.Outlined.UTurnRight, onClick = onOpenPageDialog, ), diff --git a/app/src/main/java/exh/uconfig/EHConfigurator.kt b/app/src/main/java/exh/uconfig/EHConfigurator.kt index cb6780828..a65126fa7 100644 --- a/app/src/main/java/exh/uconfig/EHConfigurator.kt +++ b/app/src/main/java/exh/uconfig/EHConfigurator.kt @@ -1,7 +1,6 @@ package exh.uconfig import android.content.Context -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.network.awaitSuccess import eu.kanade.tachiyomi.source.online.all.EHentai import eu.kanade.tachiyomi.util.asJsoup @@ -12,8 +11,10 @@ import exh.source.EXH_SOURCE_ID import okhttp3.FormBody import okhttp3.OkHttpClient import okhttp3.Request +import tachiyomi.core.i18n.stringResource import tachiyomi.domain.UnsortedPreferences import tachiyomi.domain.source.service.SourceManager +import tachiyomi.i18n.sy.SYMR import uy.kohesive.injekt.injectLazy import java.util.Locale @@ -108,7 +109,7 @@ class EHConfigurator(val context: Context) { // No profile slots left :( if (availableProfiles.isEmpty()) { - throw IllegalStateException(context.getString(R.string.eh_settings_out_of_slots_error, source.name)) + throw IllegalStateException(context.stringResource(SYMR.strings.eh_settings_out_of_slots_error, source.name)) } // Create profile in available slot diff --git a/app/src/main/java/exh/ui/batchadd/BatchAddScreen.kt b/app/src/main/java/exh/ui/batchadd/BatchAddScreen.kt index c38500b05..8cb0aae1c 100644 --- a/app/src/main/java/exh/ui/batchadd/BatchAddScreen.kt +++ b/app/src/main/java/exh/ui/batchadd/BatchAddScreen.kt @@ -24,7 +24,6 @@ import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import cafe.adriel.voyager.core.model.rememberScreenModel @@ -32,10 +31,12 @@ import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.util.Screen -import eu.kanade.tachiyomi.R +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.material.Button import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.padding +import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.plus class BatchAddScreen : Screen() { @@ -50,7 +51,7 @@ class BatchAddScreen : Screen() { Scaffold( topBar = { scrollBehavior -> AppBar( - title = stringResource(R.string.batch_add), + title = stringResource(SYMR.strings.batch_add), navigateUp = navigator::pop, scrollBehavior = scrollBehavior, ) @@ -64,7 +65,7 @@ class BatchAddScreen : Screen() { .verticalScroll(rememberScrollState()) .padding(MaterialTheme.padding.medium), ) { - Text(text = stringResource(R.string.eh_batch_add_title), style = MaterialTheme.typography.titleLarge) + Text(text = stringResource(SYMR.strings.eh_batch_add_title), style = MaterialTheme.typography.titleLarge) Spacer(Modifier.height(8.dp)) TextField( value = state.galleries, @@ -72,7 +73,7 @@ class BatchAddScreen : Screen() { modifier = Modifier.fillMaxWidth(), placeholder = { Text( - text = stringResource(R.string.eh_batch_add_description), + text = stringResource(SYMR.strings.eh_batch_add_description), ) }, keyboardOptions = KeyboardOptions(autoCorrect = false), @@ -84,7 +85,7 @@ class BatchAddScreen : Screen() { modifier = Modifier.fillMaxWidth(), onClick = { screenModel.addGalleries(context) }, ) { - Text(text = stringResource(R.string.eh_batch_add_button)) + Text(text = stringResource(SYMR.strings.eh_batch_add_button)) } } } @@ -94,7 +95,7 @@ class BatchAddScreen : Screen() { ) { item(key = "top") { Column { - Text(text = stringResource(R.string.eh_batch_add_adding_galleries), style = MaterialTheme.typography.titleLarge) + Text(text = stringResource(SYMR.strings.eh_batch_add_adding_galleries), style = MaterialTheme.typography.titleLarge) Spacer(modifier = Modifier.height(8.dp)) Row( Modifier.fillMaxWidth(), @@ -141,7 +142,7 @@ class BatchAddScreen : Screen() { modifier = Modifier.fillMaxWidth(), onClick = screenModel::finish, ) { - Text(text = stringResource(R.string.eh_batch_add_finish)) + Text(text = stringResource(SYMR.strings.eh_batch_add_finish)) } } } @@ -157,14 +158,14 @@ class BatchAddScreen : Screen() { onDismissRequest = onDismissRequest, confirmButton = { TextButton(onClick = onDismissRequest) { - Text(text = stringResource(R.string.action_ok)) + Text(text = stringResource(MR.strings.action_ok)) } }, title = { - Text(text = stringResource(R.string.batch_add_no_valid_galleries)) + Text(text = stringResource(SYMR.strings.batch_add_no_valid_galleries)) }, text = { - Text(text = stringResource(R.string.batch_add_no_valid_galleries_message)) + Text(text = stringResource(SYMR.strings.batch_add_no_valid_galleries_message)) }, ) null -> Unit diff --git a/app/src/main/java/exh/ui/batchadd/BatchAddScreenModel.kt b/app/src/main/java/exh/ui/batchadd/BatchAddScreenModel.kt index 2b3046e28..6b729d4cf 100644 --- a/app/src/main/java/exh/ui/batchadd/BatchAddScreenModel.kt +++ b/app/src/main/java/exh/ui/batchadd/BatchAddScreenModel.kt @@ -3,7 +3,6 @@ package exh.ui.batchadd import android.content.Context import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope -import eu.kanade.tachiyomi.R import exh.GalleryAddEvent import exh.GalleryAdder import exh.log.xLogE @@ -13,8 +12,10 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ensureActive import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch +import tachiyomi.core.i18n.stringResource import tachiyomi.core.util.lang.withIOContext import tachiyomi.domain.UnsortedPreferences +import tachiyomi.i18n.sy.SYMR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -86,8 +87,8 @@ class BatchAddScreenModel( progress = i + 1, events = state.events.plus( when (result) { - is GalleryAddEvent.Success -> context.getString(R.string.batch_add_ok) - is GalleryAddEvent.Fail -> context.getString(R.string.batch_add_error) + is GalleryAddEvent.Success -> context.stringResource(SYMR.strings.batch_add_ok) + is GalleryAddEvent.Fail -> context.stringResource(SYMR.strings.batch_add_error) } + " " + result.logMessage, ), ) @@ -95,7 +96,7 @@ class BatchAddScreenModel( } // Show report - val summary = context.getString(R.string.batch_add_summary, succeeded.size, failed.size) + val summary = context.stringResource(SYMR.strings.batch_add_summary, succeeded.size, failed.size) mutableState.update { state -> state.copy( events = state.events + summary, diff --git a/app/src/main/java/exh/ui/intercept/InterceptActivity.kt b/app/src/main/java/exh/ui/intercept/InterceptActivity.kt index 4f06165ce..a841b8e99 100755 --- a/app/src/main/java/exh/ui/intercept/InterceptActivity.kt +++ b/app/src/main/java/exh/ui/intercept/InterceptActivity.kt @@ -14,7 +14,6 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.lifecycleScope import com.google.android.material.dialog.MaterialAlertDialogBuilder @@ -34,9 +33,13 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import tachiyomi.core.Constants +import tachiyomi.core.i18n.stringResource import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.manga.model.Manga +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.material.Scaffold +import tachiyomi.presentation.core.i18n.stringResource class InterceptActivity : BaseActivity() { private var statusJob: Job? = null @@ -59,7 +62,7 @@ class InterceptActivity : BaseActivity() { Scaffold( topBar = { scrollBehavior -> AppBar( - title = stringResource(R.string.app_name), + title = stringResource(MR.strings.app_name), navigateUp = ::onBackPressed, scrollBehavior = scrollBehavior, ) @@ -75,17 +78,17 @@ class InterceptActivity : BaseActivity() { when (status) { InterceptResult.Idle, InterceptResult.Loading -> { Text( - text = stringResource(R.string.loading_entry), + text = stringResource(SYMR.strings.loading_entry), style = MaterialTheme.typography.titleLarge, ) CircularProgressIndicator(modifier = Modifier.size(56.dp)) } is InterceptResult.Success -> Text( - text = stringResource(R.string.launching_app), + text = stringResource(SYMR.strings.launching_app), style = MaterialTheme.typography.titleLarge, ) is InterceptResult.Failure -> Text( - text = stringResource(R.string.error_with_reason, status.reason), + text = stringResource(SYMR.strings.error_with_reason, status.reason), style = MaterialTheme.typography.titleLarge, ) } @@ -120,9 +123,9 @@ class InterceptActivity : BaseActivity() { } is InterceptResult.Failure -> { MaterialAlertDialogBuilder(this) - .setTitle(R.string.chapter_error) - .setMessage(getString(R.string.could_not_open_entry, it.reason)) - .setPositiveButton(R.string.action_ok, null) + .setTitle(MR.strings.chapter_error.getString(this)) + .setMessage(stringResource(SYMR.strings.could_not_open_entry, it.reason)) + .setPositiveButton(MR.strings.action_ok.getString(this), null) .setOnCancelListener { onBackPressed() } .setOnDismissListener { onBackPressed() } .show() @@ -153,7 +156,7 @@ class InterceptActivity : BaseActivity() { val sources = galleryAdder.pickSource(gallery) if (sources.size > 1) { MaterialAlertDialogBuilder(this) - .setTitle(R.string.label_sources) + .setTitle(MR.strings.label_sources.getString(this)) .setSingleChoiceItems(sources.map { it.toString() }.toTypedArray(), 0) { dialog, index -> dialog.dismiss() loadGalleryEnd(gallery, sources[index]) diff --git a/app/src/main/java/exh/ui/login/EhLoginActivity.kt b/app/src/main/java/exh/ui/login/EhLoginActivity.kt index fef564465..881c6b0fc 100644 --- a/app/src/main/java/exh/ui/login/EhLoginActivity.kt +++ b/app/src/main/java/exh/ui/login/EhLoginActivity.kt @@ -20,6 +20,7 @@ import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.util.view.setComposeContent import exh.log.xLogD import tachiyomi.domain.UnsortedPreferences +import tachiyomi.i18n.MR import uy.kohesive.injekt.injectLazy import java.net.HttpCookie import java.util.Locale @@ -35,7 +36,7 @@ class EhLoginActivity : BaseActivity() { super.onCreate(savedInstanceState) if (!WebViewUtil.supportsWebView(this)) { - toast(R.string.information_webview_required, Toast.LENGTH_LONG) + toast(MR.strings.information_webview_required, Toast.LENGTH_LONG) finish() return } diff --git a/app/src/main/java/exh/ui/metadata/MetadataViewScreen.kt b/app/src/main/java/exh/ui/metadata/MetadataViewScreen.kt index 87f797269..91f525dfa 100644 --- a/app/src/main/java/exh/ui/metadata/MetadataViewScreen.kt +++ b/app/src/main/java/exh/ui/metadata/MetadataViewScreen.kt @@ -23,8 +23,8 @@ import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.util.Screen -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.util.system.copyToClipboard +import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.ScrollbarLazyColumn import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.topSmallPaddingValues @@ -52,8 +52,8 @@ class MetadataViewScreen(private val mangaId: Long, private val sourceId: Long) ) { paddingValues -> when (val state = state) { MetadataViewState.Loading -> LoadingScreen() - MetadataViewState.MetadataNotFound -> EmptyScreen(R.string.no_results_found) - MetadataViewState.SourceNotFound -> EmptyScreen(R.string.source_empty_screen) + MetadataViewState.MetadataNotFound -> EmptyScreen(MR.strings.no_results_found) + MetadataViewState.SourceNotFound -> EmptyScreen(MR.strings.source_empty_screen) is MetadataViewState.Success -> { val context = LocalContext.current val items = remember(state.meta) { state.meta.getExtraInfoPairs(context) } diff --git a/app/src/main/java/exh/ui/metadata/adapters/EHentaiDescriptionAdapter.kt b/app/src/main/java/exh/ui/metadata/adapters/EHentaiDescriptionAdapter.kt index 310b80723..cf8a31f16 100644 --- a/app/src/main/java/exh/ui/metadata/adapters/EHentaiDescriptionAdapter.kt +++ b/app/src/main/java/exh/ui/metadata/adapters/EHentaiDescriptionAdapter.kt @@ -14,6 +14,10 @@ import eu.kanade.tachiyomi.util.system.copyToClipboard import exh.metadata.MetadataUtil import exh.metadata.metadata.EHentaiSearchMetadata import exh.ui.metadata.adapters.MetadataUIUtil.bindDrawable +import tachiyomi.core.i18n.pluralStringResource +import tachiyomi.core.i18n.stringResource +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR @Composable fun EHentaiDescription(state: State.Success, openMetadataViewer: () -> Unit, search: (String) -> Unit) { @@ -35,25 +39,25 @@ fun EHentaiDescription(state: State.Success, openMetadataViewer: () -> Unit, sea it.second } ?: meta.genre - ?: context.getString(R.string.unknown) + ?: context.stringResource(MR.strings.unknown) - binding.visible.text = context.getString(R.string.is_visible, meta.visible ?: context.getString(R.string.unknown)) + binding.visible.text = context.stringResource(SYMR.strings.is_visible, meta.visible ?: context.stringResource(MR.strings.unknown)) binding.favorites.text = (meta.favorites ?: 0).toString() binding.favorites.bindDrawable(context, R.drawable.ic_book_24dp) - binding.uploader.text = meta.uploader ?: context.getString(R.string.unknown) + binding.uploader.text = meta.uploader ?: context.stringResource(MR.strings.unknown) binding.size.text = MetadataUtil.humanReadableByteCount(meta.size ?: 0, true) binding.size.bindDrawable(context, R.drawable.ic_outline_sd_card_24) val length = meta.length ?: 0 - binding.pages.text = context.resources.getQuantityString(R.plurals.num_pages, length, length) + binding.pages.text = context.pluralStringResource(SYMR.plurals.num_pages, length, length) binding.pages.bindDrawable(context, R.drawable.ic_baseline_menu_book_24) - val language = meta.language ?: context.getString(R.string.unknown) + val language = meta.language ?: context.stringResource(MR.strings.unknown) binding.language.text = if (meta.translated == true) { - context.getString(R.string.language_translated, language) + context.stringResource(SYMR.strings.language_translated, language) } else { language } diff --git a/app/src/main/java/exh/ui/metadata/adapters/EightMusesDescriptionAdapter.kt b/app/src/main/java/exh/ui/metadata/adapters/EightMusesDescriptionAdapter.kt index bd4baf220..686067f8e 100644 --- a/app/src/main/java/exh/ui/metadata/adapters/EightMusesDescriptionAdapter.kt +++ b/app/src/main/java/exh/ui/metadata/adapters/EightMusesDescriptionAdapter.kt @@ -12,6 +12,8 @@ import eu.kanade.tachiyomi.ui.manga.MangaScreenModel.State import eu.kanade.tachiyomi.util.system.copyToClipboard import exh.metadata.metadata.EightMusesSearchMetadata import exh.ui.metadata.adapters.MetadataUIUtil.bindDrawable +import tachiyomi.core.i18n.stringResource +import tachiyomi.i18n.MR @Composable fun EightMusesDescription(state: State.Success, openMetadataViewer: () -> Unit) { @@ -26,7 +28,7 @@ fun EightMusesDescription(state: State.Success, openMetadataViewer: () -> Unit) if (meta == null || meta !is EightMusesSearchMetadata) return@AndroidView val binding = DescriptionAdapter8mBinding.bind(it) - binding.title.text = meta.title ?: context.getString(R.string.unknown) + binding.title.text = meta.title ?: context.stringResource(MR.strings.unknown) binding.moreInfo.bindDrawable(context, R.drawable.ic_info_24dp) diff --git a/app/src/main/java/exh/ui/metadata/adapters/HBrowseDescriptionAdapter.kt b/app/src/main/java/exh/ui/metadata/adapters/HBrowseDescriptionAdapter.kt index 513b0a45b..e290bcf2e 100644 --- a/app/src/main/java/exh/ui/metadata/adapters/HBrowseDescriptionAdapter.kt +++ b/app/src/main/java/exh/ui/metadata/adapters/HBrowseDescriptionAdapter.kt @@ -12,6 +12,8 @@ import eu.kanade.tachiyomi.ui.manga.MangaScreenModel.State import eu.kanade.tachiyomi.util.system.copyToClipboard import exh.metadata.metadata.HBrowseSearchMetadata import exh.ui.metadata.adapters.MetadataUIUtil.bindDrawable +import tachiyomi.core.i18n.pluralStringResource +import tachiyomi.i18n.sy.SYMR @Composable fun HBrowseDescription(state: State.Success, openMetadataViewer: () -> Unit) { @@ -26,7 +28,7 @@ fun HBrowseDescription(state: State.Success, openMetadataViewer: () -> Unit) { if (meta == null || meta !is HBrowseSearchMetadata) return@AndroidView val binding = DescriptionAdapterHbBinding.bind(it) - binding.pages.text = context.resources.getQuantityString(R.plurals.num_pages, meta.length ?: 0, meta.length ?: 0) + binding.pages.text = context.pluralStringResource(SYMR.plurals.num_pages, meta.length ?: 0, meta.length ?: 0) binding.pages.bindDrawable(context, R.drawable.ic_baseline_menu_book_24) binding.moreInfo.bindDrawable(context, R.drawable.ic_info_24dp) diff --git a/app/src/main/java/exh/ui/metadata/adapters/MetadataUIUtil.kt b/app/src/main/java/exh/ui/metadata/adapters/MetadataUIUtil.kt index 056667994..4cb45041a 100644 --- a/app/src/main/java/exh/ui/metadata/adapters/MetadataUIUtil.kt +++ b/app/src/main/java/exh/ui/metadata/adapters/MetadataUIUtil.kt @@ -15,6 +15,8 @@ import androidx.core.graphics.red import eu.kanade.tachiyomi.source.R import eu.kanade.tachiyomi.util.system.dpToPx import exh.util.SourceTagsUtil +import tachiyomi.core.i18n.stringResource +import tachiyomi.i18n.sy.SYMR import kotlin.math.roundToInt object MetadataUIUtil { @@ -22,41 +24,41 @@ object MetadataUIUtil { context: Context, @FloatRange(from = 0.0, to = 10.0) rating: Float? = null, ) = when (rating?.roundToInt()) { - 0 -> R.string.rating0 - 1 -> R.string.rating1 - 2 -> R.string.rating2 - 3 -> R.string.rating3 - 4 -> R.string.rating4 - 5 -> R.string.rating5 - 6 -> R.string.rating6 - 7 -> R.string.rating7 - 8 -> R.string.rating8 - 9 -> R.string.rating9 - 10 -> R.string.rating10 - else -> R.string.no_rating - }.let { context.getString(it) } + 0 -> SYMR.strings.rating0 + 1 -> SYMR.strings.rating1 + 2 -> SYMR.strings.rating2 + 3 -> SYMR.strings.rating3 + 4 -> SYMR.strings.rating4 + 5 -> SYMR.strings.rating5 + 6 -> SYMR.strings.rating6 + 7 -> SYMR.strings.rating7 + 8 -> SYMR.strings.rating8 + 9 -> SYMR.strings.rating9 + 10 -> SYMR.strings.rating10 + else -> SYMR.strings.no_rating + }.let { context.stringResource(it) } fun getGenreAndColour(context: Context, genre: String) = when (genre) { - "doujinshi", "Doujinshi" -> SourceTagsUtil.GenreColor.DOUJINSHI_COLOR to R.string.doujinshi - "manga", "Japanese Manga", "Manga" -> SourceTagsUtil.GenreColor.MANGA_COLOR to R.string.entry_type_manga + "doujinshi", "Doujinshi" -> SourceTagsUtil.GenreColor.DOUJINSHI_COLOR to SYMR.strings.doujinshi + "manga", "Japanese Manga", "Manga" -> SourceTagsUtil.GenreColor.MANGA_COLOR to SYMR.strings.entry_type_manga "artistcg", "artist CG", "artist-cg", "Artist CG" -> - SourceTagsUtil.GenreColor.ARTIST_CG_COLOR to R.string.artist_cg - "gamecg", "game CG", "game-cg", "Game CG" -> SourceTagsUtil.GenreColor.GAME_CG_COLOR to R.string.game_cg - "western" -> SourceTagsUtil.GenreColor.WESTERN_COLOR to R.string.western - "non-h", "non-H" -> SourceTagsUtil.GenreColor.NON_H_COLOR to R.string.non_h - "imageset", "image Set" -> SourceTagsUtil.GenreColor.IMAGE_SET_COLOR to R.string.image_set - "cosplay" -> SourceTagsUtil.GenreColor.COSPLAY_COLOR to R.string.cosplay - "asianporn", "asian Porn" -> SourceTagsUtil.GenreColor.ASIAN_PORN_COLOR to R.string.asian_porn - "misc" -> SourceTagsUtil.GenreColor.MISC_COLOR to R.string.misc - "Korean Manhwa" -> SourceTagsUtil.GenreColor.ARTIST_CG_COLOR to R.string.entry_type_manhwa - "Chinese Manhua" -> SourceTagsUtil.GenreColor.GAME_CG_COLOR to R.string.entry_type_manhua - "Comic" -> SourceTagsUtil.GenreColor.WESTERN_COLOR to R.string.entry_type_comic - "artbook" -> SourceTagsUtil.GenreColor.IMAGE_SET_COLOR to R.string.artbook - "webtoon" -> SourceTagsUtil.GenreColor.NON_H_COLOR to R.string.entry_type_webtoon - "Video" -> SourceTagsUtil.GenreColor.WESTERN_COLOR to R.string.video + SourceTagsUtil.GenreColor.ARTIST_CG_COLOR to SYMR.strings.artist_cg + "gamecg", "game CG", "game-cg", "Game CG" -> SourceTagsUtil.GenreColor.GAME_CG_COLOR to SYMR.strings.game_cg + "western" -> SourceTagsUtil.GenreColor.WESTERN_COLOR to SYMR.strings.western + "non-h", "non-H" -> SourceTagsUtil.GenreColor.NON_H_COLOR to SYMR.strings.non_h + "imageset", "image Set" -> SourceTagsUtil.GenreColor.IMAGE_SET_COLOR to SYMR.strings.image_set + "cosplay" -> SourceTagsUtil.GenreColor.COSPLAY_COLOR to SYMR.strings.cosplay + "asianporn", "asian Porn" -> SourceTagsUtil.GenreColor.ASIAN_PORN_COLOR to SYMR.strings.asian_porn + "misc" -> SourceTagsUtil.GenreColor.MISC_COLOR to SYMR.strings.misc + "Korean Manhwa" -> SourceTagsUtil.GenreColor.ARTIST_CG_COLOR to SYMR.strings.entry_type_manhwa + "Chinese Manhua" -> SourceTagsUtil.GenreColor.GAME_CG_COLOR to SYMR.strings.entry_type_manhua + "Comic" -> SourceTagsUtil.GenreColor.WESTERN_COLOR to SYMR.strings.entry_type_comic + "artbook" -> SourceTagsUtil.GenreColor.IMAGE_SET_COLOR to SYMR.strings.artbook + "webtoon" -> SourceTagsUtil.GenreColor.NON_H_COLOR to SYMR.strings.entry_type_webtoon + "Video" -> SourceTagsUtil.GenreColor.WESTERN_COLOR to SYMR.strings.video else -> null }?.let { (genreColor, stringId) -> - genreColor.color to context.getString(stringId) + genreColor.color to context.stringResource(stringId) } fun TextView.bindDrawable(context: Context, @DrawableRes drawable: Int) { diff --git a/app/src/main/java/exh/ui/metadata/adapters/NHentaiDescriptionAdapter.kt b/app/src/main/java/exh/ui/metadata/adapters/NHentaiDescriptionAdapter.kt index ead86a34b..35d2cd8aa 100644 --- a/app/src/main/java/exh/ui/metadata/adapters/NHentaiDescriptionAdapter.kt +++ b/app/src/main/java/exh/ui/metadata/adapters/NHentaiDescriptionAdapter.kt @@ -14,6 +14,10 @@ import eu.kanade.tachiyomi.util.system.copyToClipboard import exh.metadata.MetadataUtil import exh.metadata.metadata.NHentaiSearchMetadata import exh.ui.metadata.adapters.MetadataUIUtil.bindDrawable +import tachiyomi.core.i18n.pluralStringResource +import tachiyomi.core.i18n.stringResource +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import java.util.Date @Composable @@ -37,7 +41,7 @@ fun NHentaiDescription(state: State.Success, openMetadataViewer: () -> Unit) { categoriesString?.let { MetadataUIUtil.getGenreAndColour(context, it) }?.let { binding.genre.setBackgroundColor(it.first) it.second - } ?: categoriesString ?: context.getString(R.string.unknown) + } ?: categoriesString ?: context.stringResource(MR.strings.unknown) } meta.favoritesCount?.let { @@ -48,8 +52,8 @@ fun NHentaiDescription(state: State.Success, openMetadataViewer: () -> Unit) { binding.whenPosted.text = MetadataUtil.EX_DATE_FORMAT.format(Date((meta.uploadDate ?: 0) * 1000)) - binding.pages.text = context.resources.getQuantityString( - R.plurals.num_pages, + binding.pages.text = context.pluralStringResource( + SYMR.plurals.num_pages, meta.pageImageTypes.size, meta.pageImageTypes.size, ) diff --git a/app/src/main/java/exh/ui/metadata/adapters/PururinDescriptionAdapter.kt b/app/src/main/java/exh/ui/metadata/adapters/PururinDescriptionAdapter.kt index ebe4f7ba3..e3dc6666b 100644 --- a/app/src/main/java/exh/ui/metadata/adapters/PururinDescriptionAdapter.kt +++ b/app/src/main/java/exh/ui/metadata/adapters/PururinDescriptionAdapter.kt @@ -13,6 +13,10 @@ import eu.kanade.tachiyomi.ui.manga.MangaScreenModel.State import eu.kanade.tachiyomi.util.system.copyToClipboard import exh.metadata.metadata.PururinSearchMetadata import exh.ui.metadata.adapters.MetadataUIUtil.bindDrawable +import tachiyomi.core.i18n.pluralStringResource +import tachiyomi.core.i18n.stringResource +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import kotlin.math.round @Composable @@ -32,15 +36,15 @@ fun PururinDescription(state: State.Success, openMetadataViewer: () -> Unit) { genre?.let { MetadataUIUtil.getGenreAndColour(context, it.name) }?.let { binding.genre.setBackgroundColor(it.first) it.second - } ?: genre?.name ?: context.getString(R.string.unknown) + } ?: genre?.name ?: context.stringResource(MR.strings.unknown) } binding.uploader.text = meta.uploaderDisp ?: meta.uploader.orEmpty() - binding.size.text = meta.fileSize ?: context.getString(R.string.unknown) + binding.size.text = meta.fileSize ?: context.stringResource(MR.strings.unknown) binding.size.bindDrawable(context, R.drawable.ic_outline_sd_card_24) - binding.pages.text = context.resources.getQuantityString(R.plurals.num_pages, meta.pages ?: 0, meta.pages ?: 0) + binding.pages.text = context.pluralStringResource(SYMR.plurals.num_pages, meta.pages ?: 0, meta.pages ?: 0) binding.pages.bindDrawable(context, R.drawable.ic_baseline_menu_book_24) val ratingFloat = meta.averageRating?.toFloat() diff --git a/app/src/main/java/exh/ui/metadata/adapters/TsuminoDescriptionAdapter.kt b/app/src/main/java/exh/ui/metadata/adapters/TsuminoDescriptionAdapter.kt index adf004408..b32189b70 100644 --- a/app/src/main/java/exh/ui/metadata/adapters/TsuminoDescriptionAdapter.kt +++ b/app/src/main/java/exh/ui/metadata/adapters/TsuminoDescriptionAdapter.kt @@ -13,6 +13,10 @@ import eu.kanade.tachiyomi.ui.manga.MangaScreenModel.State import eu.kanade.tachiyomi.util.system.copyToClipboard import exh.metadata.metadata.TsuminoSearchMetadata import exh.ui.metadata.adapters.MetadataUIUtil.bindDrawable +import tachiyomi.core.i18n.pluralStringResource +import tachiyomi.core.i18n.stringResource +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import java.util.Date import kotlin.math.round @@ -32,16 +36,16 @@ fun TsuminoDescription(state: State.Success, openMetadataViewer: () -> Unit) { binding.genre.text = meta.category?.let { MetadataUIUtil.getGenreAndColour(context, it) }?.let { binding.genre.setBackgroundColor(it.first) it.second - } ?: meta.category ?: context.getString(R.string.unknown) + } ?: meta.category ?: context.stringResource(MR.strings.unknown) binding.favorites.text = (meta.favorites ?: 0).toString() binding.favorites.bindDrawable(context, R.drawable.ic_book_24dp) binding.whenPosted.text = TsuminoSearchMetadata.TSUMINO_DATE_FORMAT.format(Date(meta.uploadDate ?: 0)) - binding.uploader.text = meta.uploader ?: context.getString(R.string.unknown) + binding.uploader.text = meta.uploader ?: context.stringResource(MR.strings.unknown) - binding.pages.text = context.resources.getQuantityString(R.plurals.num_pages, meta.length ?: 0, meta.length ?: 0) + binding.pages.text = context.pluralStringResource(SYMR.plurals.num_pages, meta.length ?: 0, meta.length ?: 0) binding.pages.bindDrawable(context, R.drawable.ic_baseline_menu_book_24) binding.ratingBar.rating = meta.averageRating ?: 0F diff --git a/app/src/main/java/exh/ui/smartsearch/SmartSearchScreen.kt b/app/src/main/java/exh/ui/smartsearch/SmartSearchScreen.kt index d58977575..805695279 100644 --- a/app/src/main/java/exh/ui/smartsearch/SmartSearchScreen.kt +++ b/app/src/main/java/exh/ui/smartsearch/SmartSearchScreen.kt @@ -15,19 +15,19 @@ import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.util.Screen -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.browse.source.SourcesScreen import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceScreen import eu.kanade.tachiyomi.ui.manga.MangaScreen import eu.kanade.tachiyomi.util.system.toast +import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.material.Scaffold +import tachiyomi.presentation.core.i18n.stringResource class SmartSearchScreen( private val sourceId: Long, @@ -48,9 +48,9 @@ class SmartSearchScreen( navigator.replace(MangaScreen(results.manga.id, true, smartSearchConfig)) } else { if (results is SmartSearchScreenModel.SearchResults.NotFound) { - context.toast(R.string.could_not_find_entry) + context.toast(SYMR.strings.could_not_find_entry) } else { - context.toast(R.string.automatic_search_error) + context.toast(SYMR.strings.automatic_search_error) } navigator.replace( BrowseSourceScreen( @@ -80,7 +80,7 @@ class SmartSearchScreen( verticalArrangement = Arrangement.spacedBy(8.dp, Alignment.CenterVertically), ) { Text( - text = stringResource(R.string.searching_source), + text = stringResource(SYMR.strings.searching_source), style = MaterialTheme.typography.titleLarge, ) CircularProgressIndicator(modifier = Modifier.size(56.dp)) diff --git a/app/src/main/java/exh/util/MangaType.kt b/app/src/main/java/exh/util/MangaType.kt index 73eaf3974..71e69f467 100644 --- a/app/src/main/java/exh/util/MangaType.kt +++ b/app/src/main/java/exh/util/MangaType.kt @@ -1,22 +1,23 @@ package exh.util import android.content.Context -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.reader.setting.ReadingMode +import tachiyomi.core.i18n.stringResource import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.source.service.SourceManager +import tachiyomi.i18n.sy.SYMR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.util.Locale fun Manga.mangaType(context: Context): String { - return context.getString( + return context.stringResource( when (mangaType()) { - MangaType.TYPE_WEBTOON -> R.string.entry_type_webtoon - MangaType.TYPE_MANHWA -> R.string.entry_type_manhwa - MangaType.TYPE_MANHUA -> R.string.entry_type_manhua - MangaType.TYPE_COMIC -> R.string.entry_type_comic - else -> R.string.entry_type_manga + MangaType.TYPE_WEBTOON -> SYMR.strings.entry_type_webtoon + MangaType.TYPE_MANHWA -> SYMR.strings.entry_type_manhwa + MangaType.TYPE_MANHUA -> SYMR.strings.entry_type_manhua + MangaType.TYPE_COMIC -> SYMR.strings.entry_type_comic + else -> SYMR.strings.entry_type_manga }, ).lowercase(Locale.getDefault()) } diff --git a/core/src/main/java/eu/kanade/tachiyomi/core/security/SecurityPreferences.kt b/core/src/main/java/eu/kanade/tachiyomi/core/security/SecurityPreferences.kt index fa41d7c2f..0d689022c 100644 --- a/core/src/main/java/eu/kanade/tachiyomi/core/security/SecurityPreferences.kt +++ b/core/src/main/java/eu/kanade/tachiyomi/core/security/SecurityPreferences.kt @@ -5,6 +5,7 @@ import tachiyomi.core.preference.Preference import tachiyomi.core.preference.PreferenceStore import tachiyomi.core.preference.getEnum import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR class SecurityPreferences( private val preferenceStore: PreferenceStore, @@ -53,11 +54,11 @@ class SecurityPreferences( } // SY --> - enum class EncryptionType(val titleResId: Int) { - AES_256(R.string.aes_256), - AES_192(R.string.aes_192), - AES_128(R.string.aes_128), - ZIP_STANDARD(R.string.standard_zip_encryption), + enum class EncryptionType(val titleRes: StringResource) { + AES_256(SYMR.strings.aes_256), + AES_192(SYMR.strings.aes_192), + AES_128(SYMR.strings.aes_128), + ZIP_STANDARD(SYMR.strings.standard_zip_encryption), } // SY <-- } diff --git a/core/src/main/java/exh/log/EHLogLevel.kt b/core/src/main/java/exh/log/EHLogLevel.kt index bb593f6f1..91886f61c 100644 --- a/core/src/main/java/exh/log/EHLogLevel.kt +++ b/core/src/main/java/exh/log/EHLogLevel.kt @@ -1,14 +1,14 @@ package exh.log import android.content.Context -import androidx.annotation.StringRes import androidx.preference.PreferenceManager -import eu.kanade.tachiyomi.core.R +import dev.icerock.moko.resources.StringResource +import tachiyomi.i18n.sy.SYMR -enum class EHLogLevel(@StringRes val nameRes: Int, @StringRes val description: Int) { - MINIMAL(R.string.log_minimal, R.string.log_minimal_desc), - EXTRA(R.string.log_extra, R.string.log_extra_desc), - EXTREME(R.string.log_extreme, R.string.log_extreme_desc), +enum class EHLogLevel(val nameRes: StringResource, val description: StringResource) { + MINIMAL(SYMR.strings.log_minimal, SYMR.strings.log_minimal_desc), + EXTRA(SYMR.strings.log_extra, SYMR.strings.log_extra_desc), + EXTREME(SYMR.strings.log_extreme, SYMR.strings.log_extreme_desc), ; companion object { diff --git a/data/src/main/java/tachiyomi/data/chapter/ChapterRepositoryImpl.kt b/data/src/main/java/tachiyomi/data/chapter/ChapterRepositoryImpl.kt index 8daeb7112..25e93aa14 100644 --- a/data/src/main/java/tachiyomi/data/chapter/ChapterRepositoryImpl.kt +++ b/data/src/main/java/tachiyomi/data/chapter/ChapterRepositoryImpl.kt @@ -130,7 +130,9 @@ class ChapterRepositoryImpl( } override suspend fun getMergedChapterByMangaId(mangaId: Long, applyScanlatorFilter: Boolean): List { - return handler.awaitList { chaptersQueries.getMergedChaptersByMangaId(mangaId, applyScanlatorFilter.toLong(), ChapterMapper::mapChapter) } + return handler.awaitList { + chaptersQueries.getMergedChaptersByMangaId(mangaId, applyScanlatorFilter.toLong(), ChapterMapper::mapChapter) + } } override suspend fun getMergedChapterByMangaIdAsFlow(mangaId: Long, applyScanlatorFilter: Boolean): Flow> { diff --git a/domain/src/main/java/tachiyomi/domain/library/model/LibraryGroup.kt b/domain/src/main/java/tachiyomi/domain/library/model/LibraryGroup.kt index 66713555f..299d525bd 100644 --- a/domain/src/main/java/tachiyomi/domain/library/model/LibraryGroup.kt +++ b/domain/src/main/java/tachiyomi/domain/library/model/LibraryGroup.kt @@ -1,6 +1,8 @@ package tachiyomi.domain.library.model -import tachiyomi.domain.R +import dev.icerock.moko.resources.StringResource +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR object LibraryGroup { @@ -10,13 +12,13 @@ object LibraryGroup { const val BY_TRACK_STATUS = 3 const val UNGROUPED = 4 - fun groupTypeStringRes(type: Int, hasCategories: Boolean = true): Int { + fun groupTypeStringRes(type: Int, hasCategories: Boolean = true): StringResource { return when (type) { - BY_STATUS -> R.string.status - BY_SOURCE -> R.string.label_sources - BY_TRACK_STATUS -> R.string.tracking_status - UNGROUPED -> R.string.ungrouped - else -> if (hasCategories) R.string.categories else R.string.ungrouped + BY_STATUS -> MR.strings.status + BY_SOURCE -> MR.strings.label_sources + BY_TRACK_STATUS -> SYMR.strings.tracking_status + UNGROUPED -> SYMR.strings.ungrouped + else -> if (hasCategories) MR.strings.categories else SYMR.strings.ungrouped } } } diff --git a/source-api/src/commonMain/kotlin/exh/md/utils/MangaDexRelation.kt b/source-api/src/commonMain/kotlin/exh/md/utils/MangaDexRelation.kt index a56700c1b..9d7ee4275 100644 --- a/source-api/src/commonMain/kotlin/exh/md/utils/MangaDexRelation.kt +++ b/source-api/src/commonMain/kotlin/exh/md/utils/MangaDexRelation.kt @@ -1,26 +1,26 @@ package exh.md.utils -import androidx.annotation.StringRes -import eu.kanade.tachiyomi.source.R +import dev.icerock.moko.resources.StringResource +import tachiyomi.i18n.sy.SYMR -enum class MangaDexRelation(@StringRes val resId: Int, val mdString: String?) { - SIMILAR(R.string.relation_similar, null), - MONOCHROME(R.string.relation_monochrome, "monochrome"), - MAIN_STORY(R.string.relation_main_story, "main_story"), - ADAPTED_FROM(R.string.relation_adapted_from, "adapted_from"), - BASED_ON(R.string.relation_based_on, "based_on"), - PREQUEL(R.string.relation_prequel, "prequel"), - SIDE_STORY(R.string.relation_side_story, "side_story"), - DOUJINSHI(R.string.relation_doujinshi, "doujinshi"), - SAME_FRANCHISE(R.string.relation_same_franchise, "same_franchise"), - SHARED_UNIVERSE(R.string.relation_shared_universe, "shared_universe"), - SEQUEL(R.string.relation_sequel, "sequel"), - SPIN_OFF(R.string.relation_spin_off, "spin_off"), - ALTERNATE_STORY(R.string.relation_alternate_story, "alternate_story"), - PRESERIALIZATION(R.string.relation_preserialization, "preserialization"), - COLORED(R.string.relation_colored, "colored"), - SERIALIZATION(R.string.relation_serialization, "serialization"), - ALTERNATE_VERSION(R.string.relation_alternate_version, "alternate_version"), +enum class MangaDexRelation(val res: StringResource, val mdString: String?) { + SIMILAR(SYMR.strings.relation_similar, null), + MONOCHROME(SYMR.strings.relation_monochrome, "monochrome"), + MAIN_STORY(SYMR.strings.relation_main_story, "main_story"), + ADAPTED_FROM(SYMR.strings.relation_adapted_from, "adapted_from"), + BASED_ON(SYMR.strings.relation_based_on, "based_on"), + PREQUEL(SYMR.strings.relation_prequel, "prequel"), + SIDE_STORY(SYMR.strings.relation_side_story, "side_story"), + DOUJINSHI(SYMR.strings.relation_doujinshi, "doujinshi"), + SAME_FRANCHISE(SYMR.strings.relation_same_franchise, "same_franchise"), + SHARED_UNIVERSE(SYMR.strings.relation_shared_universe, "shared_universe"), + SEQUEL(SYMR.strings.relation_sequel, "sequel"), + SPIN_OFF(SYMR.strings.relation_spin_off, "spin_off"), + ALTERNATE_STORY(SYMR.strings.relation_alternate_story, "alternate_story"), + PRESERIALIZATION(SYMR.strings.relation_preserialization, "preserialization"), + COLORED(SYMR.strings.relation_colored, "colored"), + SERIALIZATION(SYMR.strings.relation_serialization, "serialization"), + ALTERNATE_VERSION(SYMR.strings.relation_alternate_version, "alternate_version"), ; companion object { diff --git a/source-api/src/commonMain/kotlin/exh/metadata/metadata/EHentaiSearchMetadata.kt b/source-api/src/commonMain/kotlin/exh/metadata/metadata/EHentaiSearchMetadata.kt index 91799b34d..d54b9e794 100644 --- a/source-api/src/commonMain/kotlin/exh/metadata/metadata/EHentaiSearchMetadata.kt +++ b/source-api/src/commonMain/kotlin/exh/metadata/metadata/EHentaiSearchMetadata.kt @@ -2,12 +2,14 @@ package exh.metadata.metadata import android.content.Context import androidx.core.net.toUri -import eu.kanade.tachiyomi.source.R import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.copy import exh.metadata.MetadataUtil import exh.pref.DelegateSourcePreferences import kotlinx.serialization.Serializable +import tachiyomi.core.i18n.stringResource +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.util.Date @@ -90,28 +92,28 @@ class EHentaiSearchMetadata : RaisedSearchMetadata() { override fun getExtraInfoPairs(context: Context): List> { return with(context) { listOfNotNull( - getItem(gId) { getString(R.string.id) }, - getItem(gToken) { getString(R.string.token) }, - getItem(exh) { getString(R.string.is_exhentai_gallery) }, - getItem(thumbnailUrl) { getString(R.string.thumbnail_url) }, - getItem(title) { getString(R.string.title) }, - getItem(altTitle) { getString(R.string.alt_title) }, - getItem(genre) { getString(R.string.genre) }, + getItem(gId) { stringResource(SYMR.strings.id) }, + getItem(gToken) { stringResource(SYMR.strings.token) }, + getItem(exh) { stringResource(SYMR.strings.is_exhentai_gallery) }, + getItem(thumbnailUrl) { stringResource(SYMR.strings.thumbnail_url) }, + getItem(title) { stringResource(MR.strings.title) }, + getItem(altTitle) { stringResource(SYMR.strings.alt_title) }, + getItem(genre) { stringResource(SYMR.strings.genre) }, getItem(datePosted, { MetadataUtil.EX_DATE_FORMAT.format(Date(it)) }) { - getString(R.string.date_posted) + stringResource(SYMR.strings.date_posted) }, - getItem(parent) { getString(R.string.parent) }, - getItem(visible) { getString(R.string.visible) }, - getItem(language) { getString(R.string.language) }, - getItem(translated) { getString(R.string.translated) }, - getItem(size, { MetadataUtil.humanReadableByteCount(it, true) }) { getString(R.string.gallery_size) }, - getItem(length) { getString(R.string.page_count) }, - getItem(favorites) { getString(R.string.total_favorites) }, - getItem(ratingCount) { getString(R.string.total_ratings) }, - getItem(averageRating) { getString(R.string.average_rating) }, - getItem(aged) { getString(R.string.aged) }, + getItem(parent) { stringResource(SYMR.strings.parent) }, + getItem(visible) { stringResource(SYMR.strings.visible) }, + getItem(language) { stringResource(SYMR.strings.language) }, + getItem(translated) { stringResource(SYMR.strings.translated) }, + getItem(size, { MetadataUtil.humanReadableByteCount(it, true) }) { stringResource(SYMR.strings.gallery_size) }, + getItem(length) { stringResource(SYMR.strings.page_count) }, + getItem(favorites) { stringResource(SYMR.strings.total_favorites) }, + getItem(ratingCount) { stringResource(SYMR.strings.total_ratings) }, + getItem(averageRating) { stringResource(SYMR.strings.average_rating) }, + getItem(aged) { stringResource(SYMR.strings.aged) }, getItem(lastUpdateCheck, { MetadataUtil.EX_DATE_FORMAT.format(Date(it)) }) { - getString(R.string.last_update_check) + stringResource(SYMR.strings.last_update_check) }, ) } diff --git a/source-api/src/commonMain/kotlin/exh/metadata/metadata/EightMusesSearchMetadata.kt b/source-api/src/commonMain/kotlin/exh/metadata/metadata/EightMusesSearchMetadata.kt index 1d81bb817..365807ed5 100644 --- a/source-api/src/commonMain/kotlin/exh/metadata/metadata/EightMusesSearchMetadata.kt +++ b/source-api/src/commonMain/kotlin/exh/metadata/metadata/EightMusesSearchMetadata.kt @@ -1,11 +1,13 @@ package exh.metadata.metadata import android.content.Context -import eu.kanade.tachiyomi.source.R import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.copy import exh.util.nullIfEmpty import kotlinx.serialization.Serializable +import tachiyomi.core.i18n.stringResource +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR @Serializable class EightMusesSearchMetadata : RaisedSearchMetadata() { @@ -41,9 +43,9 @@ class EightMusesSearchMetadata : RaisedSearchMetadata() { override fun getExtraInfoPairs(context: Context): List> { return with(context) { listOfNotNull( - getItem(title) { getString(R.string.title) }, - getItem(path.nullIfEmpty(), { it.joinToString("/", prefix = "/") }) { getString(R.string.path) }, - getItem(thumbnailUrl) { getString(R.string.thumbnail_url) }, + getItem(title) { stringResource(MR.strings.title) }, + getItem(path.nullIfEmpty(), { it.joinToString("/", prefix = "/") }) { stringResource(SYMR.strings.path) }, + getItem(thumbnailUrl) { stringResource(SYMR.strings.thumbnail_url) }, ) } } diff --git a/source-api/src/commonMain/kotlin/exh/metadata/metadata/HBrowseSearchMetadata.kt b/source-api/src/commonMain/kotlin/exh/metadata/metadata/HBrowseSearchMetadata.kt index 7122db81a..3da4c31e3 100644 --- a/source-api/src/commonMain/kotlin/exh/metadata/metadata/HBrowseSearchMetadata.kt +++ b/source-api/src/commonMain/kotlin/exh/metadata/metadata/HBrowseSearchMetadata.kt @@ -1,10 +1,12 @@ package exh.metadata.metadata import android.content.Context -import eu.kanade.tachiyomi.source.R import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.copy import kotlinx.serialization.Serializable +import tachiyomi.core.i18n.stringResource +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR @Serializable class HBrowseSearchMetadata : RaisedSearchMetadata() { @@ -50,11 +52,11 @@ class HBrowseSearchMetadata : RaisedSearchMetadata() { override fun getExtraInfoPairs(context: Context): List> { return with(context) { listOfNotNull( - getItem(hbId) { getString(R.string.id) }, - getItem(hbUrl) { getString(R.string.url) }, - getItem(thumbnail) { getString(R.string.thumbnail_url) }, - getItem(title) { getString(R.string.title) }, - getItem(length) { getString(R.string.page_count) }, + getItem(hbId) { stringResource(SYMR.strings.id) }, + getItem(hbUrl) { stringResource(SYMR.strings.url) }, + getItem(thumbnail) { stringResource(SYMR.strings.thumbnail_url) }, + getItem(title) { stringResource(MR.strings.title) }, + getItem(length) { stringResource(SYMR.strings.page_count) }, ) } } diff --git a/source-api/src/commonMain/kotlin/exh/metadata/metadata/MangaDexSearchMetadata.kt b/source-api/src/commonMain/kotlin/exh/metadata/metadata/MangaDexSearchMetadata.kt index b28d193e8..88c9c9a68 100644 --- a/source-api/src/commonMain/kotlin/exh/metadata/metadata/MangaDexSearchMetadata.kt +++ b/source-api/src/commonMain/kotlin/exh/metadata/metadata/MangaDexSearchMetadata.kt @@ -1,11 +1,13 @@ package exh.metadata.metadata import android.content.Context -import eu.kanade.tachiyomi.source.R import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.copy import exh.md.utils.MangaDexRelation import kotlinx.serialization.Serializable +import tachiyomi.core.i18n.stringResource +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR @Serializable class MangaDexSearchMetadata : RaisedSearchMetadata() { @@ -76,24 +78,24 @@ class MangaDexSearchMetadata : RaisedSearchMetadata() { override fun getExtraInfoPairs(context: Context): List> { return with(context) { listOfNotNull( - getItem(mdUuid) { getString(R.string.id) }, - // getItem(mdUrl) { getString(R.string.url) }, - getItem(cover) { getString(R.string.thumbnail_url) }, - getItem(title) { getString(R.string.title) }, - getItem(authors, { it.joinToString() }) { getString(R.string.author) }, - getItem(artists, { it.joinToString() }) { getString(R.string.artist) }, - getItem(langFlag) { getString(R.string.language) }, - getItem(lastChapterNumber) { getString(R.string.last_chapter_number) }, - getItem(rating) { getString(R.string.average_rating) }, - // getItem(users) { getString(R.string.total_ratings) }, - getItem(status) { getString(R.string.status) }, - // getItem(missing_chapters) { getString(R.string.missing_chapters) }, - getItem(followStatus) { getString(R.string.follow_status) }, - getItem(anilistId) { getString(R.string.anilist_id) }, - getItem(kitsuId) { getString(R.string.kitsu_id) }, - getItem(myAnimeListId) { getString(R.string.mal_id) }, - getItem(mangaUpdatesId) { getString(R.string.manga_updates_id) }, - getItem(animePlanetId) { getString(R.string.anime_planet_id) }, + getItem(mdUuid) { stringResource(SYMR.strings.id) }, + // getItem(mdUrl) { stringResource(SYMR.strings.url) }, + getItem(cover) { stringResource(SYMR.strings.thumbnail_url) }, + getItem(title) { stringResource(MR.strings.title) }, + getItem(authors, { it.joinToString() }) { stringResource(SYMR.strings.author) }, + getItem(artists, { it.joinToString() }) { stringResource(SYMR.strings.artist) }, + getItem(langFlag) { stringResource(SYMR.strings.language) }, + getItem(lastChapterNumber) { stringResource(SYMR.strings.last_chapter_number) }, + getItem(rating) { stringResource(SYMR.strings.average_rating) }, + // getItem(users) { stringResource(SYMR.strings.total_ratings) }, + getItem(status) { stringResource(MR.strings.status) }, + // getItem(missing_chapters) { stringResource(SYMR.strings.missing_chapters) }, + getItem(followStatus) { stringResource(SYMR.strings.follow_status) }, + getItem(anilistId) { stringResource(SYMR.strings.anilist_id) }, + getItem(kitsuId) { stringResource(SYMR.strings.kitsu_id) }, + getItem(myAnimeListId) { stringResource(SYMR.strings.mal_id) }, + getItem(mangaUpdatesId) { stringResource(SYMR.strings.manga_updates_id) }, + getItem(animePlanetId) { stringResource(SYMR.strings.anime_planet_id) }, ) } } diff --git a/source-api/src/commonMain/kotlin/exh/metadata/metadata/NHentaiSearchMetadata.kt b/source-api/src/commonMain/kotlin/exh/metadata/metadata/NHentaiSearchMetadata.kt index 76b5b19b9..5f7a2a2b9 100644 --- a/source-api/src/commonMain/kotlin/exh/metadata/metadata/NHentaiSearchMetadata.kt +++ b/source-api/src/commonMain/kotlin/exh/metadata/metadata/NHentaiSearchMetadata.kt @@ -1,11 +1,13 @@ package exh.metadata.metadata import android.content.Context -import eu.kanade.tachiyomi.source.R import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.copy import exh.metadata.MetadataUtil import kotlinx.serialization.Serializable +import tachiyomi.core.i18n.stringResource +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import java.util.Date @Serializable @@ -89,19 +91,19 @@ class NHentaiSearchMetadata : RaisedSearchMetadata() { override fun getExtraInfoPairs(context: Context): List> { return with(context) { listOfNotNull( - getItem(nhId) { getString(R.string.id) }, + getItem(nhId) { stringResource(SYMR.strings.id) }, getItem(uploadDate, { MetadataUtil.EX_DATE_FORMAT.format(Date(it * 1000)) }) { - getString(R.string.date_posted) + stringResource(SYMR.strings.date_posted) }, - getItem(favoritesCount) { getString(R.string.total_favorites) }, - getItem(mediaId) { getString(R.string.media_id) }, - getItem(japaneseTitle) { getString(R.string.japanese_title) }, - getItem(englishTitle) { getString(R.string.english_title) }, - getItem(shortTitle) { getString(R.string.short_title) }, - getItem(coverImageType) { getString(R.string.cover_image_file_type) }, - getItem(pageImageTypes.size) { getString(R.string.page_count) }, - getItem(thumbnailImageType) { getString(R.string.thumbnail_image_file_type) }, - getItem(scanlator) { getString(R.string.scanlator) }, + getItem(favoritesCount) { stringResource(SYMR.strings.total_favorites) }, + getItem(mediaId) { stringResource(SYMR.strings.media_id) }, + getItem(japaneseTitle) { stringResource(SYMR.strings.japanese_title) }, + getItem(englishTitle) { stringResource(SYMR.strings.english_title) }, + getItem(shortTitle) { stringResource(SYMR.strings.short_title) }, + getItem(coverImageType) { stringResource(SYMR.strings.cover_image_file_type) }, + getItem(pageImageTypes.size) { stringResource(SYMR.strings.page_count) }, + getItem(thumbnailImageType) { stringResource(SYMR.strings.thumbnail_image_file_type) }, + getItem(scanlator) { stringResource(MR.strings.scanlator) }, ) } } diff --git a/source-api/src/commonMain/kotlin/exh/metadata/metadata/PururinSearchMetadata.kt b/source-api/src/commonMain/kotlin/exh/metadata/metadata/PururinSearchMetadata.kt index f6f17fe76..f7a4a6750 100644 --- a/source-api/src/commonMain/kotlin/exh/metadata/metadata/PururinSearchMetadata.kt +++ b/source-api/src/commonMain/kotlin/exh/metadata/metadata/PururinSearchMetadata.kt @@ -1,10 +1,12 @@ package exh.metadata.metadata import android.content.Context -import eu.kanade.tachiyomi.source.R import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.copy import kotlinx.serialization.Serializable +import tachiyomi.core.i18n.stringResource +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR @Serializable class PururinSearchMetadata : RaisedSearchMetadata() { @@ -56,16 +58,16 @@ class PururinSearchMetadata : RaisedSearchMetadata() { override fun getExtraInfoPairs(context: Context): List> { return with(context) { listOfNotNull( - getItem(prId) { getString(R.string.id) }, - getItem(title) { getString(R.string.title) }, - getItem(altTitle) { getString(R.string.alt_title) }, - getItem(thumbnailUrl) { getString(R.string.thumbnail_url) }, - getItem(uploaderDisp) { getString(R.string.uploader_capital) }, - getItem(uploader) { getString(R.string.uploader) }, - getItem(pages) { getString(R.string.page_count) }, - getItem(fileSize) { getString(R.string.gallery_size) }, - getItem(ratingCount) { getString(R.string.total_ratings) }, - getItem(averageRating) { getString(R.string.average_rating) }, + getItem(prId) { stringResource(SYMR.strings.id) }, + getItem(title) { stringResource(MR.strings.title) }, + getItem(altTitle) { stringResource(SYMR.strings.alt_title) }, + getItem(thumbnailUrl) { stringResource(SYMR.strings.thumbnail_url) }, + getItem(uploaderDisp) { stringResource(SYMR.strings.uploader_capital) }, + getItem(uploader) { stringResource(SYMR.strings.uploader) }, + getItem(pages) { stringResource(SYMR.strings.page_count) }, + getItem(fileSize) { stringResource(SYMR.strings.gallery_size) }, + getItem(ratingCount) { stringResource(SYMR.strings.total_ratings) }, + getItem(averageRating) { stringResource(SYMR.strings.average_rating) }, ) } } diff --git a/source-api/src/commonMain/kotlin/exh/metadata/metadata/TsuminoSearchMetadata.kt b/source-api/src/commonMain/kotlin/exh/metadata/metadata/TsuminoSearchMetadata.kt index e0447e4f2..b6bb35132 100644 --- a/source-api/src/commonMain/kotlin/exh/metadata/metadata/TsuminoSearchMetadata.kt +++ b/source-api/src/commonMain/kotlin/exh/metadata/metadata/TsuminoSearchMetadata.kt @@ -2,12 +2,14 @@ package exh.metadata.metadata import android.content.Context import androidx.core.net.toUri -import eu.kanade.tachiyomi.source.R import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.copy import exh.metadata.MetadataUtil import exh.util.nullIfEmpty import kotlinx.serialization.Serializable +import tachiyomi.core.i18n.stringResource +import tachiyomi.i18n.MR +import tachiyomi.i18n.sy.SYMR import java.text.SimpleDateFormat import java.util.Date import java.util.Locale @@ -68,22 +70,22 @@ class TsuminoSearchMetadata : RaisedSearchMetadata() { override fun getExtraInfoPairs(context: Context): List> { return with(context) { listOfNotNull( - getItem(tmId) { getString(R.string.id) }, - getItem(title) { getString(R.string.title) }, - getItem(uploader) { getString(R.string.uploader) }, + getItem(tmId) { stringResource(SYMR.strings.id) }, + getItem(title) { stringResource(MR.strings.title) }, + getItem(uploader) { stringResource(SYMR.strings.uploader) }, getItem(uploadDate, { MetadataUtil.EX_DATE_FORMAT.format(Date(it)) }) { - getString(R.string.date_posted) + stringResource(SYMR.strings.date_posted) }, - getItem(length) { getString(R.string.page_count) }, - getItem(ratingString) { getString(R.string.rating_string) }, - getItem(averageRating) { getString(R.string.average_rating) }, - getItem(userRatings) { getString(R.string.total_ratings) }, - getItem(favorites) { getString(R.string.total_favorites) }, - getItem(category) { getString(R.string.genre) }, - getItem(collection) { getString(R.string.collection) }, - getItem(group) { getString(R.string.group) }, - getItem(parody.nullIfEmpty(), { it.joinToString() }) { getString(R.string.parodies) }, - getItem(character.nullIfEmpty(), { it.joinToString() }) { getString(R.string.characters) }, + getItem(length) { stringResource(SYMR.strings.page_count) }, + getItem(ratingString) { stringResource(SYMR.strings.rating_string) }, + getItem(averageRating) { stringResource(SYMR.strings.average_rating) }, + getItem(userRatings) { stringResource(SYMR.strings.total_ratings) }, + getItem(favorites) { stringResource(SYMR.strings.total_favorites) }, + getItem(category) { stringResource(SYMR.strings.genre) }, + getItem(collection) { stringResource(SYMR.strings.collection) }, + getItem(group) { stringResource(SYMR.strings.group) }, + getItem(parody.nullIfEmpty(), { it.joinToString() }) { stringResource(SYMR.strings.parodies) }, + getItem(character.nullIfEmpty(), { it.joinToString() }) { stringResource(SYMR.strings.characters) }, ) } }