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

+73 -10
View File
@@ -322,6 +322,66 @@ const GRUPOS_DE = [
combina: (avisos) => /unbeschaltet|floating/i.test(avisos),
},
];
const GRUPOS_ZH = [
{
id: "entrada",
titulo: "仅输入",
icone: ArrowDownToLine,
cor: "text-accent",
explicacao:
"仅能作输入的引脚。它们不能配置为输出,也没有内部上拉或下拉电阻。如有需要,请在外部电路中添加。",
combina: (avisos) => /仅为输入|仅输入|input[- ]only/i.test(avisos),
},
{
id: "flash",
titulo: "连接到闪存/PSRAM",
icone: HardDrive,
cor: "text-copper",
explicacao:
"已连接到存放并执行固件的存储器。把它们当作通用 GPIO 使用,通常会使芯片崩溃或破坏程序执行。在带内置闪存的模组中,这些引脚不会引出到封装引脚上。",
combina: (avisos) =>
/(flash|psram)/i.test(avisos) &&
/(专用于|存储使用|不得用于|不建议|dedicated to)/i.test(avisos),
},
{
id: "strapping",
titulo: "启动配置引脚(Strapping,启动模式)",
icone: Power,
cor: "text-gold",
explicacao:
"芯片在复位期间会对这些引脚的逻辑电平采样,以决定启动模式。启动完成后可以使用它们,但外部电路在复位期间不能把它们强制到错误的电平,否则开发板将无法启动,或意外进入下载模式。",
combina: (avisos, cats) =>
cats.includes("Strapping") ||
/strapping|启动模式|启动配置|boot mode/i.test(avisos),
},
{
id: "debug",
titulo: "烧录与调试",
icone: Bug,
cor: "text-accent",
explicacao:
"这些是用于烧录的 UART 和 JTAG 线。它们仍可用作 GPIO,但一旦复用,就必须先断开所接外设,才能对开发板烧录和调试。",
combina: (avisos, cats) => /调试|烧录|debugging/i.test(avisos) || cats.includes("JTAG"),
},
{
id: "usb",
titulo: "原生 USB",
icone: Usb,
cor: "text-accent",
explicacao:
"默认连接到内部的 USB Serial/JTAG 控制器。要把它们用作 GPIO,就必须禁用该外设,同时也会失去直接通过 USB 烧录的能力。",
combina: (avisos) => /usb serial\/jtag|usb_d[+-]/i.test(avisos),
},
{
id: "eletrico",
titulo: "不能悬空",
icone: Zap,
cor: "text-gold",
explicacao:
"需要确定的硬件逻辑电平:外部上拉或 RC 延时电路。悬空会导致随机复位或启动不稳定。",
combina: (avisos) => /浮空|悬空|floating/i.test(avisos),
},
];
/** Nome do pino + o GPIO correspondente, quando o nome é uma função (ex.: SENSOR_VP). */
function rotuloDoPino(pino) {
@@ -329,14 +389,14 @@ function rotuloDoPino(pino) {
return gpio && gpio !== pino.nome ? `${pino.nome} · ${gpio}` : pino.nome;
}
function derivarGrupos(conexoes, isEn, isEs, isFr, isDe) {
function derivarGrupos(conexoes, isEn, isEs, isFr, isDe, isZh = false) {
const listaGrupos = isEn
? GRUPOS_EN
: isEs
? GRUPOS_ES
: isFr
? GRUPOS_FR
: isDe
: isZh ? GRUPOS_ZH : isDe
? GRUPOS_DE
: GRUPOS_PT;
return listaGrupos.map((grupo) => {
@@ -354,15 +414,16 @@ function derivarGrupos(conexoes, isEn, isEs, isFr, isDe) {
}).filter((g) => g.pinos.length > 0);
}
export default function PinRestrictions({ conexoes, serieKey, isEn = false, isEs = false, isFr = false, isDe = false, locale }) {
export default function PinRestrictions({ conexoes, serieKey, isEn = false, isEs = false, isFr = false, isDe = false, isZh = false, locale }) {
if (!conexoes?.length) return null;
const effectiveIsEn = isEn || locale === "en";
const effectiveIsEs = isEs || locale === "es";
const effectiveIsFr = isFr || locale === "fr";
const effectiveIsDe = isDe || locale === "de";
const effectiveIsZh = isZh || locale === "zh-CN";
const grupos = derivarGrupos(conexoes, effectiveIsEn, effectiveIsEs, effectiveIsFr, effectiveIsDe);
const grupos = derivarGrupos(conexoes, effectiveIsEn, effectiveIsEs, effectiveIsFr, effectiveIsDe, effectiveIsZh);
if (!grupos.length) return null;
const totalPinos = new Set(grupos.flatMap((g) => g.pinos)).size;
@@ -379,7 +440,7 @@ export default function PinRestrictions({ conexoes, serieKey, isEn = false, isEs
? "Pines con restricción de uso"
: effectiveIsFr
? "Broches avec restrictions d'utilisation"
: effectiveIsDe
: effectiveIsZh ? "有使用限制的引脚" : effectiveIsDe
? "Pins mit Nutzungseinschränkungen"
: "Pinos com restrição de uso"}
</h2>
@@ -397,7 +458,9 @@ export default function PinRestrictions({ conexoes, serieKey, isEn = false, isEs
<>
Toutes les broches de l&apos;{serieKey} ne sont pas libres pour un usage général. {totalPinos} d&apos;entre elles ont des conditions : occupées par la mémoire, lues pendant le démarrage ou fonctionnent uniquement en entrée. Pensez à vérifier avant de finaliser votre schéma.
</>
) : effectiveIsDe ? (
) : effectiveIsZh ? ( <>
{serieKey} 上并非每个引脚都可以随意用作通用 IO。其中有 {totalPinos} 个带有使用条件:被存储器占用、在启动时被读取,或只能作输入。在定稿原理图之前,建议先核对一遍。
</> ) : effectiveIsDe ? (
<>
Nicht jeder Pin des {serieKey} steht für allgemeine Zwecke frei zur Verfügung. {totalPinos} davon unterliegen Bedingungen: durch Speicher belegt, beim Booten abgefragt oder reine Eingangspins. Prüfen Sie dies vor Abschluss Ihres Schaltplans.
</>
@@ -425,7 +488,7 @@ export default function PinRestrictions({ conexoes, serieKey, isEn = false, isEs
? "pin"
: effectiveIsFr
? "broche"
: effectiveIsDe
: effectiveIsZh ? "个引脚" : effectiveIsDe
? "Pin"
: "pino"
: effectiveIsEn
@@ -434,7 +497,7 @@ export default function PinRestrictions({ conexoes, serieKey, isEn = false, isEs
? "pines"
: effectiveIsFr
? "broches"
: effectiveIsDe
: effectiveIsZh ? "个引脚" : effectiveIsDe
? "Pins"
: "pinos"}
</span>
@@ -461,14 +524,14 @@ export default function PinRestrictions({ conexoes, serieKey, isEn = false, isEs
"Estos grupos proceden de los mismos datos que el diagrama de conexiones. Allí podrá consultar pino a pino todas las funciones, el dominio de alimentación y los avisos completos."
) : effectiveIsFr ? (
"Ces groupes sont issus des mêmes données que le schéma de brochage. Vous pouvez y consulter broche par broche l'ensemble des fonctions, le domaine d'alimentation et les remarques complètes."
) : effectiveIsDe ? (
) : effectiveIsZh ? ( "这些分组来自与连接图相同的数据。在那里可以逐个引脚查看全部功能、供电域和完整的警告。" ) : effectiveIsDe ? (
"Diese Gruppen stammen aus denselben Daten wie das Pinbelegungsdiagramm. Dort finden Sie für jeden Pin alle Funktionen, den Spannungsbereich und die vollständigen Entwicklungshinweise."
) : (
"Estes grupos vêm dos mesmos dados do diagrama de conexões. Lá você vê pino a pino todas as funções, o domínio de alimentação e os avisos completos."
)}
</p>
<Link href="#connections" className="btn btn-ghost shrink-0">
{effectiveIsEn ? "Open pinout diagram" : effectiveIsEs ? "Abrir diagrama de pines" : effectiveIsFr ? "Ouvrir le brochage" : effectiveIsDe ? "Pinbelegung öffnen" : "Abrir diagrama de pinos"}
{effectiveIsEn ? "Open pinout diagram" : effectiveIsEs ? "Abrir diagrama de pines" : effectiveIsFr ? "Ouvrir le brochage" : effectiveIsZh ? "打开引脚图" : effectiveIsDe ? "Pinbelegung öffnen" : "Abrir diagrama de pinos"}
<ArrowRight className="h-4 w-4" aria-hidden="true" />
</Link>
</div>