Best for
- Adding the first non-English (or non-default) language
- Adding additional locales to an existing internationalized site
- Choosing URL structure for languages
rampstackco/claude-skills/skills/internationalization/SKILL.md
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 s
Decision brief
Add languages and regions in a way that works for users, search engines, and the team maintaining the content. Stack-agnostic.
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/rampstackco/claude-skills --skill "skills/internationalization"Inspect the Agent Skill "internationalization" from https://github.com/rampstackco/claude-skills/blob/a67dd34c609f034c0cfd736a348659bbdf1605bf/skills/internationalization/SKILL.md at commit a67dd34c609f034c0cfd736a348659bbdf1605bf. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
How content gets translated, kept fresh, and quality-controlled.
Don't add languages just because you can. Each locale has ongoing maintenance cost.
Don't add languages just because you can. Each locale has ongoing maintenance cost.
Subfolder for most. Document the choice and rationale.
Mirror, subset, or local. Be honest about what's sustainable.
Permission review
The documentation includes network, browsing, or remote request actions.
<link rel="alternate" hreflang="en-US" href="https://example.com/en-us/page">The documentation includes network, browsing, or remote request actions.
<link rel="alternate" hreflang="en-GB" href="https://example.com/en-gb/page">Evidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 91/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 779 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
Add languages and regions in a way that works for users, search engines, and the team maintaining the content. Stack-agnostic.
domain-strategy)content-strategy)content-and-copy)en-US, de-DE, fr-CA)Internationalization touches everything. Five layers, each with their own decisions.
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:
/de/) or language plus region (/de-de/, /de-at/, /de-ch/)?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).
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:
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:
x-default is the fallback for users in unspecified regionshreflang 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:
How content gets translated, kept fresh, and quality-controlled.
Sources of translation:
Workflow stages:
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.
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.
Don't add languages just because you can. Each locale has ongoing maintenance cost.
Subfolder for most. Document the choice and rationale.
Mirror, subset, or local. Be honest about what's sustainable.
Implement before launching the second locale, even if it's just one extra page.
Pick a TMS or spreadsheet system. Document the workflow. Designate translators and reviewers.
For each locale:
Per locale:
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.
An internationalization plan includes:
references/locale-checklist.md: Per-locale checklist of everything that needs to adapt beyond translation, organized by category (URL, content, UX, format, legal).Frequently asked questions
Add languages and regions in a way that works for users, search engines, and the team maintaining the content. Stack-agnostic.
The source record exposes this install command: npx skills add https://github.com/rampstackco/claude-skills --skill "skills/internationalization". Inspect the command and pinned source before running it.
Static rules flagged network in the source; the page lists the matching lines and excerpts.
Alternatives
open-edge-platform/edge-ai-libraries
Deploy Chat Question-and-Answer Core to Kubernetes using Helm (OpenVINO CPU, OpenVINO GPU, or Ollama), including values.yaml configuration, helm install/upgrade, deployment verification, uninstall, and translation from Docker Compose setup_env.sh variables into Helm override values. Use this skill when the user says "deploy chatqna core to kubernetes", "helm install chatqna-core", "configure values.yaml", "convert compose config to helm", or "translate setup_env.sh to chart values".
wshobson/agents
Brand-first landing page designer — runs a brand-identity interview (colors, typography, shape language), then generates and iterates on a polished landing page via Stitch with deployment-ready HTML. Use when the user asks to create, design, or build a landing page, homepage, or marketing page and has no established visual direction. Skip when they have a design mockup, need a dashboard or app UI, are working at component level, building a multi-page app, or restyling with known design tokens —
aAAaqwq/AGI-Super-Team
Translates Figma designs into production-ready application code with 1:1 visual fidelity. Use when implementing UI code from Figma files, when user mentions "implement design", "generate code", "implement component", provides Figma URLs, or asks to build components matching Figma specs. For Figma canvas writes via `use_figma`, use `figma-use`.
Postpartum-genushyacinthus29/dotnet-skills
Design, tune, or review EF Core data access with proper modeling, migrations, query translation, performance, and lifetime management for modern .NET applications.