feat: i18n infrastructure with 4-locale support (en, fr, es, de)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Millian Lamiaux
2026-02-21 00:04:40 +01:00
parent 6a94d545f2
commit d6bc7f5a4c
23 changed files with 1853 additions and 2 deletions

View File

@@ -0,0 +1,123 @@
/**
* TabataFit Translated Data Hooks
* Wraps raw data objects with t() lookups at render time
*/
import { useMemo } from 'react'
import { useTranslation } from 'react-i18next'
import type { Workout, Collection, Program } from '../types'
import { CATEGORIES } from './index'
/** Convert an exercise/equipment name to a slug key for i18n lookup */
function slugify(name: string): string {
return name
.toLowerCase()
.replace(/[()]/g, '')
.replace(/&/g, 'and')
.replace(/[^a-z0-9]+/g, '-')
.replace(/(^-|-$)/g, '')
}
/** Translate a single workout's display strings */
export function useTranslatedWorkout(workout: Workout | undefined) {
const { t } = useTranslation('content')
return useMemo(() => {
if (!workout) return undefined
return {
...workout,
title: t(`workouts.${workout.id}`, { defaultValue: workout.title }),
exercises: workout.exercises.map((ex) => ({
...ex,
name: t(`exercises.${slugify(ex.name)}`, { defaultValue: ex.name }),
})),
equipment: workout.equipment.map((item) =>
t(`equipment.${slugify(item)}`, { defaultValue: item })
),
}
}, [workout, t])
}
/** Translate an array of workouts (titles only, for list views) */
export function useTranslatedWorkouts<T extends { id: string; title: string }>(
workouts: T[]
) {
const { t } = useTranslation('content')
return useMemo(
() =>
workouts.map((w) => ({
...w,
title: t(`workouts.${w.id}`, { defaultValue: w.title }),
})),
[workouts, t]
)
}
/** Translate collections */
export function useTranslatedCollections(collections: Collection[]) {
const { t } = useTranslation('content')
return useMemo(
() =>
collections.map((c) => ({
...c,
title: t(`collections.${c.id}.title`, { defaultValue: c.title }),
description: t(`collections.${c.id}.description`, {
defaultValue: c.description,
}),
})),
[collections, t]
)
}
/** Translate programs */
export function useTranslatedPrograms(programs: Program[]) {
const { t } = useTranslation('content')
return useMemo(
() =>
programs.map((p) => ({
...p,
title: t(`programs.${p.id}.title`, { defaultValue: p.title }),
description: t(`programs.${p.id}.description`, {
defaultValue: p.description,
}),
})),
[programs, t]
)
}
/** Translate category labels */
export function useTranslatedCategories() {
const { t } = useTranslation('common')
return useMemo(() => {
const categoryKeyMap: Record<string, string> = {
all: 'categories.all',
'full-body': 'categories.fullBody',
core: 'categories.core',
'upper-body': 'categories.upperBody',
'lower-body': 'categories.lowerBody',
cardio: 'categories.cardio',
}
return CATEGORIES.map((cat) => ({
...cat,
label: t(categoryKeyMap[cat.id] ?? cat.id, { defaultValue: cat.label }),
}))
}, [t])
}
/** Translate a music vibe name */
export function useMusicVibeLabel(vibe: string): string {
const { t } = useTranslation('common')
const vibeKeyMap: Record<string, string> = {
electronic: 'musicVibes.electronic',
'hip-hop': 'musicVibes.hipHop',
pop: 'musicVibes.pop',
rock: 'musicVibes.rock',
chill: 'musicVibes.chill',
}
return t(vibeKeyMap[vibe] ?? vibe, { defaultValue: vibe })
}

76
src/shared/i18n/index.ts Normal file
View File

@@ -0,0 +1,76 @@
/**
* TabataFit i18n Setup
* expo-localization + i18next + react-i18next
* Auto-detects device locale, falls back to English
*/
import i18n from 'i18next'
import { initReactI18next } from 'react-i18next'
import { getLocales } from 'expo-localization'
// EN
import enCommon from './locales/en/common.json'
import enScreens from './locales/en/screens.json'
import enContent from './locales/en/content.json'
import enNotifications from './locales/en/notifications.json'
// FR
import frCommon from './locales/fr/common.json'
import frScreens from './locales/fr/screens.json'
import frContent from './locales/fr/content.json'
import frNotifications from './locales/fr/notifications.json'
// ES
import esCommon from './locales/es/common.json'
import esScreens from './locales/es/screens.json'
import esContent from './locales/es/content.json'
import esNotifications from './locales/es/notifications.json'
// DE
import deCommon from './locales/de/common.json'
import deScreens from './locales/de/screens.json'
import deContent from './locales/de/content.json'
import deNotifications from './locales/de/notifications.json'
const deviceLanguage = getLocales()[0]?.languageCode ?? 'en'
i18n
.use(initReactI18next)
.init({
compatibilityJSON: 'v4',
lng: deviceLanguage,
fallbackLng: 'en',
ns: ['common', 'screens', 'content', 'notifications'],
defaultNS: 'common',
resources: {
en: {
common: enCommon,
screens: enScreens,
content: enContent,
notifications: enNotifications,
},
fr: {
common: frCommon,
screens: frScreens,
content: frContent,
notifications: frNotifications,
},
es: {
common: esCommon,
screens: esScreens,
content: esContent,
notifications: esNotifications,
},
de: {
common: deCommon,
screens: deScreens,
content: deContent,
notifications: deNotifications,
},
},
interpolation: {
escapeValue: false,
},
})
export default i18n

View File

@@ -0,0 +1,14 @@
<claude-mem-context>
# Recent Activity
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
### Feb 20, 2026
| ID | Time | T | Title | Read |
|----|------|---|-------|------|
| #5391 | 10:20 PM | 🟣 | RevenueCat subscription system fully integrated and tested | ~656 |
| #5384 | 9:28 PM | 🟣 | Implemented RevenueCat subscription system | ~190 |
| #5374 | 7:54 PM | 🟣 | German Localization Added for Paywall Restore Purchases | ~184 |
| #5373 | " | 🟣 | German Localization Added for Profile Subscription Section | ~163 |
</claude-mem-context>

View File

@@ -0,0 +1,76 @@
{
"start": "START",
"continue": "Weiter",
"next": "Weiter",
"done": "Fertig",
"seeAll": "Alle anzeigen",
"back": "Zurück",
"share": "Teilen",
"cancel": "Abbrechen",
"save": "Speichern",
"levels": {
"beginner": "Anfänger",
"intermediate": "Fortgeschritten",
"advanced": "Profi"
},
"categories": {
"all": "Alle",
"fullBody": "Ganzkörper",
"core": "Core",
"upperBody": "Oberkörper",
"lowerBody": "Unterkörper",
"cardio": "Cardio"
},
"days": {
"sun": "So",
"mon": "Mo",
"tue": "Di",
"wed": "Mi",
"thu": "Do",
"fri": "Fr",
"sat": "Sa"
},
"greetings": {
"morning": "Guten Morgen",
"afternoon": "Guten Tag",
"evening": "Guten Abend"
},
"units": {
"min": "Min",
"cal": "kcal",
"minUnit": "{{count}} Min",
"calUnit": "{{count}} kcal",
"sWork": "{{count}}s Arbeit",
"perYear": "pro Jahr",
"perMonth": "pro Monat",
"perWeek": "/Woche"
},
"plurals": {
"workout_one": "{{count}} Workout",
"workout_other": "{{count}} Workouts",
"day_one": "{{count}} Tag",
"day_other": "{{count}} Tage",
"round_one": "{{count}} Runde",
"round_other": "{{count}} Runden",
"week_one": "{{count}} Woche",
"week_other": "{{count}} Wochen"
},
"workoutMeta": "{{duration}} Min \u00B7 {{level}} \u00B7 {{calories}} kcal",
"durationLevel": "{{duration}} Min \u00B7 {{level}}",
"calMin": "{{calories}} kcal \u00B7 {{duration}} Min",
"musicVibes": {
"electronic": "Electronic",
"hipHop": "Hip-Hop",
"pop": "Pop",
"rock": "Rock",
"chill": "Chill"
}
}

View File

@@ -0,0 +1,310 @@
{
"workouts": {
"1": "Ganzkörper Ignite",
"2": "Total Body Blast",
"3": "Power Surge",
"4": "Morgen-Weckruf",
"5": "Ausdauer-Aufbau",
"6": "Schneller Burn",
"7": "Funktioneller Flow",
"8": "Athletische Power",
"9": "Schweiß-Session",
"10": "Total Tone",
"11": "Core Crusher",
"12": "Bauch-Shredder",
"13": "Core Grundlagen",
"14": "Schräge-Inferno",
"15": "Core Ausdauer",
"16": "Sanftes Core",
"17": "Core Power",
"18": "360 Core",
"19": "Core Stabilität",
"20": "Core Marathon",
"21": "Oberkörper Blitz",
"22": "Arm-Sculptor",
"23": "Liegestütz-Meisterung",
"24": "Schulter-Shredder",
"25": "Brust & Rücken",
"26": "Eigengewicht Oberkörper",
"27": "Kraft Tabata",
"28": "Straffen & Definieren",
"29": "Power-Arme",
"30": "Oberkörper Ausdauer",
"31": "Unterkörper Burn",
"32": "Beintag Tabata",
"33": "Gesäß-Aktivierung",
"34": "Explosive Beine",
"35": "Kniebeugen Challenge",
"36": "Unterkörper Power",
"37": "Knieschonende Beine",
"38": "Sprint Tabata",
"39": "Beine & Po",
"40": "Beintag Marathon",
"41": "HIIT Extrem",
"42": "Cardio Blast",
"43": "Dance Cardio",
"44": "Fettverbrennung Express",
"45": "Low Impact Cardio",
"46": "Cardio Inferno",
"47": "Sonnenaufgang Flow",
"48": "Power Hour",
"49": "Tiefe Dehnung",
"50": "Cardio Marathon"
},
"exercises": {
"jumping-jacks": "Hampelmänner",
"squats": "Kniebeugen",
"push-ups": "Liegestütze",
"high-knees": "Kniehebelauf",
"burpees": "Burpees",
"lunges": "Ausfallschritte",
"push-up-to-row": "Liegestütz mit Rudern",
"mountain-climbers": "Bergsteiger",
"thrusters": "Thrusters",
"box-jumps": "Box Jumps",
"renegade-rows": "Renegade Rows",
"tuck-jumps": "Hocksprünge",
"arm-circles": "Armkreisen",
"bodyweight-squats": "Kniebeugen",
"knee-push-ups": "Knie-Liegestütze",
"marching-in-place": "Marschieren auf der Stelle",
"devil-press": "Devil Press",
"squat-jumps": "Sprung-Kniebeugen",
"push-up-burpees": "Liegestütz-Burpees",
"plank-jacks": "Plank Jacks",
"star-jumps": "Sternsprünge",
"wall-sit": "Wandsitzen",
"tricep-dips": "Trizeps-Dips",
"butt-kicks": "Anfersen",
"inchworms": "Inchworms",
"curtsy-lunges": "Knicks-Ausfallschritte",
"bear-crawls": "Bärenkrabbeln",
"squat-pulses": "Kniebeugen-Pulse",
"clean-and-press": "Clean & Press",
"lateral-bounds": "Seitsprünge",
"slam-ball": "Slam Ball",
"sprawls": "Sprawls",
"jumping-lunges": "Sprung-Ausfallschritte",
"push-up-to-t": "Liegestütz zum T",
"speed-skaters": "Speed Skaters",
"plank-shoulder-taps": "Plank Schultertippen",
"side-lunges": "Seitliche Ausfallschritte",
"diamond-push-ups": "Diamant-Liegestütze",
"glute-bridges": "Gesäßbrücke",
"toe-touches": "Zehenberührungen",
"crunches": "Crunches",
"russian-twists": "Russian Twists",
"leg-raises": "Beinheben",
"plank-hold": "Plank halten",
"v-ups": "V-Ups",
"bicycle-crunches": "Fahrrad-Crunches",
"dragon-flags": "Dragon Flags",
"flutter-kicks": "Flatterkicks",
"dead-bug": "Dead Bug",
"bird-dog": "Bird Dog",
"side-plank-l": "Seitplank (L)",
"side-plank-r": "Seitplank (R)",
"woodchoppers": "Holzhacker",
"side-crunches": "Seitliche Crunches",
"windshield-wipers": "Scheibenwischer",
"plank-hip-dips": "Plank Hüftsenken",
"hollow-body-hold": "Hollow Body Hold",
"turkish-get-ups": "Turkish Get-ups",
"ab-rollouts": "Bauchrad-Rollouts",
"pallof-press": "Pallof Press",
"pelvic-tilts": "Beckenkippen",
"modified-crunches": "Modifizierte Crunches",
"supine-leg-march": "Rückenlage Beinmarsch",
"cat-cow": "Katze-Kuh",
"plank-to-push-up": "Plank zu Liegestütz",
"reverse-crunches": "Umgekehrte Crunches",
"bear-hold": "Bärenhalten",
"l-sits": "L-Sits",
"dragon-flag-negatives": "Dragon Flag Negatives",
"hanging-knee-raises": "Hängendes Knieheben",
"plank-walkouts": "Plank Walkouts",
"forearm-plank": "Unterarm-Plank",
"slow-bicycle": "Langsamer Fahrrad-Crunch",
"glute-bridge-march": "Gesäßbrücke Marsch",
"prone-cobra": "Bauchlage Kobra",
"stir-the-pot": "Topfrühren",
"ab-wheel-rollout": "Bauchrad-Rollout",
"hanging-leg-raises": "Hängendes Beinheben",
"dumbbell-rows": "Kurzhantel-Rudern",
"shoulder-press": "Schulterdrücken",
"bicep-curls": "Bizeps-Curls",
"tricep-extensions": "Trizeps-Streckung",
"lateral-raises": "Seitheben",
"front-raises": "Frontheben",
"wide-push-ups": "Breite Liegestütze",
"decline-push-ups": "Decline Liegestütze",
"explosive-push-ups": "Explosive Liegestütze",
"arnold-press": "Arnold Press",
"upright-rows": "Aufrechtes Rudern",
"face-pulls": "Face Pulls",
"handstand-hold": "Handstand halten",
"chest-press": "Brustpresse",
"bent-over-rows": "Vorgebeugtes Rudern",
"chest-flyes": "Brustfliegen",
"pull-ups": "Klimmzüge",
"tricep-dips-chair": "Trizeps-Dips (Stuhl)",
"clean-and-jerk": "Clean & Jerk",
"turkish-get-up": "Turkish Get-up",
"overhead-press": "Überkopfdrücken",
"hammer-curls": "Hammer-Curls",
"overhead-tricep": "Überkopf Trizeps",
"reverse-flyes": "Reverse Flyes",
"concentration-curls": "Konzentrations-Curls",
"skull-crushers": "Skull Crushers",
"zottman-curls": "Zottman Curls",
"dips": "Dips",
"barbell-press": "Langhantel-Drücken",
"dumbbell-snatch": "Kurzhantel-Reißen",
"plyo-push-ups": "Plyo Liegestütze",
"calf-raises": "Wadenheben",
"jump-squats": "Sprung-Kniebeugen",
"walking-lunges": "Geh-Ausfallschritte",
"step-ups": "Step-ups",
"donkey-kicks": "Donkey Kicks",
"fire-hydrants": "Fire Hydrants",
"clamshells": "Clamshells",
"pistol-squats": "Pistol Squats",
"broad-jumps": "Weitsprünge",
"goblet-squats": "Goblet Squats",
"sumo-squats": "Sumo-Kniebeugen",
"pulse-squats": "Puls-Kniebeugen",
"front-squats": "Front-Kniebeugen",
"romanian-deadlifts": "Rumänisches Kreuzheben",
"split-squats": "Split Squats",
"power-cleans": "Power Cleans",
"standing-kickbacks": "Stehende Kickbacks",
"side-leg-raises": "Seitliches Beinheben",
"high-knees-sprint": "Kniehebelauf Sprint",
"lateral-shuffles": "Seitliches Shuffeln",
"butt-kick-sprint": "Anfersen Sprint",
"banded-squats": "Kniebeugen mit Band",
"hip-thrusts": "Hip Thrusts",
"lateral-band-walks": "Seitliches Bandgehen",
"step-back-lunges": "Rückwärts-Ausfallschritte",
"back-squats": "Back Squats",
"leg-press-jumps": "Beinpressen-Sprünge",
"box-jump-overs": "Box Jump Overs",
"grapevine": "Grapevine",
"step-touch": "Step Touch",
"cha-cha-slide": "Cha-Cha Slide",
"jump-rope": "Seilspringen",
"step-touches": "Step Touches",
"boxing-punches": "Box-Schläge",
"side-steps": "Seitschritte",
"burpee-tuck-jumps": "Burpee Hocksprünge",
"sprint-in-place": "Sprint auf der Stelle",
"plyo-lunges": "Plyo Ausfallschritte",
"sun-salutation": "Sonnengruß",
"light-jog": "Leichtes Joggen",
"arm-swings": "Armschwingen",
"gentle-twists": "Sanfte Drehungen",
"double-unders": "Double Unders",
"box-jump-burpees": "Box Jump Burpees",
"sprint-intervals": "Sprint-Intervalle",
"forward-fold": "Vorbeuge",
"pigeon-pose": "Taube",
"spinal-twist": "Wirbelsäulendrehung",
"butterfly-stretch": "Schmetterlingsdehnung"
},
"equipment": {
"no-equipment-required": "Kein Equipment nötig",
"yoga-mat-optional": "Yogamatte optional",
"yoga-mat": "Yogamatte",
"dumbbells-optional": "Kurzhanteln optional",
"dumbbells": "Kurzhanteln",
"kettlebell-recommended": "Kettlebell empfohlen",
"kettlebell": "Kettlebell",
"resistance-band-optional": "Widerstandsband optional",
"resistance-band": "Widerstandsband",
"medicine-ball": "Medizinball",
"light-dumbbells": "Leichte Kurzhanteln",
"pull-up-bar": "Klimmzugstange",
"full-gym-setup": "Voll ausgestattetes Fitnessstudio",
"box-or-step": "Box oder Stufe",
"chair-for-balance": "Stuhl für Balance",
"jump-rope-optional": "Springseil optional",
"jump-rope": "Springseil",
"stability-ball": "Gymnastikball",
"barbell": "Langhantel",
"dumbbell-optional": "Kurzhantel optional"
},
"collections": {
"morning-energizer": {
"title": "Morgen-Energie",
"description": "Starte richtig in den Tag"
},
"no-equipment": {
"title": "Ohne Equipment",
"description": "Trainiere überall"
},
"7-day-burn": {
"title": "7-Tage Burn Challenge",
"description": "Verwandlung in einer Woche"
},
"quick-intense": {
"title": "Kurz & Intensiv",
"description": "Maximale Anstrengung in 4 Minuten"
},
"core-focus": {
"title": "Core-Fokus",
"description": "Baue ein solides Fundament"
},
"leg-day": {
"title": "Beintag",
"description": "Überspringe nie den Beintag"
}
},
"programs": {
"beginner-journey": {
"title": "Einsteiger-Reise",
"description": "Deine ersten Schritte in die Tabata-Fitness"
},
"strength-builder": {
"title": "Kraft-Aufbau",
"description": "Progressiver Kraftaufbau"
},
"fat-burn-protocol": {
"title": "Fettverbrennungs-Protokoll",
"description": "Maximales Kalorienverbrennungsprogramm"
}
},
"achievements": {
"first-burn": {
"title": "Erster Burn",
"description": "Schließe dein erstes Workout ab"
},
"week-warrior": {
"title": "Wochen-Krieger",
"description": "7 Tage in Folge"
},
"century-club": {
"title": "Century Club",
"description": "Verbrenne insgesamt 100 Kalorien"
},
"iron-will": {
"title": "Eiserner Wille",
"description": "Schließe 10 Workouts ab"
},
"tabata-master": {
"title": "Tabata-Meister",
"description": "Schließe 50 Workouts ab"
},
"marathon-burner": {
"title": "Marathon-Burner",
"description": "Trainiere insgesamt 100 Minuten"
},
"unstoppable": {
"title": "Unaufhaltbar",
"description": "30 Tage in Folge"
},
"calorie-crusher": {
"title": "Kalorien-Crusher",
"description": "Verbrenne insgesamt 1000 Kalorien"
}
}
}

View File

@@ -0,0 +1,6 @@
{
"dailyReminder": {
"title": "Zeit für dein Tabata!",
"body": "4 Minuten, die deinen Tag verändern."
}
}

View File

@@ -53,10 +53,12 @@
"memberSince": "Mitglied seit {{date}}",
"sectionWorkout": "WORKOUT",
"sectionNotifications": "BENACHRICHTIGUNGEN",
"sectionSubscription": "ABONNEMENT",
"restorePurchases": "K\u00e4ufe wiederherstellen",
"hapticFeedback": "Haptisches Feedback",
"soundEffects": "Soundeffekte",
"voiceCoaching": "Sprachcoaching",
"dailyReminders": "Tägliche Erinnerungen",
"dailyReminders": "T\u00e4gliche Erinnerungen",
"reminderTime": "Erinnerungszeit",
"version": "TabataFit v1.0.0"
},
@@ -188,7 +190,8 @@
"monthlyPrice": "6,99 $",
"savePercent": "42% sparen",
"trialCta": "KOSTENLOS TESTEN (7 Tage)",
"guarantees": "Jederzeit kündbar \u00B7 30-Tage-Geld-zurück-Garantie",
"guarantees": "Jederzeit k\u00fcndbar \u00B7 30-Tage-Geld-zur\u00fcck-Garantie",
"restorePurchases": "K\u00e4ufe wiederherstellen",
"skipButton": "Ohne Abo fortfahren"
}
}

View File

@@ -0,0 +1,14 @@
<claude-mem-context>
# Recent Activity
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
### Feb 20, 2026
| ID | Time | T | Title | Read |
|----|------|---|-------|------|
| #5391 | 10:20 PM | 🟣 | RevenueCat subscription system fully integrated and tested | ~656 |
| #5384 | 9:28 PM | 🟣 | Implemented RevenueCat subscription system | ~190 |
| #5366 | 7:51 PM | 🟣 | Restore Purchases Translation Added to Paywall Section | ~153 |
| #5365 | " | 🟣 | English Localization Added for Subscription Section | ~160 |
</claude-mem-context>

View File

@@ -0,0 +1,76 @@
{
"start": "START",
"continue": "Continue",
"next": "Next",
"done": "Done",
"seeAll": "See All",
"back": "Back",
"share": "Share",
"cancel": "Cancel",
"save": "Save",
"levels": {
"beginner": "Beginner",
"intermediate": "Intermediate",
"advanced": "Advanced"
},
"categories": {
"all": "All",
"fullBody": "Full Body",
"core": "Core",
"upperBody": "Upper Body",
"lowerBody": "Lower Body",
"cardio": "Cardio"
},
"days": {
"sun": "Sun",
"mon": "Mon",
"tue": "Tue",
"wed": "Wed",
"thu": "Thu",
"fri": "Fri",
"sat": "Sat"
},
"greetings": {
"morning": "Good morning",
"afternoon": "Good afternoon",
"evening": "Good evening"
},
"units": {
"min": "min",
"cal": "cal",
"minUnit": "{{count}} min",
"calUnit": "{{count}} cal",
"sWork": "{{count}}s work",
"perYear": "per year",
"perMonth": "per month",
"perWeek": "/week"
},
"plurals": {
"workout_one": "{{count}} workout",
"workout_other": "{{count}} workouts",
"day_one": "{{count}} day",
"day_other": "{{count}} days",
"round_one": "{{count}} round",
"round_other": "{{count}} rounds",
"week_one": "{{count}} week",
"week_other": "{{count}} weeks"
},
"workoutMeta": "{{duration}} min \u00B7 {{level}} \u00B7 {{calories}} cal",
"durationLevel": "{{duration}} min \u00B7 {{level}}",
"calMin": "{{calories}} cal \u00B7 {{duration}} min",
"musicVibes": {
"electronic": "Electronic",
"hipHop": "Hip-Hop",
"pop": "Pop",
"rock": "Rock",
"chill": "Chill"
}
}

View File

@@ -0,0 +1,310 @@
{
"workouts": {
"1": "Full Body Ignite",
"2": "Total Body Blast",
"3": "Power Surge",
"4": "Morning Wake-Up",
"5": "Endurance Builder",
"6": "Quick Burn",
"7": "Functional Flow",
"8": "Athletic Power",
"9": "Sweat Session",
"10": "Total Tone",
"11": "Core Crusher",
"12": "Ab Shredder",
"13": "Core Foundations",
"14": "Oblique Inferno",
"15": "Core Endurance",
"16": "Gentle Core",
"17": "Core Power",
"18": "360 Core",
"19": "Core Stability",
"20": "Core Marathon",
"21": "Upper Body Blitz",
"22": "Arm Sculptor",
"23": "Push-Up Mastery",
"24": "Shoulder Shredder",
"25": "Chest & Back",
"26": "Bodyweight Upper",
"27": "Strength Tabata",
"28": "Tone & Define",
"29": "Power Arms",
"30": "Upper Endurance",
"31": "Lower Body Burn",
"32": "Leg Day Tabata",
"33": "Glute Activator",
"34": "Explosive Legs",
"35": "Squat Challenge",
"36": "Lower Power",
"37": "Knee-Friendly Legs",
"38": "Sprint Tabata",
"39": "Legs & Glutes",
"40": "Leg Day Marathon",
"41": "HIIT Extreme",
"42": "Cardio Blast",
"43": "Dance Cardio",
"44": "Fat Burn Express",
"45": "Low Impact Cardio",
"46": "Cardio Inferno",
"47": "Sunrise Flow",
"48": "Power Hour",
"49": "Deep Stretch",
"50": "Cardio Marathon"
},
"exercises": {
"jumping-jacks": "Jumping Jacks",
"squats": "Squats",
"push-ups": "Push-ups",
"high-knees": "High Knees",
"burpees": "Burpees",
"lunges": "Lunges",
"push-up-to-row": "Push-up to Row",
"mountain-climbers": "Mountain Climbers",
"thrusters": "Thrusters",
"box-jumps": "Box Jumps",
"renegade-rows": "Renegade Rows",
"tuck-jumps": "Tuck Jumps",
"arm-circles": "Arm Circles",
"bodyweight-squats": "Bodyweight Squats",
"knee-push-ups": "Knee Push-ups",
"marching-in-place": "Marching in Place",
"devil-press": "Devil Press",
"squat-jumps": "Squat Jumps",
"push-up-burpees": "Push-up Burpees",
"plank-jacks": "Plank Jacks",
"star-jumps": "Star Jumps",
"wall-sit": "Wall Sit",
"tricep-dips": "Tricep Dips",
"butt-kicks": "Butt Kicks",
"inchworms": "Inchworms",
"curtsy-lunges": "Curtsy Lunges",
"bear-crawls": "Bear Crawls",
"squat-pulses": "Squat Pulses",
"clean-and-press": "Clean & Press",
"lateral-bounds": "Lateral Bounds",
"slam-ball": "Slam Ball",
"sprawls": "Sprawls",
"jumping-lunges": "Jumping Lunges",
"push-up-to-t": "Push-up to T",
"speed-skaters": "Speed Skaters",
"plank-shoulder-taps": "Plank Shoulder Taps",
"side-lunges": "Side Lunges",
"diamond-push-ups": "Diamond Push-ups",
"glute-bridges": "Glute Bridges",
"toe-touches": "Toe Touches",
"crunches": "Crunches",
"russian-twists": "Russian Twists",
"leg-raises": "Leg Raises",
"plank-hold": "Plank Hold",
"v-ups": "V-Ups",
"bicycle-crunches": "Bicycle Crunches",
"dragon-flags": "Dragon Flags",
"flutter-kicks": "Flutter Kicks",
"dead-bug": "Dead Bug",
"bird-dog": "Bird Dog",
"side-plank-l": "Side Plank (L)",
"side-plank-r": "Side Plank (R)",
"woodchoppers": "Woodchoppers",
"side-crunches": "Side Crunches",
"windshield-wipers": "Windshield Wipers",
"plank-hip-dips": "Plank Hip Dips",
"hollow-body-hold": "Hollow Body Hold",
"turkish-get-ups": "Turkish Get-ups",
"ab-rollouts": "Ab Rollouts",
"pallof-press": "Pallof Press",
"pelvic-tilts": "Pelvic Tilts",
"modified-crunches": "Modified Crunches",
"supine-leg-march": "Supine Leg March",
"cat-cow": "Cat-Cow",
"plank-to-push-up": "Plank to Push-up",
"reverse-crunches": "Reverse Crunches",
"bear-hold": "Bear Hold",
"l-sits": "L-Sits",
"dragon-flag-negatives": "Dragon Flag Negatives",
"hanging-knee-raises": "Hanging Knee Raises",
"plank-walkouts": "Plank Walkouts",
"forearm-plank": "Forearm Plank",
"slow-bicycle": "Slow Bicycle",
"glute-bridge-march": "Glute Bridge March",
"prone-cobra": "Prone Cobra",
"stir-the-pot": "Stir the Pot",
"ab-wheel-rollout": "Ab Wheel Rollout",
"hanging-leg-raises": "Hanging Leg Raises",
"dumbbell-rows": "Dumbbell Rows",
"shoulder-press": "Shoulder Press",
"bicep-curls": "Bicep Curls",
"tricep-extensions": "Tricep Extensions",
"lateral-raises": "Lateral Raises",
"front-raises": "Front Raises",
"wide-push-ups": "Wide Push-ups",
"decline-push-ups": "Decline Push-ups",
"explosive-push-ups": "Explosive Push-ups",
"arnold-press": "Arnold Press",
"upright-rows": "Upright Rows",
"face-pulls": "Face Pulls",
"handstand-hold": "Handstand Hold",
"chest-press": "Chest Press",
"bent-over-rows": "Bent Over Rows",
"chest-flyes": "Chest Flyes",
"pull-ups": "Pull-ups",
"tricep-dips-chair": "Tricep Dips (Chair)",
"clean-and-jerk": "Clean & Jerk",
"turkish-get-up": "Turkish Get-up",
"overhead-press": "Overhead Press",
"hammer-curls": "Hammer Curls",
"overhead-tricep": "Overhead Tricep",
"reverse-flyes": "Reverse Flyes",
"concentration-curls": "Concentration Curls",
"skull-crushers": "Skull Crushers",
"zottman-curls": "Zottman Curls",
"dips": "Dips",
"barbell-press": "Barbell Press",
"dumbbell-snatch": "Dumbbell Snatch",
"plyo-push-ups": "Plyo Push-ups",
"calf-raises": "Calf Raises",
"jump-squats": "Jump Squats",
"walking-lunges": "Walking Lunges",
"step-ups": "Step-ups",
"donkey-kicks": "Donkey Kicks",
"fire-hydrants": "Fire Hydrants",
"clamshells": "Clamshells",
"pistol-squats": "Pistol Squats",
"broad-jumps": "Broad Jumps",
"goblet-squats": "Goblet Squats",
"sumo-squats": "Sumo Squats",
"pulse-squats": "Pulse Squats",
"front-squats": "Front Squats",
"romanian-deadlifts": "Romanian Deadlifts",
"split-squats": "Split Squats",
"power-cleans": "Power Cleans",
"standing-kickbacks": "Standing Kickbacks",
"side-leg-raises": "Side Leg Raises",
"high-knees-sprint": "High Knees Sprint",
"lateral-shuffles": "Lateral Shuffles",
"butt-kick-sprint": "Butt Kick Sprint",
"banded-squats": "Banded Squats",
"hip-thrusts": "Hip Thrusts",
"lateral-band-walks": "Lateral Band Walks",
"step-back-lunges": "Step-back Lunges",
"back-squats": "Back Squats",
"leg-press-jumps": "Leg Press Jumps",
"box-jump-overs": "Box Jump Overs",
"grapevine": "Grapevine",
"step-touch": "Step Touch",
"cha-cha-slide": "Cha-Cha Slide",
"jump-rope": "Jump Rope",
"step-touches": "Step Touches",
"boxing-punches": "Boxing Punches",
"side-steps": "Side Steps",
"burpee-tuck-jumps": "Burpee Tuck Jumps",
"sprint-in-place": "Sprint in Place",
"plyo-lunges": "Plyo Lunges",
"sun-salutation": "Sun Salutation",
"light-jog": "Light Jog",
"arm-swings": "Arm Swings",
"gentle-twists": "Gentle Twists",
"double-unders": "Double Unders",
"box-jump-burpees": "Box Jump Burpees",
"sprint-intervals": "Sprint Intervals",
"forward-fold": "Forward Fold",
"pigeon-pose": "Pigeon Pose",
"spinal-twist": "Spinal Twist",
"butterfly-stretch": "Butterfly Stretch"
},
"equipment": {
"no-equipment-required": "No equipment required",
"yoga-mat-optional": "Yoga mat optional",
"yoga-mat": "Yoga mat",
"dumbbells-optional": "Dumbbells optional",
"dumbbells": "Dumbbells",
"kettlebell-recommended": "Kettlebell recommended",
"kettlebell": "Kettlebell",
"resistance-band-optional": "Resistance band optional",
"resistance-band": "Resistance band",
"medicine-ball": "Medicine ball",
"light-dumbbells": "Light dumbbells",
"pull-up-bar": "Pull-up bar",
"full-gym-setup": "Full gym setup",
"box-or-step": "Box or step",
"chair-for-balance": "Chair for balance",
"jump-rope-optional": "Jump rope optional",
"jump-rope": "Jump rope",
"stability-ball": "Stability ball",
"barbell": "Barbell",
"dumbbell-optional": "Dumbbell optional"
},
"collections": {
"morning-energizer": {
"title": "Morning Energizer",
"description": "Start your day right"
},
"no-equipment": {
"title": "No Equipment",
"description": "Workout anywhere"
},
"7-day-burn": {
"title": "7-Day Burn Challenge",
"description": "Transform in one week"
},
"quick-intense": {
"title": "Quick & Intense",
"description": "Max effort in 4 minutes"
},
"core-focus": {
"title": "Core Focus",
"description": "Build a solid foundation"
},
"leg-day": {
"title": "Leg Day",
"description": "Never skip leg day"
}
},
"programs": {
"beginner-journey": {
"title": "Beginner Journey",
"description": "Your first steps into Tabata fitness"
},
"strength-builder": {
"title": "Strength Builder",
"description": "Progressive strength development"
},
"fat-burn-protocol": {
"title": "Fat Burn Protocol",
"description": "Maximum calorie burn program"
}
},
"achievements": {
"first-burn": {
"title": "First Burn",
"description": "Complete your first workout"
},
"week-warrior": {
"title": "Week Warrior",
"description": "7 day streak"
},
"century-club": {
"title": "Century Club",
"description": "Burn 100 calories total"
},
"iron-will": {
"title": "Iron Will",
"description": "Complete 10 workouts"
},
"tabata-master": {
"title": "Tabata Master",
"description": "Complete 50 workouts"
},
"marathon-burner": {
"title": "Marathon Burner",
"description": "Exercise for 100 minutes total"
},
"unstoppable": {
"title": "Unstoppable",
"description": "30 day streak"
},
"calorie-crusher": {
"title": "Calorie Crusher",
"description": "Burn 1000 calories total"
}
}
}

View File

@@ -0,0 +1,6 @@
{
"dailyReminder": {
"title": "Time for your Tabata!",
"body": "4 minutes to transform your day."
}
}

View File

@@ -53,6 +53,8 @@
"memberSince": "Member since {{date}}",
"sectionWorkout": "WORKOUT",
"sectionNotifications": "NOTIFICATIONS",
"sectionSubscription": "SUBSCRIPTION",
"restorePurchases": "Restore Purchases",
"hapticFeedback": "Haptic Feedback",
"soundEffects": "Sound Effects",
"voiceCoaching": "Voice Coaching",
@@ -189,6 +191,7 @@
"savePercent": "Save 42%",
"trialCta": "START FREE TRIAL (7 days)",
"guarantees": "Cancel anytime \u00B7 30-day money-back guarantee",
"restorePurchases": "Restore Purchases",
"skipButton": "Continue without subscription"
}
}

View File

@@ -0,0 +1,14 @@
<claude-mem-context>
# Recent Activity
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
### Feb 20, 2026
| ID | Time | T | Title | Read |
|----|------|---|-------|------|
| #5391 | 10:20 PM | 🟣 | RevenueCat subscription system fully integrated and tested | ~656 |
| #5384 | 9:28 PM | 🟣 | Implemented RevenueCat subscription system | ~190 |
| #5372 | 7:54 PM | 🟣 | Spanish Localization Added for Paywall Restore Purchases | ~138 |
| #5371 | " | 🟣 | Spanish Localization Added for Profile Subscription Section | ~163 |
</claude-mem-context>

View File

@@ -0,0 +1,76 @@
{
"start": "EMPEZAR",
"continue": "Continuar",
"next": "Siguiente",
"done": "Listo",
"seeAll": "Ver todo",
"back": "Atr\u00e1s",
"share": "Compartir",
"cancel": "Cancelar",
"save": "Guardar",
"levels": {
"beginner": "Principiante",
"intermediate": "Intermedio",
"advanced": "Avanzado"
},
"categories": {
"all": "Todos",
"fullBody": "Cuerpo completo",
"core": "Core",
"upperBody": "Tren superior",
"lowerBody": "Tren inferior",
"cardio": "Cardio"
},
"days": {
"sun": "Dom",
"mon": "Lun",
"tue": "Mar",
"wed": "Mi\u00e9",
"thu": "Jue",
"fri": "Vie",
"sat": "S\u00e1b"
},
"greetings": {
"morning": "Buenos d\u00edas",
"afternoon": "Buenas tardes",
"evening": "Buenas noches"
},
"units": {
"min": "min",
"cal": "cal",
"minUnit": "{{count}} min",
"calUnit": "{{count}} cal",
"sWork": "{{count}}s trabajo",
"perYear": "por a\u00f1o",
"perMonth": "por mes",
"perWeek": "/semana"
},
"plurals": {
"workout_one": "{{count}} entrenamiento",
"workout_other": "{{count}} entrenamientos",
"day_one": "{{count}} d\u00eda",
"day_other": "{{count}} d\u00edas",
"round_one": "{{count}} ronda",
"round_other": "{{count}} rondas",
"week_one": "{{count}} semana",
"week_other": "{{count}} semanas"
},
"workoutMeta": "{{duration}} min \u00B7 {{level}} \u00B7 {{calories}} cal",
"durationLevel": "{{duration}} min \u00B7 {{level}}",
"calMin": "{{calories}} cal \u00B7 {{duration}} min",
"musicVibes": {
"electronic": "Electr\u00f3nica",
"hipHop": "Hip-Hop",
"pop": "Pop",
"rock": "Rock",
"chill": "Chill"
}
}

View File

@@ -0,0 +1,310 @@
{
"workouts": {
"1": "Ignici\u00f3n total",
"2": "Explosi\u00f3n corporal",
"3": "Oleada de potencia",
"4": "Despertar matutino",
"5": "Constructor de resistencia",
"6": "Quema r\u00e1pida",
"7": "Flujo funcional",
"8": "Potencia atl\u00e9tica",
"9": "Sesi\u00f3n de sudor",
"10": "Tonificaci\u00f3n total",
"11": "Destructor de core",
"12": "Abdominales extremos",
"13": "Fundamentos de core",
"14": "Infierno oblicuo",
"15": "Resistencia de core",
"16": "Core suave",
"17": "Potencia de core",
"18": "Core 360",
"19": "Estabilidad de core",
"20": "Marat\u00f3n de core",
"21": "Ataque tren superior",
"22": "Escultor de brazos",
"23": "Dominio de flexiones",
"24": "Hombros al l\u00edmite",
"25": "Pecho y espalda",
"26": "Tren superior sin equipo",
"27": "Tabata de fuerza",
"28": "Tonifica y define",
"29": "Brazos de potencia",
"30": "Resistencia tren superior",
"31": "Quema de piernas",
"32": "D\u00eda de piernas Tabata",
"33": "Activador de gl\u00fateos",
"34": "Piernas explosivas",
"35": "Desaf\u00edo de sentadillas",
"36": "Potencia inferior",
"37": "Piernas sin impacto",
"38": "Tabata de sprint",
"39": "Piernas y gl\u00fateos",
"40": "Marat\u00f3n de piernas",
"41": "HIIT Extremo",
"42": "Explosi\u00f3n cardio",
"43": "Cardio bailable",
"44": "Quema grasa expr\u00e9s",
"45": "Cardio bajo impacto",
"46": "Infierno cardio",
"47": "Flujo al amanecer",
"48": "Hora de potencia",
"49": "Estiramiento profundo",
"50": "Marat\u00f3n cardio"
},
"exercises": {
"jumping-jacks": "Jumping Jacks",
"squats": "Sentadillas",
"push-ups": "Flexiones",
"high-knees": "Rodillas arriba",
"burpees": "Burpees",
"lunges": "Zancadas",
"push-up-to-row": "Flexi\u00f3n con remo",
"mountain-climbers": "Escaladores",
"thrusters": "Thrusters",
"box-jumps": "Saltos al caj\u00f3n",
"renegade-rows": "Remo renegado",
"tuck-jumps": "Saltos con rodillas al pecho",
"arm-circles": "C\u00edrculos de brazos",
"bodyweight-squats": "Sentadillas con peso corporal",
"knee-push-ups": "Flexiones de rodillas",
"marching-in-place": "Marcha en el sitio",
"devil-press": "Devil Press",
"squat-jumps": "Sentadillas con salto",
"push-up-burpees": "Burpees con flexi\u00f3n",
"plank-jacks": "Plank Jacks",
"star-jumps": "Saltos de estrella",
"wall-sit": "Sentadilla en pared",
"tricep-dips": "Fondos de tr\u00edceps",
"butt-kicks": "Talones a gl\u00fateos",
"inchworms": "Inchworms",
"curtsy-lunges": "Zancadas cruzadas",
"bear-crawls": "Caminata de oso",
"squat-pulses": "Sentadillas con pulsos",
"clean-and-press": "Cargada y press",
"lateral-bounds": "Saltos laterales",
"slam-ball": "Slam Ball",
"sprawls": "Sprawls",
"jumping-lunges": "Zancadas con salto",
"push-up-to-t": "Flexi\u00f3n en T",
"speed-skaters": "Patinadores",
"plank-shoulder-taps": "Plancha con toque de hombros",
"side-lunges": "Zancadas laterales",
"diamond-push-ups": "Flexiones diamante",
"glute-bridges": "Puente de gl\u00fateos",
"toe-touches": "Toques de puntas",
"crunches": "Abdominales",
"russian-twists": "Giros rusos",
"leg-raises": "Elevaciones de piernas",
"plank-hold": "Plancha est\u00e1tica",
"v-ups": "V-Ups",
"bicycle-crunches": "Abdominales bicicleta",
"dragon-flags": "Dragon Flags",
"flutter-kicks": "Patadas de aleteo",
"dead-bug": "Dead Bug",
"bird-dog": "Bird Dog",
"side-plank-l": "Plancha lateral (I)",
"side-plank-r": "Plancha lateral (D)",
"woodchoppers": "Le\u00f1adores",
"side-crunches": "Abdominales laterales",
"windshield-wipers": "Limpiaparabrisas",
"plank-hip-dips": "Plancha con giro de cadera",
"hollow-body-hold": "Hollow Body Hold",
"turkish-get-ups": "Levantamiento turco",
"ab-rollouts": "Ab Rollouts",
"pallof-press": "Pallof Press",
"pelvic-tilts": "Inclinaci\u00f3n p\u00e9lvica",
"modified-crunches": "Abdominales modificados",
"supine-leg-march": "Marcha supina de piernas",
"cat-cow": "Gato-vaca",
"plank-to-push-up": "Plancha a flexi\u00f3n",
"reverse-crunches": "Abdominales inversos",
"bear-hold": "Posici\u00f3n de oso",
"l-sits": "L-Sits",
"dragon-flag-negatives": "Dragon Flag negativos",
"hanging-knee-raises": "Elevaci\u00f3n de rodillas colgado",
"plank-walkouts": "Plancha caminada",
"forearm-plank": "Plancha de antebrazos",
"slow-bicycle": "Bicicleta lenta",
"glute-bridge-march": "Puente de gl\u00fateos con marcha",
"prone-cobra": "Cobra boca abajo",
"stir-the-pot": "Stir the Pot",
"ab-wheel-rollout": "Rueda abdominal",
"hanging-leg-raises": "Elevaci\u00f3n de piernas colgado",
"dumbbell-rows": "Remo con mancuerna",
"shoulder-press": "Press de hombros",
"bicep-curls": "Curl de b\u00edceps",
"tricep-extensions": "Extensiones de tr\u00edceps",
"lateral-raises": "Elevaciones laterales",
"front-raises": "Elevaciones frontales",
"wide-push-ups": "Flexiones abiertas",
"decline-push-ups": "Flexiones declinadas",
"explosive-push-ups": "Flexiones explosivas",
"arnold-press": "Press Arnold",
"upright-rows": "Remo al ment\u00f3n",
"face-pulls": "Face Pulls",
"handstand-hold": "Pino est\u00e1tico",
"chest-press": "Press de pecho",
"bent-over-rows": "Remo inclinado",
"chest-flyes": "Aperturas de pecho",
"pull-ups": "Dominadas",
"tricep-dips-chair": "Fondos de tr\u00edceps (silla)",
"clean-and-jerk": "Cargada y env\u00f3n",
"turkish-get-up": "Levantamiento turco",
"overhead-press": "Press por encima de la cabeza",
"hammer-curls": "Curl martillo",
"overhead-tricep": "Tr\u00edceps por encima",
"reverse-flyes": "Aperturas inversas",
"concentration-curls": "Curl concentrado",
"skull-crushers": "Skull Crushers",
"zottman-curls": "Curl Zottman",
"dips": "Fondos",
"barbell-press": "Press con barra",
"dumbbell-snatch": "Arrancada con mancuerna",
"plyo-push-ups": "Flexiones pliom\u00e9tricas",
"calf-raises": "Elevaciones de gemelos",
"jump-squats": "Sentadillas con salto",
"walking-lunges": "Zancadas caminando",
"step-ups": "Step-ups",
"donkey-kicks": "Patadas de burro",
"fire-hydrants": "Hidrantes",
"clamshells": "Clamshells",
"pistol-squats": "Sentadilla a una pierna",
"broad-jumps": "Saltos de longitud",
"goblet-squats": "Sentadilla goblet",
"sumo-squats": "Sentadilla sumo",
"pulse-squats": "Sentadillas con pulsos",
"front-squats": "Sentadilla frontal",
"romanian-deadlifts": "Peso muerto rumano",
"split-squats": "Sentadillas b\u00falgaras",
"power-cleans": "Cargadas de potencia",
"standing-kickbacks": "Patadas traseras de pie",
"side-leg-raises": "Elevaci\u00f3n lateral de pierna",
"high-knees-sprint": "Sprint con rodillas arriba",
"lateral-shuffles": "Desplazamientos laterales",
"butt-kick-sprint": "Sprint con talones a gl\u00fateos",
"banded-squats": "Sentadillas con banda",
"hip-thrusts": "Empuje de cadera",
"lateral-band-walks": "Caminata lateral con banda",
"step-back-lunges": "Zancadas hacia atr\u00e1s",
"back-squats": "Sentadilla trasera",
"leg-press-jumps": "Saltos de prensa de pierna",
"box-jump-overs": "Saltos por encima del caj\u00f3n",
"grapevine": "Grapevine",
"step-touch": "Step Touch",
"cha-cha-slide": "Cha-Cha Slide",
"jump-rope": "Saltar la cuerda",
"step-touches": "Step Touches",
"boxing-punches": "Golpes de boxeo",
"side-steps": "Pasos laterales",
"burpee-tuck-jumps": "Burpees con salto agrupado",
"sprint-in-place": "Sprint en el sitio",
"plyo-lunges": "Zancadas pliom\u00e9tricas",
"sun-salutation": "Saludo al sol",
"light-jog": "Trote suave",
"arm-swings": "Balanceo de brazos",
"gentle-twists": "Giros suaves",
"double-unders": "Dobles de cuerda",
"box-jump-burpees": "Burpees con salto al caj\u00f3n",
"sprint-intervals": "Intervalos de sprint",
"forward-fold": "Pliegue hacia adelante",
"pigeon-pose": "Postura de paloma",
"spinal-twist": "Torsi\u00f3n espinal",
"butterfly-stretch": "Estiramiento mariposa"
},
"equipment": {
"no-equipment-required": "Sin equipamiento necesario",
"yoga-mat-optional": "Esterilla de yoga opcional",
"yoga-mat": "Esterilla de yoga",
"dumbbells-optional": "Mancuernas opcionales",
"dumbbells": "Mancuernas",
"kettlebell-recommended": "Kettlebell recomendada",
"kettlebell": "Kettlebell",
"resistance-band-optional": "Banda el\u00e1stica opcional",
"resistance-band": "Banda el\u00e1stica",
"medicine-ball": "Bal\u00f3n medicinal",
"light-dumbbells": "Mancuernas ligeras",
"pull-up-bar": "Barra de dominadas",
"full-gym-setup": "Equipamiento completo de gimnasio",
"box-or-step": "Caj\u00f3n o step",
"chair-for-balance": "Silla para equilibrio",
"jump-rope-optional": "Cuerda de saltar opcional",
"jump-rope": "Cuerda de saltar",
"stability-ball": "Bal\u00f3n de estabilidad",
"barbell": "Barra",
"dumbbell-optional": "Mancuerna opcional"
},
"collections": {
"morning-energizer": {
"title": "Energ\u00eda matutina",
"description": "Empieza bien el d\u00eda"
},
"no-equipment": {
"title": "Sin equipamiento",
"description": "Entrena donde quieras"
},
"7-day-burn": {
"title": "Desaf\u00edo 7 d\u00edas de quema",
"description": "Transf\u00f3rmate en una semana"
},
"quick-intense": {
"title": "R\u00e1pido e intenso",
"description": "M\u00e1ximo esfuerzo en 4 minutos"
},
"core-focus": {
"title": "Enfoque en core",
"description": "Construye una base s\u00f3lida"
},
"leg-day": {
"title": "D\u00eda de piernas",
"description": "Nunca te saltes el d\u00eda de piernas"
}
},
"programs": {
"beginner-journey": {
"title": "Camino del principiante",
"description": "Tus primeros pasos en el fitness Tabata"
},
"strength-builder": {
"title": "Constructor de fuerza",
"description": "Desarrollo progresivo de fuerza"
},
"fat-burn-protocol": {
"title": "Protocolo quema grasa",
"description": "Programa de m\u00e1xima quema de calor\u00edas"
}
},
"achievements": {
"first-burn": {
"title": "Primera quema",
"description": "Completa tu primer entreno"
},
"week-warrior": {
"title": "Guerrero semanal",
"description": "Racha de 7 d\u00edas"
},
"century-club": {
"title": "Club del centenario",
"description": "Quema 100 calor\u00edas en total"
},
"iron-will": {
"title": "Voluntad de hierro",
"description": "Completa 10 entrenos"
},
"tabata-master": {
"title": "Maestro Tabata",
"description": "Completa 50 entrenos"
},
"marathon-burner": {
"title": "Quemador marat\u00f3n",
"description": "Ejerc\u00edtate 100 minutos en total"
},
"unstoppable": {
"title": "Imparable",
"description": "Racha de 30 d\u00edas"
},
"calorie-crusher": {
"title": "Destructor de calor\u00edas",
"description": "Quema 1000 calor\u00edas en total"
}
}
}

View File

@@ -0,0 +1,6 @@
{
"dailyReminder": {
"title": "\u00a1Es hora de tu Tabata!",
"body": "4 minutos para transformar tu d\u00eda."
}
}

View File

@@ -53,6 +53,8 @@
"memberSince": "Miembro desde {{date}}",
"sectionWorkout": "ENTRENAMIENTO",
"sectionNotifications": "NOTIFICACIONES",
"sectionSubscription": "SUSCRIPCI\u00d3N",
"restorePurchases": "Restaurar compras",
"hapticFeedback": "Retroalimentaci\u00f3n h\u00e1ptica",
"soundEffects": "Efectos de sonido",
"voiceCoaching": "Coaching por voz",
@@ -189,6 +191,7 @@
"savePercent": "Ahorra 42%",
"trialCta": "EMPEZAR PRUEBA GRATIS (7 d\u00edas)",
"guarantees": "Cancela cuando quieras \u00B7 Garant\u00eda de devoluci\u00f3n de 30 d\u00edas",
"restorePurchases": "Restaurar compras",
"skipButton": "Continuar sin suscripci\u00f3n"
}
}

View File

@@ -0,0 +1,7 @@
<claude-mem-context>
# Recent Activity
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
*No recent activity*
</claude-mem-context>

View File

@@ -0,0 +1,76 @@
{
"start": "COMMENCER",
"continue": "Continuer",
"next": "Suivant",
"done": "Termin\u00e9",
"seeAll": "Tout voir",
"back": "Retour",
"share": "Partager",
"cancel": "Annuler",
"save": "Enregistrer",
"levels": {
"beginner": "D\u00e9butant",
"intermediate": "Interm\u00e9diaire",
"advanced": "Avanc\u00e9"
},
"categories": {
"all": "Tout",
"fullBody": "Full Body",
"core": "Abdos",
"upperBody": "Haut du corps",
"lowerBody": "Bas du corps",
"cardio": "Cardio"
},
"days": {
"sun": "Dim",
"mon": "Lun",
"tue": "Mar",
"wed": "Mer",
"thu": "Jeu",
"fri": "Ven",
"sat": "Sam"
},
"greetings": {
"morning": "Bonjour",
"afternoon": "Bon apr\u00e8s-midi",
"evening": "Bonsoir"
},
"units": {
"min": "min",
"cal": "cal",
"minUnit": "{{count}} min",
"calUnit": "{{count}} cal",
"sWork": "{{count}}s effort",
"perYear": "par an",
"perMonth": "par mois",
"perWeek": "/semaine"
},
"plurals": {
"workout_one": "{{count}} entra\u00eenement",
"workout_other": "{{count}} entra\u00eenements",
"day_one": "{{count}} jour",
"day_other": "{{count}} jours",
"round_one": "{{count}} round",
"round_other": "{{count}} rounds",
"week_one": "{{count}} semaine",
"week_other": "{{count}} semaines"
},
"workoutMeta": "{{duration}} min \u00B7 {{level}} \u00B7 {{calories}} cal",
"durationLevel": "{{duration}} min \u00B7 {{level}}",
"calMin": "{{calories}} cal \u00B7 {{duration}} min",
"musicVibes": {
"electronic": "\u00c9lectronique",
"hipHop": "Hip-Hop",
"pop": "Pop",
"rock": "Rock",
"chill": "Chill"
}
}

View File

@@ -0,0 +1,310 @@
{
"workouts": {
"1": "Full Body Ignite",
"2": "Total Body Blast",
"3": "Power Surge",
"4": "R\u00e9veil Matinal",
"5": "Endurance Builder",
"6": "Br\u00fblure Express",
"7": "Functional Flow",
"8": "Puissance Athl\u00e9tique",
"9": "Session Sueur",
"10": "Tonus Total",
"11": "Core Crusher",
"12": "Ab Shredder",
"13": "Abdos Fondamentaux",
"14": "Obliqu\u00e9s Inferno",
"15": "Endurance Abdos",
"16": "Abdos Doux",
"17": "Core Power",
"18": "Abdos 360",
"19": "Stabilit\u00e9 Abdos",
"20": "Abdos Marathon",
"21": "Haut du Corps Blitz",
"22": "Sculpteur de Bras",
"23": "Ma\u00eetrise des Pompes",
"24": "\u00c9paules Sculpt\u00e9es",
"25": "Pectoraux & Dos",
"26": "Haut du Corps Poids de Corps",
"27": "Tabata Force",
"28": "Tonifier & D\u00e9finir",
"29": "Bras Puissants",
"30": "Endurance Haut du Corps",
"31": "Br\u00fblure Bas du Corps",
"32": "Leg Day Tabata",
"33": "Activation Fessiers",
"34": "Jambes Explosives",
"35": "D\u00e9fi Squats",
"36": "Puissance Bas du Corps",
"37": "Jambes Sans Impact",
"38": "Sprint Tabata",
"39": "Jambes & Fessiers",
"40": "Marathon Jambes",
"41": "HIIT Extr\u00eame",
"42": "Cardio Blast",
"43": "Cardio Danse",
"44": "Br\u00fbleur de Graisses Express",
"45": "Cardio Faible Impact",
"46": "Cardio Inferno",
"47": "Flow Matinal",
"48": "Power Hour",
"49": "\u00c9tirements Profonds",
"50": "Cardio Marathon"
},
"exercises": {
"jumping-jacks": "Jumping Jacks",
"squats": "Squats",
"push-ups": "Pompes",
"high-knees": "Mont\u00e9es de genoux",
"burpees": "Burpees",
"lunges": "Fentes",
"push-up-to-row": "Pompe-Tirage",
"mountain-climbers": "Mountain Climbers",
"thrusters": "Thrusters",
"box-jumps": "Box Jumps",
"renegade-rows": "Renegade Rows",
"tuck-jumps": "Sauts group\u00e9s",
"arm-circles": "Cercles de bras",
"bodyweight-squats": "Squats poids de corps",
"knee-push-ups": "Pompes sur les genoux",
"marching-in-place": "Marche sur place",
"devil-press": "Devil Press",
"squat-jumps": "Squats saut\u00e9s",
"push-up-burpees": "Pompes Burpees",
"plank-jacks": "Plank Jacks",
"star-jumps": "Sauts en \u00e9toile",
"wall-sit": "Chaise",
"tricep-dips": "Dips triceps",
"butt-kicks": "Talons-fesses",
"inchworms": "Inchworms",
"curtsy-lunges": "Fentes crois\u00e9es",
"bear-crawls": "Marche de l'ours",
"squat-pulses": "Squats pulses",
"clean-and-press": "Clean & Press",
"lateral-bounds": "Bonds lat\u00e9raux",
"slam-ball": "Slam Ball",
"sprawls": "Sprawls",
"jumping-lunges": "Fentes saut\u00e9es",
"push-up-to-t": "Pompe en T",
"speed-skaters": "Speed Skaters",
"plank-shoulder-taps": "Planche touches d'\u00e9paules",
"side-lunges": "Fentes lat\u00e9rales",
"diamond-push-ups": "Pompes diamant",
"glute-bridges": "Ponts fessiers",
"toe-touches": "Touch\u00e9s d'orteils",
"crunches": "Crunchs",
"russian-twists": "Rotations russes",
"leg-raises": "\u00c9l\u00e9vations de jambes",
"plank-hold": "Gainage",
"v-ups": "V-Ups",
"bicycle-crunches": "Crunchs bicyclette",
"dragon-flags": "Dragon Flags",
"flutter-kicks": "Battements de jambes",
"dead-bug": "Dead Bug",
"bird-dog": "Bird Dog",
"side-plank-l": "Planche lat\u00e9rale (G)",
"side-plank-r": "Planche lat\u00e9rale (D)",
"woodchoppers": "B\u00fbcherons",
"side-crunches": "Crunchs lat\u00e9raux",
"windshield-wipers": "Essuie-glaces",
"plank-hip-dips": "Planche rotations hanches",
"hollow-body-hold": "Hollow Body Hold",
"turkish-get-ups": "Relev\u00e9s turcs",
"ab-rollouts": "Ab Rollouts",
"pallof-press": "Pallof Press",
"pelvic-tilts": "Bascules du bassin",
"modified-crunches": "Crunchs modifi\u00e9s",
"supine-leg-march": "Marche de jambes allong\u00e9",
"cat-cow": "Chat-Vache",
"plank-to-push-up": "Planche vers pompe",
"reverse-crunches": "Crunchs invers\u00e9s",
"bear-hold": "Position de l'ours",
"l-sits": "L-Sits",
"dragon-flag-negatives": "Dragon Flag n\u00e9gatifs",
"hanging-knee-raises": "Mont\u00e9es de genoux suspendues",
"plank-walkouts": "Planche marche",
"forearm-plank": "Gainage avant-bras",
"slow-bicycle": "Bicyclette lente",
"glute-bridge-march": "Pont fessier march\u00e9",
"prone-cobra": "Cobra ventral",
"stir-the-pot": "Stir the Pot",
"ab-wheel-rollout": "Roue abdominale",
"hanging-leg-raises": "\u00c9l\u00e9vations de jambes suspendues",
"dumbbell-rows": "Tirages halt\u00e8res",
"shoulder-press": "D\u00e9velopp\u00e9 \u00e9paules",
"bicep-curls": "Curls biceps",
"tricep-extensions": "Extensions triceps",
"lateral-raises": "\u00c9l\u00e9vations lat\u00e9rales",
"front-raises": "\u00c9l\u00e9vations frontales",
"wide-push-ups": "Pompes larges",
"decline-push-ups": "Pompes d\u00e9clin\u00e9es",
"explosive-push-ups": "Pompes explosives",
"arnold-press": "Arnold Press",
"upright-rows": "Tirages verticaux",
"face-pulls": "Face Pulls",
"handstand-hold": "Appui tendu renvers\u00e9",
"chest-press": "D\u00e9velopp\u00e9 couch\u00e9",
"bent-over-rows": "Tirages pench\u00e9s",
"chest-flyes": "\u00c9cart\u00e9s pectoraux",
"pull-ups": "Tractions",
"tricep-dips-chair": "Dips triceps (chaise)",
"clean-and-jerk": "Clean & Jerk",
"turkish-get-up": "Relev\u00e9 turc",
"overhead-press": "D\u00e9velopp\u00e9 militaire",
"hammer-curls": "Curls marteau",
"overhead-tricep": "Triceps au-dessus de la t\u00eate",
"reverse-flyes": "\u00c9cart\u00e9s invers\u00e9s",
"concentration-curls": "Curls concentration",
"skull-crushers": "Skull Crushers",
"zottman-curls": "Curls Zottman",
"dips": "Dips",
"barbell-press": "D\u00e9velopp\u00e9 barre",
"dumbbell-snatch": "Arrach\u00e9 halt\u00e8re",
"plyo-push-ups": "Pompes pliom\u00e9triques",
"calf-raises": "Mollets debout",
"jump-squats": "Squats saut\u00e9s",
"walking-lunges": "Fentes march\u00e9es",
"step-ups": "Step-ups",
"donkey-kicks": "Donkey Kicks",
"fire-hydrants": "Fire Hydrants",
"clamshells": "Clamshells",
"pistol-squats": "Pistol Squats",
"broad-jumps": "Sauts en longueur",
"goblet-squats": "Goblet Squats",
"sumo-squats": "Squats sumo",
"pulse-squats": "Squats pulses",
"front-squats": "Squats avant",
"romanian-deadlifts": "Soulevé de terre roumain",
"split-squats": "Squats bulgares",
"power-cleans": "Power Cleans",
"standing-kickbacks": "Kickbacks debout",
"side-leg-raises": "\u00c9l\u00e9vations lat\u00e9rales de jambes",
"high-knees-sprint": "Sprint mont\u00e9es de genoux",
"lateral-shuffles": "Pas chass\u00e9s",
"butt-kick-sprint": "Sprint talons-fesses",
"banded-squats": "Squats avec \u00e9lastique",
"hip-thrusts": "Hip Thrusts",
"lateral-band-walks": "Marche lat\u00e9rale \u00e9lastique",
"step-back-lunges": "Fentes arri\u00e8re",
"back-squats": "Squats arri\u00e8re",
"leg-press-jumps": "Sauts presse \u00e0 jambes",
"box-jump-overs": "Box Jump Overs",
"grapevine": "Pas crois\u00e9s",
"step-touch": "Step Touch",
"cha-cha-slide": "Cha-Cha Slide",
"jump-rope": "Corde \u00e0 sauter",
"step-touches": "Step Touches",
"boxing-punches": "Coups de poing boxe",
"side-steps": "Pas lat\u00e9raux",
"burpee-tuck-jumps": "Burpees sauts group\u00e9s",
"sprint-in-place": "Sprint sur place",
"plyo-lunges": "Fentes pliom\u00e9triques",
"sun-salutation": "Salutation au soleil",
"light-jog": "Jogging l\u00e9ger",
"arm-swings": "Balancements de bras",
"gentle-twists": "Rotations douces",
"double-unders": "Double Unders",
"box-jump-burpees": "Box Jump Burpees",
"sprint-intervals": "Intervalles de sprint",
"forward-fold": "Flexion avant",
"pigeon-pose": "Posture du pigeon",
"spinal-twist": "Torsion vertébrale",
"butterfly-stretch": "\u00c9tirement papillon"
},
"equipment": {
"no-equipment-required": "Aucun \u00e9quipement requis",
"yoga-mat-optional": "Tapis de yoga optionnel",
"yoga-mat": "Tapis de yoga",
"dumbbells-optional": "Halt\u00e8res optionnels",
"dumbbells": "Halt\u00e8res",
"kettlebell-recommended": "Kettlebell recommand\u00e9",
"kettlebell": "Kettlebell",
"resistance-band-optional": "\u00c9lastique optionnel",
"resistance-band": "\u00c9lastique de r\u00e9sistance",
"medicine-ball": "M\u00e9decine-ball",
"light-dumbbells": "Halt\u00e8res l\u00e9gers",
"pull-up-bar": "Barre de traction",
"full-gym-setup": "\u00c9quipement complet de salle",
"box-or-step": "Box ou step",
"chair-for-balance": "Chaise pour l'\u00e9quilibre",
"jump-rope-optional": "Corde \u00e0 sauter optionnelle",
"jump-rope": "Corde \u00e0 sauter",
"stability-ball": "Ballon de stabilit\u00e9",
"barbell": "Barre d'halt\u00e8res",
"dumbbell-optional": "Halt\u00e8re optionnel"
},
"collections": {
"morning-energizer": {
"title": "\u00c9nergie Matinale",
"description": "Bien d\u00e9marrer la journ\u00e9e"
},
"no-equipment": {
"title": "Sans \u00c9quipement",
"description": "Entra\u00eenez-vous partout"
},
"7-day-burn": {
"title": "D\u00e9fi Br\u00fblure 7 Jours",
"description": "Transformez-vous en une semaine"
},
"quick-intense": {
"title": "Rapide & Intense",
"description": "Effort max en 4 minutes"
},
"core-focus": {
"title": "Focus Abdos",
"description": "Construisez une base solide"
},
"leg-day": {
"title": "Jour des Jambes",
"description": "Ne sautez jamais le jour des jambes"
}
},
"programs": {
"beginner-journey": {
"title": "Parcours D\u00e9butant",
"description": "Vos premiers pas dans le fitness Tabata"
},
"strength-builder": {
"title": "Construction de Force",
"description": "D\u00e9veloppement progressif de la force"
},
"fat-burn-protocol": {
"title": "Protocole Br\u00fble-Graisses",
"description": "Programme de br\u00fblure maximale de calories"
}
},
"achievements": {
"first-burn": {
"title": "Premi\u00e8re Flamme",
"description": "Terminez votre premier entra\u00eenement"
},
"week-warrior": {
"title": "Guerrier de la Semaine",
"description": "S\u00e9rie de 7 jours"
},
"century-club": {
"title": "Club des 100",
"description": "Br\u00fblez 100 calories au total"
},
"iron-will": {
"title": "Volont\u00e9 de Fer",
"description": "Terminez 10 entra\u00eenements"
},
"tabata-master": {
"title": "Ma\u00eetre Tabata",
"description": "Terminez 50 entra\u00eenements"
},
"marathon-burner": {
"title": "Marathonien du Br\u00fblage",
"description": "Exercez-vous pendant 100 minutes au total"
},
"unstoppable": {
"title": "Inarr\u00eatable",
"description": "S\u00e9rie de 30 jours"
},
"calorie-crusher": {
"title": "Broyeur de Calories",
"description": "Br\u00fblez 1000 calories au total"
}
}
}

View File

@@ -0,0 +1,6 @@
{
"dailyReminder": {
"title": "C'est l'heure de votre Tabata !",
"body": "4 minutes pour transformer votre journ\u00e9e."
}
}

View File

@@ -53,6 +53,8 @@
"memberSince": "Membre depuis {{date}}",
"sectionWorkout": "ENTRA\u00ceNEMENT",
"sectionNotifications": "NOTIFICATIONS",
"sectionSubscription": "ABONNEMENT",
"restorePurchases": "Restaurer les achats",
"hapticFeedback": "Retour haptique",
"soundEffects": "Effets sonores",
"voiceCoaching": "Coaching vocal",
@@ -189,6 +191,7 @@
"savePercent": "\u00c9conomisez 42%",
"trialCta": "ESSAI GRATUIT (7 jours)",
"guarantees": "Annulation \u00e0 tout moment \u00B7 Garantie satisfait ou rembours\u00e9 30 jours",
"restorePurchases": "Restaurer les achats",
"skipButton": "Continuer sans abonnement"
}
}

23
src/shared/i18n/types.ts Normal file
View File

@@ -0,0 +1,23 @@
/**
* TabataFit i18n Type Augmentation
* Provides typed t() keys via module augmentation
*/
import 'react-i18next'
import type enCommon from './locales/en/common.json'
import type enScreens from './locales/en/screens.json'
import type enContent from './locales/en/content.json'
import type enNotifications from './locales/en/notifications.json'
declare module 'react-i18next' {
interface CustomTypeOptions {
defaultNS: 'common'
resources: {
common: typeof enCommon
screens: typeof enScreens
content: typeof enContent
notifications: typeof enNotifications
}
}
}