Skip to content
nocutoff.

Localization file translator

Translate app localization files with every key and placeholder intact

Upload your JSON, PO, strings.xml, .strings, .xcstrings or XLIFF files, choose a language, and get the same files back translated, ready to drop into your project. Keys, comments, order and formatting stay exactly as they were, and every placeholder such as {name}, {{count}} or %1$s is checked in every string. The first strings are free with no sign-up; the whole job, up to 20 files and 5,000 strings, is $5 as one payment, with no subscription. A chatbot is fine for a dozen strings, but a file with thousands of keys tends to come back cut short, with keys renamed or placeholders changed.

Translate string files

Tone
Glossary and names to keep (optional)

Brand and product names, separated by commas. Each one is checked in every translation.

One term per line: term = translation.

No sign-up. The first strings are free. Every file in the job $5, one payment.

By continuing you agree to our Terms of Service and Privacy Policy.

  • First strings free, no account needed
  • Whole job $5, one payment: up to 20 files and 5,000 strings
  • Keys, nesting, comments and order kept; only values are translated
  • Placeholders, ICU plurals and inline tags checked in every string
  • Plural forms written for the target language (PO, Android, Xcode)
  • 41 languages, formal or informal tone, glossary and names to keep
Open the demo
85 strings · keys unchanged

{

"home.greeting": "Good morning, {name}Buenos días, {name}",

"home.nearby": "{count, plural, =0 {No trails near you yet} one {# trail near you} other {# trails near you}}{count, plural, =0 {Aún no hay rutas cerca de ti} one {# ruta cerca de ti} other {# rutas cerca de ti}}",

"trail.offline_done": "<b>{name}</b> is saved on this phone. You can use the map without a signal.<b>{name}</b> está guardado en este teléfono. Puedes usar el mapa sin señal.",

"trail.share_text": "I just finished {trail} with Trailbook! {km} km and {meters} m up. 🥾¡Acabo de terminar {trail} con Trailbook! {km} km y {meters} m de subida. 🥾",

"saved.empty": "You have not saved any trails yet.\nTap the heart on a trail to keep it here.Aún no has guardado ninguna ruta.\nToca el corazón en una ruta para guardarla aquí."

}

Yellow: placeholders and ICU plural syntax, checked in every string. Teal: tags, escapes and emoji, kept as written.

Same keys. Same placeholders. New language.

Only the values change. The file comes back with the same nesting and order, named es.json, and any string that loses a placeholder is asked again before it can reach your build.

Demo app made up for this page; the Spanish strings are real output from the tool, from an 85-string file.

What you get back

You get your files back in the same format, named and placed the way each platform expects: en.json becomes es.json, strings.xml comes in a values-es folder, Localizable.strings in es.lproj. Several files download together as one ZIP. Before you download, every translated string is shown on screen next to its source, and you can edit any of them.

  • JSON and ARB: nested keys, arrays, key order, indentation and spacing as in your file. ICU messages such as {count, plural, one {# item} other {# items}} keep their structure. In ARB, "@" metadata stays and @@locale is set.
  • PO and POT: msgid and msgctxt never change; empty and fuzzy entries are translated, entries that already have a translation are left alone. Plural entries get as many msgstr[n] as the target language needs, and the header gets Language and Plural-Forms.
  • Android strings.xml: <string>, <string-array> and <plurals>; translatable="false" is skipped; apostrophes and quotes are escaped the way Android requires; <xliff:g> content is never translated.
  • iOS and macOS: .strings files keep their comments and encoding (often UTF-16); .xcstrings String Catalogs get a new localization for your language, with plural variations, and strings already translated are kept.
  • XLIFF 1.2 and 2.0: a <target> after each untranslated <source>, inline codes such as <g>, <x/>, <ph> and <pc> kept, and the target language set on the file.

Translating string files with a chatbot, and with this tool

Chat assistants translate short UI text well, and a dozen strings pasted into a chat usually come back fine. The trouble with a real localization file is length and syntax: thousands of keys, placeholders, plural rules and escaping that a compiler or a library will reject if one character is wrong.

Your situation A chatbot This tool
Ten button labels Usually translates them well Translates them and gives you the file back
A file with 3,000 keys The reply has to be as long as the file, so it tends to stop partway Translates every string in blocks of up to 60, up to 5,000 strings per job
Keys and nesting Rewrites the whole file, so keys can be translated, renamed or dropped Keys are never sent for translation; the file is rebuilt from yours
Placeholders like {name}, %1$s or :attribute Usually keeps them, but nothing checks Checks every string; one that loses a placeholder is translated again, then kept in the source language and listed
Plurals in Russian, Polish or Arabic Often copies the two English forms Writes every plural form the target language needs, with example numbers for each
Apostrophes in Android strings Can leave an unescaped apostrophe that breaks the build Escapes apostrophes and quotes the way Android requires

How to translate a localization file

  1. 1

    Upload your files and choose a language

    Drop one or more files from the same project: JSON, ARB, PO or POT, strings.xml, .strings, .xcstrings or XLIFF. Pick the target language and tone, and list product names to keep.

  2. 2

    Check the first strings free

    The first strings appear on screen with their keys next to the source text. Edit any of them in place. No account is needed for this step.

  3. 3

    Unlock and download

    Happy with the first strings? Unlock the whole job for $5, then download the translated files, plus a warnings list if anything needs a look.

Why long string files trip up general AI assistants

A localization file is code as much as text. To translate it in a chat, the assistant has to write the whole file back out, keys, brackets, escapes and all, and a file with a few thousand strings is longer than one reply can be. It stops partway or asks you to continue, and you are left stitching pieces together.

The syntax is the second problem. A key translated by mistake, a {count} turned into {cuenta}, a %1$s that lost its dollar sign, an unescaped apostrophe in strings.xml: each is a small change in a long reply, and each can break a build or show a raw placeholder to your users.

This tool never asks a model to rewrite your file. It reads the file into strings, sends only the text, with the key and any developer comment as context, in blocks of up to 60 strings, and requires one answer for every string. Inline tags are swapped for short markers first. Every answer is checked: same placeholders, same escapes such as \n, same markers, the names you listed, and every plural form. A string that fails is asked again; if it fails twice the source text stays in place and the string is listed for you. The file is then rebuilt from your original.

What people translate

  • React, Vue, Angular and Next.js apps: i18next, vue-i18n, react-intl and ngx-translate JSON files
  • Flutter apps: .arb files, with @metadata descriptions used as context
  • WordPress plugins and themes, Django and other gettext projects: .pot templates and .po files
  • Android apps: res/values/strings.xml with string arrays and plurals
  • iOS and macOS apps: Localizable.strings and String Catalogs (.xcstrings)
  • Files exported from a translation platform or Xcode as XLIFF

What it does not do

It does not read YAML, .properties, .resx or .stringsdict files yet, and it does not add i18next plural keys (key_one, key_few) that are missing from your source file: it translates the keys you have. In .xcstrings files, strings that use substitutions or device variations are left as they are.

It does not overwrite translations you already have: filled PO entries, XLIFF targets marked as translated and String Catalog entries in your language stay as they are. One payment covers up to 20 files and 5,000 strings; Unlimited covers up to 15,000 strings per job.

It is machine translation with structural checks. It is well suited to shipping a first version of a language quickly and to keeping a project in sync. For store listings, legal text or anything with a brand voice, have a native speaker review it.

Getting a good result

Context makes the difference between "Save" the verb and "Save" the discount. Keys such as settings.save_button and comments in your file (#. in PO, @key descriptions in ARB, /* comments */ in .strings) are sent with each string, so a file with meaningful keys and a few comments translates better.

List your app and product names under "Never translate", and choose formal or informal for languages that have both. Use the free strings as a test, then check the warnings list after unlocking: each entry shows the key, the problem and what the model returned.

By language and situation

What it costs

First strings

Free

Shown on screen, no account. 1 job a day, or 3 a day with a free account.

Whole job

$5

One payment for up to 20 files and 5,000 strings. No subscription, never expires.

Unlimited

$29/month

Every tool on the site, with jobs of up to 15,000 strings. Or $180 a year.

Questions and answers

Can ChatGPT translate a JSON localization file?

A small one, usually yes. A file with thousands of keys has to come back in one reply, so a chatbot tends to stop partway, and nothing checks that every key and placeholder survived. This tool translates the values in blocks, checks every placeholder, and rebuilds the file from yours.

Which formats are supported?

JSON (i18next, vue-i18n, react-intl, ngx-translate and similar), Flutter ARB, gettext PO and POT, Android strings.xml, iOS and macOS .strings and .xcstrings, and XLIFF 1.2 and 2.0. Files can be up to 10 MB each, up to 20 files in one job.

Are keys and placeholders kept?

Keys are never sent for translation. Placeholders such as {name}, {{count}}, %s, %1$d, %@, :attribute and %{name}, escapes such as \n, inline tags and emoji are checked in every string. A string that loses one is translated again; if it still fails, the source text stays and the string appears in the warnings list.

How are plurals handled?

ICU messages keep their structure and get the plural categories the target language uses. PO entries with msgid_plural get as many msgstr[n] forms as the target language needs, and the header gets the matching Plural-Forms. Android <plurals> and Xcode plural variations are written with the target language's categories, such as one, few, many and other for Russian.

What happens to strings that are already translated?

They are kept. Only empty or fuzzy PO entries, XLIFF units without a finished target and String Catalog entries without your language are translated. In JSON, .strings and strings.xml every value is treated as source text.

Which languages can it translate into?

41 languages, including Spanish, French, German, Italian, Portuguese (Brazil and Portugal), Dutch, Polish, Russian, Ukrainian, Turkish, Arabic, Hebrew, Hindi, Indonesian, Vietnamese, Thai, Japanese, Korean and Chinese (Simplified and Traditional).

Is it free?

The first strings of every job are translated free and shown on screen, with no account. The whole job, with the downloads, is $5 paid once. Unlimited, at $29 a month or $180 a year, covers every tool on the site.

Are my files private?

Only you can open your job. The strings are sent to an AI model provider for the sole purpose of translating them, through routes that do not use your data for training. Jobs uploaded without an account are deleted after 7 days, and you can delete any job yourself at any time.

Updated October 20, 2026 · APPFACT STUDIO LTD

More jobs we can do

We use analytics cookies to see which pages help people. Is that OK?