Frankfurt studio for multilingual digital presence +49 69 95209894 [email protected] Mon–Fri 9 AM–5 PM Client Area →
EnglishEN

Practical Guide

Guide to App and Software Localization (i18n)

Localizing apps and software requires a well-thought-out separation of code and text. This guide covers technical aspects such as placeholders, plural rules, text lengths, string keys, context for translators, and RTL support. It helps developers create international applications efficiently and consistently, without touching legal or financial topics.

i18n
Abbreviation for internationalization
RTL
Right-to-left Support
ICU
International Components for Unicode
Diagram showing separation of code and language resources

1. Separation of Code and Texts

The fundamental prerequisite for any localization is the strict separation of program code and textual content. All displayed texts should be stored in external resource files (e.g., Properties, JSON, YAML), not hardcoded in the source code. This allows translators to work without modifying the code. Use unique string keys in the code that reference the respective translations. This separation also simplifies maintenance and enables adding new languages later without code changes. Ensure that UI labels, error messages, and tooltips are also placed in these files.

2. Placeholders and Variables

Texts often contain dynamic content such as numbers, names, or dates. These must be inserted via placeholders, e.g., using printf formatting (%s, %d) or more modern approaches like curly braces {0}. It is important that translators know the order and meaning of the placeholders. Use named placeholders (e.g., "{username}") to provide context. In languages with different sentence structures, the order of placeholders may vary. Therefore, offer the ability to adjust the order in the translation. Test all variants to avoid erroneous or incomplete output.

Example of placeholders in translatable strings

3. Plural Rules and Pluralization

In German, there are only singular and plural, but many languages have more complex plural rules (e.g., Arabic with six categories). Use libraries like ICU MessageFormat that handle plural rules language-specifically. Define separate keys in your resources for the different plural forms (one, other). The code then automatically selects the appropriate form based on the number. Example: “{count} {count, plural, one {Apfel} other {Äpfel}}”. Test each language with multiple numeric values to ensure the correct plural form is displayed. Avoid hard-coded if queries – they are error-prone.

4. Text Length and Layout Buffer

Translations are often longer or shorter than the original text. Especially for buttons, menus, and labels, this can break the layout. Therefore, plan sufficient space for text expansion – a good guideline is 30% additional space for Western languages, more for Asian ones. Use dynamic layouts that adapt to text length (e.g., Auto Layout in iOS or Flexbox in the web). Avoid fixed widths. Allow UI elements to handle text wrapping if necessary. Test the interface with the longest expected translations to avoid overlaps or truncations.

5. String Keys, Context for Translators, and RTL

Unique string keys are the backbone of localization. Use descriptive names (e.g., 'login.button.title') and document their purpose. Provide translators with context: screenshots, maximum character length, constraints (e.g., 'no longer than 20 characters'). For RTL languages like Arabic or Hebrew, the UI must be mirrored. Use layout attributes that automatically support RTL (e.g., start/end instead of left/right). Test the entire navigation under RTL conditions. Also consider icons and graphics – they may be interpreted differently depending on culture.

Market Entry Checklist

  • Use external resource files for texts
  • Placeholders with named variables and adjustable order
  • Implement plural rules with ICU MessageFormat
  • Layout at least 30% buffer for text expansions
  • Descriptive string keys with context documentation
  • RTL support via layout attributes such as start/end
Layout grid with varying text lengths and buffers

Frequently Asked Questions

Why is separating code and text important?

It enables translations without code changes, simplifies maintenance, and allows adding new languages without recompiling the software.

How do I handle plural forms in different languages?

Use libraries like ICU MessageFormat that select the correct plural form for each language. Define keys in resources for each plural category (e.g., one, other).

What special considerations apply to RTL languages?

The UI must be mirrored: Use logical layout attributes (start/end) instead of absolute directions. Test navigation and text indentation under RTL conditions.

Ready for This Market?

We localize your website linguistically, technically, and culturally – with native-speaker review and a fixed price. Request a non-binding quote.

Request a non-binding quote

German GmbHLocal Court Frankfurt am Main · HRB 111727
D-U-N-S® registered315030052
GDPR-compliant processingHosting in Germany
Fixed prices with written delivery guarantee