chore(l10n): add string localization

This commit is contained in:
Diego Beraldin 2023-07-22 05:08:05 +02:00
parent db49532e47
commit 0772d6bf00
42 changed files with 297 additions and 44 deletions

View File

@ -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)
}
}

View File

@ -34,7 +34,6 @@ kotlin {
val commonMain by getting {
dependencies {
implementation(libs.koin.core)
implementation(libs.koin.test)
implementation(compose.runtime)
implementation(compose.foundation)

View File

@ -33,7 +33,6 @@ kotlin {
val commonMain by getting {
dependencies {
implementation(libs.koin.core)
implementation(libs.koin.test)
implementation(libs.androidx.datastore)
}
}

View File

@ -2,4 +2,5 @@ package com.github.diegoberaldin.raccoonforlemmy.core_preferences
object KeyStoreKeys {
const val EnableDarkTheme = "enableDarkTheme"
const val Locale = "locale"
}

View File

@ -34,7 +34,6 @@ kotlin {
val commonMain by getting {
dependencies {
implementation(libs.koin.core)
implementation(libs.koin.test)
implementation(compose.runtime)
implementation(compose.foundation)

View File

@ -34,7 +34,6 @@ kotlin {
val commonMain by getting {
dependencies {
implementation(libs.koin.core)
implementation(libs.koin.test)
implementation(compose.runtime)
implementation(compose.foundation)

View File

@ -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

View File

@ -1,4 +1,4 @@
package com.github.diegoberaldin.racoonforlemmy.feature_home
package com.github.diegoberaldin.raccoonforlemmy.feature_home
import org.koin.java.KoinJavaComponent.inject

View File

@ -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

View File

@ -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

View File

@ -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 {

View File

@ -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

View File

@ -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

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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

View File

@ -1,4 +1,4 @@
package com.github.diegoberaldin.racoonforlemmy.feature_settings
package com.github.diegoberaldin.raccoonforlemmy.feature_settings
import org.koin.java.KoinJavaComponent.inject

View File

@ -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

View File

@ -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

View File

@ -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,

View File

@ -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(

View File

@ -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

View File

@ -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" }
native_cocoapods = { id = "org.jetbrains.kotlin.native.cocoapods", version.ref = "kotlin" }
moko_resources = { id = "dev.icerock.mobile.multiplatform-resources", version.ref = "moko.resources" }

View File

@ -44,5 +44,9 @@
</array>
<key>UILaunchScreen</key>
<dict/>
<key>CFBundleLocalizations</key><array>
<string>en</string>
<string>it</string>
</array>
</dict>
</plist>

View File

@ -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
}
}

View File

@ -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

View File

@ -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<LanguageRepository>(::DefaultLanguageRepository)
}
actual fun getLanguageRepository(): LanguageRepository {
val res: LanguageRepository by inject(LanguageRepository::class.java)
return res
}

View File

@ -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
}
}

View File

@ -0,0 +1,10 @@
package com.github.diegoberaldin.raccoonforlemmy.resources
import kotlinx.coroutines.flow.StateFlow
interface LanguageRepository {
val currentLanguage: StateFlow<String>
fun changeLanguage(lang: String)
}

View File

@ -0,0 +1,7 @@
package com.github.diegoberaldin.raccoonforlemmy.resources
import org.koin.core.module.Module
expect val localizationModule: Module
expect fun getLanguageRepository(): LanguageRepository

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8" ?>
<resources>
<string name="lang">en</string>
<string name="navigation_home">Posts</string>
<string name="navigation_inbox">Inbox</string>
<string name="navigation_profile">Profile</string>
<string name="navigation_search">Search</string>
<string name="navigation_settings">Settings</string>
<string name="language_en" translatable="false">English</string>
<string name="language_it" translatable="false">Italiano</string>
<string name="settings_dark_theme">Dark theme</string>
</resources>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8" ?>
<resources>
<string name="lang">it</string>
<string name="navigation_home">Post</string>
<string name="navigation_inbox">Inbox</string>
<string name="navigation_profile">Profilo</string>
<string name="navigation_search">Ricerca</string>
<string name="navigation_settings">Impostazioni</string>
<string name="settings_dark_theme">Tema scuro</string>
</resources>

View File

@ -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<LanguageRepository>(::DefaultLanguageRepository)
}
actual fun getLanguageRepository(): LanguageRepository = LanguageRepositoryHelper.repository
object LanguageRepositoryHelper : KoinComponent {
val repository: LanguageRepository by inject()
}

View File

@ -30,3 +30,4 @@ include(":feature-example")
include(":core-utils")
include(":core-appearance")
include(":core-preferences")
include(":resources")

View File

@ -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)

View File

@ -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,

View File

@ -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 = {

View File

@ -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,