.claude/skills/verify-i18n/SKILL.md
Verifies i18n translation consistency — en/ko key pair matching, no empty translations, namespace references, Zod schema hardcoded message detection, dynamic i18n key coverage, routeMap↔navigation.json sync. Run after adding/modifying messages/{en,ko}/*.json or route-metadata.ts.
npx skillsauth add junnv93/equipment_management_system verify-i18nInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
apps/frontend/messages/ 디렉토리의 번역 파일이 다음 규칙을 준수하는지 검증합니다:
useTranslations('namespace') 호출과 실제 메시지 파일이 일치apps/frontend/messages/{en,ko}/*.json을 추가/수정한 후useTranslations() 또는 getTranslations()를 사용한 후lib/navigation/route-metadata.ts에 라우트를 추가/수정한 후| File | Purpose |
|---|---|
| apps/frontend/messages/en/*.json | 영어 번역 파일 (도메인별) |
| apps/frontend/messages/ko/*.json | 한국어 번역 파일 (도메인별) |
| apps/frontend/lib/i18n/request.ts | next-intl 설정 |
| apps/frontend/lib/i18n/use-enum-labels.ts | i18n 기반 Enum Label Hooks |
| apps/frontend/lib/navigation/route-metadata.ts | routeMap — 브레드크럼 labelKey SSOT |
| apps/frontend/lib/navigation/use-breadcrumb-metadata.ts | 동적 브레드크럼 라벨 훅 |
두 언어 디렉토리에 동일한 파일이 모두 존재하는지 확인합니다. PASS: 두 디렉토리의 파일 목록이 완전 일치. FAIL: 한쪽에만 파일이 있으면 누락.
상세: references/i18n-checks.md Step 1
각 도메인 파일의 JSON 키 구조가 en/ko 간에 완전히 일치하는지 확인합니다. PASS: 모든 도메인에서 키 불일치 없음. FAIL: 키 불일치 발견 시 누락 쪽에 추가.
상세: references/i18n-checks.md Step 2
비어 있는 번역 문자열("")을 탐지합니다. PASS: 0개 결과. FAIL: 빈 문자열 발견 시 실제 번역 추가.
상세: references/i18n-checks.md Step 3
컴포넌트에서 사용하는 번역 네임스페이스가 실제 메시지 파일과 일치하는지 확인합니다. PASS: 모든 최상위 네임스페이스에 대응 파일 존재. FAIL: 미존재 네임스페이스 참조.
상세: references/i18n-checks.md Step 4
en/ko에서 {variable} 플레이스홀더가 동일하게 사용되는지 확인합니다.
PASS: 차이 없음. INFO: 불일치 시 수동 확인 권장.
상세: references/i18n-checks.md Step 5
컴포넌트 내 Zod 스키마에서 하드코딩된 검증 메시지를 탐지합니다.
PASS: 0개 결과. FAIL: 하드코딩 발견 시 createSchema(t) 팩토리 패턴으로 전환.
상세: references/i18n-checks.md Step 6
t('key.${dynamicValue}') 패턴의 동적 키가 en/ko JSON에 모두 존재하는지 확인합니다.
PASS: 모든 enum 값에 대응 키 존재. FAIL: 누락 시 런타임 raw 키 표시.
상세: references/i18n-checks.md Step 7
route-metadata.ts의 모든 labelKey가 navigation.json에 실제로 존재하는지 확인합니다.
또한, 실제 존재하는 app/(dashboard)/**/page.tsx에 대응하는 routeMap 항목이 있는지 역방향 검증합니다.
PASS: 모든 labelKey가 navigation.json에 존재하고, 모든 페이지가 routeMap에 등록됨. FAIL: 누락 발견.
상세: references/i18n-checks.md Step 8
| # | 검사 | 상태 | 상세 |
| --- | ------------------------------- | --------- | ------------------------ |
| 1 | en/ko 파일 쌍 존재 | PASS/FAIL | 누락 파일 목록 |
| 2 | 도메인별 키 쌍 일치 | PASS/FAIL | 불일치 도메인 + 키 목록 |
| 3 | 빈 번역 값 | PASS/FAIL | 빈 값 위치 목록 |
| 4 | 네임스페이스 참조 일관성 | PASS/INFO | 미존재 네임스페이스 목록 |
| 5 | ICU 변수 쌍 일치 | PASS/INFO | 변수 불일치 도메인 목록 |
| 6 | Zod 스키마 하드코딩 메시지 | PASS/FAIL | 하드코딩 파일:라인 목록 |
| 7 | 동적 i18n 키 커버리지 | PASS/FAIL | 누락된 동적 키 목록 |
| 8 | routeMap↔navigation.json 동기화 | PASS/FAIL | 누락 키/미등록 라우트 |
다음은 위반이 아닙니다:
reservations.json — 예약 기능이 미구현이므로 일부 키가 플레이스홀더로 남아있을 수 있음useTranslations('common.actions') — common.json 파일이 존재하면 파일 누락이 아님useTranslations(dynamicNs) 같은 동적 참조는 탐지 불가, 수동 확인 필요testing
Verifies Zod validation pattern compliance — ZodValidationPipe usage (no class-validator), versionedSchema inclusion in state-change DTOs, controller pipe application, query DTO consistency. Run after adding/modifying DTOs or controller endpoints.
testing
Verifies cross-feature workflow E2E test coverage against critical-workflows.md checklist. Checks WF-01~WF-35 coverage, step completeness, role correctness, side-effect verification, and status transition assertions. Run after adding workflow tests or before PR.
testing
SSOT(Single Source of Truth) 임포트 소스를 검증합니다. 타입/enum/상수가 올바른 패키지에서 임포트되는지 확인. 타입/enum 추가/수정 후 사용.
development
Verifies SQL safety — LIKE wildcard escaping, N+1 query pattern detection, COUNT(DISTINCT) for fan-out JOINs, RBAC INNER JOIN enforcement. Run after adding/modifying search or list API endpoints.