87 lines
5.6 KiB
Markdown
87 lines
5.6 KiB
Markdown
# Interface languages
|
||
|
||
Choose **Edit → Interface Language** and select **Auto (system language)**, **English**,
|
||
**Українська**, **Português (Brasil)**, **Deutsch**, **Español**, or **Čeština** (Czech).
|
||
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`. 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`, and `cs`; 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.
|
||
|
||
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.
|