// delafolla — i18n // Two-language string table. Components call t(key, lang). const I18N = { // nav + topbar nav_projects: { es: "Proyectos", en: "Projects" }, nav_about: { es: "Sobre mí", en: "About" }, topbar_role: { es: "DIRECTOR DE ARTE SENIOR · PORFOLIO 2026", en: "SENIOR ART DIRECTOR · PORTFOLIO 2026" }, // filter filter_label: { es: "Filtrar ↘", en: "Filter ↘" }, filter_all: { es: "Todos", en: "All" }, filter_count_one:{ es: "proyecto", en: "project" }, filter_count_many:{es: "proyectos", en: "projects" }, // categories cat_art: { es: "DIRECCIÓN DE ARTE", en: "ART DIRECTION" }, cat_motion: { es: "MOTION DESIGN", en: "MOTION DESIGN" }, cat_ai: { es: "IA GENERATIVA", en: "GENERATIVE AI" }, // index columns col_n: { es: "Nº", en: "Nº" }, col_project: { es: "Proyecto", en: "Project" }, col_client: { es: "Cliente", en: "Client" }, col_year: { es: "Año", en: "Year" }, col_category: { es: "Categoría", en: "Category" }, // detail detail_close: { es: "Cerrar", en: "Close" }, detail_client: { es: "Cliente", en: "Client" }, detail_year: { es: "Año", en: "Year" }, detail_role: { es: "Rol", en: "Role" }, detail_location: { es: "Ubicación", en: "Location" }, detail_award: { es: "Premio", en: "Award" }, detail_prev: { es: "← Anterior", en: "← Previous" }, detail_next: { es: "Siguiente →", en: "Next →" }, // about about_h: { es: "Sobre mí", en: "About me" }, bio1: { es: "Tras seis años liderando proyectos audiovisuales que van desde el motion design a la edición de vídeo, a día de hoy mi enfoque está orientado hacia la IA generativa, materia de la que soy profesor en la Escuela Coco.", en: "After six years leading audiovisual projects ranging from motion design to video editing, my focus today is on generative AI — a subject I teach at Coco School." }, bio2: { es: "", en: "" }, about_available: { es: "Disponible para", en: "Available for" }, about_clients: { es: "Clientes seleccionados", en: "Selected clients" }, about_contact: { es: "Contacto", en: "Contact" }, ava1: { es: "Puestos senior in-house", en: "Senior in-house roles" }, ava2: { es: "Dirección creativa fraccional", en: "Fractional creative direction" }, ava3: { es: "Colaboraciones puntuales", en: "Short-form collaborations" }, linkedin_label: { es: "LinkedIn — Fernando López del Hierro", en: "LinkedIn — Fernando López del Hierro" }, // loader loader_text: { es: "cargando índice…", en: "loading index…" }, // controls ctrl_lang: { es: "Idioma", en: "Language" }, ctrl_theme: { es: "Paleta", en: "Palette" }, ctrl_theme_cream:{ es: "Crema", en: "Cream" }, ctrl_theme_dark: { es: "Oscuro", en: "Dark" }, ctrl_theme_paper:{ es: "Papel", en: "Paper" }, // project-specific summaries (key by project id) sum_love_button: { es: "Campaña viral gráfica de Toyota con los mejores resultados para la marca en España con un coste 0.", en: "Toyota viral print campaign with outstanding results at zero cost." }, sum_olfleck_plan: { es: "Campaña local para IESE en Munich. Una serie de imágenes generadas con IA para dar a conocer la escuela de IESE en la ciudad de Munich. Print, digital y dos piezas en vídeo.", en: "Local IESE campaign for Munich. A series of AI-generated images reinterpreting the oil stain (Ölfleck) as a gesture of industrial leadership. Print, digital and two video pieces." }, sum_dia_del_padre: { es: "Pieza gráfica para la campaña anual del Día del Padre de Toyota. Dirección de arte, tratamiento fotográfico y adaptaciones a redes y prensa.", en: "Print piece for Toyota's annual Father's Day campaign. Art direction, photo treatment and adaptations for social and press." }, sum_rumbo_zero: { es: "Case Study sobre el podcast de Toyota junto a Mario Picazo. Dirección de arte, diseño y motion design en 3D y 2D.", en: "Case study about Toyota's roadmap to zero emissions. Visual system, live data animations and a three-minute video piece." }, sum_masters_iese: { es: "Campaña global digital y print para los Masters de IESE. Uso de Ia generativa para crear esculturas de bronce ad hoc con los copies de la campaña.", en: "Global campaign for the IESE Masters. AI-generated portraits of the typical student, editorial system and a full adaptations kit for 14 markets." }, sum_charms: { es: "Campaña paraguas para Foster's Hollywood: un spot de redes para el concepto, pósters de familia y producto generados con IA, una acción de guerrilla dirigida a quienes van al gym por las mañanas y una colaboración orgánica con Noah de Diego.", en: "Umbrella campaign for Foster's Hollywood: a social spot for the concept, AI-generated posters of the family and product, a guerrilla action aimed at the morning gym crowd, and an organic collaboration with Noah de Diego." }, sum_batalla_sabor: { es: "Campaña 360 para el lanzamiento de nuevas hamburguesas de Foster's Hollywood. Dirección de arte, key visuals y todo el kit de adaptaciones a redes.", en: "360 campaign for the seasonal menu launch. Art direction, key visuals and the full point-of-sale, social and OOH adaptations kit." }, sum_diccionario_moderno:{ es: "En un mercado saturado de marcas de hamburguesas dirigidas principalmente a un público joven, Foster's Hollywood quería promocionar su oferta de una forma que no dejase indiferente a los gen Z. \n¿Cómo un restaurante que se enorgullece de gustar a todos los públicos puede hablar a los jóvenes de una forma verdaderamente auténtica?", en: "In a market saturated with burger brands aimed at young audiences, Foster's Hollywood wanted to promote its offer in a way that would not leave Gen Z indifferent. \nHow can a restaurant that prides itself on appealing to all audiences speak to young people in a truly authentic way?" }, sum_revolucion_lujo: { es: "Posicionamiento visual y pieza de lanzamiento para Yodeyma. Sistema de motion, diseño 3D y Key Visuals para canales de medios pagados y propios.", en: "Visual positioning and launch piece for Yodeyma. Motion system, video manifesto and key visuals for paid and owned channels." }, // role labels per project role_love_button: { es: "Dirección de Arte · Campaña Gráfica", en: "Art Direction · Print Campaign" }, role_olfleck_plan: { es: "Dirección de Arte · IA Generativa · Campaña en Munich", en: "Art Direction · Generative AI · Munich Campaign" }, role_dia_del_padre: { es: "Dirección de Arte · Campaña Gráfica", en: "Art Direction · Print Campaign" }, role_rumbo_zero: { es: "Dirección de Arte · Motion Design · Case Study", en: "Art Direction · Motion Design · Case Study" }, role_masters_iese: { es: "Dirección de Arte · IA Generativa · Campaña Global", en: "Art Direction · Generative AI · Global Campaign" }, role_charms: { es: "Dirección de Arte · IA Generativa · Digital Campaign", en: "Art Direction · Generative AI · Digital Campaign" }, role_batalla_sabor: { es: "Dirección de Arte · Campaña", en: "Art Direction · Campaign" }, role_diccionario_moderno:{ es: "Dirección de Arte · Motion Design", en: "Art Direction · Motion Design" }, role_revolucion_lujo: { es: "Dirección de Arte · Motion Design", en: "Art Direction · Motion Design" }, // location labels loc_madrid: { es: "Madrid", en: "Madrid" }, loc_munich: { es: "Munich", en: "Munich" }, loc_global: { es: "Global", en: "Global" }, }; // Map project ids → summary key + role key (avoids stale data churn) const PROJECT_I18N = { "love-button": { summary: "sum_love_button", role: "role_love_button", loc: "loc_madrid" }, "olfleck-plan": { summary: "sum_olfleck_plan", role: "role_olfleck_plan", loc: "loc_munich" }, "dia-del-padre": { summary: "sum_dia_del_padre", role: "role_dia_del_padre", loc: "loc_madrid" }, "rumbo-zero": { summary: "sum_rumbo_zero", role: "role_rumbo_zero", loc: "loc_madrid" }, "masters-iese": { summary: "sum_masters_iese", role: "role_masters_iese", loc: "loc_global" }, "charms": { summary: "sum_charms", role: "role_charms", loc: "loc_madrid" }, "batalla-sabor": { summary: "sum_batalla_sabor", role: "role_batalla_sabor", loc: "loc_madrid" }, "diccionario-moderno":{ summary: "sum_diccionario_moderno",role: "role_diccionario_moderno",loc: "loc_madrid" }, "revolucion-lujo": { summary: "sum_revolucion_lujo", role: "role_revolucion_lujo", loc: "loc_madrid" }, }; // Category key → translation key (stored category strings stay ES so existing filtering still works) const CAT_I18N = { "DIRECCIÓN DE ARTE": "cat_art", "MOTION DESIGN": "cat_motion", "IA GENERATIVA": "cat_ai", }; // Translator. Falls back to the key itself when missing — surfaces gaps loudly. function t(key, lang) { const entry = I18N[key]; if (!entry) return key; return entry[lang] || entry.es || key; } window.I18N = I18N; window.t = t; window.PROJECT_I18N = PROJECT_I18N; window.CAT_I18N = CAT_I18N;