R050: Arabic text falling back past the declared font family (measured, declared, or a webfont that failed to load)
When no font in the stack carries Arabic, or the declared webfont fails to load, each device substitutes its own default and the Arabic looks different on Windows, iOS and Android.
The check
- Id
- R050
- Category
- Typography
- Default severity
When it fires
The page declares a webfont with
@font-face, the browser could not load it, and Arabic text is set in that family. The Arabic is drawn in whatever the device falls back to, and nothing about the stylesheet shows it.Fix: Check the @font-face src: a 404, a CORS header the font CDN is not sending, or a format the browser rejected. Until it loads, the declared family does nothing.
Arabic text is set in a family the page declares, and measuring the rendered text shows it is identical to the browser's fallback: the family named never shapes the Arabic.
Fix: Add an Arabic-capable family to the stack (e.g. "IBM Plex Sans Arabic", "Noto Sans Arabic") ahead of the generic fallback.
medium confidence
Nothing could be measured, and the stack names no family known to carry Arabic and declares no
@font-facewhose range covers Arabic, so the Arabic falls to each device's default. Reported at medium confidence, since an uncatalogued Arabic font could still be in play.Fix: Name an Arabic face explicitly in the stack (e.g. "IBM Plex Sans Arabic", "Noto Sans Arabic") instead of letting it resolve to the system default.
What it leaves alone
Families known to carry Arabic, like Tahoma, Segoe UI, Noto Sans Arabic or IBM Plex Sans Arabic; a stack naming one of those system faces, which the scanner cannot measure because its own machine does not ship them; a stack declaring a webfont whose unicode-range covers Arabic; and generic-only stacks such as sans-serif. Up to four families per page.
Broken, then fixed
body {
font-family: "Inter", sans-serif;
}body {
font-family: "Inter", "IBM Plex Sans Arabic", sans-serif;
}Check it by hand
Select Arabic text, open the Computed pane and scroll to Rendered Fonts: it names the face actually drawing the glyphs. Run [...document.fonts].filter((f) => f.status === 'error').map((f) => f.family) in the DevTools console to list webfonts that failed to load.
What the report shows you
Each R050 finding carries the fields below that apply to it, so you can see why it fired without rerunning the scan.
- family
- The family the Arabic text is set in.
- declaredStack
- The whole
font-familystack, as computed. - arabicElementCount
- How many elements with Arabic text use this family.
- declaredFaceReady
- Whether the declared face had finished loading. This is load state, not coverage.
- declaredFaceErrored
- Whether the browser reported the declared face as failed.
- rendersSameAsFallback
- The measurement: whether the Arabic renders the same as the fallback font, or nothing when it could not be measured.
- signal
- Which outcome this is:
face-errored,measuredordeclared.
Components that pass it by construction
These Ritla UI components satisfy R050 by how they are built. Used as documented, they do not bring this defect onto your page.
Does your page trip R050?
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