From ce8ca50feb1b62256e2b686cbd48b366e20d9fc6 Mon Sep 17 00:00:00 2001 From: songyc macbook Date: Tue, 14 Jul 2026 00:24:29 +0900 Subject: [PATCH] docs(help): update help & CLAUDE.md for the new feature batch, l10n fill MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 도움말: 장시간 측정 알림(측정 토픽), CSV 백업(새 토픽), 일기 텍스트 상자·페이지 순서, 워치 즐겨찾기, 제어 센터 실행(새 토픽), 만료 후 데이터·일기 정책 문구 반영 - CLAUDE.md: §3 DiaryPageItem.text, §5.3 커밋 전파(컨트롤 리로드·워치 디바운스·알림 동기화), §6.1 온보딩 빈 화면, §6.7 만료 열람 모드·텍스트 상자·페이지 순서, §6.8 장시간 알림·데이터 내보내기, §8 만료 정책, §9 워치 즐겨찾기, §10 제어 센터 컨트롤, §12 컨트롤 인텐트, §14 새 인자 - 신규 문자열 49건 en/ja 번역 (missing: []) - 최종 검증: Debug·Store·watchOS 3개 스킴 빌드 성공, 인텐트 스모크 테스트 10개 시나리오 재통과 Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7 --- myApp/HaruDanim/CLAUDE.md | 22 +- myApp/HaruDanim/IOS/Localizable.xcstrings | 808 +++++++++++++++++++++- myApp/HaruDanim/IOS/Views/HelpView.swift | 18 +- 3 files changed, 830 insertions(+), 18 deletions(-) diff --git a/myApp/HaruDanim/CLAUDE.md b/myApp/HaruDanim/CLAUDE.md index 8f2c363..466198c 100644 --- a/myApp/HaruDanim/CLAUDE.md +++ b/myApp/HaruDanim/CLAUDE.md @@ -87,7 +87,7 @@ xcrun xcstringstool sync IOS/Localizable.xcstrings --stringsdata "${files[@]}" | `DiaryEntry` | dayKey(논리적 하루 키), moodEmoji, moodImageData(externalStorage), **calendarEventIDs[]**(그날 타임테이블에 넣을 EKEvent id), **hiddenActionIDs[]**(그날 타임테이블에서 숨길 Action.uuid 문자열) | 날짜당 1개. 날짜별 선택은 uuid 문자열로 저장(기기 간 동기화 안전) | | `DiaryTodo` | text, isDone, sortOrder | 요약 페이지 체크리스트 | | `DiaryPage` | index, lined, lineSpacing, drawingData(PKDrawing, externalStorage) | 768×1024 논리 좌표 | -| `DiaryPageItem` | kind(photo/rectangle/ellipse/arrow/line), imageData, colorHex, centerX/Y·widthRatio(비율 좌표), rotationDegrees | | +| `DiaryPageItem` | kind(photo/rectangle/ellipse/arrow/line/**text**), imageData, **text**(텍스트 상자 내용), colorHex, centerX/Y·widthRatio(비율 좌표), rotationDegrees | | --- @@ -129,7 +129,7 @@ xcrun xcstringstool sync IOS/Localizable.xcstrings --stringsdata "${files[@]}" - 설정 키는 `Shared/Settings.swift` — 집계 기준·테마·대표시간 등은 App Group defaults(위젯 공유), navStyle·visibleTabs·radialTabOrder·diary.section* 은 standard(기기 로컬) ### 5.3 변경 전파 -- 앱 내 모든 mutation 끝에 **`DataChange.commit(context:)`**: save → LiveActivity sync → `WidgetCenter.reloadAllTimelines()` → 워치 스냅숏 push. 위젯/시리 경로는 `IntentStore.performWrite`가 같은 역할(한 컨텍스트로 조회·수정·저장 원자 처리 + 저장 1회 재시도) +- 앱 내 모든 mutation 끝에 **`DataChange.commit(context:)`**: save → LiveActivity sync(장시간 측정 알림 예약 동기화 포함) → `WidgetCenter.reloadAllTimelines()` + `ControlCenter.reloadAllControls()` → 워치 스냅숏 push(350ms 디바운스 — 연타 시 마지막 상태만 집계·전송). 위젯/시리 경로는 `IntentStore.performWrite`가 같은 역할(한 컨텍스트로 조회·수정·저장 원자 처리 + 저장 1회 재시도) - `CloudSyncMonitor`: NSPersistentStoreRemoteChange를 2초 디바운스로 받아 위젯·워치·LiveActivity 갱신 (화면은 건드리지 않음) - `AppRefresh`(모음 탭 새로고침 버튼): 루트 뷰 `.id(token)` 리셋으로 모든 @Query 재조회 — 다른 기기 변경이 화면에 안 보일 때의 수동 해결책 @@ -153,6 +153,7 @@ xcrun xcstringstool sync IOS/Localizable.xcstrings --stringsdata "${files[@]}" - 배치 편집: 지글 애니메이션 + 드래그 재정렬 → `local.actionOrder` 저장 (CloudKit 모델에 쓰지 않음) - "짧은 기록 무시"(minSessionSeconds): 설정보다 짧은 세션은 종료 시 삭제. 메모 창 옵션 켠 행동은 종료/+1 시 메모 시트(건너뛰기 가능) - 툴바: 새로고침(좌) / 배치 편집(우) +- 빈 상태(행동 0개): 개념 한 줄 소개 + '첫 행동 만들기'(추가 시트 직행) + '예시 행동으로 시작해 보기'(꼬리표 생활·건강 + 독서/운동/물 마시기 생성) ### 6.2 행동 탭 (`ActionViews`) - 즐겨찾기 섹션(스와이프로 토글) → 꼬리표별 그룹 → 꼬리표 없음. 탭하면 상세(정보·즐겨찾기·메모 창 토글·누적 통계·삭제) @@ -187,12 +188,14 @@ xcrun xcstringstool sync IOS/Localizable.xcstrings --stringsdata "${files[@]}" - 상세: 좌우 페이지 넘김. 1페이지=하루 정리 요약, 이후=펜슬 노트, 마지막=페이지 추가 자리 - **요약 페이지 섹션** (표시·순서는 "첫 화면 구성" 시트, 전 날짜 공통, standard defaults): 오늘 기분(대형 정사각 타일: 이모지/사진) · 요약 지표 · 이 날의 목표(그날 기준 다짐 현황, 주간/월간은 그날까지 누적) · 오늘 할 일 · 타임테이블 · 기록 상세 · 통계 막대. 화면 720pt 이상이면 타임테이블 좌측 고정 2컬럼 - 타임테이블 카드 우상단 버튼: **필터**(그날 기록된 행동만 나열된 팝업에서 표시 선택, 날짜별 저장 `hiddenActionIDs`, 숨긴 개수 노란 배지 — 타임테이블에만 적용, 요약 수치·기록 목록은 전체 유지) + **캘린더**(그날의 EKEvent 선택, 날짜별 저장, 외곽선 스타일 블록). 둘 다 내보내기에 동일 반영 -- 노트 페이지: 768×1024 논리 좌표 고정 + scaleEffect. **실기기 필기는 펜슬 전용, 손가락은 이동/줌만**(시뮬레이터는 anyInput). 핀치줌 최대 4배, `SharpPencilCanvasView`가 contentsScale을 줌에 맞춰 유지(획 선명도). 줄 노트(간격 4단계)·사진·도형(사각/원/화살표/선) 배치 모드(드래그·핀치 크기 조절, 저장은 비율 좌표) +- **프리미엄 만료 열람 모드**: 이미 쓴 일기(hasContent)가 있으면 잠금 화면 대신 달력을 열람 전용으로 연다 — 배너 + 일기 있는 날짜만 활성, `environment(\.diaryReadOnly)`로 전 화면의 편집 UI(기분/할일/필기/필터/캘린더/⋯메뉴) 비활성, 열람 진입은 엔트리를 생성하지 않음. 일기를 쓴 적 없으면 기존 잠금 안내 +- 노트 페이지: 768×1024 논리 좌표 고정 + scaleEffect. 배치 요소: 사진·도형(사각/원/화살표/선)·**텍스트 상자**(키보드 입력, 배치 모드에서 '글 수정'으로 내용·색 편집). ⋯ 메뉴 '페이지 순서 변경'으로 노트 페이지 드래그 재배열(요약은 항상 첫 장). **실기기 필기는 펜슬 전용, 손가락은 이동/줌만**(시뮬레이터는 anyInput). 핀치줌 최대 4배, `SharpPencilCanvasView`가 contentsScale을 줌에 맞춰 유지(획 선명도). 줄 노트(간격 4단계)·사진·도형(사각/원/화살표/선) 배치 모드(드래그·핀치 크기 조절, 저장은 비율 좌표) ### 6.8 설정 탭 (`SettingsView`) - 테마(라이트/다크 — 즉시 적용, App Group 저장으로 위젯 공유) / 언어(재시작 적용, AppleLanguages 오버라이드) - iPhone만: 내비게이션 방식(탭바/버블) + 탭바 구성 or 버블 순서 -- 모음 탭 목표 카드 선택(개수 무제한)+표시 방식 / 주 시작 요일 / 하루 시작 시간 / 짧은 기록 무시 / 대표 시간 기준(가장 먼저·나중에 시작 — 기본 latest) +- 모음 탭 목표 카드 선택(개수 무제한)+표시 방식 / 주 시작 요일 / 하루 시작 시간 / 짧은 기록 무시 / **장시간 측정 알림**(1~12시간, 켜는 순간 알림 권한 요청 — `SessionAlertManager`가 LiveActivityManager.sync 길목에서 진행 세션과 예약을 동기화, 세션 종료·설정 변경 시 예약 제거) / 대표 시간 기준(가장 먼저·나중에 시작 — 기본 latest) +- 데이터: **데이터 내보내기** — 행동·시간·횟수·목표·다짐을 CSV 5파일로 (ISO 8601, UTF-8 BOM, 무료 포함) - 프리미엄 화면(§8) / 도움말(`HelpView` — 기기별 주제 분기, DisclosureGroup) / 버전 --- @@ -214,7 +217,8 @@ xcrun xcstringstool sync IOS/Localizable.xcstrings --stringsdata "${files[@]}" - `PremiumStore`: 상품 로드·구매·복원(`AppStore.sync`)·현재 플랜(평생 > 만료 먼 구독). 구매/복원 후 권한 재계산 + 위젯 리로드 - 결제 화면(`PremiumView`): 기능 소개 → 미구매 시 상품 3종(년 구독 절약률 배지, 평생 "한 번 결제") + 복원. 구매 후: 플랜 표시 + 구독 관리 시트 + **기기 간 동기화 토글** + 구독→평생 전환 안내 - DEBUG 전용: 테스트 토글(`setMockPremium` — 켜면 실권한 무시 모드) + "토글 강제 해제". 실구매·복원은 강제 모드를 자동 해제 -- 프리미엄 기능: 개수 무제한, 홈·잠금 위젯, 워치 앱+컴플리케이션, 시리 단축어, iCloud 동기화, iPad 일기 +- 프리미엄 기능: 개수 무제한, 홈·잠금 위젯, 워치 앱+컴플리케이션, 시리 단축어, iCloud 동기화, iPad 일기, 제어 센터 컨트롤 +- **만료 정책**: 기존 데이터·기록은 계속 사용(추가 생성만 한도 적용), 위젯·컨트롤은 프리미엄 안내 표시, 일기는 이미 쓴 것 열람 전용 허용(§6.7) --- @@ -238,6 +242,7 @@ xcrun xcstringstool sync IOS/Localizable.xcstrings --stringsdata "${files[@]}" | ④ 다짐 현황 `HaruGoalQuestGridWidget` | 표시 전용 링 그리드 + 목표 헤더. 소형 2×2 / 중형 4×2 / 대형: 다짐16 / 목표4 / 목표2 | | ⑤ 행동 통계 `HaruStatsChartWidget` | 꺾은선(행동 색). 기간: 일주일/한 달(일별, 소형 제외→주별 대체)/한 달(주별). 선 수 제한 소2/중4/대6 | | 잠금화면 `HaruLockGoalWidget` | 목표 1개 달성률 — 원형 게이지/숫자만/다짐 점(달성=채움). circular/rectangular/inline | +| 제어 센터 `HaruActionRunControl` | iOS 18 ControlWidget — 행동 1개 토글(시간형 시작/종료, 횟수형 +1). `ToggleActionControlIntent`(SetValueIntent+LiveActivityIntent, 앱 프로세스 실행) | - 슬롯 규칙: 미선택이면 기본 대상 채움, 선택했으면 순서 존중 + 모자란 슬롯은 점선 빈 칸. '선택 안 함' 센티널 `NoneEntityID` - **타임라인 예산 전략**(`WidgetRefresh`): 주기 폴링 없음. 값 변경은 `DataChange.commit`/인텐트의 reloadAllTimelines가 담당. 측정 중일 때만 10분 간격 미래 엔트리 1시간치+.atEnd, 평상시엔 하루 경계(최대 4h) 안전망 @@ -248,7 +253,7 @@ xcrun xcstringstool sync IOS/Localizable.xcstrings --stringsdata "${files[@]}" ## 11. 애플워치 (프리미엄) -- **워치 앱**: 꼬리표 목록(측정 중 섹션 포함) → 행동 목록 → 탭으로 실행. iPhone과 실시간 연동 +- **워치 앱**: 첫 화면 = [측정 중 섹션] + **즐겨찾기**(앱에서 즐겨찾기한 행동 직행, WatchActionInfo.isFavorite는 구버전 캐시 호환 위해 optional) + 꼬리표 목록 → 행동 목록 → 탭으로 실행. iPhone과 실시간 연동 - **통신** (`WatchSyncManager`(iOS) ↔ `WatchStore`(워치), 페이로드 `WatchShared/WatchPayload.swift`): - iPhone→워치: `updateApplicationContext`(기본) + `transferCurrentComplicationUserInfo`(측정 상태 변경 또는 30분 경과 시만 — 일일 예산 절약) - 워치→iPhone: `sendMessage`(응답=최신 스냅숏), 실패/미활성 시 `transferUserInfo` 큐 폴백 (5분 지난 큐 명령은 무시) @@ -260,7 +265,7 @@ xcrun xcstringstool sync IOS/Localizable.xcstrings --stringsdata "${files[@]}" ## 12. 시리 단축어 (`Shared/HaruDanimIntents.swift`, 프리미엄 게이트) -인텐트: 측정 시작/종료(짧은 기록 무시 규칙 동일 적용) · 횟수 추가(1~999) · 행동 누적값 조회 · 목표 진행률 조회 · 다짐 진행률 조회(atMost는 한도 문구). 시작/종료와 `RunActionIntent`(위젯 버튼)는 **LiveActivityIntent 채택** — 앱 프로세스에서 실행되어 시리·위젯 탭의 백그라운드 실행에서도 다이나믹 아일랜드가 바로 뜬다 (위젯 버튼 응답성 회귀 시 RunActionIntent의 채택만 되돌릴 것). `RunActionIntent`는 `isDiscoverable=false`로 단축어 앱에서 숨김. +인텐트: 측정 시작/종료(짧은 기록 무시 규칙 동일 적용) · 횟수 추가(1~999) · 행동 누적값 조회 · 목표 진행률 조회 · 다짐 진행률 조회(atMost는 한도 문구). 시작/종료와 `RunActionIntent`(위젯 버튼)는 **LiveActivityIntent 채택** — 앱 프로세스에서 실행되어 시리·위젯 탭의 백그라운드 실행에서도 다이나믹 아일랜드가 바로 뜬다 (위젯 버튼 응답성 회귀 시 RunActionIntent의 채택만 되돌릴 것). `RunActionIntent`·`ToggleActionControlIntent`(제어 센터용 SetValueIntent)는 `isDiscoverable=false`로 단축어 앱에서 숨김. - **시리 문구**: `AppShortcutsProvider`에 기본 + 행동 이름 파라미터 문구("하루 다님에서 \(\.$action) 측정 시작" — 되묻지 않고 한 번에 실행). 번역은 **`IOS/AppShortcuts.xcstrings`**(일반 카탈로그와 별개, ko/en/ja). 행동 어휘는 앱 시작 시 `updateAppShortcutParameters()`로 갱신(새 행동은 다음 실행부터 음성 인식). - 엔티티(Action/Goal/Quest)는 EntityStringQuery + '선택 안 함' 항목(위젯 설정용 센티널이 단축어 앱 선택지에도 노출됨 — 알려진 트레이드오프). 도움말 프리미엄 그룹에 사용법 항목, 결제 화면 기능 목록에도 표기. 로직 검증은 `-intentSmokeTest` (§14) — perform() 10개 시나리오를 앱 안에서 실행하고 결과를 Documents/intent-smoke-test.txt로 남긴다. @@ -288,9 +293,10 @@ xcrun xcstringstool sync IOS/Localizable.xcstrings --stringsdata "${files[@]}" | 영역 | 인자 | |---|---| | 모음 | `-startEditing` `-expandGoalCard` `-pinGoals ` `-openStatsFor "이름"` `-openHistoryFor "이름"` `-autoStart "이름"` | +| 측정 알림 | `-settings.longSessionAlertHours `(설정 주입) `-longSessionAlertTestSeconds `(시간 대신 N초 발화, provisional 권한 자동) `-alertDump`(예약 상태 → Documents/session-alerts.txt) | | 목표 | `-goalShowEditor` `-goalShowFinished` `-goalReorder` `-goalScrollBottom` `-endGoalYesterday "제목"`(종료일을 어제로 — 실행 시점 자동 판정 검증) | | 기록/통계 | `-historyMode timetable` `-historyWeekly` `-excludeActions "이름,이름"` `-historyShowFilter` `-statShowFilter` `-statSpan ` `-statScrollBottom` `-showExport` `-exportDump`(Documents/export-dump.png) | -| 설정/기타 | `-settingsScrollGoal` `-settingsScrollPremium` `-premiumPreview` `-helpPreview` `-widgetPreview YES|lock` `-widgetPreviewScroll <앵커>` `cloudSync`(standard bool로 강제) `-intentSmokeTest`(시리 인텐트 10개 시나리오 실행 → Documents/intent-smoke-test.txt, -seedDemo·-premium과 함께) | +| 설정/기타 | `-settingsScrollGoal` `-settingsScrollPremium` `-premiumPreview` `-helpPreview` `-dataExportPreview`(+`-dataExportRun`이면 CSV 자동 생성 후 Documents 복사) `-widgetPreview YES|lock` `-widgetPreviewScroll <앵커>` `cloudSync`(standard bool로 강제) `-intentSmokeTest`(시리 인텐트 10개 시나리오 실행 → Documents/intent-smoke-test.txt, -seedDemo·-premium과 함께) | | 버블 | `-radialExpanded` | | 일기 | `-diarySeed` `-diaryOpenToday`(**`-startTab diary` 필수**) `-diaryPage ` `-diaryShowConfig` `-diaryShowExport`(달력 화면 onAppear — `-diaryOpenToday`와 함께 쓰면 안 뜸) `-diaryExportRun pdf|image`(결과를 Documents로 복사) `-diaryShowCalendarPicker` `-diarySeedEvents` `-diaryHideFirstAction` `-diaryShowActionFilter` / 섹션 강제: `-diary.sectionOrder "timetable,hero,goals"` `-diary.hiddenSections "mood,todos,records,bars"` | | 워치 | `-complicationPreview` `-complicationScroll` `-autoRunFirstAction` | diff --git a/myApp/HaruDanim/IOS/Localizable.xcstrings b/myApp/HaruDanim/IOS/Localizable.xcstrings index 8ad22e5..9370d4c 100644 --- a/myApp/HaruDanim/IOS/Localizable.xcstrings +++ b/myApp/HaruDanim/IOS/Localizable.xcstrings @@ -813,6 +813,28 @@ } } }, + "'%@' 측정이 %lld시간을 넘겼어요. 종료를 잊으셨다면 열어서 꺼 주세요.": { + "localizations": { + "ko": { + "stringUnit": { + "state": "new", + "value": "'%1$@' 측정이 %2$lld시간을 넘겼어요. 종료를 잊으셨다면 열어서 꺼 주세요." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Tracking '%@' has passed %lld hours. If you forgot to stop it, open the app and turn it off." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "「%@」の計測が%lld時間を超えました。終了し忘れた場合はアプリで停止してください。" + } + } + } + }, "'%@'은(는) 시간 측정 행동이에요. 측정 시작/종료를 사용해 주세요.": { "localizations": { "en": { @@ -925,6 +947,22 @@ } } }, + "12시간": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "12 hours" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "12時間" + } + } + } + }, "1분": { "localizations": { "en": { @@ -941,6 +979,38 @@ } } }, + "1시간": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "1 hour" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "1時間" + } + } + } + }, + "2시간": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "2 hours" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "2時間" + } + } + } + }, "30초": { "localizations": { "en": { @@ -957,6 +1027,22 @@ } } }, + "3시간": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "3 hours" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "3時間" + } + } + } + }, "3초": { "localizations": { "en": { @@ -989,6 +1075,54 @@ } } }, + "6시간": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "6 hours" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "6時間" + } + } + } + }, + "CSV 만들기": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Create CSV" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "CSVを作成" + } + } + } + }, + "CSV로 백업하기": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Back up as CSV" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "CSVでバックアップ" + } + } + } + }, "iCloud 동기화는 네트워크 상황에 따라 몇 초에서 몇 분까지 걸릴 수 있어요. 다른 기기의 기록이 안 보이면 모음 탭 왼쪽 위 새로고침 버튼을 눌러 주세요. 그래도 안 보이면 잠시 후 다시 시도하거나 두 기기 모두 인터넷 연결을 확인해 주세요.": { "localizations": { "en": { @@ -1504,6 +1638,22 @@ } } }, + "글 수정": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Edit Text" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "テキストを編集" + } + } + } + }, "글래스 버블 메뉴": { "localizations": { "en": { @@ -1520,6 +1670,22 @@ } } }, + "글자 색": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Text color" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "文字の色" + } + } + } + }, "금": { "comment": "요일 축약(금요일)", "localizations": { @@ -2375,6 +2541,22 @@ } } }, + "내보낼 데이터": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Data to Export" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "書き出すデータ" + } + } + } + }, "내비게이션": { "localizations": { "en": { @@ -2407,6 +2589,22 @@ } } }, + "내용을 입력하세요": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Enter text" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "内容を入力" + } + } + } + }, "넓게": { "localizations": { "en": { @@ -3240,6 +3438,38 @@ } } }, + "데이터": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Data" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "データ" + } + } + } + }, + "데이터 내보내기": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Export Data" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "データを書き出す" + } + } + } + }, "도움말": { "localizations": { "en": { @@ -3450,12 +3680,6 @@ }, "매달 %lld번째 %@요일": { "localizations": { - "ko": { - "stringUnit": { - "state": "new", - "value": "매달 %1$lld번째 %2$@요일" - } - }, "en": { "stringUnit": { "state": "translated", @@ -3467,6 +3691,12 @@ "state": "translated", "value": "毎月第%lld%@曜日" } + }, + "ko": { + "stringUnit": { + "state": "new", + "value": "매달 %1$lld번째 %2$@요일" + } } } }, @@ -3655,6 +3885,22 @@ } } }, + "모든 기록을 CSV 파일로 만들어 백업하거나 스프레드시트에서 열 수 있어요.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Export all your records as CSV files for backup or opening in a spreadsheet." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "すべての記録をCSVファイルとして書き出し、バックアップやスプレッドシートで開けます。" + } + } + } + }, "모음": { "localizations": { "en": { @@ -4153,6 +4399,22 @@ } } }, + "목표·다짐": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Goals & Quests" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "目標・クエスト" + } + } + } + }, "목표가 끝날 때 다짐들의 평균 달성률이 이 값 이상이면 '달성 완료'로 판정해요. 100%면 모든 다짐을 채워야 달성이에요. 다짐이 없는 목표는 지금처럼 직접 선택해요.": { "localizations": { "en": { @@ -4401,6 +4663,7 @@ } }, "무료로는 행동 10개·목표 2개·목표당 다짐 3개까지 만들 수 있어요. 프리미엄은 개수 제한이 풀리고 위젯, 애플워치 앱, 기기 간 동기화, 아이패드 일기를 쓸 수 있어요. 월·년 구독 또는 한 번만 결제하는 평생 이용권 중에 고르면 돼요.": { + "extractionState": "stale", "localizations": { "en": { "stringUnit": { @@ -4416,6 +4679,22 @@ } } }, + "무료로는 행동 10개·목표 2개·목표당 다짐 3개까지 만들 수 있어요. 프리미엄은 개수 제한이 풀리고 위젯, 애플워치 앱, 기기 간 동기화, 아이패드 일기를 쓸 수 있어요. 월·년 구독 또는 한 번만 결제하는 평생 이용권 중에 고르면 돼요. 구독이 끝나도 기록한 데이터는 그대로 남고, 이미 쓴 일기는 계속 열람할 수 있어요.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "The free plan allows up to 10 actions, 2 goals, and 3 quests per goal. Premium removes the limits and unlocks widgets, the Apple Watch app, device sync, and the iPad diary. Choose a monthly or yearly subscription, or a one-time lifetime purchase. Even after a subscription ends, your data stays, and you can still read the diary entries you wrote." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "無料ではアクション10個・目標2個・目標ごとにクエスト3個まで作れます。プレミアムでは制限がなくなり、ウィジェット、Apple Watchアプリ、デバイス間同期、iPadダイアリーが使えます。月額・年額サブスクリプションか、1回払いの買い切りから選べます。サブスクが終了してもデータはそのまま残り、書いた日記は引き続き閲覧できます。" + } + } + } + }, "무료와 프리미엄의 차이": { "localizations": { "en": { @@ -4752,6 +5031,22 @@ } } }, + "빈 캔버스": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Blank canvas" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "空白キャンバス" + } + } + } + }, "사각형": { "localizations": { "en": { @@ -5216,6 +5511,22 @@ } } }, + "설정 → 데이터 → '데이터 내보내기'에서 모든 기록(행동·시간·횟수·목표·다짐)을 CSV 파일로 만들 수 있어요. 스프레드시트에서 열어 분석하거나 백업으로 보관해 두세요. 무료에서도 사용할 수 있어요.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "In Settings → Data → 'Export Data', you can export all records (actions, time, counts, goals, quests) as CSV files. Open them in a spreadsheet or keep them as a backup. Available on the free plan too." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "設定 → データ → 「データを書き出す」で、すべての記録(アクション・時間・回数・目標・クエスト)をCSVファイルにできます。スプレッドシートで分析したり、バックアップとして保管しましょう。無料でも使えます。" + } + } + } + }, "설정 → 앱 → 하루 다님에서 캘린더 접근을 허용하면 일정을 타임테이블에 넣을 수 있어요.": { "localizations": { "en": { @@ -5281,6 +5592,7 @@ } }, "설정한 시간보다 짧게 측정하고 종료한 기록은 저장하지 않아요. 버튼을 실수로 눌렀을 때 유용해요.": { + "extractionState": "stale", "localizations": { "en": { "stringUnit": { @@ -5296,6 +5608,38 @@ } } }, + "설정한 시간보다 짧게 측정하고 종료한 기록은 저장하지 않아요. 버튼을 실수로 눌렀을 때 유용해요. 장시간 측정 알림은 측정이 설정한 시간을 넘기면 알려줘요 — 끄는 걸 잊었을 때 유용해요.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Sessions shorter than the set time aren't saved — useful for accidental taps. The long-session alert notifies you when tracking passes the set time — useful when you forget to stop." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "設定した時間より短い計測は保存されません。誤タップに便利です。長時間計測の通知は、計測が設定時間を超えるとお知らせします — 終了し忘れたときに便利です。" + } + } + } + }, + "손잡이를 끌어 노트 페이지 순서를 바꿔요. 하루 정리(요약)는 항상 첫 장이에요.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Drag the handles to reorder note pages. The daily summary is always the first page." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ハンドルをドラッグしてノートページの順序を変えます。1日のまとめ(サマリー)は常に最初のページです。" + } + } + } + }, "수": { "comment": "요일 축약(수요일)", "localizations": { @@ -5377,6 +5721,22 @@ } } }, + "습관이나 할 일을 '행동'으로 등록하면\n버튼 한 번으로 시간과 횟수를 기록할 수 있어요.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Register a habit or task as an 'action'\nand log time and counts with a single tap." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "習慣ややることを「アクション」として登録すると\nボタン1つで時間と回数を記録できます。" + } + } + } + }, "시각": { "localizations": { "en": { @@ -5729,6 +6089,22 @@ } } }, + "실행 상태": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Running state" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "実行状態" + } + } + } + }, "실행할 행동들과 누적값 표시 방식, 테마를 선택하세요. 선택하지 않은 칸은 비워 둬요.": { "localizations": { "en": { @@ -6098,6 +6474,22 @@ } } }, + "예시 행동으로 시작해 보기": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Start with example actions" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "サンプルのアクションで始める" + } + } + } + }, "오늘": { "localizations": { "en": { @@ -6354,6 +6746,22 @@ } } }, + "요소 %lld개": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "%lld items" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "要素%lld個" + } + } + } + }, "요약 지표": { "localizations": { "en": { @@ -6419,6 +6827,7 @@ } }, "워치 앱을 열면 꼬리표 목록이 보여요. 꼬리표를 탭하면 그 안의 행동들이 나오고, 행동을 탭하면 시간형은 측정 시작·종료, 횟수형은 +1이 기록돼요. 기록은 아이폰과 자동으로 동기화돼요.": { + "extractionState": "stale", "localizations": { "en": { "stringUnit": { @@ -6434,6 +6843,22 @@ } } }, + "워치 앱을 열면 꼬리표 목록이 보여요. 꼬리표를 탭하면 그 안의 행동들이 나오고, 행동을 탭하면 시간형은 측정 시작·종료, 횟수형은 +1이 기록돼요. 아이폰 앱에서 즐겨찾기한 행동은 첫 화면 맨 위 '즐겨찾기'에서 한 탭 만에 열 수 있어요. 기록은 아이폰과 자동으로 동기화돼요.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Open the watch app to see your tag list. Tap a tag to see its actions; tapping an action starts/stops time tracking or adds +1 for counts. Actions you favorited on iPhone appear under 'Favorites' at the top of the first screen, one tap away. Records sync with your iPhone automatically." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ウォッチアプリを開くとタグ一覧が表示されます。タグをタップするとその中のアクションが表示され、アクションをタップすると時間タイプは計測の開始・終了、回数タイプは+1が記録されます。iPhoneでお気に入りにしたアクションは最初の画面の一番上「お気に入り」からワンタップで開けます。記録はiPhoneと自動的に同期されます。" + } + } + } + }, "워치 페이스를 길게 눌러 '편집' → 컴플리케이션 자리에서 하루 다님을 골라요. 현재 측정 중인 행동, 특정 목표의 달성률, 특정 다짐의 진행률을 페이스에서 바로 볼 수 있어요. 어떤 목표·다짐을 보여줄지는 컴플리케이션을 탭해 설정해요.": { "localizations": { "en": { @@ -6803,6 +7228,22 @@ } } }, + "이 날짜의 일기가 없어요": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "No diary for this date" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "この日の日記はありません" + } + } + } + }, "이 목표를 이루기 위한 다짐(행동/꼬리표 + 주기 + 목표량)을 추가하세요.": { "localizations": { "en": { @@ -7445,6 +7886,22 @@ } } }, + "장시간 측정 알림": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Long-session alert" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "長時間計測の通知" + } + } + } + }, "저장": { "localizations": { "en": { @@ -7557,6 +8014,54 @@ } } }, + "제어 센터 버튼으로 실행할 행동을 선택하세요.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Choose the action to run from the Control Center button." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "コントロールセンターのボタンで実行するアクションを選んでください。" + } + } + } + }, + "제어 센터를 편집해 '하루 다님'의 '행동 실행' 컨트롤을 추가하면, 화면을 켜자마자 행동을 실행할 수 있어요. 시간형은 시작/종료 토글, 횟수형은 탭마다 +1이에요. 잠금화면 하단 버튼이나 액션 버튼에도 배치할 수 있어요.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Edit Control Center and add HaruDanim's 'Run Action' control to run an action the moment the screen turns on. Time actions toggle start/stop; count actions add +1 per tap. You can also place it on the Lock Screen buttons or the Action button." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "コントロールセンターを編集してハルダニムの「アクション実行」コントロールを追加すると、画面を点けてすぐアクションを実行できます。時間計測は開始/終了のトグル、回数記録はタップごとに+1。ロック画面下部のボタンやアクションボタンにも配置できます。" + } + } + } + }, + "제어 센터에서 실행 (프리미엄)": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Run from Control Center (Premium)" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "コントロールセンターから実行(プレミアム)" + } + } + } + }, "좁게": { "localizations": { "en": { @@ -8198,6 +8703,22 @@ } } }, + "첫 행동 만들기": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Create First Action" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "最初のアクションを作成" + } + } + } + }, "첫 화면 구성": { "localizations": { "en": { @@ -8440,6 +8961,22 @@ } } }, + "측정이 계속되고 있어요": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Still tracking" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "計測が続いています" + } + } + } + }, "캘린더 일정": { "localizations": { "en": { @@ -8648,6 +9185,22 @@ } } }, + "탭해서 +1": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Tap for +1" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タップで+1" + } + } + } + }, "탭해서 남기기": { "localizations": { "en": { @@ -8680,6 +9233,38 @@ } } }, + "텍스트": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Text" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "テキスト" + } + } + } + }, + "텍스트 상자": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Text Box" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "テキストボックス" + } + } + } + }, "토": { "comment": "요일 축약(토요일)", "localizations": { @@ -8857,6 +9442,54 @@ } } }, + "페이지 %lld": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Page %lld" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ページ%lld" + } + } + } + }, + "페이지 순서": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Page Order" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ページの順序" + } + } + } + }, + "페이지 순서 변경": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Reorder Pages" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ページの順序を変更" + } + } + } + }, "페이지 추가": { "localizations": { "en": { @@ -8873,7 +9506,24 @@ } } }, + "페이지를 넘기면 자유 노트가 이어져요. 애플 펜슬로 쓰고 그리고, '사진'·'도형'·'텍스트'(키보드로 쓰는 글 상자)를 추가한 뒤 '배치 모드'에서 드래그·핀치로 옮기고 크기를 바꿔요. 두 손가락 핀치로 페이지를 확대해 세밀하게 쓸 수 있고, 줄 노트를 켜면 줄 간격도 고를 수 있어요. 페이지가 여러 장이면 오른쪽 위 ⋯ 메뉴의 '페이지 순서 변경'으로 순서를 바꿀 수 있어요.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Swipe to continue onto free-form note pages. Write and draw with Apple Pencil, add Photos, Shapes, and Text (typed text boxes), then use Arrange mode to drag and pinch them into place. Pinch with two fingers to zoom in for detail, and turn on lined paper to pick a line spacing. With multiple pages, use 'Reorder Pages' in the ⋯ menu at the top right." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ページをめくると自由なノートが続きます。Apple Pencilで書いて描いて、「写真」「図形」「テキスト」(キーボードで書くテキストボックス)を追加し、「配置モード」でドラッグ・ピンチで動かしてサイズを変えられます。2本指ピンチで拡大して細かく書け、罫線ノートをオンにすると行間も選べます。ページが複数あるときは右上の⋯メニューの「ページの順序を変更」で並べ替えられます。" + } + } + } + }, "페이지를 넘기면 자유 노트가 이어져요. 애플 펜슬로 쓰고 그리고, '사진'과 '도형'을 추가한 뒤 '배치 모드'에서 드래그·핀치로 옮기고 크기를 바꿔요. 두 손가락 핀치로 페이지를 확대해 세밀하게 쓸 수 있고, 줄 노트를 켜면 줄 간격도 고를 수 있어요.": { + "extractionState": "stale", "localizations": { "en": { "stringUnit": { @@ -9081,6 +9731,22 @@ } } }, + "프리미엄 기간이 끝나 열람만 가능해요. 이미 쓴 일기는 계속 볼 수 있어요.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Your premium period has ended, so the diary is view-only. You can still read everything you wrote." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "プレミアム期間が終了したため閲覧のみ可能です。書いた日記は引き続き見られます。" + } + } + } + }, "프리미엄 기능": { "localizations": { "en": { @@ -9145,6 +9811,38 @@ } } }, + "프리미엄 필요": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Premium required" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "プレミアムが必要" + } + } + } + }, + "프리미엄에서 새 일기를 쓸 수 있어요.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Write new diary entries with premium." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "プレミアムで新しい日記が書けます。" + } + } + } + }, "프리미엄으로 할 수 있는 것": { "localizations": { "en": { @@ -9161,6 +9859,22 @@ } } }, + "필기 있음": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Has handwriting" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "手書きあり" + } + } + } + }, "필터 버튼으로 보고 싶은 행동만 골라 볼 수 있어요. 설정의 '주 시작 요일'과 '하루 시작 시간'이 모든 집계에 적용돼요. 예를 들어 하루 시작을 06:00으로 두면 새벽 기록은 전날 실적으로 계산돼요.": { "localizations": { "en": { @@ -9816,6 +10530,7 @@ } }, "행동 버튼을 탭하면 시간형은 측정이 시작되고 다시 탭하면 종료돼요(테두리로 측정 중을 구분). 횟수형은 탭할 때마다 1씩 올라가요. 여러 행동을 동시에 측정해도 되고, 측정 중인 행동은 상단 '현재 진행 중' 영역에서도 종료할 수 있어요.": { + "extractionState": "stale", "localizations": { "en": { "stringUnit": { @@ -9831,6 +10546,22 @@ } } }, + "행동 버튼을 탭하면 시간형은 측정이 시작되고 다시 탭하면 종료돼요(테두리로 측정 중을 구분). 횟수형은 탭할 때마다 1씩 올라가요. 여러 행동을 동시에 측정해도 되고, 측정 중인 행동은 상단 '현재 진행 중' 영역에서도 종료할 수 있어요. 끄는 걸 자주 잊는다면 설정 → 측정의 '장시간 측정 알림'을 켜 보세요 — 정한 시간을 넘기면 알려줘요.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Tap an action button to start tracking time, and tap again to stop (a border marks what's running). Count actions go up by one per tap. You can track several actions at once, and stop any of them from the 'In Progress' area at the top. If you often forget to stop, turn on 'Long-session alert' in Settings → Tracking — it notifies you when tracking passes the set time." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "アクションボタンをタップすると時間計測が始まり、もう一度タップすると終了します(計測中は枠で区別)。回数タイプはタップごとに1ずつ増えます。複数のアクションを同時に計測でき、計測中のアクションは上部の「進行中」エリアからも終了できます。終了し忘れが多いなら、設定 → 計測の「長時間計測の通知」をオンにしてください — 設定時間を超えるとお知らせします。" + } + } + } + }, "행동 버튼의 색은 지정한 꼬리표의 색을 따라요.": { "localizations": { "en": { @@ -9863,6 +10594,22 @@ } } }, + "행동 선택": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Choose Action" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "アクションを選択" + } + } + } + }, "행동 설정 수정": { "localizations": { "en": { @@ -9927,6 +10674,22 @@ } } }, + "행동 없음": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "No actions" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "アクションなし" + } + } + } + }, "행동 이름 (예: 독서)": { "localizations": { "en": { @@ -9976,6 +10739,7 @@ } }, "행동 탭에서 추적할 행동을 추가해 보세요.": { + "extractionState": "stale", "localizations": { "en": { "stringUnit": { @@ -10007,6 +10771,22 @@ } } }, + "행동 하나를 골라 제어 센터에서 바로 실행해요. 시간 측정은 시작/종료 토글, 횟수 기록은 탭마다 +1. (프리미엄)": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Pick one action and run it right from Control Center. Time tracking toggles start/stop; counts add +1 per tap. (Premium)" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "アクションを1つ選んでコントロールセンターから直接実行。時間計測は開始/終了のトグル、回数はタップごとに+1。(プレミアム)" + } + } + } + }, "행동·목표·다짐을 무제한으로 만들 수 있어요.": { "localizations": { "en": { @@ -10023,6 +10803,22 @@ } } }, + "행동·시간 기록·횟수 기록·목표·다짐을 각각 CSV 파일로 만들어요. 스프레드시트에서 열거나 백업으로 보관할 수 있어요. 시각은 ISO 8601 형식이에요.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Creates a CSV file each for actions, time sessions, counts, goals, and quests. Open them in a spreadsheet or keep them as a backup. Timestamps use ISO 8601." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "アクション・時間記録・回数記録・目標・クエストをそれぞれCSVファイルにします。スプレッドシートで開いたり、バックアップとして保管できます。時刻はISO 8601形式です。" + } + } + } + }, "행동별 시간 (일별)": { "localizations": { "en": { diff --git a/myApp/HaruDanim/IOS/Views/HelpView.swift b/myApp/HaruDanim/IOS/Views/HelpView.swift index 0591928..d08c4cc 100644 --- a/myApp/HaruDanim/IOS/Views/HelpView.swift +++ b/myApp/HaruDanim/IOS/Views/HelpView.swift @@ -98,7 +98,7 @@ struct HelpView: View { HelpTopic( symbol: "play.circle.fill", title: "측정 시작·종료", - body: "행동 버튼을 탭하면 시간형은 측정이 시작되고 다시 탭하면 종료돼요(테두리로 측정 중을 구분). 횟수형은 탭할 때마다 1씩 올라가요. 여러 행동을 동시에 측정해도 되고, 측정 중인 행동은 상단 '현재 진행 중' 영역에서도 종료할 수 있어요." + body: "행동 버튼을 탭하면 시간형은 측정이 시작되고 다시 탭하면 종료돼요(테두리로 측정 중을 구분). 횟수형은 탭할 때마다 1씩 올라가요. 여러 행동을 동시에 측정해도 되고, 측정 중인 행동은 상단 '현재 진행 중' 영역에서도 종료할 수 있어요. 끄는 걸 자주 잊는다면 설정 → 측정의 '장시간 측정 알림'을 켜 보세요 — 정한 시간을 넘기면 알려줘요." ), HelpTopic( symbol: "hand.tap.fill", @@ -159,6 +159,11 @@ struct HelpView: View { title: "이미지로 내보내기", body: "기록·통계 탭 오른쪽 위 내보내기 버튼으로 지금 보고 있는 기간의 리포트를 고해상도 이미지로 만들 수 있어요. 라이트·다크 테마를 골라 공유하거나 사진에 저장해요." ), + HelpTopic( + symbol: "tablecells", + title: "CSV로 백업하기", + body: "설정 → 데이터 → '데이터 내보내기'에서 모든 기록(행동·시간·횟수·목표·다짐)을 CSV 파일로 만들 수 있어요. 스프레드시트에서 열어 분석하거나 백업으로 보관해 두세요. 무료에서도 사용할 수 있어요." + ), ]) } @@ -196,7 +201,7 @@ struct HelpView: View { HelpTopic( symbol: "applepencil", title: "펜슬 노트 페이지", - body: "페이지를 넘기면 자유 노트가 이어져요. 애플 펜슬로 쓰고 그리고, '사진'과 '도형'을 추가한 뒤 '배치 모드'에서 드래그·핀치로 옮기고 크기를 바꿔요. 두 손가락 핀치로 페이지를 확대해 세밀하게 쓸 수 있고, 줄 노트를 켜면 줄 간격도 고를 수 있어요." + body: "페이지를 넘기면 자유 노트가 이어져요. 애플 펜슬로 쓰고 그리고, '사진'·'도형'·'텍스트'(키보드로 쓰는 글 상자)를 추가한 뒤 '배치 모드'에서 드래그·핀치로 옮기고 크기를 바꿔요. 두 손가락 핀치로 페이지를 확대해 세밀하게 쓸 수 있고, 줄 노트를 켜면 줄 간격도 고를 수 있어요. 페이지가 여러 장이면 오른쪽 위 ⋯ 메뉴의 '페이지 순서 변경'으로 순서를 바꿀 수 있어요." ), HelpTopic( symbol: "square.and.arrow.up.on.square", @@ -225,6 +230,11 @@ struct HelpView: View { title: "다이나믹 아일랜드·잠금화면", body: "시간을 측정 중이면 다이나믹 아일랜드와 잠금화면에 진행 시간이 표시돼요. 여러 개를 동시에 측정하면 설정의 '대표 시간 기준'(먼저/나중에 시작한 행동)에 따라 하나가 대표로 보이고 나머지는 +N으로 표시돼요." ), + HelpTopic( + symbol: "switch.2", + title: "제어 센터에서 실행 (프리미엄)", + body: "제어 센터를 편집해 '하루 다님'의 '행동 실행' 컨트롤을 추가하면, 화면을 켜자마자 행동을 실행할 수 있어요. 시간형은 시작/종료 토글, 횟수형은 탭마다 +1이에요. 잠금화면 하단 버튼이나 액션 버튼에도 배치할 수 있어요." + ), ]) } @@ -235,7 +245,7 @@ struct HelpView: View { HelpTopic( symbol: "applewatch", title: "워치에서 기록하기", - body: "워치 앱을 열면 꼬리표 목록이 보여요. 꼬리표를 탭하면 그 안의 행동들이 나오고, 행동을 탭하면 시간형은 측정 시작·종료, 횟수형은 +1이 기록돼요. 기록은 아이폰과 자동으로 동기화돼요." + body: "워치 앱을 열면 꼬리표 목록이 보여요. 꼬리표를 탭하면 그 안의 행동들이 나오고, 행동을 탭하면 시간형은 측정 시작·종료, 횟수형은 +1이 기록돼요. 아이폰 앱에서 즐겨찾기한 행동은 첫 화면 맨 위 '즐겨찾기'에서 한 탭 만에 열 수 있어요. 기록은 아이폰과 자동으로 동기화돼요." ), HelpTopic( symbol: "watchface.applewatch.case", @@ -257,7 +267,7 @@ struct HelpView: View { HelpTopic( symbol: "crown.fill", title: "무료와 프리미엄의 차이", - body: "무료로는 행동 10개·목표 2개·목표당 다짐 3개까지 만들 수 있어요. 프리미엄은 개수 제한이 풀리고 위젯, 애플워치 앱, 기기 간 동기화, 아이패드 일기를 쓸 수 있어요. 월·년 구독 또는 한 번만 결제하는 평생 이용권 중에 고르면 돼요." + body: "무료로는 행동 10개·목표 2개·목표당 다짐 3개까지 만들 수 있어요. 프리미엄은 개수 제한이 풀리고 위젯, 애플워치 앱, 기기 간 동기화, 아이패드 일기를 쓸 수 있어요. 월·년 구독 또는 한 번만 결제하는 평생 이용권 중에 고르면 돼요. 구독이 끝나도 기록한 데이터는 그대로 남고, 이미 쓴 일기는 계속 열람할 수 있어요." ), HelpTopic( symbol: "mic.fill",