Automate internationalization and localization workflows for web applications with translation, key generation, and library setup
/plugin marketplace add DNYoussef/context-cascade/plugin install dnyoussef-context-cascade@DNYoussef/context-cascadeThis skill inherits all available tools. When active, it can use any tool Claude has access to.
examples/multi-language-workflow.tsexamples/react-i18n-setup.tsxexamples/translation-automation.pyi18n-automation-process.dotreadme.mdresources/i18n-config.jsonresources/i18n-setup.pyresources/key-generator.jsresources/locale-template.jsonresources/locale-validator.shresources/translation-extractor.pyresources/translation-workflow.yamltests/test-extraction.jstests/test-integration.jstests/test-validation.jsAutomate complete internationalization workflows including translation, key-value generation, library installation, and locale configuration for web applications.
I am an internationalization specialist with expertise in:
Next.js (Recommended: next-intl):
// Installation
npm install next-intl
// Configuration: next.config.js
const createNextIntlPlugin = require('next-intl/plugin');
const withNextIntl = createNextIntlPlugin();
module.exports = withNextIntl({
i18n: {
locales: ['en', 'ja', 'es', 'fr'],
defaultLocale: 'en'
}
});
// File structure
/messages
/en.json
/ja.json
/es.json
/fr.json
React (Recommended: react-i18next):
// Installation
npm install react-i18next i18next
// Configuration: i18n.js
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
i18n
.use(initReactI18next)
.init({
resources: {
en: { translation: require('./locales/en.json') },
ja: { translation: require('./locales/ja.json') }
},
lng: 'en',
fallbackLng: 'en',
interpolation: { escapeValue: false }
});
Vue (Recommended: vue-i18n):
// Installation
npm install vue-i18n
// Configuration
import { createI18n } from 'vue-i18n';
const i18n = createI18n({
locale: 'en',
messages: {
en: require('./locales/en.json'),
ja: require('./locales/ja.json')
}
});
Namespace Organization:
{
"common": {
"buttons": {
"submit": "Submit",
"cancel": "Cancel",
"save": "Save"
},
"errors": {
"required": "This field is required",
"invalid_email": "Invalid email address"
}
},
"landing": {
"hero": {
"title": "Welcome to Our Product",
"subtitle": "The best solution for your needs",
"cta": "Get Started"
},
"features": {
"feature1_title": "Fast Performance",
"feature1_desc": "Lightning-fast response times"
}
},
"pricing": {
"tiers": {
"free": "Free",
"pro": "Pro",
"enterprise": "Enterprise"
}
}
}
Flat vs Nested Keys:
// Nested (Recommended for organization)
{
"user": {
"profile": {
"title": "Profile",
"edit": "Edit Profile"
}
}
}
// Flat (Simpler, some libraries prefer)
{
"user.profile.title": "Profile",
"user.profile.edit": "Edit Profile"
}
Strategy 1: Professional Translation
Strategy 2: AI Translation (Good for MVP)
Strategy 3: Community Translation
Strategy 4: Hybrid
Japanese (ja):
{
"formality": {
"casual": "ありがとう",
"polite": "ありがとうございます",
"honorific": "ありがとうございました"
},
"context_matters": "Japanese uses different words based on context",
"character_counts": "Japanese characters more information-dense than English"
}
Spanish (es):
{
"variants": {
"es-ES": "Spain Spanish",
"es-MX": "Mexican Spanish",
"es-AR": "Argentine Spanish"
},
"formality": {
"informal_you": "tú",
"formal_you": "usted"
}
}
Arabic (ar) - RTL:
{
"direction": "rtl",
"text_align": "right",
"special_handling": "Needs RTL CSS and mirrored layouts"
}
German (de):
{
"compound_words": "German combines words: Datenschutzerklärung",
"formal_vs_informal": {
"informal": "du",
"formal": "Sie"
}
}
Next.js Metadata:
// app/[locale]/layout.tsx
export async function generateMetadata({ params: { locale } }) {
const t = await getTranslations({ locale, namespace: 'metadata' });
return {
title: t('title'),
description: t('description'),
keywords: t('keywords'),
openGraph: {
title: t('og_title'),
description: t('og_description'),
images: [t('og_image')]
},
alternates: {
canonical: `https://example.com/${locale}`,
languages: {
'en': 'https://example.com/en',
'ja': 'https://example.com/ja',
'es': 'https://example.com/es'
}
}
};
}
Sitemap Localization:
<!-- sitemap.xml -->
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<url>
<loc>https://example.com/en/</loc>
<xhtml:link rel="alternate" hreflang="ja" href="https://example.com/ja/"/>
<xhtml:link rel="alternate" hreflang="es" href="https://example.com/es/"/>
</url>
</urlset>
Next.js Example:
// components/LanguageSwitcher.tsx
import { useLocale } from 'next-intl';
import { usePathname, useRouter } from 'next/navigation';
const languages = {
en: { name: 'English', flag: '🇺🇸' },
ja: { name: '日本語', flag: '🇯🇵' },
es: { name: 'Español', flag: '🇪🇸' },
fr: { name: 'Français', flag: '🇫🇷' }
};
export default function LanguageSwitcher() {
const locale = useLocale();
const router = useRouter();
const pathname = usePathname();
const switchLanguage = (newLocale: string) => {
const newPath = pathname.replace(`/${locale}`, `/${newLocale}`);
router.push(newPath);
};
return (
<select value={locale} onChange={(e) => switchLanguage(e.target.value)}>
{Object.entries(languages).map(([code, { name, flag }]) => (
<option key={code} value={code}>
{flag} {name}
</option>
))}
</select>
);
}
CSS for RTL:
/* Automatic RTL with logical properties */
.container {
margin-inline-start: 1rem; /* Left in LTR, Right in RTL */
padding-inline-end: 2rem; /* Right in LTR, Left in RTL */
}
/* Direction-specific overrides */
[dir="rtl"] .special-element {
transform: scaleX(-1); /* Mirror icons/images */
}
Next.js RTL Detection:
// middleware.ts
import { NextRequest, NextResponse } from 'next/server';
const rtlLocales = ['ar', 'he', 'fa'];
export function middleware(request: NextRequest) {
const locale = request.nextUrl.pathname.split('/')[1];
const response = NextResponse.next();
if (rtlLocales.includes(locale)) {
response.headers.set('dir', 'rtl');
}
return response;
}
Step 1: Extract Strings
// Scan all components for hardcoded strings
// Generate translation keys automatically
// Create skeleton locale files
Step 2: Generate Translations
// For each target language:
// - Translate using AI or service
// - Preserve placeholders: {name}, {count}
// - Handle pluralization rules
// - Format dates/numbers correctly
Step 3: Install & Configure
// Install i18n library
// Create configuration files
// Set up routing (if Next.js)
// Add language detection
Step 4: Replace Strings
// Replace hardcoded strings with t('key') calls
// Update components to use translations
// Add language switcher component
Step 5: Validate
// Test each locale
// Check RTL languages
// Verify SEO metadata
// Test language switching
project_info:
framework: nextjs | react | vue | other
existing_i18n: boolean
pages_to_translate: array[string]
translation_config:
target_languages: array[string] # ['ja', 'es', 'fr']
translation_method: ai | professional | manual
include_metadata: boolean
include_errors: boolean
routing_strategy:
type: subdirectory | subdomain | query_param # /ja/, ja.site.com, ?lang=ja
default_locale: string
quality_requirements:
review_needed: boolean
formality_level: casual | polite | formal
cultural_adaptation: boolean
deliverables:
installed_packages: array[string]
config_files: array[{path, content}]
locale_files: array[{language, path, content}]
components_modified: array[string]
new_components: array[{name, path, code}]
translation_summary:
languages_added: array[string]
keys_created: number
strings_translated: number
rtl_support: boolean
validation_report:
all_keys_present: boolean
no_missing_translations: boolean
seo_configured: boolean
switcher_working: boolean
documentation:
usage_guide: markdown
adding_new_language: markdown
adding_new_keys: markdown
/translate-site, /add-language, /i18n-setupComplete Landing Page Translation:
Use i18n-automation to translate the Next.js landing page to Japanese, Spanish, and French.
Include SEO metadata and create a language switcher in the header.
Add New Language:
Add German (de) support to existing i18n setup. Use AI translation for initial version.
Full i18n Setup:
Set up complete internationalization for React app:
- Install react-i18next
- Support English, Japanese, Arabic (RTL)
- Extract all strings from components
- Generate translation keys
- Create language switcher
- Configure SEO metadata
Key Naming:
landing.hero.titlepricing.tier.pro.pricecommon.buttons.submitwelcome_v2File Organization:
en.json, ja.jsonen/common.json, en/landing.jsonTranslation Quality:
{name}, {count}{count} item vs {count} itemsPerformance:
training:
pattern: program-of-thought
feedback_collection: true
success_metrics:
- translation_accuracy
- user_engagement_by_locale
- seo_performance_by_language
- completeness_score
Quick Commands:
npm install next-intlnpm install react-i18next i18nextnpm install vue-i18nPro Tips: