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

+152
View File
@@ -0,0 +1,152 @@
{
"Common": {
"siteName": "ESPDocs",
"author": "Lucas Rayan Guerra",
"organization": "Ciência Embarcada",
"skipToContent": "Passer au contenu",
"allRightsReserved": "Contenu sous licence MIT. Conçu pour la communauté des systèmes embarqués.",
"backToHome": "Retour à l'accueil",
"explore": "Explorer",
"tools": "Outils",
"project": "Projet",
"loading": "Chargement...",
"search": "Rechercher...",
"officialDocumentation": "Documentation officielle",
"community": "Communauté",
"mitLicense": "Licence MIT"
},
"Header": {
"brand": "ESPDocs",
"homeAria": "ESPDocs, page d'accueil",
"navAria": "Navigation principale",
"mobileNavAria": "Navigation mobile",
"openMenu": "Ouvrir le menu de navigation",
"closeMenu": "Fermer le menu",
"navigationTitle": "Navigation",
"whereToGo": "Où aller",
"selectChip": "Sélectionner la puce",
"selectMyChip": "Choisir ma puce",
"hardware": "Matériel",
"hardwareDesc": "12 puces, brochages et spécifications",
"series": "Séries ESP32",
"seriesDesc": "12 puces, brochages et spécifications",
"comparator": "Comparateur",
"comparatorDesc": "Jusqu'à quatre séries côte à côte",
"catalog": "Catalogue de cartes",
"catalogDesc": "DevKits, brochages et points de vente",
"tools": "Outils",
"selector": "Sélecteur intelligent",
"selectorDesc": "La bonne puce pour votre projet",
"diagnostics": "Diagnostic",
"diagnosticsDesc": "Brownout, bootloops, WDT et plus",
"components": "ESP Component Registry",
"componentsDesc": "Pilotes et manifestes idf_component.yml",
"library": "Bibliothèque",
"frameworks": "Frameworks et SDKs",
"frameworksDesc": "ESP-IDF, Arduino, Rust et Matter",
"glossary": "Glossaire technique",
"glossaryDesc": "Termes figurant dans les fiches techniques",
"about": "À propos du projet",
"aboutDesc": "Auteur, méthode et open source"
},
"Footer": {
"ariaLabel": "Pied de page ESPDocs",
"description": "Documentation indépendante de l'écosystème ESP32. Données ouvertes, curation éditoriale et liens vers les sources officielles.",
"exploreTitle": "Explorer",
"toolsTitle": "Outils",
"projectTitle": "Projet",
"authorTitle": "Auteur",
"reportIssue": "Signaler un problème",
"repository": "Dépôt",
"personalSite": "Site personnel",
"linkedin": "LinkedIn"
},
"Home": {
"badge": "Documentation ouverte ESP32",
"titleLine1": "L'ESP32,",
"titleLine2": " sans artifice.",
"lede": "Spécifications, brochages, comparatifs et diagnostics en une seule lecture. Moins d'allers-retours dans les fiches techniques, plus de temps à l'établi.",
"chooseMyChip": "Choisir ma puce",
"exploreSeries": "Explorer les {count} séries",
"seriesCount": "{count} séries de puces",
"frameworkCount": "{count} frameworks",
"portugueseFlag": "100 % en français",
"featuredSeries": "Séries en vedette",
"featuredDesc": "L'essentiel de chaque famille avant d'ouvrir la fiche technique.",
"fullIndex": "Index complet",
"toolsTitle": "Commencez par le problème.",
"toolsEyebrow": "Outils",
"toolsDesc": "Des outils pour sélectionner la bonne puce, diagnostiquer les erreurs matérielles et accélérer le développement."
},
"NotFound": {
"eyebrow": "Erreur 404",
"title": "Cette page n'existe pas.",
"lede": "L'URL a peut-être changé ou a été mal saisie. Choisissez l'un de ces chemins pour continuer.",
"backToHome": "Retour à l'accueil",
"seriesTitle": "Séries ESP32",
"seriesDesc": "12 familles, avec brochages et spécifications.",
"selectorTitle": "Sélecteur de puces",
"selectorDesc": "Répondez à huit questions et trouvez les modèles recommandés.",
"comparatorTitle": "Comparateur",
"comparatorDesc": "Jusqu'à quatre séries côte à côte.",
"glossaryTitle": "Glossaire",
"glossaryDesc": "Termes matériels expliqués clairement."
},
"Sobre": {
"label": "Projet indépendant",
"title": "À propos d'ESPDocs",
"lede": "Une plateforme non officielle organisant les informations techniques sur l'ESP32 et reliant directement à la documentation officielle d'Espressif. Conçue pour la communauté du matériel open source.",
"viewRepository": "Voir le dépôt",
"features": {
"portugueseTitle": "Contenu soigné",
"portugueseDesc": "Des données techniques structurées et présentées clairement, sans le bruit des fiches techniques.",
"visualCompareTitle": "Comparaisons visuelles",
"visualCompareDesc": "Tableaux et diagrammes pour sélectionner la bonne série sans ouvrir dix fiches techniques.",
"centralizedAccessTitle": "Accès centralisé",
"centralizedAccessDesc": "Liens directs vers la documentation officielle, les dépôts et les exemples.",
"openSourceTitle": "Open source",
"openSourceDesc": "Les contributions sont les bienvenues sur Gitea."
}
},
"Series": {
"title": "Séries ESP32",
"description": "12 séries ESP32 côte à côte : ESP32, S2, S3, S31, C2, C3, C5, C6, C61, P4, H2 et H4. Architecture, mémoire, radio, périphériques et brochages de chacune.",
"pinout": "Brochage",
"specifications": "Spécifications",
"peripherals": "Périphériques",
"architecture": "Architecture",
"memory": "Mémoire",
"radio": "Radio",
"security": "Sécurité matérielle"
},
"Catalogo": {
"title": "Catalogue de cartes de développement",
"description": "DevKits officiels et tiers avec brochages, interfaces et liens d'achat.",
"filterBySeries": "Filtrer par série",
"searchBoards": "Rechercher des cartes..."
},
"Comparacao": {
"title": "Comparateur de séries ESP32",
"description": "Comparez jusqu'à 4 séries côte à côte avec les spécifications complètes de traitement, radio, mémoire et brochages."
},
"Componentes": {
"title": "ESP Component Registry",
"description": "Pilotes, bibliothèques et manifestes idf_component.yml prêts à l'emploi pour ESP-IDF."
},
"Diagnostico": {
"title": "Diagnostic et dépannage",
"description": "Brownout, bootloops, paniques de CPU, FreeRTOS et bonnes pratiques matérielles."
},
"Frameworks": {
"title": "Frameworks et SDKs",
"description": "Guides et aperçus des principaux environnements de développement : ESP-IDF, Arduino, MicroPython, Rust et ESP-Matter."
},
"Glossario": {
"title": "Glossaire technique",
"description": "Explications pratiques des concepts matériels, périphériques, radio et architecture présents dans les fiches techniques."
},
"Seletor": {
"title": "Sélecteur intelligent d'ESP32",
"description": "Répondez à des questions objectives sur votre projet et trouvez la série idéale selon des critères techniques."
}
}