Skip to content
Merged
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
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "2026.es.pycon.org",
"version": "1.17.13",
"version": "1.17.14",
"description": "",
"main": "index.js",
"scripts": {
Expand Down
35 changes: 35 additions & 0 deletions src/i18n/django-girls/ca.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
export const ca = {
title: 'Django Girls - PyConES 2026',
description:
"Taller gratuït de Django Girls a la PyConES 2026: aprèn a crear la teva pròpia pàgina web en un dia, en un ambient segur i amable. Inscripcions fins al 25 d'octubre.",
heroTitle: 'Django Girls',
heroSubtitle: 'Taller a la PyConES 2026',
intro:
'Si ets una dona o persona no-binaria i vols aprendre a fer pàgines web, tenim bones notícies! Organitzem un taller gratuït en què podràs construir la teva pròpia pàgina web des de zero en un sol dia, en el marc de la PyConES 2026 a la Universitat de Barcelona. Aprendràs les eines que fan servir els programadors professionals cada dia, de manera senzilla i accessible.',
detailsTitle: 'Detalls',
dateLabel: 'Data',
date: 'Divendres, 6 de novembre de 2026',
locationLabel: 'Lloc',
location: 'Universitat de Barcelona',
deadlineLabel: 'Inscripcions fins al',
deadline: "25 d'octubre",
requirementsTitle: 'Requisits',
requirements: [
'Ser dona o persona no-binaria.',
"Tenir moltes ganes d'aprendre.",
'Portar el teu propi portàtil.',
'No cal experiència prèvia.',
],
whatYouGetTitle: 'Com a assistent podràs',
whatYouGet: [
'Construir la teva pròpia pàgina web amb Django.',
"Gaudir d'un ambient segur i amable.",
'Coneixer altres persones amb interessos afins',
],
signupTitle: "Inscriu-t'hi",
signupAttendeesLabel: 'Inscripcions per a assistents',
signupAttendeesUrl: 'https://djangogirls.org/es/barcelona',
signupCoachesLabel: 'Inscripcions per a mentores',
signupCoachesUrl: 'https://djangogirls.org/es/barcelona#coach',
shareText: "Ajuda'ns compartint! 🔄💛",
}
35 changes: 35 additions & 0 deletions src/i18n/django-girls/en.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
export const en = {
title: 'Django Girls - PyConES 2026',
description:
'Free Django Girls workshop at PyConES 2026: learn how to build your own website in a day, in a safe and friendly environment. Apply by October 25th.',
heroTitle: 'Django Girls',
heroSubtitle: 'Workshop at PyConES 2026',
intro:
'Are you a woman or non-binary person who wants to learn how to build websites? We have great news! We are organizing a free workshop where you will build your own website from scratch in a single day, as part of PyConES 2026 at the University of Barcelona. You will learn the tools that professional developers use every day, in a simple and accessible way.',
detailsTitle: 'Details',
dateLabel: 'Date',
date: 'Friday, November 6, 2026',
locationLabel: 'Venue',
location: 'University of Barcelona',
deadlineLabel: 'Applications close',
deadline: 'October 25th',
requirementsTitle: 'Requirements',
requirements: [
'Identify as a woman or non-binary person.',
'Have a strong eagerness to learn.',
'Bring your own laptop.',
'No prior experience needed.',
],
whatYouGetTitle: 'As an attendee you will',
whatYouGet: [
'Build your own website with Django.',
'Enjoy a safe and friendly atmosphere.',
'Meet other people with similar interests',
],
signupTitle: 'Apply',
signupAttendeesLabel: 'Attendee signup',
signupAttendeesUrl: 'https://djangogirls.org/en/barcelona',
signupCoachesLabel: 'Mentor signup',
signupCoachesUrl: 'https://djangogirls.org/en/barcelona#coach',
shareText: 'Help us out by sharing! 🔄💛',
}
35 changes: 35 additions & 0 deletions src/i18n/django-girls/es.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
export const es = {
title: 'Django Girls - PyConES 2026',
description:
'Taller gratuito de Django Girls en la PyConES 2026: aprende a crear tu propia página web en un día, en un ambiente seguro y amigable. Inscripciones hasta el 25 de octubre.',
heroTitle: 'Django Girls',
heroSubtitle: 'Taller en PyConES 2026',
intro:
'Si eres una mujer o persona no-binaria y quieres aprender a hacer páginas web, ¡tenemos buenas noticias! Estamos organizando un taller gratuito en el que podrás construir tu propia página web desde cero en un día, en el marco de la PyConES 2026 en la Universitat de Barcelona. Aprenderás a utilizar las herramientas que usan los programadores profesionales a diario, de forma sencilla y accesible.',
detailsTitle: 'Detalles',
dateLabel: 'Fecha',
date: 'Viernes, 6 de noviembre de 2026',
locationLabel: 'Lugar',
location: 'Universitat de Barcelona',
deadlineLabel: 'Inscripciones hasta',
deadline: '25 de octubre',
requirementsTitle: 'Requisitos',
requirements: [
'Ser mujer o persona no-binaria.',
'Tener muchas ganas de aprender.',
'Traer tu propio portátil.',
'No necesitas experiencia previa.',
],
whatYouGetTitle: 'Como asistente podrás',
whatYouGet: [
'Construir tu propia página web con Django.',
'Disfrutar de un ambiente seguro y amigable.',
'Conocer a otras personas con intereses afines',
],
signupTitle: 'Inscríbete',
signupAttendeesLabel: 'Inscripciones para asistentes',
signupAttendeesUrl: 'https://djangogirls.org/es/barcelona',
signupCoachesLabel: 'Inscripciones para mentoras',
signupCoachesUrl: 'https://djangogirls.org/es/barcelona#coach',
shareText: '¡Ayúdanos compartiendo! 🔄💛',
}
9 changes: 9 additions & 0 deletions src/i18n/django-girls/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 @@ -36,6 +36,10 @@ export const ca = {
label: 'Beces',
href: '/becas',
},
{
label: 'Django Girls',
href: '/django-girls',
},
],
},
{
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 @@ -36,6 +36,10 @@ export const en = {
label: 'Scholarships',
href: '/becas',
},
{
label: 'Django Girls',
href: '/django-girls',
},
],
},
{
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 @@ -36,6 +36,10 @@ export const es = {
label: 'Becas',
href: '/becas',
},
{
label: 'Django Girls',
href: '/django-girls',
},
],
},
{
Expand Down
218 changes: 218 additions & 0 deletions src/pages/[lang]/django-girls.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,218 @@
---
import Layout from '../../layouts/Layout.astro'
import StatusIcon from '../../components/icons/StatusIcon.astro'
import Button from '../../components/Button.astro'
import { texts } from '../../i18n/django-girls'
import { menuTexts } from '../../i18n/menu'

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 menuT = menuTexts[(lang || 'es') as keyof typeof menuTexts]

const {
title,
description,
heroTitle,
heroSubtitle,
intro,
detailsTitle,
dateLabel,
date,
locationLabel,
location,
deadlineLabel,
deadline,
requirementsTitle,
requirements,
whatYouGetTitle,
whatYouGet,
signupTitle,
signupAttendeesLabel,
signupAttendeesUrl,
signupCoachesLabel,
signupCoachesUrl,
shareText,
} = t
---

<Layout title={title} description={description}>
<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" />
{heroTitle}
</h1>
<p class="text-lg md:text-xl opacity-80 mb-6">{heroSubtitle}</p>
<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">
{intro}
</p>
</div>
</section>

<!-- Details -->
<section class="mb-12" aria-labelledby="dg-details">
<h2 id="dg-details" 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
>
{detailsTitle}
</h2>
<div class="bg-white/5 p-8 rounded-2xl border border-white/10 shadow-sm">
<ul class="space-y-5">
<li class="flex gap-4 items-start">
<span class="mt-1 text-pycon-yellow shrink-0" aria-hidden="true">
<StatusIcon type="calendar" size="md" />
</span>
<div>
<p class="font-semibold mb-1">{dateLabel}</p>
<p class="opacity-80 leading-relaxed">{date}</p>
</div>
</li>
<li class="flex gap-4 items-start">
<span class="mt-1 text-pycon-orange shrink-0" aria-hidden="true">
<StatusIcon type="location" size="md" />
</span>
<div>
<p class="font-semibold mb-1">{locationLabel}</p>
<p class="opacity-80 leading-relaxed">{location}</p>
</div>
</li>
<li class="flex gap-4 items-start">
<span class="mt-1 text-pycon-red shrink-0" aria-hidden="true">
<StatusIcon type="warning" size="md" />
</span>
<div>
<p class="font-semibold mb-1">{deadlineLabel}</p>
<p class="opacity-80 leading-relaxed">{deadline}</p>
</div>
</li>
</ul>
</div>
</section>

<!-- Requirements -->
<section class="mb-12" aria-labelledby="dg-requirements">
<h2 id="dg-requirements" 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="partnership" size="md" /></span
>
{requirementsTitle}
</h2>
<div class="bg-white/5 p-8 rounded-2xl border border-white/10 shadow-sm">
<ul class="space-y-4">
{
requirements.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>

<!-- What you get -->
<section class="mb-12" aria-labelledby="dg-whatyouget">
<h2 id="dg-whatyouget" 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="heart" size="md" /></span
>
{whatYouGetTitle}
</h2>
<div class="bg-white/5 p-8 rounded-2xl border border-white/10 shadow-sm">
<ul class="space-y-4">
{
whatYouGet.map((item: string) => (
<li class="flex gap-4 items-start">
<span class="mt-1 w-2 h-2 rounded-full bg-pycon-red shrink-0" aria-hidden="true" />
<span class="opacity-80 leading-relaxed">{item}</span>
</li>
))
}
</ul>
</div>
</section>

<!-- Signup -->
<section class="mb-12" aria-labelledby="dg-signup">
<h2 id="dg-signup" 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="thinking" size="md" /></span
>
{signupTitle}
</h2>
<div class="bg-white/5 p-8 rounded-2xl border border-white/10 shadow-sm">
<div class="flex flex-col md:flex-row gap-4 items-start md:items-center">
<Button
variant="primary"
size="lg"
href={signupAttendeesUrl}
target="_blank"
rel="noopener noreferrer"
aria-label={`${signupAttendeesLabel} ${menuT.new_tab}`}
>
{signupAttendeesLabel}
<svg
class="ml-2 w-4 h-4 shrink-0"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"></path>
</svg>
</Button>
<Button
variant="secondary"
size="lg"
href={signupCoachesUrl}
target="_blank"
rel="noopener noreferrer"
aria-label={`${signupCoachesLabel} ${menuT.new_tab}`}
>
{signupCoachesLabel}
<svg
class="ml-2 w-4 h-4 shrink-0"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"></path>
</svg>
</Button>
</div>
</div>
</section>
</div>
</Layout>
Loading