From fce47897d5e2056633aac7eb8ce117726b4b69e6 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Fri, 31 Oct 2025 19:34:09 +0600 Subject: [PATCH] add getCurrentLocale and compose translation --- .../language_codes/CurrentIetfLang.kt | 3 +++ .../src/jsMain/kotlin/CurrentIetfLang.js.kt | 6 +++++ .../src/jvmMain/kotlin/CurrentIetfLang.jvm.kt | 6 +++++ .../kotlin/CurrentIetfLang.mingwX64.kt | 27 +++++++++++++++++++ .../kotlin/CurrentIetfLang.native.kt | 12 +++++++++ .../kotlin/CurrentIetfLang.wasmJs.kt | 10 +++++++ resources/compose/build.gradle | 20 ++++++++++++++ .../kotlin/GetCurrentLocale.android.kt | 24 +++++++++++++++++ .../src/commonMain/kotlin/GetCurrentLocale.kt | 7 +++++ .../kotlin/StringComposeTranslation.kt | 10 +++++++ .../src/jsMain/kotlin/GetCurrentLocale.js.kt | 9 +++++++ .../jvmMain/kotlin/GetCurrentLocale.jvm.kt | 10 +++++++ .../kotlin/GetCurrentLocale.native.kt | 9 +++++++ .../kotlin/GetCurrentLocale.wasmJs.kt | 9 +++++++ settings.gradle | 1 + 15 files changed, 163 insertions(+) create mode 100644 language_codes/src/commonMain/kotlin/dev/inmo/micro_utils/language_codes/CurrentIetfLang.kt create mode 100644 language_codes/src/jsMain/kotlin/CurrentIetfLang.js.kt create mode 100644 language_codes/src/jvmMain/kotlin/CurrentIetfLang.jvm.kt create mode 100644 language_codes/src/mingwX64Main/kotlin/CurrentIetfLang.mingwX64.kt create mode 100644 language_codes/src/nativeMain/kotlin/CurrentIetfLang.native.kt create mode 100644 language_codes/src/wasmJsMain/kotlin/CurrentIetfLang.wasmJs.kt create mode 100644 resources/compose/build.gradle create mode 100644 resources/compose/src/androidMain/kotlin/GetCurrentLocale.android.kt create mode 100644 resources/compose/src/commonMain/kotlin/GetCurrentLocale.kt create mode 100644 resources/compose/src/commonMain/kotlin/StringComposeTranslation.kt create mode 100644 resources/compose/src/jsMain/kotlin/GetCurrentLocale.js.kt create mode 100644 resources/compose/src/jvmMain/kotlin/GetCurrentLocale.jvm.kt create mode 100644 resources/compose/src/nativeMain/kotlin/GetCurrentLocale.native.kt create mode 100644 resources/compose/src/wasmJsMain/kotlin/GetCurrentLocale.wasmJs.kt diff --git a/language_codes/src/commonMain/kotlin/dev/inmo/micro_utils/language_codes/CurrentIetfLang.kt b/language_codes/src/commonMain/kotlin/dev/inmo/micro_utils/language_codes/CurrentIetfLang.kt new file mode 100644 index 00000000000..33aac6f6a69 --- /dev/null +++ b/language_codes/src/commonMain/kotlin/dev/inmo/micro_utils/language_codes/CurrentIetfLang.kt @@ -0,0 +1,3 @@ +package dev.inmo.micro_utils.language_codes + +expect val currentIetfLang: IetfLang? diff --git a/language_codes/src/jsMain/kotlin/CurrentIetfLang.js.kt b/language_codes/src/jsMain/kotlin/CurrentIetfLang.js.kt new file mode 100644 index 00000000000..3fe613c6caf --- /dev/null +++ b/language_codes/src/jsMain/kotlin/CurrentIetfLang.js.kt @@ -0,0 +1,6 @@ +package dev.inmo.micro_utils.language_codes + +import kotlinx.browser.window + +actual val currentIetfLang: IetfLang? + get() = window.navigator.language.unsafeCast() ?.let { IetfLang(it) } \ No newline at end of file diff --git a/language_codes/src/jvmMain/kotlin/CurrentIetfLang.jvm.kt b/language_codes/src/jvmMain/kotlin/CurrentIetfLang.jvm.kt new file mode 100644 index 00000000000..442391c4343 --- /dev/null +++ b/language_codes/src/jvmMain/kotlin/CurrentIetfLang.jvm.kt @@ -0,0 +1,6 @@ +package dev.inmo.micro_utils.language_codes + +import java.util.Locale + +actual val currentIetfLang: IetfLang? + get() = Locale.getDefault() ?.toIetfLang() \ No newline at end of file diff --git a/language_codes/src/mingwX64Main/kotlin/CurrentIetfLang.mingwX64.kt b/language_codes/src/mingwX64Main/kotlin/CurrentIetfLang.mingwX64.kt new file mode 100644 index 00000000000..a8da465e759 --- /dev/null +++ b/language_codes/src/mingwX64Main/kotlin/CurrentIetfLang.mingwX64.kt @@ -0,0 +1,27 @@ +package dev.inmo.micro_utils.language_codes + +import dev.inmo.micro_utils.language_codes.IetfLang +import kotlinx.cinterop.ExperimentalForeignApi +import kotlinx.cinterop.allocArray +import kotlinx.cinterop.memScoped +import kotlinx.cinterop.toKString +import platform.posix.getenv +import platform.windows.GetUserDefaultLocaleName +import platform.windows.LOCALE_NAME_MAX_LENGTH +import platform.windows.WCHARVar + +@OptIn(ExperimentalForeignApi::class) +actual val currentIetfLang: IetfLang? + get() { + val rawLocale = memScoped { + val buffer = allocArray(LOCALE_NAME_MAX_LENGTH) + val result = GetUserDefaultLocaleName(buffer, LOCALE_NAME_MAX_LENGTH) + + if (result > 0) { + // Convert WCHAR* to String + buffer.toKString() + } + "en-US" // fallback + } + return IetfLang(rawLocale) + } \ No newline at end of file diff --git a/language_codes/src/nativeMain/kotlin/CurrentIetfLang.native.kt b/language_codes/src/nativeMain/kotlin/CurrentIetfLang.native.kt new file mode 100644 index 00000000000..4a4bbd14553 --- /dev/null +++ b/language_codes/src/nativeMain/kotlin/CurrentIetfLang.native.kt @@ -0,0 +1,12 @@ +package dev.inmo.micro_utils.language_codes + +import kotlinx.cinterop.ExperimentalForeignApi +import kotlinx.cinterop.toKString +import platform.posix.getenv + +@OptIn(ExperimentalForeignApi::class) +actual val currentIetfLang: IetfLang? + get() { + val localeStr = getenv("LANG") ?.toKString() ?.replace("_", "-") ?: "en-US" + return IetfLang(localeStr) + } \ No newline at end of file diff --git a/language_codes/src/wasmJsMain/kotlin/CurrentIetfLang.wasmJs.kt b/language_codes/src/wasmJsMain/kotlin/CurrentIetfLang.wasmJs.kt new file mode 100644 index 00000000000..76eac9b9d2a --- /dev/null +++ b/language_codes/src/wasmJsMain/kotlin/CurrentIetfLang.wasmJs.kt @@ -0,0 +1,10 @@ +package dev.inmo.micro_utils.language_codes + +external interface Navigator { + val language: String +} + +external val navigator: Navigator + +actual val currentIetfLang: IetfLang? + get() = IetfLang(navigator.language) \ No newline at end of file diff --git a/resources/compose/build.gradle b/resources/compose/build.gradle new file mode 100644 index 00000000000..b0db99d9ade --- /dev/null +++ b/resources/compose/build.gradle @@ -0,0 +1,20 @@ +plugins { + id "org.jetbrains.kotlin.multiplatform" + id "org.jetbrains.kotlin.plugin.serialization" + id "com.android.library" + alias(libs.plugins.jb.compose) + alias(libs.plugins.kt.jb.compose) +} + +apply from: "$mppComposeJvmJsWasmJsAndroidLinuxMingwLinuxArm64Project" + +kotlin { + sourceSets { + commonMain { + dependencies { + api libs.kt.coroutines + api project(":micro_utils.resources") + } + } + } +} diff --git a/resources/compose/src/androidMain/kotlin/GetCurrentLocale.android.kt b/resources/compose/src/androidMain/kotlin/GetCurrentLocale.android.kt new file mode 100644 index 00000000000..7de2304b005 --- /dev/null +++ b/resources/compose/src/androidMain/kotlin/GetCurrentLocale.android.kt @@ -0,0 +1,24 @@ +package dev.inmo.micro_utils.resources.compose + +import android.os.Build +import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalConfiguration +import dev.inmo.micro_utils.language_codes.IetfLang +import dev.inmo.micro_utils.language_codes.toIetfLang + +@Composable +actual fun getCurrentLocale(): IetfLang? { + val configuration = LocalConfiguration.current + + val locale = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + if (configuration.locales.isEmpty) { + return null + } + configuration.locales.get(0) + } else { + @Suppress("DEPRECATION") + configuration.locale + } + + return locale.toIetfLang() +} \ No newline at end of file diff --git a/resources/compose/src/commonMain/kotlin/GetCurrentLocale.kt b/resources/compose/src/commonMain/kotlin/GetCurrentLocale.kt new file mode 100644 index 00000000000..1c6d1109bb1 --- /dev/null +++ b/resources/compose/src/commonMain/kotlin/GetCurrentLocale.kt @@ -0,0 +1,7 @@ +package dev.inmo.micro_utils.resources.compose + +import androidx.compose.runtime.Composable +import dev.inmo.micro_utils.language_codes.IetfLang + +@Composable +expect fun getCurrentLocale(): IetfLang? diff --git a/resources/compose/src/commonMain/kotlin/StringComposeTranslation.kt b/resources/compose/src/commonMain/kotlin/StringComposeTranslation.kt new file mode 100644 index 00000000000..c248767a8bd --- /dev/null +++ b/resources/compose/src/commonMain/kotlin/StringComposeTranslation.kt @@ -0,0 +1,10 @@ +package dev.inmo.micro_utils.resources.compose + +import androidx.compose.runtime.Composable +import dev.inmo.micro_utils.strings.StringResource + +@Suppress("unused") +@Composable +fun StringResource.composeTranslation(): String { + return translation(getCurrentLocale()) +} diff --git a/resources/compose/src/jsMain/kotlin/GetCurrentLocale.js.kt b/resources/compose/src/jsMain/kotlin/GetCurrentLocale.js.kt new file mode 100644 index 00000000000..736ea39582b --- /dev/null +++ b/resources/compose/src/jsMain/kotlin/GetCurrentLocale.js.kt @@ -0,0 +1,9 @@ +package dev.inmo.micro_utils.resources.compose + +import dev.inmo.micro_utils.language_codes.IetfLang +import dev.inmo.micro_utils.language_codes.currentIetfLang + +@androidx.compose.runtime.Composable +actual fun getCurrentLocale(): IetfLang? { + return currentIetfLang +} \ No newline at end of file diff --git a/resources/compose/src/jvmMain/kotlin/GetCurrentLocale.jvm.kt b/resources/compose/src/jvmMain/kotlin/GetCurrentLocale.jvm.kt new file mode 100644 index 00000000000..f17a2468f5d --- /dev/null +++ b/resources/compose/src/jvmMain/kotlin/GetCurrentLocale.jvm.kt @@ -0,0 +1,10 @@ +package dev.inmo.micro_utils.resources.compose + +import androidx.compose.ui.text.intl.Locale +import dev.inmo.micro_utils.language_codes.IetfLang +import dev.inmo.micro_utils.language_codes.currentIetfLang + +@androidx.compose.runtime.Composable +actual fun getCurrentLocale(): IetfLang? { + return currentIetfLang +} \ No newline at end of file diff --git a/resources/compose/src/nativeMain/kotlin/GetCurrentLocale.native.kt b/resources/compose/src/nativeMain/kotlin/GetCurrentLocale.native.kt new file mode 100644 index 00000000000..736ea39582b --- /dev/null +++ b/resources/compose/src/nativeMain/kotlin/GetCurrentLocale.native.kt @@ -0,0 +1,9 @@ +package dev.inmo.micro_utils.resources.compose + +import dev.inmo.micro_utils.language_codes.IetfLang +import dev.inmo.micro_utils.language_codes.currentIetfLang + +@androidx.compose.runtime.Composable +actual fun getCurrentLocale(): IetfLang? { + return currentIetfLang +} \ No newline at end of file diff --git a/resources/compose/src/wasmJsMain/kotlin/GetCurrentLocale.wasmJs.kt b/resources/compose/src/wasmJsMain/kotlin/GetCurrentLocale.wasmJs.kt new file mode 100644 index 00000000000..736ea39582b --- /dev/null +++ b/resources/compose/src/wasmJsMain/kotlin/GetCurrentLocale.wasmJs.kt @@ -0,0 +1,9 @@ +package dev.inmo.micro_utils.resources.compose + +import dev.inmo.micro_utils.language_codes.IetfLang +import dev.inmo.micro_utils.language_codes.currentIetfLang + +@androidx.compose.runtime.Composable +actual fun getCurrentLocale(): IetfLang? { + return currentIetfLang +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 99d4168788a..d1f109f6560 100644 --- a/settings.gradle +++ b/settings.gradle @@ -50,6 +50,7 @@ String[] includes = [ ":colors:common", ":resources", + ":resources:compose", ":fsm:common", ":fsm:repos:common",