1+ package io.tolgee.demo.examplejetpack
2+
3+ import android.os.Bundle
4+ import androidx.activity.ComponentActivity
5+ import androidx.activity.compose.setContent
6+ import androidx.activity.enableEdgeToEdge
7+ import androidx.compose.foundation.layout.Column
8+ import androidx.compose.foundation.layout.fillMaxSize
9+ import androidx.compose.foundation.layout.padding
10+ import androidx.compose.material3.Scaffold
11+ import androidx.compose.material3.SegmentedButton
12+ import androidx.compose.material3.SegmentedButtonDefaults
13+ import androidx.compose.material3.SingleChoiceSegmentedButtonRow
14+ import androidx.compose.material3.SingleChoiceSegmentedButtonRowScope
15+ import androidx.compose.material3.Text
16+ import androidx.compose.runtime.Composable
17+ import androidx.compose.runtime.collectAsState
18+ import androidx.compose.ui.Modifier
19+ import androidx.compose.ui.tooling.preview.Preview
20+ import androidx.lifecycle.lifecycleScope
21+ import io.tolgee.Tolgee
22+ import io.tolgee.demo.examplejetpack.ui.theme.ComposetolgeeTheme
23+ import kotlinx.coroutines.launch
24+ import de.comahe.i18n4k.forLocaleTag
25+ import kotlinx.coroutines.flow.mapLatest
26+ import io.tolgee.stringResource
27+ import io.tolgee.pluralStringResource
28+
29+ class MainActivity : ComponentActivity () {
30+ override fun onCreate (savedInstanceState : Bundle ? ) {
31+ super .onCreate(savedInstanceState)
32+
33+ lifecycleScope.launch {
34+ // Keep the Activity title updated
35+ Tolgee .instance.tFlow(this @MainActivity, R .string.app_name).collect { title = it }
36+ }
37+
38+ enableEdgeToEdge()
39+ setContent {
40+ ComposetolgeeTheme {
41+ Scaffold (modifier = Modifier .fillMaxSize()) { innerPadding ->
42+ Column (modifier = Modifier .padding(innerPadding)) {
43+ BasicText ()
44+ ParametrizedText (name = " Android" )
45+ PluralText (
46+ count = 10 ,
47+ param = 10 ,
48+ )
49+ LocaleSwitcher ()
50+ }
51+ }
52+ }
53+ }
54+ }
55+ }
56+
57+ @Composable
58+ fun BasicText (modifier : Modifier = Modifier ) {
59+ Text (
60+ text = stringResource(R .string.description),
61+ modifier = modifier
62+ )
63+ }
64+
65+ @Composable
66+ fun ParametrizedText (name : String , modifier : Modifier = Modifier ) {
67+ Text (
68+ text = stringResource(R .string.percentage_placeholder, name),
69+ modifier = modifier
70+ )
71+ }
72+
73+ @Composable
74+ fun PluralText (count : Int , param : Int , modifier : Modifier = Modifier ) {
75+ Text (
76+ text = pluralStringResource(R .plurals.plr_test_placeholder_2, count, param, count, " Plurals" ),
77+ modifier = modifier
78+ )
79+ }
80+
81+ val LOCALES = arrayOf(
82+ " en" to " English" ,
83+ " fr" to " Français" ,
84+ " cs" to " Čeština" ,
85+ )
86+
87+ @Composable
88+ fun LocaleSwitcher (modifier : Modifier = Modifier ) {
89+ SingleChoiceSegmentedButtonRow (modifier = modifier) {
90+ LOCALES .forEachIndexed { index, (locale, name) ->
91+ ChangeLocaleButton (
92+ index = index,
93+ count = LOCALES .size,
94+ locale = locale,
95+ name = name,
96+ )
97+ }
98+ }
99+ }
100+
101+ fun Tolgee.isLocaleSelected (locale : String , fallback : Boolean ): Boolean {
102+ return getLocale() == forLocaleTag(locale) || (fallback && LOCALES .none { (locale, _) ->
103+ getLocale() == forLocaleTag(locale)
104+ })
105+ }
106+
107+ @Composable
108+ fun isLocaleSelected (locale : String , fallback : Boolean ): Boolean {
109+ val tolgee = Tolgee .instance
110+ return tolgee.changeFlow.mapLatest {
111+ tolgee.isLocaleSelected(locale, fallback)
112+ }.collectAsState(initial = tolgee.isLocaleSelected(locale, fallback)).value
113+ }
114+
115+ @Composable
116+ fun SingleChoiceSegmentedButtonRowScope.ChangeLocaleButton (index : Int , count : Int , locale : String , name : String ) {
117+ SegmentedButton (
118+ shape = SegmentedButtonDefaults .itemShape(
119+ index = index,
120+ count = count
121+ ),
122+ onClick = {
123+ Tolgee .instance.setLocale(locale)
124+ },
125+ selected = isLocaleSelected(locale, index == 0 ),
126+ label = { Text (text = name) }
127+ )
128+ }
129+
130+ @Preview(showBackground = true )
131+ @Composable
132+ fun ParametrizedTextPreview () {
133+ ComposetolgeeTheme {
134+ ParametrizedText (" Android" )
135+ }
136+ }
0 commit comments