ManuceTranslate a fileTranslate a Symfony App into English

Translate a Symfony App into English

Upload your Symfony translation files, such as messages.fr.xlf or validators.de.yaml, and Manuce returns the same file in the same format with the values translated into English and every key untouched. Placeholders like %name% and {name} are checked string by string, and a report lists what was translated and what was left as it was.

Upload my file See pricing

What it costs

For the language files of a Symfony app totalling about 3,000 words, into English:

Essentiel
€18

To understand, internal use.

Professional
€54

Ready to send, by the technical specialist.

Premium
€105

Cross-checked. For documents that commit you.

Price for one language, original layout included. VAT not applicable — article 293 B of the French General Tax Code (CGI). The exact quote, based on your file's word count, is shown before you pay.

Which Symfony files to upload

In a Symfony project, interface text lives in the translations/ directory, one file per domain and locale: messages.de.xlf, validators.fr.yaml, security.es.xlf, or ICU variants such as messages+intl-icu.it.xlf. Manuce handles both common formats, XLIFF and YAML.

  • messages: labels, buttons, headings and generated emails used in your Twig templates.
  • validators: your own constraint messages. The messages for Symfony’s built-in constraints already ship in English with the component, so there is no need to pay for them again.
  • security: authentication messages, usually provided by Symfony as well.

Before uploading, run php bin/console translation:extract --dump-messages with your source locale, or debug:translation, to find strings still hard-coded in templates. Manuce translates what is in the files, not your Twig or PHP code.

What changes when the target is English

English is usually shorter than Romance languages and German (about 10 to 15% shorter than French): “Enregistrer les modifications” becomes “Save changes”. Overflowing buttons are rare, but very short labels can read bluntly, so check your menus.

  • Zero is plural. English has two CLDR plural categories, one and other, and 0 falls under other (“0 items”), whereas French treats it as singular. Coming from Polish, Russian or Czech, your source may contain few and many branches; in an ICU message, English only needs {count, plural, one {# item} other {# items}}. With the legacy pipe syntax, review explicit intervals such as {0} No items|{1} One item|]1,Inf[ %count% items.
  • Punctuation. French spaces before colons and guillemets disappear; German „…“ quotes become “…” or ‘…’ depending on your house style.
  • British or American. colour/color, cancelled/canceled, and title case (“Create Your Account”, more common in US interfaces) versus sentence case (“Create your account”). Decide before you start and check it on the free sample.
  • Dates. A format such as d/m/Y stored in a value is not translated; for a US audience, change it to m/d/Y yourself, or better, format through Twig’s format_date filter so the locale decides.

Exactly what Manuce returns, and what it does not do

You get the same file back: indentation, key order, quotes, comments, line endings, encoding and BOM preserved. Only the values change. In user.greeting: 'Hallo %name%', the key stays, %name% stays, and the value becomes 'Hello %name%'.

  • Every translated value is compared with its source (%name% and {name} placeholders, tags). If a mismatch persists, the source value is kept and the report says so.
  • Not translated: keys, empty values, URLs, email addresses, numbers, colours, date formats, identifiers and anything marked as non-translatable.
  • The price is based on the words in the values only, keys and tags excluded, so long keys such as checkout.payment.error.card_declined cost nothing.

Manuce does not edit translation.yaml, rename files for you or translate text hard-coded in your code. Nor does it produce sworn or certified translations: if your terms and conditions must be certified, you need a sworn translator.

Preparing and checking before release

  1. Mark anything that must not change: brand names, codes, technical values.
  2. After delivery, save the file as messages.en.xlf (or .yaml). For a separate British variant, a messages.en_GB.yaml can hold only the differences, as Symfony falls back to en for everything else.
  3. In XLIFF, the target-language attribute stays as it was in the source, since the file is returned unchanged in structure; adjust it if a tool in your pipeline reads it.
  4. Run php bin/console lint:yaml translations or lint:xliff translations: an English apostrophe (“Don’t”) in a single-quoted value must still parse.
  5. Add en to enabled_locales, clear the cache, then run debug:translation en to list missing strings.

Finally, read the report: every string left in the source language is listed with the reason, which tells you exactly where to look.

In practice

  1. Collect the source-language files from translations/ (messages, custom validators and so on).
  2. Upload them to Manuce: the quote appears instantly, based on the exact word count of the values.
  3. Check the free sample, especially the British or American spelling.
  4. Download the translated file and its report, and save it as messages.en.xlf or .yaml.
  5. Run lint:xliff or lint:yaml, then debug:translation en, before deploying.

Frequently asked questions

My keys are the source text itself, e.g. 'Anmelden'. Are they translated?

No. Keys are never translated, only values. If you use source text as keys, your English file will keep those keys, which is perfectly normal in Symfony. They are not counted in the price either.

Will %count% plurals work in English?

%count% is checked like any other placeholder. English has just two forms, one and other, and 0 takes the plural form. Review messages that use explicit intervals such as {0} or {1}, and drop few/many branches if your source language had them.

Do I need to translate validators.xlf too?

Only your custom constraint messages. Symfony already ships English messages for its built-in constraints, so upload just your own entries to avoid paying for words you do not need.

What if a placeholder such as {username} goes missing in translation?

Each translated value is compared with the source. If the mismatch persists, the original value is kept as it is and the report flags it, so your app does not break on a missing parameter.

Can I drop the returned file straight into my project?

Yes. It is the same file in the same format, with the same indentation, encoding and comments. You only need to give it the en suffix and enable the locale in your configuration.

The specialist in charge

This subject goes to Dédale, the technical specialist. See how it works.

Try it on your own file, free

A sample of your file translated at the level you choose, before any payment. You judge, then you decide.

Upload my file