① 중단 확인: 하단 시트(confirmationDialog) → 버튼 자리에서 펼쳐지는 인라인 확인
(안내 문구 + 계속하기(그린)/중단하기(레드), scale+opacity 전환)
② 통계: 아래→위 스와이프로 반전, 하단 중앙 손잡이(위 화살표+캡슐), 통통 튀는 스프링
(dampingFraction 0.62), 통계 상단에 닫기 손잡이 추가, 닫기=아래로 스와이프
③ 진동 3종(기본·톡톡·지이이잉)으로 재설계 — 체이닝 간격도 길다는 피드백:
- iOS 포그라운드: Core Haptics 정밀 재생(Shared/HapticEnginePlayer) — 기본 0.25s,
톡톡 0.14s×2 시작 간격 0.28s(요구 0.5s 미만), 지이이잉 1.2s 연속, 세기 1.0
- iOS 백그라운드 폴백: 시스템 바이브 완료 체이닝(1방/2방/3방 즉시 잇기)
- 워치: watchOS SDK에 CoreHaptics 부재(실측) — 강한 시스템 햅틱 매핑
(기본=.notification, 톡톡=.directionUp, 지이이잉=.retry — 내장이라 간격 뭉개짐 없음)
- 구버전 저장 패턴 자동 이관, 기본값 수축=지이이잉·이완=기본
- 신규 QA 인자 -confirmStop, 도움말 문구·번역(en/ja) 갱신, stale 정리(카탈로그 0/0)
- 검증: Debug·Release·워치 빌드 그린, 화면 QA(메인 하단 손잡이·통계 시트·중단 인라인 레드)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UPmp29DQHY6Ahfss5SRopT
308 lines
6.4 KiB
Plaintext
308 lines
6.4 KiB
Plaintext
{
|
||
"sourceLanguage": "ko",
|
||
"strings": {
|
||
"%lld / %lld": {
|
||
"localizations": {
|
||
"en": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "%lld / %lld"
|
||
}
|
||
},
|
||
"ja": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "%lld / %lld"
|
||
}
|
||
},
|
||
"ko": {
|
||
"stringUnit": {
|
||
"state": "new",
|
||
"value": "%1$lld / %2$lld"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"%lld회 완주": {
|
||
"localizations": {
|
||
"en": {
|
||
"variations": {
|
||
"plural": {
|
||
"one": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "%lld rep done"
|
||
}
|
||
},
|
||
"other": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "%lld reps done"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"ja": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "%lld回完了"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"기본": {
|
||
"localizations": {
|
||
"en": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "Standard"
|
||
}
|
||
},
|
||
"ja": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "標準"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"기타": {
|
||
"localizations": {
|
||
"en": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "Other"
|
||
}
|
||
},
|
||
"ja": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "その他"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"수축": {
|
||
"localizations": {
|
||
"en": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "Squeeze"
|
||
}
|
||
},
|
||
"ja": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "締める"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"수축 %lld초 · 이완 %lld초 · %lld회": {
|
||
"localizations": {
|
||
"en": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "Squeeze %lld s · Relax %lld s · ×%lld"
|
||
}
|
||
},
|
||
"ja": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "締める%lld秒 · ゆるめる%lld秒 · %lld回"
|
||
}
|
||
},
|
||
"ko": {
|
||
"stringUnit": {
|
||
"state": "new",
|
||
"value": "수축 %1$lld초 · 이완 %2$lld초 · %3$lld회"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"시작": {
|
||
"localizations": {
|
||
"en": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "Start"
|
||
}
|
||
},
|
||
"ja": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "開始"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"완료!": {
|
||
"localizations": {
|
||
"en": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "Done!"
|
||
}
|
||
},
|
||
"ja": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "完了!"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"이완": {
|
||
"localizations": {
|
||
"en": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "Relax"
|
||
}
|
||
},
|
||
"ja": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "ゆるめる"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"준비": {
|
||
"localizations": {
|
||
"en": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "Ready"
|
||
}
|
||
},
|
||
"ja": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "準備"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"중단": {
|
||
"localizations": {
|
||
"en": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "Stop"
|
||
}
|
||
},
|
||
"ja": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "中断"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"지이이잉": {
|
||
"localizations": {
|
||
"en": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "Long buzz"
|
||
}
|
||
},
|
||
"ja": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "ブーッ"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"케겔 운동 시작": {
|
||
"localizations": {
|
||
"en": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "Start Kegel Workout"
|
||
}
|
||
},
|
||
"ja": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "ケーゲル運動を開始"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"코어 트레이닝": {
|
||
"localizations": {
|
||
"en": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "Core Training"
|
||
}
|
||
},
|
||
"ja": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "コアトレーニング"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"톡톡": {
|
||
"localizations": {
|
||
"en": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "Double tap"
|
||
}
|
||
},
|
||
"ja": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "トントン"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"현재 %lld번째, 전체 %lld회": {
|
||
"localizations": {
|
||
"en": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "Rep %lld of %lld"
|
||
}
|
||
},
|
||
"ja": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "%lld回目、全%lld回"
|
||
}
|
||
},
|
||
"ko": {
|
||
"stringUnit": {
|
||
"state": "new",
|
||
"value": "현재 %1$lld번째, 전체 %2$lld회"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"확인": {
|
||
"localizations": {
|
||
"en": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "OK"
|
||
}
|
||
},
|
||
"ja": {
|
||
"stringUnit": {
|
||
"state": "translated",
|
||
"value": "OK"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"version": "1.0"
|
||
} |