Third pass: the strings libraries build and views render raw #259

Closed
opened 2026-09-03 20:51:53 +00:00 by jcoffey-dev · 0 comments
Owner

A sweep of lib/ and store/ for user-facing English, after the views were done. The pattern is the one #248 found: a module returns an English sentence and the view renders it without asking for a translation.

Scheduled send — entirely untranslated

The four presets (Later today, Tomorrow morning, Tomorrow afternoon, Monday morning) were rendered raw, and scheduleError() returned three English sentences straight into the picker.

describeSpan() built "30 days" with day${n === 1 ? "" : "s"} — English grammar written into the code. It produces correct German only because the two languages happen to agree, and Russian needs three forms. It is plural() now.

scheduleError translates in place rather than returning a key, because it composes a sentence around that span.

Read receipts

refusalText() returns five explanations, all rendered raw in MessageView. The offered case was a template literal — `Requested, to ${email}. Never sent automatically.` — with the address concatenated in. It takes a {address} placeholder now, so the sentence can be reordered.

Compose

The sending toast and its Undo, the Open draft action, two attachment failures, and three thrown errors that reach the reader as toasts.

A gap in my own earlier analysis

Add star and Remove star are rendered through t(desc.label) and have never been in any catalogue. The coverage scan that found the other 176 only looked at t("literal") call sites, so any label reaching t() through a variable was invisible to it.

I have now enumerated every such table — PUSH_LABEL, the settings menu, share rights, folder roles, date formats, appearance modes, swipe actions — and checked all 61 values. These two were the only ones missing. The settings menu labels, which #247 flagged, were all present and are fixed by #248 rendering them through t().

Strings

17 new strings and 3 new plural forms. They land with each language PR, which is why those are still open.

Checks

Typecheck clean, 99 test files / 1000 tests pass.

Merged 2026-09-03 as coffey-labs/ihasmail@22f39a4507

Rebuilt from: git history, session transcript.

A sweep of `lib/` and `store/` for user-facing English, after the views were done. The pattern is the one #248 found: a module returns an English sentence and the view renders it without asking for a translation. ## Scheduled send — entirely untranslated The four presets (`Later today`, `Tomorrow morning`, `Tomorrow afternoon`, `Monday morning`) were rendered raw, and `scheduleError()` returned three English sentences straight into the picker. `describeSpan()` built "30 days" with ``day${n === 1 ? "" : "s"}`` — English grammar written into the code. It produces correct German only because the two languages happen to agree, and Russian needs three forms. It is `plural()` now. `scheduleError` translates in place rather than returning a key, because it composes a sentence around that span. ## Read receipts `refusalText()` returns five explanations, all rendered raw in `MessageView`. The offered case was a template literal — `` `Requested, to ${email}. Never sent automatically.` `` — with the address concatenated in. It takes a `{address}` placeholder now, so the sentence can be reordered. ## Compose The sending toast and its `Undo`, the `Open draft` action, two attachment failures, and three thrown errors that reach the reader as toasts. ## A gap in my own earlier analysis `Add star` and `Remove star` are rendered through `t(desc.label)` and have **never** been in any catalogue. The coverage scan that found the other 176 only looked at `t("literal")` call sites, so any label reaching `t()` through a variable was invisible to it. I have now enumerated every such table — `PUSH_LABEL`, the settings menu, share rights, folder roles, date formats, appearance modes, swipe actions — and checked all 61 values. These two were the only ones missing. The settings menu labels, which #247 flagged, were all present and are fixed by #248 rendering them through `t()`. ## Strings 17 new strings and 3 new plural forms. They land with each language PR, which is why those are still open. ## Checks Typecheck clean, 99 test files / 1000 tests pass. **Merged** 2026-09-03 as coffey-labs/ihasmail@22f39a45076b <sub>Rebuilt from: git history, session transcript.</sub>
This repo is archived. You cannot comment on issues.