feat(i18n): English localization (phase 3)
CI / Lint e auditorias (push) Successful in 1m51s
CI / Trivy (dependências e segredos) (push) Successful in 15s
CI / Imagem Docker (linux/arm64) (push) Successful in 2m41s

- Translate content to English across messages/en.json, data/en, lib/data/en, and public/exemplos/en
- Implement localized routing, slugs, and language negotiation with fallback to en
- Build dedicated search index for English with strict book exclusion
- Update components and pages to dynamically render localized strings and datasets
- Verify full structural parity and exact 1:1 match on Portuguese pages via comparator

Co-Authored-By: Antigravity <noreply@google.com>
This commit is contained in:
Lucas RayanandAntigravity committed 2026-11-01 14:17:13 -03:00
1 parent 22b1f26aed
commit c1bd2c7e11
61 files changed
+18182 -1225

No files matched your search

+45 -10
View File
@@ -30,6 +30,11 @@ for _ in $(seq 1 30); do curl -fsS -o /dev/null "$base/pt" && break; sleep 2; do
ENABLED_LOCALES=${ENABLED_LOCALES:-$(node -e 'import("./i18n/links.js").then(m => console.log(m.ENABLED_LOCALES.join(" ")))' 2>/dev/null || echo "pt")}
ALL_LOCALES="pt en es fr de zh-CN"
FALLBACK_LOCALE="pt"
if [[ " $ENABLED_LOCALES " =~ " en " ]]; then
FALLBACK_LOCALE="en"
fi
# 1. Páginas que existem em todos os idiomas ATIVOS
for l in $ENABLED_LOCALES; do
status 200 "/$l"
@@ -38,12 +43,22 @@ for p in /series /sobre /livro; do
status 200 "/pt$p"
done
# 2. Idiomas INATIVOS: redirecionam com 307 para /pt
if [[ " $ENABLED_LOCALES " =~ " en " ]]; then
for p in /series /catalog /compare /components /diagnostics /frameworks /glossary /selector /about; do
status 200 "/en$p"
done
fi
# 2. Idiomas INATIVOS: redirecionam com 307 para o idioma fallback (en se ativo, senão pt)
for l in $ALL_LOCALES; do
if [[ ! " $ENABLED_LOCALES " =~ " $l " ]]; then
destino 307 "/$l" /pt
destino 307 "/$l/series" /pt/series
destino 307 "/$l/livro" /pt/livro
destino 307 "/$l" "/$FALLBACK_LOCALE"
destino 307 "/$l/series" "/$FALLBACK_LOCALE/series"
if [ "$FALLBACK_LOCALE" = "en" ]; then
destino 307 "/$l/livro" "/en"
else
destino 307 "/$l/livro" "/pt/livro"
fi
fi
done
@@ -60,13 +75,25 @@ if [[ " $ENABLED_LOCALES " == " pt " ]]; then
destino 307 / /pt 'Cookie: NEXT_LOCALE=es'
else
destino 307 / /pt 'Accept-Language: pt-BR,pt;q=0.9'
[[ " $ENABLED_LOCALES " =~ " es " ]] && destino 307 / /es 'Accept-Language: es-MX,es;q=0.9,en;q=0.5'
[[ " $ENABLED_LOCALES " =~ " fr " ]] && destino 307 / /fr 'Accept-Language: fr-CA,fr;q=0.9'
[[ " $ENABLED_LOCALES " =~ " de " ]] && destino 307 / /de 'Accept-Language: de-AT,de;q=0.8'
[[ " $ENABLED_LOCALES " =~ " zh-CN " ]] && destino 307 / /zh-CN 'Accept-Language: zh-CN,zh;q=0.9'
[[ " $ENABLED_LOCALES " =~ " en " ]] && destino 307 / /en 'Accept-Language: it-IT'
destino 307 / /en 'Accept-Language: en-US,en;q=0.9'
destino 307 / /en 'Accept-Language: it-IT'
destino 307 / /pt 'Accept-Language: en;q=0.5,pt;q=0.9'
[[ " $ENABLED_LOCALES " =~ " es " ]] && destino 307 / /es 'Cookie: NEXT_LOCALE=es'
destino 307 / /pt 'Cookie: NEXT_LOCALE=pt'
destino 307 / /en 'Cookie: NEXT_LOCALE=en'
# Idiomas inativos negociam para fallback (en)
if [[ ! " $ENABLED_LOCALES " =~ " es " ]]; then
destino 307 / /en 'Accept-Language: es-MX,es;q=0.9'
destino 307 / /en 'Cookie: NEXT_LOCALE=es'
fi
if [[ ! " $ENABLED_LOCALES " =~ " fr " ]]; then
destino 307 / /en 'Accept-Language: fr-CA,fr;q=0.9'
fi
if [[ ! " $ENABLED_LOCALES " =~ " de " ]]; then
destino 307 / /en 'Accept-Language: de-AT,de;q=0.8'
fi
if [[ ! " $ENABLED_LOCALES " =~ " zh-CN " ]]; then
destino 307 / /en 'Accept-Language: zh-CN,zh;q=0.9'
fi
fi
# 4. URLs antigas (sem prefixo) continuam 308 permanente para /pt/...
@@ -87,4 +114,12 @@ for marca in '<title>' 'rel="canonical"'; do
case "$head" in *"$marca"*) ;; *) echo "FALHOU /pt/sobre: $marca fora do <head>"; falhas=$((falhas + 1));; esac
done
if [[ " $ENABLED_LOCALES " =~ " en " ]]; then
html_en=$(curl -s -A 'Mozilla/5.0 Chrome/130' "$base/en/about")
head_en=${html_en%%</head>*}
for marca in '<title>' 'rel="canonical"'; do
case "$head_en" in *"$marca"*) ;; *) echo "FALHOU /en/about: $marca fora do <head>"; falhas=$((falhas + 1));; esac
done
fi
exit $((falhas > 0))