diff --git a/components/resources/demo/shared/src/commonMain/composeResources/values-np/strings.xml b/components/resources/demo/shared/src/commonMain/composeResources/values-np/strings.xml
new file mode 100644
index 0000000000..af41ba72f9
--- /dev/null
+++ b/components/resources/demo/shared/src/commonMain/composeResources/values-np/strings.xml
@@ -0,0 +1,3 @@
+
+ ЁЯШК рдирдорд╕реНрдХрд╛рд░ рд╕рдВрд╕рд╛рд░!
+
diff --git a/components/resources/demo/shared/src/commonMain/kotlin/org/jetbrains/compose/resources/demo/shared/StringRes.kt b/components/resources/demo/shared/src/commonMain/kotlin/org/jetbrains/compose/resources/demo/shared/StringRes.kt
index 03001ad7a6..bdd1034742 100644
--- a/components/resources/demo/shared/src/commonMain/kotlin/org/jetbrains/compose/resources/demo/shared/StringRes.kt
+++ b/components/resources/demo/shared/src/commonMain/kotlin/org/jetbrains/compose/resources/demo/shared/StringRes.kt
@@ -9,10 +9,12 @@ import androidx.compose.material.icons.filled.Add
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
+import androidx.compose.ui.text.intl.Locale
import androidx.compose.ui.unit.dp
import components.resources.demo.shared.generated.resources.*
import org.jetbrains.compose.resources.*
+@OptIn(ExperimentalResourceApi::class)
@Composable
fun StringRes(paddingValues: PaddingValues) {
Column(
@@ -42,6 +44,41 @@ fun StringRes(paddingValues: PaddingValues) {
disabledLabelColor = MaterialTheme.colorScheme.onSurface,
)
)
+ OutlinedCard(
+ modifier = Modifier.padding(16.dp).fillMaxWidth(),
+ shape = RoundedCornerShape(4.dp)
+ ) {
+ CompositionLocalProvider(
+ LocalResourceLocale provides Locale("np")
+ ) {
+ OutlinedTextField(
+ modifier = Modifier.padding(16.dp).fillMaxWidth(),
+ value = stringResource(Res.string.hello),
+ onValueChange = {},
+ label = {
+ Text("Text(stringResource(Res.string.hello))")
+ },
+ enabled = false,
+ colors = TextFieldDefaults.colors(
+ disabledTextColor = MaterialTheme.colorScheme.onSurface,
+ disabledContainerColor = MaterialTheme.colorScheme.surface,
+ disabledLabelColor = MaterialTheme.colorScheme.onSurface,
+ )
+ )
+ Text(
+ modifier = Modifier.padding(16.dp),
+ text = """
+ CompositionLocalProvider(
+ LocalResourceLocale provides Locale("np")
+ ) {
+ Text(stringResource(Res.string.hello))
+ }
+ """.trimIndent(),
+ color = MaterialTheme.colorScheme.onPrimaryContainer,
+ softWrap = false
+ )
+ }
+ }
OutlinedTextField(
modifier = Modifier.padding(16.dp).fillMaxWidth(),
value = stringResource(Res.string.multi_line),
diff --git a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ResourceEnvironment.kt b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ResourceEnvironment.kt
index 20ac17ca09..1d64357f3f 100644
--- a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ResourceEnvironment.kt
+++ b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ResourceEnvironment.kt
@@ -43,7 +43,7 @@ internal interface ComposeEnvironment {
internal val DefaultComposeEnvironment = object : ComposeEnvironment {
@Composable
override fun rememberEnvironment(): ResourceEnvironment {
- val composeLocale = Locale.current
+ val composeLocale = LocalResourceLocale.current
val composeTheme = isSystemInDarkTheme()
val composeDensity = LocalDensity.current
@@ -153,4 +153,8 @@ private fun List.filterByLocale(language: LanguageQualifier, regio
return filter { item ->
item.qualifiers.none { it is LanguageQualifier || it is RegionQualifier }
}
-}
\ No newline at end of file
+}
+
+// Locale used for Resource that can be override by user
+@ExperimentalResourceApi
+val LocalResourceLocale = compositionLocalOf { Locale.current }
\ No newline at end of file
diff --git a/components/resources/library/src/commonTest/kotlin/org/jetbrains/compose/resources/ComposeResourceTest.kt b/components/resources/library/src/commonTest/kotlin/org/jetbrains/compose/resources/ComposeResourceTest.kt
index 712e8a8cbf..077ff80d0e 100644
--- a/components/resources/library/src/commonTest/kotlin/org/jetbrains/compose/resources/ComposeResourceTest.kt
+++ b/components/resources/library/src/commonTest/kotlin/org/jetbrains/compose/resources/ComposeResourceTest.kt
@@ -5,6 +5,7 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.*
import androidx.compose.ui.test.ExperimentalTestApi
import androidx.compose.ui.test.runComposeUiTest
+import androidx.compose.ui.text.intl.Locale
import kotlinx.coroutines.test.runTest
import kotlin.test.*
@@ -328,4 +329,37 @@ class ComposeResourceTest {
val systemEnvironment = getSystemResourceEnvironment()
assertEquals(systemEnvironment, environment)
}
+
+ @Test
+ fun testDefaultResourceLocaleOnResourceEnvironment() = runComposeUiTest {
+ var resourceEnvironment: ResourceEnvironment? = null
+ var expectedLocale: Locale? = null
+
+ setContent {
+ expectedLocale = Locale.current
+ resourceEnvironment = rememberResourceEnvironment()
+ }
+
+ waitForIdle()
+
+ assertEquals(resourceEnvironment?.language?.language, expectedLocale?.language)
+ assertEquals(resourceEnvironment?.region?.region, expectedLocale?.region)
+ }
+
+ @Test
+ fun testProvidedResourceLocaleOnResourceEnvironment() = runComposeUiTest {
+ var resourceEnvironment: ResourceEnvironment? = null
+ val expectedLocale = Locale("np")
+
+ setContent {
+ CompositionLocalProvider(LocalResourceLocale provides expectedLocale) {
+ resourceEnvironment = rememberResourceEnvironment()
+ }
+ }
+
+ waitForIdle()
+
+ assertEquals(resourceEnvironment?.language?.language, expectedLocale.language)
+ assertEquals(resourceEnvironment?.region?.region, expectedLocale.region)
+ }
}