chore(release): 1.4 마무리 — l10n 전 카탈로그 완역·버전 1.4·whats-new·도움말·CLAUDE.md v2.7

- l10n: IOS 67·Widgets 4 신규 문자열 en/ja 완역, stale 4키 청소 — 전 카탈로그 missing/stale 0
- 도움말 3주제 갱신(통계 롤링·데이터 정리·일기 내보내기 후 삭제)
- MARKETING_VERSION 1.4(빌드 1, 8구성) + Marketing/AppStore/whats-new-1.4.txt(ko/en/ja)
- CLAUDE.md v2.7: 하한 18.0·1.4 전 기능·신규 검증 인자 9종·18.5 QA 심 반영
- 통합 QA: Debug/Store/워치 빌드 성공, 자가 검증 49+20+18+10 ALL PASS(26 심), 18.5 심에서도 49+18 ALL PASS+화면 렌더, en 로케일 렌더 확인

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NNxA172hNDRpDsJ2qztKPf
This commit is contained in:
songyc macbook 2026-08-11 17:25:35 +09:00
parent cf78a3ac7e
commit e4fcf21b27
6 changed files with 12624 additions and 11516 deletions

File diff suppressed because one or more lines are too long

View File

@ -620,7 +620,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.3; MARKETING_VERSION = 1.4;
PRODUCT_BUNDLE_IDENTIFIER = com.yechan.HaruDanim; PRODUCT_BUNDLE_IDENTIFIER = com.yechan.HaruDanim;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
STRING_CATALOG_GENERATE_SYMBOLS = YES; STRING_CATALOG_GENERATE_SYMBOLS = YES;
@ -662,7 +662,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.3; MARKETING_VERSION = 1.4;
PRODUCT_BUNDLE_IDENTIFIER = com.yechan.HaruDanim; PRODUCT_BUNDLE_IDENTIFIER = com.yechan.HaruDanim;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
STRING_CATALOG_GENERATE_SYMBOLS = YES; STRING_CATALOG_GENERATE_SYMBOLS = YES;
@ -697,7 +697,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.3; MARKETING_VERSION = 1.4;
PRODUCT_BUNDLE_IDENTIFIER = com.yechan.HaruDanim.watchkitapp; PRODUCT_BUNDLE_IDENTIFIER = com.yechan.HaruDanim.watchkitapp;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
@ -733,7 +733,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.3; MARKETING_VERSION = 1.4;
PRODUCT_BUNDLE_IDENTIFIER = com.yechan.HaruDanim.watchkitapp; PRODUCT_BUNDLE_IDENTIFIER = com.yechan.HaruDanim.watchkitapp;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
@ -770,7 +770,7 @@
"@executable_path/../../Frameworks", "@executable_path/../../Frameworks",
"@executable_path/../../../../Frameworks", "@executable_path/../../../../Frameworks",
); );
MARKETING_VERSION = 1.3; MARKETING_VERSION = 1.4;
PRODUCT_BUNDLE_IDENTIFIER = "com.yechan.HaruDanim.watchkitapp.Haru-DanimWatchWidgets"; PRODUCT_BUNDLE_IDENTIFIER = "com.yechan.HaruDanim.watchkitapp.Haru-DanimWatchWidgets";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
@ -806,7 +806,7 @@
"@executable_path/../../Frameworks", "@executable_path/../../Frameworks",
"@executable_path/../../../../Frameworks", "@executable_path/../../../../Frameworks",
); );
MARKETING_VERSION = 1.3; MARKETING_VERSION = 1.4;
PRODUCT_BUNDLE_IDENTIFIER = "com.yechan.HaruDanim.watchkitapp.Haru-DanimWatchWidgets"; PRODUCT_BUNDLE_IDENTIFIER = "com.yechan.HaruDanim.watchkitapp.Haru-DanimWatchWidgets";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
@ -838,7 +838,7 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
"@executable_path/../../Frameworks", "@executable_path/../../Frameworks",
); );
MARKETING_VERSION = 1.3; MARKETING_VERSION = 1.4;
PRODUCT_BUNDLE_IDENTIFIER = com.yechan.HaruDanim.Widgets; PRODUCT_BUNDLE_IDENTIFIER = com.yechan.HaruDanim.Widgets;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES; SKIP_INSTALL = YES;
@ -864,7 +864,7 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
"@executable_path/../../Frameworks", "@executable_path/../../Frameworks",
); );
MARKETING_VERSION = 1.3; MARKETING_VERSION = 1.4;
PRODUCT_BUNDLE_IDENTIFIER = com.yechan.HaruDanim.Widgets; PRODUCT_BUNDLE_IDENTIFIER = com.yechan.HaruDanim.Widgets;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES; SKIP_INSTALL = YES;

File diff suppressed because it is too large Load Diff

View File

@ -270,12 +270,12 @@ struct HelpView: View {
HelpTopic( HelpTopic(
symbol: "tablecells", symbol: "tablecells",
title: "CSV로 백업·복원하기", title: "CSV로 백업·복원하기",
body: "설정 → 데이터 → '데이터 내보내기'에서 모든 기록(행동·시간·횟수·목표·다짐)을 CSV 파일로 만들 수 있어요. 스프레드시트에서 열어 분석하거나 백업으로 보관해 두세요. 내보내기는 무료에서도 사용할 수 있어요.\n'데이터 가져오기'(프리미엄)를 쓰면 내보냈던 CSV에서 행동과 시간·횟수 기록을 다시 불러올 수 있어요. 기존 데이터는 바꾸지 않고 새 기록만 추가하며, 이미 있는 기록은 자동으로 건너뛰어서 같은 파일을 여러 번 가져와도 안전해요. CSV에 없는 행동은 새로 만들어지고, 이름과 방식이 같은 행동이 이미 있으면 그 행동으로 이어져요." body: "설정 → 데이터 → '데이터 내보내기'에서 모든 기록(행동·시간·횟수·목표·다짐)을 CSV 파일로 만들 수 있어요. 구간을 직접 지정해 그 기간의 기록만 내보낼 수도 있어요. 스프레드시트에서 열어 분석하거나 백업으로 보관해 두세요. 내보내기는 무료에서도 사용할 수 있어요.\n'데이터 가져오기'(프리미엄)를 쓰면 내보냈던 CSV에서 행동과 시간·횟수 기록을 다시 불러올 수 있어요. 기존 데이터는 바꾸지 않고 새 기록만 추가하며, 이미 있는 기록은 자동으로 건너뛰어서 같은 파일을 여러 번 가져와도 안전해요. CSV에 없는 행동은 새로 만들어지고, 이름과 방식이 같은 행동이 이미 있으면 그 행동으로 이어져요.\n기록이 오래 쌓여 정리하고 싶다면 '데이터 정리·초기화'를 써 보세요. 전체를 비우거나 지정한 날짜까지의 기록·일기만 삭제할 수 있고, 삭제 전에 CSV 백업과 삭제할 기록을 한눈에 정리한 '정리 리포트'(PDF·이미지)를 만들어 보관할 수 있어요. iCloud 동기화를 켰다면 다른 기기에서도 함께 삭제되니 백업을 꼭 저장해 두세요."
), ),
HelpTopic( HelpTopic(
symbol: "arrow.up.arrow.down", symbol: "arrow.up.arrow.down",
title: "이전 기간과 비교", title: "이전 기간과 비교",
body: "통계 탭 맨 위의 비교 카드는 지금 보고 있는 하루·주·월의 총 시간과 횟수를 바로 앞 기간(어제·지난주·지난달)과 비교해 보여줘요. 필터를 걸면 필터된 행동들만으로 비교돼요." body: "통계 탭 맨 위의 비교 카드는 지금 보고 있는 하루·주·월의 총 시간과 횟수를 바로 앞 기간(어제·지난주·지난달)과 비교해 보여줘요. 필터를 걸면 필터된 행동들만으로 비교돼요.\n주간·월간에서 '지난 7일/30일 단위로 보기'를 켜면 달력 주·월 대신 오늘로 끝나는 최근 7일·30일을 볼 수 있어요 — 주초·월초에 그래프가 거의 비어 보일 때 유용해요. 비교 카드도 바로 앞 7일·30일과 비교로 바뀌고, 통계 위젯에도 '지난 7일/30일' 기간이 있어요."
), ),
]) ])
} }
@ -325,7 +325,7 @@ struct HelpView: View {
HelpTopic( HelpTopic(
symbol: "square.and.arrow.up.on.square", symbol: "square.and.arrow.up.on.square",
title: "일기 내보내기", title: "일기 내보내기",
body: "달력 화면 오른쪽 위 내보내기 버튼에서 기간(며칠부터 며칠까지)이나 여러 날짜를 골라 PDF 또는 이미지로 저장해요. 요약 페이지와 노트 페이지가 그대로 담겨요." body: "달력 화면 오른쪽 위 내보내기 버튼에서 기간(며칠부터 며칠까지)이나 여러 날짜를 골라 PDF 또는 이미지로 저장해요. 요약 페이지와 노트 페이지가 그대로 담겨요.\n파일을 만든 뒤에는 '내보낸 날짜의 일기 삭제'로 방금 저장한 일기들을 앱에서 지워 저장 공간을 줄일 수 있어요. 필기·사진이 함께 지워지고 iCloud 동기화 중이면 다른 기기에서도 삭제되니, 공유로 파일을 먼저 저장했는지 확인해 주세요."
), ),
HelpTopic( HelpTopic(
symbol: "lock.fill", symbol: "lock.fill",

View File

@ -0,0 +1,22 @@
# 버전 1.4 '새로운 기능' (로케일별)
[ko]
• 이제 iOS 18부터 쓸 수 있어요 — iPhone XS·XR과 구형 아이패드에서도 하루 다님을 만나 보세요
• 통계에 '지난 7일/30일 단위로 보기'가 생겼어요 — 주초·월초에 그래프가 허전할 때, 오늘로 끝나는 최근 7일·30일로 볼 수 있어요. 통계 위젯에도 같은 기간이 추가됐어요
• 데이터 정리·초기화가 생겼어요 — 오래 쌓인 기록을 전체 또는 지정한 날짜까지 비울 수 있어요. 삭제 전에 CSV 백업과, 그동안의 기록을 한눈에 담은 '정리 리포트'(PDF·이미지)를 만들어 보관하세요
• 데이터 내보내기에 구간 지정이 생겼고, 일기도 내보낸 뒤 바로 삭제해 저장 공간을 줄일 수 있어요
• 애플 펜슬 필기가 한층 부드러워졌어요 — 오래 쓴 페이지에서 획마다 걸리던 저장 부하를 없앴어요
[en]
• Now available from iOS 18 — enjoy Haru Danim on iPhone XS/XR and older iPads too
• Stats gained 'View as Last 7/30 Days' — when charts feel empty early in a week or month, switch to the most recent 7 or 30 days ending today. The stats widget offers the same periods
• Data Cleanup & Reset is here — clear long-accumulated records entirely or up to a chosen date. Before deleting, create a CSV backup and a summary report (PDF/image) that captures your records at a glance
• Data Export now supports custom ranges, and diaries can be deleted right after exporting to free up space
• Apple Pencil writing feels smoother — we removed the per-stroke saving overhead that built up on long pages
[ja]
• iOS 18から使えるようになりました — iPhone XS・XRや旧型iPadでもHaru Danimをどうぞ
• 統計に「過去7日/30日単位で表示」が加わりました — 週初め・月初めにグラフが寂しいとき、今日で終わる直近7日・30日で表示できます。統計ウィジェットにも同じ期間が追加されました
• データ整理・リセットが登場 — 長くたまった記録を全体または指定した日付まで空にできます。削除前にCSVバックアップと、これまでの記録をひと目でまとめた「整理レポート」(PDF・画像)を作成して保管しましょう
• データエクスポートに範囲指定が加わり、日記も書き出した直後に削除して容量を減らせます
• Apple Pencilの書き心地がいっそう滑らかに — 長く書いたページでストロークごとに掛かっていた保存の負荷をなくしました

File diff suppressed because it is too large Load Diff