feat(i18n): restrict public routes and metadata to enabled locales
- 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>
This commit is contained in:
1 parent
3a1a095e97
commit
d479a8d361
9 files changed
+219
-79
No files matched your search
+26
-9
@@ -13,6 +13,7 @@
|
||||
|
||||
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
||||
import { join } from "node:path";
|
||||
import { ENABLED_LOCALES } from "../i18n/links.js";
|
||||
|
||||
const CORES = {
|
||||
reset: "\x1b[0m",
|
||||
@@ -209,10 +210,15 @@ function verificarOutrosIdiomas(ptMessages) {
|
||||
|
||||
for (const loc of LOCALES) {
|
||||
if (loc === "pt") continue;
|
||||
const isEnabled = ENABLED_LOCALES.includes(loc);
|
||||
|
||||
const pathMessages = `messages/${loc}.json`;
|
||||
if (!existsSync(pathMessages)) {
|
||||
aviso(`Catálogo '${loc}' (${pathMessages}) ainda não criado (esperado para sua fase de tradução).`);
|
||||
if (isEnabled) {
|
||||
falha(`Catálogo '${loc}' (${pathMessages}) não encontrado para idioma ativo.`);
|
||||
} else {
|
||||
aviso(`Catálogo '${loc}' (${pathMessages}) ainda não criado (esperado para idioma inativo).`);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -250,15 +256,26 @@ function verificarOutrosIdiomas(ptMessages) {
|
||||
if (!(k in chavesPt)) extras++;
|
||||
}
|
||||
|
||||
if (faltando > 0) falha(`'${loc}': ${faltando} chave(s) ausente(s) em relação ao pt.`);
|
||||
if (extras > 0) aviso(`'${loc}': ${extras} chave(s) excedente(s) em relação ao pt.`);
|
||||
if (vazios > 0) falha(`'${loc}': ${vazios} valor(es) vazio(s).`);
|
||||
if (iguaisSemAllowlist > 0) {
|
||||
aviso(`'${loc}': ${iguaisSemAllowlist} valor(es) idêntico(s) ao pt sem allowlist.`);
|
||||
}
|
||||
if (isEnabled) {
|
||||
if (faltando > 0) falha(`'${loc}': ${faltando} chave(s) ausente(s) em relação ao pt.`);
|
||||
if (extras > 0) aviso(`'${loc}': ${extras} chave(s) excedente(s) em relação ao pt.`);
|
||||
if (vazios > 0) falha(`'${loc}': ${vazios} valor(es) vazio(s).`);
|
||||
if (iguaisSemAllowlist > 0) {
|
||||
aviso(`'${loc}': ${iguaisSemAllowlist} valor(es) idêntico(s) ao pt sem allowlist.`);
|
||||
}
|
||||
|
||||
if (faltando === 0 && vazios === 0) {
|
||||
sucesso(`Catálogo '${loc}' possui paridade estrutural completa com 'pt'.`);
|
||||
if (faltando === 0 && vazios === 0) {
|
||||
sucesso(`Catálogo '${loc}' ativo possui paridade estrutural completa com 'pt'.`);
|
||||
}
|
||||
} else {
|
||||
// Idioma inativo: valida integridade dos arquivos existentes sem quebrar se estiver incompleto
|
||||
if (faltando > 0) aviso(`'${loc}' (inativo/em progresso): ${faltando} chave(s) ausente(s) em relação ao pt.`);
|
||||
if (extras > 0) aviso(`'${loc}' (inativo): ${extras} chave(s) excedente(s) em relação ao pt.`);
|
||||
if (vazios > 0) aviso(`'${loc}' (inativo): ${vazios} valor(es) vazio(s).`);
|
||||
|
||||
if (faltando === 0 && vazios === 0) {
|
||||
sucesso(`Catálogo '${loc}' (inativo) possui paridade estrutural completa com 'pt'.`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user