feat: i18n full support, responsive UI, multi-model AI config, and bug fixes

Major Features:
- Internationalization (i18n) with auto-detection for ES/EN/PT
- Mobile-first responsive design for Studio and Experience
- Multi-model AI configuration (llama3.2:3b, qwen3.5:9b, gpt-oss:latest)
- Course language configuration (auto-detect or fixed per course)

Backend Changes:
- shared/common: ModelType enum for intelligent model selection
- LMS: log_ai_usage function migration (fix chat tutor 500 error)
- LMS/CMS: course language config fields (language_setting, fixed_language)
- LMS: /courses/{id}/language-config endpoint for language detection

Frontend Changes:
- Experience: Enhanced i18n with browser language detection
- Experience: Audio recording with HTTPS check and error handling
- Studio: Memory game with unique pair IDs and debug logging
- Studio: Expanded translations (250+ keys for ES, EN, PT)
- Both: Language selector in headers (mobile responsive)

Documentation:
- AI_MODELS_CONFIG.md: Multi-model configuration guide
- RESPONSIVIDAD_GUIA.md: Mobile-first design patterns
- I18N_RESPONSIVIDAD_IMPLEMENTACION.md: Implementation details
- DEBUG_AUDIO_RECORDING.md: Audio troubleshooting guide
- DEBUG_MEMORY_GAME.md: Memory game debugging steps

Bug Fixes:
- Fix chat tutor 500 error (missing log_ai_usage function)
- Fix audio recording (HTTPS check, browser compatibility)
- Fix memory game pair IDs (unique ID generation)
- Fix HotspotBlock TypeScript errors

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
This commit is contained in:
2026-03-23 12:24:22 -03:00
parent 0598fc4865
commit 2ff06ee7ae
26 changed files with 2993 additions and 124 deletions
+204 -5
View File
@@ -5,14 +5,31 @@
"next": "Next",
"finish": "Finish",
"error": "Error",
"retry": "Retry"
"retry": "Retry",
"save": "Save",
"cancel": "Cancel",
"delete": "Delete",
"edit": "Edit",
"close": "Close",
"confirm": "Confirm",
"success": "Success",
"warning": "Warning",
"info": "Info",
"search": "Search",
"noResults": "No results",
"viewAll": "View all",
"learnMore": "Learn more"
},
"nav": {
"catalog": "Catalog",
"myLearning": "My Learning",
"bookmarks": "Bookmarks",
"profile": "Profile",
"signOut": "Sign Out"
"signOut": "Sign Out",
"selectLanguage": "Select Language",
"menu": "Menu",
"notifications": "Notifications",
"settings": "Settings"
},
"course": {
"modules": "Modules",
@@ -20,12 +37,194 @@
"progress": "Progress",
"calendar": "Timeline",
"start": "Start",
"continue": "Continue"
"continue": "Continue",
"enroll": "Enroll",
"enrolled": "Enrolled",
"price": "Price",
"free": "Free",
"duration": "Duration",
"level": "Level",
"description": "Description",
"objectives": "Objectives",
"requirements": "Requirements",
"instructor": "Instructor",
"certificate": "Certificate",
"aboutCourse": "About Course",
"content": "Content",
"reviews": "Reviews",
"faq": "FAQ"
},
"lesson": {
"summary": "AI Summary",
"transcription": "Transcription",
"complete": "Mark as Completed",
"nextLesson": "Next Lesson"
"nextLesson": "Next Lesson",
"previousLesson": "Previous Lesson",
"locked": "Locked",
"lockedMessage": "Complete previous lessons to unlock",
"markComplete": "Mark as Completed",
"inProgress": "In Progress",
"completed": "Completed",
"notStarted": "Not Started",
"dueDate": "Due Date",
"timeRemaining": "Time Remaining",
"overdue": "Overdue"
},
"auth": {
"login": "Login",
"register": "Register",
"email": "Email",
"password": "Password",
"fullName": "Full Name",
"forgotPassword": "Forgot Password?",
"resetPassword": "Reset Password",
"noAccount": "Don't have an account?",
"hasAccount": "Already have an account?",
"signIn": "Sign In",
"signUp": "Sign Up",
"orContinueWith": "Or continue with",
"google": "Google",
"microsoft": "Microsoft",
"sso": "Single Sign-On"
},
"dashboard": {
"welcome": "Welcome",
"continueLearning": "Continue Learning",
"recommendedCourses": "Recommended Courses",
"recentActivity": "Recent Activity",
"myProgress": "My Progress",
"certificates": "Certificates",
"badges": "Badges",
"stats": {
"coursesCompleted": "Courses Completed",
"hoursLearned": "Hours Learned",
"averageGrade": "Average Grade",
"currentStreak": "Current Streak"
}
},
"profile": {
"myProfile": "My Profile",
"editProfile": "Edit Profile",
"avatar": "Avatar",
"bio": "Bio",
"language": "Language",
"timezone": "Timezone",
"notifications": "Notifications",
"privacy": "Privacy",
"account": "Account",
"changePassword": "Change Password",
"deleteAccount": "Delete Account",
"portfolio": "Portfolio",
"achievements": "Achievements",
"publicProfile": "Public Profile"
},
"gamification": {
"level": "Level",
"xp": "Experience Points",
"leaderboard": "Leaderboard",
"rank": "Rank",
"points": "Points",
"badge": "Badge",
"badges": "Badges",
"earned": "Earned",
"locked": "Locked",
"nextLevel": "Next Level",
"xpToNextLevel": "XP to next level"
},
"grading": {
"grade": "Grade",
"grades": "Grades",
"score": "Score",
"percentage": "Percentage",
"passingGrade": "Passing Grade",
"failed": "Failed",
"passed": "Passed",
"excellent": "Excellent",
"good": "Good",
"regular": "Regular",
"poor": "Poor",
"feedback": "Feedback",
"submissionDate": "Submission Date",
"gradedDate": "Graded Date"
},
"quiz": {
"startQuiz": "Start Quiz",
"submitAnswers": "Submit Answers",
"questionNumber": "Question",
"of": "of",
"correctAnswer": "Correct Answer",
"yourAnswer": "Your Answer",
"explanation": "Explanation",
"tryAgain": "Try Again",
"attempts": "Attempts",
"attemptsRemaining": "attempts remaining",
"timeLimit": "Time Limit",
"timeExpired": "Time Expired"
},
"forum": {
"discussions": "Discussions",
"newThread": "New Discussion",
"title": "Title",
"content": "Content",
"post": "Post",
"reply": "Reply",
"replies": "Replies",
"views": "Views",
"lastActivity": "Last Activity",
"subscribe": "Subscribe",
"unsubscribe": "Unsubscribe",
"markAsSolved": "Mark as Solved",
"upvote": "Upvote",
"downvote": "Downvote"
},
"payments": {
"purchase": "Purchase",
"buyNow": "Buy Now",
"paymentMethod": "Payment Method",
"cardNumber": "Card Number",
"expiryDate": "Expiry Date",
"cvv": "CVV",
"cardholderName": "Cardholder Name",
"paymentSuccess": "Payment Success",
"paymentFailed": "Payment Failed",
"refund": "Refund",
"invoice": "Invoice",
"receipt": "Receipt"
},
"accessibility": {
"skipToContent": "Skip to content",
"increaseContrast": "Increase Contrast",
"decreaseContrast": "Decrease Contrast",
"largerText": "Larger Text",
"smallerText": "Smaller Text",
"screenReader": "Screen Reader"
},
"language": {
"selectLanguage": "Select Language",
"auto": "Automatic",
"spanish": "Spanish",
"english": "English",
"portuguese": "Portuguese",
"courseLanguage": "Course Language",
"interfaceLanguage": "Interface Language"
},
"errors": {
"notFound": "Not found",
"unauthorized": "Unauthorized",
"serverError": "Server error",
"networkError": "Network error",
"sessionExpired": "Session expired",
"invalidCredentials": "Invalid credentials",
"emailInUse": "Email already in use",
"weakPassword": "Weak password"
},
"dates": {
"today": "Today",
"yesterday": "Yesterday",
"tomorrow": "Tomorrow",
"daysAgo": "{{days}} days ago",
"weeksAgo": "{{weeks}} weeks ago",
"monthsAgo": "{{months}} months ago",
"yearsAgo": "{{years}} years ago"
}
}
}
+204 -5
View File
@@ -5,14 +5,31 @@
"next": "Siguiente",
"finish": "Finalizar",
"error": "Error",
"retry": "Reintentar"
"retry": "Reintentar",
"save": "Guardar",
"cancel": "Cancelar",
"delete": "Eliminar",
"edit": "Editar",
"close": "Cerrar",
"confirm": "Confirmar",
"success": "Éxito",
"warning": "Advertencia",
"info": "Información",
"search": "Buscar",
"noResults": "Sin resultados",
"viewAll": "Ver todo",
"learnMore": "Más información"
},
"nav": {
"catalog": "Catálogo",
"myLearning": "Mi Aprendizaje",
"bookmarks": "Marcadores",
"profile": "Perfil",
"signOut": "Cerrar Sesión"
"signOut": "Cerrar Sesión",
"selectLanguage": "Seleccionar Idioma",
"menu": "Menú",
"notifications": "Notificaciones",
"settings": "Configuración"
},
"course": {
"modules": "Módulos",
@@ -20,12 +37,194 @@
"progress": "Progreso",
"calendar": "Cronología",
"start": "Comenzar",
"continue": "Continuar"
"continue": "Continuar",
"enroll": "Inscribirse",
"enrolled": "Inscrito",
"price": "Precio",
"free": "Gratis",
"duration": "Duración",
"level": "Nivel",
"description": "Descripción",
"objectives": "Objetivos",
"requirements": "Requisitos",
"instructor": "Instructor",
"certificate": "Certificado",
"aboutCourse": "Acerca del Curso",
"content": "Contenido",
"reviews": "Reseñas",
"faq": "Preguntas Frecuentes"
},
"lesson": {
"summary": "Resumen AI",
"transcription": "Transcripción",
"complete": "Marcar como Completado",
"nextLesson": "Siguiente Lección"
"nextLesson": "Siguiente Lección",
"previousLesson": "Lección Anterior",
"locked": "Bloqueado",
"lockedMessage": "Completa las lecciones anteriores para desbloquear",
"markComplete": "Marcar como Completada",
"inProgress": "En Progreso",
"completed": "Completada",
"notStarted": "No Iniciada",
"dueDate": "Fecha Límite",
"timeRemaining": "Tiempo Restante",
"overdue": "Vencido"
},
"auth": {
"login": "Iniciar Sesión",
"register": "Registrarse",
"email": "Correo Electrónico",
"password": "Contraseña",
"fullName": "Nombre Completo",
"forgotPassword": "¿Olvidaste tu contraseña?",
"resetPassword": "Restablecer Contraseña",
"noAccount": "¿No tienes cuenta?",
"hasAccount": "¿Ya tienes cuenta?",
"signIn": "Ingresar",
"signUp": "Crear Cuenta",
"orContinueWith": "O continúa con",
"google": "Google",
"microsoft": "Microsoft",
"sso": "Inicio de Sesión Único"
},
"dashboard": {
"welcome": "Bienvenido",
"continueLearning": "Continuar Aprendiendo",
"recommendedCourses": "Cursos Recomendados",
"recentActivity": "Actividad Reciente",
"myProgress": "Mi Progreso",
"certificates": "Certificados",
"badges": "Insignias",
"stats": {
"coursesCompleted": "Cursos Completados",
"hoursLearned": "Horas Aprendidas",
"averageGrade": "Nota Promedio",
"currentStreak": "Racha Actual"
}
},
"profile": {
"myProfile": "Mi Perfil",
"editProfile": "Editar Perfil",
"avatar": "Avatar",
"bio": "Biografía",
"language": "Idioma",
"timezone": "Zona Horaria",
"notifications": "Notificaciones",
"privacy": "Privacidad",
"account": "Cuenta",
"changePassword": "Cambiar Contraseña",
"deleteAccount": "Eliminar Cuenta",
"portfolio": "Portafolio",
"achievements": "Logros",
"publicProfile": "Perfil Público"
},
"gamification": {
"level": "Nivel",
"xp": "Puntos de Experiencia",
"leaderboard": "Tabla de Clasificación",
"rank": "Rango",
"points": "Puntos",
"badge": "Insignia",
"badges": "Insignias",
"earned": "Obtenida",
"locked": "Bloqueada",
"nextLevel": "Siguiente Nivel",
"xpToNextLevel": "XP para el siguiente nivel"
},
"grading": {
"grade": "Nota",
"grades": "Notas",
"score": "Puntaje",
"percentage": "Porcentaje",
"passingGrade": "Nota de Aprobación",
"failed": "Reprobado",
"passed": "Aprobado",
"excellent": "Excelente",
"good": "Bueno",
"regular": "Regular",
"poor": "Deficiente",
"feedback": "Retroalimentación",
"submissionDate": "Fecha de Entrega",
"gradedDate": "Fecha de Calificación"
},
"quiz": {
"startQuiz": "Comenzar Cuestionario",
"submitAnswers": "Enviar Respuestas",
"questionNumber": "Pregunta",
"of": "de",
"correctAnswer": "Respuesta Correcta",
"yourAnswer": "Tu Respuesta",
"explanation": "Explicación",
"tryAgain": "Intentar de Nuevo",
"attempts": "Intentos",
"attemptsRemaining": "intentos restantes",
"timeLimit": "Límite de Tiempo",
"timeExpired": "Tiempo Expirado"
},
"forum": {
"discussions": "Discusiones",
"newThread": "Nueva Discusión",
"title": "Título",
"content": "Contenido",
"post": "Publicar",
"reply": "Responder",
"replies": "Respuestas",
"views": "Vistas",
"lastActivity": "Última Actividad",
"subscribe": "Suscribirse",
"unsubscribe": "Desuscribirse",
"markAsSolved": "Marcar como Resuelto",
"upvote": "Votar a Favor",
"downvote": "Votar en Contra"
},
"payments": {
"purchase": "Comprar",
"buyNow": "Comprar Ahora",
"paymentMethod": "Método de Pago",
"cardNumber": "Número de Tarjeta",
"expiryDate": "Fecha de Vencimiento",
"cvv": "CVV",
"cardholderName": "Nombre del Titular",
"paymentSuccess": "Pago Exitoso",
"paymentFailed": "Pago Fallido",
"refund": "Reembolso",
"invoice": "Factura",
"receipt": "Recibo"
},
"accessibility": {
"skipToContent": "Saltar al contenido",
"increaseContrast": "Aumentar Contraste",
"decreaseContrast": "Disminuir Contraste",
"largerText": "Texto Más Grande",
"smallerText": "Texto Más Pequeño",
"screenReader": "Lector de Pantalla"
},
"language": {
"selectLanguage": "Seleccionar Idioma",
"auto": "Automático",
"spanish": "Español",
"english": "Inglés",
"portuguese": "Portugués",
"courseLanguage": "Idioma del Curso",
"interfaceLanguage": "Idioma de la Interfaz"
},
"errors": {
"notFound": "No encontrado",
"unauthorized": "No autorizado",
"serverError": "Error del servidor",
"networkError": "Error de red",
"sessionExpired": "Sesión expirada",
"invalidCredentials": "Credenciales inválidas",
"emailInUse": "Correo ya en uso",
"weakPassword": "Contraseña débil"
},
"dates": {
"today": "Hoy",
"yesterday": "Ayer",
"tomorrow": "Mañana",
"daysAgo": "hace {{days}} días",
"weeksAgo": "hace {{weeks}} semanas",
"monthsAgo": "hace {{months}} meses",
"yearsAgo": "hace {{years}} años"
}
}
}
+208 -9
View File
@@ -3,29 +3,228 @@
"loading": "Carregando...",
"back": "Voltar",
"next": "Próximo",
"finish": "Finalizar",
"finish": "Concluir",
"error": "Erro",
"retry": "Repetir"
"retry": "Tentar Novamente",
"save": "Salvar",
"cancel": "Cancelar",
"delete": "Excluir",
"edit": "Editar",
"close": "Fechar",
"confirm": "Confirmar",
"success": "Sucesso",
"warning": "Aviso",
"info": "Informação",
"search": "Buscar",
"noResults": "Sem resultados",
"viewAll": "Ver tudo",
"learnMore": "Saiba mais"
},
"nav": {
"catalog": "Catálogo",
"myLearning": "Meu Aprendizado",
"bookmarks": "Favoritos",
"profile": "Perfil",
"signOut": "Sair"
"signOut": "Sair",
"selectLanguage": "Selecionar Idioma",
"menu": "Menu",
"notifications": "Notificações",
"settings": "Configurações"
},
"course": {
"modules": "Módulos",
"lessons": "Lições",
"lessons": "Aulas",
"progress": "Progresso",
"calendar": "Cronologia",
"calendar": "Cronograma",
"start": "Começar",
"continue": "Continuar"
"continue": "Continuar",
"enroll": "Inscrever-se",
"enrolled": "Inscrito",
"price": "Preço",
"free": "Gratuito",
"duration": "Duração",
"level": "Nível",
"description": "Descrição",
"objectives": "Objetivos",
"requirements": "Requisitos",
"instructor": "Instrutor",
"certificate": "Certificado",
"aboutCourse": "Sobre o Curso",
"content": "Conteúdo",
"reviews": "Avaliações",
"faq": "Perguntas Frequentes"
},
"lesson": {
"summary": "Resumo IA",
"transcription": "Transcrição",
"complete": "Marcar como Concluído",
"nextLesson": "Próxima Lição"
"complete": "Marcar como Concluída",
"nextLesson": "Próxima Aula",
"previousLesson": "Aula Anterior",
"locked": "Bloqueada",
"lockedMessage": "Complete as aulas anteriores para desbloquear",
"markComplete": "Marcar como Concluída",
"inProgress": "Em Progresso",
"completed": "Concluída",
"notStarted": "Não Iniciada",
"dueDate": "Data Limite",
"timeRemaining": "Tempo Restante",
"overdue": "Atrasada"
},
"auth": {
"login": "Entrar",
"register": "Cadastrar",
"email": "E-mail",
"password": "Senha",
"fullName": "Nome Completo",
"forgotPassword": "Esqueceu a senha?",
"resetPassword": "Redefinir Senha",
"noAccount": "Não tem uma conta?",
"hasAccount": "Já tem uma conta?",
"signIn": "Entrar",
"signUp": "Criar Conta",
"orContinueWith": "Ou continue com",
"google": "Google",
"microsoft": "Microsoft",
"sso": "Login Único"
},
"dashboard": {
"welcome": "Bem-vindo",
"continueLearning": "Continuar Aprendendo",
"recommendedCourses": "Cursos Recomendados",
"recentActivity": "Atividade Recente",
"myProgress": "Meu Progresso",
"certificates": "Certificados",
"badges": "Distintivos",
"stats": {
"coursesCompleted": "Cursos Concluídos",
"hoursLearned": "Horas Aprendidas",
"averageGrade": "Nota Média",
"currentStreak": "Sequência Atual"
}
},
"profile": {
"myProfile": "Meu Perfil",
"editProfile": "Editar Perfil",
"avatar": "Avatar",
"bio": "Biografia",
"language": "Idioma",
"timezone": "Fuso Horário",
"notifications": "Notificações",
"privacy": "Privacidade",
"account": "Conta",
"changePassword": "Alterar Senha",
"deleteAccount": "Excluir Conta",
"portfolio": "Portfólio",
"achievements": "Conquistas",
"publicProfile": "Perfil Público"
},
"gamification": {
"level": "Nível",
"xp": "Pontos de Experiência",
"leaderboard": "Classificação",
"rank": "Posição",
"points": "Pontos",
"badge": "Distintivo",
"badges": "Distintivos",
"earned": "Conquistado",
"locked": "Bloqueado",
"nextLevel": "Próximo Nível",
"xpToNextLevel": "XP para o próximo nível"
},
"grading": {
"grade": "Nota",
"grades": "Notas",
"score": "Pontuação",
"percentage": "Porcentagem",
"passingGrade": "Nota Mínima",
"failed": "Reprovado",
"passed": "Aprovado",
"excellent": "Excelente",
"good": "Bom",
"regular": "Regular",
"poor": "Insuficiente",
"feedback": "Feedback",
"submissionDate": "Data de Entrega",
"gradedDate": "Data de Avaliação"
},
"quiz": {
"startQuiz": "Iniciar Questionário",
"submitAnswers": "Enviar Respostas",
"questionNumber": "Pergunta",
"of": "de",
"correctAnswer": "Resposta Correta",
"yourAnswer": "Sua Resposta",
"explanation": "Explicação",
"tryAgain": "Tentar Novamente",
"attempts": "Tentativas",
"attemptsRemaining": "tentativas restantes",
"timeLimit": "Limite de Tempo",
"timeExpired": "Tempo Esgotado"
},
"forum": {
"discussions": "Discussões",
"newThread": "Nova Discussão",
"title": "Título",
"content": "Conteúdo",
"post": "Publicar",
"reply": "Responder",
"replies": "Respostas",
"views": "Visualizações",
"lastActivity": "Última Atividade",
"subscribe": "Inscrever-se",
"unsubscribe": "Cancelar Inscrição",
"markAsSolved": "Marcar como Resolvido",
"upvote": "Votar a Favor",
"downvote": "Votar Contra"
},
"payments": {
"purchase": "Comprar",
"buyNow": "Comprar Agora",
"paymentMethod": "Método de Pagamento",
"cardNumber": "Número do Cartão",
"expiryDate": "Data de Validade",
"cvv": "CVV",
"cardholderName": "Nome do Titular",
"paymentSuccess": "Pagamento Bem-Sucedido",
"paymentFailed": "Pagamento Falhou",
"refund": "Reembolso",
"invoice": "Fatura",
"receipt": "Recibo"
},
"accessibility": {
"skipToContent": "Pular para o conteúdo",
"increaseContrast": "Aumentar Contraste",
"decreaseContrast": "Diminuir Contraste",
"largerText": "Texto Maior",
"smallerText": "Texto Menor",
"screenReader": "Leitor de Tela"
},
"language": {
"selectLanguage": "Selecionar Idioma",
"auto": "Automático",
"spanish": "Espanhol",
"english": "Inglês",
"portuguese": "Português",
"courseLanguage": "Idioma do Curso",
"interfaceLanguage": "Idioma da Interface"
},
"errors": {
"notFound": "Não encontrado",
"unauthorized": "Não autorizado",
"serverError": "Erro do servidor",
"networkError": "Erro de rede",
"sessionExpired": "Sessão expirada",
"invalidCredentials": "Credenciais inválidas",
"emailInUse": "E-mail já em uso",
"weakPassword": "Senha fraca"
},
"dates": {
"today": "Hoje",
"yesterday": "Ontem",
"tomorrow": "Amanhã",
"daysAgo": "há {{days}} dias",
"weeksAgo": "há {{weeks}} semanas",
"monthsAgo": "há {{months}} meses",
"yearsAgo": "há {{years}} anos"
}
}
}