French, on the same terms as German #151

Closed
opened 2026-08-31 18:45:08 +00:00 by jcoffey-dev · 0 comments
Owner

Second of Phase 1. Generated by AI, unreviewed, marked Beta, with the report link in Settings doing the job a native speaker would otherwise do.

781 of 796 strings. The fifteen left are product names, bare URLs and example addresses, which should stay English. Code-split into its own 47 kB chunk.

Decisions

Register is vous, following the Sie decision and for the same reason: a mail client a workplace deployed has no business addressing anybody as tu.

One terminology decision deliberately goes the opposite way to German. "Label" stays English in German because no German client translates it; it becomes "Libellé" in French because Gmail did, and a French reader will meet it there. The rule is use what the reader will find elsewhere — not "always translate" or "never". That only looks inconsistent if you mistake the rule for the outcome.

French typography: the narrow no-break space before ? ! : is the rule and is deliberately not used. It's invisible in a diff, trivially lost in an editor, and no French webmail actually ships it. Guillemets « » are used, because those are visible and read as wrong when missing.

Two things from doing this a second time

The folder-context separator arrived as a raw U+0004 byte rather than the  escape the German file uses. It would have worked — TypeScript accepts it — and it is invisible in an editor and in a diff, which is exactly why German writes it as an escape. Converted, so both files say the same thing the same way.

The language tests named a real language as their example of an unshipped one. Shipping German broke them; shipping French broke them again. Both times the failure was the test being out of date rather than anything actually wrong. They now derive an unshipped tag and assert over every shipped language rather than a hardcoded pair — so Dutch, Spanish and Portuguese will not repeat it.

Checks

459 tests, typecheck, build clean. npm run i18n:check reports fr at 98% with no stale keys.

Still Beta until a French speaker signs it off. The places I would look first: "Suivi" for starred (Gmail's word, but it reads oddly out of context), and whether "Balayage" or "Glissement" is better for swipe gestures.

Merged 2026-08-31 as coffey-labs/ihasmail@49e703b8bb

Rebuilt from: GH Archive, git history, session transcript.

Second of Phase 1. Generated by AI, unreviewed, marked **Beta**, with the report link in Settings doing the job a native speaker would otherwise do. **781 of 796 strings.** The fifteen left are product names, bare URLs and example addresses, which should stay English. Code-split into its own 47 kB chunk. ## Decisions **Register is `vous`**, following the `Sie` decision and for the same reason: a mail client a workplace deployed has no business addressing anybody as `tu`. **One terminology decision deliberately goes the opposite way to German.** "Label" stays English in German because no German client translates it; it becomes **"Libellé"** in French because Gmail did, and a French reader will meet it there. The rule is *use what the reader will find elsewhere* — not "always translate" or "never". That only looks inconsistent if you mistake the rule for the outcome. **French typography:** the narrow no-break space before `?` `!` `:` is the rule and is deliberately not used. It's invisible in a diff, trivially lost in an editor, and no French webmail actually ships it. Guillemets « » *are* used, because those are visible and read as wrong when missing. ## Two things from doing this a second time **The folder-context separator arrived as a raw U+0004 byte** rather than the `` escape the German file uses. It would have worked — TypeScript accepts it — and it is invisible in an editor and in a diff, which is exactly why German writes it as an escape. Converted, so both files say the same thing the same way. **The language tests named a real language as their example of an unshipped one.** Shipping German broke them; shipping French broke them again. Both times the failure was the test being out of date rather than anything actually wrong. They now *derive* an unshipped tag and assert over every shipped language rather than a hardcoded pair — so Dutch, Spanish and Portuguese will not repeat it. ## Checks 459 tests, typecheck, build clean. `npm run i18n:check` reports fr at 98% with no stale keys. Still Beta until a French speaker signs it off. The places I would look first: "Suivi" for starred (Gmail's word, but it reads oddly out of context), and whether "Balayage" or "Glissement" is better for swipe gestures. **Merged** 2026-08-31 as coffey-labs/ihasmail@49e703b8bb1b <sub>Rebuilt from: GH Archive, git history, session transcript.</sub>
This repo is archived. You cannot comment on issues.