"use client"; import { useMemo, useState } from "react"; import { usePathname } from "next/navigation"; import Header from "@/components/Header"; import Footer from "@/components/Footer"; import PageHero from "@/components/PageHero"; import Link from "next/link"; import seriesDataPt from "@/public/series.json"; import seriesDataEn from "@/data/en/series.json"; import seriesDataEs from "@/data/es/series.json"; import seriesDataFr from "@/data/fr/series.json"; import seriesDataDe from "@/data/de/series.json"; import seriesDataZh from "@/data/zh-CN/series.json"; import { getLocalizedHref } from "@/i18n/links"; import { AlertTriangle, ArrowRight, ArrowUpRight, Compass, Home, Scale, ShieldCheck, Sparkles, } from "lucide-react"; const FILTROS_PT = [ { id: "todas", rotulo: "Todas", testa: () => true }, { id: "riscv", rotulo: "RISC-V", testa: (s) => s.arquitetura.includes("RISC-V") }, { id: "xtensa", rotulo: "Xtensa", testa: (s) => !s.arquitetura.includes("RISC-V") }, { id: "matter", rotulo: "Matter", testa: (s) => s.matter === "Sim" }, { id: "ia", rotulo: "Aceleração de IA", testa: (s) => Boolean(s.aceleradores_ia) }, ]; const FILTROS_EN = [ { id: "todas", rotulo: "All", testa: () => true }, { id: "riscv", rotulo: "RISC-V", testa: (s) => s.arquitetura.includes("RISC-V") }, { id: "xtensa", rotulo: "Xtensa", testa: (s) => !s.arquitetura.includes("RISC-V") }, { id: "matter", rotulo: "Matter", testa: (s) => s.matter === "Yes" || s.matter === "Sim" }, { id: "ia", rotulo: "AI Acceleration", testa: (s) => Boolean(s.aceleradores_ia) }, ]; const FILTROS_ES = [ { id: "todas", rotulo: "Todas", testa: () => true }, { id: "riscv", rotulo: "RISC-V", testa: (s) => s.arquitetura.includes("RISC-V") }, { id: "xtensa", rotulo: "Xtensa", testa: (s) => !s.arquitetura.includes("RISC-V") }, { id: "matter", rotulo: "Matter", testa: (s) => s.matter === "Yes" || s.matter === "Sim" || s.matter === "Sí" }, { id: "ia", rotulo: "Aceleración de IA", testa: (s) => Boolean(s.aceleradores_ia) }, ]; const FILTROS_FR = [ { id: "todas", rotulo: "Toutes", testa: () => true }, { id: "riscv", rotulo: "RISC-V", testa: (s) => s.arquitetura.includes("RISC-V") }, { id: "xtensa", rotulo: "Xtensa", testa: (s) => !s.arquitetura.includes("RISC-V") }, { id: "matter", rotulo: "Matter", testa: (s) => s.matter === "Oui" || s.matter === "Yes" || s.matter === "Sim" || s.matter === "Sí" }, { id: "ia", rotulo: "Accélération IA", testa: (s) => Boolean(s.aceleradores_ia) }, ]; const FILTROS_DE = [ { id: "todas", rotulo: "Alle", testa: () => true }, { id: "riscv", rotulo: "RISC-V", testa: (s) => s.arquitetura.includes("RISC-V") }, { id: "xtensa", rotulo: "Xtensa", testa: (s) => !s.arquitetura.includes("RISC-V") }, { id: "matter", rotulo: "Matter", testa: (s) => (s.matter === "Ja" || s.matter === "是") || s.matter === "Yes" || s.matter === "Sim" || s.matter === "Sí" }, { id: "ia", rotulo: "KI-Beschleunigung", testa: (s) => Boolean(s.aceleradores_ia) }, ]; const FILTROS_ZH = [ { id: "todas", rotulo: "全部", testa: () => true }, { id: "riscv", rotulo: "RISC-V", testa: (s) => s.arquitetura.includes("RISC-V") }, { id: "xtensa", rotulo: "Xtensa", testa: (s) => !s.arquitetura.includes("RISC-V") }, { id: "matter", rotulo: "Matter", testa: (s) => String(s.matter).startsWith("是") }, { id: "ia", rotulo: "AI 加速", testa: (s) => Boolean(s.aceleradores_ia) }, ]; /** Marcador de segurança: o recurso que diferencia a série, não o que todas têm. */ function nivelSeguranca(serie, isEn, isEs, isFr, isDe, isZh = false) { const seg = serie.seguranca || {}; if (seg.key_manager === "Sim" || seg.key_manager === "Yes" || seg.key_manager === "Sí" || seg.key_manager === "Oui" || (seg.key_manager === "Ja" || seg.key_manager === "是")) return "Key Manager"; if (String(seg.ecdsa).startsWith("Sim") || String(seg.ecdsa).startsWith("Yes") || String(seg.ecdsa).startsWith("Sí") || String(seg.ecdsa).startsWith("Oui") || (String(seg.ecdsa).startsWith("Ja") || String(seg.ecdsa).startsWith("是"))) { return isZh ? "硬件 ECDSA" : isDe ? "Hardware-ECDSA" : isFr ? "ECDSA matériel" : isEs ? "ECDSA en hardware" : isEn ? "Hardware ECDSA" : "ECDSA em hardware"; } if (String(seg.ecc).startsWith("Sim") || String(seg.ecc).startsWith("Yes") || String(seg.ecc).startsWith("Sí") || String(seg.ecc).startsWith("Oui") || (String(seg.ecc).startsWith("Ja") || String(seg.ecc).startsWith("是"))) { return isZh ? "硬件 ECC" : isDe ? "Hardware-ECC" : isFr ? "ECC matériel" : isEs ? "ECC en hardware" : isEn ? "Hardware ECC" : "ECC em hardware"; } if (String(seg.aes).startsWith("AES")) return "AES + SHA"; return isZh ? "仅 SHA" : isDe ? "Nur SHA" : isFr ? "SHA uniquement" : isEs ? "Solo SHA" : isEn ? "SHA only" : "Só SHA"; } const simPt = (v) => !String(v).includes("Não"); const simEn = (v) => !String(v).includes("No") && !String(v).includes("Não"); const simEs = (v) => !String(v).includes("No") && !String(v).includes("Não"); const simFr = (v) => !String(v).includes("Non") && !String(v).includes("No") && !String(v).includes("Não"); const simDe = (v) => !(String(v).includes("Nein") || String(v).includes("否")) && !String(v).includes("No") && !String(v).includes("Não"); const simZh = (v) => !String(v).includes("否"); export default function Series() { const pathname = usePathname(); const isEn = pathname?.startsWith("/en"); const isEs = pathname?.startsWith("/es"); const isFr = pathname?.startsWith("/fr"); const isDe = pathname?.startsWith("/de"); const isZh = pathname?.startsWith("/zh-CN"); const currentLocale = isZh ? "zh-CN" : isDe ? "de" : isFr ? "fr" : isEs ? "es" : isEn ? "en" : "pt"; const seriesData = isZh ? seriesDataZh : isDe ? seriesDataDe : isFr ? seriesDataFr : isEs ? seriesDataEs : isEn ? seriesDataEn : seriesDataPt; const filtros = isZh ? FILTROS_ZH : isDe ? FILTROS_DE : isFr ? FILTROS_FR : isEs ? FILTROS_ES : isEn ? FILTROS_EN : FILTROS_PT; const [filtro, setFiltro] = useState("todas"); const todas = Object.entries(seriesData); const ativo = filtros.find((f) => f.id === filtro) || filtros[0]; const series = useMemo(() => todas.filter(([, s]) => ativo.testa(s)), [todas, ativo]); return (
{filtros.map((f) => ( ))}

{series.length}{" "} {series.length === 1 ? isZh ? "个系列" : isDe ? "Serie" : isFr ? "série" : isEs ? "serie" : isEn ? "series" : "série" : isZh ? "个系列" : isDe ? "Serien" : isFr ? "séries" : isEs ? "series" : isEn ? "series" : "séries"}

{series.map(([key, serie]) => { const riscv = serie.arquitetura.includes("RISC-V"); const fatos = isZh ? [ ["内核", serie.nucleos], ["频率", serie.frequencia], ["SRAM", serie.memoria_sram], ["Wi-Fi", simZh(serie.wifi) ? "是" : "否"], ["蓝牙", String(serie.bluetooth).includes("否") ? "否" : "是"], serie.consumo_energia?.deep_sleep ? ["深度睡眠", serie.consumo_energia.deep_sleep] : null, ].filter(Boolean) : isDe ? [ ["Kerne", serie.nucleos], ["Taktfrequenz", serie.frequencia], ["SRAM", serie.memoria_sram], ["Wi-Fi", simDe(serie.wifi) ? "Ja" : "Nein"], ["Bluetooth", (String(serie.bluetooth).includes("Nein") || String(serie.bluetooth).includes("否")) || String(serie.bluetooth).includes("No") || String(serie.bluetooth).includes("Não") ? "Nein" : "Ja"], serie.consumo_energia?.deep_sleep ? ["Deep sleep", serie.consumo_energia.deep_sleep] : null, ].filter(Boolean) : isFr ? [ ["Cœurs", serie.nucleos], ["Fréquence", serie.frequencia], ["SRAM", serie.memoria_sram], ["Wi-Fi", simFr(serie.wifi) ? "Oui" : "Non"], ["Bluetooth", String(serie.bluetooth).includes("Non") || String(serie.bluetooth).includes("No") || String(serie.bluetooth).includes("Não") ? "Non" : "Oui"], serie.consumo_energia?.deep_sleep ? ["Deep sleep", serie.consumo_energia.deep_sleep] : null, ].filter(Boolean) : isEs ? [ ["Núcleos", serie.nucleos], ["Frecuencia", serie.frequencia], ["SRAM", serie.memoria_sram], ["Wi-Fi", simEs(serie.wifi) ? "Sí" : "No"], ["Bluetooth", String(serie.bluetooth).includes("No") || String(serie.bluetooth).includes("Não") ? "No" : "Sí"], serie.consumo_energia?.deep_sleep ? ["Deep sleep", serie.consumo_energia.deep_sleep] : null, ].filter(Boolean) : isEn ? [ ["Cores", serie.nucleos], ["Frequency", serie.frequencia], ["SRAM", serie.memoria_sram], ["Wi-Fi", simEn(serie.wifi) ? "Yes" : "No"], ["Bluetooth", String(serie.bluetooth).includes("No") || String(serie.bluetooth).includes("Não") ? "No" : "Yes"], serie.consumo_energia?.deep_sleep ? ["Deep sleep", serie.consumo_energia.deep_sleep] : null, ].filter(Boolean) : [ ["Núcleos", serie.nucleos], ["Frequência", serie.frequencia], ["SRAM", serie.memoria_sram], ["Wi-Fi", simPt(serie.wifi) ? "Sim" : "Não"], ["Bluetooth", serie.bluetooth === "Não" ? "Não" : "Sim"], serie.consumo_energia?.deep_sleep ? ["Deep sleep", serie.consumo_energia.deep_sleep] : null, ].filter(Boolean); return (

{key}

{riscv ? "RISC-V" : "Xtensa"}

{serie.descricao}

{fatos.map(([rotulo, valor]) => (
{rotulo}
{valor}
))}
    {serie.aceleradores_ia && (
  • )}
  • {(serie.matter === "Sim" || serie.matter === "Yes" || serie.matter === "Sí" || serie.matter === "Oui" || (serie.matter === "Ja" || serie.matter === "是")) && (
  • )} {serie.status_documentacao && (
  • )}
{isZh ? "打开数据手册" : isDe ? "Datenblatt öffnen" : isFr ? "Ouvrir la fiche" : isEs ? "Abrir ficha" : isEn ? "Open datasheet" : "Abrir ficha"} ); })}

{isZh ? "在两个系列之间犹豫?" : isDe ? "Unsicher zwischen zwei Serien?" : isFr ? "Vous hésitez entre deux séries ?" : isEs ? "¿Tiene dudas entre dos series?" : isEn ? "Unsure between two series?" : "Ficou em dúvida entre duas séries?"}

{isZh ? "对比工具可把最多四个型号并排放在一起:内核、无线、内存、外设和安全。" : isDe ? "Der Vergleicher stellt bis zu vier Modelle gegenüber: Kerne, Funk, Speicher, Peripherie und Sicherheit." : isFr ? "Le comparateur place jusqu'à quatre modèles côte à côte : cœurs, radio, mémoire, périphériques et sécurité." : isEs ? "El comparador coloca hasta cuatro modelos lado a lado: núcleos, radio, memoria, periféricos y seguridad." : isEn ? "The comparator tool puts up to four models side by side: cores, radio, memory, peripherals, and security." : "O comparador coloca até quatro modelos lado a lado: núcleos, rádio, memória, periféricos e segurança."}

); }