Skip to content

fix(mobile): translate every catalog against its UI context - #5880

Merged
iscekic merged 103 commits into
mainfrom
fix/mobile-i18n-context-pass
Sep 4, 2026
Merged

iscekic merged 103 commits into
mainfrom
fix/mobile-i18n-context-pass

Conversation

@iscekic

@iscekic iscekic commented Sep 4, 2026 •

Copy link
Copy Markdown
Collaborator

Why

The catalogs were machine-translated key by key with no idea where each string
appears on screen. That produced grammar errors, English title case copied into
languages that do not use it, labels translated as sentences, and English word
order forced around placeholders. de shipped "Teilen {{title}}" and
"Kommentar" on a button that means comment, the verb.

Nothing in the repo told a translator, or an agent, where a key renders.
apps/mobile/AGENTS.md had no translation guidance at all.

What changed

Every key in all 86 non-English catalogs was reviewed against its call site.
For each key a reviewer saw the surrounding source code, the string's role in the
UI (one of 24: button, alert-action, screen-title, badge, placeholder,
empty-body, …), the English form and capitalization, and the current
translation. Mean 1291 of 2736 strings changed per locale.

Examples from de:

key before after why
prReview.composer.comment Kommentar Kommentieren the role is button, so the action form
prReview.hunkRows.fileLoadedOfTotalCount {{displayCount}} Dateien von {{total}} geladen {{displayCount}} von {{total}} Dateien geladen English word order forced onto German
prReview.connectionExpired GitHub-Verbindung abgelaufen. Die GitHub-Verbindung ist abgelaufen. the role is error-body, needs a full sentence
codeReviewer.title Code Reviewer Code-Prüfer never translated
preferences.autoExpandThinking Denken automatisch erweitern Denkprozess automatisch aufklappen literal rendering no speaker would use

One key per piece of copy. 206 groups of keys held identical English, which
cannot be translated apart without drifting. Those collapsed onto one key each:
416 keys dropped, 108 new common.* keys, 646 call sites repointed. en.json
went from 2736 keys to 2428, and stands at 2442 after the merge with main.

Twelve English strings genuinely carry two senses and keep a key each — Open
the verb versus the state of a pull request, Comment the verb versus the noun,
High the severity versus the thinking effort. Each is recorded with its reason.

Case follows the English lead, where the language has case. Case carries
meaning a reviewer cannot see one string at a time: a badge is drawn in capitals,
and a dismissal reason is a lowercase fragment that reads inside a sentence
another key starts. Applied mechanically across all 86 catalogs — full capitals
stay capitals, and the first letter follows English. The first-letter rule
touches one character, so it never imposes English title case. A string a
placeholder opens is left alone, because the interpolated value sets the case
there.

Two languages do not take the rule, and the first pass got both wrong:

  • Georgian Mkhedruli has no letter case. Uppercasing the initial writes a
    Mtavruli letter, which the language uses only for a full-capitals effect, so
    1980 values had gained a capital the orthography does not use. Georgian is now
    exempt from every case rule, which is what label-reference.test.ts already
    assumed.
  • Greek keeps the tonos on a capital initial and drops it only in full capitals,
    so Άνοιγμα had become Ανοιγμα in 137 values. A recase that changes which
    letter it is, and not only its case, is now skipped.

apps/mobile/AGENTS.md records both, so the next pass does not repeat them.

Guardrails, so this does not come back

  • check-catalogs.mjs now fails on duplicate copy, naming both keys and the
    escape hatch. Verified against a deliberately introduced duplicate. It already
    runs in CI via pnpm check:i18n.
  • apps/mobile/AGENTS.md gains a ## Translations section: edit en.json only,
    search for the string before adding a key, put shared copy under common.,
    name a label with $t(key), never assume English word order.

Context fit, capitalization and placeholder order need judgement and are not
mechanically checkable — a "don't mirror English title case" rule fires on every
German noun. Those are covered by the guide, not a check.

Three latent bugs this surfaced

KiloClaw, Bitbucket and Kilo are product names that should never be
translated, but a few locales' machine translation had mangled them, so the
"identical to English in every locale" rule never fired. Now that every locale
leaves them as written, it does. Each is allowlisted alongside the other proper
nouns, in its own commit.

Merged with main

Main added 15 keys under prReview.overview for the pull request sidebar
metadata and changed no existing value, so each of the 31 conflicted catalogs
keeps this branch's reviewed copy and takes main's value only for those 15 keys.
Merging the other direction would have resurrected every key the deduplication
removed.

Two follow-ups came out of it:

  • prReview.overview.reviewDismissed holds the same copy as
    securityAgent.deadline.dismissed, and both are a state label with one sense.
    The new duplicate-copy check caught it. Both call sites now read
    common.dismissed.
  • Those 15 keys arrived after the review pass, so their values in every catalog
    were still the old machine translation. All 86 locales reviewed them against
    the overview screen, like every other key: 549 strings changed.

Review notes

  • 101 commits: one per locale, then the dedup batches, the guardrails, the merge
    with main, and the top-up review. Reviewing per commit is far easier than the
    squashed diff.
  • Green: 8937/8937 tests, check:i18n, format:check, root lint-all.sh,
    root typecheck-all.sh.
  • Lao needed its groups split in half; its catalog is the largest and one
    response kept timing out upstream.

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1250 strings changed.
Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1317 strings changed.
Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1096 strings changed.
Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1092 strings changed.
Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1280 strings changed.
Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1362 strings changed.
Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1374 strings changed.
Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1275 strings changed.
Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1209 strings changed.
Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1310 strings changed.
Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1358 strings changed.
Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1403 strings changed.
Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1421 strings changed.
Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1337 strings changed.
Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1331 strings changed.
Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1455 strings changed.
Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1253 strings changed.
Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1349 strings changed.
Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1321 strings changed.
Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1356 strings changed.
Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1318 strings changed.
Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1469 strings changed.
Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1688 strings changed.
Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1642 strings changed.
Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1712 strings changed.
Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1354 strings changed.
Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1513 strings changed.
Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1576 strings changed.
Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1515 strings changed.
Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1509 strings changed.
Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1425 strings changed.
Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 2484 strings changed.
Every locale now leaves the product name as written, so the
identical-to-English rule needs the key listed with the other proper nouns.
Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1615 strings changed.
Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1855 strings changed.
Copy that reads the same in two places belongs to one key; two keys holding one
English string drift apart the moment someone translates one of them. Each call
site now points at the surviving key.
Copy that reads the same in two places belongs to one key; two keys holding one
English string drift apart the moment someone translates one of them. Each call
site now points at the surviving key.
Copy that reads the same in two places belongs to one key; two keys holding one
English string drift apart the moment someone translates one of them. Each call
site now points at the surviving key.
Copy that reads the same in two places belongs to one key; two keys holding one
English string drift apart the moment someone translates one of them. Each call
site now points at the surviving key.
Two keys holding the same English string drift apart the moment someone
translates one of them, and nothing downstream can tell which of the two the
reader was meant to see. The check now fails on duplicate copy and names both
keys. TWO_SENSE_COPY lists the twelve strings this product genuinely uses two
ways, each with the reason.

Document the rule in the mobile agent guide, which carried no translation
guidance at all.
Case carries meaning the review pass could not see one string at a time. A badge
is drawn in capitals, and a dismissal reason is a lowercase fragment that reads
inside a sentence another key starts. Both survive only when every catalog
follows the English lead, so the rule is now applied across all 86:

- English in full capitals keeps full capitals
- English starting lowercase keeps a lowercase first letter
- English starting uppercase keeps an uppercase first letter

The first-letter rules touch one character, so they never impose English title
case on a language that does not use it. A string a placeholder opens is left
alone, because the interpolated value sets the case there. Georgian is exempt
from capitals, having no case distinction.
Two glanceable tests spell a key inside a longer expected string, so the key
rename could not reach them. The session row test asserts Spanish list
composition; its LIVE wording changed with the review pass.
@iscekic iscekic self-assigned this Sep 4, 2026
Main added 15 keys under prReview.overview and changed no existing value,
so every conflicted catalog keeps this branch's reviewed copy and takes
main's values only for the keys main added. Merging the other direction
would resurrect the keys the deduplication removed.
@kilo-code-bot

kilo-code-bot Bot commented Sep 4, 2026 •

Copy link
Copy Markdown
Contributor

Code Review Summary

Status: No Issues Found | Recommendation: Merge

Files Reviewed (1 files)
  • dev/local/mobile-workflow.test.ts
Previous Review Summaries (3 snapshots, latest commit f83e6fc)

Current summary above is authoritative. Previous snapshots are kept for context only.

Previous review (commit f83e6fc)

Status: No Issues Found | Recommendation: Merge

Files Reviewed (1 files)
  • tools/i18n/check-catalogs.mjs

Previous review (commit 360b75c)

Status: No Issues Found | Recommendation: Merge

Files Reviewed (91 files)
  • apps/mobile/AGENTS.md
  • apps/mobile/src/components/security-agent/finding-details-panel.tsx
  • apps/mobile/src/components/security-agent/finding-filter-modal.tsx
  • apps/mobile/src/lib/pr-review/overview-meta.ts
  • apps/mobile/src/lib/security-agent-copy.ts
  • apps/mobile/src/i18n/locales/en.json
  • apps/mobile/src/i18n/locales/*.json (86 non-English catalogs)

Previous review (commit af8e283)

Status: No Issues Found | Recommendation: Merge

Files Reviewed (311 files)
  • tools/i18n/check-catalogs.mjs
  • tools/i18n/wording-exceptions.json
  • apps/mobile/AGENTS.md
  • apps/mobile/src/i18n/label-reference.test.ts
  • apps/mobile/src/i18n/locales/en.json
  • apps/mobile/src/i18n/locales/*.json (86 non-English catalogs)
  • apps/mobile/src/app/** call-site key remaps
  • apps/mobile/src/components/** call-site key remaps
  • apps/mobile/src/lib/** call-site key remaps
  • apps/mobile/src/glanceable-android/** and apps/mobile/src/glanceable-ios/** copy-key remaps

Reviewed by grok-4.6 · Input: 108.7K · Output: 4.1K · Cached: 136.6K

Review guidance: REVIEW.md from base branch main

The case pass recased the first letter of every value to follow the English
copy. Two languages do not take that rule.

Greek keeps the tonos on a capital initial and drops it only in full
capitals, so "Άνοιγμα" had wrongly become "Ανοιγμα". 137 values are restored.

Georgian Mkhedruli has no letter case. Uppercasing writes a Mtavruli letter,
which the script reserves for a full-capitals effect, so 1980 values had
gained a capital the orthography does not use.
Main added prReview.overview.reviewDismissed, which holds the same copy as
securityAgent.deadline.dismissed. Both are a state label with one sense, so
the copy belongs to one key and both call sites now read common.dismissed.
The case pass had to be undone in Greek and Georgian. Neither language
takes the English rule, so the note says so before the next pass repeats it.
The pull request overview keys arrived after the review pass, so their
values were still the old machine translation. Every locale now reviewed
them against the screen, like every other key. 549 strings changed.
Comment thread tools/i18n/check-catalogs.mjs
The note read as though only one plural family's members were exempt. Every
plural key is, and the reason the gap is safe belongs next to the skip.
@iscekic
iscekic enabled auto-merge (squash) September 4, 2026 17:10
The tab layout now reads `common.kiloclaw`, `common.agents`, `common.chat`
and `common.profile`. The guard test still asserted the old `tabs.*` keys, and
the profile label is wrapped across lines now, so its regex needs the same
whitespace tolerance as the others.
@iscekic
iscekic merged commit 5886963 into main Sep 4, 2026
27 checks passed
@iscekic
iscekic deleted the fix/mobile-i18n-context-pass branch September 4, 2026 19:53
iscekic added a commit that referenced this pull request Sep 5, 2026
* fix(mobile): correct de translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1250 strings changed.

* fix(mobile): correct fr translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1317 strings changed.

* fix(mobile): correct es translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1096 strings changed.

* fix(mobile): correct pt-BR translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1092 strings changed.

* fix(mobile): correct pt translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1280 strings changed.

* fix(mobile): correct it translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1362 strings changed.

* fix(mobile): correct nl translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1374 strings changed.

* fix(mobile): correct ja translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1275 strings changed.

* fix(mobile): correct ko translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1209 strings changed.

* fix(mobile): correct zh-Hans translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1310 strings changed.

* fix(mobile): correct zh-Hant translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1358 strings changed.

* fix(mobile): correct ru translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1403 strings changed.

* fix(mobile): correct pl translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1421 strings changed.

* fix(mobile): correct tr translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1337 strings changed.

* fix(mobile): correct id translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1331 strings changed.

* fix(mobile): correct hi translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1455 strings changed.

* fix(mobile): correct ar translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1253 strings changed.

* fix(mobile): correct vi translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1349 strings changed.

* fix(mobile): correct th translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1321 strings changed.

* fix(mobile): correct uk translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1356 strings changed.

* fix(mobile): correct af translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1318 strings changed.

* fix(mobile): correct sq translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1469 strings changed.

* fix(mobile): correct hy translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1688 strings changed.

* fix(mobile): correct am translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1642 strings changed.

* fix(mobile): correct az translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1712 strings changed.

* fix(mobile): correct eu translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1354 strings changed.

* fix(mobile): correct be translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1513 strings changed.

* fix(mobile): correct bn translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1576 strings changed.

* fix(mobile): correct bs translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1515 strings changed.

* fix(mobile): correct bg translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1509 strings changed.

* fix(mobile): correct ca translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1311 strings changed.

* fix(mobile): correct my translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1927 strings changed.

* fix(mobile): correct hr translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1499 strings changed.

* fix(mobile): correct cs translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1429 strings changed.

* fix(mobile): correct da translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1432 strings changed.

* fix(mobile): correct et translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1282 strings changed.

* fix(mobile): correct fil translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1857 strings changed.

* fix(mobile): correct fi translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1327 strings changed.

* fix(mobile): correct gl translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1256 strings changed.

* fix(mobile): correct ka translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1622 strings changed.

* fix(mobile): correct el translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1434 strings changed.

* fix(mobile): correct gu translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1657 strings changed.

* fix(mobile): correct ht translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1712 strings changed.

* fix(mobile): correct ha translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1782 strings changed.

* fix(mobile): correct he translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1729 strings changed.

* fix(mobile): correct hu translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1471 strings changed.

* fix(mobile): correct is translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1576 strings changed.

* fix(mobile): correct ig translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1795 strings changed.

* fix(mobile): correct ga translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1403 strings changed.

* fix(mobile): correct kk translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1589 strings changed.

* fix(mobile): correct kn translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1540 strings changed.

* fix(mobile): correct km translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1538 strings changed.

* fix(mobile): correct ckb translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1735 strings changed.

* fix(mobile): correct lv translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1448 strings changed.

* fix(mobile): correct lt translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1495 strings changed.

* fix(mobile): correct mk translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1522 strings changed.

* fix(mobile): correct mg translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1942 strings changed.

* fix(mobile): correct ms translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1293 strings changed.

* fix(mobile): correct ml translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1385 strings changed.

* fix(mobile): correct mt translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1515 strings changed.

* fix(mobile): correct mi translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1815 strings changed.

* fix(mobile): correct mr translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1608 strings changed.

* fix(mobile): correct mn translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1608 strings changed.

* fix(mobile): correct ne translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1582 strings changed.

* fix(mobile): correct nb translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1366 strings changed.

* fix(mobile): correct or translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1664 strings changed.

* fix(mobile): correct om translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 2203 strings changed.

* fix(mobile): correct fa translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1426 strings changed.

* test(mobile): allowlist the KiloClaw product name in the catalog check

Every locale now leaves the product name as written, which is correct, so the
identical-to-English rule needs these three keys listed like the other proper
nouns.

* fix(mobile): correct ps translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1844 strings changed.

* fix(mobile): correct pa translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1551 strings changed.

* fix(mobile): correct ro translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1432 strings changed.

* fix(mobile): correct sr translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1492 strings changed.

* fix(mobile): correct si translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1568 strings changed.

* fix(mobile): correct sk translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1521 strings changed.

* fix(mobile): correct sl translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1443 strings changed.

* fix(mobile): correct so translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1906 strings changed.

* fix(mobile): correct sw translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1484 strings changed.

* fix(mobile): correct sv translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1363 strings changed.

* fix(mobile): correct ta translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1846 strings changed.

* fix(mobile): correct ur translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1469 strings changed.

* fix(mobile): correct uz translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1640 strings changed.

* test(mobile): allowlist Bitbucket in the catalog check

The GitHub and GitLab platform names are already listed; Bitbucket was missed
and now every locale leaves it as written.

* fix(mobile): correct te translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1709 strings changed.

* fix(mobile): correct cy translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1425 strings changed.

* fix(mobile): correct yo translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 2484 strings changed.

* test(mobile): allowlist the Kilo product name in the catalog check

Every locale now leaves the product name as written, so the
identical-to-English rule needs the key listed with the other proper nouns.

* fix(mobile): correct zu translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1615 strings changed.

* fix(mobile): correct lo translations for UI context

Reviewed every key against the screen it appears on. Fixed grammar,
capitalization, placeholder word order, and register. 1855 strings changed.

* refactor(mobile): collapse duplicate translation keys, batch 1 of 4

Copy that reads the same in two places belongs to one key; two keys holding one
English string drift apart the moment someone translates one of them. Each call
site now points at the surviving key.

* refactor(mobile): collapse duplicate translation keys, batch 2 of 4

Copy that reads the same in two places belongs to one key; two keys holding one
English string drift apart the moment someone translates one of them. Each call
site now points at the surviving key.

* refactor(mobile): collapse duplicate translation keys, batch 3 of 4

Copy that reads the same in two places belongs to one key; two keys holding one
English string drift apart the moment someone translates one of them. Each call
site now points at the surviving key.

* refactor(mobile): collapse duplicate translation keys, batch 4 of 4

Copy that reads the same in two places belongs to one key; two keys holding one
English string drift apart the moment someone translates one of them. Each call
site now points at the surviving key.

* test(mobile): require one key per piece of copy

Two keys holding the same English string drift apart the moment someone
translates one of them, and nothing downstream can tell which of the two the
reader was meant to see. The check now fails on duplicate copy and names both
keys. TWO_SENSE_COPY lists the twelve strings this product genuinely uses two
ways, each with the reason.

Document the rule in the mobile agent guide, which carried no translation
guidance at all.

* fix(mobile): restore the case the English copy sets

Case carries meaning the review pass could not see one string at a time. A badge
is drawn in capitals, and a dismissal reason is a lowercase fragment that reads
inside a sentence another key starts. Both survive only when every catalog
follows the English lead, so the rule is now applied across all 86:

- English in full capitals keeps full capitals
- English starting lowercase keeps a lowercase first letter
- English starting uppercase keeps an uppercase first letter

The first-letter rules touch one character, so they never impose English title
case on a language that does not use it. A string a placeholder opens is left
alone, because the interpolated value sets the case there. Georgian is exempt
from capitals, having no case distinction.

* test(mobile): follow the renamed keys and the new Spanish copy

Two glanceable tests spell a key inside a longer expected string, so the key
rename could not reach them. The session row test asserts Spanish list
composition; its LIVE wording changed with the review pass.

* fix(mobile): keep Greek accents and drop Georgian capitals

The case pass recased the first letter of every value to follow the English
copy. Two languages do not take that rule.

Greek keeps the tonos on a capital initial and drops it only in full
capitals, so "Άνοιγμα" had wrongly become "Ανοιγμα". 137 values are restored.

Georgian Mkhedruli has no letter case. Uppercasing writes a Mtavruli letter,
which the script reserves for a full-capitals effect, so 1980 values had
gained a capital the orthography does not use.

* refactor(mobile): point the dismissed label at one key

Main added prReview.overview.reviewDismissed, which holds the same copy as
securityAgent.deadline.dismissed. Both are a state label with one sense, so
the copy belongs to one key and both call sites now read common.dismissed.

* docs(mobile): record which languages take the English case

The case pass had to be undone in Greek and Georgian. Neither language
takes the English rule, so the note says so before the next pass repeats it.

* fix(mobile): review the translations main added

The pull request overview keys arrived after the review pass, so their
values were still the old machine translation. Every locale now reviewed
them against the screen, like every other key. 549 strings changed.

* docs(i18n): state what the duplicate-copy rule exempts

The note read as though only one plural family's members were exempt. Every
plural key is, and the reason the gap is safe belongs next to the skip.

* fix(dev): track the tab label keys the i18n pass moved to common

The tab layout now reads `common.kiloclaw`, `common.agents`, `common.chat`
and `common.profile`. The guard test still asserted the old `tabs.*` keys, and
the profile label is wrapped across lines now, so its regex needs the same
whitespace tolerance as the others.
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