ManuceLanguage files

Translate the language files of your website or app

Upload the language file of your website or app. You get the same file back, in the same format, with the same keys, the same order and the same comments: only the values are translated.

Upload my file View pricing

Supported formats

  • JSON i18n — flat or nested, string arrays — i18next, react-intl, vue-i18n, next-intl, Angular, ngx-translate
  • YAML — .yml and .yaml — Rails, Symfony, Hugo, i18n-js; anchors, | and > blocks and comments kept
  • gettext PO and POT — msgctxt, plurals, #. #: #, comments kept; a .pot comes back as one .po per language, with the Language and Plural-Forms headers set
  • XLIFF 1.2 and 2.0 — source to target, state updated, translate="no" respected, notes read as context
  • Android strings.xml — string, string-array, plurals; translatable="false" respected; apostrophes and special characters escaped the Android way
  • iOS .strings and .xcstrings — .strings in UTF-8 or UTF-16; Xcode String Catalog: the target language is added to the catalog, plural variations included
  • Java .properties — \uXXXX escapes kept when the file uses them, continuation lines, MessageFormat apostrophes
  • .NET .resx — data and value; comments read as context; non-text resources left untouched
  • Flutter .arb — @ keys ignored, descriptions read as context, @@locale set to the target language
  • CSV with keys — a key column and language columns: the target language is added as a column, or filled in if it exists

Up to 40 MB per file. Several target languages: one file per language, each with its report.

Before, after

A French JSON file, translated into English. The keys, the variable, the plural structure, the link and the colour stay as they are.

Before
{
  "checkout": {
    "title": "Votre panier",
    "pay": "Payer {amount}",
    "items": "{count, plural, one {# article} other {# articles}}",
    "terms": "J'accepte les <a href=\"/cgv\">conditions de vente</a>"
  },
  "theme_color": "#0f1b2d"
}
After
{
  "checkout": {
    "title": "Your cart",
    "pay": "Pay {amount}",
    "items": "{count, plural, one {# item} other {# items}}",
    "terms": "I accept the <a href=\"/cgv\">terms of sale</a>"
  },
  "theme_color": "#0f1b2d"
}

An Android strings.xml translated into Russian: the escaped apostrophe disappears because the Russian sentence has none, the quotation marks follow Russian usage, and the plurals go from two forms to four.

Before
<string name="cant_connect">Impossible d\'ouvrir « %1$s »</string>
<plurals name="songs">
    <item quantity="one">%d chanson</item>
    <item quantity="other">%d chansons</item>
</plurals>
After
<string name="cant_connect">Не удаётся открыть «%1$s»</string>
<plurals name="songs">
    <item quantity="one">%d песня</item>
    <item quantity="few">%d песни</item>
    <item quantity="many">%d песен</item>
    <item quantity="other">%d песни</item>
</plurals>

Variables and tags protected

Before translation, each variable becomes a marker the language engine cannot change: React or Flutter braces, i18next and Angular double braces, the %s, %d, %1$s and %@ of printf, Android and iOS, Laravel :name, template ${var}, Rails %{count}, HTML tags, HTML entities, line breaks.

ICU messages are translated branch by branch: the argument, the keyword and the selectors stay as they are, only the text of each branch changes.

After translation, every value is checked: same variables, as many times, and tags in the same order. A value that fails the check is translated again; if it fails again, the source value is kept and the report says so.

The engine also receives the context of each string: its key, the developer comment, the file it comes from. The same term is translated the same way throughout the file, and brand or product names stay as they are.

How much it costs

The price is based on the words of the values to translate alone: keys, variables and tags do not count. The JSON excerpt above counts 10 billed words.

For an app of about 1,500 strings and 6,000 words, from French:

Professional, into English
107 €

Ready to ship.

Professional, five languages
266 €

English, German, Spanish, Italian and Portuguese, 50% multilingual discount included.

Essential, into English
35 €

For a test build.

VAT not applicable, article 293 B of the French tax code. The exact quote is shown as soon as you upload your file, before any payment.

The report delivered with each file

For each language, a short report comes with the file: the number of strings translated, those left as they are and why, the variables checked, the plurals adapted, the metadata updated such as a PO file's Language header or an XLIFF's target-language attribute, and where the file goes in your project for Android.

The output file is re-read by a strict parser for its format before it is delivered. A file that would fail this check is not sent.

Frequently asked questions

Is the output file really the same?

Yes. Values are replaced in place in the text of the file, without rewriting it: indentation, key order, quotes, comments, line endings, encoding and BOM stay those of your file. Without translation, the file would come out identical byte for byte; we check this on every format.

What happens if a variable is lost?

Every translated value is compared with the source: same variables, as many times, tags in the same order. If anything differs, the string is translated again; if it still differs, the source value is kept and the report delivered with the file tells you which one and why. No broken string goes to production.

Are plurals adapted to the target language?

Yes. Russian has three forms, Arabic six, Japanese only one. Manuce sets the Plural-Forms header of a PO file, writes the right number of forms, and adds to an Android file, a String Catalog or an ICU message the categories the language requires (few, many…), each written for the numbers it covers.

What is not translated?

Keys, empty values, URLs, email addresses, numbers, colours, date formats and technical identifiers, as well as anything you marked as not translatable (translatable="false", translate="no", shouldTranslate). The report lists them.

How is the price calculated?

On the words of the values to translate alone. Keys, variables, tags and technical values are not counted. The quote is shown as soon as the file is uploaded, before any payment.

Are my files kept?

They remain in your workspace so you can download them again, and you can delete them at any time. No one at Manuce reads your files.

Upload your language file

The quote appears right away. You test for free on a few strings before paying.

Upload my file