refactor: Extract all hardcoded content to JSON files
- Move all bilingual text from templates to UI JSON (labels, buttons, modals) - Move skills summary paragraph to CV JSON with HTML support - Add new UI sections: navigation, viewControls, sections, footer, portfolio, pdfModal, shortcutsModal, infoModal, widgets - Update Go structs to match expanded JSON structure - Add template.HTML type for CV.SkillsSummary field - Add JSON content validation test (70-json-content-validation.test.mjs) Templates now contain only structural logic (CSS classes, HTML attributes) while all user-visible text loads from JSON files for proper i18n support.
This commit is contained in:
+18
-1
@@ -2,6 +2,12 @@
|
||||
"personal": {
|
||||
"name": "Juan Andrés Moreno Rubio",
|
||||
"title": "Lead Technical Consultant, FullStack Developer",
|
||||
"titleBadges": [
|
||||
"Technical Consultant",
|
||||
"Full-Stack Engineer",
|
||||
"Authentication Specialist",
|
||||
"Solution Architect"
|
||||
],
|
||||
"location": "Arrecife, Las Palmas de Gran Canaria, Spain",
|
||||
"email": "txeo.msx@gmail.com",
|
||||
"phone": "+34 676875420",
|
||||
@@ -12,9 +18,20 @@
|
||||
"github": "https://github.com/juanatsap",
|
||||
"domestika": "https://www.domestika.org/es/txeo/portfolio",
|
||||
"website": "https://juan.andres.morenorub.io",
|
||||
"photo": "/static/images/profile.jpg"
|
||||
"photo": "/static/images/profile.jpg",
|
||||
"firstName": "Juan Andrés",
|
||||
"lastName": "Moreno Rubio",
|
||||
"username": "txeo"
|
||||
},
|
||||
"seo": {
|
||||
"pageTitle": "Curriculum Vitae",
|
||||
"metaTitle": "Professional CV",
|
||||
"metaDescription": "18 years of experience in web development, SAP CDC, React, Node.js, Go, HTMX and AI-assisted development",
|
||||
"ogDescription": "Senior Technical Consultant with 18 years of experience",
|
||||
"keywords": "CV, Resume, FullStack Developer, SAP CDC, React, Node.js, Go, HTMX, AI, Web Development, Technical Consultant"
|
||||
},
|
||||
"summary": "Full-stack developer specialized in high-availability systems. I've worked on Olympic Games platforms, airport authentication systems with millions of users, and built around 20 websites for diverse sectors (e-commerce, enterprise, institutional). Certified SAP Customer Data Cloud consultant, advising 35-40 international clients on digital identity solutions.",
|
||||
"skillsSummary": "<strong>Full-stack</strong> developer with experience in <strong>Go</strong>, <strong>Node.js</strong>, <strong>React</strong>, and <strong>HTMX</strong> for <strong>modern applications</strong>, plus Java and PHP knowledge for legacy projects. I've worked on <strong>around 20 websites</strong> and provided <strong>consulting for 35-40 international clients</strong>, from e-commerce and enterprise platforms to <strong>authentication systems</strong> managing <strong>millions of users</strong>. Familiar with <strong>AI-assisted development</strong> workflows and infrastructure management (<strong>Linux</strong>, <strong>Docker</strong>, <strong>CI/CD</strong>). I adapt well to both independent work and collaborative teams across different countries.",
|
||||
"experience": [
|
||||
{
|
||||
"position": "Senior SAP Technical Consultant",
|
||||
|
||||
+18
-1
@@ -2,6 +2,12 @@
|
||||
"personal": {
|
||||
"name": "Juan Andrés Moreno Rubio",
|
||||
"title": "Consultor Técnico Senior, Desarrollador FullStack",
|
||||
"titleBadges": [
|
||||
"Consultor Técnico",
|
||||
"Ingeniero Full-Stack",
|
||||
"Especialista en Autenticación",
|
||||
"Arquitecto de Soluciones"
|
||||
],
|
||||
"location": "Arrecife, Las Palmas de Gran Canaria, España",
|
||||
"email": "txeo.msx@gmail.com",
|
||||
"phone": "+34 676875420",
|
||||
@@ -12,9 +18,20 @@
|
||||
"github": "https://github.com/juanatsap",
|
||||
"domestika": "https://www.domestika.org/es/txeo/portfolio",
|
||||
"website": "https://juan.andres.morenorub.io",
|
||||
"photo": "/static/images/profile.jpg"
|
||||
"photo": "/static/images/profile.jpg",
|
||||
"firstName": "Juan Andrés",
|
||||
"lastName": "Moreno Rubio",
|
||||
"username": "txeo"
|
||||
},
|
||||
"seo": {
|
||||
"pageTitle": "Curriculum Vitae",
|
||||
"metaTitle": "CV Profesional",
|
||||
"metaDescription": "18 años de experiencia en desarrollo web, SAP CDC, React, Node.js, Go, HTMX y desarrollo asistido por IA",
|
||||
"ogDescription": "Consultor Técnico Senior con 18 años de experiencia",
|
||||
"keywords": "CV, Curriculum Vitae, Desarrollador FullStack, SAP CDC, React, Node.js, Go, HTMX, IA, Desarrollo Web, Consultor Técnico"
|
||||
},
|
||||
"summary": "Desarrollador full-stack especializado en sistemas de alta disponibilidad. He participado en plataformas de Juegos Olímpicos, sistemas de autenticación aeroportuaria con millones de usuarios, y desarrollado unos 20 sitios web para diversos sectores (e-commerce, empresariales, institucionales). Consultor certificado de SAP Customer Data Cloud, asesorando a 35-40 clientes internacionales en soluciones de identidad digital.",
|
||||
"skillsSummary": "Desarrollador <strong>full-stack</strong> con experiencia en <strong>Go</strong>, <strong>Node.js</strong>, <strong>React</strong> y <strong>HTMX</strong> para <strong>aplicaciones modernas</strong>, además de conocimientos en Java y PHP para proyectos legacy. He trabajado en <strong>unos 20 sitios web</strong> y realizado <strong>consultoría para 35-40 clientes internacionales</strong>, desde e-commerce y plataformas empresariales hasta <strong>sistemas de autenticación</strong> que gestionan <strong>millones de usuarios</strong>. Familiarizado con flujos de trabajo asistidos por <strong>IA</strong> y gestión de infraestructura (<strong>Linux</strong>, <strong>Docker</strong>, <strong>CI/CD</strong>). Me adapto bien tanto al trabajo independiente como colaborativo en equipos internacionales.",
|
||||
"experience": [
|
||||
{
|
||||
"position": "Consultor Técnico Senior SAP",
|
||||
|
||||
+123
-10
@@ -1,19 +1,78 @@
|
||||
{
|
||||
"infoModal": {
|
||||
"title": "About this CV",
|
||||
"description": "This interactive CV was built by myself with <strong>Go + HTMX</strong>, showcasing modern hypermedia architecture without heavy JavaScript frameworks.",
|
||||
"techStack": {
|
||||
"goHono": "Go + Hono",
|
||||
"htmx": "HTMX",
|
||||
"html5": "Semantic HTML5",
|
||||
"css3": "Pure CSS3"
|
||||
"navigation": {
|
||||
"cvSections": "CV Sections",
|
||||
"training": "Training",
|
||||
"skills": "Skills",
|
||||
"experience": "Experience",
|
||||
"awards": "Awards",
|
||||
"projects": "Personal / Freelance Projects",
|
||||
"courses": "Courses",
|
||||
"languages": "Languages",
|
||||
"references": "References",
|
||||
"other": "Other",
|
||||
"quickActions": "Quick Actions",
|
||||
"collapseAll": "Collapse All",
|
||||
"expandAll": "Expand All",
|
||||
"zoom": "Zoom",
|
||||
"viewControls": "View Controls",
|
||||
"actions": "Actions"
|
||||
},
|
||||
"viewControls": {
|
||||
"length": "Length",
|
||||
"icons": "Icons",
|
||||
"view": "View"
|
||||
},
|
||||
"sections": {
|
||||
"technicalSkills": "Technical Skills",
|
||||
"moreSkills": "More Skills",
|
||||
"yearsOfExperience": "years of experience",
|
||||
"drivingLicense": "Driving License type",
|
||||
"obtainedFrom": "obtained from the",
|
||||
"currentBadge": "CURRENT",
|
||||
"expiredBadge": "EXPIRED",
|
||||
"present": "now",
|
||||
"technologies": "Technologies:",
|
||||
"maintainedBy": "MAINTAINED BY"
|
||||
},
|
||||
"footer": {
|
||||
"viewOnGithub": "View this project on GitHub",
|
||||
"lastUpdated": "Last updated"
|
||||
},
|
||||
"portfolio": {
|
||||
"seeAllProjects": "See all projects on my",
|
||||
"domestikaPortfolio": "Domestika portfolio"
|
||||
},
|
||||
"pdfModal": {
|
||||
"title": "Download PDF",
|
||||
"subtitle": "Choose your preferred format",
|
||||
"preparingPdf": "Preparing PDF...",
|
||||
"pleaseWait": "Please wait while we generate your CV",
|
||||
"close": "Close",
|
||||
"downloadButton": "Download PDF",
|
||||
"shortCv": {
|
||||
"title": "Short CV (4 pages)",
|
||||
"pages": "4 Pages",
|
||||
"description": "Essential info",
|
||||
"ariaLabel": "Short CV - 4 pages, essential information"
|
||||
},
|
||||
"viewSource": "View Project in Github",
|
||||
"viewSourceSubtext": "Want to know how it's built?"
|
||||
"defaultCv": {
|
||||
"title": "Default CV (5 pages)",
|
||||
"pages": "5 Pages",
|
||||
"description": "Short with skills - Recommended",
|
||||
"ariaLabel": "Default CV - 5 pages with skills (Recommended)"
|
||||
},
|
||||
"extendedCv": {
|
||||
"title": "Extended CV (9 pages)",
|
||||
"pages": "9 Pages",
|
||||
"description": "All details",
|
||||
"ariaLabel": "Extended CV - 9 pages, full version"
|
||||
}
|
||||
},
|
||||
"shortcutsModal": {
|
||||
"title": "Keyboard Shortcuts",
|
||||
"subtitle": "Learn the Shortcuts",
|
||||
"description": "Use these keyboard shortcuts to navigate and control the CV more efficiently.",
|
||||
"close": "Close",
|
||||
"sections": {
|
||||
"zoom": {
|
||||
"title": "Zoom Control",
|
||||
@@ -87,5 +146,59 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"infoModal": {
|
||||
"title": "About this CV",
|
||||
"description": "This interactive CV was built by myself with <strong>Go + HTMX</strong>, showcasing modern hypermedia architecture without heavy JavaScript frameworks.",
|
||||
"techStack": {
|
||||
"goHono": "Go + Hono",
|
||||
"htmx": "HTMX",
|
||||
"html5": "Semantic HTML5",
|
||||
"css3": "Pure CSS3"
|
||||
},
|
||||
"viewSource": "View Project in Github",
|
||||
"viewSourceSubtext": "Want to know how it's built?"
|
||||
},
|
||||
"widgets": {
|
||||
"backToTop": {
|
||||
"ariaLabel": "Back to top",
|
||||
"tooltip": "Back to top"
|
||||
},
|
||||
"info": {
|
||||
"ariaLabel": "Information",
|
||||
"tooltip": "Information"
|
||||
},
|
||||
"download": {
|
||||
"ariaLabel": "Download as PDF",
|
||||
"tooltip": "Download as PDF"
|
||||
},
|
||||
"print": {
|
||||
"ariaLabel": "Print Friendly",
|
||||
"tooltip": "Print Friendly"
|
||||
},
|
||||
"shortcuts": {
|
||||
"ariaLabel": "Keyboard shortcuts",
|
||||
"tooltip": "Keyboard shortcuts (?)"
|
||||
},
|
||||
"zoomToggle": {
|
||||
"ariaLabel": "Toggle zoom control",
|
||||
"tooltip": "Zoom control"
|
||||
},
|
||||
"zoomControl": {
|
||||
"groupLabel": "Zoom control",
|
||||
"closeLabel": "Close zoom control",
|
||||
"closeTitle": "Close",
|
||||
"sliderLabel": "Adjust CV zoom level",
|
||||
"resetLabel": "Reset zoom to 100%",
|
||||
"resetTitle": "Reset"
|
||||
},
|
||||
"pdfToast": {
|
||||
"title": "Preparing PDF",
|
||||
"closeLabel": "Close notification"
|
||||
},
|
||||
"actionButtons": {
|
||||
"downloadPdf": "Download as PDF",
|
||||
"printFriendly": "Print Friendly"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+123
-10
@@ -1,19 +1,78 @@
|
||||
{
|
||||
"infoModal": {
|
||||
"title": "Acerca de este CV",
|
||||
"description": "Este CV interactivo fue construido por mí mismo con <strong>Go + HTMX</strong>, demostrando arquitectura moderna de hipermedia sin frameworks pesados de JavaScript.",
|
||||
"techStack": {
|
||||
"goHono": "Go + Hono",
|
||||
"htmx": "HTMX",
|
||||
"html5": "HTML5 Semántico",
|
||||
"css3": "CSS3 Puro"
|
||||
"navigation": {
|
||||
"cvSections": "Secciones CV",
|
||||
"training": "Formación",
|
||||
"skills": "Competencias",
|
||||
"experience": "Experiencia",
|
||||
"awards": "Premios y Reconocimientos",
|
||||
"projects": "Proyectos Personales / Freelance",
|
||||
"courses": "Cursos Realizados",
|
||||
"languages": "Idiomas",
|
||||
"references": "Referencias",
|
||||
"other": "Otros",
|
||||
"quickActions": "Acciones Rápidas",
|
||||
"collapseAll": "Colapsar Todo",
|
||||
"expandAll": "Expandir Todo",
|
||||
"zoom": "Zoom",
|
||||
"viewControls": "Controles de Vista",
|
||||
"actions": "Acciones"
|
||||
},
|
||||
"viewControls": {
|
||||
"length": "Longitud",
|
||||
"icons": "Iconos",
|
||||
"view": "Vista"
|
||||
},
|
||||
"sections": {
|
||||
"technicalSkills": "Competencias Técnicas",
|
||||
"moreSkills": "Más Competencias",
|
||||
"yearsOfExperience": "años de experiencia",
|
||||
"drivingLicense": "Carnet de conducir tipo",
|
||||
"obtainedFrom": "obtenido de",
|
||||
"currentBadge": "ACTUAL",
|
||||
"expiredBadge": "EXPIRADO",
|
||||
"present": "presente",
|
||||
"technologies": "Tecnologías:",
|
||||
"maintainedBy": "MANTENIDO POR"
|
||||
},
|
||||
"footer": {
|
||||
"viewOnGithub": "Ver este proyecto en GitHub",
|
||||
"lastUpdated": "Última actualización"
|
||||
},
|
||||
"portfolio": {
|
||||
"seeAllProjects": "Ver todos los proyectos en mi",
|
||||
"domestikaPortfolio": "portfolio de Domestika"
|
||||
},
|
||||
"pdfModal": {
|
||||
"title": "Descargar PDF",
|
||||
"subtitle": "Elige tu formato preferido",
|
||||
"preparingPdf": "Preparando PDF...",
|
||||
"pleaseWait": "Por favor espera mientras generamos tu CV",
|
||||
"close": "Cerrar",
|
||||
"downloadButton": "Descargar PDF",
|
||||
"shortCv": {
|
||||
"title": "CV Corto (4 páginas)",
|
||||
"pages": "4 Páginas",
|
||||
"description": "Información esencial",
|
||||
"ariaLabel": "CV Corto - 4 páginas, información esencial"
|
||||
},
|
||||
"viewSource": "Ver proyecto en Github",
|
||||
"viewSourceSubtext": "¿Quieres saber cómo está hecho?"
|
||||
"defaultCv": {
|
||||
"title": "CV Por Defecto (5 páginas)",
|
||||
"pages": "5 Páginas",
|
||||
"description": "Corto con habilidades - Recomendado",
|
||||
"ariaLabel": "CV Por Defecto - 5 páginas con habilidades (Recomendado)"
|
||||
},
|
||||
"extendedCv": {
|
||||
"title": "CV Extendido (9 páginas)",
|
||||
"pages": "9 Páginas",
|
||||
"description": "Todos los detalles",
|
||||
"ariaLabel": "CV Extendido - 9 páginas, versión completa"
|
||||
}
|
||||
},
|
||||
"shortcutsModal": {
|
||||
"title": "Atajos de Teclado",
|
||||
"subtitle": "Aprende los Atajos",
|
||||
"description": "Usa estos atajos de teclado para navegar y controlar el CV de forma más eficiente.",
|
||||
"close": "Cerrar",
|
||||
"sections": {
|
||||
"zoom": {
|
||||
"title": "Control de Zoom",
|
||||
@@ -87,5 +146,59 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"infoModal": {
|
||||
"title": "Acerca de este CV",
|
||||
"description": "Este CV interactivo fue construido por mí mismo con <strong>Go + HTMX</strong>, demostrando arquitectura moderna de hipermedia sin frameworks pesados de JavaScript.",
|
||||
"techStack": {
|
||||
"goHono": "Go + Hono",
|
||||
"htmx": "HTMX",
|
||||
"html5": "HTML5 Semántico",
|
||||
"css3": "CSS3 Puro"
|
||||
},
|
||||
"viewSource": "Ver proyecto en Github",
|
||||
"viewSourceSubtext": "¿Quieres saber cómo está hecho?"
|
||||
},
|
||||
"widgets": {
|
||||
"backToTop": {
|
||||
"ariaLabel": "Volver arriba",
|
||||
"tooltip": "Volver arriba"
|
||||
},
|
||||
"info": {
|
||||
"ariaLabel": "Información",
|
||||
"tooltip": "Información"
|
||||
},
|
||||
"download": {
|
||||
"ariaLabel": "Descargar PDF",
|
||||
"tooltip": "Descargar PDF"
|
||||
},
|
||||
"print": {
|
||||
"ariaLabel": "Imprimir CV",
|
||||
"tooltip": "Imprimir CV"
|
||||
},
|
||||
"shortcuts": {
|
||||
"ariaLabel": "Atajos de teclado",
|
||||
"tooltip": "Atajos de teclado (?)"
|
||||
},
|
||||
"zoomToggle": {
|
||||
"ariaLabel": "Alternar control de zoom",
|
||||
"tooltip": "Control de zoom"
|
||||
},
|
||||
"zoomControl": {
|
||||
"groupLabel": "Control de zoom",
|
||||
"closeLabel": "Cerrar control de zoom",
|
||||
"closeTitle": "Cerrar",
|
||||
"sliderLabel": "Ajustar nivel de zoom del CV",
|
||||
"resetLabel": "Restablecer zoom al 100%",
|
||||
"resetTitle": "Restablecer"
|
||||
},
|
||||
"pdfToast": {
|
||||
"title": "Preparando PDF",
|
||||
"closeLabel": "Cerrar notificación"
|
||||
},
|
||||
"actionButtons": {
|
||||
"downloadPdf": "Descargar como PDF",
|
||||
"printFriendly": "Imprimir amigable"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user