The first language — and the first one where the honest thing to say isn't flattering: no native speaker has read it.
That's stated in the app, not just here. It's the fact a reader needs to judge what they're looking at: somebody told a translation is unchecked forgives an odd sentence and reports it; somebody told it was reviewed reasonably concludes the product is sloppy. The setting carries a link straight to a report, which is the entire review process available to us.
beta is a property of the language, not of the catalogue's completeness. A file can be word-for-word finished and still read like a machine wrote it — that's what the flag marks. Removing it is a person's decision, not something a percentage earns.
Decisions written down so they don't get re-taken
Register is Sie, consistently, recorded in the file so the next language and the next contributor inherit it. Thunderbird and Outlook use it, and ihasmail is as often a company's mail as somebody's own — "du" from software the workplace deployed reads as presumptuous in a way "Sie" never does. Where a string can dodge the question it does, which is ordinary good German UI.
A glossary fixes the vocabulary once — Posteingang, Papierkorb, Entwürfe, archivieren — because inconsistency reads as amateur far more than an imperfect word choice does. "Label" and "Spam" stay English: translating them would name things no German mail client calls that.
766 of 781 strings. The fifteen left are product names, bare URLs and example addresses, which should stay English and now do. The catalogue is code-split into its own 42 kB chunk, so English users never download it.
Two things this turned up that earlier work had hidden
Labels held in module-level constants could only ever be English — the entire settings navigation, the theme cards, the swipe choices, date formats, sharing permissions. They're evaluated once, before any catalogue loads. Nothing failed; the German build simply had an English sidebar. They're translated where they render now.
The codemod's narrowed rule was too broad after all. Letting it wrap text adjacent to elements (which took 73 more strings in #148) also let through text stranded after an inline <a> or <strong> — ", and what a new account starts on." Eight sentence fragments, rebuilt with tNode().
A new check that earned itself immediately
npm run i18n:check compares a catalogue against the strings the code actually asks for. It found three keys I'd invented that the code never asks for — the silent failure mode in a catalogue: a translation that looks correct, is never looked up, and renders English for ever. Nothing else would have caught it.
It also had to be taught about t(variable), because it cried wolf 33 times over the constants above — and a check that cries wolf gets switched off.
Verification
449 tests, typecheck, build clean. Verified in the browser, which is the only place the English settings sidebar was visible — tests and typecheck were perfectly happy with it.
What this needs from a person
A German speaker reading the catalogue and saying whether it's right. Until then it stays Beta, and bug reports are the review. The two places I'd look first are the longer settings prose, where register and flow matter most, and Konversation vs Unterhaltung for "conversation" — both are defensible and I picked one.
Rebuilt from: session transcript.
The first language — and the first one where the honest thing to say isn't flattering: **no native speaker has read it.**
That's stated in the app, not just here. It's the fact a reader needs to judge what they're looking at: somebody told a translation is unchecked forgives an odd sentence and reports it; somebody told it was reviewed reasonably concludes the product is sloppy. The setting carries a link straight to a report, which is the entire review process available to us.
**`beta` is a property of the language, not of the catalogue's completeness.** A file can be word-for-word finished and still read like a machine wrote it — that's what the flag marks. Removing it is a person's decision, not something a percentage earns.
## Decisions written down so they don't get re-taken
**Register is `Sie`**, consistently, recorded in the file so the next language and the next contributor inherit it. Thunderbird and Outlook use it, and ihasmail is as often a company's mail as somebody's own — "du" from software the workplace deployed reads as presumptuous in a way "Sie" never does. Where a string can dodge the question it does, which is ordinary good German UI.
**A glossary fixes the vocabulary once** — Posteingang, Papierkorb, Entwürfe, archivieren — because inconsistency reads as amateur far more than an imperfect word choice does. "Label" and "Spam" stay English: translating them would name things no German mail client calls that.
**766 of 781 strings.** The fifteen left are product names, bare URLs and example addresses, which should stay English and now do. The catalogue is code-split into its own 42 kB chunk, so English users never download it.
## Two things this turned up that earlier work had hidden
**Labels held in module-level constants could only ever be English** — the entire settings navigation, the theme cards, the swipe choices, date formats, sharing permissions. They're evaluated once, before any catalogue loads. Nothing failed; the German build simply had an English sidebar. They're translated where they render now.
**The codemod's narrowed rule was too broad after all.** Letting it wrap text adjacent to elements (which took 73 more strings in #148) also let through text stranded after an inline `<a>` or `<strong>` — `", and what a new account starts on."` Eight sentence fragments, rebuilt with `tNode()`.
## A new check that earned itself immediately
`npm run i18n:check` compares a catalogue against the strings the code actually asks for. It found **three keys I'd invented that the code never asks for** — the silent failure mode in a catalogue: a translation that looks correct, is never looked up, and renders English for ever. Nothing else would have caught it.
It also had to be taught about `t(variable)`, because it cried wolf 33 times over the constants above — and a check that cries wolf gets switched off.
## Verification
449 tests, typecheck, build clean. Verified **in the browser**, which is the only place the English settings sidebar was visible — tests and typecheck were perfectly happy with it.
## What this needs from a person
A German speaker reading the catalogue and saying whether it's right. Until then it stays Beta, and bug reports are the review. The two places I'd look first are the longer settings prose, where register and flow matter most, and `Konversation` vs `Unterhaltung` for "conversation" — both are defensible and I picked one.
<sub>Rebuilt from: session transcript.</sub>
This repo is archived. You cannot comment on issues.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
The first language — and the first one where the honest thing to say isn't flattering: no native speaker has read it.
That's stated in the app, not just here. It's the fact a reader needs to judge what they're looking at: somebody told a translation is unchecked forgives an odd sentence and reports it; somebody told it was reviewed reasonably concludes the product is sloppy. The setting carries a link straight to a report, which is the entire review process available to us.
betais a property of the language, not of the catalogue's completeness. A file can be word-for-word finished and still read like a machine wrote it — that's what the flag marks. Removing it is a person's decision, not something a percentage earns.Decisions written down so they don't get re-taken
Register is
Sie, consistently, recorded in the file so the next language and the next contributor inherit it. Thunderbird and Outlook use it, and ihasmail is as often a company's mail as somebody's own — "du" from software the workplace deployed reads as presumptuous in a way "Sie" never does. Where a string can dodge the question it does, which is ordinary good German UI.A glossary fixes the vocabulary once — Posteingang, Papierkorb, Entwürfe, archivieren — because inconsistency reads as amateur far more than an imperfect word choice does. "Label" and "Spam" stay English: translating them would name things no German mail client calls that.
766 of 781 strings. The fifteen left are product names, bare URLs and example addresses, which should stay English and now do. The catalogue is code-split into its own 42 kB chunk, so English users never download it.
Two things this turned up that earlier work had hidden
Labels held in module-level constants could only ever be English — the entire settings navigation, the theme cards, the swipe choices, date formats, sharing permissions. They're evaluated once, before any catalogue loads. Nothing failed; the German build simply had an English sidebar. They're translated where they render now.
The codemod's narrowed rule was too broad after all. Letting it wrap text adjacent to elements (which took 73 more strings in #148) also let through text stranded after an inline
<a>or<strong>—", and what a new account starts on."Eight sentence fragments, rebuilt withtNode().A new check that earned itself immediately
npm run i18n:checkcompares a catalogue against the strings the code actually asks for. It found three keys I'd invented that the code never asks for — the silent failure mode in a catalogue: a translation that looks correct, is never looked up, and renders English for ever. Nothing else would have caught it.It also had to be taught about
t(variable), because it cried wolf 33 times over the constants above — and a check that cries wolf gets switched off.Verification
449 tests, typecheck, build clean. Verified in the browser, which is the only place the English settings sidebar was visible — tests and typecheck were perfectly happy with it.
What this needs from a person
A German speaker reading the catalogue and saying whether it's right. Until then it stays Beta, and bug reports are the review. The two places I'd look first are the longer settings prose, where register and flow matter most, and
KonversationvsUnterhaltungfor "conversation" — both are defensible and I picked one.Rebuilt from: session transcript.