Language sits in the URL as the first path segment, which makes every page in every language a real address. That matters more than it sounds: a shareable link carries its language, search engines can index both versions independently, and the language a visitor chose survives a page reload — none of which is true of a client-side switcher holding the choice in memory.
The layout is written with logical CSS properties throughout, so the direction flip is a document attribute and not a second stylesheet. Margins, padding, borders and text alignment resolve relative to the reading direction, which means a layout adjustment lands in both languages simultaneously and cannot be applied to one and forgotten in the other.
Where that approach breaks is anything with an intrinsic direction, and those had to be handled individually, never flipped wholesale. An arrow indicating forward progress should reverse; a logo, a phone number and a screenshot of an interface should not. I went through the components and marked which category each visual element belonged to, because getting this wrong is the specific tell that a site has been mirrored by a stylesheet rather than designed in both directions.
Explaining the product itself is a presentation problem more than a copy problem. The workflow is shown as a sequence a visitor can move through, one step visible at a time with the whole path still legible around it, so the shape of the process is apparent before any of the detail is read. It degrades to a plain ordered list without JavaScript, because a marketing page that shows nothing while a bundle loads is worse than a static one.
Type was the last thing to settle and the most visible. Arabic and Latin text at the same nominal size do not read as the same size, and the line heights that suit one look wrong on the other. The scale is defined per language, not shared. It costs a little extra configuration, and it separates a site that reads naturally from one that reads like a translation.