Repository navigation
Translate the Terminal and Logs output - #646
Conversation
Every line the app writes in the Terminal and in the Logs' panes goes through the translation functions: the terminal's help and refusals, the setup, update and apply chains, the build watch and dev server lines, the Logs tabs and empty-pane notes, the switch progress, and main's lines from the trunk update, the pull request switch, the npm runner and the server start. Sentences built from a verb and a noun, a stage code or a phase code are written whole, one per case. The dev server's "see Help → Open App Log" names the menu item by the string the menu uses. Fixes #627.
…ighten the tests from the review The three sentences chosen by a branch in index.jsx move to a module the suite can load, with a test. The Terminal journey checks each printed line is one bracketed string whole, the engine retry notice gets an ipc-wiring test, and every apply line's compiling sentence is pinned to compilingMessage().
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configuration
You can disable this status message by setting the Use the checkbox below for a quick retry:
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 |
xterm draws only the rows on screen. In the pseudo-locale the help's lines are longer and wrap, so on CI's macOS window its first line had scrolled out of view and the journey timed out waiting for it.
|
@coderabbitai review |
|
## Why The Open a pull request card, its GitHub sign-in, and the errors main sends it were plain English in a translated window. This is the #625 batch of #622, which needed the catalog in main from #634. ## What changes - **The card** (`pull-request-destination.jsx`) wraps every string. Sentences with a link or code in them use `createInterpolateElement`, with logins, branches and repository names passed in as elements so they are never read as markup. The failure messages are a function instead of a module-level constant. - **Per-project text** in `project-type.cjs` (`cards.*`) is getters, read when the card renders. Main's refusal with nothing linked used to splice the work item's label into a sentence; it is now `cards.prNeedsWorkItem`, one sentence per project type. - **Main process:** the sign-in errors in `github-auth.cjs` and the pull request errors in `github-pr.cjs` are wrapped, including the step labels passed to `failure()`, which the issue did not list. The "Trunk has moved" message uses `_n`, and a GitHub failure is composed with `%1$s: %2$s%3$s` so a translator can change the punctuation. GitHub's own reason and the bracketed diagnostic for GitHub support stay as they are. Not wrapped, per #622: the pull request body and the default pull request title, because they leave the app. ## How to test this The new journeys cover the card in the pseudo-locale on both projects. Run them from the repository root on either platform: ``` npx playwright test --project=journeys tests/e2e/journeys/i18n.spec.js -g "pull request card" ``` Both fail without this change. The Core journey walks every state #625 lists: signed out, "Not now" and "Show this again", the device code, signed in with the form and its fold, a `rate-limited` failure, a dry run, and a pull request opened from a checkout behind trunk. The Gutenberg one walks signed out, signed in with the fold open, and the opened pull request, checking the words that are Gutenberg's own. What the journeys cannot reach is a real GitHub. They stub every `github:*` handler, so the main-process errors never reach the screen in them. Unit tests in `github-auth`, `github-pr` and `pr-stage` cover those strings in the pseudo-locale instead. To see one on screen by hand (either platform, current head): 1. From the repository root, run `npx electron . --lang=en-XA`. 2. Open a Core site with a linked ticket and an edit, and click **Review & submit changes**. 3. In **Open a pull request**, click **Sign in with GitHub** and finish in the browser. - Expected: every line of the card is accented and in brackets, apart from your login, your fork's name, the code and the branch. **What must not have happened:** no English an English speaker sees has changed. The English journeys in `open-pull-request.spec.js`, `review-changes.spec.js` and `pr-checkout.spec.js` still pass with their exact strings. ## Risks and limitations - The other open batches (#636, #644, #645, #646) also append tests to the end of `i18n.spec.js`, so whichever merges later resolves that by keeping both. - One finding is deferred: `prFailureMessage` decides between five user-facing strings inside a `.jsx` file the suite cannot load. It predates this PR (it was the old constant map), so moving it to a `.cjs` module with a test is a follow-up. ## Related Fixes #625. Part of #622. Follows #634. --- <details> <summary>Design decisions and alternatives considered</summary> - **Not stacked on #635.** #622 asks for batches that review on their own. Now that #635 has merged, its `unwrapped()` scanner change and the `@wordpress/element` dependency, which this PR also needed, come from trunk. - **The textarea placeholder** is three strings joined with a newline. A single `__()` with `\n` in it is refused by `@wordpress/i18n-no-collapsible-whitespace`. - **"Signed in as …"** is wrapped in its own `<span>`, so the sentence and the **Sign out** button beside it are separate elements, as in #635. </details> <details> <summary>Review outcome (required — see AGENTS.md)</summary> 2 [fix here] · 1 [follow-up]. Both [fix here] findings are fixed; the follow-up is deferred (see Risks). - 🟡 The Gutenberg journey linked no issue, so it never showed the form, the fold or the loop-back. Fixed: it links one in the record and walks those states. - 🔵 No test showed the main-process strings or the stage labels come out translated. Fixed: pseudo-locale unit tests for the scope refusal, a composed `failure()`, the plural stale message and `prStageLabel`. - Style: three dead entries in the journey's `THEIRS` filter were removed. - **Review:** completed. Fresh agent context, head `11ef362` / base `c34aa45`. `npm run lint` clean, `npm test` 2002 pass / 0 fail, i18n and PR journeys 25 pass. - **Since review:** `11ef362 → ef457fd`. The only change is the test fixes above, checked by the authoring session, not re-reviewed by a fresh context. `src` and `tests` lint clean, unit suite 2005 pass / 0 fail, i18n journeys 12 pass. The review did not run the journeys itself; it was read-only. - **After #635 merged:** `ef457fd → 9559a1f` (trunk merged from GitHub) → `012fca8` (trunk at `e94f507` merged; `i18n.spec.js` resolved as trunk's file plus this PR's two tests, nothing else changed). Checked by the authoring session, not re-reviewed: `src` and `tests` lint clean, unit suite 2036 pass / 0 fail, i18n, open-pull-request, review-changes and pr-checkout journeys 31 pass. </details> <details> <summary>Screenshots or recording</summary> None. Nothing changes on screen in English, and the pseudo-locale journeys are the check for the translated state. </details> 🤖 Generated with [Claude Code](https://claude.com/claude-code)
…-logs-strings # Conflicts: # tests/e2e/journeys/i18n.spec.js
## Why The setup checklist and the trunk update's cards and banners were still plain English in a translated app. This is the #626 batch of #622. ## What changes - **Wrapped:** the setup checklist, the trunk update card, the question an update asks over edits, the banners for an old trunk and an incomplete update, the "Up to date with trunk" notice, and the sentences they take from `setup-steps.cjs`, `update-plan.cjs`, `next-action.cjs` and `project-type.cjs`'s `setup` copy. Also the dirty-tree dialog's errors in `use-trunk-update.jsx` and the alert in `use-dev-server.jsx`. - **Translated when shown, not at load:** `update-plan.cjs`'s messages and step labels were module-level constants and are now functions (`SKIP_INSTALL_MESSAGE` became `skipInstallMessage()`, and so on); `project-type.cjs`'s `setup.*` are getters, like `description` already was. - **Whole sentences instead of parts:** the step counters (`sprintf('step %1$d of %2$d')`), the file count and the day count (`_n`), "Next step: %s", and the update summary, which was three fragments and is now one of four sentences (`updateSummarySentence`). The link-ticket hint took the work item's label as a noun ("Link a %s…") and now takes its kind and has one sentence each, as #630 asks for. - Commands and paths (`npm install`, `npm run build`, `package.json`, `src/`) are passed in as `%s`. - Deliberately not here: the lines the app writes to the Terminal belong to #627, apart from the skip-install message, which #626 names because the update card shows it too. ## How to test this Covered by journeys in `tests/e2e/journeys/i18n.spec.js`, all red without this change. From the repository root: `npx playwright test --project=journeys tests/e2e/journeys/i18n.spec.js -g "checklist|trunk banners|did not finish"`. In the en-XA pseudo-locale they reach the checklist with steps done and ready, the checklist after a failed install, the old-trunk banner, the question an update asks over an edit (each answer chosen), the update card on its first step, and the banner after an update that did not finish, and fail on any visible English. To look at it by hand, on either platform, on the current head: run `npx electron . --lang=en-XA` from the repository root and open a site whose trunk is more than 14 days old. 1. **Expected:** the banner about the old trunk and its **Update to latest trunk** button are accented and in brackets. 2. Edit a file in the site and click that button. **Expected:** the dialog that asks what to do with the edit is bracketed throughout, apart from the file's path. **What must not have happened:** in English, the checklist, the cards and the banners read exactly as before. Not reached by a journey, and why: - The setup chain's "Setting this site up for you — step N of M" and "Setup stopped." notices: they only appear after a new site's clone, which a journey would have to fake end to end. - The "Up to date with trunk" notice: it needs an update to finish. Its sentences come from `updateSummarySentence`, which a unit test covers. - The alert about starting the server before the build: no control in the app can reach it (the checklist's button is disabled until the build is done, and the header and details only offer the server once the wizard is skipped). It is wrapped anyway. ## Risks and limitations - Review: 2 [fix here] · 0 [follow-up], both low, both fixed. - `tray.spec.js`'s "the tray's edge is moved with the arrow keys…" failed once in the full run. It fails about one run in five on `trunk` too, so it is not this branch. - The other open batches (#643, #644, #645, #646) also append tests to the end of `tests/e2e/journeys/i18n.spec.js`, so whichever merges later resolves that by keeping both. ## Related Fixes #626. Part of #622. --- <details> <summary>Design decisions and alternatives considered</summary> The dirty-tree answers' details carry their own leading dash ("— a .diff on your machine…"), with the space outside the string: punctuation is the translator's, and a string that starts with a space is easy to break. The link-ticket hint takes `workItemNoun` instead of `workItemLabel`, which removes one of the places #630 lists as splicing the label into a sentence. </details> <details> <summary>Review outcome (required, see AGENTS.md)</summary> - **Review:** completed. Reviewer: a separate agent context (Claude Code, read-only) against `.github/instructions/code-review.instructions.md`; head `1790e42` / base `8dbed36`. `npm run lint` clean, `npm test` 1954 pass / 0 fail, journeys 117 pass. Outcome: 2 [fix here] · 0 [follow-up], both 🔵. - Translatable-string rules [fix here]: the extractor gave the dirty-tree details' notes to their labels as well, and gave the dirty-tree errors' notes to the "Unknown error" fallback on the same line. **Fixed** in `4b925eb`: each note sits directly above its own string, and the fallback is on its own line. - Tests [fix here]: nothing would fail if the new `update-plan.cjs` message functions went back to English constants. **Fixed** in `4b925eb`: a unit test loads a catalog after the module is required. Checked by turning one back into a constant, which fails it. - Notes on wording, also fixed: a stale comment in `work-item.cjs`, and the translator example "2m 5s", which the app writes as "2m 05s". - It also confirmed the dev-server alert is unreachable from the UI. - **Since review:** `1790e42 → 4b925eb` checked; the change is the fixes above. Lint clean, `npm test` 1955 pass, journeys 116 pass and 1 known flaky (above) on the new head. - **After #635 merged:** `4b925eb → 7e0e1ad`, rebased onto trunk `e94f507`. Only `tests/e2e/journeys/i18n.spec.js` conflicted: resolved as trunk's file plus this PR's four tests, dropping this PR's copies of the imports and `MY_EDIT`, which trunk now has. #635 brought the identical `trunkDate` change to `git-site.cjs`, so it is no longer in this diff. Checked by the authoring session, not re-reviewed: build and lint clean, `npm test` 2035 pass / 0 fail / 2 skipped, the full journey suite 134 pass. </details> <details> <summary>Implementation notes</summary> - The renamed `update-plan.cjs` exports have no consumer left under their old names in `src`, `tests` or `docs`. - `main.js` reads `project-type.cjs` but never `setup`, so the getters change nothing there. </details> <details> <summary>Screenshots or recording</summary> Nothing changes in English. In the pseudo-locale every screen in this batch is bracketed, which the journeys assert. </details> 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Francesco Bigiarini <francesco.bigiarini@gmail.com>
…-logs-strings # Conflicts: # src/renderer/hooks/use-apply-patch.jsx # src/renderer/hooks/use-dev-server.jsx # src/renderer/index.jsx # tests/e2e/journeys/i18n.spec.js
…h error (#647) ## Why #630 is the last batch of #622. This PR is the part of it that doesn't wait on the five open batches (#636, #643, #644, #645, #646): the mail dialog, the Playground web server and the copy-path error were still plain English, and `applyDoneMessage` spliced a verb and a noun into an English sentence for any pair it had no sentence for. ## What changes - The mail dialog: "From:", "To:", "CC:", "Date:", the Rendered and Raw tabs, and the "Email" title of a mail with no subject. - The Playground web server: its Start and Stop buttons, the loading announcement, "Starting…", the panel's heading, "Stopped", and "Server exited with code %d". - The copy-path failure: the alert and the clipboard-unavailable message in it. - `applyDoneMessage`'s fallback is `_x('Done', 'an action that finished')` instead of `` `${verb} the ${noun}` ``. No caller reaches it today: the three in `use-apply-patch.jsx` pass only the five pairs it has sentences for. Not in this PR, because another open PR already wraps them or because #630 says to wait for one: | Item | Where | |---|---| | `COPY_BUTTON_LABELS` | #646 | | "Dismiss" on the deep-link notice, "Choose application…" | #644 | | "Setting up new site…" | #636 | | `use-dev-server.jsx` leftovers | after #646 | | `apply-card.cjs:191` period | after #645 | | `project-type.cjs` `workItem.label` | after #643, #636, #644 | | The full `--lang=en-XA` walk | after all five merge | ## How to test this Two en-XA journeys cover this, and both are red without the change: ```bash # from the repository root npm run build:once npx playwright test --project=journeys tests/e2e/journeys/i18n.spec.js -g "a mail the site sent|Playground web server" ``` - **a mail the site sent is fully translatable**: a mail on its Rendered tab and its Raw tab, and a mail with no subject, whose dialog is titled "Email". - **the Playground web server is fully translatable**: stopped, starting (including the live-region announcement), running, and after it exits with code 1. The English journeys in `mail.spec.js` still pass, so an English speaker sees the same text as before. What the journeys can't reach is the copy-path alert. It needs the clipboard to refuse a write, and I couldn't stage that. To look by hand (any platform, current head): run `npx electron . --lang=en-XA` from the repository root, start a site's dev server, and open a mail from the Email tray. Every label and both tabs show accented and in brackets. The Playground web server only appears in a build that ships `local-playground-web`, so a checkout won't show it. **What must not have happened:** with no `--lang`, the mail dialog and the web server read exactly as they did before. ## Risks and limitations - Found while writing the web server journey: `@wordpress/a11y` adds a screen-reader-only "Notifications" paragraph at DOM-ready, before the app loads its locale, so it stays English. #630 doesn't list it, so it isn't fixed here. - The web server's other errors come from main (`'local-playground-web directory not found.'`, or a thrown error) and stay English. That belongs with the main-process strings, not this renderer batch. ## Related Part of #630. Part of #622. --- <details> <summary>Review outcome</summary> **4 [fix here] · 2 [follow-up]. All 4 fixed in c9c5c0c.** One more finding was dropped as wrong (below). - **Review:** completed by a separate agent with a fresh context, against `.github/instructions/code-review.instructions.md`. Reviewed head 4f8b808, base e94f507 (trunk). `npm run lint` clean, `npm test` 2033/2033. - **Fixed:** - The web server journey could pass with the loading announcement unwrapped, because `speak()` writes outside the area scanned. It now asserts `#a11y-speak-polite`. - `__('Email')` only shows for a mail with no subject. The journey now opens one. - The `Done` fallback wasn't in the unit test that runs every sentence through a catalog. It is now. - A bare `__('Done')` would share a msgid with the `Done` button in `@wordpress/components`. It now has a context. Each new journey assertion was checked to fail with its string unwrapped. - **Deferred:** - The mail journey excuses any text that is part of the mail. No label is excused today, but matching whole text nodes would be stricter. - The web server's main-process error strings (see Risks). - **Dropped:** the finding that "Dismiss", "Choose application…", `COPY_BUTTON_LABELS` and "Setting up new site…" were unwrapped. The reviewer read the issues, not the PR diffs; #644, #646 and #636 wrap them. - **Since review:** 4f8b808 → c9c5c0c, which contains only the fixes above. Lint, unit tests and the i18n and mail journeys were rerun on c9c5c0c. </details> Nothing on screen changes in English, so there are no screenshots. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Francesco Bigiarini <francesco.bigiarini@gmail.com>
…eaks left in wrapped code (#653) ## Why #630 is the last batch of #622. #647 did the part that didn't depend on the other batches. This does the rest, now that #636, #643, #644, #645 and #646 are merged: the en-XA sweep #630 asks for, and the two rule breaks it named in already-wrapped code. ## What changes **Found by the sweep:** - xterm's own screen-reader strings: the terminal input's label ("Terminal input") and its "too much output" announcement, set through `Terminal.strings` before each terminal is created. - Main's refusal to submit while a patch is applied. It was `${label} is applied. Revert it…`, a sentence spliced around the name, and it's shown as-is in the patch pane. It's now two whole sentences, one with the name and one without. - The Playground web server's three errors from main (no folder to serve, exits before it's ready, times out). #647's review deferred these here. **Rule breaks #630 named:** - `apply-card.cjs` adds a full stop to a headline that lacks one. #630 said to drop it once main's errors carried their own. They don't, and can't all: `patch-apply.js` messages double as terminal bullets, the fallback headline is Git's own stderr line, and four paths pass a thrown error's text. So the full stop stays but goes through `_x('%s.', …)` for the translator to choose, and a sentence already ended in any script's mark (`\p{Sentence_Terminal}`) keeps it. - `workItem.label` is removed from both project types. Nothing read it once the sentences that named a work item became one per kind. **Already done, nothing to change:** `use-dev-server.jsx` had nothing left after #646. ## How to test this Any platform, current head. The suites cover it: ```bash # from the repository root npm test npm run build:once npx playwright test --project=journeys tests/e2e/journeys/i18n.spec.js ``` - `ipc-wiring.test.cjs` has two new pseudo-locale tests, for main's refusal (with and without a name) and the web server's failures. Both are red on the old `main.js`. - `apply-card.test.cjs` checks the translated full stop, and that sentences ended in `。`, `؟` and `।` keep their mark. - The i18n Terminal journey now finds the input by its translated name. The apply card journey now expects the whole refusal, full stop included, as one translated string. To look by hand: run `npx electron . --lang=en-XA` from the repository root, open a site, open the Terminal tray, and inspect the terminal's textarea. Its `aria-label` is bracketed and accented. **What must not have happened:** with no `--lang`, nothing reads differently. The refusal, the web server errors and the terminal's label are the same English as before, and `mail.spec.js`, `terminal.spec.js` and the rest of the English journeys pass unchanged. ## Risks and limitations - **What the sweep covered:** I launched en-XA with a Core site and a Gutenberg site, opened every tray, log tab and settings tab, the site menu and the create dialog, and scanned the whole window. After the xterm fix, the only English left was product names, commands, the `$` prompt and PHP version numbers. It didn't open every dialog or failure state; the existing i18n journeys cover many of those. - **Left on purpose** (#622's do-not-wrap list): main's argument guards (`'Site is not registered'`, `'No running script'`), the `github-prs.js` and `trac-view.js` errors that are replaced by a status before display, and `console.error` messages. - **Untested:** `'Timed out starting web server'` is wrapped but has no test. It needs fake timers for its 20-second wait. - #648 (the a11y "Notifications" text) is separate. ## Related Closes #630. Part of #622. --- <details> <summary>Review outcome</summary> **1 [fix here] · 1 [follow-up]. The fix is applied in c2eb4ba.** - **Review:** completed by a separate agent with a fresh context, against `.github/instructions/code-review.instructions.md`. Reviewed head c53312a, base 8303849 (trunk). `npm run lint` clean, `npm test` 2081/2081, full journey suite 147/147 on c53312a. - **Fixed:** the list of marks that end a sentence missed Devanagari `।`, Armenian, Ethiopic, Khmer and Myanmar, so a Hindi sentence would have got a second mark. It now uses `\p{Sentence_Terminal}`, with a Hindi case in the test. The doc comment's over-long line was rewrapped. - **Deferred:** a test for the web server's 20-second timeout (see Risks). - **Confirmed by the review:** - xterm reads `promptLabel` in `open()` and `tooMuchOutput` on each announcement, so setting both before `new Terminal` is early enough. - The refusal's English is unchanged for every label, including a blank one. - Nothing reads `workItem.label`. - No English journey asserts a changed string. - **Since review:** c53312a → c2eb4ba, which contains only the fix above. Lint, unit tests (2081) and the i18n journeys were rerun on c2eb4ba. One i18n journey (site details and menu, which this branch doesn't touch) failed once in that run, then passed three times on its own and in the full run before. That's a flake. </details> Nothing on screen changes in English, so there are no screenshots. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Why
The Terminal and the Logs were plain English in a translated window: the terminal's help and refusals, every line the setup, update and apply chains write there, the build watch and dev server lines, the Logs' tabs and empty-pane notes, and main's own lines from the trunk update, the pull request switch, the npm runner and the server start. This is the #627 batch of #622.
What changes
__/_n/sprintf, with commands, paths, keys and file names passed in as%s. Each line is one or more whole sentences, so the terminal can show a translated line on its own.applyLinesinwatch-activity.cjs), the wayapplyDoneMessageinconfirmations.cjsworks.applyFinishMessageused to regex the English "— open the site to try it out." out of a line; the caller now passes the line without it. The switch progress (switch-progress.cjs), the setup'sStatus: ${phase}, main'sUpdate failed during ${stage}and the npm "letting go" line each get one sentence per case.createInterpolateElement, withnpm run build,help,Ctrl+C,package.json,src/,build/anderror_log()passed in as elements.%s, from the same__('Open App Log')the menu uses (left over from Load the translation catalog in main, and translate the menu and dialog titles #634).COPY_BUTTON_LABELS,SETUP_END_MESSAGESand the setup status line move fromindex.jsxtoconfirmations.cjsascopyButtonLabel,setupEndMessageandsetupStatusLine, where the suite can reach them;STALE_ASSETSand main'sENGINE_RETRY_NOTICEbecome functions too.110 new strings. Not wrapped, per #622 or because the text is not ours: Git's own progress phases (
Updating files 3/10), npm's and the server's output, the stubappendNpmbuffer nothing shows, the42%progress figure, and the lines owned by sibling batches (SKIP_INSTALL_MESSAGEand the dirty-tree errors are #626's in #636; the patch apply lines in main are #628's; the blocked-site errors are #629's).How to test this
The new journeys cover both trays in the pseudo-locale. Run them from the repository root, on either platform:
Both fail without this change (checked by stashing
src/and rebuilding). The Terminal journey opens the tray on a built site, reads the help printed at start, typeshelpand an unknown command, joins the terminal's rows into whole lines and checks every printed line starts with[, then scans the hints under it. The Logs journey scans the empty Build watch and Debug.log panes, starts the dev server with stubbed handlers so the watch starts and the server refuses, and scans the server's failure line, the watch's start and exit lines and the tab titles as they change.What the journeys cannot reach: they stub IPC, so main's lines (trunk update, PR switch, npm runner, server start) never reach the screen in them, and neither do the apply, update and setup chains, which need a real install and build. Unit tests cover those in the pseudo-locale instead:
watch-activity,update-handoff,dev-server-command,switch-progress,confirmations,trunk-update-fetch.integrationand three inipc-wiring(the server's start failure, the trunk update's failure lines and the engine retry notice). To see the chains on screen by hand (either platform, current head):npx electron . --lang=en-XA.help.$prompt is accented and in brackets, and the help's descriptions still start in one column.What must not have happened: no English an English speaker sees has changed, apart from the one line break and the one plural named in Risks. All 132 journeys pass with their exact English strings, including
terminal.spec.js,tray.spec.js,logs.spec.js,build-watch.spec.jsanddev-server.spec.js.Risks and limitations
\n, which a translated string cannot hold, so it is now two sentences on two lines ("…npm run build once." / "Run them here whenever…");LONGEST_HELP_LINEinterminal.spec.jsfollows it. And the switch progress said "1 files"; with_nit says "1 file".i18n.spec.js(Translate the Review & submit dialog #635 did too; this branch is rebased on it). Translate the setup checklist and the trunk update banners #636 also addsimport { __ }touse-dev-server.jsxandsprintftoindex.jsx's import, where this branch addssprintftoo; those lines will need a one-line resolution, whichever merges second.npmLetGoLineinmain.jsare covered only bynpm run i18n:potextracting them and lint checking their comments; the trunk update, server start and engine retry lines haveipc-wiringtests.patch-apply.jslines) and Translate the setup checklist and the trunk update banners #626'sSKIP_INSTALL_MESSAGE(in Translate the setup checklist and the trunk update banners #636). They land with those batches.Related
Fixes #627. Part of #622. Follows #634 and #635.
Design decisions and alternatives considered
%s Show this help text, with the command padded into%s, so every printed line opens with the translated string's bracket and the descriptions still line up after the command column. The alternative, a translated description after an untranslated command, would leave each line starting in English.Restoredlines share their English but have a_xcontext per noun, so a language with gendered participles can say them differently.cloninganddone; each gets its own line and anything else says "Status update", where it used to print the code.Debug.logandDebug.log (%d)are wrapped so a translator can name the tab in their language; the file name in sentences is left as is.Review outcome (required — see AGENTS.md)
3 [fix here] · 3 [follow-up]. All 3 [fix here] findings are fixed.
🟡
copyButtonLabel,setupStatusLineandsetupEndMessagewere branches choosing user-facing sentences insideindex.jsx, which the suite cannot load. Fixed: moved toconfirmations.cjswith a test in English and in the pseudo-locale.🔵
engineRetryNoticewas made a function so it is translated when shown, and nothing checked it. Fixed: anipc-wiringtest drives the engine retry in the pseudo-locale.🔵 The Terminal journey dropped any line starting with
[, so translated text followed by English would pass. Fixed: each line must be one bracketed string from its first character to its last.Follow-up: the apply flow in the terminal is still partly English (main's "Applying …" line,
patch-apply.js,SKIP_INSTALL_MESSAGE). Those belong to Translate patch and pull request apply failures #628 and Translate the setup checklist and the trunk update banners #626 (Translate the setup checklist and the trunk update banners #636), not this batch.Follow-up: the five
compilingsentences inapplyLinesrepeatcompilingMessage()'s text, on purpose, so each can be translated whole; the test now pins all five againstcompilingMessage().Follow-up:
npmLetGoLinereadsprocess.platform, so only one platform's branch runs in a test. The split was already inline before this branch; injecting the platform is a separate change.One review note was checked and not taken: it said the renderer no longer imports
switch-progress.cjs, butindex.jsxstill does, so that module's header comment stays.Review: completed. Fresh agent context (Explore subagent given the diff and the review instructions), head
c7a1ba8/ base9fd167e. Lint clean,npm testpassing, read-only, so it did not run the journeys.Since review:
c7a1ba8 → 274bb2d. The review fixes above, then a rebase onto trunke94f507after Translate the Review & submit dialog #635 merged (onlyi18n.spec.jsconflicted: both appended tests). Checked by the authoring session, not re-reviewed by a fresh context:npm run lintclean,npm test2044 pass / 0 fail, all 132 journeys pass,npm run i18n:potclean.After CI:
274bb2d → 6179bd9. The Terminal journey failed on CI's macOS runner: it waited for the help's first line, which on that window had scrolled out of the rows xterm draws, because pseudo-locale lines are longer and wrap. It now waits for the help's last line. Reproduced locally at 1024×640 (failed before, passes after). Test-only change, checked by the authoring session, not re-reviewed: the i18n and terminal journeys pass (20).Screenshots or recording
None. Nothing changes on screen in English beyond the help's line break, and the pseudo-locale journeys are the check for the translated state.
🤖 Generated with Claude Code