localize.dev

Dokumentation / iOS

iOS- und macOS-Lokalisierung mit String Catalogs, automatisiert

Finden Sie fest codierten Text in SwiftUI und UIKit, übersetzen Sie ihn in Localizable.xcstrings für jede Sprache und umschließen Sie UIKit-Strings mit String(localized:), in einem Befehl oder einem Pull Request.

Funktionsweise

SwiftUI sucht den Text von Text("…"), Button, Label, TextField, .navigationTitle und anderen Ansichten selbst im String Catalog auf, sodass der Code unverändert bleibt. UIKit verwendet einfache Strings, sodass label.text = "…", setTitle("…", for:) und Alert-Titel zu String(localized: "…") werden.

Eine Zahl mit ihrem Wort, "\(n) \(n == 1 ? "item" : "items")", wird zu "\(n) items": Der Katalog variiert %lld items je nach Anzahl, mit den jeweiligen Pluralformen der Sprache.

Jede Zeichenkette wird in Localizable.xcstrings aufgenommen, wobei sie nach ihrem Text wie von Xcode geschrieben (Welcome back, %@!) indiziert wird. Jede Sprachübersetzung befindet sich im selben Datei und nummerierte Platzhalter (%1$@, %2$lld) werden verwendet, wenn es mehr als einen gibt. Text(verbatim:), Bildnamen und Kommentare bleiben unverändert.

Vorher und nachher

Die tatsächliche Ausgabe der Engine für diese Datei. Bei einer echten Ausführung benennt das gehostete Modell die Schlüssel anhand des Kontexts.

Shop/CartView.swift · vorher
import SwiftUI

struct CartView: View {
    let name: String
    var body: some View {
        VStack {
            Text("Welcome back, \(name)!")
            Button("Checkout") {}
        }
        .navigationTitle("Your cart")
    }
}

final class LoginController: UIViewController {
    let label = UILabel()
    override func viewDidLoad() {
        label.text = "Sign in to continue"
    }
}
Shop/CartView.swift · nachher
import SwiftUI

struct CartView: View {
    let name: String
    var body: some View {
        VStack {
            Text("Welcome back, \(name)!")
            Button("Checkout") {}
        }
        .navigationTitle("Your cart")
    }
}

final class LoginController: UIViewController {
    let label = UILabel()
    override func viewDidLoad() {
        label.text = String(localized: "Sign in to continue")
    }
}
locales/en.json
{
  "sourceLanguage" : "en",
  "strings" : {
    "Checkout" : {

    },
    "Sign in to continue" : {

    },
    "Welcome back, %@!" : {

    },
    "Your cart" : {

    }
  },
  "version" : "1.0"
}

Was das Setup hinzufügt

Der erste Durchlauf richtet String Catalogs (Localizable.xcstrings) ein, falls das Projekt es noch nicht hat:

  • Localizable.xcstrings, die Sie überall im Projekt oder am Root erstellen: fügen Sie es in der Xcode-Projektzielkonfiguration einmal hinzu.

Ausführen

Die CLI benötigt Node.js 22 oder neuer, sonst nichts: npx führt es aus, ohne ein package.json zum Projekt. Kein Node auf Ihrem Rechner? Die GitHub Action unten führt es für Sie aus.

npx localize-dev login

# Preview, then write the changes
npx localize-dev run --dry-run -l es,fr,de
npx localize-dev run -l es,fr,de

# Or open a pull request instead
npx localize-dev pr -l es,fr,de

Oder fügen Sie die GitHub Action und erhalten Sie bei jedem Push einen Pull Request. Probieren Sie es zuerst mit Ihrem eigenen Code im Spielbereich.