From 0e85e9e5ec6913c5189d2d3e575ca7834473f0de Mon Sep 17 00:00:00 2001 From: Axel Date: Thu, 5 Nov 2026 13:16:42 +0100 Subject: [PATCH] Esperanto as a text language (#1142) (#1204) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Esperanto in Character › Language (panel, Properties, style options), mapped to the BCP 47 tag eo, with English-style typographer's quotes. IDML keeps the name as written ($ID/Esperanto). Not hyphenated yet: morpheme-based hyphenation follows in #1201. Claude-Session: https://claude.ai/code/session_01Y9j7XJDCmPc8UZLs9cTxtu Co-authored-by: Claude Opus 5.5 --- ROADMAP.md | 1 + crates/doc/src/attrs/language.rs | 1 + crates/doc/src/attrs/tests.rs | 2 ++ crates/engine/src/cmd/text/edit.rs | 1 + crates/ui-egui/src/i18n/ar.rs | 1 + crates/ui-egui/src/i18n/cs.rs | 1 + crates/ui-egui/src/i18n/de.rs | 1 + crates/ui-egui/src/i18n/hu.rs | 1 + crates/ui-egui/src/i18n/it.rs | 1 + crates/ui-egui/src/i18n/ja.rs | 1 + crates/ui-egui/src/i18n/ka.rs | 1 + crates/ui-egui/src/i18n/pl.rs | 1 + crates/ui-egui/src/i18n/pt_br.rs | 1 + crates/ui-egui/src/i18n/ru.rs | 1 + crates/ui-egui/src/i18n/sv.rs | 1 + crates/ui-egui/src/i18n/table.rs | 1 + crates/ui-egui/src/i18n/uk.rs | 1 + crates/ui-egui/src/panels/properties/text.rs | 1 + docs/localization-parity.md | 5 +++-- 19 files changed, 22 insertions(+), 2 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index 5717e5f17..963b8b855 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -389,6 +389,7 @@ list) · [roadmap.md](docs/roadmap.md) (milestones, plan) · [parity-checklist.m ## Progress log - **2026-11-04** · Striped strokes retain out-and-back cubic segments whose second control point is away from the coincident endpoints and first control point. A geometry regression checks the offset extent and both stripe bands. No readiness percentage change. +- **2026-11-04** · Esperanto is a text language (Character › Language, `type.char {language: "Esperanto"}`, IDML `$ID/Esperanto`): tag `eo`, English-style quotes; not hyphenated yet (#1201). No readiness percentage change. - **2026-11-02** · EPUB Export Options names a cover image file (PNG or JPEG, typed or chosen with Choose…) for the reflowable export; left empty, the first page stays the cover (#1934). No readiness percentage change. - **2026-11-02** · The Pen shows the segment a dragged smooth point shapes while it is dragged, and its rubber band curves out of a smooth point's direction line (#1438, first item). No readiness percentage change. diff --git a/crates/doc/src/attrs/language.rs b/crates/doc/src/attrs/language.rs index 35ac044a1..a116bf754 100644 --- a/crates/doc/src/attrs/language.rs +++ b/crates/doc/src/attrs/language.rs @@ -88,6 +88,7 @@ pub fn language_tag(language: &str) -> Option<&'static str> { "urdu" => "ur", "hebrew" => "he", "georgian" => "ka", + "esperanto" => "eo", _ => return None, }) } diff --git a/crates/doc/src/attrs/tests.rs b/crates/doc/src/attrs/tests.rs index 068fbaee8..78c62b77b 100644 --- a/crates/doc/src/attrs/tests.rs +++ b/crates/doc/src/attrs/tests.rs @@ -87,6 +87,8 @@ fn language_names_map_to_bcp47_tags() { assert_eq!(language_tag("Farsi"), Some("fa")); assert_eq!(language_tag("Urdu"), Some("ur")); assert_eq!(language_tag("Hebrew"), Some("he")); + assert_eq!(language_tag("Esperanto"), Some("eo")); + assert_eq!(language_tag("$ID/Esperanto"), Some("eo")); assert_eq!(language_tag("[No Language]"), None); assert_eq!(language_tag("Klingon"), None); assert_eq!(language_tag(""), None); diff --git a/crates/engine/src/cmd/text/edit.rs b/crates/engine/src/cmd/text/edit.rs index fd104cbcd..c987e3a57 100644 --- a/crates/engine/src/cmd/text/edit.rs +++ b/crates/engine/src/cmd/text/edit.rs @@ -586,6 +586,7 @@ mod language_tests { ("fr_FR", GUILLEMETS, false), ("nb_NO", GUILLEMETS, false), ("ja_JP", CORNERS, false), + ("Esperanto", ENGLISH, false), ("[No Language]", ENGLISH, false), ] { assert_eq!(quote_marks(language), quotes, "{language}"); diff --git a/crates/ui-egui/src/i18n/ar.rs b/crates/ui-egui/src/i18n/ar.rs index 36f743a90..7c7d31e88 100644 --- a/crates/ui-egui/src/i18n/ar.rs +++ b/crates/ui-egui/src/i18n/ar.rs @@ -936,6 +936,7 @@ pub(super) const TABLE: &[(&str, &str)] = &[ ("German: Swiss 2006 Reform", "الألمانية: الإصلاح السويسري 2006"), ("Greek", "اليونانية"), ("Hebrew", "العبرية"), + ("Esperanto", "الإسبرانتو"), ("Hindi", "الهندية"), ("Hungarian", "المجرية"), ("Inverse Rounded Rectangle", "مستطيل بزوايا دائرية معكوسة"), diff --git a/crates/ui-egui/src/i18n/cs.rs b/crates/ui-egui/src/i18n/cs.rs index 3342d54ee..b648aef56 100644 --- a/crates/ui-egui/src/i18n/cs.rs +++ b/crates/ui-egui/src/i18n/cs.rs @@ -1413,6 +1413,7 @@ pub(super) const TABLE: &[(&str, &str)] = &[ ("German: Swiss 2006 Reform", "Němčina: Švýcarsko, reforma 2006"), ("Greek", "Řečtina"), ("Hebrew", "Hebrejština"), + ("Esperanto", "Esperanto"), ("Hindi", "Hindština"), ("Hungarian", "Maďarština"), ("Inverse Rounded Rectangle", "Obrácený zaoblený obdélník"), diff --git a/crates/ui-egui/src/i18n/de.rs b/crates/ui-egui/src/i18n/de.rs index 558ae4967..894af427a 100644 --- a/crates/ui-egui/src/i18n/de.rs +++ b/crates/ui-egui/src/i18n/de.rs @@ -1409,6 +1409,7 @@ pub(super) const TABLE: &[(&str, &str)] = &[ ("German: Swiss 2006 Reform", "Deutsch: Schweiz, Rechtschreibreform 2006"), ("Greek", "Griechisch"), ("Hebrew", "Hebräisch"), + ("Esperanto", "Esperanto"), ("Hindi", "Hindi"), ("Hungarian", "Ungarisch"), ("Inverse Rounded Rectangle", "Umgekehrt abgerundetes Rechteck"), diff --git a/crates/ui-egui/src/i18n/hu.rs b/crates/ui-egui/src/i18n/hu.rs index 1de57de8e..b8d2942c2 100644 --- a/crates/ui-egui/src/i18n/hu.rs +++ b/crates/ui-egui/src/i18n/hu.rs @@ -709,6 +709,7 @@ pub(super) const TABLE: &[(&str, &str)] = &[ ("Hair Space", "Hajszálköz"), ("Header Rows", "Fejlécsorok"), ("Hebrew", "Héber"), + ("Esperanto", "Eszperantó"), ("Height", "Magasság"), ("Height Only", "Csak magasság"), ("Height and Width", "Magasság és szélesség"), diff --git a/crates/ui-egui/src/i18n/it.rs b/crates/ui-egui/src/i18n/it.rs index fa6d20bf4..28d58bf1a 100644 --- a/crates/ui-egui/src/i18n/it.rs +++ b/crates/ui-egui/src/i18n/it.rs @@ -1560,6 +1560,7 @@ pub(super) const TABLE: &[(&str, &str)] = &[ ("German: Swiss 2006 Reform", "Tedesco: Svizzera, riforma 2006"), ("Greek", "Greco"), ("Hebrew", "Ebraico"), + ("Esperanto", "Esperanto"), ("Hindi", "Hindi"), ("Hungarian", "Ungherese"), ("Inverse Rounded Rectangle", "Rettangolo arrotondato inverso"), diff --git a/crates/ui-egui/src/i18n/ja.rs b/crates/ui-egui/src/i18n/ja.rs index 37646c5cc..2164f1309 100644 --- a/crates/ui-egui/src/i18n/ja.rs +++ b/crates/ui-egui/src/i18n/ja.rs @@ -1582,6 +1582,7 @@ pub(super) const TABLE: &[(&str, &str)] = &[ ("German: Swiss 2006 Reform", "ドイツ語: スイス 2006年正書法改訂"), ("Greek", "ギリシャ語"), ("Hebrew", "ヘブライ語"), + ("Esperanto", "エスペラント語"), ("Hindi", "ヒンディー数字"), ("Hungarian", "ハンガリー語"), ("Inverse Rounded Rectangle", "内向き角丸長方形"), diff --git a/crates/ui-egui/src/i18n/ka.rs b/crates/ui-egui/src/i18n/ka.rs index 2c7752432..949e8e12c 100644 --- a/crates/ui-egui/src/i18n/ka.rs +++ b/crates/ui-egui/src/i18n/ka.rs @@ -1504,6 +1504,7 @@ pub(super) const TABLE: &[(&str, &str)] = &[ ("German: Swiss 2006 Reform", "გერმანული: შვეიცარია, 2006 წლის რეფორმა"), ("Greek", "ბერძნული"), ("Hebrew", "ივრითი"), + ("Esperanto", "ესპერანტო"), ("Hindi", "ჰინდი"), ("Hungarian", "უნგრული"), ("Inverse Rounded Rectangle", "შებრუნებული მომრგვალებული მართკუთხედი"), diff --git a/crates/ui-egui/src/i18n/pl.rs b/crates/ui-egui/src/i18n/pl.rs index 77a9ba61d..16d8e7d3a 100644 --- a/crates/ui-egui/src/i18n/pl.rs +++ b/crates/ui-egui/src/i18n/pl.rs @@ -1448,6 +1448,7 @@ pub(super) const TABLE: &[(&str, &str)] = &[ ("German: Swiss 2006 Reform", "Niemiecki: szwajcarski, reforma 2006"), ("Greek", "Grecki"), ("Hebrew", "Hebrajski"), + ("Esperanto", "Esperanto"), ("Hindi", "Hindi"), ("Hungarian", "Węgierski"), ("Inverse Rounded Rectangle", "Prostokąt z wklęsłymi narożnikami"), diff --git a/crates/ui-egui/src/i18n/pt_br.rs b/crates/ui-egui/src/i18n/pt_br.rs index 2bb6f76cd..65cbf07c3 100644 --- a/crates/ui-egui/src/i18n/pt_br.rs +++ b/crates/ui-egui/src/i18n/pt_br.rs @@ -940,6 +940,7 @@ pub(super) const TABLE: &[(&str, &str)] = &[ ("German: Swiss 2006 Reform", "Alemão: reforma suíça de 2006"), ("Greek", "Grego"), ("Hebrew", "Hebraico"), + ("Esperanto", "Esperanto"), ("Hindi", "Hindi"), ("Hungarian", "Húngaro"), ("Inverse Rounded Rectangle", "Retângulo arredondado invertido"), diff --git a/crates/ui-egui/src/i18n/ru.rs b/crates/ui-egui/src/i18n/ru.rs index 38fea0f5b..e0173ba11 100644 --- a/crates/ui-egui/src/i18n/ru.rs +++ b/crates/ui-egui/src/i18n/ru.rs @@ -1404,6 +1404,7 @@ pub(super) const TABLE: &[(&str, &str)] = &[ ("German: Swiss 2006 Reform", "Немецкий: Швейцария, реформа 2006 года"), ("Greek", "Греческий"), ("Hebrew", "Иврит"), + ("Esperanto", "Эсперанто"), ("Hindi", "Хинди"), ("Hungarian", "Венгерский"), ("Inverse Rounded Rectangle", "Прямоугольник с вогнутыми скругленными углами"), diff --git a/crates/ui-egui/src/i18n/sv.rs b/crates/ui-egui/src/i18n/sv.rs index 203553b4e..d2371732b 100644 --- a/crates/ui-egui/src/i18n/sv.rs +++ b/crates/ui-egui/src/i18n/sv.rs @@ -731,6 +731,7 @@ pub(super) const TABLE: &[(&str, &str)] = &[ ("German: Swiss 2006 Reform", "Tyska: schweizisk, reformen 2006"), ("Greek", "Grekiska"), ("Hebrew", "Hebreiska"), + ("Esperanto", "Esperanto"), ("Hindi", "Hindi"), ("Hungarian", "Ungerska"), ("Inverse Rounded Rectangle", "Omvänd rundad rektangel"), diff --git a/crates/ui-egui/src/i18n/table.rs b/crates/ui-egui/src/i18n/table.rs index 27f5cf389..13e0a1bd0 100644 --- a/crates/ui-egui/src/i18n/table.rs +++ b/crates/ui-egui/src/i18n/table.rs @@ -3939,6 +3939,7 @@ pub(super) const TABLE: &[(&str, [&str; 5])] = &[ ), ("Greek", ["Greek", "Grec", "Greek", "Greek", "希腊语"]), ("Hebrew", ["Hebrew", "Hébreu", "Hebrew", "Hebrew", "希伯来语"]), + ("Esperanto", ["Esperanto", "Espéranto", "Esperanto", "エスペラント語", "世界语"]), ("Hindi", ["Hindi", "Hindi", "Hindi", "Hindi", "印地语"]), ("Hungarian", ["Hungarian", "Hongrois", "Hungarian", "Hungarian", "匈牙利语"]), ( diff --git a/crates/ui-egui/src/i18n/uk.rs b/crates/ui-egui/src/i18n/uk.rs index 57844a719..6bdb6135f 100644 --- a/crates/ui-egui/src/i18n/uk.rs +++ b/crates/ui-egui/src/i18n/uk.rs @@ -1557,6 +1557,7 @@ pub(super) const TABLE: &[(&str, &str)] = &[ ("German: Swiss 2006 Reform", "Німецька: Швейцарія, реформа 2006 року"), ("Greek", "Грецька"), ("Hebrew", "Іврит"), + ("Esperanto", "Есперанто"), ("Hindi", "Гінді"), ("Hungarian", "Угорська"), ("Inverse Rounded Rectangle", "Прямокутник з увігнутими округленими кутами"), diff --git a/crates/ui-egui/src/panels/properties/text.rs b/crates/ui-egui/src/panels/properties/text.rs index f27ceabcc..36c23c195 100644 --- a/crates/ui-egui/src/panels/properties/text.rs +++ b/crates/ui-egui/src/panels/properties/text.rs @@ -576,6 +576,7 @@ pub(crate) const LANGUAGES: &[&str] = &[ "Korean", "Arabic", "Hebrew", + "Esperanto", ]; /// The Language list (Character panel, Properties ▸ Character): picking one sets the language of diff --git a/docs/localization-parity.md b/docs/localization-parity.md index 212eb4dd8..0e77995d4 100644 --- a/docs/localization-parity.md +++ b/docs/localization-parity.md @@ -1,6 +1,6 @@ # Localization parity -> **Last reviewed:** 2026-10-11 · **Last updated:** 2026-11-01 · **Change:** minor (Hungarian interface catalog, bundled-font coverage and flyout regression checks; Swedish interface) · **Target:** Adobe InDesign 2026 (21.6) +> **Last reviewed:** 2026-10-11 · **Last updated:** 2026-11-04 · **Change:** minor (Esperanto text language; Hungarian interface catalog, bundled-font coverage and flyout regression checks; Swedish interface) · **Target:** Adobe InDesign 2026 (21.6) Per-language status of the DesignCraft interface and of document typesetting in each script. Script-specific typesetting detail: [cjk.md](cjk.md), [cjk-typography.md](cjk-typography.md), @@ -95,7 +95,8 @@ eight of the twelve (cs, da, el, en_GB, fi, hu, it, nb, nl, pl, ro, ru, sq, sv, InDesign 2026 hyphenates and spell-checks ~40 languages (Hunspell and Duden dictionaries). DesignCraft hyphenates **English, Danish, Dutch, French, German (2006 reform), Greek, Italian, Norwegian, Portuguese and Spanish** and spell-checks **English** only. Text language can be set per paragraph and character (Properties, Character panel) and drives quotes and -locale shaping. See [typography-parity.md](typography-parity.md). +locale shaping; Esperanto is offered too (not hyphenated yet, #1201). See +[typography-parity.md](typography-parity.md). German hyphenation accepts `German: 2006 Reform`, `German: Swiss 2006 Reform` and `de` locale codes without a spelling year or with `2006`. Traditional names, `de_DE_1901` and unknown German variants have no automatic hyphenation; their German shaping and quotes are unchanged.