The CJK render test skipped wherever no Japanese face was installed, which is every CI runner, and on a Mac it drew glyphs with or without the fix, so it caught nothing. Replace it with a fallback-order test: fixture faces for `Hiragino Sans` and `Hiragino Sans GB` show that a zh-hans Han lookup tries the Chinese family first, that ja tries the Japanese one, and that a layout gets Hiragino Sans GB. Synthetic fonts in an isolated child process keep it independent of the host's fonts; with the Simplified list reverted it fails on `[7]` against `[8, 7]`. Delete `TEST_CJK_LOCALE`: the locale-mutating tests moved to an isolated child process, so nothing used the lock and the test-only static failed clippy's `-D warnings` gate. Trim the documentation edits to the single docs/gaps.md gap-11 row: revert the header and changelog edits in ROADMAP.md, docs/roadmap.md, docs/localization-parity.md and docs/target-app-parity.md, and the gaps.md header and changelog row, which conflict with other PRs. Tests: cargo clippy -p effectcraft-text -p effectcraft-render --all-targets -- -D warnings, cargo clippy --workspace --all-targets -- -D warnings, cargo test -p effectcraft-text (79 lib), cargo test -p effectcraft-render (264 passed, 1 ignored perf test), cargo fmt --all -- --check.
11 KiB
Localization parity
Last reviewed: 2026-10-14 · Last updated: 2026-10-23 · Change: minor (Georgian: menus, panels and effect names; missing strings show in English;
missing_translations_reportlists them) · Target: Adobe After Effects 2026
How much of EffectCraft's interface is translated, language by language, compared with After Effects. gaps.md gap 16 and workstream G9 hold the work; target-app-parity.md the overall numbers.
What After Effects ships
The installed After Effects 2026 (26.5.0.89) bundle has 11 .lproj localisations: English,
French, German, Italian, Japanese, Korean, Portuguese (Brazil), Russian, Spanish, Simplified
Chinese (zh_CN) and Traditional Chinese (zh_TW). Each translates the whole interface,
including effect names and parameters. It ships no Hindi, Arabic, Indonesian or Vietnamese
interface; Arabic and Hebrew text in layers is supported through its Middle Eastern text engine.
How EffectCraft translates
- Menus:
crates/ui-egui/src/i18n.rs, one catalog per language keyed by(command, English label)(624 catalog rows each at470ea7a3, counted). A test (menu_catalogs_have_no_stale_or_duplicate_rows) fails on a row whose entry left the menu tree or on a repeated row. The generated Effect menu is not part of that fixed tree: its entries and category submenus take their labels from the effect catalog below. - Panels, dialogs, buttons, tooltips:
crates/ui-egui/src/i18n/ui.rs, keyed by the English source string, with English fallback. Catalogs exist for Japanese (693 rows), Simplified and Traditional Chinese (695 and 648 since #2244 pruned the Traditional one), Ukrainian (524), Brazilian Portuguese (695) and Czech (518), counted at this tree. Georgian has every row the Simplified Chinese catalog has, plus 191 for panels converted to the catalog. - Effect names:
crates/ui-egui/src/i18n/effects.rs, keyed by effect id, in Simplified Chinese and Georgian (307 rows, one per effect in the registry, plus its 21 categories). The registry's English name stays the effect's identity:effect.list,effect.apply {"effect": …}, scripts and expressions match on it, and the property tree stores it as the effect group's name. Only the drawing — the Effect menu, Effect Controls, the Timeline and Effects & Presets — goes through the catalog, so a project file is identical whichever interface language opens it. A repeat (Gaussian Blur 2) keeps the index the engine appends, and a group the user renamed in Effect Controls stays verbatim. Adding a language there is two tables and one arm, and no panel changes: Traditional Chinese and Japanese have their tables in place and empty, so those languages draw English until a translator fills them (the Japanese set for #821 is what that slot is for). Each language decides for itself which names stay English — Adobe's Japanese interface leaves theCC,VRandOCIOsets in English while its Chinese one translates them — so a row repeating the English name is a choice, not a missing row. - Missing strings: a string with no row in the interface language shows in English, and no
test, build or release fails on a missing translation. The
missing_translations_reporttest (crates/ui-egui/src/i18n.rs) prints, per language, the fixed menu entries, panel strings, effect names and effect categories that have no row. It always passes;cargo xtask ciruns it with--nocapture, so the list is in the gate log. Locally:cargo test -p effectcraft-ui-egui --lib missing_translations_report -- --nocapture. - Not translated anywhere yet: effect parameter names (≈ 1,650,
crates/effects), engine-generated text (property names, errors, undo labels), the Home screen's unwrapped literals (#574), Learn tutorials and documentation. - Language choice: Settings ▸ General ▸ Language, or Match System
(
match_system_uses_the_system_language_where_there_is_a_catalog). - Fonts: no bundled CJK font; the UI installs system fallbacks probed by script (Kana, Han,
Arabic, Hebrew, Devanagari, Bengali, Gurmukhi, Gujarati, Tamil, Telugu, Kannada, Malayalam,
Thai and Hangul:
crates/ui-egui/src/theme.rs; the Hangul probe was added for #599, closed). The web build has no system fonts. - Script support in the interface: egui draws text without complex shaping or right-to-left
layout, so an Arabic or Hindi interface would render unshaped and left to right. In text
layers (
crates/text) shaping (harfrust), bidi (UAX #9), vertical text and Tate-Chu-Yoko work; text-layer typing goes through the IME (viewer_text.rshandles preedit and commit).
Measurement
Measured 10 October 2026 at origin/main 1446e27 and recounted on 12 October at upstream/main
470ea7a3 by counting catalog rows (const tables in crates/ui-egui/src/i18n.rs and
i18n/ui.rs; menu rows 624 per language, so the share is computed from 624 rather than 618). The
denominator, ≈ 3,900 user-visible strings, was estimated on 10 October and is kept: 618 fixed menu entries + ≈ 1,320 capitalised UI
literals in crates/ui-egui/src outside tests and catalogs (a regex count, so an upper bound) +
≈ 1,650 distinct effect parameter names + 306 effect names. Engine messages are not counted, so
the true percentages are slightly lower.
| Language | Code | UI strings translated | Dialogs / tooltips / help | Script support | Native review | Status | To full |
|---|---|---|---|---|---|---|---|
| English | en |
≈ 3,900 (100%, source) | All; docs in English | — | yes | full | — |
| Simplified Chinese | zh-hans |
1,324 (≈ 34%): menus 629 rows, panels 695 | Panels and dialogs at the zh source list; no help, effect names translated (307) and their parameter names not; Home screen literals unwrapped (#574, closed) | System CJK fallback; Han follows the UI language; CJK text in comps renders wrongly (#453); IME in text layers | no | partial | 6–9 h + review |
| Spanish | es |
1,142 (≈ 29%): menus 629 rows, panels 513 | Menus only; the panel catalog from #996 | Latin, fine | no | partial | 9–12 h + review |
| Hindi | hi |
0 | — | UI: Devanagari fallback font but no shaping; text layers shape Devanagari | no | none (After Effects: none) | 9–13 h + shaping in the UI |
| Arabic | ar |
0 | — | UI: Arabic fallback font but no shaping and no RTL layout; text layers: bidi + shaping | no | none (After Effects: none) | 9–13 h + 15–25 h RTL UI |
| French | fr |
624 (≈ 16%) | Menus only | Latin, fine | no | menus only | 7–10 h + review |
| Portuguese (Brazil) | pt-br |
1,324 (≈ 34%): menus 629 rows, panels 695 | Panels and dialogs at the Chinese catalogs' source list; the six keys main added after that count are translated too; AI-assisted, not yet native-speaker proofread | Latin, fine | no | partial | independent native review |
| Indonesian | id |
0 | — | Latin, fine | no | none (After Effects: none) | 8–12 h + review |
| Japanese | ja |
1,322 (≈ 34%): menus 629 rows, panels 693 | Panels and dialogs partly | Japanese system fallback; vertical text and Tate-Chu-Yoko in text layers; IME | no | partial | 6–9 h + review |
| German | de |
624 (≈ 16%) | Menus only (open PR #666 adds interface translations) | Latin, fine | no | menus only | 7–10 h + review |
| Korean | ko |
0 | — | Hangul fallback probe added (#599, closed); not checked on macOS here | no | none | 9–13 h + review |
| Vietnamese | vi |
0 | — | Latin with stacked diacritics; untested | no | none (After Effects: none) | 8–12 h + review |
Other languages EffectCraft ships (4):
| Language | Code | UI strings translated | Status | To full |
|---|---|---|---|---|
| Traditional Chinese | zh-hant |
1,277 (≈ 33%): menus 629 rows, panels 648 | partial | 6–9 h + review |
| Ukrainian | uk |
1,153 (≈ 29%): menus 629 rows, panels 524 | partial | 6–9 h + review |
| Czech | cs |
1,147 (≈ 29%): menus 629 rows, panels 518 | Existing catalog entries covered; unwrapped UI, effects and engine text still in English; AI-assisted, not yet native-speaker proofread | Remaining strings + independent native review |
| Georgian | ka |
1,514 (≈ 39%): menus 628 rows, panels 886 (the Chinese catalogs' 695 plus 191 Georgian-only rows: form dialogs, context menus, column headers), effect names 307 + 21 categories; native-speaker reviewed | partial | 5–8 h |
Russian (ru) has a menu catalog (624 rows, ≈ 16%); After Effects also ships Italian, which EffectCraft does not (8–12 h).
Overall: ≈ 21%, the average coverage of After Effects' 10 non-English languages (Simplified Chinese, Traditional Chinese, Japanese and Brazilian Portuguese 34%, Spanish 29%, French, German and Russian 16%, Korean and Italian 0%; 212 / 10, was ≈ 12% on 10 October; Ukrainian (≈ 29%) and Czech (≈ 29%) are EffectCraft-only and stay out of that average). This is the localization row in target-app-parity.md.
Effort. One-time work first: route parameter names and engine messages through a catalog, wrap the remaining panel literals, and add a Hangul probe (10–20 h). Then each language needs ≈ 2,900 more strings (≈ 5–9 h per language at the pace of #398 and #401). Parity with After Effects' 10 non-English languages: ≈ 60–110 h; the four extra languages of the standard list (Hindi, Arabic, Indonesian, Vietnamese) add ≈ 50–80 h, most of it right-to-left layout and complex shaping in the interface. Every language needs native-speaker review, which only a human can give; only Georgian, contributed by a native speaker (#1843), has had it.
Revision history
| Date | Change | Summary |
|---|---|---|
| 2026-10-18 | minor | Brazilian Portuguese completes its panel catalog (278 new rows, 417 → 695, the Chinese catalogs' source list); the doc recount closes the drift the batch merges left in every language's panel count; AI-assisted, not yet native-speaker proofread |
| 2026-10-12 | minor | Recounted: Russian, French, German and Czech menus (#873, #987), Brazilian Portuguese and Czech panels (#830, #987), Hangul probe (#599); overall ≈ 12% to ≈ 18%; Korean and Italian still absent |
| 2026-10-14 | minor | Georgian (ka): menus 628, panels 886 (191 Georgian-only, in GEORGIAN_PANELS), effect names and categories in effects.rs |
| 2026-10-10 | major | First localization parity document: catalog rows counted for all six languages, the twelve-language table, After Effects' 11 shipped languages from its bundle |
| 2026-10-11 | minor | Ukrainian panel catalog brought level with the Chinese ones (495 of 496 rows, counted at this commit); its share rises to ≈ 29%. The other languages' panel counts are the 10 October measurement |
| 2026-10-13 | minor | Effect names and the generated Effect menu leave English: i18n/effects.rs adds 306 rows keyed by effect id (Simplified Chinese, from After Effects 2026's interface and Adobe's Chinese documentation for the CC series) and the 21 category names. Parameter names are still English; no other language has rows |