feat(i18n): add Catalan primary with /ca/ and /es/ URL structure

Introduce bilingual site routing with Catalan as primary language and
x-default, plus Spanish as the alternate. Each page declares its own
canonical, full hreflang block, locale and locale:alternate, and a
language-specific og:image. A top-right selector (CA | ES) lives in
every <header> with aria-current set on the active language.

- /ca/index.html: Catalan translation of the full editorial (title,
  meta, hero, six body sections, chart titles/desc/figcaption, footer).
- /es/index.html: previous Spanish content moved under /es/, with
  updated canonical and metadata.
- og-image-ca.jpg and og-image-es.jpg: separate 1200x630 social images.
- og-image.jpg removed (no longer cross-language).
- sitemap.xml rewritten to list both URLs with xhtml:link hreflang
  annotations and x-default.
- README and CHANGELOG updated to document the new structure.
This commit is contained in:
2026-07-30 12:15:31 +02:00
parent edaa4997a5
commit 15f32c037d
9 changed files with 81 additions and 27 deletions
+9 -1
View File
@@ -1,5 +1,13 @@
# Changelog
## 0.3.0 — 2026-07-30
- `feat(i18n)`: añade el catalán como idioma principal con estructura de URL `/ca/` (x-default) y `/es/`.
- `feat(seo)`: bloque `hreflang` completo (ca, es, x-default) y `og:locale:alternate` en cada página, más `canonical` por idioma.
- `feat(media)`: imágenes sociales separadas por idioma (`og-image-ca.jpg`, `og-image-es.jpg`); se elimina el antiguo `og-image.jpg` monolingüe.
- `feat(ui)`: selector de idioma en la esquina superior derecha del `<header>` (`CA | ES`), con `aria-current="page"` en el idioma activo.
- `chore(meta)`: `sitemap.xml` reescrito para listar ambas URLs con anotaciones `hreflang` completas.
## 0.2.0 — 2026-07-30
- Removed build pipeline (no more Node.js, no more `node_modules`, no more `src`/`dist` split).
@@ -11,4 +19,4 @@
- Publicación inicial del editorial estático sobre el Decreto 25/2018 y la evolución de la posidonia.
- Gráficos accesibles como SVG en línea y metadatos SEO/NewsArticle, sin JavaScript de cliente ni fuentes web.
- Pipeline Node.js con `lightningcss`, `html-minifier-terser` y `sharp` para generar los artefactos de `dist/`.
- Preparación para despliegue estático en Coolify sobre Hetzner y el subdominio `posidonia.eivissaenvironmentalwatch.es`.
- Preparación para despliegue estático en Coolify sobre Hetzner y el subdominio `posidonia.eivissaenvironmentalwatch.es`.
+22 -3
View File
@@ -2,11 +2,30 @@
## Qué es Posidonia
Sitio editorial estático en español sobre el seguimiento de la *Posidonia oceanica* ocho años después del Decreto 25/2018. Sintetiza datos de GEN-GOB y Amics de la Terra Eivissa con HTML semántico, CSS y gráficos SVG, sin JavaScript de cliente ni servicios de terceros.
Sitio editorial estático en catalán y español sobre el seguimiento de la *Posidonia oceanica* ocho años después del Decreto 25/2018. Sintetiza datos de GEN-GOB y Amics de la Terra Eivissa con HTML semántico, CSS y gráficos SVG, sin JavaScript de cliente ni servicios de terceros.
## Estructura
```
/
├── ca/
│ └── index.html # Català (primari, x-default)
├── es/
│ └── index.html # Castellano
├── og-image-ca.jpg # 1200×630, imatge social per a /ca/
├── og-image-es.jpg # 1200×630, imatge social per a /es/
├── robots.txt
└── sitemap.xml # enumera /ca/ i /es/ amb hreflang complet
```
- `/ca/` és l'idioma principal (`hreflang="x-default"`).
- `/es/` és l'alternativa en castellà.
- Cada pàgina porta un selector d'idioma a la cantonada superior dreta del `<header>` (`CA | ES`), amb `aria-current="page"` a l'idioma actiu.
- Tots dos documents declaren `<link rel="alternate" hreflang="…">` per a l'altra llengua i per a `x-default`, més el seu propi `canonical`.
## Build
No build step required. The `index.html`, `robots.txt`, `sitemap.xml` and `og-image.jpg` in this repo root are deployed as-is.
No build step required. The two `index.html` files, `robots.txt`, `sitemap.xml` and the two `og-image-*.jpg` files in this repo root are deployed as-is.
## Deploy
@@ -21,4 +40,4 @@ La página usa tipografías del sistema, CSS y SVG en línea, cero scripts exter
## Contacto
<!-- TODO: [reemplazar con email real del mantenedor si es diferente] -->
Escribe a [contacto@posidonia.eivissaenvironmentalwatch.es](mailto:contacto@posidonia.eivissaenvironmentalwatch.es).
Escribe a [contacto@posidonia.eivissaenvironmentalwatch.es](mailto:contacto@posidonia.eivissaenvironmentalwatch.es).
+18
View File
File diff suppressed because one or more lines are too long
+18
View File
File diff suppressed because one or more lines are too long
-18
View File
File diff suppressed because one or more lines are too long
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

+14 -5
View File
@@ -1,9 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<url>
<loc>https://posidonia.eivissaenvironmentalwatch.es/</loc>
<loc>https://posidonia.eivissaenvironmentalwatch.es/ca/</loc>
<lastmod>2026-07-30</lastmod>
<changefreq>monthly</changefreq>
<priority>1.0</priority>
<xhtml:link rel="alternate" hreflang="ca" href="https://posidonia.eivissaenvironmentalwatch.es/ca/"/>
<xhtml:link rel="alternate" hreflang="es" href="https://posidonia.eivissaenvironmentalwatch.es/es/"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://posidonia.eivissaenvironmentalwatch.es/ca/"/>
</url>
</urlset>
<url>
<loc>https://posidonia.eivissaenvironmentalwatch.es/es/</loc>
<lastmod>2026-07-30</lastmod>
<xhtml:link rel="alternate" hreflang="ca" href="https://posidonia.eivissaenvironmentalwatch.es/ca/"/>
<xhtml:link rel="alternate" hreflang="es" href="https://posidonia.eivissaenvironmentalwatch.es/es/"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://posidonia.eivissaenvironmentalwatch.es/ca/"/>
</url>
</urlset>