Skip to content

Commit ccf3e43

Browse files
committed
fix: agrupar sitemap multilenguaje
- Ajusta la generación del sitemap para unir cada ruta en español con su homóloga en inglés y emitir hreflang correctos. - Actualiza las imágenes OG generadas durante el build para conservar el estado visual actual del sitio. - Técnico: sincroniza versión y changelog para el release del cambio.
1 parent 7382d18 commit ccf3e43

5 files changed

Lines changed: 77 additions & 3 deletions

File tree

CHANGELOG.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -605,8 +605,6 @@ Todos los cambios notables en este proyecto serán documentados en este archivo
605605

606606
- Máscara gradual sobre `.ns-shore` para suavizar filos superiores y extensión del backdrop en los laterales.
607607

608-
609-
610608
## [0.29.2] - 2026-07-31
611609

612610
### Corregido
@@ -807,6 +805,13 @@ Todos los cambios notables en este proyecto serán documentados en este archivo
807805
- Estas demos **sí llevan un framework de JavaScript**, a diferencia de las plantillas: Astro 5 con Tailwind 4, shadcn/ui y una isla de React 19 para el panel. Son ~85 KB comprimidos que las plantillas no pagan. Es una decisión deliberada —un panel con estado compartido entre tarjetas, tabla y bitácora es justo lo que React resuelve bien—, pero conviene tenerla presente antes de comparar sus cifras con las de las plantillas.
808806
- El comentario del filtro del sitemap en `astro.config.mjs` pasa de seis a doce URL de demo y separa las dos familias.
809807

808+
## [0.33.1] - 2026-08-08
809+
810+
### Cambiado
811+
812+
- Ajuste del sitemap generado por Astro para agrupar cada ruta localizada con su homólogo en inglés y emitir alternancias de idioma correctas en el build.
813+
- Actualización de imágenes OG generadas durante el build para reflejar el estado actual de la compilación.
814+
810815
## [0.33.0] - 2026-08-05
811816

812817
### Añadido

astro.config.mjs

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { defineConfig } from "astro/config";
22
import sitemap from "@astrojs/sitemap";
3+
import { defaultLang, localizedPath, pageSlug } from "./src/data/i18n";
34
import { legalDataPending } from "./src/data/legal";
45
import es from "./src/data/locales/es";
56
import en from "./src/data/locales/en";
@@ -34,6 +35,49 @@ const templatesHubAnchor = (locale) =>
3435
locale.projectsPage.manifest.find((m) => m.href === "#templates")?.href ??
3536
"";
3637

38+
const siteUrl = "https://ctgcode.com";
39+
40+
const normalizePathname = (pathname) => {
41+
const normalized = pathname.replace(/\/+$/, "");
42+
return normalized || "/";
43+
};
44+
45+
const localizedRouteGroups = new Map();
46+
const routePageNames = [
47+
"home",
48+
"privacy",
49+
"terms",
50+
"projects",
51+
"services",
52+
"template-local-business",
53+
"template-professional-services",
54+
"template-startup-product",
55+
];
56+
57+
for (const pageName of routePageNames) {
58+
const defaultPath = localizedPath(
59+
defaultLang,
60+
pageSlug(defaultLang, pageName),
61+
);
62+
const englishPath = localizedPath("en", pageSlug("en", pageName));
63+
const defaultUrl = `${siteUrl}${defaultPath}`;
64+
const englishUrl = `${siteUrl}${englishPath}`;
65+
66+
const group = {
67+
defaultUrl,
68+
englishUrl,
69+
defaultPath: normalizePathname(defaultPath),
70+
englishPath: normalizePathname(englishPath),
71+
links: [
72+
{ lang: "es", hreflang: "es-CO", url: defaultUrl },
73+
{ lang: "en", hreflang: "en", url: englishUrl },
74+
],
75+
};
76+
77+
localizedRouteGroups.set(group.defaultPath, group);
78+
localizedRouteGroups.set(group.englishPath, group);
79+
}
80+
3781
export default defineConfig({
3882
output: "static",
3983

@@ -60,6 +104,31 @@ export default defineConfig({
60104
*/
61105
filter: (page) => !(legalDataPending && LEGAL_URLS.has(page)),
62106

107+
/**
108+
* Agrupa cada ruta localizada en un único elemento del sitemap: el
109+
* español queda como URL canónica y el inglés se añade como alternativa
110+
* con su `hreflang`. Esto evita que el build emita entradas separadas para
111+
* `/` y `/en/`, `/privacidad/` y `/en/privacy/`, etc.
112+
*/
113+
serialize: (item) => {
114+
const currentPath = normalizePathname(new URL(item.url).pathname);
115+
const group = localizedRouteGroups.get(currentPath);
116+
117+
if (!group) {
118+
return item;
119+
}
120+
121+
if (currentPath === group.englishPath) {
122+
return undefined;
123+
}
124+
125+
return {
126+
...item,
127+
url: group.defaultUrl,
128+
links: group.links,
129+
};
130+
},
131+
63132
/**
64133
* Las doce URL de las demos NO se listan aquí —seis de plantillas y seis
65134
* de automatizaciones—. Se construyen con `PUBLIC_DEMO` y salen con

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "ctg-code",
3-
"version": "0.33.0",
3+
"version": "0.33.1",
44
"dependencies": {
55
"@astrojs/sitemap": "^3.7.3",
66
"@fontsource-variable/inter": "^5.2.8",

public/images/og/en/projects.png

5 Bytes
Loading

public/images/og/es/home.png

-578 Bytes
Loading

0 commit comments

Comments
 (0)