Deploy your embedded GUI in any language — from Arabic RTL to CJK to Cyrillic. Sparklet's Unicode font engine, design-time Arabic shaping in Flint, and runtime locale switching enable global HMI deployments from a single firmware build — no per-language firmware variant required.
Embedded GUI multi-language support enables a single display application to render text in multiple languages — including scripts with complex requirements such as Arabic (right-to-left), CJK (Chinese, Japanese, Korean), and Cyrillic — without requiring separate firmware builds per language. A locale switch at runtime updates all text across all screens via a string table lookup, with no screen rebuild or re-render of static assets required.
Multi-language support in embedded GUI is more complex than it appears. Beyond storing translated strings, the framework must handle: different character encodings (UTF-8, UTF-16), right-to-left text layout and bidirectional text in mixed content, language-specific glyph shapes (Arabic letter forms differ depending on word position), large character sets (CJK has 20,000+ glyphs), and variable text length (German strings are typically 30% longer than English equivalents — layout must accommodate this).
Sparklet addresses all of these requirements through three integrated mechanisms: the Unicode font engine, RTL text rendering with design-time Arabic shaping in Flint, and runtime locale switching via string table APIs. For Arabic-specific implementation details, see the Arabic RTL embedded GUI page. For a full overview of Sparklet's feature set across all rendering capabilities.
How Sparklet handles Unicode, RTL, runtime locale switching, and variable-length text across all supported MCU and MPU platforms.
Sparklet's font engine handles Unicode code points across all major scripts: Latin (U+0000–U+024F), Cyrillic (U+0400–U+04FF), Greek (U+0370–U+03FF), Arabic (U+0600–U+06FF and Presentation Forms U+FE70–U+FEFF), Hebrew (U+0590–U+05FF), and CJK Unified Ideographs (U+4E00–U+9FFF). Fonts are compiled from standard TrueType or OpenType files into Sparklet's compressed glyph table format using Flint UI Designer.
Rather than embedding a complete Unicode font (which would require several megabytes of Flash for a CJK font), Sparklet uses selective glyph compilation. Flint analyses all string table entries across all locales in the project and compiles only the glyphs actually referenced by those strings into the embedded font binary. For a Japanese product with 300 unique kanji in its UI strings, only those 300 glyphs are compiled — not the full JIS set of 6,000+ characters. A full UTF-16 CJK font file is typically 10–30 MB; a Sparklet selective glyph set for a typical Japanese HMI is approximately 300–800 KB — a reduction of over 95%.
The font binary can include multiple point sizes of the same typeface — for example, 12px body text, 24px headings, and 48px large numeric readouts. All glyphs are rendered with anti-aliasing using Sparklet's AA font renderer (sfont_aa). On platforms with hardware acceleration (DMA2D, D/AVE2D), glyph compositing is offloaded to the accelerator automatically.

Arabic, Hebrew, and Farsi are written right-to-left. This creates two distinct challenges: Arabic script shaping (Arabic letters have different glyph forms depending on their position within a word — initial, medial, final, and isolated forms), and bidirectional text (a single string may contain both Arabic and Latin characters, each flowing in the opposite direction).
For static and semi-static Arabic text — menu labels, unit labels, warning messages, screen titles — Sparklet uses design-time Arabic shaping. Flint pre-shapes all Arabic strings at project export time using Unicode Arabic Presentation Forms (code range U+FE70–U+FEFF). Each Arabic string is stored in the locale string table as a sequence of pre-shaped glyphs in the correct right-to-left glyph order. At runtime, Sparklet's font engine draws the pre-shaped glyph sequence from right to left using the SGUI_TEXT_DIR_RTL text direction flag. No shaping algorithm runs on the MCU — runtime overhead compared to Latin text rendering is minimal. This approach is suitable for all MCU platforms, including Cortex-M0+ class devices.
For Arabic text generated at runtime — user-entered text, strings received over CAN or MQTT, content from external storage — Sparklet's UTIL layer includes a runtime Arabic shaping module (approximately 300 lines of C, ~1.4 KB of lookup table Flash) for Cortex-M4 and above. For MPU targets running Embedded Linux, full BiDi algorithm support via SheenBidi can be integrated with Sparklet's text pipeline. See Arabic RTL Embedded GUI for the full technical reference.

Sparklet's multi-language system is based on a string table model. Every text string in the UI — widget labels, unit text, status messages, menu items, warning strings — is defined by a string table key rather than a literal character value. Each locale provides a string table mapping every key to the translated string in that language, in the correct encoding and glyph direction.
At runtime, the application calls a single Sparklet API to switch the active locale. The framework updates all widget text properties by looking up the new locale's string table and re-rendering the affected text regions via dirty-region rendering. No screen rebuild, no widget recreation, no full display clear-and-redraw is required. The locale switch is visually instantaneous — the next rendered frame shows the new language text in all widgets.
In Flint, locales are defined in the project's locale manager. For Arabic, Flint's locale manager accepts input in standard Unicode Arabic (U+0600–U+06FF) and performs Presentation Form shaping automatically when the project is exported. Flint exports all locale string tables as C constant arrays — switching locales at runtime is a pointer assignment, not a memory allocation. All locales are compiled into the same firmware image with no per-language build variant required.

When locale strings vary significantly in length — German text is typically 30% longer than English equivalents; Arabic text length varies by context — widgets with auto_size enabled expand or contract their bounding box to fit the new text. Containers and layout groups using dynamic sizing reflow accordingly.
For fixed-size displays where pixel-perfect layout is required, Sparklet supports per-locale layout override tables — a different widget position or font size can be specified for a specific locale without duplicating the screen definition. This allows a compact CJK font at a slightly larger point size for readability while keeping the same screen layout structure for all other locales.
Sparklet's multi-language system supports: Latin (all extended variants), Cyrillic, Greek, Arabic (design-time shaping on all MCUs; runtime shaping on Cortex-M4 and above), Hebrew, Farsi/Persian (same shaping mechanism as Arabic), CJK Unified Ideographs (selective glyph compilation), Thai (basic, no ligature in current release), and Devanagari (basic, full support planned). For wearable applications requiring compact multi-language display, see Sparklet for Wearable Displays.

| Script / Language | Direction | Shaping Requirement | Sparklet Support | Platform Requirement |
|---|---|---|---|---|
| Latin (all variants) | LTR | None | Full | All MCU/MPU platforms |
| Cyrillic | LTR | None | Full | All MCU/MPU platforms |
| Greek | LTR | None | Full | All MCU/MPU platforms |
| Arabic (static text) | RTL | Design-time (Flint) | Full | All MCU/MPU platforms |
| Arabic (dynamic text) | RTL | Runtime shaping module | Full | Cortex-M4 and above |
| Hebrew | RTL | Minimal (vowel marks) | Full | All MCU/MPU platforms |
| Farsi / Persian | RTL | Same as Arabic | Full | All MCU/MPU platforms |
| CJK (Chinese/Japanese/Korean) | LTR/TTB | Selective glyph compile | Full (selective) | All MCU/MPU platforms |
| Thai | LTR | Basic (no ligature) | Basic | All MCU/MPU platforms |
| Devanagari | LTR | Full ligature (planned) | Basic (current) | All MCU/MPU platforms |
| BiDi (mixed Arabic+Latin) | Mixed | Full BiDi algorithm | Via SheenBidi | MPU + Embedded Linux |
Multi-language UI design in Flint UI Designer follows a structured workflow that eliminates the error-prone manual steps that cause localisation defects in embedded HMI projects.
In Flint, all widget text properties are assigned a string table key rather than a literal string. The key is a language-neutral identifier — for example, LABEL_SPEED_UNIT, MSG_ENGINE_FAULT, BTN_CONFIRM. Flint enforces this convention: the designer cannot accidentally hardcode a literal string into a widget that should be localised.
In Flint's locale manager, the designer creates one locale entry per supported language (e.g., en_US, de_DE, ar_SA, ja_JP). For each locale, the translator enters the string table values. Flint provides a side-by-side view of source and translated strings. For Arabic and Farsi locales, the designer enters standard Unicode Arabic (U+0600–U+06FF); Flint displays the correctly shaped Arabic text in its live preview using the Presentation Form shaping engine.
For locales requiring different fonts or font sizes — for example, a CJK locale using a slightly larger point size for readability — Flint allows per-locale font overrides. The override replaces the font for all widgets in that locale without requiring screen layout duplication.
Flint exports all locale string tables as C constant arrays alongside the screen layout data. The selective glyph compiler runs at export time: for each locale, only the glyphs referenced by that locale's strings are compiled into the per-locale font binary. For Arabic locales, Flint runs the Presentation Form shaping pass and stores the pre-shaped glyph sequences in the exported string table.
The result is a single firmware image that contains all locales. The locale switch API at runtime is a pointer reassignment — no additional memory allocation, no firmware variant per language.

Handles Latin, Cyrillic, Greek, Arabic, Hebrew, and CJK code points. Glyph tables compiled from standard TrueType/OTF fonts — no proprietary font format conversion required.

Full right-to-left rendering. Arabic Presentation Form shaping produces correct connected letter forms at all word positions — essential for readable Arabic UI text on any MCU class.

Flint pre-shapes Arabic strings at design time — zero runtime shaping code on the MCU. Suitable for any Cortex-M platform. Dynamic runtime shaping available for live Arabic string data on M4+.

Only glyphs actually used in the UI string tables are compiled into the font binary. Reduces Japanese or Chinese font Flash from 10–30 MB to 300–800 KB — viable on MCU-class devices.
Sparklet uses a string table model where every UI text string is referenced by a key. Each locale provides a complete string table mapping those keys to translated strings. At runtime, a single API call switches the active locale, and Sparklet updates all widget text via dirty-region rendering without screen rebuild. All locales are compiled into the same firmware image — no per-language firmware variant is required.
Download Sparklet and Flint UI Designer. Define your locales, import your translated strings, and see multi-language rendering — including Arabic RTL — in the Windows simulator before touching your target hardware.