Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(language): đa ngôn ngữ ở màn học #87

Merged
merged 2 commits into from
Dec 2, 2024
Merged

Conversation

VawnDao
Copy link
Collaborator

@VawnDao VawnDao commented Dec 2, 2024

Summary by CodeRabbit

Release Notes

  • New Features

    • Enhanced localization support with the introduction of string resources for various user-facing text, including motivational phrases and instructional messages.
    • Added Vietnamese language support with new strings for improved user engagement.
  • Bug Fixes

    • Replaced hardcoded strings across multiple components to ensure consistent localization and maintainability.

These updates enhance the overall user experience by providing clearer guidance and positive reinforcement during the learning process.

Copy link
Contributor

coderabbitai bot commented Dec 2, 2024

Caution

Review failed

The pull request is closed.

Walkthrough

The changes in this pull request focus on enhancing the localization of the application by replacing hardcoded strings with references to string resources across multiple Kotlin files. This includes updates to various UI components such as StudyTopAppBar, FlipFlashCardScreen, and others, ensuring that all user-facing text is sourced from resource files. Additionally, new string resources have been added to both the English and Vietnamese strings.xml files to support internationalization and improve user engagement.

Changes

File Path Change Summary
app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/component/StudyTopAppBar.kt Replaced hardcoded strings with stringResource() for title and icon content descriptions.
app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/flip/FlipFlashCardScreen.kt Updated hardcoded strings to stringResource() for user instructions and button titles.
app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/flip/component/FlipFlashCardFinish.kt Replaced hardcoded strings with stringResource() for encouragement messages and labels.
app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/flip/component/StudyFlipCard.kt Updated "Still Learning" and "Known" labels to use stringResource().
app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/quiz/LearnByQuizScreen.kt Replaced hardcoded strings with stringResource() for various UI texts.
app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/quiz/component/QuizFlashCardFinish.kt Updated encouragement messages and other texts to use stringResource().
app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/quiz/component/QuizView.kt Replaced hardcoded feedback messages with stringResource().
app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/true_false/LearnByTrueFalseScreen.kt Updated loading and button texts to use stringResource().
app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/true_false/component/TrueFalseFlashcardFinish.kt Replaced hardcoded strings with stringResource() for messages and labels.
app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/write/LearnByWriteScreen.kt Updated various texts to use stringResource().
app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/write/component/WriteFlashcardFinish.kt Replaced hardcoded strings with stringResource() for encouragement and labels.
app/src/main/res/values-vi/strings.xml Added numerous new string resources for Vietnamese localization.
app/src/main/res/values/strings.xml Added numerous new string resources for English localization.

Suggested labels

Android

🎉 In the code, we weave,
Strings now dance and believe!
Localization's the key,
For all users, you see!
With resources galore,
Learning's fun, never a bore! 📚✨


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 5924a81 and 1c2bc83.

📒 Files selected for processing (4)
  • app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/flip/FlipFlashCardScreen.kt (7 hunks)
  • app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/quiz/LearnByQuizScreen.kt (4 hunks)
  • app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/true_false/LearnByTrueFalseScreen.kt (6 hunks)
  • app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/write/LearnByWriteScreen.kt (4 hunks)

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Outside diff range and nitpick comments (17)
app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/true_false/component/TrueFalseFlashcardFinish.kt (1)

Line range hint 279-287: Lỗi logic trong điều kiện kiểm tra wrongAnswerCount

Điều kiện wrongAnswerCount < 0 không hợp lý vì:

  • wrongAnswerCount không nên âm
  • Điều kiện này ngăn hiển thị phần review câu trả lời sai khi thực sự có câu trả lời sai

Sửa lại điều kiện như sau:

-            if (wrongAnswerCount < 0) {
+            if (wrongAnswerCount > 0) {
app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/flip/component/FlipFlashCardFinish.kt (3)

83-83: Đề xuất: Tách string resource thành các phần riêng biệt

Text "You're doing great, keep it up!" nên được tách thành 2 string resource riêng để dễ dàng tái sử dụng và linh hoạt hơn trong việc dịch sang các ngôn ngữ khác.

-    text = stringResource(R.string.txt_you_re_doing_great_keep_it_up),
+    text = buildAnnotatedString {
+        append(stringResource(R.string.txt_you_re_doing_great))
+        append(" ")
+        append(stringResource(R.string.txt_keep_it_up))
+    },

Line range hint 204-204: Cần xóa Timber.d log statement trong production code

Debug log statement nên được xóa khỏi production code để tránh ảnh hưởng đến performance.

-        Timber.d("toStringTime learningTime: ${learningTime.toStringTime()}")

233-236: Đề xuất: Sử dụng string formatting với named arguments

Để tăng tính rõ ràng và dễ maintain, nên sử dụng named arguments trong string resource.

Trong file strings.xml, thay đổi format string như sau:

- <string name="txt_keep_reviewing_terms_flip">Keep reviewing %d terms</string>
+ <string name="txt_keep_reviewing_terms_flip">Keep reviewing %(count)d terms</string>

Và trong code:

-    text = stringResource(
-        R.string.txt_keep_reviewing_terms_flip,
-        countStillLearning
-    ),
+    text = stringResource(
+        R.string.txt_keep_reviewing_terms_flip,
+        formatArgs = arrayOf("count" to countStillLearning)
+    ),
app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/write/LearnByWriteScreen.kt (1)

Line range hint 179-181: Còn sót một số text cứng chưa được thay thế

Các content description sau vẫn đang dùng text cứng:

  • "Back" cho navigation icon
  • "Submit" cho submit icon

Cần thay thế bằng string resource để đảm bảo tính nhất quán trong việc đa ngôn ngữ.

- contentDescription = "Back"
+ contentDescription = stringResource(R.string.txt_back)

- contentDescription = "Submit"
+ contentDescription = stringResource(R.string.txt_submit)

Also applies to: 374-377

app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/quiz/LearnByQuizScreen.kt (4)

Line range hint 180-184: Cần localize contentDescription

ContentDescription "Hint" đang được hardcode. Cần chuyển sang sử dụng stringResource để hỗ trợ đa ngôn ngữ.

Icon(
    imageVector = Default.LightMode,
-   contentDescription = "Hint",
+   contentDescription = stringResource(R.string.txt_hint),
    tint = studySetColor
)

Line range hint 190-194: Cần localize contentDescription

Tương tự như trên, contentDescription "Restart" cũng cần được localize.

Icon(
    imageVector = Default.RestartAlt,
-   contentDescription = "Restart",
+   contentDescription = stringResource(R.string.txt_restart),
    tint = studySetColor
)

Line range hint 219-223: Cần localize contentDescription

ContentDescription "Next Flash Card" cũng cần được chuyển sang sử dụng stringResource.

Icon(
    imageVector = Icons.AutoMirrored.Filled.NavigateNext,
-   contentDescription = "Next Flash Card"
+   contentDescription = stringResource(R.string.txt_next_flash_card)
)

Line range hint 305-307: Cần xử lý null safety tốt hơn

Việc sử dụng flashCard?.hint ?: "" có thể được cải thiện bằng cách kiểm tra null sớm hơn để tránh hiển thị bottom sheet khi hint là null.

Text(
-   text = flashCard?.hint ?: "",
+   text = flashCard?.hint.orEmpty(),
    style = MaterialTheme.typography.bodyMedium
)
app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/flip/FlipFlashCardScreen.kt (1)

167-169: Cân nhắc tách danh sách suggestedText thành hằng số

Để code dễ bảo trì hơn, nên tách danh sách suggestedText ra thành companion object hoặc top-level constant.

+private val SUGGESTED_TEXTS = listOf(
+    R.string.txt_tap_the_card_to_flip,
+    R.string.txt_swipe_left_to_mark_as_known, 
+    R.string.txt_swipe_right_to_mark_as_still_learning
+)

-    val suggestedText = listOf(
-        stringResource(R.string.txt_tap_the_card_to_flip),
-        stringResource(R.string.txt_swipe_left_to_mark_as_known),
-        stringResource(R.string.txt_swipe_right_to_mark_as_still_learning)
-    )
+    val suggestedText = SUGGESTED_TEXTS.map { stringResource(it) }
app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/quiz/component/QuizFlashCardFinish.kt (2)

Line range hint 279-288: Lỗi logic trong điều kiện kiểm tra số câu trả lời sai

Điều kiện wrongAnswerCount < 0 đang ngược với logic cần thiết. Phần review câu trả lời sai chỉ nên hiển thị khi có ít nhất 1 câu trả lời sai.

Sửa lại điều kiện như sau:

- if (wrongAnswerCount < 0) {
+ if (wrongAnswerCount > 0) {

Line range hint 317-329: Cần thêm kiểm tra null khi set definitionImageUri

Mặc dù đã kiểm tra !it.flashCard.definitionImageURL.isNullOrEmpty(), nhưng vẫn nên thêm kiểm tra null khi gán giá trị cho definitionImageUri để đảm bảo an toàn.

- definitionImageUri = it.flashCard.definitionImageURL
+ definitionImageUri = it.flashCard.definitionImageURL ?: ""
app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/quiz/component/QuizView.kt (1)

Line range hint 57-58: Còn sót các chuỗi hardcode cần chuyển sang string resource

Để đảm bảo tính nhất quán trong việc đa ngôn ngữ, cần chuyển các chuỗi hardcode còn lại sang string resource:

  1. "Select an answer" trong biến feedbackMessage
  2. "Explanation: " trong phần hiển thị explanation

Đề xuất thêm các string resource sau:

<!-- strings.xml -->
<string name="txt_select_answer">Select an answer</string>
<string name="txt_explanation">Explanation: %1$s</string>

Và cập nhật code:

- feedbackMessage = "Select an answer"
+ feedbackMessage = stringResource(R.string.txt_select_answer)

- text = "Explanation: ${flashCard.explanation}"
+ text = stringResource(R.string.txt_explanation, flashCard.explanation)

Also applies to: 108-109

app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/write/component/WriteFlashcardFinish.kt (4)

77-81: Đề xuất cải thiện logic phân loại thông điệp khuyến khích

Logic hiện tại đúng nhưng có thể cải thiện bằng cách sử dụng constants để dễ bảo trì hơn.

+    private const val LOW_SCORE_THRESHOLD = 0.3
+    private const val MEDIUM_SCORE_THRESHOLD = 0.6

     val encouragementMessage = when {
         correctAnswerCount == 0 -> stringResource(R.string.txt_don_t_give_up_keep_trying)
-        correctAnswerCount <= flashCardSize * 0.3 -> stringResource(R.string.txt_good_start_keep_going)
-        correctAnswerCount <= flashCardSize * 0.6 -> stringResource(R.string.txt_you_re_doing_great_keep_it_up)
+        correctAnswerCount <= flashCardSize * LOW_SCORE_THRESHOLD -> stringResource(R.string.txt_good_start_keep_going)
+        correctAnswerCount <= flashCardSize * MEDIUM_SCORE_THRESHOLD -> stringResource(R.string.txt_you_re_doing_great_keep_it_up)
         correctAnswerCount < flashCardSize -> stringResource(R.string.txt_almost_there_keep_pushing)
         else -> stringResource(R.string.txt_excellent_you_ve_mastered_it)
     }

Line range hint 280-288: Lỗi logic trong điều kiện hiển thị câu trả lời sai

Điều kiện wrongAnswerCount < 0 không đúng vì số lượng câu trả lời sai không thể âm. Cần sửa thành wrongAnswerCount > 0.

-    if (wrongAnswerCount < 0) {
+    if (wrongAnswerCount > 0) {
         item {
             Text(
                 text = stringResource(R.string.txt_review_your_wrong_answers),
                 style = MaterialTheme.typography.titleLarge.copy(
                     fontWeight = FontWeight.Bold
                 ),
             )
         }

83-84: Đề xuất cải thiện quản lý state của image viewer

State của image viewer nên được quản lý ở cấp cao hơn và truyền xuống qua parameters để dễ dàng kiểm soát và mở rộng chức năng trong tương lai.

-    var isImageViewerOpen by remember { mutableStateOf(false) }
-    var definitionImageUri by remember { mutableStateOf("") }
+    fun WriteFlashcardFinish(
+        modifier: Modifier = Modifier,
+        isImageViewerOpen: Boolean,
+        definitionImageUri: String,
+        onImageViewerOpenChange: (Boolean, String) -> Unit,
+        // ... other params

Line range hint 62-373: Đề xuất tách component thành các phần nhỏ hơn

Component hiện tại đang xử lý nhiều trách nhiệm khác nhau. Nên tách thành các component nhỏ hơn để dễ bảo trì và tái sử dụng:

  • StudyResultHeader (phần hiển thị kết quả)
  • WrongAnswersList (phần danh sách câu trả lời sai)
  • StudyActionButtons (phần các nút thao tác)

Ví dụ cấu trúc mới:

@Composable
fun WriteFlashcardFinish(
    // ... params
) {
    Column {
        StudyResultHeader(
            correctAnswerCount = correctAnswerCount,
            flashCardSize = flashCardSize,
            learningTime = learningTime
        )
        
        if (wrongAnswerCount > 0) {
            WrongAnswersList(
                wrongAnswers = listWrongAnswer,
                onImageClick = { /* ... */ }
            )
        }
        
        StudyActionButtons(
            wrongAnswerCount = wrongAnswerCount,
            onContinueLearningClicked = onContinueLearningClicked,
            onRestartClicked = onRestartClicked
        )
    }
}
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 88c63aa and 5924a81.

📒 Files selected for processing (13)
  • app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/component/StudyTopAppBar.kt (4 hunks)
  • app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/flip/FlipFlashCardScreen.kt (7 hunks)
  • app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/flip/component/FlipFlashCardFinish.kt (7 hunks)
  • app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/flip/component/StudyFlipCard.kt (9 hunks)
  • app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/quiz/LearnByQuizScreen.kt (4 hunks)
  • app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/quiz/component/QuizFlashCardFinish.kt (11 hunks)
  • app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/quiz/component/QuizView.kt (2 hunks)
  • app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/true_false/LearnByTrueFalseScreen.kt (6 hunks)
  • app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/true_false/component/TrueFalseFlashcardFinish.kt (11 hunks)
  • app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/write/LearnByWriteScreen.kt (4 hunks)
  • app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/write/component/WriteFlashcardFinish.kt (11 hunks)
  • app/src/main/res/values-vi/strings.xml (1 hunks)
  • app/src/main/res/values/strings.xml (1 hunks)
👮 Files not reviewed due to content moderation or server errors (3)
  • app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/component/StudyTopAppBar.kt
  • app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/true_false/LearnByTrueFalseScreen.kt
  • app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/flip/component/StudyFlipCard.kt
🧰 Additional context used
📓 Path-based instructions (11)
app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/write/component/WriteFlashcardFinish.kt (1)

Pattern **/*.kt: Thân thiện, chuyên nghiệp: Các nhận xét cần khách quan, lịch sự, tránh giọng điệu chỉ trích. Đề xuất cách cải thiện nếu thấy cần thiết, thay vì chỉ ra lỗi mà không có hướng dẫn.

Trọng tâm và hiệu quả: Nêu rõ ràng vấn đề chính, không đi quá chi tiết nếu không cần thiết, và đưa ra ví dụ cụ thể khi thảo luận về các phần cần thay đổi. Ví dụ, nếu có lỗi về logic, hãy chỉ ra phần mã cụ thể và đề xuất cách khắc phục.

Khuyến khích và ghi nhận nỗ lực: Khi có đóng góp tốt hoặc phát hiện một tính năng mới có giá trị, hãy công nhận đóng góp đó. Điều này giúp động viên các thành viên và tạo môi trường làm việc tích cực.

Sử dụng ngôn ngữ dễ hiểu: Cố gắng tránh các thuật ngữ quá kỹ thuật hoặc không cần thiết. Nếu sử dụng các thuật ngữ phức tạp, hãy đảm bảo giải thích hoặc cung cấp thêm thông tin để đảm bảo sự nhất quán và dễ hiểu cho tất cả thành viên.

Chú trọng vào cải tiến và tính bền vững: Bất cứ thay đổi nào được đề xuất đều nên chú trọng đến khả năng mở rộng và duy trì mã nguồn, cũng như ảnh hưởng đến các phần khác của hệ thống.

app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/true_false/component/TrueFalseFlashcardFinish.kt (1)

Pattern **/*.kt: Thân thiện, chuyên nghiệp: Các nhận xét cần khách quan, lịch sự, tránh giọng điệu chỉ trích. Đề xuất cách cải thiện nếu thấy cần thiết, thay vì chỉ ra lỗi mà không có hướng dẫn.

Trọng tâm và hiệu quả: Nêu rõ ràng vấn đề chính, không đi quá chi tiết nếu không cần thiết, và đưa ra ví dụ cụ thể khi thảo luận về các phần cần thay đổi. Ví dụ, nếu có lỗi về logic, hãy chỉ ra phần mã cụ thể và đề xuất cách khắc phục.

Khuyến khích và ghi nhận nỗ lực: Khi có đóng góp tốt hoặc phát hiện một tính năng mới có giá trị, hãy công nhận đóng góp đó. Điều này giúp động viên các thành viên và tạo môi trường làm việc tích cực.

Sử dụng ngôn ngữ dễ hiểu: Cố gắng tránh các thuật ngữ quá kỹ thuật hoặc không cần thiết. Nếu sử dụng các thuật ngữ phức tạp, hãy đảm bảo giải thích hoặc cung cấp thêm thông tin để đảm bảo sự nhất quán và dễ hiểu cho tất cả thành viên.

Chú trọng vào cải tiến và tính bền vững: Bất cứ thay đổi nào được đề xuất đều nên chú trọng đến khả năng mở rộng và duy trì mã nguồn, cũng như ảnh hưởng đến các phần khác của hệ thống.

app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/quiz/component/QuizView.kt (1)

Pattern **/*.kt: Thân thiện, chuyên nghiệp: Các nhận xét cần khách quan, lịch sự, tránh giọng điệu chỉ trích. Đề xuất cách cải thiện nếu thấy cần thiết, thay vì chỉ ra lỗi mà không có hướng dẫn.

Trọng tâm và hiệu quả: Nêu rõ ràng vấn đề chính, không đi quá chi tiết nếu không cần thiết, và đưa ra ví dụ cụ thể khi thảo luận về các phần cần thay đổi. Ví dụ, nếu có lỗi về logic, hãy chỉ ra phần mã cụ thể và đề xuất cách khắc phục.

Khuyến khích và ghi nhận nỗ lực: Khi có đóng góp tốt hoặc phát hiện một tính năng mới có giá trị, hãy công nhận đóng góp đó. Điều này giúp động viên các thành viên và tạo môi trường làm việc tích cực.

Sử dụng ngôn ngữ dễ hiểu: Cố gắng tránh các thuật ngữ quá kỹ thuật hoặc không cần thiết. Nếu sử dụng các thuật ngữ phức tạp, hãy đảm bảo giải thích hoặc cung cấp thêm thông tin để đảm bảo sự nhất quán và dễ hiểu cho tất cả thành viên.

Chú trọng vào cải tiến và tính bền vững: Bất cứ thay đổi nào được đề xuất đều nên chú trọng đến khả năng mở rộng và duy trì mã nguồn, cũng như ảnh hưởng đến các phần khác của hệ thống.

app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/flip/component/StudyFlipCard.kt (1)

Pattern **/*.kt: Thân thiện, chuyên nghiệp: Các nhận xét cần khách quan, lịch sự, tránh giọng điệu chỉ trích. Đề xuất cách cải thiện nếu thấy cần thiết, thay vì chỉ ra lỗi mà không có hướng dẫn.

Trọng tâm và hiệu quả: Nêu rõ ràng vấn đề chính, không đi quá chi tiết nếu không cần thiết, và đưa ra ví dụ cụ thể khi thảo luận về các phần cần thay đổi. Ví dụ, nếu có lỗi về logic, hãy chỉ ra phần mã cụ thể và đề xuất cách khắc phục.

Khuyến khích và ghi nhận nỗ lực: Khi có đóng góp tốt hoặc phát hiện một tính năng mới có giá trị, hãy công nhận đóng góp đó. Điều này giúp động viên các thành viên và tạo môi trường làm việc tích cực.

Sử dụng ngôn ngữ dễ hiểu: Cố gắng tránh các thuật ngữ quá kỹ thuật hoặc không cần thiết. Nếu sử dụng các thuật ngữ phức tạp, hãy đảm bảo giải thích hoặc cung cấp thêm thông tin để đảm bảo sự nhất quán và dễ hiểu cho tất cả thành viên.

Chú trọng vào cải tiến và tính bền vững: Bất cứ thay đổi nào được đề xuất đều nên chú trọng đến khả năng mở rộng và duy trì mã nguồn, cũng như ảnh hưởng đến các phần khác của hệ thống.

app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/flip/FlipFlashCardScreen.kt (1)

Pattern **/*.kt: Thân thiện, chuyên nghiệp: Các nhận xét cần khách quan, lịch sự, tránh giọng điệu chỉ trích. Đề xuất cách cải thiện nếu thấy cần thiết, thay vì chỉ ra lỗi mà không có hướng dẫn.

Trọng tâm và hiệu quả: Nêu rõ ràng vấn đề chính, không đi quá chi tiết nếu không cần thiết, và đưa ra ví dụ cụ thể khi thảo luận về các phần cần thay đổi. Ví dụ, nếu có lỗi về logic, hãy chỉ ra phần mã cụ thể và đề xuất cách khắc phục.

Khuyến khích và ghi nhận nỗ lực: Khi có đóng góp tốt hoặc phát hiện một tính năng mới có giá trị, hãy công nhận đóng góp đó. Điều này giúp động viên các thành viên và tạo môi trường làm việc tích cực.

Sử dụng ngôn ngữ dễ hiểu: Cố gắng tránh các thuật ngữ quá kỹ thuật hoặc không cần thiết. Nếu sử dụng các thuật ngữ phức tạp, hãy đảm bảo giải thích hoặc cung cấp thêm thông tin để đảm bảo sự nhất quán và dễ hiểu cho tất cả thành viên.

Chú trọng vào cải tiến và tính bền vững: Bất cứ thay đổi nào được đề xuất đều nên chú trọng đến khả năng mở rộng và duy trì mã nguồn, cũng như ảnh hưởng đến các phần khác của hệ thống.

app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/true_false/LearnByTrueFalseScreen.kt (1)

Pattern **/*.kt: Thân thiện, chuyên nghiệp: Các nhận xét cần khách quan, lịch sự, tránh giọng điệu chỉ trích. Đề xuất cách cải thiện nếu thấy cần thiết, thay vì chỉ ra lỗi mà không có hướng dẫn.

Trọng tâm và hiệu quả: Nêu rõ ràng vấn đề chính, không đi quá chi tiết nếu không cần thiết, và đưa ra ví dụ cụ thể khi thảo luận về các phần cần thay đổi. Ví dụ, nếu có lỗi về logic, hãy chỉ ra phần mã cụ thể và đề xuất cách khắc phục.

Khuyến khích và ghi nhận nỗ lực: Khi có đóng góp tốt hoặc phát hiện một tính năng mới có giá trị, hãy công nhận đóng góp đó. Điều này giúp động viên các thành viên và tạo môi trường làm việc tích cực.

Sử dụng ngôn ngữ dễ hiểu: Cố gắng tránh các thuật ngữ quá kỹ thuật hoặc không cần thiết. Nếu sử dụng các thuật ngữ phức tạp, hãy đảm bảo giải thích hoặc cung cấp thêm thông tin để đảm bảo sự nhất quán và dễ hiểu cho tất cả thành viên.

Chú trọng vào cải tiến và tính bền vững: Bất cứ thay đổi nào được đề xuất đều nên chú trọng đến khả năng mở rộng và duy trì mã nguồn, cũng như ảnh hưởng đến các phần khác của hệ thống.

app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/component/StudyTopAppBar.kt (1)

Pattern **/*.kt: Thân thiện, chuyên nghiệp: Các nhận xét cần khách quan, lịch sự, tránh giọng điệu chỉ trích. Đề xuất cách cải thiện nếu thấy cần thiết, thay vì chỉ ra lỗi mà không có hướng dẫn.

Trọng tâm và hiệu quả: Nêu rõ ràng vấn đề chính, không đi quá chi tiết nếu không cần thiết, và đưa ra ví dụ cụ thể khi thảo luận về các phần cần thay đổi. Ví dụ, nếu có lỗi về logic, hãy chỉ ra phần mã cụ thể và đề xuất cách khắc phục.

Khuyến khích và ghi nhận nỗ lực: Khi có đóng góp tốt hoặc phát hiện một tính năng mới có giá trị, hãy công nhận đóng góp đó. Điều này giúp động viên các thành viên và tạo môi trường làm việc tích cực.

Sử dụng ngôn ngữ dễ hiểu: Cố gắng tránh các thuật ngữ quá kỹ thuật hoặc không cần thiết. Nếu sử dụng các thuật ngữ phức tạp, hãy đảm bảo giải thích hoặc cung cấp thêm thông tin để đảm bảo sự nhất quán và dễ hiểu cho tất cả thành viên.

Chú trọng vào cải tiến và tính bền vững: Bất cứ thay đổi nào được đề xuất đều nên chú trọng đến khả năng mở rộng và duy trì mã nguồn, cũng như ảnh hưởng đến các phần khác của hệ thống.

app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/quiz/component/QuizFlashCardFinish.kt (1)

Pattern **/*.kt: Thân thiện, chuyên nghiệp: Các nhận xét cần khách quan, lịch sự, tránh giọng điệu chỉ trích. Đề xuất cách cải thiện nếu thấy cần thiết, thay vì chỉ ra lỗi mà không có hướng dẫn.

Trọng tâm và hiệu quả: Nêu rõ ràng vấn đề chính, không đi quá chi tiết nếu không cần thiết, và đưa ra ví dụ cụ thể khi thảo luận về các phần cần thay đổi. Ví dụ, nếu có lỗi về logic, hãy chỉ ra phần mã cụ thể và đề xuất cách khắc phục.

Khuyến khích và ghi nhận nỗ lực: Khi có đóng góp tốt hoặc phát hiện một tính năng mới có giá trị, hãy công nhận đóng góp đó. Điều này giúp động viên các thành viên và tạo môi trường làm việc tích cực.

Sử dụng ngôn ngữ dễ hiểu: Cố gắng tránh các thuật ngữ quá kỹ thuật hoặc không cần thiết. Nếu sử dụng các thuật ngữ phức tạp, hãy đảm bảo giải thích hoặc cung cấp thêm thông tin để đảm bảo sự nhất quán và dễ hiểu cho tất cả thành viên.

Chú trọng vào cải tiến và tính bền vững: Bất cứ thay đổi nào được đề xuất đều nên chú trọng đến khả năng mở rộng và duy trì mã nguồn, cũng như ảnh hưởng đến các phần khác của hệ thống.

app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/write/LearnByWriteScreen.kt (1)

Pattern **/*.kt: Thân thiện, chuyên nghiệp: Các nhận xét cần khách quan, lịch sự, tránh giọng điệu chỉ trích. Đề xuất cách cải thiện nếu thấy cần thiết, thay vì chỉ ra lỗi mà không có hướng dẫn.

Trọng tâm và hiệu quả: Nêu rõ ràng vấn đề chính, không đi quá chi tiết nếu không cần thiết, và đưa ra ví dụ cụ thể khi thảo luận về các phần cần thay đổi. Ví dụ, nếu có lỗi về logic, hãy chỉ ra phần mã cụ thể và đề xuất cách khắc phục.

Khuyến khích và ghi nhận nỗ lực: Khi có đóng góp tốt hoặc phát hiện một tính năng mới có giá trị, hãy công nhận đóng góp đó. Điều này giúp động viên các thành viên và tạo môi trường làm việc tích cực.

Sử dụng ngôn ngữ dễ hiểu: Cố gắng tránh các thuật ngữ quá kỹ thuật hoặc không cần thiết. Nếu sử dụng các thuật ngữ phức tạp, hãy đảm bảo giải thích hoặc cung cấp thêm thông tin để đảm bảo sự nhất quán và dễ hiểu cho tất cả thành viên.

Chú trọng vào cải tiến và tính bền vững: Bất cứ thay đổi nào được đề xuất đều nên chú trọng đến khả năng mở rộng và duy trì mã nguồn, cũng như ảnh hưởng đến các phần khác của hệ thống.

app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/quiz/LearnByQuizScreen.kt (1)

Pattern **/*.kt: Thân thiện, chuyên nghiệp: Các nhận xét cần khách quan, lịch sự, tránh giọng điệu chỉ trích. Đề xuất cách cải thiện nếu thấy cần thiết, thay vì chỉ ra lỗi mà không có hướng dẫn.

Trọng tâm và hiệu quả: Nêu rõ ràng vấn đề chính, không đi quá chi tiết nếu không cần thiết, và đưa ra ví dụ cụ thể khi thảo luận về các phần cần thay đổi. Ví dụ, nếu có lỗi về logic, hãy chỉ ra phần mã cụ thể và đề xuất cách khắc phục.

Khuyến khích và ghi nhận nỗ lực: Khi có đóng góp tốt hoặc phát hiện một tính năng mới có giá trị, hãy công nhận đóng góp đó. Điều này giúp động viên các thành viên và tạo môi trường làm việc tích cực.

Sử dụng ngôn ngữ dễ hiểu: Cố gắng tránh các thuật ngữ quá kỹ thuật hoặc không cần thiết. Nếu sử dụng các thuật ngữ phức tạp, hãy đảm bảo giải thích hoặc cung cấp thêm thông tin để đảm bảo sự nhất quán và dễ hiểu cho tất cả thành viên.

Chú trọng vào cải tiến và tính bền vững: Bất cứ thay đổi nào được đề xuất đều nên chú trọng đến khả năng mở rộng và duy trì mã nguồn, cũng như ảnh hưởng đến các phần khác của hệ thống.

app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/flip/component/FlipFlashCardFinish.kt (1)

Pattern **/*.kt: Thân thiện, chuyên nghiệp: Các nhận xét cần khách quan, lịch sự, tránh giọng điệu chỉ trích. Đề xuất cách cải thiện nếu thấy cần thiết, thay vì chỉ ra lỗi mà không có hướng dẫn.

Trọng tâm và hiệu quả: Nêu rõ ràng vấn đề chính, không đi quá chi tiết nếu không cần thiết, và đưa ra ví dụ cụ thể khi thảo luận về các phần cần thay đổi. Ví dụ, nếu có lỗi về logic, hãy chỉ ra phần mã cụ thể và đề xuất cách khắc phục.

Khuyến khích và ghi nhận nỗ lực: Khi có đóng góp tốt hoặc phát hiện một tính năng mới có giá trị, hãy công nhận đóng góp đó. Điều này giúp động viên các thành viên và tạo môi trường làm việc tích cực.

Sử dụng ngôn ngữ dễ hiểu: Cố gắng tránh các thuật ngữ quá kỹ thuật hoặc không cần thiết. Nếu sử dụng các thuật ngữ phức tạp, hãy đảm bảo giải thích hoặc cung cấp thêm thông tin để đảm bảo sự nhất quán và dễ hiểu cho tất cả thành viên.

Chú trọng vào cải tiến và tính bền vững: Bất cứ thay đổi nào được đề xuất đều nên chú trọng đến khả năng mở rộng và duy trì mã nguồn, cũng như ảnh hưởng đến các phần khác của hệ thống.

🔇 Additional comments (12)
app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/true_false/component/TrueFalseFlashcardFinish.kt (2)

77-81: Thay đổi text sang resource strings rất tốt!

Việc chuyển các message khuyến khích sang string resources giúp ứng dụng dễ dàng hỗ trợ đa ngôn ngữ.


Line range hint 83-357: Cấu trúc UI và quản lý state tốt!

  • Sử dụng remember đúng cách cho dialog state
  • Tuân thủ Material Design guidelines
  • Xử lý ảnh phù hợp với null safety
app/src/main/res/values/strings.xml (1)

377-424: LGTM! String resources are well-structured.

The added string resources follow consistent naming conventions, proper XML formatting, and correct placeholder usage.

app/src/main/res/values-vi/strings.xml (1)

374-421: LGTM! Vietnamese translations are complete and well-formatted.

All new strings have been properly translated while maintaining:

  • Consistent string IDs with English version
  • Proper placeholder formatting
  • Correct XML syntax and escaping
app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/write/LearnByWriteScreen.kt (4)

166-169: LGTM! Đã thay thế text cứng bằng string resource

Việc sử dụng stringResource() đã được thực hiện đúng cách cho các text loading và finished.


304-304: LGTM! Đã thay thế placeholder text bằng string resource

Việc sử dụng stringResource() cho placeholder text đã được thực hiện đúng cách.


325-325: LGTM! Đã thay thế button text bằng string resource

Việc sử dụng stringResource() cho text "Don't know" đã được thực hiện đúng cách.


424-424: LGTM! Đã thay thế hint text bằng string resource

Việc sử dụng stringResource() cho hint text đã được thực hiện đúng cách.

app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/flip/FlipFlashCardScreen.kt (1)

384-386: ⚠️ Potential issue

Thêm kiểm tra null safety cho explanation

Tương tự như hint, cần thêm kiểm tra null cho explanation.

-if (flashCards.getOrNull(currentCardIndex)?.explanation?.isNotEmpty() == true && isFlipCard) {
+if (!flashCards.getOrNull(currentCardIndex)?.explanation.isNullOrEmpty() && isFlipCard) {

Likely invalid or redundant comment.

app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/quiz/component/QuizFlashCardFinish.kt (1)

243-246: Tốt! Đã xử lý đúng string resource có tham số

Cách sử dụng stringResource với tham số wrongAnswerCount đã được implement đúng cách.

app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/quiz/component/QuizView.kt (1)

21-21: LGTM! Imports được thêm vào phù hợp

Các import mới được thêm vào đúng vị trí và cần thiết cho việc sử dụng string resources.

Also applies to: 25-25

app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/write/component/WriteFlashcardFinish.kt (1)

Line range hint 151-177: Kiểm tra logic xử lý số lượng flashcard

Việc sử dụng coerceAtLeast(0) cho thấy có thể có vấn đề với logic tính toán ở upstream khiến count có thể âm. Cần kiểm tra logic tính toán correctAnswerCountwrongAnswerCount.

Comment on lines +152 to 156
true -> Text(stringResource(R.string.txt_loading))
false -> when (isEndOfList) {
false -> Text("${currentCardIndex + 1}/${flashCardList.size}")
true -> Text("Finished")
true -> Text(stringResource(R.string.txt_finished))
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Cần đồng bộ việc sử dụng stringResource

Phát hiện việc sử dụng không nhất quán của stringResource. Trong khi loading và finished text đã được localize, text hiển thị số thứ tự "${currentCardIndex + 1}/${flashCardList.size}" vẫn đang hardcode.

Đề xuất sửa như sau:

true -> Text(stringResource(R.string.txt_loading))
false -> when (isEndOfList) {
-    false -> Text("${currentCardIndex + 1}/${flashCardList.size}")
+    false -> Text(
+        text = stringResource(
+            R.string.txt_progress_format,
+            currentCardIndex + 1,
+            flashCardList.size
+        )
+    )
    true -> Text(stringResource(R.string.txt_finished))
}

Committable suggestion skipped: line range outside the PR's diff.

Comment on lines 374 to 376
studySetColor = studySetColor,
title = "Show Hint"
title = stringResource(R.string.txt_show_hint)
)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Thêm kiểm tra null safety cho hint

Hiện tại chỉ kiểm tra isNotEmpty() mà chưa kiểm tra null, có thể gây ra NullPointerException.

-if (flashCards.getOrNull(currentCardIndex)?.hint?.isNotEmpty() == true && !isFlipCard) {
+if (!flashCards.getOrNull(currentCardIndex)?.hint.isNullOrEmpty() && !isFlipCard) {

Committable suggestion skipped: line range outside the PR's diff.

Comment on lines +77 to +81
correctAnswerCount == 0 -> stringResource(R.string.txt_don_t_give_up_keep_trying)
correctAnswerCount <= flashCardSize * 0.3 -> stringResource(R.string.txt_good_start_keep_going)
correctAnswerCount <= flashCardSize * 0.6 -> stringResource(R.string.txt_you_re_doing_great_keep_it_up)
correctAnswerCount < flashCardSize -> stringResource(R.string.txt_almost_there_keep_pushing)
else -> stringResource(R.string.txt_excellent_you_ve_mastered_it)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Chú ý điều kiện biên trong logic phân loại kết quả

Các điều kiện hiện tại có thể gây nhầm lẫn ở giá trị biên. Ví dụ:

  • Khi correctAnswerCount = flashCardSize * 0.3, sẽ thỏa mãn cả 2 điều kiện
  • Tương tự với giá trị 0.6

Đề xuất sửa lại như sau để rõ ràng hơn:

- correctAnswerCount <= flashCardSize * 0.3 -> stringResource(R.string.txt_good_start_keep_going)
- correctAnswerCount <= flashCardSize * 0.6 -> stringResource(R.string.txt_you_re_doing_great_keep_it_up)
+ correctAnswerCount < flashCardSize * 0.3 -> stringResource(R.string.txt_good_start_keep_going)
+ correctAnswerCount < flashCardSize * 0.6 -> stringResource(R.string.txt_you_re_doing_great_keep_it_up)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
correctAnswerCount == 0 -> stringResource(R.string.txt_don_t_give_up_keep_trying)
correctAnswerCount <= flashCardSize * 0.3 -> stringResource(R.string.txt_good_start_keep_going)
correctAnswerCount <= flashCardSize * 0.6 -> stringResource(R.string.txt_you_re_doing_great_keep_it_up)
correctAnswerCount < flashCardSize -> stringResource(R.string.txt_almost_there_keep_pushing)
else -> stringResource(R.string.txt_excellent_you_ve_mastered_it)
correctAnswerCount == 0 -> stringResource(R.string.txt_don_t_give_up_keep_trying)
correctAnswerCount < flashCardSize * 0.3 -> stringResource(R.string.txt_good_start_keep_going)
correctAnswerCount < flashCardSize * 0.6 -> stringResource(R.string.txt_you_re_doing_great_keep_it_up)
correctAnswerCount < flashCardSize -> stringResource(R.string.txt_almost_there_keep_pushing)
else -> stringResource(R.string.txt_excellent_you_ve_mastered_it)

Comment on lines +43 to +54
val correctMessages = listOf(
stringResource(R.string.txt_great_job),
stringResource(R.string.txt_well_done),
stringResource(R.string.txt_correct),
stringResource(R.string.txt_nice_work)
)
val incorrectMessages = listOf(
stringResource(R.string.txt_try_again),
stringResource(R.string.txt_incorrect),
stringResource(R.string.txt_not_quite),
stringResource(R.string.txt_keep_trying)
)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Đề xuất tối ưu hiệu suất cho danh sách messages

Các danh sách correctMessagesincorrectMessages đang được tạo lại mỗi khi composable recompose. Để tối ưu hiệu suất, chúng ta nên:

  1. Di chuyển các danh sách này ra ngoài composable function
  2. Sử dụng remember để cache lại giá trị

Đề xuất refactor như sau:

+ private val correctMessageIds = listOf(
+     R.string.txt_great_job,
+     R.string.txt_well_done,
+     R.string.txt_correct,
+     R.string.txt_nice_work
+ )
+ 
+ private val incorrectMessageIds = listOf(
+     R.string.txt_try_again,
+     R.string.txt_incorrect,
+     R.string.txt_not_quite,
+     R.string.txt_keep_trying
+ )

@Composable
fun QuizView(...) {
-    val correctMessages = listOf(
-        stringResource(R.string.txt_great_job),
-        stringResource(R.string.txt_well_done),
-        stringResource(R.string.txt_correct),
-        stringResource(R.string.txt_nice_work)
-    )
-    val incorrectMessages = listOf(
-        stringResource(R.string.txt_try_again),
-        stringResource(R.string.txt_incorrect),
-        stringResource(R.string.txt_not_quite),
-        stringResource(R.string.txt_keep_trying)
-    )
+    val correctMessages = remember {
+        correctMessageIds.map { stringResource(it) }
+    }
+    val incorrectMessages = remember {
+        incorrectMessageIds.map { stringResource(it) }
+    }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
val correctMessages = listOf(
stringResource(R.string.txt_great_job),
stringResource(R.string.txt_well_done),
stringResource(R.string.txt_correct),
stringResource(R.string.txt_nice_work)
)
val incorrectMessages = listOf(
stringResource(R.string.txt_try_again),
stringResource(R.string.txt_incorrect),
stringResource(R.string.txt_not_quite),
stringResource(R.string.txt_keep_trying)
)
private val correctMessageIds = listOf(
R.string.txt_great_job,
R.string.txt_well_done,
R.string.txt_correct,
R.string.txt_nice_work
)
private val incorrectMessageIds = listOf(
R.string.txt_try_again,
R.string.txt_incorrect,
R.string.txt_not_quite,
R.string.txt_keep_trying
)
@Composable
fun QuizView(...) {
val correctMessages = remember {
correctMessageIds.map { stringResource(it) }
}
val incorrectMessages = remember {
incorrectMessageIds.map { stringResource(it) }
}

@nqmgaming nqmgaming changed the title feat(feat/language): đa ngôn ngữ ở màn học feat(language): đa ngôn ngữ ở màn học Dec 2, 2024
@nqmgaming nqmgaming merged commit 586d646 into main Dec 2, 2024
2 of 3 checks passed
@nqmgaming nqmgaming deleted the feat/language branch December 2, 2024 15:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
Status: No status
Development

Successfully merging this pull request may close these issues.

2 participants