Skip to content

R010: Visible Latin-script body text above thresholds on an Arabic page

Latin-script passages left on an Arabic page, a single sentence or a large share of the whole page, tell the reader the translation stopped partway.

The check

Id
R010
Default severity
high

When it fires

  1. high

    A visible block of text on an Arabic page has no Arabic in it and at least three Latin words left once brand names, URLs, emails and codes are set aside. Each block is its own finding, up to ten per page.

    Fix: Translate this passage or mark it as intentionally foreign with a lang attribute.

  2. critical

    Those untranslated passages add up to more than 15% of the letters on the page. The page gets one critical finding in place of the per-passage ones: it is substantially not in Arabic.

    Fix: Complete the translation before shipping to Arabic users; partial pages erode trust faster than fully-English ones.

What it leaves alone

Text hidden from screen readers with aria-hidden, code and pre blocks, anything under translate="no" or a non-Arabic lang, and text that mixes Arabic with Latin, which the direction checks cover. Text inside forms is R071's, and link, button, tab and menu text is R011's, so one string is never reported twice.

Broken, then fixed

before.html
<p>أدر مشاريعك بسهولة من لوحة تحكم واحدة.</p>
<p>Start your free trial today and invite your team.</p>
after.html
<p>أدر مشاريعك بسهولة من لوحة تحكم واحدة.</p>
<p>ابدأ تجربتك المجانية اليوم وادعُ فريقك.</p>

Check it by hand

Run [...document.querySelectorAll('p, li, td, h1, h2, h3')].filter((e) => e.checkVisibility() && !/\p{Script=Arabic}/u.test(e.textContent) && /[A-Za-z]{2,}\s+[A-Za-z]{2,}\s+[A-Za-z]{2,}/.test(e.textContent)).map((e) => e.textContent.trim()) in the DevTools console. It lists visible blocks with no Arabic and at least three Latin words; anything that is not a name or a deliberate quotation needs translating.

What the report shows you

Each R010 finding carries the fields below that apply to it, so you can see why it fired without rerunning the scan.

text
Per passage: the untranslated text, cut to 160 characters.
latinWordsAfterAllowlist
Per passage: how many Latin words are left once brand names, URLs and codes are set aside.
cappedAt
When more than ten passages qualify: the cap on how many are reported.
totalCandidates
Reported with the cap: how many passages qualified in all.
unallowedLatinChars
Page level: the Latin letters in untranslated passages, once brand names and codes are set aside.
totalVisibleLetters
Page level: every visible letter on the page, Arabic, Latin or other.
ratio
Page level: unallowedLatinChars divided by totalVisibleLetters, from 0 to 1.
sampleSelectors
Page level: up to five of the untranslated passages, as places to start.

Does your page trip R010?

Paste a URL. Ritla renders the page on desktop, tablet and mobile, runs every check, and shows the top issues with screenshot evidence.

Scan a page freeBrowse the checks