AI localisation for apps and websites

Translate your app without breaking its interface.

Upload your locale files. Parla's AI translates every string using your key names, descriptions, glossary and character limits, checks every placeholder in code and flags text too long for its UI. You approve, then export valid files or open a GitHub pull request.

Try it on one file, free and without an account: up to 100 strings, deleted after 24 hours.

Or create an account

en.json

{  "checkout": {    "greeting": "Welcome back, {{name}}!",    "items_one": "{{count}} item in your cart",    "items_other": "{{count}} items in your cart",    "terms": "I agree to the <1>terms of service</1>",    "pay_button": "Pay now"  }}

fr.json (draft for review)

{  "checkout": {    "greeting": "Bon retour, {{name}} !",    "items_one": "{{count}} article dans votre panier",    "items_other": "articles dans votre panier",    "terms": "J'accepte les <1>conditions d'utilisation</1>",    "pay_button": "Procéder au paiement"  }}
  • Passesgreeting {{name}} kept
  • Passesitems_one {{count}} kept
  • Blockeditems_other Blocked from export: missing {{count}}
  • Passesterms <1>…</1> tag pair kept
  • Too longpay_button Too long: 20 of 18 characters (limit from the key's description). Blocked until shortened.

A draft before review. The two flagged strings can't be approved or exported until a person fixes them; nothing is repaired silently.

Sample data

Machine translation doesn't know it's inside a button.

A translated string can read perfectly and still break your release: a lost {{count}}, a renamed {name}, a closing tag gone missing, or a German label twice as wide as the button it sits in.

  • Generic translators rename or translate placeholders, and the bug shows up in production.
  • Strings arrive without context, so "Save" becomes the wrong word for "save money".
  • Every release, someone diffs files by hand to find what's new or changed.

How it works

From locale file to reviewed translations, and back to a valid file.

  1. Upload

    Drop in your source file (or pull it from GitHub). Parla reads keys, descriptions, comments and plural groups, and finds what's new or changed since the last release.

  2. Translate with context

    The AI sees each string's key name, its description, your project description, your glossary, similar approved translations and any character limit. It says what it inferred, such as "button label".

  3. Check

    Code, not the AI, compares every placeholder, tag, ICU plural and select with the source. Text likely too long for its UI is flagged against the source length and your limits.

  4. Review

    A reviewer edits, approves, rejects or regenerates. Strings with a blocking problem can't be approved.

  5. Export or open a PR

    Download valid locale files, checked by parsing them again, or open a GitHub pull request after confirming every file it will change.

Use cases

Built for the files your product already has

  • Web apps

    i18next, react-intl and vue-i18n JSON with {{name}}, ICU plurals and select, and react-i18next <0>…</0> tags kept exactly.

    Read more →

  • Mobile apps

    Android strings.xml, iOS .strings and Flutter .arb, with character limits for buttons and tabs, and plural forms for every language.

    Read more →

  • Docs and content strings

    Help-center and marketing strings kept in gettext .po, Rails YAML or CSV. Parla translates strings, not whole Markdown documents.

    Read more →

Formats

Seven file formats in, the same seven out

Every exported file is parsed again before you download it, so what you get is a file your build will accept.

JSON
Nested or flat, i18next (with _one/_other plural keys), react-intl and vue-i18n style, ICU messages inside values
Android strings.xml
<string>, <plurals> and <string-array>; translatable="false" strings are left alone
iOS .strings
Comments above each string are used as context
Flutter .arb
@key descriptions are used as context; @@locale is set for each language
gettext .po / .pot
msgctxt, plurals with each language's Plural-Forms, extracted comments as context
Rails YAML
Nested keys, one/other plural groups, %{name} placeholders
CSV
key and source columns, with optional description and max_length columns

Features

What's in it

  • Placeholder validation that blocks export

    Missing, added or renamed placeholders, unmatched tags, reordered %s arguments, ICU syntax errors and mismatched select options stop a string from being approved or exported.

  • Too-long text flagged

    Each translation is compared with the source's length and the expansion expected for its size, and with any character limit you set. Over the limit blocks export.

  • Context-aware translation

    Key names, descriptions from your file or typed by you, a project description, your glossary and similar approved translations go to the AI with each string.

  • Glossary and translation memory

    Do-not-translate terms and preferred translations per language. Approved translations are remembered; exact matches are reused for free.

  • Reviewer approval

    Owners, admins and editors marked "Can approve" approve translations. Edit, reject with a reason, or regenerate.

  • Releases

    Every upload of the source file is a release: new, changed and removed strings are listed, and changed strings go back to review.

  • GitHub pull requests

    Pull the source file from a branch, push translations as one commit on a new branch with a pull request, after you confirm every file.

  • API for your CLI or CI

    Workspace API keys to upload source files, start translation, check status and download locale files with curl.

Everything Parla does →

Limits and safeguards

What you should know before you trust it

  • The AI can be wrong. It can pick the wrong word or tone. That's why every translation waits for a reviewer, what the AI inferred is labeled as inferred, and you can edit, reject or regenerate any string.
  • Placeholders are checked by code, not by the AI. Parla compares every placeholder, tag and ICU structure with the source. A broken string is kept as a draft for a person and never reaches an exported file.
  • Your files stay yours. Strings are sent to Anthropic's API to translate them and aren't used to train models. Model-call logs keep the model, length and cost, never the text. Export or delete everything from Settings.
  • Prices you can predict. Translation stops at your plan's words by default. Overage is off unless an owner turns it on, with a cap they choose, at $2 per 1,000 words.

Pricing

Plans by words, projects and languages. Never by seat.

Every plan has every feature and unlimited team members. Plans differ by projects, target languages and AI-translated words a month.

  • Starter

    $29/month

    One app or website in a few languages.

    • 1 project
    • 3 target languages per project
    • 20,000 AI-translated words a month
    • Unlimited team members
    Start with Starter
  • Team

    $59/month

    A product team shipping several apps or a web and mobile pair.

    • 5 projects
    • 10 target languages per project
    • 100,000 AI-translated words a month
    • Unlimited team members
    Start with Team
  • Business

    $129/month

    Many products, many markets, frequent releases.

    • Unlimited projects
    • 30 target languages per project
    • 400,000 AI-translated words a month
    • Unlimited team members
    Start with Business

Before you choose a plan: 1 project, 1 target language and 1,000 AI-translated words a month, with uploads, checks, review and export all included.

When a month's words are used, translation stops (a hard stop) until next month or a bigger plan. An owner can allow overage up to a cap they choose; it's billed at $2 per 1,000 words on the next invoice, and Parla never goes past the cap.

A word counts when Parla's AI translates it: each source word once per target language. Reused translation memory, imported translations and your own edits are free.

Full plan details →

Questions teams ask

Will Parla break my placeholders?

Parla checks every translation against its source in code: placeholders such as {name}, {{count}}, %s, %1$d and %{name}, HTML and react-i18next tags, and ICU plural and select structure. A string with a missing, added or renamed placeholder can't be approved and is never written to an exported file. Nothing is repaired silently.

Which file formats does it support?

JSON (nested, flat and i18next with plural keys, including ICU messages), Android strings.xml, iOS .strings, Flutter .arb, gettext .po and .pot, Rails YAML and CSV. Files come back out in the same format, and each exported file is parsed again before you download it to prove it's valid.

How does it know a string is too long?

Each translation is compared with the length of its source and the expansion that's normal for text that size (short labels grow most), and with a character limit if you set one or your file's description gives one. Likely-too-long text is flagged; text over a set limit is blocked until shortened.

Can I try it without signing up?

Yes. The sample page translates one file (up to 100 strings and 1,500 words, 50 KB) into one language, checks every placeholder and gives you a valid file to download. Use your own file or a bundled sample. It's deleted after 24 hours.

Does a person still review translations?

Yes. Every AI translation is a draft until a reviewer approves it: an owner, an admin or an editor marked "Can approve". Reviewers can edit, reject with a reason or regenerate. Only approved translations go into exported files, unless you choose to include drafts that pass every check.

What happens when I upload a new version of my file?

Each upload of your source file is a release. Parla lists the strings that are new, changed or removed, translates only what needs it, reuses approved translations from memory, and sends changed strings back to review.

How does the GitHub integration work?

Install Parla's GitHub App on the repositories you choose, or paste a fine-grained personal access token. Parla pulls your source file from a branch, and pushes translations as one commit on a new branch with a pull request, only after you confirm the list of files. It never commits to your default branch.

Can I use it from the command line or CI?

Yes. Create an API key in the app and call the REST API with curl or any HTTP client: upload a source file, start translation, check status and download locale files. A download is refused, with the reasons, if a string would break.

What counts as a word?

A word counts when Parla's AI translates it: each source word once per target language. Reused translation memory, imported translations and your own edits are free. Words reset each billing month.

What happens when I run out of words?

When a month's words are used, translation stops (a hard stop) until next month or a bigger plan. An owner can allow overage up to a cap they choose; it's billed at $2 per 1,000 words on the next invoice, and Parla never goes past the cap.

Is my data used to train AI models?

No. Strings are sent to Anthropic's API to translate them, and API data isn't used for training. Parla logs each model call's model, length and cost, never its text, and deletes those logs after 90 days. You can export your workspace or delete it from Settings.

Who's behind Parla?

Parla is made by New Odyssey. "Parla" is a working name. Questions: clio@new-odyssey.com.

See what happens to your own strings.

Upload one locale file, or use a sample, and get a validated translation back in a minute. No account needed.

Part of the New Odyssey suite

Six tools for the work around your clients, from being found to packaging what you know. Each one works on its own.

  1. KleosGets you found
  2. OndaAnswers the inquiry
  3. BookaraQualifies and books
  4. AccordSends the proposal
  5. TallynOnboards the client
  6. AulaPackages your expertise