Skip to content

Commit 1790899

Browse files
committed
i18b: add app-translation for zh-CN (simplified Chinese) #47
1 parent bf77623 commit 1790899

18 files changed

+327
-125
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
android:roundIcon="@mipmap/ic_launcher_round"
1515
android:supportsRtl="true"
1616
android:theme="@style/Theme.SmolLMAndroid"
17+
android:localeConfig="@xml/locales_config"
1718
tools:targetApi="31">
1819
<activity
1920
android:name=".MainActivity"

app/src/main/java/io/shubham0204/smollmandroid/ui/screens/chat/ChatActivity.kt

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ import androidx.compose.ui.graphics.Color
8585
import androidx.compose.ui.graphics.toArgb
8686
import androidx.compose.ui.platform.LocalContext
8787
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
88+
import androidx.compose.ui.res.stringResource
8889
import androidx.compose.ui.text.input.KeyboardCapitalization
8990
import androidx.compose.ui.text.style.TextAlign
9091
import androidx.compose.ui.unit.dp
@@ -94,6 +95,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
9495
import androidx.navigation.compose.NavHost
9596
import androidx.navigation.compose.composable
9697
import androidx.navigation.compose.rememberNavController
98+
import io.shubham0204.smollmandroid.R
9799
import io.shubham0204.smollmandroid.data.Chat
98100
import io.shubham0204.smollmandroid.ui.components.AppBarTitleText
99101
import io.shubham0204.smollmandroid.ui.components.MediumLabelText
@@ -174,7 +176,7 @@ fun ChatActivityScreenUI(
174176
title = {
175177
Column(modifier = Modifier.fillMaxWidth()) {
176178
AppBarTitleText(
177-
currChat?.name ?: "Select a chat",
179+
currChat?.name ?: stringResource(R.string.chat_select_chat),
178180
modifier = Modifier.fillMaxWidth(),
179181
)
180182
Text(
@@ -193,7 +195,7 @@ fun ChatActivityScreenUI(
193195
IconButton(onClick = { scope.launch { drawerState.open() } }) {
194196
Icon(
195197
Icons.Default.Menu,
196-
contentDescription = "View Chats",
198+
contentDescription = stringResource(R.string.chat_view_chats),
197199
)
198200
}
199201
},
@@ -282,7 +284,7 @@ private fun ColumnScope.MessagesList(
282284
context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
283285
val clip = ClipData.newPlainText("Copied message", chatMessage.message)
284286
clipboard.setPrimaryClip(clip)
285-
Toast.makeText(context, "Message copied", Toast.LENGTH_SHORT).show()
287+
Toast.makeText(context, context.getString(R.string.chat_message_copied), Toast.LENGTH_SHORT).show()
286288
},
287289
onShareClicked = {
288290
context.startActivity(
@@ -321,7 +323,7 @@ private fun ColumnScope.MessagesList(
321323
tint = MaterialTheme.colorScheme.primary,
322324
)
323325
Text(
324-
text = "Thinking ...",
326+
text = stringResource(R.string.chat_thinking),
325327
modifier =
326328
Modifier
327329
.fillMaxWidth()
@@ -377,13 +379,13 @@ private fun LazyItemScope.MessageListItem(
377379
Row(verticalAlignment = Alignment.CenterVertically) {
378380
Spacer(modifier = Modifier.width(16.dp))
379381
Text(
380-
text = "Copy",
382+
text = stringResource(R.string.chat_message_copy),
381383
modifier = Modifier.clickable { onCopyClicked() },
382384
fontSize = 8.sp,
383385
)
384386
Spacer(modifier = Modifier.width(8.dp))
385387
Text(
386-
text = "Share",
388+
text = stringResource(R.string.chat_message_share),
387389
modifier = Modifier.clickable { onShareClicked() },
388390
fontSize = 8.sp,
389391
)
@@ -422,7 +424,7 @@ private fun LazyItemScope.MessageListItem(
422424
Row(
423425
modifier =
424426
Modifier
425-
.fillMaxWidth()
427+
.fillMaxWidth()
426428
.animateItem(),
427429
horizontalArrangement = Arrangement.End,
428430
) {
@@ -431,7 +433,7 @@ private fun LazyItemScope.MessageListItem(
431433
Modifier
432434
.padding(8.dp)
433435
.background(MaterialTheme.colorScheme.primary, RoundedCornerShape(16.dp))
434-
.padding(8.dp)
436+
.padding(8.dp)
435437
.widthIn(max = 250.dp),
436438
textColor = android.graphics.Color.WHITE,
437439
textSize = 16f,
@@ -451,7 +453,7 @@ private fun MessageInput(
451453
if ((currChat?.llmModelId ?: -1L) == -1L) {
452454
Text(
453455
modifier = Modifier.padding(8.dp),
454-
text = "Select a model ...",
456+
text = stringResource(R.string.chat_select_model),
455457
)
456458
} else {
457459
var questionText by remember { mutableStateOf("") }
@@ -461,22 +463,22 @@ private fun MessageInput(
461463
ChatScreenViewModel.ModelLoadingState.IN_PROGRESS -> {
462464
Text(
463465
modifier = Modifier.padding(8.dp),
464-
text = "Loading model...",
466+
text = stringResource(R.string.chat_loading_model),
465467
)
466468
}
467469

468470
ChatScreenViewModel.ModelLoadingState.FAILURE -> {
469471
Text(
470472
modifier = Modifier.padding(8.dp),
471-
text = "The model selected for the chat cannot be loaded",
473+
text = stringResource(R.string.chat_model_cannot_be_loaded),
472474
)
473475
}
474476

475477
ChatScreenViewModel.ModelLoadingState.SUCCESS -> {
476478
TextField(
477479
modifier =
478480
Modifier
479-
.fillMaxWidth()
481+
.fillMaxWidth()
480482
.weight(1f),
481483
value = questionText,
482484
onValueChange = { questionText = it },
@@ -490,7 +492,7 @@ private fun MessageInput(
490492
),
491493
placeholder = {
492494
Text(
493-
text = "Ask a question",
495+
text = stringResource(R.string.chat_ask_question),
494496
)
495497
},
496498
keyboardOptions =
@@ -554,7 +556,7 @@ private fun TasksListBottomSheet(viewModel: ChatScreenViewModel) {
554556
if (tasks.isEmpty()) {
555557
Spacer(modifier = Modifier.height(24.dp))
556558
Text(
557-
"No tasks created",
559+
stringResource(R.string.chat_no_task_created),
558560
modifier = Modifier.fillMaxWidth(),
559561
style = MaterialTheme.typography.labelMedium,
560562
textAlign = TextAlign.Center,
@@ -568,11 +570,11 @@ private fun TasksListBottomSheet(viewModel: ChatScreenViewModel) {
568570
}
569571
},
570572
) {
571-
MediumLabelText("Create a task")
573+
MediumLabelText(stringResource(R.string.chat_create_task))
572574
}
573575
Spacer(modifier = Modifier.height(24.dp))
574576
} else {
575-
AppBarTitleText("Select A Task")
577+
AppBarTitleText(stringResource(R.string.chat_select_task))
576578
TasksList(
577579
tasks.map {
578580
val modelName =
@@ -607,6 +609,7 @@ private fun TasksListBottomSheet(viewModel: ChatScreenViewModel) {
607609
@Composable
608610
private fun SelectModelsList(viewModel: ChatScreenViewModel) {
609611
val showSelectModelsListDialog by viewModel.showSelectModelListDialogState.collectAsStateWithLifecycle()
612+
val context = LocalContext.current
610613
if (showSelectModelsListDialog) {
611614
val modelsList by
612615
viewModel.modelsRepository.getAvailableModels().collectAsState(emptyList())
@@ -623,7 +626,7 @@ private fun SelectModelsList(viewModel: ChatScreenViewModel) {
623626
Toast
624627
.makeText(
625628
viewModel.context,
626-
"Model '${model.name}' deleted",
629+
context.getString(R.string.chat_model_deleted, model.name),
627630
Toast.LENGTH_LONG,
628631
).show()
629632
},

app/src/main/java/io/shubham0204/smollmandroid/ui/screens/chat/ChatListDrawer.kt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,9 @@ import androidx.compose.runtime.getValue
5050
import androidx.compose.ui.Alignment
5151
import androidx.compose.ui.Modifier
5252
import androidx.compose.ui.draw.clip
53+
import androidx.compose.ui.res.stringResource
5354
import androidx.compose.ui.unit.dp
55+
import io.shubham0204.smollmandroid.R
5456
import io.shubham0204.smollmandroid.data.Chat
5557
import io.shubham0204.smollmandroid.ui.components.AppAlertDialog
5658

@@ -80,13 +82,13 @@ fun DrawerUI(
8082
},
8183
) {
8284
Icon(Icons.Default.Add, contentDescription = "New Chat")
83-
Text("New Chat")
85+
Text(stringResource(R.string.chat_drawer_new_chat))
8486
}
8587
Button(
8688
onClick = onCreateTaskClick,
8789
) {
8890
Icon(Icons.Default.AddTask, contentDescription = "New Task")
89-
Text("New Task")
91+
Text(stringResource(R.string.chat_drawer_new_task))
9092
}
9193
}
9294
Spacer(modifier = Modifier.height(16.dp))
@@ -102,7 +104,7 @@ fun DrawerUI(
102104
contentDescription = "Manage Tasks",
103105
)
104106
Text(
105-
"Manage Tasks",
107+
stringResource(R.string.chat_drawer_manage_tasks),
106108
style = MaterialTheme.typography.labelLarge,
107109
modifier =
108110
Modifier
@@ -112,7 +114,7 @@ fun DrawerUI(
112114
}
113115
Spacer(modifier = Modifier.height(16.dp))
114116
Text(
115-
"Previous Chats",
117+
stringResource(R.string.chat_drawer_previous_chat),
116118
style = MaterialTheme.typography.labelSmall,
117119
)
118120
Spacer(modifier = Modifier.height(8.dp))
@@ -141,12 +143,12 @@ private fun LazyItemScope.ChatListItem(
141143
Row(
142144
modifier =
143145
Modifier
144-
.fillMaxWidth()
146+
.fillMaxWidth()
145147
.padding(4.dp)
146148
.background(MaterialTheme.colorScheme.surfaceContainerHighest, RoundedCornerShape(8.dp))
147149
.padding(8.dp)
148150
.clip(RoundedCornerShape(8.dp))
149-
.clickable { onItemClick(chat) }
151+
.clickable { onItemClick(chat) }
150152
.animateItem(),
151153
verticalAlignment = Alignment.CenterVertically,
152154
) {

app/src/main/java/io/shubham0204/smollmandroid/ui/screens/chat/ChatMoreOptionsPopup.kt

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,10 @@ import androidx.compose.material3.Icon
2828
import androidx.compose.material3.Text
2929
import androidx.compose.runtime.Composable
3030
import androidx.compose.runtime.getValue
31+
import androidx.compose.ui.platform.LocalContext
32+
import androidx.compose.ui.res.stringResource
3133
import androidx.lifecycle.compose.collectAsStateWithLifecycle
34+
import io.shubham0204.smollmandroid.R
3235
import io.shubham0204.smollmandroid.ui.components.createAlertDialog
3336

3437
@Composable
@@ -37,44 +40,45 @@ fun ChatMoreOptionsPopup(
3740
onEditChatSettingsClick: () -> Unit,
3841
) {
3942
val expanded by viewModel.showMoreOptionsPopupState.collectAsStateWithLifecycle()
43+
val context = LocalContext.current
4044
DropdownMenu(
4145
expanded = expanded,
4246
onDismissRequest = { viewModel.hideMoreOptionsPopup() },
4347
) {
4448
DropdownMenuItem(
4549
leadingIcon = { Icon(Icons.Default.Settings, contentDescription = "Edit Chat Name") },
46-
text = { Text("Edit Chat Settings") },
50+
text = { Text(stringResource(R.string.chat_options_edit_settings)) },
4751
onClick = {
4852
onEditChatSettingsClick()
4953
viewModel.hideMoreOptionsPopup()
5054
},
5155
)
5256
DropdownMenuItem(
5357
leadingIcon = { Icon(Icons.Default.Assistant, contentDescription = "Change Model") },
54-
text = { Text("Change Model") },
58+
text = { Text(stringResource(R.string.chat_options_change_model)) },
5559
onClick = {
5660
viewModel.showSelectModelListDialog()
5761
viewModel.hideMoreOptionsPopup()
5862
},
5963
)
6064
DropdownMenuItem(
6165
leadingIcon = { Icon(Icons.AutoMirrored.Filled.ShortText, contentDescription = "Context Usage") },
62-
text = { Text("Context Length Usage") },
66+
text = { Text(stringResource(R.string.chat_options_ctx_length_usage)) },
6367
onClick = {
6468
viewModel.showContextLengthUsageDialog()
6569
viewModel.hideMoreOptionsPopup()
6670
},
6771
)
6872
DropdownMenuItem(
6973
leadingIcon = { Icon(Icons.Default.Delete, contentDescription = "Delete Chat") },
70-
text = { Text("Delete Chat") },
74+
text = { Text(stringResource(R.string.dialog_title_delete_chat)) },
7175
onClick = {
7276
viewModel.currChatState.value?.let { chat ->
7377
createAlertDialog(
74-
dialogTitle = "Delete Chat",
75-
dialogText = "Are you sure you want to delete chat '${chat.name}'?",
76-
dialogPositiveButtonText = "Delete",
77-
dialogNegativeButtonText = "Cancel",
78+
dialogTitle = context.getString(R.string.dialog_title_delete_chat),
79+
dialogText = context.getString(R.string.dialog_text_delete_chat, chat.name),
80+
dialogPositiveButtonText = context.getString(R.string.dialog_pos_delete),
81+
dialogNegativeButtonText = context.getString(R.string.dialog_neg_cancel),
7882
onPositiveButtonClick = {
7983
viewModel.deleteChat(chat)
8084
Toast

app/src/main/java/io/shubham0204/smollmandroid/ui/screens/chat/ChatScreenViewModel.kt

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -294,11 +294,11 @@ class ChatScreenViewModel(
294294
} catch (e: Exception) {
295295
_modelLoadState.value = ModelLoadingState.FAILURE
296296
createAlertDialog(
297-
dialogTitle = "An error occurred",
298-
dialogText = "The app is unable to load the model. The error message is: ${e.message}",
299-
dialogPositiveButtonText = "Change model",
297+
dialogTitle = context.getString(R.string.dialog_err_title),
298+
dialogText = context.getString(R.string.dialog_err_text, e.message),
299+
dialogPositiveButtonText = context.getString(R.string.dialog_err_change_model),
300300
onPositiveButtonClick = { showSelectModelListDialog() },
301-
dialogNegativeButtonText = "Close",
301+
dialogNegativeButtonText = context.getString(R.string.dialog_err_close),
302302
onNegativeButtonClick = {},
303303
)
304304
}
@@ -318,9 +318,14 @@ class ChatScreenViewModel(
318318
fun showContextLengthUsageDialog() {
319319
_currChatState.value?.let { chat ->
320320
createAlertDialog(
321-
dialogTitle = "Context Length Usage",
322-
dialogText = "You have consumed ${chat.contextSizeConsumed} tokens out of available ${chat.contextSize} tokens.",
323-
dialogPositiveButtonText = "Close",
321+
dialogTitle = context.getString(R.string.dialog_ctx_usage_title),
322+
dialogText =
323+
context.getString(
324+
R.string.dialog_ctx_usage_text,
325+
chat.contextSizeConsumed,
326+
chat.contextSize,
327+
),
328+
dialogPositiveButtonText = context.getString(R.string.dialog_ctx_usage_close),
324329
onPositiveButtonClick = {},
325330
dialogNegativeButtonText = null,
326331
onNegativeButtonClick = null,

0 commit comments

Comments
 (0)