Manage iOS localization files (.strings) through a single YAML file. No more editing dozens of separate files for each language. Automatically handles both Localizable.strings and InfoPlist.strings.
- 📝 Single source of truth - All translations in one YAML file
- 🔍 Easy to review - See all languages for each key side by side
- ✅ Find missing translations - Instantly see which keys are missing in which languages
- 🚀 Simple workflow - Extract, edit, apply
- 🎯 Smart key routing - Automatically puts
NS*andCF*keys into InfoPlist.strings
pip install git+https://github.com/botforge-pro/ios-i18n-sync.gitFrom your iOS project root:
# Extract all .strings files (both Localizable and InfoPlist) to translations.yaml i18n-sync extract --resources Resources # Edit translations.yaml with your favorite editor # Then apply changes back: i18n-sync apply --resources ResourcesThe tool automatically:
- Extracts from both
Localizable.stringsandInfoPlist.strings - Organizes translations into sections in YAML
- Preserves the structure when applying back
Default paths:
- Resources:
Resources/directory - YAML file:
translations.yaml
The YAML file is organized into sections corresponding to different .strings files:
Localizable: cancel: en: "Cancel" ru: "Отмена" de: "Abbrechen" es: "Cancelar" save: en: "Save" ru: "Сохранить" de: "Speichern" es: "Guardar" InfoPlist: CFBundleDisplayName: en: "My App" ru: "Мое приложение" de: "Meine App" es: "Mi aplicación" NSCameraUsageDescription: en: "This app needs camera access" ru: "Приложению нужен доступ к камере" de: "Diese App benötigt Kamerazugriff" es: "Esta aplicación necesita acceso a la cámara"- Handles multiple .strings files (
Localizable.strings,InfoPlist.strings) - Organized YAML structure with sections
- Preserves file headers (comments at the top of .strings files)
- Sorts keys alphabetically within sections
- Reports missing translations during extract
- Handles Unicode correctly
The extract command already serves as a check - it reports the status of all translations when extracting to YAML. You'll see output like:
All keys present in all languages ✓- Everything is consistent- Missing keys are reported per language if found
There's no need for a separate check command since extract is non-destructive to your .strings files and provides all the validation information you need.