tddworks/claude-skills/tuist-app-localization
- community
Checking that the SKILL.md file is still in the repository.
iOS/macOS app localization management for Tuist-based projects with .strings files. Use when: (1) Adding new translation keys to modules, (2) Validating .strings files for missing/duplicate keys, (3) Syncing translations across languages, (4) AI-powered translation from English to other locales, (5) Checking placeholder consistency (%@, %d), (6) Generating localization reports, (7) Updating Swift code to use localized strings instead of hardcoded text.
Install
npx vskill@latest install tddworks/claude-skills/tuist-app-localizationSKILL.md
App Localization
Manage iOS/macOS .strings files in Tuist-based projects.
Project Structure
After editing .strings files, run tuist generate to regenerate type-safe accessors.
Complete Localization Workflow
Step 1: Identify Hardcoded Strings
Find hardcoded strings in Swift files:
Step 2: Add Translation Keys
Add keys to all language files:
en.lproj/Localizable.strings (primary):
Other locales (translate appropriately):
Step 3: Generate Type-Safe Accessors
This creates Derived/Sources/TuistStrings+<ModuleName>.swift with accessors:
<ModuleName>Strings.Section.keyName(static property)<ModuleName>Strings.Section.keyWithParam(value)(static function for %@ params)
See references/tuist-strings-patterns.md for detailed patterns.
Step 4: Update Swift Code
Replace hardcoded strings with generated accessors.
Pattern Mapping
| Hardcoded Pattern | Localized Pattern | |
|---|---|---|
Text("Title") | Text(<Module>Strings.Section.title) | |
Text("Hello, \(name)") | Text(<Module>Strings.Section.hello(name)) | |
title: "Submit" | title: <Module>Strings.Action.submit | |
placeholder: "Enter..." | placeholder: <Module>Strings.Field.placeholder |
Example Transformations
Before:
After:
Handling Parameters and Plurals
String with parameter (key: "search.noResults" = "No results for \"%@\""):
Conditional plurals:
Multiple parameters (key: "message.detail" = "%@ uploaded %d files"):
Step 5: Validate Changes
- Build the project to catch missing keys
- Run validation script to check consistency:
AI-Powered Translation
When translating strings to non-English locales:
- Read the English source string
- Consider context from the key name (e.g.,
search.noResults= search UI) - Translate appropriately for the target locale:
- zh-Hans: Simplified Chinese, formal but friendly
- zh-Hant: Traditional Chinese
- ja: Japanese, polite form (desu/masu style)
- ko: Korean, polite form (hamnida/yo style)
- de/fr/es/etc.: Appropriate regional conventions
- Preserve all placeholders exactly (%@, %d, %ld, etc.)
Translation context by UI element:
- Labels: Keep concise
- Buttons: Action-oriented verbs
- Placeholders: Instructive tone
- Error messages: Helpful and clear
- Confirmations: Clear consequences
Validation Scripts
Validate .strings Files
Checks for:
- Missing keys between languages
- Duplicate keys
- Placeholder mismatches (%@, %d, %ld)
- Untranslated strings (value = English)
Sync Missing Translations
Report missing keys:
Add missing keys as placeholders:
Key Naming Convention
Pattern: "domain.context.element" → <Module>Strings.Domain.Context.element
Domain-Focused Naming (User Mental Model)
Keys should reflect what the user is doing, not technical UI components:
| User Mental Model | Key Pattern | Generated Accessor | |
|---|---|---|---|
| "I'm looking at my profile" | "profile.name" | Strings.Profile.name | |
| "I'm testing a build" | "betaBuild.whatToTest" | Strings.BetaBuild.whatToTest | |
| "I'm adding a tester" | "testerGroup.addTester" | Strings.TesterGroup.addTester | |
| "Something went wrong with sync" | "sync.error.failed" | Strings.Sync.Error.failed |
Good vs Bad Examples
| Bad (Technical) | Good (Domain-Focused) | |
|---|---|---|
button.save | profile.save | |
field.email | registration.email | |
placeholder.search | appSelector.searchPlaceholder | |
error.network | sync.connectionFailed | |
label.title | settings.title | |
alert.confirm | build.expireConfirm |
Structure by Feature/Screen
Organize keys by the feature or screen where they appear:
This mirrors how users think: "I'm in Beta Builds, submitting for review" → betaBuild.submitForReview
.strings File Format
Rules:
- Keys must be unique within a file
- Values are UTF-8 encoded
- Escape quotes with backslash:
\" - Line ends with semicolon
- Use positional parameters (%1$@, %2$d) when order differs between languages
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/tuist-app-localization/SKILL.md
Popularity
- Repository stars
- 35
- Repository forks
- 6
- 7-day trend score
- 18
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/tddworks/claude-skills/tuist-app-localization)