12 KiB
UI localisation
The desktop app offers Čeština (cs), Deutsch (de), Eesti (et), Español (es), Italiano (it), ქართული (ka),
한국어 (ko), Русский (ru), Tiếng Việt (vi), Português (Brasil) (pt-br), Türkçe (tr), ไทย (th), 简体中文 (zh-hans) and 繁體中文 (zh-hant), alongside
English, French and Japanese, in Settings → General → Language. The choice is saved in the
existing language setting. System uses the operating system's preferred
supported language; if none matches, it uses English. An explicit choice takes
precedence over the system language.
Chinese locales without a script, including zh, zh-CN and zh-SG, select
Simplified Chinese. zh-TW, zh-HK and zh-MO select Traditional Chinese.
An explicit Hans or Hant script takes precedence over the region. Locale
matching accepts underscores, case differences and Unix encoding suffixes.
German
Deutsch (de) uses the informal "du". de, de-DE, de-AT and de-CH select it, as does the
system language when it is German. crates/ui-egui/src/i18n/de.tsv has the same keys as the Chinese
catalogs (a unit test compares them), written from the English source strings, not from the Chinese.
It was drafted with an AI and not yet reviewed by a native speaker; corrections are welcome.
Product and technology names, tool ids and shortcuts keep their spelling. The kind detection that reads
a request ("a game", "a website") also knows the German words Spiel, Webseite and Internetseite,
so a translated suggestion keeps its project kind.
Estonian
Eesti (et) is selected by et and et-EE, and by the system language when it is Estonian.
crates/ui-egui/src/i18n/et.tsv has the same keys as the other catalogs, written from the English
source. It was drafted with an AI from the English source, so corrections from native speakers are
welcome. Product and technology names, tool ids and shortcuts keep their spelling. The glossary:
Puhas ruum (Clean room), Sügav (Deep), Uuri / Ehita / Kontrolli / Valmis (Study / Build / Check /
Ready), Tõendid (Evidence), leid (finding), projekt (Project), sihtmärk (target), tööriist
(tool), töölaud (workbench), ehitaja (builder), Seaded (Settings) and taasehitus (rebuild).
The kind detection that reads a request also knows mäng for a game and veebileht, koduleht and veebisait for a website, so a translated suggestion keeps its project kind. If a request names both, the head of the main clause wins: a complement case (mängust, veebilehega) marks the source or topic, not the thing to build, so Tee sellest mängust veebileht is a website while Loo mäng nimega Veebileht is a game.
Georgian
ქართული (ka) is selected by ka and ka-GE, and by the system language when it is Georgian.
crates/ui-egui/src/i18n/ka.tsv has the same keys as the other catalogs. Written with Claude Code from the
meaning of each English string; terminology and doubtful strings decided by a native Georgian speaker (@devius).
Glyphs come from Noto Sans Georgian in craft-fonts, which the pinned craft-fonts already has; a test checks it.
Italian
Italiano (it) uses the informal "tu". it and it-IT select it, as does the system language when it is
Italian. crates/ui-egui/src/i18n/it.tsv has the same keys as the other catalogs, written from the English
source strings. It was drafted with an AI and not yet reviewed by a native speaker; corrections are welcome.
Product and technology names, tool ids and shortcuts keep their spelling. The kind detection that reads a
request also knows gioco and sito, so a translated suggestion keeps its project kind. Clean room is
Camera bianca and Deep mode is modalità Approfondita.
Vietnamese
Tiếng Việt (vi) addresses the person as bạn. vi and vi-VN select it, as does the system
language when it is Vietnamese. crates/ui-egui/src/i18n/vi.tsv has the same keys as the other
catalogs, written from the English source strings in NFC (precomposed) Unicode. It was drafted with
an AI and not yet reviewed by a native speaker; corrections are welcome. Product, technology and
engine names, tool ids and shortcuts keep their spelling. The glossary: Phòng sạch (Clean room),
Chuyên sâu (Deep), Tìm hiểu / Xây dựng / Kiểm tra / Tinh chỉnh / Sẵn sàng
(Study / Build / Check / Refine / Ready), Bằng chứng (Evidence), Phát hiện (finding),
Dự án (Project), Mục tiêu (target), Công cụ (tool), Bàn làm việc (workbench),
Cài đặt (Settings) and Dựng lại (rebuild).
The kind detection that reads a request also knows trò chơi for a game and trang web for a website, so a translated suggestion keeps its project kind.
Turkish and Thai
Türkçe (tr) is selected by tr and tr-TR, and ไทย (th) by th and
th-TH. Both have the same keys as the other catalogs. A request's project kind also knows jogo,
and oyun with its endings as whole words (so oyuncak, a toy, stays an app), and web sitesi and
internet sitesi; the Thai catalog adds เกม for a game and เว็บไซต์ and หน้าเว็บ for a website,
so a translated suggestion keeps its project kind.
The Thai catalog addresses the person as คุณ and keeps Clean room and Deep in English, as
the title bar does. The glossary: หลักฐาน (Evidence), สิ่งที่พบ (finding), โปรเจกต์ (Project),
เป้าหมาย (target), เครื่องมือ (tool), เวิร์กเบนช์ (workbench), ตัวสร้าง (builder),
การตั้งค่า (Settings) and ศึกษา / สร้าง / ตรวจ / พร้อม for Study / Build / Check / Ready.
It was drafted with an AI and not yet reviewed by a native speaker; corrections are welcome.
Thai glyphs come from Noto Sans Thai in craft-fonts, which the script test in theme.rs checks.
Scope and format
crates/ui-egui/src/i18n/cs.tsv, de.tsv, es.tsv, et.tsv, it.tsv, ka.tsv, ko.tsv, pt-br.tsv, ru.tsv, th.tsv, tr.tsv, vi.tsv, zh-hans.tsv and
zh-hant.tsv contain original
translations under the repository's MIT OR Apache-2.0 licence. Each UTF-8 line
has two columns: English source<TAB>translation. Comments begin with #;
\n represents a newline. The language registry in i18n.rs embeds the catalogs.
The catalogs cover first run, new projects, project controls, Settings, the workbench, tool titles, tool groups, target descriptions, tooltips and accessibility labels. The command palette searches translated tool titles as well as English titles and stable tool IDs. Missing translations fall back to the original English text. Product and technology names retain their spelling.
User text, AI responses, evidence and raw tool results, tool summaries and schema descriptions, logs and exported reports retain their original text. The CLI, MCP, tool IDs, stored project data and the separate browser viewer are unchanged.
Keep placeholders such as {name} and {n} intact, along with command IDs,
shortcuts, escapes and trailing …. Update every catalog (cs, de, es, et, it, ka, ko, pt-br, ru, th, tr, vi, zh-hans, zh-hant)
when English source keys change; the tests require matching key sets. Common terms include 净室 / 淨室 (Clean room), 深度 (Deep),
构建 / 建置 (Build), 证据 / 證據 (Evidence), and 项目 / 專案 (Project).
The Korean catalog ko.tsv uses 클린룸 (Clean room), 심층 (Deep), 분석 / 만들기 / 검사 / 완성
(Study / Build / Check / Ready), 근거 (Evidence) and 프로젝트 (Project); short labels are nouns and
sentences use the formal 합니다 style.
Spanish
Español (es) uses informal "tú", Mexican vocabulary (agregar, computadora, presiona) and
es, es-MX, es-419 and the other es- regions select it. The register, the Mexican vocabulary
and the glossary below were chosen by a native speaker; the catalog itself was drafted with AI
assistance from the English source, so corrections from other speakers are welcome.
Product, technology and mode names keep their spelling: Clean room and Deep stay in English because they name the two modes in the title bar, as do tool and engine names (Ghidra, Unity, Unreal, Godot, Claude Code). The terms the app itself translates follow one glossary: construir / construcción (Build), evidencia (Evidence), proyecto (Project), hallazgo (finding), objetivo (target), herramienta (tool), banco de trabajo (workbench), constructor (builder), Configuración (Settings) and Estudiar / Construir / Verificar / Listo for Study / Build / Check / Ready. Plugin stays as it is, in all 16 strings that use it, rather than the suite's complemento: it is the word the people using the interface say in Mexican Spanish, and a catalogue that changes term halfway reads worse than one that keeps a loanword.
The kind detection that reads a request also knows the Spanish words juego, juegos, jugabilidad and videojuego for a game, and sitio web and página web for a website, so a translated suggestion keeps its project kind. The bare word web is deliberately not a signal: una aplicación web is an app, not a website.
Validation
Run:
cargo test -p craft-anything-ui-egui
cargo test -p xtask
cargo clippy -p craft-anything-ui-egui -p xtask --all-targets -- -D warnings
cargo xtask i18n-coverage
Catalog tests check duplicate and empty entries, matching key sets, placeholders
and ellipses. The coverage command checks literal translation calls, common
widget labels and registered engine tool titles and groups; it also runs in
cargo xtask ci. It does not prove coverage of arbitrary runtime text or labels
held in tables, so review those when adding or changing UI code.
A UI change can land with its new strings in English while native speakers review the
translations in a PR of their own. List each new string in crates/ui-egui/src/i18n/awaiting.txt
(one per line, as in a catalog's first column). The coverage command lets the strings listed
there be missing, and the app shows them in English until a catalog has them. The command fails
once a listed string is in every catalog, or is no longer shown, so the translation PR takes it
out of the list. The catalog tests require every catalog to have the same keys, so that PR adds
each string to all of them at once. Only strings the command finds can be listed: a literal in
tr, trf or a widget's label, not one passed through a constant (tr(LABEL)), which the
command can't see and would report as not shown.
The existing snapshot example accepts any catalog code with --lang, such as
--lang zh-hant or --lang ko, for example:
cargo run -p craft-anything-ui-egui --example snapshot -- --lang zh-hant --only settings --out-dir target/snapshots/zh-hant
Chinese, Korean and Georgian glyphs use the existing craft-fonts fallback, which release and CI builds
Spanish and Estonian are Latin script and need no extra glyphs. Chinese and Korean glyphs use the existing craft-fonts fallback, which release and CI builds
Vietnamese needs craft-fonts too: the bundled DM Sans and egui's default fonts lack the letters with
stacked marks (ạ, ả, ấ, ế, ơ, ư, ữ…), so a build without craft-fonts shows them as boxes. With
craft-fonts, Noto Sans CJK SC supplies those letters (a different face from the DM Sans around them);
the script test in theme.rs checks every one of them. Chinese and Korean glyphs use the existing craft-fonts fallback, which release and CI builds
already include. Local builds must set CRAFT_FONTS_DIR to a craft-fonts checkout
before compiling to get the same glyph coverage. The catalogs add no font assets.
Check each script, clipping, narrow windows and native file dialogs visually
on each platform; catalog coverage alone does not verify layout or fonts.