Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions src/i18n/becas/ca.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
export const ca = {
title: 'Beques - PyConES 2026',
heading: 'Beques i ajuts',
intro:
"Des de la comunitat de PyConES volem facilitar al màxim l'assistència a aquesta convenció de totes les persones que tinguin alguna dificultat en aquest moment. Per això, s'ha decidit dedicar una part dels nostres recursos en beces per a les persones que ho necessitin.",
description:
"Les beces es destinaran a sufragar les despeses d'allotjament, el transport i/o l'entrada de l'esdeveniment.",
targetAudience: {
title: 'A qui van dirigides?',
items: [
'Estudiants universitaris, formació professional o BootCamp.',
'Persones en situació de desocupació.',
'Famílies monoparentals.',
'Persones amb contracte de pràctiques, jornada reduïda o baixa laboral.',
],
},
documentation: {
title: 'Documentació a aportar',
items: [
{
category: 'Estudiants',
requirement: 'Presentar el resguard de la matrícula del curs vigent.',
},
{
category: 'Desocupats',
requirement: 'Certificat de desocupació.',
},
{
category: 'Famílies monoparentals',
requirement:
'Document que certifiqui la situació. Recordeu censurar la informació compromesa del document.',
},
{
category: 'Contractes de pràctiques, jornada reduïda o baixa laboral',
requirement:
'Document que certifiqui la situació. Recordeu censurar la informació compromesa del document.',
},
],
},
application: {
title: 'Sol·licitar una beca',
body: "Per a sol·licitar la beca heu d'omplir el formulari de sol·licitud. Després d'estudiar la sol·licitud, ens posarem en contacte per correu electrònic amb la resposta.",
formLink: '#',
formText: 'Omplir formulari de sol·licitud',
},
sponsors: {
title: 'Patrocinadors de beques',
intro:
'Volem donar les gràcies a les empreses patrocinadores que han col·laborat amb nosaltres per a fer possibles aquestes beces.',
},
}
48 changes: 48 additions & 0 deletions src/i18n/becas/en.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
export const en = {
title: 'Scholarships - PyConES 2026',
heading: 'Scholarships and aid',
intro:
'From the PyConES community, we want to make it as easy as possible for anyone facing difficulties to attend this convention. That is why we have decided to dedicate part of our resources to scholarships for those who need them.',
description: 'Scholarships will cover accommodation, transportation, and/or event registration costs.',
targetAudience: {
title: 'Who is this for?',
items: [
'University students, vocational training, or BootCamp participants.',
'Unemployed individuals.',
'Single-parent families.',
'People with internship contracts, reduced working hours, or on leave.',
],
},
documentation: {
title: 'Required documentation',
items: [
{
category: 'Students',
requirement: 'Provide proof of enrollment for the current academic year.',
},
{
category: 'Unemployed',
requirement: 'Unemployment certificate.',
},
{
category: 'Single-parent families',
requirement: 'Document certifying the situation. Remember to redact any sensitive information.',
},
{
category: 'Internship contracts, reduced hours, or on leave',
requirement: 'Document certifying the situation. Remember to redact any sensitive information.',
},
],
},
application: {
title: 'Apply for a scholarship',
body: 'To apply for a scholarship, please fill out the application form. After reviewing your application, we will contact you via email with our response.',
formLink: '#',
formText: 'Fill out application form',
},
sponsors: {
title: 'Scholarship sponsors',
intro:
'We would like to thank the sponsoring companies that have collaborated with us to make these scholarships possible.',
},
}
51 changes: 51 additions & 0 deletions src/i18n/becas/es.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
export const es = {
title: 'Becas - PyConES 2026',
heading: 'Becas y ayudas',
intro:
'Desde la comunidad de PyConES queremos facilitar al máximo la asistencia a esta convención de todas las personas que tengan alguna dificultad en este momento. Por ello, se ha decidido dedicar una parte de nuestros recursos en becas para las personas que lo necesiten.',
description:
'Las becas se destinarán a sufragar los gastos de alojamiento, el transporte y/o la entrada del evento.',
targetAudience: {
title: '¿A quién van dirigidas?',
items: [
'Estudiantes universitarios, formación profesional o BootCamp.',
'Personas en situación de desempleo.',
'Familias monoparentales.',
'Personas con contrato de prácticas, jornada reducida o baja laboral.',
],
},
documentation: {
title: 'Documentación a aportar',
items: [
{
category: 'Estudiantes',
requirement: 'Presentar el resguardo de la matrícula del curso vigente.',
},
{
category: 'Desempleados',
requirement: 'Certificado de desempleo.',
},
{
category: 'Familias monoparentales',
requirement:
'Documento que certifique la situación. Recuerde censurar la información comprometida del documento.',
},
{
category: 'Contratos en prácticas, jornada reducida o baja laboral',
requirement:
'Documento que certifique la situación. Recuerde censurar la información comprometida del documento.',
},
],
},
application: {
title: 'Solicitar una beca',
body: 'Para solicitar la beca debe rellenar el formulario de solicitud. Tras estudiar la solicitud nos pondremos en contacto vía email con la respuesta.',
formLink: '#',
formText: 'Rellenar formulario de solicitud',
},
sponsors: {
title: 'Patrocinadores de becas',
intro:
'Queremos dar las gracias a las empresas patrocinadoras que han colaborado con nosotros para hacer posible estas becas.',
},
}
9 changes: 9 additions & 0 deletions src/i18n/becas/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { es } from './es'
import { en } from './en'
import { ca } from './ca'

export const texts = {
es,
en,
ca,
} as const
4 changes: 4 additions & 0 deletions src/i18n/menu/ca.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ export const ca = {
label: 'Codi de conducta',
href: '/code-of-conduct',
},
{
label: 'Beces',
href: '/becas',
},
],
},
{
Expand Down
4 changes: 4 additions & 0 deletions src/i18n/menu/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ export const en = {
label: 'Code of Conduct',
href: '/code-of-conduct',
},
{
label: 'Scholarships',
href: '/becas',
},
],
},
{
Expand Down
4 changes: 4 additions & 0 deletions src/i18n/menu/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ export const es = {
label: 'Código de conducta',
href: '/code-of-conduct',
},
{
label: 'Becas',
href: '/becas',
},
],
},
{
Expand Down
148 changes: 148 additions & 0 deletions src/pages/[lang]/becas.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
---
import Layout from '../../layouts/Layout.astro'
import StatusIcon from '../../components/icons/StatusIcon.astro'
import { texts } from '../../i18n/becas'

export function getStaticPaths() {
return [{ params: { lang: 'es' } }, { params: { lang: 'en' } }, { params: { lang: 'ca' } }]
}

const { lang } = Astro.params

const t = texts[(lang || 'es') as keyof typeof texts]

const { title, heading, intro, description, targetAudience, documentation, application, sponsors } = t
---

<Layout title={title} description={intro}>
<div class="grow container mx-auto px-4 py-8 mt-20">
<!-- Hero -->
<header class="text-center mb-16">
<h1
class="text-4xl md:text-5xl font-extrabold leading-tight mb-6 flex items-center justify-center gap-4"
>
<StatusIcon type="love" size="xl" class="text-pycon-red w-9 h-9 flex-shrink-0" />
{heading}
</h1>
<div
class="w-24 h-1 bg-linear-to-r from-pycon-yellow via-pycon-orange to-pycon-red mx-auto rounded-full"
>
</div>
</header>

<!-- Intro -->
<section class="mb-12">
<div class="bg-white/5 p-8 rounded-2xl border border-white/10 shadow-sm">
<p class="text-lg leading-relaxed mb-6">
{intro}
</p>
<p class="opacity-80 leading-relaxed">
{description}
</p>
</div>
</section>

<!-- Target Audience -->
<section class="mb-12" aria-labelledby="becas-target">
<h2 id="becas-target" class="text-2xl md:text-3xl font-bold mb-6 flex items-center gap-3">
<span
class="inline-flex items-center justify-center w-10 h-10 rounded-lg bg-pycon-yellow/20 text-pycon-yellow text-lg"
aria-hidden="true"><StatusIcon type="info" size="md" /></span
>
{targetAudience.title}
</h2>
<div class="bg-white/5 p-8 rounded-2xl border border-white/10 shadow-sm">
<ul class="space-y-4">
{
targetAudience.items.map((item: string) => (
<li class="flex gap-4 items-start">
<span class="mt-1 w-2 h-2 rounded-full bg-pycon-orange shrink-0" aria-hidden="true" />
<span class="opacity-80 leading-relaxed">{item}</span>
</li>
))
}
</ul>
</div>
</section>

<!-- Documentation -->
<section class="mb-12" aria-labelledby="becas-docs">
<h2 id="becas-docs" class="text-2xl md:text-3xl font-bold mb-6 flex items-center gap-3">
<span
class="inline-flex items-center justify-center w-10 h-10 rounded-lg bg-pycon-orange/20 text-pycon-orange text-lg"
aria-hidden="true"><StatusIcon type="search" size="md" /></span
>
{documentation.title}
</h2>
<div class="space-y-4">
{
documentation.items.map((item: { category: string; requirement: string }) => (
<div class="flex gap-4 items-start bg-white/5 p-5 rounded-xl border border-white/10 shadow-sm transition-all hover:shadow-md hover:border-pycon-orange/20">
<span class="inline-flex items-center justify-center w-8 h-8 rounded-full bg-pycon-orange/10 text-pycon-orange text-sm font-bold shrink-0">
{item.category.charAt(0)}
</span>
<div>
<p class="font-semibold mb-1">{item.category}</p>
<p class="opacity-80 leading-relaxed text-sm">{item.requirement}</p>
</div>
</div>
))
}
</div>
</section>

<!-- Application -->
<section class="mb-12" aria-labelledby="becas-apply">
<h2 id="becas-apply" class="text-2xl md:text-3xl font-bold mb-6 flex items-center gap-3">
<span
class="inline-flex items-center justify-center w-10 h-10 rounded-lg bg-pycon-red/20 text-pycon-red text-lg"
aria-hidden="true"><StatusIcon type="allowed" size="md" /></span
>
{application.title}
</h2>
<div class="bg-white/5 p-8 rounded-2xl border border-white/10 shadow-sm">
<p class="opacity-80 leading-relaxed mb-6">
{application.body}
</p>
<a
href={application.formLink}
class="inline-flex items-center gap-2 bg-pycon-red hover:bg-pycon-red/80 text-white font-semibold px-6 py-3 rounded-xl transition-all hover:shadow-lg"
>
{application.formText}
<svg
class="w-4 h-4"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M5 12h14"></path>
<path d="m12 5 7 7-7 7"></path>
</svg>
</a>
</div>
</section>

<!-- Sponsors -->
<section class="mb-16" aria-labelledby="becas-sponsors">
<h2 id="becas-sponsors" class="text-2xl md:text-3xl font-bold mb-6 flex items-center gap-3">
<span
class="inline-flex items-center justify-center w-10 h-10 rounded-lg bg-pycon-yellow/20 text-pycon-yellow text-lg"
aria-hidden="true"><StatusIcon type="partnership" size="md" /></span
>
{sponsors.title}
</h2>
<div class="bg-white/5 p-8 rounded-2xl border border-white/10 shadow-sm">
<p class="opacity-80 leading-relaxed mb-6">
{sponsors.intro}
</p>
<div id="beca-sponsors-list" class="flex flex-wrap gap-8 items-center justify-center">
<!-- Sponsors logos will go here when confirmed -->
</div>
</div>
</section>
</div>
</Layout>
Loading