l10nlisted
Install: claude install-skill snwlee/Nereus
# l10n
nereus:common 규칙을 따른다. 담당 에이전트: l10n-engineer.
**엔진·프레임워크와 무관하다** — Luau 든 C# 이든 Dart 든 같은 규칙으로 소스를 훑는다.
**게임·비게임을 가리지 않는다** — 배경화면 앱도 게임도 같은 결함을 낸다.
현지화 결함은 출시 **후에** 드러나고, 그때는 고치는 비용이 몇 배가 된다.
이 스킬은 **번역을 실행하지 않고** 번역하면 깨질 곳을 지금 찾는다.
## 0. 로케일 집합은 `locales.json` 이 단일 출처다
```bash
cat "${CLAUDE_PLUGIN_ROOT}/locales.json"
```
**두 집합이 들어 있다.**
| 집합 | 예 | 쓰는 곳 |
|---|---|---|
| 스토어 로케일 (`stores: ["play"]`) | `ko-KR` · `en-US` · `zh-CN` | 등재 텍스트·이미지 |
| 소스 언어 별칭 (`aliasOf`) | `ko` · `en` · `zh` | 소스 문자열 표(ARB 등) |
**하나로 뭉치지 않는다.** Play 는 `ko-KR` 을 쓰고 소스 표는 `ko` 를 쓴다 —
뭉치면 한쪽이 반드시 깨진다. 별칭 항목은 `stores: []` 이고 가리키는 로케일과
수치가 같다(테스트가 강제한다). **별칭은 편의지 두 번째 출처가 아니다.**
**알 수 없는 로케일은 기본값으로 떨어지지 않고 던진다.** 조용히 건너뛰면
그 로케일이 검사되지 않은 채 통과한다.
### 추정값은 출처를 필드마다 표시한다
86종의 확장률을 실측 없이 지어낼 수 없다. 그래서 값마다 근거가 붙는다:
| `expansionBasis` | 뜻 |
|---|---|
| `legacy-estimate` | 원래 8종에 있던 업계 통념 추정 |
| `group-estimate` | 스크립트·어족 그룹의 대표값을 물려받았다 |
| `measured` | 실측. 생기면 여기로 올린다 |
`expansion` 과 `avgCharWidth` 는 **다른 축**이다. 한글은 번역하면 글자 수가 줄지만
(`expansion` 0.8) 글자당 폭은 전각이라 라틴의 두 배다(`avgCharWidth` 1.0). 섞지 않는다.
## 1. 검사
`scanL10n` 을 부른다 (`lib/l10n-scan.mjs`).
| 인자 | 뜻 |
|---|---|
| `locales` | `loadLocales()` 결과 |
| `tables` | 로케일별 문자열 테이블. `{ en: { "hud.jump": "Jump" }, ko: { ... } }` |
| `sources` | 훑을 소스. `[{ file, text }]` |
| `maxWidth` | UI 폭. 0 이면 폭 검사를 하지 않는다 |
| `fontMetrics` | 로케일별 폰트 메트릭. 주면 실측 폭, 안 주면 근사 |
| `accessor` | 문자열 테이블 접근자. 기본 `L(`. Flutter 는 `l10n.` |
| `exclude` | 제외 규칙. `