mirror of
https://github.com/LiveFastEatTrashRaccoon/RaccoonForLemmy.git
synced 2025-02-02 11:56:44 +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.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)
|
||||
}
|
||||
}
|
@ -34,7 +34,6 @@ kotlin {
|
||||
val commonMain by getting {
|
||||
dependencies {
|
||||
implementation(libs.koin.core)
|
||||
implementation(libs.koin.test)
|
||||
|
||||
implementation(compose.runtime)
|
||||
implementation(compose.foundation)
|
||||
|
@ -33,7 +33,6 @@ kotlin {
|
||||
val commonMain by getting {
|
||||
dependencies {
|
||||
implementation(libs.koin.core)
|
||||
implementation(libs.koin.test)
|
||||
implementation(libs.androidx.datastore)
|
||||
}
|
||||
}
|
||||
|
@ -2,4 +2,5 @@ package com.github.diegoberaldin.raccoonforlemmy.core_preferences
|
||||
|
||||
object KeyStoreKeys {
|
||||
const val EnableDarkTheme = "enableDarkTheme"
|
||||
const val Locale = "locale"
|
||||
}
|
@ -34,7 +34,6 @@ kotlin {
|
||||
val commonMain by getting {
|
||||
dependencies {
|
||||
implementation(libs.koin.core)
|
||||
implementation(libs.koin.test)
|
||||
|
||||
implementation(compose.runtime)
|
||||
implementation(compose.foundation)
|
||||
|
@ -34,7 +34,6 @@ kotlin {
|
||||
val commonMain by getting {
|
||||
dependencies {
|
||||
implementation(libs.koin.core)
|
||||
implementation(libs.koin.test)
|
||||
|
||||
implementation(compose.runtime)
|
||||
implementation(compose.foundation)
|
||||
|
@ -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
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.github.diegoberaldin.racoonforlemmy.feature_home
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature_home
|
||||
|
||||
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.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.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 {
|
@ -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.inject
|
@ -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 {
|
||||
|
@ -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 {
|
||||
|
@ -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 {
|
||||
|
@ -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 {
|
||||
|
@ -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 {
|
||||
|
@ -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 {
|
||||
|
@ -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
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.github.diegoberaldin.racoonforlemmy.feature_settings
|
||||
package com.github.diegoberaldin.raccoonforlemmy.feature_settings
|
||||
|
||||
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.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 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(
|
||||
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.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(
|
@ -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
|
@ -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" }
|
@ -44,5 +44,9 @@
|
||||
</array>
|
||||
<key>UILaunchScreen</key>
|
||||
<dict/>
|
||||
<key>CFBundleLocalizations</key><array>
|
||||
<string>en</string>
|
||||
<string>it</string>
|
||||
</array>
|
||||
</dict>
|
||||
</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-appearance")
|
||||
include(":core-preferences")
|
||||
include(":resources")
|
||||
|
@ -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)
|
||||
|
@ -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,
|
||||
|
@ -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 = {
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user