Why "translate it and flip the direction" doesn't work
Both language versions are supposed to run on the same code with a direction switch, but in practice dir="rtl" only changes the base reading direction. It doesn't automatically flip CSS written with hardcoded left and right values, doesn't know which icons should mirror and which shouldn't, and doesn't solve mixed text where an English brand name, a phone number, or a price sits inside a Hebrew sentence. A site built in English and then "flipped" with a translation plugin or a blanket dir="rtl" usually looks broken in the small details - a button whose arrow points the wrong way, uneven spacing, a number that splits across a line break.
Pitfall one - CSS with hardcoded directions
When styling is written with margin-left, padding-right, or text-align: left, it only "knows" one direction. In an RTL page everything needs to flip, and manually fixing every place left or right appears in the code is slow and error-prone - it's easy to miss one spot and end up with a single element stuck in the wrong direction. The clean fix is writing CSS from the start with logical properties - margin-inline-start/end instead of margin-left/right, inset-inline instead of left/right, text-align: start instead of text-align: left. The same exact code then flips correctly in both languages with nothing extra - the browser handles it based on the page's dir.
Pitfall two - icons that should mirror, and ones that shouldn't
Not every icon should flip just because the direction flipped. Arrows, "next/previous" buttons, navigation icons, and progress bars should mirror, because they represent a direction of motion tied to reading direction. A video play button, a clock, a phone, or a camera icon, on the other hand, shouldn't mirror - they represent an international convention that has nothing to do with language direction, and a "play" button pointing left on a Hebrew page just confuses people. The call has to be made per icon, not a blanket transform on every SVG on the page.
Pitfall three - mixed text: numbers and English names
The moment a Hebrew sentence contains a phone number, a price, or an English brand name, the browser's basic bidirectional text (bidi) algorithm can order the characters unpredictably, especially next to punctuation. The typical symptom: a detail that looks fine on desktop but breaks on mobile, where rendering differences between browsers are more pronounced. The practical fix: wrap embedded foreign text (an English product name, a code, an email address) in a span with unicode-bidi: isolate or dir="auto", so it behaves as an independent unit inside the Hebrew sentence instead of bleeding into the surrounding direction.
Why this is also an SEO and GEO/AEO issue, not just design
Every language needs its own independent canonical URL with hreflang tags between the versions - exactly how this page itself is built - not a client-side language toggle that swaps text with JavaScript. The reason: an AI engine crawling a page whose content loads or swaps dynamically usually sees only one version, sometimes none at all. And even in the version it does see, the direct answer has to sit in the opening, not buried deep in the page - a study on ChatGPT citations found that 44.2% of citations come from the first 30% of a document (source: searchengineland.com). Meaning even a properly built bilingual page loses citations if the direct answer sits mid-page in one of the languages instead of at the top.
What actually works
- A separate HTML page per language, with its own
langanddir, and mutual hreflang links between the versions. - CSS built with logical properties (margin-inline, inset-inline, text-align: start/end) instead of hardcoded left/right.
- An explicit per-icon decision on whether it should mirror in Hebrew or stay as-is.
- Wrapping embedded foreign text (names, numbers, codes) in its own bidi markup so it doesn't bleed into the sentence's direction.
- Testing on mobile, not just desktop - that's where bidi and mirroring bugs show up far more often.
That's exactly why building a bilingual site properly doesn't end with translation. It requires thinking about both languages from the design and code stage - not bolting it on at the end.
Building a bilingual site and want it to actually work in both languages?
We build bilingual websites in custom code - including proper RTL/LTR infrastructure, not just translation with a flipped direction.
Get started