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:
- Plain English, no accents: the string is hard-coded or missing from your strings file, so translators will never see it.
- No closing
!!!]: the UI cut the string off. - One sentence in two sets of brackets: the text is built from parts in code. Translators can't reorder the parts, and languages such as Japanese, Korean and Tamil put the verb at the end.
- Clipped, overlapping or wrapped controls: the layout has no room for longer text. Fix the layout rather than shortening the string.
- A placeholder shown as
{name}, or changed: the app didn't fill it in, or something altered it on the way.
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 length | Result length |
|---|---|
| Up to 10 characters | 300% of the source |
| 11 to 20 | 200% |
| 21 to 30 | 180% |
| 31 to 50 | 160% |
| 51 to 70 | 150% |
| Over 70 | 130% |
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
-
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. - Fix cut-off text, hard-coded strings and text built from parts in code before the strings go to translators.
- 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.
- 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.