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
+103
-29
@@ -11,7 +11,9 @@ import frameworksDataEs from "@/data/es/frameworks.json";
|
||||
import seriesDataFr from "@/data/fr/series.json";
|
||||
import frameworksDataFr from "@/data/fr/frameworks.json";
|
||||
import seriesDataDe from "@/data/de/series.json";
|
||||
import seriesDataZh from "@/data/zh-CN/series.json";
|
||||
import frameworksDataDe from "@/data/de/frameworks.json";
|
||||
import frameworksDataZh from "@/data/zh-CN/frameworks.json";
|
||||
import { SITE } from "@/lib/seo";
|
||||
import { getLocalizedHref } from "@/i18n/links";
|
||||
import {
|
||||
@@ -252,6 +254,50 @@ const TOOLS_DE = [
|
||||
action: "Boards ansehen",
|
||||
},
|
||||
];
|
||||
const TOOLS_ZH = [
|
||||
{
|
||||
href: "/seletor",
|
||||
title: "智能选型",
|
||||
desc: "回答八个关于项目的问题,获得推荐芯片及其技术依据。",
|
||||
icon: SlidersHorizontal,
|
||||
action: "找到我的芯片",
|
||||
},
|
||||
{
|
||||
href: "/comparacao",
|
||||
title: "系列对比",
|
||||
desc: "最多把四个型号并排放在一起,对比内核、无线、内存、外设和安全。",
|
||||
icon: Scale,
|
||||
action: "立即对比",
|
||||
},
|
||||
{
|
||||
href: "/diagnostico",
|
||||
title: "故障诊断",
|
||||
desc: "针对欠压、启动循环、Guru Meditation、看门狗和闪存错误的根因与解决办法。",
|
||||
icon: AlertTriangle,
|
||||
action: "打开诊断",
|
||||
},
|
||||
{
|
||||
href: "/componentes",
|
||||
title: "Component Registry",
|
||||
desc: "来自乐鑫官方注册中心的驱动、库和 BSP,附带可直接使用的清单。",
|
||||
icon: Box,
|
||||
action: "探索组件",
|
||||
},
|
||||
{
|
||||
href: "/frameworks",
|
||||
title: "框架与 SDK",
|
||||
desc: "ESP-IDF、Arduino、Rust、Matter、MicroPython,以及围绕芯片构建的工具。",
|
||||
icon: Terminal,
|
||||
action: "查看框架",
|
||||
},
|
||||
{
|
||||
href: "/catalogo",
|
||||
title: "开发板目录",
|
||||
desc: "真实的 DevKit 与模组,含 USB 接口、板载传感器和直达商店的链接。",
|
||||
icon: Cpu,
|
||||
action: "查看开发板",
|
||||
},
|
||||
];
|
||||
|
||||
const ERRORS_PT = [
|
||||
{
|
||||
@@ -367,6 +413,28 @@ const ERRORS_DE = [
|
||||
fix: "3,3-V-Schiene, Boot-Pull-ups und Flash-Konfiguration in esptool überprüfen.",
|
||||
},
|
||||
];
|
||||
const ERRORS_ZH = [
|
||||
{
|
||||
code: "Brownout detector was triggered",
|
||||
cause: "射频启动时电压跌落。",
|
||||
fix: "在芯片附近加 10–100 µF 电容,并使用电流足够的 5 V 电源。",
|
||||
},
|
||||
{
|
||||
code: "Guru Meditation Error",
|
||||
cause: "无效指针、栈溢出,或 ISR 使用不当。",
|
||||
fix: "用 addr2line 查看回溯信息,并合理设置 FreeRTOS 任务的栈大小。",
|
||||
},
|
||||
{
|
||||
code: "Wi-Fi 开启时 ADC2 不可用",
|
||||
cause: "射频控制器工作时会占用 ADC2。",
|
||||
fix: "与 Wi-Fi 同时使用模拟传感器时,请用 ADC1 引脚。",
|
||||
},
|
||||
{
|
||||
code: "Flash Read err / bootloader",
|
||||
cause: "闪存电压/模式不正确,或启动时启动配置引脚被拉到错误电平。",
|
||||
fix: "检查 3.3 V 电源轨、启动上拉,以及 esptool 中的闪存配置。",
|
||||
},
|
||||
];
|
||||
|
||||
export default async function Home({ params }) {
|
||||
const { locale } = await params;
|
||||
@@ -375,12 +443,13 @@ export default async function Home({ params }) {
|
||||
const isEs = locale === "es";
|
||||
const isFr = locale === "fr";
|
||||
const isDe = locale === "de";
|
||||
const isZh = locale === "zh-CN";
|
||||
const getLinkHref = (href) => getLocalizedHref(`/${locale}${href}`, locale);
|
||||
|
||||
const seriesData = isPt ? seriesDataPt : isEs ? seriesDataEs : isFr ? seriesDataFr : isDe ? seriesDataDe : seriesDataEn;
|
||||
const frameworksData = isPt ? frameworksDataPt : isEs ? frameworksDataEs : isFr ? frameworksDataFr : isDe ? frameworksDataDe : frameworksDataEn;
|
||||
const tools = isPt ? TOOLS_PT : isEs ? TOOLS_ES : isFr ? TOOLS_FR : isDe ? TOOLS_DE : TOOLS_EN;
|
||||
const errors = isPt ? ERRORS_PT : isEs ? ERRORS_ES : isFr ? ERRORS_FR : isDe ? ERRORS_DE : ERRORS_EN;
|
||||
const seriesData = isPt ? seriesDataPt : isEs ? seriesDataEs : isFr ? seriesDataFr : isZh ? seriesDataZh : isDe ? seriesDataDe : seriesDataEn;
|
||||
const frameworksData = isPt ? frameworksDataPt : isEs ? frameworksDataEs : isFr ? frameworksDataFr : isZh ? frameworksDataZh : isDe ? frameworksDataDe : frameworksDataEn;
|
||||
const tools = isPt ? TOOLS_PT : isEs ? TOOLS_ES : isFr ? TOOLS_FR : isZh ? TOOLS_ZH : isDe ? TOOLS_DE : TOOLS_EN;
|
||||
const errors = isPt ? ERRORS_PT : isEs ? ERRORS_ES : isFr ? ERRORS_FR : isZh ? ERRORS_ZH : isDe ? ERRORS_DE : ERRORS_EN;
|
||||
|
||||
const seriesCount = Object.keys(seriesData).length;
|
||||
const frameworkCount = Object.keys(frameworksData).length;
|
||||
@@ -395,7 +464,7 @@ export default async function Home({ params }) {
|
||||
<div className="mx-auto max-w-4xl text-center">
|
||||
<span className="chip chip-accent">
|
||||
<Cpu className="h-3.5 w-3.5" aria-hidden="true" />
|
||||
{isPt ? "Documentação aberta do ESP32" : isEs ? "Documentación abierta de ESP32" : isFr ? "Documentation ouverte de l'ESP32" : isDe ? "Offene ESP32-Dokumentation" : "Open ESP32 documentation"}
|
||||
{isPt ? "Documentação aberta do ESP32" : isEs ? "Documentación abierta de ESP32" : isFr ? "Documentation ouverte de l'ESP32" : isZh ? "ESP32 开放文档" : isDe ? "Offene ESP32-Dokumentation" : "Open ESP32 documentation"}
|
||||
</span>
|
||||
<h1 className="display mt-6 text-[clamp(2.9rem,7.4vw,5.4rem)]">
|
||||
{isPt ? (
|
||||
@@ -413,7 +482,9 @@ export default async function Home({ params }) {
|
||||
L'ESP32,
|
||||
<br className="sm:hidden" /> sans bruit.
|
||||
</>
|
||||
) : isDe ? (
|
||||
) : isZh ? ( <>
|
||||
ESP32,<br className="sm:hidden" />去繁就简。
|
||||
</> ) : isDe ? (
|
||||
<>
|
||||
Der ESP32,
|
||||
<br className="sm:hidden" /> ohne Umwege.
|
||||
@@ -432,7 +503,7 @@ export default async function Home({ params }) {
|
||||
? "Especificaciones, patillaje, comparaciones y diagnóstico en una sola lectura. Menos traducción de hojas de datos, más tiempo con el prototipo en el banco de trabajo."
|
||||
: isFr
|
||||
? "Spécifications, brochage, comparaisons et diagnostics en une seule lecture. Moins de traduction de fiches techniques, plus de temps à l'établi."
|
||||
: isDe
|
||||
: isZh ? "规格、引脚、对比与故障诊断,一次读完。少啃数据手册,多花时间在工作台上做原型。" : isDe
|
||||
? "Spezifikationen, Pinbelegung, Vergleiche und Diagnose auf einen Blick. Weniger Datenblatt-Übersetzung, mehr Zeit am Prüfplatz."
|
||||
: "Specifications, pinouts, comparisons and diagnostics in a single read. Less datasheet translation, more workbench time."}
|
||||
</p>
|
||||
@@ -440,7 +511,7 @@ export default async function Home({ params }) {
|
||||
<div className="mt-8 flex flex-col items-center justify-center gap-3 sm:flex-row">
|
||||
<Link href={getLinkHref("/seletor")} className="btn btn-primary w-full sm:w-auto">
|
||||
<SlidersHorizontal className="h-4 w-4" aria-hidden="true" />
|
||||
{isPt ? "Escolher meu chip" : isEs ? "Elegir mi chip" : isFr ? "Choisir ma puce" : isDe ? "Meinen Chip wählen" : "Choose my chip"}
|
||||
{isPt ? "Escolher meu chip" : isEs ? "Elegir mi chip" : isFr ? "Choisir ma puce" : isZh ? "选择我的芯片" : isDe ? "Meinen Chip wählen" : "Choose my chip"}
|
||||
</Link>
|
||||
<Link href={getLinkHref("/series")} className="btn btn-ghost w-full sm:w-auto">
|
||||
{isPt ? (
|
||||
@@ -449,7 +520,7 @@ export default async function Home({ params }) {
|
||||
<>Explorar las {seriesCount} series</>
|
||||
) : isFr ? (
|
||||
<>Explorer les {seriesCount} séries</>
|
||||
) : isDe ? (
|
||||
) : isZh ? ( <>浏览全部 {seriesCount} 个系列</> ) : isDe ? (
|
||||
<>Die {seriesCount} Serien erkunden</>
|
||||
) : (
|
||||
<>Explore the {seriesCount} series</>
|
||||
@@ -459,9 +530,9 @@ export default async function Home({ params }) {
|
||||
</div>
|
||||
|
||||
<p className="mt-7 flex flex-wrap items-center justify-center gap-x-5 gap-y-2 text-sm text-muted">
|
||||
<span><strong className="font-semibold text-ink">{seriesCount}</strong> {isPt ? "séries" : isEs ? "series" : isFr ? "séries" : isDe ? "Serien" : "series"}</span>
|
||||
<span><strong className="font-semibold text-ink">{seriesCount}</strong> {isPt ? "séries" : isEs ? "series" : isFr ? "séries" : isZh ? "个系列" : isDe ? "Serien" : "series"}</span>
|
||||
<span aria-hidden="true" className="text-line-strong">·</span>
|
||||
<span><strong className="font-semibold text-ink">{frameworkCount}</strong> frameworks</span>
|
||||
<span><strong className="font-semibold text-ink">{frameworkCount}</strong> {isZh ? "个框架" : isDe ? "Frameworks" : "frameworks"}</span>
|
||||
{isPt ? (
|
||||
<>
|
||||
<span aria-hidden="true" className="text-line-strong">·</span>
|
||||
@@ -479,7 +550,10 @@ export default async function Home({ params }) {
|
||||
<span aria-hidden="true" className="text-line-strong">·</span>
|
||||
<span>100 % en français</span>
|
||||
</>
|
||||
) : isDe ? (
|
||||
) : isZh ? ( <>
|
||||
<span aria-hidden="true" className="text-line-strong">·</span>
|
||||
<span>100% 中文</span>
|
||||
</> ) : isDe ? (
|
||||
<>
|
||||
<span aria-hidden="true" className="text-line-strong">·</span>
|
||||
<span>100 % auf Deutsch</span>
|
||||
@@ -496,13 +570,13 @@ export default async function Home({ params }) {
|
||||
<div className="panel mt-12 overflow-hidden sm:mt-16">
|
||||
<div className="flex flex-wrap items-center justify-between gap-3 px-5 py-4 sm:px-7">
|
||||
<div>
|
||||
<h2 className="text-sm font-semibold text-ink">{isPt ? "Séries em destaque" : isEs ? "Series destacadas" : isFr ? "Séries en vedette" : isDe ? "Vorgestellte Serien" : "Featured series"}</h2>
|
||||
<h2 className="text-sm font-semibold text-ink">{isPt ? "Séries em destaque" : isEs ? "Series destacadas" : isFr ? "Séries en vedette" : isZh ? "精选系列" : isDe ? "Vorgestellte Serien" : "Featured series"}</h2>
|
||||
<p className="mt-0.5 text-xs text-muted">
|
||||
{isPt ? "O essencial de cada família, antes de abrir o datasheet." : isEs ? "Lo esencial de cada familia, antes de abrir la hoja de datos." : isFr ? "L'essentiel de chaque famille, avant d'ouvrir la fiche technique." : isDe ? "Das Wesentliche jeder Familie, bevor Sie das Datenblatt öffnen." : "The essentials of each family before opening the datasheet."}
|
||||
{isPt ? "O essencial de cada família, antes de abrir o datasheet." : isEs ? "Lo esencial de cada familia, antes de abrir la hoja de datos." : isFr ? "L'essentiel de chaque famille, avant d'ouvrir la fiche technique." : isZh ? "打开数据手册之前,先看每个系列的要点。" : isDe ? "Das Wesentliche jeder Familie, bevor Sie das Datenblatt öffnen." : "The essentials of each family before opening the datasheet."}
|
||||
</p>
|
||||
</div>
|
||||
<Link href={getLinkHref("/series")} className="inline-flex min-h-11 items-center gap-1.5 text-sm font-medium text-accent transition-colors hover:text-accent-strong">
|
||||
{isPt ? "Índice completo" : isEs ? "Índice completo" : isFr ? "Index complet" : isDe ? "Vollständiger Index" : "Full index"}
|
||||
{isPt ? "Índice completo" : isEs ? "Índice completo" : isFr ? "Index complet" : isZh ? "完整索引" : isDe ? "Vollständiger Index" : "Full index"}
|
||||
<ArrowRight className="h-4 w-4" aria-hidden="true" />
|
||||
</Link>
|
||||
</div>
|
||||
@@ -527,7 +601,7 @@ export default async function Home({ params }) {
|
||||
<div className="mt-5 flex items-center justify-between gap-3 border-t border-line pt-3.5">
|
||||
<span className="truncate font-mono text-[0.6875rem] text-ink-soft">{serie.frequencia}</span>
|
||||
<span className="inline-flex shrink-0 items-center gap-1 text-xs font-medium text-accent">
|
||||
{isPt ? "Ficha" : isEs ? "Ficha" : isFr ? "Fiche" : isDe ? "Datenblatt" : "Spec sheet"}
|
||||
{isPt ? "Ficha" : isEs ? "Ficha" : isFr ? "Fiche" : isZh ? "规格表" : isDe ? "Datenblatt" : "Spec sheet"}
|
||||
<ArrowUpRight className="h-3.5 w-3.5 transition-transform duration-300 group-hover:-translate-y-0.5 group-hover:translate-x-0.5" aria-hidden="true" />
|
||||
</span>
|
||||
</div>
|
||||
@@ -608,9 +682,9 @@ export default async function Home({ params }) {
|
||||
|
||||
<section className="shell section" aria-labelledby="ferramentas-titulo">
|
||||
<div className="mx-auto max-w-2xl text-center">
|
||||
<p className="eyebrow">{isPt ? "Ferramentas" : isEs ? "Herramientas" : isFr ? "Outils" : isDe ? "Werkzeuge" : "Tools"}</p>
|
||||
<p className="eyebrow">{isPt ? "Ferramentas" : isEs ? "Herramientas" : isFr ? "Outils" : isZh ? "工具" : isDe ? "Werkzeuge" : "Tools"}</p>
|
||||
<h2 id="ferramentas-titulo" className="display mt-4 text-[clamp(2rem,4.8vw,3.4rem)]">
|
||||
{isPt ? "Comece pelo problema." : isEs ? "Empiece por el problema." : isFr ? "Commencez par le problème." : isDe ? "Beginnen Sie beim Problem." : "Start with the problem."}
|
||||
{isPt ? "Comece pelo problema." : isEs ? "Empiece por el problema." : isFr ? "Commencez par le problème." : isZh ? "从问题出发。" : isDe ? "Beginnen Sie beim Problem." : "Start with the problem."}
|
||||
</h2>
|
||||
<p className="lede mt-4">
|
||||
{isPt
|
||||
@@ -619,7 +693,7 @@ export default async function Home({ params }) {
|
||||
? "Cada herramienta resuelve una fase concreta del proyecto, sin registros ni rodeos."
|
||||
: isFr
|
||||
? "Chaque outil répond à une étape concrète du projet, sans inscription ni détour."
|
||||
: isDe
|
||||
: isZh ? "每个工具对应开发中的一个具体阶段,无需注册,没有废话。" : isDe
|
||||
? "Jedes Werkzeug löst einen konkreten Projektschritt – ohne Registrierung und ohne Umwege."
|
||||
: "Each tool addresses a concrete development phase, with no sign-ups and zero fluff."}
|
||||
</p>
|
||||
@@ -648,9 +722,9 @@ export default async function Home({ params }) {
|
||||
<section className="shell section pt-0" aria-labelledby="diagnostico-titulo">
|
||||
<div className="grid items-start gap-10 lg:grid-cols-[0.78fr_1.22fr] lg:gap-16">
|
||||
<div className="lg:sticky lg:top-28">
|
||||
<p className="eyebrow">{isPt ? "Diagnóstico" : isEs ? "Diagnóstico" : isFr ? "Diagnostic" : isDe ? "Diagnose" : "Diagnostics"}</p>
|
||||
<p className="eyebrow">{isPt ? "Diagnóstico" : isEs ? "Diagnóstico" : isFr ? "Diagnostic" : isZh ? "故障诊断" : isDe ? "Diagnose" : "Diagnostics"}</p>
|
||||
<h2 id="diagnostico-titulo" className="display mt-4 text-[clamp(2rem,4.8vw,3.4rem)]">
|
||||
{isPt ? "O primeiro boot não precisa virar noite." : isEs ? "El primer arranque no tiene por qué desvelarlo." : isFr ? "Le premier démarrage n'a pas à vous gâcher la nuit." : isDe ? "Der erste Boot muss nicht die Nacht kosten." : "First boot doesn't have to take all night."}
|
||||
{isPt ? "O primeiro boot não precisa virar noite." : isEs ? "El primer arranque no tiene por qué desvelarlo." : isFr ? "Le premier démarrage n'a pas à vous gâcher la nuit." : isZh ? "第一次启动,不必折腾一整晚。" : isDe ? "Der erste Boot muss nicht die Nacht kosten." : "First boot doesn't have to take all night."}
|
||||
</h2>
|
||||
<p className="lede mt-4">
|
||||
{isPt
|
||||
@@ -659,13 +733,13 @@ export default async function Home({ params }) {
|
||||
? "Los errores más comunes tienen una causa conocida. Esta guía parte del mensaje en el terminal y llega al ajuste de hardware o firmware."
|
||||
: isFr
|
||||
? "Les erreurs les plus courantes ont une cause connue. Ce guide part du message dans le terminal pour arriver au réglage matériel ou logiciel."
|
||||
: isDe
|
||||
: isZh ? "常见错误都有已知的原因。本指南从串口终端日志出发,引导你找到硬件或固件上的调整办法。" : isDe
|
||||
? "Die häufigsten Fehler haben bekannte Ursachen. Dieser Leitfaden geht von der Terminalmeldung aus und führt zur passenden Hardware- oder Firmware-Anpassung."
|
||||
: "Common errors have known causes. This guide starts with the serial terminal log and leads to the hardware or firmware adjustment."}
|
||||
</p>
|
||||
<Link href={getLinkHref("/diagnostico")} className="btn btn-accent mt-7">
|
||||
<AlertTriangle className="h-4 w-4" aria-hidden="true" />
|
||||
{isPt ? "Abrir os 30+ diagnósticos" : isEs ? "Abrir los 30+ diagnósticos" : isFr ? "Ouvrir les 30+ diagnostics" : isDe ? "Die 30+ Diagnosen öffnen" : "Open the 30+ diagnostics"}
|
||||
{isPt ? "Abrir os 30+ diagnósticos" : isEs ? "Abrir los 30+ diagnósticos" : isFr ? "Ouvrir les 30+ diagnostics" : isZh ? "查看 30 多项诊断" : isDe ? "Die 30+ Diagnosen öffnen" : "Open the 30+ diagnostics"}
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
@@ -675,7 +749,7 @@ export default async function Home({ params }) {
|
||||
<Terminal className="h-4 w-4" aria-hidden="true" />
|
||||
boot.log
|
||||
</span>
|
||||
<span className="text-xs text-[#a6afbd]">{isPt ? "4 exemplos de 30+" : isEs ? "4 ejemplos de 30+" : isFr ? "4 exemples sur 30+" : isDe ? "4 Beispiele von 30+" : "4 examples of 30+"}</span>
|
||||
<span className="text-xs text-[#a6afbd]">{isPt ? "4 exemplos de 30+" : isEs ? "4 ejemplos de 30+" : isFr ? "4 exemples sur 30+" : isZh ? "30 多项中的 4 个示例" : isDe ? "4 Beispiele von 30+" : "4 examples of 30+"}</span>
|
||||
</div>
|
||||
<div className="divide-y divide-white/10">
|
||||
{errors.map((item) => (
|
||||
@@ -692,9 +766,9 @@ export default async function Home({ params }) {
|
||||
|
||||
<section className="shell pb-20 pt-4 md:pb-28">
|
||||
<div className="mx-auto max-w-3xl text-center">
|
||||
<p className="eyebrow">{isPt ? "Curadoria independente" : isEs ? "Curaduría independiente" : isFr ? "Sélection indépendante" : isDe ? "Unabhängige Kuration" : "Independent curation"}</p>
|
||||
<p className="eyebrow">{isPt ? "Curadoria independente" : isEs ? "Curaduría independiente" : isFr ? "Sélection indépendante" : isZh ? "独立整理" : isDe ? "Unabhängige Kuration" : "Independent curation"}</p>
|
||||
<h2 className="display mt-4 text-[clamp(2rem,4.5vw,3.2rem)]">
|
||||
{isPt ? "Feito para consultar no meio do projeto." : isEs ? "Diseñado para consultar en mitad del proyecto." : isFr ? "Conçu pour être consulté en plein projet." : isDe ? "Gemacht für das Nachschlagen mitten im Projekt." : "Built for quick lookup mid-project."}
|
||||
{isPt ? "Feito para consultar no meio do projeto." : isEs ? "Diseñado para consultar en mitad del proyecto." : isFr ? "Conçu pour être consulté en plein projet." : isZh ? "为项目途中的快速查阅而做。" : isDe ? "Gemacht für das Nachschlagen mitten im Projekt." : "Built for quick lookup mid-project."}
|
||||
</h2>
|
||||
<p className="lede mx-auto mt-4 max-w-2xl">
|
||||
{isPt
|
||||
@@ -703,17 +777,17 @@ export default async function Home({ params }) {
|
||||
? "ESPDocs organiza datos públicos de Espressif y apunta siempre a la fuente oficial. Para decisiones críticas, la hoja de datos y el Technical Reference Manual continúan teniendo la última palabra."
|
||||
: isFr
|
||||
? "ESPDocs organise les données publiques d'Espressif et renvoie systématiquement vers la source officielle. Pour les décisions critiques, la fiche technique et le Technical Reference Manual restent la référence définitive."
|
||||
: isDe
|
||||
: isZh ? "ESPDocs 整理乐鑫的公开数据,并直接指向官方资料来源。对于关键的工程决策,数据手册和技术参考手册仍是最终依据。" : isDe
|
||||
? "ESPDocs strukturiert öffentliche Espressif-Daten und verweist stets auf die offizielle Quelle. Für kritische Entscheidungen bleiben das Datenblatt und das Technical Reference Manual maßgeblich."
|
||||
: "ESPDocs organizes public Espressif data and points directly to official sources. For critical engineering decisions, the datasheet and Technical Reference Manual remain the definitive authority."}
|
||||
</p>
|
||||
<div className="mt-8 flex flex-col items-center justify-center gap-3 sm:flex-row">
|
||||
<Link href={getLinkHref("/glossario")} className="btn btn-ghost w-full sm:w-auto">
|
||||
<BookOpen className="h-4 w-4" aria-hidden="true" />
|
||||
{isPt ? "Glossário" : isEs ? "Glosario" : isFr ? "Glossaire" : isDe ? "Glossar" : "Glossary"}
|
||||
{isPt ? "Glossário" : isEs ? "Glosario" : isFr ? "Glossaire" : isZh ? "术语表" : isDe ? "Glossar" : "Glossary"}
|
||||
</Link>
|
||||
<Link href={getLinkHref("/sobre")} className="btn btn-primary w-full sm:w-auto">
|
||||
{isPt ? "Sobre o projeto" : isEs ? "Acerca del proyecto" : isFr ? "À propos du projet" : isDe ? "Über das Projekt" : "About the project"}
|
||||
{isPt ? "Sobre o projeto" : isEs ? "Acerca del proyecto" : isFr ? "À propos du projet" : isZh ? "关于本项目" : isDe ? "Über das Projekt" : "About the project"}
|
||||
<ArrowRight className="h-4 w-4" aria-hidden="true" />
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
Reference in new issue
Block a user