feat(i18n): French and German localization (phase 5)
CI / Lint e auditorias (push) Successful in 49s
CI / Trivy (dependências e segredos) (push) Successful in 11s
CI / Imagem Docker (linux/arm64) (push) Successful in 3m14s

- Add full message catalogs and content for French (fr) and German (de)
- Implement ASCII canonical slugs for French and German routes
- Add language-specific search endpoints (/api/busca/fr, /api/busca/de)
- Configure strict 404 responses for /fr/livro and /de/livro
- Localize SEO, OpenGraph (fr_FR, de_DE), Twitter and JSON-LD schemas
- Add localized code example comments across 14 examples for fr and de
- Enable 'fr' and 'de' in ENABLED_LOCALES with root negotiation and redirect
- Extend test suite in check-i18n, smoke-imagem and verifica-vazamentos

Co-Authored-By: Antigravity <noreply@google.com>
This commit is contained in:
Lucas RayanandAntigravity committed 2026-11-01 22:06:36 -03:00
1 parent 7b673aeb4b
commit 7fce46b9e1
104 files changed
+33369 -686

No files matched your search

+33 -1
View File
@@ -46,6 +46,8 @@ export async function generateMetadata({ params }) {
const { locale } = await params;
const isEn = locale === "en";
const isEs = locale === "es";
const isFr = locale === "fr";
const isDe = locale === "de";
const ogLocaleMap = {
pt: "pt_BR",
@@ -62,12 +64,20 @@ export async function generateMetadata({ params }) {
? "ESPDocs · ESP32 Open Documentation"
: isEs
? "ESPDocs · Documentación abierta de ESP32"
: isFr
? "ESPDocs · Documentation ouverte ESP32"
: isDe
? "ESPDocs · Offene ESP32-Dokumentation"
: "ESPDocs · Documentação do ESP32 em português";
const description = isEn
? "Specifications, pinouts, comparison and selection of 12 ESP32 microcontroller series. Datasheets, peripherals, hardware security and connection diagrams."
: isEs
? "Especificaciones, patillaje, comparación y selección de las 12 series de microcontroladores ESP32. Hojas de datos, periféricos, seguridad en hardware y diagramas de conexión."
: isFr
? "Spécifications, brochages, comparaison et sélection des 12 séries de microcontrôleurs ESP32. Fiches techniques, périphériques, sécurité matérielle et schémas de connexion."
: isDe
? "Spezifikationen, Pinbelegungen, Vergleich und Auswahl der 12 ESP32-Mikrocontrollerserien. Datenblätter, Peripheriegeräte, Hardwaresicherheit und Anschlussdiagramme."
: "Especificações, pinagem, comparação e seleção das 12 séries de microcontroladores ESP32, em português brasileiro. Datasheets, periféricos, segurança em hardware e diagramas de conexão.";
const keywords = isEn
@@ -84,6 +94,20 @@ export async function generateMetadata({ params }) {
"comparar ESP32", "cuál ESP32 elegir", "datasheet ESP32", "hoja de datos ESP32",
"microcontrolador", "Espressif", "ESP-IDF", "IoT", "sistemas embebidos",
]
: isFr
? [
"ESP32", "ESP32 en français", "documentation ESP32", "brochage ESP32", "pinout ESP32",
"ESP32-S3", "ESP32-C3", "ESP32-C6", "ESP32-P4", "ESP32-H2",
"comparer ESP32", "quel ESP32 choisir", "datasheet ESP32", "fiche technique ESP32",
"microcontrôleur", "Espressif", "ESP-IDF", "IoT", "systèmes embarqués",
]
: isDe
? [
"ESP32", "ESP32 auf Deutsch", "ESP32 Dokumentation", "ESP32 Pinbelegung", "ESP32 Pinout",
"ESP32-S3", "ESP32-C3", "ESP32-C6", "ESP32-P4", "ESP32-H2",
"ESP32 vergleichen", "welchen ESP32 wählen", "ESP32 Datenblatt",
"Mikrocontroller", "Espressif", "ESP-IDF", "IoT", "eingebettete Systeme",
]
: [
"ESP32", "ESP32 português", "documentação ESP32", "pinout ESP32",
"ESP32-S3", "ESP32-C3", "ESP32-C6", "ESP32-P4", "ESP32-H2",
@@ -126,6 +150,10 @@ export async function generateMetadata({ params }) {
? "Specifications, pinouts, comparison and selection of 12 ESP32 microcontroller series."
: isEs
? "Especificaciones, patillaje, comparación y selección de las 12 series de microcontroladores ESP32."
: isFr
? "Spécifications, brochages, comparaison et sélection des 12 séries de microcontrôleurs ESP32."
: isDe
? "Spezifikationen, Pinbelegungen, Vergleich und Auswahl der 12 ESP32-Mikrocontrollerserien."
: "Especificações, pinagem, comparação e seleção das 12 séries de microcontroladores ESP32, em português brasileiro.",
},
twitter: {
@@ -135,6 +163,10 @@ export async function generateMetadata({ params }) {
? "Specifications, pinouts, comparison and selection of 12 ESP32 series."
: isEs
? "Especificaciones, patillaje, comparación y selección de las 12 series de ESP32."
: isFr
? "Spécifications, brochages, comparaison et sélection des 12 séries ESP32."
: isDe
? "Spezifikationen, Pinbelegungen, Vergleich und Auswahl der 12 ESP32-Serien."
: "Especificações, pinagem, comparação e seleção das 12 séries de ESP32, em português.",
},
robots: {
@@ -194,7 +226,7 @@ export default async function RootLayout({ children, params }) {
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd.siteESociedade(locale)) }}
/>
</head>
<body className="font-sans antialiased bg-canvas text-ink overflow-x-clip" suppressHydrationWarning>
<body className="font-sans antialiased bg-canvas text-ink overflow-x-clip hyphens-auto" suppressHydrationWarning>
<a
href="#conteudo"
className="sr-only focus:not-sr-only focus:fixed focus:left-4 focus:top-4 focus:z-[200] focus:rounded-full focus:bg-ink focus:px-5 focus:py-3 focus:text-sm focus:font-semibold focus:text-canvas"