- Add ENABLED_LOCALES configuration in i18n/links.js (currently ["pt"]) - Redirect inactive locale prefixes to /pt via 307 in middleware.js - Restrict root locale negotiation to active locales with fallback to pt - Hide LanguageSelector when only one locale is enabled - Generate sitemap, hreflang alternates, and og:locale only for active locales - Generate static SSG pages only for active locales in build - Adapt check:i18n and smoke-imagem.sh to validate active vs inactive locales Co-Authored-By: Antigravity <noreply@google.com>
79 lines
2.3 KiB
JavaScript
79 lines
2.3 KiB
JavaScript
import seriesData from "@/public/series.json";
|
|
import frameworksData from "@/public/frameworks.json";
|
|
import { SITE } from "@/lib/seo";
|
|
import { ENABLED_LOCALES, getLocalizedHref } from "@/i18n/links";
|
|
|
|
const LANG_MAP = {
|
|
pt: "pt-BR",
|
|
en: "en",
|
|
es: "es-419",
|
|
fr: "fr",
|
|
de: "de",
|
|
"zh-CN": "zh-CN",
|
|
};
|
|
|
|
/**
|
|
* Sitemap gerado a partir dos próprios dados do site e dos idiomas ativos.
|
|
* Inclui URLs apenas para ENABLED_LOCALES, com hreflang/alternates correspondentes.
|
|
* O livro só entra para a versão em português.
|
|
*/
|
|
export default function sitemap() {
|
|
const dataRevisao = new Date("2026-08-25T00:00:00.000Z");
|
|
|
|
const fixas = [
|
|
{ rota: "", prioridade: 1.0, frequencia: "weekly" },
|
|
{ rota: "/series", prioridade: 0.9, frequencia: "weekly" },
|
|
{ rota: "/comparacao", prioridade: 0.9, frequencia: "weekly" },
|
|
{ rota: "/diagnostico", prioridade: 0.9, frequencia: "weekly" },
|
|
{ rota: "/seletor", prioridade: 0.8, frequencia: "monthly" },
|
|
{ rota: "/frameworks", prioridade: 0.8, frequencia: "monthly" },
|
|
{ rota: "/componentes", prioridade: 0.8, frequencia: "weekly" },
|
|
{ rota: "/livro", prioridade: 0.7, frequencia: "monthly", apenasPt: true },
|
|
{ rota: "/glossario", prioridade: 0.7, frequencia: "monthly" },
|
|
{ rota: "/catalogo", prioridade: 0.6, frequencia: "weekly" },
|
|
{ rota: "/sobre", prioridade: 0.4, frequencia: "yearly" },
|
|
];
|
|
|
|
const series = Object.keys(seriesData).map((chave) => ({
|
|
rota: `/series/${chave}`,
|
|
prioridade: 0.9,
|
|
frequencia: "monthly",
|
|
}));
|
|
|
|
const frameworks = Object.keys(frameworksData).map((chave) => ({
|
|
rota: `/frameworks/${encodeURIComponent(chave)}`,
|
|
prioridade: 0.6,
|
|
frequencia: "monthly",
|
|
}));
|
|
|
|
const todasRotas = [...fixas, ...series, ...frameworks];
|
|
const entries = [];
|
|
|
|
for (const item of todasRotas) {
|
|
for (const loc of ENABLED_LOCALES) {
|
|
if (item.apenasPt && loc !== "pt") continue;
|
|
|
|
const href = getLocalizedHref(`/pt${item.rota}`, loc);
|
|
const url = `${SITE.url}${href}`;
|
|
|
|
const languages = {};
|
|
for (const l of ENABLED_LOCALES) {
|
|
if (item.apenasPt && l !== "pt") continue;
|
|
languages[LANG_MAP[l] || l] = `${SITE.url}${getLocalizedHref(`/pt${item.rota}`, l)}`;
|
|
}
|
|
|
|
entries.push({
|
|
url,
|
|
lastModified: dataRevisao,
|
|
changeFrequency: item.frequencia,
|
|
priority: item.prioridade,
|
|
alternates: {
|
|
languages,
|
|
},
|
|
});
|
|
}
|
|
}
|
|
|
|
return entries;
|
|
}
|