From 623217b9072a0cb8452c79d89f70b7cb936354a0 Mon Sep 17 00:00:00 2001 From: songyc macbook Date: Sat, 18 Jul 2026 00:31:11 +0900 Subject: [PATCH] fix(l10n): natural English word order for quest summaries + help refresh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 전체 점검(코드 정독 + 폰·패드·워치 시뮬 검증)에서 발견된 번역·도움말 보완 - 다짐 요약 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 Claude-Session: https://claude.ai/code/session_014CkLDi8Lr21vGqo4SjZaTp --- myApp/HaruDanim/CLAUDE.md | 2 +- myApp/HaruDanim/IOS/Localizable.xcstrings | 8 +++--- myApp/HaruDanim/IOS/Views/HelpView.swift | 2 +- myApp/HaruDanim/Shared/HaruDanimIntents.swift | 3 +- myApp/HaruDanim/Widgets/Localizable.xcstrings | 28 +++++++++++++++---- 5 files changed, 30 insertions(+), 13 deletions(-) diff --git a/myApp/HaruDanim/CLAUDE.md b/myApp/HaruDanim/CLAUDE.md index 5dbd6a9..08751cc 100644 --- a/myApp/HaruDanim/CLAUDE.md +++ b/myApp/HaruDanim/CLAUDE.md @@ -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 `, `-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 `, `-navStyle radial`, `-themeAutoToggle YES` | 영역 | 인자 | |---|---| diff --git a/myApp/HaruDanim/IOS/Localizable.xcstrings b/myApp/HaruDanim/IOS/Localizable.xcstrings index dea32fb..ffb2f22 100644 --- a/myApp/HaruDanim/IOS/Localizable.xcstrings +++ b/myApp/HaruDanim/IOS/Localizable.xcstrings @@ -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時間タイムテーブル・記録で一日を整理して見せてくれます。右上の⋯メニューの「最初の画面の構成」でセクションの表示と順序を変えられます。気分の写真を残した日は、カレンダーのその日付のマスに写真が背景として表示されます。" } } } diff --git a/myApp/HaruDanim/IOS/Views/HelpView.swift b/myApp/HaruDanim/IOS/Views/HelpView.swift index 08680e5..98da452 100644 --- a/myApp/HaruDanim/IOS/Views/HelpView.swift +++ b/myApp/HaruDanim/IOS/Views/HelpView.swift @@ -211,7 +211,7 @@ struct HelpView: View { HelpTopic( symbol: "book.closed.fill", title: "하루 정리 첫 페이지", - body: "일기 탭 달력에서 날짜를 누르면 그날의 일기가 열려요. 첫 페이지는 오늘 기분·요약·목표 진행 현황·할 일·24시간 타임테이블·기록으로 하루를 정리해 보여줘요. 오른쪽 위 ⋯ 메뉴의 '첫 화면 구성'에서 섹션 표시 여부와 순서를 바꿀 수 있어요." + body: "일기 탭 달력에서 날짜를 누르면 그날의 일기가 열려요. 첫 페이지는 오늘 기분·요약·목표 진행 현황·할 일·24시간 타임테이블·기록으로 하루를 정리해 보여줘요. 오른쪽 위 ⋯ 메뉴의 '첫 화면 구성'에서 섹션 표시 여부와 순서를 바꿀 수 있어요. 기분 사진을 남긴 날은 달력의 그 날짜 칸에 사진이 배경으로 함께 보여요." ), HelpTopic( symbol: "calendar.badge.plus", diff --git a/myApp/HaruDanim/Shared/HaruDanimIntents.swift b/myApp/HaruDanim/Shared/HaruDanimIntents.swift index bec1449..04fec2e 100644 --- a/myApp/HaruDanim/Shared/HaruDanimIntents.swift +++ b/myApp/HaruDanim/Shared/HaruDanimIntents.swift @@ -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) { diff --git a/myApp/HaruDanim/Widgets/Localizable.xcstrings b/myApp/HaruDanim/Widgets/Localizable.xcstrings index bcd4fbf..ac740bc 100644 --- a/myApp/HaruDanim/Widgets/Localizable.xcstrings +++ b/myApp/HaruDanim/Widgets/Localizable.xcstrings @@ -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$@' 오늘은 수행일이 아니에요." + } } } },