fix(l10n): natural English word order for quest summaries + help refresh

- 전체 점검(코드 정독 + 폰·패드·워치 시뮬 검증)에서 발견된 번역·도움말 보완
- 다짐 요약 en 어순 수정: "30m Reach at least" → "Reach at least 30m" — 포맷 키 '%@ · %@ %@'의 en을 위치 지정자(%1$@ · %3$@ %2$@)로 재배열, ko/ja 불변
- 시리 다짐 엔티티 부제가 일반 보간이라 카탈로그를 안 타던 것을 String(localized:)로 교정 — 위젯 카탈로그에 같은 키 번역 추가
- 도움말 일기 항목에 달력 기분 사진 배경 안내 한 문장 추가 (ko/en/ja, stale 키 정리)
- CLAUDE.md §14: -premium 인자가 콜드 스타트 동안만 유효함(지속은 DEBUG 토글) 명시
- 검증: 9개 카탈로그 missing/stale 클린, 인텐트 스모크 10/10, progressSelfTest 37건 PASS, streak 덤프 정상, 3개 스킴(iOS Debug/Store·워치) 빌드 성공, en 목표 탭 스크린샷으로 어순 확인

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014CkLDi8Lr21vGqo4SjZaTp
This commit is contained in:
songyc macbook 2026-07-18 00:31:11 +09:00
parent a400a71896
commit 623217b907
5 changed files with 30 additions and 13 deletions

View File

@ -324,7 +324,7 @@ xcrun xcstringstool sync Widgets/Localizable.xcstrings --stringsdata "${widget_f
## 14. DEBUG 런치 인자 (검증용, 모두 DEBUG 빌드 전용)
공통: `-seedDemo YES`(데모 데이터: 태그3·행동7·기록 7일치·목표8·자정 걸친 세션·마감 시각 다짐 1개[아침 루틴 08:00, 기대: 하루 100%·연속 1일 — 시드 기록이 고정 시각이라 오전 7:30 이전에 실행하면 오늘 기록이 미래 시각으로 연속 계산에서 빠져 연속 0일이 정상]. **시드 이름·메모는 String(localized:) — 실행 로케일을 따르므로(마케팅 스크린샷용) 이름으로 찾는 인자(-autoStart·-openStatsFor·-excludeActions·-endGoalYesterday)는 그 로케일의 이름을 넘길 것**, ko 기본 사용은 기존과 동일), `-seedBulk YES`(성능 검증용 과거 500일 약 1만 건 — 벌크 행동 4개), `-premium YES/NO`, `-startTab <main|action|tag|goal|history|stats|diary|settings>`, `-navStyle radial`, `-themeAutoToggle YES`
공통: `-seedDemo YES`(데모 데이터: 태그3·행동7·기록 7일치·목표8·자정 걸친 세션·마감 시각 다짐 1개[아침 루틴 08:00, 기대: 하루 100%·연속 1일 — 시드 기록이 고정 시각이라 오전 7:30 이전에 실행하면 오늘 기록이 미래 시각으로 연속 계산에서 빠져 연속 0일이 정상]. **시드 이름·메모는 String(localized:) — 실행 로케일을 따르므로(마케팅 스크린샷용) 이름으로 찾는 인자(-autoStart·-openStatsFor·-excludeActions·-endGoalYesterday)는 그 로케일의 이름을 넘길 것**, ko 기본 사용은 기존과 동일), `-seedBulk YES`(성능 검증용 과거 500일 약 1만 건 — 벌크 행동 4개), `-premium YES/NO`(**인자가 있는 콜드 스타트 동안만 유효** — 다음 실행에 인자를 빼면 실권한으로 복귀하므로 프리미엄 화면 검증 시 매 런치에 함께 줄 것. 지속 강제는 설정의 DEBUG 테스트 토글), `-startTab <main|action|tag|goal|history|stats|diary|settings>`, `-navStyle radial`, `-themeAutoToggle YES`
| 영역 | 인자 |
|---|---|

View File

@ -236,7 +236,7 @@
"en": {
"stringUnit": {
"state": "translated",
"value": "%@ · %@ %@"
"value": "%1$@ · %3$@ %2$@"
}
},
"ja": {
@ -8551,18 +8551,18 @@
}
}
},
"일기 탭 달력에서 날짜를 누르면 그날의 일기가 열려요. 첫 페이지는 오늘 기분·요약·목표 진행 현황·할 일·24시간 타임테이블·기록으로 하루를 정리해 보여줘요. 오른쪽 위 ⋯ 메뉴의 '첫 화면 구성'에서 섹션 표시 여부와 순서를 바꿀 수 있어요.": {
"일기 탭 달력에서 날짜를 누르면 그날의 일기가 열려요. 첫 페이지는 오늘 기분·요약·목표 진행 현황·할 일·24시간 타임테이블·기록으로 하루를 정리해 보여줘요. 오른쪽 위 ⋯ 메뉴의 '첫 화면 구성'에서 섹션 표시 여부와 순서를 바꿀 수 있어요. 기분 사진을 남긴 날은 달력의 그 날짜 칸에 사진이 배경으로 함께 보여요.": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Tap a date in the Diary tab calendar to open that day's diary. The first page sums up the day with mood, summary stats, goal progress, to-dos, a 24-hour timetable and records. Use 'First Page Layout' in the ⋯ menu to show, hide and reorder sections."
"value": "Tap a date on the diary tab's calendar to open that day's diary. The first page sums up your day with today's mood, a summary, goal progress, to-dos, a 24-hour timetable and records. Use 'Front page layout' in the ⋯ menu at the top right to choose which sections appear and in what order. On days you add a mood photo, that photo also shows as the background of the date cell in the calendar."
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "ダイアリータブのカレンダーで日付をタップすると、その日の日記が開きます。最初のページは今日の気分・サマリー・目標進捗・やること・24時間タイムテーブル・記録で1日を整理して見せてくれます。右上の⋯メニューの「最初のページの構成」でセクションの表示と順序を変えられます。"
"value": "日記タブのカレンダーで日付をタップすると、その日の日記が開きます。最初のページは今日の気分・サマリー・目標進捗・やること・24時間タイムテーブル・記録で一日を整理して見せてくれます。右上の⋯メニューの「最初の画面の構成」でセクションの表示と順序を変えられます。気分の写真を残した日は、カレンダーのその日付のマスに写真が背景として表示されます。"
}
}
}

View File

@ -211,7 +211,7 @@ struct HelpView: View {
HelpTopic(
symbol: "book.closed.fill",
title: "하루 정리 첫 페이지",
body: "일기 탭 달력에서 날짜를 누르면 그날의 일기가 열려요. 첫 페이지는 오늘 기분·요약·목표 진행 현황·할 일·24시간 타임테이블·기록으로 하루를 정리해 보여줘요. 오른쪽 위 ⋯ 메뉴의 '첫 화면 구성'에서 섹션 표시 여부와 순서를 바꿀 수 있어요."
body: "일기 탭 달력에서 날짜를 누르면 그날의 일기가 열려요. 첫 페이지는 오늘 기분·요약·목표 진행 현황·할 일·24시간 타임테이블·기록으로 하루를 정리해 보여줘요. 오른쪽 위 ⋯ 메뉴의 '첫 화면 구성'에서 섹션 표시 여부와 순서를 바꿀 수 있어요. 기분 사진을 남긴 날은 달력의 그 날짜 칸에 사진이 배경으로 함께 보여요."
),
HelpTopic(
symbol: "calendar.badge.plus",

View File

@ -340,7 +340,8 @@ struct QuestEntity: AppEntity {
id = quest.uuid
targetName = quest.targetName
goalTitle = quest.goal?.title ?? String(localized: "목표 없음")
summary = "\(quest.scheduleLabel) · \(quest.targetValueLabel) \(quest.direction.label)"
// ("%@ · %@ %@")
summary = String(localized: "\(quest.scheduleLabel) · \(quest.targetValueLabel) \(quest.direction.label)")
}
private init(id: UUID, targetName: String, goalTitle: String, summary: String) {

View File

@ -149,6 +149,22 @@
}
}
},
"%@ · %@ %@": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "%1$@ · %3$@ %2$@"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "%@ · %@ %@"
}
}
}
},
"%@ 시작": {
"localizations": {
"en": {
@ -490,12 +506,6 @@
},
"'%@ · %@' 오늘은 수행일이 아니에요.": {
"localizations": {
"ko": {
"stringUnit": {
"state": "new",
"value": "'%1$@ · %2$@' 오늘은 수행일이 아니에요."
}
},
"en": {
"stringUnit": {
"state": "translated",
@ -507,6 +517,12 @@
"state": "translated",
"value": "「%1$@ · %2$@」は今日は実行日ではありません。"
}
},
"ko": {
"stringUnit": {
"state": "new",
"value": "'%1$@ · %2$@' 오늘은 수행일이 아니에요."
}
}
}
},