mcpField
Q
qe-localization-testing

qe-localization-testing

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

qe-localization-testing について

多言語ソフトウェアの国際化とローカライズを確認するテストスキルです。翻訳、地域別の形式、右から左へのレイアウト、Unicode、文化的な適切さを、チェックリストとテスト例で扱います。

主な機能

  1. 01翻訳の網羅性チェック
  2. 02地域別の日付・数値形式
  3. 03右から左へのレイアウト検証
  4. 04Unicode文字の対応確認
  5. 05文化的な適切さの確認

活用シーン

  1. 01新市場向けの製品準備
  2. 02言語サポートの追加
  3. 03国際リリースの確認
  4. 04地域別のUI変更の検証

インストール

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

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

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

詳細

ローカライズと国際化のテスト

<default_to_action> 多言語/地域対応をテストする場合:

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

i18n のクイックチェックリスト:

  • ユーザーに表示されるすべての文字列が外部化されている
  • コードにハードコードされたテキストがない
  • 日付/時刻/通貨がロケールに合わせて書式設定されている
  • RTL 言語ではレイアウトが正しく反転する
  • Unicode 文字が正しく表示される

成功のための重要な要素:

  • 文字列をハードコードせず、すべて外部化します
  • 翻訳ファイルだけでなく、実際の話者を交えてテストします
  • RTL では UI レイアウトを鏡像反転する必要があります </default_to_action>

クイックリファレンスカード

使用する場面
  • 新しい市場でリリースするとき
  • 言語サポートを追加するとき
  • 国際リリースの前
  • UI の変更後
i18n と l10n
用語正式名称焦点
i18n国際化ローカライズを前提とした構築
l10nローカライズ特定のロケールへの適応
一般的なロケール形式
種類US(en-US)UK(en-GB)日本(ja-JP)
日付10/24/202524/10/20252025/10/24
通貨$1,234.56£1,234.56¥1,235
数値1,234.561,234.561,234.56

翻訳の網羅性テスト

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 レイアウトを自動的に確認します。

コメント