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
Executable
+63
@@ -0,0 +1,63 @@
|
||||
#!/usr/bin/env node
|
||||
// Respostas da busca por idioma: texto no idioma da página e links dentro dele.
|
||||
//
|
||||
// node scripts/verifica-busca.mjs http://127.0.0.1:3998
|
||||
//
|
||||
// O texto das "respostas diretas" é montado no navegador pelo motor; as varreduras
|
||||
// de página não o enxergam. Aqui rodamos o mesmo motor sobre o índice servido.
|
||||
import { preparar, buscar } from "../lib/searchEngine.js";
|
||||
|
||||
const base = process.argv[2];
|
||||
if (!base) {
|
||||
console.error("uso: verifica-busca.mjs <url-base>");
|
||||
process.exit(2);
|
||||
}
|
||||
|
||||
const idiomas = (process.env.LOCALES || "pt en es fr de zh-CN").split(/\s+/);
|
||||
const consultas = {
|
||||
pt: ["flash s3", "gpio26 s3", "pinos usb c6", "deep sleep p4", "psram"],
|
||||
en: ["flash s3", "gpio26 s3", "usb pins c6", "deep sleep p4", "psram"],
|
||||
es: ["flash s3", "gpio26 s3", "usb c6", "deep sleep p4", "psram"],
|
||||
fr: ["flash s3", "gpio26 s3", "usb c6", "deep sleep p4", "psram"],
|
||||
de: ["flash s3", "gpio26 s3", "usb c6", "deep sleep p4", "psram"],
|
||||
"zh-CN": ["s3 闪存", "gpio26 s3", "c6 usb 引脚", "低功耗 p4", "哪款 esp32 有 psram", "安全启动"],
|
||||
};
|
||||
|
||||
// Palavras que só existem em português (as respostas dos outros idiomas não podem ter).
|
||||
const SO_PT = /(ligados à|dados da série|diagrama de pinos|que dependem do modo|já filtrado|em cada série|especificações do|\bcondicionais\b|\bpinos\b)/i;
|
||||
const strings = (r) => [r.titulo, r.descricao, ...(r.linhas ?? []).flatMap((l) => [l.k, l.v]), ...(r.chips ?? [])].filter(Boolean);
|
||||
|
||||
let falhas = 0;
|
||||
for (const loc of idiomas) {
|
||||
const res = await fetch(`${base}/api/busca/${loc}`);
|
||||
if (!res.ok) {
|
||||
console.log(`FALHOU /api/busca/${loc}: ${res.status}`);
|
||||
falhas++;
|
||||
continue;
|
||||
}
|
||||
const indice = preparar(await res.json());
|
||||
for (const q of consultas[loc] ?? consultas.en) {
|
||||
const { resultados } = buscar(indice, q);
|
||||
if (!resultados.length) {
|
||||
console.log(`FALHOU [${loc}] "${q}": sem resultados`);
|
||||
falhas++;
|
||||
continue;
|
||||
}
|
||||
for (const r of resultados.filter((x) => x.tipo === "resposta" || x.tipo === "pino")) {
|
||||
if (loc !== "pt" && !r.href.startsWith(`/${loc}/`)) {
|
||||
console.log(`FALHOU [${loc}] "${q}": link fora do idioma: ${r.href}`);
|
||||
falhas++;
|
||||
}
|
||||
if (loc !== "pt") {
|
||||
for (const s of strings(r)) {
|
||||
if (SO_PT.test(s)) {
|
||||
console.log(`FALHOU [${loc}] "${q}": português em "${s.slice(0, 80)}"`);
|
||||
falhas++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (falhas === 0) console.log(` ✔ Busca: respostas e links corretos em ${idiomas.join(", ")}.`);
|
||||
process.exit(falhas > 0 ? 1 : 0);
|
||||
Reference in new issue
Block a user