Translate an Angular app into German
To translate an Angular app into German, you translate the messages.xlf file generated by ng extract-i18n. Manuce fills in the German targets, keeps the interpolation placeholders and returns the same XLIFF file with a report. What remains is checking what German does to your UI: longer labels, capitalised nouns and a consistent form of address.
What it costs
For the language files of a Angular app totalling about 2,500 words, into German:
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.
What messages.xlf holds and what must come back
With Angular's built-in i18n, text marked with the i18n attribute in templates and with $localize in TypeScript is extracted by ng extract-i18n into messages.xlf. The file uses XLIFF 1.2 by default, or XLIFF 2.0 if you ask for it. That file is what gets translated: each unit holds a <source> and expects a German <target>.
The tricky part is the markup inside sentences. A template such as You have received {{ count }} <b>messages</b> becomes, in XLIFF 1.2, a source peppered with <x id="INTERPOLATION"/> and <x id="START_BOLD_TEXT"/>. In German those placeholders often move, because the past participle goes to the end: "Sie haben {{ count }} <b>Nachrichten</b> erhalten". If a placeholder is dropped or left unclosed, the German build fails.
Unit IDs must stay untouched, whether Angular generated them or you set them with @@ (for example i18n="@@saveButton"). The compiler uses them to match each translation to its template.
German in an Angular UI: length, capitals, plurals
- Length. German text often runs 20 to 35% longer than English, and compounds do not break on their own. "Access rights" becomes "Zugriffsberechtigungen", and "Account settings" becomes "Kontoeinstellungen". Tabs, buttons and table columns sized for the source language can overflow as a result.
- Capitals. Every noun is capitalised, buttons included: "Add to basket" becomes "In den Warenkorb". A CSS rule such as
text-transform: capitalizeorlowercasewritten for English will produce wrong German. - Form of address. Sie is expected in business software, while du is common in consumer apps. Mixing them in one interface ("Melden Sie sich an" on one screen, "Speichere deine Daten" on another) stands out immediately.
- Punctuation. German puts no space before "?" or ":" and uses „…“ quotation marks. If your source is French, the non-breaking space in "Mot de passe oublié ?" disappears: "Passwort vergessen?".
- ICU plurals. German has two CLDR categories,
oneandother, the same as English. So{count, plural, =0 {No files} =1 {One file} other {{{count}} files}}becomes=0 {Keine Datei} =1 {Eine Datei} other {{{count}} Dateien}. The keywords stay as they are; only the text inside the braces changes. If your source is French, where zero falls underone, check that case, because in German zero isother("0 Dateien").
What Manuce returns, and what it does not do
You upload messages.xlf, or a copy named messages.de.xlf, in XLIFF 1.2 or 2.0. Manuce fills in the German targets and keeps the interpolation placeholders. The file you get back is the same file: indentation, unit order, quotes, comments, line endings, encoding and BOM are all preserved. Only the values change, so the diff in your repository stays readable.
Every translated value is checked against its source for matching variables and tags. If a mismatch persists, such as a missing <x id="INTERPOLATION_1"/>, the source value is kept and the report says so.
Some content is never translated: IDs, empty values, URLs, email addresses, numbers, colours, date formats and anything marked as non-translatable. The quote covers the words in the values only; tags and IDs are excluded.
You receive the XLIFF file ready to drop back into the project, usually under src/locale/. It comes with a report listing the strings translated, the strings left as they were, and the reason for each.
Manuce does not edit your templates or angular.json, does not build the app and does not check the rendered layout. Text hard-coded in a component without i18n or $localize is not in the file, so it will not be translated. For terms and conditions (AGB) aimed at German customers, plan a legal review. Manuce does not provide sworn or certified translation.
Preparing the file and checking the German build
- Give ambiguous labels some context with a meaning and a description:
i18n="button|Saves the profile@@saveProfile". "Register" can mean "Registrieren" (sign up) or "Verzeichnis" (a list), and a bare string gives no way to tell. - Check the file header:
target-language="de"on<file>in XLIFF 1.2, ortrgLang="de"on the root element in 2.0. - Declare the
"de"locale in thei18nblock ofangular.json, pointing to the translated file, then runng build --localize. - Go through the densest screens: tab bars, table headers, fixed-width buttons. With
lang="de"on the page, the CSS rulehyphens: autolets the browser break long compounds. - Check the pipes. Under the
delocale,DatePipeshows15.03.2025andCurrencyPipeshows1.234,56 €. These formats come from Angular's locale data, not from the translation, so a date hard-coded inside a string stays as written. - Read the report: every string left in the source language is listed there with its reason.
In practice
- Run ng extract-i18n and copy messages.xlf to messages.de.xlf.
- Upload the file to Manuce: the quote appears straight away, and you can get one paragraph translated free to judge the result.
- Download the German XLIFF file and the string report.
- Put the file back in the project, declare the de locale in angular.json and run ng build --localize.
- Check dense screens, plurals and any strings flagged in the report.
Frequently asked questions
My project uses XLIFF 2.0. Do I need to convert it?
No. Manuce handles messages.xlf in both XLIFF 1.2 and 2.0 and returns it in the same format. Keep whichever format your Angular configuration expects.
Will placeholders like <x id="INTERPOLATION"/> survive German word order?
They are preserved, and each translated value is checked against its source. If a variable or tag is still missing, the source value is kept and the report flags it, so your build does not break.
Will the German use Sie or du?
In business software, Sie is the expected form in German. Check the form of address on the free sample before paying, then check consistency on login screens and error messages, where any mix is most visible.
How are ICU plural expressions handled?
The text inside the braces is translated, while the structure and keywords (plural, =0, one, other) stay in place. German only uses one and other, like English. If your source language is French, pay attention to the zero case.
Which words are counted in the quote?
Only the words in the values to be translated are counted. Unit IDs, tags, URLs and numbers are excluded. The quote appears as soon as you upload the file, based on the exact word count.
The specialist in charge
This subject goes to Dédale, the technical specialist. See how it works.
The same file, into another language
Into German, 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.