Translate an Angular app into Italian
To translate an Angular app into Italian, you translate the messages.xlf file generated by <code>ng extract-i18n</code>. Manuce fills in the Italian targets, keeps the interpolation placeholders intact and returns the same XLIFF file, ready to become your messages.it.xlf. A report lists the strings that were translated and those left as they were, with the reason.
What it costs
For the language files of a Angular app totalling about 2,500 words, into Italian:
To understand, internal use.
Ready to send, by the technical specialist.
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.
From messages.xlf to messages.it.xlf
Angular does not translate at runtime. Text marked with i18n in templates, or with $localize in code, is extracted by ng extract-i18n into messages.xlf, in XLIFF 1.2 or 2.0. Each unit holds a source, and its target needs filling in Italian.
An XLIFF 1.2 example:
- source:
Hello <x id="INTERPOLATION" equiv-text="{{ name }}"/>, you have a new message - target:
Buongiorno <x id="INTERPOLATION" equiv-text="{{ name }}"/>, ha un nuovo messaggio
The <x/> element (or <ph/> in XLIFF 2.0) stands for the variable. It must survive untouched, or the Italian build fails or shows broken text. Manuce checks exactly this on every value.
What Italian changes in your Angular strings
Register. An Italian interface addresses users either with formal Lei ("Inserisca la password", "Ha dimenticato la password?") or with tu ("Inserisci la password"). Lei is the usual choice for business, banking or public-sector apps. What matters most is not mixing the two across screens.
Articles before variables. The Italian article depends on the word that follows: il file, l'account, lo smartphone. A string such as Delete the {{ item }} cannot be translated reliably when the variable varies. A source like Item to delete: {{ item }} works better.
Gender. "Benvenuto" or "Benvenuta"? With a first name in a variable, use an ICU select expression, or a neutral phrasing such as "Le diamo il benvenuto".
Plurals. CLDR gives Italian the categories one, many and other. many only covers special cases, such as large numbers in compact notation ("1 milione di…"). For most messages, {count, plural, =0 {Nessun messaggio} one {1 messaggio} other {… messaggi}} is enough. Existing branches are translated, but the expression is not restructured.
Spelling. Italian distinguishes è (grave accent) from perché (acute accent). The capital is È, not "E'". Days and months are lower case (lunedì, marzo). Labels are not title-cased, so "Impostazioni account" rather than "Impostazioni Account".
What Manuce returns, and what it does not do
You get back the same file, in the same format. Indentation, unit order, quotes, comments, line endings, encoding and BOM are preserved; only the targets change. Each translated value is compared with its source (variables, tags). If a mismatch persists, the source value is kept and the report says so, so you know exactly which strings are still untranslated and why.
The following are left untranslated: IDs (@@submitButton), empty values, URLs, email addresses, numbers, colours, date formats and anything marked as not translatable. The price covers the words in the values, with keys and tags excluded.
What Manuce does not do:
- It does not translate hard-coded template text without an
i18nattribute, because that text is not in the file. - It does not edit
angular.jsonor configure theitlocale. - It does not test the rendering in your app.
- It does not produce sworn or certified translations. If your Italian terms and conditions need legal standing, have them validated separately.
For strings your Italian users will see, the Professional level is intended for text that is ready to hand over.
Preparing the extraction and checking the Italian build
Before extracting:
- Add a meaning and a description to ambiguous strings, for example
i18n="button|Submits the contact form@@sendButton". The translator cannot see the screen: "Open" may be "Apri" (a verb) or "Aperto" (a status). - Set custom IDs (
@@…), so that a minor edit to the source text does not discard the translation. - Check that messages in your TypeScript code go through
$localize.
After delivery:
- Read the report and deal with any strings left in the source language.
- Search the file for a capital E followed by a straight apostrophe ("E'").
- Check narrow buttons. From an English source, Italian often runs longer: "Settings" becomes "Impostazioni".
- Dates, numbers and currencies do not come from the translation but from the
itlocale data: decimal comma, full stop for thousands, lower-case months. Make sure that data is loaded for thedate,numberandcurrencypipes.
In practice
- Run ng extract-i18n to produce messages.xlf (XLIFF 1.2 or 2.0).
- Upload the file to Manuce, choose Italian and review the quote, which is based on the words in the values.
- Check the free sample to judge the register, then start the translation.
- Download the translated file and the report, and save the file as messages.it.xlf in your project.
- Build the it locale and check the screens, plurals and date formats.
Frequently asked questions
Should my app use Lei or tu?
Lei is what users expect from business, public-sector or financial apps. Tu is found in consumer apps with a casual tone. State your choice in your string descriptions and use it consistently.
Will the x and ph placeholders in my XLIFF survive?
Yes. Every target is checked against its source. If a variable or tag is missing and the mismatch persists, the source value is kept and the report flags it, so your build does not break.
Do I need a many branch in my ICU plural expressions?
Usually not. In Italian, many only applies to special cases such as large numbers in compact notation, and =0, one and other cover most messages. Manuce translates the branches that are present without adding new ones.
Why is some text in my app still in the source language?
It is probably not in messages.xlf: either hard-coded template text with no i18n attribute, or a TypeScript string without $localize. Mark it, re-run the extraction and upload the new file.
Are IDs and URLs counted in the price?
No. Only the words in the values count; keys, IDs and tags are excluded. URLs, email addresses and numbers are left untranslated.
The specialist in charge
This subject goes to Dédale, the technical specialist. See how it works.
The same file, into another language
Into Italian, other files
See also
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.