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.kotlin.multiplatform).apply(false)
alias(libs.plugins.compose).apply(false) alias(libs.plugins.compose).apply(false)
alias(libs.plugins.native.cocoapods).apply(false) alias(libs.plugins.native.cocoapods).apply(false)
alias(libs.plugins.moko.resources).apply(false)
} }
tasks.register("clean", Delete::class) { tasks.register("clean", Delete::class) {
delete(rootProject.buildDir) delete(rootProject.buildDir)
} }
buildscript {
dependencies {
classpath(libs.moko.gradle)
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -34,7 +34,6 @@ kotlin {
val commonMain by getting { val commonMain by getting {
dependencies { dependencies {
implementation(libs.koin.core) implementation(libs.koin.core)
implementation(libs.koin.test)
implementation(compose.runtime) implementation(compose.runtime)
implementation(compose.foundation) implementation(compose.foundation)
@ -44,6 +43,8 @@ kotlin {
implementation(libs.voyager.navigator) implementation(libs.voyager.navigator)
implementation(libs.voyager.tab) implementation(libs.voyager.tab)
implementation(projects.resources)
} }
} }
val commonTest by getting { val commonTest by getting {
@ -55,7 +56,7 @@ kotlin {
} }
android { android {
namespace = "com.github.diegoberaldin.racoonforlemmy.feature_home" namespace = "com.github.diegoberaldin.raccoonforlemmy.feature_home"
compileSdk = 33 compileSdk = 33
defaultConfig { defaultConfig {
minSdk = 26 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 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.core.module.dsl.factoryOf
import org.koin.dsl.module 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.Column
import androidx.compose.foundation.layout.padding 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.material.icons.filled.Home
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable 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.remember
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.rememberVectorPainter 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.core.model.rememberScreenModel
import cafe.adriel.voyager.navigator.tab.Tab import cafe.adriel.voyager.navigator.tab.Tab
import cafe.adriel.voyager.navigator.tab.TabOptions 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 { object HomeTab : Tab {
override val options: TabOptions override val options: TabOptions
@Composable @Composable
get() { get() {
val title = "Posts" val title = stringResource(MR.strings.navigation_home)
val icon = rememberVectorPainter(Icons.Default.Home) val icon = rememberVectorPainter(Icons.Default.Home)
return remember { 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.KoinComponent
import org.koin.core.component.inject import org.koin.core.component.inject

View File

@ -34,7 +34,6 @@ kotlin {
val commonMain by getting { val commonMain by getting {
dependencies { dependencies {
implementation(libs.koin.core) implementation(libs.koin.core)
implementation(libs.koin.test)
implementation(compose.runtime) implementation(compose.runtime)
implementation(compose.foundation) implementation(compose.foundation)
@ -44,6 +43,8 @@ kotlin {
implementation(libs.voyager.navigator) implementation(libs.voyager.navigator)
implementation(libs.voyager.tab) implementation(libs.voyager.tab)
implementation(projects.resources)
} }
} }
val commonTest by getting { 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.core.model.rememberScreenModel
import cafe.adriel.voyager.navigator.tab.Tab import cafe.adriel.voyager.navigator.tab.Tab
import cafe.adriel.voyager.navigator.tab.TabOptions import cafe.adriel.voyager.navigator.tab.TabOptions
import com.github.diegoberaldin.raccoonforlemmy.resources.MR
import dev.icerock.moko.resources.compose.stringResource
object InboxTab : Tab { object InboxTab : Tab {
override val options: TabOptions override val options: TabOptions
@Composable @Composable
get() { get() {
val title = "Inbox" val title = stringResource(MR.strings.navigation_inbox)
val icon = rememberVectorPainter(Icons.Default.Email) val icon = rememberVectorPainter(Icons.Default.Email)
return remember { return remember {

View File

@ -34,7 +34,6 @@ kotlin {
val commonMain by getting { val commonMain by getting {
dependencies { dependencies {
implementation(libs.koin.core) implementation(libs.koin.core)
implementation(libs.koin.test)
implementation(compose.runtime) implementation(compose.runtime)
implementation(compose.foundation) implementation(compose.foundation)
@ -44,6 +43,8 @@ kotlin {
implementation(libs.voyager.navigator) implementation(libs.voyager.navigator)
implementation(libs.voyager.tab) implementation(libs.voyager.tab)
implementation(projects.resources)
} }
} }
val commonTest by getting { 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.core.model.rememberScreenModel
import cafe.adriel.voyager.navigator.tab.Tab import cafe.adriel.voyager.navigator.tab.Tab
import cafe.adriel.voyager.navigator.tab.TabOptions import cafe.adriel.voyager.navigator.tab.TabOptions
import com.github.diegoberaldin.raccoonforlemmy.resources.MR
import dev.icerock.moko.resources.compose.stringResource
object ProfileTab : Tab { object ProfileTab : Tab {
override val options: TabOptions override val options: TabOptions
@Composable @Composable
get() { get() {
val title = "Profile" val title = stringResource(MR.strings.navigation_profile)
val icon = rememberVectorPainter(Icons.Default.Person) val icon = rememberVectorPainter(Icons.Default.Person)
return remember { return remember {

View File

@ -34,7 +34,6 @@ kotlin {
val commonMain by getting { val commonMain by getting {
dependencies { dependencies {
implementation(libs.koin.core) implementation(libs.koin.core)
implementation(libs.koin.test)
implementation(compose.runtime) implementation(compose.runtime)
implementation(compose.foundation) implementation(compose.foundation)
@ -44,6 +43,8 @@ kotlin {
implementation(libs.voyager.navigator) implementation(libs.voyager.navigator)
implementation(libs.voyager.tab) implementation(libs.voyager.tab)
implementation(projects.resources)
} }
} }
val commonTest by getting { 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.core.model.rememberScreenModel
import cafe.adriel.voyager.navigator.tab.Tab import cafe.adriel.voyager.navigator.tab.Tab
import cafe.adriel.voyager.navigator.tab.TabOptions import cafe.adriel.voyager.navigator.tab.TabOptions
import com.github.diegoberaldin.raccoonforlemmy.resources.MR
import dev.icerock.moko.resources.compose.stringResource
object SearchTab : Tab { object SearchTab : Tab {
override val options: TabOptions override val options: TabOptions
@Composable @Composable
get() { get() {
val title = "Search" val title = stringResource(MR.strings.navigation_search)
val icon = rememberVectorPainter(Icons.Default.Search) val icon = rememberVectorPainter(Icons.Default.Search)
return remember { return remember {

View File

@ -34,7 +34,6 @@ kotlin {
val commonMain by getting { val commonMain by getting {
dependencies { dependencies {
implementation(libs.koin.core) implementation(libs.koin.core)
implementation(libs.koin.test)
implementation(compose.runtime) implementation(compose.runtime)
implementation(compose.foundation) implementation(compose.foundation)
@ -47,6 +46,8 @@ kotlin {
implementation(projects.coreAppearance) implementation(projects.coreAppearance)
implementation(projects.corePreferences) implementation(projects.corePreferences)
implementation(projects.resources)
} }
} }
val commonTest by getting { val commonTest by getting {
@ -58,7 +59,7 @@ kotlin {
} }
android { android {
namespace = "com.github.diegoberaldin.racoonforlemmy.feature_settings" namespace = "com.github.diegoberaldin.raccoonforlemmy.feature_settings"
compileSdk = 33 compileSdk = 33
defaultConfig { defaultConfig {
minSdk = 26 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 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.core.module.dsl.factoryOf
import org.koin.dsl.module 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 cafe.adriel.voyager.core.model.ScreenModel
import com.github.diegoberaldin.raccoonforlemmy.core_appearance.data.ThemeState 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( data class SettingsScreenUiState(
val darkTheme: Boolean = false, 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.Column
import androidx.compose.foundation.layout.Row 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.core.model.rememberScreenModel
import cafe.adriel.voyager.navigator.tab.Tab import cafe.adriel.voyager.navigator.tab.Tab
import cafe.adriel.voyager.navigator.tab.TabOptions 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 { object SettingsTab : Tab {
override val options: TabOptions override val options: TabOptions
@Composable @Composable
get() { get() {
val title = "Setting" val title = stringResource(MR.strings.navigation_settings)
val icon = rememberVectorPainter(Icons.Default.Settings) val icon = rememberVectorPainter(Icons.Default.Settings)
return remember { return remember {
@ -47,7 +50,7 @@ object SettingsTab : Tab {
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
) { ) {
Text( Text(
text = "Use dark theme" text = stringResource(MR.strings.settings_dark_theme)
) )
Spacer(modifier = Modifier.weight(1f)) Spacer(modifier = Modifier.weight(1f))
Checkbox( 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.KoinComponent
import org.koin.core.component.inject import org.koin.core.component.inject

View File

@ -5,6 +5,7 @@ android_gradle = "7.4.2"
compose = "1.4.3" compose = "1.4.3"
koin = "3.2.0" koin = "3.2.0"
kotlin = "1.8.20" kotlin = "1.8.20"
moko_resources = "0.23.0"
voyager = "1.0.0-rc05" voyager = "1.0.0-rc05"
[libraries] [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_test = { module = "io.insert-koin:koin-test", version.ref = "koin" }
koin_android = { module = "io.insert-koin:koin-android", 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_navigator = { module = "cafe.adriel.voyager:voyager-navigator", version.ref = "voyager" }
voyager_bottomsheet = { module = "cafe.adriel.voyager:voyager-bottom-sheet-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" } 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_android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
kotlin_multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } kotlin_multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
compose = { id = "org.jetbrains.compose", version = "1.4.1" } 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> </array>
<key>UILaunchScreen</key> <key>UILaunchScreen</key>
<dict/> <dict/>
<key>CFBundleLocalizations</key><array>
<string>en</string>
<string>it</string>
</array>
</dict> </dict>
</plist> </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-utils")
include(":core-appearance") include(":core-appearance")
include(":core-preferences") include(":core-preferences")
include(":resources")

View File

@ -3,6 +3,7 @@ plugins {
alias(libs.plugins.android.library) alias(libs.plugins.android.library)
alias(libs.plugins.compose) alias(libs.plugins.compose)
alias(libs.plugins.native.cocoapods) alias(libs.plugins.native.cocoapods)
alias(libs.plugins.moko.resources)
} }
kotlin { kotlin {
@ -42,7 +43,6 @@ kotlin {
val commonMain by getting { val commonMain by getting {
dependencies { dependencies {
implementation(libs.koin.core) implementation(libs.koin.core)
implementation(libs.koin.test)
implementation(compose.runtime) implementation(compose.runtime)
implementation(compose.foundation) implementation(compose.foundation)
@ -57,6 +57,7 @@ kotlin {
implementation(projects.coreAppearance) implementation(projects.coreAppearance)
implementation(projects.corePreferences) implementation(projects.corePreferences)
api(projects.resources)
api(projects.featureHome) api(projects.featureHome)
api(projects.featureInbox) api(projects.featureInbox)
api(projects.featureSearch) 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_inbox.inboxTabModule
import com.github.diegoberaldin.raccoonforlemmy.feature_profile.profileTabModule import com.github.diegoberaldin.raccoonforlemmy.feature_profile.profileTabModule
import com.github.diegoberaldin.raccoonforlemmy.feature_search.searchTabModule import com.github.diegoberaldin.raccoonforlemmy.feature_search.searchTabModule
import com.github.diegoberaldin.racoonforlemmy.feature_home.homeTabModule import com.github.diegoberaldin.raccoonforlemmy.feature_home.homeTabModule
import com.github.diegoberaldin.racoonforlemmy.feature_settings.settingsTabModule import com.github.diegoberaldin.raccoonforlemmy.feature_settings.settingsTabModule
import com.github.diegoberaldin.raccoonforlemmy.resources.localizationModule
import org.koin.dsl.module import org.koin.dsl.module
val sharedHelperModule = module { val sharedHelperModule = module {
includes( includes(
coreAppearanceModule, coreAppearanceModule,
corePreferencesModule, corePreferencesModule,
localizationModule,
homeTabModule, homeTabModule,
inboxTabModule, inboxTabModule,
profileTabModule, profileTabModule,

View File

@ -5,18 +5,28 @@ import androidx.compose.material3.BottomAppBar
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.runtime.Composable 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.remember
import androidx.compose.runtime.rememberCoroutineScope
import cafe.adriel.voyager.navigator.tab.CurrentTab import cafe.adriel.voyager.navigator.tab.CurrentTab
import cafe.adriel.voyager.navigator.tab.TabNavigator import cafe.adriel.voyager.navigator.tab.TabNavigator
import com.github.diegoberaldin.raccoonforlemmy.core_appearance.theme.AppTheme import com.github.diegoberaldin.raccoonforlemmy.core_appearance.theme.AppTheme
import com.github.diegoberaldin.raccoonforlemmy.core_preferences.KeyStoreKeys import com.github.diegoberaldin.raccoonforlemmy.core_preferences.KeyStoreKeys
import com.github.diegoberaldin.raccoonforlemmy.core_preferences.di.getTemporaryKeyStore 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_inbox.InboxTab
import com.github.diegoberaldin.raccoonforlemmy.feature_profile.ProfileTab import com.github.diegoberaldin.raccoonforlemmy.feature_profile.ProfileTab
import com.github.diegoberaldin.raccoonforlemmy.feature_search.SearchTab 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.raccoonforlemmy.ui.navigation.TabNavigationItem
import com.github.diegoberaldin.racoonforlemmy.feature_home.HomeTab import dev.icerock.moko.resources.compose.stringResource
import com.github.diegoberaldin.racoonforlemmy.feature_settings.SettingsTab import dev.icerock.moko.resources.desc.StringDesc
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@ -27,12 +37,29 @@ fun App() {
val darkTheme = runBlocking { val darkTheme = runBlocking {
keyStore.get(KeyStoreKeys.EnableDarkTheme, systemDarkTheme) 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( AppTheme(
darkTheme = darkTheme darkTheme = darkTheme
) { ) {
val lang by languageRepository.currentLanguage.collectAsState()
LaunchedEffect(lang) {}
TabNavigator(HomeTab) { TabNavigator(HomeTab) {
Scaffold( Scaffold(
content = { content = {
CurrentTab() CurrentTab()
}, },
bottomBar = { 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_inbox.inboxTabModule
import com.github.diegoberaldin.raccoonforlemmy.feature_profile.profileTabModule import com.github.diegoberaldin.raccoonforlemmy.feature_profile.profileTabModule
import com.github.diegoberaldin.raccoonforlemmy.feature_search.searchTabModule import com.github.diegoberaldin.raccoonforlemmy.feature_search.searchTabModule
import com.github.diegoberaldin.racoonforlemmy.feature_home.homeTabModule import com.github.diegoberaldin.raccoonforlemmy.feature_home.homeTabModule
import com.github.diegoberaldin.racoonforlemmy.feature_settings.settingsTabModule import com.github.diegoberaldin.raccoonforlemmy.feature_settings.settingsTabModule
import com.github.diegoberaldin.raccoonforlemmy.resources.localizationModule
import org.koin.core.context.startKoin import org.koin.core.context.startKoin
fun initKoin() { fun initKoin() {
@ -14,6 +15,7 @@ fun initKoin() {
modules( modules(
coreAppearanceModule, coreAppearanceModule,
corePreferencesModule, corePreferencesModule,
localizationModule,
homeTabModule, homeTabModule,
inboxTabModule, inboxTabModule,
profileTabModule, profileTabModule,