feat: redesign player with Dynamic Island, compact timer, and fix Live Activity timer drift
Some checks failed
CI / TypeScript (pull_request) Failing after 5s
CI / ESLint (pull_request) Failing after 3s
CI / Tests (pull_request) Failing after 5s
CI / Build Check (pull_request) Has been skipped
CI / Admin Web Tests (pull_request) Successful in 2m5s
CI / Deploy Edge Functions (pull_request) Has been skipped
Some checks failed
CI / TypeScript (pull_request) Failing after 5s
CI / ESLint (pull_request) Failing after 3s
CI / Tests (pull_request) Failing after 5s
CI / Build Check (pull_request) Has been skipped
CI / Admin Web Tests (pull_request) Successful in 2m5s
CI / Deploy Edge Functions (pull_request) Has been skipped
## What changed ### Player Redesign (video-first layout) - New compact timer ring (110pt) with phase label, replaces 240pt ring - Auto-hide top bar with block progress dots (3s auto-dismiss) - Expandable now-playing music pill with skip control - Bottom control bar with heart rate, play/pause, and skip - Exercise caption with 'Next' preview during rest phases - Compact round counter (capsule dots) ### Dynamic Island & Live Activities - WorkoutLiveActivity widget: expanded, compact, and minimal views - Phase-colored timers with Text(timerInterval:) countdown - Shows exercise name, round progress, heart rate, music track - MusicLiveActivity: standalone music now-playing widget - LiveActivityMusicBars animated component - Deep link from Dynamic Island back to app ### Timer Drift Fix (critical) - Store a stable phaseEndDate once per phase instead of recalculating Date() + timeRemaining on every update - Prevents dynamic island countdown from rubber-banding due to 5-second periodic update recalculation drift - Reset phaseEndDate on phase change and resume from pause - Guard Live Activity updates behind vm.isRunning to prevent premature creation when music track loads before workout start - Fixes timer showing 0 in Dynamic Island when expanding from home screen ### New PlayerViewModel timer engine - Full phase support: prep, warmup, work, rest, interBlockRest, cooldown, complete - 1-second countdown with audio cues at 3-2-1 - Phase transitions with spring animation and haptics - HealthKit live session integration - Workout session recording with completion ### Music Service - New MusicPlayerViewModel with vibe-based playlist loading - Track info exposed for Dynamic Island display - Skip track support from Dynamic Island notification action - Automatic play/pause based on phase and running state ### Additional - ZoneHighlightIcon component for HomeTab zone cards - Updated watchOS localizations with complication strings - Info.plist updated for widget extension
This commit is contained in:
@@ -1,207 +1,662 @@
|
||||
{
|
||||
"sourceLanguage" : "en",
|
||||
"strings" : {
|
||||
"%@" : {
|
||||
|
||||
"watch.phase.getReady" : {
|
||||
},
|
||||
"%@ day%@" : {
|
||||
"localizations" : {
|
||||
"de" : { "stringUnit" : { "state" : "translated", "value" : "BEREIT" } },
|
||||
"en" : { "stringUnit" : { "state" : "translated", "value" : "GET READY" } },
|
||||
"es" : { "stringUnit" : { "state" : "translated", "value" : "LISTO" } },
|
||||
"fr" : { "stringUnit" : { "state" : "translated", "value" : "PRÊT" } }
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "new",
|
||||
"value" : "%1$@ day%2$@"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"TabataGo" : {
|
||||
|
||||
"watch.phase.warmUp" : {
|
||||
"localizations" : {
|
||||
"de" : { "stringUnit" : { "state" : "translated", "value" : "AUFWÄRMEN" } },
|
||||
"en" : { "stringUnit" : { "state" : "translated", "value" : "WARM UP" } },
|
||||
"es" : { "stringUnit" : { "state" : "translated", "value" : "CALENTAMIENTO" } },
|
||||
"fr" : { "stringUnit" : { "state" : "translated", "value" : "ÉCHAUFFEMENT" } }
|
||||
}
|
||||
},
|
||||
|
||||
"watch.phase.work" : {
|
||||
"localizations" : {
|
||||
"de" : { "stringUnit" : { "state" : "translated", "value" : "ARBEIT" } },
|
||||
"en" : { "stringUnit" : { "state" : "translated", "value" : "WORK" } },
|
||||
"es" : { "stringUnit" : { "state" : "translated", "value" : "TRABAJO" } },
|
||||
"fr" : { "stringUnit" : { "state" : "translated", "value" : "TRAVAIL" } }
|
||||
}
|
||||
},
|
||||
|
||||
"watch.phase.rest" : {
|
||||
"localizations" : {
|
||||
"de" : { "stringUnit" : { "state" : "translated", "value" : "PAUSE" } },
|
||||
"en" : { "stringUnit" : { "state" : "translated", "value" : "REST" } },
|
||||
"es" : { "stringUnit" : { "state" : "translated", "value" : "DESCANSO" } },
|
||||
"fr" : { "stringUnit" : { "state" : "translated", "value" : "REPOS" } }
|
||||
}
|
||||
},
|
||||
|
||||
"watch.phase.break" : {
|
||||
"localizations" : {
|
||||
"de" : { "stringUnit" : { "state" : "translated", "value" : "PAUSE" } },
|
||||
"en" : { "stringUnit" : { "state" : "translated", "value" : "BREAK" } },
|
||||
"es" : { "stringUnit" : { "state" : "translated", "value" : "PAUSA" } },
|
||||
"fr" : { "stringUnit" : { "state" : "translated", "value" : "PAUSE" } }
|
||||
}
|
||||
},
|
||||
|
||||
"watch.phase.coolDown" : {
|
||||
"localizations" : {
|
||||
"de" : { "stringUnit" : { "state" : "translated", "value" : "ABKÜHLEN" } },
|
||||
"en" : { "stringUnit" : { "state" : "translated", "value" : "COOL DOWN" } },
|
||||
"es" : { "stringUnit" : { "state" : "translated", "value" : "ENFRIAMIENTO" } },
|
||||
"fr" : { "stringUnit" : { "state" : "translated", "value" : "RÉCUPÉRATION" } }
|
||||
}
|
||||
},
|
||||
|
||||
"watch.phase.done" : {
|
||||
"localizations" : {
|
||||
"de" : { "stringUnit" : { "state" : "translated", "value" : "FERTIG" } },
|
||||
"en" : { "stringUnit" : { "state" : "translated", "value" : "DONE" } },
|
||||
"es" : { "stringUnit" : { "state" : "translated", "value" : "HECHO" } },
|
||||
"fr" : { "stringUnit" : { "state" : "translated", "value" : "TERMINÉ" } }
|
||||
}
|
||||
},
|
||||
|
||||
"watch.idle.startOnPhone" : {
|
||||
"localizations" : {
|
||||
"de" : { "stringUnit" : { "state" : "translated", "value" : "Workout auf\ndeinem iPhone starten" } },
|
||||
"en" : { "stringUnit" : { "state" : "translated", "value" : "Start a workout\non your iPhone" } },
|
||||
"es" : { "stringUnit" : { "state" : "translated", "value" : "Inicia un entrenamiento\nen tu iPhone" } },
|
||||
"fr" : { "stringUnit" : { "state" : "translated", "value" : "Démarrer un entraînement\nsur votre iPhone" } }
|
||||
}
|
||||
},
|
||||
|
||||
"watch.idle.connected" : {
|
||||
"localizations" : {
|
||||
"de" : { "stringUnit" : { "state" : "translated", "value" : "Verbunden" } },
|
||||
"en" : { "stringUnit" : { "state" : "translated", "value" : "Connected" } },
|
||||
"es" : { "stringUnit" : { "state" : "translated", "value" : "Conectado" } },
|
||||
"fr" : { "stringUnit" : { "state" : "translated", "value" : "Connecté" } }
|
||||
}
|
||||
},
|
||||
|
||||
"watch.idle.noPhone" : {
|
||||
"localizations" : {
|
||||
"de" : { "stringUnit" : { "state" : "translated", "value" : "Kein Telefon" } },
|
||||
"en" : { "stringUnit" : { "state" : "translated", "value" : "No phone" } },
|
||||
"es" : { "stringUnit" : { "state" : "translated", "value" : "Sin teléfono" } },
|
||||
"fr" : { "stringUnit" : { "state" : "translated", "value" : "Pas de téléphone" } }
|
||||
}
|
||||
},
|
||||
|
||||
"watch.activity.today" : {
|
||||
"localizations" : {
|
||||
"de" : { "stringUnit" : { "state" : "translated", "value" : "Heute" } },
|
||||
"en" : { "stringUnit" : { "state" : "translated", "value" : "Today" } },
|
||||
"es" : { "stringUnit" : { "state" : "translated", "value" : "Hoy" } },
|
||||
"fr" : { "stringUnit" : { "state" : "translated", "value" : "Aujourd'hui" } }
|
||||
}
|
||||
},
|
||||
|
||||
"watch.activity.move" : {
|
||||
"localizations" : {
|
||||
"de" : { "stringUnit" : { "state" : "translated", "value" : "Bewegung" } },
|
||||
"en" : { "stringUnit" : { "state" : "translated", "value" : "Move" } },
|
||||
"es" : { "stringUnit" : { "state" : "translated", "value" : "Mover" } },
|
||||
"fr" : { "stringUnit" : { "state" : "translated", "value" : "Bouger" } }
|
||||
}
|
||||
},
|
||||
|
||||
"watch.activity.exercise" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : { "stringUnit" : { "state" : "translated", "value" : "Sport" } },
|
||||
"en" : { "stringUnit" : { "state" : "translated", "value" : "Exercise" } },
|
||||
"es" : { "stringUnit" : { "state" : "translated", "value" : "Ejercicio" } },
|
||||
"fr" : { "stringUnit" : { "state" : "translated", "value" : "Exercice" } }
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Sport"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Exercise"
|
||||
}
|
||||
},
|
||||
"es" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Ejercicio"
|
||||
}
|
||||
},
|
||||
"fr" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Exercice"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"watch.activity.move" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Bewegung"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Move"
|
||||
}
|
||||
},
|
||||
"es" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Mover"
|
||||
}
|
||||
},
|
||||
"fr" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Bouger"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"watch.activity.stand" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : { "stringUnit" : { "state" : "translated", "value" : "Stehen" } },
|
||||
"en" : { "stringUnit" : { "state" : "translated", "value" : "Stand" } },
|
||||
"es" : { "stringUnit" : { "state" : "translated", "value" : "Estar de pie" } },
|
||||
"fr" : { "stringUnit" : { "state" : "translated", "value" : "Debout" } }
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Stehen"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Stand"
|
||||
}
|
||||
},
|
||||
"es" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Estar de pie"
|
||||
}
|
||||
},
|
||||
"fr" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Debout"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"watch.activity.streak" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : { "stringUnit" : { "state" : "translated", "value" : "Serie" } },
|
||||
"en" : { "stringUnit" : { "state" : "translated", "value" : "streak" } },
|
||||
"es" : { "stringUnit" : { "state" : "translated", "value" : "racha" } },
|
||||
"fr" : { "stringUnit" : { "state" : "translated", "value" : "série" } }
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Serie"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "streak"
|
||||
}
|
||||
},
|
||||
"es" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "racha"
|
||||
}
|
||||
},
|
||||
"fr" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "série"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"watch.complication.notStarted" : {
|
||||
"watch.activity.today" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : { "stringUnit" : { "state" : "translated", "value" : "Nicht begonnen" } },
|
||||
"en" : { "stringUnit" : { "state" : "translated", "value" : "Not started" } },
|
||||
"es" : { "stringUnit" : { "state" : "translated", "value" : "No iniciado" } },
|
||||
"fr" : { "stringUnit" : { "state" : "translated", "value" : "Pas commencé" } }
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Heute"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Today"
|
||||
}
|
||||
},
|
||||
"es" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Hoy"
|
||||
}
|
||||
},
|
||||
"fr" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Aujourd'hui"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"watch.complication.today" : {
|
||||
"localizations" : {
|
||||
"de" : { "stringUnit" : { "state" : "translated", "value" : "Heute" } },
|
||||
"en" : { "stringUnit" : { "state" : "translated", "value" : "Today" } },
|
||||
"es" : { "stringUnit" : { "state" : "translated", "value" : "Hoy" } },
|
||||
"fr" : { "stringUnit" : { "state" : "translated", "value" : "Aujourd'hui" } }
|
||||
}
|
||||
},
|
||||
|
||||
"watch.complication.yesterday" : {
|
||||
"localizations" : {
|
||||
"de" : { "stringUnit" : { "state" : "translated", "value" : "Gestern" } },
|
||||
"en" : { "stringUnit" : { "state" : "translated", "value" : "Yesterday" } },
|
||||
"es" : { "stringUnit" : { "state" : "translated", "value" : "Ayer" } },
|
||||
"fr" : { "stringUnit" : { "state" : "translated", "value" : "Hier" } }
|
||||
}
|
||||
},
|
||||
|
||||
"watch.complication.daysAgoFmt" : {
|
||||
"comment" : "printf format string — %d = number of days",
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : { "stringUnit" : { "state" : "translated", "value" : "vor %d Tagen" } },
|
||||
"en" : { "stringUnit" : { "state" : "translated", "value" : "%d days ago" } },
|
||||
"es" : { "stringUnit" : { "state" : "translated", "value" : "hace %d días" } },
|
||||
"fr" : { "stringUnit" : { "state" : "translated", "value" : "il y a %d jours" } }
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "vor %d Tagen"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "%d days ago"
|
||||
}
|
||||
},
|
||||
"es" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "hace %d días"
|
||||
}
|
||||
},
|
||||
"fr" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "il y a %d jours"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"watch.complication.dayStreakFmt" : {
|
||||
"comment" : "printf format string — %d = streak count",
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : { "stringUnit" : { "state" : "translated", "value" : "%d Tage in Folge" } },
|
||||
"en" : { "stringUnit" : { "state" : "translated", "value" : "%d day streak" } },
|
||||
"es" : { "stringUnit" : { "state" : "translated", "value" : "%d días seguidos" } },
|
||||
"fr" : { "stringUnit" : { "state" : "translated", "value" : "%d jours de suite" } }
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "%d Tage in Folge"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "%d day streak"
|
||||
}
|
||||
},
|
||||
"es" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "%d días seguidos"
|
||||
}
|
||||
},
|
||||
"fr" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "%d jours de suite"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"watch.complication.openApp" : {
|
||||
"localizations" : {
|
||||
"de" : { "stringUnit" : { "state" : "translated", "value" : "TabataGo öffnen →" } },
|
||||
"en" : { "stringUnit" : { "state" : "translated", "value" : "Open TabataGo →" } },
|
||||
"es" : { "stringUnit" : { "state" : "translated", "value" : "Abrir TabataGo →" } },
|
||||
"fr" : { "stringUnit" : { "state" : "translated", "value" : "Ouvrir TabataGo →" } }
|
||||
}
|
||||
},
|
||||
|
||||
"watch.complication.description" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : { "stringUnit" : { "state" : "translated", "value" : "Dein aktueller Workout-Streak." } },
|
||||
"en" : { "stringUnit" : { "state" : "translated", "value" : "Your current workout streak." } },
|
||||
"es" : { "stringUnit" : { "state" : "translated", "value" : "Tu racha de entrenamiento actual." } },
|
||||
"fr" : { "stringUnit" : { "state" : "translated", "value" : "Votre série d'entraînements actuelle." } }
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Dein aktueller Workout-Streak."
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Your current workout streak."
|
||||
}
|
||||
},
|
||||
"es" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Tu racha de entrenamiento actual."
|
||||
}
|
||||
},
|
||||
"fr" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Votre série d'entraînements actuelle."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"watch.complication.notStarted" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Nicht begonnen"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Not started"
|
||||
}
|
||||
},
|
||||
"es" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "No iniciado"
|
||||
}
|
||||
},
|
||||
"fr" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Pas commencé"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"watch.complication.openApp" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "TabataGo öffnen →"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Open TabataGo →"
|
||||
}
|
||||
},
|
||||
"es" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Abrir TabataGo →"
|
||||
}
|
||||
},
|
||||
"fr" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Ouvrir TabataGo →"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"watch.complication.today" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Heute"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Today"
|
||||
}
|
||||
},
|
||||
"es" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Hoy"
|
||||
}
|
||||
},
|
||||
"fr" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Aujourd'hui"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"watch.complication.yesterday" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Gestern"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Yesterday"
|
||||
}
|
||||
},
|
||||
"es" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Ayer"
|
||||
}
|
||||
},
|
||||
"fr" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Hier"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"watch.idle.connected" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Verbunden"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Connected"
|
||||
}
|
||||
},
|
||||
"es" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Conectado"
|
||||
}
|
||||
},
|
||||
"fr" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Connecté"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"watch.idle.noPhone" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Kein Telefon"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "No phone"
|
||||
}
|
||||
},
|
||||
"es" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Sin teléfono"
|
||||
}
|
||||
},
|
||||
"fr" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Pas de téléphone"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"watch.idle.startOnPhone" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Workout auf\ndeinem iPhone starten"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Start a workout\non your iPhone"
|
||||
}
|
||||
},
|
||||
"es" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Inicia un entrenamiento\nen tu iPhone"
|
||||
}
|
||||
},
|
||||
"fr" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Démarrer un entraînement\nsur votre iPhone"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"watch.phase.break" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "PAUSE"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "BREAK"
|
||||
}
|
||||
},
|
||||
"es" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "PAUSA"
|
||||
}
|
||||
},
|
||||
"fr" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "PAUSE"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"watch.phase.coolDown" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "ABKÜHLEN"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "COOL DOWN"
|
||||
}
|
||||
},
|
||||
"es" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "ENFRIAMIENTO"
|
||||
}
|
||||
},
|
||||
"fr" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "RÉCUPÉRATION"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"watch.phase.done" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "FERTIG"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "DONE"
|
||||
}
|
||||
},
|
||||
"es" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "HECHO"
|
||||
}
|
||||
},
|
||||
"fr" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "TERMINÉ"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"watch.phase.getReady" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "BEREIT"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "GET READY"
|
||||
}
|
||||
},
|
||||
"es" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "LISTO"
|
||||
}
|
||||
},
|
||||
"fr" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "PRÊT"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"watch.phase.rest" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "PAUSE"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "REST"
|
||||
}
|
||||
},
|
||||
"es" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "DESCANSO"
|
||||
}
|
||||
},
|
||||
"fr" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "REPOS"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"watch.phase.warmUp" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "AUFWÄRMEN"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "WARM UP"
|
||||
}
|
||||
},
|
||||
"es" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "CALENTAMIENTO"
|
||||
}
|
||||
},
|
||||
"fr" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "ÉCHAUFFEMENT"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"watch.phase.work" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "ARBEIT"
|
||||
}
|
||||
},
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "WORK"
|
||||
}
|
||||
},
|
||||
"es" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "TRABAJO"
|
||||
}
|
||||
},
|
||||
"fr" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "TRAVAIL"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
},
|
||||
"version" : "1.0"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user