feat(i18n): Simplified Chinese (zh-CN), search answers per locale, fr/de/es data fixes
CI / Lint e auditorias (push) Successful in 1m10s
CI / Trivy (dependências e segredos) (push) Successful in 12s
CI / Imagem Docker (linux/arm64) (push) Successful in 2m39s
Release / Plano (reaproveitar a imagem?) (push) Successful in 6s
Release / ci (push) Skipped
Release / Publica a imagem (linux/arm64) (push) Successful in 18s
Release / Cria a release no Gitea (push) Successful in 5s

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Lucas RayanandClaude Sonnet 5.5 committed 2026-11-01 23:28:39 -03:00
1 parent ae61416468
commit 5a9fe676fc
61 files changed
+2517 -920

No files matched your search

+38
View File
@@ -620,6 +620,43 @@ function verificarRegrasLivro() {
}
}
// ---------------------------------------------------------------------------
// 5. Português dentro dos dados de outros idiomas
// ---------------------------------------------------------------------------
// Valores que começam com número ("4 (SPI0/1 para Flash...)") passam pela allowlist
// técnica; esta varredura pega o texto em português que sobra dentro deles.
const PALAVRAS_SO_PORTUGUESAS = /\b(até|canais|uso geral|conforme a carga|podem ser|saída|resolução|integrada no|encapsulamento|memória|não|única|isócronos|proximidade e)\b/i;
function percorrer(valor, caminho, aoAchar) {
if (typeof valor === "string") {
if (PALAVRAS_SO_PORTUGUESAS.test(valor)) aoAchar(caminho, valor);
} else if (Array.isArray(valor)) {
valor.forEach((v, i) => percorrer(v, `${caminho}[${i}]`, aoAchar));
} else if (valor && typeof valor === "object") {
for (const [k, v] of Object.entries(valor)) percorrer(v, `${caminho}.${k}`, aoAchar);
}
}
function verificarPortuguesNosDados() {
console.log(`\n${CORES.negrito}${CORES.ciano}[5/5] Português dentro dos dados de outros idiomas${CORES.reset}`);
let achados = 0;
for (const loc of LOCALES) {
if (loc === "pt") continue;
const arquivos = [`data/${loc}/series.json`, `data/${loc}/frameworks.json`];
const dirCon = `data/${loc}/conexoes`;
if (existsSync(dirCon)) for (const a of readdirSync(dirCon)) arquivos.push(join(dirCon, a));
for (const arq of arquivos) {
if (!existsSync(arq)) continue;
percorrer(JSON.parse(readFileSync(arq, "utf8")), arq, (caminho, valor) => {
if (achados < 10) falha(`'${loc}': texto em português em ${caminho}: "${valor.slice(0, 80)}"`);
achados++;
});
}
}
if (achados === 0) sucesso("Nenhum texto em português nos dados dos outros idiomas.");
else if (achados > 10) falha(`... e mais ${achados - 10} ocorrência(s).`);
}
async function main() {
console.log(`${CORES.negrito}${CORES.azul}======================================================${CORES.reset}`);
console.log(`${CORES.negrito}${CORES.azul} ESPDocs · Verificação de Internacionalização (i18n) ${CORES.reset}`);
@@ -629,6 +666,7 @@ async function main() {
verificarOutrosIdiomas(ptMessages);
await verificarDadosPorIdioma();
verificarRegrasLivro();
verificarPortuguesNosDados();
console.log(`\n${CORES.negrito}------------------------------------------------------${CORES.reset}`);
if (totalErros === 0 && totalAvisos === 0) {