Comprehensive guide to app localization using String Catalogs. Apple Design Award Inclusivity winners always support multiple languages with excellent RTL (Right-to-Left) support.
Confirm successful installation by checking the skill directory location:
.cursor/skills/axiom-localization
Restart Cursor to activate axiom-localization. Access via /axiom-localization in your agent's command palette.
β
Security Notice
We perform automated surface-level scans (Gen AI Scanner, Socket, Snyk) during installation. These checks detect common vulnerabilities but do not guarantee complete security. Always review skill source code and verify the publisher's reputation before production use.
Skills execute code in your environment. Always review source, verify the publisher, and test in isolation before production.
Comprehensive guide to app localization using String Catalogs. Apple Design Award Inclusivity winners always support multiple languages with excellent RTL (Right-to-Left) support.
Overview
String Catalogs (.xcstrings) are Xcode 15's unified format for managing app localization. They replace legacy .strings and .stringsdict files with a single JSON-based format that's easier to maintain, diff, and integrate with translation workflows.
This skill covers String Catalogs, SwiftUI/UIKit localization APIs, plural handling, RTL support, locale-aware formatting, and migration strategies from legacy formats.
When to Use This Skill
Setting up String Catalogs in Xcode 15+
Localizing SwiftUI and UIKit apps
Handling plural forms correctly (critical for many languages)
Supporting RTL languages (Arabic, Hebrew)
Formatting dates, numbers, and currencies by locale
Migrating from legacy .strings/.stringsdict files
Preparing App Shortcuts and App Intents for localization
Debugging missing translations or incorrect plural forms
System Requirements
Xcode 15+ for String Catalogs (.xcstrings)
Xcode 26+ for automatic symbol generation, #bundle macro, and AI-powered comment generation
iOS 15+ for LocalizedStringResource
iOS 16+ for App Shortcuts localization
Earlier iOS versions use legacy .strings files
Part 1: String Catalogs (WWDC 2023/10155)
Creating a String Catalog
Method 1: Xcode Navigator
File β New β File
Choose "String Catalog"
Name it (e.g., Localizable.xcstrings)
Add to target
Method 2: Automatic Extraction
Xcode 15 can automatically extract strings from:
SwiftUI views (string literals in Text, Label, Button)
Swift code (String(localized:))
Objective-C (NSLocalizedString)
C (CFCopyLocalizedString)
Interface Builder files (.storyboard, .xib)
Info.plist values
App Shortcuts phrases
Build Settings Required:
"Use Compiler to Extract Swift Strings" β Yes
"Localization Prefers String Catalogs" β Yes
String Catalog Structure
Each entry has:
Key: Unique identifier (default: the English string)
{"sourceLanguage":"en","strings":{"Thanks for shopping with us!":{"comment":"Label above checkout button","localizations":{"en":{"stringUnit":{"state":"translated","value":"Thanks for shopping with us!"}},"es":{"stringUnit":{"state":"translated","value":"Β‘Gracias por comprar con nosotros!"}}}}},"version":"1.0"}
Translation States
Xcode tracks state for each translation:
New (βͺ) - String hasn't been translated yet
Needs Review (π‘) - Source changed, translation may be outdated
Reviewed (β ) - Translation approved and current
Stale (π΄) - String no longer found in source code
Workflow:
Developer adds string β New
Translator adds translation β Reviewed
Developer changes source β Needs Review
Translator updates β Reviewed
Developer removes code β Stale
Part 2: SwiftUI Localization
LocalizedStringKey (Automatic)
SwiftUI views with String parameters automatically support localization:
// β Automatically localizableText("Welcome to WWDC!")Label("Thanks for shopping with us!", systemImage:"bag")Button("Checkout"){}// Xcode extracts these strings to String Catalog
How it works: SwiftUI uses LocalizedStringKey internally, which looks up strings in String Catalogs.
String(localized:) with Comments
For explicit localization in Swift code:
// Basiclet title =String(localized:"Welcome to WWDC!")// With comment for translatorslet title =String(localized:"Welcome to WWDC!", comment:"Notification banner title")// With custom tablelet title =String(localized:"Welcome to WWDC!", table:"WWDCNotifications", comment:"Notification banner title")// With default value (key β English text)let title =String(localized:"WWDC_NOTIFICATION_TITLE", defaultValue:"Welcome to WWDC!", comment:"Notification banner title")
Best practice: Always include comment to give translators context.
LocalizedStringResource (Deferred Localization)
For passing localizable strings to other functions:
importFoundationstructCardView:View{let title:LocalizedStringResourcelet subtitle:LocalizedStringResourcevar body:someView{ZStack{RoundedRectangle(cornerRadius:10.0)VStack{Text(title)// Resolved at render timeText(subtitle)}.padding()}}}// UsageCardView( title:"Recent Purchases", subtitle:"Items you've ordered in the past week.")
Key difference: LocalizedStringResource defers lookup until used, allowing custom views to be fully localizable.
AttributedString with Markdown
// Markdown formatting is preserved across localizationslet subtitle =AttributedString(localized:"**Bold** and _italic_ text")
Part 3: UIKit & Foundation
NSLocalizedString Macro
// Basiclet title =NSLocalizedString("Recent Purchases", comment:"Button Title")// With tablelet title =NSLocalizedString("Recent Purchases", tableName:"Shopping", comment:"Button Title")// With bundlelet title =NSLocalizedString("Recent Purchases", tableName:nil, bundle:.main, value:"", comment:"Button Title")
Bundle.localizedString
let customBundle =Bundle(for:MyFramework.self)let text = customBundle.localizedString(forKey:"Welcome", value:nil, table:"MyFramework")
// InfoPlist.strings (Spanish)
"CFBundleName" = "Mi AplicaciΓ³n";
"NSCameraUsageDescription" = "La app necesita acceso a la cΓ‘mara para tomar fotos.";
Part 4: Pluralization
Different languages have different plural rules:
English: 2 forms (one, other)
Russian: 3 forms (one, few, many)
Polish: 3 forms (one, few, other)
Arabic: 6 forms (zero, one, two, few, many, other)
SwiftUI Plural Handling
// Xcode automatically creates plural variationsText("\(count) items")// With custom formattingText(
β
Make data-driven prioritization decisions faster
Stakeholder Communication
Draft PRDs, status updates, and stakeholder presentations
βΊAccess to product documentation and roadmap tools (Jira, Notion, etc.)
βΊUnderstanding of product management frameworks (RICE, Jobs-to-be-Done, etc.)
βΊStakeholder contact information and communication channels
Time Estimate
30-60 minutes to see productivity improvements
Steps
1Install product management skill
2Start with user story generation for known feature
3Progress to competitive analysis: research 2-3 competitors
4Use for roadmap prioritization: apply RICE/ICE scoring
5Draft stakeholder communications and refine based on feedback
6Build template library for recurring PM tasks
7Share effective prompts with product team
Common Pitfalls
β Not validating competitive researchβverify facts before sharing
β Accepting user stories without involving engineering team
β Over-relying on frameworks without qualitative judgment
β Not customizing outputs to company culture and communication style
β Skipping stakeholder validation of generated requirements
Best Practices
β Do
+Validate research and competitive analysis with real data
+Collaborate with engineering when generating technical requirements
+Customize frameworks and templates to your company context
+Use skill for first drafts, refine with stakeholder input
+Document successful prompt patterns for PM tasks
+Combine AI efficiency with human judgment and intuition
β Don't
βDon't publish competitive analysis without fact-checking
βDon't finalize user stories without engineering review
βDon't make prioritization decisions solely on AI scoring
βDon't skip customer validation of generated requirements
βDon't ignore company-specific context and culture
π‘ Pro Tips
β Provide context: company goals, constraints, customer feedback
β Ask for alternatives: 'Show 3 ways to prioritize this roadmap'
β Request stakeholder-specific formatting: 'Executive summary vs. engineering spec'
β Use skill for 70% generation + 30% customization to company needs
When to Use This
β Use when
Use for user story writing, competitive research, roadmap prioritization, stakeholder communication, and PRD drafting. Best for reducing repetitive documentation and research work.
β Avoid when
Avoid for strategic product vision (requires deep customer empathy), pricing decisions (needs market and financial expertise), or when face-to-face customer discovery is more valuable than speed.
Learning Path
1Basic: user stories, feature specs, status updates