Skip to content

Fix broken translations, fill missing strings and complete plurals in all locales - #1010

Merged
kasnder merged 2 commits into
masterfrom
ccr-ac4e15a1-v4j74l
Nov 1, 2026
Merged

kasnder merged 2 commits into
masterfrom
ccr-ac4e15a1-v4j74l

Conversation

@kasnder

@kasnder kasnder commented Oct 31, 2026

Copy link
Copy Markdown
Member

Refs #1009 (the translation half; the crash report is still pending).

Summary

1. Broken translations (490c221). The bulk fill in #940 left filler words in place of real text in many locales: "Elemento", "элемент", "عنصر", "Atriði", "asia" and others, plus stub phrases such as "Ulteriori informazioni su …". Every translated string in every locale was checked against the English, and 2,111 strings that were actually wrong were replaced:

  • The worst files were Icelandic (339), Galician (311), Arabic (282), Basque (256), Finnish (245), Russian (229) and Italian (190).
  • Locales without filler still had real errors:
    • "start" translated as "stop" in both Chinese locales;
    • Private DNS "enabled" where the English says "disabled" in Slovenian;
    • opposite meanings in Dutch and French;
    • a full-width %d that broke the Japanese count;
    • translated WireGuard config keywords ([Interface] and others);
    • wrong GDPR abbreviations in Polish and French.
  • Correct but imperfect translations were left alone.

2. Missing strings and plurals (9a634ca).

  • Missing strings: each locale lacked 5–58 strings that exist in English, about 1,370 in total. They are now translated, using the terms and form of address each locale already uses.
  • Plurals: every plural resource now has exactly the categories its language needs (CLDR):
    • Before this PR all locales had only one/other, so Russian, Ukrainian, Polish and Czech showed the wrong word form for counts like 2–4 and 5–20.
    • Arabic, Hebrew, Slovenian and Romanian gain the categories they were missing.
    • French, Spanish, Italian and Portuguese gain many.
    • Japanese, Korean, Chinese and Vietnamese keep only other.

How

  • Sonnet agents reviewed and translated the locales and wrote their proposed changes as JSON.
  • A script then applied them to the XML in place and rejected any change whose format specifiers, HTML tags, CDATA wrapper, \n count, quote escaping or plural categories didn't match the English. Nothing failed those checks.
  • One leftover filler string the review missed (Galician msg_started) was fixed by hand.

Testing

  • All 36 strings.xml files parse as XML.
  • No filler phrases are left in any locale.
  • Every locale now has every translatable English resource.
  • Not run here: the container has no Android SDK, so CI is the first build and lint check.

Before and after merging

  • Crowdin: the daily Crowdin sync downloads translations and opens a PR, which could put the old strings back. After merging, run Synchronize Crowdin translations by hand with upload_translations ticked, then check that Crowdin took the new versions.
  • Not reviewed by native speakers: these are machine translations. The long rewrites, especially the GDPR request and erasure letters, are worth a native speaker's look. The agents flagged 39 entries they weren't sure about and left them unchanged.

https://claude.ai/code/session_01Ggf8mGDTZKcAduhWquDHAj


Generated by Claude Code

The bulk fill in #940 left filler words ("Elemento", "элемент",
"عنصر", "Atriði", "asia", ...) and stub phrases in place of real text
in many locales, which the Italian report in #1009 surfaced. Arabic,
Basque, Finnish, Galician, Icelandic, Italian and Russian were worst
affected, with 190-340 broken strings each.

Every translated string in every locale was reviewed against the
English source, and only entries that were actually wrong were
replaced: filler, wrong or opposite meanings, truncated or garbled
text, broken placeholders (e.g. a full-width "%d" in Japanese), and
translated WireGuard config keywords. Correct but imperfect
translations were left alone. Format specifiers, markup and CDATA
wrappers match the English for every change.

Claude-Session: https://claude.ai/code/session_01Ggf8mGDTZKcAduhWquDHAj
Each locale lacked 5-58 strings that exist in English (about 1,370
strings and arrays in total); these are now translated, following the
terminology and form of address each locale already uses.

Every plurals resource now carries exactly the CLDR categories its
language needs. Previously all locales had only one/other, so Russian,
Ukrainian, Polish and Czech showed the wrong form for counts like 2-4
and 5-20, and Arabic, Hebrew, Slovenian and Romanian were missing
their extra categories. French, Spanish, Italian and Portuguese gain
"many"; Japanese, Korean, Chinese and Vietnamese keep only "other".
Wrong wording in existing plural items was corrected along the way.

Claude-Session: https://claude.ai/code/session_01Ggf8mGDTZKcAduhWquDHAj
@kasnder
kasnder marked this pull request as ready for review November 1, 2026 00:05
@kasnder
kasnder merged commit 4c21fcf into master Nov 1, 2026
3 checks passed
kasnder pushed a commit that referenced this pull request Nov 1, 2026
#1007 brings human translations from Crowdin for strings that #1010
had filled by machine and appended at the end of the file. Merging both
would define each name twice, which fails the resource build, so drop
the machine-translated copies and keep the Crowdin ones.

Claude-Session: https://claude.ai/code/session_01Ggf8mGDTZKcAduhWquDHAj
kasnder pushed a commit that referenced this pull request Nov 1, 2026
#1010 machine-translated 21 zh-CN strings that #1007 delivers as human
translations from Crowdin. Remove ours so #1007 merges without
defining each name twice.

Claude-Session: https://claude.ai/code/session_01Ggf8mGDTZKcAduhWquDHAj
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.

2 participants