chat panel keyed, first pass (280 -> 203)

The bulk of the chat UI: composer, background-job dialog, task list, usage popover,
attachments, the Claude sign-in flow and the message bubbles.

background-job-prompt.ts is exempt in full — the module builds the brief the MODEL
executes, and translating it would change what the agent does. Two marked lines,
both with the reason.

QuestionActivity.test.tsx now renders inside an I18nProvider with the real panel
catalogue. It asserted on 'Other...' and would otherwise have seen the dot-path;
wrapping keeps it asserting the English a person actually reads. Same fix the
DataTable test needed in phase 1.

Scanner, two counting bugs, each delta verified:
  - `new Error(`…`)` with a template literal fell through to 'template str' and was
    counted as convertible — the opposite of true. Now it lands in thrown errors.
  - and it was then matched by BOTH patterns, so it was counted twice while staying
    convertible; the template-string pattern now declines what a thrown Error owns.
This commit is contained in:
2026-08-23 15:43:56 +00:00
parent eba0e86758
commit 68a0a8e326
26 changed files with 504 additions and 188 deletions
+13 -2
View File
@@ -74,9 +74,20 @@ const PATTERNS: { kind: string; rx: RegExp; neverTranslate?: true }[] = [
),
},
// Thrown Errors are for whoever is reading a terminal at 4am. They stay in one language.
{ kind: 'thrown errors', rx: new RegExp(String.raw`new Error\(\s*` + Q, 'g'), neverTranslate: true },
//
// Matches a template literal as well as a quoted one: `new Error(\`Whisper returned ${res.status}\`)`
// was falling through to `template str` and so counted as convertible, which is the opposite of true.
{
kind: 'thrown errors',
rx: new RegExp(String.raw`new Error\(\s*(?:` + Q + String.raw`|\`([^\`]{2,120})\`)`, 'g'),
neverTranslate: true,
},
// `Failed to create ${kind}` — needs interpolation, so it costs more to convert.
{ kind: 'template str', rx: /`([A-Z][^`\n]{4,100}\$\{[^`]*)`/g },
//
// The lookbehind hands a thrown Error to the category above instead of counting it here as well: a
// string matched by two patterns is counted twice, and it stayed convertible, so the area could never
// reach zero however it was treated.
{ kind: 'template str', rx: /(?<!new Error\()`([A-Z][^`\n]{4,100}\$\{[^`]*)`/g },
];
/** Filters out ids, class names, paths, mime types and SCREAMING_CONSTANTS. */