From 752def802fe355fdcfea3cead85514e57d77e9fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Salcedo=20Garc=C3=ADa?= Date: Wed, 31 Jan 2024 13:00:56 +0100 Subject: [PATCH] chore: use composeResources for strings --- .../ui/main/navigation/NavigationBar.kt | 5 +- .../navigation/items/HomeNavigationBarItem.kt | 17 +++--- .../navigation/items/NavigationBarItem.kt | 6 +- app/src/androidMain/res/values/strings.xml | 10 ---- .../composeResources}/values-es/strings.xml | 0 .../composeResources/values/strings.xml | 12 ++++ .../dev/alvr/katana/ui/main/KatanaApp.kt | 32 +---------- .../main/components/SessionExpiredDialog.kt | 12 ++-- config/detekt.yml | 2 +- .../composeResources/values-es/strings.xml | 5 ++ .../composeResources/values/strings.xml | 5 ++ .../ui/account/strings/AccountStrings.kt | 25 --------- .../ui/account/strings/enAccountStrings.kt | 6 -- .../ui/account/strings/esAccountStrings.kt | 6 -- .../katana/ui/account/view/AccountScreen.kt | 7 ++- .../alvr/katana/ui/account/view/UserInfo.kt | 7 ++- .../composeResources/values-es/strings.xml | 12 ++++ .../composeResources/values/strings.xml | 12 ++++ .../base/components/KatanaSearchTopAppBar.kt | 9 ++- .../katana/ui/base/components/KatanaStates.kt | 10 +++- .../components/home/KatanaHomeTopAppBar.kt | 15 +++-- .../katana/ui/base/strings/BaseStrings.kt | 30 ---------- .../katana/ui/base/strings/enBaseStrings.kt | 11 ---- .../katana/ui/base/strings/esBaseStrings.kt | 11 ---- .../dev/alvr/katana/ui/base/utils/strings.kt | 23 -------- .../composeResources/values-es/strings.xml | 5 ++ .../composeResources/values/strings.xml | 5 ++ .../ui/explore/strings/ExploreStrings.kt | 25 --------- .../ui/explore/strings/enExploreStrings.kt | 6 -- .../ui/explore/strings/esExploreStrings.kt | 6 -- .../katana/ui/explore/view/ExploreScreen.kt | 18 +++--- .../alvr/katana/ui/lists/view/AnimeScreen.kt | 11 ++-- .../alvr/katana/ui/lists/view/MangaScreen.kt | 11 ++-- .../ui/lists/view/components/ChangeList.kt | 6 +- .../ui/lists/view/components/ListScreen.kt | 24 ++++---- .../composeResources/values-es/strings.xml | 33 +++++++++++ .../composeResources/values/strings.xml | 33 +++++++++++ .../katana/ui/lists/entities/MediaListItem.kt | 31 ++++++----- .../katana/ui/lists/strings/ListsStrings.kt | 55 ------------------- .../katana/ui/lists/strings/enListsStrings.kt | 27 --------- .../katana/ui/lists/strings/esListsStrings.kt | 27 --------- .../ui/lists/view/components/MediaList.kt | 17 +++--- .../alvr/katana/ui/login/view/LoginScreen.kt | 33 ++++++----- .../composeResources/values-es/strings.xml | 18 ++++++ .../composeResources/values/strings.xml | 18 ++++++ .../katana/ui/login/strings/LoginStrings.kt | 38 ------------- .../katana/ui/login/strings/enLoginStrings.kt | 21 ------- .../katana/ui/login/strings/esLoginStrings.kt | 21 ------- .../composeResources/values-es/strings.xml | 5 ++ .../composeResources/values/strings.xml | 5 ++ .../katana/ui/social/strings/SocialStrings.kt | 25 --------- .../ui/social/strings/enSocialStrings.kt | 6 -- .../ui/social/strings/esSocialStrings.kt | 6 -- .../katana/ui/social/view/SocialScreen.kt | 18 +++--- 54 files changed, 321 insertions(+), 523 deletions(-) rename app/src/{androidMain/res => commonMain/composeResources}/values-es/strings.xml (100%) create mode 100644 app/src/commonMain/composeResources/values/strings.xml rename app/src/{androidMain => commonMain}/kotlin/dev/alvr/katana/ui/main/components/SessionExpiredDialog.kt (61%) create mode 100644 ui/account/src/commonMain/composeResources/values-es/strings.xml create mode 100644 ui/account/src/commonMain/composeResources/values/strings.xml delete mode 100644 ui/account/src/commonMain/kotlin/dev/alvr/katana/ui/account/strings/AccountStrings.kt delete mode 100644 ui/account/src/commonMain/kotlin/dev/alvr/katana/ui/account/strings/enAccountStrings.kt delete mode 100644 ui/account/src/commonMain/kotlin/dev/alvr/katana/ui/account/strings/esAccountStrings.kt create mode 100644 ui/base/src/commonMain/composeResources/values-es/strings.xml create mode 100644 ui/base/src/commonMain/composeResources/values/strings.xml delete mode 100644 ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/strings/BaseStrings.kt delete mode 100644 ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/strings/enBaseStrings.kt delete mode 100644 ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/strings/esBaseStrings.kt delete mode 100644 ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/utils/strings.kt create mode 100644 ui/explore/src/commonMain/composeResources/values-es/strings.xml create mode 100644 ui/explore/src/commonMain/composeResources/values/strings.xml delete mode 100644 ui/explore/src/commonMain/kotlin/dev/alvr/katana/ui/explore/strings/ExploreStrings.kt delete mode 100644 ui/explore/src/commonMain/kotlin/dev/alvr/katana/ui/explore/strings/enExploreStrings.kt delete mode 100644 ui/explore/src/commonMain/kotlin/dev/alvr/katana/ui/explore/strings/esExploreStrings.kt create mode 100644 ui/lists/src/commonMain/composeResources/values-es/strings.xml create mode 100644 ui/lists/src/commonMain/composeResources/values/strings.xml delete mode 100644 ui/lists/src/commonMain/kotlin/dev/alvr/katana/ui/lists/strings/ListsStrings.kt delete mode 100644 ui/lists/src/commonMain/kotlin/dev/alvr/katana/ui/lists/strings/enListsStrings.kt delete mode 100644 ui/lists/src/commonMain/kotlin/dev/alvr/katana/ui/lists/strings/esListsStrings.kt create mode 100644 ui/login/src/commonMain/composeResources/values-es/strings.xml create mode 100644 ui/login/src/commonMain/composeResources/values/strings.xml delete mode 100644 ui/login/src/commonMain/kotlin/dev/alvr/katana/ui/login/strings/LoginStrings.kt delete mode 100644 ui/login/src/commonMain/kotlin/dev/alvr/katana/ui/login/strings/enLoginStrings.kt delete mode 100644 ui/login/src/commonMain/kotlin/dev/alvr/katana/ui/login/strings/esLoginStrings.kt create mode 100644 ui/social/src/commonMain/composeResources/values-es/strings.xml create mode 100644 ui/social/src/commonMain/composeResources/values/strings.xml delete mode 100644 ui/social/src/commonMain/kotlin/dev/alvr/katana/ui/social/strings/SocialStrings.kt delete mode 100644 ui/social/src/commonMain/kotlin/dev/alvr/katana/ui/social/strings/enSocialStrings.kt delete mode 100644 ui/social/src/commonMain/kotlin/dev/alvr/katana/ui/social/strings/esSocialStrings.kt diff --git a/app/src/androidMain/kotlin/dev/alvr/katana/ui/main/navigation/NavigationBar.kt b/app/src/androidMain/kotlin/dev/alvr/katana/ui/main/navigation/NavigationBar.kt index 694b4cb8c..7760ec842 100644 --- a/app/src/androidMain/kotlin/dev/alvr/katana/ui/main/navigation/NavigationBar.kt +++ b/app/src/androidMain/kotlin/dev/alvr/katana/ui/main/navigation/NavigationBar.kt @@ -19,7 +19,6 @@ import androidx.compose.runtime.referentialEqualityPolicy import androidx.compose.runtime.remember import androidx.compose.runtime.rememberUpdatedState import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.navigation.NavController import androidx.navigation.NavDestination import androidx.navigation.NavGraph @@ -33,6 +32,8 @@ import dev.alvr.katana.ui.main.navigation.items.HomeNavigationBarItem import dev.alvr.katana.ui.main.navigation.items.NavigationBarItem import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf +import org.jetbrains.compose.resources.ExperimentalResourceApi +import org.jetbrains.compose.resources.stringResource @Composable internal fun NavigationBar( @@ -160,6 +161,7 @@ private fun RailNavigationBar( } @Composable +@OptIn(ExperimentalResourceApi::class) private fun NavigationBarIcon(destination: NavigationBarItem) { Icon( imageVector = destination.icon, @@ -168,6 +170,7 @@ private fun NavigationBarIcon(destination: NavigationBarItem) { } @Composable +@OptIn(ExperimentalResourceApi::class) private fun NavigationBarLabel(destination: NavigationBarItem) { Text(text = stringResource(destination.label)) } diff --git a/app/src/androidMain/kotlin/dev/alvr/katana/ui/main/navigation/items/HomeNavigationBarItem.kt b/app/src/androidMain/kotlin/dev/alvr/katana/ui/main/navigation/items/HomeNavigationBarItem.kt index 165a6f37b..023ea4c33 100644 --- a/app/src/androidMain/kotlin/dev/alvr/katana/ui/main/navigation/items/HomeNavigationBarItem.kt +++ b/app/src/androidMain/kotlin/dev/alvr/katana/ui/main/navigation/items/HomeNavigationBarItem.kt @@ -8,24 +8,27 @@ import androidx.compose.material.icons.twotone.Explore import androidx.compose.material.icons.twotone.VideoLibrary import androidx.compose.ui.graphics.vector.ImageVector import com.ramcosta.composedestinations.spec.NavGraphSpec -import dev.alvr.katana.R import dev.alvr.katana.ui.account.navigation.AccountNavGraph import dev.alvr.katana.ui.explore.navigation.ExploreNavGraph import dev.alvr.katana.ui.lists.navigation.AnimeNavGraph import dev.alvr.katana.ui.lists.navigation.MangaNavGraph import dev.alvr.katana.ui.social.navigation.SocialNavGraph +import katana.app.generated.resources.Res import kotlinx.collections.immutable.persistentListOf +import org.jetbrains.compose.resources.ExperimentalResourceApi +import org.jetbrains.compose.resources.StringResource +@OptIn(ExperimentalResourceApi::class) internal enum class HomeNavigationBarItem( override val direction: NavGraphSpec, override val icon: ImageVector, - override val label: Int, + override val label: StringResource, ) : NavigationBarItem { - Anime(AnimeNavGraph, Icons.TwoTone.VideoLibrary, R.string.navigation_bar_destination_anime_lists), - Manga(MangaNavGraph, Icons.AutoMirrored.TwoTone.LibraryBooks, R.string.navigation_bar_destination_manga_lists), - Explore(ExploreNavGraph, Icons.TwoTone.Explore, R.string.navigation_bar_destination_explore), - Social(SocialNavGraph, Icons.TwoTone.Dashboard, R.string.navigation_bar_destination_social), - Account(AccountNavGraph, Icons.TwoTone.AccountCircle, R.string.navigation_bar_destination_account); + Anime(AnimeNavGraph, Icons.TwoTone.VideoLibrary, Res.string.navigation_bar_destination_anime_lists), + Manga(MangaNavGraph, Icons.AutoMirrored.TwoTone.LibraryBooks, Res.string.navigation_bar_destination_manga_lists), + Explore(ExploreNavGraph, Icons.TwoTone.Explore, Res.string.navigation_bar_destination_explore), + Social(SocialNavGraph, Icons.TwoTone.Dashboard, Res.string.navigation_bar_destination_social), + Account(AccountNavGraph, Icons.TwoTone.AccountCircle, Res.string.navigation_bar_destination_account); companion object { @JvmField diff --git a/app/src/androidMain/kotlin/dev/alvr/katana/ui/main/navigation/items/NavigationBarItem.kt b/app/src/androidMain/kotlin/dev/alvr/katana/ui/main/navigation/items/NavigationBarItem.kt index 3b4e83f2f..c69945a97 100644 --- a/app/src/androidMain/kotlin/dev/alvr/katana/ui/main/navigation/items/NavigationBarItem.kt +++ b/app/src/androidMain/kotlin/dev/alvr/katana/ui/main/navigation/items/NavigationBarItem.kt @@ -1,11 +1,13 @@ package dev.alvr.katana.ui.main.navigation.items -import androidx.annotation.StringRes import androidx.compose.ui.graphics.vector.ImageVector import com.ramcosta.composedestinations.spec.NavGraphSpec +import org.jetbrains.compose.resources.ExperimentalResourceApi +import org.jetbrains.compose.resources.StringResource +@OptIn(ExperimentalResourceApi::class) internal sealed interface NavigationBarItem { val direction: NavGraphSpec val icon: ImageVector - @get:StringRes val label: Int + val label: StringResource } diff --git a/app/src/androidMain/res/values/strings.xml b/app/src/androidMain/res/values/strings.xml index e66b993b2..66906a609 100644 --- a/app/src/androidMain/res/values/strings.xml +++ b/app/src/androidMain/res/values/strings.xml @@ -1,14 +1,4 @@ Katana - - Anime - Manga - Social - Explore - Account - - Session expired - Anilist\'s session has expired. To continue using Katana you need to log in again. - Log in diff --git a/app/src/androidMain/res/values-es/strings.xml b/app/src/commonMain/composeResources/values-es/strings.xml similarity index 100% rename from app/src/androidMain/res/values-es/strings.xml rename to app/src/commonMain/composeResources/values-es/strings.xml diff --git a/app/src/commonMain/composeResources/values/strings.xml b/app/src/commonMain/composeResources/values/strings.xml new file mode 100644 index 000000000..7e412d18b --- /dev/null +++ b/app/src/commonMain/composeResources/values/strings.xml @@ -0,0 +1,12 @@ + + + Anime + Manga + Social + Explore + Account + + Session expired + Anilist\'s session has expired. To continue using Katana you need to log in again. + Log in + diff --git a/app/src/commonMain/kotlin/dev/alvr/katana/ui/main/KatanaApp.kt b/app/src/commonMain/kotlin/dev/alvr/katana/ui/main/KatanaApp.kt index 3ef80a0ce..581b6d4b0 100644 --- a/app/src/commonMain/kotlin/dev/alvr/katana/ui/main/KatanaApp.kt +++ b/app/src/commonMain/kotlin/dev/alvr/katana/ui/main/KatanaApp.kt @@ -1,26 +1,13 @@ package dev.alvr.katana.ui.main import androidx.compose.runtime.Composable -import androidx.compose.runtime.CompositionLocalProvider import co.touchlab.kermit.DefaultFormatter import co.touchlab.kermit.LogWriter import co.touchlab.kermit.Logger import co.touchlab.kermit.Severity import co.touchlab.kermit.platformLogWriter import dev.alvr.katana.KatanaBuildConfig -import dev.alvr.katana.ui.account.strings.LocalAccountStrings -import dev.alvr.katana.ui.account.strings.rememberAccountStrings import dev.alvr.katana.ui.base.design.KatanaTheme -import dev.alvr.katana.ui.base.strings.LocalBaseStrings -import dev.alvr.katana.ui.base.strings.rememberBaseStrings -import dev.alvr.katana.ui.explore.strings.LocalExploreStrings -import dev.alvr.katana.ui.explore.strings.rememberExploreStrings -import dev.alvr.katana.ui.lists.strings.LocalListsStrings -import dev.alvr.katana.ui.lists.strings.rememberListsStrings -import dev.alvr.katana.ui.login.strings.LocalLoginStrings -import dev.alvr.katana.ui.login.strings.rememberLoginStrings -import dev.alvr.katana.ui.social.strings.LocalSocialStrings -import dev.alvr.katana.ui.social.strings.rememberSocialStrings import io.sentry.kotlin.multiplatform.Sentry import io.sentry.kotlin.multiplatform.SentryLevel import io.sentry.kotlin.multiplatform.protocol.Breadcrumb @@ -33,27 +20,10 @@ internal fun KatanaApp() { initApp() KatanaTheme { - KatanaStrings { - KatanaContent() - } + KatanaContent() } } -@Composable -private fun KatanaStrings( - content: @Composable () -> Unit, -) { - CompositionLocalProvider( - LocalAccountStrings provides rememberAccountStrings(), - LocalBaseStrings provides rememberBaseStrings(), - LocalExploreStrings provides rememberExploreStrings(), - LocalListsStrings provides rememberListsStrings(), - LocalLoginStrings provides rememberLoginStrings(), - LocalSocialStrings provides rememberSocialStrings(), - content = content, - ) -} - private fun initApp() { initSentry() initNapier() diff --git a/app/src/androidMain/kotlin/dev/alvr/katana/ui/main/components/SessionExpiredDialog.kt b/app/src/commonMain/kotlin/dev/alvr/katana/ui/main/components/SessionExpiredDialog.kt similarity index 61% rename from app/src/androidMain/kotlin/dev/alvr/katana/ui/main/components/SessionExpiredDialog.kt rename to app/src/commonMain/kotlin/dev/alvr/katana/ui/main/components/SessionExpiredDialog.kt index 53f40a89a..f29d4157a 100644 --- a/app/src/androidMain/kotlin/dev/alvr/katana/ui/main/components/SessionExpiredDialog.kt +++ b/app/src/commonMain/kotlin/dev/alvr/katana/ui/main/components/SessionExpiredDialog.kt @@ -4,11 +4,13 @@ import androidx.compose.material3.AlertDialog import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable -import androidx.compose.ui.res.stringResource import androidx.compose.ui.window.DialogProperties -import dev.alvr.katana.R +import katana.app.generated.resources.Res +import org.jetbrains.compose.resources.ExperimentalResourceApi +import org.jetbrains.compose.resources.stringResource @Composable +@OptIn(ExperimentalResourceApi::class) internal fun SessionExpiredDialog( visible: Boolean, onAccept: () -> Unit, @@ -20,11 +22,11 @@ internal fun SessionExpiredDialog( }, confirmButton = { TextButton(onClick = onAccept) { - Text(text = stringResource(R.string.session_expired_error_confirm_button)) + Text(text = stringResource(Res.string.session_expired_error_confirm_button)) } }, - title = { Text(text = stringResource(R.string.session_expired_error_title)) }, - text = { Text(text = stringResource(R.string.session_expired_error_message)) }, + title = { Text(text = stringResource(Res.string.session_expired_error_title)) }, + text = { Text(text = stringResource(Res.string.session_expired_error_message)) }, properties = DialogProperties( dismissOnBackPress = false, dismissOnClickOutside = false, diff --git a/config/detekt.yml b/config/detekt.yml index 3f544fa90..bd08362a4 100644 --- a/config/detekt.yml +++ b/config/detekt.yml @@ -980,7 +980,7 @@ Compose: active: true CompositionLocalAllowlist: active: true - allowedCompositionLocals: LocalAccountStrings,LocalBaseStrings,LocalExploreStrings,LocalListsStrings,LocalLoginStrings,LocalSocialStrings + allowedCompositionLocals: CompositionLocalNaming: active: true ContentEmitterReturningValues: diff --git a/ui/account/src/commonMain/composeResources/values-es/strings.xml b/ui/account/src/commonMain/composeResources/values-es/strings.xml new file mode 100644 index 000000000..2345c7521 --- /dev/null +++ b/ui/account/src/commonMain/composeResources/values-es/strings.xml @@ -0,0 +1,5 @@ + + + Cuenta + Cerrar sesión + diff --git a/ui/account/src/commonMain/composeResources/values/strings.xml b/ui/account/src/commonMain/composeResources/values/strings.xml new file mode 100644 index 000000000..2345c7521 --- /dev/null +++ b/ui/account/src/commonMain/composeResources/values/strings.xml @@ -0,0 +1,5 @@ + + + Cuenta + Cerrar sesión + diff --git a/ui/account/src/commonMain/kotlin/dev/alvr/katana/ui/account/strings/AccountStrings.kt b/ui/account/src/commonMain/kotlin/dev/alvr/katana/ui/account/strings/AccountStrings.kt deleted file mode 100644 index 92cb2870a..000000000 --- a/ui/account/src/commonMain/kotlin/dev/alvr/katana/ui/account/strings/AccountStrings.kt +++ /dev/null @@ -1,25 +0,0 @@ -package dev.alvr.katana.ui.account.strings - -import androidx.compose.runtime.Composable -import androidx.compose.runtime.Immutable -import androidx.compose.runtime.compositionLocalOf -import dev.alvr.katana.ui.base.utils.Locales -import dev.alvr.katana.ui.base.utils.rememberKatanaStrings -import kotlinx.collections.immutable.persistentMapOf - -@Immutable -@Suppress("LongParameterList", "UseDataClass") -class AccountStrings internal constructor( - internal val title: String, - internal val logoutButton: String, -) - -internal val Strings = persistentMapOf( - Locales.EN to enAccountStrings, - Locales.ES to esAccountStrings, -) - -val LocalAccountStrings = compositionLocalOf { enAccountStrings } - -@Composable -fun rememberAccountStrings() = rememberKatanaStrings(Strings) diff --git a/ui/account/src/commonMain/kotlin/dev/alvr/katana/ui/account/strings/enAccountStrings.kt b/ui/account/src/commonMain/kotlin/dev/alvr/katana/ui/account/strings/enAccountStrings.kt deleted file mode 100644 index 482cfff48..000000000 --- a/ui/account/src/commonMain/kotlin/dev/alvr/katana/ui/account/strings/enAccountStrings.kt +++ /dev/null @@ -1,6 +0,0 @@ -package dev.alvr.katana.ui.account.strings - -internal val enAccountStrings = AccountStrings( - title = "Account", - logoutButton = "Logout", -) diff --git a/ui/account/src/commonMain/kotlin/dev/alvr/katana/ui/account/strings/esAccountStrings.kt b/ui/account/src/commonMain/kotlin/dev/alvr/katana/ui/account/strings/esAccountStrings.kt deleted file mode 100644 index f5d62fe27..000000000 --- a/ui/account/src/commonMain/kotlin/dev/alvr/katana/ui/account/strings/esAccountStrings.kt +++ /dev/null @@ -1,6 +0,0 @@ -package dev.alvr.katana.ui.account.strings - -internal val esAccountStrings = AccountStrings( - title = "Cuenta", - logoutButton = "Cerrar sesión", -) diff --git a/ui/account/src/commonMain/kotlin/dev/alvr/katana/ui/account/view/AccountScreen.kt b/ui/account/src/commonMain/kotlin/dev/alvr/katana/ui/account/view/AccountScreen.kt index 78f4c9578..36c118c4c 100644 --- a/ui/account/src/commonMain/kotlin/dev/alvr/katana/ui/account/view/AccountScreen.kt +++ b/ui/account/src/commonMain/kotlin/dev/alvr/katana/ui/account/view/AccountScreen.kt @@ -7,11 +7,13 @@ import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import dev.alvr.katana.ui.account.entities.UserInfoUi import dev.alvr.katana.ui.account.navigation.AccountNavigator -import dev.alvr.katana.ui.account.strings.LocalAccountStrings import dev.alvr.katana.ui.account.viewmodel.AccountViewModel import dev.alvr.katana.ui.base.components.home.KatanaHomeTopAppBar import dev.alvr.katana.ui.base.navigation.Destination import dev.alvr.katana.ui.base.viewmodel.collectAsState +import katana.ui.account.generated.resources.Res +import org.jetbrains.compose.resources.ExperimentalResourceApi +import org.jetbrains.compose.resources.stringResource import org.koin.compose.koinInject @Composable @@ -32,6 +34,7 @@ internal fun AccountScreen( } @Composable +@OptIn(ExperimentalResourceApi::class) private fun AccountScreen( userInfo: UserInfoUi, onLogoutClick: () -> Unit, @@ -39,7 +42,7 @@ private fun AccountScreen( Scaffold( topBar = { KatanaHomeTopAppBar( - title = LocalAccountStrings.current.title, + title = stringResource(Res.string.title), subtitle = null, ) }, diff --git a/ui/account/src/commonMain/kotlin/dev/alvr/katana/ui/account/view/UserInfo.kt b/ui/account/src/commonMain/kotlin/dev/alvr/katana/ui/account/view/UserInfo.kt index 68a58b332..700674e7a 100644 --- a/ui/account/src/commonMain/kotlin/dev/alvr/katana/ui/account/view/UserInfo.kt +++ b/ui/account/src/commonMain/kotlin/dev/alvr/katana/ui/account/view/UserInfo.kt @@ -17,11 +17,14 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.unit.dp import dev.alvr.katana.ui.account.entities.UserInfoUi -import dev.alvr.katana.ui.account.strings.LocalAccountStrings import io.kamel.image.KamelImage import io.kamel.image.asyncPainterResource +import katana.ui.account.generated.resources.Res +import org.jetbrains.compose.resources.ExperimentalResourceApi +import org.jetbrains.compose.resources.stringResource @Composable +@OptIn(ExperimentalResourceApi::class) internal fun UserInfo( userInfo: UserInfoUi, onLogoutClick: () -> Unit, @@ -38,7 +41,7 @@ internal fun UserInfo( ) Button(onClick = onLogoutClick) { - Text(text = LocalAccountStrings.current.logoutButton) + Text(text = stringResource(Res.string.logout_button)) } } } diff --git a/ui/base/src/commonMain/composeResources/values-es/strings.xml b/ui/base/src/commonMain/composeResources/values-es/strings.xml new file mode 100644 index 000000000..6c1ee34ae --- /dev/null +++ b/ui/base/src/commonMain/composeResources/values-es/strings.xml @@ -0,0 +1,12 @@ + + + No se han encontrado datos. + Ha ocurrido un error. + Intentar de nuevo. + + Menú de búsqueda + Menú de filtrado + + Cerrar búsqueda + Limpiar búsqueda + diff --git a/ui/base/src/commonMain/composeResources/values/strings.xml b/ui/base/src/commonMain/composeResources/values/strings.xml new file mode 100644 index 000000000..9aa6771f0 --- /dev/null +++ b/ui/base/src/commonMain/composeResources/values/strings.xml @@ -0,0 +1,12 @@ + + + No data has been found. + An error occurred. + Retry again. + + Search menu + Filter menu + + Close search + Clear search input + diff --git a/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/components/KatanaSearchTopAppBar.kt b/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/components/KatanaSearchTopAppBar.kt index d0e868848..67683bbee 100644 --- a/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/components/KatanaSearchTopAppBar.kt +++ b/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/components/KatanaSearchTopAppBar.kt @@ -27,8 +27,9 @@ import androidx.compose.ui.graphics.RectangleShape import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.text.input.ImeAction import dev.alvr.katana.common.core.empty -import dev.alvr.katana.ui.base.strings.LocalBaseStrings +import katana.ui.base.generated.resources.Res import org.jetbrains.compose.resources.ExperimentalResourceApi +import org.jetbrains.compose.resources.stringResource @Composable @OptIn(ExperimentalResourceApi::class) @@ -45,8 +46,6 @@ fun KatanaSearchTopAppBar( val focusManager = LocalFocusManager.current val focusRequester = remember { FocusRequester() } - val strings = LocalBaseStrings.current - // Request focus only the first time if (!focusRequested) { LaunchedEffect(Unit) { @@ -68,8 +67,8 @@ fun KatanaSearchTopAppBar( leadingIcon = { IconButton(onClick = onBack) { Icon( - contentDescription = strings.toolbarSearchClose, imageVector = Icons.AutoMirrored.Outlined.ArrowBack, + contentDescription = stringResource(Res.string.toolbar_search_close), ) } }, @@ -82,7 +81,7 @@ fun KatanaSearchTopAppBar( ) { Icon( imageVector = Icons.Outlined.Clear, - contentDescription = strings.toolbarSearchClear, + contentDescription = stringResource(Res.string.toolbar_search_clear), ) } }, diff --git a/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/components/KatanaStates.kt b/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/components/KatanaStates.kt index b7c09f667..2b584ce13 100644 --- a/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/components/KatanaStates.kt +++ b/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/components/KatanaStates.kt @@ -25,9 +25,12 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp -import dev.alvr.katana.ui.base.strings.LocalBaseStrings +import katana.ui.base.generated.resources.Res +import org.jetbrains.compose.resources.ExperimentalResourceApi +import org.jetbrains.compose.resources.stringResource @Composable +@OptIn(ExperimentalResourceApi::class) fun KatanaEmptyState( text: String, modifier: Modifier = Modifier, @@ -36,11 +39,12 @@ fun KatanaEmptyState( modifier = modifier, text = text, imageVector = Icons.TwoTone.Inbox, - contentDescription = LocalBaseStrings.current.componentEmptyState, + contentDescription = stringResource(Res.string.component_empty_state), ) } @Composable +@OptIn(ExperimentalResourceApi::class) fun KatanaErrorState( text: String, loading: Boolean, @@ -52,7 +56,7 @@ fun KatanaErrorState( modifier = modifier, text = text, imageVector = Icons.TwoTone.Error, - contentDescription = LocalBaseStrings.current.componentErrorState, + contentDescription = stringResource(Res.string.component_error_state), ) { Spacer(Modifier.height(16.dp)) diff --git a/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/components/home/KatanaHomeTopAppBar.kt b/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/components/home/KatanaHomeTopAppBar.kt index 4db6e3749..ac330894c 100644 --- a/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/components/home/KatanaHomeTopAppBar.kt +++ b/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/components/home/KatanaHomeTopAppBar.kt @@ -12,10 +12,15 @@ import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import dev.alvr.katana.ui.base.strings.LocalBaseStrings +import katana.ui.base.generated.resources.Res +import org.jetbrains.compose.resources.ExperimentalResourceApi +import org.jetbrains.compose.resources.stringResource @Composable -@OptIn(ExperimentalMaterial3Api::class) +@OptIn( + ExperimentalMaterial3Api::class, + ExperimentalResourceApi::class, +) fun KatanaHomeTopAppBar( title: String, subtitle: String?, @@ -23,8 +28,6 @@ fun KatanaHomeTopAppBar( onSearch: (() -> Unit)? = null, onFilter: (() -> Unit)? = null, ) { - val strings = LocalBaseStrings.current - TopAppBar( modifier = modifier, title = { @@ -40,7 +43,7 @@ fun KatanaHomeTopAppBar( IconButton(onClick = onSearch) { Icon( imageVector = Icons.Outlined.Search, - contentDescription = strings.toolbarMenuSearch, + contentDescription = stringResource(Res.string.toolbar_menu_search), ) } } @@ -49,7 +52,7 @@ fun KatanaHomeTopAppBar( IconButton(onClick = onFilter) { Icon( imageVector = Icons.Outlined.FilterAlt, - contentDescription = strings.toolbarMenuFilter, + contentDescription = stringResource(Res.string.toolbar_menu_filter), ) } } diff --git a/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/strings/BaseStrings.kt b/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/strings/BaseStrings.kt deleted file mode 100644 index d140e7b41..000000000 --- a/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/strings/BaseStrings.kt +++ /dev/null @@ -1,30 +0,0 @@ -package dev.alvr.katana.ui.base.strings - -import androidx.compose.runtime.Composable -import androidx.compose.runtime.Immutable -import androidx.compose.runtime.compositionLocalOf -import dev.alvr.katana.ui.base.utils.Locales -import dev.alvr.katana.ui.base.utils.rememberKatanaStrings -import kotlinx.collections.immutable.persistentMapOf - -@Immutable -@Suppress("LongParameterList", "UseDataClass") -class BaseStrings internal constructor( - internal val componentEmptyState: String, - internal val componentErrorState: String, - internal val componentErrorStateRetryButton: String, - internal val toolbarMenuSearch: String, - internal val toolbarMenuFilter: String, - internal val toolbarSearchClose: String, - internal val toolbarSearchClear: String, -) - -internal val Strings = persistentMapOf( - Locales.EN to enBaseStrings, - Locales.ES to esBaseStrings, -) - -val LocalBaseStrings = compositionLocalOf { enBaseStrings } - -@Composable -fun rememberBaseStrings() = rememberKatanaStrings(Strings) diff --git a/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/strings/enBaseStrings.kt b/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/strings/enBaseStrings.kt deleted file mode 100644 index 8b9c65122..000000000 --- a/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/strings/enBaseStrings.kt +++ /dev/null @@ -1,11 +0,0 @@ -package dev.alvr.katana.ui.base.strings - -internal val enBaseStrings = BaseStrings( - componentEmptyState = "No data has been found.", - componentErrorState = "An error occurred.", - componentErrorStateRetryButton = "Retry again.", - toolbarMenuSearch = "Search menu", - toolbarMenuFilter = "Filter menu", - toolbarSearchClose = "Close search", - toolbarSearchClear = "Clear search input", -) diff --git a/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/strings/esBaseStrings.kt b/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/strings/esBaseStrings.kt deleted file mode 100644 index 867baded8..000000000 --- a/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/strings/esBaseStrings.kt +++ /dev/null @@ -1,11 +0,0 @@ -package dev.alvr.katana.ui.base.strings - -internal val esBaseStrings = BaseStrings( - componentEmptyState = "No se han encontrado datos.", - componentErrorState = "Ha ocurrido un error.", - componentErrorStateRetryButton = "Intentar de nuevo.", - toolbarMenuSearch = "Menú de búsqueda", - toolbarMenuFilter = "Menú de filtrado", - toolbarSearchClose = "Cerrar búsqueda", - toolbarSearchClear = "Limpiar búsqueda", -) diff --git a/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/utils/strings.kt b/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/utils/strings.kt deleted file mode 100644 index e882c4448..000000000 --- a/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/utils/strings.kt +++ /dev/null @@ -1,23 +0,0 @@ -package dev.alvr.katana.ui.base.utils - -import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember -import androidx.compose.ui.text.intl.Locale -import cafe.adriel.lyricist.LanguageTag -import cafe.adriel.lyricist.Lyricist -import kotlinx.collections.immutable.ImmutableMap - -@Composable -fun rememberKatanaStrings(strings: ImmutableMap): T = remember { - Lyricist( - defaultLanguageTag = Locales.Default, - translations = strings, - ).apply { languageTag = Locale.current.toLanguageTag() }.strings -} - -object Locales { - const val EN = "en" - const val ES = "es" - - internal const val Default = EN -} diff --git a/ui/explore/src/commonMain/composeResources/values-es/strings.xml b/ui/explore/src/commonMain/composeResources/values-es/strings.xml new file mode 100644 index 000000000..c35788e1b --- /dev/null +++ b/ui/explore/src/commonMain/composeResources/values-es/strings.xml @@ -0,0 +1,5 @@ + + + Explorar + Buscar… + diff --git a/ui/explore/src/commonMain/composeResources/values/strings.xml b/ui/explore/src/commonMain/composeResources/values/strings.xml new file mode 100644 index 000000000..490da99b2 --- /dev/null +++ b/ui/explore/src/commonMain/composeResources/values/strings.xml @@ -0,0 +1,5 @@ + + + Explore + Search… + diff --git a/ui/explore/src/commonMain/kotlin/dev/alvr/katana/ui/explore/strings/ExploreStrings.kt b/ui/explore/src/commonMain/kotlin/dev/alvr/katana/ui/explore/strings/ExploreStrings.kt deleted file mode 100644 index aab44aca5..000000000 --- a/ui/explore/src/commonMain/kotlin/dev/alvr/katana/ui/explore/strings/ExploreStrings.kt +++ /dev/null @@ -1,25 +0,0 @@ -package dev.alvr.katana.ui.explore.strings - -import androidx.compose.runtime.Composable -import androidx.compose.runtime.Immutable -import androidx.compose.runtime.compositionLocalOf -import dev.alvr.katana.ui.base.utils.Locales -import dev.alvr.katana.ui.base.utils.rememberKatanaStrings -import kotlinx.collections.immutable.persistentMapOf - -@Immutable -@Suppress("LongParameterList", "UseDataClass") -class ExploreStrings internal constructor( - internal val exploreToolbarTitle: String, - internal val exploreToolbarSearchPlaceholder: String, -) - -internal val Strings = persistentMapOf( - Locales.EN to enExploreStrings, - Locales.ES to esExploreStrings, -) - -val LocalExploreStrings = compositionLocalOf { enExploreStrings } - -@Composable -fun rememberExploreStrings() = rememberKatanaStrings(Strings) diff --git a/ui/explore/src/commonMain/kotlin/dev/alvr/katana/ui/explore/strings/enExploreStrings.kt b/ui/explore/src/commonMain/kotlin/dev/alvr/katana/ui/explore/strings/enExploreStrings.kt deleted file mode 100644 index a1bf1fb47..000000000 --- a/ui/explore/src/commonMain/kotlin/dev/alvr/katana/ui/explore/strings/enExploreStrings.kt +++ /dev/null @@ -1,6 +0,0 @@ -package dev.alvr.katana.ui.explore.strings - -internal val enExploreStrings = ExploreStrings( - exploreToolbarTitle = "Explore", - exploreToolbarSearchPlaceholder = "Search…", -) diff --git a/ui/explore/src/commonMain/kotlin/dev/alvr/katana/ui/explore/strings/esExploreStrings.kt b/ui/explore/src/commonMain/kotlin/dev/alvr/katana/ui/explore/strings/esExploreStrings.kt deleted file mode 100644 index 695ef0c87..000000000 --- a/ui/explore/src/commonMain/kotlin/dev/alvr/katana/ui/explore/strings/esExploreStrings.kt +++ /dev/null @@ -1,6 +0,0 @@ -package dev.alvr.katana.ui.explore.strings - -internal val esExploreStrings = ExploreStrings( - exploreToolbarTitle = "Explorar", - exploreToolbarSearchPlaceholder = "Buscar…", -) diff --git a/ui/explore/src/commonMain/kotlin/dev/alvr/katana/ui/explore/view/ExploreScreen.kt b/ui/explore/src/commonMain/kotlin/dev/alvr/katana/ui/explore/view/ExploreScreen.kt index 981caf832..70b9dfb9f 100644 --- a/ui/explore/src/commonMain/kotlin/dev/alvr/katana/ui/explore/view/ExploreScreen.kt +++ b/ui/explore/src/commonMain/kotlin/dev/alvr/katana/ui/explore/view/ExploreScreen.kt @@ -8,23 +8,27 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import dev.alvr.katana.ui.base.components.home.KatanaHomeScaffold import dev.alvr.katana.ui.base.navigation.Destination -import dev.alvr.katana.ui.explore.strings.LocalExploreStrings +import katana.ui.explore.generated.resources.Res +import org.jetbrains.compose.resources.ExperimentalResourceApi +import org.jetbrains.compose.resources.stringResource @Composable @Destination -@OptIn(ExperimentalMaterialApi::class, ExperimentalAnimationApi::class) +@OptIn( + ExperimentalMaterialApi::class, + ExperimentalResourceApi::class, + ExperimentalAnimationApi::class, +) internal fun ExploreScreen() { - val strings = LocalExploreStrings.current - KatanaHomeScaffold( - title = strings.exploreToolbarTitle, - searchPlaceholder = strings.exploreToolbarSearchPlaceholder, + title = stringResource(Res.string.explore_toolbar_title), + searchPlaceholder = stringResource(Res.string.explore_toolbar_search_placeholder), onSearch = {}, backContent = { Filter() }, ) { paddingValues -> Text( modifier = Modifier.padding(paddingValues), - text = strings.exploreToolbarTitle, + text = stringResource(Res.string.explore_toolbar_title), ) } } diff --git a/ui/lists/src/androidMain/kotlin/dev/alvr/katana/ui/lists/view/AnimeScreen.kt b/ui/lists/src/androidMain/kotlin/dev/alvr/katana/ui/lists/view/AnimeScreen.kt index 6290e481c..a5134d4b0 100644 --- a/ui/lists/src/androidMain/kotlin/dev/alvr/katana/ui/lists/view/AnimeScreen.kt +++ b/ui/lists/src/androidMain/kotlin/dev/alvr/katana/ui/lists/view/AnimeScreen.kt @@ -8,16 +8,19 @@ import androidx.compose.runtime.Composable import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.result.ResultRecipient import dev.alvr.katana.ui.lists.navigation.ListsNavigator -import dev.alvr.katana.ui.lists.strings.LocalListsStrings import dev.alvr.katana.ui.lists.view.components.ListScreen import dev.alvr.katana.ui.lists.view.destinations.ChangeListSheetDestination import dev.alvr.katana.ui.lists.viewmodel.AnimeListsViewModel +import katana.ui.lists.generated.resources.Res +import org.jetbrains.compose.resources.ExperimentalResourceApi +import org.jetbrains.compose.resources.stringResource import org.koin.androidx.compose.koinViewModel @Composable @Destination @OptIn( ExperimentalMaterialApi::class, + ExperimentalResourceApi::class, ExperimentalAnimationApi::class, ExperimentalFoundationApi::class, ) @@ -25,14 +28,12 @@ internal fun AnimeScreen( navigator: ListsNavigator, resultRecipient: ResultRecipient, ) { - val strings = LocalListsStrings.current - ListScreen( vm = koinViewModel(), navigator = navigator, resultRecipient = resultRecipient, - title = strings.animeToolbar, - emptyStateRes = strings.emptyAnimeList, + title = stringResource(Res.string.anime_toolbar), + emptyStateRes = stringResource(Res.string.empty_anime_list), backContent = { Filter() }, ) } diff --git a/ui/lists/src/androidMain/kotlin/dev/alvr/katana/ui/lists/view/MangaScreen.kt b/ui/lists/src/androidMain/kotlin/dev/alvr/katana/ui/lists/view/MangaScreen.kt index 80b715cbf..c54ed2518 100644 --- a/ui/lists/src/androidMain/kotlin/dev/alvr/katana/ui/lists/view/MangaScreen.kt +++ b/ui/lists/src/androidMain/kotlin/dev/alvr/katana/ui/lists/view/MangaScreen.kt @@ -8,16 +8,19 @@ import androidx.compose.runtime.Composable import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.result.ResultRecipient import dev.alvr.katana.ui.lists.navigation.ListsNavigator -import dev.alvr.katana.ui.lists.strings.LocalListsStrings import dev.alvr.katana.ui.lists.view.components.ListScreen import dev.alvr.katana.ui.lists.view.destinations.ChangeListSheetDestination import dev.alvr.katana.ui.lists.viewmodel.MangaListsViewModel +import katana.ui.lists.generated.resources.Res.string +import org.jetbrains.compose.resources.ExperimentalResourceApi +import org.jetbrains.compose.resources.stringResource import org.koin.androidx.compose.koinViewModel @Composable @Destination @OptIn( ExperimentalMaterialApi::class, + ExperimentalResourceApi::class, ExperimentalAnimationApi::class, ExperimentalFoundationApi::class, ) @@ -25,14 +28,12 @@ internal fun MangaScreen( navigator: ListsNavigator, resultRecipient: ResultRecipient, ) { - val strings = LocalListsStrings.current - ListScreen( vm = koinViewModel(), navigator = navigator, resultRecipient = resultRecipient, - title = strings.mangaToolbar, - emptyStateRes = strings.emptyMangaList, + title = stringResource(string.manga_toolbar), + emptyStateRes = stringResource(string.empty_anime_list), backContent = { Filter() }, ) } diff --git a/ui/lists/src/androidMain/kotlin/dev/alvr/katana/ui/lists/view/components/ChangeList.kt b/ui/lists/src/androidMain/kotlin/dev/alvr/katana/ui/lists/view/components/ChangeList.kt index b00f8b254..1c149d67a 100644 --- a/ui/lists/src/androidMain/kotlin/dev/alvr/katana/ui/lists/view/components/ChangeList.kt +++ b/ui/lists/src/androidMain/kotlin/dev/alvr/katana/ui/lists/view/components/ChangeList.kt @@ -26,7 +26,9 @@ import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.result.ResultBackNavigator import com.ramcosta.composedestinations.spec.DestinationStyleBottomSheet import dev.alvr.katana.ui.lists.entities.UserList -import dev.alvr.katana.ui.lists.strings.LocalListsStrings +import katana.ui.lists.generated.resources.Res +import org.jetbrains.compose.resources.ExperimentalResourceApi +import org.jetbrains.compose.resources.stringResource @Composable @Destination(style = DestinationStyleBottomSheet::class) @@ -75,8 +77,8 @@ internal fun ChangeListButton( if (visible) { FloatingActionButton(onClick = onClick) { Icon( - contentDescription = LocalListsStrings.current.changeListButton, imageVector = Icons.AutoMirrored.TwoTone.List, + contentDescription = stringResource(Res.string.change_list_button), ) } } diff --git a/ui/lists/src/androidMain/kotlin/dev/alvr/katana/ui/lists/view/components/ListScreen.kt b/ui/lists/src/androidMain/kotlin/dev/alvr/katana/ui/lists/view/components/ListScreen.kt index 157611723..3ca47f2a2 100644 --- a/ui/lists/src/androidMain/kotlin/dev/alvr/katana/ui/lists/view/components/ListScreen.kt +++ b/ui/lists/src/androidMain/kotlin/dev/alvr/katana/ui/lists/view/components/ListScreen.kt @@ -1,7 +1,6 @@ package dev.alvr.katana.ui.lists.view.components import androidx.compose.animation.ExperimentalAnimationApi -import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.grid.rememberLazyGridState import androidx.compose.material.ExperimentalMaterialApi @@ -21,17 +20,21 @@ import dev.alvr.katana.ui.base.components.home.KatanaHomeScaffold import dev.alvr.katana.ui.base.components.home.rememberKatanaHomeScaffoldState import dev.alvr.katana.ui.base.viewmodel.collectAsState import dev.alvr.katana.ui.lists.navigation.ListsNavigator -import dev.alvr.katana.ui.lists.strings.LocalListsStrings import dev.alvr.katana.ui.lists.view.destinations.ChangeListSheetDestination import dev.alvr.katana.ui.lists.viewmodel.AnimeListsViewModel import dev.alvr.katana.ui.lists.viewmodel.ListsViewModel import dev.alvr.katana.ui.lists.viewmodel.MangaListsViewModel +import katana.ui.lists.generated.resources.Res import kotlinx.coroutines.launch +import org.jetbrains.compose.resources.ExperimentalResourceApi +import org.jetbrains.compose.resources.stringResource @Composable -@ExperimentalMaterialApi -@ExperimentalAnimationApi -@ExperimentalFoundationApi +@OptIn( + ExperimentalMaterialApi::class, + ExperimentalResourceApi::class, + ExperimentalAnimationApi::class, +) internal fun ListScreen( vm: ListsViewModel<*, *>, navigator: ListsNavigator, @@ -45,7 +48,6 @@ internal fun ListScreen( val katanaScaffoldState = rememberKatanaHomeScaffoldState() val lazyGridState = rememberLazyGridState() val coroutineScope = rememberCoroutineScope() - val strings = LocalListsStrings.current resultRecipient.OnNavValue { result -> vm.selectList(result).also { @@ -55,9 +57,9 @@ internal fun ListScreen( } val searchPlaceholder = when (vm) { - is AnimeListsViewModel -> strings.animeToolbarSearchPlaceholder - is MangaListsViewModel -> strings.mangaToolbarSearchPlaceholder - } + is AnimeListsViewModel -> Res.string.anime_toolbar_search_placeholder + is MangaListsViewModel -> Res.string.manga_toolbar_search_placeholder + }.let { res -> stringResource(res) } val buttonsVisible by remember(state.isError) { derivedStateOf(structuralEqualityPolicy()) { !state.isError } @@ -81,12 +83,12 @@ internal fun ListScreen( when { isError -> KatanaErrorState( modifier = modifier.padding(paddingValues), - text = strings.errorMessage, + text = stringResource(Res.string.error_message), onRetry = { vm.refreshList() katanaScaffoldState.resetToolbar() }, - buttonText = strings.errorRetryButton, + buttonText = stringResource(Res.string.error_retry_button), loading = state.isLoading, ) isEmpty && !isLoading -> KatanaEmptyState( diff --git a/ui/lists/src/commonMain/composeResources/values-es/strings.xml b/ui/lists/src/commonMain/composeResources/values-es/strings.xml new file mode 100644 index 000000000..3a446e0b3 --- /dev/null +++ b/ui/lists/src/commonMain/composeResources/values-es/strings.xml @@ -0,0 +1,33 @@ + + + Anime + Manga + %d/%d + Ep. %d: %s + + %d + + + Search Anime… + Search Manga… + + TV + TV Short + Movie + Special + OVA + ONA + Music + Manga + Light Novel + One Shot + Unknown + + This Anime list is empty + This Manga list is empty + + Something has happened when getting the information from the selected list + Cover not found + Try again + + Change list + diff --git a/ui/lists/src/commonMain/composeResources/values/strings.xml b/ui/lists/src/commonMain/composeResources/values/strings.xml new file mode 100644 index 000000000..3a446e0b3 --- /dev/null +++ b/ui/lists/src/commonMain/composeResources/values/strings.xml @@ -0,0 +1,33 @@ + + + Anime + Manga + %d/%d + Ep. %d: %s + + %d + + + Search Anime… + Search Manga… + + TV + TV Short + Movie + Special + OVA + ONA + Music + Manga + Light Novel + One Shot + Unknown + + This Anime list is empty + This Manga list is empty + + Something has happened when getting the information from the selected list + Cover not found + Try again + + Change list + diff --git a/ui/lists/src/commonMain/kotlin/dev/alvr/katana/ui/lists/entities/MediaListItem.kt b/ui/lists/src/commonMain/kotlin/dev/alvr/katana/ui/lists/entities/MediaListItem.kt index f24fff96c..1b3c25602 100644 --- a/ui/lists/src/commonMain/kotlin/dev/alvr/katana/ui/lists/entities/MediaListItem.kt +++ b/ui/lists/src/commonMain/kotlin/dev/alvr/katana/ui/lists/entities/MediaListItem.kt @@ -5,9 +5,11 @@ import androidx.compose.runtime.Immutable import androidx.compose.runtime.Stable import com.arkivanov.essenty.parcelable.Parcelable import com.arkivanov.essenty.parcelable.Parcelize -import dev.alvr.katana.ui.lists.strings.LocalListsStrings +import katana.ui.lists.generated.resources.Res import korlibs.time.Date import korlibs.time.DateTimeTz +import org.jetbrains.compose.resources.ExperimentalResourceApi +import org.jetbrains.compose.resources.stringResource @Immutable @Suppress("ComplexInterface") @@ -90,21 +92,22 @@ internal sealed interface MediaListItem : Parcelable { OneShot, Unknown; + @OptIn(ExperimentalResourceApi::class) val value - @Composable get() = with(LocalListsStrings.current) { + @Composable get() = with(Res.string) { when (this@Format) { - Tv -> entryFormatTv - TvShort -> entryFormatTvShort - Movie -> entryFormatMovie - Special -> entryFormatSpecial - Ova -> entryFormatOva - Ona -> entryFormatOna - Music -> entryFormatMusic - Manga -> entryFormatManga - Novel -> entryFormatNovel - OneShot -> entryFormatOneShot - Unknown -> entryFormatUnknown - } + Tv -> entry_format_tv + TvShort -> entry_format_tv_short + Movie -> entry_format_movie + Special -> entry_format_special + Ova -> entry_format_ova + Ona -> entry_format_ona + Music -> entry_format_music + Manga -> manga_toolbar + Novel -> entry_format_novel + OneShot -> entry_format_one_shot + Unknown -> entry_format_unknown + }.let { res -> stringResource(res) } } } } diff --git a/ui/lists/src/commonMain/kotlin/dev/alvr/katana/ui/lists/strings/ListsStrings.kt b/ui/lists/src/commonMain/kotlin/dev/alvr/katana/ui/lists/strings/ListsStrings.kt deleted file mode 100644 index 07bd185cc..000000000 --- a/ui/lists/src/commonMain/kotlin/dev/alvr/katana/ui/lists/strings/ListsStrings.kt +++ /dev/null @@ -1,55 +0,0 @@ -package dev.alvr.katana.ui.lists.strings - -import androidx.compose.runtime.Composable -import androidx.compose.runtime.Immutable -import androidx.compose.runtime.compositionLocalOf -import dev.alvr.katana.ui.base.utils.Locales -import dev.alvr.katana.ui.base.utils.rememberKatanaStrings -import kotlinx.collections.immutable.persistentMapOf - -@Immutable -@Suppress("LongParameterList", "UseDataClass") -class ListsStrings internal constructor( - // Common - internal val animeToolbar: String = "Anime", - internal val mangaToolbar: String = "Manga", - internal val entryProgress: (Int, Any) -> String = { current, total -> "$current/$total" }, - internal val entryNextEpisode: (Int, String) -> String = { number, date -> "Ep. $number: $date" }, - internal val entryNextEpisodeSeparator: String = "›", - internal val entryPlusOne: (String) -> String = { progress -> "$progress +" }, - - // Specific - internal val animeToolbarSearchPlaceholder: String, - internal val mangaToolbarSearchPlaceholder: String, - - internal val emptyAnimeList: String, - internal val emptyMangaList: String, - - internal val errorMessage: String, - internal val errorCover: String, - internal val errorRetryButton: String, - - internal val entryFormatTv: String, - internal val entryFormatTvShort: String, - internal val entryFormatMovie: String, - internal val entryFormatSpecial: String, - internal val entryFormatOva: String, - internal val entryFormatOna: String, - internal val entryFormatMusic: String, - internal val entryFormatManga: String, - internal val entryFormatNovel: String, - internal val entryFormatOneShot: String, - internal val entryFormatUnknown: String, - - internal val changeListButton: String, -) - -internal val Strings = persistentMapOf( - Locales.EN to enListsStrings, - Locales.ES to esListsStrings, -) - -val LocalListsStrings = compositionLocalOf { enListsStrings } - -@Composable -fun rememberListsStrings() = rememberKatanaStrings(Strings) diff --git a/ui/lists/src/commonMain/kotlin/dev/alvr/katana/ui/lists/strings/enListsStrings.kt b/ui/lists/src/commonMain/kotlin/dev/alvr/katana/ui/lists/strings/enListsStrings.kt deleted file mode 100644 index 64616b3cb..000000000 --- a/ui/lists/src/commonMain/kotlin/dev/alvr/katana/ui/lists/strings/enListsStrings.kt +++ /dev/null @@ -1,27 +0,0 @@ -package dev.alvr.katana.ui.lists.strings - -internal val enListsStrings = ListsStrings( - animeToolbarSearchPlaceholder = "Search Anime…", - mangaToolbarSearchPlaceholder = "Search Manga…", - - entryFormatTv = "TV", - entryFormatTvShort = "TV Short", - entryFormatMovie = "Movie", - entryFormatSpecial = "Special", - entryFormatOva = "OVA", - entryFormatOna = "ONA", - entryFormatMusic = "Music", - entryFormatManga = "Manga", - entryFormatNovel = "Light Novel", - entryFormatOneShot = "One Shot", - entryFormatUnknown = "Unknown", - - emptyAnimeList = "This Anime list is empty", - emptyMangaList = "This Manga list is empty", - - errorMessage = "Something has happened when getting the information from the selected list", - errorCover = "Cover not found", - errorRetryButton = "Try again", - - changeListButton = "Change list", -) diff --git a/ui/lists/src/commonMain/kotlin/dev/alvr/katana/ui/lists/strings/esListsStrings.kt b/ui/lists/src/commonMain/kotlin/dev/alvr/katana/ui/lists/strings/esListsStrings.kt deleted file mode 100644 index 4d84dce98..000000000 --- a/ui/lists/src/commonMain/kotlin/dev/alvr/katana/ui/lists/strings/esListsStrings.kt +++ /dev/null @@ -1,27 +0,0 @@ -package dev.alvr.katana.ui.lists.strings - -internal val esListsStrings = ListsStrings( - animeToolbarSearchPlaceholder = "Buscar Anime…", - mangaToolbarSearchPlaceholder = "Buscar Manga…", - - entryFormatTv = "TV", - entryFormatTvShort = "Corto TV", - entryFormatMovie = "Película", - entryFormatSpecial = "Especial", - entryFormatOva = "OVA", - entryFormatOna = "ONA", - entryFormatMusic = "Música", - entryFormatManga = "Manga", - entryFormatNovel = "Novela Ligera", - entryFormatOneShot = "One Shot", - entryFormatUnknown = "Desconocido", - - emptyAnimeList = "Esta lista de Anime está vacía", - emptyMangaList = "Esta lista de Manga está vacía", - - errorMessage = "Algo ha ocurrido al obtener la información de la lista seleccionada", - errorCover = "Carátula no encontrada", - errorRetryButton = "Interta de nuevo", - - changeListButton = "Cambiar lista", -) diff --git a/ui/lists/src/commonMain/kotlin/dev/alvr/katana/ui/lists/view/components/MediaList.kt b/ui/lists/src/commonMain/kotlin/dev/alvr/katana/ui/lists/view/components/MediaList.kt index 370458bc9..abf717f81 100644 --- a/ui/lists/src/commonMain/kotlin/dev/alvr/katana/ui/lists/view/components/MediaList.kt +++ b/ui/lists/src/commonMain/kotlin/dev/alvr/katana/ui/lists/view/components/MediaList.kt @@ -50,7 +50,6 @@ import dev.alvr.katana.common.core.zero import dev.alvr.katana.ui.base.components.KatanaPullRefresh import dev.alvr.katana.ui.base.modifiers.katanaPlaceholder import dev.alvr.katana.ui.lists.entities.MediaListItem -import dev.alvr.katana.ui.lists.strings.LocalListsStrings import dev.alvr.katana.ui.lists.viewmodel.ListState import io.kamel.image.KamelImage import io.kamel.image.asyncPainterResource @@ -58,6 +57,7 @@ import katana.ui.lists.generated.resources.Res import kotlinx.collections.immutable.ImmutableList import org.jetbrains.compose.resources.ExperimentalResourceApi import org.jetbrains.compose.resources.painterResource +import org.jetbrains.compose.resources.stringResource @Composable internal fun MediaList( @@ -266,7 +266,7 @@ private fun Cover( Image( modifier = Modifier.align(Alignment.Center), painter = painterResource(Res.drawable.default_cover), - contentDescription = LocalListsStrings.current.errorCover, + contentDescription = stringResource(Res.string.error_cover), ) }, ) @@ -288,19 +288,20 @@ private fun Title( } @Composable +@OptIn(ExperimentalResourceApi::class) private fun Subtitle( format: MediaListItem.Format, modifier: Modifier = Modifier, nextEpisode: MediaListItem.AnimeListItem.NextEpisode? = null, ) { - val strings = LocalListsStrings.current val text = buildAnnotatedString { append(format.value) if (nextEpisode != null) { - append(" ${strings.entryNextEpisodeSeparator} ") + append(" ${stringResource(Res.string.entry_next_episode_separator)} ") append( - strings.entryNextEpisode( + stringResource( + Res.string.entry_next_episode, nextEpisode.number, KatanaDateFormatter.DateWithTime(nextEpisode.date), ), @@ -338,6 +339,7 @@ private fun Score( } @Composable +@OptIn(ExperimentalResourceApi::class) private fun PlusOne( progress: Int, total: Int?, @@ -348,7 +350,7 @@ private fun PlusOne( // Episodes - Chapters (Anime & Manga) if (progress != total) { PlusOneButton( - progress = LocalListsStrings.current.entryProgress(progress, total ?: String.unknown), + progress = stringResource(Res.string.entry_progress, progress, total ?: String.unknown), itemLoading = itemLoading, onAddPlusOne = onAddPlusOne, modifier = modifier, @@ -357,6 +359,7 @@ private fun PlusOne( } @Composable +@OptIn(ExperimentalResourceApi::class) private fun PlusOneButton( progress: String, itemLoading: Boolean, @@ -370,7 +373,7 @@ private fun PlusOneButton( ) { Text( modifier = Modifier.katanaPlaceholder(visible = itemLoading), - text = LocalListsStrings.current.entryPlusOne(progress), + text = stringResource(Res.string.entry_plus_one, progress), ) } } diff --git a/ui/login/src/androidMain/kotlin/dev/alvr/katana/ui/login/view/LoginScreen.kt b/ui/login/src/androidMain/kotlin/dev/alvr/katana/ui/login/view/LoginScreen.kt index f67a7a24d..83e95b183 100644 --- a/ui/login/src/androidMain/kotlin/dev/alvr/katana/ui/login/view/LoginScreen.kt +++ b/ui/login/src/androidMain/kotlin/dev/alvr/katana/ui/login/view/LoginScreen.kt @@ -78,12 +78,12 @@ import dev.alvr.katana.ui.login.LOGIN_DEEP_LINK import dev.alvr.katana.ui.login.LOGO_FULL_SIZE import dev.alvr.katana.ui.login.LOGO_RESIZED import dev.alvr.katana.ui.login.navigation.LoginNavigator -import dev.alvr.katana.ui.login.strings.LocalLoginStrings import dev.alvr.katana.ui.login.viewmodel.LoginState import dev.alvr.katana.ui.login.viewmodel.LoginViewModel import katana.ui.login.generated.resources.Res import org.jetbrains.compose.resources.ExperimentalResourceApi import org.jetbrains.compose.resources.painterResource +import org.jetbrains.compose.resources.stringResource import org.koin.androidx.compose.koinViewModel import org.koin.core.parameter.parametersOf @@ -109,8 +109,6 @@ internal fun LoginScreen( @Composable @OptIn(ExperimentalResourceApi::class) private fun Login(state: LoginState, onLogin: () -> Unit) { - val strings = LocalLoginStrings.current - val background = remember { listOf( Res.drawable.background_chihiro, @@ -126,9 +124,9 @@ private fun Login(state: LoginState, onLogin: () -> Unit) { state.saved -> onLogin() state.errorType != null -> { val message = when (state.errorType) { - LoginState.ErrorType.SaveToken -> strings.saveTokenError - LoginState.ErrorType.SaveUserId -> strings.fetchUserIdError - } + LoginState.ErrorType.SaveToken -> Res.string.save_token_error + LoginState.ErrorType.SaveUserId -> Res.string.fetch_user_id_error + }.let { res -> stringResource(res) } LaunchedEffect(state.errorType) { scaffoldState.snackbarHostState.showSnackbar(message) } @@ -149,7 +147,7 @@ private fun Login(state: LoginState, onLogin: () -> Unit) { } else { Image( painter = painterResource(background), - contentDescription = strings.contentDescriptionBackground, + contentDescription = stringResource(Res.string.content_description_background), contentScale = ContentScale.Crop, modifier = Modifier .fillMaxSize() @@ -198,7 +196,7 @@ private fun KatanaLogo() { Image( painter = painterResource(Res.drawable.ic_katana_logo), - contentDescription = LocalLoginStrings.current.contentDescriptionKatanaLogo, + contentDescription = stringResource(Res.string.content_description_katana_logo), modifier = Modifier .padding(top = 8.dp) .fillMaxWidth(fraction = sizeFraction), @@ -206,9 +204,10 @@ private fun KatanaLogo() { } @Composable +@OptIn(ExperimentalResourceApi::class) private fun Description() { Text( - text = LocalLoginStrings.current.headerKatanaDescription, + text = stringResource(Res.string.header_katana_description), style = MaterialTheme.typography.headlineSmall, ) } @@ -248,9 +247,10 @@ private fun GetStarted(onStartedClick: (State) -> Unit) { } @Composable +@OptIn(ExperimentalResourceApi::class) private fun GetStartedDescription() { Text( - text = LocalLoginStrings.current.getStartedDescription, + text = stringResource(Res.string.get_started_description), textAlign = TextAlign.Justify, ) } @@ -260,7 +260,7 @@ private fun GetStartedDescription() { private fun GetStartedButton(onStartedClick: (State) -> Unit) { val inlineArrow = "inlineArrowContent" val text = buildAnnotatedString { - append(LocalLoginStrings.current.getStartedButton) + append(stringResource(Res.string.get_started_button)) append(' ') appendInlineContent(inlineArrow) } @@ -290,8 +290,8 @@ private fun GetStartedButton(onStartedClick: (State) -> Unit) { ), ) { Icon( - contentDescription = LocalLoginStrings.current.contentDescriptionGetStartedArrow, imageVector = Icons.AutoMirrored.Filled.ArrowForward, + contentDescription = stringResource(Res.string.content_description_get_started_arrow), modifier = Modifier.offset(x = translation), tint = MaterialTheme.colorScheme.onSurface, ) @@ -339,14 +339,16 @@ private fun Begin() { } @Composable +@OptIn(ExperimentalResourceApi::class) private fun BeginText() { Text( - text = LocalLoginStrings.current.beginDescription, + text = stringResource(Res.string.begin_description), textAlign = TextAlign.Justify, ) } @Composable +@OptIn(ExperimentalResourceApi::class) private fun BeginRegisterButton(modifier: Modifier = Modifier) { val uriHandler = LocalUriHandler.current @@ -355,12 +357,13 @@ private fun BeginRegisterButton(modifier: Modifier = Modifier) { onClick = { uriHandler.openUri(ANILIST_REGISTER) }, ) { Text( - text = LocalLoginStrings.current.beginRegisterButton, + text = stringResource(Res.string.begin_register_button), ) } } @Composable +@OptIn(ExperimentalResourceApi::class) private fun BeginLoginButton(modifier: Modifier = Modifier) { val uriHandler = LocalUriHandler.current @@ -369,7 +372,7 @@ private fun BeginLoginButton(modifier: Modifier = Modifier) { onClick = { uriHandler.openUri(ANILIST_LOGIN) }, ) { Text( - text = LocalLoginStrings.current.beginLoginButton, + text = stringResource(Res.string.begin_login_button), ) } } diff --git a/ui/login/src/commonMain/composeResources/values-es/strings.xml b/ui/login/src/commonMain/composeResources/values-es/strings.xml new file mode 100644 index 000000000..7da87b319 --- /dev/null +++ b/ui/login/src/commonMain/composeResources/values-es/strings.xml @@ -0,0 +1,18 @@ + + + Un cliente Android para Anilist + + Katana es un cliente de Anilist para Android donde puedes llevar la cuenta, explorar, descubrir y comentar Anime & Manga. + Empezar + + Para empezar a usar Katana necesitas una cuenta de Anilist. Toca uno de los botones de abajo para registrarte o iniciar sesión. + Registrarse + Iniciar sesión + + Ha habido un error al obtener el usuario, por favor, inténtalo de nuevo. + Ha habido un error al iniciar sesión, por favor, inténtalo de nuevo. + + Fondo de inicio de sesión. Selección variada de Studio Ghibli + Logo de Katana + Flecha indicando continuación + diff --git a/ui/login/src/commonMain/composeResources/values/strings.xml b/ui/login/src/commonMain/composeResources/values/strings.xml new file mode 100644 index 000000000..ebda68799 --- /dev/null +++ b/ui/login/src/commonMain/composeResources/values/strings.xml @@ -0,0 +1,18 @@ + + + An Anilist client for Android + + Katana is an Anilist client for Android where you can track, explore, discover and discuss Anime & Manga. + Get Started + + To start using Katana you need an Anilist account. Tap one of the buttons below to register or login. + Register + Login + + There was an error obtaining the user, please try again. + There was an error logging in, please try again. + + Login background. Assorted selection of Studio Ghibli + Katana logo + Arrow indicating continuation + diff --git a/ui/login/src/commonMain/kotlin/dev/alvr/katana/ui/login/strings/LoginStrings.kt b/ui/login/src/commonMain/kotlin/dev/alvr/katana/ui/login/strings/LoginStrings.kt deleted file mode 100644 index edb60c972..000000000 --- a/ui/login/src/commonMain/kotlin/dev/alvr/katana/ui/login/strings/LoginStrings.kt +++ /dev/null @@ -1,38 +0,0 @@ -package dev.alvr.katana.ui.login.strings - -import androidx.compose.runtime.Composable -import androidx.compose.runtime.Immutable -import androidx.compose.runtime.compositionLocalOf -import dev.alvr.katana.ui.base.utils.Locales -import dev.alvr.katana.ui.base.utils.rememberKatanaStrings -import kotlinx.collections.immutable.persistentMapOf - -@Immutable -@Suppress("LongParameterList", "UseDataClass") -class LoginStrings internal constructor( - internal val headerKatanaDescription: String, - - internal val getStartedDescription: String, - internal val getStartedButton: String, - - internal val beginDescription: String, - internal val beginRegisterButton: String, - internal val beginLoginButton: String, - - internal val fetchUserIdError: String, - internal val saveTokenError: String, - - internal val contentDescriptionBackground: String, - internal val contentDescriptionKatanaLogo: String, - internal val contentDescriptionGetStartedArrow: String, -) - -internal val Strings = persistentMapOf( - Locales.EN to enLoginStrings, - Locales.ES to esLoginStrings, -) - -val LocalLoginStrings = compositionLocalOf { enLoginStrings } - -@Composable -fun rememberLoginStrings() = rememberKatanaStrings(Strings) diff --git a/ui/login/src/commonMain/kotlin/dev/alvr/katana/ui/login/strings/enLoginStrings.kt b/ui/login/src/commonMain/kotlin/dev/alvr/katana/ui/login/strings/enLoginStrings.kt deleted file mode 100644 index 2ded7c0b0..000000000 --- a/ui/login/src/commonMain/kotlin/dev/alvr/katana/ui/login/strings/enLoginStrings.kt +++ /dev/null @@ -1,21 +0,0 @@ -package dev.alvr.katana.ui.login.strings - -internal val enLoginStrings = LoginStrings( - headerKatanaDescription = "An Anilist client for Android", - - getStartedDescription = "Katana is an Anilist client for Android where you can track, explore, " + - "discover and discuss Anime & Manga.", - getStartedButton = "Get Started", - - beginDescription = "To start using Katana you need an Anilist account. Tap one of the buttons " + - "below to register or login.", - beginRegisterButton = "Register", - beginLoginButton = "Login", - - fetchUserIdError = "There was an error obtaining the user, please try again.", - saveTokenError = "There was an error logging in, please try again.", - - contentDescriptionBackground = "Login background. Assorted selection of Studio Ghibli", - contentDescriptionKatanaLogo = "Katana logo", - contentDescriptionGetStartedArrow = "Arrow indicating continuation", -) diff --git a/ui/login/src/commonMain/kotlin/dev/alvr/katana/ui/login/strings/esLoginStrings.kt b/ui/login/src/commonMain/kotlin/dev/alvr/katana/ui/login/strings/esLoginStrings.kt deleted file mode 100644 index e5095b404..000000000 --- a/ui/login/src/commonMain/kotlin/dev/alvr/katana/ui/login/strings/esLoginStrings.kt +++ /dev/null @@ -1,21 +0,0 @@ -package dev.alvr.katana.ui.login.strings - -internal val esLoginStrings = LoginStrings( - headerKatanaDescription = "Un cliente Android para Anilist", - - getStartedDescription = "Katana es un cliente de Anilist para Android donde puedes llevar la " + - "cuenta, explorar, descubrir y comentar Anime & Manga.", - getStartedButton = "Empezar", - - beginDescription = "Para empezar a usar Katana necesitas una cuenta de Anilist. Toca uno de los " + - "botones de abajo para registrarte o iniciar sesión.", - beginRegisterButton = "Registrarse", - beginLoginButton = "Iniciar sesión", - - fetchUserIdError = "Ha habido un error al obtener el usuario, por favor, inténtalo de nuevo.", - saveTokenError = "Ha habido un error al iniciar sesión, por favor, inténtalo de nuevo.", - - contentDescriptionBackground = "Fondo de inicio de sesión. Selección variada de Studio Ghibli", - contentDescriptionKatanaLogo = "Logo de Katana", - contentDescriptionGetStartedArrow = "Flecha indicando continuación", -) diff --git a/ui/social/src/commonMain/composeResources/values-es/strings.xml b/ui/social/src/commonMain/composeResources/values-es/strings.xml new file mode 100644 index 000000000..d5fc78632 --- /dev/null +++ b/ui/social/src/commonMain/composeResources/values-es/strings.xml @@ -0,0 +1,5 @@ + + + Social + Buscar… + diff --git a/ui/social/src/commonMain/composeResources/values/strings.xml b/ui/social/src/commonMain/composeResources/values/strings.xml new file mode 100644 index 000000000..dc142ae4a --- /dev/null +++ b/ui/social/src/commonMain/composeResources/values/strings.xml @@ -0,0 +1,5 @@ + + + Social + Search… + diff --git a/ui/social/src/commonMain/kotlin/dev/alvr/katana/ui/social/strings/SocialStrings.kt b/ui/social/src/commonMain/kotlin/dev/alvr/katana/ui/social/strings/SocialStrings.kt deleted file mode 100644 index aff3767d1..000000000 --- a/ui/social/src/commonMain/kotlin/dev/alvr/katana/ui/social/strings/SocialStrings.kt +++ /dev/null @@ -1,25 +0,0 @@ -package dev.alvr.katana.ui.social.strings - -import androidx.compose.runtime.Composable -import androidx.compose.runtime.Immutable -import androidx.compose.runtime.compositionLocalOf -import dev.alvr.katana.ui.base.utils.Locales -import dev.alvr.katana.ui.base.utils.rememberKatanaStrings -import kotlinx.collections.immutable.persistentMapOf - -@Immutable -@Suppress("LongParameterList", "UseDataClass") -class SocialStrings internal constructor( - internal val socialToolbarTitle: String, - internal val socialToolbarSearchPlaceholder: String, -) - -internal val Strings = persistentMapOf( - Locales.EN to enSocialStrings, - Locales.ES to esSocialStrings, -) - -val LocalSocialStrings = compositionLocalOf { enSocialStrings } - -@Composable -fun rememberSocialStrings() = rememberKatanaStrings(Strings) diff --git a/ui/social/src/commonMain/kotlin/dev/alvr/katana/ui/social/strings/enSocialStrings.kt b/ui/social/src/commonMain/kotlin/dev/alvr/katana/ui/social/strings/enSocialStrings.kt deleted file mode 100644 index ce8132b1a..000000000 --- a/ui/social/src/commonMain/kotlin/dev/alvr/katana/ui/social/strings/enSocialStrings.kt +++ /dev/null @@ -1,6 +0,0 @@ -package dev.alvr.katana.ui.social.strings - -internal val enSocialStrings = SocialStrings( - socialToolbarTitle = "Social", - socialToolbarSearchPlaceholder = "Search…", -) diff --git a/ui/social/src/commonMain/kotlin/dev/alvr/katana/ui/social/strings/esSocialStrings.kt b/ui/social/src/commonMain/kotlin/dev/alvr/katana/ui/social/strings/esSocialStrings.kt deleted file mode 100644 index 6cc5dd5de..000000000 --- a/ui/social/src/commonMain/kotlin/dev/alvr/katana/ui/social/strings/esSocialStrings.kt +++ /dev/null @@ -1,6 +0,0 @@ -package dev.alvr.katana.ui.social.strings - -internal val esSocialStrings = SocialStrings( - socialToolbarTitle = "Social", - socialToolbarSearchPlaceholder = "Buscar…", -) diff --git a/ui/social/src/commonMain/kotlin/dev/alvr/katana/ui/social/view/SocialScreen.kt b/ui/social/src/commonMain/kotlin/dev/alvr/katana/ui/social/view/SocialScreen.kt index e05a89b2d..2eccb694a 100644 --- a/ui/social/src/commonMain/kotlin/dev/alvr/katana/ui/social/view/SocialScreen.kt +++ b/ui/social/src/commonMain/kotlin/dev/alvr/katana/ui/social/view/SocialScreen.kt @@ -8,23 +8,27 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import dev.alvr.katana.ui.base.components.home.KatanaHomeScaffold import dev.alvr.katana.ui.base.navigation.Destination -import dev.alvr.katana.ui.social.strings.LocalSocialStrings +import katana.ui.social.generated.resources.Res +import org.jetbrains.compose.resources.ExperimentalResourceApi +import org.jetbrains.compose.resources.stringResource @Composable @Destination -@OptIn(ExperimentalMaterialApi::class, ExperimentalAnimationApi::class) +@OptIn( + ExperimentalMaterialApi::class, + ExperimentalResourceApi::class, + ExperimentalAnimationApi::class, +) internal fun SocialScreen() { - val strings = LocalSocialStrings.current - KatanaHomeScaffold( - title = strings.socialToolbarTitle, - searchPlaceholder = strings.socialToolbarSearchPlaceholder, + title = stringResource(Res.string.social_toolbar_title), + searchPlaceholder = stringResource(Res.string.social_toolbar_search_placeholder), onSearch = {}, backContent = { Filter() }, ) { paddingValues -> Text( modifier = Modifier.padding(paddingValues), - text = strings.socialToolbarTitle, + text = stringResource(Res.string.social_toolbar_title), ) } }