Skip to main content

Den komplette guiden til lokalisering av iOS-apper

Fra Localizable.strings til App Store-metadata: lokaliser iOS-appen din med Xcode, SwiftUI, Fastlane og automatisert AI-oversettelse.

1

Aktiver lokalisering i Xcode

Åpne prosjektinnstillingene i Xcode, gå til Info > Localizations, og legg til språkene du vil støtte. Xcode oppretter automatisk .lproj-kataloger for hvert 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
Base-lokalisering skiller brukergrensesnittet ditt fra de tilhørende strengene. Når du legger til et språk, tilbyr Xcode å opprette lokaliserte versjoner av storyboardene, XIB-ene og strengfilene dine.
2

Opprett Localizable.strings

Standardfilen for iOS-lokalisering bruker nøkkel-verdi-par adskilt med likhetstegn, der hver linje avsluttes med semikolon. Plasser den i Base.lproj-mappen din for kildesprå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
Manglende semikolon forårsaker stille feil — filen lastes uten feilmelding, men oversettelsene er tomme. Sørg også for at filen er lagt til i targetets Copy Bundle Resources-byggefase, ellers blir den ikke inkludert i appbunten.
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

Migrer til String Catalogs (Xcode 15+)

String Catalogs (.xcstrings) er Apples moderne erstatning for .strings-filer. De tilbyr en visuell editor i Xcode, automatisk uttrekk av strenger fra SwiftUI-visningene dine, og innebygd støtte for flertallsformer.

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 lagrer ALLE språk i én enkelt .xcstrings JSON-fil. I team betyr dette hyppige Git-mergekonflikter når flere personer legger til strenger. Vurder én katalog per modul for store prosjekter.
4

Bruk lokaliserte strenger i SwiftUI og UIKit

SwiftUIs Text-visning lokaliserer strengliteraler automatisk. UIKit bruker NSLocalizedString. For iOS 16+ gir den moderne String(localized:comment:)-API-en en renere syntaks med innebygd kompilatorstøtte.

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)") lokaliseres ikke, uten feilmelding, når name er en vanlig String-variabel. SwiftUIs strenginterpolasjon oppretter en LocalizedStringKey, men bare spesifikke typer (Int, Double osv.) interpoleres korrekt. For String-variabler bruker du String(localized:) for å bygge den lokaliserte strengen først.
5

Håndter flertallsformer

iOS bruker .stringsdict-filer for flertallsregler og støtter alle CLDR-kategorier for flertallsformer: zero, one, two, few, many, other. String Catalogs håndterer flertallsformer med en visuell editor i Xcode — mye enklere enn å skrive stringsdict-XML for hånd.

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 arabisk har 6 flertallsformer, russisk har 3, og japansk har 1. Definer alltid alle CLDR-kategoriene målspråkene dine trenger. String Catalogs gjør dette enklere med sin visuelle editor for flertallsformer.
6

Lokaliser App Store-metadata med Fastlane

Bruk Fastlanes deliver-verktøy for å holde App Store-metadata — appnavn, undertittel, beskrivelse, søkeord, versjonsnotater — versjonskontrollert i repositoriet ditt som rene tekstfiler organisert etter språk.

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
Kryss-lokalisering: den amerikanske App Store indekserer både engelske og spanske søkeord. Ved å lokalisere metadataene dine til spansk fanger du opp søk fra spansktalende amerikanske brukere uten å målrette mot et eget marked.
7

Test lokaliseringen din

Test lokalisert innhold uten å endre språket på enheten din. Bruk Xcode scheme-overstyringer for å kjøre appen på et hvilket som helst språk, SwiftUI-forhåndsvisninger med locale-miljø, og XCUITest med oppstartsargumenter for automatisert testing.

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()
Test med tysk (strenger utvides ~30 % sammenlignet med engelsk) og japansk (strenger krymper ~50 %) for å fange opp layoutproblemer tidlig. Bruk Xcodes pseudolokalisering for å stresteste layouter uten ekte oversettelser.

Automatiser oversettelseskvalitet

Fang opp manglende nøkler, ødelagte plassholdere og problemer med flertallsformer før de sendes med i18n-validate. Test brukergrensesnittet ditt med pseudo-oversettelser ved hjelp av i18n-pseudo før de ekte oversettelsene kommer.
8

Automatiser oversettelser

Oversett .strings-, .xcstrings- og Fastlane-metadatafilene dine ved hjelp av AI. Automatiser oversettelse av både strenger i appen og App Store-metadata for en fullstendig lokalisert tilstedeværelse.

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 lokalisert App Store-tilstedeværelse øker nedlastinger med 30 %+ i ikke-engelskspråklige markeder. Oversett metadataene dine sammen med appstrengene — det er lokaliseringen med høyest avkastning du kan gjøre.
+

Bonus: smart reservekjede for språk med LocaleChain

Som standard faller iOS tilbake til utviklingsspråket ditt når brukerens eksakte språk ikke er tilgjengelig. En pt-BR-bruker med kun pt-PT-oversettelser ser engelsk i stedet for portugisisk. LocaleChain løser dette med konfigurerbare reservekjeder.

LocaleChain er en åpen kildekode Swift-pakke. Se 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"]]
)

Vanlige fallgruver

Syntaksfeil i .strings-filer

Manglende semikolon, uunnslupne anførselstegn eller feil koding forårsaker stille feil. Filen lastes, men oversettelsene fremstår som tomme. Valider alltid .strings-filer før du sjekker dem inn.

SwiftUI-tekstinterpolasjon lokaliseres ikke

Text("Hello \(stringVar)") lokaliseres ikke som forventet. Bruk String(localized:) for beregnede strenger, eller sørg for at interpolerte variabler har riktig type for LocalizedStringKey.StringInterpolation.

Widgeter/utvidelser viser rå nøkler

App-utvidelser har separate bunter. Sørg for at .strings- eller .xcstrings-filene dine er lagt til i Copy Bundle Resources-fasen til utvidelsens target, ikke bare hovedappens target.

Manglende oversettelser viser nøkler i produksjon

Når en nøkkel ikke har noen oversettelse for brukerens språk, viser iOS selve nøkkelen. Bruk en strategi for reservespråk og test alle støttede språk før utgivelse.

Anbefalt 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

Prøv i18n Agent nå

Slipp oversettelsesfilen din her

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

eller klikk for å bla gjennom

Målspråk

Ingen registrering krevesUmiddelbart estimat

Reservekjede for språk med ios-localechain

Når en oversettelsesnøkkel mangler i et regionalt språk som de-AT, hopper iOS rett til utviklingsspråket i stedet for å sjekke foreldrespråket de først.

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 for reservekjeder for språk for den fullstendige listen over støttede rammeverk og 75 innebygde kjeder. Learn more →

Ofte stilte spørsmål om iOS-lokalisering