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
@@ -4,6 +4,7 @@ import { categoriasGlossario as categoriasGlossarioEn } from "@/lib/data/en/glos
|
||||
import { categoriasGlossario as categoriasGlossarioEs } from "@/lib/data/es/glossario.js";
|
||||
import { categoriasGlossario as categoriasGlossarioFr } from "@/lib/data/fr/glossario.js";
|
||||
import { categoriasGlossario as categoriasGlossarioDe } from "@/lib/data/de/glossario.js";
|
||||
import { categoriasGlossario as categoriasGlossarioZh } from "@/lib/data/zh-CN/glossario.js";
|
||||
|
||||
export async function generateMetadata({ params }) {
|
||||
const { locale } = await params;
|
||||
@@ -11,6 +12,7 @@ export async function generateMetadata({ params }) {
|
||||
const isEs = locale === "es";
|
||||
const isFr = locale === "fr";
|
||||
const isDe = locale === "de";
|
||||
const isZh = locale === "zh-CN";
|
||||
return paginaMeta({
|
||||
titulo: isEs
|
||||
? "Glosario técnico de ESP32: Términos y conceptos"
|
||||
@@ -18,7 +20,7 @@ export async function generateMetadata({ params }) {
|
||||
? "ESP32 Technical Glossary: Terms and Concepts"
|
||||
: isFr
|
||||
? "Glossaire technique de l'ESP32 : termes et concepts"
|
||||
: isDe
|
||||
: isZh ? "ESP32 技术术语表:术语与概念" : isDe
|
||||
? "Technisches ESP32-Glossar: Begriffe und Konzepte"
|
||||
: "Glossário Técnico do ESP32: Termos e Conceitos",
|
||||
descricao: isEs
|
||||
@@ -27,7 +29,7 @@ export async function generateMetadata({ params }) {
|
||||
? "Over 50 essential ESP32 concepts explained: GPIO, Strapping Pins, ULP, PSRAM, FreeRTOS, eFuse, Deep Sleep, OTA, Secure Boot, ECDSA, Matter, and Thread."
|
||||
: isFr
|
||||
? "Plus de 50 concepts essentiels de l'ESP32 expliqués : GPIO, Strapping Pins, ULP, PSRAM, FreeRTOS, eFuse, Deep Sleep, OTA, Secure Boot, ECDSA, Matter et Thread."
|
||||
: isDe
|
||||
: isZh ? "50 多个 ESP32 生态的核心术语与概念详解:GPIO、启动配置引脚(Strapping)、ULP、PSRAM、FreeRTOS、eFuse、Deep Sleep、OTA、Secure Boot、ECDSA、Matter 和 Thread。" : isDe
|
||||
? "Über 50 wichtige ESP32-Konzepte verständlich erklärt: GPIO, Strapping-Pins, ULP, PSRAM, FreeRTOS, eFuse, Deep Sleep, OTA, Secure Boot, ECDSA, Matter und Thread."
|
||||
: "Mais de 50 termos e conceitos essenciais do ecossistema ESP32 explicados em português: GPIO, Strapping Pins, ULP, PSRAM, FreeRTOS, eFuse, Deep Sleep, OTA, Secure Boot, ECDSA, Matter e Thread.",
|
||||
caminho: "/glossario",
|
||||
@@ -62,7 +64,7 @@ export async function generateMetadata({ params }) {
|
||||
"termes techniques microcontrôleur",
|
||||
"concepts matériels ESP32",
|
||||
]
|
||||
: isDe
|
||||
: isZh ? ["ESP32 术语表", "什么是 GPIO", "什么是启动配置引脚", "什么是 ESP32 ULP", "什么是 ESP32 PSRAM", "微控制器技术术语", "ESP32 概念"] : isDe
|
||||
? [
|
||||
"ESP32 Glossar",
|
||||
"was ist GPIO",
|
||||
@@ -90,8 +92,9 @@ export default async function GlossarioLayout({ children, params }) {
|
||||
const isEs = locale === "es";
|
||||
const isFr = locale === "fr";
|
||||
const isDe = locale === "de";
|
||||
const categorias = isEs ? categoriasGlossarioEs : isEn ? categoriasGlossarioEn : isFr ? categoriasGlossarioFr : isDe ? categoriasGlossarioDe : categoriasGlossarioPt;
|
||||
const canonPath = isEs ? "/es/glosario" : isEn ? "/en/glossary" : isFr ? "/fr/glossaire" : isDe ? "/de/glossar" : "/glossario";
|
||||
const isZh = locale === "zh-CN";
|
||||
const categorias = isEs ? categoriasGlossarioEs : isEn ? categoriasGlossarioEn : isFr ? categoriasGlossarioFr : isZh ? categoriasGlossarioZh : isDe ? categoriasGlossarioDe : categoriasGlossarioPt;
|
||||
const canonPath = isEs ? "/es/glosario" : isEn ? "/en/glossary" : isFr ? "/fr/glossaire" : isZh ? "/zh-CN/glossary" : isDe ? "/de/glossar" : "/glossario";
|
||||
|
||||
return (
|
||||
<>
|
||||
@@ -106,8 +109,8 @@ export default async function GlossarioLayout({ children, params }) {
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: JSON.stringify(
|
||||
jsonLd.trilha([
|
||||
{ nome: isEs ? "Inicio" : isEn ? "Home" : isFr ? "Accueil" : isDe ? "Startseite" : "Início", caminho: isEs ? "/es" : isEn ? "/en" : isFr ? "/fr" : isDe ? "/de" : "/" },
|
||||
{ nome: isEs ? "Glosario técnico" : isEn ? "Technical Glossary" : isFr ? "Glossaire technique" : isDe ? "Technisches Glossar" : "Glossário Técnico", caminho: canonPath },
|
||||
{ nome: isEs ? "Inicio" : isEn ? "Home" : isFr ? "Accueil" : isZh ? "首页" : isDe ? "Startseite" : "Início", caminho: isEs ? "/es" : isEn ? "/en" : isFr ? "/fr" : isZh ? "/zh-CN" : isDe ? "/de" : "/" },
|
||||
{ nome: isEs ? "Glosario técnico" : isEn ? "Technical Glossary" : isFr ? "Glossaire technique" : isZh ? "技术术语表" : isDe ? "Technisches Glossar" : "Glossário Técnico", caminho: canonPath },
|
||||
])
|
||||
),
|
||||
}}
|
||||
@@ -117,14 +120,14 @@ export default async function GlossarioLayout({ children, params }) {
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: JSON.stringify(
|
||||
jsonLd.aplicacaoWeb({
|
||||
nome: isEs ? "Glosario técnico de ESP32" : isEn ? "ESP32 Technical Glossary" : isFr ? "Glossaire technique de l'ESP32" : isDe ? "Technisches ESP32-Glossar" : "Glossário Técnico do ESP32",
|
||||
nome: isEs ? "Glosario técnico de ESP32" : isEn ? "ESP32 Technical Glossary" : isFr ? "Glossaire technique de l'ESP32" : isZh ? "ESP32 技术术语表" : isDe ? "Technisches ESP32-Glossar" : "Glossário Técnico do ESP32",
|
||||
descricao: isEs
|
||||
? "Enciclopedia de términos técnicos y conceptos de hardware y software del ecosistema ESP32."
|
||||
: isEn
|
||||
? "Encyclopedia of hardware and software technical terms for the ESP32 ecosystem."
|
||||
: isFr
|
||||
? "Encyclopédie des termes techniques et des concepts matériels et logiciels de l'écosystème ESP32."
|
||||
: isDe
|
||||
: isZh ? "ESP32 生态硬件与软件技术术语和概念的百科。" : isDe
|
||||
? "Enzyklopädie technischer Begriffe und Hardware-/Softwarekonzepte für das ESP32-Ökosystem."
|
||||
: "Enciclopédia de termos técnicos e conceitos de hardware e software do ecossistema ESP32.",
|
||||
caminho: canonPath,
|
||||
|
||||
@@ -11,6 +11,7 @@ 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 * as glossarioZh from "@/lib/data/zh-CN/glossario";
|
||||
import { getLocalizedHref } from "@/i18n/links";
|
||||
import {
|
||||
ArrowRight,
|
||||
@@ -46,8 +47,9 @@ export default function GlossarioPage() {
|
||||
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 isZh = pathname?.startsWith("/zh-CN");
|
||||
const currentLocale = isZh ? "zh-CN" : isDe ? "de" : isFr ? "fr" : isEs ? "es" : isEn ? "en" : "pt";
|
||||
const { categoriasGlossario } = isZh ? glossarioZh : isDe ? glossarioDe : isFr ? glossarioFr : isEs ? glossarioEs : isEn ? glossarioEn : glossarioPt;
|
||||
|
||||
const [busca, setBusca] = useState("");
|
||||
const [categoriaSelecionada, setCategoriaSelecionada] = useState("todas");
|
||||
@@ -117,11 +119,11 @@ export default function GlossarioPage() {
|
||||
isEn={isEn}
|
||||
isEs={isEs}
|
||||
isFr={isFr}
|
||||
isDe={isDe}
|
||||
trail={[{ label: isDe ? "Glossar" : isFr ? "Glossaire" : isEs ? "Glosario" : isEn ? "Glossary" : "Glossário" }]}
|
||||
isDe={isDe} isZh={isZh}
|
||||
trail={[{ label: isZh ? "术语表" : isDe ? "Glossar" : isFr ? "Glossaire" : isEs ? "Glosario" : isEn ? "Glossary" : "Glossário" }]}
|
||||
icon={BookOpen}
|
||||
label={
|
||||
isDe
|
||||
isZh ? `已解释 ${todosOsTermos.length} 个术语` : isDe
|
||||
? `${todosOsTermos.length} Begriffe erklärt`
|
||||
: isFr
|
||||
? `${todosOsTermos.length} termes expliqués`
|
||||
@@ -132,7 +134,7 @@ export default function GlossarioPage() {
|
||||
: `${todosOsTermos.length} termos explicados`
|
||||
}
|
||||
title={
|
||||
isDe
|
||||
isZh ? "ESP32 技术术语表" : isDe
|
||||
? "Technisches Glossar für ESP32"
|
||||
: isFr
|
||||
? "Glossaire technique ESP32"
|
||||
@@ -143,7 +145,7 @@ export default function GlossarioPage() {
|
||||
: "Glossário técnico do ESP32"
|
||||
}
|
||||
lede={
|
||||
isDe
|
||||
isZh ? "为生态中的每个术语提供直接定义、硬件参数和实用示例,从 ADC 到 Secure Boot。" : isDe
|
||||
? "Präzise Definitionen, Hardware-Parameter und praktische Beispiele für jeden Begriff des Ökosystems – von ADC bis Secure Boot."
|
||||
: isFr
|
||||
? "Définitions précises, paramètres matériels et exemples pratiques pour chaque terme de l'écosystème, de l'ADC au Secure Boot."
|
||||
@@ -155,11 +157,11 @@ export default function GlossarioPage() {
|
||||
}
|
||||
/>
|
||||
|
||||
<section className="shell pt-10 sm:pt-12" aria-label={isDe ? "Suche und Filter" : isFr ? "Recherche et filtres" : isEs ? "Búsqueda y filtros" : isEn ? "Search and filters" : "Busca e filtros"}>
|
||||
<section className="shell pt-10 sm:pt-12" aria-label={isZh ? "搜索与筛选" : isDe ? "Suche und Filter" : isFr ? "Recherche et filtres" : isEs ? "Búsqueda y filtros" : isEn ? "Search and filters" : "Busca e filtros"}>
|
||||
<div className="panel p-5 sm:p-7">
|
||||
<div className="relative">
|
||||
<label htmlFor="busca-glossario" className="sr-only">
|
||||
{isDe ? "Nach Begriff, Abkürzung oder Konzept suchen" : isFr ? "Rechercher un terme, un sigle ou un concept" : isEs ? "Buscar término, sigla o concepto" : isEn ? "Search term, acronym, or concept" : "Buscar termo, sigla ou conceito"}
|
||||
{isZh ? "搜索术语、缩写或概念" : isDe ? "Nach Begriff, Abkürzung oder Konzept suchen" : isFr ? "Rechercher un terme, un sigle ou un concept" : isEs ? "Buscar término, sigla o concepto" : isEn ? "Search term, acronym, or concept" : "Buscar termo, sigla ou conceito"}
|
||||
</label>
|
||||
<Search className="pointer-events-none absolute left-4 top-1/2 h-5 w-5 -translate-y-1/2 text-muted" aria-hidden="true" />
|
||||
<input
|
||||
@@ -168,7 +170,7 @@ export default function GlossarioPage() {
|
||||
type="search"
|
||||
value={busca}
|
||||
onChange={(e) => setBusca(e.target.value)}
|
||||
placeholder={isDe ? "Nach Begriff, Abkürzung oder Konzept suchen" : isFr ? "Rechercher un terme, un sigle ou un concept" : isEs ? "Buscar término, sigla o concepto" : isEn ? "Search term, acronym, or concept" : "Buscar termo, sigla ou conceito"}
|
||||
placeholder={isZh ? "搜索术语、缩写或概念" : isDe ? "Nach Begriff, Abkürzung oder Konzept suchen" : isFr ? "Rechercher un terme, un sigle ou un concept" : isEs ? "Buscar término, sigla o concepto" : isEn ? "Search term, acronym, or concept" : "Buscar termo, sigla ou conceito"}
|
||||
autoComplete="off"
|
||||
className={`field pl-12 text-base ${busca ? "pr-28" : "pr-4"}`}
|
||||
/>
|
||||
@@ -176,14 +178,14 @@ export default function GlossarioPage() {
|
||||
{busca && (
|
||||
<button type="button" onClick={() => { setBusca(""); searchInputRef.current?.focus(); }} className="btn btn-ghost btn-sm">
|
||||
<X className="h-3.5 w-3.5" aria-hidden="true" />
|
||||
{isDe ? "Löschen" : isFr ? "Effacer" : isEs ? "Limpiar" : isEn ? "Clear" : "Limpar"}
|
||||
{isZh ? "清除" : isDe ? "Löschen" : isFr ? "Effacer" : isEs ? "Limpiar" : isEn ? "Clear" : "Limpar"}
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="mt-4 flex flex-wrap items-center gap-2">
|
||||
<span className="mr-1 text-sm text-muted">{isDe ? "Häufig gesucht" : isFr ? "Plus recherchés" : isEs ? "Más buscados" : isEn ? "Popular searches" : "Mais buscados"}</span>
|
||||
<span className="mr-1 text-sm text-muted">{isZh ? "热门搜索" : isDe ? "Häufig gesucht" : isFr ? "Plus recherchés" : isEs ? "Más buscados" : isEn ? "Popular searches" : "Mais buscados"}</span>
|
||||
{BUSCAS_POPULARES.map((rotulo) => (
|
||||
<button
|
||||
key={rotulo}
|
||||
@@ -197,7 +199,7 @@ export default function GlossarioPage() {
|
||||
</div>
|
||||
|
||||
<div className="mt-5 border-t border-line pt-5">
|
||||
<h2 className="text-sm font-semibold text-ink">{isDe ? "Kategorie" : isFr ? "Catégorie" : isEs ? "Categoría" : isEn ? "Category" : "Categoria"}</h2>
|
||||
<h2 className="text-sm font-semibold text-ink">{isZh ? "类别" : isDe ? "Kategorie" : isFr ? "Catégorie" : isEs ? "Categoría" : isEn ? "Category" : "Categoria"}</h2>
|
||||
<div className="mt-3 flex flex-wrap gap-2">
|
||||
<button
|
||||
type="button"
|
||||
@@ -206,7 +208,7 @@ export default function GlossarioPage() {
|
||||
className="chip-btn"
|
||||
>
|
||||
<LayoutGrid className="h-4 w-4" aria-hidden="true" />
|
||||
{isDe ? "Alle" : isFr ? "Toutes" : isEs ? "Todas" : isEn ? "All" : "Todas"}
|
||||
{isZh ? "全部" : isDe ? "Alle" : isFr ? "Toutes" : isEs ? "Todas" : isEn ? "All" : "Todas"}
|
||||
<span className="tabular-nums opacity-80">{todosOsTermos.length}</span>
|
||||
</button>
|
||||
{categoriasGlossario.map((cat) => {
|
||||
@@ -228,11 +230,13 @@ export default function GlossarioPage() {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* O filtro A–Z não faz sentido em chinês: os termos começam por ideogramas. */}
|
||||
{!isZh && (
|
||||
<div className="mt-6 border-t border-line pt-6">
|
||||
<h2 className="text-sm font-semibold text-ink">{isDe ? "Alphabetische Reihenfolge" : isFr ? "Ordre alphabétique" : isEs ? "Orden alfabético" : isEn ? "Alphabetical order" : "Ordem alfabética"}</h2>
|
||||
<div className="mt-3 flex flex-wrap gap-1.5" role="group" aria-label={isDe ? "Nach Anfangsbuchstaben filtern" : isFr ? "Filtrer par lettre initiale" : isEs ? "Filtrar por letra inicial" : isEn ? "Filter by first letter" : "Filtrar pela letra inicial"}>
|
||||
<h2 className="text-sm font-semibold text-ink">{isZh ? "按字母顺序" : isDe ? "Alphabetische Reihenfolge" : isFr ? "Ordre alphabétique" : isEs ? "Orden alfabético" : isEn ? "Alphabetical order" : "Ordem alfabética"}</h2>
|
||||
<div className="mt-3 flex flex-wrap gap-1.5" role="group" aria-label={isZh ? "按首字母筛选" : isDe ? "Nach Anfangsbuchstaben filtern" : isFr ? "Filtrer par lettre initiale" : isEs ? "Filtrar por letra inicial" : isEn ? "Filter by first letter" : "Filtrar pela letra inicial"}>
|
||||
<button type="button" onClick={() => setLetraFiltro(null)} aria-pressed={letraFiltro === null} className="chip-btn">
|
||||
{isDe ? "Alle" : isFr ? "Toutes" : isEs ? "Todas" : isEn ? "All" : "Todas"}
|
||||
{isZh ? "全部" : isDe ? "Alle" : isFr ? "Toutes" : isEs ? "Todas" : isEn ? "All" : "Todas"}
|
||||
</button>
|
||||
{alfabeto.map(({ letra, temTermos }) => (
|
||||
<button
|
||||
@@ -248,6 +252,7 @@ export default function GlossarioPage() {
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
@@ -256,7 +261,7 @@ export default function GlossarioPage() {
|
||||
<h2 id="resultado-titulo" className="text-base font-semibold text-ink" role="status" aria-live="polite">
|
||||
{total}{" "}
|
||||
{total === 1
|
||||
? isDe
|
||||
? isZh ? "个术语" : isDe
|
||||
? "Begriff"
|
||||
: isFr
|
||||
? "terme"
|
||||
@@ -265,7 +270,7 @@ export default function GlossarioPage() {
|
||||
: isEn
|
||||
? "term"
|
||||
: "termo"
|
||||
: isDe
|
||||
: isZh ? "个术语" : isDe
|
||||
? "Begriffe"
|
||||
: isFr
|
||||
? "termes"
|
||||
@@ -276,7 +281,7 @@ export default function GlossarioPage() {
|
||||
: "termos"}
|
||||
{temFiltroAtivo && (
|
||||
<span className="font-normal text-muted">
|
||||
{isDe
|
||||
{isZh ? "(当前筛选下)" : isDe
|
||||
? " mit den aktuellen Filtern"
|
||||
: isFr
|
||||
? " avec les filtres actuels"
|
||||
@@ -291,7 +296,7 @@ export default function GlossarioPage() {
|
||||
{temFiltroAtivo && (
|
||||
<button type="button" onClick={limparTodosFiltros} className="inline-flex min-h-11 items-center gap-1.5 text-sm font-medium text-accent hover:text-accent-strong">
|
||||
<RotateCcw className="h-4 w-4" aria-hidden="true" />
|
||||
{isDe ? "Filter zurücksetzen" : isFr ? "Réinitialiser les filtres" : isEs ? "Restablecer filtros" : isEn ? "Reset filters" : "Redefinir filtros"}
|
||||
{isZh ? "重置筛选" : isDe ? "Filter zurücksetzen" : isFr ? "Réinitialiser les filtres" : isEs ? "Restablecer filtros" : isEn ? "Reset filters" : "Redefinir filtros"}
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
@@ -300,10 +305,10 @@ export default function GlossarioPage() {
|
||||
<div className="card mt-6 px-6 py-14 text-center">
|
||||
<HelpCircle className="mx-auto h-10 w-10 text-muted" aria-hidden="true" />
|
||||
<h3 className="mt-4 font-display text-xl font-semibold text-ink">
|
||||
{isDe ? "Keine Begriffe gefunden" : isFr ? "Aucun terme trouvé" : isEs ? "No se encontraron términos" : isEn ? "No terms found" : "Nenhum termo encontrado"}
|
||||
{isZh ? "未找到术语" : isDe ? "Keine Begriffe gefunden" : isFr ? "Aucun terme trouvé" : isEs ? "No se encontraron términos" : isEn ? "No terms found" : "Nenhum termo encontrado"}
|
||||
</h3>
|
||||
<p className="mx-auto mt-2 max-w-md text-sm text-muted">
|
||||
{isDe
|
||||
{isZh ? "没有任何术语符合当前的搜索和筛选。请尝试更短的缩写,或重置为全部类别。" : 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."
|
||||
@@ -315,7 +320,7 @@ export default function GlossarioPage() {
|
||||
</p>
|
||||
<button type="button" onClick={limparTodosFiltros} className="btn btn-primary mt-6">
|
||||
<RotateCcw className="h-4 w-4" aria-hidden="true" />
|
||||
{isDe ? "Filter zurücksetzen" : isFr ? "Réinitialiser les filtres" : isEs ? "Limpiar filtros" : isEn ? "Clear filters" : "Limpar filtros"}
|
||||
{isZh ? "清除筛选" : isDe ? "Filter zurücksetzen" : isFr ? "Réinitialiser les filtres" : isEs ? "Limpiar filtros" : isEn ? "Clear filters" : "Limpar filtros"}
|
||||
</button>
|
||||
</div>
|
||||
) : (
|
||||
@@ -333,7 +338,7 @@ export default function GlossarioPage() {
|
||||
type="button"
|
||||
onClick={() => copiarLinkTermo(item.slug)}
|
||||
aria-label={
|
||||
isDe
|
||||
isZh ? `复制 ${item.termo} 的链接` : isDe
|
||||
? `Link für ${item.termo} kopieren`
|
||||
: isFr
|
||||
? `Copier le lien pour ${item.termo}`
|
||||
@@ -357,7 +362,7 @@ export default function GlossarioPage() {
|
||||
<div className="callout mt-5">
|
||||
<p className="flex items-center gap-1.5 text-sm font-semibold text-ink">
|
||||
<Lightbulb className="h-4 w-4 text-accent" aria-hidden="true" />
|
||||
{isDe ? "In der Praxis" : isFr ? "En pratique" : isEs ? "En la práctica" : isEn ? "In practice" : "Na prática"}
|
||||
{isZh ? "实际应用" : isDe ? "In der Praxis" : isFr ? "En pratique" : isEs ? "En la práctica" : isEn ? "In practice" : "Na prática"}
|
||||
</p>
|
||||
<p className="mt-1">
|
||||
<TextoComLinks texto={item.exemplo} currentLocale={currentLocale} />
|
||||
@@ -373,10 +378,10 @@ export default function GlossarioPage() {
|
||||
<section className="shell pb-20 md:pb-28">
|
||||
<div className="panel p-8 text-center sm:p-12">
|
||||
<h2 className="section-title mx-auto max-w-2xl">
|
||||
{isDe ? "Vom Konzept zum richtigen Chip." : isFr ? "Du concept à la bonne puce." : isEs ? "Del concepto al chip adecuado." : isEn ? "From concept to the right chip." : "Do conceito ao chip certo."}
|
||||
{isZh ? "从概念到合适的芯片。" : isDe ? "Vom Konzept zum richtigen Chip." : isFr ? "Du concept à la bonne puce." : isEs ? "Del concepto al chip adecuado." : isEn ? "From concept to the right chip." : "Do conceito ao chip certo."}
|
||||
</h2>
|
||||
<p className="lede mx-auto mt-4 max-w-2xl">
|
||||
{isDe
|
||||
{isZh ? "掌握这些术语后,可以并排对比各系列,或回答选型问题,找到适合你项目的型号。" : 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."
|
||||
@@ -389,10 +394,10 @@ export default function GlossarioPage() {
|
||||
<div className="mt-8 flex flex-col items-center justify-center gap-3 sm:flex-row">
|
||||
<Link href={getLocalizedHref("/seletor", currentLocale)} className="btn btn-primary w-full sm:w-auto">
|
||||
<Sliders className="h-4 w-4" aria-hidden="true" />
|
||||
{isDe ? "Meinen Chip wählen" : isFr ? "Choisir ma puce" : isEs ? "Elegir mi chip" : isEn ? "Choose my chip" : "Escolher meu chip"}
|
||||
{isZh ? "选择我的芯片" : isDe ? "Meinen Chip wählen" : isFr ? "Choisir ma puce" : isEs ? "Elegir mi chip" : isEn ? "Choose my chip" : "Escolher meu chip"}
|
||||
</Link>
|
||||
<Link href={getLocalizedHref("/series", currentLocale)} className="btn btn-ghost w-full sm:w-auto">
|
||||
{isDe ? "Serien erkunden" : isFr ? "Explorer les séries" : isEs ? "Explorar las series" : isEn ? "Explore series" : "Explorar as séries"}
|
||||
{isZh ? "浏览系列" : isDe ? "Serien erkunden" : isFr ? "Explorer les séries" : isEs ? "Explorar las series" : isEn ? "Explore series" : "Explorar as séries"}
|
||||
<ArrowRight className="h-4 w-4" aria-hidden="true" />
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
Reference in new issue
Block a user