Internationalizing Websites
aiskillstore/marketplace
Adds multi-language support to Next.js websites with proper SEO configuration including hreflang tags, localized sitemaps, and language-specific content.
Add full internationalization (i18n) to a Next.js project using next-intl.
$ npx skills add OpenClaudia/openclaudia-skills --skill i18n -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install OpenClaudia/openclaudia-skills i18n --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/OpenClaudia/openclaudia-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/i18n .claude/skills/i18n && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "i18n" agent skill from https://github.com/OpenClaudia/openclaudia-skills/tree/main/skills/i18n into .claude/skills/i18n/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "i18n", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/OpenClaudia/openclaudia-skills/tree/main/skills/i18nType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add OpenClaudia/openclaudia-skills --skill i18n -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install OpenClaudia/openclaudia-skills i18n --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/OpenClaudia/openclaudia-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/i18n .agents/skills/i18n && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "i18n" agent skill from https://github.com/OpenClaudia/openclaudia-skills/tree/main/skills/i18n into .agents/skills/i18n/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "i18n", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add OpenClaudia/openclaudia-skills --skill i18n -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install OpenClaudia/openclaudia-skills i18n --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/OpenClaudia/openclaudia-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/i18n .cursor/skills/i18n && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "i18n" agent skill from https://github.com/OpenClaudia/openclaudia-skills/tree/main/skills/i18n into .cursor/skills/i18n/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "i18n", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/OpenClaudia/openclaudia-skills.git --path skills/i18n--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add OpenClaudia/openclaudia-skills --skill i18n -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install OpenClaudia/openclaudia-skills i18n --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/OpenClaudia/openclaudia-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/i18n .gemini/skills/i18n && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "i18n" agent skill from https://github.com/OpenClaudia/openclaudia-skills/tree/main/skills/i18n into .gemini/skills/i18n/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "i18n", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install OpenClaudia/openclaudia-skills i18nInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add OpenClaudia/openclaudia-skills --skill i18n -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/OpenClaudia/openclaudia-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/i18n .github/skills/i18n && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "i18n" agent skill from https://github.com/OpenClaudia/openclaudia-skills/tree/main/skills/i18n into .github/skills/i18n/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "i18n", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add OpenClaudia/openclaudia-skills --skill i18n -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install OpenClaudia/openclaudia-skills i18n --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/OpenClaudia/openclaudia-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/i18n .opencode/skills/i18n && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "i18n" agent skill from https://github.com/OpenClaudia/openclaudia-skills/tree/main/skills/i18n into .opencode/skills/i18n/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "i18n", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
i18nAdd full internationalization (i18n) to a Next.js project using next-intl.
I18n is an agent skill from OpenClaudia/openclaudia-skills. Add full internationalization (i18n) to a Next.js project using next-intl. Supports 14+ languages, SEO-friendly locale routing, hreflang sitemaps, and bulk translation. Use when the user asks to "internationalize", "add i18n", "add translations", "multi-language", "localize", "add language support", or "translate my site".
Its SKILL.md is about 2.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Frontend & Design, covering Internationalization, Translation and Technical SEO. It works with Next.js. The repository describes itself as: 77 open-source marketing skills for Claude Code, Codex, and other AI coding agents. SEO, content, email, ads, analytics, and growth. The licence is MIT.
11 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 28bf209. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
npmgitFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npm and git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
I18n loads about 2.3k tokens when it runs. Until then it costs about 82 tokens; SKILL.md has 631 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from OpenClaudia/openclaudia-skills at commit 28bf209, republished under its MIT licence (© OpenClaudia). 631 words, ~2,340 tokens.
.claude/skills/i18n/SKILL.md (or your agent's skills folder).Add complete internationalization to a Next.js (App Router) project using next-intl v4. This skill handles routing, translation files, sitemap hreflang, and bulk translation across all locales.
package.json) — must be 13+ with App Routernext-intl, next-i18next, [locale] routes)npm install next-intlCreate 4 files under src/i18n/:
src/i18n/config.tsexport const locales = ['en', 'es', 'fr', 'de', 'pt', 'ja', 'ar', 'zh', 'zh-tw', 'id', 'vi', 'ms', 'ru', 'hi'] as const
export type Locale = (typeof locales)[number]
export const defaultLocale: Locale = 'en'
export const localeNames: Record<Locale, string> = {
en: 'English',
es: 'Espanol',
fr: 'Francais',
de: 'Deutsch',
pt: 'Portugues',
ja: '日本語',
ar: 'العربية',
zh: '简体中文',
'zh-tw': '繁體中文',
id: 'Bahasa Indonesia',
vi: 'Tieng Viet',
ms: 'Bahasa Melayu',
ru: 'Русский',
hi: 'हिन्दी',
}
export const rtlLocales: Locale[] = ['ar']src/i18n/routing.tsimport { defineRouting } from 'next-intl/routing'
import { defaultLocale, locales } from './config'
export const routing = defineRouting({
locales,
defaultLocale,
localePrefix: 'as-needed', // English URLs stay clean, other locales get /es/, /fr/, etc.
})src/i18n/navigation.tsimport { createNavigation } from 'next-intl/navigation'
import { routing } from './routing'
export const { Link, redirect, usePathname, useRouter } = createNavigation(routing)src/i18n/request.tsimport { getRequestConfig } from 'next-intl/server'
import { routing } from './routing'
export default getRequestConfig(async ({ requestLocale }) => {
let locale = await requestLocale
if (!locale || !routing.locales.includes(locale as any)) {
locale = routing.defaultLocale
}
return {
locale,
messages: (await import(`../messages/${locale}.json`)).default,
}
})Create src/middleware.ts:
import createMiddleware from 'next-intl/middleware'
import { routing } from '@/i18n/routing'
export default createMiddleware({
...routing,
localeDetection: false, // Don't auto-redirect based on Accept-Language
})
export const config = {
matcher: ['/((?!_next|api|images|fonts|favicon|sitemap|robots).*)'],
}Key decision: localeDetection: false prevents auto-redirecting users based on browser language. This keeps English URLs stable for SEO. Users can manually switch languages via a language selector.
Wrap the existing config with createNextIntlPlugin:
import createNextIntlPlugin from 'next-intl/plugin'
const withNextIntl = createNextIntlPlugin('./src/i18n/request.ts')
// ... existing config ...
export default withNextIntl(nextConfig)[locale] Dynamic RouteMove all page content under src/app/[locale]/:
Create src/app/[locale]/layout.tsx with:
generateStaticParams() returning all localessetRequestLocale(locale) call<NextIntlClientProvider> wrapping children<html lang={locale} dir={rtlLocales.includes(locale) ? 'rtl' : 'ltr'}><link> tags in <head> for all locales + x-defaultMove existing pages into src/app/[locale]/
Each page should call setRequestLocale(locale) for static generation
Create src/messages/en.json with all user-facing strings organized by section:
{
"common": { "signIn": "Sign In", ... },
"tools": { "tool-slug": { "title": "...", "description": "..." } },
"faq": { "tool-slug": [{ "question": "...", "answer": "..." }] }
}Replace all hardcoded strings in components with useTranslations():
const t = useTranslations('common')
return <button>{t('signIn')}</button>For server components, use getTranslations():
const t = await getTranslations('common')For each non-English locale, create src/messages/{locale}.json with the same structure as en.json.
Use parallel Codex agents via the codex-tasks skill to save Claude credits:
/codex-tasksen.json, translates all strings, writes {locale}.jsonen.json content (or path to read it){count}, {name} unchangedsrc/messages/{locale}.jsonAfter translation, run a verification script to catch issues:
import json
locales = ['es', 'fr', 'de', 'pt', 'ja', 'ar', 'zh', 'zh-tw', 'id', 'vi', 'ms', 'ru', 'hi']
english_words = ['the ', 'and ', 'you ', 'your ', 'our ', 'this ', 'that ', 'with ', 'from ', 'will ']
with open('src/messages/en.json') as f:
en = json.load(f)
for loc in locales:
with open(f'src/messages/{loc}.json') as f:
data = json.load(f)
# Check: missing sections
missing = [s for s in en if s not in data]
# Check: residual English content
eng_count = 0
def check(d):
nonlocal eng_count # won't work in inline script; use list trick
if isinstance(d, dict):
for v in d.values(): check(v)
elif isinstance(d, str):
if sum(1 for w in english_words if w in d.lower()) >= 3:
eng_count += 1
check(data)
status = 'OK' if not missing and eng_count == 0 else 'ISSUES'
print(f'{loc}: {status} (missing={len(missing)}, english={eng_count})')Update src/app/sitemap.ts to include hreflang alternates:
import { MetadataRoute } from 'next'
import { locales } from '@/i18n/config'
const baseUrl = 'https://www.example.com'
function buildAlternates(path: string): Record<string, string> {
const alternates: Record<string, string> = {}
for (const locale of locales) {
const prefix = locale === 'en' ? '' : `/${locale}`
alternates[locale] = `${baseUrl}${prefix}${path}`
}
return alternates
}
export default function sitemap(): MetadataRoute.Sitemap {
return pages.map((path) => ({
url: `${baseUrl}${path}`,
lastModified: new Date(),
alternates: { languages: buildAlternates(path) },
}))
}Important: Generate one canonical URL per page with hreflang alternates, NOT one URL per locale. This prevents duplicate content in search results.
Add a language switcher component that uses useRouter and usePathname from @/i18n/navigation to switch locales while preserving the current path.
npm run build — check that all static pages generate correctlyhttps://example.com/toolshttps://example.com/es/toolspublic/sitemap.xml conflicts with dynamic src/app/sitemap.ts in dev mode — delete the static one or rename it_next, api, sitemap, robots, and static asset pathslocalePrefix: 'as-needed' is critical — it keeps default locale URLs clean for SEO continuitylocaleDetection: false prevents unwanted redirects that break SEO and confuse usersgit config http.postBuffer 524288000© OpenClaudia, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/i18n of OpenClaudia/openclaudia-skills.
Open the folder on GitHubat commit 28bf209
I18n next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| I18n this skillOpenClaudia/openclaudia-skills | 713 | — | ~2.3k | Automated safety check: Pass | MIT | |
| Internationalizing Websitesaiskillstore/marketplace | 430 | 2 repos | ~2k | Automated safety check: Pass | None | |
| Readme I18nY80/bmm | 344 | 2 repos | ~1.9k | Automated safety check: Pass | MIT | |
| Builder UI I18nChatbotXIO/ChatbotX | 881 | — | ~2.1k | Automated safety check: Pass | Custom licence | |
| Localize Campaignindranilbanerjee/digital-marketing-pro | 859 | 1 repos | ~3.7k | Automated safety check: Pass | MIT | |
| Chatbox i18n Translatorchatboxai/chatbox | 42k | — | ~508 | Automated safety check: Pass | GPL-3.0 |
aiskillstore/marketplace
Adds multi-language support to Next.js websites with proper SEO configuration including hreflang tags, localized sitemaps, and language-specific content.
Y80/bmm
A skill your agent uses when the user wants to translate a repository README, make a repo multilingual, localize docs, add a language switcher, internationalize the README, or update localized…
ChatbotXIO/ChatbotX
Build or modify ChatbotX builder UI components, forms, tables, dialogs, shared UI usage, and translations.
indranilbanerjee/digital-marketing-pro
Localize an entire campaign — emails, ads, social posts, landing pages, video scripts — for multiple markets, producing a deployment-ready per-market package: translations, transcreation options for…
chatboxai/chatbox
Translates new or changed i18n keys from a Chatbox Pro diff, staged changes or a commit range, writing the locale JSON files directly with a built-in glossary.
iOfficeAI/AionUi
Standards for keeping all user-facing text translatable: read the i18n config first, use namespaced keys, reuse shared strings and follow the key naming rules.
OpenClaudia/openclaudia-skills
Build an interactive competitive-traffic report for any company and its rivals — monthly visits (SimilarWeb), organic search traffic and Domain Rating (Ahrefs) — as one self-contained HTML page with…
OpenClaudia/openclaudia-skills
Score how hard a keyword is to rank for in the AI-search era — page-level URL Rating of real competitors (not just domain DR), Ahrefs keyword difficulty, and whether a given site already ranks or is…
OpenClaudia/openclaudia-skills
Audit EVERY Google Search Console property at once — rank all sites by clicks and impressions with period-over-period deltas, then diff keywords per site to surface what is newly ranking, rising…
OpenClaudia/openclaudia-skills
Fetch website traffic estimates (monthly visits, traffic sources, top countries, keywords, engagement, ranks) for any domain from SimilarWeb.
OpenClaudia/openclaudia-skills
Manages Ahrefs API usage in Python using ahrefs-python library.
OpenClaudia/openclaudia-skills
Design, plan, and analyze A/B tests with statistical rigor. An agent skill from OpenClaudia/openclaudia-skills.
Works with
Categories
Add full internationalization (i18n) to a Next.js project using next-intl. I18n is an agent skill from OpenClaudia/openclaudia-skills.js project using next-intl.
I18n fits situations like: the user asks to internationalize; add translations; add language support; translate my site.
Run `npx skills add OpenClaudia/openclaudia-skills --skill i18n -a claude-code`. Or copy the skill folder (skills/i18n in OpenClaudia/openclaudia-skills) into .claude/skills/i18n in your project. Claude Code loads it when a task matches its description.
Run `npx skills add OpenClaudia/openclaudia-skills --skill i18n -a codex`. Or copy the skill folder (skills/i18n in OpenClaudia/openclaudia-skills) into .agents/skills/i18n in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add OpenClaudia/openclaudia-skills --skill i18n -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/i18n, .gemini/skills/i18n, .github/skills/i18n and .opencode/skills/i18n in your project.
Going by SKILL.md and its folder, I18n needs the command-line tools its instructions call (npm and git). Our summary lists: Python 3; Node.js.
SKILL.md contains no URLs. Its commands use npm and git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
I18n is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.3k tokens (SKILL.md is roughly 9.4k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with I18n: Internationalizing Websites (aiskillstore/marketplace, 430 stars), Readme I18n (Y80/bmm, 344 stars), Builder UI I18n (ChatbotXIO/ChatbotX, 881 stars) and Localize Campaign (indranilbanerjee/digital-marketing-pro, 859 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
OpenClaudia (a GitHub organization) maintains it in OpenClaudia/openclaudia-skills, which has 713 GitHub stars. The repository holds 74 skills in this directory. The repository was last updated on September 18, 2026.
Source: OpenClaudia/openclaudia-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.