Most apps that “support Arabic” don’t actually support Arabic. They mirror the layout, swap the text, and call it done. The result feels like a translated product — not a native one. Users notice, even if they can’t articulate why.
At ItqanLab, every product we build is designed for Arabic and English from the start. Not as an afterthought. Not as a feature flag. As a core architectural decision. Here’s what that actually involves.
RTL Is More Than dir="rtl"
Setting dir="rtl" on your HTML element flips the text direction. It does not:
- Flip your navigation order (users expect it)
- Mirror your icons (back arrows should point right in RTL)
- Adjust your spacing (padding-left becomes padding-right)
- Fix your number rendering (Arabic-Indic numerals vs. Western Arabic)
- Handle mixed-direction content (an English brand name inside Arabic text)
A genuinely bilingual product handles all of these. And it handles them consistently across every screen, every component, and every interaction.
The Design Challenges
Typography
Arabic and English text have fundamentally different characteristics:
- Arabic is taller — Arabic characters have more vertical height, so line-height values that work for English often feel cramped in Arabic
- Arabic is denser — the same sentence in Arabic is typically 15-25% shorter than English, which affects layout assumptions
- Font pairing matters — you can’t just use a system Arabic font alongside your carefully chosen English typeface. The weights, x-heights, and styles need to complement each other
We use IBM Plex Sans Arabic paired with Inter and Outfit — a combination we’ve tested extensively for visual harmony across both scripts.
Layout
Mirroring a layout isn’t always the right choice. Some rules:
- Navigation and reading flow — mirror (right-to-left scanning)
- Progress indicators — mirror (progress flows right to left)
- Media controls — don’t mirror (play/pause/forward/back are universal)
- Number sequences — don’t mirror (1, 2, 3 reads left-to-right in both languages)
- Maps and charts — don’t mirror (geographical and data representations are direction-agnostic)
The distinction is between directional UI (follows reading direction) and universal UI (follows global conventions). Getting this wrong creates confusion.
Content
The biggest trap: translating instead of localizing. Translation converts words. Localization converts meaning.
Examples:
- A CTA that says “Get Started” in English shouldn’t be a literal Arabic translation. The Arabic equivalent should carry the same energy and urgency, which might be a completely different phrase.
- Date formats, currency symbols, and number formatting all need localization — not just translation.
- Humor, idioms, and cultural references don’t translate. They need cultural equivalents or should be removed entirely.
The Engineering Challenges
CSS Logical Properties
The single most impactful technical decision: use CSS logical properties everywhere.
Instead of margin-left: 16px, use margin-inline-start: 16px. Instead of padding-right: 24px, use padding-inline-end: 24px. This way, the same CSS works correctly in both directions without any overrides.
If your codebase uses physical properties (left, right), you’ll end up writing RTL overrides for every component. That’s double the CSS and double the bugs.
State Management
Language state needs to be:
- Persistent — stored in localStorage or a cookie so it survives page reloads
- Reactive — switching languages should update the entire UI without a page refresh
- Accessible — the
langattribute on<html>must update for screen readers
We typically implement this as a lightweight client-side toggle that updates dir, lang, and all translatable strings in one pass. No page reload. No flash of untranslated content.
Testing
Every feature needs to be tested in both languages. This isn’t just about text overflow — it’s about:
- Truncation — a string that fits in English might not fit in Arabic (or vice versa)
- Form validation — error messages, placeholder text, and labels in both directions
- Screenshots — visual regression tests need RTL variants
Our Approach
We’ve codified this into our workflow. When we build a bilingual product:
- Design in both languages simultaneously — not English first, Arabic second
- Use a single translation object — all strings in one place, no scattered hardcoded text
- Test every component in both directions — before it’s considered done
- Treat Arabic as a first-class language — not a “translation” of the English product
The result is a product that feels native in both languages. Arabic users don’t feel like they’re using a translated English app. English users don’t feel like they’re using an Arabic app with English text. Both feel like the product was built for them.
Building a product for Arabic and English-speaking users? Let’s talk — bilingual products are what we do best.
Related: See our bilingual work in action with MyLife, or learn about our Product Design approach.