Skip to content

Add localization for E1, E5, and E10 features across 12 locales#473

Merged
rainxchzed merged 4 commits intomainfrom
app-full-localize
Apr 30, 2026
Merged

Add localization for E1, E5, and E10 features across 12 locales#473
rainxchzed merged 4 commits intomainfrom
app-full-localize

Conversation

@rainxchzed
Copy link
Copy Markdown
Member

@rainxchzed rainxchzed commented Apr 30, 2026

Adds translated strings to core:presentation supporting several feature workstreams: the External Import wizard (E1) including the unlink dialog, Download Mirroring (E5) with mirror testing, App List sorting (E10), the Feedback reporting system, and Pre-release channel UX.

Locales updated: ES, TR, ZH-rCN, KO, FR, HI, RU, JA, BN, AR, PL, and IT.

Summary by CodeRabbit

  • New Features

    • App sorting and filtering options
    • Pre-release beta channel controls
    • External app import wizard (scan, link, undo, progress/summary)
    • User feedback submission form (categories, diagnostics, send)
    • Download mirror selection, validation and testing
    • Unlink external app tracking
  • Localization

    • Added strings and plurals across Arabic, Bengali, Spanish, French, Hindi, Italian, Japanese, Korean, Polish, Russian, Turkish, Simplified Chinese
  • Bug Fixes

    • Standardized match-confidence display formatting (percent sign handling)

Adds translated strings to `core:presentation` supporting several feature workstreams: the External Import wizard (E1) including the unlink dialog, Download Mirroring (E5) with mirror testing, App List sorting (E10), the Feedback reporting system, and Pre-release channel UX.

Locales updated: ES, TR, ZH-rCN, KO, FR, HI, RU, JA, BN, AR, PL, and IT.
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 30, 2026

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 7eeda98c-8e23-47c1-aa09-26cacb52188f

📥 Commits

Reviewing files that changed from the base of the PR and between 4aeb537 and dcd9f17.

📒 Files selected for processing (15)
  • core/presentation/src/commonMain/composeResources/values-ar/strings-ar.xml
  • core/presentation/src/commonMain/composeResources/values-bn/strings-bn.xml
  • core/presentation/src/commonMain/composeResources/values-es/strings-es.xml
  • core/presentation/src/commonMain/composeResources/values-fr/strings-fr.xml
  • core/presentation/src/commonMain/composeResources/values-hi/strings-hi.xml
  • core/presentation/src/commonMain/composeResources/values-it/strings-it.xml
  • core/presentation/src/commonMain/composeResources/values-ja/strings-ja.xml
  • core/presentation/src/commonMain/composeResources/values-ko/strings-ko.xml
  • core/presentation/src/commonMain/composeResources/values-pl/strings-pl.xml
  • core/presentation/src/commonMain/composeResources/values-ru/strings-ru.xml
  • core/presentation/src/commonMain/composeResources/values-tr/strings-tr.xml
  • core/presentation/src/commonMain/composeResources/values-zh-rCN/strings-zh-rCN.xml
  • core/presentation/src/commonMain/composeResources/values/strings.xml
  • feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/import/components/CandidateCard.kt
  • feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/import/components/RepoCandidateRow.kt

Walkthrough

Adds many new localized Compose string/plural resources across multiple locales and adjusts confidence/percent formatting in core strings and two UI composables.

Changes

Cohort / File(s) Summary
Core strings change
core/presentation/src/commonMain/composeResources/values/strings.xml
Removed percent sign from two confidence-format strings (external_import_card_preselect_known, external_import_match_confidence_chip).
UI percent rendering
feature/apps/presentation/.../import/components/CandidateCard.kt, feature/apps/presentation/.../import/components/RepoCandidateRow.kt
UI now appends an explicit "%" to rendered confidence labels (minor formatting change in two composables).
Arabic
core/presentation/src/commonMain/composeResources/values-ar/strings-ar.xml
Adds ~198 lines of Arabic <string>/<plurals> for sorting, pre-release channel UI, external import wizard (progress, cards, search, permission, completion, undo/rescan), unlink dialog, feedback form, and mirror picker/testing/validation.
Other Localizations
core/presentation/src/commonMain/composeResources/values-bn/strings-bn.xml, core/presentation/src/commonMain/composeResources/values-es/strings-es.xml, core/presentation/src/commonMain/composeResources/values-fr/strings-fr.xml, core/presentation/src/commonMain/composeResources/values-hi/strings-hi.xml, core/presentation/src/commonMain/composeResources/values-it/strings-it.xml, core/presentation/src/commonMain/composeResources/values-ja/strings-ja.xml, core/presentation/src/commonMain/composeResources/values-ko/strings-ko.xml, core/presentation/src/commonMain/composeResources/values-pl/strings-pl.xml, core/presentation/src/commonMain/composeResources/values-ru/strings-ru.xml, core/presentation/src/commonMain/composeResources/values-tr/strings-tr.xml, core/presentation/src/commonMain/composeResources/values-zh-rCN/strings-zh-rCN.xml
Each file adds ~175–201 lines of new <string> and <plurals> entries mirroring the Arabic additions: app sorting, channel chips/actions, external import wizard (including pluralized counts/headlines), details unlink dialog, feedback form fields/results, and mirror picker/config/test UI across languages.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Poem

🐰 I hopped through XMLs, line by line,

seeding phrases in many tongues so fine,
wizards, mirrors, feedback bright,
percent signs chased into the light,
a rabbit’s patch of locales—done! ✨

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: adding localized strings for three feature workstreams (E1, E5, E10) across 12 locales, which matches the file modifications shown in the raw summary.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch app-full-localize

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.

❤️ Share
Review rate limit: 5/8 reviews remaining, refill in 16 minutes and 10 seconds.

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
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: 14

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@core/presentation/src/commonMain/composeResources/values-ar/strings-ar.xml`:
- Around line 806-814: The Arabic string resources use literal backslash-n
sequences; replace every double-escaped "\\n" and "\\n\\n" with actual newline
characters ("\n" and "\n\n") in the affected string entries (e.g.,
external_import_empty_all_matched, external_import_permission_body) so the
multiline text renders with real line breaks; update each string value
accordingly while keeping the existing text and quotes intact.
- Line 925: Replace the English label for the string resource named
mirror_status_down with its Arabic translation in the strings-ar XML (e.g., use
an appropriate Arabic phrase such as "(غير متصل)" or "(متوقف)"), ensuring you
update only the value inside <string name="mirror_status_down"> so the resource
matches the Arabic locale and preserves punctuation/parentheses and RTL
characters correctly.

In `@core/presentation/src/commonMain/composeResources/values-bn/strings-bn.xml`:
- Line 901: The string resource named "mirror_status_down" is still English;
update its value to the Bengali translation (e.g., replace "(down)" with the
appropriate Bengali word/phrase such as "(নিম্ন)" or the project's chosen term)
so it matches the localized adjacent status labels; edit the string for
mirror_status_down in the values-bn resource file and ensure it follows the same
punctuation/format as "mirror_status_up" and other status strings.
- Around line 798-806: The two string resources
external_import_empty_all_matched and external_import_permission_body contain
literal backslash-n sequences (\\n) so the UI will render "\n" instead of line
breaks; replace each literal "\\n" with a real escaped newline sequence "\n"
(i.e., change "\\n" to "\n" in the string values) so Android will render actual
newlines—update both external_import_empty_all_matched and
external_import_permission_body accordingly.

In `@core/presentation/src/commonMain/composeResources/values-es/strings-es.xml`:
- Around line 764-772: The Spanish string resources use literal escaped newlines
(\\n) which render as backslash-n instead of line breaks; update the affected
string values (e.g., external_import_empty_all_matched and
external_import_permission_body) to use real newlines in the XML value (replace
the "\\n" and "\\n\\n" sequences with actual line breaks) so the text displays
across lines as intended while preserving the surrounding XML element and
attribute names.

In `@core/presentation/src/commonMain/composeResources/values-fr/strings-fr.xml`:
- Around line 765-773: Replace the double-escaped newlines (\\n) in the French
string resources so they render as actual newlines: update string entries such
as external_import_empty_all_matched and external_import_permission_body to use
a single escaped newline (\n) or real line breaks instead of literal "\\n" so
the UI shows line breaks correctly; ensure any other occurrences in the same
diff (e.g., external_import_empty_no_apps_body) are fixed the same way.

In `@core/presentation/src/commonMain/composeResources/values-hi/strings-hi.xml`:
- Around line 803-811: The two string resources
external_import_empty_all_matched and external_import_permission_body contain
double-escaped newlines ("\\n"); replace the literal backslash-backslash-n
sequences with real newline escapes ("\n") so the platform renders actual line
breaks (update external_import_empty_all_matched and
external_import_permission_body to use \n instead of \\n).

In `@core/presentation/src/commonMain/composeResources/values-it/strings-it.xml`:
- Around line 804-812: The multiline strings use escaped backslashes so users
will see literal "\n"; update the newline escapes to actual newlines in the
affected string resources (replace "\\n" with "\n") for
external_import_empty_all_matched and external_import_permission_body so the
wizard text renders line breaks correctly; locate and edit the values for string
names external_import_empty_all_matched and external_import_permission_body in
the strings-it.xml and split the text into real newlines instead of the
two-character sequence.

In `@core/presentation/src/commonMain/composeResources/values-ja/strings-ja.xml`:
- Around line 763-771: The strings external_import_empty_all_matched and
external_import_permission_body contain double-escaped backslash-newline
sequences (e.g., "\\n" and "\\n\\n") which render literally; replace those with
single escape sequences ("\n" and "\n\n") inside the string values so they
produce actual newlines in the UI while preserving the rest of the Japanese text
in external_import_empty_all_matched and external_import_permission_body.

In `@core/presentation/src/commonMain/composeResources/values-ko/strings-ko.xml`:
- Around line 798-806: Replace the literal escaped backslashes used for newlines
in the string resources so Android treats them as newline characters: change
occurrences of "\\n" to "\n" inside the string entries
external_import_empty_all_matched and external_import_permission_body (and any
other entries in this file using "\\n"), ensuring the XML string values contain
actual newline escape sequences rather than double-escaped backslashes.

In `@core/presentation/src/commonMain/composeResources/values-pl/strings-pl.xml`:
- Around line 777-785: The Polish strings use double-escaped newlines (\\n)
which will render as literal "\n"; update the string resources
external_import_empty_all_matched and external_import_permission_body to use a
single-escaped newline (\n) (i.e., replace each \\n with \n inside the <string>
text) so actual line breaks are rendered, then verify the XML remains
well-formed and the localized UI shows real newlines.

In `@core/presentation/src/commonMain/composeResources/values-ru/strings-ru.xml`:
- Around line 777-785: The listed Russian string resources (e.g.,
external_import_empty_all_matched and external_import_permission_body, plus any
other strings containing "\\n" like external_import_permission_body) currently
contain escaped sequences ("\\n" / "\\n\\n") that will render as literal
backslash-n; replace those escaped sequences with real newline characters
(actual line breaks) inside the XML string values so the UI shows proper line
breaks (preserve existing text and spacing, only remove the backslashes and
split into separate lines where "\\n" / "\\n\\n" appear).

In `@core/presentation/src/commonMain/composeResources/values-tr/strings-tr.xml`:
- Around line 801-809: Several multiline translation strings contain escaped
newline sequences ("\\n") which render as literal backslashes in the UI; replace
those with actual newline characters ("\n") inside the value text for each
affected string (e.g., external_import_empty_all_matched,
external_import_permission_body, and other entries using "\\n") so the XML
contains real line breaks in the string content while preserving XML validity
and existing string names.

In
`@core/presentation/src/commonMain/composeResources/values-zh-rCN/strings-zh-rCN.xml`:
- Around line 765-773: Replace the literal backslash-n sequences with real
newlines in the translated strings: update the string value for
external_import_empty_all_matched to use an actual newline instead of "\\n", and
update external_import_permission_body to use actual newline characters where it
currently contains "\\n\\n" (so the UI renders real line breaks). Ensure no
escaped backslashes remain in these string values.
🪄 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 6bc9ccf5-7006-49d7-84c3-bcb92ba66478

📥 Commits

Reviewing files that changed from the base of the PR and between 181b15c and 5fead94.

📒 Files selected for processing (12)
  • core/presentation/src/commonMain/composeResources/values-ar/strings-ar.xml
  • core/presentation/src/commonMain/composeResources/values-bn/strings-bn.xml
  • core/presentation/src/commonMain/composeResources/values-es/strings-es.xml
  • core/presentation/src/commonMain/composeResources/values-fr/strings-fr.xml
  • core/presentation/src/commonMain/composeResources/values-hi/strings-hi.xml
  • core/presentation/src/commonMain/composeResources/values-it/strings-it.xml
  • core/presentation/src/commonMain/composeResources/values-ja/strings-ja.xml
  • core/presentation/src/commonMain/composeResources/values-ko/strings-ko.xml
  • core/presentation/src/commonMain/composeResources/values-pl/strings-pl.xml
  • core/presentation/src/commonMain/composeResources/values-ru/strings-ru.xml
  • core/presentation/src/commonMain/composeResources/values-tr/strings-tr.xml
  • core/presentation/src/commonMain/composeResources/values-zh-rCN/strings-zh-rCN.xml

Comment thread core/presentation/src/commonMain/composeResources/values-ar/strings-ar.xml Outdated
Comment thread core/presentation/src/commonMain/composeResources/values-ar/strings-ar.xml Outdated
Comment thread core/presentation/src/commonMain/composeResources/values-bn/strings-bn.xml Outdated
Comment thread core/presentation/src/commonMain/composeResources/values-bn/strings-bn.xml Outdated
Comment thread core/presentation/src/commonMain/composeResources/values-es/strings-es.xml Outdated
Comment thread core/presentation/src/commonMain/composeResources/values-ko/strings-ko.xml Outdated
Comment thread core/presentation/src/commonMain/composeResources/values-pl/strings-pl.xml Outdated
Comment thread core/presentation/src/commonMain/composeResources/values-ru/strings-ru.xml Outdated
Comment thread core/presentation/src/commonMain/composeResources/values-tr/strings-tr.xml Outdated
Replaces incorrectly double-escaped newlines (`\\n`) with standard newlines (`\n`) in the `external_import_empty_all_matched` and `external_import_permission_body` strings across multiple locales, including Spanish, French, Italian, Japanese, Korean, and Russian.

Additionally, this commit localizes the `mirror_status_down` string for Arabic and Bengali, replacing the literal "(down)" with its translated equivalent.
Removes unnecessary backslash escapes for single quotes (`\'` to `'`) across Turkish, French, and Italian translations. This ensures consistent string formatting and prevents potential rendering of literal backslashes in the UI for these locales.
Copy link
Copy Markdown
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: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@core/presentation/src/commonMain/composeResources/values-it/strings-it.xml`:
- Line 802: The current Italian strings like
external_import_completion_skipped_subline (and the similar “+1 altre” string at
line 853) use a plain string with a numeric placeholder and thus render
incorrectly for singular; convert these to Android plurals resources (create a
<plurals name="external_import_completion_skipped"> with <item quantity="one">
and <item quantity="other"> forms) and replace usages to call
getQuantityString(...) so the singular ("1 elemento saltato — puoi ripetere la
scansione dalle Impostazioni.") and plural ("%d elementi saltati — puoi ripetere
la scansione dalle Impostazioni.") render naturally; do the same for the other
string at line 853.
🪄 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 8328367b-460a-46fd-95f5-1c3918ff90ec

📥 Commits

Reviewing files that changed from the base of the PR and between 5fead94 and 4aeb537.

📒 Files selected for processing (12)
  • core/presentation/src/commonMain/composeResources/values-ar/strings-ar.xml
  • core/presentation/src/commonMain/composeResources/values-bn/strings-bn.xml
  • core/presentation/src/commonMain/composeResources/values-es/strings-es.xml
  • core/presentation/src/commonMain/composeResources/values-fr/strings-fr.xml
  • core/presentation/src/commonMain/composeResources/values-hi/strings-hi.xml
  • core/presentation/src/commonMain/composeResources/values-it/strings-it.xml
  • core/presentation/src/commonMain/composeResources/values-ja/strings-ja.xml
  • core/presentation/src/commonMain/composeResources/values-ko/strings-ko.xml
  • core/presentation/src/commonMain/composeResources/values-pl/strings-pl.xml
  • core/presentation/src/commonMain/composeResources/values-ru/strings-ru.xml
  • core/presentation/src/commonMain/composeResources/values-tr/strings-tr.xml
  • core/presentation/src/commonMain/composeResources/values-zh-rCN/strings-zh-rCN.xml
✅ Files skipped from review due to trivial changes (2)
  • core/presentation/src/commonMain/composeResources/values-ar/strings-ar.xml
  • core/presentation/src/commonMain/composeResources/values-ru/strings-ru.xml
🚧 Files skipped from review as they are similar to previous changes (3)
  • core/presentation/src/commonMain/composeResources/values-zh-rCN/strings-zh-rCN.xml
  • core/presentation/src/commonMain/composeResources/values-ko/strings-ko.xml
  • core/presentation/src/commonMain/composeResources/values-fr/strings-fr.xml

<item quantity="one">Ora tracciata %1$d app.</item>
<item quantity="other">Ora tracciate %1$d app.</item>
</plurals>
<string name="external_import_completion_skipped_subline">%1$d saltate — puoi ripetere la scansione dalle Impostazioni.</string>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Use count-neutral wording for these dynamic counts.

Line 802 and Line 853 read incorrectly when the value is 1 (1 saltate, +1 altre). Please rephrase them so both singular and plural cases render naturally.

💡 Suggested wording
-    <string name="external_import_completion_skipped_subline">%1$d saltate — puoi ripetere la scansione dalle Impostazioni.</string>
+    <string name="external_import_completion_skipped_subline">Hai saltato %1$d app — puoi ripetere la scansione dalle Impostazioni.</string>

-    <string name="external_import_auto_summary_more_count">+%1$d altre</string>
+    <string name="external_import_auto_summary_more_count">+%1$d in più</string>

Also applies to: 853-853

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@core/presentation/src/commonMain/composeResources/values-it/strings-it.xml`
at line 802, The current Italian strings like
external_import_completion_skipped_subline (and the similar “+1 altre” string at
line 853) use a plain string with a numeric placeholder and thus render
incorrectly for singular; convert these to Android plurals resources (create a
<plurals name="external_import_completion_skipped"> with <item quantity="one">
and <item quantity="other"> forms) and replace usages to call
getQuantityString(...) so the singular ("1 elemento saltato — puoi ripetere la
scansione dalle Impostazioni.") and plural ("%d elementi saltati — puoi ripetere
la scansione dalle Impostazioni.") render naturally; do the same for the other
string at line 853.

Removes the literal `%%` suffix from `external_import_card_preselect_known` and `external_import_match_confidence_chip` across all localized `strings.xml` files.

The percentage symbol is now appended programmatically in `RepoCandidateRow.kt` and `CandidateCard.kt` after fetching the string resource. This ensures consistent formatting of confidence scores and simplifies translation templates by removing the need for escaped percentage signs in XML.
@rainxchzed rainxchzed merged commit 750563f into main Apr 30, 2026
1 check was pending
@rainxchzed rainxchzed deleted the app-full-localize branch April 30, 2026 16:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant