Translate an Android app into German
Upload your res/values/strings.xml and Manuce translates its string, string-array and plurals elements into German, returning the same file ready to drop into res/values-de/. Every placeholder such as %1$s is checked against the source, and a report lists anything left untranslated. What remains for you is the layout check, because German takes up considerably more room.
What it costs
For the language files of a Android app totalling about 2,000 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 German does to an Android interface
The first thing you notice is length. German text often runs 20 to 35% longer than English, and it builds compound words that cannot wrap at a space: "Subscription management" becomes Abonnementverwaltung, "Push notifications" becomes Push-Benachrichtigungen. A short label can double in width.
The parts of an Android app that suffer most:
- tabs and bottom navigation, where each label gets a fixed slice of width;
- toolbar titles, which truncate as soon as an action icon is added;
- buttons with fixed dp widths, where Einstellungen speichern ("Save settings") no longer fits on one line;
- notifications and widgets, where space is tight to begin with.
Writing conventions change too. Every noun is capitalised (Konto löschen, "Delete account"), but English-style title case is not used: a menu item reads Neues Projekt erstellen, not every word capitalised. German quotation marks are written „like this“. If your source is French, note that German puts no space before "?", "!" or ":": Passwort vergessen?.
Then there is register. Professional software addresses the user formally with Sie (Möchten Sie fortfahren?); many consumer apps prefer the informal du (Möchtest du fortfahren?). Whichever you choose must hold across every button and error message.
Plurals, placeholders and word order
German has two CLDR plural categories, one and other, like English, and zero also takes the plural: 0 Nachrichten. A correct block looks like this:
<item quantity="one">%d Nachricht</item><item quantity="other">%d Nachrichten</item>
If your source language treats zero as singular (French does), make sure your code calls getQuantityString() rather than picking a string with if (n == 1); only then will the German rule apply.
Word order is the bigger trap. In perfect tenses and subordinate clauses the German verb moves to the end: "%1$s invited %2$s" becomes %1$s hat %2$s eingeladen, and "%1$s was deleted" becomes %1$s wurde gelöscht. With positional placeholders (%1$s, %2$d) the translation can move them freely. With bare %s the order is fixed and the German sentence ends up awkward.
Two habits to remove before translation:
- concatenation in code, such as
getString(R.string.deleted) + " " + name: German cannot reorder two separate strings; - reusing one adjective for several nouns: "New" is neuer, neue or neues depending on the gender of the German noun. Give each context its own string.
What Manuce returns, and what it does not do
Manuce works on res/values/strings.xml:
string,string-arrayandpluralselements are translated, and the plural quantities German requires are written;- strings marked
translatable="false"are respected; - apostrophes and special characters are escaped the Android way, for example
geht\'s; - keys, empty values, URLs, email addresses, numbers, colours, date formats and identifiers are not translated;
- each translated value is compared with the source, placeholders and tags included; if a mismatch persists, the source value is kept and the report says so.
The file you get back is the same file: indentation, key order, quotes, comments, line endings, encoding and BOM are preserved, and only the values change. A report comes with it, listing strings translated and strings left as they were, with the reason. Pricing counts the words in the values only, keys and tags excluded; German is charged at the base rate (×1).
What Manuce does not do:
- it does not touch your layouts: a button too narrow for Abonnementverwaltung is yours to widen;
- it does not format numbers: German writes 1.234,56, but that is your code's job, for instance with
NumberFormatand the device locale; - your Google Play listing is not part of
strings.xml, so it is not covered here; - it does not produce sworn or certified translations.
Preparing the file and testing the German build
Before uploading:
- mark
translatable="false"on anything that must not change: a brand name inapp_name, deep-link schemes, technical keys; - number your placeholders (
%1$srather than%s) wherever a string has more than one; - add context comments above ambiguous strings, for example
<!-- Button, limited width -->: they stay in the file and help your German-speaking reviewer; - run the
en-XApseudo-locale now; it lengthens and accents every string and shows which screens will break in German.
After delivery:
- place the file at
res/values-de/strings.xml, alongside your originalres/values/; - read the report: a string left in the source language usually points to a malformed placeholder in the original;
- switch a small test phone to German and walk through every screen; fix overflow with
wrap_content,maxLinesandellipsize="end", or auto-sizing onTextView; - check register consistency: one Sie dialog among du screens stands out immediately to a German user.
In practice
- Mark strings to keep with translatable="false" and number any multiple placeholders.
- Upload res/values/strings.xml; the quote appears at once and the free extract shows the German register and style.
- Download the translated file and its report, then place it at res/values-de/strings.xml.
- Run the app in German on a small screen and fix any labels that overflow.
Frequently asked questions
Will the German use Sie or du?
Professional software traditionally uses the formal Sie, while many consumer apps opt for du. The free extract lets you see the register before you pay. Once delivered, check that the same form is used throughout the file.
Do I need extra plural forms for German?
No: German uses only one and other, as English does, and zero takes the other form ("0 Nachrichten"). The quantities German requires are written in each plurals block. Your code must use getQuantityString() for the right form to be picked at runtime.
Will my app name be translated?
If app_name carries translatable="false", it is left untouched. Otherwise it is treated like any other value. Mark it before uploading if it is a brand name.
Is my Google Play listing translated too?
No. The store description and release notes do not live in strings.xml, and only the uploaded file is translated. Plan their translation separately.
What happens if a placeholder goes missing?
Every translated value is checked against the source for placeholders and tags. If a mismatch persists, the source value is kept and the report flags it. Your file still builds, and you know exactly which strings to revisit.
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.