Replace remaining Android-specific strings

Also renaming the helper composables so it's a bit easier to find/replace everything
in forks.
This commit is contained in:
arkon 2023-11-18 19:41:33 -05:00
parent 46e734fc8e
commit 0d1bced122
165 changed files with 1179 additions and 1167 deletions

View File

@ -24,13 +24,13 @@ import eu.kanade.presentation.util.formattedMessage
import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.Source
import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentListOf
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import tachiyomi.core.i18n.localize import tachiyomi.core.i18n.stringResource
import tachiyomi.domain.library.model.LibraryDisplayMode import tachiyomi.domain.library.model.LibraryDisplayMode
import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.manga.model.Manga
import tachiyomi.domain.source.model.StubSource import tachiyomi.domain.source.model.StubSource
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.Scaffold
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.EmptyScreen
import tachiyomi.presentation.core.screens.EmptyScreenAction import tachiyomi.presentation.core.screens.EmptyScreenAction
import tachiyomi.presentation.core.screens.LoadingScreen import tachiyomi.presentation.core.screens.LoadingScreen
@ -63,7 +63,7 @@ fun BrowseSourceContent(
if (mangaList.itemCount > 0 && errorState != null && errorState is LoadState.Error) { if (mangaList.itemCount > 0 && errorState != null && errorState is LoadState.Error) {
val result = snackbarHostState.showSnackbar( val result = snackbarHostState.showSnackbar(
message = getErrorMessage(errorState), message = getErrorMessage(errorState),
actionLabel = context.localize(MR.strings.action_retry), actionLabel = context.stringResource(MR.strings.action_retry),
duration = SnackbarDuration.Indefinite, duration = SnackbarDuration.Indefinite,
) )
when (result) { when (result) {
@ -161,7 +161,7 @@ internal fun MissingSourceScreen(
}, },
) { paddingValues -> ) { paddingValues ->
EmptyScreen( EmptyScreen(
message = localize(MR.strings.source_not_installed, source.toString()), message = stringResource(MR.strings.source_not_installed, source.toString()),
modifier = Modifier.padding(paddingValues), modifier = Modifier.padding(paddingValues),
) )
} }

View File

@ -58,7 +58,7 @@ import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.ScrollbarLazyColumn import tachiyomi.presentation.core.components.ScrollbarLazyColumn
import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.Scaffold
import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.padding
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.EmptyScreen
@Composable @Composable
@ -77,7 +77,7 @@ fun ExtensionDetailsScreen(
Scaffold( Scaffold(
topBar = { scrollBehavior -> topBar = { scrollBehavior ->
AppBar( AppBar(
title = localize(MR.strings.label_extension_info), title = stringResource(MR.strings.label_extension_info),
navigateUp = navigateUp, navigateUp = navigateUp,
actions = { actions = {
AppBarActions( AppBarActions(
@ -86,14 +86,14 @@ fun ExtensionDetailsScreen(
if (state.extension?.isUnofficial == false) { if (state.extension?.isUnofficial == false) {
add( add(
AppBar.Action( AppBar.Action(
title = localize(MR.strings.whats_new), title = stringResource(MR.strings.whats_new),
icon = Icons.Outlined.History, icon = Icons.Outlined.History,
onClick = onClickWhatsNew, onClick = onClickWhatsNew,
), ),
) )
add( add(
AppBar.Action( AppBar.Action(
title = localize(MR.strings.action_faq_and_guides), title = stringResource(MR.strings.action_faq_and_guides),
icon = Icons.AutoMirrored.Outlined.HelpOutline, icon = Icons.AutoMirrored.Outlined.HelpOutline,
onClick = onClickReadme, onClick = onClickReadme,
), ),
@ -102,15 +102,15 @@ fun ExtensionDetailsScreen(
addAll( addAll(
listOf( listOf(
AppBar.OverflowAction( AppBar.OverflowAction(
title = localize(MR.strings.action_enable_all), title = stringResource(MR.strings.action_enable_all),
onClick = onClickEnableAll, onClick = onClickEnableAll,
), ),
AppBar.OverflowAction( AppBar.OverflowAction(
title = localize(MR.strings.action_disable_all), title = stringResource(MR.strings.action_disable_all),
onClick = onClickDisableAll, onClick = onClickDisableAll,
), ),
AppBar.OverflowAction( AppBar.OverflowAction(
title = localize(MR.strings.pref_clear_cookies), title = stringResource(MR.strings.pref_clear_cookies),
onClick = onClickClearCookies, onClick = onClickClearCookies,
), ),
), ),
@ -260,7 +260,7 @@ private fun DetailsHeader(
InfoText( InfoText(
modifier = Modifier.weight(1f), modifier = Modifier.weight(1f),
primaryText = extension.versionName, primaryText = extension.versionName,
secondaryText = localize(MR.strings.ext_info_version), secondaryText = stringResource(MR.strings.ext_info_version),
) )
InfoDivider() InfoDivider()
@ -268,7 +268,7 @@ private fun DetailsHeader(
InfoText( InfoText(
modifier = Modifier.weight(if (extension.isNsfw) 1.5f else 1f), modifier = Modifier.weight(if (extension.isNsfw) 1.5f else 1f),
primaryText = LocaleHelper.getSourceDisplayName(extension.lang, context), primaryText = LocaleHelper.getSourceDisplayName(extension.lang, context),
secondaryText = localize(MR.strings.ext_info_language), secondaryText = stringResource(MR.strings.ext_info_language),
) )
if (extension.isNsfw) { if (extension.isNsfw) {
@ -276,12 +276,12 @@ private fun DetailsHeader(
InfoText( InfoText(
modifier = Modifier.weight(1f), modifier = Modifier.weight(1f),
primaryText = localize(MR.strings.ext_nsfw_short), primaryText = stringResource(MR.strings.ext_nsfw_short),
primaryTextStyle = MaterialTheme.typography.bodyLarge.copy( primaryTextStyle = MaterialTheme.typography.bodyLarge.copy(
color = MaterialTheme.colorScheme.error, color = MaterialTheme.colorScheme.error,
fontWeight = FontWeight.Medium, fontWeight = FontWeight.Medium,
), ),
secondaryText = localize(MR.strings.ext_info_age_rating), secondaryText = stringResource(MR.strings.ext_info_age_rating),
onClick = onClickAgeRating, onClick = onClickAgeRating,
) )
} }
@ -300,7 +300,7 @@ private fun DetailsHeader(
modifier = Modifier.weight(1f), modifier = Modifier.weight(1f),
onClick = onClickUninstall, onClick = onClickUninstall,
) { ) {
Text(localize(MR.strings.ext_uninstall)) Text(stringResource(MR.strings.ext_uninstall))
} }
if (onClickAppInfo != null) { if (onClickAppInfo != null) {
@ -309,7 +309,7 @@ private fun DetailsHeader(
onClick = onClickAppInfo, onClick = onClickAppInfo,
) { ) {
Text( Text(
text = localize(MR.strings.ext_app_info), text = stringResource(MR.strings.ext_app_info),
color = MaterialTheme.colorScheme.onPrimary, color = MaterialTheme.colorScheme.onPrimary,
) )
} }
@ -387,7 +387,7 @@ private fun SourceSwitchPreference(
IconButton(onClick = { onClickSourcePreferences(source.source.id) }) { IconButton(onClick = { onClickSourcePreferences(source.source.id) }) {
Icon( Icon(
imageVector = Icons.Outlined.Settings, imageVector = Icons.Outlined.Settings,
contentDescription = localize(MR.strings.label_settings), contentDescription = stringResource(MR.strings.label_settings),
tint = MaterialTheme.colorScheme.onSurface, tint = MaterialTheme.colorScheme.onSurface,
) )
} }
@ -410,11 +410,11 @@ private fun NsfwWarningDialog(
) { ) {
AlertDialog( AlertDialog(
text = { text = {
Text(text = localize(MR.strings.ext_nsfw_warning)) Text(text = stringResource(MR.strings.ext_nsfw_warning))
}, },
confirmButton = { confirmButton = {
TextButton(onClick = onClickConfirm) { TextButton(onClick = onClickConfirm) {
Text(text = localize(MR.strings.action_ok)) Text(text = stringResource(MR.strings.action_ok))
} }
}, },
onDismissRequest = onClickConfirm, onDismissRequest = onClickConfirm,

View File

@ -13,7 +13,7 @@ import eu.kanade.tachiyomi.ui.browse.extension.ExtensionFilterState
import eu.kanade.tachiyomi.util.system.LocaleHelper import eu.kanade.tachiyomi.util.system.LocaleHelper
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.Scaffold
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.EmptyScreen
@Composable @Composable
@ -25,7 +25,7 @@ fun ExtensionFilterScreen(
Scaffold( Scaffold(
topBar = { scrollBehavior -> topBar = { scrollBehavior ->
AppBar( AppBar(
title = localize(MR.strings.label_extensions), title = stringResource(MR.strings.label_extensions),
navigateUp = navigateUp, navigateUp = navigateUp,
scrollBehavior = scrollBehavior, scrollBehavior = scrollBehavior,
) )

View File

@ -48,7 +48,7 @@ import tachiyomi.presentation.core.components.FastScrollLazyColumn
import tachiyomi.presentation.core.components.material.PullRefresh import tachiyomi.presentation.core.components.material.PullRefresh
import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.padding
import tachiyomi.presentation.core.components.material.topSmallPaddingValues import tachiyomi.presentation.core.components.material.topSmallPaddingValues
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.EmptyScreen
import tachiyomi.presentation.core.screens.LoadingScreen import tachiyomi.presentation.core.screens.LoadingScreen
import tachiyomi.presentation.core.theme.header import tachiyomi.presentation.core.theme.header
@ -136,7 +136,7 @@ private fun ExtensionContent(
{ {
Button(onClick = { onClickUpdateAll() }) { Button(onClick = { onClickUpdateAll() }) {
Text( Text(
text = localize(MR.strings.ext_update_all), text = stringResource(MR.strings.ext_update_all),
style = LocalTextStyle.current.copy( style = LocalTextStyle.current.copy(
color = MaterialTheme.colorScheme.onPrimary, color = MaterialTheme.colorScheme.onPrimary,
), ),
@ -312,7 +312,7 @@ private fun ExtensionItemContent(
} }
if (warning != null) { if (warning != null) {
Text( Text(
text = localize(warning).uppercase(), text = stringResource(warning).uppercase(),
color = MaterialTheme.colorScheme.error, color = MaterialTheme.colorScheme.error,
maxLines = 1, maxLines = 1,
overflow = TextOverflow.Ellipsis, overflow = TextOverflow.Ellipsis,
@ -323,9 +323,9 @@ private fun ExtensionItemContent(
DotSeparatorNoSpaceText() DotSeparatorNoSpaceText()
Text( Text(
text = when (installStep) { text = when (installStep) {
InstallStep.Pending -> localize(MR.strings.ext_pending) InstallStep.Pending -> stringResource(MR.strings.ext_pending)
InstallStep.Downloading -> localize(MR.strings.ext_downloading) InstallStep.Downloading -> stringResource(MR.strings.ext_downloading)
InstallStep.Installing -> localize(MR.strings.ext_installing) InstallStep.Installing -> stringResource(MR.strings.ext_installing)
else -> error("Must not show non-install process text") else -> error("Must not show non-install process text")
}, },
) )
@ -351,19 +351,19 @@ private fun ExtensionItemActions(
) { ) {
Text( Text(
text = when (installStep) { text = when (installStep) {
InstallStep.Installed -> localize(MR.strings.ext_installed) InstallStep.Installed -> stringResource(MR.strings.ext_installed)
InstallStep.Error -> localize(MR.strings.action_retry) InstallStep.Error -> stringResource(MR.strings.action_retry)
InstallStep.Idle -> { InstallStep.Idle -> {
when (extension) { when (extension) {
is Extension.Installed -> { is Extension.Installed -> {
if (extension.hasUpdate) { if (extension.hasUpdate) {
localize(MR.strings.ext_update) stringResource(MR.strings.ext_update)
} else { } else {
localize(MR.strings.action_settings) stringResource(MR.strings.action_settings)
} }
} }
is Extension.Untrusted -> localize(MR.strings.ext_trust) is Extension.Untrusted -> stringResource(MR.strings.ext_trust)
is Extension.Available -> localize(MR.strings.ext_install) is Extension.Available -> stringResource(MR.strings.ext_install)
} }
} }
else -> error("Must not show install process text") else -> error("Must not show install process text")
@ -374,7 +374,7 @@ private fun ExtensionItemActions(
IconButton(onClick = { onClickItemCancel(extension) }) { IconButton(onClick = { onClickItemCancel(extension) }) {
Icon( Icon(
imageVector = Icons.Outlined.Close, imageVector = Icons.Outlined.Close,
contentDescription = localize(MR.strings.action_cancel), contentDescription = stringResource(MR.strings.action_cancel),
) )
} }
} }
@ -388,7 +388,7 @@ private fun ExtensionHeader(
action: @Composable RowScope.() -> Unit = {}, action: @Composable RowScope.() -> Unit = {},
) { ) {
ExtensionHeader( ExtensionHeader(
text = localize(textRes), text = stringResource(textRes),
modifier = modifier, modifier = modifier,
action = action, action = action,
) )
@ -423,19 +423,19 @@ private fun ExtensionTrustDialog(
) { ) {
AlertDialog( AlertDialog(
title = { title = {
Text(text = localize(MR.strings.untrusted_extension)) Text(text = stringResource(MR.strings.untrusted_extension))
}, },
text = { text = {
Text(text = localize(MR.strings.untrusted_extension_message)) Text(text = stringResource(MR.strings.untrusted_extension_message))
}, },
confirmButton = { confirmButton = {
TextButton(onClick = onClickConfirm) { TextButton(onClick = onClickConfirm) {
Text(text = localize(MR.strings.ext_trust)) Text(text = stringResource(MR.strings.ext_trust))
} }
}, },
dismissButton = { dismissButton = {
TextButton(onClick = onClickDismiss) { TextButton(onClick = onClickDismiss) {
Text(text = localize(MR.strings.ext_uninstall)) Text(text = stringResource(MR.strings.ext_uninstall))
} }
}, },
onDismissRequest = onDismissRequest, onDismissRequest = onDismissRequest,

View File

@ -34,7 +34,7 @@ import tachiyomi.presentation.core.components.ScrollbarLazyColumn
import tachiyomi.presentation.core.components.Scroller.STICKY_HEADER_KEY_PREFIX import tachiyomi.presentation.core.components.Scroller.STICKY_HEADER_KEY_PREFIX
import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.padding
import tachiyomi.presentation.core.components.material.topSmallPaddingValues import tachiyomi.presentation.core.components.material.topSmallPaddingValues
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.EmptyScreen
import tachiyomi.presentation.core.screens.LoadingScreen import tachiyomi.presentation.core.screens.LoadingScreen
import tachiyomi.presentation.core.theme.header import tachiyomi.presentation.core.theme.header
@ -95,7 +95,7 @@ private fun MigrateSourceList(
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
) { ) {
Text( Text(
text = localize(MR.strings.migration_selection_prompt), text = stringResource(MR.strings.migration_selection_prompt),
modifier = Modifier.weight(1f), modifier = Modifier.weight(1f),
style = MaterialTheme.typography.header, style = MaterialTheme.typography.header,
) )
@ -104,11 +104,11 @@ private fun MigrateSourceList(
when (sortingMode) { when (sortingMode) {
SetMigrateSorting.Mode.ALPHABETICAL -> Icon( SetMigrateSorting.Mode.ALPHABETICAL -> Icon(
Icons.Outlined.SortByAlpha, Icons.Outlined.SortByAlpha,
contentDescription = localize(MR.strings.action_sort_alpha), contentDescription = stringResource(MR.strings.action_sort_alpha),
) )
SetMigrateSorting.Mode.TOTAL -> Icon( SetMigrateSorting.Mode.TOTAL -> Icon(
Icons.Outlined.Numbers, Icons.Outlined.Numbers,
contentDescription = localize(MR.strings.action_sort_count), contentDescription = stringResource(MR.strings.action_sort_count),
) )
} }
} }
@ -116,11 +116,11 @@ private fun MigrateSourceList(
when (sortingDirection) { when (sortingDirection) {
SetMigrateSorting.Direction.ASCENDING -> Icon( SetMigrateSorting.Direction.ASCENDING -> Icon(
Icons.Outlined.ArrowUpward, Icons.Outlined.ArrowUpward,
contentDescription = localize(MR.strings.action_asc), contentDescription = stringResource(MR.strings.action_asc),
) )
SetMigrateSorting.Direction.DESCENDING -> Icon( SetMigrateSorting.Direction.DESCENDING -> Icon(
Icons.Outlined.ArrowDownward, Icons.Outlined.ArrowDownward,
contentDescription = localize(MR.strings.action_desc), contentDescription = stringResource(MR.strings.action_desc),
) )
} }
} }
@ -189,7 +189,7 @@ private fun MigrateSourceItem(
if (source.isStub) { if (source.isStub) {
Text( Text(
modifier = Modifier.secondaryItemAlpha(), modifier = Modifier.secondaryItemAlpha(),
text = localize(MR.strings.not_installed), text = stringResource(MR.strings.not_installed),
maxLines = 1, maxLines = 1,
overflow = TextOverflow.Ellipsis, overflow = TextOverflow.Ellipsis,
style = MaterialTheme.typography.bodySmall, style = MaterialTheme.typography.bodySmall,

View File

@ -16,7 +16,7 @@ import tachiyomi.domain.source.model.Source
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.FastScrollLazyColumn import tachiyomi.presentation.core.components.FastScrollLazyColumn
import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.Scaffold
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.EmptyScreen
@Composable @Composable
@ -29,7 +29,7 @@ fun SourcesFilterScreen(
Scaffold( Scaffold(
topBar = { scrollBehavior -> topBar = { scrollBehavior ->
AppBar( AppBar(
title = localize(MR.strings.label_sources), title = stringResource(MR.strings.label_sources),
navigateUp = navigateUp, navigateUp = navigateUp,
scrollBehavior = scrollBehavior, scrollBehavior = scrollBehavior,
) )

View File

@ -31,7 +31,7 @@ import tachiyomi.presentation.core.components.ScrollbarLazyColumn
import tachiyomi.presentation.core.components.material.SecondaryItemAlpha import tachiyomi.presentation.core.components.material.SecondaryItemAlpha
import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.padding
import tachiyomi.presentation.core.components.material.topSmallPaddingValues import tachiyomi.presentation.core.components.material.topSmallPaddingValues
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.EmptyScreen
import tachiyomi.presentation.core.screens.LoadingScreen import tachiyomi.presentation.core.screens.LoadingScreen
import tachiyomi.presentation.core.theme.header import tachiyomi.presentation.core.theme.header
@ -121,7 +121,7 @@ private fun SourceItem(
if (source.supportsLatest) { if (source.supportsLatest) {
TextButton(onClick = { onClickItem(source, Listing.Latest) }) { TextButton(onClick = { onClickItem(source, Listing.Latest) }) {
Text( Text(
text = localize(MR.strings.latest), text = stringResource(MR.strings.latest),
style = LocalTextStyle.current.copy( style = LocalTextStyle.current.copy(
color = MaterialTheme.colorScheme.primary, color = MaterialTheme.colorScheme.primary,
), ),
@ -154,7 +154,7 @@ private fun SourcePinButton(
Icon( Icon(
imageVector = icon, imageVector = icon,
tint = tint, tint = tint,
contentDescription = localize(description), contentDescription = stringResource(description),
) )
} }
} }
@ -174,7 +174,7 @@ fun SourceOptionsDialog(
Column { Column {
val textId = if (Pin.Pinned in source.pin) MR.strings.action_unpin else MR.strings.action_pin val textId = if (Pin.Pinned in source.pin) MR.strings.action_unpin else MR.strings.action_pin
Text( Text(
text = localize(textId), text = stringResource(textId),
modifier = Modifier modifier = Modifier
.clickable(onClick = onClickPin) .clickable(onClick = onClickPin)
.fillMaxWidth() .fillMaxWidth()
@ -182,7 +182,7 @@ fun SourceOptionsDialog(
) )
if (!source.isLocal()) { if (!source.isLocal()) {
Text( Text(
text = localize(MR.strings.action_disable), text = stringResource(MR.strings.action_disable),
modifier = Modifier modifier = Modifier
.clickable(onClick = onClickDisable) .clickable(onClick = onClickDisable)
.fillMaxWidth() .fillMaxWidth()

View File

@ -6,7 +6,7 @@ import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.manga.model.Manga
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
@Composable @Composable
fun RemoveMangaDialog( fun RemoveMangaDialog(
@ -18,7 +18,7 @@ fun RemoveMangaDialog(
onDismissRequest = onDismissRequest, onDismissRequest = onDismissRequest,
dismissButton = { dismissButton = {
TextButton(onClick = onDismissRequest) { TextButton(onClick = onDismissRequest) {
Text(text = localize(MR.strings.action_cancel)) Text(text = stringResource(MR.strings.action_cancel))
} }
}, },
confirmButton = { confirmButton = {
@ -28,14 +28,14 @@ fun RemoveMangaDialog(
onConfirm() onConfirm()
}, },
) { ) {
Text(text = localize(MR.strings.action_remove)) Text(text = stringResource(MR.strings.action_remove))
} }
}, },
title = { title = {
Text(text = localize(MR.strings.are_you_sure)) Text(text = stringResource(MR.strings.are_you_sure))
}, },
text = { text = {
Text(text = localize(MR.strings.remove_manga, mangaToRemove.title)) Text(text = stringResource(MR.strings.remove_manga, mangaToRemove.title))
}, },
) )
} }

View File

@ -21,7 +21,7 @@ import eu.kanade.tachiyomi.source.Source
import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentListOf
import tachiyomi.domain.library.model.LibraryDisplayMode import tachiyomi.domain.library.model.LibraryDisplayMode
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.source.local.LocalSource import tachiyomi.source.local.LocalSource
@Composable @Composable
@ -58,7 +58,7 @@ fun BrowseSourceToolbar(
.apply { .apply {
add( add(
AppBar.Action( AppBar.Action(
title = localize(MR.strings.action_display_mode), title = stringResource(MR.strings.action_display_mode),
icon = if (displayMode == LibraryDisplayMode.List) { icon = if (displayMode == LibraryDisplayMode.List) {
Icons.AutoMirrored.Filled.ViewList Icons.AutoMirrored.Filled.ViewList
} else { } else {
@ -70,14 +70,14 @@ fun BrowseSourceToolbar(
if (isLocalSource) { if (isLocalSource) {
add( add(
AppBar.OverflowAction( AppBar.OverflowAction(
title = localize(MR.strings.label_help), title = stringResource(MR.strings.label_help),
onClick = onHelpClick, onClick = onHelpClick,
), ),
) )
} else { } else {
add( add(
AppBar.OverflowAction( AppBar.OverflowAction(
title = localize(MR.strings.action_open_in_web_view), title = stringResource(MR.strings.action_open_in_web_view),
onClick = onWebViewClick, onClick = onWebViewClick,
), ),
) )
@ -85,7 +85,7 @@ fun BrowseSourceToolbar(
if (isConfigurableSource) { if (isConfigurableSource) {
add( add(
AppBar.OverflowAction( AppBar.OverflowAction(
title = localize(MR.strings.action_settings), title = stringResource(MR.strings.action_settings),
onClick = onSettingsClick, onClick = onSettingsClick,
), ),
) )
@ -99,21 +99,21 @@ fun BrowseSourceToolbar(
onDismissRequest = { selectingDisplayMode = false }, onDismissRequest = { selectingDisplayMode = false },
) { ) {
RadioMenuItem( 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, isChecked = displayMode == LibraryDisplayMode.ComfortableGrid,
) { ) {
selectingDisplayMode = false selectingDisplayMode = false
onDisplayModeChange(LibraryDisplayMode.ComfortableGrid) onDisplayModeChange(LibraryDisplayMode.ComfortableGrid)
} }
RadioMenuItem( RadioMenuItem(
text = { Text(text = localize(MR.strings.action_display_grid)) }, text = { Text(text = stringResource(MR.strings.action_display_grid)) },
isChecked = displayMode == LibraryDisplayMode.CompactGrid, isChecked = displayMode == LibraryDisplayMode.CompactGrid,
) { ) {
selectingDisplayMode = false selectingDisplayMode = false
onDisplayModeChange(LibraryDisplayMode.CompactGrid) onDisplayModeChange(LibraryDisplayMode.CompactGrid)
} }
RadioMenuItem( RadioMenuItem(
text = { Text(text = localize(MR.strings.action_display_list)) }, text = { Text(text = stringResource(MR.strings.action_display_list)) },
isChecked = displayMode == LibraryDisplayMode.List, isChecked = displayMode == LibraryDisplayMode.List,
) { ) {
selectingDisplayMode = false selectingDisplayMode = false

View File

@ -21,7 +21,7 @@ import tachiyomi.domain.manga.model.MangaCover
import tachiyomi.domain.manga.model.asMangaCover import tachiyomi.domain.manga.model.asMangaCover
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.padding
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
@Composable @Composable
fun GlobalSearchCardRow( fun GlobalSearchCardRow(
@ -78,7 +78,7 @@ private fun MangaItem(
@Composable @Composable
private fun EmptyResultItem() { private fun EmptyResultItem() {
Text( Text(
text = localize(MR.strings.no_results_found), text = stringResource(MR.strings.no_results_found),
modifier = Modifier modifier = Modifier
.padding( .padding(
horizontal = MaterialTheme.padding.medium, horizontal = MaterialTheme.padding.medium,

View File

@ -12,7 +12,6 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.outlined.ArrowForward import androidx.compose.material.icons.automirrored.outlined.ArrowForward
import androidx.compose.material.icons.outlined.ArrowForward
import androidx.compose.material.icons.outlined.Error import androidx.compose.material.icons.outlined.Error
import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
@ -26,7 +25,7 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.padding
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
@Composable @Composable
fun GlobalSearchResultItem( fun GlobalSearchResultItem(
@ -93,7 +92,7 @@ fun GlobalSearchErrorResultItem(message: String?) {
Icon(imageVector = Icons.Outlined.Error, contentDescription = null) Icon(imageVector = Icons.Outlined.Error, contentDescription = null)
Spacer(Modifier.height(4.dp)) Spacer(Modifier.height(4.dp))
Text( Text(
text = message ?: localize(MR.strings.unknown_error), text = message ?: stringResource(MR.strings.unknown_error),
textAlign = TextAlign.Center, textAlign = TextAlign.Center,
) )
} }

View File

@ -30,7 +30,7 @@ import eu.kanade.presentation.components.SearchToolbar
import eu.kanade.tachiyomi.ui.browse.source.globalsearch.SourceFilter import eu.kanade.tachiyomi.ui.browse.source.globalsearch.SourceFilter
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.padding
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
@Composable @Composable
fun GlobalSearchToolbar( fun GlobalSearchToolbar(
@ -85,7 +85,7 @@ fun GlobalSearchToolbar(
) )
}, },
label = { label = {
Text(text = localize(MR.strings.pinned_sources)) Text(text = stringResource(MR.strings.pinned_sources))
}, },
) )
FilterChip( FilterChip(
@ -100,7 +100,7 @@ fun GlobalSearchToolbar(
) )
}, },
label = { label = {
Text(text = localize(MR.strings.all)) Text(text = stringResource(MR.strings.all))
}, },
) )
@ -118,7 +118,7 @@ fun GlobalSearchToolbar(
) )
}, },
label = { label = {
Text(text = localize(MR.strings.has_results)) Text(text = stringResource(MR.strings.has_results))
}, },
) )
} }

View File

@ -2,20 +2,20 @@ package eu.kanade.presentation.category
import android.content.Context import android.content.Context
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import tachiyomi.core.i18n.localize import tachiyomi.core.i18n.stringResource
import tachiyomi.domain.category.model.Category import tachiyomi.domain.category.model.Category
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
val Category.visualName: String val Category.visualName: String
@Composable @Composable
get() = when { get() = when {
isSystemCategory -> localize(MR.strings.label_default) isSystemCategory -> stringResource(MR.strings.label_default)
else -> name else -> name
} }
fun Category.visualName(context: Context): String = fun Category.visualName(context: Context): String =
when { when {
isSystemCategory -> context.localize(MR.strings.label_default) isSystemCategory -> context.stringResource(MR.strings.label_default)
else -> name else -> name
} }

View File

@ -23,7 +23,7 @@ import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.Scaffold
import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.padding
import tachiyomi.presentation.core.components.material.topSmallPaddingValues import tachiyomi.presentation.core.components.material.topSmallPaddingValues
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.EmptyScreen
import tachiyomi.presentation.core.util.plus import tachiyomi.presentation.core.util.plus
@ -42,13 +42,13 @@ fun CategoryScreen(
Scaffold( Scaffold(
topBar = { scrollBehavior -> topBar = { scrollBehavior ->
AppBar( AppBar(
title = localize(MR.strings.action_edit_categories), title = stringResource(MR.strings.action_edit_categories),
navigateUp = navigateUp, navigateUp = navigateUp,
actions = { actions = {
AppBarActions( AppBarActions(
persistentListOf( persistentListOf(
AppBar.Action( AppBar.Action(
title = localize(MR.strings.action_sort), title = stringResource(MR.strings.action_sort),
icon = Icons.Outlined.SortByAlpha, icon = Icons.Outlined.SortByAlpha,
onClick = onClickSortAlphabetically, onClick = onClickSortAlphabetically,
), ),

View File

@ -32,7 +32,7 @@ import tachiyomi.core.preference.CheckboxState
import tachiyomi.domain.category.model.Category import tachiyomi.domain.category.model.Category
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.padding
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import kotlin.time.Duration.Companion.seconds import kotlin.time.Duration.Companion.seconds
@Composable @Composable
@ -56,30 +56,30 @@ fun CategoryCreateDialog(
onDismissRequest() onDismissRequest()
}, },
) { ) {
Text(text = localize(MR.strings.action_add)) Text(text = stringResource(MR.strings.action_add))
} }
}, },
dismissButton = { dismissButton = {
TextButton(onClick = onDismissRequest) { TextButton(onClick = onDismissRequest) {
Text(text = localize(MR.strings.action_cancel)) Text(text = stringResource(MR.strings.action_cancel))
} }
}, },
title = { title = {
Text(text = localize(MR.strings.action_add_category)) Text(text = stringResource(MR.strings.action_add_category))
}, },
text = { text = {
OutlinedTextField( OutlinedTextField(
modifier = Modifier.focusRequester(focusRequester), modifier = Modifier.focusRequester(focusRequester),
value = name, value = name,
onValueChange = { name = it }, onValueChange = { name = it },
label = { Text(text = localize(MR.strings.name)) }, label = { Text(text = stringResource(MR.strings.name)) },
supportingText = { supportingText = {
val msgRes = if (name.isNotEmpty() && nameAlreadyExists) { val msgRes = if (name.isNotEmpty() && nameAlreadyExists) {
MR.strings.error_category_exists MR.strings.error_category_exists
} else { } else {
MR.strings.information_required_plain MR.strings.information_required_plain
} }
Text(text = localize(msgRes)) Text(text = stringResource(msgRes))
}, },
isError = name.isNotEmpty() && nameAlreadyExists, isError = name.isNotEmpty() && nameAlreadyExists,
singleLine = true, singleLine = true,
@ -117,16 +117,16 @@ fun CategoryRenameDialog(
onDismissRequest() onDismissRequest()
}, },
) { ) {
Text(text = localize(MR.strings.action_ok)) Text(text = stringResource(MR.strings.action_ok))
} }
}, },
dismissButton = { dismissButton = {
TextButton(onClick = onDismissRequest) { TextButton(onClick = onDismissRequest) {
Text(text = localize(MR.strings.action_cancel)) Text(text = stringResource(MR.strings.action_cancel))
} }
}, },
title = { title = {
Text(text = localize(MR.strings.action_rename_category)) Text(text = stringResource(MR.strings.action_rename_category))
}, },
text = { text = {
OutlinedTextField( OutlinedTextField(
@ -136,14 +136,14 @@ fun CategoryRenameDialog(
valueHasChanged = name != it valueHasChanged = name != it
name = it name = it
}, },
label = { Text(text = localize(MR.strings.name)) }, label = { Text(text = stringResource(MR.strings.name)) },
supportingText = { supportingText = {
val msgRes = if (valueHasChanged && nameAlreadyExists) { val msgRes = if (valueHasChanged && nameAlreadyExists) {
MR.strings.error_category_exists MR.strings.error_category_exists
} else { } else {
MR.strings.information_required_plain MR.strings.information_required_plain
} }
Text(text = localize(msgRes)) Text(text = stringResource(msgRes))
}, },
isError = valueHasChanged && nameAlreadyExists, isError = valueHasChanged && nameAlreadyExists,
singleLine = true, singleLine = true,
@ -171,19 +171,19 @@ fun CategoryDeleteDialog(
onDelete() onDelete()
onDismissRequest() onDismissRequest()
}) { }) {
Text(text = localize(MR.strings.action_ok)) Text(text = stringResource(MR.strings.action_ok))
} }
}, },
dismissButton = { dismissButton = {
TextButton(onClick = onDismissRequest) { TextButton(onClick = onDismissRequest) {
Text(text = localize(MR.strings.action_cancel)) Text(text = stringResource(MR.strings.action_cancel))
} }
}, },
title = { title = {
Text(text = localize(MR.strings.delete_category)) Text(text = stringResource(MR.strings.delete_category))
}, },
text = { text = {
Text(text = localize(MR.strings.delete_category_confirmation, category.name)) Text(text = stringResource(MR.strings.delete_category_confirmation, category.name))
}, },
) )
} }
@ -200,19 +200,19 @@ fun CategorySortAlphabeticallyDialog(
onSort() onSort()
onDismissRequest() onDismissRequest()
}) { }) {
Text(text = localize(MR.strings.action_ok)) Text(text = stringResource(MR.strings.action_ok))
} }
}, },
dismissButton = { dismissButton = {
TextButton(onClick = onDismissRequest) { TextButton(onClick = onDismissRequest) {
Text(text = localize(MR.strings.action_cancel)) Text(text = stringResource(MR.strings.action_cancel))
} }
}, },
title = { title = {
Text(text = localize(MR.strings.action_sort_category)) Text(text = stringResource(MR.strings.action_sort_category))
}, },
text = { text = {
Text(text = localize(MR.strings.sort_category_confirmation)) Text(text = stringResource(MR.strings.sort_category_confirmation))
}, },
) )
} }
@ -234,14 +234,14 @@ fun ChangeCategoryDialog(
onEditCategories() onEditCategories()
}, },
) { ) {
Text(text = localize(MR.strings.action_edit_categories)) Text(text = stringResource(MR.strings.action_edit_categories))
} }
}, },
title = { title = {
Text(text = localize(MR.strings.action_move_category)) Text(text = stringResource(MR.strings.action_move_category))
}, },
text = { text = {
Text(text = localize(MR.strings.information_empty_category_dialog)) Text(text = stringResource(MR.strings.information_empty_category_dialog))
}, },
) )
return return
@ -255,11 +255,11 @@ fun ChangeCategoryDialog(
onDismissRequest() onDismissRequest()
onEditCategories() onEditCategories()
}) { }) {
Text(text = localize(MR.strings.action_edit)) Text(text = stringResource(MR.strings.action_edit))
} }
Spacer(modifier = Modifier.weight(1f)) Spacer(modifier = Modifier.weight(1f))
tachiyomi.presentation.core.components.material.TextButton(onClick = onDismissRequest) { tachiyomi.presentation.core.components.material.TextButton(onClick = onDismissRequest) {
Text(text = localize(MR.strings.action_cancel)) Text(text = stringResource(MR.strings.action_cancel))
} }
tachiyomi.presentation.core.components.material.TextButton( tachiyomi.presentation.core.components.material.TextButton(
onClick = { onClick = {
@ -274,12 +274,12 @@ fun ChangeCategoryDialog(
) )
}, },
) { ) {
Text(text = localize(MR.strings.action_ok)) Text(text = stringResource(MR.strings.action_ok))
} }
} }
}, },
title = { title = {
Text(text = localize(MR.strings.action_move_category)) Text(text = stringResource(MR.strings.action_move_category))
}, },
text = { text = {
Column( Column(

View File

@ -8,7 +8,7 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.material.ExtendedFloatingActionButton import tachiyomi.presentation.core.components.material.ExtendedFloatingActionButton
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.util.isScrolledToEnd import tachiyomi.presentation.core.util.isScrolledToEnd
import tachiyomi.presentation.core.util.isScrollingUp import tachiyomi.presentation.core.util.isScrollingUp
@ -18,7 +18,7 @@ fun CategoryFloatingActionButton(
onCreate: () -> Unit, onCreate: () -> Unit,
) { ) {
ExtendedFloatingActionButton( ExtendedFloatingActionButton(
text = { Text(text = localize(MR.strings.action_add)) }, text = { Text(text = stringResource(MR.strings.action_add)) },
icon = { Icon(imageVector = Icons.Outlined.Add, contentDescription = null) }, icon = { Icon(imageVector = Icons.Outlined.Add, contentDescription = null) },
onClick = onCreate, onClick = onCreate,
expanded = lazyListState.isScrollingUp() || lazyListState.isScrolledToEnd(), expanded = lazyListState.isScrollingUp() || lazyListState.isScrolledToEnd(),

View File

@ -11,7 +11,6 @@ import androidx.compose.material.icons.outlined.ArrowDropDown
import androidx.compose.material.icons.outlined.ArrowDropUp import androidx.compose.material.icons.outlined.ArrowDropUp
import androidx.compose.material.icons.outlined.Delete import androidx.compose.material.icons.outlined.Delete
import androidx.compose.material.icons.outlined.Edit import androidx.compose.material.icons.outlined.Edit
import androidx.compose.material.icons.outlined.Label
import androidx.compose.material3.ElevatedCard import androidx.compose.material3.ElevatedCard
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton import androidx.compose.material3.IconButton
@ -23,7 +22,7 @@ import androidx.compose.ui.Modifier
import tachiyomi.domain.category.model.Category import tachiyomi.domain.category.model.Category
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.padding
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
@Composable @Composable
fun CategoryListItem( fun CategoryListItem(
@ -74,11 +73,11 @@ fun CategoryListItem(
IconButton(onClick = onRename) { IconButton(onClick = onRename) {
Icon( Icon(
imageVector = Icons.Outlined.Edit, imageVector = Icons.Outlined.Edit,
contentDescription = localize(MR.strings.action_rename_category), contentDescription = stringResource(MR.strings.action_rename_category),
) )
} }
IconButton(onClick = onDelete) { IconButton(onClick = onDelete) {
Icon(imageVector = Icons.Outlined.Delete, contentDescription = localize(MR.strings.action_delete)) Icon(imageVector = Icons.Outlined.Delete, contentDescription = stringResource(MR.strings.action_delete))
} }
} }
} }

View File

@ -50,10 +50,9 @@ import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import eu.kanade.tachiyomi.R
import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.ImmutableList
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.util.clearFocusOnSoftKeyboardHide import tachiyomi.presentation.core.util.clearFocusOnSoftKeyboardHide
import tachiyomi.presentation.core.util.runOnEnterKeyPressed import tachiyomi.presentation.core.util.runOnEnterKeyPressed
import tachiyomi.presentation.core.util.secondaryItemAlpha import tachiyomi.presentation.core.util.secondaryItemAlpha
@ -135,7 +134,7 @@ fun AppBar(
IconButton(onClick = onCancelActionMode) { IconButton(onClick = onCancelActionMode) {
Icon( Icon(
imageVector = Icons.Outlined.Close, imageVector = Icons.Outlined.Close,
contentDescription = localize(MR.strings.action_cancel), contentDescription = stringResource(MR.strings.action_cancel),
) )
} }
} else { } else {
@ -220,7 +219,7 @@ fun AppBarActions(
positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(), positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(),
tooltip = { tooltip = {
PlainTooltip { PlainTooltip {
Text(stringResource(R.string.abc_action_menu_overflow_description)) Text(stringResource(MR.strings.action_menu_overflow_description))
} }
}, },
state = rememberTooltipState(), state = rememberTooltipState(),
@ -230,7 +229,7 @@ fun AppBarActions(
) { ) {
Icon( Icon(
Icons.Outlined.MoreVert, Icons.Outlined.MoreVert,
contentDescription = stringResource(R.string.abc_action_menu_overflow_description), contentDescription = stringResource(MR.strings.action_menu_overflow_description),
) )
} }
} }
@ -319,7 +318,7 @@ fun SearchToolbar(
placeholder = { placeholder = {
Text( Text(
modifier = Modifier.secondaryItemAlpha(), modifier = Modifier.secondaryItemAlpha(),
text = (placeholderText ?: localize(MR.strings.action_search_hint)), text = (placeholderText ?: stringResource(MR.strings.action_search_hint)),
maxLines = 1, maxLines = 1,
overflow = TextOverflow.Ellipsis, overflow = TextOverflow.Ellipsis,
style = MaterialTheme.typography.titleMedium.copy( style = MaterialTheme.typography.titleMedium.copy(
@ -344,7 +343,7 @@ fun SearchToolbar(
positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(), positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(),
tooltip = { tooltip = {
PlainTooltip { PlainTooltip {
Text(localize(MR.strings.action_search)) Text(stringResource(MR.strings.action_search))
} }
}, },
state = rememberTooltipState(), state = rememberTooltipState(),
@ -354,7 +353,7 @@ fun SearchToolbar(
) { ) {
Icon( Icon(
Icons.Outlined.Search, Icons.Outlined.Search,
contentDescription = localize(MR.strings.action_search), contentDescription = stringResource(MR.strings.action_search),
) )
} }
} }
@ -363,7 +362,7 @@ fun SearchToolbar(
positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(), positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(),
tooltip = { tooltip = {
PlainTooltip { PlainTooltip {
Text(localize(MR.strings.action_reset)) Text(stringResource(MR.strings.action_reset))
} }
}, },
state = rememberTooltipState(), state = rememberTooltipState(),
@ -376,7 +375,7 @@ fun SearchToolbar(
) { ) {
Icon( Icon(
Icons.Outlined.Close, Icons.Outlined.Close,
contentDescription = localize(MR.strings.action_reset), contentDescription = stringResource(MR.strings.action_reset),
) )
} }
} }
@ -396,7 +395,7 @@ fun UpIcon(navigationIcon: ImageVector? = null) {
?: Icons.AutoMirrored.Outlined.ArrowBack ?: Icons.AutoMirrored.Outlined.ArrowBack
Icon( Icon(
imageVector = icon, imageVector = icon,
contentDescription = stringResource(R.string.abc_action_bar_up_description), contentDescription = stringResource(MR.strings.action_bar_up_description),
) )
} }

View File

@ -32,7 +32,7 @@ import androidx.compose.ui.util.fastMap
import androidx.compose.ui.util.fastMaxBy import androidx.compose.ui.util.fastMaxBy
import dev.icerock.moko.resources.StringResource import dev.icerock.moko.resources.StringResource
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
val DownloadedOnlyBannerBackgroundColor val DownloadedOnlyBannerBackgroundColor
@Composable get() = MaterialTheme.colorScheme.tertiary @Composable get() = MaterialTheme.colorScheme.tertiary
@ -47,7 +47,7 @@ fun WarningBanner(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
Text( Text(
text = localize(textRes), text = stringResource(textRes),
modifier = modifier modifier = modifier
.fillMaxWidth() .fillMaxWidth()
.background(MaterialTheme.colorScheme.error) .background(MaterialTheme.colorScheme.error)
@ -127,7 +127,7 @@ fun AppStateBanners(
@Composable @Composable
private fun DownloadedOnlyModeBanner(modifier: Modifier = Modifier) { private fun DownloadedOnlyModeBanner(modifier: Modifier = Modifier) {
Text( Text(
text = localize(MR.strings.label_downloaded_only), text = stringResource(MR.strings.label_downloaded_only),
modifier = Modifier modifier = Modifier
.background(DownloadedOnlyBannerBackgroundColor) .background(DownloadedOnlyBannerBackgroundColor)
.fillMaxWidth() .fillMaxWidth()
@ -142,7 +142,7 @@ private fun DownloadedOnlyModeBanner(modifier: Modifier = Modifier) {
@Composable @Composable
private fun IncognitoModeBanner(modifier: Modifier = Modifier) { private fun IncognitoModeBanner(modifier: Modifier = Modifier) {
Text( Text(
text = localize(MR.strings.pref_incognito_mode), text = stringResource(MR.strings.pref_incognito_mode),
modifier = Modifier modifier = Modifier
.background(IncognitoModeBannerBackgroundColor) .background(IncognitoModeBannerBackgroundColor)
.fillMaxWidth() .fillMaxWidth()
@ -173,7 +173,7 @@ private fun IndexingDownloadBanner(modifier: Modifier = Modifier) {
) )
Spacer(modifier = Modifier.width(8.dp)) Spacer(modifier = Modifier.width(8.dp))
Text( Text(
text = localize(MR.strings.download_notifier_cache_renewal), text = stringResource(MR.strings.download_notifier_cache_renewal),
color = MaterialTheme.colorScheme.onSecondary, color = MaterialTheme.colorScheme.onSecondary,
textAlign = TextAlign.Center, textAlign = TextAlign.Center,
style = MaterialTheme.typography.labelMedium, style = MaterialTheme.typography.labelMedium,

View File

@ -5,8 +5,8 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import eu.kanade.presentation.manga.DownloadAction import eu.kanade.presentation.manga.DownloadAction
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.pluralStringResource
import tachiyomi.presentation.core.i18n.localizePlural import tachiyomi.presentation.core.i18n.stringResource
@Composable @Composable
fun DownloadDropdownMenu( fun DownloadDropdownMenu(
@ -19,11 +19,11 @@ fun DownloadDropdownMenu(
onDismissRequest = onDismissRequest, onDismissRequest = onDismissRequest,
) { ) {
listOfNotNull( listOfNotNull(
DownloadAction.NEXT_1_CHAPTER to localizePlural(MR.plurals.download_amount, 1, 1), DownloadAction.NEXT_1_CHAPTER to pluralStringResource(MR.plurals.download_amount, 1, 1),
DownloadAction.NEXT_5_CHAPTERS to localizePlural(MR.plurals.download_amount, 5, 5), DownloadAction.NEXT_5_CHAPTERS to pluralStringResource(MR.plurals.download_amount, 5, 5),
DownloadAction.NEXT_10_CHAPTERS to localizePlural(MR.plurals.download_amount, 10, 10), DownloadAction.NEXT_10_CHAPTERS to pluralStringResource(MR.plurals.download_amount, 10, 10),
DownloadAction.NEXT_25_CHAPTERS to localizePlural(MR.plurals.download_amount, 25, 25), DownloadAction.NEXT_25_CHAPTERS to pluralStringResource(MR.plurals.download_amount, 25, 25),
DownloadAction.UNREAD_CHAPTERS to localize(MR.strings.download_unread), DownloadAction.UNREAD_CHAPTERS to stringResource(MR.strings.download_unread),
).map { (downloadAction, string) -> ).map { (downloadAction, string) ->
DropdownMenuItem( DropdownMenuItem(
text = { Text(text = string) }, text = { Text(text = string) },

View File

@ -19,7 +19,7 @@ import androidx.compose.ui.unit.DpOffset
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.PopupProperties import androidx.compose.ui.window.PopupProperties
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import androidx.compose.material3.DropdownMenu as ComposeDropdownMenu import androidx.compose.material3.DropdownMenu as ComposeDropdownMenu
@Composable @Composable
@ -54,13 +54,13 @@ fun RadioMenuItem(
if (isChecked) { if (isChecked) {
Icon( Icon(
imageVector = Icons.Outlined.RadioButtonChecked, imageVector = Icons.Outlined.RadioButtonChecked,
contentDescription = localize(MR.strings.selected), contentDescription = stringResource(MR.strings.selected),
tint = MaterialTheme.colorScheme.primary, tint = MaterialTheme.colorScheme.primary,
) )
} else { } else {
Icon( Icon(
imageVector = Icons.Outlined.RadioButtonUnchecked, imageVector = Icons.Outlined.RadioButtonUnchecked,
contentDescription = localize(MR.strings.not_selected), contentDescription = stringResource(MR.strings.not_selected),
) )
} }
}, },

View File

@ -31,7 +31,7 @@ import kotlinx.coroutines.launch
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.HorizontalPager import tachiyomi.presentation.core.components.HorizontalPager
import tachiyomi.presentation.core.components.material.TabText import tachiyomi.presentation.core.components.material.TabText
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
object TabbedDialogPaddings { object TabbedDialogPaddings {
val Horizontal = 24.dp val Horizontal = 24.dp
@ -94,7 +94,7 @@ private fun MoreMenu(
IconButton(onClick = { expanded = true }) { IconButton(onClick = { expanded = true }) {
Icon( Icon(
imageVector = Icons.Default.MoreVert, imageVector = Icons.Default.MoreVert,
contentDescription = localize(MR.strings.label_more), contentDescription = stringResource(MR.strings.label_more),
) )
} }
DropdownMenu( DropdownMenu(

View File

@ -26,7 +26,7 @@ import kotlinx.coroutines.launch
import tachiyomi.presentation.core.components.HorizontalPager import tachiyomi.presentation.core.components.HorizontalPager
import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.Scaffold
import tachiyomi.presentation.core.components.material.TabText import tachiyomi.presentation.core.components.material.TabText
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
@Composable @Composable
fun TabbedScreen( fun TabbedScreen(
@ -52,7 +52,7 @@ fun TabbedScreen(
val searchEnabled = tab.searchEnabled val searchEnabled = tab.searchEnabled
SearchToolbar( SearchToolbar(
titleContent = { AppBarTitle(localize(titleRes)) }, titleContent = { AppBarTitle(stringResource(titleRes)) },
searchEnabled = searchEnabled, searchEnabled = searchEnabled,
searchQuery = if (searchEnabled) searchQuery else null, searchQuery = if (searchEnabled) searchQuery else null,
onChangeSearchQuery = onChangeSearchQuery, onChangeSearchQuery = onChangeSearchQuery,
@ -75,7 +75,7 @@ fun TabbedScreen(
Tab( Tab(
selected = state.currentPage == index, selected = state.currentPage == index,
onClick = { scope.launch { state.animateScrollToPage(index) } }, onClick = { scope.launch { state.animateScrollToPage(index) } },
text = { TabText(text = localize(tab.titleRes), badgeCount = tab.badgeNumber) }, text = { TabText(text = stringResource(tab.titleRes), badgeCount = tab.badgeNumber) },
unselectedContentColor = MaterialTheme.colorScheme.onSurface, unselectedContentColor = MaterialTheme.colorScheme.onSurface,
) )
} }

View File

@ -19,7 +19,7 @@ import eu.kanade.tachiyomi.util.CrashLogUtil
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.padding
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.screens.InfoScreen import tachiyomi.presentation.core.screens.InfoScreen
@Composable @Composable
@ -32,15 +32,15 @@ fun CrashScreen(
InfoScreen( InfoScreen(
icon = Icons.Outlined.BugReport, icon = Icons.Outlined.BugReport,
headingText = localize(MR.strings.crash_screen_title), headingText = stringResource(MR.strings.crash_screen_title),
subtitleText = localize(MR.strings.crash_screen_description, localize(MR.strings.app_name)), subtitleText = stringResource(MR.strings.crash_screen_description, stringResource(MR.strings.app_name)),
acceptText = localize(MR.strings.pref_dump_crash_logs), acceptText = stringResource(MR.strings.pref_dump_crash_logs),
onAcceptClick = { onAcceptClick = {
scope.launch { scope.launch {
CrashLogUtil(context).dumpLogs() CrashLogUtil(context).dumpLogs()
} }
}, },
rejectText = localize(MR.strings.crash_screen_restart_application), rejectText = stringResource(MR.strings.crash_screen_restart_application),
onRejectClick = onRestartClick, onRejectClick = onRestartClick,
) { ) {
Box( Box(

View File

@ -27,7 +27,7 @@ import tachiyomi.domain.history.model.HistoryWithRelations
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.FastScrollLazyColumn import tachiyomi.presentation.core.components.FastScrollLazyColumn
import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.Scaffold
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.EmptyScreen
import tachiyomi.presentation.core.screens.LoadingScreen import tachiyomi.presentation.core.screens.LoadingScreen
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
@ -47,14 +47,14 @@ fun HistoryScreen(
Scaffold( Scaffold(
topBar = { scrollBehavior -> topBar = { scrollBehavior ->
SearchToolbar( SearchToolbar(
titleContent = { AppBarTitle(localize(MR.strings.history)) }, titleContent = { AppBarTitle(stringResource(MR.strings.history)) },
searchQuery = state.searchQuery, searchQuery = state.searchQuery,
onChangeSearchQuery = onSearchQueryChange, onChangeSearchQuery = onSearchQueryChange,
actions = { actions = {
AppBarActions( AppBarActions(
persistentListOf( persistentListOf(
AppBar.Action( AppBar.Action(
title = localize(MR.strings.pref_clear_history), title = stringResource(MR.strings.pref_clear_history),
icon = Icons.Outlined.DeleteSweep, icon = Icons.Outlined.DeleteSweep,
onClick = { onClick = {
onDialogChange(HistoryScreenModel.Dialog.DeleteAll) onDialogChange(HistoryScreenModel.Dialog.DeleteAll)

View File

@ -15,7 +15,7 @@ import androidx.compose.ui.unit.dp
import eu.kanade.presentation.theme.TachiyomiTheme import eu.kanade.presentation.theme.TachiyomiTheme
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.LabeledCheckbox import tachiyomi.presentation.core.components.LabeledCheckbox
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
@Composable @Composable
fun HistoryDeleteDialog( fun HistoryDeleteDialog(
@ -26,16 +26,16 @@ fun HistoryDeleteDialog(
AlertDialog( AlertDialog(
title = { title = {
Text(text = localize(MR.strings.action_remove)) Text(text = stringResource(MR.strings.action_remove))
}, },
text = { text = {
Column( Column(
verticalArrangement = Arrangement.spacedBy(8.dp), verticalArrangement = Arrangement.spacedBy(8.dp),
) { ) {
Text(text = localize(MR.strings.dialog_with_checkbox_remove_description)) Text(text = stringResource(MR.strings.dialog_with_checkbox_remove_description))
LabeledCheckbox( LabeledCheckbox(
label = localize(MR.strings.dialog_with_checkbox_reset), label = stringResource(MR.strings.dialog_with_checkbox_reset),
checked = removeEverything, checked = removeEverything,
onCheckedChange = { removeEverything = it }, onCheckedChange = { removeEverything = it },
) )
@ -47,12 +47,12 @@ fun HistoryDeleteDialog(
onDelete(removeEverything) onDelete(removeEverything)
onDismissRequest() onDismissRequest()
}) { }) {
Text(text = localize(MR.strings.action_remove)) Text(text = stringResource(MR.strings.action_remove))
} }
}, },
dismissButton = { dismissButton = {
TextButton(onClick = onDismissRequest) { TextButton(onClick = onDismissRequest) {
Text(text = localize(MR.strings.action_cancel)) Text(text = stringResource(MR.strings.action_cancel))
} }
}, },
) )
@ -65,10 +65,10 @@ fun HistoryDeleteAllDialog(
) { ) {
AlertDialog( AlertDialog(
title = { title = {
Text(text = localize(MR.strings.action_remove_everything)) Text(text = stringResource(MR.strings.action_remove_everything))
}, },
text = { text = {
Text(text = localize(MR.strings.clear_history_confirmation)) Text(text = stringResource(MR.strings.clear_history_confirmation))
}, },
onDismissRequest = onDismissRequest, onDismissRequest = onDismissRequest,
confirmButton = { confirmButton = {
@ -76,12 +76,12 @@ fun HistoryDeleteAllDialog(
onDelete() onDelete()
onDismissRequest() onDismissRequest()
}) { }) {
Text(text = localize(MR.strings.action_ok)) Text(text = stringResource(MR.strings.action_ok))
} }
}, },
dismissButton = { dismissButton = {
TextButton(onClick = onDismissRequest) { TextButton(onClick = onDismissRequest) {
Text(text = localize(MR.strings.action_cancel)) Text(text = stringResource(MR.strings.action_cancel))
} }
}, },
) )

View File

@ -29,7 +29,7 @@ import eu.kanade.tachiyomi.util.lang.toTimestampString
import tachiyomi.domain.history.model.HistoryWithRelations import tachiyomi.domain.history.model.HistoryWithRelations
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.padding
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
private val HistoryItemHeight = 96.dp private val HistoryItemHeight = 96.dp
@ -69,7 +69,7 @@ fun HistoryItem(
val readAt = remember { history.readAt?.toTimestampString() ?: "" } val readAt = remember { history.readAt?.toTimestampString() ?: "" }
Text( Text(
text = if (history.chapterNumber > -1) { text = if (history.chapterNumber > -1) {
localize( stringResource(
MR.strings.recent_manga_time, MR.strings.recent_manga_time,
formatChapterNumber(history.chapterNumber), formatChapterNumber(history.chapterNumber),
readAt, readAt,
@ -85,7 +85,7 @@ fun HistoryItem(
IconButton(onClick = onClickDelete) { IconButton(onClick = onClickDelete) {
Icon( Icon(
imageVector = Icons.Outlined.Delete, imageVector = Icons.Outlined.Delete,
contentDescription = localize(MR.strings.action_delete), contentDescription = stringResource(MR.strings.action_delete),
tint = MaterialTheme.colorScheme.onSurface, tint = MaterialTheme.colorScheme.onSurface,
) )
} }

View File

@ -13,7 +13,7 @@ import dev.icerock.moko.resources.StringResource
import tachiyomi.core.preference.CheckboxState import tachiyomi.core.preference.CheckboxState
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.LabeledCheckbox import tachiyomi.presentation.core.components.LabeledCheckbox
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
@Composable @Composable
fun DeleteLibraryMangaDialog( fun DeleteLibraryMangaDialog(
@ -35,7 +35,7 @@ fun DeleteLibraryMangaDialog(
onDismissRequest = onDismissRequest, onDismissRequest = onDismissRequest,
dismissButton = { dismissButton = {
TextButton(onClick = onDismissRequest) { TextButton(onClick = onDismissRequest) {
Text(text = localize(MR.strings.action_cancel)) Text(text = stringResource(MR.strings.action_cancel))
} }
}, },
confirmButton = { confirmButton = {
@ -49,17 +49,17 @@ fun DeleteLibraryMangaDialog(
) )
}, },
) { ) {
Text(text = localize(MR.strings.action_ok)) Text(text = stringResource(MR.strings.action_ok))
} }
}, },
title = { title = {
Text(text = localize(MR.strings.action_remove)) Text(text = stringResource(MR.strings.action_remove))
}, },
text = { text = {
Column { Column {
list.forEach { state -> list.forEach { state ->
LabeledCheckbox( LabeledCheckbox(
label = localize(state.value), label = stringResource(state.value),
checked = state.isChecked, checked = state.isChecked,
onCheckedChange = { onCheckedChange = {
val index = list.indexOf(state) val index = list.indexOf(state)

View File

@ -30,7 +30,7 @@ import tachiyomi.presentation.core.components.SettingsChipRow
import tachiyomi.presentation.core.components.SliderItem import tachiyomi.presentation.core.components.SliderItem
import tachiyomi.presentation.core.components.SortItem import tachiyomi.presentation.core.components.SortItem
import tachiyomi.presentation.core.components.TriStateItem import tachiyomi.presentation.core.components.TriStateItem
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.util.collectAsState import tachiyomi.presentation.core.util.collectAsState
@Composable @Composable
@ -42,9 +42,9 @@ fun LibrarySettingsDialog(
TabbedDialog( TabbedDialog(
onDismissRequest = onDismissRequest, onDismissRequest = onDismissRequest,
tabTitles = persistentListOf( tabTitles = persistentListOf(
localize(MR.strings.action_filter), stringResource(MR.strings.action_filter),
localize(MR.strings.action_sort), stringResource(MR.strings.action_sort),
localize(MR.strings.action_display), stringResource(MR.strings.action_display),
), ),
) { page -> ) { page ->
Column( Column(
@ -75,7 +75,7 @@ private fun ColumnScope.FilterPage(
val filterDownloaded by screenModel.libraryPreferences.filterDownloaded().collectAsState() val filterDownloaded by screenModel.libraryPreferences.filterDownloaded().collectAsState()
val downloadedOnly by screenModel.preferences.downloadedOnly().collectAsState() val downloadedOnly by screenModel.preferences.downloadedOnly().collectAsState()
TriStateItem( TriStateItem(
label = localize(MR.strings.label_downloaded), label = stringResource(MR.strings.label_downloaded),
state = if (downloadedOnly) { state = if (downloadedOnly) {
TriState.ENABLED_IS TriState.ENABLED_IS
} else { } else {
@ -86,25 +86,25 @@ private fun ColumnScope.FilterPage(
) )
val filterUnread by screenModel.libraryPreferences.filterUnread().collectAsState() val filterUnread by screenModel.libraryPreferences.filterUnread().collectAsState()
TriStateItem( TriStateItem(
label = localize(MR.strings.action_filter_unread), label = stringResource(MR.strings.action_filter_unread),
state = filterUnread, state = filterUnread,
onClick = { screenModel.toggleFilter(LibraryPreferences::filterUnread) }, onClick = { screenModel.toggleFilter(LibraryPreferences::filterUnread) },
) )
val filterStarted by screenModel.libraryPreferences.filterStarted().collectAsState() val filterStarted by screenModel.libraryPreferences.filterStarted().collectAsState()
TriStateItem( TriStateItem(
label = localize(MR.strings.label_started), label = stringResource(MR.strings.label_started),
state = filterStarted, state = filterStarted,
onClick = { screenModel.toggleFilter(LibraryPreferences::filterStarted) }, onClick = { screenModel.toggleFilter(LibraryPreferences::filterStarted) },
) )
val filterBookmarked by screenModel.libraryPreferences.filterBookmarked().collectAsState() val filterBookmarked by screenModel.libraryPreferences.filterBookmarked().collectAsState()
TriStateItem( TriStateItem(
label = localize(MR.strings.action_filter_bookmarked), label = stringResource(MR.strings.action_filter_bookmarked),
state = filterBookmarked, state = filterBookmarked,
onClick = { screenModel.toggleFilter(LibraryPreferences::filterBookmarked) }, onClick = { screenModel.toggleFilter(LibraryPreferences::filterBookmarked) },
) )
val filterCompleted by screenModel.libraryPreferences.filterCompleted().collectAsState() val filterCompleted by screenModel.libraryPreferences.filterCompleted().collectAsState()
TriStateItem( TriStateItem(
label = localize(MR.strings.completed), label = stringResource(MR.strings.completed),
state = filterCompleted, state = filterCompleted,
onClick = { screenModel.toggleFilter(LibraryPreferences::filterCompleted) }, onClick = { screenModel.toggleFilter(LibraryPreferences::filterCompleted) },
) )
@ -118,7 +118,7 @@ private fun ColumnScope.FilterPage(
val service = trackers[0] val service = trackers[0]
val filterTracker by screenModel.libraryPreferences.filterTracking(service.id.toInt()).collectAsState() val filterTracker by screenModel.libraryPreferences.filterTracking(service.id.toInt()).collectAsState()
TriStateItem( TriStateItem(
label = localize(MR.strings.action_filter_tracked), label = stringResource(MR.strings.action_filter_tracked),
state = filterTracker, state = filterTracker,
onClick = { screenModel.toggleTracker(service.id.toInt()) }, onClick = { screenModel.toggleTracker(service.id.toInt()) },
) )
@ -163,7 +163,7 @@ private fun ColumnScope.SortPage(
MR.strings.action_sort_date_added to LibrarySort.Type.DateAdded, MR.strings.action_sort_date_added to LibrarySort.Type.DateAdded,
).plus(trackerSortOption).map { (titleRes, mode) -> ).plus(trackerSortOption).map { (titleRes, mode) ->
SortItem( SortItem(
label = localize(titleRes), label = stringResource(titleRes),
sortDescending = sortDescending.takeIf { sortingMode == mode }, sortDescending = sortDescending.takeIf { sortingMode == mode },
onClick = { onClick = {
val isTogglingDirection = sortingMode == mode val isTogglingDirection = sortingMode == mode
@ -202,7 +202,7 @@ private fun ColumnScope.DisplayPage(
FilterChip( FilterChip(
selected = displayMode == mode, selected = displayMode == mode,
onClick = { screenModel.setDisplayMode(mode) }, onClick = { screenModel.setDisplayMode(mode) },
label = { Text(localize(titleRes)) }, label = { Text(stringResource(titleRes)) },
) )
} }
} }
@ -219,13 +219,13 @@ private fun ColumnScope.DisplayPage(
val columns by columnPreference.collectAsState() val columns by columnPreference.collectAsState()
SliderItem( SliderItem(
label = localize(MR.strings.pref_library_columns), label = stringResource(MR.strings.pref_library_columns),
max = 10, max = 10,
value = columns, value = columns,
valueText = if (columns > 0) { valueText = if (columns > 0) {
localize(MR.strings.pref_library_columns_per_row, columns) stringResource(MR.strings.pref_library_columns_per_row, columns)
} else { } else {
localize(MR.strings.label_default) stringResource(MR.strings.label_default)
}, },
onChange = columnPreference::set, onChange = columnPreference::set,
) )
@ -233,29 +233,29 @@ private fun ColumnScope.DisplayPage(
HeadingItem(MR.strings.overlay_header) HeadingItem(MR.strings.overlay_header)
CheckboxItem( CheckboxItem(
label = localize(MR.strings.action_display_download_badge), label = stringResource(MR.strings.action_display_download_badge),
pref = screenModel.libraryPreferences.downloadBadge(), pref = screenModel.libraryPreferences.downloadBadge(),
) )
CheckboxItem( CheckboxItem(
label = localize(MR.strings.action_display_local_badge), label = stringResource(MR.strings.action_display_local_badge),
pref = screenModel.libraryPreferences.localBadge(), pref = screenModel.libraryPreferences.localBadge(),
) )
CheckboxItem( CheckboxItem(
label = localize(MR.strings.action_display_language_badge), label = stringResource(MR.strings.action_display_language_badge),
pref = screenModel.libraryPreferences.languageBadge(), pref = screenModel.libraryPreferences.languageBadge(),
) )
CheckboxItem( CheckboxItem(
label = localize(MR.strings.action_display_show_continue_reading_button), label = stringResource(MR.strings.action_display_show_continue_reading_button),
pref = screenModel.libraryPreferences.showContinueReadingButton(), pref = screenModel.libraryPreferences.showContinueReadingButton(),
) )
HeadingItem(MR.strings.tabs_header) HeadingItem(MR.strings.tabs_header)
CheckboxItem( CheckboxItem(
label = localize(MR.strings.action_display_show_tabs), label = stringResource(MR.strings.action_display_show_tabs),
pref = screenModel.libraryPreferences.categoryTabs(), pref = screenModel.libraryPreferences.categoryTabs(),
) )
CheckboxItem( CheckboxItem(
label = localize(MR.strings.action_display_show_number_of_items), label = stringResource(MR.strings.action_display_show_number_of_items),
pref = screenModel.libraryPreferences.categoryNumberOfItems(), pref = screenModel.libraryPreferences.categoryNumberOfItems(),
) )
} }

View File

@ -40,7 +40,7 @@ import androidx.compose.ui.unit.sp
import eu.kanade.presentation.manga.components.MangaCover import eu.kanade.presentation.manga.components.MangaCover
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.BadgeGroup import tachiyomi.presentation.core.components.BadgeGroup
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.util.selectedBackground import tachiyomi.presentation.core.util.selectedBackground
object CommonMangaItemDefaults { object CommonMangaItemDefaults {
@ -378,7 +378,7 @@ private fun ContinueReadingButton(
) { ) {
Icon( Icon(
imageVector = Icons.Filled.PlayArrow, imageVector = Icons.Filled.PlayArrow,
contentDescription = localize(MR.strings.action_resume), contentDescription = stringResource(MR.strings.action_resume),
modifier = Modifier.size(16.dp), modifier = Modifier.size(16.dp),
) )
} }

View File

@ -6,7 +6,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.zIndex import androidx.compose.ui.zIndex
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
@Composable @Composable
internal fun GlobalSearchItem( internal fun GlobalSearchItem(
@ -19,7 +19,7 @@ internal fun GlobalSearchItem(
onClick = onClick, onClick = onClick,
) { ) {
Text( Text(
text = localize(MR.strings.action_global_search_query, searchQuery), text = stringResource(MR.strings.action_global_search_query, searchQuery),
modifier = Modifier.zIndex(99f), modifier = Modifier.zIndex(99f),
) )
} }

View File

@ -22,7 +22,7 @@ import eu.kanade.presentation.components.SearchToolbar
import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentListOf
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.Pill import tachiyomi.presentation.core.components.Pill
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.theme.active import tachiyomi.presentation.core.theme.active
@Composable @Composable
@ -98,21 +98,21 @@ private fun LibraryRegularToolbar(
AppBarActions( AppBarActions(
persistentListOf( persistentListOf(
AppBar.Action( AppBar.Action(
title = localize(MR.strings.action_filter), title = stringResource(MR.strings.action_filter),
icon = Icons.Outlined.FilterList, icon = Icons.Outlined.FilterList,
iconTint = filterTint, iconTint = filterTint,
onClick = onClickFilter, onClick = onClickFilter,
), ),
AppBar.OverflowAction( AppBar.OverflowAction(
title = localize(MR.strings.action_update_library), title = stringResource(MR.strings.action_update_library),
onClick = onClickGlobalUpdate, onClick = onClickGlobalUpdate,
), ),
AppBar.OverflowAction( AppBar.OverflowAction(
title = localize(MR.strings.action_update_category), title = stringResource(MR.strings.action_update_category),
onClick = onClickRefresh, onClick = onClickRefresh,
), ),
AppBar.OverflowAction( AppBar.OverflowAction(
title = localize(MR.strings.action_open_random_manga), title = stringResource(MR.strings.action_open_random_manga),
onClick = onClickOpenRandomManga, onClick = onClickOpenRandomManga,
), ),
), ),
@ -135,12 +135,12 @@ private fun LibrarySelectionToolbar(
AppBarActions( AppBarActions(
persistentListOf( persistentListOf(
AppBar.Action( AppBar.Action(
title = localize(MR.strings.action_select_all), title = stringResource(MR.strings.action_select_all),
icon = Icons.Outlined.SelectAll, icon = Icons.Outlined.SelectAll,
onClick = onClickSelectAll, onClick = onClickSelectAll,
), ),
AppBar.Action( AppBar.Action(
title = localize(MR.strings.action_select_inverse), title = stringResource(MR.strings.action_select_inverse),
icon = Icons.Outlined.FlipToBack, icon = Icons.Outlined.FlipToBack,
onClick = onClickInvertSelection, onClick = onClickInvertSelection,
), ),

View File

@ -38,7 +38,7 @@ import tachiyomi.presentation.core.components.LabeledCheckbox
import tachiyomi.presentation.core.components.RadioItem import tachiyomi.presentation.core.components.RadioItem
import tachiyomi.presentation.core.components.SortItem import tachiyomi.presentation.core.components.SortItem
import tachiyomi.presentation.core.components.TriStateItem import tachiyomi.presentation.core.components.TriStateItem
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.theme.active import tachiyomi.presentation.core.theme.active
@Composable @Composable
@ -66,20 +66,20 @@ fun ChapterSettingsDialog(
TabbedDialog( TabbedDialog(
onDismissRequest = onDismissRequest, onDismissRequest = onDismissRequest,
tabTitles = persistentListOf( tabTitles = persistentListOf(
localize(MR.strings.action_filter), stringResource(MR.strings.action_filter),
localize(MR.strings.action_sort), stringResource(MR.strings.action_sort),
localize(MR.strings.action_display), stringResource(MR.strings.action_display),
), ),
tabOverflowMenuContent = { closeMenu -> tabOverflowMenuContent = { closeMenu ->
DropdownMenuItem( DropdownMenuItem(
text = { Text(localize(MR.strings.set_chapter_settings_as_default)) }, text = { Text(stringResource(MR.strings.set_chapter_settings_as_default)) },
onClick = { onClick = {
showSetAsDefaultDialog = true showSetAsDefaultDialog = true
closeMenu() closeMenu()
}, },
) )
DropdownMenuItem( DropdownMenuItem(
text = { Text(localize(MR.strings.action_reset)) }, text = { Text(stringResource(MR.strings.action_reset)) },
onClick = { onClick = {
onResetToDefault() onResetToDefault()
closeMenu() closeMenu()
@ -136,17 +136,17 @@ private fun ColumnScope.FilterPage(
onScanlatorFilterClicked: (() -> Unit), onScanlatorFilterClicked: (() -> Unit),
) { ) {
TriStateItem( TriStateItem(
label = localize(MR.strings.label_downloaded), label = stringResource(MR.strings.label_downloaded),
state = downloadFilter, state = downloadFilter,
onClick = onDownloadFilterChanged, onClick = onDownloadFilterChanged,
) )
TriStateItem( TriStateItem(
label = localize(MR.strings.action_filter_unread), label = stringResource(MR.strings.action_filter_unread),
state = unreadFilter, state = unreadFilter,
onClick = onUnreadFilterChanged, onClick = onUnreadFilterChanged,
) )
TriStateItem( TriStateItem(
label = localize(MR.strings.action_filter_bookmarked), label = stringResource(MR.strings.action_filter_bookmarked),
state = bookmarkedFilter, state = bookmarkedFilter,
onClick = onBookmarkedFilterChanged, onClick = onBookmarkedFilterChanged,
) )
@ -179,7 +179,7 @@ fun ScanlatorFilterItem(
}, },
) )
Text( Text(
text = localize(MR.strings.scanlator), text = stringResource(MR.strings.scanlator),
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodyMedium,
) )
} }
@ -198,7 +198,7 @@ private fun ColumnScope.SortPage(
MR.strings.action_sort_alpha to Manga.CHAPTER_SORTING_ALPHABET, MR.strings.action_sort_alpha to Manga.CHAPTER_SORTING_ALPHABET,
).map { (titleRes, mode) -> ).map { (titleRes, mode) ->
SortItem( SortItem(
label = localize(titleRes), label = stringResource(titleRes),
sortDescending = sortDescending.takeIf { sortingMode == mode }, sortDescending = sortDescending.takeIf { sortingMode == mode },
onClick = { onItemSelected(mode) }, onClick = { onItemSelected(mode) },
) )
@ -215,7 +215,7 @@ private fun ColumnScope.DisplayPage(
MR.strings.show_chapter_number to Manga.CHAPTER_DISPLAY_NUMBER, MR.strings.show_chapter_number to Manga.CHAPTER_DISPLAY_NUMBER,
).map { (titleRes, mode) -> ).map { (titleRes, mode) ->
RadioItem( RadioItem(
label = localize(titleRes), label = stringResource(titleRes),
selected = displayMode == mode, selected = displayMode == mode,
onClick = { onItemSelected(mode) }, onClick = { onItemSelected(mode) },
) )
@ -231,15 +231,15 @@ private fun SetAsDefaultDialog(
AlertDialog( AlertDialog(
onDismissRequest = onDismissRequest, onDismissRequest = onDismissRequest,
title = { Text(text = localize(MR.strings.chapter_settings)) }, title = { Text(text = stringResource(MR.strings.chapter_settings)) },
text = { text = {
Column( Column(
verticalArrangement = Arrangement.spacedBy(12.dp), verticalArrangement = Arrangement.spacedBy(12.dp),
) { ) {
Text(text = localize(MR.strings.confirm_set_chapter_settings)) Text(text = stringResource(MR.strings.confirm_set_chapter_settings))
LabeledCheckbox( LabeledCheckbox(
label = localize(MR.strings.also_set_chapter_settings_for_library), label = stringResource(MR.strings.also_set_chapter_settings_for_library),
checked = optionalChecked, checked = optionalChecked,
onCheckedChange = { optionalChecked = it }, onCheckedChange = { optionalChecked = it },
) )
@ -247,7 +247,7 @@ private fun SetAsDefaultDialog(
}, },
dismissButton = { dismissButton = {
TextButton(onClick = onDismissRequest) { TextButton(onClick = onDismissRequest) {
Text(text = localize(MR.strings.action_cancel)) Text(text = stringResource(MR.strings.action_cancel))
} }
}, },
confirmButton = { confirmButton = {
@ -257,7 +257,7 @@ private fun SetAsDefaultDialog(
onDismissRequest() onDismissRequest()
}, },
) { ) {
Text(text = localize(MR.strings.action_ok)) Text(text = stringResource(MR.strings.action_ok))
} }
}, },
) )

View File

@ -10,7 +10,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
@Composable @Composable
fun DuplicateMangaDialog( fun DuplicateMangaDialog(
@ -21,10 +21,10 @@ fun DuplicateMangaDialog(
AlertDialog( AlertDialog(
onDismissRequest = onDismissRequest, onDismissRequest = onDismissRequest,
title = { title = {
Text(text = localize(MR.strings.are_you_sure)) Text(text = stringResource(MR.strings.are_you_sure))
}, },
text = { text = {
Text(text = localize(MR.strings.confirm_add_duplicate_manga)) Text(text = stringResource(MR.strings.confirm_add_duplicate_manga))
}, },
confirmButton = { confirmButton = {
FlowRow( FlowRow(
@ -36,13 +36,13 @@ fun DuplicateMangaDialog(
onOpenManga() onOpenManga()
}, },
) { ) {
Text(text = localize(MR.strings.action_show_manga)) Text(text = stringResource(MR.strings.action_show_manga))
} }
Spacer(modifier = Modifier.weight(1f)) Spacer(modifier = Modifier.weight(1f))
TextButton(onClick = onDismissRequest) { TextButton(onClick = onDismissRequest) {
Text(text = localize(MR.strings.action_cancel)) Text(text = stringResource(MR.strings.action_cancel))
} }
TextButton( TextButton(
onClick = { onClick = {
@ -50,7 +50,7 @@ fun DuplicateMangaDialog(
onConfirm() onConfirm()
}, },
) { ) {
Text(text = localize(MR.strings.action_add)) Text(text = stringResource(MR.strings.action_add))
} }
} }
}, },

View File

@ -74,7 +74,7 @@ import tachiyomi.presentation.core.components.VerticalFastScroller
import tachiyomi.presentation.core.components.material.ExtendedFloatingActionButton import tachiyomi.presentation.core.components.material.ExtendedFloatingActionButton
import tachiyomi.presentation.core.components.material.PullRefresh import tachiyomi.presentation.core.components.material.PullRefresh
import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.Scaffold
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.util.isScrolledToEnd import tachiyomi.presentation.core.util.isScrolledToEnd
import tachiyomi.presentation.core.util.isScrollingUp import tachiyomi.presentation.core.util.isScrollingUp
import java.text.DateFormat import java.text.DateFormat
@ -349,7 +349,9 @@ private fun MangaScreenSmallImpl(
val isReading = remember(state.chapters) { val isReading = remember(state.chapters) {
state.chapters.fastAny { it.chapter.read } state.chapters.fastAny { it.chapter.read }
} }
Text(text = localize(if (isReading) MR.strings.action_resume else MR.strings.action_start)) Text(
text = stringResource(if (isReading) MR.strings.action_resume else MR.strings.action_start),
)
}, },
icon = { Icon(imageVector = Icons.Filled.PlayArrow, contentDescription = null) }, icon = { Icon(imageVector = Icons.Filled.PlayArrow, contentDescription = null) },
onClick = onContinueReading, onClick = onContinueReading,
@ -608,7 +610,9 @@ fun MangaScreenLargeImpl(
state.chapters.fastAny { it.chapter.read } state.chapters.fastAny { it.chapter.read }
} }
Text( Text(
text = localize(if (isReading) MR.strings.action_resume else MR.strings.action_start), text = stringResource(
if (isReading) MR.strings.action_resume else MR.strings.action_start,
),
) )
}, },
icon = { Icon(imageVector = Icons.Filled.PlayArrow, contentDescription = null) }, icon = { Icon(imageVector = Icons.Filled.PlayArrow, contentDescription = null) },
@ -787,7 +791,7 @@ private fun LazyListScope.sharedChapterItems(
is ChapterList.Item -> { is ChapterList.Item -> {
MangaChapterListItem( MangaChapterListItem(
title = if (manga.displayMode == Manga.CHAPTER_DISPLAY_NUMBER) { title = if (manga.displayMode == Manga.CHAPTER_DISPLAY_NUMBER) {
localize( stringResource(
MR.strings.display_mode_chapter, MR.strings.display_mode_chapter,
formatChapterNumber(item.chapter.chapterNumber), formatChapterNumber(item.chapter.chapterNumber),
) )
@ -806,7 +810,7 @@ private fun LazyListScope.sharedChapterItems(
readProgress = item.chapter.lastPageRead readProgress = item.chapter.lastPageRead
.takeIf { !item.chapter.read && it > 0L } .takeIf { !item.chapter.read && it > 0L }
?.let { ?.let {
localize( stringResource(
MR.strings.chapter_progress, MR.strings.chapter_progress,
it + 1, it + 1,
) )

View File

@ -36,7 +36,7 @@ import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.download.model.Download import eu.kanade.tachiyomi.data.download.model.Download
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.material.IconButtonTokens import tachiyomi.presentation.core.components.material.IconButtonTokens
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.util.secondaryItemAlpha import tachiyomi.presentation.core.util.secondaryItemAlpha
enum class ChapterDownloadAction { enum class ChapterDownloadAction {
@ -99,7 +99,7 @@ private fun NotDownloadedIndicator(
) { ) {
Icon( Icon(
painter = painterResource(R.drawable.ic_download_chapter_24dp), painter = painterResource(R.drawable.ic_download_chapter_24dp),
contentDescription = localize(MR.strings.manga_download), contentDescription = stringResource(MR.strings.manga_download),
modifier = Modifier.size(IndicatorSize), modifier = Modifier.size(IndicatorSize),
tint = MaterialTheme.colorScheme.onSurfaceVariant, tint = MaterialTheme.colorScheme.onSurfaceVariant,
) )
@ -157,14 +157,14 @@ private fun DownloadingIndicator(
} }
DropdownMenu(expanded = isMenuExpanded, onDismissRequest = { isMenuExpanded = false }) { DropdownMenu(expanded = isMenuExpanded, onDismissRequest = { isMenuExpanded = false }) {
DropdownMenuItem( DropdownMenuItem(
text = { Text(text = localize(MR.strings.action_start_downloading_now)) }, text = { Text(text = stringResource(MR.strings.action_start_downloading_now)) },
onClick = { onClick = {
onClick(ChapterDownloadAction.START_NOW) onClick(ChapterDownloadAction.START_NOW)
isMenuExpanded = false isMenuExpanded = false
}, },
) )
DropdownMenuItem( DropdownMenuItem(
text = { Text(text = localize(MR.strings.action_cancel)) }, text = { Text(text = stringResource(MR.strings.action_cancel)) },
onClick = { onClick = {
onClick(ChapterDownloadAction.CANCEL) onClick(ChapterDownloadAction.CANCEL)
isMenuExpanded = false isMenuExpanded = false
@ -205,7 +205,7 @@ private fun DownloadedIndicator(
) )
DropdownMenu(expanded = isMenuExpanded, onDismissRequest = { isMenuExpanded = false }) { DropdownMenu(expanded = isMenuExpanded, onDismissRequest = { isMenuExpanded = false }) {
DropdownMenuItem( DropdownMenuItem(
text = { Text(text = localize(MR.strings.action_delete)) }, text = { Text(text = stringResource(MR.strings.action_delete)) },
onClick = { onClick = {
onClick(ChapterDownloadAction.DELETE) onClick(ChapterDownloadAction.DELETE)
isMenuExpanded = false isMenuExpanded = false
@ -233,7 +233,7 @@ private fun ErrorIndicator(
) { ) {
Icon( Icon(
imageVector = Icons.Outlined.ErrorOutline, imageVector = Icons.Outlined.ErrorOutline,
contentDescription = localize(MR.strings.chapter_error), contentDescription = stringResource(MR.strings.chapter_error),
modifier = Modifier.size(IndicatorSize), modifier = Modifier.size(IndicatorSize),
tint = MaterialTheme.colorScheme.error, tint = MaterialTheme.colorScheme.error,
) )

View File

@ -13,8 +13,8 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.material.SecondaryItemAlpha import tachiyomi.presentation.core.components.material.SecondaryItemAlpha
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.pluralStringResource
import tachiyomi.presentation.core.i18n.localizePlural import tachiyomi.presentation.core.i18n.stringResource
@Composable @Composable
fun ChapterHeader( fun ChapterHeader(
@ -35,9 +35,9 @@ fun ChapterHeader(
) { ) {
Text( Text(
text = if (chapterCount == null) { text = if (chapterCount == null) {
localize(MR.strings.chapters) stringResource(MR.strings.chapters)
} else { } else {
localizePlural(MR.plurals.manga_num_chapters, count = chapterCount, chapterCount) pluralStringResource(MR.plurals.manga_num_chapters, count = chapterCount, chapterCount)
}, },
style = MaterialTheme.typography.titleMedium, style = MaterialTheme.typography.titleMedium,
color = MaterialTheme.colorScheme.onBackground, color = MaterialTheme.colorScheme.onBackground,
@ -54,7 +54,7 @@ private fun MissingChaptersWarning(count: Int) {
} }
Text( Text(
text = localizePlural(MR.plurals.missing_chapters, count = count, count), text = pluralStringResource(MR.plurals.missing_chapters, count = count, count),
maxLines = 1, maxLines = 1,
overflow = TextOverflow.Ellipsis, overflow = TextOverflow.Ellipsis,
style = MaterialTheme.typography.bodySmall, style = MaterialTheme.typography.bodySmall,

View File

@ -29,7 +29,6 @@ import androidx.compose.material.icons.outlined.BookmarkRemove
import androidx.compose.material.icons.outlined.Delete import androidx.compose.material.icons.outlined.Delete
import androidx.compose.material.icons.outlined.DoneAll import androidx.compose.material.icons.outlined.DoneAll
import androidx.compose.material.icons.outlined.Download import androidx.compose.material.icons.outlined.Download
import androidx.compose.material.icons.outlined.Label
import androidx.compose.material.icons.outlined.RemoveDone import androidx.compose.material.icons.outlined.RemoveDone
import androidx.compose.material.ripple.rememberRipple import androidx.compose.material.ripple.rememberRipple
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
@ -59,7 +58,7 @@ import kotlinx.coroutines.delay
import kotlinx.coroutines.isActive import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import kotlin.time.Duration.Companion.seconds import kotlin.time.Duration.Companion.seconds
@Composable @Composable
@ -108,7 +107,7 @@ fun MangaBottomActionMenu(
) { ) {
if (onBookmarkClicked != null) { if (onBookmarkClicked != null) {
Button( Button(
title = localize(MR.strings.action_bookmark), title = stringResource(MR.strings.action_bookmark),
icon = Icons.Outlined.BookmarkAdd, icon = Icons.Outlined.BookmarkAdd,
toConfirm = confirm[0], toConfirm = confirm[0],
onLongClick = { onLongClickItem(0) }, onLongClick = { onLongClickItem(0) },
@ -117,7 +116,7 @@ fun MangaBottomActionMenu(
} }
if (onRemoveBookmarkClicked != null) { if (onRemoveBookmarkClicked != null) {
Button( Button(
title = localize(MR.strings.action_remove_bookmark), title = stringResource(MR.strings.action_remove_bookmark),
icon = Icons.Outlined.BookmarkRemove, icon = Icons.Outlined.BookmarkRemove,
toConfirm = confirm[1], toConfirm = confirm[1],
onLongClick = { onLongClickItem(1) }, onLongClick = { onLongClickItem(1) },
@ -126,7 +125,7 @@ fun MangaBottomActionMenu(
} }
if (onMarkAsReadClicked != null) { if (onMarkAsReadClicked != null) {
Button( Button(
title = localize(MR.strings.action_mark_as_read), title = stringResource(MR.strings.action_mark_as_read),
icon = Icons.Outlined.DoneAll, icon = Icons.Outlined.DoneAll,
toConfirm = confirm[2], toConfirm = confirm[2],
onLongClick = { onLongClickItem(2) }, onLongClick = { onLongClickItem(2) },
@ -135,7 +134,7 @@ fun MangaBottomActionMenu(
} }
if (onMarkAsUnreadClicked != null) { if (onMarkAsUnreadClicked != null) {
Button( Button(
title = localize(MR.strings.action_mark_as_unread), title = stringResource(MR.strings.action_mark_as_unread),
icon = Icons.Outlined.RemoveDone, icon = Icons.Outlined.RemoveDone,
toConfirm = confirm[3], toConfirm = confirm[3],
onLongClick = { onLongClickItem(3) }, onLongClick = { onLongClickItem(3) },
@ -144,7 +143,7 @@ fun MangaBottomActionMenu(
} }
if (onMarkPreviousAsReadClicked != null) { if (onMarkPreviousAsReadClicked != null) {
Button( Button(
title = localize(MR.strings.action_mark_previous_as_read), title = stringResource(MR.strings.action_mark_previous_as_read),
icon = ImageVector.vectorResource(R.drawable.ic_done_prev_24dp), icon = ImageVector.vectorResource(R.drawable.ic_done_prev_24dp),
toConfirm = confirm[4], toConfirm = confirm[4],
onLongClick = { onLongClickItem(4) }, onLongClick = { onLongClickItem(4) },
@ -153,7 +152,7 @@ fun MangaBottomActionMenu(
} }
if (onDownloadClicked != null) { if (onDownloadClicked != null) {
Button( Button(
title = localize(MR.strings.action_download), title = stringResource(MR.strings.action_download),
icon = Icons.Outlined.Download, icon = Icons.Outlined.Download,
toConfirm = confirm[5], toConfirm = confirm[5],
onLongClick = { onLongClickItem(5) }, onLongClick = { onLongClickItem(5) },
@ -162,7 +161,7 @@ fun MangaBottomActionMenu(
} }
if (onDeleteClicked != null) { if (onDeleteClicked != null) {
Button( Button(
title = localize(MR.strings.action_delete), title = stringResource(MR.strings.action_delete),
icon = Icons.Outlined.Delete, icon = Icons.Outlined.Delete,
toConfirm = confirm[6], toConfirm = confirm[6],
onLongClick = { onLongClickItem(6) }, onLongClick = { onLongClickItem(6) },
@ -259,21 +258,21 @@ fun LibraryBottomActionMenu(
.padding(horizontal = 8.dp, vertical = 12.dp), .padding(horizontal = 8.dp, vertical = 12.dp),
) { ) {
Button( Button(
title = localize(MR.strings.action_move_category), title = stringResource(MR.strings.action_move_category),
icon = Icons.AutoMirrored.Outlined.Label, icon = Icons.AutoMirrored.Outlined.Label,
toConfirm = confirm[0], toConfirm = confirm[0],
onLongClick = { onLongClickItem(0) }, onLongClick = { onLongClickItem(0) },
onClick = onChangeCategoryClicked, onClick = onChangeCategoryClicked,
) )
Button( Button(
title = localize(MR.strings.action_mark_as_read), title = stringResource(MR.strings.action_mark_as_read),
icon = Icons.Outlined.DoneAll, icon = Icons.Outlined.DoneAll,
toConfirm = confirm[1], toConfirm = confirm[1],
onLongClick = { onLongClickItem(1) }, onLongClick = { onLongClickItem(1) },
onClick = onMarkAsReadClicked, onClick = onMarkAsReadClicked,
) )
Button( Button(
title = localize(MR.strings.action_mark_as_unread), title = stringResource(MR.strings.action_mark_as_unread),
icon = Icons.Outlined.RemoveDone, icon = Icons.Outlined.RemoveDone,
toConfirm = confirm[2], toConfirm = confirm[2],
onLongClick = { onLongClickItem(2) }, onLongClick = { onLongClickItem(2) },
@ -282,7 +281,7 @@ fun LibraryBottomActionMenu(
if (onDownloadClicked != null) { if (onDownloadClicked != null) {
var downloadExpanded by remember { mutableStateOf(false) } var downloadExpanded by remember { mutableStateOf(false) }
Button( Button(
title = localize(MR.strings.action_download), title = stringResource(MR.strings.action_download),
icon = Icons.Outlined.Download, icon = Icons.Outlined.Download,
toConfirm = confirm[3], toConfirm = confirm[3],
onLongClick = { onLongClickItem(3) }, onLongClick = { onLongClickItem(3) },
@ -297,7 +296,7 @@ fun LibraryBottomActionMenu(
} }
} }
Button( Button(
title = localize(MR.strings.action_delete), title = stringResource(MR.strings.action_delete),
icon = Icons.Outlined.Delete, icon = Icons.Outlined.Delete,
toConfirm = confirm[4], toConfirm = confirm[4],
onLongClick = { onLongClickItem(4) }, onLongClick = { onLongClickItem(4) },

View File

@ -52,7 +52,7 @@ import tachiyomi.domain.library.service.LibraryPreferences
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.material.ReadItemAlpha import tachiyomi.presentation.core.components.material.ReadItemAlpha
import tachiyomi.presentation.core.components.material.SecondaryItemAlpha import tachiyomi.presentation.core.components.material.SecondaryItemAlpha
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.util.selectedBackground import tachiyomi.presentation.core.util.selectedBackground
import kotlin.math.absoluteValue import kotlin.math.absoluteValue
@ -143,7 +143,7 @@ fun MangaChapterListItem(
if (!read) { if (!read) {
Icon( Icon(
imageVector = Icons.Filled.Circle, imageVector = Icons.Filled.Circle,
contentDescription = localize(MR.strings.unread), contentDescription = stringResource(MR.strings.unread),
modifier = Modifier modifier = Modifier
.height(8.dp) .height(8.dp)
.padding(end = 4.dp), .padding(end = 4.dp),
@ -153,7 +153,7 @@ fun MangaChapterListItem(
if (bookmark) { if (bookmark) {
Icon( Icon(
imageVector = Icons.Filled.Bookmark, imageVector = Icons.Filled.Bookmark,
contentDescription = localize(MR.strings.action_filter_bookmarked), contentDescription = stringResource(MR.strings.action_filter_bookmarked),
modifier = Modifier modifier = Modifier
.sizeIn(maxHeight = with(LocalDensity.current) { textHeight.toDp() - 2.dp }), .sizeIn(maxHeight = with(LocalDensity.current) { textHeight.toDp() - 2.dp }),
tint = MaterialTheme.colorScheme.primary, tint = MaterialTheme.colorScheme.primary,

View File

@ -51,7 +51,7 @@ import kotlinx.collections.immutable.persistentListOf
import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.manga.model.Manga
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.Scaffold
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.util.clickableNoIndication import tachiyomi.presentation.core.util.clickableNoIndication
@Composable @Composable
@ -85,7 +85,7 @@ fun MangaCoverDialog(
IconButton(onClick = onDismissRequest) { IconButton(onClick = onDismissRequest) {
Icon( Icon(
imageVector = Icons.Outlined.Close, imageVector = Icons.Outlined.Close,
contentDescription = localize(MR.strings.action_close), contentDescription = stringResource(MR.strings.action_close),
) )
} }
} }
@ -94,12 +94,12 @@ fun MangaCoverDialog(
AppBarActions( AppBarActions(
actions = persistentListOf( actions = persistentListOf(
AppBar.Action( AppBar.Action(
title = localize(MR.strings.action_share), title = stringResource(MR.strings.action_share),
icon = Icons.Outlined.Share, icon = Icons.Outlined.Share,
onClick = onShareClick, onClick = onShareClick,
), ),
AppBar.Action( AppBar.Action(
title = localize(MR.strings.action_save), title = stringResource(MR.strings.action_save),
icon = Icons.Outlined.Save, icon = Icons.Outlined.Save,
onClick = onSaveClick, onClick = onSaveClick,
), ),
@ -119,7 +119,7 @@ fun MangaCoverDialog(
) { ) {
Icon( Icon(
imageVector = Icons.Outlined.Edit, imageVector = Icons.Outlined.Edit,
contentDescription = localize(MR.strings.action_edit_cover), contentDescription = stringResource(MR.strings.action_edit_cover),
) )
} }
DropdownMenu( DropdownMenu(
@ -128,14 +128,14 @@ fun MangaCoverDialog(
offset = DpOffset(8.dp, 0.dp), offset = DpOffset(8.dp, 0.dp),
) { ) {
DropdownMenuItem( DropdownMenuItem(
text = { Text(text = localize(MR.strings.action_edit)) }, text = { Text(text = stringResource(MR.strings.action_edit)) },
onClick = { onClick = {
onEditClick(EditCoverAction.EDIT) onEditClick(EditCoverAction.EDIT)
expanded = false expanded = false
}, },
) )
DropdownMenuItem( DropdownMenuItem(
text = { Text(text = localize(MR.strings.action_delete)) }, text = { Text(text = stringResource(MR.strings.action_delete)) },
onClick = { onClick = {
onEditClick(EditCoverAction.DELETE) onEditClick(EditCoverAction.DELETE)
expanded = false expanded = false

View File

@ -18,7 +18,7 @@ import kotlinx.collections.immutable.toImmutableList
import tachiyomi.domain.manga.interactor.FetchInterval import tachiyomi.domain.manga.interactor.FetchInterval
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.WheelTextPicker import tachiyomi.presentation.core.components.WheelTextPicker
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
@Composable @Composable
fun DeleteChaptersDialog( fun DeleteChaptersDialog(
@ -29,7 +29,7 @@ fun DeleteChaptersDialog(
onDismissRequest = onDismissRequest, onDismissRequest = onDismissRequest,
dismissButton = { dismissButton = {
TextButton(onClick = onDismissRequest) { TextButton(onClick = onDismissRequest) {
Text(text = localize(MR.strings.action_cancel)) Text(text = stringResource(MR.strings.action_cancel))
} }
}, },
confirmButton = { confirmButton = {
@ -39,14 +39,14 @@ fun DeleteChaptersDialog(
onConfirm() onConfirm()
}, },
) { ) {
Text(text = localize(MR.strings.action_ok)) Text(text = stringResource(MR.strings.action_ok))
} }
}, },
title = { title = {
Text(text = localize(MR.strings.are_you_sure)) Text(text = stringResource(MR.strings.are_you_sure))
}, },
text = { text = {
Text(text = localize(MR.strings.confirm_delete_chapters)) Text(text = stringResource(MR.strings.confirm_delete_chapters))
}, },
) )
} }
@ -61,7 +61,7 @@ fun SetIntervalDialog(
AlertDialog( AlertDialog(
onDismissRequest = onDismissRequest, onDismissRequest = onDismissRequest,
title = { Text(text = localize(MR.strings.manga_modify_calculated_interval_title)) }, title = { Text(text = stringResource(MR.strings.manga_modify_calculated_interval_title)) },
text = { text = {
BoxWithConstraints( BoxWithConstraints(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
@ -71,7 +71,7 @@ fun SetIntervalDialog(
val items = (0..FetchInterval.MAX_INTERVAL) val items = (0..FetchInterval.MAX_INTERVAL)
.map { .map {
if (it == 0) { if (it == 0) {
localize(MR.strings.label_default) stringResource(MR.strings.label_default)
} else { } else {
it.toString() it.toString()
} }
@ -87,7 +87,7 @@ fun SetIntervalDialog(
}, },
dismissButton = { dismissButton = {
TextButton(onClick = onDismissRequest) { TextButton(onClick = onDismissRequest) {
Text(text = localize(MR.strings.action_cancel)) Text(text = stringResource(MR.strings.action_cancel))
} }
}, },
confirmButton = { confirmButton = {
@ -95,7 +95,7 @@ fun SetIntervalDialog(
onValueChanged(selectedInterval) onValueChanged(selectedInterval)
onDismissRequest() onDismissRequest()
}) { }) {
Text(text = localize(MR.strings.action_ok)) Text(text = stringResource(MR.strings.action_ok))
} }
}, },
) )

View File

@ -81,8 +81,8 @@ import tachiyomi.domain.manga.model.Manga
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.material.TextButton import tachiyomi.presentation.core.components.material.TextButton
import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.padding
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.pluralStringResource
import tachiyomi.presentation.core.i18n.localizePlural import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.util.clickableNoIndication import tachiyomi.presentation.core.util.clickableNoIndication
import tachiyomi.presentation.core.util.secondaryItemAlpha import tachiyomi.presentation.core.util.secondaryItemAlpha
import kotlin.math.absoluteValue import kotlin.math.absoluteValue
@ -179,9 +179,9 @@ fun MangaActionRow(
Row(modifier = modifier.padding(start = 16.dp, top = 8.dp, end = 16.dp)) { Row(modifier = modifier.padding(start = 16.dp, top = 8.dp, end = 16.dp)) {
MangaActionButton( MangaActionButton(
title = if (favorite) { title = if (favorite) {
localize(MR.strings.in_library) stringResource(MR.strings.in_library)
} else { } else {
localize(MR.strings.add_to_library) stringResource(MR.strings.add_to_library)
}, },
icon = if (favorite) Icons.Filled.Favorite else Icons.Outlined.FavoriteBorder, icon = if (favorite) Icons.Filled.Favorite else Icons.Outlined.FavoriteBorder,
color = if (favorite) MaterialTheme.colorScheme.primary else defaultActionButtonColor, color = if (favorite) MaterialTheme.colorScheme.primary else defaultActionButtonColor,
@ -190,7 +190,7 @@ fun MangaActionRow(
) )
if (onEditIntervalClicked != null && fetchInterval != null) { if (onEditIntervalClicked != null && fetchInterval != null) {
MangaActionButton( MangaActionButton(
title = localizePlural( title = pluralStringResource(
MR.plurals.day, MR.plurals.day,
count = fetchInterval.absoluteValue, count = fetchInterval.absoluteValue,
fetchInterval.absoluteValue, fetchInterval.absoluteValue,
@ -203,9 +203,9 @@ fun MangaActionRow(
if (onTrackingClicked != null) { if (onTrackingClicked != null) {
MangaActionButton( MangaActionButton(
title = if (trackingCount == 0) { title = if (trackingCount == 0) {
localize(MR.strings.manga_tracking_tab) stringResource(MR.strings.manga_tracking_tab)
} else { } else {
localizePlural(MR.plurals.num_trackers, count = trackingCount, trackingCount) pluralStringResource(MR.plurals.num_trackers, count = trackingCount, trackingCount)
}, },
icon = if (trackingCount == 0) Icons.Outlined.Sync else Icons.Outlined.Done, icon = if (trackingCount == 0) Icons.Outlined.Sync else Icons.Outlined.Done,
color = if (trackingCount == 0) defaultActionButtonColor else MaterialTheme.colorScheme.primary, color = if (trackingCount == 0) defaultActionButtonColor else MaterialTheme.colorScheme.primary,
@ -214,7 +214,7 @@ fun MangaActionRow(
} }
if (onWebViewClicked != null) { if (onWebViewClicked != null) {
MangaActionButton( MangaActionButton(
title = localize(MR.strings.action_web_view), title = stringResource(MR.strings.action_web_view),
icon = Icons.Outlined.Public, icon = Icons.Outlined.Public,
color = defaultActionButtonColor, color = defaultActionButtonColor,
onClick = onWebViewClicked, onClick = onWebViewClicked,
@ -238,7 +238,7 @@ fun ExpandableMangaDescription(
mutableStateOf(defaultExpandState) mutableStateOf(defaultExpandState)
} }
val desc = val desc =
description.takeIf { !it.isNullOrBlank() } ?: localize(MR.strings.description_placeholder) description.takeIf { !it.isNullOrBlank() } ?: stringResource(MR.strings.description_placeholder)
val trimmedDescription = remember(desc) { val trimmedDescription = remember(desc) {
desc desc
.replace(whitespaceLineRegex, "\n") .replace(whitespaceLineRegex, "\n")
@ -268,14 +268,14 @@ fun ExpandableMangaDescription(
onDismissRequest = { showMenu = false }, onDismissRequest = { showMenu = false },
) { ) {
DropdownMenuItem( DropdownMenuItem(
text = { Text(text = localize(MR.strings.action_search)) }, text = { Text(text = stringResource(MR.strings.action_search)) },
onClick = { onClick = {
onTagSearch(tagSelected) onTagSearch(tagSelected)
showMenu = false showMenu = false
}, },
) )
DropdownMenuItem( DropdownMenuItem(
text = { Text(text = localize(MR.strings.action_copy_to_clipboard)) }, text = { Text(text = stringResource(MR.strings.action_copy_to_clipboard)) },
onClick = { onClick = {
onCopyTagToClipboard(tagSelected) onCopyTagToClipboard(tagSelected)
showMenu = false showMenu = false
@ -342,7 +342,7 @@ private fun MangaAndSourceTitlesLarge(
MangaCover.Book( MangaCover.Book(
modifier = Modifier.fillMaxWidth(0.65f), modifier = Modifier.fillMaxWidth(0.65f),
data = coverDataProvider(), data = coverDataProvider(),
contentDescription = localize(MR.strings.manga_cover), contentDescription = stringResource(MR.strings.manga_cover),
onClick = onCoverClick, onClick = onCoverClick,
) )
Spacer(modifier = Modifier.height(16.dp)) Spacer(modifier = Modifier.height(16.dp))
@ -384,7 +384,7 @@ private fun MangaAndSourceTitlesSmall(
.sizeIn(maxWidth = 100.dp) .sizeIn(maxWidth = 100.dp)
.align(Alignment.Top), .align(Alignment.Top),
data = coverDataProvider(), data = coverDataProvider(),
contentDescription = localize(MR.strings.manga_cover), contentDescription = stringResource(MR.strings.manga_cover),
onClick = onCoverClick, onClick = onCoverClick,
) )
Column( Column(
@ -416,7 +416,7 @@ private fun MangaContentInfo(
) { ) {
val context = LocalContext.current val context = LocalContext.current
Text( Text(
text = title.ifBlank { localize(MR.strings.unknown_title) }, text = title.ifBlank { stringResource(MR.strings.unknown_title) },
style = MaterialTheme.typography.titleLarge, style = MaterialTheme.typography.titleLarge,
modifier = Modifier.clickableNoIndication( modifier = Modifier.clickableNoIndication(
onLongClick = { onLongClick = {
@ -446,7 +446,7 @@ private fun MangaContentInfo(
) )
Text( Text(
text = author?.takeIf { it.isNotBlank() } text = author?.takeIf { it.isNotBlank() }
?: localize(MR.strings.unknown_author), ?: stringResource(MR.strings.unknown_author),
style = MaterialTheme.typography.titleSmall, style = MaterialTheme.typography.titleSmall,
modifier = Modifier modifier = Modifier
.clickableNoIndication( .clickableNoIndication(
@ -512,13 +512,13 @@ private fun MangaContentInfo(
ProvideTextStyle(MaterialTheme.typography.bodyMedium) { ProvideTextStyle(MaterialTheme.typography.bodyMedium) {
Text( Text(
text = when (status) { text = when (status) {
SManga.ONGOING.toLong() -> localize(MR.strings.ongoing) SManga.ONGOING.toLong() -> stringResource(MR.strings.ongoing)
SManga.COMPLETED.toLong() -> localize(MR.strings.completed) SManga.COMPLETED.toLong() -> stringResource(MR.strings.completed)
SManga.LICENSED.toLong() -> localize(MR.strings.licensed) SManga.LICENSED.toLong() -> stringResource(MR.strings.licensed)
SManga.PUBLISHING_FINISHED.toLong() -> localize(MR.strings.publishing_finished) SManga.PUBLISHING_FINISHED.toLong() -> stringResource(MR.strings.publishing_finished)
SManga.CANCELLED.toLong() -> localize(MR.strings.cancelled) SManga.CANCELLED.toLong() -> stringResource(MR.strings.cancelled)
SManga.ON_HIATUS.toLong() -> localize(MR.strings.on_hiatus) SManga.ON_HIATUS.toLong() -> stringResource(MR.strings.on_hiatus)
else -> localize(MR.strings.unknown) else -> stringResource(MR.strings.unknown)
}, },
overflow = TextOverflow.Ellipsis, overflow = TextOverflow.Ellipsis,
maxLines = 1, maxLines = 1,
@ -592,7 +592,7 @@ private fun MangaSummary(
val image = AnimatedImageVector.animatedVectorResource(R.drawable.anim_caret_down) val image = AnimatedImageVector.animatedVectorResource(R.drawable.anim_caret_down)
Icon( Icon(
painter = rememberAnimatedVectorPainter(image, !expanded), painter = rememberAnimatedVectorPainter(image, !expanded),
contentDescription = localize( contentDescription = stringResource(
if (expanded) MR.strings.manga_info_collapse else MR.strings.manga_info_expand, if (expanded) MR.strings.manga_info_collapse else MR.strings.manga_info_expand,
), ),
tint = MaterialTheme.colorScheme.onBackground, tint = MaterialTheme.colorScheme.onBackground,

View File

@ -30,7 +30,7 @@ import eu.kanade.presentation.components.UpIcon
import eu.kanade.presentation.manga.DownloadAction import eu.kanade.presentation.manga.DownloadAction
import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentListOf
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.theme.active import tachiyomi.presentation.core.theme.active
@Composable @Composable
@ -75,12 +75,12 @@ fun MangaToolbar(
AppBarActions( AppBarActions(
persistentListOf( persistentListOf(
AppBar.Action( AppBar.Action(
title = localize(MR.strings.action_select_all), title = stringResource(MR.strings.action_select_all),
icon = Icons.Outlined.SelectAll, icon = Icons.Outlined.SelectAll,
onClick = onSelectAll, onClick = onSelectAll,
), ),
AppBar.Action( AppBar.Action(
title = localize(MR.strings.action_select_inverse), title = stringResource(MR.strings.action_select_inverse),
icon = Icons.Outlined.FlipToBack, icon = Icons.Outlined.FlipToBack,
onClick = onInvertSelection, onClick = onInvertSelection,
), ),
@ -104,7 +104,7 @@ fun MangaToolbar(
if (onClickDownload != null) { if (onClickDownload != null) {
add( add(
AppBar.Action( AppBar.Action(
title = localize(MR.strings.manga_download), title = stringResource(MR.strings.manga_download),
icon = Icons.Outlined.Download, icon = Icons.Outlined.Download,
onClick = { downloadExpanded = !downloadExpanded }, onClick = { downloadExpanded = !downloadExpanded },
), ),
@ -112,7 +112,7 @@ fun MangaToolbar(
} }
add( add(
AppBar.Action( AppBar.Action(
title = localize(MR.strings.action_filter), title = stringResource(MR.strings.action_filter),
icon = Icons.Outlined.FilterList, icon = Icons.Outlined.FilterList,
iconTint = filterTint, iconTint = filterTint,
onClick = onClickFilter, onClick = onClickFilter,
@ -120,14 +120,14 @@ fun MangaToolbar(
) )
add( add(
AppBar.OverflowAction( AppBar.OverflowAction(
title = localize(MR.strings.action_webview_refresh), title = stringResource(MR.strings.action_webview_refresh),
onClick = onClickRefresh, onClick = onClickRefresh,
), ),
) )
if (onClickEditCategory != null) { if (onClickEditCategory != null) {
add( add(
AppBar.OverflowAction( AppBar.OverflowAction(
title = localize(MR.strings.action_edit_categories), title = stringResource(MR.strings.action_edit_categories),
onClick = onClickEditCategory, onClick = onClickEditCategory,
), ),
) )
@ -135,7 +135,7 @@ fun MangaToolbar(
if (onClickMigrate != null) { if (onClickMigrate != null) {
add( add(
AppBar.OverflowAction( AppBar.OverflowAction(
title = localize(MR.strings.action_migrate), title = stringResource(MR.strings.action_migrate),
onClick = onClickMigrate, onClick = onClickMigrate,
), ),
) )
@ -143,7 +143,7 @@ fun MangaToolbar(
if (onClickShare != null) { if (onClickShare != null) {
add( add(
AppBar.OverflowAction( AppBar.OverflowAction(
title = localize(MR.strings.action_share), title = stringResource(MR.strings.action_share),
onClick = onClickShare, onClick = onClickShare,
), ),
) )

View File

@ -14,7 +14,7 @@ import androidx.compose.ui.tooling.preview.PreviewLightDark
import eu.kanade.presentation.theme.TachiyomiTheme import eu.kanade.presentation.theme.TachiyomiTheme
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.padding
import tachiyomi.presentation.core.i18n.localizePlural import tachiyomi.presentation.core.i18n.pluralStringResource
import tachiyomi.presentation.core.util.secondaryItemAlpha import tachiyomi.presentation.core.util.secondaryItemAlpha
@Composable @Composable
@ -34,7 +34,7 @@ fun MissingChapterCountListItem(
) { ) {
HorizontalDivider(modifier = Modifier.weight(1f)) HorizontalDivider(modifier = Modifier.weight(1f))
Text( Text(
text = localizePlural(MR.plurals.missing_chapters, count = count, count), text = pluralStringResource(MR.plurals.missing_chapters, count = count, count),
style = MaterialTheme.typography.labelMedium, style = MaterialTheme.typography.labelMedium,
) )
HorizontalDivider(modifier = Modifier.weight(1f)) HorizontalDivider(modifier = Modifier.weight(1f))

View File

@ -20,9 +20,7 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.minimumInteractiveComponentSize import androidx.compose.material3.minimumInteractiveComponentSize
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.runtime.toMutableStateList import androidx.compose.runtime.toMutableStateList
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -32,7 +30,7 @@ import androidx.compose.ui.window.DialogProperties
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.material.TextButton import tachiyomi.presentation.core.components.material.TextButton
import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.padding
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.util.isScrolledToEnd import tachiyomi.presentation.core.util.isScrolledToEnd
import tachiyomi.presentation.core.util.isScrolledToStart import tachiyomi.presentation.core.util.isScrolledToStart
@ -49,10 +47,10 @@ fun ScanlatorFilterDialog(
val mutableExcludedScanlators = remember(excludedScanlators) { excludedScanlators.toMutableStateList() } val mutableExcludedScanlators = remember(excludedScanlators) { excludedScanlators.toMutableStateList() }
AlertDialog( AlertDialog(
onDismissRequest = onDismissRequest, onDismissRequest = onDismissRequest,
title = { Text(text = localize(MR.strings.exclude_scanlators)) }, title = { Text(text = stringResource(MR.strings.exclude_scanlators)) },
text = textFunc@{ text = textFunc@{
if (sortedAvailableScanlators.isEmpty()) { if (sortedAvailableScanlators.isEmpty()) {
Text(text = localize(MR.strings.no_scanlators_found)) Text(text = stringResource(MR.strings.no_scanlators_found))
return@textFunc return@textFunc
} }
Box { Box {
@ -108,16 +106,16 @@ fun ScanlatorFilterDialog(
confirmButton = { confirmButton = {
if (sortedAvailableScanlators.isEmpty()) { if (sortedAvailableScanlators.isEmpty()) {
TextButton(onClick = onDismissRequest) { TextButton(onClick = onDismissRequest) {
Text(text = localize(MR.strings.action_cancel)) Text(text = stringResource(MR.strings.action_cancel))
} }
} else { } else {
FlowRow { FlowRow {
TextButton(onClick = mutableExcludedScanlators::clear) { TextButton(onClick = mutableExcludedScanlators::clear) {
Text(text = localize(MR.strings.action_reset)) Text(text = stringResource(MR.strings.action_reset))
} }
Spacer(modifier = Modifier.weight(1f)) Spacer(modifier = Modifier.weight(1f))
TextButton(onClick = onDismissRequest) { TextButton(onClick = onDismissRequest) {
Text(text = localize(MR.strings.action_cancel)) Text(text = stringResource(MR.strings.action_cancel))
} }
TextButton( TextButton(
onClick = { onClick = {
@ -125,7 +123,7 @@ fun ScanlatorFilterDialog(
onDismissRequest() onDismissRequest()
}, },
) { ) {
Text(text = localize(MR.strings.action_ok)) Text(text = stringResource(MR.strings.action_ok))
} }
} }
} }

View File

@ -32,8 +32,8 @@ import tachiyomi.core.Constants
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.ScrollbarLazyColumn import tachiyomi.presentation.core.components.ScrollbarLazyColumn
import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.Scaffold
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.pluralStringResource
import tachiyomi.presentation.core.i18n.localizePlural import tachiyomi.presentation.core.i18n.stringResource
@Composable @Composable
fun MoreScreen( fun MoreScreen(
@ -80,8 +80,8 @@ fun MoreScreen(
} }
item { item {
SwitchPreferenceWidget( SwitchPreferenceWidget(
title = localize(MR.strings.label_downloaded_only), title = stringResource(MR.strings.label_downloaded_only),
subtitle = localize(MR.strings.downloaded_only_summary), subtitle = stringResource(MR.strings.downloaded_only_summary),
icon = Icons.Outlined.CloudOff, icon = Icons.Outlined.CloudOff,
checked = downloadedOnly, checked = downloadedOnly,
onCheckedChanged = onDownloadedOnlyChange, onCheckedChanged = onDownloadedOnlyChange,
@ -89,8 +89,8 @@ fun MoreScreen(
} }
item { item {
SwitchPreferenceWidget( SwitchPreferenceWidget(
title = localize(MR.strings.pref_incognito_mode), title = stringResource(MR.strings.pref_incognito_mode),
subtitle = localize(MR.strings.pref_incognito_mode_summary), subtitle = stringResource(MR.strings.pref_incognito_mode_summary),
icon = ImageVector.vectorResource(R.drawable.ic_glasses_24dp), icon = ImageVector.vectorResource(R.drawable.ic_glasses_24dp),
checked = incognitoMode, checked = incognitoMode,
onCheckedChanged = onIncognitoModeChange, onCheckedChanged = onIncognitoModeChange,
@ -102,16 +102,16 @@ fun MoreScreen(
item { item {
val downloadQueueState = downloadQueueStateProvider() val downloadQueueState = downloadQueueStateProvider()
TextPreferenceWidget( TextPreferenceWidget(
title = localize(MR.strings.label_download_queue), title = stringResource(MR.strings.label_download_queue),
subtitle = when (downloadQueueState) { subtitle = when (downloadQueueState) {
DownloadQueueState.Stopped -> null DownloadQueueState.Stopped -> null
is DownloadQueueState.Paused -> { is DownloadQueueState.Paused -> {
val pending = downloadQueueState.pending val pending = downloadQueueState.pending
if (pending == 0) { if (pending == 0) {
localize(MR.strings.paused) stringResource(MR.strings.paused)
} else { } else {
"${localize(MR.strings.paused)}${ "${stringResource(MR.strings.paused)}${
localizePlural( pluralStringResource(
MR.plurals.download_queue_summary, MR.plurals.download_queue_summary,
count = pending, count = pending,
pending, pending,
@ -121,7 +121,7 @@ fun MoreScreen(
} }
is DownloadQueueState.Downloading -> { is DownloadQueueState.Downloading -> {
val pending = downloadQueueState.pending val pending = downloadQueueState.pending
localizePlural(MR.plurals.download_queue_summary, count = pending, pending) pluralStringResource(MR.plurals.download_queue_summary, count = pending, pending)
} }
}, },
icon = Icons.Outlined.GetApp, icon = Icons.Outlined.GetApp,
@ -130,21 +130,21 @@ fun MoreScreen(
} }
item { item {
TextPreferenceWidget( TextPreferenceWidget(
title = localize(MR.strings.categories), title = stringResource(MR.strings.categories),
icon = Icons.AutoMirrored.Outlined.Label, icon = Icons.AutoMirrored.Outlined.Label,
onPreferenceClick = onClickCategories, onPreferenceClick = onClickCategories,
) )
} }
item { item {
TextPreferenceWidget( TextPreferenceWidget(
title = localize(MR.strings.label_stats), title = stringResource(MR.strings.label_stats),
icon = Icons.Outlined.QueryStats, icon = Icons.Outlined.QueryStats,
onPreferenceClick = onClickStats, onPreferenceClick = onClickStats,
) )
} }
item { item {
TextPreferenceWidget( TextPreferenceWidget(
title = localize(MR.strings.label_data_storage), title = stringResource(MR.strings.label_data_storage),
icon = Icons.Outlined.Storage, icon = Icons.Outlined.Storage,
onPreferenceClick = onClickDataAndStorage, onPreferenceClick = onClickDataAndStorage,
) )
@ -154,21 +154,21 @@ fun MoreScreen(
item { item {
TextPreferenceWidget( TextPreferenceWidget(
title = localize(MR.strings.label_settings), title = stringResource(MR.strings.label_settings),
icon = Icons.Outlined.Settings, icon = Icons.Outlined.Settings,
onPreferenceClick = onClickSettings, onPreferenceClick = onClickSettings,
) )
} }
item { item {
TextPreferenceWidget( TextPreferenceWidget(
title = localize(MR.strings.pref_category_about), title = stringResource(MR.strings.pref_category_about),
icon = Icons.Outlined.Info, icon = Icons.Outlined.Info,
onPreferenceClick = onClickAbout, onPreferenceClick = onClickAbout,
) )
} }
item { item {
TextPreferenceWidget( TextPreferenceWidget(
title = localize(MR.strings.label_help), title = stringResource(MR.strings.label_help),
icon = Icons.AutoMirrored.Outlined.HelpOutline, icon = Icons.AutoMirrored.Outlined.HelpOutline,
onPreferenceClick = { uriHandler.openUri(Constants.URL_HELP) }, onPreferenceClick = { uriHandler.openUri(Constants.URL_HELP) },
) )

View File

@ -6,7 +6,6 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.outlined.OpenInNew import androidx.compose.material.icons.automirrored.outlined.OpenInNew
import androidx.compose.material.icons.filled.OpenInNew
import androidx.compose.material.icons.outlined.NewReleases import androidx.compose.material.icons.outlined.NewReleases
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
@ -23,7 +22,7 @@ import com.halilibo.richtext.ui.string.RichTextStringStyle
import eu.kanade.presentation.theme.TachiyomiTheme import eu.kanade.presentation.theme.TachiyomiTheme
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.padding
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.screens.InfoScreen import tachiyomi.presentation.core.screens.InfoScreen
@Composable @Composable
@ -36,11 +35,11 @@ fun NewUpdateScreen(
) { ) {
InfoScreen( InfoScreen(
icon = Icons.Outlined.NewReleases, icon = Icons.Outlined.NewReleases,
headingText = localize(MR.strings.update_check_notification_update_available), headingText = stringResource(MR.strings.update_check_notification_update_available),
subtitleText = versionName, subtitleText = versionName,
acceptText = localize(MR.strings.update_check_confirm), acceptText = stringResource(MR.strings.update_check_confirm),
onAcceptClick = onAcceptUpdate, onAcceptClick = onAcceptUpdate,
rejectText = localize(MR.strings.action_not_now), rejectText = stringResource(MR.strings.action_not_now),
onRejectClick = onRejectUpdate, onRejectClick = onRejectUpdate,
) { ) {
Material3RichText( Material3RichText(
@ -59,7 +58,7 @@ fun NewUpdateScreen(
onClick = onOpenInBrowser, onClick = onOpenInBrowser,
modifier = Modifier.padding(top = MaterialTheme.padding.small), modifier = Modifier.padding(top = MaterialTheme.padding.small),
) { ) {
Text(text = localize(MR.strings.update_check_open)) Text(text = stringResource(MR.strings.update_check_open))
Spacer(modifier = Modifier.width(MaterialTheme.padding.tiny)) Spacer(modifier = Modifier.width(MaterialTheme.padding.tiny))
Icon(imageVector = Icons.AutoMirrored.Outlined.OpenInNew, contentDescription = null) Icon(imageVector = Icons.AutoMirrored.Outlined.OpenInNew, contentDescription = null)
} }

View File

@ -5,7 +5,7 @@ import androidx.compose.runtime.remember
import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.graphics.vector.ImageVector
import eu.kanade.tachiyomi.data.track.Tracker import eu.kanade.tachiyomi.data.track.Tracker
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.core.preference.Preference as PreferenceData import tachiyomi.core.preference.Preference as PreferenceData
sealed class Preference { sealed class Preference {
@ -109,7 +109,7 @@ sealed class Preference {
v.map { e[it] } v.map { e[it] }
.takeIf { it.isNotEmpty() } .takeIf { it.isNotEmpty() }
?.joinToString() ?.joinToString()
} ?: localize(MR.strings.none) } ?: stringResource(MR.strings.none)
subtitle?.format(combined) subtitle?.format(combined)
}, },
override val icon: ImageVector? = null, override val icon: ImageVector? = null,

View File

@ -5,7 +5,7 @@ import androidx.compose.runtime.Composable
import dev.icerock.moko.resources.StringResource import dev.icerock.moko.resources.StringResource
import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBar
import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.Scaffold
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
@Composable @Composable
fun PreferenceScaffold( fun PreferenceScaffold(
@ -17,7 +17,7 @@ fun PreferenceScaffold(
Scaffold( Scaffold(
topBar = { topBar = {
AppBar( AppBar(
title = localize(titleRes), title = stringResource(titleRes),
navigateUp = onBackPressed, navigateUp = onBackPressed,
actions = actions, actions = actions,
scrollBehavior = it, scrollBehavior = it,

View File

@ -6,7 +6,7 @@ import androidx.compose.ui.platform.LocalContext
import eu.kanade.presentation.category.visualName import eu.kanade.presentation.category.visualName
import tachiyomi.domain.category.model.Category import tachiyomi.domain.category.model.Category
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
/** /**
* Returns a string of categories name for settings subtitle * Returns a string of categories name for settings subtitle
@ -34,15 +34,15 @@ fun getCategoriesLabel(
includedCategories.isNotEmpty() && includedCategories.size != allCategories.size -> includedCategories.isNotEmpty() && includedCategories.size != allCategories.size ->
includedCategories.joinToString { it.visualName(context) } includedCategories.joinToString { it.visualName(context) }
// All explicitly selected // All explicitly selected
includedCategories.size == allCategories.size -> localize(MR.strings.all) includedCategories.size == allCategories.size -> stringResource(MR.strings.all)
allExcluded -> localize(MR.strings.none) allExcluded -> stringResource(MR.strings.none)
else -> localize(MR.strings.all) else -> stringResource(MR.strings.all)
} }
val excludedItemsText = when { val excludedItemsText = when {
excludedCategories.isEmpty() -> localize(MR.strings.none) excludedCategories.isEmpty() -> stringResource(MR.strings.none)
allExcluded -> localize(MR.strings.all) allExcluded -> stringResource(MR.strings.all)
else -> excludedCategories.joinToString { it.visualName(context) } else -> excludedCategories.joinToString { it.visualName(context) }
} }
return localize(MR.strings.include, includedItemsText) + "\n" + return stringResource(MR.strings.include, includedItemsText) + "\n" +
localize(MR.strings.exclude, excludedItemsText) stringResource(MR.strings.exclude, excludedItemsText)
} }

View File

@ -58,7 +58,7 @@ import tachiyomi.core.util.lang.withUIContext
import tachiyomi.core.util.system.logcat import tachiyomi.core.util.system.logcat
import tachiyomi.domain.manga.interactor.ResetViewerFlags import tachiyomi.domain.manga.interactor.ResetViewerFlags
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.util.collectAsState import tachiyomi.presentation.core.util.collectAsState
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
@ -84,13 +84,13 @@ object SettingsAdvancedScreen : SearchableSettings {
listOf( listOf(
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = basePreferences.acraEnabled(), pref = basePreferences.acraEnabled(),
title = localize(MR.strings.pref_enable_acra), title = stringResource(MR.strings.pref_enable_acra),
subtitle = localize(MR.strings.pref_acra_summary), subtitle = stringResource(MR.strings.pref_acra_summary),
enabled = isPreviewBuildType || isReleaseBuildType, enabled = isPreviewBuildType || isReleaseBuildType,
), ),
Preference.PreferenceItem.TextPreference( Preference.PreferenceItem.TextPreference(
title = localize(MR.strings.pref_dump_crash_logs), title = stringResource(MR.strings.pref_dump_crash_logs),
subtitle = localize(MR.strings.pref_dump_crash_logs_summary), subtitle = stringResource(MR.strings.pref_dump_crash_logs_summary),
onClick = { onClick = {
scope.launch { scope.launch {
CrashLogUtil(context).dumpLogs() CrashLogUtil(context).dumpLogs()
@ -99,15 +99,15 @@ object SettingsAdvancedScreen : SearchableSettings {
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = networkPreferences.verboseLogging(), pref = networkPreferences.verboseLogging(),
title = localize(MR.strings.pref_verbose_logging), title = stringResource(MR.strings.pref_verbose_logging),
subtitle = localize(MR.strings.pref_verbose_logging_summary), subtitle = stringResource(MR.strings.pref_verbose_logging_summary),
onValueChanged = { onValueChanged = {
context.toast(MR.strings.requires_app_restart) context.toast(MR.strings.requires_app_restart)
true true
}, },
), ),
Preference.PreferenceItem.TextPreference( Preference.PreferenceItem.TextPreference(
title = localize(MR.strings.pref_debug_info), title = stringResource(MR.strings.pref_debug_info),
onClick = { navigator.push(DebugInfoScreen()) }, onClick = { navigator.push(DebugInfoScreen()) },
), ),
), ),
@ -115,7 +115,7 @@ object SettingsAdvancedScreen : SearchableSettings {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
add( add(
Preference.PreferenceItem.TextPreference( Preference.PreferenceItem.TextPreference(
title = localize(MR.strings.pref_manage_notifications), title = stringResource(MR.strings.pref_manage_notifications),
onClick = { onClick = {
val intent = Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS).apply { val intent = Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS).apply {
putExtra(Settings.EXTRA_APP_PACKAGE, context.packageName) putExtra(Settings.EXTRA_APP_PACKAGE, context.packageName)
@ -143,11 +143,11 @@ object SettingsAdvancedScreen : SearchableSettings {
val uriHandler = LocalUriHandler.current val uriHandler = LocalUriHandler.current
return Preference.PreferenceGroup( return Preference.PreferenceGroup(
title = localize(MR.strings.label_background_activity), title = stringResource(MR.strings.label_background_activity),
preferenceItems = listOf( preferenceItems = listOf(
Preference.PreferenceItem.TextPreference( Preference.PreferenceItem.TextPreference(
title = localize(MR.strings.pref_disable_battery_optimization), title = stringResource(MR.strings.pref_disable_battery_optimization),
subtitle = localize(MR.strings.pref_disable_battery_optimization_summary), subtitle = stringResource(MR.strings.pref_disable_battery_optimization_summary),
onClick = { onClick = {
val packageName: String = context.packageName val packageName: String = context.packageName
if (!context.powerManager.isIgnoringBatteryOptimizations(packageName)) { if (!context.powerManager.isIgnoringBatteryOptimizations(packageName)) {
@ -169,7 +169,7 @@ object SettingsAdvancedScreen : SearchableSettings {
), ),
Preference.PreferenceItem.TextPreference( Preference.PreferenceItem.TextPreference(
title = "Don't kill my app!", title = "Don't kill my app!",
subtitle = localize(MR.strings.about_dont_kill_my_app), subtitle = stringResource(MR.strings.about_dont_kill_my_app),
onClick = { uriHandler.openUri("https://dontkillmyapp.com/") }, onClick = { uriHandler.openUri("https://dontkillmyapp.com/") },
), ),
), ),
@ -182,19 +182,19 @@ object SettingsAdvancedScreen : SearchableSettings {
val navigator = LocalNavigator.currentOrThrow val navigator = LocalNavigator.currentOrThrow
return Preference.PreferenceGroup( return Preference.PreferenceGroup(
title = localize(MR.strings.label_data), title = stringResource(MR.strings.label_data),
preferenceItems = listOf( preferenceItems = listOf(
Preference.PreferenceItem.TextPreference( Preference.PreferenceItem.TextPreference(
title = localize(MR.strings.pref_invalidate_download_cache), title = stringResource(MR.strings.pref_invalidate_download_cache),
subtitle = localize(MR.strings.pref_invalidate_download_cache_summary), subtitle = stringResource(MR.strings.pref_invalidate_download_cache_summary),
onClick = { onClick = {
Injekt.get<DownloadCache>().invalidateCache() Injekt.get<DownloadCache>().invalidateCache()
context.toast(MR.strings.download_cache_invalidated) context.toast(MR.strings.download_cache_invalidated)
}, },
), ),
Preference.PreferenceItem.TextPreference( Preference.PreferenceItem.TextPreference(
title = localize(MR.strings.pref_clear_database), title = stringResource(MR.strings.pref_clear_database),
subtitle = localize(MR.strings.pref_clear_database_summary), subtitle = stringResource(MR.strings.pref_clear_database_summary),
onClick = { navigator.push(ClearDatabaseScreen()) }, onClick = { navigator.push(ClearDatabaseScreen()) },
), ),
), ),
@ -212,17 +212,17 @@ object SettingsAdvancedScreen : SearchableSettings {
val userAgent by userAgentPref.collectAsState() val userAgent by userAgentPref.collectAsState()
return Preference.PreferenceGroup( return Preference.PreferenceGroup(
title = localize(MR.strings.label_network), title = stringResource(MR.strings.label_network),
preferenceItems = listOf( preferenceItems = listOf(
Preference.PreferenceItem.TextPreference( Preference.PreferenceItem.TextPreference(
title = localize(MR.strings.pref_clear_cookies), title = stringResource(MR.strings.pref_clear_cookies),
onClick = { onClick = {
networkHelper.cookieJar.removeAll() networkHelper.cookieJar.removeAll()
context.toast(MR.strings.cookies_cleared) context.toast(MR.strings.cookies_cleared)
}, },
), ),
Preference.PreferenceItem.TextPreference( Preference.PreferenceItem.TextPreference(
title = localize(MR.strings.pref_clear_webview_data), title = stringResource(MR.strings.pref_clear_webview_data),
onClick = { onClick = {
try { try {
WebView(context).run { WebView(context).run {
@ -243,9 +243,9 @@ object SettingsAdvancedScreen : SearchableSettings {
), ),
Preference.PreferenceItem.ListPreference( Preference.PreferenceItem.ListPreference(
pref = networkPreferences.dohProvider(), pref = networkPreferences.dohProvider(),
title = localize(MR.strings.pref_dns_over_https), title = stringResource(MR.strings.pref_dns_over_https),
entries = mapOf( entries = mapOf(
-1 to localize(MR.strings.disabled), -1 to stringResource(MR.strings.disabled),
PREF_DOH_CLOUDFLARE to "Cloudflare", PREF_DOH_CLOUDFLARE to "Cloudflare",
PREF_DOH_GOOGLE to "Google", PREF_DOH_GOOGLE to "Google",
PREF_DOH_ADGUARD to "AdGuard", PREF_DOH_ADGUARD to "AdGuard",
@ -266,7 +266,7 @@ object SettingsAdvancedScreen : SearchableSettings {
), ),
Preference.PreferenceItem.EditTextPreference( Preference.PreferenceItem.EditTextPreference(
pref = userAgentPref, pref = userAgentPref,
title = localize(MR.strings.pref_user_agent_string), title = stringResource(MR.strings.pref_user_agent_string),
onValueChanged = { onValueChanged = {
try { try {
// OkHttp checks for valid values internally // OkHttp checks for valid values internally
@ -279,7 +279,7 @@ object SettingsAdvancedScreen : SearchableSettings {
}, },
), ),
Preference.PreferenceItem.TextPreference( Preference.PreferenceItem.TextPreference(
title = localize(MR.strings.pref_reset_user_agent_string), title = stringResource(MR.strings.pref_reset_user_agent_string),
enabled = remember(userAgent) { userAgent != userAgentPref.defaultValue() }, enabled = remember(userAgent) { userAgent != userAgentPref.defaultValue() },
onClick = { onClick = {
userAgentPref.delete() userAgentPref.delete()
@ -296,15 +296,15 @@ object SettingsAdvancedScreen : SearchableSettings {
val context = LocalContext.current val context = LocalContext.current
return Preference.PreferenceGroup( return Preference.PreferenceGroup(
title = localize(MR.strings.label_library), title = stringResource(MR.strings.label_library),
preferenceItems = listOf( preferenceItems = listOf(
Preference.PreferenceItem.TextPreference( Preference.PreferenceItem.TextPreference(
title = localize(MR.strings.pref_refresh_library_covers), title = stringResource(MR.strings.pref_refresh_library_covers),
onClick = { MetadataUpdateJob.startNow(context) }, onClick = { MetadataUpdateJob.startNow(context) },
), ),
Preference.PreferenceItem.TextPreference( Preference.PreferenceItem.TextPreference(
title = localize(MR.strings.pref_reset_viewer_flags), title = stringResource(MR.strings.pref_reset_viewer_flags),
subtitle = localize(MR.strings.pref_reset_viewer_flags_summary), subtitle = stringResource(MR.strings.pref_reset_viewer_flags_summary),
onClick = { onClick = {
scope.launchNonCancellable { scope.launchNonCancellable {
val success = Injekt.get<ResetViewerFlags>().await() val success = Injekt.get<ResetViewerFlags>().await()
@ -336,11 +336,11 @@ object SettingsAdvancedScreen : SearchableSettings {
val dismiss = { shizukuMissing = false } val dismiss = { shizukuMissing = false }
AlertDialog( AlertDialog(
onDismissRequest = dismiss, onDismissRequest = dismiss,
title = { Text(text = localize(MR.strings.ext_installer_shizuku)) }, title = { Text(text = stringResource(MR.strings.ext_installer_shizuku)) },
text = { Text(text = localize(MR.strings.ext_installer_shizuku_unavailable_dialog)) }, text = { Text(text = stringResource(MR.strings.ext_installer_shizuku_unavailable_dialog)) },
dismissButton = { dismissButton = {
TextButton(onClick = dismiss) { TextButton(onClick = dismiss) {
Text(text = localize(MR.strings.action_cancel)) Text(text = stringResource(MR.strings.action_cancel))
} }
}, },
confirmButton = { confirmButton = {
@ -350,19 +350,19 @@ object SettingsAdvancedScreen : SearchableSettings {
uriHandler.openUri("https://shizuku.rikka.app/download") uriHandler.openUri("https://shizuku.rikka.app/download")
}, },
) { ) {
Text(text = localize(MR.strings.action_ok)) Text(text = stringResource(MR.strings.action_ok))
} }
}, },
) )
} }
return Preference.PreferenceGroup( return Preference.PreferenceGroup(
title = localize(MR.strings.label_extensions), title = stringResource(MR.strings.label_extensions),
preferenceItems = listOf( preferenceItems = listOf(
Preference.PreferenceItem.ListPreference( Preference.PreferenceItem.ListPreference(
pref = extensionInstallerPref, pref = extensionInstallerPref,
title = localize(MR.strings.ext_installer_pref), title = stringResource(MR.strings.ext_installer_pref),
entries = extensionInstallerPref.entries entries = extensionInstallerPref.entries
.associateWith { localize(it.titleRes) }, .associateWith { stringResource(it.titleRes) },
onValueChanged = { onValueChanged = {
if (it == BasePreferences.ExtensionInstaller.SHIZUKU && if (it == BasePreferences.ExtensionInstaller.SHIZUKU &&
!context.isShizukuInstalled !context.isShizukuInstalled

View File

@ -27,9 +27,9 @@ import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.drop import kotlinx.coroutines.flow.drop
import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.merge
import org.xmlpull.v1.XmlPullParser import org.xmlpull.v1.XmlPullParser
import tachiyomi.core.i18n.localize import tachiyomi.core.i18n.stringResource
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.util.collectAsState import tachiyomi.presentation.core.util.collectAsState
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
@ -76,26 +76,26 @@ object SettingsAppearanceScreen : SearchableSettings {
} }
return Preference.PreferenceGroup( return Preference.PreferenceGroup(
title = localize(MR.strings.pref_category_theme), title = stringResource(MR.strings.pref_category_theme),
preferenceItems = listOf( preferenceItems = listOf(
Preference.PreferenceItem.ListPreference( Preference.PreferenceItem.ListPreference(
pref = themeModePref, pref = themeModePref,
title = localize(MR.strings.pref_theme_mode), title = stringResource(MR.strings.pref_theme_mode),
entries = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { entries = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
mapOf( mapOf(
ThemeMode.SYSTEM to localize(MR.strings.theme_system), ThemeMode.SYSTEM to stringResource(MR.strings.theme_system),
ThemeMode.LIGHT to localize(MR.strings.theme_light), ThemeMode.LIGHT to stringResource(MR.strings.theme_light),
ThemeMode.DARK to localize(MR.strings.theme_dark), ThemeMode.DARK to stringResource(MR.strings.theme_dark),
) )
} else { } else {
mapOf( mapOf(
ThemeMode.LIGHT to localize(MR.strings.theme_light), ThemeMode.LIGHT to stringResource(MR.strings.theme_light),
ThemeMode.DARK to localize(MR.strings.theme_dark), ThemeMode.DARK to stringResource(MR.strings.theme_dark),
) )
}, },
), ),
Preference.PreferenceItem.CustomPreference( Preference.PreferenceItem.CustomPreference(
title = localize(MR.strings.pref_app_theme), title = stringResource(MR.strings.pref_app_theme),
) { item -> ) { item ->
val value by appThemePref.collectAsState() val value by appThemePref.collectAsState()
AppThemePreferenceWidget( AppThemePreferenceWidget(
@ -107,7 +107,7 @@ object SettingsAppearanceScreen : SearchableSettings {
}, },
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = amoledPref, pref = amoledPref,
title = localize(MR.strings.pref_dark_theme_pure_black), title = stringResource(MR.strings.pref_dark_theme_pure_black),
enabled = themeMode != ThemeMode.LIGHT, enabled = themeMode != ThemeMode.LIGHT,
), ),
), ),
@ -140,11 +140,11 @@ object SettingsAppearanceScreen : SearchableSettings {
} }
return Preference.PreferenceGroup( return Preference.PreferenceGroup(
title = localize(MR.strings.pref_category_display), title = stringResource(MR.strings.pref_category_display),
preferenceItems = listOf( preferenceItems = listOf(
Preference.PreferenceItem.BasicListPreference( Preference.PreferenceItem.BasicListPreference(
value = currentLanguage, value = currentLanguage,
title = localize(MR.strings.pref_app_language), title = stringResource(MR.strings.pref_app_language),
entries = langs, entries = langs,
onValueChanged = { newValue -> onValueChanged = { newValue ->
currentLanguage = newValue currentLanguage = newValue
@ -153,8 +153,8 @@ object SettingsAppearanceScreen : SearchableSettings {
), ),
Preference.PreferenceItem.ListPreference( Preference.PreferenceItem.ListPreference(
pref = uiPreferences.tabletUiMode(), pref = uiPreferences.tabletUiMode(),
title = localize(MR.strings.pref_tablet_ui_mode), title = stringResource(MR.strings.pref_tablet_ui_mode),
entries = TabletUiMode.entries.associateWith { localize(it.titleRes) }, entries = TabletUiMode.entries.associateWith { stringResource(it.titleRes) },
onValueChanged = { onValueChanged = {
context.toast(MR.strings.requires_app_restart) context.toast(MR.strings.requires_app_restart)
true true
@ -162,19 +162,19 @@ object SettingsAppearanceScreen : SearchableSettings {
), ),
Preference.PreferenceItem.ListPreference( Preference.PreferenceItem.ListPreference(
pref = uiPreferences.dateFormat(), pref = uiPreferences.dateFormat(),
title = localize(MR.strings.pref_date_format), title = stringResource(MR.strings.pref_date_format),
entries = DateFormats entries = DateFormats
.associateWith { .associateWith {
val formattedDate = UiPreferences.dateFormat(it).format(now) val formattedDate = UiPreferences.dateFormat(it).format(now)
"${it.ifEmpty { localize(MR.strings.label_default) }} ($formattedDate)" "${it.ifEmpty { stringResource(MR.strings.label_default) }} ($formattedDate)"
}, },
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = uiPreferences.relativeTime(), pref = uiPreferences.relativeTime(),
title = localize(MR.strings.pref_relative_format), title = stringResource(MR.strings.pref_relative_format),
subtitle = localize( subtitle = stringResource(
MR.strings.pref_relative_format_summary, MR.strings.pref_relative_format_summary,
localize(MR.strings.relative_time_today), stringResource(MR.strings.relative_time_today),
formattedNow, formattedNow,
), ),
), ),
@ -201,7 +201,7 @@ object SettingsAppearanceScreen : SearchableSettings {
} }
langs.sortBy { it.second } langs.sortBy { it.second }
langs.add(0, Pair("", context.localize(MR.strings.label_default))) langs.add(0, Pair("", context.stringResource(MR.strings.label_default)))
return langs.toMap() return langs.toMap()
} }

View File

@ -8,9 +8,9 @@ import androidx.fragment.app.FragmentActivity
import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.domain.source.service.SourcePreferences
import eu.kanade.presentation.more.settings.Preference import eu.kanade.presentation.more.settings.Preference
import eu.kanade.tachiyomi.util.system.AuthenticatorUtil.authenticate import eu.kanade.tachiyomi.util.system.AuthenticatorUtil.authenticate
import tachiyomi.core.i18n.localize import tachiyomi.core.i18n.stringResource
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
@ -26,28 +26,28 @@ object SettingsBrowseScreen : SearchableSettings {
val sourcePreferences = remember { Injekt.get<SourcePreferences>() } val sourcePreferences = remember { Injekt.get<SourcePreferences>() }
return listOf( return listOf(
Preference.PreferenceGroup( Preference.PreferenceGroup(
title = localize(MR.strings.label_sources), title = stringResource(MR.strings.label_sources),
preferenceItems = listOf( preferenceItems = listOf(
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = sourcePreferences.hideInLibraryItems(), pref = sourcePreferences.hideInLibraryItems(),
title = localize(MR.strings.pref_hide_in_library_items), title = stringResource(MR.strings.pref_hide_in_library_items),
), ),
), ),
), ),
Preference.PreferenceGroup( Preference.PreferenceGroup(
title = localize(MR.strings.pref_category_nsfw_content), title = stringResource(MR.strings.pref_category_nsfw_content),
preferenceItems = listOf( preferenceItems = listOf(
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = sourcePreferences.showNsfwSource(), pref = sourcePreferences.showNsfwSource(),
title = localize(MR.strings.pref_show_nsfw_source), title = stringResource(MR.strings.pref_show_nsfw_source),
subtitle = localize(MR.strings.requires_app_restart), subtitle = stringResource(MR.strings.requires_app_restart),
onValueChanged = { onValueChanged = {
(context as FragmentActivity).authenticate( (context as FragmentActivity).authenticate(
title = context.localize(MR.strings.pref_category_nsfw_content), title = context.stringResource(MR.strings.pref_category_nsfw_content),
) )
}, },
), ),
Preference.PreferenceItem.InfoPreference(localize(MR.strings.parental_controls_info)), Preference.PreferenceItem.InfoPreference(stringResource(MR.strings.parental_controls_info)),
), ),
), ),
) )

View File

@ -43,14 +43,14 @@ import eu.kanade.tachiyomi.util.system.DeviceUtil
import eu.kanade.tachiyomi.util.system.copyToClipboard import eu.kanade.tachiyomi.util.system.copyToClipboard
import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.util.system.toast
import logcat.LogPriority import logcat.LogPriority
import tachiyomi.core.i18n.localize import tachiyomi.core.i18n.stringResource
import tachiyomi.core.util.lang.launchNonCancellable import tachiyomi.core.util.lang.launchNonCancellable
import tachiyomi.core.util.lang.withUIContext import tachiyomi.core.util.lang.withUIContext
import tachiyomi.core.util.system.logcat import tachiyomi.core.util.system.logcat
import tachiyomi.domain.backup.service.BackupPreferences import tachiyomi.domain.backup.service.BackupPreferences
import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.domain.library.service.LibraryPreferences
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.util.collectAsState import tachiyomi.presentation.core.util.collectAsState
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
@ -81,7 +81,7 @@ object SettingsDataScreen : SearchableSettings {
val lastAutoBackup by backupPreferences.lastAutoBackupTimestamp().collectAsState() val lastAutoBackup by backupPreferences.lastAutoBackupTimestamp().collectAsState()
return Preference.PreferenceGroup( return Preference.PreferenceGroup(
title = localize(MR.strings.label_backup), title = stringResource(MR.strings.label_backup),
preferenceItems = listOf( preferenceItems = listOf(
// Manual actions // Manual actions
getCreateBackupPref(), getCreateBackupPref(),
@ -90,14 +90,14 @@ object SettingsDataScreen : SearchableSettings {
// Automatic backups // Automatic backups
Preference.PreferenceItem.ListPreference( Preference.PreferenceItem.ListPreference(
pref = backupIntervalPref, pref = backupIntervalPref,
title = localize(MR.strings.pref_backup_interval), title = stringResource(MR.strings.pref_backup_interval),
entries = mapOf( entries = mapOf(
0 to localize(MR.strings.off), 0 to stringResource(MR.strings.off),
6 to localize(MR.strings.update_6hour), 6 to stringResource(MR.strings.update_6hour),
12 to localize(MR.strings.update_12hour), 12 to stringResource(MR.strings.update_12hour),
24 to localize(MR.strings.update_24hour), 24 to stringResource(MR.strings.update_24hour),
48 to localize(MR.strings.update_48hour), 48 to stringResource(MR.strings.update_48hour),
168 to localize(MR.strings.update_weekly), 168 to stringResource(MR.strings.update_weekly),
), ),
onValueChanged = { onValueChanged = {
BackupCreateJob.setupTask(context, it) BackupCreateJob.setupTask(context, it)
@ -107,12 +107,12 @@ object SettingsDataScreen : SearchableSettings {
Preference.PreferenceItem.ListPreference( Preference.PreferenceItem.ListPreference(
pref = backupPreferences.numberOfBackups(), pref = backupPreferences.numberOfBackups(),
enabled = backupInterval != 0, enabled = backupInterval != 0,
title = localize(MR.strings.pref_backup_slots), title = stringResource(MR.strings.pref_backup_slots),
entries = listOf(2, 3, 4, 5).associateWith { it.toString() }, entries = listOf(2, 3, 4, 5).associateWith { it.toString() },
), ),
Preference.PreferenceItem.InfoPreference( Preference.PreferenceItem.InfoPreference(
localize(MR.strings.backup_info) + "\n\n" + stringResource(MR.strings.backup_info) + "\n\n" +
localize(MR.strings.last_auto_backup_info, relativeTimeSpanString(lastAutoBackup)), stringResource(MR.strings.last_auto_backup_info, relativeTimeSpanString(lastAutoBackup)),
), ),
), ),
) )
@ -122,8 +122,8 @@ object SettingsDataScreen : SearchableSettings {
private fun getCreateBackupPref(): Preference.PreferenceItem.TextPreference { private fun getCreateBackupPref(): Preference.PreferenceItem.TextPreference {
val navigator = LocalNavigator.currentOrThrow val navigator = LocalNavigator.currentOrThrow
return Preference.PreferenceItem.TextPreference( return Preference.PreferenceItem.TextPreference(
title = localize(MR.strings.pref_create_backup), title = stringResource(MR.strings.pref_create_backup),
subtitle = localize(MR.strings.pref_create_backup_summ), subtitle = stringResource(MR.strings.pref_create_backup_summ),
onClick = { navigator.push(CreateBackupScreen()) }, onClick = { navigator.push(CreateBackupScreen()) },
) )
} }
@ -138,7 +138,7 @@ object SettingsDataScreen : SearchableSettings {
is InvalidRestore -> { is InvalidRestore -> {
AlertDialog( AlertDialog(
onDismissRequest = onDismissRequest, onDismissRequest = onDismissRequest,
title = { Text(text = localize(MR.strings.invalid_backup_file)) }, title = { Text(text = stringResource(MR.strings.invalid_backup_file)) },
text = { Text(text = listOfNotNull(err.uri, err.message).joinToString("\n\n")) }, text = { Text(text = listOfNotNull(err.uri, err.message).joinToString("\n\n")) },
dismissButton = { dismissButton = {
TextButton( TextButton(
@ -147,12 +147,12 @@ object SettingsDataScreen : SearchableSettings {
onDismissRequest() onDismissRequest()
}, },
) { ) {
Text(text = localize(MR.strings.action_copy_to_clipboard)) Text(text = stringResource(MR.strings.action_copy_to_clipboard))
} }
}, },
confirmButton = { confirmButton = {
TextButton(onClick = onDismissRequest) { TextButton(onClick = onDismissRequest) {
Text(text = localize(MR.strings.action_ok)) Text(text = stringResource(MR.strings.action_ok))
} }
}, },
) )
@ -160,15 +160,15 @@ object SettingsDataScreen : SearchableSettings {
is MissingRestoreComponents -> { is MissingRestoreComponents -> {
AlertDialog( AlertDialog(
onDismissRequest = onDismissRequest, onDismissRequest = onDismissRequest,
title = { Text(text = localize(MR.strings.pref_restore_backup)) }, title = { Text(text = stringResource(MR.strings.pref_restore_backup)) },
text = { text = {
Column( Column(
modifier = Modifier.verticalScroll(rememberScrollState()), modifier = Modifier.verticalScroll(rememberScrollState()),
) { ) {
val msg = buildString { val msg = buildString {
append(localize(MR.strings.backup_restore_content_full)) append(stringResource(MR.strings.backup_restore_content_full))
if (err.sources.isNotEmpty()) { if (err.sources.isNotEmpty()) {
append("\n\n").append(localize(MR.strings.backup_restore_missing_sources)) append("\n\n").append(stringResource(MR.strings.backup_restore_missing_sources))
err.sources.joinTo( err.sources.joinTo(
this, this,
separator = "\n- ", separator = "\n- ",
@ -176,7 +176,9 @@ object SettingsDataScreen : SearchableSettings {
) )
} }
if (err.trackers.isNotEmpty()) { if (err.trackers.isNotEmpty()) {
append("\n\n").append(localize(MR.strings.backup_restore_missing_trackers)) append(
"\n\n",
).append(stringResource(MR.strings.backup_restore_missing_trackers))
err.trackers.joinTo( err.trackers.joinTo(
this, this,
separator = "\n- ", separator = "\n- ",
@ -194,7 +196,7 @@ object SettingsDataScreen : SearchableSettings {
onDismissRequest() onDismissRequest()
}, },
) { ) {
Text(text = localize(MR.strings.action_restore)) Text(text = stringResource(MR.strings.action_restore))
} }
}, },
) )
@ -207,7 +209,7 @@ object SettingsDataScreen : SearchableSettings {
object : ActivityResultContracts.GetContent() { object : ActivityResultContracts.GetContent() {
override fun createIntent(context: Context, input: String): Intent { override fun createIntent(context: Context, input: String): Intent {
val intent = super.createIntent(context, input) val intent = super.createIntent(context, input)
return Intent.createChooser(intent, context.localize(MR.strings.file_select_backup)) return Intent.createChooser(intent, context.stringResource(MR.strings.file_select_backup))
} }
}, },
) { ) {
@ -232,8 +234,8 @@ object SettingsDataScreen : SearchableSettings {
} }
return Preference.PreferenceItem.TextPreference( return Preference.PreferenceItem.TextPreference(
title = localize(MR.strings.pref_restore_backup), title = stringResource(MR.strings.pref_restore_backup),
subtitle = localize(MR.strings.pref_restore_backup_summ), subtitle = stringResource(MR.strings.pref_restore_backup_summ),
onClick = { onClick = {
if (!BackupRestoreJob.isRunning(context)) { if (!BackupRestoreJob.isRunning(context)) {
if (DeviceUtil.isMiui && DeviceUtil.isMiuiOptimizationDisabled()) { if (DeviceUtil.isMiui && DeviceUtil.isMiuiOptimizationDisabled()) {
@ -259,19 +261,19 @@ object SettingsDataScreen : SearchableSettings {
val cacheReadableSize = remember(cacheReadableSizeSema) { chapterCache.readableSize } val cacheReadableSize = remember(cacheReadableSizeSema) { chapterCache.readableSize }
return Preference.PreferenceGroup( return Preference.PreferenceGroup(
title = localize(MR.strings.label_data), title = stringResource(MR.strings.label_data),
preferenceItems = listOf( preferenceItems = listOf(
getStorageInfoPref(cacheReadableSize), getStorageInfoPref(cacheReadableSize),
Preference.PreferenceItem.TextPreference( Preference.PreferenceItem.TextPreference(
title = localize(MR.strings.pref_clear_chapter_cache), title = stringResource(MR.strings.pref_clear_chapter_cache),
subtitle = localize(MR.strings.used_cache, cacheReadableSize), subtitle = stringResource(MR.strings.used_cache, cacheReadableSize),
onClick = { onClick = {
scope.launchNonCancellable { scope.launchNonCancellable {
try { try {
val deletedFiles = chapterCache.clear() val deletedFiles = chapterCache.clear()
withUIContext { withUIContext {
context.toast(context.localize(MR.strings.cache_deleted, deletedFiles)) context.toast(context.stringResource(MR.strings.cache_deleted, deletedFiles))
cacheReadableSizeSema++ cacheReadableSizeSema++
} }
} catch (e: Throwable) { } catch (e: Throwable) {
@ -283,7 +285,7 @@ object SettingsDataScreen : SearchableSettings {
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = libraryPreferences.autoClearChapterCache(), pref = libraryPreferences.autoClearChapterCache(),
title = localize(MR.strings.pref_auto_clear_chapter_cache), title = stringResource(MR.strings.pref_auto_clear_chapter_cache),
), ),
), ),
) )
@ -302,10 +304,10 @@ object SettingsDataScreen : SearchableSettings {
} }
return Preference.PreferenceItem.CustomPreference( return Preference.PreferenceItem.CustomPreference(
title = localize(MR.strings.pref_storage_usage), title = stringResource(MR.strings.pref_storage_usage),
) { ) {
BasePreferenceWidget( BasePreferenceWidget(
title = localize(MR.strings.pref_storage_usage), title = stringResource(MR.strings.pref_storage_usage),
subcomponent = { subcomponent = {
// TODO: downloads, SD cards, bar representation?, i18n // TODO: downloads, SD cards, bar representation?, i18n
Box(modifier = Modifier.padding(horizontal = PrefsHorizontalPadding)) { Box(modifier = Modifier.padding(horizontal = PrefsHorizontalPadding)) {

View File

@ -24,8 +24,8 @@ import tachiyomi.domain.category.interactor.GetCategories
import tachiyomi.domain.category.model.Category import tachiyomi.domain.category.model.Category
import tachiyomi.domain.download.service.DownloadPreferences import tachiyomi.domain.download.service.DownloadPreferences
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.pluralStringResource
import tachiyomi.presentation.core.i18n.localizePlural import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.util.collectAsState import tachiyomi.presentation.core.util.collectAsState
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
@ -47,16 +47,16 @@ object SettingsDownloadScreen : SearchableSettings {
getDownloadLocationPreference(downloadPreferences = downloadPreferences), getDownloadLocationPreference(downloadPreferences = downloadPreferences),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = downloadPreferences.downloadOnlyOverWifi(), pref = downloadPreferences.downloadOnlyOverWifi(),
title = localize(MR.strings.connected_to_wifi), title = stringResource(MR.strings.connected_to_wifi),
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = downloadPreferences.saveChaptersAsCBZ(), pref = downloadPreferences.saveChaptersAsCBZ(),
title = localize(MR.strings.save_chapter_as_cbz), title = stringResource(MR.strings.save_chapter_as_cbz),
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = downloadPreferences.splitTallImages(), pref = downloadPreferences.splitTallImages(),
title = localize(MR.strings.split_tall_images), title = stringResource(MR.strings.split_tall_images),
subtitle = localize(MR.strings.split_tall_images_summary), subtitle = stringResource(MR.strings.split_tall_images_summary),
), ),
getDeleteChaptersGroup( getDeleteChaptersGroup(
downloadPreferences = downloadPreferences, downloadPreferences = downloadPreferences,
@ -97,15 +97,15 @@ object SettingsDownloadScreen : SearchableSettings {
return Preference.PreferenceItem.ListPreference( return Preference.PreferenceItem.ListPreference(
pref = currentDirPref, pref = currentDirPref,
title = localize(MR.strings.pref_download_directory), title = stringResource(MR.strings.pref_download_directory),
subtitleProvider = { value, _ -> subtitleProvider = { value, _ ->
remember(value) { remember(value) {
UniFile.fromUri(context, value.toUri())?.filePath UniFile.fromUri(context, value.toUri())?.filePath
} ?: localize(MR.strings.invalid_location, value) } ?: stringResource(MR.strings.invalid_location, value)
}, },
entries = mapOf( entries = mapOf(
defaultDirPair, defaultDirPair,
customDirEntryKey to localize(MR.strings.custom_dir), customDirEntryKey to stringResource(MR.strings.custom_dir),
), ),
onValueChanged = { onValueChanged = {
val default = it == defaultDirPair.first val default = it == defaultDirPair.first
@ -119,7 +119,7 @@ object SettingsDownloadScreen : SearchableSettings {
@Composable @Composable
private fun rememberDefaultDownloadDir(): Pair<String, String> { private fun rememberDefaultDownloadDir(): Pair<String, String> {
val appName = localize(MR.strings.app_name) val appName = stringResource(MR.strings.app_name)
return remember { return remember {
val file = UniFile.fromFile( val file = UniFile.fromFile(
File( File(
@ -137,27 +137,27 @@ object SettingsDownloadScreen : SearchableSettings {
categories: List<Category>, categories: List<Category>,
): Preference.PreferenceGroup { ): Preference.PreferenceGroup {
return Preference.PreferenceGroup( return Preference.PreferenceGroup(
title = localize(MR.strings.pref_category_delete_chapters), title = stringResource(MR.strings.pref_category_delete_chapters),
preferenceItems = listOf( preferenceItems = listOf(
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = downloadPreferences.removeAfterMarkedAsRead(), pref = downloadPreferences.removeAfterMarkedAsRead(),
title = localize(MR.strings.pref_remove_after_marked_as_read), title = stringResource(MR.strings.pref_remove_after_marked_as_read),
), ),
Preference.PreferenceItem.ListPreference( Preference.PreferenceItem.ListPreference(
pref = downloadPreferences.removeAfterReadSlots(), pref = downloadPreferences.removeAfterReadSlots(),
title = localize(MR.strings.pref_remove_after_read), title = stringResource(MR.strings.pref_remove_after_read),
entries = mapOf( entries = mapOf(
-1 to localize(MR.strings.disabled), -1 to stringResource(MR.strings.disabled),
0 to localize(MR.strings.last_read_chapter), 0 to stringResource(MR.strings.last_read_chapter),
1 to localize(MR.strings.second_to_last), 1 to stringResource(MR.strings.second_to_last),
2 to localize(MR.strings.third_to_last), 2 to stringResource(MR.strings.third_to_last),
3 to localize(MR.strings.fourth_to_last), 3 to stringResource(MR.strings.fourth_to_last),
4 to localize(MR.strings.fifth_to_last), 4 to stringResource(MR.strings.fifth_to_last),
), ),
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = downloadPreferences.removeBookmarkedChapters(), pref = downloadPreferences.removeBookmarkedChapters(),
title = localize(MR.strings.pref_remove_bookmarked_chapters), title = stringResource(MR.strings.pref_remove_bookmarked_chapters),
), ),
getExcludedCategoriesPreference( getExcludedCategoriesPreference(
downloadPreferences = downloadPreferences, downloadPreferences = downloadPreferences,
@ -174,7 +174,7 @@ object SettingsDownloadScreen : SearchableSettings {
): Preference.PreferenceItem.MultiSelectListPreference { ): Preference.PreferenceItem.MultiSelectListPreference {
return Preference.PreferenceItem.MultiSelectListPreference( return Preference.PreferenceItem.MultiSelectListPreference(
pref = downloadPreferences.removeExcludeCategories(), pref = downloadPreferences.removeExcludeCategories(),
title = localize(MR.strings.pref_remove_exclude_categories), title = stringResource(MR.strings.pref_remove_exclude_categories),
entries = categories().associate { it.id.toString() to it.visualName }, entries = categories().associate { it.id.toString() to it.visualName },
) )
} }
@ -195,8 +195,8 @@ object SettingsDownloadScreen : SearchableSettings {
var showDialog by rememberSaveable { mutableStateOf(false) } var showDialog by rememberSaveable { mutableStateOf(false) }
if (showDialog) { if (showDialog) {
TriStateListDialog( TriStateListDialog(
title = localize(MR.strings.categories), title = stringResource(MR.strings.categories),
message = localize(MR.strings.pref_download_new_categories_details), message = stringResource(MR.strings.pref_download_new_categories_details),
items = allCategories, items = allCategories,
initialChecked = included.mapNotNull { id -> allCategories.find { it.id.toString() == id } }, initialChecked = included.mapNotNull { id -> allCategories.find { it.id.toString() == id } },
initialInversed = excluded.mapNotNull { id -> allCategories.find { it.id.toString() == id } }, initialInversed = excluded.mapNotNull { id -> allCategories.find { it.id.toString() == id } },
@ -211,14 +211,14 @@ object SettingsDownloadScreen : SearchableSettings {
} }
return Preference.PreferenceGroup( return Preference.PreferenceGroup(
title = localize(MR.strings.pref_category_auto_download), title = stringResource(MR.strings.pref_category_auto_download),
preferenceItems = listOf( preferenceItems = listOf(
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = downloadNewChaptersPref, pref = downloadNewChaptersPref,
title = localize(MR.strings.pref_download_new), title = stringResource(MR.strings.pref_download_new),
), ),
Preference.PreferenceItem.TextPreference( Preference.PreferenceItem.TextPreference(
title = localize(MR.strings.categories), title = stringResource(MR.strings.categories),
subtitle = getCategoriesLabel( subtitle = getCategoriesLabel(
allCategories = allCategories, allCategories = allCategories,
included = included, included = included,
@ -236,20 +236,20 @@ object SettingsDownloadScreen : SearchableSettings {
downloadPreferences: DownloadPreferences, downloadPreferences: DownloadPreferences,
): Preference.PreferenceGroup { ): Preference.PreferenceGroup {
return Preference.PreferenceGroup( return Preference.PreferenceGroup(
title = localize(MR.strings.download_ahead), title = stringResource(MR.strings.download_ahead),
preferenceItems = listOf( preferenceItems = listOf(
Preference.PreferenceItem.ListPreference( Preference.PreferenceItem.ListPreference(
pref = downloadPreferences.autoDownloadWhileReading(), pref = downloadPreferences.autoDownloadWhileReading(),
title = localize(MR.strings.auto_download_while_reading), title = stringResource(MR.strings.auto_download_while_reading),
entries = listOf(0, 2, 3, 5, 10).associateWith { entries = listOf(0, 2, 3, 5, 10).associateWith {
if (it == 0) { if (it == 0) {
localize(MR.strings.disabled) stringResource(MR.strings.disabled)
} else { } else {
localizePlural(MR.plurals.next_unread_chapters, count = it, it) pluralStringResource(MR.plurals.next_unread_chapters, count = it, it)
} }
}, },
), ),
Preference.PreferenceItem.InfoPreference(localize(MR.strings.download_ahead_info)), Preference.PreferenceItem.InfoPreference(stringResource(MR.strings.download_ahead_info)),
), ),
) )
} }

View File

@ -34,8 +34,8 @@ import tachiyomi.domain.library.service.LibraryPreferences.Companion.MANGA_NON_C
import tachiyomi.domain.library.service.LibraryPreferences.Companion.MANGA_NON_READ import tachiyomi.domain.library.service.LibraryPreferences.Companion.MANGA_NON_READ
import tachiyomi.domain.library.service.LibraryPreferences.Companion.MANGA_OUTSIDE_RELEASE_PERIOD import tachiyomi.domain.library.service.LibraryPreferences.Companion.MANGA_OUTSIDE_RELEASE_PERIOD
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.pluralStringResource
import tachiyomi.presentation.core.i18n.localizePlural import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.util.collectAsState import tachiyomi.presentation.core.util.collectAsState
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
@ -75,15 +75,15 @@ object SettingsLibraryScreen : SearchableSettings {
// For default category // For default category
val ids = listOf(libraryPreferences.defaultCategory().defaultValue()) + val ids = listOf(libraryPreferences.defaultCategory().defaultValue()) +
allCategories.fastMap { it.id.toInt() } allCategories.fastMap { it.id.toInt() }
val labels = listOf(localize(MR.strings.default_category_summary)) + val labels = listOf(stringResource(MR.strings.default_category_summary)) +
allCategories.fastMap { it.visualName(context) } allCategories.fastMap { it.visualName(context) }
return Preference.PreferenceGroup( return Preference.PreferenceGroup(
title = localize(MR.strings.categories), title = stringResource(MR.strings.categories),
preferenceItems = listOf( preferenceItems = listOf(
Preference.PreferenceItem.TextPreference( Preference.PreferenceItem.TextPreference(
title = localize(MR.strings.action_edit_categories), title = stringResource(MR.strings.action_edit_categories),
subtitle = localizePlural( subtitle = pluralStringResource(
MR.plurals.num_categories, MR.plurals.num_categories,
count = userCategoriesCount, count = userCategoriesCount,
userCategoriesCount, userCategoriesCount,
@ -92,13 +92,13 @@ object SettingsLibraryScreen : SearchableSettings {
), ),
Preference.PreferenceItem.ListPreference( Preference.PreferenceItem.ListPreference(
pref = libraryPreferences.defaultCategory(), pref = libraryPreferences.defaultCategory(),
title = localize(MR.strings.default_category), title = stringResource(MR.strings.default_category),
subtitle = selectedCategory?.visualName ?: localize(MR.strings.default_category_summary), subtitle = selectedCategory?.visualName ?: stringResource(MR.strings.default_category_summary),
entries = ids.zip(labels).toMap(), entries = ids.zip(labels).toMap(),
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = libraryPreferences.categorizedDisplaySettings(), pref = libraryPreferences.categorizedDisplaySettings(),
title = localize(MR.strings.categorized_display_settings), title = stringResource(MR.strings.categorized_display_settings),
onValueChanged = { onValueChanged = {
if (!it) { if (!it) {
scope.launch { scope.launch {
@ -130,8 +130,8 @@ object SettingsLibraryScreen : SearchableSettings {
var showCategoriesDialog by rememberSaveable { mutableStateOf(false) } var showCategoriesDialog by rememberSaveable { mutableStateOf(false) }
if (showCategoriesDialog) { if (showCategoriesDialog) {
TriStateListDialog( TriStateListDialog(
title = localize(MR.strings.categories), title = stringResource(MR.strings.categories),
message = localize(MR.strings.pref_library_update_categories_details), message = stringResource(MR.strings.pref_library_update_categories_details),
items = allCategories, items = allCategories,
initialChecked = included.mapNotNull { id -> allCategories.find { it.id.toString() == id } }, initialChecked = included.mapNotNull { id -> allCategories.find { it.id.toString() == id } },
initialInversed = excluded.mapNotNull { id -> allCategories.find { it.id.toString() == id } }, initialInversed = excluded.mapNotNull { id -> allCategories.find { it.id.toString() == id } },
@ -146,18 +146,18 @@ object SettingsLibraryScreen : SearchableSettings {
} }
return Preference.PreferenceGroup( return Preference.PreferenceGroup(
title = localize(MR.strings.pref_category_library_update), title = stringResource(MR.strings.pref_category_library_update),
preferenceItems = listOf( preferenceItems = listOf(
Preference.PreferenceItem.ListPreference( Preference.PreferenceItem.ListPreference(
pref = autoUpdateIntervalPref, pref = autoUpdateIntervalPref,
title = localize(MR.strings.pref_library_update_interval), title = stringResource(MR.strings.pref_library_update_interval),
entries = mapOf( entries = mapOf(
0 to localize(MR.strings.update_never), 0 to stringResource(MR.strings.update_never),
12 to localize(MR.strings.update_12hour), 12 to stringResource(MR.strings.update_12hour),
24 to localize(MR.strings.update_24hour), 24 to stringResource(MR.strings.update_24hour),
48 to localize(MR.strings.update_48hour), 48 to stringResource(MR.strings.update_48hour),
72 to localize(MR.strings.update_72hour), 72 to stringResource(MR.strings.update_72hour),
168 to localize(MR.strings.update_weekly), 168 to stringResource(MR.strings.update_weekly),
), ),
onValueChanged = { onValueChanged = {
LibraryUpdateJob.setupTask(context, it) LibraryUpdateJob.setupTask(context, it)
@ -167,12 +167,12 @@ object SettingsLibraryScreen : SearchableSettings {
Preference.PreferenceItem.MultiSelectListPreference( Preference.PreferenceItem.MultiSelectListPreference(
pref = libraryPreferences.autoUpdateDeviceRestrictions(), pref = libraryPreferences.autoUpdateDeviceRestrictions(),
enabled = autoUpdateInterval > 0, enabled = autoUpdateInterval > 0,
title = localize(MR.strings.pref_library_update_restriction), title = stringResource(MR.strings.pref_library_update_restriction),
subtitle = localize(MR.strings.restrictions), subtitle = stringResource(MR.strings.restrictions),
entries = mapOf( entries = mapOf(
DEVICE_ONLY_ON_WIFI to localize(MR.strings.connected_to_wifi), DEVICE_ONLY_ON_WIFI to stringResource(MR.strings.connected_to_wifi),
DEVICE_NETWORK_NOT_METERED to localize(MR.strings.network_not_metered), DEVICE_NETWORK_NOT_METERED to stringResource(MR.strings.network_not_metered),
DEVICE_CHARGING to localize(MR.strings.charging), DEVICE_CHARGING to stringResource(MR.strings.charging),
), ),
onValueChanged = { onValueChanged = {
// Post to event looper to allow the preference to be updated. // Post to event looper to allow the preference to be updated.
@ -181,7 +181,7 @@ object SettingsLibraryScreen : SearchableSettings {
}, },
), ),
Preference.PreferenceItem.TextPreference( Preference.PreferenceItem.TextPreference(
title = localize(MR.strings.categories), title = stringResource(MR.strings.categories),
subtitle = getCategoriesLabel( subtitle = getCategoriesLabel(
allCategories = allCategories, allCategories = allCategories,
included = included, included = included,
@ -191,22 +191,22 @@ object SettingsLibraryScreen : SearchableSettings {
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = libraryPreferences.autoUpdateMetadata(), pref = libraryPreferences.autoUpdateMetadata(),
title = localize(MR.strings.pref_library_update_refresh_metadata), title = stringResource(MR.strings.pref_library_update_refresh_metadata),
subtitle = localize(MR.strings.pref_library_update_refresh_metadata_summary), subtitle = stringResource(MR.strings.pref_library_update_refresh_metadata_summary),
), ),
Preference.PreferenceItem.MultiSelectListPreference( Preference.PreferenceItem.MultiSelectListPreference(
pref = libraryPreferences.autoUpdateMangaRestrictions(), pref = libraryPreferences.autoUpdateMangaRestrictions(),
title = localize(MR.strings.pref_library_update_manga_restriction), title = stringResource(MR.strings.pref_library_update_manga_restriction),
entries = mapOf( entries = mapOf(
MANGA_HAS_UNREAD to localize(MR.strings.pref_update_only_completely_read), MANGA_HAS_UNREAD to stringResource(MR.strings.pref_update_only_completely_read),
MANGA_NON_READ to localize(MR.strings.pref_update_only_started), MANGA_NON_READ to stringResource(MR.strings.pref_update_only_started),
MANGA_NON_COMPLETED to localize(MR.strings.pref_update_only_non_completed), MANGA_NON_COMPLETED to stringResource(MR.strings.pref_update_only_non_completed),
MANGA_OUTSIDE_RELEASE_PERIOD to localize(MR.strings.pref_update_only_in_release_period), MANGA_OUTSIDE_RELEASE_PERIOD to stringResource(MR.strings.pref_update_only_in_release_period),
), ),
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = libraryPreferences.newShowUpdatesCount(), pref = libraryPreferences.newShowUpdatesCount(),
title = localize(MR.strings.pref_library_update_show_tab_badge), title = stringResource(MR.strings.pref_library_update_show_tab_badge),
), ),
), ),
) )
@ -217,34 +217,34 @@ object SettingsLibraryScreen : SearchableSettings {
libraryPreferences: LibraryPreferences, libraryPreferences: LibraryPreferences,
): Preference.PreferenceGroup { ): Preference.PreferenceGroup {
return Preference.PreferenceGroup( return Preference.PreferenceGroup(
title = localize(MR.strings.pref_chapter_swipe), title = stringResource(MR.strings.pref_chapter_swipe),
preferenceItems = listOf( preferenceItems = listOf(
Preference.PreferenceItem.ListPreference( Preference.PreferenceItem.ListPreference(
pref = libraryPreferences.swipeToStartAction(), pref = libraryPreferences.swipeToStartAction(),
title = localize(MR.strings.pref_chapter_swipe_start), title = stringResource(MR.strings.pref_chapter_swipe_start),
entries = mapOf( entries = mapOf(
LibraryPreferences.ChapterSwipeAction.Disabled to LibraryPreferences.ChapterSwipeAction.Disabled to
localize(MR.strings.disabled), stringResource(MR.strings.disabled),
LibraryPreferences.ChapterSwipeAction.ToggleBookmark to LibraryPreferences.ChapterSwipeAction.ToggleBookmark to
localize(MR.strings.action_bookmark), stringResource(MR.strings.action_bookmark),
LibraryPreferences.ChapterSwipeAction.ToggleRead to LibraryPreferences.ChapterSwipeAction.ToggleRead to
localize(MR.strings.action_mark_as_read), stringResource(MR.strings.action_mark_as_read),
LibraryPreferences.ChapterSwipeAction.Download to LibraryPreferences.ChapterSwipeAction.Download to
localize(MR.strings.action_download), stringResource(MR.strings.action_download),
), ),
), ),
Preference.PreferenceItem.ListPreference( Preference.PreferenceItem.ListPreference(
pref = libraryPreferences.swipeToEndAction(), pref = libraryPreferences.swipeToEndAction(),
title = localize(MR.strings.pref_chapter_swipe_end), title = stringResource(MR.strings.pref_chapter_swipe_end),
entries = mapOf( entries = mapOf(
LibraryPreferences.ChapterSwipeAction.Disabled to LibraryPreferences.ChapterSwipeAction.Disabled to
localize(MR.strings.disabled), stringResource(MR.strings.disabled),
LibraryPreferences.ChapterSwipeAction.ToggleBookmark to LibraryPreferences.ChapterSwipeAction.ToggleBookmark to
localize(MR.strings.action_bookmark), stringResource(MR.strings.action_bookmark),
LibraryPreferences.ChapterSwipeAction.ToggleRead to LibraryPreferences.ChapterSwipeAction.ToggleRead to
localize(MR.strings.action_mark_as_read), stringResource(MR.strings.action_mark_as_read),
LibraryPreferences.ChapterSwipeAction.Download to LibraryPreferences.ChapterSwipeAction.Download to
localize(MR.strings.action_download), stringResource(MR.strings.action_download),
), ),
), ),
), ),

View File

@ -47,7 +47,7 @@ import eu.kanade.presentation.util.Screen
import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentListOf
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.Scaffold
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import cafe.adriel.voyager.core.screen.Screen as VoyagerScreen import cafe.adriel.voyager.core.screen.Screen as VoyagerScreen
object SettingsMainScreen : Screen() { object SettingsMainScreen : Screen() {
@ -84,13 +84,13 @@ object SettingsMainScreen : Screen() {
topBarScrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(topBarState), topBarScrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(topBarState),
topBar = { scrollBehavior -> topBar = { scrollBehavior ->
AppBar( AppBar(
title = localize(MR.strings.label_settings), title = stringResource(MR.strings.label_settings),
navigateUp = backPress::invoke, navigateUp = backPress::invoke,
actions = { actions = {
AppBarActions( AppBarActions(
persistentListOf( persistentListOf(
AppBar.Action( AppBar.Action(
title = localize(MR.strings.action_search), title = stringResource(MR.strings.action_search),
icon = Icons.Outlined.Search, icon = Icons.Outlined.Search,
onClick = { navigator.navigate(SettingsSearchScreen(), twoPane) }, onClick = { navigator.navigate(SettingsSearchScreen(), twoPane) },
), ),
@ -147,7 +147,7 @@ object SettingsMainScreen : Screen() {
CompositionLocalProvider(LocalContentColor provides contentColor) { CompositionLocalProvider(LocalContentColor provides contentColor) {
TextPreferenceWidget( TextPreferenceWidget(
modifier = modifier, modifier = modifier,
title = localize(item.titleRes), title = stringResource(item.titleRes),
subtitle = item.formatSubtitle(), subtitle = item.formatSubtitle(),
icon = item.icon, icon = item.icon,
onPreferenceClick = { navigator.navigate(item.screen, twoPane) }, onPreferenceClick = { navigator.navigate(item.screen, twoPane) },
@ -166,7 +166,7 @@ object SettingsMainScreen : Screen() {
private data class Item( private data class Item(
val titleRes: StringResource, val titleRes: StringResource,
val subtitleRes: StringResource? = null, val subtitleRes: StringResource? = null,
val formatSubtitle: @Composable () -> String? = { subtitleRes?.let { localize(it) } }, val formatSubtitle: @Composable () -> String? = { subtitleRes?.let { stringResource(it) } },
val icon: ImageVector, val icon: ImageVector,
val screen: VoyagerScreen, val screen: VoyagerScreen,
) )
@ -229,7 +229,7 @@ object SettingsMainScreen : Screen() {
Item( Item(
titleRes = MR.strings.pref_category_about, titleRes = MR.strings.pref_category_about,
formatSubtitle = { formatSubtitle = {
"${localize(MR.strings.app_name)} ${AboutScreen.getVersionName(withBuildDate = false)}" "${stringResource(MR.strings.app_name)} ${AboutScreen.getVersionName(withBuildDate = false)}"
}, },
icon = Icons.Outlined.Info, icon = Icons.Outlined.Info,
screen = AboutScreen, screen = AboutScreen,

View File

@ -11,7 +11,7 @@ import eu.kanade.tachiyomi.ui.reader.setting.ReaderOrientation
import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences
import eu.kanade.tachiyomi.ui.reader.setting.ReadingMode import eu.kanade.tachiyomi.ui.reader.setting.ReadingMode
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.util.collectAsState import tachiyomi.presentation.core.util.collectAsState
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
@ -29,43 +29,43 @@ object SettingsReaderScreen : SearchableSettings {
return listOf( return listOf(
Preference.PreferenceItem.ListPreference( Preference.PreferenceItem.ListPreference(
pref = readerPref.defaultReadingMode(), pref = readerPref.defaultReadingMode(),
title = localize(MR.strings.pref_viewer_type), title = stringResource(MR.strings.pref_viewer_type),
entries = ReadingMode.entries.drop(1) entries = ReadingMode.entries.drop(1)
.associate { it.flagValue to localize(it.stringRes) }, .associate { it.flagValue to stringResource(it.stringRes) },
), ),
Preference.PreferenceItem.ListPreference( Preference.PreferenceItem.ListPreference(
pref = readerPref.doubleTapAnimSpeed(), pref = readerPref.doubleTapAnimSpeed(),
title = localize(MR.strings.pref_double_tap_anim_speed), title = stringResource(MR.strings.pref_double_tap_anim_speed),
entries = mapOf( entries = mapOf(
1 to localize(MR.strings.double_tap_anim_speed_0), 1 to stringResource(MR.strings.double_tap_anim_speed_0),
500 to localize(MR.strings.double_tap_anim_speed_normal), 500 to stringResource(MR.strings.double_tap_anim_speed_normal),
250 to localize(MR.strings.double_tap_anim_speed_fast), 250 to stringResource(MR.strings.double_tap_anim_speed_fast),
), ),
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = readerPref.showReadingMode(), pref = readerPref.showReadingMode(),
title = localize(MR.strings.pref_show_reading_mode), title = stringResource(MR.strings.pref_show_reading_mode),
subtitle = localize(MR.strings.pref_show_reading_mode_summary), subtitle = stringResource(MR.strings.pref_show_reading_mode_summary),
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = readerPref.showNavigationOverlayOnStart(), pref = readerPref.showNavigationOverlayOnStart(),
title = localize(MR.strings.pref_show_navigation_mode), title = stringResource(MR.strings.pref_show_navigation_mode),
subtitle = localize(MR.strings.pref_show_navigation_mode_summary), subtitle = stringResource(MR.strings.pref_show_navigation_mode_summary),
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = readerPref.trueColor(), pref = readerPref.trueColor(),
title = localize(MR.strings.pref_true_color), title = stringResource(MR.strings.pref_true_color),
subtitle = localize(MR.strings.pref_true_color_summary), subtitle = stringResource(MR.strings.pref_true_color_summary),
enabled = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O, enabled = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O,
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = readerPref.pageTransitions(), pref = readerPref.pageTransitions(),
title = localize(MR.strings.pref_page_transitions), title = stringResource(MR.strings.pref_page_transitions),
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = readerPref.flashOnPageChange(), pref = readerPref.flashOnPageChange(),
title = localize(MR.strings.pref_flash_page), title = stringResource(MR.strings.pref_flash_page),
subtitle = localize(MR.strings.pref_flash_page_summ), subtitle = stringResource(MR.strings.pref_flash_page_summ),
), ),
getDisplayGroup(readerPreferences = readerPref), getDisplayGroup(readerPreferences = readerPref),
getReadingGroup(readerPreferences = readerPref), getReadingGroup(readerPreferences = readerPref),
@ -81,42 +81,42 @@ object SettingsReaderScreen : SearchableSettings {
val fullscreenPref = readerPreferences.fullscreen() val fullscreenPref = readerPreferences.fullscreen()
val fullscreen by fullscreenPref.collectAsState() val fullscreen by fullscreenPref.collectAsState()
return Preference.PreferenceGroup( return Preference.PreferenceGroup(
title = localize(MR.strings.pref_category_display), title = stringResource(MR.strings.pref_category_display),
preferenceItems = listOf( preferenceItems = listOf(
Preference.PreferenceItem.ListPreference( Preference.PreferenceItem.ListPreference(
pref = readerPreferences.defaultOrientationType(), pref = readerPreferences.defaultOrientationType(),
title = localize(MR.strings.pref_rotation_type), title = stringResource(MR.strings.pref_rotation_type),
entries = ReaderOrientation.entries.drop(1) entries = ReaderOrientation.entries.drop(1)
.associate { it.flagValue to localize(it.stringRes) }, .associate { it.flagValue to stringResource(it.stringRes) },
), ),
Preference.PreferenceItem.ListPreference( Preference.PreferenceItem.ListPreference(
pref = readerPreferences.readerTheme(), pref = readerPreferences.readerTheme(),
title = localize(MR.strings.pref_reader_theme), title = stringResource(MR.strings.pref_reader_theme),
entries = mapOf( entries = mapOf(
1 to localize(MR.strings.black_background), 1 to stringResource(MR.strings.black_background),
2 to localize(MR.strings.gray_background), 2 to stringResource(MR.strings.gray_background),
0 to localize(MR.strings.white_background), 0 to stringResource(MR.strings.white_background),
3 to localize(MR.strings.automatic_background), 3 to stringResource(MR.strings.automatic_background),
), ),
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = fullscreenPref, pref = fullscreenPref,
title = localize(MR.strings.pref_fullscreen), title = stringResource(MR.strings.pref_fullscreen),
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = readerPreferences.cutoutShort(), pref = readerPreferences.cutoutShort(),
title = localize(MR.strings.pref_cutout_short), title = stringResource(MR.strings.pref_cutout_short),
enabled = fullscreen && enabled = fullscreen &&
Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && Build.VERSION.SDK_INT >= Build.VERSION_CODES.P &&
LocalView.current.rootWindowInsets?.displayCutout != null, // has cutout LocalView.current.rootWindowInsets?.displayCutout != null, // has cutout
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = readerPreferences.keepScreenOn(), pref = readerPreferences.keepScreenOn(),
title = localize(MR.strings.pref_keep_screen_on), title = stringResource(MR.strings.pref_keep_screen_on),
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = readerPreferences.showPageNumber(), pref = readerPreferences.showPageNumber(),
title = localize(MR.strings.pref_show_page_number), title = stringResource(MR.strings.pref_show_page_number),
), ),
), ),
) )
@ -125,23 +125,23 @@ object SettingsReaderScreen : SearchableSettings {
@Composable @Composable
private fun getReadingGroup(readerPreferences: ReaderPreferences): Preference.PreferenceGroup { private fun getReadingGroup(readerPreferences: ReaderPreferences): Preference.PreferenceGroup {
return Preference.PreferenceGroup( return Preference.PreferenceGroup(
title = localize(MR.strings.pref_category_reading), title = stringResource(MR.strings.pref_category_reading),
preferenceItems = listOf( preferenceItems = listOf(
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = readerPreferences.skipRead(), pref = readerPreferences.skipRead(),
title = localize(MR.strings.pref_skip_read_chapters), title = stringResource(MR.strings.pref_skip_read_chapters),
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = readerPreferences.skipFiltered(), pref = readerPreferences.skipFiltered(),
title = localize(MR.strings.pref_skip_filtered_chapters), title = stringResource(MR.strings.pref_skip_filtered_chapters),
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = readerPreferences.skipDupe(), pref = readerPreferences.skipDupe(),
title = localize(MR.strings.pref_skip_dupe_chapters), title = stringResource(MR.strings.pref_skip_dupe_chapters),
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = readerPreferences.alwaysShowChapterTransition(), pref = readerPreferences.alwaysShowChapterTransition(),
title = localize(MR.strings.pref_always_show_chapter_transition), title = stringResource(MR.strings.pref_always_show_chapter_transition),
), ),
), ),
) )
@ -160,57 +160,57 @@ object SettingsReaderScreen : SearchableSettings {
val rotateToFit by rotateToFitPref.collectAsState() val rotateToFit by rotateToFitPref.collectAsState()
return Preference.PreferenceGroup( return Preference.PreferenceGroup(
title = localize(MR.strings.pager_viewer), title = stringResource(MR.strings.pager_viewer),
preferenceItems = listOf( preferenceItems = listOf(
Preference.PreferenceItem.ListPreference( Preference.PreferenceItem.ListPreference(
pref = navModePref, pref = navModePref,
title = localize(MR.strings.pref_viewer_nav), title = stringResource(MR.strings.pref_viewer_nav),
entries = ReaderPreferences.TapZones entries = ReaderPreferences.TapZones
.mapIndexed { index, it -> index to localize(it) } .mapIndexed { index, it -> index to stringResource(it) }
.toMap(), .toMap(),
), ),
Preference.PreferenceItem.ListPreference( Preference.PreferenceItem.ListPreference(
pref = readerPreferences.pagerNavInverted(), pref = readerPreferences.pagerNavInverted(),
title = localize(MR.strings.pref_read_with_tapping_inverted), title = stringResource(MR.strings.pref_read_with_tapping_inverted),
entries = listOf( entries = listOf(
ReaderPreferences.TappingInvertMode.NONE, ReaderPreferences.TappingInvertMode.NONE,
ReaderPreferences.TappingInvertMode.HORIZONTAL, ReaderPreferences.TappingInvertMode.HORIZONTAL,
ReaderPreferences.TappingInvertMode.VERTICAL, ReaderPreferences.TappingInvertMode.VERTICAL,
ReaderPreferences.TappingInvertMode.BOTH, ReaderPreferences.TappingInvertMode.BOTH,
).associateWith { localize(it.titleRes) }, ).associateWith { stringResource(it.titleRes) },
enabled = navMode != 5, enabled = navMode != 5,
), ),
Preference.PreferenceItem.ListPreference( Preference.PreferenceItem.ListPreference(
pref = imageScaleTypePref, pref = imageScaleTypePref,
title = localize(MR.strings.pref_image_scale_type), title = stringResource(MR.strings.pref_image_scale_type),
entries = ReaderPreferences.ImageScaleType entries = ReaderPreferences.ImageScaleType
.mapIndexed { index, it -> index + 1 to localize(it) } .mapIndexed { index, it -> index + 1 to stringResource(it) }
.toMap(), .toMap(),
), ),
Preference.PreferenceItem.ListPreference( Preference.PreferenceItem.ListPreference(
pref = readerPreferences.zoomStart(), pref = readerPreferences.zoomStart(),
title = localize(MR.strings.pref_zoom_start), title = stringResource(MR.strings.pref_zoom_start),
entries = ReaderPreferences.ZoomStart entries = ReaderPreferences.ZoomStart
.mapIndexed { index, it -> index + 1 to localize(it) } .mapIndexed { index, it -> index + 1 to stringResource(it) }
.toMap(), .toMap(),
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = readerPreferences.cropBorders(), pref = readerPreferences.cropBorders(),
title = localize(MR.strings.pref_crop_borders), title = stringResource(MR.strings.pref_crop_borders),
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = readerPreferences.landscapeZoom(), pref = readerPreferences.landscapeZoom(),
title = localize(MR.strings.pref_landscape_zoom), title = stringResource(MR.strings.pref_landscape_zoom),
enabled = imageScaleType == 1, enabled = imageScaleType == 1,
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = readerPreferences.navigateToPan(), pref = readerPreferences.navigateToPan(),
title = localize(MR.strings.pref_navigate_pan), title = stringResource(MR.strings.pref_navigate_pan),
enabled = navMode != 5, enabled = navMode != 5,
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = dualPageSplitPref, pref = dualPageSplitPref,
title = localize(MR.strings.pref_dual_page_split), title = stringResource(MR.strings.pref_dual_page_split),
onValueChanged = { onValueChanged = {
rotateToFitPref.set(false) rotateToFitPref.set(false)
true true
@ -218,13 +218,13 @@ object SettingsReaderScreen : SearchableSettings {
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = readerPreferences.dualPageInvertPaged(), pref = readerPreferences.dualPageInvertPaged(),
title = localize(MR.strings.pref_dual_page_invert), title = stringResource(MR.strings.pref_dual_page_invert),
subtitle = localize(MR.strings.pref_dual_page_invert_summary), subtitle = stringResource(MR.strings.pref_dual_page_invert_summary),
enabled = dualPageSplit, enabled = dualPageSplit,
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = rotateToFitPref, pref = rotateToFitPref,
title = localize(MR.strings.pref_page_rotate), title = stringResource(MR.strings.pref_page_rotate),
onValueChanged = { onValueChanged = {
dualPageSplitPref.set(false) dualPageSplitPref.set(false)
true true
@ -232,7 +232,7 @@ object SettingsReaderScreen : SearchableSettings {
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = readerPreferences.dualPageRotateToFitInvert(), pref = readerPreferences.dualPageRotateToFitInvert(),
title = localize(MR.strings.pref_page_rotate_invert), title = stringResource(MR.strings.pref_page_rotate_invert),
enabled = rotateToFit, enabled = rotateToFit,
), ),
), ),
@ -252,29 +252,29 @@ object SettingsReaderScreen : SearchableSettings {
val webtoonSidePadding by webtoonSidePaddingPref.collectAsState() val webtoonSidePadding by webtoonSidePaddingPref.collectAsState()
return Preference.PreferenceGroup( return Preference.PreferenceGroup(
title = localize(MR.strings.webtoon_viewer), title = stringResource(MR.strings.webtoon_viewer),
preferenceItems = listOf( preferenceItems = listOf(
Preference.PreferenceItem.ListPreference( Preference.PreferenceItem.ListPreference(
pref = navModePref, pref = navModePref,
title = localize(MR.strings.pref_viewer_nav), title = stringResource(MR.strings.pref_viewer_nav),
entries = ReaderPreferences.TapZones entries = ReaderPreferences.TapZones
.mapIndexed { index, it -> index to localize(it) } .mapIndexed { index, it -> index to stringResource(it) }
.toMap(), .toMap(),
), ),
Preference.PreferenceItem.ListPreference( Preference.PreferenceItem.ListPreference(
pref = readerPreferences.webtoonNavInverted(), pref = readerPreferences.webtoonNavInverted(),
title = localize(MR.strings.pref_read_with_tapping_inverted), title = stringResource(MR.strings.pref_read_with_tapping_inverted),
entries = listOf( entries = listOf(
ReaderPreferences.TappingInvertMode.NONE, ReaderPreferences.TappingInvertMode.NONE,
ReaderPreferences.TappingInvertMode.HORIZONTAL, ReaderPreferences.TappingInvertMode.HORIZONTAL,
ReaderPreferences.TappingInvertMode.VERTICAL, ReaderPreferences.TappingInvertMode.VERTICAL,
ReaderPreferences.TappingInvertMode.BOTH, ReaderPreferences.TappingInvertMode.BOTH,
).associateWith { localize(it.titleRes) }, ).associateWith { stringResource(it.titleRes) },
enabled = navMode != 5, enabled = navMode != 5,
), ),
Preference.PreferenceItem.SliderPreference( Preference.PreferenceItem.SliderPreference(
value = webtoonSidePadding, value = webtoonSidePadding,
title = localize(MR.strings.pref_webtoon_side_padding), title = stringResource(MR.strings.pref_webtoon_side_padding),
subtitle = numberFormat.format(webtoonSidePadding / 100f), subtitle = numberFormat.format(webtoonSidePadding / 100f),
min = ReaderPreferences.WEBTOON_PADDING_MIN, min = ReaderPreferences.WEBTOON_PADDING_MIN,
max = ReaderPreferences.WEBTOON_PADDING_MAX, max = ReaderPreferences.WEBTOON_PADDING_MAX,
@ -285,31 +285,31 @@ object SettingsReaderScreen : SearchableSettings {
), ),
Preference.PreferenceItem.ListPreference( Preference.PreferenceItem.ListPreference(
pref = readerPreferences.readerHideThreshold(), pref = readerPreferences.readerHideThreshold(),
title = localize(MR.strings.pref_hide_threshold), title = stringResource(MR.strings.pref_hide_threshold),
entries = mapOf( entries = mapOf(
ReaderPreferences.ReaderHideThreshold.HIGHEST to localize(MR.strings.pref_highest), ReaderPreferences.ReaderHideThreshold.HIGHEST to stringResource(MR.strings.pref_highest),
ReaderPreferences.ReaderHideThreshold.HIGH to localize(MR.strings.pref_high), ReaderPreferences.ReaderHideThreshold.HIGH to stringResource(MR.strings.pref_high),
ReaderPreferences.ReaderHideThreshold.LOW to localize(MR.strings.pref_low), ReaderPreferences.ReaderHideThreshold.LOW to stringResource(MR.strings.pref_low),
ReaderPreferences.ReaderHideThreshold.LOWEST to localize(MR.strings.pref_lowest), ReaderPreferences.ReaderHideThreshold.LOWEST to stringResource(MR.strings.pref_lowest),
), ),
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = readerPreferences.cropBordersWebtoon(), pref = readerPreferences.cropBordersWebtoon(),
title = localize(MR.strings.pref_crop_borders), title = stringResource(MR.strings.pref_crop_borders),
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = dualPageSplitPref, pref = dualPageSplitPref,
title = localize(MR.strings.pref_dual_page_split), title = stringResource(MR.strings.pref_dual_page_split),
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = readerPreferences.dualPageInvertWebtoon(), pref = readerPreferences.dualPageInvertWebtoon(),
title = localize(MR.strings.pref_dual_page_invert), title = stringResource(MR.strings.pref_dual_page_invert),
subtitle = localize(MR.strings.pref_dual_page_invert_summary), subtitle = stringResource(MR.strings.pref_dual_page_invert_summary),
enabled = dualPageSplit, enabled = dualPageSplit,
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = readerPreferences.webtoonDoubleTapZoomEnabled(), pref = readerPreferences.webtoonDoubleTapZoomEnabled(),
title = localize(MR.strings.pref_double_tap_zoom), title = stringResource(MR.strings.pref_double_tap_zoom),
enabled = true, enabled = true,
), ),
), ),
@ -321,15 +321,15 @@ object SettingsReaderScreen : SearchableSettings {
val readWithVolumeKeysPref = readerPreferences.readWithVolumeKeys() val readWithVolumeKeysPref = readerPreferences.readWithVolumeKeys()
val readWithVolumeKeys by readWithVolumeKeysPref.collectAsState() val readWithVolumeKeys by readWithVolumeKeysPref.collectAsState()
return Preference.PreferenceGroup( return Preference.PreferenceGroup(
title = localize(MR.strings.pref_reader_navigation), title = stringResource(MR.strings.pref_reader_navigation),
preferenceItems = listOf( preferenceItems = listOf(
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = readWithVolumeKeysPref, pref = readWithVolumeKeysPref,
title = localize(MR.strings.pref_read_with_volume_keys), title = stringResource(MR.strings.pref_read_with_volume_keys),
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = readerPreferences.readWithVolumeKeysInverted(), pref = readerPreferences.readWithVolumeKeysInverted(),
title = localize(MR.strings.pref_read_with_volume_keys_inverted), title = stringResource(MR.strings.pref_read_with_volume_keys_inverted),
enabled = readWithVolumeKeys, enabled = readWithVolumeKeys,
), ),
), ),
@ -339,16 +339,16 @@ object SettingsReaderScreen : SearchableSettings {
@Composable @Composable
private fun getActionsGroup(readerPreferences: ReaderPreferences): Preference.PreferenceGroup { private fun getActionsGroup(readerPreferences: ReaderPreferences): Preference.PreferenceGroup {
return Preference.PreferenceGroup( return Preference.PreferenceGroup(
title = localize(MR.strings.pref_reader_actions), title = stringResource(MR.strings.pref_reader_actions),
preferenceItems = listOf( preferenceItems = listOf(
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = readerPreferences.readWithLongTap(), pref = readerPreferences.readWithLongTap(),
title = localize(MR.strings.pref_read_with_long_tap), title = stringResource(MR.strings.pref_read_with_long_tap),
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = readerPreferences.folderPerManga(), pref = readerPreferences.folderPerManga(),
title = localize(MR.strings.pref_create_folder_per_manga), title = stringResource(MR.strings.pref_create_folder_per_manga),
subtitle = localize(MR.strings.pref_create_folder_per_manga_summary), subtitle = stringResource(MR.strings.pref_create_folder_per_manga_summary),
), ),
), ),
) )

View File

@ -54,7 +54,7 @@ import eu.kanade.presentation.more.settings.Preference
import eu.kanade.presentation.util.Screen import eu.kanade.presentation.util.Screen
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.Scaffold
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.EmptyScreen
import tachiyomi.presentation.core.util.runOnEnterKeyPressed import tachiyomi.presentation.core.util.runOnEnterKeyPressed
import cafe.adriel.voyager.core.screen.Screen as VoyagerScreen import cafe.adriel.voyager.core.screen.Screen as VoyagerScreen
@ -118,7 +118,7 @@ class SettingsSearchScreen : Screen() {
decorationBox = { decorationBox = {
if (textFieldValue.text.isEmpty()) { if (textFieldValue.text.isEmpty()) {
Text( Text(
text = localize(MR.strings.action_search_settings), text = stringResource(MR.strings.action_search_settings),
color = MaterialTheme.colorScheme.onSurfaceVariant, color = MaterialTheme.colorScheme.onSurfaceVariant,
style = MaterialTheme.typography.bodyLarge, style = MaterialTheme.typography.bodyLarge,
) )
@ -222,7 +222,7 @@ private fun SearchResult(
when { when {
it == null -> {} it == null -> {}
it.isEmpty() -> { it.isEmpty() -> {
EmptyScreen(localize(MR.strings.no_results_found)) EmptyScreen(stringResource(MR.strings.no_results_found))
} }
else -> { else -> {
LazyColumn( LazyColumn(
@ -268,7 +268,7 @@ private fun SearchResult(
private fun getIndex() = settingScreens private fun getIndex() = settingScreens
.map { screen -> .map { screen ->
SettingsData( SettingsData(
title = localize(screen.getTitleRes()), title = stringResource(screen.getTitleRes()),
route = screen, route = screen,
contents = screen.getPreferences(), contents = screen.getPreferences(),
) )

View File

@ -10,10 +10,10 @@ import eu.kanade.presentation.more.settings.Preference
import eu.kanade.tachiyomi.core.security.SecurityPreferences import eu.kanade.tachiyomi.core.security.SecurityPreferences
import eu.kanade.tachiyomi.util.system.AuthenticatorUtil.authenticate import eu.kanade.tachiyomi.util.system.AuthenticatorUtil.authenticate
import eu.kanade.tachiyomi.util.system.AuthenticatorUtil.isAuthenticationSupported import eu.kanade.tachiyomi.util.system.AuthenticatorUtil.isAuthenticationSupported
import tachiyomi.core.i18n.localize import tachiyomi.core.i18n.stringResource
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.pluralStringResource
import tachiyomi.presentation.core.i18n.localizePlural import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.util.collectAsState import tachiyomi.presentation.core.util.collectAsState
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
@ -36,43 +36,43 @@ object SettingsSecurityScreen : SearchableSettings {
return listOf( return listOf(
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = useAuthPref, pref = useAuthPref,
title = localize(MR.strings.lock_with_biometrics), title = stringResource(MR.strings.lock_with_biometrics),
enabled = authSupported, enabled = authSupported,
onValueChanged = { onValueChanged = {
(context as FragmentActivity).authenticate( (context as FragmentActivity).authenticate(
title = context.localize(MR.strings.lock_with_biometrics), title = context.stringResource(MR.strings.lock_with_biometrics),
) )
}, },
), ),
Preference.PreferenceItem.ListPreference( Preference.PreferenceItem.ListPreference(
pref = securityPreferences.lockAppAfter(), pref = securityPreferences.lockAppAfter(),
title = localize(MR.strings.lock_when_idle), title = stringResource(MR.strings.lock_when_idle),
enabled = authSupported && useAuth, enabled = authSupported && useAuth,
entries = LockAfterValues entries = LockAfterValues
.associateWith { .associateWith {
when (it) { when (it) {
-1 -> localize(MR.strings.lock_never) -1 -> stringResource(MR.strings.lock_never)
0 -> localize(MR.strings.lock_always) 0 -> stringResource(MR.strings.lock_always)
else -> localizePlural(MR.plurals.lock_after_mins, count = it, it) else -> pluralStringResource(MR.plurals.lock_after_mins, count = it, it)
} }
}, },
onValueChanged = { onValueChanged = {
(context as FragmentActivity).authenticate( (context as FragmentActivity).authenticate(
title = context.localize(MR.strings.lock_when_idle), title = context.stringResource(MR.strings.lock_when_idle),
) )
}, },
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = securityPreferences.hideNotificationContent(), pref = securityPreferences.hideNotificationContent(),
title = localize(MR.strings.hide_notification_content), title = stringResource(MR.strings.hide_notification_content),
), ),
Preference.PreferenceItem.ListPreference( Preference.PreferenceItem.ListPreference(
pref = securityPreferences.secureScreen(), pref = securityPreferences.secureScreen(),
title = localize(MR.strings.secure_screen), title = stringResource(MR.strings.secure_screen),
entries = SecurityPreferences.SecureScreenMode.entries entries = SecurityPreferences.SecureScreenMode.entries
.associateWith { localize(it.titleRes) }, .associateWith { stringResource(it.titleRes) },
), ),
Preference.PreferenceItem.InfoPreference(localize(MR.strings.secure_screen_summary)), Preference.PreferenceItem.InfoPreference(stringResource(MR.strings.secure_screen_summary)),
) )
} }
} }

View File

@ -56,7 +56,7 @@ import tachiyomi.core.util.lang.withUIContext
import tachiyomi.domain.source.service.SourceManager import tachiyomi.domain.source.service.SourceManager
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.padding
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
@ -72,7 +72,7 @@ object SettingsTrackingScreen : SearchableSettings {
IconButton(onClick = { uriHandler.openUri("https://tachiyomi.org/docs/guides/tracking") }) { IconButton(onClick = { uriHandler.openUri("https://tachiyomi.org/docs/guides/tracking") }) {
Icon( Icon(
imageVector = Icons.AutoMirrored.Outlined.HelpOutline, imageVector = Icons.AutoMirrored.Outlined.HelpOutline,
contentDescription = localize(MR.strings.tracking_guide), contentDescription = stringResource(MR.strings.tracking_guide),
) )
} }
} }
@ -109,9 +109,9 @@ object SettingsTrackingScreen : SearchableSettings {
val acceptedSources = (service as EnhancedTracker).getAcceptedSources() val acceptedSources = (service as EnhancedTracker).getAcceptedSources()
sourceManager.getCatalogueSources().any { it::class.qualifiedName in acceptedSources } sourceManager.getCatalogueSources().any { it::class.qualifiedName in acceptedSources }
} }
var enhancedTrackerInfo = localize(MR.strings.enhanced_tracking_info) var enhancedTrackerInfo = stringResource(MR.strings.enhanced_tracking_info)
if (enhancedTrackers.second.isNotEmpty()) { if (enhancedTrackers.second.isNotEmpty()) {
val missingSourcesInfo = localize( val missingSourcesInfo = stringResource(
MR.strings.enhanced_services_not_installed, MR.strings.enhanced_services_not_installed,
enhancedTrackers.second.joinToString { it.name }, enhancedTrackers.second.joinToString { it.name },
) )
@ -121,10 +121,10 @@ object SettingsTrackingScreen : SearchableSettings {
return listOf( return listOf(
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = trackPreferences.autoUpdateTrack(), pref = trackPreferences.autoUpdateTrack(),
title = localize(MR.strings.pref_auto_update_manga_sync), title = stringResource(MR.strings.pref_auto_update_manga_sync),
), ),
Preference.PreferenceGroup( Preference.PreferenceGroup(
title = localize(MR.strings.services), title = stringResource(MR.strings.services),
preferenceItems = listOf( preferenceItems = listOf(
Preference.PreferenceItem.TrackerPreference( Preference.PreferenceItem.TrackerPreference(
title = trackerManager.myAnimeList.name, title = trackerManager.myAnimeList.name,
@ -162,11 +162,11 @@ object SettingsTrackingScreen : SearchableSettings {
login = { context.openInBrowser(BangumiApi.authUrl(), forceDefaultBrowser = true) }, login = { context.openInBrowser(BangumiApi.authUrl(), forceDefaultBrowser = true) },
logout = { dialog = LogoutDialog(trackerManager.bangumi) }, logout = { dialog = LogoutDialog(trackerManager.bangumi) },
), ),
Preference.PreferenceItem.InfoPreference(localize(MR.strings.tracking_info)), Preference.PreferenceItem.InfoPreference(stringResource(MR.strings.tracking_info)),
), ),
), ),
Preference.PreferenceGroup( Preference.PreferenceGroup(
title = localize(MR.strings.enhanced_services), title = stringResource(MR.strings.enhanced_services),
preferenceItems = enhancedTrackers.first preferenceItems = enhancedTrackers.first
.map { service -> .map { service ->
Preference.PreferenceItem.TrackerPreference( Preference.PreferenceItem.TrackerPreference(
@ -199,13 +199,13 @@ object SettingsTrackingScreen : SearchableSettings {
title = { title = {
Row(verticalAlignment = Alignment.CenterVertically) { Row(verticalAlignment = Alignment.CenterVertically) {
Text( Text(
text = localize(MR.strings.login_title, tracker.name), text = stringResource(MR.strings.login_title, tracker.name),
modifier = Modifier.weight(1f), modifier = Modifier.weight(1f),
) )
IconButton(onClick = onDismissRequest) { IconButton(onClick = onDismissRequest) {
Icon( Icon(
imageVector = Icons.Outlined.Close, imageVector = Icons.Outlined.Close,
contentDescription = localize(MR.strings.action_close), contentDescription = stringResource(MR.strings.action_close),
) )
} }
} }
@ -216,7 +216,7 @@ object SettingsTrackingScreen : SearchableSettings {
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
value = username, value = username,
onValueChange = { username = it }, onValueChange = { username = it },
label = { Text(text = localize(uNameStringRes)) }, label = { Text(text = stringResource(uNameStringRes)) },
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next), keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next),
singleLine = true, singleLine = true,
isError = inputError && !processing, isError = inputError && !processing,
@ -227,7 +227,7 @@ object SettingsTrackingScreen : SearchableSettings {
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
value = password, value = password,
onValueChange = { password = it }, onValueChange = { password = it },
label = { Text(text = localize(MR.strings.password)) }, label = { Text(text = stringResource(MR.strings.password)) },
trailingIcon = { trailingIcon = {
IconButton(onClick = { hidePassword = !hidePassword }) { IconButton(onClick = { hidePassword = !hidePassword }) {
Icon( Icon(
@ -274,7 +274,7 @@ object SettingsTrackingScreen : SearchableSettings {
}, },
) { ) {
val id = if (processing) MR.strings.loading else MR.strings.login val id = if (processing) MR.strings.loading else MR.strings.login
Text(text = localize(id)) Text(text = stringResource(id))
} }
}, },
) )
@ -307,7 +307,7 @@ object SettingsTrackingScreen : SearchableSettings {
onDismissRequest = onDismissRequest, onDismissRequest = onDismissRequest,
title = { title = {
Text( Text(
text = localize(MR.strings.logout_title, tracker.name), text = stringResource(MR.strings.logout_title, tracker.name),
textAlign = TextAlign.Center, textAlign = TextAlign.Center,
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
) )
@ -318,7 +318,7 @@ object SettingsTrackingScreen : SearchableSettings {
modifier = Modifier.weight(1f), modifier = Modifier.weight(1f),
onClick = onDismissRequest, onClick = onDismissRequest,
) { ) {
Text(text = localize(MR.strings.action_cancel)) Text(text = stringResource(MR.strings.action_cancel))
} }
Button( Button(
modifier = Modifier.weight(1f), modifier = Modifier.weight(1f),
@ -332,7 +332,7 @@ object SettingsTrackingScreen : SearchableSettings {
contentColor = MaterialTheme.colorScheme.onError, contentColor = MaterialTheme.colorScheme.onError,
), ),
) { ) {
Text(text = localize(MR.strings.logout)) Text(text = stringResource(MR.strings.logout))
} }
} }
}, },

View File

@ -46,7 +46,7 @@ import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.LinkIcon import tachiyomi.presentation.core.components.LinkIcon
import tachiyomi.presentation.core.components.ScrollbarLazyColumn import tachiyomi.presentation.core.components.ScrollbarLazyColumn
import tachiyomi.presentation.core.components.material.Scaffold 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.CustomIcons
import tachiyomi.presentation.core.icons.Discord import tachiyomi.presentation.core.icons.Discord
import tachiyomi.presentation.core.icons.Facebook import tachiyomi.presentation.core.icons.Facebook
@ -74,7 +74,7 @@ object AboutScreen : Screen() {
Scaffold( Scaffold(
topBar = { scrollBehavior -> topBar = { scrollBehavior ->
AppBar( AppBar(
title = localize(MR.strings.pref_category_about), title = stringResource(MR.strings.pref_category_about),
navigateUp = if (handleBack != null) handleBack::invoke else null, navigateUp = if (handleBack != null) handleBack::invoke else null,
scrollBehavior = scrollBehavior, scrollBehavior = scrollBehavior,
) )
@ -89,7 +89,7 @@ object AboutScreen : Screen() {
item { item {
TextPreferenceWidget( TextPreferenceWidget(
title = localize(MR.strings.version), title = stringResource(MR.strings.version),
subtitle = getVersionName(withBuildDate = true), subtitle = getVersionName(withBuildDate = true),
onPreferenceClick = { onPreferenceClick = {
val deviceInfo = CrashLogUtil(context).getDebugInfo() val deviceInfo = CrashLogUtil(context).getDebugInfo()
@ -101,7 +101,7 @@ object AboutScreen : Screen() {
if (BuildConfig.INCLUDE_UPDATER) { if (BuildConfig.INCLUDE_UPDATER) {
item { item {
TextPreferenceWidget( TextPreferenceWidget(
title = localize(MR.strings.check_for_updates), title = stringResource(MR.strings.check_for_updates),
widget = { widget = {
AnimatedVisibility(visible = isCheckingUpdates) { AnimatedVisibility(visible = isCheckingUpdates) {
CircularProgressIndicator( CircularProgressIndicator(
@ -140,7 +140,7 @@ object AboutScreen : Screen() {
if (!BuildConfig.DEBUG) { if (!BuildConfig.DEBUG) {
item { item {
TextPreferenceWidget( TextPreferenceWidget(
title = localize(MR.strings.whats_new), title = stringResource(MR.strings.whats_new),
onPreferenceClick = { uriHandler.openUri(RELEASE_URL) }, onPreferenceClick = { uriHandler.openUri(RELEASE_URL) },
) )
} }
@ -148,21 +148,21 @@ object AboutScreen : Screen() {
item { item {
TextPreferenceWidget( TextPreferenceWidget(
title = localize(MR.strings.help_translate), title = stringResource(MR.strings.help_translate),
onPreferenceClick = { uriHandler.openUri("https://tachiyomi.org/docs/contribute#translation") }, onPreferenceClick = { uriHandler.openUri("https://tachiyomi.org/docs/contribute#translation") },
) )
} }
item { item {
TextPreferenceWidget( TextPreferenceWidget(
title = localize(MR.strings.licenses), title = stringResource(MR.strings.licenses),
onPreferenceClick = { navigator.push(OpenSourceLicensesScreen()) }, onPreferenceClick = { navigator.push(OpenSourceLicensesScreen()) },
) )
} }
item { item {
TextPreferenceWidget( TextPreferenceWidget(
title = localize(MR.strings.privacy_policy), title = stringResource(MR.strings.privacy_policy),
onPreferenceClick = { uriHandler.openUri("https://tachiyomi.org/privacy/") }, onPreferenceClick = { uriHandler.openUri("https://tachiyomi.org/privacy/") },
) )
} }
@ -175,7 +175,7 @@ object AboutScreen : Screen() {
horizontalArrangement = Arrangement.Center, horizontalArrangement = Arrangement.Center,
) { ) {
LinkIcon( LinkIcon(
label = localize(MR.strings.website), label = stringResource(MR.strings.website),
icon = Icons.Outlined.Public, icon = Icons.Outlined.Public,
url = "https://tachiyomi.org", url = "https://tachiyomi.org",
) )

View File

@ -21,7 +21,7 @@ import eu.kanade.presentation.util.Screen
import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentListOf
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.Scaffold
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
class OpenSourceLibraryLicenseScreen( class OpenSourceLibraryLicenseScreen(
private val name: String, private val name: String,
@ -44,7 +44,7 @@ class OpenSourceLibraryLicenseScreen(
AppBarActions( AppBarActions(
persistentListOf( persistentListOf(
AppBar.Action( AppBar.Action(
title = localize(MR.strings.website), title = stringResource(MR.strings.website),
icon = Icons.Default.Public, icon = Icons.Default.Public,
onClick = { uriHandler.openUri(website) }, onClick = { uriHandler.openUri(website) },
), ),

View File

@ -13,7 +13,7 @@ import eu.kanade.presentation.components.AppBar
import eu.kanade.presentation.util.Screen import eu.kanade.presentation.util.Screen
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.Scaffold
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
class OpenSourceLicensesScreen : Screen() { class OpenSourceLicensesScreen : Screen() {
@ -23,7 +23,7 @@ class OpenSourceLicensesScreen : Screen() {
Scaffold( Scaffold(
topBar = { scrollBehavior -> topBar = { scrollBehavior ->
AppBar( AppBar(
title = localize(MR.strings.licenses), title = stringResource(MR.strings.licenses),
navigateUp = navigator::pop, navigateUp = navigator::pop,
scrollBehavior = scrollBehavior, scrollBehavior = scrollBehavior,
) )

View File

@ -51,7 +51,7 @@ import tachiyomi.domain.source.model.Source
import tachiyomi.domain.source.model.SourceWithCount import tachiyomi.domain.source.model.SourceWithCount
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.Scaffold
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.EmptyScreen
import tachiyomi.presentation.core.screens.LoadingScreen import tachiyomi.presentation.core.screens.LoadingScreen
import tachiyomi.presentation.core.util.selectedBackground import tachiyomi.presentation.core.util.selectedBackground
@ -85,16 +85,16 @@ class ClearDatabaseScreen : Screen() {
} }
}, },
) { ) {
Text(text = localize(MR.strings.action_ok)) Text(text = stringResource(MR.strings.action_ok))
} }
}, },
dismissButton = { dismissButton = {
TextButton(onClick = model::hideConfirmation) { TextButton(onClick = model::hideConfirmation) {
Text(text = localize(MR.strings.action_cancel)) Text(text = stringResource(MR.strings.action_cancel))
} }
}, },
text = { text = {
Text(text = localize(MR.strings.clear_database_confirmation)) Text(text = stringResource(MR.strings.clear_database_confirmation))
}, },
) )
} }
@ -102,19 +102,19 @@ class ClearDatabaseScreen : Screen() {
Scaffold( Scaffold(
topBar = { scrollBehavior -> topBar = { scrollBehavior ->
AppBar( AppBar(
title = localize(MR.strings.pref_clear_database), title = stringResource(MR.strings.pref_clear_database),
navigateUp = navigator::pop, navigateUp = navigator::pop,
actions = { actions = {
if (s.items.isNotEmpty()) { if (s.items.isNotEmpty()) {
AppBarActions( AppBarActions(
actions = persistentListOf( actions = persistentListOf(
AppBar.Action( AppBar.Action(
title = localize(MR.strings.action_select_all), title = stringResource(MR.strings.action_select_all),
icon = Icons.Outlined.SelectAll, icon = Icons.Outlined.SelectAll,
onClick = model::selectAll, onClick = model::selectAll,
), ),
AppBar.Action( AppBar.Action(
title = localize(MR.strings.action_select_all), title = stringResource(MR.strings.action_select_all),
icon = Icons.Outlined.FlipToBack, icon = Icons.Outlined.FlipToBack,
onClick = model::invertSelection, onClick = model::invertSelection,
), ),
@ -128,7 +128,7 @@ class ClearDatabaseScreen : Screen() {
) { contentPadding -> ) { contentPadding ->
if (s.items.isEmpty()) { if (s.items.isEmpty()) {
EmptyScreen( EmptyScreen(
message = localize(MR.strings.database_clean), message = stringResource(MR.strings.database_clean),
modifier = Modifier.padding(contentPadding), modifier = Modifier.padding(contentPadding),
) )
} else { } else {
@ -160,7 +160,7 @@ class ClearDatabaseScreen : Screen() {
enabled = s.selection.isNotEmpty(), enabled = s.selection.isNotEmpty(),
) { ) {
Text( Text(
text = localize(MR.strings.action_delete), text = stringResource(MR.strings.action_delete),
color = MaterialTheme.colorScheme.onPrimary, color = MaterialTheme.colorScheme.onPrimary,
) )
} }
@ -196,7 +196,7 @@ class ClearDatabaseScreen : Screen() {
text = source.visualName, text = source.visualName,
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodyMedium,
) )
Text(text = localize(MR.strings.clear_database_source_item_count, count)) Text(text = stringResource(MR.strings.clear_database_source_item_count, count))
} }
Checkbox( Checkbox(
checked = isSelected, checked = isSelected,

View File

@ -43,7 +43,7 @@ import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.LabeledCheckbox import tachiyomi.presentation.core.components.LabeledCheckbox
import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.Scaffold
import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.padding
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
class CreateBackupScreen : Screen() { class CreateBackupScreen : Screen() {
@ -71,7 +71,7 @@ class CreateBackupScreen : Screen() {
Scaffold( Scaffold(
topBar = { topBar = {
AppBar( AppBar(
title = localize(MR.strings.pref_create_backup), title = stringResource(MR.strings.pref_create_backup),
navigateUp = navigator::pop, navigateUp = navigator::pop,
scrollBehavior = it, scrollBehavior = it,
) )
@ -89,7 +89,7 @@ class CreateBackupScreen : Screen() {
) { ) {
item { item {
LabeledCheckbox( LabeledCheckbox(
label = localize(MR.strings.manga), label = stringResource(MR.strings.manga),
checked = true, checked = true,
onCheckedChange = {}, onCheckedChange = {},
enabled = false, enabled = false,
@ -98,7 +98,7 @@ class CreateBackupScreen : Screen() {
BackupChoices.forEach { (k, v) -> BackupChoices.forEach { (k, v) ->
item { item {
LabeledCheckbox( LabeledCheckbox(
label = localize(v), label = stringResource(v),
checked = state.flags.contains(k), checked = state.flags.contains(k),
onCheckedChange = { onCheckedChange = {
model.toggleFlag(k) model.toggleFlag(k)
@ -130,7 +130,7 @@ class CreateBackupScreen : Screen() {
}, },
) { ) {
Text( Text(
text = localize(MR.strings.action_create), text = stringResource(MR.strings.action_create),
color = MaterialTheme.colorScheme.onPrimary, color = MaterialTheme.colorScheme.onPrimary,
) )
} }

View File

@ -23,7 +23,7 @@ import kotlinx.collections.immutable.persistentListOf
import kotlinx.serialization.protobuf.schema.ProtoBufSchemaGenerator import kotlinx.serialization.protobuf.schema.ProtoBufSchemaGenerator
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.Scaffold
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
class BackupSchemaScreen : Screen() { class BackupSchemaScreen : Screen() {
@ -47,7 +47,7 @@ class BackupSchemaScreen : Screen() {
AppBarActions( AppBarActions(
persistentListOf( persistentListOf(
AppBar.Action( AppBar.Action(
title = localize(MR.strings.action_copy_to_clipboard), title = stringResource(MR.strings.action_copy_to_clipboard),
icon = Icons.Default.ContentCopy, icon = Icons.Default.ContentCopy,
onClick = { onClick = {
context.copyToClipboard(title, schema) context.copyToClipboard(title, schema)

View File

@ -37,7 +37,7 @@ import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.stateIn
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.Scaffold
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.util.plus import tachiyomi.presentation.core.util.plus
class WorkerInfoScreen : Screen() { class WorkerInfoScreen : Screen() {
@ -65,7 +65,7 @@ class WorkerInfoScreen : Screen() {
AppBarActions( AppBarActions(
persistentListOf( persistentListOf(
AppBar.Action( AppBar.Action(
title = localize(MR.strings.action_copy_to_clipboard), title = stringResource(MR.strings.action_copy_to_clipboard),
icon = Icons.Default.ContentCopy, icon = Icons.Default.ContentCopy,
onClick = { onClick = {
context.copyToClipboard(title, enqueued + finished + running) context.copyToClipboard(title, enqueued + finished + running)

View File

@ -46,7 +46,7 @@ import eu.kanade.tachiyomi.util.system.DeviceUtil
import eu.kanade.tachiyomi.util.system.isDynamicColorAvailable import eu.kanade.tachiyomi.util.system.isDynamicColorAvailable
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.padding
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.util.secondaryItemAlpha import tachiyomi.presentation.core.util.secondaryItemAlpha
@Composable @Composable
@ -104,7 +104,7 @@ private fun AppThemesList(
Spacer(modifier = Modifier.height(8.dp)) Spacer(modifier = Modifier.height(8.dp))
Text( Text(
text = localize(appTheme.titleRes!!), text = stringResource(appTheme.titleRes!!),
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.secondaryItemAlpha(), .secondaryItemAlpha(),
@ -167,7 +167,7 @@ fun AppThemePreviewItem(
if (selected) { if (selected) {
Icon( Icon(
imageVector = Icons.Filled.CheckCircle, imageVector = Icons.Filled.CheckCircle,
contentDescription = localize(MR.strings.selected), contentDescription = stringResource(MR.strings.selected),
tint = MaterialTheme.colorScheme.primary, tint = MaterialTheme.colorScheme.primary,
) )
} }

View File

@ -23,7 +23,7 @@ import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.window.DialogProperties import androidx.compose.ui.window.DialogProperties
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
@Composable @Composable
fun EditTextPreferenceWidget( fun EditTextPreferenceWidget(
@ -83,12 +83,12 @@ fun EditTextPreferenceWidget(
} }
}, },
) { ) {
Text(text = localize(MR.strings.action_ok)) Text(text = stringResource(MR.strings.action_ok))
} }
}, },
dismissButton = { dismissButton = {
TextButton(onClick = onDismissRequest) { TextButton(onClick = onDismissRequest) {
Text(text = localize(MR.strings.action_cancel)) Text(text = stringResource(MR.strings.action_cancel))
} }
}, },
) )

View File

@ -15,7 +15,7 @@ import androidx.compose.ui.tooling.preview.PreviewLightDark
import eu.kanade.presentation.theme.TachiyomiTheme import eu.kanade.presentation.theme.TachiyomiTheme
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.padding
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.util.secondaryItemAlpha import tachiyomi.presentation.core.util.secondaryItemAlpha
@Composable @Composable
@ -45,7 +45,7 @@ internal fun InfoWidget(text: String) {
private fun InfoWidgetPreview() { private fun InfoWidgetPreview() {
TachiyomiTheme { TachiyomiTheme {
Surface { Surface {
InfoWidget(text = localize(MR.strings.download_ahead_info)) InfoWidget(text = stringResource(MR.strings.download_ahead_info))
} }
} }
} }

View File

@ -25,7 +25,7 @@ import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.ScrollbarLazyColumn import tachiyomi.presentation.core.components.ScrollbarLazyColumn
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.util.isScrolledToEnd import tachiyomi.presentation.core.util.isScrolledToEnd
import tachiyomi.presentation.core.util.isScrolledToStart import tachiyomi.presentation.core.util.isScrolledToStart
@ -75,7 +75,7 @@ fun <T> ListPreferenceWidget(
}, },
confirmButton = { confirmButton = {
TextButton(onClick = { isDialogShown = false }) { TextButton(onClick = { isDialogShown = false }) {
Text(text = localize(MR.strings.action_cancel)) Text(text = stringResource(MR.strings.action_cancel))
} }
}, },
) )

View File

@ -14,7 +14,7 @@ import androidx.compose.ui.window.DialogProperties
import eu.kanade.presentation.more.settings.Preference import eu.kanade.presentation.more.settings.Preference
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.LabeledCheckbox import tachiyomi.presentation.core.components.LabeledCheckbox
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
@Composable @Composable
fun MultiSelectListPreferenceWidget( fun MultiSelectListPreferenceWidget(
@ -70,12 +70,12 @@ fun MultiSelectListPreferenceWidget(
isDialogShown = false isDialogShown = false
}, },
) { ) {
Text(text = localize(MR.strings.action_ok)) Text(text = stringResource(MR.strings.action_ok))
} }
}, },
dismissButton = { dismissButton = {
TextButton(onClick = { isDialogShown = false }) { TextButton(onClick = { isDialogShown = false }) {
Text(text = localize(MR.strings.action_cancel)) Text(text = stringResource(MR.strings.action_cancel))
} }
}, },
) )

View File

@ -20,7 +20,7 @@ import eu.kanade.presentation.more.settings.LocalPreferenceHighlighted
import eu.kanade.presentation.track.components.TrackLogoIcon import eu.kanade.presentation.track.components.TrackLogoIcon
import eu.kanade.tachiyomi.data.track.Tracker import eu.kanade.tachiyomi.data.track.Tracker
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
@Composable @Composable
fun TrackingPreferenceWidget( fun TrackingPreferenceWidget(
@ -55,7 +55,7 @@ fun TrackingPreferenceWidget(
.padding(4.dp) .padding(4.dp)
.size(32.dp), .size(32.dp),
tint = Color(0xFF4CAF50), tint = Color(0xFF4CAF50),
contentDescription = localize(MR.strings.login_success), contentDescription = stringResource(MR.strings.login_success),
) )
} }
} }

View File

@ -29,7 +29,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.util.isScrolledToEnd import tachiyomi.presentation.core.util.isScrolledToEnd
import tachiyomi.presentation.core.util.isScrolledToStart import tachiyomi.presentation.core.util.isScrolledToStart
@ -102,7 +102,7 @@ fun <T> TriStateListDialog(
} else { } else {
MaterialTheme.colorScheme.primary MaterialTheme.colorScheme.primary
}, },
contentDescription = localize( contentDescription = stringResource(
when (state) { when (state) {
State.UNCHECKED -> MR.strings.not_selected State.UNCHECKED -> MR.strings.not_selected
State.CHECKED -> MR.strings.selected State.CHECKED -> MR.strings.selected
@ -130,7 +130,7 @@ fun <T> TriStateListDialog(
}, },
dismissButton = { dismissButton = {
TextButton(onClick = onDismissRequest) { TextButton(onClick = onDismissRequest) {
Text(text = localize(MR.strings.action_cancel)) Text(text = stringResource(MR.strings.action_cancel))
} }
}, },
confirmButton = { confirmButton = {
@ -145,7 +145,7 @@ fun <T> TriStateListDialog(
onValueChanged(included, excluded) onValueChanged(included, excluded)
}, },
) { ) {
Text(text = localize(MR.strings.action_ok)) Text(text = stringResource(MR.strings.action_ok))
} }
}, },
) )

View File

@ -20,7 +20,7 @@ import eu.kanade.presentation.more.stats.data.StatsData
import eu.kanade.presentation.util.toDurationString import eu.kanade.presentation.util.toDurationString
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.padding
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import java.util.Locale import java.util.Locale
import kotlin.time.DurationUnit import kotlin.time.DurationUnit
import kotlin.time.toDuration import kotlin.time.toDuration
@ -55,7 +55,7 @@ fun StatsScreenContent(
private fun OverviewSection( private fun OverviewSection(
data: StatsData.Overview, data: StatsData.Overview,
) { ) {
val none = localize(MR.strings.none) val none = stringResource(MR.strings.none)
val context = LocalContext.current val context = LocalContext.current
val readDurationString = remember(data.totalReadDuration) { val readDurationString = remember(data.totalReadDuration) {
data.totalReadDuration data.totalReadDuration
@ -66,17 +66,17 @@ private fun OverviewSection(
Row { Row {
StatsOverviewItem( StatsOverviewItem(
title = data.libraryMangaCount.toString(), title = data.libraryMangaCount.toString(),
subtitle = localize(MR.strings.in_library), subtitle = stringResource(MR.strings.in_library),
icon = Icons.Outlined.CollectionsBookmark, icon = Icons.Outlined.CollectionsBookmark,
) )
StatsOverviewItem( StatsOverviewItem(
title = data.completedMangaCount.toString(), title = data.completedMangaCount.toString(),
subtitle = localize(MR.strings.label_completed_titles), subtitle = stringResource(MR.strings.label_completed_titles),
icon = Icons.Outlined.LocalLibrary, icon = Icons.Outlined.LocalLibrary,
) )
StatsOverviewItem( StatsOverviewItem(
title = readDurationString, title = readDurationString,
subtitle = localize(MR.strings.label_read_duration), subtitle = stringResource(MR.strings.label_read_duration),
icon = Icons.Outlined.Schedule, icon = Icons.Outlined.Schedule,
) )
} }
@ -91,15 +91,15 @@ private fun TitlesStats(
Row { Row {
StatsItem( StatsItem(
data.globalUpdateItemCount.toString(), data.globalUpdateItemCount.toString(),
localize(MR.strings.label_titles_in_global_update), stringResource(MR.strings.label_titles_in_global_update),
) )
StatsItem( StatsItem(
data.startedMangaCount.toString(), data.startedMangaCount.toString(),
localize(MR.strings.label_started), stringResource(MR.strings.label_started),
) )
StatsItem( StatsItem(
data.localMangaCount.toString(), data.localMangaCount.toString(),
localize(MR.strings.label_local), stringResource(MR.strings.label_local),
) )
} }
} }
@ -113,15 +113,15 @@ private fun ChapterStats(
Row { Row {
StatsItem( StatsItem(
data.totalChapterCount.toString(), data.totalChapterCount.toString(),
localize(MR.strings.label_total_chapters), stringResource(MR.strings.label_total_chapters),
) )
StatsItem( StatsItem(
data.readChapterCount.toString(), data.readChapterCount.toString(),
localize(MR.strings.label_read_chapters), stringResource(MR.strings.label_read_chapters),
) )
StatsItem( StatsItem(
data.downloadCount.toString(), data.downloadCount.toString(),
localize(MR.strings.label_downloaded), stringResource(MR.strings.label_downloaded),
) )
} }
} }
@ -131,7 +131,7 @@ private fun ChapterStats(
private fun TrackerStats( private fun TrackerStats(
data: StatsData.Trackers, data: StatsData.Trackers,
) { ) {
val notApplicable = localize(MR.strings.not_applicable) val notApplicable = stringResource(MR.strings.not_applicable)
val meanScoreStr = remember(data.trackedTitleCount, data.meanScore) { val meanScoreStr = remember(data.trackedTitleCount, data.meanScore) {
if (data.trackedTitleCount > 0 && !data.meanScore.isNaN()) { if (data.trackedTitleCount > 0 && !data.meanScore.isNaN()) {
// All other numbers are localized in English // All other numbers are localized in English
@ -144,15 +144,15 @@ private fun TrackerStats(
Row { Row {
StatsItem( StatsItem(
data.trackedTitleCount.toString(), data.trackedTitleCount.toString(),
localize(MR.strings.label_tracked_titles), stringResource(MR.strings.label_tracked_titles),
) )
StatsItem( StatsItem(
meanScoreStr, meanScoreStr,
localize(MR.strings.label_mean_score), stringResource(MR.strings.label_mean_score),
) )
StatsItem( StatsItem(
data.trackerCount.toString(), data.trackerCount.toString(),
localize(MR.strings.label_used), stringResource(MR.strings.label_used),
) )
} }
} }

View File

@ -10,7 +10,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import dev.icerock.moko.resources.StringResource import dev.icerock.moko.resources.StringResource
import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.padding
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
@Composable @Composable
fun StatsSection( fun StatsSection(
@ -19,7 +19,7 @@ fun StatsSection(
) { ) {
Text( Text(
modifier = Modifier.padding(horizontal = MaterialTheme.padding.extraLarge), modifier = Modifier.padding(horizontal = MaterialTheme.padding.extraLarge),
text = localize(titleRes), text = stringResource(titleRes),
style = MaterialTheme.typography.titleSmall, style = MaterialTheme.typography.titleSmall,
) )
ElevatedCard( ElevatedCard(

View File

@ -41,8 +41,8 @@ import eu.kanade.tachiyomi.ui.reader.model.ChapterTransition
import eu.kanade.tachiyomi.ui.reader.model.ReaderChapter import eu.kanade.tachiyomi.ui.reader.model.ReaderChapter
import tachiyomi.domain.chapter.service.calculateChapterGap import tachiyomi.domain.chapter.service.calculateChapterGap
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.pluralStringResource
import tachiyomi.presentation.core.i18n.localizePlural import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.util.secondaryItemAlpha import tachiyomi.presentation.core.util.secondaryItemAlpha
@Composable @Composable
@ -58,25 +58,25 @@ fun ChapterTransition(
when (transition) { when (transition) {
is ChapterTransition.Prev -> { is ChapterTransition.Prev -> {
TransitionText( TransitionText(
topLabel = localize(MR.strings.transition_previous), topLabel = stringResource(MR.strings.transition_previous),
topChapter = goingToChapter, topChapter = goingToChapter,
topChapterDownloaded = goingToChapterDownloaded, topChapterDownloaded = goingToChapterDownloaded,
bottomLabel = localize(MR.strings.transition_current), bottomLabel = stringResource(MR.strings.transition_current),
bottomChapter = currChapter, bottomChapter = currChapter,
bottomChapterDownloaded = currChapterDownloaded, bottomChapterDownloaded = currChapterDownloaded,
fallbackLabel = localize(MR.strings.transition_no_previous), fallbackLabel = stringResource(MR.strings.transition_no_previous),
chapterGap = calculateChapterGap(currChapter.toDomainChapter(), goingToChapter?.toDomainChapter()), chapterGap = calculateChapterGap(currChapter.toDomainChapter(), goingToChapter?.toDomainChapter()),
) )
} }
is ChapterTransition.Next -> { is ChapterTransition.Next -> {
TransitionText( TransitionText(
topLabel = localize(MR.strings.transition_finished), topLabel = stringResource(MR.strings.transition_finished),
topChapter = currChapter, topChapter = currChapter,
topChapterDownloaded = currChapterDownloaded, topChapterDownloaded = currChapterDownloaded,
bottomLabel = localize(MR.strings.transition_next), bottomLabel = stringResource(MR.strings.transition_next),
bottomChapter = goingToChapter, bottomChapter = goingToChapter,
bottomChapterDownloaded = goingToChapterDownloaded, bottomChapterDownloaded = goingToChapterDownloaded,
fallbackLabel = localize(MR.strings.transition_no_next), fallbackLabel = stringResource(MR.strings.transition_no_next),
chapterGap = calculateChapterGap(goingToChapter?.toDomainChapter(), currChapter.toDomainChapter()), chapterGap = calculateChapterGap(goingToChapter?.toDomainChapter(), currChapter.toDomainChapter()),
) )
} }
@ -191,7 +191,7 @@ private fun ChapterGapWarning(
) )
Text( Text(
text = localizePlural(MR.plurals.missing_chapters_warning, count = gapCount, gapCount), text = pluralStringResource(MR.plurals.missing_chapters_warning, count = gapCount, gapCount),
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodyMedium,
) )
} }
@ -245,7 +245,7 @@ private fun ChapterText(
) { ) {
Icon( Icon(
imageVector = Icons.Filled.CheckCircle, imageVector = Icons.Filled.CheckCircle,
contentDescription = localize(MR.strings.label_downloaded), contentDescription = stringResource(MR.strings.label_downloaded),
) )
}, },
), ),

View File

@ -24,7 +24,7 @@ import eu.kanade.tachiyomi.ui.reader.setting.ReaderSettingsScreenModel
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.SettingsIconGrid import tachiyomi.presentation.core.components.SettingsIconGrid
import tachiyomi.presentation.core.components.material.IconToggleButton import tachiyomi.presentation.core.components.material.IconToggleButton
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
private val ReaderOrientationsWithoutDefault = ReaderOrientation.entries - ReaderOrientation.DEFAULT private val ReaderOrientationsWithoutDefault = ReaderOrientation.entries - ReaderOrientation.DEFAULT
@ -73,7 +73,7 @@ private fun DialogContent(
}, },
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
imageVector = ImageVector.vectorResource(mode.iconRes), imageVector = ImageVector.vectorResource(mode.iconRes),
title = localize(mode.stringRes), title = stringResource(mode.stringRes),
) )
} }
} }

View File

@ -22,7 +22,7 @@ import eu.kanade.presentation.components.AdaptiveSheet
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.ActionButton import tachiyomi.presentation.core.components.ActionButton
import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.padding
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
@Composable @Composable
fun ReaderPageActionsDialog( fun ReaderPageActionsDialog(
@ -42,13 +42,13 @@ fun ReaderPageActionsDialog(
) { ) {
ActionButton( ActionButton(
modifier = Modifier.weight(1f), modifier = Modifier.weight(1f),
title = localize(MR.strings.set_as_cover), title = stringResource(MR.strings.set_as_cover),
icon = Icons.Outlined.Photo, icon = Icons.Outlined.Photo,
onClick = { showSetCoverDialog = true }, onClick = { showSetCoverDialog = true },
) )
ActionButton( ActionButton(
modifier = Modifier.weight(1f), modifier = Modifier.weight(1f),
title = localize(MR.strings.action_share), title = stringResource(MR.strings.action_share),
icon = Icons.Outlined.Share, icon = Icons.Outlined.Share,
onClick = { onClick = {
onShare() onShare()
@ -57,7 +57,7 @@ fun ReaderPageActionsDialog(
) )
ActionButton( ActionButton(
modifier = Modifier.weight(1f), modifier = Modifier.weight(1f),
title = localize(MR.strings.action_save), title = stringResource(MR.strings.action_save),
icon = Icons.Outlined.Save, icon = Icons.Outlined.Save,
onClick = { onClick = {
onSave() onSave()
@ -85,16 +85,16 @@ private fun SetCoverDialog(
) { ) {
AlertDialog( AlertDialog(
text = { text = {
Text(localize(MR.strings.confirm_set_image_as_cover)) Text(stringResource(MR.strings.confirm_set_image_as_cover))
}, },
confirmButton = { confirmButton = {
TextButton(onClick = onConfirm) { TextButton(onClick = onConfirm) {
Text(localize(MR.strings.action_ok)) Text(stringResource(MR.strings.action_ok))
} }
}, },
dismissButton = { dismissButton = {
TextButton(onClick = onDismiss) { TextButton(onClick = onDismiss) {
Text(localize(MR.strings.action_cancel)) Text(stringResource(MR.strings.action_cancel))
} }
}, },
onDismissRequest = onDismiss, onDismissRequest = onDismiss,

View File

@ -24,7 +24,7 @@ import eu.kanade.tachiyomi.ui.reader.setting.ReadingMode
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.SettingsIconGrid import tachiyomi.presentation.core.components.SettingsIconGrid
import tachiyomi.presentation.core.components.material.IconToggleButton import tachiyomi.presentation.core.components.material.IconToggleButton
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
private val ReadingModesWithoutDefault = ReadingMode.entries - ReadingMode.DEFAULT private val ReadingModesWithoutDefault = ReadingMode.entries - ReadingMode.DEFAULT
@ -69,7 +69,7 @@ private fun DialogContent(
}, },
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
imageVector = ImageVector.vectorResource(mode.iconRes), imageVector = ImageVector.vectorResource(mode.iconRes),
title = localize(mode.stringRes), title = stringResource(mode.stringRes),
) )
} }
} }

View File

@ -19,7 +19,7 @@ import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.ui.reader.setting.ReaderOrientation import eu.kanade.tachiyomi.ui.reader.setting.ReaderOrientation
import eu.kanade.tachiyomi.ui.reader.setting.ReadingMode import eu.kanade.tachiyomi.ui.reader.setting.ReadingMode
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
@Composable @Composable
fun BottomReaderBar( fun BottomReaderBar(
@ -43,28 +43,28 @@ fun BottomReaderBar(
IconButton(onClick = onClickReadingMode) { IconButton(onClick = onClickReadingMode) {
Icon( Icon(
painter = painterResource(readingMode.iconRes), painter = painterResource(readingMode.iconRes),
contentDescription = localize(MR.strings.viewer), contentDescription = stringResource(MR.strings.viewer),
) )
} }
IconButton(onClick = onClickOrientation) { IconButton(onClick = onClickOrientation) {
Icon( Icon(
painter = painterResource(orientation.iconRes), painter = painterResource(orientation.iconRes),
contentDescription = localize(MR.strings.rotation_type), contentDescription = stringResource(MR.strings.rotation_type),
) )
} }
IconButton(onClick = onClickCropBorder) { IconButton(onClick = onClickCropBorder) {
Icon( Icon(
painter = painterResource(if (cropEnabled) R.drawable.ic_crop_24dp else R.drawable.ic_crop_off_24dp), 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),
) )
} }
IconButton(onClick = onClickSettings) { IconButton(onClick = onClickSettings) {
Icon( Icon(
imageVector = Icons.Outlined.Settings, imageVector = Icons.Outlined.Settings,
contentDescription = localize(MR.strings.action_settings), contentDescription = stringResource(MR.strings.action_settings),
) )
} }
} }

View File

@ -29,7 +29,7 @@ import eu.kanade.tachiyomi.ui.reader.viewer.Viewer
import eu.kanade.tachiyomi.ui.reader.viewer.pager.R2LPagerViewer import eu.kanade.tachiyomi.ui.reader.viewer.pager.R2LPagerViewer
import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentListOf
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
private val animationSpec = tween<IntOffset>(200) private val animationSpec = tween<IntOffset>(200)
@ -103,7 +103,7 @@ fun ReaderAppBars(
.apply { .apply {
add( add(
AppBar.Action( AppBar.Action(
title = localize( title = stringResource(
if (bookmarked) { if (bookmarked) {
MR.strings.action_remove_bookmark MR.strings.action_remove_bookmark
} else { } else {
@ -121,7 +121,7 @@ fun ReaderAppBars(
onOpenInWebView?.let { onOpenInWebView?.let {
add( add(
AppBar.OverflowAction( AppBar.OverflowAction(
title = localize(MR.strings.action_open_in_web_view), title = stringResource(MR.strings.action_open_in_web_view),
onClick = it, onClick = it,
), ),
) )
@ -129,7 +129,7 @@ fun ReaderAppBars(
onShare?.let { onShare?.let {
add( add(
AppBar.OverflowAction( AppBar.OverflowAction(
title = localize(MR.strings.action_share), title = stringResource(MR.strings.action_share),
onClick = it, onClick = it,
), ),
) )

View File

@ -34,7 +34,7 @@ import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import eu.kanade.presentation.util.isTabletUi import eu.kanade.presentation.util.isTabletUi
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import kotlin.math.roundToInt import kotlin.math.roundToInt
@Composable @Composable
@ -77,7 +77,7 @@ fun ChapterNavigator(
) { ) {
Icon( Icon(
imageVector = Icons.Outlined.SkipPrevious, imageVector = Icons.Outlined.SkipPrevious,
contentDescription = localize( contentDescription = stringResource(
if (isRtl) MR.strings.action_next_chapter else MR.strings.action_previous_chapter, if (isRtl) MR.strings.action_next_chapter else MR.strings.action_previous_chapter,
), ),
) )
@ -129,7 +129,7 @@ fun ChapterNavigator(
) { ) {
Icon( Icon(
imageVector = Icons.Outlined.SkipNext, imageVector = Icons.Outlined.SkipNext,
contentDescription = localize( contentDescription = stringResource(
if (isRtl) MR.strings.action_previous_chapter else MR.strings.action_next_chapter, if (isRtl) MR.strings.action_previous_chapter else MR.strings.action_next_chapter,
), ),
) )

View File

@ -21,7 +21,7 @@ import androidx.compose.ui.unit.dp
import eu.kanade.presentation.theme.TachiyomiTheme import eu.kanade.presentation.theme.TachiyomiTheme
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.SettingsItemsPaddings import tachiyomi.presentation.core.components.SettingsItemsPaddings
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
@Composable @Composable
fun ModeSelectionDialog( fun ModeSelectionDialog(
@ -40,7 +40,7 @@ fun ModeSelectionDialog(
) { ) {
onUseDefault?.let { onUseDefault?.let {
OutlinedButton(onClick = it) { OutlinedButton(onClick = it) {
Text(text = localize(MR.strings.action_revert_to_default)) Text(text = stringResource(MR.strings.action_revert_to_default))
} }
} }
@ -57,7 +57,7 @@ fun ModeSelectionDialog(
imageVector = Icons.Outlined.Check, imageVector = Icons.Outlined.Check,
contentDescription = null, contentDescription = null,
) )
Text(text = localize(MR.strings.action_apply)) Text(text = stringResource(MR.strings.action_apply))
} }
} }
} }

View File

@ -16,7 +16,7 @@ import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.CheckboxItem import tachiyomi.presentation.core.components.CheckboxItem
import tachiyomi.presentation.core.components.SettingsChipRow import tachiyomi.presentation.core.components.SettingsChipRow
import tachiyomi.presentation.core.components.SliderItem import tachiyomi.presentation.core.components.SliderItem
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.util.collectAsState import tachiyomi.presentation.core.util.collectAsState
@Composable @Composable
@ -38,11 +38,11 @@ internal fun ColumnScope.ColorFilterPage(screenModel: ReaderSettingsScreenModel)
), ),
) )
} }
}.map { localize(it) } }.map { stringResource(it) }
val customBrightness by screenModel.preferences.customBrightness().collectAsState() val customBrightness by screenModel.preferences.customBrightness().collectAsState()
CheckboxItem( CheckboxItem(
label = localize(MR.strings.pref_custom_brightness), label = stringResource(MR.strings.pref_custom_brightness),
pref = screenModel.preferences.customBrightness(), pref = screenModel.preferences.customBrightness(),
) )
@ -55,7 +55,7 @@ internal fun ColumnScope.ColorFilterPage(screenModel: ReaderSettingsScreenModel)
if (customBrightness) { if (customBrightness) {
val customBrightnessValue by screenModel.preferences.customBrightnessValue().collectAsState() val customBrightnessValue by screenModel.preferences.customBrightnessValue().collectAsState()
SliderItem( SliderItem(
label = localize(MR.strings.pref_custom_brightness), label = stringResource(MR.strings.pref_custom_brightness),
min = -75, min = -75,
max = 100, max = 100,
value = customBrightnessValue, value = customBrightnessValue,
@ -66,13 +66,13 @@ internal fun ColumnScope.ColorFilterPage(screenModel: ReaderSettingsScreenModel)
val colorFilter by screenModel.preferences.colorFilter().collectAsState() val colorFilter by screenModel.preferences.colorFilter().collectAsState()
CheckboxItem( CheckboxItem(
label = localize(MR.strings.pref_custom_color_filter), label = stringResource(MR.strings.pref_custom_color_filter),
pref = screenModel.preferences.colorFilter(), pref = screenModel.preferences.colorFilter(),
) )
if (colorFilter) { if (colorFilter) {
val colorFilterValue by screenModel.preferences.colorFilterValue().collectAsState() val colorFilterValue by screenModel.preferences.colorFilterValue().collectAsState()
SliderItem( SliderItem(
label = localize(MR.strings.color_filter_r_value), label = stringResource(MR.strings.color_filter_r_value),
max = 255, max = 255,
value = colorFilterValue.red, value = colorFilterValue.red,
valueText = colorFilterValue.red.toString(), valueText = colorFilterValue.red.toString(),
@ -83,7 +83,7 @@ internal fun ColumnScope.ColorFilterPage(screenModel: ReaderSettingsScreenModel)
}, },
) )
SliderItem( SliderItem(
label = localize(MR.strings.color_filter_g_value), label = stringResource(MR.strings.color_filter_g_value),
max = 255, max = 255,
value = colorFilterValue.green, value = colorFilterValue.green,
valueText = colorFilterValue.green.toString(), valueText = colorFilterValue.green.toString(),
@ -94,7 +94,7 @@ internal fun ColumnScope.ColorFilterPage(screenModel: ReaderSettingsScreenModel)
}, },
) )
SliderItem( SliderItem(
label = localize(MR.strings.color_filter_b_value), label = stringResource(MR.strings.color_filter_b_value),
max = 255, max = 255,
value = colorFilterValue.blue, value = colorFilterValue.blue,
valueText = colorFilterValue.blue.toString(), valueText = colorFilterValue.blue.toString(),
@ -105,7 +105,7 @@ internal fun ColumnScope.ColorFilterPage(screenModel: ReaderSettingsScreenModel)
}, },
) )
SliderItem( SliderItem(
label = localize(MR.strings.color_filter_a_value), label = stringResource(MR.strings.color_filter_a_value),
max = 255, max = 255,
value = colorFilterValue.alpha, value = colorFilterValue.alpha,
valueText = colorFilterValue.alpha.toString(), valueText = colorFilterValue.alpha.toString(),
@ -129,11 +129,11 @@ internal fun ColumnScope.ColorFilterPage(screenModel: ReaderSettingsScreenModel)
} }
CheckboxItem( CheckboxItem(
label = localize(MR.strings.pref_grayscale), label = stringResource(MR.strings.pref_grayscale),
pref = screenModel.preferences.grayscale(), pref = screenModel.preferences.grayscale(),
) )
CheckboxItem( CheckboxItem(
label = localize(MR.strings.pref_inverted_colors), label = stringResource(MR.strings.pref_inverted_colors),
pref = screenModel.preferences.invertedColors(), pref = screenModel.preferences.invertedColors(),
) )
} }

View File

@ -9,7 +9,7 @@ import eu.kanade.tachiyomi.ui.reader.setting.ReaderSettingsScreenModel
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.CheckboxItem import tachiyomi.presentation.core.components.CheckboxItem
import tachiyomi.presentation.core.components.SettingsChipRow import tachiyomi.presentation.core.components.SettingsChipRow
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.util.collectAsState import tachiyomi.presentation.core.util.collectAsState
private val themes = listOf( private val themes = listOf(
@ -27,50 +27,50 @@ internal fun ColumnScope.GeneralPage(screenModel: ReaderSettingsScreenModel) {
FilterChip( FilterChip(
selected = readerTheme == value, selected = readerTheme == value,
onClick = { screenModel.preferences.readerTheme().set(value) }, onClick = { screenModel.preferences.readerTheme().set(value) },
label = { Text(localize(labelRes)) }, label = { Text(stringResource(labelRes)) },
) )
} }
} }
CheckboxItem( CheckboxItem(
label = localize(MR.strings.pref_show_page_number), label = stringResource(MR.strings.pref_show_page_number),
pref = screenModel.preferences.showPageNumber(), pref = screenModel.preferences.showPageNumber(),
) )
CheckboxItem( CheckboxItem(
label = localize(MR.strings.pref_fullscreen), label = stringResource(MR.strings.pref_fullscreen),
pref = screenModel.preferences.fullscreen(), pref = screenModel.preferences.fullscreen(),
) )
if (screenModel.hasDisplayCutout) { if (screenModel.hasDisplayCutout) {
CheckboxItem( CheckboxItem(
label = localize(MR.strings.pref_cutout_short), label = stringResource(MR.strings.pref_cutout_short),
pref = screenModel.preferences.cutoutShort(), pref = screenModel.preferences.cutoutShort(),
) )
} }
CheckboxItem( CheckboxItem(
label = localize(MR.strings.pref_keep_screen_on), label = stringResource(MR.strings.pref_keep_screen_on),
pref = screenModel.preferences.keepScreenOn(), pref = screenModel.preferences.keepScreenOn(),
) )
CheckboxItem( CheckboxItem(
label = localize(MR.strings.pref_read_with_long_tap), label = stringResource(MR.strings.pref_read_with_long_tap),
pref = screenModel.preferences.readWithLongTap(), pref = screenModel.preferences.readWithLongTap(),
) )
CheckboxItem( CheckboxItem(
label = localize(MR.strings.pref_always_show_chapter_transition), label = stringResource(MR.strings.pref_always_show_chapter_transition),
pref = screenModel.preferences.alwaysShowChapterTransition(), pref = screenModel.preferences.alwaysShowChapterTransition(),
) )
CheckboxItem( CheckboxItem(
label = localize(MR.strings.pref_page_transitions), label = stringResource(MR.strings.pref_page_transitions),
pref = screenModel.preferences.pageTransitions(), pref = screenModel.preferences.pageTransitions(),
) )
CheckboxItem( CheckboxItem(
label = localize(MR.strings.pref_flash_page), label = stringResource(MR.strings.pref_flash_page),
pref = screenModel.preferences.flashOnPageChange(), pref = screenModel.preferences.flashOnPageChange(),
) )
} }

View File

@ -17,7 +17,7 @@ import eu.kanade.presentation.components.TabbedDialogPaddings
import eu.kanade.tachiyomi.ui.reader.setting.ReaderSettingsScreenModel import eu.kanade.tachiyomi.ui.reader.setting.ReaderSettingsScreenModel
import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentListOf
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
@Composable @Composable
fun ReaderSettingsDialog( fun ReaderSettingsDialog(
@ -27,9 +27,9 @@ fun ReaderSettingsDialog(
screenModel: ReaderSettingsScreenModel, screenModel: ReaderSettingsScreenModel,
) { ) {
val tabTitles = persistentListOf( val tabTitles = persistentListOf(
localize(MR.strings.pref_category_reading_mode), stringResource(MR.strings.pref_category_reading_mode),
localize(MR.strings.pref_category_general), stringResource(MR.strings.pref_category_general),
localize(MR.strings.custom_filter), stringResource(MR.strings.custom_filter),
) )
val pagerState = rememberPagerState { tabTitles.size } val pagerState = rememberPagerState { tabTitles.size }

View File

@ -19,7 +19,7 @@ import tachiyomi.presentation.core.components.CheckboxItem
import tachiyomi.presentation.core.components.HeadingItem import tachiyomi.presentation.core.components.HeadingItem
import tachiyomi.presentation.core.components.SettingsChipRow import tachiyomi.presentation.core.components.SettingsChipRow
import tachiyomi.presentation.core.components.SliderItem import tachiyomi.presentation.core.components.SliderItem
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.util.collectAsState import tachiyomi.presentation.core.util.collectAsState
import java.text.NumberFormat import java.text.NumberFormat
@ -34,7 +34,7 @@ internal fun ColumnScope.ReadingModePage(screenModel: ReaderSettingsScreenModel)
FilterChip( FilterChip(
selected = it == readingMode, selected = it == readingMode,
onClick = { screenModel.onChangeReadingMode(it) }, onClick = { screenModel.onChangeReadingMode(it) },
label = { Text(localize(it.stringRes)) }, label = { Text(stringResource(it.stringRes)) },
) )
} }
} }
@ -45,7 +45,7 @@ internal fun ColumnScope.ReadingModePage(screenModel: ReaderSettingsScreenModel)
FilterChip( FilterChip(
selected = it == orientation, selected = it == orientation,
onClick = { screenModel.onChangeOrientation(it) }, onClick = { screenModel.onChangeOrientation(it) },
label = { Text(localize(it.stringRes)) }, label = { Text(stringResource(it.stringRes)) },
) )
} }
} }
@ -77,7 +77,7 @@ private fun ColumnScope.PagerViewerSettings(screenModel: ReaderSettingsScreenMod
FilterChip( FilterChip(
selected = imageScaleType == index + 1, selected = imageScaleType == index + 1,
onClick = { screenModel.preferences.imageScaleType().set(index + 1) }, onClick = { screenModel.preferences.imageScaleType().set(index + 1) },
label = { Text(localize(it)) }, label = { Text(stringResource(it)) },
) )
} }
} }
@ -88,48 +88,48 @@ private fun ColumnScope.PagerViewerSettings(screenModel: ReaderSettingsScreenMod
FilterChip( FilterChip(
selected = zoomStart == index + 1, selected = zoomStart == index + 1,
onClick = { screenModel.preferences.zoomStart().set(index + 1) }, onClick = { screenModel.preferences.zoomStart().set(index + 1) },
label = { Text(localize(it)) }, label = { Text(stringResource(it)) },
) )
} }
} }
CheckboxItem( CheckboxItem(
label = localize(MR.strings.pref_crop_borders), label = stringResource(MR.strings.pref_crop_borders),
pref = screenModel.preferences.cropBorders(), pref = screenModel.preferences.cropBorders(),
) )
CheckboxItem( CheckboxItem(
label = localize(MR.strings.pref_landscape_zoom), label = stringResource(MR.strings.pref_landscape_zoom),
pref = screenModel.preferences.landscapeZoom(), pref = screenModel.preferences.landscapeZoom(),
) )
CheckboxItem( CheckboxItem(
label = localize(MR.strings.pref_navigate_pan), label = stringResource(MR.strings.pref_navigate_pan),
pref = screenModel.preferences.navigateToPan(), pref = screenModel.preferences.navigateToPan(),
) )
val dualPageSplitPaged by screenModel.preferences.dualPageSplitPaged().collectAsState() val dualPageSplitPaged by screenModel.preferences.dualPageSplitPaged().collectAsState()
CheckboxItem( CheckboxItem(
label = localize(MR.strings.pref_dual_page_split), label = stringResource(MR.strings.pref_dual_page_split),
pref = screenModel.preferences.dualPageSplitPaged(), pref = screenModel.preferences.dualPageSplitPaged(),
) )
if (dualPageSplitPaged) { if (dualPageSplitPaged) {
CheckboxItem( CheckboxItem(
label = localize(MR.strings.pref_dual_page_invert), label = stringResource(MR.strings.pref_dual_page_invert),
pref = screenModel.preferences.dualPageInvertPaged(), pref = screenModel.preferences.dualPageInvertPaged(),
) )
} }
val dualPageRotateToFit by screenModel.preferences.dualPageRotateToFit().collectAsState() val dualPageRotateToFit by screenModel.preferences.dualPageRotateToFit().collectAsState()
CheckboxItem( CheckboxItem(
label = localize(MR.strings.pref_page_rotate), label = stringResource(MR.strings.pref_page_rotate),
pref = screenModel.preferences.dualPageRotateToFit(), pref = screenModel.preferences.dualPageRotateToFit(),
) )
if (dualPageRotateToFit) { if (dualPageRotateToFit) {
CheckboxItem( CheckboxItem(
label = localize(MR.strings.pref_page_rotate_invert), label = stringResource(MR.strings.pref_page_rotate_invert),
pref = screenModel.preferences.dualPageRotateToFitInvert(), pref = screenModel.preferences.dualPageRotateToFitInvert(),
) )
} }
@ -152,7 +152,7 @@ private fun ColumnScope.WebtoonViewerSettings(screenModel: ReaderSettingsScreenM
val webtoonSidePadding by screenModel.preferences.webtoonSidePadding().collectAsState() val webtoonSidePadding by screenModel.preferences.webtoonSidePadding().collectAsState()
SliderItem( SliderItem(
label = localize(MR.strings.pref_webtoon_side_padding), label = stringResource(MR.strings.pref_webtoon_side_padding),
min = ReaderPreferences.WEBTOON_PADDING_MIN, min = ReaderPreferences.WEBTOON_PADDING_MIN,
max = ReaderPreferences.WEBTOON_PADDING_MAX, max = ReaderPreferences.WEBTOON_PADDING_MAX,
value = webtoonSidePadding, value = webtoonSidePadding,
@ -163,25 +163,25 @@ private fun ColumnScope.WebtoonViewerSettings(screenModel: ReaderSettingsScreenM
) )
CheckboxItem( CheckboxItem(
label = localize(MR.strings.pref_crop_borders), label = stringResource(MR.strings.pref_crop_borders),
pref = screenModel.preferences.cropBordersWebtoon(), pref = screenModel.preferences.cropBordersWebtoon(),
) )
val dualPageSplitWebtoon by screenModel.preferences.dualPageSplitWebtoon().collectAsState() val dualPageSplitWebtoon by screenModel.preferences.dualPageSplitWebtoon().collectAsState()
CheckboxItem( CheckboxItem(
label = localize(MR.strings.pref_dual_page_split), label = stringResource(MR.strings.pref_dual_page_split),
pref = screenModel.preferences.dualPageSplitWebtoon(), pref = screenModel.preferences.dualPageSplitWebtoon(),
) )
if (dualPageSplitWebtoon) { if (dualPageSplitWebtoon) {
CheckboxItem( CheckboxItem(
label = localize(MR.strings.pref_dual_page_invert), label = stringResource(MR.strings.pref_dual_page_invert),
pref = screenModel.preferences.dualPageInvertWebtoon(), pref = screenModel.preferences.dualPageInvertWebtoon(),
) )
} }
CheckboxItem( CheckboxItem(
label = localize(MR.strings.pref_double_tap_zoom), label = stringResource(MR.strings.pref_double_tap_zoom),
pref = screenModel.preferences.webtoonDoubleTapZoomEnabled(), pref = screenModel.preferences.webtoonDoubleTapZoomEnabled(),
) )
} }
@ -198,7 +198,7 @@ private fun ColumnScope.TapZonesItems(
FilterChip( FilterChip(
selected = selected == index, selected = selected == index,
onClick = { onSelect(index) }, onClick = { onSelect(index) },
label = { Text(localize(it)) }, label = { Text(stringResource(it)) },
) )
} }
} }
@ -209,7 +209,7 @@ private fun ColumnScope.TapZonesItems(
FilterChip( FilterChip(
selected = it == invertMode, selected = it == invertMode,
onClick = { onSelectInvertMode(it) }, onClick = { onSelectInvertMode(it) },
label = { Text(localize(it.titleRes)) }, label = { Text(stringResource(it.titleRes)) },
) )
} }
} }

View File

@ -55,7 +55,7 @@ import eu.kanade.tachiyomi.data.track.Tracker
import eu.kanade.tachiyomi.ui.manga.track.TrackItem import eu.kanade.tachiyomi.ui.manga.track.TrackItem
import eu.kanade.tachiyomi.util.system.copyToClipboard import eu.kanade.tachiyomi.util.system.copyToClipboard
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import java.text.DateFormat import java.text.DateFormat
private const val UnsetStatusTextAlpha = 0.5F private const val UnsetStatusTextAlpha = 0.5F
@ -194,7 +194,7 @@ private fun TrackInfoItem(
Row(modifier = Modifier.height(IntrinsicSize.Min)) { Row(modifier = Modifier.height(IntrinsicSize.Min)) {
TrackDetailsItem( TrackDetailsItem(
modifier = Modifier.weight(1f), modifier = Modifier.weight(1f),
text = status?.let { localize(it) } ?: "", text = status?.let { stringResource(it) } ?: "",
onClick = onStatusClick, onClick = onStatusClick,
) )
VerticalDivider() VerticalDivider()
@ -209,7 +209,7 @@ private fun TrackInfoItem(
modifier = Modifier modifier = Modifier
.weight(1f) .weight(1f)
.alpha(if (score == null) UnsetStatusTextAlpha else 1f), .alpha(if (score == null) UnsetStatusTextAlpha else 1f),
text = score ?: localize(MR.strings.score), text = score ?: stringResource(MR.strings.score),
onClick = onScoreClick, onClick = onScoreClick,
) )
} }
@ -221,14 +221,14 @@ private fun TrackInfoItem(
TrackDetailsItem( TrackDetailsItem(
modifier = Modifier.weight(1F), modifier = Modifier.weight(1F),
text = startDate, text = startDate,
placeholder = localize(MR.strings.track_started_reading_date), placeholder = stringResource(MR.strings.track_started_reading_date),
onClick = onStartDateClick, onClick = onStartDateClick,
) )
VerticalDivider() VerticalDivider()
TrackDetailsItem( TrackDetailsItem(
modifier = Modifier.weight(1F), modifier = Modifier.weight(1F),
text = endDate, text = endDate,
placeholder = localize(MR.strings.track_finished_reading_date), placeholder = stringResource(MR.strings.track_finished_reading_date),
onClick = onEndDateClick, onClick = onEndDateClick,
) )
} }
@ -279,7 +279,7 @@ private fun TrackInfoItemEmpty(
.padding(start = 16.dp) .padding(start = 16.dp)
.weight(1f), .weight(1f),
) { ) {
Text(text = localize(MR.strings.add_tracking)) Text(text = stringResource(MR.strings.add_tracking))
} }
} }
} }
@ -294,7 +294,7 @@ private fun TrackInfoItemMenu(
IconButton(onClick = { expanded = true }) { IconButton(onClick = { expanded = true }) {
Icon( Icon(
imageVector = Icons.Default.MoreVert, imageVector = Icons.Default.MoreVert,
contentDescription = localize(MR.strings.label_more), contentDescription = stringResource(MR.strings.label_more),
) )
} }
DropdownMenu( DropdownMenu(
@ -302,14 +302,14 @@ private fun TrackInfoItemMenu(
onDismissRequest = { expanded = false }, onDismissRequest = { expanded = false },
) { ) {
DropdownMenuItem( DropdownMenuItem(
text = { Text(localize(MR.strings.action_open_in_browser)) }, text = { Text(stringResource(MR.strings.action_open_in_browser)) },
onClick = { onClick = {
onOpenInBrowser() onOpenInBrowser()
expanded = false expanded = false
}, },
) )
DropdownMenuItem( DropdownMenuItem(
text = { Text(localize(MR.strings.action_remove)) }, text = { Text(stringResource(MR.strings.action_remove)) },
onClick = { onClick = {
onRemoved() onRemoved()
expanded = false expanded = false

View File

@ -41,7 +41,7 @@ import tachiyomi.presentation.core.components.WheelNumberPicker
import tachiyomi.presentation.core.components.WheelTextPicker import tachiyomi.presentation.core.components.WheelTextPicker
import tachiyomi.presentation.core.components.material.AlertDialogContent import tachiyomi.presentation.core.components.material.AlertDialogContent
import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.padding
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.util.isScrolledToEnd import tachiyomi.presentation.core.util.isScrolledToEnd
import tachiyomi.presentation.core.util.isScrolledToStart import tachiyomi.presentation.core.util.isScrolledToStart
@ -54,7 +54,7 @@ fun TrackStatusSelector(
onDismissRequest: () -> Unit, onDismissRequest: () -> Unit,
) { ) {
BaseSelector( BaseSelector(
title = localize(MR.strings.status), title = stringResource(MR.strings.status),
content = { content = {
val state = rememberLazyListState() val state = rememberLazyListState()
ScrollbarLazyColumn(state = state) { ScrollbarLazyColumn(state = state) {
@ -77,7 +77,7 @@ fun TrackStatusSelector(
onClick = null, onClick = null,
) )
Text( Text(
text = value?.let { localize(it) } ?: "", text = value?.let { stringResource(it) } ?: "",
style = MaterialTheme.typography.bodyLarge.merge(), style = MaterialTheme.typography.bodyLarge.merge(),
modifier = Modifier.padding(start = 24.dp), modifier = Modifier.padding(start = 24.dp),
) )
@ -102,7 +102,7 @@ fun TrackChapterSelector(
onDismissRequest: () -> Unit, onDismissRequest: () -> Unit,
) { ) {
BaseSelector( BaseSelector(
title = localize(MR.strings.chapters), title = stringResource(MR.strings.chapters),
content = { content = {
WheelNumberPicker( WheelNumberPicker(
items = range.toImmutableList(), items = range.toImmutableList(),
@ -125,7 +125,7 @@ fun TrackScoreSelector(
onDismissRequest: () -> Unit, onDismissRequest: () -> Unit,
) { ) {
BaseSelector( BaseSelector(
title = localize(MR.strings.score), title = stringResource(MR.strings.score),
content = { content = {
WheelTextPicker( WheelTextPicker(
items = selections, items = selections,
@ -172,15 +172,15 @@ fun TrackDateSelector(
) { ) {
if (onRemove != null) { if (onRemove != null) {
TextButton(onClick = onRemove) { TextButton(onClick = onRemove) {
Text(text = localize(MR.strings.action_remove)) Text(text = stringResource(MR.strings.action_remove))
} }
Spacer(modifier = Modifier.weight(1f)) Spacer(modifier = Modifier.weight(1f))
} }
TextButton(onClick = onDismissRequest) { TextButton(onClick = onDismissRequest) {
Text(text = localize(MR.strings.action_cancel)) Text(text = stringResource(MR.strings.action_cancel))
} }
TextButton(onClick = { onConfirm(pickerState.selectedDateMillis!!) }) { TextButton(onClick = { onConfirm(pickerState.selectedDateMillis!!) }) {
Text(text = localize(MR.strings.action_ok)) Text(text = stringResource(MR.strings.action_ok))
} }
} }
} }
@ -215,10 +215,10 @@ private fun BaseSelector(
Spacer(modifier = Modifier.weight(1f)) Spacer(modifier = Modifier.weight(1f))
} }
TextButton(onClick = onDismissRequest) { TextButton(onClick = onDismissRequest) {
Text(text = localize(MR.strings.action_cancel)) Text(text = stringResource(MR.strings.action_cancel))
} }
TextButton(onClick = onConfirm) { TextButton(onClick = onConfirm) {
Text(text = localize(MR.strings.action_ok)) Text(text = stringResource(MR.strings.action_ok))
} }
} }
}, },

View File

@ -65,7 +65,7 @@ import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.ScrollbarLazyColumn import tachiyomi.presentation.core.components.ScrollbarLazyColumn
import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.Scaffold
import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.padding
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.EmptyScreen
import tachiyomi.presentation.core.screens.LoadingScreen import tachiyomi.presentation.core.screens.LoadingScreen
import tachiyomi.presentation.core.util.plus import tachiyomi.presentation.core.util.plus
@ -120,7 +120,7 @@ fun TrackerSearch(
decorationBox = { decorationBox = {
if (query.text.isEmpty()) { if (query.text.isEmpty()) {
Text( Text(
text = localize(MR.strings.action_search_hint), text = stringResource(MR.strings.action_search_hint),
color = MaterialTheme.colorScheme.onSurfaceVariant, color = MaterialTheme.colorScheme.onSurfaceVariant,
style = MaterialTheme.typography.bodyLarge, style = MaterialTheme.typography.bodyLarge,
) )
@ -163,7 +163,7 @@ fun TrackerSearch(
.fillMaxWidth(), .fillMaxWidth(),
elevation = ButtonDefaults.elevatedButtonElevation(), elevation = ButtonDefaults.elevatedButtonElevation(),
) { ) {
Text(text = localize(MR.strings.action_track)) Text(text = stringResource(MR.strings.action_track))
} }
} }
}, },
@ -204,7 +204,7 @@ fun TrackerSearch(
EmptyScreen( EmptyScreen(
modifier = Modifier.padding(innerPadding), modifier = Modifier.padding(innerPadding),
message = queryResult.exceptionOrNull()?.message message = queryResult.exceptionOrNull()?.message
?: localize(MR.strings.unknown_error), ?: stringResource(MR.strings.unknown_error),
) )
} }
} }
@ -263,19 +263,19 @@ private fun SearchResultItem(
) )
if (type.isNotBlank()) { if (type.isNotBlank()) {
SearchResultItemDetails( SearchResultItemDetails(
title = localize(MR.strings.track_type), title = stringResource(MR.strings.track_type),
text = type, text = type,
) )
} }
if (startDate.isNotBlank()) { if (startDate.isNotBlank()) {
SearchResultItemDetails( SearchResultItemDetails(
title = localize(MR.strings.label_started), title = stringResource(MR.strings.label_started),
text = startDate, text = startDate,
) )
} }
if (status.isNotBlank()) { if (status.isNotBlank()) {
SearchResultItemDetails( SearchResultItemDetails(
title = localize(MR.strings.track_status), title = stringResource(MR.strings.track_status),
text = status, text = status,
) )
} }

View File

@ -5,7 +5,7 @@ import androidx.compose.material3.Text
import androidx.compose.material3.TextButton import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
@Composable @Composable
fun UpdatesDeleteConfirmationDialog( fun UpdatesDeleteConfirmationDialog(
@ -14,7 +14,7 @@ fun UpdatesDeleteConfirmationDialog(
) { ) {
AlertDialog( AlertDialog(
text = { text = {
Text(text = localize(MR.strings.confirm_delete_chapters)) Text(text = stringResource(MR.strings.confirm_delete_chapters))
}, },
onDismissRequest = onDismissRequest, onDismissRequest = onDismissRequest,
confirmButton = { confirmButton = {
@ -22,12 +22,12 @@ fun UpdatesDeleteConfirmationDialog(
onConfirm() onConfirm()
onDismissRequest() onDismissRequest()
}) { }) {
Text(text = localize(MR.strings.action_ok)) Text(text = stringResource(MR.strings.action_ok))
} }
}, },
dismissButton = { dismissButton = {
TextButton(onClick = onDismissRequest) { TextButton(onClick = onDismissRequest) {
Text(text = localize(MR.strings.action_cancel)) Text(text = stringResource(MR.strings.action_cancel))
} }
}, },
) )

View File

@ -34,7 +34,7 @@ import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.FastScrollLazyColumn import tachiyomi.presentation.core.components.FastScrollLazyColumn
import tachiyomi.presentation.core.components.material.PullRefresh import tachiyomi.presentation.core.components.material.PullRefresh
import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.Scaffold
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.EmptyScreen
import tachiyomi.presentation.core.screens.LoadingScreen import tachiyomi.presentation.core.screens.LoadingScreen
import kotlin.time.Duration.Companion.seconds import kotlin.time.Duration.Companion.seconds
@ -140,12 +140,12 @@ private fun UpdatesAppBar(
) { ) {
AppBar( AppBar(
modifier = modifier, modifier = modifier,
title = localize(MR.strings.label_recent_updates), title = stringResource(MR.strings.label_recent_updates),
actions = { actions = {
AppBarActions( AppBarActions(
persistentListOf( persistentListOf(
AppBar.Action( AppBar.Action(
title = localize(MR.strings.action_update_library), title = stringResource(MR.strings.action_update_library),
icon = Icons.Outlined.Refresh, icon = Icons.Outlined.Refresh,
onClick = onUpdateLibrary, onClick = onUpdateLibrary,
), ),
@ -158,12 +158,12 @@ private fun UpdatesAppBar(
AppBarActions( AppBarActions(
persistentListOf( persistentListOf(
AppBar.Action( AppBar.Action(
title = localize(MR.strings.action_select_all), title = stringResource(MR.strings.action_select_all),
icon = Icons.Outlined.SelectAll, icon = Icons.Outlined.SelectAll,
onClick = onSelectAll, onClick = onSelectAll,
), ),
AppBar.Action( AppBar.Action(
title = localize(MR.strings.action_select_inverse), title = stringResource(MR.strings.action_select_inverse),
icon = Icons.Outlined.FlipToBack, icon = Icons.Outlined.FlipToBack,
onClick = onInvertSelection, onClick = onInvertSelection,
), ),

View File

@ -44,7 +44,7 @@ import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.ListGroupHeader import tachiyomi.presentation.core.components.ListGroupHeader
import tachiyomi.presentation.core.components.material.ReadItemAlpha import tachiyomi.presentation.core.components.material.ReadItemAlpha
import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.padding
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.util.selectedBackground import tachiyomi.presentation.core.util.selectedBackground
internal fun LazyListScope.updatesLastUpdatedItem( internal fun LazyListScope.updatesLastUpdatedItem(
@ -56,7 +56,7 @@ internal fun LazyListScope.updatesLastUpdatedItem(
.padding(horizontal = MaterialTheme.padding.medium, vertical = MaterialTheme.padding.small), .padding(horizontal = MaterialTheme.padding.medium, vertical = MaterialTheme.padding.small),
) { ) {
Text( Text(
text = localize(MR.strings.updates_last_update_info, relativeTimeSpanString(lastUpdated)), text = stringResource(MR.strings.updates_last_update_info, relativeTimeSpanString(lastUpdated)),
fontStyle = FontStyle.Italic, fontStyle = FontStyle.Italic,
) )
} }
@ -100,7 +100,7 @@ internal fun LazyListScope.updatesUiItems(
readProgress = updatesItem.update.lastPageRead readProgress = updatesItem.update.lastPageRead
.takeIf { !updatesItem.update.read && it > 0L } .takeIf { !updatesItem.update.read && it > 0L }
?.let { ?.let {
localize( stringResource(
MR.strings.chapter_progress, MR.strings.chapter_progress,
it + 1, it + 1,
) )
@ -183,7 +183,7 @@ private fun UpdatesUiItem(
if (!update.read) { if (!update.read) {
Icon( Icon(
imageVector = Icons.Filled.Circle, imageVector = Icons.Filled.Circle,
contentDescription = localize(MR.strings.unread), contentDescription = stringResource(MR.strings.unread),
modifier = Modifier modifier = Modifier
.height(8.dp) .height(8.dp)
.padding(end = 4.dp), .padding(end = 4.dp),
@ -193,7 +193,7 @@ private fun UpdatesUiItem(
if (update.bookmark) { if (update.bookmark) {
Icon( Icon(
imageVector = Icons.Filled.Bookmark, imageVector = Icons.Filled.Bookmark,
contentDescription = localize(MR.strings.action_filter_bookmarked), contentDescription = stringResource(MR.strings.action_filter_bookmarked),
modifier = Modifier modifier = Modifier
.sizeIn(maxHeight = with(LocalDensity.current) { textHeight.toDp() - 2.dp }), .sizeIn(maxHeight = with(LocalDensity.current) { textHeight.toDp() - 2.dp }),
tint = MaterialTheme.colorScheme.primary, tint = MaterialTheme.colorScheme.primary,

View File

@ -4,7 +4,7 @@ import android.content.Context
import eu.kanade.tachiyomi.network.HttpException import eu.kanade.tachiyomi.network.HttpException
import eu.kanade.tachiyomi.source.online.LicensedMangaChaptersException import eu.kanade.tachiyomi.source.online.LicensedMangaChaptersException
import eu.kanade.tachiyomi.util.system.isOnline import eu.kanade.tachiyomi.util.system.isOnline
import tachiyomi.core.i18n.localize import tachiyomi.core.i18n.stringResource
import tachiyomi.data.source.NoResultsException import tachiyomi.data.source.NoResultsException
import tachiyomi.domain.source.model.SourceNotInstalledException import tachiyomi.domain.source.model.SourceNotInstalledException
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
@ -14,18 +14,18 @@ context(Context)
val Throwable.formattedMessage: String val Throwable.formattedMessage: String
get() { get() {
when (this) { when (this) {
is HttpException -> return localize(MR.strings.exception_http, code) is HttpException -> return stringResource(MR.strings.exception_http, code)
is UnknownHostException -> { is UnknownHostException -> {
return if (!isOnline()) { return if (!isOnline()) {
localize(MR.strings.exception_offline) stringResource(MR.strings.exception_offline)
} else { } else {
localize(MR.strings.exception_unknown_host, message ?: "") stringResource(MR.strings.exception_unknown_host, message ?: "")
} }
} }
is NoResultsException -> return localize(MR.strings.no_results_found) is NoResultsException -> return stringResource(MR.strings.no_results_found)
is SourceNotInstalledException -> return localize(MR.strings.loader_not_implemented_error) is SourceNotInstalledException -> return stringResource(MR.strings.loader_not_implemented_error)
is LicensedMangaChaptersException -> return localize(MR.strings.licensed_manga_chapters_error) is LicensedMangaChaptersException -> return stringResource(MR.strings.licensed_manga_chapters_error)
} }
return when (val className = this::class.simpleName) { return when (val className = this::class.simpleName) {
"Exception", "IOException" -> message ?: className "Exception", "IOException" -> message ?: className

View File

@ -4,9 +4,9 @@ import android.content.Context
import android.text.format.DateUtils import android.text.format.DateUtils
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.ReadOnlyComposable
import tachiyomi.core.i18n.localize import tachiyomi.core.i18n.stringResource
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
import java.util.Date import java.util.Date
import kotlin.time.Duration import kotlin.time.Duration
import kotlin.time.Duration.Companion.minutes import kotlin.time.Duration.Companion.minutes
@ -14,10 +14,14 @@ import kotlin.time.Duration.Companion.minutes
fun Duration.toDurationString(context: Context, fallback: String): String { fun Duration.toDurationString(context: Context, fallback: String): String {
return toComponents { days, hours, minutes, seconds, _ -> return toComponents { days, hours, minutes, seconds, _ ->
buildList(4) { buildList(4) {
if (days != 0L) add(context.localize(MR.strings.day_short, days)) if (days != 0L) add(context.stringResource(MR.strings.day_short, days))
if (hours != 0) add(context.localize(MR.strings.hour_short, hours)) if (hours != 0) add(context.stringResource(MR.strings.hour_short, hours))
if (minutes != 0 && (days == 0L || hours == 0)) add(context.localize(MR.strings.minute_short, minutes)) if (minutes != 0 && (days == 0L || hours == 0)) {
if (seconds != 0 && days == 0L && hours == 0) add(context.localize(MR.strings.seconds_short, seconds)) add(
context.stringResource(MR.strings.minute_short, minutes),
)
}
if (seconds != 0 && days == 0L && hours == 0) add(context.stringResource(MR.strings.seconds_short, seconds))
}.joinToString(" ").ifBlank { fallback } }.joinToString(" ").ifBlank { fallback }
} }
} }
@ -27,8 +31,10 @@ fun Duration.toDurationString(context: Context, fallback: String): String {
fun relativeTimeSpanString(epochMillis: Long): String { fun relativeTimeSpanString(epochMillis: Long): String {
val now = Date().time val now = Date().time
return when { return when {
epochMillis <= 0L -> localize(MR.strings.relative_time_span_never) epochMillis <= 0L -> stringResource(MR.strings.relative_time_span_never)
now - epochMillis < 1.minutes.inWholeMilliseconds -> localize(MR.strings.updates_last_update_info_just_now) now - epochMillis < 1.minutes.inWholeMilliseconds -> stringResource(
MR.strings.updates_last_update_info_just_now,
)
else -> DateUtils.getRelativeTimeSpanString(epochMillis, now, DateUtils.MINUTE_IN_MILLIS).toString() else -> DateUtils.getRelativeTimeSpanString(epochMillis, now, DateUtils.MINUTE_IN_MILLIS).toString()
} }
} }

View File

@ -43,7 +43,7 @@ import kotlinx.collections.immutable.persistentListOf
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.Scaffold
import tachiyomi.presentation.core.i18n.localize import tachiyomi.presentation.core.i18n.stringResource
@Composable @Composable
fun WebViewScreenContent( fun WebViewScreenContent(
@ -125,7 +125,7 @@ fun WebViewScreenContent(
AppBarActions( AppBarActions(
persistentListOf( persistentListOf(
AppBar.Action( AppBar.Action(
title = localize(MR.strings.action_webview_back), title = stringResource(MR.strings.action_webview_back),
icon = Icons.AutoMirrored.Outlined.ArrowBack, icon = Icons.AutoMirrored.Outlined.ArrowBack,
onClick = { onClick = {
if (navigator.canGoBack) { if (navigator.canGoBack) {
@ -135,7 +135,7 @@ fun WebViewScreenContent(
enabled = navigator.canGoBack, enabled = navigator.canGoBack,
), ),
AppBar.Action( AppBar.Action(
title = localize(MR.strings.action_webview_forward), title = stringResource(MR.strings.action_webview_forward),
icon = Icons.AutoMirrored.Outlined.ArrowForward, icon = Icons.AutoMirrored.Outlined.ArrowForward,
onClick = { onClick = {
if (navigator.canGoForward) { if (navigator.canGoForward) {
@ -145,19 +145,19 @@ fun WebViewScreenContent(
enabled = navigator.canGoForward, enabled = navigator.canGoForward,
), ),
AppBar.OverflowAction( AppBar.OverflowAction(
title = localize(MR.strings.action_webview_refresh), title = stringResource(MR.strings.action_webview_refresh),
onClick = { navigator.reload() }, onClick = { navigator.reload() },
), ),
AppBar.OverflowAction( AppBar.OverflowAction(
title = localize(MR.strings.action_share), title = stringResource(MR.strings.action_share),
onClick = { onShare(currentUrl) }, onClick = { onShare(currentUrl) },
), ),
AppBar.OverflowAction( AppBar.OverflowAction(
title = localize(MR.strings.action_open_in_browser), title = stringResource(MR.strings.action_open_in_browser),
onClick = { onOpenInBrowser(currentUrl) }, onClick = { onOpenInBrowser(currentUrl) },
), ),
AppBar.OverflowAction( AppBar.OverflowAction(
title = localize(MR.strings.pref_clear_cookies), title = stringResource(MR.strings.pref_clear_cookies),
onClick = { onClearCookies(currentUrl) }, onClick = { onClearCookies(currentUrl) },
), ),
), ),

View File

@ -55,7 +55,7 @@ import org.acra.config.httpSender
import org.acra.ktx.initAcra import org.acra.ktx.initAcra
import org.acra.sender.HttpSender import org.acra.sender.HttpSender
import org.conscrypt.Conscrypt import org.conscrypt.Conscrypt
import tachiyomi.core.i18n.localize import tachiyomi.core.i18n.stringResource
import tachiyomi.core.util.system.logcat import tachiyomi.core.util.system.logcat
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.widget.WidgetManager import tachiyomi.presentation.widget.WidgetManager
@ -106,8 +106,8 @@ class App : Application(), DefaultLifecycleObserver, ImageLoaderFactory {
Notifications.ID_INCOGNITO_MODE, Notifications.ID_INCOGNITO_MODE,
Notifications.CHANNEL_INCOGNITO_MODE, Notifications.CHANNEL_INCOGNITO_MODE,
) { ) {
setContentTitle(localize(MR.strings.pref_incognito_mode)) setContentTitle(stringResource(MR.strings.pref_incognito_mode))
setContentText(localize(MR.strings.notification_incognito_text)) setContentText(stringResource(MR.strings.notification_incognito_text))
setSmallIcon(R.drawable.ic_glasses_24dp) setSmallIcon(R.drawable.ic_glasses_24dp)
setOngoing(true) setOngoing(true)

View File

@ -37,7 +37,7 @@ import logcat.LogPriority
import okio.buffer import okio.buffer
import okio.gzip import okio.gzip
import okio.sink import okio.sink
import tachiyomi.core.i18n.localize import tachiyomi.core.i18n.stringResource
import tachiyomi.core.preference.Preference import tachiyomi.core.preference.Preference
import tachiyomi.core.preference.PreferenceStore import tachiyomi.core.preference.PreferenceStore
import tachiyomi.core.util.system.logcat import tachiyomi.core.util.system.logcat
@ -76,7 +76,7 @@ class BackupCreator(
*/ */
suspend fun createBackup(uri: Uri, flags: Int, isAutoBackup: Boolean): String { suspend fun createBackup(uri: Uri, flags: Int, isAutoBackup: Boolean): String {
if (!context.hasPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)) { if (!context.hasPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
throw IllegalStateException(context.localize(MR.strings.missing_storage_permission)) throw IllegalStateException(context.stringResource(MR.strings.missing_storage_permission))
} }
val databaseManga = getFavorites.await() val databaseManga = getFavorites.await()
@ -111,7 +111,7 @@ class BackupCreator(
UniFile.fromUri(context, uri) UniFile.fromUri(context, uri)
} }
) )
?: throw Exception(context.localize(MR.strings.create_backup_file_error)) ?: throw Exception(context.stringResource(MR.strings.create_backup_file_error))
if (!file.isFile) { if (!file.isFile) {
throw IllegalStateException("Failed to get handle on a backup file") throw IllegalStateException("Failed to get handle on a backup file")
@ -119,7 +119,7 @@ class BackupCreator(
val byteArray = parser.encodeToByteArray(BackupSerializer, backup) val byteArray = parser.encodeToByteArray(BackupSerializer, backup)
if (byteArray.isEmpty()) { if (byteArray.isEmpty()) {
throw IllegalStateException(context.localize(MR.strings.empty_backup_error)) throw IllegalStateException(context.stringResource(MR.strings.empty_backup_error))
} }
file.openOutputStream().also { file.openOutputStream().also {

Some files were not shown because too many files have changed in this diff Show More