mirror of
https://github.com/storytold/cadcraft.git
synced 2026-10-26 11:56:50 -06:00
Add the 238 rows that still fell back to English, taking the catalog to
1,231 rows: it now covers the reference catalog and every marked UI
literal (commands, menus, tool groups and tooltips, object snaps,
drafting prompts, dialogs and Preferences), so the i18n tests report no
remaining gaps for pt-BR.
The translations follow the terminology already used in the catalog
(cota, hachura, camada, pinça, janela gráfica, referência a objetos) and
preserve placeholders ({n}, {name}) and trailing ellipses exactly.
Also add a bundled-font glyph test for the catalog's accented letters,
mirroring the German and Ukrainian ones, and record the completion in
docs/localization-parity.md (status line and revision history) and
docs/localization.md.
Written from CADCraft's English strings; no proprietary localization
resources were copied.
Co-authored-by: Brandon Thomas <echelon@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
94 lines
6.3 KiB
Markdown
94 lines
6.3 KiB
Markdown
# Interface languages
|
||
|
||
Choose **Edit → Interface Language** and select **Auto (system language)**, **English**,
|
||
**Українська**, **Português (Brasil)**, **Deutsch**, **Español**, **Čeština** (Czech), **Русский**, **Français**, **简体中文**, or **Italiano**.
|
||
The interface updates without restarting, including the native macOS menus.
|
||
The choice is saved with the other interface preferences (`cadcraft.prefs`, beside the theme):
|
||
eframe storage on the desktop, browser local storage on the web. Installations without a saved
|
||
choice use Auto.
|
||
|
||
Auto uses the first supported language in the operating system's preferred locales, or the
|
||
browser's `navigator.languages` on the web. BCP 47 and POSIX tags select their primary language:
|
||
`uk-UA` → `uk`, `de_AT.UTF-8` → `de`, `es-MX` → `es`, `pt_BR.UTF-8` → `pt-BR`,
|
||
`cs-CZ` and `cs_CZ.UTF-8` → `cs`, `it-IT` and `it_CH.UTF-8` → `it`. Unsupported languages fall back to English.
|
||
Set `CADCRAFT_LOCALE=cs-CZ` to override the desktop's locale for a launch.
|
||
An explicit saved language choice takes precedence over that override.
|
||
|
||
Automation can select the language through the existing control channel:
|
||
|
||
```json
|
||
{"id":1,"method":"engine.execute","params":{"command":"ui.language","params":{"lang":"cs"}}}
|
||
```
|
||
|
||
The `ui.set` method also accepts `{"interfaceLanguage":"cs"}`. Supported values are `auto`,
|
||
`en`, `uk`, `pt-BR`, `de`, `es`, `cs`, `ru`, `fr`, `zh`, and `it`; invalid values are rejected without changing the current
|
||
selection. Resetting palettes keeps the language choice.
|
||
|
||
## Translation coverage
|
||
|
||
The catalogs cover command and menu labels, tool groups and tooltips, the Start page,
|
||
file and model-space tabs, status controls, object snaps, drafting prompts, property labels,
|
||
dialogs, and the About window's controls. The command reference can be searched by English
|
||
command ID, English label, or translated label. Ukrainian has enforced coverage;
|
||
missing entries in the other catalogs are reported by tests and fall back to English.
|
||
|
||
Czech has 1,202 catalog rows, covering the reference catalog and every marked UI
|
||
literal, including Options. Four `menu` entries distinguish menu headings from object/command
|
||
labels: **Zobrazení / Pohled**, **Kreslení / Kreslit**, **Kótování / Kóta**, and **Modifikace / Upravit**.
|
||
The translation is AI-assisted work by @Losminek, reviewed against Czech desktop and CAD UI
|
||
conventions and an independent review pass; it has not yet been proofread by a native speaker.
|
||
|
||
Brazilian Portuguese has 1,231 catalog rows and also covers the reference catalog and every marked UI
|
||
literal: commands, menus, tool groups and tooltips, object snaps, drafting prompts, dialogs and
|
||
Preferences; its gaps are now zero. Its plural rule is `one|other` (0 and 1 are `one`), as CLDR defines
|
||
for `pt`, and the catalog's accented letters (`Á Â Í Ó Ú à á â ã ç é ê í ó ô õ ú`) render in the
|
||
bundled fonts. The original catalog was contributed by @WladmirJunior; the remaining rows were completed
|
||
by @RicSchonfelder with AI assistance and have not yet been proofread by a native speaker.
|
||
|
||
Drawing titles, layer/layout/block/style names, parameter names and expressions, text in a
|
||
drawing, and command-line input are user data and retain their original spelling. Clickable
|
||
command keywords retain their English spelling so the text shown matches the input accepted
|
||
by the engine. CLI/MCP/control responses, engine diagnostics and command history remain
|
||
English. Uncatalogued text also falls back to English. Number formatting and the operating
|
||
system's own file-picker controls follow the existing behavior.
|
||
|
||
The bundled egui fonts cover Ukrainian (`Ґґ Єє Іі Її`), German (`ÄÖÜ äöü ß`), and Czech
|
||
(`ÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ áčďéěíňóřšťúůýž`, including typographic quotes `„…“`).
|
||
The translations add no font assets and work on the web without system fonts.
|
||
|
||
## Adding translations
|
||
|
||
The implementation follows the display-time catalog pattern used by
|
||
[VectorCraft #205](https://github.com/storytold/vectorcraft/pull/205),
|
||
[PdfCraft #106](https://github.com/storytold/pdfcraft/pull/106), and
|
||
[FilmCraft #238](https://github.com/storytold/filmcraft/pull/238). Its code is local to CADCraft.
|
||
|
||
- `crates/ui-egui/src/i18n/*.tsv` are UTF-8 with three tab-separated columns:
|
||
`context`, `English source`, and `translation`. Ordinary labels have an empty context.
|
||
Optional `menu` entries translate menu headings via `i18n::menu` / `i18n::tr_menu`;
|
||
without one, the ordinary translation is used.
|
||
- `@plural` entries hold the language's forms for integer counts: Ukrainian `one|few|many`,
|
||
German and Spanish `one|other`, Brazilian Portuguese `one|other` (0 and 1 are `one`),
|
||
Czech `one|few|other` (1; 2–4; everything else, including 0, 11, 21 and 22).
|
||
The API takes `u64`, so fractional counts are not accepted.
|
||
- Register a new catalog in `i18n::LANGUAGES`, add its preference variant and code/name,
|
||
and set its integer plural rule and form count on the `Language` row.
|
||
- Use `crate::tl!("English label")` for a literal, `i18n::t(label)` for a known dynamic UI
|
||
label, and `crate::tf!("Version {version}", version = value)` for named placeholders.
|
||
Translate only at the display boundary; never look up arbitrary user names or identifiers.
|
||
- Windows retain explicit IDs based on their English source, and tool groups retain their
|
||
source names as keys, so switching languages preserves their state.
|
||
- Add a translation attribution row in `ATTRIBUTION.md`, update the language lists, and add
|
||
locale, plural, font-glyph and live-switch tests. Add the catalog to `REPORTED` in
|
||
`i18n/tests.rs`: only Ukrainian, the reference translation, is in `REQUIRED`, so adding a
|
||
command needs a row in one language, not in all of them.
|
||
- Catalogs are embedded and parsed once. Missing or malformed rows cannot crash the app;
|
||
tests reject invalid rows, duplicate keys, changed placeholders, and mismatched ellipses.
|
||
- `cargo test -p cadcraft-ui-egui i18n` checks menu/command/tool/snap coverage, every marked
|
||
UI literal, locale resolution, preferences, integer plurals, bundled glyphs and actual
|
||
egui renders with language switching. `cargo xtask assets` checks asset attribution;
|
||
`cargo xtask ci` runs the workspace quality gates.
|
||
|
||
Translations are original work under `MIT OR Apache-2.0`, written from the meaning of
|
||
CADCraft's English strings. Do not copy proprietary localization resources.
|