From 0772d6bf00c5d6d18834f4ef298d02a767951fcd Mon Sep 17 00:00:00 2001 From: Diego Beraldin Date: Sat, 22 Jul 2023 05:08:05 +0200 Subject: [PATCH] chore(l10n): add string localization --- build.gradle.kts | 7 +++ core-appearance/build.gradle.kts | 1 - core-preferences/build.gradle.kts | 1 - .../core_preferences/KeyStoreKeys.kt | 1 + core-utils/build.gradle.kts | 1 - feature-example/build.gradle.kts | 1 - feature-home/build.gradle.kts | 5 +- .../feature_home/HomeScreenModel.kt | 2 +- .../feature_home/HomeModule.kt | 2 +- .../feature_home/HomeScreenModel.kt | 9 +++ .../feature_home/HomeTab.kt | 10 ++- .../feature_home/HomeScreenModel.kt | 9 --- .../feature_home/HomeScreenModel.kt | 2 +- feature-inbox/build.gradle.kts | 3 +- .../raccoonforlemmy/feature_inbox/InboxTab.kt | 4 +- feature-profile/build.gradle.kts | 3 +- .../feature_profile/ProfileTab.kt | 4 +- feature-search/build.gradle.kts | 3 +- .../feature_search/SearchTab.kt | 4 +- feature-settings/build.gradle.kts | 5 +- .../feature_settings/SettingsScreenModel.kt | 2 +- .../feature_settings/SettingsModule.kt | 2 +- .../feature_settings/SettingsScreenModel.kt | 2 +- .../feature_settings/SettingsScreenUiState.kt | 2 +- .../feature_settings/SettingsTab.kt | 9 ++- .../feature_settings/SettingsScreenModel.kt | 2 +- gradle/libs.versions.toml | 9 ++- iosApp/iosApp/Info.plist | 4 ++ resources/build.gradle.kts | 61 +++++++++++++++++++ resources/resources.podspec | 39 ++++++++++++ .../resources/LocalizationModule.kt | 14 +++++ .../resources/DefaultLanguageRepository.kt | 11 ++++ .../resources/LanguageRepository.kt | 10 +++ .../resources/LocalizationModule.kt | 7 +++ .../commonMain/resources/MR/base/strings.xml | 15 +++++ .../commonMain/resources/MR/it/strings.xml | 12 ++++ .../resources/LocalizationModule.kt | 16 +++++ settings.gradle.kts | 1 + shared/build.gradle.kts | 3 +- .../diegoberaldin/raccoonforlemmy/DiHelper.kt | 6 +- .../diegoberaldin/raccoonforlemmy/App.kt | 31 +++++++++- .../diegoberaldin/raccoonforlemmy/DiHelper.kt | 6 +- 42 files changed, 297 insertions(+), 44 deletions(-) rename feature-home/src/androidMain/kotlin/com/github/diegoberaldin/{racoonforlemmy => raccoonforlemmy}/feature_home/HomeScreenModel.kt (74%) rename feature-home/src/commonMain/kotlin/com/github/diegoberaldin/{racoonforlemmy => raccoonforlemmy}/feature_home/HomeModule.kt (67%) create mode 100644 feature-home/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_home/HomeScreenModel.kt rename feature-home/src/commonMain/kotlin/com/github/diegoberaldin/{racoonforlemmy => raccoonforlemmy}/feature_home/HomeTab.kt (72%) delete mode 100644 feature-home/src/commonMain/kotlin/com/github/diegoberaldin/racoonforlemmy/feature_home/HomeScreenModel.kt rename feature-home/src/iosMain/kotlin/com/github/diegoberaldin/{racoonforlemmy => raccoonforlemmy}/feature_home/HomeScreenModel.kt (79%) rename feature-settings/src/androidMain/kotlin/com/github/diegoberaldin/{racoonforlemmy => raccoonforlemmy}/feature_settings/SettingsScreenModel.kt (74%) rename feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/{racoonforlemmy => raccoonforlemmy}/feature_settings/SettingsModule.kt (67%) rename feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/{racoonforlemmy => raccoonforlemmy}/feature_settings/SettingsScreenModel.kt (96%) rename feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/{racoonforlemmy => raccoonforlemmy}/feature_settings/SettingsScreenUiState.kt (51%) rename feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/{racoonforlemmy => raccoonforlemmy}/feature_settings/SettingsTab.kt (82%) rename feature-settings/src/iosMain/kotlin/com/github/diegoberaldin/{racoonforlemmy => raccoonforlemmy}/feature_settings/SettingsScreenModel.kt (79%) create mode 100644 resources/build.gradle.kts create mode 100644 resources/resources.podspec create mode 100644 resources/src/androidMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/resources/LocalizationModule.kt create mode 100644 resources/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/resources/DefaultLanguageRepository.kt create mode 100644 resources/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/resources/LanguageRepository.kt create mode 100644 resources/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/resources/LocalizationModule.kt create mode 100644 resources/src/commonMain/resources/MR/base/strings.xml create mode 100644 resources/src/commonMain/resources/MR/it/strings.xml create mode 100644 resources/src/iosMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/resources/LocalizationModule.kt diff --git a/build.gradle.kts b/build.gradle.kts index e4873a12f..3423766ce 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,8 +6,15 @@ plugins { alias(libs.plugins.kotlin.multiplatform).apply(false) alias(libs.plugins.compose).apply(false) alias(libs.plugins.native.cocoapods).apply(false) + alias(libs.plugins.moko.resources).apply(false) } tasks.register("clean", Delete::class) { delete(rootProject.buildDir) } + +buildscript { + dependencies { + classpath(libs.moko.gradle) + } +} \ No newline at end of file diff --git a/core-appearance/build.gradle.kts b/core-appearance/build.gradle.kts index 339153459..a81d2046f 100644 --- a/core-appearance/build.gradle.kts +++ b/core-appearance/build.gradle.kts @@ -34,7 +34,6 @@ kotlin { val commonMain by getting { dependencies { implementation(libs.koin.core) - implementation(libs.koin.test) implementation(compose.runtime) implementation(compose.foundation) diff --git a/core-preferences/build.gradle.kts b/core-preferences/build.gradle.kts index 1335d6ee4..2889e8773 100644 --- a/core-preferences/build.gradle.kts +++ b/core-preferences/build.gradle.kts @@ -33,7 +33,6 @@ kotlin { val commonMain by getting { dependencies { implementation(libs.koin.core) - implementation(libs.koin.test) implementation(libs.androidx.datastore) } } diff --git a/core-preferences/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core_preferences/KeyStoreKeys.kt b/core-preferences/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core_preferences/KeyStoreKeys.kt index 3863ab442..a1960b547 100644 --- a/core-preferences/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core_preferences/KeyStoreKeys.kt +++ b/core-preferences/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core_preferences/KeyStoreKeys.kt @@ -2,4 +2,5 @@ package com.github.diegoberaldin.raccoonforlemmy.core_preferences object KeyStoreKeys { const val EnableDarkTheme = "enableDarkTheme" + const val Locale = "locale" } \ No newline at end of file diff --git a/core-utils/build.gradle.kts b/core-utils/build.gradle.kts index 78b447587..a7719e6e7 100644 --- a/core-utils/build.gradle.kts +++ b/core-utils/build.gradle.kts @@ -34,7 +34,6 @@ kotlin { val commonMain by getting { dependencies { implementation(libs.koin.core) - implementation(libs.koin.test) implementation(compose.runtime) implementation(compose.foundation) diff --git a/feature-example/build.gradle.kts b/feature-example/build.gradle.kts index 3f6c7624d..d1bb43b07 100644 --- a/feature-example/build.gradle.kts +++ b/feature-example/build.gradle.kts @@ -34,7 +34,6 @@ kotlin { val commonMain by getting { dependencies { implementation(libs.koin.core) - implementation(libs.koin.test) implementation(compose.runtime) implementation(compose.foundation) diff --git a/feature-home/build.gradle.kts b/feature-home/build.gradle.kts index 36e8c16df..413ca6280 100644 --- a/feature-home/build.gradle.kts +++ b/feature-home/build.gradle.kts @@ -34,7 +34,6 @@ kotlin { val commonMain by getting { dependencies { implementation(libs.koin.core) - implementation(libs.koin.test) implementation(compose.runtime) implementation(compose.foundation) @@ -44,6 +43,8 @@ kotlin { implementation(libs.voyager.navigator) implementation(libs.voyager.tab) + + implementation(projects.resources) } } val commonTest by getting { @@ -55,7 +56,7 @@ kotlin { } android { - namespace = "com.github.diegoberaldin.racoonforlemmy.feature_home" + namespace = "com.github.diegoberaldin.raccoonforlemmy.feature_home" compileSdk = 33 defaultConfig { minSdk = 26 diff --git a/feature-home/src/androidMain/kotlin/com/github/diegoberaldin/racoonforlemmy/feature_home/HomeScreenModel.kt b/feature-home/src/androidMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_home/HomeScreenModel.kt similarity index 74% rename from feature-home/src/androidMain/kotlin/com/github/diegoberaldin/racoonforlemmy/feature_home/HomeScreenModel.kt rename to feature-home/src/androidMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_home/HomeScreenModel.kt index 4103598f7..4d4e2aa9b 100644 --- a/feature-home/src/androidMain/kotlin/com/github/diegoberaldin/racoonforlemmy/feature_home/HomeScreenModel.kt +++ b/feature-home/src/androidMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_home/HomeScreenModel.kt @@ -1,4 +1,4 @@ -package com.github.diegoberaldin.racoonforlemmy.feature_home +package com.github.diegoberaldin.raccoonforlemmy.feature_home import org.koin.java.KoinJavaComponent.inject diff --git a/feature-home/src/commonMain/kotlin/com/github/diegoberaldin/racoonforlemmy/feature_home/HomeModule.kt b/feature-home/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_home/HomeModule.kt similarity index 67% rename from feature-home/src/commonMain/kotlin/com/github/diegoberaldin/racoonforlemmy/feature_home/HomeModule.kt rename to feature-home/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_home/HomeModule.kt index 9a50ab0e2..4dc8b4fe6 100644 --- a/feature-home/src/commonMain/kotlin/com/github/diegoberaldin/racoonforlemmy/feature_home/HomeModule.kt +++ b/feature-home/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_home/HomeModule.kt @@ -1,4 +1,4 @@ -package com.github.diegoberaldin.racoonforlemmy.feature_home +package com.github.diegoberaldin.raccoonforlemmy.feature_home import org.koin.core.module.dsl.factoryOf import org.koin.dsl.module diff --git a/feature-home/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_home/HomeScreenModel.kt b/feature-home/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_home/HomeScreenModel.kt new file mode 100644 index 000000000..31b1cfdf3 --- /dev/null +++ b/feature-home/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_home/HomeScreenModel.kt @@ -0,0 +1,9 @@ +package com.github.diegoberaldin.raccoonforlemmy.feature_home + +import cafe.adriel.voyager.core.model.ScreenModel + +class HomeScreenModel : ScreenModel { + +} + +expect fun getHomeScreenModel(): HomeScreenModel \ No newline at end of file diff --git a/feature-home/src/commonMain/kotlin/com/github/diegoberaldin/racoonforlemmy/feature_home/HomeTab.kt b/feature-home/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_home/HomeTab.kt similarity index 72% rename from feature-home/src/commonMain/kotlin/com/github/diegoberaldin/racoonforlemmy/feature_home/HomeTab.kt rename to feature-home/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_home/HomeTab.kt index 952fcb0d3..a47f6f0f2 100644 --- a/feature-home/src/commonMain/kotlin/com/github/diegoberaldin/racoonforlemmy/feature_home/HomeTab.kt +++ b/feature-home/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_home/HomeTab.kt @@ -1,4 +1,4 @@ -package com.github.diegoberaldin.racoonforlemmy.feature_home +package com.github.diegoberaldin.raccoonforlemmy.feature_home import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding @@ -6,6 +6,9 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Home import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.rememberVectorPainter @@ -13,13 +16,16 @@ import androidx.compose.ui.unit.dp import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.tab.Tab import cafe.adriel.voyager.navigator.tab.TabOptions +import com.github.diegoberaldin.raccoonforlemmy.resources.MR +import com.github.diegoberaldin.raccoonforlemmy.resources.getLanguageRepository +import dev.icerock.moko.resources.compose.stringResource object HomeTab : Tab { override val options: TabOptions @Composable get() { - val title = "Posts" + val title = stringResource(MR.strings.navigation_home) val icon = rememberVectorPainter(Icons.Default.Home) return remember { diff --git a/feature-home/src/commonMain/kotlin/com/github/diegoberaldin/racoonforlemmy/feature_home/HomeScreenModel.kt b/feature-home/src/commonMain/kotlin/com/github/diegoberaldin/racoonforlemmy/feature_home/HomeScreenModel.kt deleted file mode 100644 index 883658667..000000000 --- a/feature-home/src/commonMain/kotlin/com/github/diegoberaldin/racoonforlemmy/feature_home/HomeScreenModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.github.diegoberaldin.racoonforlemmy.feature_home - -import cafe.adriel.voyager.core.model.ScreenModel - -class HomeScreenModel : ScreenModel { - -} - -expect fun getHomeScreenModel(): HomeScreenModel \ No newline at end of file diff --git a/feature-home/src/iosMain/kotlin/com/github/diegoberaldin/racoonforlemmy/feature_home/HomeScreenModel.kt b/feature-home/src/iosMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_home/HomeScreenModel.kt similarity index 79% rename from feature-home/src/iosMain/kotlin/com/github/diegoberaldin/racoonforlemmy/feature_home/HomeScreenModel.kt rename to feature-home/src/iosMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_home/HomeScreenModel.kt index 135bb9858..0d3427264 100644 --- a/feature-home/src/iosMain/kotlin/com/github/diegoberaldin/racoonforlemmy/feature_home/HomeScreenModel.kt +++ b/feature-home/src/iosMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_home/HomeScreenModel.kt @@ -1,4 +1,4 @@ -package com.github.diegoberaldin.racoonforlemmy.feature_home +package com.github.diegoberaldin.raccoonforlemmy.feature_home import org.koin.core.component.KoinComponent import org.koin.core.component.inject diff --git a/feature-inbox/build.gradle.kts b/feature-inbox/build.gradle.kts index 1a1d7a0c9..f01c4562a 100644 --- a/feature-inbox/build.gradle.kts +++ b/feature-inbox/build.gradle.kts @@ -34,7 +34,6 @@ kotlin { val commonMain by getting { dependencies { implementation(libs.koin.core) - implementation(libs.koin.test) implementation(compose.runtime) implementation(compose.foundation) @@ -44,6 +43,8 @@ kotlin { implementation(libs.voyager.navigator) implementation(libs.voyager.tab) + + implementation(projects.resources) } } val commonTest by getting { diff --git a/feature-inbox/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_inbox/InboxTab.kt b/feature-inbox/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_inbox/InboxTab.kt index b48a9329f..17811a1cf 100644 --- a/feature-inbox/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_inbox/InboxTab.kt +++ b/feature-inbox/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_inbox/InboxTab.kt @@ -13,13 +13,15 @@ import androidx.compose.ui.unit.dp import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.tab.Tab import cafe.adriel.voyager.navigator.tab.TabOptions +import com.github.diegoberaldin.raccoonforlemmy.resources.MR +import dev.icerock.moko.resources.compose.stringResource object InboxTab : Tab { override val options: TabOptions @Composable get() { - val title = "Inbox" + val title = stringResource(MR.strings.navigation_inbox) val icon = rememberVectorPainter(Icons.Default.Email) return remember { diff --git a/feature-profile/build.gradle.kts b/feature-profile/build.gradle.kts index 11e0d21fc..c8908a7ce 100644 --- a/feature-profile/build.gradle.kts +++ b/feature-profile/build.gradle.kts @@ -34,7 +34,6 @@ kotlin { val commonMain by getting { dependencies { implementation(libs.koin.core) - implementation(libs.koin.test) implementation(compose.runtime) implementation(compose.foundation) @@ -44,6 +43,8 @@ kotlin { implementation(libs.voyager.navigator) implementation(libs.voyager.tab) + + implementation(projects.resources) } } val commonTest by getting { diff --git a/feature-profile/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_profile/ProfileTab.kt b/feature-profile/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_profile/ProfileTab.kt index de7abc00d..e2decc2e2 100644 --- a/feature-profile/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_profile/ProfileTab.kt +++ b/feature-profile/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_profile/ProfileTab.kt @@ -13,13 +13,15 @@ import androidx.compose.ui.unit.dp import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.tab.Tab import cafe.adriel.voyager.navigator.tab.TabOptions +import com.github.diegoberaldin.raccoonforlemmy.resources.MR +import dev.icerock.moko.resources.compose.stringResource object ProfileTab : Tab { override val options: TabOptions @Composable get() { - val title = "Profile" + val title = stringResource(MR.strings.navigation_profile) val icon = rememberVectorPainter(Icons.Default.Person) return remember { diff --git a/feature-search/build.gradle.kts b/feature-search/build.gradle.kts index fabd24686..268cbf6b6 100644 --- a/feature-search/build.gradle.kts +++ b/feature-search/build.gradle.kts @@ -34,7 +34,6 @@ kotlin { val commonMain by getting { dependencies { implementation(libs.koin.core) - implementation(libs.koin.test) implementation(compose.runtime) implementation(compose.foundation) @@ -44,6 +43,8 @@ kotlin { implementation(libs.voyager.navigator) implementation(libs.voyager.tab) + + implementation(projects.resources) } } val commonTest by getting { diff --git a/feature-search/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_search/SearchTab.kt b/feature-search/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_search/SearchTab.kt index a335b637f..e7ffbb29f 100644 --- a/feature-search/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_search/SearchTab.kt +++ b/feature-search/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_search/SearchTab.kt @@ -13,13 +13,15 @@ import androidx.compose.ui.unit.dp import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.tab.Tab import cafe.adriel.voyager.navigator.tab.TabOptions +import com.github.diegoberaldin.raccoonforlemmy.resources.MR +import dev.icerock.moko.resources.compose.stringResource object SearchTab : Tab { override val options: TabOptions @Composable get() { - val title = "Search" + val title = stringResource(MR.strings.navigation_search) val icon = rememberVectorPainter(Icons.Default.Search) return remember { diff --git a/feature-settings/build.gradle.kts b/feature-settings/build.gradle.kts index 287b2788e..c1b866f80 100644 --- a/feature-settings/build.gradle.kts +++ b/feature-settings/build.gradle.kts @@ -34,7 +34,6 @@ kotlin { val commonMain by getting { dependencies { implementation(libs.koin.core) - implementation(libs.koin.test) implementation(compose.runtime) implementation(compose.foundation) @@ -47,6 +46,8 @@ kotlin { implementation(projects.coreAppearance) implementation(projects.corePreferences) + + implementation(projects.resources) } } val commonTest by getting { @@ -58,7 +59,7 @@ kotlin { } android { - namespace = "com.github.diegoberaldin.racoonforlemmy.feature_settings" + namespace = "com.github.diegoberaldin.raccoonforlemmy.feature_settings" compileSdk = 33 defaultConfig { minSdk = 26 diff --git a/feature-settings/src/androidMain/kotlin/com/github/diegoberaldin/racoonforlemmy/feature_settings/SettingsScreenModel.kt b/feature-settings/src/androidMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_settings/SettingsScreenModel.kt similarity index 74% rename from feature-settings/src/androidMain/kotlin/com/github/diegoberaldin/racoonforlemmy/feature_settings/SettingsScreenModel.kt rename to feature-settings/src/androidMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_settings/SettingsScreenModel.kt index ee0c25a41..35bae1611 100644 --- a/feature-settings/src/androidMain/kotlin/com/github/diegoberaldin/racoonforlemmy/feature_settings/SettingsScreenModel.kt +++ b/feature-settings/src/androidMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_settings/SettingsScreenModel.kt @@ -1,4 +1,4 @@ -package com.github.diegoberaldin.racoonforlemmy.feature_settings +package com.github.diegoberaldin.raccoonforlemmy.feature_settings import org.koin.java.KoinJavaComponent.inject diff --git a/feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/racoonforlemmy/feature_settings/SettingsModule.kt b/feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_settings/SettingsModule.kt similarity index 67% rename from feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/racoonforlemmy/feature_settings/SettingsModule.kt rename to feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_settings/SettingsModule.kt index 942af46cf..4c62e2b79 100644 --- a/feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/racoonforlemmy/feature_settings/SettingsModule.kt +++ b/feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_settings/SettingsModule.kt @@ -1,4 +1,4 @@ -package com.github.diegoberaldin.racoonforlemmy.feature_settings +package com.github.diegoberaldin.raccoonforlemmy.feature_settings import org.koin.core.module.dsl.factoryOf import org.koin.dsl.module diff --git a/feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/racoonforlemmy/feature_settings/SettingsScreenModel.kt b/feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_settings/SettingsScreenModel.kt similarity index 96% rename from feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/racoonforlemmy/feature_settings/SettingsScreenModel.kt rename to feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_settings/SettingsScreenModel.kt index 38ad2cb17..192ac537f 100644 --- a/feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/racoonforlemmy/feature_settings/SettingsScreenModel.kt +++ b/feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_settings/SettingsScreenModel.kt @@ -1,4 +1,4 @@ -package com.github.diegoberaldin.racoonforlemmy.feature_settings +package com.github.diegoberaldin.raccoonforlemmy.feature_settings import cafe.adriel.voyager.core.model.ScreenModel import com.github.diegoberaldin.raccoonforlemmy.core_appearance.data.ThemeState diff --git a/feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/racoonforlemmy/feature_settings/SettingsScreenUiState.kt b/feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_settings/SettingsScreenUiState.kt similarity index 51% rename from feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/racoonforlemmy/feature_settings/SettingsScreenUiState.kt rename to feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_settings/SettingsScreenUiState.kt index 3057b2882..28c9f0d92 100644 --- a/feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/racoonforlemmy/feature_settings/SettingsScreenUiState.kt +++ b/feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_settings/SettingsScreenUiState.kt @@ -1,4 +1,4 @@ -package com.github.diegoberaldin.racoonforlemmy.feature_settings +package com.github.diegoberaldin.raccoonforlemmy.feature_settings data class SettingsScreenUiState( val darkTheme: Boolean = false, diff --git a/feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/racoonforlemmy/feature_settings/SettingsTab.kt b/feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_settings/SettingsTab.kt similarity index 82% rename from feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/racoonforlemmy/feature_settings/SettingsTab.kt rename to feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_settings/SettingsTab.kt index 2bab819d1..cd4e00172 100644 --- a/feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/racoonforlemmy/feature_settings/SettingsTab.kt +++ b/feature-settings/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_settings/SettingsTab.kt @@ -1,4 +1,4 @@ -package com.github.diegoberaldin.racoonforlemmy.feature_settings +package com.github.diegoberaldin.raccoonforlemmy.feature_settings import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -19,13 +19,16 @@ import androidx.compose.ui.unit.dp import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.tab.Tab import cafe.adriel.voyager.navigator.tab.TabOptions +import com.github.diegoberaldin.raccoonforlemmy.resources.MR +import com.github.diegoberaldin.raccoonforlemmy.resources.getLanguageRepository +import dev.icerock.moko.resources.compose.stringResource object SettingsTab : Tab { override val options: TabOptions @Composable get() { - val title = "Setting" + val title = stringResource(MR.strings.navigation_settings) val icon = rememberVectorPainter(Icons.Default.Settings) return remember { @@ -47,7 +50,7 @@ object SettingsTab : Tab { verticalAlignment = Alignment.CenterVertically, ) { Text( - text = "Use dark theme" + text = stringResource(MR.strings.settings_dark_theme) ) Spacer(modifier = Modifier.weight(1f)) Checkbox( diff --git a/feature-settings/src/iosMain/kotlin/com/github/diegoberaldin/racoonforlemmy/feature_settings/SettingsScreenModel.kt b/feature-settings/src/iosMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_settings/SettingsScreenModel.kt similarity index 79% rename from feature-settings/src/iosMain/kotlin/com/github/diegoberaldin/racoonforlemmy/feature_settings/SettingsScreenModel.kt rename to feature-settings/src/iosMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_settings/SettingsScreenModel.kt index 7c2e439ee..be89b4ebd 100644 --- a/feature-settings/src/iosMain/kotlin/com/github/diegoberaldin/racoonforlemmy/feature_settings/SettingsScreenModel.kt +++ b/feature-settings/src/iosMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature_settings/SettingsScreenModel.kt @@ -1,4 +1,4 @@ -package com.github.diegoberaldin.racoonforlemmy.feature_settings +package com.github.diegoberaldin.raccoonforlemmy.feature_settings import org.koin.core.component.KoinComponent import org.koin.core.component.inject diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 318f46f4b..6792c56be 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,6 +5,7 @@ android_gradle = "7.4.2" compose = "1.4.3" koin = "3.2.0" kotlin = "1.8.20" +moko_resources = "0.23.0" voyager = "1.0.0-rc05" [libraries] @@ -16,6 +17,11 @@ koin_core = { module = "io.insert-koin:koin-core", version.ref = "koin" } koin_test = { module = "io.insert-koin:koin-test", version.ref = "koin" } koin_android = { module = "io.insert-koin:koin-android", version.ref = "koin" } +moko_gradle = { module = "dev.icerock.moko:resources-generator", version.ref = "moko.resources" } +moko_resources = { module = "dev.icerock.moko:resources", version.ref = "moko.resources" } +moko_resources_compose = { module = "dev.icerock.moko:resources-compose", version.ref = "moko.resources" } +moko_resources_test = { module = "dev.icerock.moko:resources-test", version.ref = "moko.resources" } + voyager_navigator = { module = "cafe.adriel.voyager:voyager-navigator", version.ref = "voyager" } voyager_bottomsheet = { module = "cafe.adriel.voyager:voyager-bottom-sheet-navigator", version.ref = "voyager" } voyager_tab = { module = "cafe.adriel.voyager:voyager-tab-navigator", version.ref = "voyager" } @@ -30,4 +36,5 @@ android_library = { id = "com.android.library", version.ref = "android.gradle" } kotlin_android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlin_multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } compose = { id = "org.jetbrains.compose", version = "1.4.1" } -native_cocoapods = { id = "org.jetbrains.kotlin.native.cocoapods", version.ref = "kotlin" } \ No newline at end of file +native_cocoapods = { id = "org.jetbrains.kotlin.native.cocoapods", version.ref = "kotlin" } +moko_resources = { id = "dev.icerock.mobile.multiplatform-resources", version.ref = "moko.resources" } \ No newline at end of file diff --git a/iosApp/iosApp/Info.plist b/iosApp/iosApp/Info.plist index 8044709cf..4cd8b0755 100644 --- a/iosApp/iosApp/Info.plist +++ b/iosApp/iosApp/Info.plist @@ -44,5 +44,9 @@ UILaunchScreen + CFBundleLocalizations + en + it + \ No newline at end of file diff --git a/resources/build.gradle.kts b/resources/build.gradle.kts new file mode 100644 index 000000000..4e9c3ce95 --- /dev/null +++ b/resources/build.gradle.kts @@ -0,0 +1,61 @@ +plugins { + alias(libs.plugins.kotlin.multiplatform) + alias(libs.plugins.android.library) + alias(libs.plugins.compose) + alias(libs.plugins.native.cocoapods) + alias(libs.plugins.moko.resources) +} + +@OptIn(org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi::class) +kotlin { + targetHierarchy.default() + + android { + compilations.all { + kotlinOptions { + jvmTarget = "1.8" + } + } + } + iosX64() + iosArm64() + iosSimulatorArm64() + + cocoapods { + summary = "Some description for the Shared Module" + homepage = "Link to the Shared Module homepage" + version = "1.0" + ios.deploymentTarget = "14.1" + framework { + baseName = "resources" + } + } + + sourceSets { + val commonMain by getting { + dependencies { + implementation(libs.koin.core) + api(libs.moko.resources) + api(libs.moko.resources.compose) + } + } + val commonTest by getting { + dependencies { + implementation(kotlin("test")) + } + } + } +} + +multiplatformResources { + multiplatformResourcesPackage = "com.github.diegoberaldin.raccoonforlemmy.resources" // required + iosBaseLocalizationRegion = "en" +} + +android { + namespace = "com.github.diegoberaldin.raccoonforlemmy.resources" + compileSdk = 33 + defaultConfig { + minSdk = 26 + } +} \ No newline at end of file diff --git a/resources/resources.podspec b/resources/resources.podspec new file mode 100644 index 000000000..d84922d92 --- /dev/null +++ b/resources/resources.podspec @@ -0,0 +1,39 @@ +Pod::Spec.new do |spec| + spec.name = 'resources' + spec.version = '1.0' + spec.homepage = 'Link to the Shared Module homepage' + spec.source = { :http=> ''} + spec.authors = '' + spec.license = '' + spec.summary = 'Some description for the Shared Module' + spec.vendored_frameworks = 'build/cocoapods/framework/resources.framework' + spec.libraries = 'c++' + spec.ios.deployment_target = '14.1' + + + spec.pod_target_xcconfig = { + 'KOTLIN_PROJECT_PATH' => ':resources', + 'PRODUCT_MODULE_NAME' => 'resources', + } + + spec.script_phases = [ + { + :name => 'Build resources', + :execution_position => :before_compile, + :shell_path => '/bin/sh', + :script => <<-SCRIPT + if [ "YES" = "$OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED" ]; then + echo "Skipping Gradle build task invocation due to OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED environment variable set to \"YES\"" + exit 0 + fi + set -ev + REPO_ROOT="$PODS_TARGET_SRCROOT" + "$REPO_ROOT/../gradlew" -p "$REPO_ROOT" $KOTLIN_PROJECT_PATH:syncFramework \ + -Pkotlin.native.cocoapods.platform=$PLATFORM_NAME \ + -Pkotlin.native.cocoapods.archs="$ARCHS" \ + -Pkotlin.native.cocoapods.configuration="$CONFIGURATION" + SCRIPT + } + ] + +end \ No newline at end of file diff --git a/resources/src/androidMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/resources/LocalizationModule.kt b/resources/src/androidMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/resources/LocalizationModule.kt new file mode 100644 index 000000000..378b9451a --- /dev/null +++ b/resources/src/androidMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/resources/LocalizationModule.kt @@ -0,0 +1,14 @@ +package com.github.diegoberaldin.raccoonforlemmy.resources + +import org.koin.core.module.dsl.singleOf +import org.koin.dsl.module +import org.koin.java.KoinJavaComponent.inject + +actual val localizationModule = module { + singleOf(::DefaultLanguageRepository) +} + +actual fun getLanguageRepository(): LanguageRepository { + val res: LanguageRepository by inject(LanguageRepository::class.java) + return res +} diff --git a/resources/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/resources/DefaultLanguageRepository.kt b/resources/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/resources/DefaultLanguageRepository.kt new file mode 100644 index 000000000..60165bb0c --- /dev/null +++ b/resources/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/resources/DefaultLanguageRepository.kt @@ -0,0 +1,11 @@ +package com.github.diegoberaldin.raccoonforlemmy.resources + +import kotlinx.coroutines.flow.MutableStateFlow + +class DefaultLanguageRepository : LanguageRepository { + override val currentLanguage = MutableStateFlow("") + + override fun changeLanguage(lang: String) { + currentLanguage.value = lang + } +} \ No newline at end of file diff --git a/resources/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/resources/LanguageRepository.kt b/resources/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/resources/LanguageRepository.kt new file mode 100644 index 000000000..bda31d305 --- /dev/null +++ b/resources/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/resources/LanguageRepository.kt @@ -0,0 +1,10 @@ +package com.github.diegoberaldin.raccoonforlemmy.resources + +import kotlinx.coroutines.flow.StateFlow + +interface LanguageRepository { + + val currentLanguage: StateFlow + + fun changeLanguage(lang: String) +} diff --git a/resources/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/resources/LocalizationModule.kt b/resources/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/resources/LocalizationModule.kt new file mode 100644 index 000000000..24a8f92ab --- /dev/null +++ b/resources/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/resources/LocalizationModule.kt @@ -0,0 +1,7 @@ +package com.github.diegoberaldin.raccoonforlemmy.resources + +import org.koin.core.module.Module + +expect val localizationModule: Module + +expect fun getLanguageRepository(): LanguageRepository diff --git a/resources/src/commonMain/resources/MR/base/strings.xml b/resources/src/commonMain/resources/MR/base/strings.xml new file mode 100644 index 000000000..d4e8783ee --- /dev/null +++ b/resources/src/commonMain/resources/MR/base/strings.xml @@ -0,0 +1,15 @@ + + + en + + Posts + Inbox + Profile + Search + Settings + + English + Italiano + + Dark theme + \ No newline at end of file diff --git a/resources/src/commonMain/resources/MR/it/strings.xml b/resources/src/commonMain/resources/MR/it/strings.xml new file mode 100644 index 000000000..e3b7cc31d --- /dev/null +++ b/resources/src/commonMain/resources/MR/it/strings.xml @@ -0,0 +1,12 @@ + + + it + + Post + Inbox + Profilo + Ricerca + Impostazioni + + Tema scuro + \ No newline at end of file diff --git a/resources/src/iosMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/resources/LocalizationModule.kt b/resources/src/iosMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/resources/LocalizationModule.kt new file mode 100644 index 000000000..9c979a713 --- /dev/null +++ b/resources/src/iosMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/resources/LocalizationModule.kt @@ -0,0 +1,16 @@ +package com.github.diegoberaldin.raccoonforlemmy.resources + +import org.koin.core.component.KoinComponent +import org.koin.core.component.inject +import org.koin.core.module.dsl.singleOf +import org.koin.dsl.module + +actual val localizationModule = module { + singleOf(::DefaultLanguageRepository) +} + +actual fun getLanguageRepository(): LanguageRepository = LanguageRepositoryHelper.repository + +object LanguageRepositoryHelper : KoinComponent { + val repository: LanguageRepository by inject() +} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 24107ddb1..6f5143a05 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -30,3 +30,4 @@ include(":feature-example") include(":core-utils") include(":core-appearance") include(":core-preferences") +include(":resources") diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index 97c827d75..c93fc6cdf 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -3,6 +3,7 @@ plugins { alias(libs.plugins.android.library) alias(libs.plugins.compose) alias(libs.plugins.native.cocoapods) + alias(libs.plugins.moko.resources) } kotlin { @@ -42,7 +43,6 @@ kotlin { val commonMain by getting { dependencies { implementation(libs.koin.core) - implementation(libs.koin.test) implementation(compose.runtime) implementation(compose.foundation) @@ -57,6 +57,7 @@ kotlin { implementation(projects.coreAppearance) implementation(projects.corePreferences) + api(projects.resources) api(projects.featureHome) api(projects.featureInbox) api(projects.featureSearch) diff --git a/shared/src/androidMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/DiHelper.kt b/shared/src/androidMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/DiHelper.kt index 3f540b843..603644e68 100644 --- a/shared/src/androidMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/DiHelper.kt +++ b/shared/src/androidMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/DiHelper.kt @@ -5,14 +5,16 @@ import com.github.diegoberaldin.raccoonforlemmy.core_preferences.di.corePreferen import com.github.diegoberaldin.raccoonforlemmy.feature_inbox.inboxTabModule import com.github.diegoberaldin.raccoonforlemmy.feature_profile.profileTabModule import com.github.diegoberaldin.raccoonforlemmy.feature_search.searchTabModule -import com.github.diegoberaldin.racoonforlemmy.feature_home.homeTabModule -import com.github.diegoberaldin.racoonforlemmy.feature_settings.settingsTabModule +import com.github.diegoberaldin.raccoonforlemmy.feature_home.homeTabModule +import com.github.diegoberaldin.raccoonforlemmy.feature_settings.settingsTabModule +import com.github.diegoberaldin.raccoonforlemmy.resources.localizationModule import org.koin.dsl.module val sharedHelperModule = module { includes( coreAppearanceModule, corePreferencesModule, + localizationModule, homeTabModule, inboxTabModule, profileTabModule, diff --git a/shared/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/App.kt b/shared/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/App.kt index 57ee3ef8b..764cdba1c 100644 --- a/shared/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/App.kt +++ b/shared/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/App.kt @@ -5,18 +5,28 @@ import androidx.compose.material3.BottomAppBar import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import cafe.adriel.voyager.navigator.tab.CurrentTab import cafe.adriel.voyager.navigator.tab.TabNavigator import com.github.diegoberaldin.raccoonforlemmy.core_appearance.theme.AppTheme import com.github.diegoberaldin.raccoonforlemmy.core_preferences.KeyStoreKeys import com.github.diegoberaldin.raccoonforlemmy.core_preferences.di.getTemporaryKeyStore +import com.github.diegoberaldin.raccoonforlemmy.feature_home.HomeTab import com.github.diegoberaldin.raccoonforlemmy.feature_inbox.InboxTab import com.github.diegoberaldin.raccoonforlemmy.feature_profile.ProfileTab import com.github.diegoberaldin.raccoonforlemmy.feature_search.SearchTab +import com.github.diegoberaldin.raccoonforlemmy.feature_settings.SettingsTab +import com.github.diegoberaldin.raccoonforlemmy.resources.MR +import com.github.diegoberaldin.raccoonforlemmy.resources.getLanguageRepository import com.github.diegoberaldin.raccoonforlemmy.ui.navigation.TabNavigationItem -import com.github.diegoberaldin.racoonforlemmy.feature_home.HomeTab -import com.github.diegoberaldin.racoonforlemmy.feature_settings.SettingsTab +import dev.icerock.moko.resources.compose.stringResource +import dev.icerock.moko.resources.desc.StringDesc +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.runBlocking @OptIn(ExperimentalMaterial3Api::class) @@ -27,12 +37,29 @@ fun App() { val darkTheme = runBlocking { keyStore.get(KeyStoreKeys.EnableDarkTheme, systemDarkTheme) } + + val defaultLocale = stringResource(MR.strings.lang) + val lang = runBlocking { + keyStore.get(KeyStoreKeys.Locale, defaultLocale) + } + val languageRepository = remember { getLanguageRepository() } + languageRepository.changeLanguage(lang) + + val scope = rememberCoroutineScope() + languageRepository.currentLanguage.onEach { lang -> + StringDesc.localeType = StringDesc.LocaleType.Custom(lang) + }.launchIn(scope) + AppTheme( darkTheme = darkTheme ) { + val lang by languageRepository.currentLanguage.collectAsState() + LaunchedEffect(lang) {} + TabNavigator(HomeTab) { Scaffold( content = { + CurrentTab() }, bottomBar = { diff --git a/shared/src/iosMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/DiHelper.kt b/shared/src/iosMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/DiHelper.kt index e29b84475..9f247cfdb 100644 --- a/shared/src/iosMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/DiHelper.kt +++ b/shared/src/iosMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/DiHelper.kt @@ -5,8 +5,9 @@ import com.github.diegoberaldin.raccoonforlemmy.core_preferences.di.corePreferen import com.github.diegoberaldin.raccoonforlemmy.feature_inbox.inboxTabModule import com.github.diegoberaldin.raccoonforlemmy.feature_profile.profileTabModule import com.github.diegoberaldin.raccoonforlemmy.feature_search.searchTabModule -import com.github.diegoberaldin.racoonforlemmy.feature_home.homeTabModule -import com.github.diegoberaldin.racoonforlemmy.feature_settings.settingsTabModule +import com.github.diegoberaldin.raccoonforlemmy.feature_home.homeTabModule +import com.github.diegoberaldin.raccoonforlemmy.feature_settings.settingsTabModule +import com.github.diegoberaldin.raccoonforlemmy.resources.localizationModule import org.koin.core.context.startKoin fun initKoin() { @@ -14,6 +15,7 @@ fun initKoin() { modules( coreAppearanceModule, corePreferencesModule, + localizationModule, homeTabModule, inboxTabModule, profileTabModule,