Phase 2, third of four. 781 strings, machine-made and marked Beta, on the same terms as the five Phase 1 languages — the report link stands in for the native speaker we do not have, and a missing entry falls back to English, so deleting a bad line is a valid fix rather than a regression.
Two things differ in kind from the European catalogues, and the file header records both so a later editor does not quietly undo them.
Plurals: there are none.Intl.PluralRules("zh-Hans") returns other for every number, checked rather than assumed, so each counted string carries a single form:
"{n} messages":{other:"{n} 封邮件"},
Supplying one, few or many would be filling in a distinction the language does not draw, and none of them would ever be selected. Note the measure word — 封 for letters, 个 for conversations — which is why these are three separate entries rather than one pattern.
Script: this is Simplified, and the tag says so. A zh-Hant catalogue would be a separate file, not a character conversion of this one: the software vocabulary differs as much as the script does (软件/軟體, 文件/檔案, 网络/網路), and converting characters alone produces text that is readable and obviously foreign. A sweep of the finished file confirms no Traditional-only forms and no stray characters from another script.
Register is 您 where the reader is addressed directly, matching the formal address every other catalogue took. Most of the file drops the pronoun entirely, which is what a Chinese interface normally does.
Verified
Against the mock server, in a visible tab:
role folders localise (收件箱, 归档, 已删除邮件, 草稿, 垃圾邮件, 已发送) and the custom ones — Newsletters, Work — are left exactly as the user named them
dates and the calendar follow the language: 8月30日, 2026年8月30日周日 15:12, 周一–周日 column headers
41 个会话 renders through the single plural form
the catalogue code-splits into its own chunk, 41.6 kB (17.7 kB gzipped), loaded only when chosen
npx tsc --noEmit, scripts/i18n-catalog-check.mjs (781/796, level with the other five), 109 node tests, 459 web tests, npm run build.
Noticed while verifying, not fixed here
Two labels stay English in every language, including the five already shipped, because neither reaches the extractor:
CalendarView.tsx:130 builds the Day/Week/Month/Agenda switcher labels from the view id (v[0].toUpperCase() + v.slice(1)) — the four strings are already in every catalogue, so this is a one-line lookup away from working
Composer.tsx:144 falls back to the literal "New message" for an untitled draft
Both belong in a shared fix rather than a language PR.
Phase 2, third of four. 781 strings, machine-made and marked **Beta**, on the same terms as the five Phase 1 languages — the report link stands in for the native speaker we do not have, and a missing entry falls back to English, so deleting a bad line is a valid fix rather than a regression.
Two things differ in kind from the European catalogues, and the file header records both so a later editor does not quietly undo them.
**Plurals: there are none.** `Intl.PluralRules("zh-Hans")` returns `other` for every number, checked rather than assumed, so each counted string carries a single form:
```ts
"{n} messages": { other: "{n} 封邮件" },
```
Supplying `one`, `few` or `many` would be filling in a distinction the language does not draw, and none of them would ever be selected. Note the measure word — 封 for letters, 个 for conversations — which is why these are three separate entries rather than one pattern.
**Script: this is Simplified, and the tag says so.** A `zh-Hant` catalogue would be a separate file, not a character conversion of this one: the software vocabulary differs as much as the script does (软件/軟體, 文件/檔案, 网络/網路), and converting characters alone produces text that is readable and obviously foreign. A sweep of the finished file confirms no Traditional-only forms and no stray characters from another script.
Register is 您 where the reader is addressed directly, matching the formal address every other catalogue took. Most of the file drops the pronoun entirely, which is what a Chinese interface normally does.
### Verified
Against the mock server, in a visible tab:
- role folders localise (收件箱, 归档, 已删除邮件, 草稿, 垃圾邮件, 已发送) and the custom ones — Newsletters, Work — are left exactly as the user named them
- dates and the calendar follow the language: 8月30日, 2026年8月30日周日 15:12, 周一–周日 column headers
- `41 个会话` renders through the single plural form
- the catalogue code-splits into its own chunk, 41.6 kB (17.7 kB gzipped), loaded only when chosen
`npx tsc --noEmit`, `scripts/i18n-catalog-check.mjs` (781/796, level with the other five), 109 node tests, 459 web tests, `npm run build`.
### Noticed while verifying, not fixed here
Two labels stay English in *every* language, including the five already shipped, because neither reaches the extractor:
- `CalendarView.tsx:130` builds the Day/Week/Month/Agenda switcher labels from the view id (`v[0].toUpperCase() + v.slice(1)`) — the four strings are already in every catalogue, so this is a one-line lookup away from working
- `Composer.tsx:144` falls back to the literal `"New message"` for an untitled draft
Both belong in a shared fix rather than a language PR.
**Merged** 2026-08-31 as coffey-labs/ihasmail@94e387267bcd
<sub>Rebuilt from: git history, 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.
Phase 2, third of four. 781 strings, machine-made and marked Beta, on the same terms as the five Phase 1 languages — the report link stands in for the native speaker we do not have, and a missing entry falls back to English, so deleting a bad line is a valid fix rather than a regression.
Two things differ in kind from the European catalogues, and the file header records both so a later editor does not quietly undo them.
Plurals: there are none.
Intl.PluralRules("zh-Hans")returnsotherfor every number, checked rather than assumed, so each counted string carries a single form:Supplying
one,fewormanywould be filling in a distinction the language does not draw, and none of them would ever be selected. Note the measure word — 封 for letters, 个 for conversations — which is why these are three separate entries rather than one pattern.Script: this is Simplified, and the tag says so. A
zh-Hantcatalogue would be a separate file, not a character conversion of this one: the software vocabulary differs as much as the script does (软件/軟體, 文件/檔案, 网络/網路), and converting characters alone produces text that is readable and obviously foreign. A sweep of the finished file confirms no Traditional-only forms and no stray characters from another script.Register is 您 where the reader is addressed directly, matching the formal address every other catalogue took. Most of the file drops the pronoun entirely, which is what a Chinese interface normally does.
Verified
Against the mock server, in a visible tab:
41 个会话renders through the single plural formnpx tsc --noEmit,scripts/i18n-catalog-check.mjs(781/796, level with the other five), 109 node tests, 459 web tests,npm run build.Noticed while verifying, not fixed here
Two labels stay English in every language, including the five already shipped, because neither reaches the extractor:
CalendarView.tsx:130builds the Day/Week/Month/Agenda switcher labels from the view id (v[0].toUpperCase() + v.slice(1)) — the four strings are already in every catalogue, so this is a one-line lookup away from workingComposer.tsx:144falls back to the literal"New message"for an untitled draftBoth belong in a shared fix rather than a language PR.
Merged 2026-08-31 as coffey-labs/ihasmail@94e387267b
Rebuilt from: git history, session transcript.