← ClaudeAtlas

l10nlisted

소스 문자열 현지화 — 하드코딩 문자열·로케일 키 누락·확장률 폭 초과를 번역 전에 잡는다. 로케일 집합의 단일 출처. 트리거 "현지화", "l10n", "로케일", "다국어", "하드코딩 문자열", "ARB".
snwlee/Nereus · ★ 2 · AI & Automation · score 75
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` | 제외 규칙. `