Internationalization

Plan and run a multi-language or multi-region site.

Internationalization — Creative Direction skill highlight diagram. Navy header card reads 'Impactful Creative Direction' with the subtitle… (from the rampstackco/claude-skills README)

From the rampstackco/claude-skills README — shows the whole collection, not only this skill. · view on GitHub

How to use it

Claude Code
  1. Run the line below. It pulls the whole folder into ~/.claude/skills/internationalization.
  2. Describe your job in plain words. Claude Code follows the skill from there.
Claude Code — installs the whole folder, not just SKILL.md
npx degit rampstackco/claude-skills/skills/internationalization#main ~/.claude/skills/internationalization

For one project only, change the path to .claude/skills/internationalization.

Claude (web or desktop app)
  1. On this page open ⋯ → Download .md.
  2. Save it as SKILL.md in a folder, zip the folder, then Customize → Skills → + → Create skill → Upload a skill.
  3. Pick the file and Save. Claude shows the name and description and runs a security scan.
  4. Check the skill is switched on.
  5. Start a new chat and describe your job in plain words. The AI follows the skill from there.
ChatGPT or another app
  1. ChatGPT: make a Project and paste it into Instructions.
  2. Neither? Paste it at the top of a new chat — it works for that chat.
Not working?
  • Check which app you pasted it into — the steps above name the right one.
  • Some skills need the paid tier of Claude or ChatGPT.
Step-by-step guide with screenshots · Ask in the forum

Paste into Claude, ChatGPT or Cursor.

Source of Internationalization

Show the full text279 lines
namedescriptioncategorycatalog_summarydisplay_order
internationalizationPlan and run a multi-language or multi-region site. Use this skill when adding new locales, choosing URL structure for languages (subfolders vs subdomains vs ccTLDs), implementing hreflang, planning translation workflow, handling currency and date formats, designing for RTL languages, or auditing a stalled internationalization rollout. Triggers on internationalization, i18n, localization, l10n, hreflang, multi-language, translation workflow, RTL, locale, ccTLD, subfolder vs subdomain, language switcher. Also triggers when international audiences underperform or translations are stale.cross-cuttingLocale strategy, hreflang, translation workflow, RTL design3

Internationalization

Add languages and regions in a way that works for users, search engines, and the team maintaining the content. Stack-agnostic.


When to use

  • Adding the first non-English (or non-default) language
  • Adding additional locales to an existing internationalized site
  • Choosing URL structure for languages
  • Implementing hreflang tags
  • Designing translation workflow
  • Handling currency, date, time, and number formats
  • Designing or fixing layout for RTL languages
  • Auditing an internationalization rollout that's underperforming

When NOT to use

  • Single-language site (use other skills)
  • Domain strategy that's not language-driven (use domain-strategy)
  • Content strategy independent of locale (use content-strategy)
  • Marketing copy production (use content-and-copy)

Required inputs

  • The locales in scope (language + region, e.g., en-US, de-DE, fr-CA)
  • Business reason per locale (priority, audience size)
  • Existing site architecture
  • Translation resources (in-house, agency, AI-assisted, community)
  • Content volume and update frequency

The framework: 5 layers

Internationalization touches everything. Five layers, each with their own decisions.

Layer 1: URL structure

How locales are reflected in URLs.

Pattern Example When
ccTLD example.de, example.fr Strong country focus, distinct legal entities, willing to maintain separate domains
Subdomain de.example.com, fr.example.com Logical separation, willing to host separately, common for large sites
Subfolder example.com/de/, example.com/fr/ SEO equity unified, simplest to manage, default for most
URL parameter example.com?lang=de Avoid; weak SEO signal

For most sites: subfolder is the default. Subdomain or ccTLD only when there's a specific reason (legal, infrastructure, or brand).

Within the chosen pattern, decide:

  • Language only (/de/) or language plus region (/de-de/, /de-at/, /de-ch/)?
  • Default locale: at the apex (example.com) or in a folder (example.com/en/)?

The default-locale-at-apex pattern is common but causes hreflang complexity (the apex needs an x-default and the canonical for the default language).

Layer 2: Content structure

How content is organized across locales.

Pattern A: Mirror. Every page in every locale. The translation IS the page. Suitable for marketing sites with controlled content.

Pattern B: Subset. Some content in all locales, some only in select locales. Common for product pages (only available products), blog (some posts translated), or regulatory differences.

Pattern C: Local. Each locale has its own content largely independent of other locales. Common for media or community sites.

Most marketing sites are A. Most large sites end up at B by necessity. C is for sites with strong regional editorial.

The pattern affects:

  • How content models are designed (does each piece have parent/translation relationships?)
  • How translation is managed (workflow assumes the structure)
  • How the team coordinates
Layer 3: hreflang and canonicals

Telling search engines what's translated vs distinct.

hreflang specifies the language and optional region for each version.

<link rel="alternate" hreflang="en-US" href="https://example.com/en-us/page">
<link rel="alternate" hreflang="en-GB" href="https://example.com/en-gb/page">
<link rel="alternate" hreflang="de-DE" href="https://example.com/de-de/page">
<link rel="alternate" hreflang="x-default" href="https://example.com/en-us/page">

Rules:

  • Every page lists every translated equivalent (including itself)
  • Pages must reciprocate (page A says page B is its German version; page B says page A is its English version)
  • x-default is the fallback for users in unspecified regions
  • Each page has its own canonical pointing to itself (not to the default language)

hreflang can be in the HTML head, in HTTP headers, or in the XML sitemap. Sitemap is best for large sites; HTML head is fine for small.

Canonicals:

  • Self-referential per page
  • Don't canonical the German page to the English page (search engines won't index the German page)
Layer 4: Translation workflow

How content gets translated, kept fresh, and quality-controlled.

Sources of translation:

  • In-house translators (full-time staff)
  • Translation agency (paid per word, professional)
  • Community contributors (volunteer, variable quality, free)
  • AI-assisted plus human review (cheap, fast, growing in quality)
  • AI only (acceptable for some content, not for brand-critical)

Workflow stages:

  1. Source content authored in the source language
  2. Translation requested through a TMS (translation management system) or spreadsheet
  3. Translation produced with translation memory (avoids retranslating reused phrases)
  4. Review by a second translator or in-region staff
  5. Localization beyond translation (currency, units, examples, cultural references)
  6. Publishing in the destination locale
  7. Update propagation when source content changes

The TMS pays off above ~10K words of total content. Below that, spreadsheets and disciplined naming are fine.

Update propagation is the hardest part. Source content changes. Translations go stale. Without a process, you end up with locales drifting from the source.

Layer 5: Locale-aware UX

Beyond translation, the experience must adapt.

Currency: display in the local currency where applicable. EUR for European locales, JPY for Japanese, etc. Don't show USD to French users for a French-locale page.

Numbers: thousand separators and decimals differ. 1,000.50 in en-US is 1.000,50 in de-DE.

Dates and times: format and order vary. MM/DD/YYYY in en-US, DD/MM/YYYY in en-GB, YYYY-MM-DD (ISO) is universal but unfamiliar to many.

Names and addresses: field order and required components differ. Country-aware address forms.

Phone numbers: E.164 international format universally; display formatting per locale.

Units: metric vs imperial. Most of the world is metric; the US is imperial. Some products serve both.

Right-to-left (RTL) languages: Arabic, Hebrew, Persian, Urdu. Layout flips: navigation moves right, text aligns right, icons that imply direction may flip too. CSS logical properties (margin-inline-start instead of margin-left) make this manageable.

Language switcher: prominent but not intrusive. Show locale names in their own language ("Deutsch" not "German"). Persist the choice. Don't auto-redirect based on browser language without offering a way back.

Cultural sensitivity: colors, imagery, examples, references that don't translate. Avoid hand gestures in product imagery. Avoid country-specific references unless localized.


Workflow

Step 1: Decide which locales

Don't add languages just because you can. Each locale has ongoing maintenance cost.

  • Audience research: where are visitors and prospects?
  • Business priority: which markets are growth targets?
  • Content readiness: do you have the resources to maintain it?
  • Legal: do regulations require localization (GDPR, accessibility laws)?
Step 2: Pick URL structure

Subfolder for most. Document the choice and rationale.

Step 3: Pick content structure

Mirror, subset, or local. Be honest about what's sustainable.

Step 4: Set up hreflang and canonicals

Implement before launching the second locale, even if it's just one extra page.

Step 5: Set up translation workflow

Pick a TMS or spreadsheet system. Document the workflow. Designate translators and reviewers.

Step 6: Localize beyond translation

For each locale:

  • Currency, numbers, dates, units
  • Locale-specific images if needed
  • Address forms
  • Customer service hours and contact
Step 7: Implement language switcher
  • Prominent in the header or footer
  • Shows the current locale clearly
  • Lists all available locales in their own language
  • Persists the choice (cookie or local storage)
  • Doesn't auto-redirect based on browser; suggests instead
Step 8: Test
  • Each locale renders correctly
  • hreflang links are valid (use a checker)
  • Canonicals are self-referential per page
  • Currency and dates are correct
  • RTL layout is correct (for RTL locales)
  • Language switcher works and persists
  • Search-engine perspective: each locale is crawlable and indexable
Step 9: Launch and monitor

Per locale:

  • Indexing rate
  • Traffic from intended geographies
  • Engagement metrics in the locale
  • Translation freshness (when did source content change without translation update?)
Step 10: Maintain
  • Translation update cadence (when source changes, when translations follow)
  • Quarterly review of locale performance
  • Sunset locales that aren't viable (better than maintaining a dead locale poorly)

Failure patterns

Auto-redirect based on browser language. User is in Germany, prefers English. Site forces German. Frustrating. Suggest, don't redirect.

Single canonical to default language. Search engines can't index the translations. Self-canonical per page.

Reciprocal hreflang missing. German page lists English as its translation, English page doesn't list German. Search engines treat the relationship as unconfirmed.

hreflang language without region when region matters. hreflang="es" is fine if there's one Spanish version. If you have es-ES (Spain) and es-MX (Mexico), use both with regions.

Auto-translated content treated as final. Machine translation is an acceptable starting point. Human review is necessary for any user-facing content.

Currency baked into copy. "$99/month" in body text breaks for European users. Use templated currency that adapts.

Hardcoded date formats. "January 5, 2024" in code. Doesn't adapt. Use a date formatting library that respects locale.

Field labels left in source language. Translated body, untranslated form labels. Inconsistent. Translate UI strings as part of localization.

Untranslated error messages. User submits a form, gets an error in English on a French page. Frustrating. Translate UI states.

Untranslated emails. Site is in French; transactional emails are English. Translate emails to match.

Forgotten locales in CMS. Editors forget to update one locale. Drift. Use a TMS or workflow that surfaces drift.

Locale switcher that doesn't work mid-flow. User is on the German checkout, switches to French, lands on French homepage. Try to land on the same page in the new locale.

RTL layouts that don't actually flip. Margin and padding hardcoded for LTR. Use CSS logical properties.

Sunset language without redirect. Discontinuing French; old French URLs 404. Redirect to the closest equivalent in another supported language.


Output format

An internationalization plan includes:

  • Locale list: with priority and audience rationale
  • URL structure: chosen pattern and reason
  • Content structure: mirror, subset, or local
  • hreflang plan: how it's implemented
  • Translation workflow: sources, stages, tools
  • Localization checklist: beyond translation (currency, dates, etc.)
  • Language switcher design: position, behavior, persistence
  • Test plan: what's verified per locale
  • Maintenance plan: update cadence, drift detection

Reference files

  • references/locale-checklist.md: Per-locale checklist of everything that needs to adapt beyond translation, organized by category (URL, content, UX, format, legal).
1---
2name: internationalization
3description: "Plan and run a multi-language or multi-region site. Use this skill when adding new locales, choosing URL structure for languages (subfolders vs subdomains vs ccTLDs), implementing hreflang, planning translation workflow, handling currency and date formats, designing for RTL languages, or auditing a stalled internationalization rollout. Triggers on internationalization, i18n, localization, l10n, hreflang, multi-language, translation workflow, RTL, locale, ccTLD, subfolder vs subdomain, language switcher. Also triggers when international audiences underperform or translations are stale."
4category: cross-cutting
5catalog_summary: "Locale strategy, hreflang, translation workflow, RTL design"
6display_order: 3
7---
8 
9# Internationalization
10 
11Add languages and regions in a way that works for users, search engines, and the team maintaining the content. Stack-agnostic.
12 
13---
14 
15## When to use
16 
17- Adding the first non-English (or non-default) language
18- Adding additional locales to an existing internationalized site
19- Choosing URL structure for languages
20- Implementing hreflang tags
21- Designing translation workflow
22- Handling currency, date, time, and number formats
23- Designing or fixing layout for RTL languages
24- Auditing an internationalization rollout that's underperforming
25 
26## When NOT to use
27 
28- Single-language site (use other skills)
29- Domain strategy that's not language-driven (use `domain-strategy`)
30- Content strategy independent of locale (use `content-strategy`)
31- Marketing copy production (use `content-and-copy`)
32 
33---
34 
35## Required inputs
36 
37- The locales in scope (language + region, e.g., `en-US`, `de-DE`, `fr-CA`)
38- Business reason per locale (priority, audience size)
39- Existing site architecture
40- Translation resources (in-house, agency, AI-assisted, community)
41- Content volume and update frequency
42 
43---
44 
45## The framework: 5 layers
46 
47Internationalization touches everything. Five layers, each with their own decisions.
48 
49### Layer 1: URL structure
50 
51How locales are reflected in URLs.
52 
53| Pattern | Example | When |
54|---|---|---|
55| ccTLD | example.de, example.fr | Strong country focus, distinct legal entities, willing to maintain separate domains |
56| Subdomain | de.example.com, fr.example.com | Logical separation, willing to host separately, common for large sites |
57| Subfolder | example.com/de/, example.com/fr/ | SEO equity unified, simplest to manage, default for most |
58| URL parameter | example.com?lang=de | Avoid; weak SEO signal |
59 
60For most sites: subfolder is the default. Subdomain or ccTLD only when there's a specific reason (legal, infrastructure, or brand).
61 
62Within the chosen pattern, decide:
63- Language only (`/de/`) or language plus region (`/de-de/`, `/de-at/`, `/de-ch/`)?
64- Default locale: at the apex (`example.com`) or in a folder (`example.com/en/`)?
65 
66The default-locale-at-apex pattern is common but causes hreflang complexity (the apex needs an `x-default` and the canonical for the default language).
67 
68### Layer 2: Content structure
69 
70How content is organized across locales.
71 
72**Pattern A: Mirror.** Every page in every locale. The translation IS the page. Suitable for marketing sites with controlled content.
73 
74**Pattern B: Subset.** Some content in all locales, some only in select locales. Common for product pages (only available products), blog (some posts translated), or regulatory differences.
75 
76**Pattern C: Local.** Each locale has its own content largely independent of other locales. Common for media or community sites.
77 
78Most marketing sites are A. Most large sites end up at B by necessity. C is for sites with strong regional editorial.
79 
80The pattern affects:
81- How content models are designed (does each piece have parent/translation relationships?)
82- How translation is managed (workflow assumes the structure)
83- How the team coordinates
84 
85### Layer 3: hreflang and canonicals
86 
87Telling search engines what's translated vs distinct.
88 
89**hreflang** specifies the language and optional region for each version.
90 
91```html
92<link rel="alternate" hreflang="en-US" href="https://example.com/en-us/page">
93<link rel="alternate" hreflang="en-GB" href="https://example.com/en-gb/page">
94<link rel="alternate" hreflang="de-DE" href="https://example.com/de-de/page">
95<link rel="alternate" hreflang="x-default" href="https://example.com/en-us/page">
96```
97 
98Rules:
99- Every page lists every translated equivalent (including itself)
100- Pages must reciprocate (page A says page B is its German version; page B says page A is its English version)
101- `x-default` is the fallback for users in unspecified regions
102- Each page has its own canonical pointing to itself (not to the default language)
103 
104hreflang can be in the HTML head, in HTTP headers, or in the XML sitemap. Sitemap is best for large sites; HTML head is fine for small.
105 
106**Canonicals:**
107- Self-referential per page
108- Don't canonical the German page to the English page (search engines won't index the German page)
109 
110### Layer 4: Translation workflow
111 
112How content gets translated, kept fresh, and quality-controlled.
113 
114**Sources of translation:**
115- In-house translators (full-time staff)
116- Translation agency (paid per word, professional)
117- Community contributors (volunteer, variable quality, free)
118- AI-assisted plus human review (cheap, fast, growing in quality)
119- AI only (acceptable for some content, not for brand-critical)
120 
121**Workflow stages:**
122 
1231. **Source content authored** in the source language
1242. **Translation requested** through a TMS (translation management system) or spreadsheet
1253. **Translation produced** with translation memory (avoids retranslating reused phrases)
1264. **Review** by a second translator or in-region staff
1275. **Localization** beyond translation (currency, units, examples, cultural references)
1286. **Publishing** in the destination locale
1297. **Update propagation** when source content changes
130 
131The TMS pays off above ~10K words of total content. Below that, spreadsheets and disciplined naming are fine.
132 
133**Update propagation is the hardest part.** Source content changes. Translations go stale. Without a process, you end up with locales drifting from the source.
134 
135### Layer 5: Locale-aware UX
136 
137Beyond translation, the experience must adapt.
138 
139**Currency:** display in the local currency where applicable. EUR for European locales, JPY for Japanese, etc. Don't show USD to French users for a French-locale page.
140 
141**Numbers:** thousand separators and decimals differ. `1,000.50` in en-US is `1.000,50` in de-DE.
142 
143**Dates and times:** format and order vary. `MM/DD/YYYY` in en-US, `DD/MM/YYYY` in en-GB, `YYYY-MM-DD` (ISO) is universal but unfamiliar to many.
144 
145**Names and addresses:** field order and required components differ. Country-aware address forms.
146 
147**Phone numbers:** E.164 international format universally; display formatting per locale.
148 
149**Units:** metric vs imperial. Most of the world is metric; the US is imperial. Some products serve both.
150 
151**Right-to-left (RTL) languages:** Arabic, Hebrew, Persian, Urdu. Layout flips: navigation moves right, text aligns right, icons that imply direction may flip too. CSS logical properties (`margin-inline-start` instead of `margin-left`) make this manageable.
152 
153**Language switcher:** prominent but not intrusive. Show locale names in their own language ("Deutsch" not "German"). Persist the choice. Don't auto-redirect based on browser language without offering a way back.
154 
155**Cultural sensitivity:** colors, imagery, examples, references that don't translate. Avoid hand gestures in product imagery. Avoid country-specific references unless localized.
156 
157---
158 
159## Workflow
160 
161### Step 1: Decide which locales
162 
163Don't add languages just because you can. Each locale has ongoing maintenance cost.
164 
165- Audience research: where are visitors and prospects?
166- Business priority: which markets are growth targets?
167- Content readiness: do you have the resources to maintain it?
168- Legal: do regulations require localization (GDPR, accessibility laws)?
169 
170### Step 2: Pick URL structure
171 
172Subfolder for most. Document the choice and rationale.
173 
174### Step 3: Pick content structure
175 
176Mirror, subset, or local. Be honest about what's sustainable.
177 
178### Step 4: Set up hreflang and canonicals
179 
180Implement before launching the second locale, even if it's just one extra page.
181 
182### Step 5: Set up translation workflow
183 
184Pick a TMS or spreadsheet system. Document the workflow. Designate translators and reviewers.
185 
186### Step 6: Localize beyond translation
187 
188For each locale:
189- Currency, numbers, dates, units
190- Locale-specific images if needed
191- Address forms
192- Customer service hours and contact
193 
194### Step 7: Implement language switcher
195 
196- Prominent in the header or footer
197- Shows the current locale clearly
198- Lists all available locales in their own language
199- Persists the choice (cookie or local storage)
200- Doesn't auto-redirect based on browser; suggests instead
201 
202### Step 8: Test
203 
204- Each locale renders correctly
205- hreflang links are valid (use a checker)
206- Canonicals are self-referential per page
207- Currency and dates are correct
208- RTL layout is correct (for RTL locales)
209- Language switcher works and persists
210- Search-engine perspective: each locale is crawlable and indexable
211 
212### Step 9: Launch and monitor
213 
214Per locale:
215- Indexing rate
216- Traffic from intended geographies
217- Engagement metrics in the locale
218- Translation freshness (when did source content change without translation update?)
219 
220### Step 10: Maintain
221 
222- Translation update cadence (when source changes, when translations follow)
223- Quarterly review of locale performance
224- Sunset locales that aren't viable (better than maintaining a dead locale poorly)
225 
226---
227 
228## Failure patterns
229 
230**Auto-redirect based on browser language.** User is in Germany, prefers English. Site forces German. Frustrating. Suggest, don't redirect.
231 
232**Single canonical to default language.** Search engines can't index the translations. Self-canonical per page.
233 
234**Reciprocal hreflang missing.** German page lists English as its translation, English page doesn't list German. Search engines treat the relationship as unconfirmed.
235 
236**hreflang language without region when region matters.** `hreflang="es"` is fine if there's one Spanish version. If you have es-ES (Spain) and es-MX (Mexico), use both with regions.
237 
238**Auto-translated content treated as final.** Machine translation is an acceptable starting point. Human review is necessary for any user-facing content.
239 
240**Currency baked into copy.** "$99/month" in body text breaks for European users. Use templated currency that adapts.
241 
242**Hardcoded date formats.** "January 5, 2024" in code. Doesn't adapt. Use a date formatting library that respects locale.
243 
244**Field labels left in source language.** Translated body, untranslated form labels. Inconsistent. Translate UI strings as part of localization.
245 
246**Untranslated error messages.** User submits a form, gets an error in English on a French page. Frustrating. Translate UI states.
247 
248**Untranslated emails.** Site is in French; transactional emails are English. Translate emails to match.
249 
250**Forgotten locales in CMS.** Editors forget to update one locale. Drift. Use a TMS or workflow that surfaces drift.
251 
252**Locale switcher that doesn't work mid-flow.** User is on the German checkout, switches to French, lands on French homepage. Try to land on the same page in the new locale.
253 
254**RTL layouts that don't actually flip.** Margin and padding hardcoded for LTR. Use CSS logical properties.
255 
256**Sunset language without redirect.** Discontinuing French; old French URLs 404. Redirect to the closest equivalent in another supported language.
257 
258---
259 
260## Output format
261 
262An internationalization plan includes:
263 
264- **Locale list:** with priority and audience rationale
265- **URL structure:** chosen pattern and reason
266- **Content structure:** mirror, subset, or local
267- **hreflang plan:** how it's implemented
268- **Translation workflow:** sources, stages, tools
269- **Localization checklist:** beyond translation (currency, dates, etc.)
270- **Language switcher design:** position, behavior, persistence
271- **Test plan:** what's verified per locale
272- **Maintenance plan:** update cadence, drift detection
273 
274---
275 
276## Reference files
277 
278- [`references/locale-checklist.md`](references/locale-checklist.md): Per-locale checklist of everything that needs to adapt beyond translation, organized by category (URL, content, UX, format, legal).
279 

Discussion

Alternatives

Also in SEO & keywordsSee all 364 in Marketing →