Files
goclaw/ui/web/src/i18n/locales/ko/nodes.json
T
yatulandClaude Opus 5 ea4890c257 fix(pairing): address review — docs, error mapping, approve feedback, unreadable expiry
- docs: device.pair.update and the `permanent` option on approve in
  docs/04-gateway-protocol.md, docs/19-websocket-rpc.md and
  websocket-protocol.md; the paired-device TTL row in docs/09-security.md
  now mentions the admin opt-out.
- store.ErrPairedDeviceNotFound: SetPairingPermanent wraps it in both stores.
  device.pair.update maps it to NOT_FOUND and any other store error to
  INTERNAL, so a DB failure no longer reads as "not found".
- web UI: approve and make-permanent/set-expiry now toast the server error
  and reload the list in `finally`. A partially applied approve (paired, but
  the permanent write failed) shows up in the table instead of leaving the
  dialog dead-ended.
- SQLite ListPaired: a stored expiry that fails to parse stays 0 (expires,
  date unknown) rather than being mistaken for permanent; the UI renders it
  as "--" instead of a 1970 date.

Tests: gateway handler error mapping (NOT_FOUND / INTERNAL / OK), sentinel
checks in the PG and SQLite store tests, SQLite unreadable-expiry case.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 19:26:43 +04:00

55 lines
2.1 KiB
JSON

{
"title": "노드",
"description": "페어링된 기기 및 대기 중인 페어링 요청 관리",
"emptyTitle": "기기 없음",
"emptyDescription": "페어링된 기기 또는 대기 중인 페어링 요청이 없습니다.",
"pendingRequests": "대기 중인 요청 ({{count}}개)",
"pairedDevices": "페어링된 기기 ({{count}}개)",
"sender": "발신자:",
"chat": "채팅:",
"columns": {
"channel": "채널",
"senderId": "발신자 ID",
"paired": "페어링됨",
"by": "처리자",
"expires": "만료",
"actions": "작업"
},
"approve": "승인",
"deny": "거부",
"revoke": "취소",
"never": "없음",
"makePermanent": "영구로 설정",
"makeExpiring": "만료 설정",
"confirmApprove": {
"title": "페어링 승인",
"description": "{{channel}}:{{senderId}}의 페어링 요청을 승인하시겠습니까 (코드: {{code}})? 이 기기가 에이전트와 상호작용할 수 있게 됩니다.",
"confirmLabel": "승인",
"permanent": "만료 없음 (기본값 30일)"
},
"confirmDeny": {
"title": "페어링 거부",
"description": "{{channel}}:{{senderId}}의 페어링 요청을 거부하시겠습니까 (코드: {{code}})? 요청이 제거됩니다.",
"confirmLabel": "거부"
},
"confirmRevoke": {
"title": "기기 취소",
"description": "{{channel}}:{{senderId}}의 페어링을 취소하시겠습니까? 기기는 다시 페어링해야 합니다.",
"confirmLabel": "취소"
},
"confirmPermanent": {
"title": "영구 페어링",
"description": "{{channel}}:{{senderId}} 페어링을 영구로 설정하시겠습니까? 수동으로 해제할 때까지 유지됩니다.",
"confirmLabel": "영구로 설정"
},
"confirmExpiring": {
"title": "페어링 만료 설정",
"description": "{{channel}}:{{senderId}} 페어링을 기본 기간으로 되돌리시겠습니까? 지금부터 30일 후 만료됩니다.",
"confirmLabel": "만료 설정"
},
"toast": {
"approveFailed": "페어링을 승인할 수 없습니다",
"updateFailed": "페어링 만료를 변경할 수 없습니다"
}
}