Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Generate internationalization (i18n) infrastructure for multi-language support in iOS/macOS apps. Use when localizing for multiple languages, adopting String Catalogs (xcstrings), or supporting RTL languages.
.claude/skills/rshankras-localization-setup/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-14 | ✗→✓ | ▲ Improved | 29% | 0% |
| case-19 | ✗→✓ | ▲ Improved | 16% | 0% |
| case-11 | ✓→✗ | ▼ Worse | 49% | 0% |
| case-06 | ✓→✓ | = Same ✓ | 52% | 0% |
| case-07 | ✓→✓ | = Same ✓ | 74% | 0% |
Generate internationalization (i18n) infrastructure for multi-language support in iOS/macOS apps.
Before generating, verify:
bash # Check for existing localization files find . -name "*.xcstrings" -o -name "Localizable.strings" 2>/dev/null | head -5 find . -name "*.lproj" -type d 2>/dev/null | head -5
bash # String Catalogs require iOS 16+ / macOS 13+ grep -r "IPHONEOS_DEPLOYMENT_TARGET\|MACOSX_DEPLOYMENT_TARGET" *.xcodeproj 2>/dev/null
bash # Find project for adding localization find . -name "*.xcodeproj" | head -1
Resources/
└── Localizable.xcstrings # String catalog with all translationsSources/Localization/
├── LocalizedStrings.swift # Type-safe string access
├── LocalizationManager.swift # Runtime language switching
└── LocalizedPreview.swift # SwiftUI preview helpersswift// Generated enum for type-safe access enum L10n { static let appName = String(localized: "app_name") static let welcomeMessage = String(localized: "welcome_message") enum Settings { static let title = String(localized: "settings_title") static let language = String(localized: "settings_language") } } // Usage Text(L10n.appName) Text(L10n.Settings.title)
swift// In String Catalog, define plural rules // key: "items_count" // variations: // - zero: "No items" // - one: "1 item" // - other: "%lld items" Text(String(localized: "items_count \(count)", defaultValue: "\(count) items"))
swift// In String Catalog: // key: "greeting" // value: "Hello, %@!" let name = "Alice" Text(String(localized: "greeting \(name)"))
swift// Preview in different locale struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() .environment(\.locale, Locale(identifier: "es")) } }
If migrating from .strings files:
swift// Automatic localization Text("Hello, World!") // Uses String Catalog automatically // Explicit localized string Text(String(localized: "custom_key")) // With type-safe enum (generated) Text(L10n.welcomeMessage)
swiftlabel.text = String(localized: "hello_world") // or label.text = NSLocalizedString("hello_world", comment: "Greeting")
// Good: Descriptive, hierarchical
"settings.appearance.theme"
"onboarding.step1.title"
"error.network.connection_failed"
// Avoid: Vague or hardcoded text as key
"button1"
"Hello, World!"swiftString(localized: "delete_confirmation", comment: "Alert message asking user to confirm deletion")
swift// Numbers - Use FormatStyle Text(price, format: .currency(code: "USD")) // Dates - Use FormatStyle Text(date, format: .dateTime.month().day()) // Lists - Use ListFormatStyle Text(items, format: .list(type: .and))
swift// Automatic with SwiftUI // For manual layout adjustments: .environment(\.layoutDirection, .rightToLeft)
swift#Preview { ContentView() .environment(\.locale, Locale(identifier: "ja")) }
Other measured skills in the registry, with their headline benchmark lift.