From 9bc1a1c0d3a837d6f682307994b88419d0880485 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 6 Feb 2026 18:37:40 +0000 Subject: [PATCH 1/5] refactor: implement i18n in core components (phase 1) Refactored key components to use react-i18next translations: - ErrorBoundary: error messages and labels - ProgressStepper: step labels - DimensionCard: health status labels, descriptions, benchmark text, action buttons - DashboardTabs: back button, footer, default title Added translation keys to es.json and en.json: - dashboard.defaultTitle - All health status and benchmark keys already existed Build verified successfully. Remaining 31 components to be refactored in subsequent commits. https://claude.ai/code/session_4f888c33-8937-4db8-8a9d-ddc9ac51a725 --- frontend/components/DashboardTabs.tsx | 16 +++++---- frontend/components/DimensionCard.tsx | 43 +++++++++++++------------ frontend/components/ErrorBoundary.tsx | 22 +++++++------ frontend/components/ProgressStepper.tsx | 15 +++++---- frontend/locales/en.json | 1 + frontend/locales/es.json | 1 + 6 files changed, 57 insertions(+), 41 deletions(-) diff --git a/frontend/components/DashboardTabs.tsx b/frontend/components/DashboardTabs.tsx index 941726e..12a963f 100644 --- a/frontend/components/DashboardTabs.tsx +++ b/frontend/components/DashboardTabs.tsx @@ -1,6 +1,7 @@ import { useState } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { ArrowLeft } from 'lucide-react'; +import { useTranslation } from 'react-i18next'; import { DashboardHeader, TabId } from './DashboardHeader'; import { formatDateMonthYear } from '../utils/formatters'; import { ExecutiveSummaryTab } from './tabs/ExecutiveSummaryTab'; @@ -19,12 +20,15 @@ interface DashboardTabsProps { export function DashboardTabs({ data, - title = 'CLIENTE DEMO - Beyond CX Analytics', + title, onBack }: DashboardTabsProps) { + const { t } = useTranslation(); const [activeTab, setActiveTab] = useState('executive'); const [metodologiaOpen, setMetodologiaOpen] = useState(false); + const displayTitle = title || t('dashboard.defaultTitle'); + const renderTabContent = () => { switch (activeTab) { case 'executive': @@ -53,8 +57,8 @@ export function DashboardTabs({ className="flex items-center gap-2 text-sm text-slate-600 hover:text-slate-800 transition-colors" > - Volver al formulario - Volver + {t('dashboard.backToForm')} + {t('dashboard.back')} @@ -62,7 +66,7 @@ export function DashboardTabs({ {/* Sticky Header with Tabs */} setMetodologiaOpen(true)} @@ -87,8 +91,8 @@ export function DashboardTabs({