localize.dev

Docs / iOS

Localisation iOS et macOS avec les Catégories de Chaînes, automatisée

Trouvez le texte codé en SwiftUI et UIKit, traduisez-le en Localizable.xcstrings pour chaque langue, et enveloppez les chaînes UIKit avec String(localized:), en une seule commande ou demande de pull.

Comment ça marche

SwiftUI recherche le texte de Text("…"), Button, Label, TextField, .navigationTitle et autres vues directement dans le Catégorie de Chaînes, afin que le code reste tel quel. UIKit utilise des chaînes simples, donc label.text = "…", setTitle("…", for:) et les titres d’alerte deviennent String(localized: "…").

Un nombre avec son mot, "\(n) \(n == 1 ? "item" : "items")", devient "\(n) items": le catalogue varie %lld items selon le nombre, avec les formes pluriels de chaque langue.

Chaque chaîne est ajoutée dans Localizable.xcstrings, indexée par son texte tel que Xcode l’écrit (Welcome back, %@!), avec la traduction de chaque langue dans le même fichier et des placeholders numérotés (%1$@, %2$lld) lorsqu’il y en a plus d’un. Text(verbatim:), noms d’images et commentaires restent inchangés.

Avant et après

La sortie réelle du moteur pour ce fichier. Lors d'une exécution réelle, le modèle hébergé nomme les clés à partir du contexte.

Shop/CartView.swift · avant
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 · après
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"
}

Ce que l'installation ajoute

La première exécution configure Catégories de Chaînes (Localizable.xcstrings) si le projet ne l'a pas encore :

  • Localizable.xcstrings, trouvé n'importe où dans le projet ou créé à la racine : ajoutez-le une fois à la cible de l'application dans Xcode.

Exécutez-le

La CLI nécessite Node.js 22 ou une version ultérieure, rien d'autre : npx l'exécute sans ajouter de package.json au projet. Pas de Node sur votre machine ? L'action GitHub ci-dessous l'exécute pour vous.

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

Ou ajoutez le Action GitHub et recevez une pull request à chaque push. Essayez-le d'abord sur votre propre code dans le playground.