Lessons from Building Bilingual
I wrote a technical post about how I built bilingual support — the CSS, the schema, the layout chain. This isn’t that post. This is about what I didn’t expect.
Language isn’t a feature. It’s a worldview.
When I started, I thought bilingual meant “some posts in English, some in Arabic.” Add a lang field, handle RTL, done.
But language shapes everything. An Arabic post doesn’t just flow right-to-left — it breathes differently. Sentences are longer. Punctuation works differently. The rhythm of a paragraph changes. A design that looks balanced in English can feel cramped in Arabic, or the reverse.
I didn’t plan for this. I discovered it post by post, looking at what I’d written and noticing that something felt off. The fix was never technical — it was always about spacing, proportion, letting the text set its own pace.
Interleaving is a statement
I made a deliberate choice: Arabic and English posts live together. Same feed, same page, sorted by date. No /en/ and /ar/ prefixes. No language toggle.
This confused me at first. Wouldn’t readers want to filter? Wouldn’t mixing languages feel jarring?
It doesn’t. It feels like how I actually think — switching between languages depending on what I’m saying. Some ideas arrive in Arabic. Some arrive in English. Forcing them into separate buckets would be a lie about how the blog works.
The lesson: your information architecture is a statement about your values. If you separate languages, you’re saying they’re different audiences. If you mix them, you’re saying they’re one voice.
The hardest part isn’t RTL
Everyone asks about RTL. “How do you handle right-to-left?” It’s the obvious question, and honestly, CSS logical properties make it straightforward.
The hard part is everything else. Dates that need different locales. Font families that need to work across scripts without looking like two different sites. Line heights that feel natural in both languages — Arabic text is taller, denser, and needs more vertical space.
And the really hard part: knowing when a design decision that works in English doesn’t in Arabic, and resisting the urge to just add a special case. Special cases compound. Every if (lang === 'ar') is a crack in your abstraction.
One font was the right call
I use Tajawal for everything. One font family, both scripts. I went back and forth on this — wouldn’t a specialized Latin font paired with a specialized Arabic font look better?
Maybe. But “better” in isolation creates “worse” when they appear on the same page. Mixed-language pages are inevitable in a bilingual blog (English code blocks in Arabic posts, Arabic names in English posts). With two fonts, every boundary between scripts becomes a visual seam.
One font means one rhythm. The compromise on individual beauty buys consistency across the whole.
Translation is a trap
Early on, I considered translating posts — writing each one in both languages. I abandoned this after two attempts. Here’s why.
A translated post is a diminished post. When I write in Arabic, I’m not writing English ideas with Arabic words — I’m thinking in Arabic. The metaphors are different. The cultural references are different. A faithful translation would need to be a rewrite, not a translation. And a rewrite takes as long as a new post.
So instead: each post exists in one language. The one it was born in. The blog is bilingual because I am bilingual, not because each thought gets expressed twice.
What I’d do differently
If I started over, three things:
-
Language-specific RSS feeds. The mixed feed is fine for the website, but RSS readers don’t handle mixed languages gracefully. Separate feeds would be a small addition with real value.
-
Per-language typography scales. Arabic needs slightly larger text and more line-height. I’m using the same scale for both and it works, but it could be better. This is the kind of refinement that matters at scale.
-
A bilingual excerpt strategy. Post cards on the home page show a description. For Arabic posts, should the card on an English-default page show the Arabic description? The English one? Both? I never fully resolved this — I just kept descriptions in the post’s native language and moved on.
The real lesson
Building bilingual taught me that the interesting problems are never where you expect them. I spent hours on RTL CSS and it was fine. I spent no time thinking about how two languages feel when they share a page — and that turned out to be the whole challenge.
Design isn’t about solving the problems you can name. It’s about noticing the ones you can’t.