I18n questions · Software localization
Pseudo-localization is a test technique: instead of translating your strings, you run the app in a generated fake locale whose text still reads as English but has the shape of a translation. A typical transform turns Save changes into something like [Šåvé çĥåñĝéš one two]. Accented characters replace Latin letters, padding makes the string 30 to 50 percent longer (German, French and Finnish regularly grow that much), markers at both ends show where a string starts and stops, and a right-to-left variant mirrors the text. A good pseudo-localizer leaves placeholders such as %1$s, {count} or %@ untouched so the app keeps working.
What it catches, long before translators are involved:
How to turn it on:
Android generates two pseudolocales, en-XA (accented, expanded, bracketed English) and ar-XB (right-to-left), when you enable them for a build type. Then pick the pseudolocale on the device under Settings, Languages, by moving it to the top. It needs Android 4.3 (API level 18) or newer with developer options enabled; see Test your app with pseudolocales.
android {
buildTypes {
debug {
pseudoLocalesEnabled true
}
}
}
Xcode: choose Product > Scheme > Edit Scheme, select Run, open Options and pick an entry from the App Language menu (Testing localizations when running your app). The end of that list holds the pseudolanguages: Double-Length Pseudolanguage, Right-to-Left Pseudolanguage, Accented Pseudolanguage, Bounded String Pseudolanguage and Right-to-Left Pseudolanguage With Right-to-Left Strings. The same switches exist as launch arguments, for example -NSDoubleLocalizedStrings YES, and -NSShowNonLocalizedStrings YES flags strings that are not localized at all.
Web: the pseudo-localization npm package (3.1.3 at the time of writing) transforms strings and can rewrite the DOM on the fly, so you can wire it to an environment flag in development builds:
import { pseudoLocalizeString } from "pseudo-localization";
pseudoLocalizeString("hello"); // "ħḗḗŀŀǿǿ"
pseudoLocalizeString("hello", { strategy: "bidi" }); // "oʅʅǝɥ"
import { PseudoLocalizeDom } from "pseudo-localization/dom";
const stop = new PseudoLocalizeDom().start(); // rewrites text nodes as they appear
Run it continuously, in the regular dev build or in CI screenshots, rather than once before release: the point is to find hard-coded strings and brittle layouts while they are still cheap to fix.
Published Oct 9, 2026 · Markdown version