RTL Testing for Arabic Interfaces
RTL testing checks that an interface works for right-to-left scripts such as Arabic: the layout mirrors where it should and stays put where it should not, mixed Arabic and English text displays in the right order, Arabic letters join and render cleanly, and forms, screen readers and keyboard focus behave in the mirrored layout. It is the part of localization testing where the most visible defects live — and where a team that does not read Arabic can still find most of them.
This guide is a practical procedure for web and mobile interfaces, with the markup and CSS a tester should recognise, a checklist, automation examples and defect examples written as bug titles. The wider subjects — translation quality, calendars, number and currency formats, encoding — are covered in the localization testing guide.
Start with dir and lang
Every RTL page needs two attributes on its root element: lang, which declares the language (ar, or ar-SA), and dir="rtl", which sets the base direction. The W3C internationalization guidance is to set direction with the dir attribute in the markup, not with the CSS direction property alone, because direction is part of the content’s meaning and must survive when styles are missing, when content is copied, and when it is read by assistive technology. The same applies to HTML emails and to templates that generate PDFs.
The lang attribute does more than document the language: it lets a screen reader choose an Arabic voice, lets the browser pick suitable fonts, and drives the :lang() selector used for script-specific styling. A page marked lang="en" and dir="rtl" is a defect even when it looks right.
- Check the root element on every page, including error pages, emails, printable views and PDFs.
- Switch the language at runtime and back again: direction, fonts and cached layout must all change, with no screen left half-mirrored.
What mirrors and what does not
In a right-to-left layout the reading flow starts at the right, so the interface mirrors along the vertical axis. Apple’s Human Interface Guidelines give a practical rule set: flip controls that show progress from one value to another (sliders, progress indicators), controls that navigate through items in a fixed order (back and next), and icons that represent text or reading direction or forward and backward motion; reverse the order of images when the order is meaningful. Do not flip photographs and artwork, logos and universal marks such as the check mark, icons that depict real-world objects such as a clock, controls that refer to a real physical direction, or the digits inside a single number such as a phone or card number.
Media playback is a deliberate exception on many platforms: Material Design’s bidirectionality guidance, which Android’s documentation points to, keeps playback controls and the media progress bar left-to-right because they reflect the direction of the media being played (the tape), not the direction of time. Whatever your product decides, write it in the design specification and test against that decision, because inconsistent handling between screens is the actual defect. Source code, terminal output and mathematical expressions also stay left-to-right.
- Mirror: page layout, navigation drawers, tab order, breadcrumbs, back/forward arrows, steppers, carousels, progress bars, sliders, chevrons in lists, table column order, the position of icons relative to their labels.
- Do not mirror: logos, check marks, clocks and circular refresh icons that depict real clockwise motion, photos, maps, phone and card numbers, code blocks, charts whose axis represents time unless the design says so.
Left-to-right: dir="ltr"
Reading flow starts at the left.
- Back arrow and logo at the top left
- Progress fills from the left; chevrons point right
Arabic right-to-left: dir="rtl"
Mirrored along the vertical axis.
- Flips: back arrow, breadcrumbs, progress bar, list chevrons, the side an icon sits on
- Moves, never flips: logo, check mark, clock, photos; a phone number keeps its digit order
Media player on the Arabic pageDocumented decision
Material Design keeps playback controls and the media progress bar left-to-right.
- Write your decision in the design spec and test against it
- Handling it differently between screens is the defect
Schematic screens: text is drawn as bars. In the first two screens the circle stands for an icon of a real-world object such as a clock; in the media player it is the play button.
CSS logical properties and platform layout
Most mirroring defects come from physical layout code. CSS properties such as margin-left, padding-right, left, right and text-align: left stay on the same side whatever the direction; their logical equivalents — margin-inline-start, padding-inline-end, inset-inline-start, text-align: start — follow the writing direction. Flexbox and grid follow the direction automatically; absolute positioning, transforms, background positions and shadow offsets do not. Directional icons need an explicit flip, and only directional ones.
Mobile platforms have the same concept under other names. On Android, the app declares android:supportsRtl="true", layouts use start and end instead of left and right, and simple directional drawables can set android:autoMirrored="true". On iOS, Auto Layout’s leading and trailing constraints mirror while left and right constraints do not, and directional images must be marked to flip for right-to-left layouts. A tester does not need to write this code, but recognising physical properties in a review or in the developer tools explains most "this element did not move" defects.
/* Physical properties: do not mirror */
.card { margin-left: 16px; text-align: left; }
.badge { position: absolute; right: 8px; }
/* Logical properties: follow the writing direction */
.card { margin-inline-start: 16px; text-align: start; }
.badge { position: absolute; inset-inline-end: 8px; }
.list { padding-inline-start: 24px; border-inline-end: 1px solid; }
/* Directional icons flip explicitly; logos, check marks and media icons do not */
[dir="rtl"] .icon-chevron-next { transform: scaleX(-1); }
/* Arabic text: no letter-spacing, room for diacritics */
:lang(ar) { letter-spacing: 0; line-height: 1.8; }Bidirectional text and the Unicode Bidirectional Algorithm
Arabic sentences routinely contain left-to-right content: English brand names, order numbers, SKUs, email addresses, URLs, phone numbers and code. The display order is decided by the Unicode Bidirectional Algorithm (UAX #9). At a practical level, characters are strong (Arabic and Latin letters have a direction), weak (digits and some separators) or neutral (spaces and most punctuation). Neutrals between runs of different directions, and at the edge of a paragraph, take the base direction — which is why punctuation after an English phrase jumps to the wrong side. Numbers follow further rules: digits that come after Arabic letters are given the bidi type Arabic Number (AN), though their glyphs do not change, and a hyphen or space between such numbers, or a plus sign in front of them, resolves to right-to-left, so each group of digits is laid out as its own run — which is why a hyphenated order number or a spaced phone number can be displayed with its parts reordered inside an Arabic sentence.
The fix is isolation. In HTML, wrap embedded content of known direction in an element with its own dir, use <bdi> or dir="auto" for content whose direction is not known in advance (user names, reviews, search terms), and put dir="auto" on free-text input fields. Outside HTML — in plain-text notifications, SMS or native strings — the Unicode isolate controls (U+2066 LRI, U+2067 RLI, U+2068 FSI, closed by U+2069 PDI) do the same job. The older embedding controls (U+202A–U+202E) are harder to use correctly and can affect the text that follows them.
- Build a bidi test set: Arabic sentences with an English brand at the start, middle and end; with an order number, email, URL and phone number; with numbers followed by units or percent signs; with parentheses and quotation marks.
- Inspect invisible characters: a string that "looks right" may carry stray direction marks copied from another system; decode it to code points to see them.
<!-- page: base direction and language on the root element -->
<html lang="ar" dir="rtl">
<!-- order number that must keep its order -->
<p>رقم الطلب: <bdi dir="ltr">2026-0042</bdi></p>
<!-- identifiers that must always read left-to-right -->
<p>للتواصل: <span dir="ltr">+966 50 123 4567</span></p>
<!-- user-generated text of unknown direction -->
<p dir="auto">{review.text}</p>
<!-- English phrase inside Arabic: direction and pronunciation -->
<p>جرّب أداة <bdi lang="en">Mutqan Tools!</bdi> مجاناً</p>
Without isolation, an RTL paragraph can display (example):
2026-0042 as 0042-2026
+966 50 123 4567 as 4567 123 50 966+
Mutqan Tools! as !Mutqan ToolsTry it: Unicode Decoder Try it: Unicode Encoder Try it: Multilingual Test Data Generator
Arabic rendering: shaping, fonts, diacritics and truncation
Arabic is cursive: most letters take a different form depending on whether they stand alone or join the letter before, after, or both, and some pairs such as lam-alef (لا) form a mandatory ligature. The shaping engine chooses these forms, and anything that interferes with it produces disconnected letters. Letter-spacing on Arabic text is a classic cause — depending on the engine it inserts gaps that break the joins or is simply ignored — so the safe rule is letter-spacing: 0 for Arabic. Inserting a character inside a word (a zero-width non-joiner, a masking character, a soft hyphen), drawing text one character at a time for an animation, or highlighting part of a word with separate styling can also break joining on some engines.
Generated output is where rendering fails most often. PDF generators, chart libraries, canvas drawing and image watermarks without an Arabic shaping step typically show Arabic as isolated letters in reverse order. Fonts matter too: a Latin-first font with an Arabic fallback can mix sizes and baselines, and Apple’s guidance notes that Arabic next to all-caps Latin can look too small and may need a slightly larger size. Diacritics (tashkeel), as in the example word مُتْقَن, extend above and below the line, so fixed line heights and hidden overflow clip them. When text is truncated, the ellipsis must sit at the logical end of the text — on the left for Arabic — which only happens when the element’s direction is set correctly.
- Use realistic Arabic: long names, words with diacritics, lam-alef, the tatweel (ـ) that some users type, Arabic-Indic digits and Arabic punctuation (، ؛ ؟).
- Check headings, buttons, badges, tooltips, charts, PDFs, emails and push notifications — not only the main page body.
Try it: Arabic Test Data Generator Try it: Fake Name Generator Try it: String Length Counter
RTL forms
Forms combine every RTL difficulty in one place. Labels, required-field markers, help text and error messages move to the mirrored side; free-text fields for Arabic follow the content direction; and fields that hold identifiers stay left-to-right in every locale: phone numbers, email addresses, URLs, IBANs, card numbers, national ID and residence numbers, postal codes and verification codes. Decide how those LTR fields are aligned inside the RTL form and apply it consistently. Hint text shown inside an empty field must match the direction of what the user will type, otherwise the text jumps to the other side when typing starts.
Validation must speak the user’s language: client-side and server-side messages, messages for each rule (required, format, length, range), and messages generated by third-party components such as payment widgets. Numeric fields need a decision about Arabic-Indic digits — an Arabic keyboard can produce them — and the product must either accept and normalise them or reject them with a clear Arabic message. For example, try a Saudi mobile number in local and international form (such as 05XXXXXXXX and +9665XXXXXXXX), and try national ID, Iqama and phone fields with the same digits typed on an Arabic keyboard ("٠٥٠١٢٣٤٥٦٧"); a field that neither accepts them nor explains the rule in Arabic is a defect.
- Date pickers: the calendar grid runs right-to-left, month arrows are mirrored, and Hijri or Gregorian selection follows the product’s rule.
- Checkboxes, radio buttons and toggles sit on the right of their labels; toggle "on" direction follows the design decision.
- Addresses: test with generated Saudi National Address–style data, where building number, street, district, city, postal code and additional number mix Arabic words with Western digits.
Try it: Saudi Address Test Data Try it: Arabic Test Data Generator Try it: Special Character Dataset Generator
Accessibility in RTL interfaces
Screen readers depend on lang. WCAG 2.2 success criterion 3.1.1 Language of Page requires the page language to be programmatically determinable, and 3.1.2 Language of Parts requires the same for passages and phrases in another language, with exceptions that include proper names and technical terms. An English sentence inside Arabic text therefore needs lang="en"; marking English brand names and terms the same way is good practice even though the criterion does not require it, because without it a screen reader reads them with Arabic pronunciation rules. Test with the screen readers your users have (NVDA or JAWS on Windows, VoiceOver on Apple devices, TalkBack on Android) with an Arabic voice installed.
Reading order and focus order follow the DOM. When mirroring is done with logical properties and dir, the DOM order stays meaningful and the visual order mirrors with it. When a layout is faked with row-reverse, order or absolute positioning, the visual order and the focus order disagree, which conflicts with WCAG 1.3.2 Meaningful Sequence and 2.4.3 Focus Order. Also check that horizontal arrow-key behaviour in tabs, sliders and carousels matches the mirrored visual direction, and that accessible names of icon buttons are translated.
RTL test checklist
Run this list for every screen in Arabic on each target browser and device class. Record the decisions it asks for (media controls, LTR field alignment, digit handling) in the design specification so every tester checks against the same rule.
RTL test checklist (ar, ar-SA)
Direction and language
[ ] <html lang="ar" dir="rtl"> on every page, email and PDF template
[ ] Switching language flips direction without a reload glitch or mixed state
Mirroring
[ ] Navigation, back/next arrows, breadcrumbs, steppers, sliders, progress bars mirror
[ ] Logos, check marks, clocks, photos, phone numbers, code do not mirror
[ ] Media playback controls follow the product's documented decision
Bidirectional text
[ ] Order numbers, SKUs, emails, URLs, phone numbers keep their order in Arabic sentences
[ ] Punctuation stays on the correct side of embedded English phrases
[ ] User content with unknown direction is shown with dir="auto" or <bdi>
Rendering
[ ] Arabic letters join (no letter-spacing, no characters inserted inside words)
[ ] Diacritics are not clipped; truncation ellipsis sits at the logical end
[ ] Arabic renders correctly in PDFs, emails, charts and canvas output
Forms
[ ] Labels, required markers, errors and hint text sit on the correct side
[ ] Phone, email, IBAN, ID and code fields are LTR; free-text fields follow content
[ ] Arabic-Indic digits are accepted or rejected with a clear Arabic message
Accessibility
[ ] Screen reader uses an Arabic voice; English phrases carry lang="en"
[ ] Focus order and reading order match the mirrored visual orderAutomating RTL checks
Automation catches regressions in direction and layout well and linguistic problems poorly. Run the end-to-end smoke suite in the Arabic locale as well as English; assert the root dir and lang; check the position of a few anchor elements (the back link belongs on the right); assert that embedded identifiers are isolated; and add per-locale screenshot comparison for key screens, because text assertions read the DOM and cannot see visual reordering. A search for physical CSS properties in the stylesheets finds mirroring defects before they reach a screen.
On Android, the AR (XB) pseudo-locale switches a debug build to right-to-left with reversed English text, and the developer option to force RTL layout direction flips the layout without changing the language. Xcode offers a right-to-left pseudolanguage in the scheme’s app-language options.
// RTL smoke check (Playwright Test)
test("checkout is laid out right-to-left in Arabic", async ({ browser }) => {
const page = await (await browser.newContext({ locale: "ar-SA" })).newPage();
await page.goto("/ar/checkout");
await expect(page.locator("html")).toHaveAttribute("dir", "rtl");
await expect(page.locator("html")).toHaveAttribute("lang", /^ar/);
// the back link sits in the right half of the viewport
const box = await page.getByRole("link", { name: "رجوع" }).boundingBox();
expect(box.x).toBeGreaterThan(page.viewportSize().width / 2);
// the order id is isolated; text assertions cannot see visual reordering
await expect(page.getByTestId("order-id")).toHaveAttribute("dir", "ltr");
await expect(page).toHaveScreenshot("checkout-ar.png");
});
# Find physical CSS that will not mirror (review each hit)
grep -rnE "margin-(left|right)|padding-(left|right)|text-align: *(left|right)|float: *(left|right)|[^-](left|right): *[0-9]" src/RTL defect examples, written as bug titles
These are illustrative examples, not real incidents. Each names the symptom, the place and the condition, as described in the bug report guide.
- Order number 2026-0042 displays as 0042-2026 in the Arabic order summary
- Phone number shown with its digit groups reversed on the Arabic profile page
- Exclamation mark appears before the English brand name in the Arabic success message
- Back arrow in the Arabic checkout header points left and returns to the next step
- Arabic letters disconnected in section headings styled with letter-spacing: 0.1em
- Invoice PDF renders the Arabic customer name as isolated letters in reverse order
- Diacritics on Arabic product names clipped by the card’s fixed line height
- Mobile number field rejects Arabic-Indic digits with an English-only error message
- Screen reader pronounces the English brand name with Arabic rules — lang="en" missing
Frequently asked questions
What is RTL testing?
Testing an interface in a right-to-left script such as Arabic: correct direction and language attributes, mirrored layout, correct display of mixed Arabic and English text, clean Arabic rendering, and forms, focus order and screen-reader behaviour that work in the mirrored layout.
Should everything be mirrored in Arabic?
No. Layout, navigation, directional arrows, sliders and progress indicators mirror; logos, check marks, clocks, photos, phone numbers and code do not. Media playback controls are commonly kept left-to-right. Write the rules into the design specification and test against them.
Why does a number or code appear reversed inside Arabic text?
Under the Unicode Bidirectional Algorithm, digits that follow Arabic text get the bidi type Arabic Number (AN), and hyphens and spaces between them (or a plus sign in front) resolve to right-to-left, so each group of digits becomes its own run and an order number like 2026-0042 or a spaced phone number can be displayed with its parts reordered. Isolate the value with <bdi>, dir="ltr" on a wrapping element, or Unicode isolate characters.
Can I test RTL without knowing Arabic?
Largely, yes. Pseudo-locales that switch direction, forced RTL layout on Android, Xcode’s right-to-left pseudolanguage, and generated Arabic test data let any tester find mirroring, bidi and rendering defects. Language quality still needs an Arabic speaker.
Which form fields should stay left-to-right in Arabic?
Fields that hold identifiers: phone numbers, email addresses, URLs, IBANs, card numbers, national ID and residence numbers, postal and verification codes. Free-text fields should follow the content, for example with dir="auto".
References
- Unicode Standard Annex #9: Unicode Bidirectional AlgorithmThe algorithm that decides the display order of mixed right-to-left and left-to-right text — the source of most bidirectional-text bugs.
- Structural markup and right-to-left text in HTMLHow to set base direction with the dir attribute on html and structural elements, and why CSS alone should not be used for it.
- Inline markup and bidirectional text in HTMLHow the bidirectional algorithm treats inline runs — numbers, names, URLs inside Arabic text — and the markup (bdi, dir) that isolates them.
- Arabic & Persian Layout RequirementsThe layout and typography requirements of the Arabic script — direction, joining, justification, numerals — that software must support (a W3C Draft Note).
- Right to left — Human Interface GuidelinesApple's guidance on flipping an interface for right-to-left languages: which elements mirror, which do not, and how text and numbers behave.
- Support different languages and culturesLocalising Android apps: locale resources, layout mirroring for right-to-left languages and RTL-aware attributes.
- Web Content Accessibility Guidelines (WCAG) 2.2The W3C Recommendation that defines the testable success criteria for accessible web content, organised under four principles and three conformance levels (A, AA, AAA).
- Internationalization (i18n) ActivityW3C's internationalization articles, tutorials and checks for building and testing multilingual web content.
Practice exercise
Review an RTL test session on an Arabic checkout
You test the Arabic interface (ar-SA) of a grocery delivery web shop (fictional) before release 5.0. A colleague ran a first RTL session on the checkout, the order confirmation page, the confirmation SMS and the confirmation email, and wrote eleven notes (N1–N11) without deciding which of them are defects. The material below gives the three RTL decisions recorded in the design specification (D1–D3), simplified excerpts of the markup, the mobile-number validation, the SMS template and the CSS, and the notes. Interface labels are given in English translation and every displayed value uses Western digits, so you can work through it without reading Arabic.
Using the guide’s rules and checklist, sort the notes into defects and expected behaviour, explain each decision, point to the likely cause and the fix, and write the bug titles. Work on paper; the Regex Tester helps with two of the steps. Allow 20–30 minutes.
Grocery delivery web shop (fictional) - Arabic interface (ar-SA), release 5.0
Scope: cart, checkout (delivery details, payment), order confirmation page,
confirmation SMS and confirmation email. Staging build 5.0.0-rc1.
RTL decisions in the design specification
D1 Media playback controls and the media progress bar stay left-to-right.
D2 Mobile number, email, postal code and coupon fields are left-to-right.
D3 Number fields accept Arabic-Indic digits and convert them to 0-9. Every
validation message appears in the interface language.
Markup excerpt (simplified; labels and attributes not needed here are left out;
{t.x} is translated text, {order.x} and similar parts are data)
Email template root: <html lang="en" dir="rtl">
Web page root: <html lang="ar" dir="rtl">
<a class="back" href="/cart"><i class="icon-chevron-back"></i>{t.backToCart}</a>
<div class="stepper"><ol>4 x <li></li></ol><span class="stepper-fill"></span></div>
<h2 class="section-title">{t.deliveryDetails}</h2>
<div class="field-row"><input name="district"><input name="street"></div>
<input name="mobile" dir="ltr" inputmode="tel">
<p class="product-name">{item.name}</p>
<p>{t.orderNumber}: {order.id}</p>
<p>{t.courierPhone}: <span dir="ltr">{courier.phone}</span></p>
<p class="promo">{t.promoStart} Express+ {t.promoEnd}</p>
Client-side validation of the mobile number
if (!/^05\d{8}$/.test(mobile.value)) showError(mobile, "Enter a valid mobile number");
Confirmation SMS template (plain text; the {t.x} parts are Arabic)
{t.smsOrder} {order.id} {t.smsOnTheWay}. {t.smsCourier}: {courier.phone}
CSS excerpt
.card { padding-inline-start: 16px; }
.stepper { position: relative; }
.stepper-fill { position: absolute; left: 0; width: var(--done); }
[dir="rtl"] .icon-chevron-next { transform: scaleX(-1); }
.section-title { font-weight: 700; letter-spacing: 0.08em; }
.product-name { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
.field-row { display: flex; gap: 12px; }
[dir="rtl"] .field-row { flex-direction: row-reverse; } /* to match the Arabic mock-up */
Session notes - Chrome on Windows in a mobile viewport, keyboard and mouse;
N7 on an Android phone; N8 also with NVDA and an Arabic voice.
Interface labels are given in English translation.
N1 Confirmation email: text and layout read right to left and look correct.
Its source shows the email template root above.
N2 Checkout stepper: the first step, Cart, is on the right and the steps read
right to left, but the progress fill under them grows from the left edge.
N3 "Back to cart" sits at the top right. Its chevron points left, as in the
English interface.
N4 The logo and the check mark in the "Paid" badge look exactly as in English.
The "How delivery works" video on the confirmation page has its play button
on the left, and its progress bar fills from left to right.
N5 Long product names in the cart are cut with "..." at the left end of the line.
N6 Confirmation page: order 2026-0117 is displayed as 0117-2026 after the
"Order number" label. The courier phone on the same page reads
+966 55 987 6543.
N7 Confirmation SMS: the order number shows as 0117-2026 and the courier phone
as 6543 987 55 966+.
N8 Promo line: the subscription name Express+ shows as +Express. NVDA reads
Express with Arabic pronunciation.
N9 Section headings such as "Delivery details": the Arabic letters do not join.
Body text on the same screens joins normally.
N10 Mobile number: the digits run left to right while typing. 0551234567 typed
on the Arabic keyboard (Arabic-Indic digits) is rejected with the message
"Enter a valid mobile number" in English; in Western digits it is accepted.
N11 Delivery details: District is on the left and Street on the right of one
row. Tab goes from District to Street, so focus moves left to right.- Read D1–D3 and the excerpts first. Mark each physical CSS property, each value shown without isolation, and each
langanddirattribute. Optionally paste the CSS excerpt into the Regex Tester with the search pattern from the guide’s automation section,margin-(left|right)|padding-(left|right)|text-align: *(left|right)|float: *(left|right)|[^-](left|right): *[0-9], and see what it finds. - For each note, decide: defect or expected behaviour. Name the rule from the guide, or the decision D1–D3, that settles it. One note can contain both.
- For each defect, point to the likely cause in the excerpts and describe the fix in the markup, the CSS or the text.
- In the Regex Tester, try the mobile-number pattern
^05\d{8}$on 0551234567 and on the same number in Arabic-Indic digits,٠٥٥١٢٣٤٥٦٧, and explain the result. - Write a bug title for each defect that names the symptom, the place and the condition, like the examples at the end of the guide.
- List three checks from the guide’s checklist that this session has not covered yet.
Show the model answer
Verdicts. Defects: N1, N2, N3, the order number in N6, N7, N8 (two defects), N9, N10 (two defects) and N11. Expected behaviour: N4, N5, the phone number in N6 and the left-to-right digits in N10. In ISTQB terms each note records what was observed; where that is a failure, the cause you point to in the excerpts is the defect. In the Regex Tester the guide’s search pattern finds exactly one line of the CSS excerpt, left: 0 in .stepper-fill, which is the cause of N2; .card already uses a logical property and needs no change. A text search finds physical properties only; it cannot see a missing icon flip, letter-spacing on Arabic or an order faked with row-reverse, which is why the screens are still checked one by one.
N1 — defect (direction and language). The email looks right because dir="rtl" is correct, but lang="en" declares the wrong language: a screen reader can choose an English voice for the Arabic text, and Arabic font choice and :lang(ar) rules do not apply. The guide’s rule is that a page marked lang="en" and dir="rtl" is a defect even when it looks right, and that the root element of emails and PDF templates is checked like any page. Fix: lang="ar" (or ar-SA) in the Arabic email template. Title: Arabic order confirmation email declares lang="en" on its root element.
N2 and N3 — defects (mirroring). Progress indicators mirror, so in Arabic the fill must grow from the right, where the first step is. The steps mirror with the document direction; the fill does not, because .stepper-fill is positioned with the physical property left: 0. Fix: inset-inline-start: 0. Title: Checkout progress fill grows from the left edge in the Arabic stepper. In N3 the link is in the right place, but a back chevron is a directional icon and must flip: in a right-to-left layout, back points right. The CSS flips .icon-chevron-next only; .icon-chevron-back has no rule. Fix: flip every directional icon in RTL, not one class. Title: "Back to cart" chevron points left (forward) in the Arabic checkout header.
N4 and N5 — expected behaviour. Logos and universal marks such as the check mark never mirror, and D1 keeps media playback controls and the media progress bar left-to-right, as Material Design’s guidance does. Compare N2: a progress bar for steps mirrors; a media progress bar follows D1. If another screen mirrored its video controls, that inconsistency would be the defect. In N5 the ellipsis belongs at the logical end of the text, which in Arabic is on the left; .product-name gets this from the inherited dir="rtl". Reporting N4 or N5 as defects would ask developers to break working behaviour.
N6 — the order number is a defect (bidirectional text); the phone number is not. In <p>{t.orderNumber}: {order.id}</p> the value is not isolated: digits that follow Arabic letters get the bidi type Arabic Number (AN), the hyphen between the two groups resolves to right-to-left, and each group is laid out as its own run, so 2026-0117 displays as 0117-2026. The phone line is correct because <span dir="ltr"> isolates the value. Fix: <bdi dir="ltr">{order.id}</bdi>, or a span with dir="ltr" as for the phone. Title: Order number 2026-0117 displays as 0117-2026 on the Arabic order confirmation page. N7 — defect, the same algorithm in plain text. An SMS has no HTML, so <bdi> and dir are not available: in the template, put U+2066 LRI before each value and U+2069 PDI after it. To check the corrected template, convert it to code points with the Unicode Encoder and confirm that both characters surround each value, then read the received SMS on the target phones. Title: Arabic confirmation SMS shows the order number as 0117-2026 and the courier phone as 6543 987 55 966+.
N8 — two defects. The plus sign has no direction of its own; at the boundary between the English name and the Arabic text it takes the paragraph direction and moves to the other side of the name, so Express+ displays as +Express. Fix: isolate the name, <bdi lang="en">Express+</bdi> (or a span with dir="ltr" and lang="en"). The pronunciation has a different cause, the missing lang="en", which leaves the screen reader on Arabic pronunciation rules. Report it, but do not cite WCAG 3.1.2 Language of Parts as failed: proper names are among its exceptions, so marking a brand name is good practice, not a requirement. Titles: Subscription name Express+ displays as +Express in the Arabic promo line; Screen reader pronounces Express+ with Arabic rules in the promo line — lang="en" missing.
N9 — defect (Arabic rendering). Arabic is cursive and the shaping engine joins the letters; letter-spacing on Arabic text breaks the joins or is ignored, depending on the engine. Body text joins, so the cause is the heading style .section-title { letter-spacing: 0.08em; }. Fix: no letter-spacing for Arabic, for example :lang(ar) .section-title { letter-spacing: 0; }. Title: Arabic letters disconnected in checkout section headings styled with letter-spacing: 0.08em.
N10 — the left-to-right digits are expected (D2); the rest is two defects against D3. In the Regex Tester, ^05\d{8}$ matches 0551234567 and does not match ٠٥٥١٢٣٤٥٦٧: in JavaScript, \d matches only the digits 0–9, with or without the u flag. Fix: convert Arabic-Indic digits (U+0660–U+0669) to 0–9 before validating, and check the server-side validation the same way. The English message has its own cause: the text is hard-coded in showError, so every invalid mobile number gets it, including one typed in Western digits such as 0451234567. Fix: take the message from the Arabic translations. Titles: Mobile number field rejects Arabic-Indic digits instead of converting them; Mobile number validation message appears in English in the Arabic checkout.
N11 — defect (accessibility). Focus order follows the DOM, where District comes first. [dir="rtl"] .field-row { flex-direction: row-reverse; } moves District to the left, so the visual order (Street, then District, reading from the right) and the focus order (District, then Street) disagree, which conflicts with WCAG 1.3.2 Meaningful Sequence and 2.4.3 Focus Order. Fix: remove the row-reverse rule, since the flex row mirrors by itself, and set the field order in the markup, not in CSS. If Street really comes first, as the Arabic mock-up shows, put it first in the DOM; that also changes the English form, so confirm the order with the designer. Either way, focus then follows the visual order. Title: Tab moves from District (left) to Street (right) in the Arabic delivery details form.
Not covered yet — any three of these lines of the guide’s checklist: switching the language at runtime and back, with no glitch or half-mirrored screen; dir and lang on every page, email and PDF template, here the error pages and any invoice or receipt PDF; Arabic rendering in PDFs, charts and canvas output; diacritics not clipped, for example in product names with a fixed line height; labels, required markers, errors and hint text on the correct side; the other left-to-right fields of D2 (email, postal code, coupon), and free-text fields such as delivery notes following their content; punctuation on the correct side of embedded English phrases, and emails, URLs and SKUs keeping their order in Arabic sentences, best tried with the guide’s bidi test set; and the screen reader’s reading order matching the mirrored visual order.
After the fixes, run confirmation testing on the same screens and on a received SMS, and protect against regression with the guide’s automated checks: assert dir and lang on the page root and in the email template, check that the back link sits in the right half of the viewport, assert that the order-number element has dir="ltr", compare per-locale screenshots of the confirmation page, and run the physical-CSS search in code review. When you compare your answer, your verdicts on N4, N5 and the expected parts of N6 and N10 matter most: they show whether you applied the rules or flagged everything that differs from English. Your titles may be worded differently; each should name the symptom, the place and the condition.
Your progress on this topic
Not started
Mark the topic complete when you have studied it and done the exercise.
Sign in to track your progress
Mark topics complete, continue where you left off and unlock specialisation exams.
Part of the QA Roadmap
Before this topic
Next topics
Tools mentioned in this guide
Generate Arabic names, addresses, sentences, numbers (Arabic-Indic digits) and RTL edge cases for localisation testing.
Generate the same records in multiple languages (English, Arabic, Hindi, and more) to test i18n and RTL/LTR mixing.
Decode \uXXXX escapes, U+ code points and numeric entities into readable text.
Convert text to Unicode escape sequences (\u0041), code points (U+0041) or HTML numeric entities.
Generate Saudi National Address–style test data: building number, street, district, city, postal code and additional number.
Generate random first and last names in English, Arabic and Hindi with gender and format options.
Generate inputs full of special characters: quotes, SQL/HTML/JSON metacharacters, control chars, emoji and path tricks.
Measure string length in characters, code points, UTF-8 bytes and UTF-16 units.