Introduction

Taking your app global is one of the most impactful growth strategies available to mobile developers. With over 5 billion smartphone users worldwide, limiting your app to a single language means missing out on the vast majority of potential users.

Localization goes far beyond simple translation. It encompasses adapting your entire user experience for different cultures, regions, and languages. Done well, localized apps see significantly higher download rates, better reviews, and stronger engagement in target markets.

This guide covers the complete localization process for iOS and Android apps, from initial planning through to ongoing maintenance.

Why Localize Your App

Why Localize Your App Infographic

Market Opportunity

The numbers make a compelling case:

  • China: 900+ million smartphone users
  • India: 500+ million smartphone users
  • Indonesia: 170+ million smartphone users
  • Brazil: 100+ million smartphone users

English speakers represent only about 25% of global internet users. Apps available in multiple languages consistently outperform English-only alternatives in international markets.

User Expectations

Research from Common Sense Advisory shows that 75% of consumers prefer to buy products in their native language. For apps, this translates directly to:

  • Higher conversion rates in app stores
  • Better user ratings and reviews
  • Increased engagement and retention
  • Lower customer support burden

Competitive Advantage

Many developers treat localization as an afterthought. By prioritizing it early, you can establish market presence before competitors arrive. First-mover advantage in emerging markets can be significant.

Planning Your Localization Strategy

Market Selection

Not all markets are equal. Consider these factors when prioritizing:

Market Size and Growth

  • Current smartphone penetration
  • Projected growth rates
  • App category popularity

Competition Analysis

  • Existing localized competitors
  • Quality of their localization
  • Market saturation

Technical Requirements

  • Right-to-left (RTL) language support
  • Character set complexity
  • Local regulations

Business Considerations

  • Payment infrastructure
  • Local partnerships needed
  • Support requirements

For Australian app developers, consider this prioritization:

Tier 1 (High value, lower complexity)

  • United States (English, minimal changes)
  • United Kingdom (English with minor adjustments)
  • Germany (large market, Latin script)
  • France (large market, Latin script)

Tier 2 (High value, moderate complexity)

  • Japan (large market, requires native speakers)
  • South Korea (tech-savvy users)
  • Brazil (Portuguese, growing market)
  • Spain/Mexico (Spanish, large combined market)

Tier 3 (High potential, higher complexity)

  • China (requires specific considerations)
  • Arabic-speaking countries (RTL support)
  • India (multiple languages, diverse market)

iOS Localization Im

plementation

Project Setup

Enable localization in your Xcode project:

  1. Select your project in the navigator
  2. Go to the Info tab
  3. Under Localizations, click the + button
  4. Add your target languages

Xcode creates .lproj folders for each language containing localized resources.

String Localization

Creating Localizable.strings

Your base localization file uses key-value pairs:

/* Welcome screen greeting */
"welcome_title" = "Welcome to AppName";

/* Button to continue to main app */
"continue_button" = "Continue";

/* Error message for network failure */
"network_error" = "Unable to connect. Please check your internet connection.";

Using NSLocalizedString

In Swift, reference localized strings:

let title = NSLocalizedString("welcome_title", comment: "Welcome screen greeting")

For SwiftUI:

Text("welcome_title")

SwiftUI automatically looks up the key in Localizable.strings.

Handling Plurals

English pluralization (1 item, 2 items) does not work for all languages. Russian has three plural forms, Arabic has six.

Use stringsdict files for plural handling:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>items_count</key>
    <dict>
        <key>NSStringLocalizedFormatKey</key>
        <string>%#@items@</string>
        <key>items</key>
        <dict>
            <key>NSStringFormatSpecTypeKey</key>
            <string>NSStringPluralRuleType</string>
            <key>NSStringFormatValueTypeKey</key>
            <string>d</string>
            <key>one</key>
            <string>%d item</string>
            <key>other</key>
            <string>%d items</string>
        </dict>
    </dict>
</dict>
</plist>

Asset Localization

Images containing text need localized versions. In your asset catalog:

  1. Select the image
  2. In the Attributes inspector, check “Localize”
  3. Provide localized versions for each language

Storyboard and XIB Localization

For Interface Builder files:

  1. Select the file in the navigator
  2. Open the File inspector
  3. Click “Localize…”
  4. Choose localization method (strings file or separate storyboards)

The strings file approach exports translatable text while maintaining a single storyboard.

Android Localization Implementation

Resource Structure

Android uses resource folders with language qualifiers:

res/
  values/
    strings.xml (default/English)
  values-de/
    strings.xml (German)
  values-ja/
    strings.xml (Japanese)
  values-zh-rCN/
    strings.xml (Simplified Chinese)

String Resources

Define strings in XML:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="welcome_title">Welcome to AppName</string>
    <string name="continue_button">Continue</string>
    <string name="network_error">Unable to connect. Please check your internet connection.</string>
</resources>

Reference in code:

val title = getString(R.string.welcome_title)

In layouts:

<TextView
    android:text="@string/welcome_title"
    ... />

Quantity Strings (Plurals)

Android handles plurals with quantity strings:

<plurals name="items_count">
    <item quantity="one">%d item</item>
    <item quantity="other">%d items</item>
</plurals>

Usage:

val count = 5
val message = resources.getQuantityString(R.plurals.items_count, count, count)

Layout Considerations

Text in different languages varies significantly in length. German text is typically 30% longer than English. Plan for this:

Use Flexible Layouts

  • Prefer wrap_content over fixed widths
  • Use ConstraintLayout for complex screens
  • Test with pseudolocalization

Enable Pseudolocalization

In your build.gradle:

android {
    buildTypes {
        debug {
            pseudoLocalesEnabled true
        }
    }
}

This adds fake locales that stretch text and add accents, revealing layout issues.

Drawable and Asset Localization

Create qualified resource folders:

res/
  drawable/
    hero_image.png (default)
  drawable-de/
    hero_image.png (German version)

Right-to-Left (RTL) Language Support

Arabic, Hebrew, Persian, and Urdu require RTL layouts. Both platforms now provide excellent RTL support.

iOS RTL Support

UIKit automatically flips layouts for RTL languages. Ensure you:

  • Use leading/trailing constraints instead of left/right
  • Use semanticContentAttribute when needed
  • Test with RTL languages in simulator
// Force RTL for testing
UIView.appearance().semanticContentAttribute = .forceRightToLeft

Android RTL Support

Enable RTL support in your manifest:

<application
    android:supportsRtl="true"
    ... >

Use start/end instead of left/right in layouts:

<TextView
    android:layout_marginStart="16dp"
    android:layout_marginEnd="16dp"
    ... />

Common RTL Issues

Watch for these problems:

  • Icons with direction: Arrows, progress indicators need mirroring
  • Phone numbers: Should remain LTR
  • Mixed content: English within Arabic text
  • Custom views: May need manual RTL handling

Translation Workflow

Extracting Strings

Maintain a single source of truth for translatable content. Tools to help:

iOS

  • genstrings command-line tool
  • Xcode’s Export for Localization feature
  • Third-party tools like Lokalise or Phrase

Android

  • Android Studio’s Translations Editor
  • Lint warnings for missing translations
  • Export to XLIFF format

Working with Translators

Provide Context

Translators need more than just strings:

  • Screenshots showing where text appears
  • Character limits for UI elements
  • Explanation of features and terminology
  • Style guide for tone and voice

Use Translation Management Systems

Platforms like Lokalise, Phrase, or Crowdin offer:

  • Collaborative translation workflows
  • Translation memory (reuse previous translations)
  • Integration with development tools
  • Quality assurance checks

Quality Assurance

Before release, verify translations:

In-Context Review

  • Run the app in each language
  • Check text fits in UI elements
  • Verify nothing is truncated

Native Speaker Review

  • Have native speakers test the app
  • Check for awkward phrasing
  • Verify cultural appropriateness

Automated Checks

  • Missing translations
  • Placeholder mismatches
  • Character encoding issues

Cultural Adaptation

Localization extends beyond language to cultural considerations.

Date and Time Formats

Never hardcode date formats. Use platform APIs:

iOS

let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .short
let dateString = formatter.string(from: date)

Android

val formatter = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT)
val dateString = formatter.format(date)

Number and Currency Formatting

Same principle applies to numbers:

iOS

let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.currencyCode = "EUR"
let priceString = formatter.string(from: NSNumber(value: 29.99))

Android

val formatter = NumberFormat.getCurrencyInstance()
formatter.currency = Currency.getInstance("EUR")
val priceString = formatter.format(29.99)

Images and Icons

Consider cultural implications of imagery:

  • Hand gestures have different meanings globally
  • Colors carry cultural significance
  • Religious or political symbols
  • Local customs and dress

Units of Measurement

Support both metric and imperial where relevant. Most of the world uses metric, but US users expect imperial for certain measurements.

App Store Localization

Your app store listing needs localization too.

Localizable Elements

  • App name (can vary by market)
  • Subtitle (iOS) / Short description (Android)
  • Description
  • Keywords (iOS)
  • Screenshots
  • Preview videos

Screenshot Localization

Create localized screenshots showing:

  • Translated UI
  • Local content examples
  • Culturally relevant imagery

Tools like Fastlane’s snapshot can automate screenshot generation across languages.

Keyword Research

Keywords vary by language and market. Research local search terms:

  • Use App Store Connect’s suggested keywords
  • Analyze competitor keywords
  • Consider local terminology differences

Testing Localized Apps

Device Configuration

Test on devices set to target locales:

iOS Settings > General > Language & Region

Android Settings > System > Languages & input

Simulator/Emulator Testing

Change locale without changing device language:

iOS Simulator Product > Scheme > Edit Scheme > Run > Options > Application Language

Android Emulator Use ADB:

adb shell "setprop persist.sys.locale ja-JP; stop; start"

Checklist for Each Language

  • All visible text is translated
  • No text truncation or overflow
  • Dates, times, numbers format correctly
  • Images and icons are appropriate
  • Links point to localized content
  • RTL layout correct (if applicable)
  • Audio/video content localized (if applicable)

Maintaining Localized Apps

Update Workflow

When adding new features:

  1. Add strings to base language file
  2. Export for translation
  3. Integrate translations
  4. Test in all languages
  5. Release

Handling String Changes

When modifying existing strings:

  • Keep the same key if meaning is unchanged
  • Create new key for changed meaning
  • Mark deprecated keys for removal
  • Communicate changes to translators

Community Translations

For resource-constrained projects, consider:

  • Community translation programs
  • Crowdsourced platforms
  • User-contributed translations

Maintain quality through review processes.

Common Pitfalls to Avoid

String Concatenation

Never build sentences by concatenating strings:

// Wrong - word order varies by language
let message = greeting + " " + username + "!"

// Right - use format strings
let message = String(format: NSLocalizedString("greeting_format", comment: ""), username)

Where greeting_format is “Hello, %@!” in English but can be reordered for other languages.

Hardcoded Strings

Search your codebase for hardcoded strings:

# Find potential hardcoded strings in Swift
grep -r "\"[A-Z]" --include="*.swift" .

Assuming Text Length

German and Finnish text can be 30-40% longer than English. Design UI with flexibility.

Ignoring Locale-Specific Logic

Some logic depends on locale:

  • Name formatting (Western vs Eastern order)
  • Address formats
  • Phone number validation
  • Legal requirements

Conclusion

Localization is an investment that pays dividends through expanded market reach and improved user satisfaction. The technical implementation, while requiring careful attention to detail, is well-supported by both iOS and Android platforms.

Start with your highest-priority markets, establish a sustainable translation workflow, and expand gradually. The effort you put into localization directly impacts your app’s global success potential.

For Australian app developers looking to grow beyond the domestic market, localization opens doors to billions of potential users. Begin planning your localization strategy early in development to minimize retrofitting costs and maximize international opportunity.


Need help localizing your mobile app for international markets? The Awesome Apps team specializes in building apps that work beautifully across languages and cultures. Get in touch to discuss your global expansion plans.