Skip to content

Pseudo-localization tool

Pseudo-localization turns your source strings into accented, longer, bracketed versions of themselves, so you find cut-off text, hard-coded strings and broken placeholders before any translation exists. Microsoft's rule of thumb is to make English strings 40% longer. That's too little for short labels: the Italian for "views" is "visualizzazioni", three times as long. This tool grows short strings more than long ones and leaves your placeholders alone.

This tool runs in your browser, so your strings stay on your device.

How to read your result

Load the result as a test language in your app and walk through the main screens. Each symptom points to one kind of bug:

What the tool changes, and what it leaves alone

Accents. Every Latin letter gets an accented twin, so "Save" becomes "Šåṽé". You can still read every screen.

Padding by string length. Microsoft warns that a translated string can be 200% or even 400% longer. The IBM guideline, published by W3C, breaks the growth down by source length. The default uses the top of each range:

Source lengthResult length
Up to 10 characters300% of the source
11 to 20200%
21 to 30180%
31 to 50160%
51 to 70150%
Over 70130%

Length counts the letters, digits and punctuation outside placeholders, not spaces. The 51 to 70 row is our own figure: W3C prints 151-170% there, out of line with the rows around it. Pick Fixed percent to use Microsoft's 40% or your own number.

Brackets. [!!! and !!!] mark where each string starts and ends.

What stays untouched. Placeholders such as {name}, {{count}}, ${user}, %{total}, %s, %1$d and %ld, Python's %(name)s, Laravel's :name, i18next's $t(key), vue-i18n's @:key, Chrome's $NAME$, Java MessageFormat arguments such as {0,number,integer}, HTML tags and entities, escapes like \n, and the keywords of ICU plural and select messages. Only the words inside each plural branch change.

Worked example: three strings in, three strings out

This is the example loaded in the tool above:

{
  "greeting": "Welcome back, {name}!",
  "save": "Save changes",
  "inbox": "You have {count, plural, one {# new message} other {# new messages}}"
}

With the default options, the tool returns:

{
  "greeting": "[!!! Ŵéļçôɱé ƀåçķ, {name}! lorem ipsum d !!!]",
  "save": "[!!! Šåṽé çĥåñĝéš lorem ipsum !!!]",
  "inbox": "[!!! Ýôû ĥåṽé {count, plural, one {# ñéŵ ɱéššåĝé} other {# ñéŵ ɱéššåĝéš}} lorem ipsum dolor sit a !!!]"
}

"Welcome back, {name}!" has 13 characters outside the placeholder and spaces, so it lands in the 11 to 20 row and gets 13 characters of lorem ipsum padding. The plural message counts the words around and inside its branches, 28 characters, and gets 23. The placeholder, the plural keywords and # come out exactly as they went in.

Pseudo-localization in a release workflow

  1. Regenerate the pseudo file whenever your source strings change, and keep it as a test language in a dev or staging build. On Android, the debug build type turns pseudolocales on with pseudoLocalesEnabled true.
  2. Fix cut-off text, hard-coded strings and text built from parts in code before the strings go to translators.
  3. Send the real strings for translation. LingoHub syncs with your repository on GitHub, GitLab, Bitbucket, Azure DevOps or AWS CodeCommit and supports more than 40 file formats and frameworks, including JSON localization and Java property files. See how the GitHub integration keeps translations in step with your code.
  4. Keep pseudo text in test builds. Nobody should click "Šåṽé çĥåñĝéš lorem ipsum" in production.

Pseudo-localization FAQ

Is pseudo-localization the same as internationalization (i18n)?

No. Internationalization is the work that makes software ready to translate: strings pulled out of the code, placeholders instead of text glued together from pieces, layouts with room to grow. Pseudo-localization tests that work before a translator sees a single string.

Can I pseudo-localize a JSON or .properties file?

Yes. Paste the file and the tool changes only the values. JSON keys, key order, nesting, numbers and ARB metadata under @ keys, and .properties keys, comments and line breaks stay as they are. The .properties download is UTF-8, which current Java versions read by default for resource bundles. For Java 8 or another loader that reads ISO-8859-1, tick “Write non-ASCII as \uXXXX”.

Does pseudo-localization replace testing real translations?

No. It finds layout, hard-coded string and placeholder bugs before translation starts. It can't tell you whether a translation is right, so grammar, meaning and local date and number formats still need review in the translated build.