AI translation for i18n files

Translate a file in under a minute.

Upload a JSON, YAML, XML, or ARB file. We read your keys as context, translate to any of 50+ locales, and return the exact same file format.

See pricing

No account. No credit card. Same file back.

Built for developers, not spreadsheets.

Context-aware accuracy

We feed each string its key path and any developer description as context, so a "Submit" button reads differently than a "Submit" bug report.

Placeholders never break

Format-specific rules protect {variables}, %1$s, %@, ICU plurals, and inline HTML. Failed strings auto-retry.

Files stay private

All model credentials are server-side. Your file is translated and returned — nothing is stored long-term.

Start free. Upgrade when you need more.

No per-seat fees. No hosted-word storage charges. You pay for words translated, not seats.

Free

$0forever

Try it instantly — no account needed.

  • 1 target language (anonymous)
  • Up to 3 languages (signed in)
  • 5 translation tasks / day
  • Up to 500 keys per file
  • All file formats (JSON, YAML, XML, ARB)
  • No credit card, no sign-up to try

Plus

$9/ month

For solo developers shipping small projects.

  • 50,000 word-locales / month
  • 5 target languages per task
  • Files up to 5,000 keys
Most popular

Max

$29/ month

For active developers with multiple projects.

  • 200,000 word-locales / month
  • 15 target languages per task
  • Files up to 20,000 keys
  • Priority processing

Common questions

How do I translate a JSON localization file?

Upload your source file (e.g., en.json), pick the target languages you want, and download a translated file in the same JSON format. Original key order, nesting, and formatting are preserved — only the string values change. Placeholders like {name} or {{count}} are protected from being translated.

Can I translate Android XML strings with placeholders like %1$s and <b>?

Yes. Placeholder rules for Android XML (including %1$s / %d / %s and inline HTML tags like <b>, <i>, <a>) are encoded into the translation prompt, and the output is validated against the source — if a placeholder disappears, the string is retried with the original kept as a fallback. Inline HTML round-trips intact.

How do I translate a Flutter ARB file for my app?

Upload app_en.arb, select the target locales (e.g., zh, es, ja, ar), and get back app_zh.arb, app_es.arb, etc. ICU MessageFormat placeholders ({count, plural, ...}) are protected, and the @metadata context block is preserved. The free tier supports ARB up to 200 keys.

How do I localize my iOS app's Localizable.strings or .xcstrings?

Upload the file, pick target languages, and download a translated file in the same format. The original key order and comments are preserved. .stringsdict plural variants are handled separately — see the iOS strings format page for details.

What's the cheapest way to translate a Next.js / i18next JSON file?

The free tier is $0 and translates 1 target language up to 200 keys per file, no sign-up needed. For multi-language projects, the Plus plan at $9/month includes 50,000 word-locales — enough to translate ~10,000 words across 5 languages. No per-seat fees.

Can I translate an Excel file with translation keys?

Yes. Upload an .xlsx file where one column is the source language and the other columns are target locales. Each cell is translated independently; column headers and structure are preserved. Failed cells fall back to the source.

Will my placeholder variables survive translation?

Yes. {name}, {count}, {0}, %s, %1$s, %@, {{var}}, and ICU MessageFormat placeholders are protected by format-specific rules that run before and after translation. If a placeholder is missing or extra in the output, the translation is retried; if it still fails, the source is kept as a fallback.

How is this different from just pasting my JSON into ChatGPT?

ChatGPT can translate short snippets, but it loses placeholders, breaks key order, flattens nesting, and forgets comments. Localee is built for the format round-trip: it preserves your file structure byte-for-byte and validates placeholders against the source, so the output is a drop-in replacement in your app, not a reformatting job.