// session: /articles/native-ios-localization-workflows-with-xcstrings-and-xcloc-best-practices-and-advanced-tips.md
// February 15, 2026
Native iOS Localization Workflows with XCStrings and XCLoc: Best Practices and Advanced Tips
# Learn how Xcode String Catalogs (.xcstrings) and .xcloc workflows work, where they scale, and where manual localization starts to break down.
Modern iOS localization is centered around String Catalogs (.xcstrings) and localization exchange packages (.xcloc). If you're still relying on legacy .strings files, you're missing structured metadata, plural handling, and scalable workflows.
This guide walks through the native workflow, where it works well, and where teams begin to feel friction as apps grow.
Why String Catalogs (.xcstrings) Should Be Your Default
String Catalogs replace flat .strings files with a structured JSON-based format that supports:
- Plural rules
- Device variations
- Translation comments
- Variant states
- Better diff visibility in pull requests
Unlike .strings, catalogs preserve structured metadata per key. That makes them far more maintainable over time.
If you're new to catalogs, start here:
If you're migrating from legacy formats:
π Migrate from Legacy Strings to String Catalog
Whatβs Inside an .xcstrings File
An .xcstrings file is a JSON-based catalog that stores structured entries per string key.
A simplified example looks like:
{
"sourceLanguage": "en",
"strings": {
"onboarding.welcome.title": {
"comment": "Main headline on onboarding screen",
"localizations": {
"fr": {
"stringUnit": {
"state": "translated",
"value": "Bienvenue"
}
}
}
}
}
}
Notice a few important things:
- Each key stores its own comment
- Translation state is tracked per language
- Variants and plural rules live alongside the key
- Everything is version-controlled as structured data
This makes catalogs significantly more powerful than flat .strings files, but it also introduces merge complexity if not managed carefully.
Exporting and Importing .xcloc Packages
.xcloc bundles are the native way to exchange translations with reviewers or vendors.
Export Workflow
- Product β Export Localizations
- Select languages
- Generate
.xclocpackages
Always build your project before exporting to ensure catalogs are fully populated.
Import Workflow
- Product β Import Localizations
- Select updated
.xcloc - Xcode merges changes into
.xcstrings
This works well for small teams and limited languages.
Where the Native .xcloc Workflow Starts to Break Down
For small apps, manual .xcloc exchange is perfectly reasonable.
Friction increases when:
- Multiple translators edit catalogs simultaneously
- Review feedback happens over email or spreadsheets
- Merge conflicts appear in JSON during pull requests
- Translators accidentally modify metadata
- Language count grows beyond a few locales
Because .xcstrings is structured JSON, even small translation edits can create noisy diffs in version control. That adds overhead during code review.
As the number of contributors grows, coordination becomes the real bottleneck, not translation itself.
Building a Scalable Translation Review Process
Localization quality comes from structured review, not just translation.
A scalable workflow should allow:
- Per-string approval
- Structured reviewer feedback
- Clear change tracking
- Minimal friction for non-developers
If you're collecting translation feedback at scale:
π How to Collect Translation Feedback
Translation Comments: The Most Underrated Feature
The biggest quality improvement you can make is better context.
Every string should include:
- UI location
- Intended meaning
- Placeholder explanation
- Plural logic context
Without comments, translators guess. Guessing leads to revisions.
Deep dive here:
π Accurate Translation Comments in String Catalogs
Key Naming Strategy for Long-Term Scale
Avoid flat or generic keys.
Instead of:
title
buttonText
Use structured namespaces:
onboarding.welcome.title
settings.profile.save_button
checkout.error.payment_failed
Namespacing prevents collisions and keeps catalogs readable as your app grows.
Handling Protected Terms and Brand Consistency
Some strings should never be translated. Brand names, product terms, internal keywords.
To manage protected terminology correctly:
π Protect Terms in String Catalogs
CI, Diffs, and Pull Request Best Practices
Treat localization like code:
- Review
.xcstringsdiffs in PRs - Avoid deleting keys without checking usage
- Track untranslated strings before release
- Keep one source of truth per feature
Because catalogs are structured JSON, small edits can affect multiple nested properties. Clear review discipline prevents accidental regressions.
Migration Strategy for Existing Apps
If your app still mixes:
.strings.stringsdict- Hard-coded SwiftUI strings
Move gradually:
- Convert legacy files
- Standardize new work on
.xcstrings - Consolidate pluralization into catalogs
- Phase out old formats
Migration guide:
π Migrate from Strings to String Catalog
Final Takeaways
- Default to
.xcstrings - Exchange translations using
.xcloc - Always include strong context metadata
- Expect coordination friction as language count grows
- Implement structured review early
Native Xcode localization is powerful. It scales technically.
The real question is whether your workflow scales with it.
Related resources
> Ready to Localize Your App?
// Connect your GitHub repository and start reaching users worldwide