mcpField
L
localization-testing

localization-testing

github.com/proffesor-for-testingテスト・品質519130 回インストール今日更新
リポジトリ

localization-testing について

多言語・国際化対応をテストするスキルです。翻訳の網羅性、ロケール別の形式、右から左へのレイアウト、Unicode、ブラウザーでの画面比較を扱います。

主な機能

  1. 01翻訳の網羅性を確認
  2. 02ロケール別の形式を検証
  3. 03右から左へのレイアウトをテスト
  4. 04Unicode の処理を検証
  5. 05ブラウザー画面を比較

活用シーン

  1. 01新市場への展開準備
  2. 02リリース前の言語対応テスト
  3. 03UI変更後のロケール動作確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/proffesor-for-testing/agentic-qe --skill localization-testing

インストール後、Claude Code で/localization-testingを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

evals/
localization-testing.yaml
schemas/
output.json
scripts/
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> 多言語・地域対応をテストする場合:

  1. 翻訳の網羅性を検証する(すべての文字列が翻訳されていること)
  2. ロケール固有の形式をテストする(日付、時刻、通貨、数値)
  3. RTL レイアウトを検証する(アラビア語、ヘブライ語)
  4. 文字エンコーディングを確認する(UTF-8、Unicode)
  5. 文化的な適切さを確認する(アイコン、色、コンテンツ)

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'
});

関連スキル


お忘れなく

エージェントを使用する場合: エージェントは、サポート対象のすべての言語で、翻訳の網羅性を検証し、ハードコードされた文字列を検出し、ロケール固有のフォーマットをテストし、RTL レイアウトを自動的に検証します。

コメント