diff --git a/frontend/src/app/locale.tsx b/frontend/src/app/locale.tsx index 86907c7..0f1d62d 100644 --- a/frontend/src/app/locale.tsx +++ b/frontend/src/app/locale.tsx @@ -1,57 +1,81 @@ -import { stringLocalization, elementLocalization } from "@/app/localization" +import { localization } from "@/app/localization" import { ReactElement } from 'react' const defaultLanguage: string = "es" +const elementTypeName: string = "element" +const stringTypeName: string = "string" interface LocalizedString { [key: string]: string } -export interface StringLocalization { - [key: string]: LocalizedString -} interface LocalizedElement { [key: string]: ReactElement } -export interface ElementLocalization { - [key: string]: LocalizedElement +interface LocalizedObjectPair { + string?: LocalizedString, + element?: LocalizedElement +} +export interface Localization { + [key: string]: LocalizedObjectPair +} +interface StringOrElement { + string?: string, + element?: ReactElement } -export const getLocalizedString = (identifier: string, language: string = defaultLanguage): string => { - // NOTE: MUST KEEP IN SYNC WITH getLocalizedElement - // ANY CHANGE MADE HERE MUST BE MADE THERE FOR CONSISTENCY - - // Return empty string if identifier not found - if (!(identifier in stringLocalization)) { - console.error(`Localized string identifier "${identifier}" not found`) - return "" +const getLocalizedStringOrElement = (type: string, identifier: string, language: string): StringOrElement => { + // Return empty if identifier not found + if (!(identifier in localization)) { + console.error(`Localization identifier "${identifier}" not found`) + return {} } - const localizedString = stringLocalization[identifier] + const localizedObjectPair = localization[identifier] - // Return localized if found, else default language if found, else empty - if (language in localizedString) return localizedString[language] - console.warn(`Localized string "${identifier}" in language "${language}" not found, using default language "${defaultLanguage}"`) - if (defaultLanguage in localizedString) return localizedString[defaultLanguage] - console.error(`Localized string "${identifier}" in default language "${defaultLanguage}" not found`) - return "" -} + // Return empty if type not found + if (!(type in localizedObjectPair)) { + console.error(`Localized ${type} "${identifier}" not found`) + return {} + } -export const getLocalizedElement = (identifier: string, language: string = defaultLanguage): ReactElement => { - // NOTE: MUST KEEP IN SYNC WITH getLocalizedString - // ANY CHANGE MADE HERE MUST BE MADE THERE FOR CONSISTENCY + const localizedObject = ( + type == stringTypeName ? + localizedObjectPair.string : + localizedObjectPair.element + ) ?? {} // line ƒor TS to stop whining, previous block ensures either exists - // Return empty element if identifier not found - if (!(identifier in elementLocalization)) { - console.error(`Localized element identifier "${identifier}" not found`) - return <>> + if (!(language in localizedObject)) { + // Use default language if language not found + console.warn(`Localized ${type} "${identifier}" in language "${language}" not found, fetching default language "${defaultLanguage}"`) + language = defaultLanguage + } + if (!(language in localizedObject)) { + // Return empty if default language not found + console.error(`Localized ${type} "${identifier}" in default language "${language}" not found`) + return {} } - const localizedString = elementLocalization[identifier] + // Return in interface with both types for type safety + return { + string: ( + type == stringTypeName ? + (localizedObjectPair.string ?? {})[language] : + "" + ), + element: ( + type == elementTypeName ? + (localizedObjectPair.element ?? {})[language] : + <>> + ) + } +} - // Return localized if found, else default language if found, else empty - if (language in localizedString) return localizedString[language] - console.warn(`Localized element "${identifier}" in language "${language}" not found, using default language "${defaultLanguage}"`) - if (defaultLanguage in localizedString) return localizedString[defaultLanguage] - console.error(`Localized element "${identifier}" in default language "${defaultLanguage}" not found`) - return <>> +export const getLocalizedString = (identifier: string, language: string = defaultLanguage): string => { + let object = getLocalizedStringOrElement(stringTypeName, identifier, language) + return object.string ?? "" +} + +export const getLocalizedElement = (identifier: string, language: string = defaultLanguage): ReactElement => { + let object = getLocalizedStringOrElement(elementTypeName, identifier, language) + return object.element ?? <>> } diff --git a/frontend/src/app/localization.tsx b/frontend/src/app/localization.tsx index 8af88f6..9df13d7 100644 --- a/frontend/src/app/localization.tsx +++ b/frontend/src/app/localization.tsx @@ -1,437 +1,561 @@ -import { StringLocalization, ElementLocalization } from '@/app/locale'; +import { Localization } from '@/app/locale'; -export const stringLocalization: StringLocalization = { - // example: { - // es: "ejemplo", - // en: "example" +export const localization: Localization = { + // example_string: { + // string: { + // es: "ejemplo", + // en: "example" + // } + // }, + // example_element: { + // element: { + // es: <>ejemplo>, + // en: <>example> + // } // } - - partners_github_wording: { - es: "Aprende sobre GitHub Copilot", - en: "Learn about GitHub Copilot" - }, - partners_emprendimiento_alt: { - es: "Emprendimiento TEC", - en: "Emprendimiento TEC (Entrepreneurship Institute)" - }, - partners_eic_alt: { - es: "Escuela de Ingeniería y Ciencias del Tecnológico de Monterrey", - en: "Tecnológico de Monterrey School of Engineering and Sciences" - }, - partners_gce_wording: { - es: "GitHub Student Developer Pack", - en: "GitHub Student Developer Pack" - }, - partners_blend_wording: { - es: "Explora las vacantes", - en: "Explore open positions" - }, - gallery_photo_alt: { - es: "Colección de fotografías de Guadalahacks 2024, personas programando y recibiendo premios", - en: "Guadalahacks 2024 pictures collage, people coding and receiving their awards" - }, - partnerLogo_defaultWording: { - es: "Enlace", - en: "Link" - } -} - -export const elementLocalization: ElementLocalization = { - // example: { - // es: <>ejemplo>, - // en: <>example> - // } - faq_title: { - es: <>FAQ>, - en: <>FAQ> + element: { + es: <>FAQ>, + en: <>FAQ> + } }, faq_q1: { - es: <>¿Qué es guadalahacks?>, - en: <>What is guadalahacks?> + element: + { + es: <>¿Qué es guadalahacks?>, + en: <>What is guadalahacks?> + } }, faq_q1_answer: { - es: <> - Únete a cientos de estudiantes de todo México para un fin de semana de construcción, aprendizaje y diversión. - Convive y conecta con la comunidad tech de México, desarrolla tu proyecto y pasa un fin de semana inolvidable. - Conoce Guadalajara y el Tecnológico de Monterrey, universidad líder en México y Latinoamérica. - >, - en: <> - Join hundreds of students from all around Mexico for a weekend of building, learning and fun. - Get to know the tech community in Mexico, develop your project and have an unforgettable weekend. - Visit Guadalajara and Tecnológico de Monterrey, leading university in Mexico and Latin America. - > + element: { + es: <> + Únete a cientos de estudiantes de todo México para un fin de semana de construcción, aprendizaje y diversión. + Convive y conecta con la comunidad tech de México, desarrolla tu proyecto y pasa un fin de semana inolvidable. + Conoce Guadalajara y el Tecnológico de Monterrey, universidad líder en México y Latinoamérica. + >, + en: <> + Join hundreds of students from all around Mexico for a weekend of building, learning and fun. + Get to know the tech community in Mexico, develop your project and have an unforgettable weekend. + Visit Guadalajara and Tecnológico de Monterrey, leading university in Mexico and Latin America. + > + } }, faq_q2: { - es: <>¿Quiénes son bienvenidxs?>, - en: <>Who can apply?> + element: { + es: <>¿Quiénes son bienvenidxs?>, + en: <>Who can apply?> + } }, faq_q2_answer: { - es: <> - Puedes formar parte del evento si eres estudiante o exatec, con menos de un año de haber egresado, - de cualquier campus del Tecnológico de Monterrey, no importa tu carrera ni nivel de experiencia o de estudios. - Somos un evento inclusivo y diverso, y fomentamos un espacio seguro para todxs. - >, - en: <> - You can join us if you're a student or alum who graduated less than one year ago - from any Tecnológico de Monterrey campus, regardless of your major, experience or previous studies. - We're an inclusive and diverse event, and we aim to foster a safe space for everyone. - > + element: { + es: <> + Puedes formar parte del evento si eres estudiante o exatec, con menos de un año de haber egresado, + de cualquier campus del Tecnológico de Monterrey, no importa tu carrera ni nivel de experiencia o de estudios. + Somos un evento inclusivo y diverso, y fomentamos un espacio seguro para todxs. + >, + en: <> + You can join us if you're a student or alum who graduated less than one year ago + from any Tecnológico de Monterrey campus, regardless of your major, experience or previous studies. + We're an inclusive and diverse event, and we aim to foster a safe space for everyone. + > + } }, faq_q3: { - es: <>¿Cuánto cuesta?>, - en: <>What are the fees to enter?> + element: { + es: <>¿Cuánto cuesta?>, + en: <>What are the fees to enter?> + } }, faq_q3_answer: { - es: <> - La participación no tiene costo alguno. - Habrá comida gratis durante todo el evento, así como premios para los mejores proyectos. - ¡No te lo puedes perder! - >, - en: <> - Participation is free of charge. - We will have free meals throughout the weekned, as well as prizes for the best projects. - You won't want to miss it! - > + element: { + es: <> + La participación no tiene costo alguno. + Habrá comida gratis durante todo el evento, así como premios para los mejores proyectos. + ¡No te lo puedes perder! + >, + en: <> + Participation is free of charge. + We will have free meals throughout the weekned, as well as prizes for the best projects. + You won't want to miss it! + > + } }, faq_q4: { - es: <>¿Qué necesito llevar?>, - en: <>What do I need to bring?> + element: { + es: <>¿Qué necesito llevar?>, + en: <>What do I need to bring?> + } }, faq_q4_answer: { - es: <>Trae tu computadora, cargador, cepillo de dientes, ropa cómoda y muchas ganas de aprender y divertirte.>, - en: <>Take your laptop, charger, toothbrush, comfortable clothes, and be ready to learn and have fun.> + element: { + es: <>Trae tu computadora, cargador, cepillo de dientes, ropa cómoda y muchas ganas de aprender y divertirte.>, + en: <>Take your laptop, charger, toothbrush, comfortable clothes, and be ready to learn and have fun.> + } }, faq_q5: { - es: <>¿Cuántas personas deben conformar un equipo?>, - en: <>How many people can join my team?> + element: { + es: <>¿Cuántas personas deben conformar un equipo?>, + en: <>How many people can join my team?> + } }, faq_q5_answer: { - es: <> - Los equipos deben estar conformados por un máximo de 4 personas. - Se recomiendan equipos de 2 a 4 integrantes, pero está permitido participar individualmente. - Todxs lxs integrantes deben registrarse individualmente. - Registrarán su equipo durante el evento. - >, - en: <> - Teams must be 4 people maximum. - We suggest 2 to 4 members, but anyone who wants to participate individually is allowed to. - All team members have to submit their application. - Team registration will happen during the event. - > + element: { + es: <> + Los equipos deben estar conformados por un máximo de 4 personas. + Se recomiendan equipos de 2 a 4 integrantes, pero está permitido participar individualmente. + Todxs lxs integrantes deben registrarse individualmente. + Registrarán su equipo durante el evento. + >, + en: <> + Teams must be 4 people maximum. + We suggest 2 to 4 members, but anyone who wants to participate individually is allowed to. + All team members have to submit their application. + Team registration will happen during the event. + > + } }, faq_q6: { - es: <>¿Qué clase de proyecto debería desarrollar?>, - en: <>What kind of projects am I expected to build?> + element: { + es: <>¿Qué clase de proyecto debería desarrollar?>, + en: <>What kind of projects am I expected to build?> + } }, faq_q6_answer: { - es: <> - Los retos serán liberados durante el evento. - No está permitido trabajar en proyectos que ya hayan sido desarrollados previamente. - >, - en: <> - Challenge tracks will be revealed during the event. - Working on previously developed projects is not allowed. - > + element: { + es: <> + Los retos serán liberados durante el evento. + No está permitido trabajar en proyectos que ya hayan sido desarrollados previamente. + >, + en: <> + Challenge tracks will be revealed during the event. + Working on previously developed projects is not allowed. + > + } }, faq_more: { - es: <>Más información próximamente.>, - en: <>More information available soon.> + element: { + es: <>Más información próximamente.>, + en: <>More information available soon.> + } }, landing_title: { - es: <>guadalahacks>, - en: <>guadalahacks> + element: { + es: <>guadalahacks>, + en: <>guadalahacks> + } }, landing_seeYouSoon: { - es: <>¡Nos vemos en 2025!>, - en: <>See you in 2025!> + element: { + es: <>¡Nos vemos en 2025!>, + en: <>See you in 2025!> + } }, landing_thankYou: { - es: <>Muchas gracias por acomapañarnos.>, - en: <>Thank you for coming.> + element: { + es: <>Muchas gracias por acomapañarnos.>, + en: <>Thank you for coming.> + } }, landing_teamsComingSoon: { - es: <>Pronto podrás conocer a los equipos detrás de los asombrosos proyectos.>, - en: <>Soon you'll be able to meet the teams behind these amazing projects.> + element: { + es: <>Pronto podrás conocer a los equipos detrás de los asombrosos proyectos.>, + en: <>Soon you'll be able to meet the teams behind these amazing projects.> + } }, landing_seeProjects: { - es: <>Conoce los proyectos>, - en: <>See all the projects> + element: { + es: <>Conoce los proyectos>, + en: <>See all the projects> + } }, partners_title: { - es: <>Partners>, - en: <>Partners> + element: { + es: <>Partners>, + en: <>Partners> + } + }, + partners_github_wording: { + string: { + es: "Aprende sobre GitHub Copilot", + en: "Learn about GitHub Copilot" + } + }, + partners_emprendimiento_alt: { + string: { + es: "Emprendimiento TEC", + en: "Emprendimiento TEC (Entrepreneurship Institute)" + } + }, + partners_eic_alt: { + string: { + es: "Escuela de Ingeniería y Ciencias del Tecnológico de Monterrey", + en: "Tecnológico de Monterrey School of Engineering and Sciences" + } + }, + partners_gce_wording: { + string: { + es: "GitHub Student Developer Pack", + en: "GitHub Student Developer Pack" + } + }, + partners_blend_wording: { + string: { + es: "Explora las vacantes", + en: "Explore open positions" + } }, schedule_title: { - es: <>Agenda>, - en: <>Schedule> + element: { + es: <>Agenda>, + en: <>Schedule> + } }, schedule_table_date: { - es: <>Fecha>, - en: <>Date> + element: { + es: <>Fecha>, + en: <>Date> + } }, schedule_table_date_0518: { - es: <>18 de mayo>, - en: <>May 18> + element: { + es: <>18 de mayo>, + en: <>May 18> + } }, schedule_table_date_0519: { - es: <>19 de mayo>, - en: <>May 19> + element: { + es: <>19 de mayo>, + en: <>May 19> + } }, schedule_table_time: { - es: <>Hora>, - en: <>Time> + element: { + es: <>Hora>, + en: <>Time> + } }, schedule_table_time_tbd: { - es: <>Por anunciar>, - en: <>To be anounced> + element: { + es: <>Por anunciar>, + en: <>To be anounced> + } }, schedule_table_event: { - es: <>Evento>, - en: <>Event> + element: { + es: <>Evento>, + en: <>Event> + } }, schedule_table_event_registration: { - es: <>Registro>, - en: <>Registration> + element: { + es: <>Registro>, + en: <>Registration> + } }, schedule_table_event_inauguration: { - es: <>Inauguración>, - en: <>Inauguration> + element: { + es: <>Inauguración>, + en: <>Inauguration> + } }, schedule_table_event_lunch: { - es: <>Comida>, - en: <>Lunch> + element: { + es: <>Comida>, + en: <>Lunch> + } }, schedule_table_event_dinner: { - es: <>Cena>, - en: <>Dinner> + element: { + es: <>Cena>, + en: <>Dinner> + } }, schedule_table_event_breakfast: { - es: <>Desayuno>, - en: <>Breakfast> + element: { + es: <>Desayuno>, + en: <>Breakfast> + } }, schedule_table_event_deadline: { - es: <>Cierre de envíos>, - en: <>Submissions close> + element: { + es: <>Cierre de envíos>, + en: <>Submissions close> + } }, schedule_table_event_closure: { - es: <>Cierre>, - en: <>Closing ceremony> + element: { + es: <>Cierre>, + en: <>Closing ceremony> + } }, schedule_table_location: { - es: <>Lugar>, - en: <>Location> + element: { + es: <>Lugar>, + en: <>Location> + } }, schedule_table_location_tecSalud: { - es: <>Auditorio TecSalud>, - en: <>Auditorio TecSalud> + element: { + es: <>Auditorio TecSalud>, + en: <>Auditorio TecSalud> + } }, schedule_table_location_negocios: { - es: <>Hábitat de Negocios>, - en: <>Hábitat de Negocios (Business Ecosystem Building)> + element: { + es: <>Hábitat de Negocios>, + en: <>Hábitat de Negocios (Business Ecosystem Building)> + } }, contact_title: { - es: <>Contáctanos>, - en: <>Contact Us> + element: { + es: <>Contáctanos>, + en: <>Contact Us> + } }, contact_contactUs: { - es: <>Escríbenos a hola@guadalahacks.com>, - en: <>Shoot us an email at hola@guadalahacks.com> + element: { + es: <>Escríbenos a hola@guadalahacks.com>, + en: <>Shoot us an email at hola@guadalahacks.com> + } }, contact_addressHeader: { - es: <>Dirección del evento>, - en: <>Venue Address> + element: { + es: <>Dirección del evento>, + en: <>Venue Address> + } }, footer_contactUs: { - es: <>Conecta>, - en: <>Reach out to us> + element: { + es: <>Conecta>, + en: <>Reach out to us> + } }, footer_contactUs_email: { - es: <>Correo electrónico>, - en: <>Email> + element: { + es: <>Correo electrónico>, + en: <>Email> + } }, footer_resources: { - es: <>Recursos>, - en: <>Resources> + element: { + es: <>Recursos>, + en: <>Resources> + } }, footer_resources_cc: { - es: <>Código de conducta>, - en: <>Code of conduct> + element: { + es: <>Código de conducta>, + en: <>Code of conduct> + } }, footer_resources_joinAsStaff: { - es: <>Forma parte del staff>, - en: <>Join our staff> + element: { + es: <>Forma parte del staff>, + en: <>Join our staff> + } }, footer_resources_joinAsMentor: { - es: <>Conviértete en mentor>, - en: <>Become a mentor> + element: { + es: <>Conviértete en mentor>, + en: <>Become a mentor> + } }, footer_resources_joinAsSponsor: { - es: <>Apóyanos como patrocinador>, - en: <>Support us as a sponsor> + element: { + es: <>Apóyanos como patrocinador>, + en: <>Support us as a sponsor> + } }, footer_footnote_madeWith: { - es: <>Creado con >, - en: <>Made with > + element: { + es: <>Creado con >, + en: <>Made with > + } }, footer_footnote_copyright: { - es: <>© 2024 guadalahacks. Todos los derechos reservados.>, - en: <>© 2024 guadalahacks. All rights reserved.> + element: { + es: <>© 2024 guadalahacks. Todos los derechos reservados.>, + en: <>© 2024 guadalahacks. All rights reserved.> + } }, navbar_title: { - es: <>guadalahacks>, - en: <>guadalahacks> + element: { + es: <>guadalahacks>, + en: <>guadalahacks> + } }, navbar_home: { - es: <>Inicio>, - en: <>Home> + element: { + es: <>Inicio>, + en: <>Home> + } }, navbar_contact: { - es: <>Contacto>, - en: <>Contact> + element: { + es: <>Contacto>, + en: <>Contact> + } }, navbar_partners: { - es: <>Partners>, - en: <>Partners> + element: { + es: <>Partners>, + en: <>Partners> + } }, navbar_faq: { - es: <>FAQ>, - en: <>FAQ> + element: { + es: <>FAQ>, + en: <>FAQ> + } }, cdc: { - es: <> -
- El objetivo de guadalahacks es fomentar la innovación y - la creación de soluciones tecnológicas en un espacio de construcción, - colaboración y aprendizaje. - Estamos comprometidxs a proporcionar un ambiente amigable, seguro - y acogedor para todxs, para todo género, orientación sexual, - discapacidad, etnia, religión, o cualquier otra categoría de diversidad. - Este código de conducta especifica los lineamientos de comportamiento - de los participantes, así como las consecuencias de un comportamiento inaceptable. -
-- Lxs organizadores del guadalahacks tienen el derecho y la responsabilidad - de sancionar o expulsar temporal o permanentemente a cualquier participante por - cualquier comportamiento que consideren inapropiado, amenazante, ofensivo o dañino. -
-- Si eres víctima o testigo de un comportamiento inaceptable, o tienes alguna otra inquietud, - por favor comunícate con un miembro del equipo de guadalahacks lo antes posible - o escríbenos a - incidentes@guadalahacks.com - . -
-- Recordamos a los participantes que deben respetar las instalaciones y su entorno, - así como cualquier equipo y recurso proporcionado como parte del hackatón. -
-- Para reportar problemas relacionados con el código de conducta, comunícate con - un miembro del equipo de guadalahacks o escríbenos a - - incidentes@guadalahacks.com - . -
-- Apreciamos tu colaboración en hacer de este guadalahacks un lugar amigable y - acogedor para todxs lxs participantes. -
- >, - en: <> -- The goal of guadalahacks is to foster innovation and the creation of - tech solutions in a space where we can build, contribute and learn. - We're committed to provide a safe, welcoming environment for everyone, regardless - of gender, sexual orientation, disability, ethnical background, religion, or any - other diversity category. This code of conduct outlines the behavior guidelines - for all attendands and staff members, as well as the consequences of breaking it. -
-- The organizers of guadalahacks have the right and responsibility to sanction - or expel any participant temporarily or permanently for any behavior they consider - inappropriate, threatening, offensive or harmful. -
-- If you're witness or victim of any unacceptable behavior, or you have any other concert, - please reach out to a member of the guadalahacks staff as soon as possible - or write us an email at - incidents@guadalahacks.com - . -
-- We remind participants to respect the facilities and their surroundings, - as well as any equipment and resources provided as part of the hackathon. -
-- To report any issues related to the code of conduct, please reach out to a member of the guadalahacks staff as soon as possible - or write us an email at - incidents@guadalahacks.com - . -
-- We appreciate your effort to make guadalahacks a friendly and welcoming space for everyone. -
- > + element: { + es: <> ++ El objetivo de guadalahacks es fomentar la innovación y + la creación de soluciones tecnológicas en un espacio de construcción, + colaboración y aprendizaje. + Estamos comprometidxs a proporcionar un ambiente amigable, seguro + y acogedor para todxs, para todo género, orientación sexual, + discapacidad, etnia, religión, o cualquier otra categoría de diversidad. + Este código de conducta especifica los lineamientos de comportamiento + de los participantes, así como las consecuencias de un comportamiento inaceptable. +
++ Lxs organizadores del guadalahacks tienen el derecho y la responsabilidad + de sancionar o expulsar temporal o permanentemente a cualquier participante por + cualquier comportamiento que consideren inapropiado, amenazante, ofensivo o dañino. +
++ Si eres víctima o testigo de un comportamiento inaceptable, o tienes alguna otra inquietud, + por favor comunícate con un miembro del equipo de guadalahacks lo antes posible + o escríbenos a + incidentes@guadalahacks.com + . +
++ Recordamos a los participantes que deben respetar las instalaciones y su entorno, + así como cualquier equipo y recurso proporcionado como parte del hackatón. +
++ Para reportar problemas relacionados con el código de conducta, comunícate con + un miembro del equipo de guadalahacks o escríbenos a + + incidentes@guadalahacks.com + . +
++ Apreciamos tu colaboración en hacer de este guadalahacks un lugar amigable y + acogedor para todxs lxs participantes. +
+ >, + en: <> ++ The goal of guadalahacks is to foster innovation and the creation of + tech solutions in a space where we can build, contribute and learn. + We're committed to provide a safe, welcoming environment for everyone, regardless + of gender, sexual orientation, disability, ethnical background, religion, or any + other diversity category. This code of conduct outlines the behavior guidelines + for all attendands and staff members, as well as the consequences of breaking it. +
++ The organizers of guadalahacks have the right and responsibility to sanction + or expel any participant temporarily or permanently for any behavior they consider + inappropriate, threatening, offensive or harmful. +
++ If you're witness or victim of any unacceptable behavior, or you have any other concert, + please reach out to a member of the guadalahacks staff as soon as possible + or write us an email at + incidents@guadalahacks.com + . +
++ We remind participants to respect the facilities and their surroundings, + as well as any equipment and resources provided as part of the hackathon. +
++ To report any issues related to the code of conduct, please reach out to a member of the guadalahacks staff as soon as possible + or write us an email at + incidents@guadalahacks.com + . +
++ We appreciate your effort to make guadalahacks a friendly and welcoming space for everyone. +
+ > + } + }, + gallery_photo_alt: { + string: { + es: "Colección de fotografías de Guadalahacks 2024, personas programando y recibiendo premios", + en: "Guadalahacks 2024 pictures collage, people coding and receiving their awards" + } + }, + partnerLogo_defaultWording: { + string: { + es: "Enlace", + en: "Link" + } } -} \ No newline at end of file +}