Skip to main content

Den kompletta guiden till lokalisering av iOS-appar

Från Localizable.strings till App Store-metadata: lokalisera din iOS-app med Xcode, SwiftUI, Fastlane och automatiserad AI-översättning.

1

Aktivera lokalisering i Xcode

Öppna projektinställningarna i Xcode, gå till Info > Localizations och lägg till språken som du vill stödja. Xcode skapar automatiskt .lproj-kataloger för varje språk.

Xcode Project Settings
// In Xcode:
// 1. Select your project in the navigator
// 2. Go to Info tab > Localizations
// 3. Click + to add languages (e.g., German, Japanese)
// 4. Select which files to localize
//
// Xcode creates .lproj directories automatically:
// en.lproj/Localizable.strings
// de.lproj/Localizable.strings
// ja.lproj/Localizable.strings
Baslokalisering skiljer gränssnittet från dess strängar. När du lägger till ett språk erbjuder Xcode sig att skapa lokaliserade versioner av dina storyboards, XIB-filer och strängfiler.
2

Skapa Localizable.strings

Standardfilen för iOS-lokalisering använder nyckel-värde-par som avgränsas med likhetstecken och varje rad avslutas med semikolon. Placera den i mappen Base.lproj för källspråket.

Base.lproj/Localizable.strings
// Base.lproj/Localizable.strings

"welcome_title" = "Welcome to MyApp";
"login_button" = "Sign In";
"settings_label" = "Settings";
"greeting" = "Hello, %@!";    // %@ = string placeholder
"item_count" = "%d items";     // %d = integer placeholder
Saknade semikolon orsakar tysta fel: filen läses in utan felmeddelande, men översättningarna är tomma. Kontrollera också att filen har lagts till i byggfasen Copy Bundle Resources för ditt mål, annars inkluderas den inte i appaketet.
Common .strings Mistakes
// ❌ Common mistakes in .strings files:

// Missing semicolon — file loads but translations are empty
"welcome_title" = "Welcome"

// Unescaped quotes — causes parse error
"message" = "Click "here" to continue";

// ✅ Correct versions:
"welcome_title" = "Welcome";
"message" = "Click \"here\" to continue";
3

Migrera till String Catalogs (Xcode 15+)

String Catalogs (.xcstrings) är Apples moderna ersättning för .strings-filer. De erbjuder en visuell redigerare i Xcode, automatisk extrahering av strängar från dina SwiftUI-vyer och inbyggt stöd för pluralformer.

Localizable.xcstrings
// Xcode 15+ String Catalog (Localizable.xcstrings)
// Xcode automatically extracts strings from your code
// and manages translations in a visual editor.

// In SwiftUI, strings are automatically localizable:
Text("Welcome to MyApp")
Text("Hello, \(userName)!")

// Mark strings explicitly:
let title = String(localized: "welcome_title")
String Catalogs lagrar ALLA språk i en enda JSON-fil med ändelsen .xcstrings. I team leder det till återkommande Git-sammanslagningskonflikter när flera personer lägger till strängar. Överväg en katalog per modul för stora projekt.
4

Använd lokaliserade strängar i SwiftUI och UIKit

SwiftUI-vyn Text lokaliserar automatiskt strängliteraler. UIKit använder NSLocalizedString. För iOS 16+ ger det moderna API:et String(localized:comment:) en tydligare syntax med inbyggt kompilatorstöd.

ContentView.swift
import SwiftUI

struct ContentView: View {
    let userName: String

    var body: some View {
        VStack {
            // ✅ SwiftUI auto-localizes string literals
            Text("welcome_title")

            // ⚠️ This does NOT localize (String interpolation)
            // Text("Hello, \(userName)")

            // ✅ Use String(localized:) for dynamic strings
            Text(String(localized: "greeting \(userName)"))

            // ✅ UIKit style (works everywhere)
            let title = NSLocalizedString(
                "settings_label",
                comment: "Settings screen title"
            )

            // ✅ Modern API (iOS 16+)
            let modern = String(
                localized: "welcome_title",
                comment: "Main screen title"
            )
        }
    }
}
Text("Hello \(name)") misslyckas utan felmeddelande med lokaliseringen när name är en vanlig String-variabel. SwiftUI:s stränginterpolering skapar en LocalizedStringKey, men endast vissa typer (Int, Double och så vidare) interpoleras korrekt. För String-variabler använder du först String(localized:) för att skapa den lokaliserade strängen.
5

Hantera pluralformer

iOS använder .stringsdict-filer för pluralregler med stöd för alla CLDR-kategorier: zero, one, two, few, many, other. String Catalogs hanterar pluralformer med en visuell redigerare i Xcode, vilket är betydligt enklare än att skriva stringsdict-XML för hand.

Localizable.stringsdict
<!-- Localizable.stringsdict -->
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
    <key>items_count</key>
    <dict>
        <key>NSStringLocalizedFormatKey</key>
        <string>%#@count@</string>
        <key>count</key>
        <dict>
            <key>NSStringFormatSpecTypeKey</key>
            <string>NSStringPluralRuleType</string>
            <key>NSStringFormatValueTypeKey</key>
            <string>d</string>
            <key>zero</key>
            <string>No items</string>
            <key>one</key>
            <string>%d item</string>
            <key>other</key>
            <string>%d items</string>
        </dict>
    </dict>
</dict>
</plist>

// Usage in Swift:
String(format: NSLocalizedString("items_count", comment: ""),
       itemCount)
Språk som arabiska har 6 pluralformer, ryska har 3 och japanska har 1. Definiera alltid alla CLDR-kategorier som dina målspråk behöver. String Catalogs förenklar detta med sin visuella pluralredigerare.
6

Lokalisera App Store-metadata med Fastlane

Använd verktyget deliver i Fastlane för att lagra App Store-metadata – appnamn, undertitel, beskrivning, sökord och versionsinformation – som versionshanterade textfiler i ditt repository, organiserade efter språkvariant.

Terminal
# Install Fastlane
$ gem install fastlane

# Initialize deliver for App Store metadata
$ fastlane deliver init

# Directory structure created:
# fastlane/metadata/
# ├── en-US/
# │   ├── name.txt            # App name (30 chars)
# │   ├── subtitle.txt        # Subtitle (30 chars)
# │   ├── description.txt     # Full description
# │   ├── keywords.txt        # Search keywords (100 chars)
# │   ├── release_notes.txt   # What's New
# │   └── promotional_text.txt
# ├── de-DE/
# │   └── ...
# └── ja/
#     └── ...

# Push metadata to App Store Connect:
$ fastlane deliver
Korslokalisering: App Store i USA indexerar sökord på både engelska och spanska. Genom att lokalisera dina metadata till spanska fångar du upp sökningar från spansktalande användare i USA utan att inrikta dig på en separat marknad.
7

Testa lokaliseringen

Testa lokaliserat innehåll utan att ändra enhetens språk. Använd åsidosättningar i Xcode-scheman för att köra appen på valfritt språk, SwiftUI-förhandsvisningar med språkmiljö och XCUITest med startargument för automatiserade tester.

Testing Localization
// 1. Xcode Scheme Override:
// Edit Scheme > Run > Options > App Language > Choose language

// 2. SwiftUI Preview with locale:
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
            .environment(\.locale, Locale(identifier: "de"))

        ContentView()
            .environment(\.locale, Locale(identifier: "ja"))

        ContentView()
            .environment(\.locale, Locale(identifier: "ar"))
    }
}

// 3. XCUITest with language override:
let app = XCUIApplication()
app.launchArguments += ["-AppleLanguages", "(de)"]
app.launchArguments += ["-AppleLocale", "de_DE"]
app.launch()
Testa med tyska (strängar blir cirka 30 % längre än på engelska) och japanska (strängar blir cirka 50 % kortare) för att tidigt upptäcka layoutproblem. Använd Xcode:s pseudolokalisering för att stresstesta layouter utan riktiga översättningar.

Automatisera översättningskvaliteten

Upptäck saknade nycklar, trasiga platshållare och problem med pluralformer före lansering med i18n-validate. Testa gränssnittet med pseudoöversättningar via i18n-pseudo innan de riktiga översättningarna är klara.
8

Automatisera översättningar

Översätt dina .strings-, .xcstrings- och Fastlane-metadatafiler med AI. Automatisera översättningen av både strängar i appen och App Store-metadata för en helt lokaliserad närvaro.

Terminal
# Translate .strings files
> Translate Base.lproj/Localizable.strings
  to Japanese, German, and Spanish

# Translate App Store metadata too
> Translate fastlane/metadata/en-US/
  to de-DE, ja, es-MX

✓ 6 files translated in 3.2s
En lokaliserad App Store-närvaro kan öka antalet nedladdningar med över 30 % på marknader där engelska inte är huvudspråk. Översätt dina metadata tillsammans med appsträngarna – det är lokaliseringen som ofta ger bäst avkastning.
+

Bonus: smart reservspråk med LocaleChain

Som standard går iOS över till ditt utvecklingsspråk när användarens exakta språkvariant inte är tillgänglig. En användare med pt-BR ser engelska i stället för portugisiska om endast översättningar för pt-PT finns. LocaleChain löser detta med konfigurerbara reservkedjor.

LocaleChain är ett Swift-paket med öppen källkod. Visa på GitHub

Package Dependencies
// Swift Package Manager
// File > Add Package Dependencies >
// https://github.com/i18n-agent/ios-localechain.git
MyApp.swift
import LocaleChain

// In your App init or AppDelegate:
LocaleChain.configure()  // Activates all default chains

// pt-BR user with only pt-PT translations?
// → Shows Portuguese instead of falling back to English

// Custom overrides for your specific locales:
LocaleChain.configure(
    overrides: ["es-MX": ["es-419", "es"]]
)

Vanliga fallgropar

Syntaxfel i .strings-filer

Saknade semikolon, citattecken som inte har undantagits eller felaktig kodning orsakar tysta fel. Filen läses in, men översättningarna visas som tomma. Validera alltid .strings-filer innan du gör en commit.

SwiftUI-textinterpolering lokaliseras inte

Text("Hello \(stringVar)") lokaliseras inte som förväntat. Använd String(localized:) för beräknade strängar eller kontrollera att interpolerade variabler har rätt typ för LocalizedStringKey.StringInterpolation.

Widgetar och tillägg visar råa nycklar

Apptillägg har separata paket. Kontrollera att dina .strings- eller .xcstrings-filer har lagts till i byggfasen Copy Bundle Resources för tilläggsmålet, inte bara för appens huvudmål.

Saknade översättningar visar nycklar i produktion

När en nyckel saknar översättning till användarens språk visar iOS själva nyckeln. Använd en strategi för reservspråk och testa alla språkvarianter som stöds före lansering.

Rekommenderad filstruktur

Project Structure
MyApp/
├── MyApp.xcodeproj
├── MyApp/
│   ├── Base.lproj/
│   │   ├── Localizable.strings       # Source strings
│   │   └── Localizable.stringsdict   # Plural rules
│   ├── en.lproj/
│   │   └── Localizable.strings
│   ├── de.lproj/
│   │   └── Localizable.strings
│   ├── ja.lproj/
│   │   └── Localizable.strings
│   ├── Localizable.xcstrings          # OR String Catalog
│   └── Info.plist
├── MyAppTests/
├── fastlane/
│   ├── Fastfile
│   └── metadata/
│       ├── en-US/
│       │   ├── name.txt
│       │   ├── description.txt
│       │   └── keywords.txt
│       ├── de-DE/
│       └── ja/
└── Package.swift

Prova i18n Agent nu

Släpp din översättningsfil här

JSON, YAML, PO, XML, CSV, Markdown, Properties

eller klicka för att välja en fil

Målspråk

Ingen registrering krävsPrisuppskattning direkt

Reservspråk med ios-localechain

När en översättningsnyckel saknas i en regional språkvariant som de-AT går iOS direkt över till utvecklingsspråket i stället för att först kontrollera det överordnade språket de.

Terminal
// Swift Package Manager
// https://github.com/i18n-agent/ios-localechain
Configuration
import LocaleChain

LocaleChain.configure(overrides: [
    "de": ["en-GB", "en"],
    "pt-BR": ["pt", "en"],
    "zh-Hant-HK": ["zh-Hant", "zh", "en"],
])

Se vår guide till reservspråk för en fullständig lista över ramverk som stöds och 75 inbyggda kedjor. Learn more →

Vanliga frågor om iOS-lokalisering