diff --git a/app/(tabs)/_layout.tsx b/app/(tabs)/_layout.tsx index 2c410c6..3f6197c 100644 --- a/app/(tabs)/_layout.tsx +++ b/app/(tabs)/_layout.tsx @@ -1,7 +1,7 @@ /** * TabataFit Tab Layout * Native iOS tabs with liquid glass effect - * 5 tabs: Home, Workouts, Activity, Browse, Profile + * 4 tabs: Home, Workouts, Activity, Profile * Redirects to onboarding if not completed */ @@ -28,9 +28,9 @@ export default function TabLayout() { - + - + @@ -38,11 +38,6 @@ export default function TabLayout() { - - - - - diff --git a/app/(tabs)/explore.tsx b/app/(tabs)/explore.tsx new file mode 100644 index 0000000..921a211 --- /dev/null +++ b/app/(tabs)/explore.tsx @@ -0,0 +1,549 @@ +import { useState, useMemo } from 'react' +import { View, StyleSheet, ScrollView, Pressable, Dimensions, ActivityIndicator, FlatList } from 'react-native' +import { useRouter } from 'expo-router' +import { useSafeAreaInsets } from 'react-native-safe-area-context' +import { BlurView } from 'expo-blur' +import { LinearGradient } from 'expo-linear-gradient' +import Ionicons from '@expo/vector-icons/Ionicons' + +import { useTranslation } from 'react-i18next' +import { useHaptics } from '@/src/shared/hooks' +import { useWorkouts, useCollections, useFeaturedWorkouts, useTrainers } from '@/src/shared/hooks/useSupabaseData' +import { StyledText } from '@/src/shared/components/StyledText' + +import { useThemeColors, BRAND } from '@/src/shared/theme' +import type { ThemeColors } from '@/src/shared/theme/types' +import { SPACING, LAYOUT } from '@/src/shared/constants/spacing' +import { RADIUS } from '@/src/shared/constants/borderRadius' +import type { Workout, WorkoutCategory, WorkoutLevel } from '@/src/shared/types' + +const { width: SCREEN_WIDTH } = Dimensions.get('window') +const CARD_WIDTH = (SCREEN_WIDTH - LAYOUT.SCREEN_PADDING * 2 - SPACING[3]) / 2 +const COLLECTION_CARD_WIDTH = SCREEN_WIDTH * 0.7 + +type FilterState = { + category: WorkoutCategory | 'all' + level: WorkoutLevel | 'all' + equipment: string | 'all' +} + +const CATEGORY_ICONS: Record = { + all: 'grid-outline', + 'full-body': 'body-outline', + 'upper-body': 'barbell-outline', + 'lower-body': 'footsteps-outline', + core: 'fitness-outline', + cardio: 'heart-outline', +} + +const CATEGORY_COLORS: Record = { + all: BRAND.PRIMARY, + 'full-body': '#5AC8FA', + 'upper-body': '#FF6B35', + 'lower-body': '#30D158', + core: '#FF9500', + cardio: '#FF3B30', +} + +const CATEGORY_TRANSLATION_KEYS: Record = { + all: 'all', + 'full-body': 'fullBody', + 'upper-body': 'upperBody', + 'lower-body': 'lowerBody', + core: 'core', + cardio: 'cardio', +} + +function CollectionCard({ + title, + description, + icon, + gradient, + workoutCount, + onPress, +}: { + title: string + description: string + icon: string + gradient?: [string, string] + workoutCount: number + onPress: () => void +}) { + const colors = useThemeColors() + const haptics = useHaptics() + const gradientColors = gradient || [BRAND.PRIMARY, '#FF3B30'] + + return ( + { + haptics.buttonTap() + onPress() + }} + > + + + + + + + {title} + + + {description} + + + {workoutCount} workouts + + + + ) +} + +function WorkoutCard({ + workout, + onPress, +}: { + workout: Workout + onPress: () => void +}) { + const colors = useThemeColors() + const categoryColor = CATEGORY_COLORS[workout.category] + + return ( + + + + + + + + {workout.duration} min + + + + + + + + + + + + {workout.title} + + + {workout.level} · {workout.calories} cal + + + + ) +} + +function FilterPill({ + label, + isSelected, + color, + onPress, +}: { + label: string + isSelected: boolean + color: string + onPress: () => void +}) { + const colors = useThemeColors() + const haptics = useHaptics() + + return ( + { + haptics.selection() + onPress() + }} + > + + {label} + + + ) +} + +function LoadingSkeleton() { + const colors = useThemeColors() + + return ( + + + + Loading workouts... + + + ) +} + +export default function ExploreScreen() { + const { t } = useTranslation() + const insets = useSafeAreaInsets() + const router = useRouter() + const haptics = useHaptics() + const colors = useThemeColors() + + const [filters, setFilters] = useState({ + category: 'all', + level: 'all', + equipment: 'all', + }) + + const { data: workoutsData, isLoading: workoutsLoading } = useWorkouts() + const { data: collectionsData, isLoading: collectionsLoading } = useCollections() + const { data: featuredData } = useFeaturedWorkouts() + + const workouts = workoutsData || [] + const collections = collectionsData || [] + const featured = featuredData || [] + + const filteredWorkouts = useMemo(() => { + return workouts.filter((workout) => { + if (filters.category !== 'all' && workout.category !== filters.category) return false + if (filters.level !== 'all' && workout.level !== filters.level) return false + if (filters.equipment !== 'all') { + if (filters.equipment === 'none') { + return workout.equipment.length === 0 + } + return workout.equipment.some((e) => e.toLowerCase().includes(filters.equipment.toLowerCase())) + } + return true + }) + }, [workouts, filters]) + + const categories: (WorkoutCategory | 'all')[] = ['all', 'full-body', 'upper-body', 'lower-body', 'core', 'cardio'] + const levels: (WorkoutLevel | 'all')[] = ['all', 'Beginner', 'Intermediate', 'Advanced'] + const equipmentOptions = ['all', 'none', 'band', 'dumbbells', 'mat'] + + const handleWorkoutPress = (id: string) => { + haptics.buttonTap() + router.push(`/workout/${id}`) + } + + const handleCollectionPress = (id: string) => { + haptics.buttonTap() + router.push(`/collection/${id}` as any) + } + + const clearFilters = () => { + haptics.selection() + setFilters({ category: 'all', level: 'all', equipment: 'all' }) + } + + const hasActiveFilters = filters.category !== 'all' || filters.level !== 'all' || filters.equipment !== 'all' + + if (workoutsLoading || collectionsLoading) { + return ( + + + + ) + } + + return ( + + + + + {t('screens:explore.title')} + + + {t('screens:explore.workoutsCount', { count: workouts.length })} + + + + {collections.length > 0 && ( + + + {t('screens:explore.collections')} + + item.id} + showsHorizontalScrollIndicator={false} + contentContainerStyle={styles.collectionsList} + renderItem={({ item }) => ( + handleCollectionPress(item.id)} + /> + )} + /> + + )} + + {featured.length > 0 && ( + + + {t('screens:explore.featured')} + + + {featured.slice(0, 4).map((workout) => ( + handleWorkoutPress(workout.id)} + /> + ))} + + + )} + + + + + {t('screens:explore.allWorkouts')} + + {hasActiveFilters && ( + + + {t('screens:explore.clearFilters')} + + + )} + + + + + {t('screens:explore.filterCategory')} + + + + {categories.map((cat) => ( + setFilters((f) => ({ ...f, category: cat }))} + /> + ))} + + + + + {t('screens:explore.filterLevel')} + + + + {levels.map((level) => ( + setFilters((f) => ({ ...f, level }))} + /> + ))} + + + + + {t('screens:explore.filterEquipment')} + + + + {equipmentOptions.map((eq) => ( + setFilters((f) => ({ ...f, equipment: eq }))} + /> + ))} + + + + {filteredWorkouts.length > 0 ? ( + + {filteredWorkouts.map((workout) => ( + handleWorkoutPress(workout.id)} + /> + ))} + + ) : ( + + + + {t('screens:explore.noResults')} + + + {t('screens:explore.tryAdjustingFilters')} + + + )} + + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + }, + scrollView: { + flex: 1, + }, + scrollContent: { + paddingHorizontal: LAYOUT.SCREEN_PADDING, + }, + header: { + marginBottom: SPACING[6], + }, + loadingContainer: { + flex: 1, + alignItems: 'center', + justifyContent: 'center', + }, + + collectionsSection: { + marginBottom: SPACING[6], + }, + collectionsList: { + marginTop: SPACING[4], + paddingRight: LAYOUT.SCREEN_PADDING, + }, + collectionCard: { + width: COLLECTION_CARD_WIDTH, + height: 180, + borderRadius: RADIUS.XL, + marginRight: SPACING[3], + overflow: 'hidden', + }, + collectionOverlay: { + flex: 1, + padding: SPACING[5], + backgroundColor: 'rgba(0,0,0,0.3)', + }, + collectionIcon: { + width: 48, + height: 48, + borderRadius: 24, + backgroundColor: 'rgba(255,255,255,0.2)', + alignItems: 'center', + justifyContent: 'center', + }, + + section: { + marginBottom: SPACING[6], + }, + + filtersSection: { + marginBottom: SPACING[6], + }, + filterHeader: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + marginBottom: SPACING[4], + }, + filterRow: { + marginBottom: SPACING[2], + }, + filterScroll: { + marginHorizontal: -LAYOUT.SCREEN_PADDING, + paddingHorizontal: LAYOUT.SCREEN_PADDING, + }, + filterPill: { + paddingHorizontal: SPACING[4], + paddingVertical: SPACING[2], + borderRadius: RADIUS.FULL, + marginRight: SPACING[2], + borderWidth: 1, + borderCurve: 'continuous', + }, + + workoutsGrid: { + flexDirection: 'row', + flexWrap: 'wrap', + gap: SPACING[3], + }, + workoutCard: { + width: CARD_WIDTH, + height: 200, + borderRadius: RADIUS.GLASS_CARD, + overflow: 'hidden', + borderWidth: 1, + borderCurve: 'continuous', + }, + durationBadge: { + position: 'absolute', + top: SPACING[3], + right: SPACING[3], + flexDirection: 'row', + alignItems: 'center', + paddingHorizontal: SPACING[2], + paddingVertical: 3, + borderRadius: RADIUS.SM, + }, + playArea: { + position: 'absolute', + top: 0, + left: 0, + right: 0, + bottom: 70, + alignItems: 'center', + justifyContent: 'center', + }, + playCircle: { + width: 44, + height: 44, + borderRadius: 22, + alignItems: 'center', + justifyContent: 'center', + }, + workoutInfo: { + position: 'absolute', + bottom: 0, + left: 0, + right: 0, + padding: SPACING[3], + paddingTop: SPACING[2], + }, + + noResults: { + alignItems: 'center', + justifyContent: 'center', + paddingVertical: SPACING[10], + }, +}) diff --git a/app/(tabs)/workouts.tsx b/app/(tabs)/workouts.tsx deleted file mode 100644 index ed1c497..0000000 --- a/app/(tabs)/workouts.tsx +++ /dev/null @@ -1,354 +0,0 @@ -/** - * TabataFit Workouts Screen - * Premium workout browser — scrollable category pills, trainers, workout grid - */ - -import { useState, useRef, useMemo } from 'react' -import { View, StyleSheet, ScrollView, Pressable, Dimensions, Animated } from 'react-native' -import { useRouter } from 'expo-router' -import { useSafeAreaInsets } from 'react-native-safe-area-context' -import { LinearGradient } from 'expo-linear-gradient' -import { BlurView } from 'expo-blur' -import Ionicons from '@expo/vector-icons/Ionicons' - -import { useTranslation } from 'react-i18next' -import { useHaptics } from '@/src/shared/hooks' -import { WORKOUTS } from '@/src/shared/data' -import { useTranslatedCategories, useTranslatedWorkouts } from '@/src/shared/data/useTranslatedData' -import { StyledText } from '@/src/shared/components/StyledText' - -import { useThemeColors, BRAND, GRADIENTS } from '@/src/shared/theme' -import type { ThemeColors } from '@/src/shared/theme/types' -import { SPACING, LAYOUT } from '@/src/shared/constants/spacing' -import { RADIUS } from '@/src/shared/constants/borderRadius' - -const { width: SCREEN_WIDTH } = Dimensions.get('window') -const CARD_WIDTH = (SCREEN_WIDTH - LAYOUT.SCREEN_PADDING * 2 - SPACING[3]) / 2 - -// ═══════════════════════════════════════════════════════════════════════════ -// CATEGORY PILL -// ═══════════════════════════════════════════════════════════════════════════ - -function CategoryPill({ - label, - selected, - onPress, -}: { - label: string - selected: boolean - onPress: () => void -}) { - const colors = useThemeColors() - const styles = useMemo(() => createStyles(colors), [colors]) - return ( - - {selected && ( - - )} - - {label} - - - ) -} - -// ═══════════════════════════════════════════════════════════════════════════ -// WORKOUT CARD -// ═══════════════════════════════════════════════════════════════════════════ - -function WorkoutCard({ - title, - duration, - level, - levelLabel, - onPress, -}: { - title: string - duration: number - level: string - levelLabel: string - onPress: () => void -}) { - const colors = useThemeColors() - const styles = useMemo(() => createStyles(colors), [colors]) - return ( - - - - {/* Subtle gradient accent at top */} - - - {/* Duration badge */} - - - - {duration + ' min'} - - - - {/* Play button */} - - - - - - - {/* Info */} - - - {title} - - - - - {levelLabel} - - - - - ) -} - -function levelColor(level: string, colors: ThemeColors): string { - switch (level.toLowerCase()) { - case 'beginner': return BRAND.SUCCESS - case 'intermediate': return BRAND.SECONDARY - case 'advanced': return BRAND.DANGER - default: return colors.text.tertiary - } -} - -// ═══════════════════════════════════════════════════════════════════════════ -// MAIN SCREEN -// ═══════════════════════════════════════════════════════════════════════════ - -export default function WorkoutsScreen() { - const { t } = useTranslation() - const insets = useSafeAreaInsets() - const router = useRouter() - const haptics = useHaptics() - const colors = useThemeColors() - const styles = useMemo(() => createStyles(colors), [colors]) - const [selectedCategory, setSelectedCategory] = useState('all') - const categories = useTranslatedCategories() - - const filteredWorkouts = selectedCategory === 'all' - ? WORKOUTS - : WORKOUTS.filter(w => w.category === selectedCategory) - - const translatedFiltered = useTranslatedWorkouts(filteredWorkouts) - - const handleWorkoutPress = (id: string) => { - haptics.buttonTap() - router.push(`/workout/${id}`) - } - - const selectedLabel = categories.find(c => c.id === selectedCategory)?.label ?? t('screens:workouts.allWorkouts') - - return ( - - - {/* Header */} - - - {t('screens:workouts.title')} - - - {t('screens:workouts.available', { count: WORKOUTS.length })} - - - - {/* Category Pills — horizontal scroll, no truncation */} - - {categories.map((cat) => ( - { - haptics.selection() - setSelectedCategory(cat.id) - }} - /> - ))} - - - {/* Workouts Grid */} - - - - {selectedCategory === 'all' ? t('screens:workouts.allWorkouts') : selectedLabel} - - {selectedCategory !== 'all' && ( - { haptics.buttonTap(); router.push(`/workout/category/${selectedCategory}`) }}> - {t('seeAll')} - - )} - - - {translatedFiltered.map((workout) => ( - handleWorkoutPress(workout.id)} - /> - ))} - - - - - ) -} - -// ═══════════════════════════════════════════════════════════════════════════ -// STYLES -// ═══════════════════════════════════════════════════════════════════════════ - -function createStyles(colors: ThemeColors) { - return StyleSheet.create({ - container: { - flex: 1, - backgroundColor: colors.bg.base, - }, - scrollView: { - flex: 1, - }, - scrollContent: { - paddingHorizontal: LAYOUT.SCREEN_PADDING, - }, - - // Header - header: { - marginBottom: SPACING[4], - }, - - // Pills - pillsScroll: { - marginHorizontal: -LAYOUT.SCREEN_PADDING, - marginBottom: SPACING[6], - }, - pillsRow: { - paddingHorizontal: LAYOUT.SCREEN_PADDING, - gap: SPACING[2], - }, - pill: { - paddingHorizontal: SPACING[4], - paddingVertical: SPACING[2], - borderRadius: 20, - backgroundColor: colors.bg.surface, - borderWidth: 1, - borderColor: colors.border.glassLight, - }, - pillSelected: { - borderColor: BRAND.PRIMARY, - backgroundColor: 'transparent', - }, - - // Section - section: { - marginBottom: SPACING[6], - }, - sectionHeader: { - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - marginBottom: SPACING[4], - }, - - // Workouts Grid - workoutsGrid: { - flexDirection: 'row', - flexWrap: 'wrap', - gap: SPACING[3], - }, - workoutCard: { - width: CARD_WIDTH, - height: 190, - borderRadius: RADIUS.GLASS_CARD, - overflow: 'hidden', - borderWidth: 1, - borderColor: colors.bg.overlay2, - }, - cardGradient: { - position: 'absolute', - top: 0, - left: 0, - right: 0, - height: 80, - }, - durationBadge: { - position: 'absolute', - top: SPACING[3], - right: SPACING[3], - flexDirection: 'row', - alignItems: 'center', - backgroundColor: 'rgba(0, 0, 0, 0.5)', - paddingHorizontal: SPACING[2], - paddingVertical: 3, - borderRadius: RADIUS.SM, - }, - playArea: { - position: 'absolute', - top: 0, - left: 0, - right: 0, - bottom: 64, - alignItems: 'center', - justifyContent: 'center', - }, - playCircle: { - width: 40, - height: 40, - borderRadius: 20, - backgroundColor: colors.border.glassStrong, - alignItems: 'center', - justifyContent: 'center', - borderWidth: 1, - borderColor: 'rgba(255, 255, 255, 0.25)', - }, - workoutInfo: { - position: 'absolute', - bottom: 0, - left: 0, - right: 0, - padding: SPACING[3], - paddingTop: SPACING[2], - }, - levelRow: { - flexDirection: 'row', - alignItems: 'center', - marginTop: 3, - gap: 5, - }, - levelDot: { - width: 6, - height: 6, - borderRadius: 3, - }, - }) -} diff --git a/src/shared/i18n/locales/de/screens.json b/src/shared/i18n/locales/de/screens.json index c4c53de..8e7582c 100644 --- a/src/shared/i18n/locales/de/screens.json +++ b/src/shared/i18n/locales/de/screens.json @@ -1,9 +1,8 @@ { "tabs": { "home": "Start", - "workouts": "Workouts", + "explore": "Entdecken", "activity": "Aktivität", - "browse": "Entdecken", "profile": "Profil" }, @@ -11,14 +10,38 @@ "featured": "EMPFOHLEN", "recent": "Zuletzt", "popularThisWeek": "Beliebt diese Woche", - "collections": "Sammlungen" + "collections": "Sammlungen", + "chooseYourPath": "W\u00e4hle deinen Weg", + "continueYourJourney": "Setze deine Reise fort", + "yourPrograms": "Deine Programme", + "programsSubtitle": "W\u00e4hle deinen Fokus", + "switchProgram": "Programm wechseln", + "statsStreak": "Serie", + "statsThisWeek": "Diese Woche", + "statsMinutes": "Minuten" }, - "workouts": { - "title": "Workouts", - "available": "{{count}} Workouts verfügbar", + "explore": { + "title": "Entdecken", + "collections": "Sammlungen", + "featured": "Empfohlen", "allWorkouts": "Alle Workouts", - "noWorkouts": "Keine Workouts gefunden" + "trainers": "Trainer", + "noResults": "Keine Workouts gefunden", + "tryAdjustingFilters": "Versuchen Sie, Ihre Filter anzupassen", + "loading": "Wird geladen...", + "filterCategory": "Kategorie", + "filterLevel": "Niveau", + "filterEquipment": "Ausrüstung", + "filterDuration": "Dauer", + "clearFilters": "Filter löschen", + "workoutsCount": "{{count}} Workouts", + "equipmentOptions": { + "none": "Ohne Ausrüstung", + "band": "Widerstandsband", + "dumbbells": "Hanteln", + "mat": "Matte" + } }, "activity": { @@ -78,7 +101,41 @@ "learnMore": "Mehr erfahren", "version": "Version", "privacyPolicy": "Datenschutzrichtlinie", - "signOut": "Abmelden" + "signOut": "Abmelden", + "statsWorkouts": "Workouts", + "statsStreak": "Tage in Folge", + "statsCalories": "Kalorien", + "faq": "FAQ", + "contactUs": "Kontakt", + "rateApp": "App bewerten", + "sectionPremium": "Auf Premium upgraden", + "sectionPersonalization": "PERSONALISIERUNG", + "personalization": "Personalisierung", + "personalizationEnabled": "KI-gestützte Empfehlungen aktiv", + "personalizationDisabled": "Aktivieren für personalisierte Workouts", + "enablePersonalization": "Personalisierung aktivieren", + "deleteData": "Meine Daten löschen" + }, + + "sync": { + "title": "Personalisierte Workouts freischalten", + "benefits": { + "recommendations": "KI-gestützte Empfehlungen basierend auf Ihrem Fortschritt", + "adaptive": "Adaptive Schwierigkeit, die mit Ihnen wächst", + "sync": "Synchronisieren Sie Ihren Fortschritt über alle Geräte", + "secure": "Ihre Daten sind verschlüsselt und sicher" + }, + "privacy": "Wir speichern Ihren Trainingsverlauf, um Ihr personalisiertes Programm zu erstellen. Sie können diese Daten jederzeit in den Einstellungen löschen.", + "primaryButton": "Mein Erlebnis personalisieren", + "secondaryButton": "Mit generischen Programmen fortfahren" + }, + + "dataDeletion": { + "title": "Ihre Daten löschen?", + "description": "Dies löscht dauerhaft Ihren synchronisierten Trainingsverlauf und Ihre Personalisierungsdaten von unseren Servern.", + "note": "Ihr lokaler Trainingsverlauf wird auf diesem Gerät gespeichert. Sie fahren mit generischen Programmen fort.", + "deleteButton": "Meine Daten löschen", + "cancelButton": "Meine Daten behalten" }, "player": { @@ -212,5 +269,64 @@ "restorePurchases": "K\u00e4ufe wiederherstellen", "skipButton": "Ohne Abo fortfahren" } + }, + + "programs": { + "title": "Programme", + "weeks": "Wochen", + "week": "Woche", + "workouts": "Workouts", + "workout": "Workout", + "minutes": "Minuten", + "min": "min", + "perWeek": "/Woche", + "equipment": "Ausr\u00fcstung", + "optional": "(optional)", + "bodyweightOnly": "Nur K\u00f6rpergewicht", + "focusAreas": "Schwerpunkte", + "exercises": "\u00dcbungen", + "of": "von", + "complete": "abgeschlossen", + "completed": "Abgeschlossen", + "notStarted": "Nicht gestartet", + "inProgress": "In Bearbeitung", + "allWorkoutsComplete": "Alle Workouts abgeschlossen!", + "status": { + "notStarted": "Nicht gestartet", + "inProgress": "In Bearbeitung", + "complete": "Abgeschlossen", + "completed": "Abgeschlossen" + }, + "yourProgress": "Ihr Fortschritt", + "trainingPlan": "Trainingsplan", + "current": "Aktuell", + "startProgram": "Programm starten", + "continue": "Fortsetzen", + "continueTraining": "Training fortsetzen", + "restart": "Neu starten", + "restartProgram": "Programm neu starten" + }, + + "assessment": { + "title": "Bewegungsbewertung", + "welcomeTitle": "Schnelle Bewertung", + "welcomeDescription": "Lassen Sie uns Ihre Bewegungsmuster \u00fcberpr\u00fcfen, um Ihre Erfahrung zu personalisieren und den besten Startpunkt zu empfehlen.", + "minutes": "Minuten", + "quickCheck": "Schnelle \u00dcberpr\u00fcfung Ihres Fitnessniveaus", + "movements": "Bewegungen", + "testMovements": "Testen Sie wichtige Bewegungsmuster", + "noEquipment": "Keine Ausr\u00fcstung erforderlich", + "justYourBody": "Nur Ihr K\u00f6rpergewicht", + "whatWeCheck": "Was wir \u00fcberpr\u00fcfen", + "mobility": "Mobilit\u00e4t", + "strength": "Kraft", + "stability": "Stabilit\u00e4t", + "balance": "Gleichgewicht", + "takeAssessment": "Bewertung durchf\u00fchren", + "startAssessment": "Bewertung starten", + "skipForNow": "Vorerst \u00fcberspringen", + "tips": "Tipps f\u00fcr beste Ergebnisse", + "duration": "Dauer", + "exercises": "\u00dcbungen" } } diff --git a/src/shared/i18n/locales/en/screens.json b/src/shared/i18n/locales/en/screens.json index 5b53606..1412141 100644 --- a/src/shared/i18n/locales/en/screens.json +++ b/src/shared/i18n/locales/en/screens.json @@ -1,9 +1,8 @@ { "tabs": { "home": "Home", - "workouts": "Workouts", + "explore": "Explore", "activity": "Activity", - "browse": "Browse", "profile": "Profile" }, @@ -11,14 +10,38 @@ "featured": "FEATURED", "recent": "Recent", "popularThisWeek": "Popular This Week", - "collections": "Collections" + "collections": "Collections", + "chooseYourPath": "Choose Your Path", + "continueYourJourney": "Continue Your Journey", + "yourPrograms": "Your Programs", + "programsSubtitle": "Choose your focus", + "switchProgram": "Switch Program", + "statsStreak": "Streak", + "statsThisWeek": "This Week", + "statsMinutes": "Minutes" }, - "workouts": { - "title": "Workouts", - "available": "{{count}} workouts available", + "explore": { + "title": "Explore", + "collections": "Collections", + "featured": "Featured", "allWorkouts": "All Workouts", - "noWorkouts": "No workouts found" + "trainers": "Trainers", + "noResults": "No workouts found", + "tryAdjustingFilters": "Try adjusting your filters", + "loading": "Loading...", + "filterCategory": "Category", + "filterLevel": "Level", + "filterEquipment": "Equipment", + "filterDuration": "Duration", + "clearFilters": "Clear Filters", + "workoutsCount": "{{count}} workouts", + "equipmentOptions": { + "none": "No Equipment", + "band": "Resistance Band", + "dumbbells": "Dumbbells", + "mat": "Mat" + } }, "activity": { @@ -85,7 +108,34 @@ "faq": "FAQ", "contactUs": "Contact Us", "rateApp": "Rate App", - "sectionPremium": "Upgrade to Premium" + "sectionPremium": "Upgrade to Premium", + "sectionPersonalization": "PERSONALIZATION", + "personalization": "Personalization", + "personalizationEnabled": "AI-powered recommendations active", + "personalizationDisabled": "Enable for personalized workouts", + "enablePersonalization": "Enable Personalization", + "deleteData": "Delete My Data" + }, + + "sync": { + "title": "Unlock Personalized Workouts", + "benefits": { + "recommendations": "AI-powered recommendations based on your progress", + "adaptive": "Adaptive difficulty that grows with you", + "sync": "Sync your progress across devices", + "secure": "Your data is encrypted and secure" + }, + "privacy": "We'll save your workout history to create your personalized program. You can delete this data anytime in Settings.", + "primaryButton": "Personalize My Experience", + "secondaryButton": "Continue with Generic Programs" + }, + + "dataDeletion": { + "title": "Delete Your Data?", + "description": "This will permanently delete your synced workout history and personalization data from our servers.", + "note": "Your local workout history will be kept on this device. You'll continue with generic programs.", + "deleteButton": "Delete My Data", + "cancelButton": "Keep My Data" }, "player": { @@ -224,6 +274,23 @@ "5x": "5x / week" } }, + "paywall": { + "title": "Stay on track.\nNo limits.", + "features": { + "unlimited": "Unlimited Workouts", + "offline": "Offline Downloads", + "stats": "Advanced Stats & Apple Watch", + "noAds": "No Ads + Family Sharing" + }, + "bestValue": "BEST VALUE", + "yearlyPrice": "$49.99", + "monthlyPrice": "$6.99", + "savePercent": "Save 42%", + "trialCta": "START FREE TRIAL (7 days)", + "guarantees": "Cancel anytime · 30-day money-back guarantee", + "restorePurchases": "Restore Purchases", + "skipButton": "Continue without subscription" + }, "privacy": { "title": "Privacy Policy", "lastUpdated": "Last Updated: March 2026", @@ -261,5 +328,64 @@ "content": "If you have questions about this privacy policy, please contact us at:" } } + }, + + "programs": { + "title": "Programs", + "weeks": "Weeks", + "week": "Week", + "workouts": "Workouts", + "workout": "Workout", + "minutes": "Minutes", + "min": "min", + "perWeek": "/week", + "equipment": "Equipment", + "optional": "(optional)", + "bodyweightOnly": "Bodyweight only", + "focusAreas": "Focus Areas", + "exercises": "exercises", + "of": "of", + "complete": "complete", + "completed": "Completed", + "notStarted": "Not Started", + "inProgress": "In Progress", + "allWorkoutsComplete": "All Workouts Complete!", + "status": { + "notStarted": "Not Started", + "inProgress": "In Progress", + "complete": "Complete", + "completed": "Completed" + }, + "yourProgress": "Your Progress", + "trainingPlan": "Training Plan", + "current": "Current", + "startProgram": "Start Program", + "continue": "Continue", + "continueTraining": "Continue Training", + "restart": "Restart", + "restartProgram": "Restart Program" + }, + + "assessment": { + "title": "Movement Assessment", + "welcomeTitle": "Quick Assessment", + "welcomeDescription": "Let's check your movement patterns to personalize your experience and recommend the best starting point.", + "minutes": "minutes", + "quickCheck": "Quick check of your fitness level", + "movements": "movements", + "testMovements": "Test key movement patterns", + "noEquipment": "No equipment needed", + "justYourBody": "Just your bodyweight", + "whatWeCheck": "What We'll Check", + "mobility": "Mobility", + "strength": "Strength", + "stability": "Stability", + "balance": "Balance", + "takeAssessment": "Take Assessment", + "startAssessment": "Start Assessment", + "skipForNow": "Skip for now", + "tips": "Tips for best results", + "duration": "Duration", + "exercises": "Exercises" } } diff --git a/src/shared/i18n/locales/es/screens.json b/src/shared/i18n/locales/es/screens.json index 08c130a..c3a4764 100644 --- a/src/shared/i18n/locales/es/screens.json +++ b/src/shared/i18n/locales/es/screens.json @@ -1,9 +1,8 @@ { "tabs": { "home": "Inicio", - "workouts": "Entrenos", + "explore": "Explorar", "activity": "Actividad", - "browse": "Explorar", "profile": "Perfil" }, @@ -11,14 +10,38 @@ "featured": "DESTACADO", "recent": "Recientes", "popularThisWeek": "Popular esta semana", - "collections": "Colecciones" + "collections": "Colecciones", + "chooseYourPath": "Elige tu camino", + "continueYourJourney": "Contin\u00faa tu viaje", + "yourPrograms": "Tus programas", + "programsSubtitle": "Elige tu enfoque", + "switchProgram": "Cambiar programa", + "statsStreak": "Racha", + "statsThisWeek": "Esta semana", + "statsMinutes": "Minutos" }, - "workouts": { - "title": "Entrenos", - "available": "{{count}} entrenos disponibles", + "explore": { + "title": "Explorar", + "collections": "Colecciones", + "featured": "Destacados", "allWorkouts": "Todos los entrenos", - "noWorkouts": "No se encontraron entrenos" + "trainers": "Entrenadores", + "noResults": "No se encontraron entrenos", + "tryAdjustingFilters": "Intenta ajustar tus filtros", + "loading": "Cargando...", + "filterCategory": "Categoría", + "filterLevel": "Nivel", + "filterEquipment": "Equipo", + "filterDuration": "Duración", + "clearFilters": "Borrar filtros", + "workoutsCount": "{{count}} entrenos", + "equipmentOptions": { + "none": "Sin equipo", + "band": "Banda elástica", + "dumbbells": "Mancuernas", + "mat": "Colchoneta" + } }, "activity": { @@ -78,7 +101,41 @@ "learnMore": "M\u00e1s informaci\u00f3n", "version": "Versi\u00f3n", "privacyPolicy": "Pol\u00edtica de privacidad", - "signOut": "Cerrar sesi\u00f3n" + "signOut": "Cerrar sesi\u00f3n", + "statsWorkouts": "entrenos", + "statsStreak": "d\u00edas consecutivos", + "statsCalories": "calor\u00edas", + "faq": "FAQ", + "contactUs": "Contactarnos", + "rateApp": "Calificar app", + "sectionPremium": "Actualizar a Premium", + "sectionPersonalization": "PERSONALIZACI\u00d3N", + "personalization": "Personalizaci\u00f3n", + "personalizationEnabled": "Recomendaciones IA activas", + "personalizationDisabled": "Active para entrenos personalizados", + "enablePersonalization": "Activar personalizaci\u00f3n", + "deleteData": "Eliminar mis datos" + }, + + "sync": { + "title": "Desbloquea entrenos personalizados", + "benefits": { + "recommendations": "Recomendaciones IA basadas en tu progreso", + "adaptive": "Dificultad adaptativa que crece contigo", + "sync": "Sincroniza tu progreso en todos tus dispositivos", + "secure": "Tus datos est\u00e1n cifrados y seguros" + }, + "privacy": "Guardaremos tu historial de entrenos para crear tu programa personalizado. Puedes eliminar estos datos en cualquier momento en Configuraci\u00f3n.", + "primaryButton": "Personalizar mi experiencia", + "secondaryButton": "Continuar con programas gen\u00e9ricos" + }, + + "dataDeletion": { + "title": "\u00bfEliminar tus datos?", + "description": "Esto eliminar\u00e1 permanentemente tu historial de entrenos sincronizado y tus datos de personalizaci\u00f3n de nuestros servidores.", + "note": "Tu historial de entrenos local se mantendr\u00e1 en este dispositivo. Continuar\u00e1s con programas gen\u00e9ricos.", + "deleteButton": "Eliminar mis datos", + "cancelButton": "Conservar mis datos" }, "player": { @@ -212,5 +269,64 @@ "restorePurchases": "Restaurar compras", "skipButton": "Continuar sin suscripci\u00f3n" } + }, + + "programs": { + "title": "Programas", + "weeks": "Semanas", + "week": "Semana", + "workouts": "Entrenamientos", + "workout": "Entrenamiento", + "minutes": "Minutos", + "min": "min", + "perWeek": "/semana", + "equipment": "Equipo", + "optional": "(opcional)", + "bodyweightOnly": "Solo peso corporal", + "focusAreas": "\u00c1reas de enfoque", + "exercises": "ejercicios", + "of": "de", + "complete": "completado", + "completed": "Completado", + "notStarted": "No iniciado", + "inProgress": "En progreso", + "allWorkoutsComplete": "\u00a1Todos los entrenamientos completados!", + "status": { + "notStarted": "No iniciado", + "inProgress": "En progreso", + "complete": "Completado", + "completed": "Completado" + }, + "yourProgress": "Tu progreso", + "trainingPlan": "Plan de entrenamiento", + "current": "Actual", + "startProgram": "Iniciar programa", + "continue": "Continuar", + "continueTraining": "Continuar entrenamiento", + "restart": "Reiniciar", + "restartProgram": "Reiniciar programa" + }, + + "assessment": { + "title": "Evaluaci\u00f3n de movimiento", + "welcomeTitle": "Evaluaci\u00f3n r\u00e1pida", + "welcomeDescription": "Verifiquemos tus patrones de movimiento para personalizar tu experiencia y recomendar el mejor punto de partida.", + "minutes": "minutos", + "quickCheck": "Verificaci\u00f3n r\u00e1pida de tu nivel de fitness", + "movements": "movimientos", + "testMovements": "Prueba patrones de movimiento clave", + "noEquipment": "No se necesita equipo", + "justYourBody": "Solo tu peso corporal", + "whatWeCheck": "Qu\u00e9 verificamos", + "mobility": "Movilidad", + "strength": "Fuerza", + "stability": "Estabilidad", + "balance": "Equilibrio", + "takeAssessment": "Realizar evaluaci\u00f3n", + "startAssessment": "Iniciar evaluaci\u00f3n", + "skipForNow": "Omitir por ahora", + "tips": "Consejos para mejores resultados", + "duration": "Duraci\u00f3n", + "exercises": "Ejercicios" } } diff --git a/src/shared/i18n/locales/fr/screens.json b/src/shared/i18n/locales/fr/screens.json index a73caf8..1474a30 100644 --- a/src/shared/i18n/locales/fr/screens.json +++ b/src/shared/i18n/locales/fr/screens.json @@ -1,9 +1,8 @@ { "tabs": { "home": "Accueil", - "workouts": "Exercices", - "activity": "Activit\u00e9", - "browse": "Explorer", + "explore": "Explorer", + "activity": "Activité", "profile": "Profil" }, @@ -11,31 +10,55 @@ "featured": "\u00c0 LA UNE", "recent": "R\u00e9cents", "popularThisWeek": "Populaires cette semaine", - "collections": "Collections" + "collections": "Collections", + "chooseYourPath": "Choisissez votre parcours", + "continueYourJourney": "Continuez votre parcours", + "yourPrograms": "Vos programmes", + "programsSubtitle": "Choisissez votre focus", + "switchProgram": "Changer de programme", + "statsStreak": "S\u00e9rie", + "statsThisWeek": "Cette semaine", + "statsMinutes": "Minutes" }, - "workouts": { - "title": "Exercices", - "available": "{{count}} exercices disponibles", + "explore": { + "title": "Explorer", + "collections": "Collections", + "featured": "En vedette", "allWorkouts": "Tous les exercices", - "noWorkouts": "Aucun exercice trouv\u00e9" + "trainers": "Entraîneurs", + "noResults": "Aucun exercice trouvé", + "tryAdjustingFilters": "Essayez d'ajuster vos filtres", + "loading": "Chargement...", + "filterCategory": "Catégorie", + "filterLevel": "Niveau", + "filterEquipment": "Équipement", + "filterDuration": "Durée", + "clearFilters": "Effacer les filtres", + "workoutsCount": "{{count}} exercices", + "equipmentOptions": { + "none": "Sans équipement", + "band": "Bande élastique", + "dumbbells": "Haltères", + "mat": "Tapis" + } }, "activity": { - "title": "Activit\u00e9", - "dayStreak": "jours cons\u00e9cutifs", + "title": "Activité", + "dayStreak": "jours consécutifs", "longest": "RECORD", - "workouts": "Entra\u00eenements", + "workouts": "Entraînements", "minutes": "Minutes", "calories": "Calories", - "bestStreak": "Meilleure s\u00e9rie", + "bestStreak": "Meilleure série", "thisWeek": "Cette semaine", "ofDays": "{{completed}} sur 7 jours", - "recent": "R\u00e9cents", + "recent": "Récents", "today": "Aujourd'hui", "yesterday": "Hier", "daysAgo": "il y a {{count}}j", - "achievements": "Succ\u00e8s" + "achievements": "Succès" }, "browse": { @@ -55,12 +78,12 @@ "profile": { "title": "Profil", - "guest": "Invit\u00e9", + "guest": "Invité", "memberSince": "Membre depuis {{date}}", "sectionAccount": "COMPTE", - "sectionWorkout": "ENTRA\u00ceNEMENT", + "sectionWorkout": "ENTRAÎNEMENT", "sectionNotifications": "NOTIFICATIONS", - "sectionAbout": "\u00c0 PROPOS", + "sectionAbout": "À PROPOS", "sectionSubscription": "ABONNEMENT", "email": "E-mail", "plan": "Formule", @@ -71,55 +94,82 @@ "voiceCoaching": "Coaching vocal", "dailyReminders": "Rappels quotidiens", "reminderTime": "Heure du rappel", - "reminderFooter": "Recevez un rappel quotidien pour maintenir votre s\u00e9rie", - "workoutSettingsFooter": "Personnalisez votre exp\u00e9rience d'entra\u00eenement", - "upgradeTitle": "D\u00e9bloquer TabataFit+", - "upgradeDescription": "Acc\u00e9dez \u00e0 des entra\u00eenements illimit\u00e9s, t\u00e9l\u00e9chargements hors ligne et plus.", + "reminderFooter": "Recevez un rappel quotidien pour maintenir votre série", + "workoutSettingsFooter": "Personnalisez votre expérience d'entraînement", + "upgradeTitle": "Débloquer TabataFit+", + "upgradeDescription": "Accédez à des entraînements illimités, téléchargements hors ligne et plus.", "learnMore": "En savoir plus", "version": "Version", - "privacyPolicy": "Politique de confidentialit\u00e9", - "signOut": "Se d\u00e9connecter", - "statsWorkouts": "entra\u00eenements", - "statsStreak": "jours cons\u00e9cutifs", + "privacyPolicy": "Politique de confidentialité", + "signOut": "Se déconnecter", + "statsWorkouts": "entraînements", + "statsStreak": "jours consécutifs", "statsCalories": "calories", "faq": "FAQ", "contactUs": "Nous contacter", "rateApp": "Noter l'app", - "sectionPremium": "Passer à Premium" + "sectionPremium": "Passer à Premium", + "sectionPersonalization": "PERSONNALISATION", + "personalization": "Personnalisation", + "personalizationEnabled": "Recommandations IA actives", + "personalizationDisabled": "Activez pour des entraînements personnalisés", + "enablePersonalization": "Activer la personnalisation", + "deleteData": "Supprimer mes données" + }, + + "sync": { + "title": "Débloquez les entraînements personnalisés", + "benefits": { + "recommendations": "Recommandations IA basées sur vos progrès", + "adaptive": "Difficulté adaptative qui évolue avec vous", + "sync": "Synchronisez vos progrès sur tous vos appareils", + "secure": "Vos données sont chiffrées et sécurisées" + }, + "privacy": "Nous sauvegarderons votre historique d'entraînement pour créer votre programme personnalisé. Vous pouvez supprimer ces données à tout moment dans les Paramètres.", + "primaryButton": "Personnaliser mon expérience", + "secondaryButton": "Continuer avec les programmes génériques" + }, + + "dataDeletion": { + "title": "Supprimer vos données ?", + "description": "Cela supprimera définitivement votre historique d'entraînement synchronisé et vos données de personnalisation de nos serveurs.", + "note": "Votre historique d'entraînement local sera conservé sur cet appareil. Vous continuerez avec les programmes génériques.", + "deleteButton": "Supprimer mes données", + "cancelButton": "Conserver mes données" }, "player": { "phases": { - "prep": "PR\u00c9PAREZ-VOUS", + "prep": "PRÉPAREZ-VOUS", "work": "EFFORT", "rest": "REPOS", - "complete": "TERMIN\u00c9" + "complete": "TERMINÉ" }, "current": "En cours", "next": "Suivant : ", "round": "Round", "burnBar": "Burn Bar", - "communityAvg": "Moyenne communaut\u00e9 : {{calories}} cal", - "workoutComplete": "Entra\u00eenement termin\u00e9 !", - "greatJob": "Bien jou\u00e9 !", + "communityAvg": "Moyenne communauté : {{calories}} cal", + "workoutComplete": "Entraînement terminé !", + "greatJob": "Bien joué !", "rounds": "Rounds", "calories": "Calories", "minutes": "Minutes" }, "complete": { - "title": "ENTRA\u00ceNEMENT TERMIN\u00c9", + "title": "ENTRAÎNEMENT TERMINÉ", "caloriesLabel": "CALORIES", "minutesLabel": "MINUTES", - "completeLabel": "TERMIN\u00c9", + "completeLabel": "TERMINÉ", "burnBar": "Burn Bar", "burnBarResult": "Vous avez battu {{percentile}}% des utilisateurs !", - "streakTitle": "{{count}} jours cons\u00e9cutifs !", - "streakSubtitle": "Continuez sur cette lanc\u00e9e !", - "shareWorkout": "Partagez votre entra\u00eenement", - "shareText": "Je viens de terminer {{title}} ! \uD83D\uDD25 {{calories}} calories en {{duration}} minutes.", - "recommendedNext": "Recommand\u00e9 ensuite", - "backToHome": "Retour \u00e0 l'accueil" + "streakTitle": "{{count}} jours consécutifs !", + "streakSubtitle": "Continuez sur cette lancée !", + "shareWorkout": "Partagez votre entraînement", + "shareText": "Je viens de terminer {{title}} ! 🔥 {{calories}} calories en {{duration}} minutes.", + "recommendedNext": "Recommandé ensuite", + "backToHome": "Retour à l'accueil" }, "collection": { @@ -132,14 +182,14 @@ }, "workout": { - "notFound": "Entra\u00eenement introuvable", + "notFound": "Entraînement introuvable", "whatYoullNeed": "Ce qu'il vous faut", "exercises": "Exercices ({{count}} rounds)", - "repeatRounds": "R\u00e9p\u00e9ter \u00D7 {{count}} rounds", + "repeatRounds": "Répéter × {{count}} rounds", "music": "Musique", "musicMix": "Mix {{vibe}}", - "curatedForWorkout": "S\u00e9lectionn\u00e9 pour votre entra\u00eenement", - "startWorkout": "COMMENCER L'ENTRA\u00ceNEMENT" + "curatedForWorkout": "Sélectionné pour votre entraînement", + "startWorkout": "COMMENCER L'ENTRAÎNEMENT" }, "paywall": { @@ -168,19 +218,19 @@ "problem": { "title": "Vous n'avez pas 1 heure\npour la salle.", "subtitle1": "Personne n'a le temps.", - "subtitle2": "Pourtant vous voulez des r\u00e9sultats. On a la solution.", + "subtitle2": "Pourtant vous voulez des résultats. On a la solution.", "cta": "Montrez-moi" }, "empathy": { "title": "Qu'est-ce qui vous freine ?", - "chooseUpTo": "Choisissez jusqu'\u00e0 2", + "chooseUpTo": "Choisissez jusqu'à 2", "noTime": "Pas le temps", "lowMotivation": "Manque de motivation", "noKnowledge": "Je ne sais pas quoi faire", - "noGym": "Pas d'acc\u00e8s \u00e0 une salle" + "noGym": "Pas d'accès à une salle" }, "solution": { - "title": "4 minutes.\nV\u00e9ritablement transformateur.", + "title": "4 minutes.\nVéritablement transformateur.", "tabataCalories": "85 kcal", "cardioCalories": "90 kcal", "tabata": "Tabata", @@ -188,35 +238,35 @@ "tabataDuration": "4 min", "cardioDuration": "30 min", "vs": "VS", - "citation": "\u00ab La m\u00e9thode Tabata augmente simultan\u00e9ment les capacit\u00e9s a\u00e9robie et ana\u00e9robie. \u00bb", - "citationAuthor": "\u2014 Dr. Izumi Tabata, 1996", + "citation": "« La méthode Tabata augmente simultanément les capacités aérobie et anaérobie. »", + "citationAuthor": "— Dr. Izumi Tabata, 1996", "cta": "Je suis convaincu" }, "wow": { - "title": "Votre app, en avant-premi\u00e8re.", + "title": "Votre app, en avant-première.", "subtitle": "Tout ce qu'il vous faut pour vous transformer.", "card1Title": "Le chrono parfait", - "card1Subtitle": "EFFORT, REPOS, R\u00c9P\u00c9TEZ \u2014 des phases minut\u00e9es avec un retour visuel.", - "card2Title": "50+ entra\u00eenements experts", - "card2Subtitle": "De 4 minutes intenses \u00e0 20 minutes de br\u00fblage. D\u00e9butant \u00e0 avanc\u00e9.", + "card1Subtitle": "EFFORT, REPOS, RÉPÉTEZ — des phases minutées avec un retour visuel.", + "card2Title": "50+ entraînements experts", + "card2Subtitle": "De 4 minutes intenses à 20 minutes de brûlage. Débutant à avancé.", "card3Title": "Coaching intelligent", "card3Subtitle": "Indications vocales et retour haptique pour rester dans la zone.", - "card4Title": "Suivez vos progr\u00e8s", - "card4Subtitle": "S\u00e9ries hebdomadaires, suivi des calories et records personnels." + "card4Title": "Suivez vos progrès", + "card4Subtitle": "Séries hebdomadaires, suivi des calories et records personnels." }, "personalization": { - "title": "Pr\u00e9parons votre\npremi\u00e8re semaine.", + "title": "Préparons votre\npremière semaine.", "yourName": "VOTRE NOM", "namePlaceholder": "Entrez votre nom", "fitnessLevel": "NIVEAU DE FORME", "yourGoal": "VOTRE OBJECTIF", - "weeklyFrequency": "FR\u00c9QUENCE HEBDOMADAIRE", - "readyMessage": "Votre programme personnalis\u00e9 est pr\u00eat.", + "weeklyFrequency": "FRÉQUENCE HEBDOMADAIRE", + "readyMessage": "Votre programme personnalisé est prêt.", "goals": { "weightLoss": "Perte de poids", "cardio": "Cardio", "strength": "Force", - "wellness": "Bien-\u00eatre" + "wellness": "Bien-être" }, "frequencies": { "2x": "2x / semaine", @@ -224,6 +274,23 @@ "5x": "5x / semaine" } }, + "paywall": { + "title": "Restez motivé.\nSans limites.", + "features": { + "unlimited": "Entraînements illimités", + "offline": "Téléchargements hors ligne", + "stats": "Statistiques avancées et Apple Watch", + "noAds": "Sans publicités + Partage familial" + }, + "bestValue": "MEILLEURE OFFRE", + "yearlyPrice": "49,99 $", + "monthlyPrice": "6,99 $", + "savePercent": "Économisez 42%", + "trialCta": "ESSAI GRATUIT (7 jours)", + "guarantees": "Annulez à tout moment · Garantie satisfait ou remboursé 30 jours", + "restorePurchases": "Restaurer les achats", + "skipButton": "Continuer sans abonnement" + }, "privacy": { "title": "Politique de Confidentialité", "lastUpdated": "Dernière mise à jour : Mars 2026", @@ -261,5 +328,64 @@ "content": "Si vous avez des questions sur cette politique de confidentialité, contactez-nous à :" } } + }, + + "programs": { + "title": "Programmes", + "weeks": "Semaines", + "week": "Semaine", + "workouts": "Entraînements", + "workout": "Entraînement", + "minutes": "Minutes", + "min": "min", + "perWeek": "/semaine", + "equipment": "Équipement", + "optional": "(optionnel)", + "bodyweightOnly": "Poids du corps uniquement", + "focusAreas": "Zones ciblées", + "exercises": "exercices", + "of": "sur", + "complete": "terminé", + "completed": "Terminé", + "notStarted": "Non commencé", + "inProgress": "En cours", + "allWorkoutsComplete": "Tous les entraînements terminés !", + "status": { + "notStarted": "Non commencé", + "inProgress": "En cours", + "complete": "Terminé", + "completed": "Terminé" + }, + "yourProgress": "Votre progression", + "trainingPlan": "Plan d'entraînement", + "current": "Actuel", + "startProgram": "Commencer le programme", + "continue": "Continuer", + "continueTraining": "Continuer l'entraînement", + "restart": "Recommencer", + "restartProgram": "Recommencer le programme" + }, + + "assessment": { + "title": "Évaluation des mouvements", + "welcomeTitle": "Évaluation rapide", + "welcomeDescription": "Vérifions vos patterns de mouvement pour personnaliser votre expérience et recommander le meilleur point de départ.", + "minutes": "minutes", + "quickCheck": "Vérification rapide de votre niveau de fitness", + "movements": "mouvements", + "testMovements": "Testez les patterns de mouvement clés", + "noEquipment": "Aucun équipement nécessaire", + "justYourBody": "Juste votre poids du corps", + "whatWeCheck": "Ce que nous vérifions", + "mobility": "Mobilité", + "strength": "Force", + "stability": "Stabilité", + "balance": "Équilibre", + "takeAssessment": "Faire l'évaluation", + "startAssessment": "Commencer l'évaluation", + "skipForNow": "Passer pour l'instant", + "tips": "Conseils pour de meilleurs résultats", + "duration": "Durée", + "exercises": "Exercices" } -} +} \ No newline at end of file