{item.termo}
{isDe ? "In der Praxis" : isFr ? "En pratique" : isEs ? "En la práctica" : isEn ? "In practice" : "Na prática"}
"use client"; import { useState, useMemo, useRef } 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 * as glossarioPt from "@/lib/glossarioData"; import * as glossarioEn from "@/lib/data/en/glossario"; import * as glossarioEs from "@/lib/data/es/glossario"; import * as glossarioFr from "@/lib/data/fr/glossario"; import * as glossarioDe from "@/lib/data/de/glossario"; import { getLocalizedHref } from "@/i18n/links"; import { ArrowRight, BookOpen, Check, Code2, Cpu, Database, HelpCircle, LayoutGrid, Lightbulb, Link2, BatteryCharging, RotateCcw, Search, ShieldCheck, Sliders, Sparkles, Wifi, X, } from "lucide-react"; const BUSCAS_POPULARES = ["GPIO", "ULP", "PSRAM", "Strapping Pins", "Deep Sleep", "OTA", "Matter", "Secure Boot", "Wi-Fi 6", "MIPI"]; const ICONES = { Cpu, Database, Wifi, Sliders, Sparkles, BatteryCharging, Code2, ShieldCheck }; /** "Processamento, CPU & Silício" vira "Processamento": cabe no filtro sem truncar. */ const nomeCurto = (nome) => nome.split(/,| &/)[0].trim(); export default function GlossarioPage() { const pathname = usePathname(); const isEn = pathname?.startsWith("/en"); const isEs = pathname?.startsWith("/es"); const isFr = pathname?.startsWith("/fr"); const isDe = pathname?.startsWith("/de"); const currentLocale = isDe ? "de" : isFr ? "fr" : isEs ? "es" : isEn ? "en" : "pt"; const { categoriasGlossario } = isDe ? glossarioDe : isFr ? glossarioFr : isEs ? glossarioEs : isEn ? glossarioEn : glossarioPt; const [busca, setBusca] = useState(""); const [categoriaSelecionada, setCategoriaSelecionada] = useState("todas"); const [letraFiltro, setLetraFiltro] = useState(null); const [copiadoSlug, setCopiadoSlug] = useState(null); const searchInputRef = useRef(null); const todosOsTermos = useMemo( () => categoriasGlossario.flatMap((cat) => cat.termos.map((t) => ({ ...t, categoriaId: cat.id, categoriaNome: cat.nome, categoriaIcone: cat.icone, slug: t.termo.toLowerCase().replace(/[\s()/²]+/g, "-"), primeiraLetra: t.termo.charAt(0).toUpperCase(), })) ), [categoriasGlossario] ); const alfabeto = useMemo(() => { const disponiveis = new Set(todosOsTermos.map((t) => t.primeiraLetra)); return "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("").map((letra) => ({ letra, temTermos: disponiveis.has(letra) })); }, [todosOsTermos]); const termosFiltrados = useMemo(() => { const termoBusca = busca.toLowerCase().trim(); return todosOsTermos.filter((item) => { const matchCategoria = categoriaSelecionada === "todas" || item.categoriaId === categoriaSelecionada; const matchLetra = !letraFiltro || item.primeiraLetra === letraFiltro; const matchBusca = !termoBusca || item.termo.toLowerCase().includes(termoBusca) || item.definicao.toLowerCase().includes(termoBusca) || item.exemplo.toLowerCase().includes(termoBusca) || item.categoriaNome.toLowerCase().includes(termoBusca); return matchCategoria && matchLetra && matchBusca; }); }, [todosOsTermos, categoriaSelecionada, letraFiltro, busca]); const temFiltroAtivo = busca.trim() !== "" || categoriaSelecionada !== "todas" || letraFiltro !== null; const limparTodosFiltros = () => { setBusca(""); setCategoriaSelecionada("todas"); setLetraFiltro(null); searchInputRef.current?.focus(); }; const copiarLinkTermo = (slug) => { const basePath = getLocalizedHref("/glossario", currentLocale); navigator.clipboard.writeText(`${window.location.origin}${basePath}#${slug}`); setCopiadoSlug(slug); setTimeout(() => setCopiadoSlug(null), 2000); }; const total = termosFiltrados.length; return (
{isDe ? "Nichts entspricht Ihrer aktuellen Suche und den Filtern. Versuchen Sie eine kürzere Abkürzung oder wählen Sie alle Kategorien." : isFr ? "Rien ne correspond à votre recherche et à vos filtres actuels. Essayez avec un sigle plus court ou revenez à toutes les catégories." : isEs ? "Nada coincide con la búsqueda y los filtros actuales. Pruebe con una sigla más corta o vuelva a todas las categorías." : isEn ? "Nothing matches your current search and filters. Try a shorter acronym or reset to all categories." : "Nada combina com a busca e os filtros atuais. Tente uma sigla mais curta ou volte para todas as categorias."}
{isDe ? "In der Praxis" : isFr ? "En pratique" : isEs ? "En la práctica" : isEn ? "In practice" : "Na prática"}
{isDe ? "Mit den Begriffen zur Hand vergleichen Sie die Serien Seite an Seite oder nutzen Sie die Auswahlhilfe, um das Modell für Ihr Projekt zu finden." : isFr ? "Avec les termes sous la main, comparez les séries côte à côte ou répondez au sélecteur pour trouver le modèle adapté à votre projet." : isEs ? "Con los términos a mano, compare las series lado a lado o responda al selector para encontrar el modelo que se adapta a su proyecto." : isEn ? "With the terms in hand, compare series side by side or answer the selector to find the model that fits your project." : "Com os termos em mãos, compare as séries lado a lado ou responda ao seletor para chegar ao modelo que cabe no seu projeto."}