Skip to main content

Den komplette vejledning til lokalisering af iOS-apps

Fra Localizable.strings til App Store-metadata: Lokalisér din iOS-app med Xcode, SwiftUI, Fastlane og automatiseret AI-oversættelse.

1

Aktivér lokalisering i Xcode

Åbn indstillingerne for dit Xcode-projekt, gå til Info > Localizations og tilføj de sprog, du vil understøtte. Xcode opretter automatisk .lproj-mapper til hvert sprog.

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 localization adskiller din brugergrænseflade fra dens tekststrenge. Når du tilføjer et sprog, tilbyder Xcode at oprette lokaliserede versioner af dine storyboards, XIB'er og tekststrengsfiler.
2

Opret Localizable.strings

Standardfilen til iOS-lokalisering bruger nøgle-værdi-par, der er adskilt af lighedstegn. Hver linje afsluttes med et semikolon. Placer filen i mappen Base.lproj for kildesproget.

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 semikoloner medfører tavse fejl — filen indlæses uden fejlmeddelelse, men oversættelserne er tomme. Sørg også for, at filen er føjet til buildfasen Copy Bundle Resources for dit target, da den ellers ikke bliver inkluderet i appens bundle.
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

Skift til String Catalogs (Xcode 15+)

String Catalogs (.xcstrings) er Apples moderne erstatning for .strings-filer. De tilbyder en visuel editor i Xcode, automatisk udtrækning af tekststrenge fra dine SwiftUI-views og indbygget understøttelse af flertalsformer.

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 gemmer ALLE sprog i én .xcstrings JSON-fil. I teams medfører det hyppige Git-flettekonflikter, når flere personer tilføjer tekststrenge. Overvej ét katalog pr. modul til store projekter.
4

Brug lokaliserede tekststrenge i SwiftUI og UIKit

SwiftUI's Text-view lokaliserer automatisk tekststrengsliteraler. UIKit bruger NSLocalizedString. På iOS 16+ giver det moderne API String(localized:comment:) en renere syntaks med indbygget compilerunderstøttelse.

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)") kan ikke lokaliseres, hvis name er en almindelig String-variabel, uden at der vises en fejl. SwiftUI's tekststrengsinterpolation opretter en LocalizedStringKey, men kun bestemte typer (Int, Double osv.) interpoleres korrekt. Brug String(localized:) til String-variabler for først at opbygge den lokaliserede tekststreng.
5

Håndter flertalsformer

iOS bruger .stringsdict-filer til flertalsregler og understøtter alle CLDR-flertalskategorier: zero, one, two, few, many, other. String Catalogs håndterer flertalsformer med en visuel editor i Xcode — det er langt enklere end at skrive stringsdict XML manuelt.

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)
Sprog som arabisk har 6 flertalsformer, russisk har 3 og japansk har 1. Definér altid alle de CLDR-kategorier, som dine målsprog kræver. String Catalogs gør det lettere med den visuelle editor til flertalsformer.
6

Lokalisér App Store-metadata med Fastlane

Brug Fastlane-værktøjet deliver til at gemme App Store-metadata — appnavn, undertitel, beskrivelse, nøgleord og udgivelsesnoter — under versionsstyring i dit repository som almindelige tekstfiler organiseret efter sprogversion.

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
Tværlokalisering: Den amerikanske App Store indekserer både engelske og spanske nøgleord. Når du lokaliserer dine metadata til spansk, kan du findes i søgninger fra spansktalende brugere i USA uden at målrette et særskilt marked.
7

Test din lokalisering

Test lokaliseret indhold uden at ændre sproget på din enhed. Brug tilsidesættelser i Xcode-schemes til at køre appen på ethvert sprog, SwiftUI-forhåndsvisninger med et sprogversionsmiljø og XCUITest med startargumenter til automatiseret test.

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 (tekststrenge bliver ca. 30 % længere end på engelsk) og japansk (tekststrenge bliver ca. 50 % kortere) for at finde layoutproblemer tidligt. Brug Xcodes pseudolokalisering til at belastningsteste layouts uden rigtige oversættelser.

Automatisér oversættelseskvaliteten

Find manglende nøgler, ødelagte pladsholdere og problemer med flertalsformer med i18n-validate, før de udgives. Test din brugergrænseflade med pseudooversættelser ved hjælp af i18n-pseudo, før de rigtige oversættelser er klar.
8

Automatisér oversættelser

Oversæt dine .strings-, .xcstrings- og Fastlane-metadatafiler med AI. Automatisér oversættelsen af både tekststrenge i appen og App Store-metadata for at få en fuldt lokaliseret 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 lokaliseret App Store-tilstedeværelse øger antallet af downloads med over 30 % på ikke-engelsksprogede markeder. Oversæt dine metadata sammen med tekststrengene i appen — det giver det største udbytte af din lokaliseringsindsats.
+

Ekstra: Intelligent sprogversionsfallback med LocaleChain

Som standard falder iOS tilbage til dit udviklingssprog, når en brugers præcise sprogversion ikke er tilgængelig. En pt-BR-bruger, hvor der kun findes pt-PT-oversættelser, ser engelsk i stedet for portugisisk. LocaleChain løser dette med konfigurerbare fallbackkæder.

LocaleChain er en open source-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"]]
)

Almindelige faldgruber

Syntaksfejl i .strings-filer

Manglende semikoloner, ikke-escapede anførselstegn eller forkert kodning medfører tavse fejl. Filen indlæses, men oversættelserne vises som tomme. Valider altid .strings-filer, før du committer dem.

SwiftUI-tekstinterpolation lokaliseres ikke

Text("Hello \(stringVar)") lokaliseres ikke som forventet. Brug String(localized:) til beregnede tekststrenge eller sørg for, at interpolerede variabler har den korrekte type til LocalizedStringKey.StringInterpolation.

Widgets/Extensions viser rå nøgler

Appudvidelser har separate bundles. Sørg for, at dine .strings- eller .xcstrings-filer er føjet til fasen Copy Bundle Resources for udvidelsens target og ikke kun til hovedappens target.

Manglende oversættelser viser nøgler i produktion

Når en nøgle ikke har en oversættelse til brugerens sprog, viser iOS selve nøglen. Brug en fallbackstrategi for sprog og test alle understøttede sprogversioner før udgivelsen.

Anbefalet 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 nu

Slip din oversættelsesfil her

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

eller klik for at vælge en fil

Målsprog

Kræver ingen tilmeldingEstimat med det samme

Sprogversionsfallback med ios-localechain

Når en oversættelsesnøgle mangler i en regional sprogversion som de-AT, springer iOS direkte til udviklingssproget i stedet for først at kontrollere den overordnede sprogversion 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 vores vejledning til sprogversionsfallback for at få den fulde liste over understøttede frameworks og 75 indbyggede kæder. Learn more →

Ofte stillede spørgsmål om iOS-lokalisering