localize
Skill40 starsChanged 7 months agoMITView on GitHub
Full localization pipeline: scan for hardcoded strings, extract to string tables, validate translations, RTL test, locale QA, voiceover/audio localization, string freeze enforcement, and coverage reporting.
22 other projects use a version of this.
Adopted by
Most recently taken up by
- optiflowic/keyturntheir own version, first seen Nov 8, 2026
- Mharbulous/probanda-devtheir own version, first seen Nov 8, 2026
- striderZA/OpenCodeGameStudiostheir own version, first seen Nov 4, 2026
- JoblessJoe/local-llm-workertheir own version, first seen Nov 1, 2026
- berkayburakk/tubecrewtheir own version, first seen Oct 20, 2026
- JoblessJoe/localizetheir own version, first seen Oct 20, 2026
Other versions22 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 22
- Donchitos/Claude-Code-Game-Studios★ 27ksame name
- ryokun6/ryos★ 1.3ksame name
- pixel-cellar/Claude-Code-Game-Studios★ 324same name
- striderZA/OpenCodeGameStudios★ 118same name
- tranhieutt/software_development_department★ 71same name
- rainday/smart-blog-skills★ 35same name
- CoralGame/Claude-Code-Game-Studios★ 19same name
- dawn840705/codex-code-studios★ 17same name
- lilangMax/ClaudeCodeGameStudios★ 8same name
- hongyuanc/codex-game-studios★ 5same name
12 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository77 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- design/CLAUDE.mdCLAUDE.md
- docs/CLAUDE.mdCLAUDE.md
- src/CLAUDE.mdCLAUDE.md
- tests/CLAUDE.mdCLAUDE.md
- adoptSkill
- architecture-decisionSkill
- architecture-reviewSkill
- asset-auditSkill
- asset-specSkill
- balance-checkSkill
- brainstormSkill
- bug-reportSkill
- bug-triageSkill
- changelogSkill
- code-reviewSkill
- consistency-checkSkill
- content-auditSkill
- create-architectureSkill
- create-control-manifestSkill
- create-epicsSkill
- create-storiesSkill
- day-one-patchSkill
- design-bibleSkill
- design-reviewSkill
- design-systemSkill
- dev-storySkill
- estimateSkill
- extractSkill
- gate-checkSkill
- helpSkill
- hotfixSkill
- launch-checklistSkill
- map-systemsSkill
- milestone-reviewSkill
- onboardSkill
- patch-notesSkill
- perf-profileSkill
- prd-reviewSkill
- project-stage-detectSkill
- propagate-design-changeSkill
- prototypeSkill
- qa-planSkill
- quick-designSkill
- regression-suiteSkill
- release-checklistSkill
- retrospectiveSkill
- reverse-documentSkill
- review-all-prdsSkill
- scope-checkSkill
- security-auditSkill
- setup-frameworkSkill
- skill-improveSkill
- skill-testSkill
- smoke-checkSkill
- soak-testSkill
- sprint-planSkill
- sprint-statusSkill
- startSkill
- story-doneSkill
- The first 60 shown.
The file
We split this skill into the rules it gives an agent
8 rules. 0 are common, 3 are distinctive, and 5 are very specific to this project.
0
Common
Most of the 21 edited versions we read keep these.
3
Distinctive
This author's own choices. Worth a look.
5
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 41
If target locales are unset, prompt the user: which markets is the app launching in?
- Very specific: line 64
Test files (tests/, __tests__, _test.dart, *Tests.swift).
- Very specific: line 104
Always ask before writing.
- Distinctive: line 137
If any RTL locale is in scope, walk through:
- Distinctive: line 156
If the app uses recorded audio (onboarding voiceover, character lines, push notification audio):
- Very specific: line 171
When invoked with --freeze:
- Very specific: line 175
Add a CI check that fails if any new key is added or any source value is changed without a freeze-override annotation.
- Very specific: line 220
Ask before writing to production/localization/loc-report-[date].md.
“Common” is measured: kept by at least 6 in 10 of the 21 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Localize
Localization is treated as a recurring pipeline, not a one-time chore. This skill has five modes, each runnable independently. Together they take an app from "English-only with hardcoded strings" through to "fully translated, frozen for release, and verified on device".
Phase 1: Pick the Mode
Parse the argument:
--scan(default if omitted) — find hardcoded user-facing strings.--extract— move identified strings into the string table.--validate— verify completeness and quality of existing translations.--freeze— enforce the string-freeze policy ahead of release.--report— generate a coverage report.
Read project context:
.claude/docs/technical-preferences.md— framework, target locales.- Existing string tables — locations vary by stack:
- RN:
src/locales/[lang].json(typical fori18next,react-intl,expo-localization). - Flutter:
lib/l10n/intl_[lang].arb,app_localizations.dart. - iOS native:
*.lproj/Localizable.strings,Localizable.stringsdict. - Android native:
res/values-[lang]/strings.xml.
- RN:
If target locales are unset, prompt the user: which markets is the app launching in?
Phase 2: Scan Mode
Find every user-facing string that is not pulled from the table.
Per stack, the grep patterns are different:
- RN (i18next): match
>{[^{]*[A-Za-z][^}]*}<outsidet()calls. Also match raw string literals passed as<Text>children. - Flutter: match
Text('...')andText("...")outside of test files. - iOS Swift: match
Text("..."),Label("..."), plain string literals passed tosetTitle,setText. Cross-reference withNSLocalizedString. - Android Kotlin: match
Text("...")(Compose),setText("..."), hardcoded strings infindViewById. Cross-referencegetString(R.string.*)calls.
Filter false positives:
- Logging calls (
console.log,print,os_log,Log.d). - Test files (
tests/,__tests__,_test.dart,*Tests.swift). - Constants for keys, identifiers, URLs, deep-link routes.
- Developer-facing diagnostic messages.
Render a table:
| File | Line | String | Suggested key |
Include a confidence rating per row (high / medium / low). Confidence high = clearly user-facing; low = ambiguous (developer message, analytics label).
Phase 3: Extract Mode
For each high-confidence row, propose the migration. Use AskUserQuestion to batch decisions per cluster (auth strings, paywall strings, etc.).
Migration steps per stack:
- RN: add
"key.path": "Source string"tosrc/locales/en.json, replace inline literal witht('key.path'). - Flutter: add to
lib/l10n/intl_en.arb, replace withAppLocalizations.of(context)!.keyPath(regenerate viaflutter gen-l10n). - iOS: add to
Localizable.strings, replace literal withNSLocalizedString("key.path", comment: "")or SwiftUIText("key.path", bundle: .main). - Android: add to
res/values/strings.xml, replace literal withgetString(R.string.key_path)orstringResource(R.string.key_path).
Naming convention for keys:
- snake_case or dot.case grouped by feature:
paywall.cta.subscribe,auth.error.invalid_email. - Stable across translations — never include words from translated text in the key.
Always ask before writing. After extraction, run the framework's
generator (flutter gen-l10n, RN i18n compile, etc.) to ensure no
build break.
Phase 4: Validate Mode
For the configured target locales, audit each translation file:
- Every key in the source locale exists in the target locale.
- No empty values.
- No untranslated values that match the source verbatim (unless
the string is a brand name — maintain an allowlist at
assets/locale-allowlist.txt). - Placeholder counts and names match the source ({0}, {name}, ICU plural forms).
- Plural / gender rules complete for languages that need them (Russian, Polish, Arabic).
- No HTML tags in plaintext strings.
- No leading/trailing whitespace inconsistencies.
- Length sanity — strings in target should be no more than 2.5x the source length (UI overflow risk).
For each problem, render:
| Locale | Key | Issue | Severity |
Phase 5: RTL Audit (when targeting Arabic, Hebrew, Persian, Urdu)
If any RTL locale is in scope, walk through:
- Layout uses logical edge attributes (
Start/End, leading/ trailing) rather thanLeft/Right. - Icons that should mirror (back arrows, navigation indicators)
are configured to mirror via
autoMirror(Compose),flipsForRightToLeftLayoutDirection(UIKit),Directionality(Flutter),I18nManager.isRTL-aware (RN). - Numbers in non-Arabic RTL locales are still LTR-rendered when design requires.
- Date/time formatters use locale-correct output.
Provide a checklist for the tester to run on a device with system language switched to Arabic.
Phase 6: Voiceover and Audio Localization
If the app uses recorded audio (onboarding voiceover, character lines, push notification audio):
- Audio files are organized per locale:
assets/audio/[lang]/.... - Default fallback locale is configured.
- Speech-rate / Voice-Over (iOS) and TalkBack (Android) labels are localized — accessibility labels follow the same pipeline as visible text.
Render a per-locale audio inventory and flag missing tracks.
Phase 7: String Freeze Mode
When invoked with --freeze:
- Snapshot the current
enstring table toassets/locales/_freeze-[date].json. - Add a CI check that fails if any new key is added or any source
value is changed without a
freeze-overrideannotation. - Notify the user: "String freeze active. New strings require localization-lead approval and a freeze-override flag."
This protects against last-minute changes that translators cannot cover.
Phase 8: Report Mode
Render coverage:
# Localization Report — [date]
## Source
- Source locale: en — [count] keys
## Coverage
| Locale | Translated | Empty | Source-equivalent | Coverage % |
|--------|------------|-------|-------------------|------------|
| es | 412 | 0 | 3 (allowlisted) | 100% |
| fr | 410 | 2 | 0 | 99.5% |
| ar | 380 | 32 | 0 | 92% |
## Issues
- [locale]: [count] severity-high issues
- [locale]: [count] severity-medium issues
## Hardcoded String Status
- High-confidence remaining: [count] (paths)
- Low-confidence (probable false positives): [count]
## RTL Audit
- [PASS / FAIL with notes]
## String Freeze
- [Active since [date] / Not active]
## Recommendation
[release / hold / partial release on covered locales]Ask before writing to production/localization/loc-report-[date].md.
Phase 9: Update State
Append to production/session-state/active.md:
## Localize — [date] — mode=[mode]
- Hardcoded strings remaining: [count]
- Locales: [N covered]/[N target]
- Freeze: [status]
- Report: [path or N/A]
- Next: [extract | translate | validate | freeze | release]Quality Gates / PASS-FAIL
- PASS — every target locale at 100% coverage; no source-equivalent values outside allowlist; no high-confidence hardcoded strings; RTL audit passes if RTL locales are in scope; freeze is active before release.
- FAIL — any of the above is unmet for a locale on the launch list.
Examples
Example 1 — RN app entering Spanish + French:
Scan finds 47 hardcoded strings, all extracted to en.json, es.json,
fr.json. Translators deliver es.json and fr.json. Validate
passes. Coverage 100% for both.
Example 2 — Pre-release freeze:
/localize --freeze snapshots en.json (412 keys), CI guardrail added.
Two days later a designer adds a new key without override; CI blocks
the PR.
Next Steps
- Translators behind -> escalate to localization-lead, possibly defer the locale from launch.
- Extract done -> hand the new key list to translation vendor.
- Freeze active -> any string change must go through
/architecture-decision-style approval log.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

