mirror of
https://github.com/LiveFastEatTrashRaccoon/RaccoonForLemmy.git
synced 2025-02-09 00:38:41 +01:00
chore(l10n): add string localization
This commit is contained in:
parent
db49532e47
commit
0772d6bf00
@ -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)
|
||||||
|
}
|
||||||
|
}
|
@ -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)
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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"
|
||||||
}
|
}
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
|
@ -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
|
@ -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
|
@ -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 {
|
@ -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
|
|
@ -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
|
@ -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 {
|
||||||
|
@ -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 {
|
||||||
|
@ -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 {
|
||||||
|
@ -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 {
|
||||||
|
@ -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 {
|
||||||
|
@ -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 {
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
|
@ -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
|
@ -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
|
@ -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,
|
@ -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(
|
@ -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
|
@ -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" }
|
@ -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>
|
61
resources/build.gradle.kts
Normal file
61
resources/build.gradle.kts
Normal 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
|
||||||
|
}
|
||||||
|
}
|
39
resources/resources.podspec
Normal file
39
resources/resources.podspec
Normal 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
|
@ -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
|
||||||
|
}
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
@ -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)
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
package com.github.diegoberaldin.raccoonforlemmy.resources
|
||||||
|
|
||||||
|
import org.koin.core.module.Module
|
||||||
|
|
||||||
|
expect val localizationModule: Module
|
||||||
|
|
||||||
|
expect fun getLanguageRepository(): LanguageRepository
|
15
resources/src/commonMain/resources/MR/base/strings.xml
Normal file
15
resources/src/commonMain/resources/MR/base/strings.xml
Normal 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>
|
12
resources/src/commonMain/resources/MR/it/strings.xml
Normal file
12
resources/src/commonMain/resources/MR/it/strings.xml
Normal 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>
|
@ -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()
|
||||||
|
}
|
@ -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")
|
||||||
|
@ -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)
|
||||||
|
@ -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,
|
||||||
|
@ -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 = {
|
||||||
|
@ -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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user