fix(ui): localize pairing upgrade hint copy

This commit is contained in:
Ayaan Zaidi
2026-04-20 13:21:57 +05:30
parent 221e550eb9
commit 444ece721c
26 changed files with 263 additions and 62 deletions

View File

@@ -1,11 +1,18 @@
{
"fallbackKeys": [],
"generatedAt": "2026-04-20T06:29:53.282Z",
"fallbackKeys": [
"overview.pairing.metadataUpgradeSummary",
"overview.pairing.metadataUpgradeTitle",
"overview.pairing.roleUpgradeSummary",
"overview.pairing.roleUpgradeTitle",
"overview.pairing.scopeUpgradeSummary",
"overview.pairing.scopeUpgradeTitle"
],
"generatedAt": "2026-04-20T07:50:51.356Z",
"locale": "de",
"model": "gpt-5.4",
"provider": "openai",
"sourceHash": "c7e1febc5a5715b59bbda5d9ea08187c13267c82c1fcfe3996a469205539eba0",
"totalKeys": 727,
"sourceHash": "3ca70e4eba34c7843d6a23944d24fdcf565b45d2b83e4fc371b9763235d25d3c",
"totalKeys": 733,
"translatedKeys": 727,
"workflow": 1
}

View File

@@ -1,11 +1,18 @@
{
"fallbackKeys": [],
"generatedAt": "2026-04-20T06:29:56.350Z",
"fallbackKeys": [
"overview.pairing.metadataUpgradeSummary",
"overview.pairing.metadataUpgradeTitle",
"overview.pairing.roleUpgradeSummary",
"overview.pairing.roleUpgradeTitle",
"overview.pairing.scopeUpgradeSummary",
"overview.pairing.scopeUpgradeTitle"
],
"generatedAt": "2026-04-20T07:50:51.716Z",
"locale": "es",
"model": "gpt-5.4",
"provider": "openai",
"sourceHash": "c7e1febc5a5715b59bbda5d9ea08187c13267c82c1fcfe3996a469205539eba0",
"totalKeys": 727,
"sourceHash": "3ca70e4eba34c7843d6a23944d24fdcf565b45d2b83e4fc371b9763235d25d3c",
"totalKeys": 733,
"translatedKeys": 727,
"workflow": 1
}

View File

@@ -1,11 +1,18 @@
{
"fallbackKeys": [],
"generatedAt": "2026-04-20T06:30:04.864Z",
"fallbackKeys": [
"overview.pairing.metadataUpgradeSummary",
"overview.pairing.metadataUpgradeTitle",
"overview.pairing.roleUpgradeSummary",
"overview.pairing.roleUpgradeTitle",
"overview.pairing.scopeUpgradeSummary",
"overview.pairing.scopeUpgradeTitle"
],
"generatedAt": "2026-04-20T07:50:52.788Z",
"locale": "fr",
"model": "gpt-5.4",
"provider": "openai",
"sourceHash": "c7e1febc5a5715b59bbda5d9ea08187c13267c82c1fcfe3996a469205539eba0",
"totalKeys": 727,
"sourceHash": "3ca70e4eba34c7843d6a23944d24fdcf565b45d2b83e4fc371b9763235d25d3c",
"totalKeys": 733,
"translatedKeys": 727,
"workflow": 1
}

View File

@@ -1,11 +1,18 @@
{
"fallbackKeys": [],
"generatedAt": "2026-04-20T06:30:14.879Z",
"fallbackKeys": [
"overview.pairing.metadataUpgradeSummary",
"overview.pairing.metadataUpgradeTitle",
"overview.pairing.roleUpgradeSummary",
"overview.pairing.roleUpgradeTitle",
"overview.pairing.scopeUpgradeSummary",
"overview.pairing.scopeUpgradeTitle"
],
"generatedAt": "2026-04-20T07:50:53.864Z",
"locale": "id",
"model": "gpt-5.4",
"provider": "openai",
"sourceHash": "c7e1febc5a5715b59bbda5d9ea08187c13267c82c1fcfe3996a469205539eba0",
"totalKeys": 727,
"sourceHash": "3ca70e4eba34c7843d6a23944d24fdcf565b45d2b83e4fc371b9763235d25d3c",
"totalKeys": 733,
"translatedKeys": 727,
"workflow": 1
}

View File

@@ -1,11 +1,18 @@
{
"fallbackKeys": [],
"generatedAt": "2026-04-20T06:29:59.242Z",
"fallbackKeys": [
"overview.pairing.metadataUpgradeSummary",
"overview.pairing.metadataUpgradeTitle",
"overview.pairing.roleUpgradeSummary",
"overview.pairing.roleUpgradeTitle",
"overview.pairing.scopeUpgradeSummary",
"overview.pairing.scopeUpgradeTitle"
],
"generatedAt": "2026-04-20T07:50:52.074Z",
"locale": "ja-JP",
"model": "gpt-5.4",
"provider": "openai",
"sourceHash": "c7e1febc5a5715b59bbda5d9ea08187c13267c82c1fcfe3996a469205539eba0",
"totalKeys": 727,
"sourceHash": "3ca70e4eba34c7843d6a23944d24fdcf565b45d2b83e4fc371b9763235d25d3c",
"totalKeys": 733,
"translatedKeys": 727,
"workflow": 1
}

View File

@@ -1,11 +1,18 @@
{
"fallbackKeys": [],
"generatedAt": "2026-04-20T06:30:01.914Z",
"fallbackKeys": [
"overview.pairing.metadataUpgradeSummary",
"overview.pairing.metadataUpgradeTitle",
"overview.pairing.roleUpgradeSummary",
"overview.pairing.roleUpgradeTitle",
"overview.pairing.scopeUpgradeSummary",
"overview.pairing.scopeUpgradeTitle"
],
"generatedAt": "2026-04-20T07:50:52.433Z",
"locale": "ko",
"model": "gpt-5.4",
"provider": "openai",
"sourceHash": "c7e1febc5a5715b59bbda5d9ea08187c13267c82c1fcfe3996a469205539eba0",
"totalKeys": 727,
"sourceHash": "3ca70e4eba34c7843d6a23944d24fdcf565b45d2b83e4fc371b9763235d25d3c",
"totalKeys": 733,
"translatedKeys": 727,
"workflow": 1
}

View File

@@ -1,11 +1,18 @@
{
"fallbackKeys": [],
"generatedAt": "2026-04-20T06:30:17.790Z",
"fallbackKeys": [
"overview.pairing.metadataUpgradeSummary",
"overview.pairing.metadataUpgradeTitle",
"overview.pairing.roleUpgradeSummary",
"overview.pairing.roleUpgradeTitle",
"overview.pairing.scopeUpgradeSummary",
"overview.pairing.scopeUpgradeTitle"
],
"generatedAt": "2026-04-20T07:50:54.274Z",
"locale": "pl",
"model": "gpt-5.4",
"provider": "openai",
"sourceHash": "c7e1febc5a5715b59bbda5d9ea08187c13267c82c1fcfe3996a469205539eba0",
"totalKeys": 727,
"sourceHash": "3ca70e4eba34c7843d6a23944d24fdcf565b45d2b83e4fc371b9763235d25d3c",
"totalKeys": 733,
"translatedKeys": 727,
"workflow": 1
}

View File

@@ -1,11 +1,18 @@
{
"fallbackKeys": [],
"generatedAt": "2026-04-20T06:29:49.118Z",
"fallbackKeys": [
"overview.pairing.metadataUpgradeSummary",
"overview.pairing.metadataUpgradeTitle",
"overview.pairing.roleUpgradeSummary",
"overview.pairing.roleUpgradeTitle",
"overview.pairing.scopeUpgradeSummary",
"overview.pairing.scopeUpgradeTitle"
],
"generatedAt": "2026-04-20T07:50:50.998Z",
"locale": "pt-BR",
"model": "gpt-5.4",
"provider": "openai",
"sourceHash": "c7e1febc5a5715b59bbda5d9ea08187c13267c82c1fcfe3996a469205539eba0",
"totalKeys": 727,
"sourceHash": "3ca70e4eba34c7843d6a23944d24fdcf565b45d2b83e4fc371b9763235d25d3c",
"totalKeys": 733,
"translatedKeys": 727,
"workflow": 1
}

View File

@@ -1,11 +1,18 @@
{
"fallbackKeys": [],
"generatedAt": "2026-04-20T06:30:07.502Z",
"fallbackKeys": [
"overview.pairing.metadataUpgradeSummary",
"overview.pairing.metadataUpgradeTitle",
"overview.pairing.roleUpgradeSummary",
"overview.pairing.roleUpgradeTitle",
"overview.pairing.scopeUpgradeSummary",
"overview.pairing.scopeUpgradeTitle"
],
"generatedAt": "2026-04-20T07:50:53.144Z",
"locale": "tr",
"model": "gpt-5.4",
"provider": "openai",
"sourceHash": "c7e1febc5a5715b59bbda5d9ea08187c13267c82c1fcfe3996a469205539eba0",
"totalKeys": 727,
"sourceHash": "3ca70e4eba34c7843d6a23944d24fdcf565b45d2b83e4fc371b9763235d25d3c",
"totalKeys": 733,
"translatedKeys": 727,
"workflow": 1
}

View File

@@ -1,11 +1,18 @@
{
"fallbackKeys": [],
"generatedAt": "2026-04-20T06:30:10.188Z",
"fallbackKeys": [
"overview.pairing.metadataUpgradeSummary",
"overview.pairing.metadataUpgradeTitle",
"overview.pairing.roleUpgradeSummary",
"overview.pairing.roleUpgradeTitle",
"overview.pairing.scopeUpgradeSummary",
"overview.pairing.scopeUpgradeTitle"
],
"generatedAt": "2026-04-20T07:50:53.508Z",
"locale": "uk",
"model": "gpt-5.4",
"provider": "openai",
"sourceHash": "c7e1febc5a5715b59bbda5d9ea08187c13267c82c1fcfe3996a469205539eba0",
"totalKeys": 727,
"sourceHash": "3ca70e4eba34c7843d6a23944d24fdcf565b45d2b83e4fc371b9763235d25d3c",
"totalKeys": 733,
"translatedKeys": 727,
"workflow": 1
}

View File

@@ -1,11 +1,18 @@
{
"fallbackKeys": [],
"generatedAt": "2026-04-20T06:29:46.215Z",
"fallbackKeys": [
"overview.pairing.metadataUpgradeSummary",
"overview.pairing.metadataUpgradeTitle",
"overview.pairing.roleUpgradeSummary",
"overview.pairing.roleUpgradeTitle",
"overview.pairing.scopeUpgradeSummary",
"overview.pairing.scopeUpgradeTitle"
],
"generatedAt": "2026-04-20T07:50:50.281Z",
"locale": "zh-CN",
"model": "gpt-5.4",
"provider": "openai",
"sourceHash": "c7e1febc5a5715b59bbda5d9ea08187c13267c82c1fcfe3996a469205539eba0",
"totalKeys": 727,
"sourceHash": "3ca70e4eba34c7843d6a23944d24fdcf565b45d2b83e4fc371b9763235d25d3c",
"totalKeys": 733,
"translatedKeys": 727,
"workflow": 1
}

View File

@@ -1,11 +1,18 @@
{
"fallbackKeys": [],
"generatedAt": "2026-04-20T06:29:48.803Z",
"fallbackKeys": [
"overview.pairing.metadataUpgradeSummary",
"overview.pairing.metadataUpgradeTitle",
"overview.pairing.roleUpgradeSummary",
"overview.pairing.roleUpgradeTitle",
"overview.pairing.scopeUpgradeSummary",
"overview.pairing.scopeUpgradeTitle"
],
"generatedAt": "2026-04-20T07:50:50.642Z",
"locale": "zh-TW",
"model": "gpt-5.4",
"provider": "openai",
"sourceHash": "c7e1febc5a5715b59bbda5d9ea08187c13267c82c1fcfe3996a469205539eba0",
"totalKeys": 727,
"sourceHash": "3ca70e4eba34c7843d6a23944d24fdcf565b45d2b83e4fc371b9763235d25d3c",
"totalKeys": 733,
"translatedKeys": 727,
"workflow": 1
}

View File

@@ -247,6 +247,15 @@ export const de: TranslationMap = {
},
pairing: {
hint: "Dieses Gerät benötigt eine Pairing-Freigabe vom Gateway-Host.",
scopeUpgradeTitle: "Scope upgrade pending approval.",
scopeUpgradeSummary:
"This device is already paired, but the requested wider scope is waiting for approval.",
roleUpgradeTitle: "Role upgrade pending approval.",
roleUpgradeSummary:
"This device is already paired, but the requested role change is waiting for approval.",
metadataUpgradeTitle: "Device metadata change pending approval.",
metadataUpgradeSummary:
"This device is already paired, but the metadata change is waiting for approval.",
mobileHint:
"Auf dem Mobilgerät? Kopieren Sie die vollständige URL (einschließlich #token=...) von openclaw dashboard --no-open auf Ihrem Desktop.",
docsTitle: "Gerätekopplungs-Dokumentation (öffnet sich in neuem Tab)",

View File

@@ -239,6 +239,15 @@ export const en: TranslationMap = {
},
pairing: {
hint: "This device needs pairing approval from the gateway host.",
scopeUpgradeTitle: "Scope upgrade pending approval.",
scopeUpgradeSummary:
"This device is already paired, but the requested wider scope is waiting for approval.",
roleUpgradeTitle: "Role upgrade pending approval.",
roleUpgradeSummary:
"This device is already paired, but the requested role change is waiting for approval.",
metadataUpgradeTitle: "Device metadata change pending approval.",
metadataUpgradeSummary:
"This device is already paired, but the metadata change is waiting for approval.",
mobileHint:
"On mobile? Copy the full URL (including #token=...) from openclaw dashboard --no-open on your desktop.",
docsTitle: "Device pairing docs (opens in new tab)",

View File

@@ -243,6 +243,15 @@ export const es: TranslationMap = {
},
pairing: {
hint: "Este dispositivo necesita aprobación de emparejamiento del host de la puerta de enlace.",
scopeUpgradeTitle: "Scope upgrade pending approval.",
scopeUpgradeSummary:
"This device is already paired, but the requested wider scope is waiting for approval.",
roleUpgradeTitle: "Role upgrade pending approval.",
roleUpgradeSummary:
"This device is already paired, but the requested role change is waiting for approval.",
metadataUpgradeTitle: "Device metadata change pending approval.",
metadataUpgradeSummary:
"This device is already paired, but the metadata change is waiting for approval.",
mobileHint:
"¿En el móvil? Copia la URL completa (incluyendo #token=...) desde openclaw dashboard --no-open en tu escritorio.",
docsTitle: "Documentación de emparejamiento de dispositivos (se abre en una pestaña nueva)",

View File

@@ -245,6 +245,15 @@ export const fr: TranslationMap = {
},
pairing: {
hint: "Cet appareil nécessite une approbation dappairage de lhôte Gateway.",
scopeUpgradeTitle: "Scope upgrade pending approval.",
scopeUpgradeSummary:
"This device is already paired, but the requested wider scope is waiting for approval.",
roleUpgradeTitle: "Role upgrade pending approval.",
roleUpgradeSummary:
"This device is already paired, but the requested role change is waiting for approval.",
metadataUpgradeTitle: "Device metadata change pending approval.",
metadataUpgradeSummary:
"This device is already paired, but the metadata change is waiting for approval.",
mobileHint:
"Sur mobile ? Copiez lURL complète (y compris #token=...) depuis openclaw dashboard --no-open sur votre ordinateur.",
docsTitle: "Documentation sur lappairage des appareils (souvre dans un nouvel onglet)",

View File

@@ -243,6 +243,15 @@ export const id: TranslationMap = {
},
pairing: {
hint: "Perangkat ini memerlukan persetujuan pairing dari host gateway.",
scopeUpgradeTitle: "Scope upgrade pending approval.",
scopeUpgradeSummary:
"This device is already paired, but the requested wider scope is waiting for approval.",
roleUpgradeTitle: "Role upgrade pending approval.",
roleUpgradeSummary:
"This device is already paired, but the requested role change is waiting for approval.",
metadataUpgradeTitle: "Device metadata change pending approval.",
metadataUpgradeSummary:
"This device is already paired, but the metadata change is waiting for approval.",
mobileHint:
"Di seluler? Salin URL lengkap (termasuk #token=...) dari openclaw dashboard --no-open di desktop Anda.",
docsTitle: "Dokumentasi pemasangan perangkat (dibuka di tab baru)",

View File

@@ -247,6 +247,15 @@ export const ja_JP: TranslationMap = {
},
pairing: {
hint: "このデバイスは Gateway ホストからのペアリング承認が必要です。",
scopeUpgradeTitle: "Scope upgrade pending approval.",
scopeUpgradeSummary:
"This device is already paired, but the requested wider scope is waiting for approval.",
roleUpgradeTitle: "Role upgrade pending approval.",
roleUpgradeSummary:
"This device is already paired, but the requested role change is waiting for approval.",
metadataUpgradeTitle: "Device metadata change pending approval.",
metadataUpgradeSummary:
"This device is already paired, but the metadata change is waiting for approval.",
mobileHint:
"モバイルを使用していますか? デスクトップで openclaw dashboard --no-open から完全な URL#token=... を含む)をコピーしてください。",
docsTitle: "デバイスのペアリングに関するドキュメント(新しいタブで開きます)",

View File

@@ -242,6 +242,15 @@ export const ko: TranslationMap = {
},
pairing: {
hint: "이 디바이스는 gateway host의 페어링 승인이 필요합니다.",
scopeUpgradeTitle: "Scope upgrade pending approval.",
scopeUpgradeSummary:
"This device is already paired, but the requested wider scope is waiting for approval.",
roleUpgradeTitle: "Role upgrade pending approval.",
roleUpgradeSummary:
"This device is already paired, but the requested role change is waiting for approval.",
metadataUpgradeTitle: "Device metadata change pending approval.",
metadataUpgradeSummary:
"This device is already paired, but the metadata change is waiting for approval.",
mobileHint:
"모바일에서 사용 중이신가요? 데스크톱에서 openclaw dashboard --no-open으로 전체 URL(#token=... 포함)을 복사하세요.",
docsTitle: "기기 페어링 문서(새 탭에서 열림)",

View File

@@ -244,6 +244,15 @@ export const pl: TranslationMap = {
},
pairing: {
hint: "To urządzenie wymaga zatwierdzenia parowania przez host Gateway.",
scopeUpgradeTitle: "Scope upgrade pending approval.",
scopeUpgradeSummary:
"This device is already paired, but the requested wider scope is waiting for approval.",
roleUpgradeTitle: "Role upgrade pending approval.",
roleUpgradeSummary:
"This device is already paired, but the requested role change is waiting for approval.",
metadataUpgradeTitle: "Device metadata change pending approval.",
metadataUpgradeSummary:
"This device is already paired, but the metadata change is waiting for approval.",
mobileHint:
"Na urządzeniu mobilnym? Skopiuj pełny URL (w tym #token=...) z openclaw dashboard --no-open na komputerze.",
docsTitle: "Dokumentacja parowania urządzeń (otwiera się w nowej karcie)",

View File

@@ -243,6 +243,15 @@ export const pt_BR: TranslationMap = {
},
pairing: {
hint: "Este dispositivo precisa de aprovação de pareamento do host do gateway.",
scopeUpgradeTitle: "Scope upgrade pending approval.",
scopeUpgradeSummary:
"This device is already paired, but the requested wider scope is waiting for approval.",
roleUpgradeTitle: "Role upgrade pending approval.",
roleUpgradeSummary:
"This device is already paired, but the requested role change is waiting for approval.",
metadataUpgradeTitle: "Device metadata change pending approval.",
metadataUpgradeSummary:
"This device is already paired, but the metadata change is waiting for approval.",
mobileHint:
"No celular? Copie a URL completa (incluindo #token=...) executando openclaw dashboard --no-open no desktop.",
docsTitle: "Documentação de pareamento de dispositivo (abre em nova aba)",

View File

@@ -246,6 +246,15 @@ export const tr: TranslationMap = {
},
pairing: {
hint: "Bu cihazın Gateway ana bilgisayarından eşleştirme onayı alması gerekiyor.",
scopeUpgradeTitle: "Scope upgrade pending approval.",
scopeUpgradeSummary:
"This device is already paired, but the requested wider scope is waiting for approval.",
roleUpgradeTitle: "Role upgrade pending approval.",
roleUpgradeSummary:
"This device is already paired, but the requested role change is waiting for approval.",
metadataUpgradeTitle: "Device metadata change pending approval.",
metadataUpgradeSummary:
"This device is already paired, but the metadata change is waiting for approval.",
mobileHint:
"Mobilde misiniz? Masaüstünüzde openclaw dashboard --no-open komutundan tam URL'yi (#token=... dahil) kopyalayın.",
docsTitle: "Cihaz eşleştirme belgeleri (yeni sekmede açılır)",

View File

@@ -245,6 +245,15 @@ export const uk: TranslationMap = {
},
pairing: {
hint: "Цей пристрій потребує схвалення спарювання від хоста шлюзу.",
scopeUpgradeTitle: "Scope upgrade pending approval.",
scopeUpgradeSummary:
"This device is already paired, but the requested wider scope is waiting for approval.",
roleUpgradeTitle: "Role upgrade pending approval.",
roleUpgradeSummary:
"This device is already paired, but the requested role change is waiting for approval.",
metadataUpgradeTitle: "Device metadata change pending approval.",
metadataUpgradeSummary:
"This device is already paired, but the metadata change is waiting for approval.",
mobileHint:
"На мобільному? Скопіюйте повний URL (включно з #token=...) з openclaw dashboard --no-open на вашому комп’ютері.",
docsTitle: "Документація щодо сполучення пристроїв (відкривається в новій вкладці)",

View File

@@ -239,6 +239,15 @@ export const zh_CN: TranslationMap = {
},
pairing: {
hint: "此设备需要网关主机的配对批准。",
scopeUpgradeTitle: "Scope upgrade pending approval.",
scopeUpgradeSummary:
"This device is already paired, but the requested wider scope is waiting for approval.",
roleUpgradeTitle: "Role upgrade pending approval.",
roleUpgradeSummary:
"This device is already paired, but the requested role change is waiting for approval.",
metadataUpgradeTitle: "Device metadata change pending approval.",
metadataUpgradeSummary:
"This device is already paired, but the metadata change is waiting for approval.",
mobileHint:
"在手机上?从桌面运行 openclaw dashboard --no-open 复制完整 URL包括 #token=...)。",
docsTitle: "设备配对文档(在新标签页中打开)",

View File

@@ -239,6 +239,15 @@ export const zh_TW: TranslationMap = {
},
pairing: {
hint: "此裝置需要閘道主機的配對批准。",
scopeUpgradeTitle: "Scope upgrade pending approval.",
scopeUpgradeSummary:
"This device is already paired, but the requested wider scope is waiting for approval.",
roleUpgradeTitle: "Role upgrade pending approval.",
roleUpgradeSummary:
"This device is already paired, but the requested role change is waiting for approval.",
metadataUpgradeTitle: "Device metadata change pending approval.",
metadataUpgradeSummary:
"This device is already paired, but the metadata change is waiting for approval.",
mobileHint:
"在手機上?從桌面執行 openclaw dashboard --no-open 複製完整 URL包括 #token=...)。",
docsTitle: "裝置配對文件(在新分頁中開啟)",

View File

@@ -67,27 +67,25 @@ export type OverviewProps = {
const PAIRING_HINT_COPY: Record<
PairingHint["kind"],
{
title: string;
summary: string | null;
titleKey: string | null;
summaryKey: string | null;
}
> = {
"pairing-required": {
title: "",
summary: null,
titleKey: null,
summaryKey: null,
},
"scope-upgrade-pending": {
title: "Scope upgrade pending approval.",
summary:
"This device is already paired, but the requested wider scope is waiting for approval.",
titleKey: "overview.pairing.scopeUpgradeTitle",
summaryKey: "overview.pairing.scopeUpgradeSummary",
},
"role-upgrade-pending": {
title: "Role upgrade pending approval.",
summary:
"This device is already paired, but the requested role change is waiting for approval.",
titleKey: "overview.pairing.roleUpgradeTitle",
summaryKey: "overview.pairing.roleUpgradeSummary",
},
"metadata-upgrade-pending": {
title: "Device metadata change pending approval.",
summary: "This device is already paired, but the metadata change is waiting for approval.",
titleKey: "overview.pairing.metadataUpgradeTitle",
summaryKey: "overview.pairing.metadataUpgradeSummary",
},
};
@@ -112,14 +110,16 @@ export function renderOverview(props: OverviewProps) {
return null;
}
const copy = PAIRING_HINT_COPY[pairingState.kind];
const title = copy.title || t("overview.pairing.hint");
const title = copy.titleKey ? t(copy.titleKey) : t("overview.pairing.hint");
const approveCommand = pairingState.requestId
? `openclaw devices approve ${pairingState.requestId}`
: "openclaw devices approve --latest";
return html`
<div class="muted" style="margin-top: 8px">
${title}
${copy.summary ? html`<div style="margin-top: 6px">${copy.summary}</div>` : nothing}
${copy.summaryKey
? html`<div style="margin-top: 6px">${t(copy.summaryKey)}</div>`
: nothing}
<div style="margin-top: 6px">
<span class="mono">${approveCommand}</span><br />
<span class="mono">openclaw devices list</span>