qe-localization-testing について
多言語ソフトウェアの国際化とローカライズを確認するテストスキルです。翻訳、地域別の形式、右から左へのレイアウト、Unicode、文化的な適切さを、チェックリストとテスト例で扱います。
主な機能
- 01翻訳の網羅性チェック
- 02地域別の日付・数値形式
- 03右から左へのレイアウト検証
- 04Unicode文字の対応確認
- 05文化的な適切さの確認
活用シーン
- 01新市場向けの製品準備
- 02言語サポートの追加
- 03国際リリースの確認
- 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> 多言語/地域対応をテストする場合:
- 翻訳の網羅性を確認します(すべての文字列が翻訳されていること)
- ロケール固有の形式をテストします(日付、時刻、通貨、数値)
- RTL レイアウトを検証します(アラビア語、ヘブライ語)
- 文字エンコーディングを確認します(UTF-8、Unicode)
- 文化的な適切さを確認します(アイコン、色、コンテンツ)
i18n のクイックチェックリスト:
- ユーザーに表示されるすべての文字列が外部化されている
- コードにハードコードされたテキストがない
- 日付/時刻/通貨がロケールに合わせて書式設定されている
- RTL 言語ではレイアウトが正しく反転する
- Unicode 文字が正しく表示される
成功のための重要な要素:
- 文字列をハードコードせず、すべて外部化します
- 翻訳ファイルだけでなく、実際の話者を交えてテストします
- RTL では UI レイアウトを鏡像反転する必要があります </default_to_action>
クイックリファレンスカード
使用する場面
- 新しい市場でリリースするとき
- 言語サポートを追加するとき
- 国際リリースの前
- UI の変更後
i18n と l10n
| 用語 | 正式名称 | 焦点 |
|---|---|---|
| i18n | 国際化 | ローカライズを前提とした構築 |
| l10n | ローカライズ | 特定のロケールへの適応 |
一般的なロケール形式
| 種類 | US(en-US) | UK(en-GB) | 日本(ja-JP) |
|---|---|---|---|
| 日付 | 10/24/2025 | 24/10/2025 | 2025/10/24 |
| 通貨 | $1,234.56 | £1,234.56 | ¥1,235 |
| 数値 | 1,234.56 | 1,234.56 | 1,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'
});
関連スキル
- accessibility-testing - 言語アクセシビリティ
- compatibility-testing - クロスプラットフォームの i18n
- visual-testing-advanced - RTL のビジュアルリグレッション
覚えておくこと
ハードコードせず、ユーザーに表示されるすべての文字列を外部化します。 ユーザーに見える文字列はすべて、コードではなく翻訳ファイルから取得する必要があります。
翻訳ファイルだけでなく、ネイティブスピーカーとテストします。 機械翻訳や翻訳ファイルには文脈上の問題が含まれることがあり、それに気づけるのはネイティブスピーカーだけです。
エージェントを使用する場合: エージェントは、翻訳の網羅性を検証し、ハードコードされた文字列を検出し、ロケール固有の書式設定をテストし、サポート対象のすべての言語で RTL レイアウトを自動的に確認します。
コメント
Markdown 対応