mirror of
https://github.com/storytold/wordcraft.git
synced 2026-10-26 19:37:03 -06:00
* i18n: add Czech (cs) interface translation Translate the 1,246-entry interface catalog clean-room from the English source labels (cross-referenced with PdfCraft, VectorCraft, and PhotoCraft Czech catalogs) and register Czech (Čeština) for system locale detection and persisted selection. Add tests for Czech locale resolution, full catalog key parity, count-neutral word count formatting, and bundled UI font glyph coverage for Czech diacritics. # Conflicts: # ROADMAP.md * Czech: translate interface strings added on main since this PR Adds 221 Czech entries so cs.tsv again has the full zh-hans key set (2,021 entries) and drops the stale "Wildcards (regex)" row; updates the documented entry count. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Brandon Thomas <echelon@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Brandon Thomas <brandon@storyteller.ai>
118 lines
11 KiB
Markdown
118 lines
11 KiB
Markdown
# Localization parity with Microsoft Word
|
||
|
||
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-11 · **Change:** minor (Polish interface; Polish proofing — spelling, grammar, hyphenation — and a proofing language per run; previously minor: Turkish interface added; previously major: first version; catalogs measured from `crates/ui-egui/src/i18n`, Word's languages from its bundle listing) · **Target:** Microsoft Word (Microsoft 365) for Mac 16.113.4
|
||
|
||
Interface languages, script support and proofing per language. How translation works (catalog
|
||
format, adding a language, clean-room rule): `crates/ui-egui/src/i18n/mod.rs`.
|
||
|
||
**Dimension: ~27% (estimated; 25% before Polish and per-run proofing languages), 75–120 h to full
|
||
for the twelve key languages** plus ~45 h for the other ~17 languages Word ships, plus
|
||
native-speaker review (human).
|
||
|
||
## What Word ships (measured by listing the bundle)
|
||
|
||
- **30 interface languages** (31 `.lproj` folders incl. Base): ar, cs, da, de, el, en, en-GB, es,
|
||
es-MX, fi, fr, fr-CA, he, hu, id, it, ja, ko, nl, no, pl, pt (BR), pt-PT, ru, sk, sv, th, tr,
|
||
zh-CN, zh-TW. Arabic and Hebrew get a mirrored interface. No Hindi or Vietnamese interface on Mac.
|
||
- **120 proofing tools** (`SharedSupport/Proofing Tools`): spellers for ~50 languages, grammar
|
||
checkers for ~20, hyphenators for ~16, thesauri for ~20.
|
||
|
||
## What WordCraft ships (measured)
|
||
|
||
- **16 interface languages**: English plus `zh-hans`, `zh-hant`, `ja`, `uk`, `es`, `pt-br`,
|
||
Serbian `sr`/`sr-latn` (#250), Estonian `et`, Turkish `tr`, Russian `ru`, Italian `it` (#594), German `de` (#574), Polish `pl` and Czech `cs`. Catalogs have 2,021–2,399 entries
|
||
each; Polish has every key of every other catalog (a test checks it). A test (`every_tab_and_command_is_translated`) enforces that every ribbon tab, command
|
||
label and ribbon location is translated in every language.
|
||
`pl`, `pl-PL` and `pl_PL.UTF-8` system locales pick Polish automatically.
|
||
- Of the 675 English strings a scan extracts from `tl!(…)` calls and command labels/locations, each
|
||
catalog covers **661 (98%)**. Some newer dialog and pane strings (Equation tab tooltips, Zotero,
|
||
Read Aloud, Backstage greetings) aren't wrapped in `tl!` yet, so they show in English in every
|
||
language: the true share of visible strings is **~93–95%** (estimated).
|
||
- Pending PRs: Norwegian Bokmål (#208) and Nynorsk (#210), Hebrew with RTL (#20).
|
||
- **Proofing: English and Polish**, chosen per run from its language (`w:lang`, resolved through
|
||
the styles; Review › Language and the status bar set it). Languages without proofing tools get
|
||
no spelling or grammar marks (as in Word without the language's tools) instead of being flagged
|
||
as English. Detail in [Proofing per language](#proofing-per-language).
|
||
- Document scripts: shaping via HarfRust (HarfBuzz port) for every script; bidi (UAX #9) and Arabic
|
||
shaping tested (#207); IME on all desktop platforms (winit fixes pending, #155–#164).
|
||
|
||
## The twelve key languages
|
||
|
||
Status: `full` = every user-visible string translated and the script renders and edits correctly;
|
||
`partial`; `menus only`; `none`. Hours are to `full`, Opus 5.5 agent wall-clock, excluding the
|
||
shared items below.
|
||
|
||
| Language | Code | UI strings translated | Dialogs / tooltips / help | Script support | Native review | Status | Hours to full |
|
||
|---|---|---|---|---|---|---|---|
|
||
| English | en | source (100%) | ✅ | Latin ✅ | yes | **full** | 0 |
|
||
| Simplified Chinese (Mandarin) | zh-hans | 929 entries; 98% of extracted, ~95% of visible | most; newer panes English | CJK ✅, IME ✅; Windows UI font fixed (#248); interface font chain covers every catalog character, installed CJK font after the embedded ones when it doesn't, PingFang found on macOS 12 (#486); font list by Chinese names (宋体, 微软雅黑, #505); no vertical text | no | partial | 3–5 |
|
||
| Spanish | es | ~930; 98% / ~95% | most | Latin ✅ | no | partial | 1–2 |
|
||
| Hindi | hi | 0 | ❌ | Devanagari shaping via HarfRust, untested; no hyphenation | no | none | 4–6 |
|
||
| Arabic | ar | 0 | ❌ | shaping, joining, lam-alef, bidi ✅ (#207); no kashida; **no mirrored UI** | no | none | 6–8 |
|
||
| French | fr | 0 | ❌ | Latin ✅ | no | none | 3–4 |
|
||
| Portuguese | pt-br (pt-PT none) | ~930; 98% / ~95% (pt-BR) | most | Latin ✅ | no | partial | 2–4 (pt-BR finish + pt-PT) |
|
||
| Indonesian | id | 0 | ❌ | Latin ✅ | no | none | 3–4 |
|
||
| Japanese | ja | ~930; 98% / ~95% | most | CJK ✅, IME ✅; no vertical text, ruby or document grid | no | partial | 3–5 |
|
||
| German | de | 2,021 entries; same key set as zh-hans (#574); 98% of extracted, ~95% of visible | most | Latin ✅ | no | partial | 1–2 |
|
||
| Korean | ko | 0 | ❌ | Hangul ✅; macOS Korean IME fixes pending (#163, #164) | no | none | 3–5 |
|
||
| Vietnamese | vi | 0 | ❌ | Latin with stacked diacritics, untested | no | none | 3–4 |
|
||
|
||
Other shipped languages: **10** — Traditional Chinese (`zh-hant`), Ukrainian (`uk`), Serbian
|
||
Cyrillic and Latin (`sr`, `sr-latn`, #250), Estonian (`et`), Turkish (`tr`), Russian (`ru`), Italian (`it`, #594), Polish (`pl`) and Czech (`cs`), all partial.
|
||
Estonian uses the existing fonts, follows `et-EE` system locales, and is available in Options or
|
||
through `ui.language` with `{"value":"et"}`. Its 1,307 entries cover the existing interface catalog.
|
||
Estonian spelling, grammar, dates and document templates are not added by the interface catalog.
|
||
Turkish works the same way (`tr-TR` and `tr-CY` system locales, `{"value":"tr"}`) with all 1,307
|
||
entries. Command search folds the Turkish dotted and dotless I (`italik` finds İtalik, `YAZI TİPİ`
|
||
finds Yazı Tipi) while English labels and ASCII command ids keep their usual matching. Turkish
|
||
proofing is not included; terminology and checks: [`localization-tr.md`](localization-tr.md).
|
||
|
||
Polish is the only one besides English with proofing tools, and a Polish interface writes new
|
||
documents in Polish (`pl-PL`).
|
||
|
||
## Proofing per language
|
||
|
||
| Language | Spelling | Suggestions | Grammar | Hyphenation |
|
||
|---|---|---|---|---|
|
||
| English (`en`, any region; text with no language) | Moby word list (public domain, ~160k words) with inflection rules | edit distance | repeated word, `a`/`an`, sentence capital, space before punctuation, double space | Moby dictionary, our Liang patterns, heuristic |
|
||
| Polish (`pl`) | The Hunspell `pl_PL` dictionary installed on the system (OS package, Homebrew, LibreOffice, or the `WORDCRAFT_DICTIONARIES` folder; not bundled, so no Polish spelling marks without it), read at runtime by a Hunspell-style affix engine (`crates/proof/src/affix.rs`); names capitalized, compounds part by part, `Kennedy'ego` | missing diacritics first (`zolw` → `żółw`), the dictionary's confusion table (`żeka` → `rzeka`, `chuśtawka` → `huśtawka`), missing space (`napewno` → `na pewno`), one typo, then a stem scan within two typos | Polish messages: repeated word, space before punctuation, double space, sentence capital (knows `np.`, `r.`, initials, ordinals, dialogue dashes), missing comma before `że`/`który`/`ponieważ`/`gdyż`/`aby`/`żeby`/`jeśli`/`jeżeli`/`gdyby`/`lecz` (not after `mimo`, `chyba`, `tak`, prepositions…), `we`/`ze` (`we wtorek`, `ze szkoły`), doubled punctuation | TeX Polish patterns (Kołodziejska, Jackowski, Ryćko; MIT option) with their 20 exception words; a Polish syllable heuristic for letters outside the alphabet |
|
||
| Any other | — (no marks) | — | — | the English patterns, as before |
|
||
|
||
Measured with the SJP.PL dictionary: every one of the ~4.5 million forms an independent expansion of its affix file
|
||
produces is accepted, and 200,000 one-edit mutations that aren't words are all rejected; a check
|
||
takes ~1 µs, a suggestion list 1–35 ms (release build). Not yet: other languages' dictionaries,
|
||
a thesaurus for Polish, Word's style and clarity refinements, Polish-specific AutoCorrect.
|
||
|
||
Italian (`it`, #594) follows `it`, `it-IT` and `it-CH` system locales. Its catalog has every key of
|
||
the others plus 51 strings that are wrapped in `tl!` but were in no catalog yet (File › Info
|
||
properties, the File › Home greeting, list levels, Equation tab gallery and tooltips). Ribbon tabs,
|
||
groups and command names use the names Italian Word users know (feature names, as `AGENTS.md`
|
||
allows); all other text is written from the meaning of the English. No Italian proofing yet.
|
||
## Shared work (not in the per-language hours)
|
||
|
||
| Item | Hours | Notes |
|
||
|---|---|---|
|
||
| Wrap the remaining English literals in `tl!` and translate them in every catalog | 4–6 | Makes the six partial languages full except script items |
|
||
| Mirrored (right-to-left) interface for Arabic and Hebrew | 15–25 | Ribbon, panes, dialogs, rulers |
|
||
| Vertical text, ruby, document grid (Chinese, Japanese, Korean) | counted in [layout-parity.md](layout-parity.md) | |
|
||
| Proofing dictionaries, grammar and hyphenation for the 11 non-English key languages | 20–40 | Open dictionaries only (licence check per dictionary); issues #25, #40, #100. Per-run languages, the Hunspell-style affix engine and the TeX pattern reader landed with Polish, so a language with an open Hunspell dictionary and hyphenation patterns is mostly data plus grammar rules |
|
||
| Native-speaker review of every catalog | human | None reviewed yet |
|
||
|
||
## Revision history
|
||
|
||
| Date | Change | Summary |
|
||
|---|---|---|
|
||
| 2026-10-11 | minor | Czech (`cs`) interface catalog added |
|
||
| 2026-10-11 | minor | Polish interface (13 languages) and Polish proofing: SJP.PL spelling with suggestions, Polish grammar rules, TeX Polish hyphenation; proofing language per run; dimension ~25% → ~27% |
|
||
| 2026-10-11 | minor | German interface catalog (#574): 2,021 entries covering the full zh-hans key set; locale, saved-preference and bundled-font tests; no German proofing |
|
||
| 2026-10-11 | minor | Italian interface catalog (#594), locale selection, saved preference and font coverage checks; count labels put the noun first so they read right at 1 |
|
||
| 2026-10-11 | minor | Font dialog sets the Asian text font (`w:eastAsia`) and the Latin text font separately; the Asian list holds the installed Chinese, Japanese and Korean fonts by their interface-language names (#505) |
|
||
| 2026-10-11 | minor | Font list shows installed fonts by their names in the interface language (宋体 for SimSun in Chinese, Japanese and Korean names likewise) and finds them by either name; a Chinese, Japanese or Korean font is stored as `w:eastAsia` too (#505) |
|
||
| 2026-10-11 | minor | Chinese/Japanese interface fonts: a test checks every catalog character has a glyph; an installed CJK font follows the embedded faces whenever they miss one; macOS font asset folders searched for PingFang (#486) |
|
||
| 2026-10-10 | minor | Russian interface (#300; 1,524 entries, built-in style names shown translated; covers everything the interface audit finds) |
|
||
| 2026-10-11 | minor | Turkish interface catalog (1,307 entries), locale selection, saved preference, Turkish casing in command search and font coverage checks; catalog sizes re-counted |
|
||
| 2026-10-11 | trivial | English spelling (#520): our supplement `assets/spelling/en-extra.txt` adds ~220 common modern words the Moby list lacks ("desktop", "download", "email"…) |
|
||
| 2026-10-10 | minor | Estonian interface catalog, locale selection, saved preference and font coverage checks; count labels put the noun first so they read right at 1 |
|
||
| 2026-10-10 | minor | Serbian (Cyrillic and Latin) interface merged (#250) |
|
||
| 2026-10-10 | major | First version: twelve-language table, catalog coverage measured, Word's 30 UI languages and 120 proofing tools listed |
|