Arabic game localization and RTL support is the difference between a game Arab players tolerate and one they recommend. Getting it right means more than translating strings — it means reshaping how text is drawn, how menus flow, and how the whole interface mirrors from right to left.
This guide walks through the four things that actually break when you add Arabic — text shaping, layout mirroring, numerals, and workflow — with concrete steps for Unity and Godot. If you are earlier in the journey, start with our overview of game development in the Arab world, then come back here for the technical part.
Why "just translate it" fails
Arabic is a connected, cursive script written right to left. Each letter changes shape depending on its position in a word — isolated, initial, medial, or final. A naive engine that renders Unicode code points left to right will show you disconnected, backwards, broken letters. This is the single most common mistake: developers paste a translated string into a Text field, see garbage, and assume the font is wrong.
Two separate problems are at play:
- Shaping: choosing the correct glyph form for each letter and joining them.
- Bidi (bidirectional) ordering: the Unicode Bidirectional Algorithm decides the visual order when Arabic, Latin, and numbers mix in one line — like a player name inside an Arabic sentence.
You need both solved before a single word looks right.
Fix text shaping in your engine
Your engine's built-in text renderer probably does not shape Arabic on its own.
- Godot 4: shaping is built in. Godot 4 ships with HarfBuzz and ICU, so Arabic, joining, and bidi work out of the box in
LabelandRichTextLabel. Set the control's text direction toAUTOorRTLand use a font that contains Arabic glyphs. This is the easiest modern path. - Unity: TextMesh Pro does not shape or reorder Arabic by itself. Add a shaping layer — the open-source RTLTMPro plugin is the standard choice. You feed it your logical string and it outputs a pre-shaped, reordered string that TMP can draw. Enable its "Farsi/Arabic" and "Preserve Numbers" options as needed.
- Custom / WebGL engines: run every Arabic string through HarfBuzz for shaping and a Unicode bidi implementation for ordering before it reaches your glyph atlas.
Font choice matters as much as the shaper. Pick a font with complete Arabic coverage and proper joining tables — Noto Naskh Arabic, Cairo, and Tajawal are reliable, freely licensed options. We cover embedding and fallback in depth in Arabic fonts in Unity.
Mirror the UI, not just the text
Arabic readers expect the whole layout to flip, not only the paragraph text. In a right-to-left interface:
- The reading and navigation flow moves right to left — the "back" button sits on the right, "next" on the left.
- Menus, health bars, and HUD elements mirror horizontally.
- Progress bars and sliders fill from right to left.
- Icons with direction — arrows, "reply", "fast-forward" — flip; icons without direction (a gear, a heart) do not.
In Unity, anchor UI elements relative to layout groups and drive mirroring from the locale rather than hardcoding positions, so one prefab serves both languages. In Godot, set layout_direction to RTL on your root control and children inherit it. Never mirror gameplay itself — a car still drives forward, and text on a 3D sign in the world stays readable; only mirror the 2D interface.
Numbers, plurals, and the small stuff
- Numerals: Arabic content can use Western digits (1, 2, 3) or Arabic-Indic digits (١، ٢، ٣). Both are correct; pick one per audience and stay consistent. Never mirror the digits themselves.
- Plurals and gender: Arabic has singular, dual, and plural forms, plus grammatical gender. Do not build sentences by concatenation ("You have " + n + " coins"). Use your framework's plural rules (Unity Localization's Smart Strings, or a keyed table with CLDR plural categories).
- Date, time, currency: format through the locale, not a hardcoded pattern.
A localization workflow that scales
Bake this in from the start instead of retrofitting:
- Externalize every string into keyed tables (Unity Localization String Tables, Godot
.po/CSV, or your own JSON). No literal text in code or scenes. - Give keys meaning, like
menu.play.button, and add a context note for translators. - Pseudolocalize early — auto-generate a fake RTL/expanded locale to catch clipped labels and unshaped text before a translator is hired.
- Leave 30–40% extra space; translated strings expand and Arabic line height is taller.
- Have a native speaker QA on-device, not in a spreadsheet — shaping and mirroring bugs only show up on screen.
Ship it and let players judge
Arabic support is a competitive edge: most indie titles skip it, so the ones that do it well stand out immediately. Once your RTL build runs clean, publish it as a WebGL game on The Gaming Nest — Arab players can play it instantly in the browser with no download, and you get real feedback from the exact audience you localized for. Upload your build, or jump into the next game jam and test your Arabic UI in front of a live crowd.