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
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:
1 parent
ae61416468
commit
5a9fe676fc
61 files changed
+2517
-920
No files matched your search
@@ -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) {
|
||||
|
||||
Reference in new issue
Block a user