# Implementación de Internacionalización (i18n) y Responsividad ## Resumen de la Implementación **Fecha**: 20 de Marzo, 2026 **Estado**: ✅ Completado --- ## 🌍 Internacionalización (i18n) ### Características Implementadas 1. **Detección Automática de Idioma** - Detección del idioma del navegador al primer ingreso - Soporte para múltiples idiomas del navegador (`navigator.languages`) - Fallback a español si el idioma no está soportado 2. **Idiomas Soportados** - 🇪🇸 Español (es) - 🇬🇧 Inglés (en) - 🇵🇹 Portugués (pt) 3. **Selector Manual de Idioma** - Disponible en AppHeader (Experience) y Navbar (Studio) - Persistencia en localStorage - Cambio instantáneo sin recargar la página 4. **Configuración de Idioma por Curso** - **Modo Automático**: Detecta el idioma del usuario - **Modo Fijo**: Usa siempre el idioma configurado en el curso - Ideal para cursos de idiomas (ej: curso de inglés siempre en inglés) --- ## 📱 Responsividad (Mobile-First) ### Breakpoints Utilizados ``` Mobile: < 640px (default) sm: ≥ 640px md: ≥ 768px lg: ≥ 1024px xl: ≥ 1280px 2xl: ≥ 1536px ``` ### Componentes Responsivos #### AppHeader (Experience) **Mobile (< 768px):** - Logo compacto - Íconos de notificación y tema - Botón de menú hamburguesa - Sidebar deslizante con navegación completa **Desktop (≥ 768px):** - Logo completo - Navegación horizontal visible - Selector de idioma visible - Perfil de usuario visible #### Navbar (Studio) **Mobile (< 768px):** - Logo compacto - Dropdowns colapsados - Menú hamburguesa - Sidebar deslizante **Desktop (≥ 768px):** - Logo completo - Dropdowns visibles - Información de usuario visible --- ## 🗂️ Archivos de Traducción ### Experience (web/experience/src/lib/locales/) **Archivos:** - `es.json` - Español (completo) - `en.json` - Inglés (completo) - `pt.json` - Portugués (completo) **Categorías:** - `common` - Textos comunes (loading, error, save, cancel) - `nav` - Navegación (catalog, profile, signOut) - `course` - Cursos (modules, lessons, progress) - `lesson` - Lecciones (summary, transcription, complete) - `auth` - Autenticación (login, register, password) - `dashboard` - Dashboard (welcome, stats) - `profile` - Perfil (edit, avatar, settings) - `gamification` - Gamificación (level, xp, badges) - `grading` - Calificaciones (grade, score, feedback) - `quiz` - Cuestionarios (start, submit, attempts) - `forum` - Foros (discussions, threads, replies) - `payments` - Pagos (purchase, payment method) - `accessibility` - Accesibilidad (contrast, text size) - `language` - Idiomas (select, course, interface) - `errors` - Errores (notFound, unauthorized) - `dates` - Fechas (today, yesterday, daysAgo) ### Studio (web/studio/src/lib/locales/) **Archivos:** - `es.json` - Español (completo - administración) - `en.json` - Inglés (básico - pendiente completar) - `pt.json` - Portugués (básico - pendiente completar) **Categorías Adicionales:** - `course` - Gestión de cursos (create, edit, modules, lessons) - `content` - Tipos de contenido (video, audio, quiz, code) - `ai` - Funciones de IA (generate, model, tokens) - `grading` - Sistema de calificación (categories, weights) - `students` - Estudiantes (enrollments, progress) - `analytics` - Analíticas (overview, retention) - `settings` - Configuración (branding, integrations) - `user` - Usuario (profile, preferences) - `validation` - Validación de formularios --- ## 🗄️ Base de Datos ### Migración: Course Language Configuration **Archivo:** `services/cms-service/migrations/20260320000002_add_course_language_config.sql` **Campos Agregados a `courses`:** ```sql language_setting VARCHAR(20) DEFAULT 'auto' - 'auto': Detectar idioma del usuario - 'fixed': Usar idioma fijo fixed_language VARCHAR(5) DEFAULT NULL - 'es': Español - 'en': Inglés - 'pt': Portugués - NULL: Cuando language_setting es 'auto' ``` **Constraints:** ```sql chk_language_setting: language_setting IN ('auto', 'fixed') chk_fixed_language: fixed_language IS NULL OR fixed_language IN ('es', 'en', 'pt') ``` **Índice:** ```sql idx_courses_language: (language_setting, fixed_language) ``` --- ## 🔌 Backend API ### LMS Service (Port 3002) **Endpoint: Course Language Config** ```http GET /courses/{id}/language-config Authorization: Bearer {token} ``` **Respuesta:** ```json { "language_setting": "auto", "fixed_language": null } ``` **Ejemplos de Uso:** ```javascript // Curso en modo automático (usa idioma del usuario) { "language_setting": "auto", "fixed_language": null } // Curso de inglés (siempre en inglés) { "language_setting": "fixed", "fixed_language": "en" } // Curso de español (siempre en español) { "language_setting": "fixed", "fixed_language": "es" } ``` --- ## ⚙️ Contextos y Hooks ### I18nContext (Experience y Studio) **Funciones:** ```typescript interface I18nContextType { language: string; setLanguage: (lang: string) => void; t: (path: string) => string; detectBrowserLanguage: () => string; } ``` **Uso:** ```typescript import { useTranslation } from '@/context/I18nContext'; function MyComponent() { const { language, setLanguage, t } = useTranslation(); return (
Idioma del curso: {courseLanguage}
{isFixedLanguage() && (Este curso usa idioma fijo
)}