Drop your .json file here, or click to browse
.json, up to 400 KB
How the JSON translator works
A JSON locale file has two halves that must be treated differently. The keys are lookup identifiers your code calls, so translating them breaks the app. The values are what users read, so they are the only thing that should change. This tool walks the file, translates the string values, and rebuilds the same file around them. Keys, key order, nesting, arrays, numbers, booleans, and nulls come back untouched, and the output matches your indent width and trailing newline so the diff is only the strings.
Placeholders survive
Interpolation tokens are pulled out before the model sees the string and put back afterwards, so an AI cannot rename or drop them. That covers {{name}} (i18next, Vue), {count} (ICU, .NET), %s, %d and %1$s (printf, Android, gettext), ${value}, %{email}, $t(other.key), and inline markup like <b> or <0></0> from react-i18next.
If a placeholder still would not come back intact, that one value is kept in the original language rather than shipped broken. A missing translation is a five second fix. A dead {{name}} is a production bug.
What is left alone on purpose
- Every key, at every level of nesting
- URLs, email addresses, file paths, hex colors, dates, and version numbers
- Code-style values such as
ERR_NETWORK_TIMEOUToruser.profile.title - Values under technical keys like
id,url,icon,class, andslug - The inside of ICU plural and select blocks. The block comes back intact and valid, but its wording stays in the source language, because plural categories differ per language and guessing them is how locale files break
Tips for locale files
- Add a glossary for product names and UI verbs so the whole file stays consistent
- Pick a specific target variant, like Latin American vs European Spanish, for the right register
- Translate one namespace file at a time. Smaller files give the model tighter context
- Diff the result before committing. Only the string values should show up
Frequently asked questions
Does it translate the keys in my JSON file?
No, never. Keys are the identifiers your code looks up, so translating them would break every call site. Only string values change. Key order, nesting, arrays, numbers, booleans, and nulls come back exactly as they were, and the output matches your indent width and trailing newline so the diff shows only the strings.
What happens to placeholders like {{name}} or %s?
They are pulled out before the AI sees the string and put back afterwards, so the model cannot rename or drop them. That covers {{name}} for i18next and Vue, {count} for ICU and .NET, %s, %d and %1$s for printf, Android and gettext, ${value}, %{email}, $t(other.key), and inline markup like <b> or <0></0> from react-i18next.
What if a placeholder would not survive the translation?
That single value is kept in the original language instead of being shipped broken, and the result tells you how many values that happened to. A missing translation is a quick manual fix, while a dead {{name}} in production is a real bug.
Are ICU plural forms handled?
A plural or select block comes back intact and still valid, but the wording inside it stays in the source language. Plural categories differ per language, so filling them in automatically is how locale files quietly break. Translate those blocks yourself with the right categories for your target language.
Which JSON files does this work with?
Any valid .json file up to 400 KB, including i18next, react-intl, Vue I18n, Angular, Flutter ARB style files, and plain data files. Nesting depth does not matter. Files with comments or trailing commas are not valid JSON, so remove those first.
Is it free, and are my files stored?
Free, with no signup. Your file is processed in memory to produce the translation and is not kept afterwards, never used for training, and never shared.