# Registro de mudanças Tudo o que muda de relevante no ESPDocs está aqui. O formato segue o [Keep a Changelog](https://keepachangelog.com/pt-BR/1.1.0/) e o projeto segue o [Versionamento Semântico](https://semver.org/lang/pt-BR/). ## [Não lançado] ## [1.6.1] - 2026-11-02 ### Corrigido - A página do livro (`/pt/livro`) dizia ao Google que o endereço canônico dela era a home (`/pt`) e listava as homes dos outros idiomas como alternativas, o que a fazia parecer duplicata da home. O livro agora é o próprio canonical e não tem alternativas, já que só existe em português. O sitemap também passou a trazer o `x-default`. - Em francês e alemão, os avisos dos pinos (tensões recomendadas, "não deixe flutuando", descrições dos pinos do ESP32-S31 e do ESP32-C61 e outros) estavam em inglês, e mais alguns valores ainda em português (por exemplo "e mais 11", "com GCM", "ou ECDSA"); espanhol e inglês tinham alguns resíduos. Tudo traduzido. - As categorias dos pinos (`Antena`, `Strapping`, `Power`…) são identificadores, mas estavam traduzidas nos dados de inglês, francês, alemão e chinês. Com isso o filtro por categoria do diagrama de pinos não funcionava nesses idiomas. Restauradas. - A seção "Pinos com restrição de uso" e a busca agrupavam os pinos de forma diferente do português em inglês, francês, alemão e chinês (por exemplo, pinos da flash aparecendo como "condicionais", ou pinos de UART contados como flash). Os padrões de texto agora seguem o que está escrito em cada idioma e dão o mesmo resultado nos seis. - No seletor de chip, o teste de "USB OTG 2.0" nunca casava com os dados; passou a reconhecer o USB 2.0 High-Speed (ESP32-P4 e ESP32-S31). ### Adicionado - `scripts/verifica-seo.py` (canonical, `hreflang` e `lang` de todas as URLs do sitemap, comparados com o sitemap) e `scripts/verifica-pinos-*.mjs` (classificação dos pinos igual em todos os idiomas, no `npm run check`). O `check-i18n` também procura frases em inglês e mais palavras só-portuguesas nos dados dos outros idiomas. ## [1.6.0] - 2026-11-02 ### Adicionado - Chinês simplificado (`/zh-CN`), o sexto idioma do site, com o mesmo conteúdo dos demais, menos o livro (`/zh-CN/livro` responde 404): - Interface, séries, frameworks, diagramas de pinos, glossário, diagnóstico, componentes e exemplos de código com comentários em chinês (mensagens de log dos exemplos ficam em inglês, para não aparecerem quebradas no monitor serial). - Busca em chinês: o motor entende consultas como `s3 闪存`, `c6 usb 引脚` ou `哪款 esp32 有 psram`, segmentando o texto com `Intl.Segmenter`. - SEO próprio (`hreflang`, sitemap, JSON-LD em `zh-CN`) e negociação da raiz: `Accept-Language` com `zh`, `zh-Hans` ou `zh-TW` leva a `/zh-CN`. - O filtro alfabético A–Z do glossário não aparece em chinês. - `scripts/verifica-busca.mjs`, chamado pelo teste de fumaça: roda o motor de busca sobre o índice de cada idioma e confere que as respostas e os links estão no idioma da página. - `check-i18n` passa a procurar português dentro dos dados dos outros idiomas. ### Corrigido - Na busca, as respostas diretas (por exemplo "Flash no ESP32-S3", "Dados da série", "Pinos do ESP32-S3 ligados à memória flash") saíam em português em inglês, espanhol, francês e alemão, e levavam a `/series/...` em vez do idioma da página. Agora textos e links seguem o idioma. - Em francês e alemão, valores de ADC, SPI, toque capacitivo, consumo e outros ainda estavam em português (por exemplo "até 18 canais", "conforme a carga"); em espanhol, dois valores de consumo. Todos traduzidos. - O seletor de chip reconhecia "Sim"/"Yes" para Matter, Arduino e segurança, mas não "Sí", "Oui" nem "Ja"; agora reconhece os seis idiomas. - A home em alemão mostrava "14 frameworks" em minúscula. ## [1.5.0] - 2026-11-02 ### Adicionado - Internacionalização completa para os idiomas Francês (`fr`) e Alemão (`de`) (Fase 5): - Ativação do francês e do alemão em `ENABLED_LOCALES = ["pt", "en", "es", "fr", "de"]` e no seletor de idiomas do cabeçalho. - Tradução técnica integral e paridade estrutural em `messages/fr.json` e `messages/de.json` (15 namespaces), nos arquivos de dados em `data/{fr,de}/` (`series.json`, `frameworks.json`, `conexoes/*.json`) e `lib/data/{fr,de}/` (`glossario.js`, `diagnostico.js`, `componentes.js`, `topicos.js`). - Tradução técnica natural com tratamento formal respeitado: "vous" em francês e "Sie" em alemão. - 14 exemplos práticos de código com comentários em francês e 14 em alemão em `public/exemplos/{fr,de}/`. - Slugs canônicos ASCII por idioma: - Francês: `/fr/series`, `/fr/catalogue`, `/fr/comparaison`, `/fr/composants`, `/fr/diagnostic`, `/fr/frameworks`, `/fr/glossaire`, `/fr/selecteur`, `/fr/a-propos`. - Alemão: `/de/serien`, `/de/katalog`, `/de/vergleich`, `/de/komponenten`, `/de/diagnose`, `/de/frameworks`, `/de/glossar`, `/de/auswahl`, `/de/ueber-uns`. - Busca dedicada por idioma em `/api/busca/fr` e `/api/busca/de` com normalização de acentos, caracteres alemães (ä, ö, ü, ß) e ligaduras francesas (œ, æ), sem menção ao livro e com links diretos aos slugs canônicos. - Exclusão total e estrita de referências ao livro fora do português, com `/fr/livro` e `/de/livro` respondendo HTTP 404 estrito. - Tabela do catálogo de placas com colunas traduzidas e mapeamento de valores técnicos nos idiomas francês e alemão. - Negociação de idioma na raiz com roteamento para `fr` ou `de` com base nos cabeçalhos Accept-Language ou cookies `NEXT_LOCALE=fr` / `NEXT_LOCALE=de`, e fallback padrão para `en` para navegadores com o idioma inativo restante (`zh-CN`). - Metadados de SEO, Open Graph e Twitter Cards localizados com `og:locale` (`fr_FR`, `de_DE`), `inLanguage` (`fr`, `de`) e `hreflang` cruzado entre `pt-BR`, `en`, `es-419`, `fr-FR`, `de-DE` e `x-default`. - Suporte CSS com hifenação automática (`hyphens: auto`) para alemão e francês via atributo `lang` dinâmico no layout raiz. - Extensão da suíte de verificação: `scripts/check-i18n.mjs` valida `fr` e `de`, `scripts/smoke-imagem.sh` testa as rotas francesas e alemãs e `scripts/verifica-vazamentos.py` varre todas as 36 rotas em francês e 36 em alemão (texto visível e blocos JSON-LD). ### Corrigido - O cabeçalho passou a caber em telas estreitas. Desde o seletor de idioma, a faixa de ícones ficava com ~410 px de largura mínima e o botão do menu era cortado em celulares (390 e 360 px). Agora o seletor fica compacto no celular e o logo mostra só o ícone abaixo de 360 px; sem rolagem horizontal de 320 px para cima. ## [1.4.2] - 2026-11-02 ### Corrigido - A release passa os segredos ao workflow de CI que chama (`secrets: inherit`). Sem isso, uma release que precisava construir a imagem falhava no login do registro. - Inclui a correção da 1.4.1: a tag `v1.4.1` não chegou a ter release, porque a CI dela falhou pelo problema acima. ## [1.4.1] - 2026-11-01 ### Corrigido - As fotos das placas de desenvolvimento oficiais na página de cada série foram feitas para fundo claro e ficavam ruins no tema escuro. O quadro delas agora é sempre branco, nos dois temas; o resto do site continua seguindo o tema. ## [1.4.0] - 2026-11-01 ### Adicionado - Internacionalização completa para o idioma espanhol neutro latino-americano (`es`) (Fase 4): - Ativação do espanhol em `ENABLED_LOCALES = ["pt", "en", "es"]` e no seletor de idiomas do cabeçalho. - Tradução técnica integral e paridade estrutural em `messages/es.json` (15 namespaces) e arquivos de dados em `data/es/` (`series.json`, `frameworks.json`, `conexoes/*.json`) e `lib/data/es/` (`glossario.js`, `diagnostico.js`, `componentes.js`, `topicos.js`). - 14 exemplos práticos de código com comentários em espanhol em `public/exemplos/es/`. - Roteamento com slugs canônicos em espanhol (`/es/catalogo`, `/es/comparacion`, `/es/componentes`, `/es/diagnostico`, `/es/frameworks`, `/es/glosario`, `/es/selector`, `/es/acerca`). - Busca por idioma em `/api/busca/es` com normalização de acentos e 'ñ', sem menção ao livro e com links para os slugs canônicos em espanhol. - Exclusão total e estrita de referências ao livro no idioma espanhol (menu, rodapé, busca, sitemap e metadados), mantendo `/es/livro` respondendo HTTP 404. - Tabela de catálogo com cabeçalhos traduzidos e mapeamento de valores na interface em espanhol. - Negociação de idioma na raiz com roteamento para `es` para cabeçalhos Accept-Language `es-*` ou cookie `NEXT_LOCALE=es`, e fallback padrão para `en` para navegadores com idiomas inativos (`fr`, `de`, `zh-CN`). - Metadados de SEO, Open Graph e Twitter Cards localizados com `og:locale` (`es_419`), `inLanguage` (`es-419`) e `hreflang` cruzado entre `pt-BR`, `en`, `es-419` e `x-default`. - Extensão dos scripts de verificação: `scripts/check-i18n.mjs` valida `es`, `scripts/smoke-imagem.sh` testa as rotas espanholas e `scripts/verifica-vazamentos.py` varre as 36 rotas em espanhol (texto visível e JSON-LD). ## [1.3.0] - 2026-11-01 ### Adicionado - Internacionalização completa para o idioma inglês (`en`) (Fase 3): - Ativação do inglês em `ENABLED_LOCALES = ["pt", "en"]` com reexibição do seletor de idiomas no cabeçalho. - Tradução técnica integral e paridade estrutural em `messages/en.json` (15 namespaces) e arquivos de dados em `data/en/` (`series.json`, `frameworks.json`, `conexoes/*.json`) e `lib/data/en/` (`glossario.js`, `diagnostico.js`, `componentes.js`, `topicos.js`). - 14 exemplos práticos de código com comentários em inglês em `public/exemplos/en/`. - Roteamento com slugs canônicos em inglês (`/en/catalog`, `/en/compare`, `/en/components`, `/en/diagnostics`, `/en/frameworks`, `/en/glossary`, `/en/selector`, `/en/about`). - Índice de busca dedicado por idioma em `/api/busca/[locale]`, com links direcionando aos slugs do idioma correspondente e caixa de busca localizada. - Exclusão total e estrita de referências ao livro no idioma inglês (menu, rodapé, busca, sitemap e metadados), mantendo `/en/livro` respondendo HTTP 404. - Tabela de catálogo com cabeçalhos traduzidos e mapeamento de valores na interface inglesa. - Negociação de idioma na raiz com fallback padrão para `en` para navegadores com idiomas inativos ou genéricos, e redirecionamento 307 de prefixos inativos (`es`, `fr`, `de`, `zh-CN`) para `/en` preservando o mapeamento de slugs. - Metadados de SEO, Open Graph e Twitter Cards localizados, com `hreflang` cruzado entre `pt-BR`, `en` e `x-default`. - Verificações permanentes contra vazamento de português no inglês: `scripts/check-i18n.mjs` falha em textos idênticos entre `pt` e `en` (fora de uma lista de termos técnicos), e `scripts/verifica-vazamentos.py`, chamado pelo teste de fumaça da CI, varre as 36 rotas em inglês, texto visível e JSON-LD. ### Alterado - A raiz `/` passa a levar quem não fala português ao inglês (`/en`); o português continua em `/pt`. Idiomas ainda sem tradução (`es`, `fr`, `de`, `zh-CN`) redirecionam para `/en`. ## [1.2.0] - 2026-11-01 ### Adicionado - Infraestrutura de internacionalização com `next-intl` (Fase 1): - Roteamento com prefixo de idioma sob `app/[locale]/`, com 6 locales declarados (`pt`, `en`, `es`, `fr`, `de`, `zh-CN`). - `middleware.js` com negociação de idioma na raiz por cookie `NEXT_LOCALE` e cabeçalho `Accept-Language` (com pesos `q`), redirecionamento 308 de URLs antigas sem prefixo para `/pt/`, e retorno 404 para `/livro` fora do português. - Seletor de idiomas acessível no cabeçalho com atalho para os 6 idiomas, persistência via cookie `NEXT_LOCALE` e mapeamento de rota correspondente. - Regras de tipografia de sistema CJK para `zh-CN` e hifenização/quebra de palavras para `de` e `fr`. - Extração de strings e dados canônicos (Fase 2): - Catálogo de mensagens canônico `messages/pt.json` cobrindo 15 namespaces de páginas e componentes sem alteração de conteúdo. - Conjunto de dados canônicos em `data/pt/` (`series.json`, `frameworks.json`, `conexoes/*.json`) e módulos em `lib/data/pt/` (`glossario.js`, `diagnostico.js`, `componentes.js`, `topicos.js`) com carregadores por locale em `lib/data/index.js`. - Script automatizado de validação `check:i18n` integrado ao `npm run check`, verificando paridade de chaves, ausência de valores vazios e garantia estrita de ausência de referências ao livro fora do português. - Controle de idiomas ativos e proteção contra conteúdo não traduzido: - Configuração centralizada em `i18n/links.js` (`ENABLED_LOCALES`), atualmente restrita a `["pt"]`. - Redirecionamento 307 de qualquer prefixo de idioma inativo para `/pt` preservando o caminho ou mapeamento equivalente. - Negociação de idioma na raiz selecionando unicamente entre os idiomas ativos (com fallback em `pt`). - Seletor de idiomas no cabeçalho oculto enquanto apenas um idioma estiver ativo. - Sitemap, hreflang/alternates e build SSG restritos aos idiomas ativos. ### Alterado - Todas as páginas passam a viver sob `/pt/` (por exemplo `/pt/series`). As URLs antigas, sem prefixo, redirecionam com 308 para o endereço novo, e a raiz `/` redireciona para o idioma negociado. O conteúdo do site em português não mudou. - O teste de subida da imagem na CI virou `scripts/smoke-imagem.sh`: confere as rotas de cada idioma, a negociação de `Accept-Language`, os redirects 308 das URLs antigas, o 404 do livro fora do português e a metadata no `
`, e falha se o servidor registrar erro de render. O `curl` só na raiz deixou passar uma home quebrada. - A metadata (título, `canonical`, Open Graph) sempre sai no `` do HTML inicial, para qualquer cliente, como já era antes do i18n. - A raiz `/` redireciona direto para `/