complete_languages_translate_every_message read a message literal only
right after a marker such as Err( or Other(. It did not read the
message given to the engine's bad(cmd, ...), so this test did not
require a row for a parameter error. It also did not read the messages
given to the engine's err() and error(), to the PDF writer's bad() and
failed(), or to an error enum's variant such as PsError::Limit(...).
1,122 of these messages have no row in any complete catalog.
The scan now reads those messages, a literal or a format! string, in
the same template form as the catalogs' rows. It skips PsError::Ps and
EngineError::UnknownCommand, whose first argument is a PostScript error
name or a command id. The 1,122 messages are listed in
untranslated_messages.txt next to the tests, together with the 71 that
pull requests open at 009384b add without rows, and the test lets a
listed message through whether or not it has rows. Every other message
needs a row in each complete catalog, so a new message made this way
fails the test until it has its rows.
VECTORCRAFT_I18N_DUMP_UNTRANSLATED=<file> writes the messages in the
sources that lack a row. No catalog rows change.
Docs: docs/development.md, docs/localization-parity.md.
12 KiB
Localization parity
Last reviewed: 2026-10-10 · Last updated: 2026-10-16 · Change: minor (Georgian (
ka) interface catalog; Bulgarian (bg) and Greek (el) catalogs complete under the tests, #1909, #2076; Finnish (fi) catalog added, complete under the tests; Swedish (sv) catalog added, complete under the tests; scores and estimates unchanged; Brazilian Portuguese (pt-br) catalog completed under the tests: menus,tl!literals and messages; 12-language score 71% → 74%; #1914) · Target: Adobe Illustrator 2026 (30.x)
Per-language status of VectorCraft's interface. How the catalogs work and how to add a language:
development.md › Localisation. Part of
target-app-parity.md.
How it is measured: rows with a translation in each crates/ui-egui/src/i18n/<code>.tsv, counted on
origin/main 01e165af, except the rows that give a count date, which were counted on main at cb0a7d9 (2026-10-21).
The reference is the French catalog, which the tests hold complete: 3,416 interface
strings (menus, command labels, tl! literals: panels, dialogs, tooltips, Preferences) plus 604 @msg status and
error messages, 4,020 in all. A language's % is its rows over 4,020 (capped at 100% per part). The
complete_menus flag and COMPLETE_MESSAGES list make i18n::tests fail if a complete language misses a
string, so "full" here is enforced by tests. The messages listed in crates/ui-egui/src/i18n/untranslated_messages.txt
are not translated yet, and the tests let them through. No language has help content: there is no translated (or English)
in-app help, and the docs are English.
error messages, 4,020 in all. A language's % is its rows over 4,020 (capped at 100% per part).
i18n::tests fail if a language with the complete_menus flag misses a menu string or tl! literal, or if a
language in the COMPLETE_MESSAGES list misses a status or error message. Every non-English language marked
"full" has the flag, and all of them except Bulgarian are in the list. No language has help content: there is
no translated (or English) in-app help, and the docs are English.
Native review: every catalog was written clean-room from the English meaning, most of it by agents
(bflatastic), with community contributors adding or correcting (German by dwetscher, Japanese and Traditional
Chinese by imachus). Only Georgian is recorded as reviewed by a native speaker; the other catalog headers ask for one.
The twelve key languages
| Language | Code | UI strings translated | Dialogs / tooltips / messages | Script support | Native review | Status | To full (h) |
|---|---|---|---|---|---|---|---|
| English | en |
source, 100% | all | Latin | — | full | — |
| Simplified Chinese (Mandarin) | zh-hans |
5,102 rows, 791 of them @msg (counted 2026-10-21): menus, tl! literals and messages complete (tests) |
all | CJK UI font from craft-fonts (BIZ UDPGothic) when embedded, else a system font; IME with marked text at the caret; vertical type partial (type-parity.md) | no | full | — (review) |
| Spanish | es |
4,009 / 4,020 (99.7%) | all (604 messages) | Latin | no | full | — (review) |
| Hindi | hi |
0 | none | Devanagari: the document's text shapes (HarfRust), with tests of conjuncts, reph, pre-base matras, nukta forms and caret stops that run when an OpenType Devanagari font is installed, but the egui interface does no complex shaping | no | none | 20–30 |
| Arabic | ar |
0 | none | document text: bidi layout and Paragraph Direction; interface: no right-to-left layout, no Arabic shaping in egui | no | none | 25–40 |
| French | fr |
4,020 / 4,020 (100%) | all | Latin | no | full | — (review) |
| Portuguese | pt-br |
5,194 catalog entries (counted 2026-10-21): menus, tl! literals and messages complete (tests); one/other plurals |
all | Latin | contributor is a Brazilian Portuguese speaker; further native review welcome | full | — (review) |
| Indonesian | id |
5,279 rows, 750 of them @msg (counted 2026-10-21): menus and tl! literals complete (tests); the tests do not hold its messages complete; one plural form |
dialogs and tooltips all; 750 message rows (French has 796) | Latin | no | full | — (review) |
| Japanese | ja |
4,004 / 4,020 (99.6%) | all | CJK UI font as above; Japanese IME; vertical type partial; Japanese crop marks and composition settings | no | full | — (review) |
| German | de |
3,952 / 4,020 (98%; tests hold menus, literals and messages complete) | all (602 of 604 message rows; landed 2026-10-10) | Latin | contributor-written, not reviewed | full | — (review) |
| Korean | ko |
4,870 rows (counted 2026-10-21): menus, tl! literals and messages complete (tests); one plural form |
all | Hangul from an installed system font on the desktop (Apple SD Gothic Neo, Malgun Gothic, Noto Sans CJK KR…); the web build has no Korean UI font yet (craft-fonts); IME path exists | no (AI-drafted) | full | — (review; web font) |
| Vietnamese | vi |
4,886 rows (counted 2026-10-21): menus, tl! literals and messages complete (tests); one plural form; 4,046 plain + 18 @plural + 28 contextual + 794 @msg |
all | Latin with Vietnamese diacritics (precomposed forms; glyph tests pass) | contributor is a Vietnamese speaker; AI-assisted draft, further native review welcome | full | — (review) |
12-language score: ~82% (equal weights: 100 + 85 + 100 + 0 + 0 + 100 + 100 + 100 + 100 + 98 + 100 + 100, over 12).
To full for all twelve: ~50–85 h, most of it Arabic (right-to-left interface) and Hindi (interface
shaping). Each new Latin-script catalog is ~4,000 rows; the existing ones were written in a few agent hours each
plus review. Native-speaker review is human work and isn't in the hours.
Other shipped languages
| Language | Code | Translated | Status |
|---|---|---|---|
| Traditional Chinese (Taiwan) | zh-hant |
4,892 rows, 790 of them @msg (counted 2026-10-21): menus, tl! literals and messages complete under the tests (80% overall) |
partial |
| Italian | it |
4,011 / 4,020 | full |
| Dutch | nl |
5,317 rows, 777 of them @msg (counted 2026-10-21): menus and tl! literals complete (tests); the tests do not hold its messages complete; one/other plurals |
full |
| Danish | da |
5,279 rows, 750 of them @msg (counted 2026-10-21): menus and tl! literals complete (tests); the tests do not hold its messages complete; one/other plurals |
full |
| Russian | ru |
4,009 / 4,020 | full |
| Ukrainian | uk |
4,009 / 4,020 (one/few/many plurals) | full |
| Hungarian | hu |
5,253 rows (counted 2026-10-21): menus, tl! literals and messages complete (tests); one plural form |
full |
| Polish | pl |
5,130 rows (counted 2026-10-21): menus, tl! literals and messages complete (tests); one/few/many plurals |
full; native review pending |
| Finnish | fi |
5,318 rows (counted 2026-10-21): menus, tl! literals and messages complete (tests); one/other plurals, 797 @msg rows |
full; AI-assisted, native proofreading pending |
| Czech | cs |
5,240 catalog entries, including 795 @msg rows (counted 2026-10-21); menu, literal and message coverage enforced by tests |
catalog complete; render-site gaps reduced; native review pending |
| Swedish | sv |
5,251 rows, 795 of them @msg (counted 2026-10-21): menus, tl! literals and messages complete (tests); one/other plurals |
full; native review welcome |
| Bulgarian | bg |
5,245 rows, 763 of them @msg (counted 2026-10-21): menus and tl! literals complete (tests); the tests do not hold its messages complete |
full; AI-drafted, native review pending |
| Greek | el |
5,251 rows, 795 of them @msg (counted 2026-10-21): menus, tl! literals and messages complete (tests) |
full; native review welcome |
| Georgian | ka |
5,200 rows (counted 2026-10-21): menus, panels, dialogs, plurals (one count-neutral form) and messages, tested complete; reviewed by a native speaker | full |
Twenty-three non-English catalogs in all. Illustrator, as its public documentation lists, ships around two dozen interface languages (including Polish, Dutch, Turkish, the Nordic languages, Hungarian, and Middle East editions with Arabic and Hebrew); it doesn't ship Hindi, Indonesian or Vietnamese.
Czech render-site follow-up
The desktop and web file pickers look up filter labels at assignment time; format names and
extensions stay unchanged. Diagnostics retain numeric values and units. New Document's suggested
preset name uses Preset {number}. Contributor tooltips use named placeholders and Czech plurals;
handles and chosen names remain unchanged. Gradient descriptions reuse {kind} Gradient with a
contextual radial adjective. PDF/Print mark styles use mark-style, so Japanese displays as
Japonské while the language name stays Japonština; their Summary uses the same context.
The search placeholder, Home screen, toolbar/panel tooltips and Preferences already use lookups.
No new tl!("literal") keys were needed: only cs.tsv adds 19 AI-draft rows and revises the gradient
template. Every other complete catalog (complete_menus) has the same rows and a Roman row for the
other mark style; complete_catalogs_translate_render_site_labels fails when one of them lacks a row.
Native review is still needed, and catalog coverage does not prove that every variable in the UI is
translated.
Not done in any language
Locale-aware number and date formats, a right-to-left interface, translated help, and a Traditional Chinese UI font for the web build.
Revision history
| Date | Change | Summary |
|---|---|---|
| 2026-10-16 | minor | Bulgarian (bg, #1909) and Greek (el, #2076) catalogs added, complete under the tests; Swedish (#2139) and Finnish (#1994) rows for strings added since; eighteen non-English catalogs |
| 2026-10-16 | minor | Finnish (fi) catalog added, complete under the tests (menus, literals, messages; one/other plurals); AI-assisted, native proofreading pending |
| 2026-10-15 | minor | Swedish (sv) catalog added, complete under the tests (menus, literals, messages; one/other plurals); every sv-* locale resolves to it; AI-drafted, native review welcome; scores and estimates unchanged |
| 2026-10-14 | minor | Brazilian Portuguese (pt-br, #1914): catalog completed under the tests (menus, literals, messages); 12-language score 71% → 74%, hours 55–90 → 50–85 |
| 2026-10-13 | minor | The Polish translator confirmed the Polish rows the maintainers had added after the catalog was written (#1614); Tool flyouts are as wide as their longest translated name and shortcut need, so names no longer run into shortcuts in Spanish and other languages (#1650, fixes #1616); scores and estimates unchanged |
| 2026-10-13 | minor | Polish (pl, #1498): the row count is corrected to the 4,510 rows in pl.tsv (it said 4,492), 654 of them @msg rows; AI-drafted, native review pending; scores and estimates unchanged |
| 2026-10-13 | minor | French: the 423 strings added since the catalog was last complete are translated, and 188 entries are reworded to the feature names French users know (#1511); Hungarian: one message uses the informal address like the rest of the interface (#1474); the entry counts in the tables are the earlier measurements; native review still pending; scores and estimates unchanged |
| 2026-10-12 | minor | Vietnamese (vi) catalog added, complete under the tests (menus, literals, messages; one plural form); 12-language score 63% → 71%, hours 60–100 → 55–90 |
| 2026-10-13 | minor | Czech: 128 more strings translated (tool names, PDF and Image Trace presets, pie graph options and others added since the catalog was completed; #1461); the entry count in the table is the 2026-10-11 measurement; native review still pending; scores and estimates unchanged |
| ) | ||
| 2026-10-12 | minor | Korean (ko) catalog added, complete under the tests (menus, literals, messages); 12-language score 54% → 63%, hours 70–110 → 60–100 |
| 2026-10-12 | minor | Polish (pl) catalog added, complete under the tests (menus, literals, messages; one/few/many plurals) |
| 2026-10-12 | minor | Hungarian (hu) catalog added, complete under the tests |
| 2026-10-12 | minor | Georgian (ka) catalog, complete |
| 2026-10-11 | minor | Czech render-site follow-up: file-dialog filters, diagnostics, preset numbering, contributor tooltips/plurals, gradient grammar and contextual printer mark styles; estimates unchanged |
| 2026-10-10 | major | First per-language table, measured from the catalog row counts against the complete French catalog |