localization-developer
Localization Developer (Smart Router)
Purpose
Context-aware routing to the Anytype iOS localization system. Helps you navigate the 3-file .xcstrings structure and use Loc constants correctly.
When Auto-Activated
- Working with
.xcstringsfiles - Using
Locconstants - Discussing hardcoded strings or user-facing text
- Keywords: localization, strings, text, Loc., .xcstrings
π¨ CRITICAL RULES (NEVER VIOLATE)
- NEVER use hardcoded strings in UI - Always use
Locconstants - NEVER create duplicate keys across the 3 .xcstrings files - Breaks code generation
- NEVER edit non-English translations - Only update English (
en), Crowdin handles others - ALWAYS search for existing keys first - Reuse before creating new
- ALWAYS run
make generateafter editing .xcstrings files
π Quick Workflow
- Search existing:
rg "yourSearchTerm" Modules/Loc/Sources/Loc/Generated/Strings.swift - If found: Reuse existing key
- If not found: Add to appropriate .xcstrings file (see decision tree below)
- Generate:
make generate - Use:
AnytypeText(Loc.yourKey, style: .uxCalloutMedium)
ποΈ The 3-File System
Decision Tree
Is this text for authentication/login/vault?
YES β Auth.xcstrings (86 keys)
NO β Continue
Is this text for spaces/objects/collaboration?
YES β Workspace.xcstrings (493 keys)
NO β Continue
Is this text for settings/widgets/general UI?
YES β UI.xcstrings (667 keys)
File Locations
- Auth.xcstrings:
Modules/Loc/Sources/Loc/Resources/Auth.xcstrings - Workspace.xcstrings:
Modules/Loc/Sources/Loc/Resources/Workspace.xcstrings - UI.xcstrings:
Modules/Loc/Sources/Loc/Resources/UI.xcstrings
Generated output: All 3 files β single Strings.swift (~5,000 lines, 1,246 total keys)
π― Adding Keys
Format (add to appropriate .xcstrings file)
"Your localization key" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Your English text here"
}
}
}
}
Key naming:
- Short keys:
"No properties yet"β - Not full sentences:
"No properties yet. Add some."β - Hierarchical:
"QR.join.title"βLoc.Qr.Join.title
π’ Dynamic Localization (Parameters)
β CORRECT - Use generated functions
// String: "You've reached the limit of %lld editors"
Loc.SpaceLimit.Editors.title(4)
// String: "Welcome, %@!"
Loc.welcomeMessage("John")
β WRONG - Never use String(format:)
String(format: Loc.limitReached, 10) // DON'T DO THIS
Why: SwiftGen auto-generates parameterized functions for format specifiers (%lld, %d, %@).
Format specifiers:
%lldβ Int parameter%dβ Int parameter%@β String parameter%.1fβ Double parameter
ποΈ Removing Unused Keys
- Search:
rg "keyName" --type swift - If only in Strings.swift: Key is orphaned
- Remove from source .xcstrings file
- Generate:
make generate
β οΈ Common Mistakes
Hardcoded Strings
// β WRONG
Text("Delete")
// β
CORRECT
Text(Loc.delete)
Duplicate Keys Across Files
// In Auth.xcstrings
"Settings" : { ... }
// In UI.xcstrings
"Settings" : { ... } // β DUPLICATE! Breaks generation
Using String(format:)
// β WRONG
String(format: Loc.limitReached, 10)
// β
CORRECT
Loc.limitReached(10)
Editing Non-English
// β WRONG - Crowdin will overwrite
"de" : { "value" : "Meine Γbersetzung" }
// β
CORRECT - Only edit English
"en" : { "value" : "My translation" }
π Complete Documentation
Full Guide: Anytype/Sources/PresentationLayer/Common/LOCALIZATION_GUIDE.md
For comprehensive coverage of:
- Detailed 3-file system explanation
- Key naming patterns and conventions
- Dynamic localization with all format specifiers
- Translation workflow with Crowdin
- Removing orphaned keys
- Generated file structure
- Complete examples and troubleshooting
β Workflow Checklist
- Searched for existing keys (
rgin Strings.swift) - Added to correct .xcstrings file (Auth/Workspace/UI)
- No duplicate keys across files
- Only updated English (
en) - Ran
make generate - Used generated key:
Loc.yourKey - No hardcoded strings in UI
π Related Skills & Docs
- ios-dev-guidelines β
IOS_DEVELOPMENT_GUIDE.md- Never use hardcoded strings - code-generation-developer β
CODE_GENERATION_GUIDE.md- Understanding make generate - design-system-developer β Using Loc constants in UI components
Navigation: This is a smart router. For deep details, always refer to LOCALIZATION_GUIDE.md.
More from anyproto/anytype-swift
tests-developer
Smart router to testing patterns and practices. Use when writing unit tests, creating mocks, testing edge cases, or working with Swift Testing and XCTest frameworks.
2liquid-glass-developer
Context-aware routing to iOS 26 Liquid Glass implementation patterns. Use when working with glass effects, GlassEffectContainer, morphing transitions, or iOS 26 visual effects.
2ios-dev-guidelines
Context-aware routing to Swift/iOS development patterns, architecture, and best practices. Use when working with .swift files, ViewModels, Coordinators, refactoring, or discussing Swift/SwiftUI patterns.
2swiftui-performance-developer
Audit and improve SwiftUI runtime performance through code review and Instruments guidance. Use for diagnosing slow rendering, janky scrolling, excessive view updates, or layout thrash in SwiftUI apps.
2swift-concurrency-developer
Expert guidance on Swift concurrency using the Office Building mental model. Use when working with actors, isolation, Sendable, TaskGroups, or fixing concurrency warnings and data race issues.
2swiftui-patterns-developer
SwiftUI view structure, composition, and best practices. Use when refactoring SwiftUI views, organizing view files, or extracting subviews.
2