Le CLI Lingo.dev traduit les String Catalogs Xcode (.xcstrings) via un moteur de localisation configuré. Les String Catalogs sont le format de localisation moderne d’Apple, introduit avec Xcode 15, qui regroupe toutes les langues dans un seul fichier JSON. Le CLI modifie ce fichier directement, sans nécessiter de répertoires distincts par langue.
Ce guide vous accompagne de bout en bout dans la localisation d’une app iOS : configuration du CLI, traduction en local et automatisation avec GitHub Actions pour livrer les traductions à chaque push.
Dépôt de démo
Clonez ou forkez lingodotdev/ios-app-localization-example pour suivre ce guide. Le dépôt contient un projet Xcode opérationnel avec des String Catalogs, une configuration du CLI Lingo.dev et un workflow GitHub Actions.
Comment fonctionnent les String Catalogs#
Avant Xcode 15, la localisation iOS impliquait de gérer des fichiers .strings et .stringsdict séparés dans des répertoires [locale].lproj/. Les String Catalogs remplacent cette approche par un unique fichier Localizable.xcstrings que Xcode maintient automatiquement.
Lorsque vous marquez une chaîne comme localisable dans SwiftUI ou UIKit, Xcode la détecte au moment du build et ajoute une entrée au String Catalog. Chaque entrée suit la chaîne source, ses traductions pour chaque langue configurée et un champ de commentaire facultatif qui apporte du contexte aux traducteurs.
| Aspect | Ancien format .strings | String Catalogs .xcstrings |
|---|---|---|
| Nombre de fichiers | Un par langue et par table | Un seul fichier pour toutes les langues |
| Format | Texte clé-valeur | JSON structuré |
| Gestion du pluriel | Fichier .stringsdict distinct | Règles de pluriel intégrées |
| Intégration à Xcode | Export/import manuel | Détection automatique |
| Notes pour les traducteurs | Non pris en charge | Champ de commentaire par entrée |
Le type de bucket xcode-xcstrings du CLI analyse cette structure JSON, traduit chaque entrée via le moteur de localisation, puis réécrit les traductions dans le même fichier, tout en préservant les commentaires, les règles de pluriel et les métadonnées.
Prérequis#
Créer un moteur de localisation
Chaque exécution du CLI envoie le contenu via un moteur de localisation : la configuration qui détermine quel modèle LLM, glossaire, voix de marque et instructions s’appliquent. Créez-en un dans le dashboard Lingo.dev et générez une clé API.
Vérifier Node.js
Le CLI nécessite Node.js 18 ou supérieur :
node -vActiver la localisation dans Xcode
Dans votre projet Xcode, accédez à Project Settings > Info > Localizations et ajoutez vos langues cibles. Xcode crée des entrées dans le String Catalog pour chaque langue ajoutée. Consultez la documentation de localisation d’Apple pour en savoir plus.
Configurer le CLI#
Créez un fichier i18n.json à la racine de votre projet. Le bucket xcode-xcstrings indique au CLI d’analyser le format String Catalog et de modifier le fichier directement :
{
"$schema": "https://lingo.dev/schema/i18n.json",
"version": "1.15",
"locale": {
"source": "en",
"targets": ["es", "fr", "de", "ja"]
},
"buckets": {
"xcode-xcstrings": {
"include": ["MyApp/Localizable.xcstrings"]
}
}
}Comme les String Catalogs regroupent toutes les langues dans un seul fichier, aucun placeholder [locale] n’est nécessaire dans le motif include. Le CLI lit les entrées de la langue source, les traduit, puis réécrit toutes les langues cibles dans le même fichier .xcstrings.
Plusieurs String Catalogs
Si votre projet utilise plusieurs fichiers String Catalog (par exemple, un par cible de framework), listez-les tous dans le tableau include :
{
"buckets": {
"xcode-xcstrings": {
"include": [
"MyApp/Localizable.xcstrings",
"MyAppWidgets/Localizable.xcstrings"
]
}
}
}Traduire en local#
Définissez votre clé API et lancez le CLI :
export LINGO_API_KEY="your-api-key"
npx lingo.dev@latest runLe CLI lit votre String Catalog, repère les entrées non traduites à l’aide du lockfile, traduit le delta via votre moteur de localisation, puis réécrit le résultat dans le fichier .xcstrings. Ouvrez le fichier dans Xcode pour voir les traductions renseignées pour chaque langue configurée.
Pour cibler une langue spécifique pendant le développement :
npx lingo.dev@latest run --target-locale esNotes pour les traducteurs#
Les String Catalogs prennent en charge un champ de commentaire par entrée, que le CLI inclut dans les requêtes de traduction. Ces commentaires fournissent du contexte au moteur de localisation, en levant les ambiguïtés, en précisant le ton ou en indiquant où une chaîne apparaît dans l’interface.
Dans Xcode, sélectionnez une chaîne dans l’éditeur de String Catalog et ajoutez un commentaire dans le panneau de l’inspecteur. Le commentaire est stocké dans le JSON .xcstrings :
{
"sourceLanguage": "en",
"strings": {
"Set": {
"comment": "Refers to a collection of items, not the verb",
"localizations": { }
}
}
}Le CLI envoie ce commentaire avec la chaîne afin d’orienter le modèle vers la bonne interprétation. Sans contexte, « Set » pourrait être compris comme un verbe dans de nombreuses langues ; le commentaire lève cette ambiguïté. Voir Translator Notes pour découvrir d’autres cas d’usage.
Pluriels#
Les String Catalogs gèrent nativement les formes plurielles à l’aide des règles de pluriel CLDR. Lorsque vous définissez une variante plurielle dans Xcode, le String Catalog enregistre les règles pour chaque catégorie de pluriel (zero, one, two, few, many, other) requise par la langue cible.
Le CLI préserve cette structure pendant la traduction et génère les bonnes catégories de pluriel pour chaque langue cible. L’anglais en utilise deux (one et other), mais l’arabe en exige six, le polonais quatre et le japonais une seule. Le moteur de localisation gère automatiquement ces différences.
Automatiser avec GitHub Actions#
Ajoutez un fichier workflow à l’emplacement .github/workflows/translate.yml pour traduire à chaque push :
Les traductions sont commitées directement sur main : zéro friction, idéal pour les petites équipes :
name: Translate
on:
push:
branches: [main]
permissions:
contents: write
jobs:
translate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Lingo.dev
uses: lingodotdev/lingo.dev@main
with:
api-key: ${{ secrets.LINGODOTDEV_API_KEY }}Stockez votre clé API sous LINGODOTDEV_API_KEY dans Settings > Secrets and variables > Actions de votre dépôt GitHub.
Vérifier avant le déploiement#
Utilisez l’option --frozen comme garde-fou avant déploiement pour vous assurer qu’aucune chaîne non traduite n’arrive en production. Le CLI renvoie un statut non nul si certaines entrées doivent encore être traduites :
npx lingo.dev@latest run --frozenAjoutez cette étape CI séparément avant votre build :
- name: Verify translations
run: npx lingo.dev@latest run --frozen