chore(l10n): purge stale catalog entries + per-target stringsdata sync routine

전체 코드 점검 중 발견한 번역 카탈로그 정리:
- IOS 카탈로그의 stale 항목 2건 삭제 — "다른 행동 %lld개도 함께 추적 중"은
  위젯 타깃 전용 문자열(위젯 카탈로그에 번역 완료 상태로 존재)이고,
  "프리미엄 상태 (테스트)"는 DEBUG 전용 문구
- DEBUG 프리미엄 토글 라벨을 Text(verbatim:)으로 — 개발용 문구는 카탈로그로
  추출하지 않는 컨벤션(§15-6)에 맞춤 (같은 섹션의 다른 문구와 동일)
- CLAUDE.md l10n 루틴 수정: 카탈로그마다 자기 타깃의 stringsdata만 sync하도록
  경로 필터 추가 — 전 타깃을 한꺼번에 넣으면 위젯 전용 문자열이 IOS 카탈로그에
  미번역으로 재유입되던 오염의 근본 원인 제거 (이번 stale의 발생 경로)

검증: 전 카탈로그(9개) missing/stale 0건, 카탈로그 의미 diff = stale 2건 삭제뿐
(번역 변경 없음), Debug·Store 스킴 빌드 성공

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
This commit is contained in:
songyc macbook 2026-07-15 15:52:10 +09:00
parent aa1c098d98
commit 3f518aa91b
3 changed files with 707 additions and 734 deletions

View File

@ -62,9 +62,13 @@ xcodebuild -project Haru_Danim.xcodeproj -scheme Haru_Danim-Store \
`String(localized:)` 문자열 추가 후:
```zsh
# 1) Debug 빌드 → 2) stringsdata 동기화
files=(${(f)"$(find ~/Library/Developer/Xcode/DerivedData/Haru_Danim-*/ -name '*.stringsdata' -path '*Debug-iphonesimulator*')"})
xcrun xcstringstool sync IOS/Localizable.xcstrings --stringsdata "${files[@]}"
# 1) Debug 빌드 → 2) stringsdata 동기화 — ⚠️ 카탈로그마다 "자기 타깃"의 stringsdata만 넣을 것
# (경로의 <타깃명>.build로 구분. 전체를 한꺼번에 넣으면 위젯 전용 문자열이
# IOS 카탈로그에 미번역으로 추가됐다가 Xcode 재저장 때 stale로 남는 오염이 생긴다)
app_files=(${(f)"$(find ~/Library/Developer/Xcode/DerivedData/Haru_Danim-*/ -name '*.stringsdata' -path '*Debug-iphonesimulator/Haru_Danim.build/*')"})
xcrun xcstringstool sync IOS/Localizable.xcstrings --stringsdata "${app_files[@]}"
widget_files=(${(f)"$(find ~/Library/Developer/Xcode/DerivedData/Haru_Danim-*/ -name '*.stringsdata' -path '*Debug-iphonesimulator/Haru_DanimWidgets.build/*')"})
xcrun xcstringstool sync Widgets/Localizable.xcstrings --stringsdata "${widget_files[@]}"
# 3) python으로 en/ja 번역 채움 → 4) sync 재실행으로 포맷 정규화 → 5) missing 확인
```

File diff suppressed because it is too large Load Diff

View File

@ -442,10 +442,13 @@ struct PremiumView: View {
}
#if DEBUG
Section {
Toggle("프리미엄 상태 (테스트)", isOn: Binding(
// ( §15-6 )
Toggle(isOn: Binding(
get: { premium.isPremium },
set: { premium.setMockPremium($0) }
))
)) {
Text(verbatim: "프리미엄 상태 (테스트)")
}
Button {
Task {
await premium.clearMockOverride()