Fixes issue #1: fixed hardcoded strings#41
Conversation
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (4)
✅ Files skipped from review due to trivial changes (2)
🚧 Files skipped from review as they are similar to previous changes (2)
WalkthroughMoved hardcoded UI and runtime strings from Kotlin and XML layouts into Android string resources; updated MainActivity to use resource-backed alarm keys and localized log formatting; added new string entries; upgraded Android Gradle Plugin and Gradle wrapper versions. Changes
Estimated code review effort🎯 2 (Simple) | ⏱️ ~10 minutes Possibly related issues
🚥 Pre-merge checks | ✅ 2 | ❌ 3❌ Failed checks (3 warnings)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Pull request overview
This pull request aims to improve localization support by replacing hardcoded UI strings with strings.xml resources, while also updating build tooling versions.
Changes:
- Migrated several hardcoded strings in layout XML and
MainActivity.ktto@string/...resources. - Added multiple new string resources (meal labels, day names, button labels, log/toast text) to
strings.xml. - Upgraded Gradle wrapper and Android Gradle Plugin (AGP) versions.
Reviewed changes
Copilot reviewed 13 out of 13 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
gradle/wrapper/gradle-wrapper.properties |
Upgrades Gradle wrapper distribution URL/version. |
gradle/libs.versions.toml |
Bumps AGP version in version catalog. |
app/src/main/res/values/strings.xml |
Adds new string resources used by Kotlin and layout XML changes. |
app/src/main/res/layout/fragment_details.xml |
Replaces hardcoded “Done” with @string/done. |
app/src/main/res/layout/edit_dialog.xml |
Replaces hardcoded “Done” with @string/done. |
app/src/main/res/layout/dateitem.xml |
Replaces hardcoded “Day” with @string/day. |
app/src/main/res/layout/activity_show_menu.xml |
Replaces hardcoded day/meal/navigation labels with string resources. |
app/src/main/res/layout/activity_settings.xml |
Replaces hardcoded “Done” with @string/done. |
app/src/main/res/layout/activity_review.xml |
Replaces hardcoded hints/defaults with string resources. |
app/src/main/res/layout/activity_payment.xml |
Replaces hardcoded contentDescription/hints/button text with string resources. |
app/src/main/res/layout/activity_menu.xml |
Replaces hardcoded day/meal/navigation labels with string resources. |
app/src/main/res/layout/activity_edit_complete.xml |
Localizes “Download edited Menu”; adjusts “Send Menu…” text (still hardcoded). |
app/src/main/java/com/theayushyadav11/MessEase/MainActivity.kt |
Replaces hardcoded toast/dialog/log strings with string resources; changes alarm settings key/default handling. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| val times = listOf( | ||
| mess.get("bt", "7:30"), | ||
| mess.get("lt", "12:0"), | ||
| mess.get("st", "16:30"), | ||
| mess.get("dt", "19:0") | ||
| mess.get(getString(R.string.breakfast_time),getString(R.string.b_time)), | ||
| mess.get(getString(R.string.lunch_time),getString(R.string.l_time)), | ||
| mess.get(getString(R.string.snack_time),getString(R.string.s_time)), | ||
| mess.get(getString(R.string.dinner_time),getString(R.string.d_time)) | ||
| ) |
There was a problem hiding this comment.
mess.get(getString(R.string.*_time), ...) uses string resources as preference keys (e.g., "bt", "lt"). Because string resources are translatable by default, localizing these values can change the stored keys and break reading/writing alarm times across locales. Prefer keeping these keys as non-localized constants (e.g., in a Constants object) or, if they must remain resources, mark them translatable="false" and avoid exposing them to translators.
| mess.log(String.format( | ||
| getString(R.string.setting_alarms_log), times[0], times[1], times[2], times[3])) |
There was a problem hiding this comment.
For a formatted string resource with placeholders, prefer getString(R.string.setting_alarms_log, ...) instead of String.format(getString(...), ...). This ensures proper locale-aware formatting and avoids lint issues around string formatting.
| mess.log(String.format( | |
| getString(R.string.setting_alarms_log), times[0], times[1], times[2], times[3])) | |
| mess.log( | |
| getString(R.string.setting_alarms_log, times[0], times[1], times[2], times[3]) | |
| ) |
| android:layout_marginBottom="45dp" | ||
| android:drawableEnd="@drawable/baseline_send_24" | ||
| android:text="Send Menu for Approoval" | ||
| android:text="Send Menu for Approval" |
There was a problem hiding this comment.
This button text is still hardcoded, which defeats the localization goal of the PR. It looks like @string/menu_approval was added and should be referenced here instead (and it would also keep the spelling fix consistent).
| android:text="Send Menu for Approval" | |
| android:text="@string/menu_approval" |
| <string name="menu_know_our_team">Know our team\n</string> | ||
| <string name="demolunch">Marry had a little lamb.</string> | ||
|
|
||
|
|
There was a problem hiding this comment.
There are two consecutive blank lines here; please remove the extra whitespace to keep strings.xml tidy and minimize noisy diffs.
| distributionPath=wrapper/dists | ||
| distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip | ||
| distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip |
There was a problem hiding this comment.
This PR is described as moving hardcoded UI strings into strings.xml, but it also upgrades the Gradle wrapper. If this is intentional, please call it out in the PR description (and ideally separate it into its own PR) since build tool upgrades can have wider impact/required follow-up changes.
| [versions] | ||
| agp = "8.6.1" | ||
| agp = "8.13.2" |
There was a problem hiding this comment.
Along with string localization, this change upgrades the Android Gradle Plugin version. Please confirm the upgrade is intended and either document it in the PR description or split it out, since AGP bumps can require additional project-wide adjustments.
There was a problem hiding this comment.
Actionable comments posted: 6
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
app/src/main/res/layout/activity_show_menu.xml (1)
81-97:⚠️ Potential issue | 🟠 MajorMissed literals: Thursday and Snacks are still hardcoded.
Most labels are localized, but Line 129 and Line 402 still use raw text, which breaks full localization for this screen.
🔧 Suggested change
- android:text="Thursday" + android:text="@string/thursday" - android:text="Snacks" + android:text="@string/snacks"Also add
snackstoapp/src/main/res/values/strings.xml.Also applies to: 145-160, 192-193, 297-298, 508-509
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@app/src/main/res/layout/activity_show_menu.xml` around lines 81 - 97, Replace hardcoded text literals for "Thursday" and "Snacks" in the layout by using string resources (e.g., android:text="@string/thursday" and android:text="@string/snacks") wherever those raw texts currently appear (search for TextView ids like thursday, snacks or literal "Thursday"/"Snacks" in activity_show_menu.xml and the other mentioned occurrences). Add corresponding entries "thursday" and "snacks" to app/src/main/res/values/strings.xml with translated/default values. Ensure any other occurrences (e.g., other TextView elements or attributes in the same layout) reference the new string resource keys so the screen is fully localizable.app/src/main/res/layout/activity_menu.xml (1)
81-176:⚠️ Potential issue | 🟡 MinorLocalization migration is still incomplete in this screen.
There are still hardcoded user-facing strings in the same layout (e.g., Line 129
"Thursday", Line 402"Snacks", plus other literals like Line 64 and Line 624). Please move these tostrings.xmlto fully satisfy Issue#1.Also applies to: 192-508
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@app/src/main/res/layout/activity_menu.xml` around lines 81 - 176, Several user-facing strings are still hardcoded in this layout; replace them with string resources in strings.xml and reference them via `@string`. Specifically, move the TextView text "Thursday" for the view with id @+id/thursday into strings.xml (e.g., <string name="thursday">Thursday</string>) and update the layout to use android:text="@string/thursday"; also search the same file for other hardcoded literals mentioned in the review (e.g., the "Snacks" label and other literals around the indicated ranges) and convert each to string resources, updating their corresponding views (ids like @+id/snacks or any other TextView ids found) to use `@string` references. Ensure all user-visible text in this layout is referenced via strings.xml to complete the localization migration.
🧹 Nitpick comments (2)
app/src/main/res/values/strings.xml (1)
52-52: Use indexed placeholders for localization-safe formatting.At Line 52, prefer
%1$s,%2$s, etc., so translators can reorder sentence parts safely.🔧 Suggested change
- <string name="setting_alarms_log">Setting alarms: Breakfast %s, Lunch %s, Snack %s, Dinner %s</string> + <string name="setting_alarms_log">Setting alarms: Breakfast %1$s, Lunch %2$s, Snack %3$s, Dinner %4$s</string>🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@app/src/main/res/values/strings.xml` at line 52, The string resource setting_alarms_log uses non-indexed placeholders ("%s"); update it to use indexed placeholders so translators can reorder items safely—replace "%s" occurrences with "%1$s", "%2$s", "%3$s", "%4$s" respectively in the value of the string resource named setting_alarms_log and keep the surrounding text intact.app/src/main/java/com/theayushyadav11/MessEase/MainActivity.kt (1)
367-368: Use Android resource formatting API with arguments directly.Replace
String.format(getString(R.string.setting_alarms_log), ...)withgetString(R.string.setting_alarms_log, times[0], times[1], times[2], times[3]). This is the idiomatic approach in Android and keeps localization handling in one place.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@app/src/main/java/com/theayushyadav11/MessEase/MainActivity.kt` around lines 367 - 368, Replace the manual String.format call and pass the args directly to Android's resource formatting: in MainActivity.kt where mess.log(String.format(getString(R.string.setting_alarms_log), times[0], times[1], times[2], times[3])) is used, call getString(R.string.setting_alarms_log, times[0], times[1], times[2], times[3]) and pass that result to mess.log; update the reference to use the resource formatting API (getString with varargs) instead of wrapping getString in String.format.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@app/src/main/java/com/theayushyadav11/MessEase/MainActivity.kt`:
- Around line 361-364: The code is using localized resources as
SharedPreferences keys (e.g., calls to
mess.get(getString(R.string.breakfast_time), ...)) so saved times break when
locale changes; fix by replacing those getString(R.string.*) keys with stable,
non-localized keys (either string literals like "breakfast_time" or constants in
a companion/object) wherever you read or write prefs (notably the calls in
MainActivity.kt that invoke mess.get(...) and the occurrences in Mess.kt), and
ensure the default values still use localized strings
(getString(R.string.b_time) etc.) while the preference keys remain constant
across locales.
In `@app/src/main/res/layout/activity_edit_complete.xml`:
- Line 66: Replace the hardcoded android:text="Send Menu for Approval" in
activity_edit_complete.xml with the string resource reference
`@string/menu_approval` so the layout uses the localized resource (update the
android:text attribute where "Send Menu for Approval" appears).
In `@app/src/main/res/layout/activity_review.xml`:
- Around line 72-79: The layout activity_review.xml still contains hardcoded
user-facing text (e.g., android:text attributes for views like the
AutoCompleteTextView with id "day" and other text elements showing "Rate your
experience", "Share your thoughts", "Write a review", etc. around the shown
ranges); replace each literal string with a string resource reference
(android:text="@string/your_label") and add corresponding entries in strings.xml
(giving descriptive resource names like review_rate_experience,
review_share_thoughts, review_write_review, day_default) so all UI text uses
`@string/`... for localization; update any other hardcoded occurrences in the file
(including lines 88-96 and the shown lines) to follow the same pattern.
In `@app/src/main/res/layout/edit_dialog.xml`:
- Line 16: This layout still contains hardcoded android:text values "Updation"
and "Cancel" — replace those literals in edit_dialog.xml with string resource
references (e.g., android:text="@string/your_key_for_updation" and
android:text="@string/button_cancel") and add corresponding entries into
strings.xml (keys matching the references) so all UI text uses string resources;
ensure the keys are descriptive and consistent with the existing "@string/done"
usage.
In `@app/src/main/res/values/strings.xml`:
- Around line 44-51: The strings used as preference keys and default times
(e.g., "breakfast_time", "lunch_time", "snack_time", "dinner_time", "b_time",
"l_time", "s_time", "d_time") are being translated and must be marked
non-translatable so SharedPreferences lookups in Mess.kt (refs around the time
parsing calls) and MainActivity.kt (refs around alarm/default time usage) remain
stable; update those <string> definitions to include translatable="false" (or
move them to a non-translatable resource) so their values won’t change across
locales and preferences/alarm parsing continue to work.
In `@gradle/libs.versions.toml`:
- Line 2: Update the app's compilation settings to target Java 17 to match AGP
8.13.2: in app/build.gradle.kts update the compileOptions block (compileOptions)
to set sourceCompatibility and targetCompatibility to JavaVersion.VERSION_17 and
update kotlinOptions (kotlinOptions) to set jvmTarget to "17"; alternatively
configure a Gradle JVM toolchain by adding jvmToolchain(17) so Gradle manages
JDK 17 consistently for the project and CI/local builds.
---
Outside diff comments:
In `@app/src/main/res/layout/activity_menu.xml`:
- Around line 81-176: Several user-facing strings are still hardcoded in this
layout; replace them with string resources in strings.xml and reference them via
`@string`. Specifically, move the TextView text "Thursday" for the view with id
@+id/thursday into strings.xml (e.g., <string name="thursday">Thursday</string>)
and update the layout to use android:text="@string/thursday"; also search the
same file for other hardcoded literals mentioned in the review (e.g., the
"Snacks" label and other literals around the indicated ranges) and convert each
to string resources, updating their corresponding views (ids like @+id/snacks or
any other TextView ids found) to use `@string` references. Ensure all user-visible
text in this layout is referenced via strings.xml to complete the localization
migration.
In `@app/src/main/res/layout/activity_show_menu.xml`:
- Around line 81-97: Replace hardcoded text literals for "Thursday" and "Snacks"
in the layout by using string resources (e.g., android:text="@string/thursday"
and android:text="@string/snacks") wherever those raw texts currently appear
(search for TextView ids like thursday, snacks or literal "Thursday"/"Snacks" in
activity_show_menu.xml and the other mentioned occurrences). Add corresponding
entries "thursday" and "snacks" to app/src/main/res/values/strings.xml with
translated/default values. Ensure any other occurrences (e.g., other TextView
elements or attributes in the same layout) reference the new string resource
keys so the screen is fully localizable.
---
Nitpick comments:
In `@app/src/main/java/com/theayushyadav11/MessEase/MainActivity.kt`:
- Around line 367-368: Replace the manual String.format call and pass the args
directly to Android's resource formatting: in MainActivity.kt where
mess.log(String.format(getString(R.string.setting_alarms_log), times[0],
times[1], times[2], times[3])) is used, call
getString(R.string.setting_alarms_log, times[0], times[1], times[2], times[3])
and pass that result to mess.log; update the reference to use the resource
formatting API (getString with varargs) instead of wrapping getString in
String.format.
In `@app/src/main/res/values/strings.xml`:
- Line 52: The string resource setting_alarms_log uses non-indexed placeholders
("%s"); update it to use indexed placeholders so translators can reorder items
safely—replace "%s" occurrences with "%1$s", "%2$s", "%3$s", "%4$s" respectively
in the value of the string resource named setting_alarms_log and keep the
surrounding text intact.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: da0a61f7-235e-4ca9-a949-a69bf7f92c00
📒 Files selected for processing (13)
app/src/main/java/com/theayushyadav11/MessEase/MainActivity.ktapp/src/main/res/layout/activity_edit_complete.xmlapp/src/main/res/layout/activity_menu.xmlapp/src/main/res/layout/activity_payment.xmlapp/src/main/res/layout/activity_review.xmlapp/src/main/res/layout/activity_settings.xmlapp/src/main/res/layout/activity_show_menu.xmlapp/src/main/res/layout/dateitem.xmlapp/src/main/res/layout/edit_dialog.xmlapp/src/main/res/layout/fragment_details.xmlapp/src/main/res/values/strings.xmlgradle/libs.versions.tomlgradle/wrapper/gradle-wrapper.properties
| android:hint="@string/day"> | ||
| <AutoCompleteTextView | ||
| android:id="@+id/day" | ||
| android:textColor="@color/black" | ||
| android:layout_width="match_parent" | ||
| android:layout_height="wrap_content" | ||
| android:inputType="none" | ||
| android:text="Monday" /> | ||
| android:text="@string/monday" /> |
There was a problem hiding this comment.
Partial migration: several user-facing strings remain hardcoded in this layout.
The updated fields are good, but literals like Line 119 ("Rate your experience"), Line 147 ("Share your thoughts"), Line 174 ("Write a review"), Line 185, and Line 199 still need @string/... resources to complete localization.
Also applies to: 88-96
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@app/src/main/res/layout/activity_review.xml` around lines 72 - 79, The layout
activity_review.xml still contains hardcoded user-facing text (e.g.,
android:text attributes for views like the AutoCompleteTextView with id "day"
and other text elements showing "Rate your experience", "Share your thoughts",
"Write a review", etc. around the shown ranges); replace each literal string
with a string resource reference (android:text="@string/your_label") and add
corresponding entries in strings.xml (giving descriptive resource names like
review_rate_experience, review_share_thoughts, review_write_review, day_default)
so all UI text uses `@string/`... for localization; update any other hardcoded
occurrences in the file (including lines 88-96 and the shown lines) to follow
the same pattern.
| android:layout_margin="25dp" | ||
| android:backgroundTint="#2196F3" | ||
| android:text="Done" | ||
| android:text="@string/done" |
There was a problem hiding this comment.
Localization is still incomplete in this dialog.
Line 16 is fixed, but hardcoded UI text remains at Line 30 ("Updation") and Line 49 ("Cancel"), so this file still does not fully meet the string-extraction objective.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@app/src/main/res/layout/edit_dialog.xml` at line 16, This layout still
contains hardcoded android:text values "Updation" and "Cancel" — replace those
literals in edit_dialog.xml with string resource references (e.g.,
android:text="@string/your_key_for_updation" and
android:text="@string/button_cancel") and add corresponding entries into
strings.xml (keys matching the references) so all UI text uses string resources;
ensure the keys are descriptive and consistent with the existing "@string/done"
usage.
| @@ -1,5 +1,5 @@ | |||
| [versions] | |||
| agp = "8.6.1" | |||
| agp = "8.13.2" | |||
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Read-only verification: check whether JDK/toolchain compatibility is explicitly configured.
echo "== Candidate build/CI files =="
fd -i 'build.gradle'
fd -i 'build.gradle.kts'
fd -i 'settings.gradle'
fd -i 'settings.gradle.kts'
fd -i 'gradle.properties'
fd -i '.github'
fd -i '*.yml'
fd -i '*.yaml'
echo
echo "== Toolchain/JDK/AGP related config hits =="
rg -n --iglob '*build.gradle' --iglob '*build.gradle.kts' --iglob 'settings.gradle' --iglob 'settings.gradle.kts' \
--iglob 'gradle.properties' --iglob '*.yml' --iglob '*.yaml' \
'jvmToolchain|JavaVersion\.VERSION_17|sourceCompatibility|targetCompatibility|org\.gradle\.java\.home|actions/setup-java|com\.android\.application|com\.android\.library'Repository: iiitl/MessEase
Length of output: 1011
🏁 Script executed:
cat -n build.gradle.ktsRepository: iiitl/MessEase
Length of output: 462
🏁 Script executed:
cat -n app/build.gradle.ktsRepository: iiitl/MessEase
Length of output: 4776
🏁 Script executed:
cat -n gradle.propertiesRepository: iiitl/MessEase
Length of output: 1565
🏁 Script executed:
fd --glob '.github' --type dRepository: iiitl/MessEase
Length of output: 265
🏁 Script executed:
web_search
AGP 8.13.2 JDK Java version requirementsRepository: iiitl/MessEase
Length of output: 150
🏁 Script executed:
fd --hidden --glob '.github' --type dRepository: iiitl/MessEase
Length of output: 66
🌐 Web query:
AGP 8.13.2 minimum Java JDK version requirements
💡 Result:
The minimum Java JDK version required for Android Gradle Plugin (AGP) 8.13.2 is JDK 17. AGP 8.13.2 is a patch release of the 8.13 major version. The official Android developer documentation for AGP 8.13.0 explicitly states in its compatibility table that the minimum JDK version is 17 (with default also 17). This requirement is consistent across recent AGP 8.x versions (e.g., 8.8.0, 8.9.0, 8.11.0), and there is no indication of changes for patch releases like 8.13.2, which primarily adds Kotlin 2.3 support via updated R8. Gradle 8.13 (the minimum Gradle version for AGP 8.13) supports running on JVM 8-23, so JDK 17 is well within compatibility. To configure, set the JDK version in your project as per the official guide: https://developer.android.com/build/jdks.
Citations:
- 1: https://developer.android.com/build/releases/agp-8-13-0-release-notes
- 2: https://developer.android.com/build/kotlin-support
- 3: https://docs.gradle.org/8.13/userguide/compatibility.html
- 4: https://docs.gradle.org/current/userguide/compatibility.html
🏁 Script executed:
find .github -type f -name '*.yml' -o -name '*.yaml' | head -20Repository: iiitl/MessEase
Length of output: 87
🏁 Script executed:
fd --type f '.github' --extension yml --extension yamlRepository: iiitl/MessEase
Length of output: 40
🏁 Script executed:
cat -n .github/workflows/release.ymlRepository: iiitl/MessEase
Length of output: 6986
Update compileOptions and kotlinOptions to use Java 17, matching AGP 8.13.2 requirements.
AGP 8.13.2 requires JDK 17 minimum. The app's build.gradle.kts currently hard-pins sourceCompatibility, targetCompatibility, and jvmTarget to Java 1.8 (lines 41–46), creating a mismatch. While the CI workflow correctly sets up Java 17, local builds will be environment-dependent. Update app/build.gradle.kts to align compile settings with AGP requirements:
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}Alternatively, use jvmToolchain(17) for Gradle-managed JDK consistency across the project.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@gradle/libs.versions.toml` at line 2, Update the app's compilation settings
to target Java 17 to match AGP 8.13.2: in app/build.gradle.kts update the
compileOptions block (compileOptions) to set sourceCompatibility and
targetCompatibility to JavaVersion.VERSION_17 and update kotlinOptions
(kotlinOptions) to set jvmTarget to "17"; alternatively configure a Gradle JVM
toolchain by adding jvmToolchain(17) so Gradle manages JDK 17 consistently for
the project and CI/local builds.
|
@theayushyadav11 made the required changes |
|
Issues: SharedPreferences key change breaks existing data Using |
|
@namanhere23 made the changes. please go through |
|
Using Since string resources are translatable by default, their values may change across locales (e.g., "bt", "lt"), which can break key consistency when reading/writing stored values. It’s safer to:
This ensures stable keys regardless of language changes. |
Resolves #1.
Move strings from Kotlin files to strings.xml for Localization (additionally moved strings from ui xml files to string.xml as well)
Checkout
Summary by CodeRabbit
Bug Fixes
Localization
Chores