localization-testing について
多言語・国際化対応をテストするスキルです。翻訳の網羅性、ロケール別の形式、右から左へのレイアウト、Unicode、ブラウザーでの画面比較を扱います。
主な機能
- 01翻訳の網羅性を確認
- 02ロケール別の形式を検証
- 03右から左へのレイアウトをテスト
- 04Unicode の処理を検証
- 05ブラウザー画面を比較
活用シーン
- 01新市場への展開準備
- 02リリース前の言語対応テスト
- 03UI変更後のロケール動作確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ proffesor-for-testing/ agentic-qe --skill localization-testingインストール後、Claude Code で/localization-testingを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
evals/localization-testing.yamlschemas/output.jsonscripts/validate-config.json詳細
ローカライズと国際化のテスト
ブラウザーエンジン
RTL レイアウトの差分、言語切り替えフロー、ロケール固有のスクリーンショットなど、ブラウザーを使ったロケールチェックには qe-browser フリートスキルを使用してください。例:
vibium go "$BASE_URL?lang=ar" # Arabic, RTL
vibium wait load
node .claude/skills/qe-browser/scripts/visual-diff.js --name homepage-ar-rtl
vibium go "$BASE_URL?lang=ja" # Japanese, CJK text expansion
node .claude/skills/qe-browser/scripts/visual-diff.js --name homepage-ja
詳細については、.claude/skills/qe-browser/SKILL.md を参照してください。
<default_to_action> 多言語・地域対応をテストする場合:
- 翻訳の網羅性を検証する(すべての文字列が翻訳されていること)
- ロケール固有の形式をテストする(日付、時刻、通貨、数値)
- RTL レイアウトを検証する(アラビア語、ヘブライ語)
- 文字エンコーディングを確認する(UTF-8、Unicode)
- 文化的な適切さを確認する(アイコン、色、コンテンツ)
i18n クイックチェックリスト:
- ユーザーに表示されるすべての文字列が外部化されている
- コードにテキストがハードコードされていない
- 日付、時刻、通貨がロケールに応じてフォーマットされている
- RTL 言語でレイアウトが正しく反転する
- Unicode 文字が正しく表示される
成功のための重要な要素:
- 文字列をハードコードせず、すべて外部化する
- 翻訳ファイルだけでなく、実際の話者にテストしてもらう
- RTL では UI レイアウトを鏡像化する必要がある </default_to_action>
クイックリファレンスカード
使用するタイミング
- 新しい市場でリリースするとき
- 言語サポートを追加するとき
- 国際リリースの前
- UI の変更後
翻訳網羅性のテスト
test('all strings are translated', () => {
const enKeys = Object.keys(translations.en);
const frKeys = Object.keys(translations.fr);
const esKeys = Object.keys(translations.es);
// All locales have same keys
expect(frKeys).toEqual(enKeys);
expect(esKeys).toEqual(enKeys);
});
test('no missing translation placeholders', async ({ page }) => {
await page.goto('/?lang=fr');
const text = await page.textContent('body');
// Should not see placeholder keys
expect(text).not.toContain('translation.missing');
expect(text).not.toMatch(/\{\{.*\}\}/); // {{key}} format
});
日付・時刻・通貨の形式
test('date formats by locale', () => {
const date = new Date('2025-10-24');
expect(formatDate(date, 'en-US')).toBe('10/24/2025');
expect(formatDate(date, 'en-GB')).toBe('24/10/2025');
expect(formatDate(date, 'ja-JP')).toBe('2025/10/24');
});
test('currency formats by locale', () => {
const amount = 1234.56;
expect(formatCurrency(amount, 'en-US', 'USD')).toBe('$1,234.56');
expect(formatCurrency(amount, 'de-DE', 'EUR')).toBe('1.234,56 €');
expect(formatCurrency(amount, 'ja-JP', 'JPY')).toBe('¥1,235');
});
RTL(右から左)テスト
test('layout flips for RTL languages', async ({ page }) => {
await page.goto('/?lang=ar'); // Arabic
const dir = await page.locator('html').getAttribute('dir');
expect(dir).toBe('rtl');
// Navigation should be on right
const nav = await page.locator('nav');
const styles = await nav.evaluate(el =>
window.getComputedStyle(el)
);
expect(styles.direction).toBe('rtl');
});
test('icons/images appropriate for RTL', async ({ page }) => {
await page.goto('/?lang=he'); // Hebrew
// Back arrow should point right in RTL
const backIcon = await page.locator('.back-icon');
expect(await backIcon.getAttribute('class')).toContain('rtl-flipped');
});
Unicode 文字のサポート
test('supports unicode characters', async ({ page }) => {
// Japanese
await page.fill('#name', '山田太郎');
await page.click('#submit');
const saved = await db.users.findOne({ /* ... */ });
expect(saved.name).toBe('山田太郎');
// Arabic
await page.fill('#name', 'محمد');
// Emoji
await page.fill('#bio', '👋🌍');
expect(saved.bio).toBe('👋🌍');
});
エージェント主導のローカライズテスト
// Comprehensive localization validation
await Task("Localization Testing", {
url: 'https://example.com',
locales: ['en-US', 'fr-FR', 'de-DE', 'ja-JP', 'ar-SA'],
checks: ['translations', 'formats', 'rtl', 'unicode'],
detectHardcodedStrings: true
}, "qe-test-generator");
// Returns:
// {
// locales: 5,
// missingTranslations: 3,
// formatIssues: 1,
// rtlIssues: 0,
// hardcodedStrings: ['button.submit', 'header.title']
// }
エージェント連携のヒント
メモリ名前空間
aqe/localization-testing/
├── translations/* - Translation coverage
├── formats/* - Locale-specific formats
├── rtl-validation/* - RTL layout checks
└── unicode/* - Character encoding tests
フリート連携
const l10nFleet = await FleetManager.coordinate({
strategy: 'localization-testing',
agents: [
'qe-test-generator', // Generate l10n tests
'qe-test-executor', // Execute across locales
'qe-visual-tester' // RTL visual validation
],
topology: 'parallel'
});
関連スキル
- アクセシビリティテスト - 言語のアクセシビリティ
- 互換性テスト - クロスプラットフォームの i18n
- 高度なビジュアルテスト - RTL のビジュアルリグレッション
お忘れなく
エージェントを使用する場合: エージェントは、サポート対象のすべての言語で、翻訳の網羅性を検証し、ハードコードされた文字列を検出し、ロケール固有のフォーマットをテストし、RTL レイアウトを自動的に検証します。
コメント
Markdown 対応