zigmini 0.9.0-beta.2 → 1.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ko.md +35 -5
- package/README.md +35 -5
- package/assets/agent/gateway-rules.md +1 -1
- package/assets/android/zigmini.apk +0 -0
- package/assets/android/zigmini.apk.json +3 -3
- package/assets/build.json +1 -1
- package/docs/manual.ko.md +51 -11
- package/docs/manual.md +52 -12
- package/host/omo-bridge/agent-control.ts +274 -0
- package/host/omo-bridge/bridge.ts +1 -1
- package/host/omo-bridge/continuity-control.ts +1 -1
- package/host/omo-bridge/model-control.ts +15 -3
- package/host/omo-bridge/task-control.ts +26 -16
- package/host/omo-check/patches/omo-5.1.48-compaction-recovery.patch +912 -0
- package/host/omo-check/patches/omo-5.1.48-gateway-port.manifest.json +12 -11
- package/host/omo-check/patches/omo-5.1.51-compaction-long-context.patch +92 -0
- package/host/omo-check/patches/omo-5.1.51-compaction-port.patch +2635 -0
- package/host/omo-check/patches/omo-5.1.51-compaction-recovery.patch +911 -0
- package/host/omo-check/patches/omo-5.1.51-gateway-port.manifest.json +363 -0
- package/host/omo-check/patches/omo-5.1.51-provider-failover.patch +50 -0
- package/host/omo-check/patches/omo-5.1.51-provider-port.patch +441 -0
- package/host/omo-check/patches/omo-5.1.51-rpc-port.patch +799 -0
- package/host/omo-check/patches/omo-5.1.51-runtime-compat.patch +31 -0
- package/package.json +3 -2
- package/src/agent/api.ts +215 -0
- package/src/agent/definition.ts +177 -0
- package/src/agent/fields.ts +42 -0
- package/src/agent/files.ts +192 -0
- package/src/agent/legacy-files.ts +46 -0
- package/src/agent/list.ts +21 -0
- package/src/agent-rules.ts +14 -5
- package/src/approvals.ts +6 -1
- package/src/cli/main.ts +33 -0
- package/src/cli/messages.ts +10 -2
- package/src/cli/rotate-main.ts +2 -1
- package/src/cli/scan.ts +414 -0
- package/src/cli/security-import.ts +155 -0
- package/src/compact.ts +22 -0
- package/src/decisions.ts +6 -4
- package/src/engine/compat.json +3 -3
- package/src/engine/index.ts +1 -0
- package/src/engine/schema-guard.ts +12 -4
- package/src/engine/sdk.ts +8 -0
- package/src/formal-verification.ts +366 -0
- package/src/gc.ts +37 -6
- package/src/hub.ts +525 -85
- package/src/main.ts +95 -9
- package/src/maintenance.ts +1 -1
- package/src/manual.ts +9 -2
- package/src/omo/client.ts +2 -0
- package/src/profile-prompt.ts +73 -0
- package/src/profile.ts +33 -10
- package/src/protocol.ts +11 -2
- package/src/question-notifications.ts +4 -1
- package/src/reply-notifications.ts +7 -1
- package/src/repo-security-setting.ts +33 -0
- package/src/runtime/paths.ts +16 -0
- package/src/security/baseline.ts +170 -0
- package/src/security/dex-strings.ts +242 -0
- package/src/security/repo-scan.ts +369 -0
- package/src/security/revision-probe.ts +144 -0
- package/src/security/terms.ts +97 -0
- package/src/security-allow.ts +1 -0
- package/src/security-baseline.ts +113 -0
- package/src/security-check.ts +91 -16
- package/src/server-text.ts +38 -0
- package/src/store.ts +142 -16
- package/src/transcript.ts +7 -1
- package/src/ui-language.ts +33 -0
- package/src/update/check.ts +7 -3
- package/src/update/handoff-system.ts +24 -16
- package/src/update/handoff.ts +23 -12
- package/src/update/helper.ts +72 -36
- package/src/update/request.ts +46 -30
- package/src/update/state.ts +21 -11
- package/src/update/strategy.ts +12 -5
- package/src/update/target.ts +32 -15
- package/src/usage.ts +43 -20
- package/src/version.ts +39 -16
- package/src/voice/agents.ts +8 -3
- package/src/voice/install.ts +29 -18
- package/src/work-watch.ts +40 -18
- package/web/agent-icon.js +15 -9
- package/web/agents.d.ts +201 -0
- package/web/agents.js +813 -0
- package/web/app-download.js +32 -19
- package/web/app.js +1407 -278
- package/web/autocopy.js +6 -1
- package/web/boot.js +27 -8
- package/web/commands.js +20 -11
- package/web/decisions.js +70 -49
- package/web/devlog.js +25 -19
- package/web/diagram.js +8 -3
- package/web/enroll.js +43 -22
- package/web/gc.js +32 -19
- package/web/i18n/agent-icon.js +24 -0
- package/web/i18n/agents.js +48 -0
- package/web/i18n/app-download.js +26 -0
- package/web/i18n/autocopy.js +5 -0
- package/web/i18n/boot.js +24 -0
- package/web/i18n/commands.js +34 -0
- package/web/i18n/decisions.js +24 -0
- package/web/i18n/devlog.js +60 -0
- package/web/i18n/diagram.js +12 -0
- package/web/i18n/enroll.js +22 -0
- package/web/i18n/gc.js +38 -0
- package/web/i18n/lastsent.js +10 -0
- package/web/i18n/main.d.ts +4 -0
- package/web/i18n/main.js +527 -0
- package/web/i18n/manual.d.ts +4 -0
- package/web/i18n/manual.js +14 -0
- package/web/i18n/memo.js +30 -0
- package/web/i18n/notifications.js +16 -0
- package/web/i18n/profile.js +13 -0
- package/web/i18n/reference.js +26 -0
- package/web/i18n/security-inbox.js +40 -0
- package/web/i18n/slash.js +38 -0
- package/web/i18n/turn-stats.js +5 -0
- package/web/i18n/update.js +42 -0
- package/web/i18n/voice.js +28 -0
- package/web/i18n/wake.js +16 -0
- package/web/i18n/workid.js +10 -0
- package/web/i18n/workstatus.js +20 -0
- package/web/i18n.d.ts +20 -0
- package/web/i18n.js +63 -0
- package/web/index.html +156 -96
- package/web/lastsent.js +9 -4
- package/web/manual.d.ts +1 -1
- package/web/manual.js +11 -5
- package/web/memo.js +18 -13
- package/web/notifications.js +12 -7
- package/web/profile.js +42 -17
- package/web/reference.js +20 -15
- package/web/security-inbox.d.ts +18 -1
- package/web/security-inbox.js +173 -4
- package/web/slash.js +23 -13
- package/web/style.css +132 -3
- package/web/tooltip.js +5 -2
- package/web/turn-stats.js +6 -2
- package/web/update.js +31 -23
- package/web/voice.js +18 -8
- package/web/wake.d.ts +4 -0
- package/web/wake.js +7 -3
- package/web/workid.js +12 -2
- package/web/workstatus.js +36 -32
package/web/i18n/main.js
ADDED
|
@@ -0,0 +1,527 @@
|
|
|
1
|
+
// The strings of web/index.html and web/app.js in English and Korean. app.js registers this dictionary with
|
|
2
|
+
// registerStrings (web/i18n.js); index.html refers to the keys with data-i18n, data-i18n-tip and data-i18n-attr, and
|
|
3
|
+
// app.js with t(). One row per key, [key, English, Korean], so the two languages can never drift apart.
|
|
4
|
+
// `{name}` placeholders are filled by t(key, params).
|
|
5
|
+
|
|
6
|
+
const STRINGS = [
|
|
7
|
+
// Shared words
|
|
8
|
+
["common.onShort", "On", "켬"],
|
|
9
|
+
["common.offShort", "Off", "끔"],
|
|
10
|
+
["common.yes", "Yes", "예"],
|
|
11
|
+
["common.no", "No", "아니오"],
|
|
12
|
+
["common.send", "Submit", "보내기"],
|
|
13
|
+
["common.cancel", "Cancel", "취소"],
|
|
14
|
+
["common.retry", "Retry", "다시 시도"],
|
|
15
|
+
["common.keep", "Keep", "그대로 두기"],
|
|
16
|
+
["common.delete", "Delete", "삭제"],
|
|
17
|
+
["common.remove", "Remove", "제거"],
|
|
18
|
+
["common.add", "Add", "추가"],
|
|
19
|
+
["common.save", "Save", "저장"],
|
|
20
|
+
["common.create", "Create", "만들기"],
|
|
21
|
+
["common.edit", "Edit", "편집"],
|
|
22
|
+
["common.change", "Change", "바꾸기"],
|
|
23
|
+
["common.continue", "Continue", "계속"],
|
|
24
|
+
["common.more", "Show more", "더 보기"],
|
|
25
|
+
["common.approve", "Approve", "승인"],
|
|
26
|
+
["common.deny", "Deny", "거절"],
|
|
27
|
+
["common.none", "(none)", "(없음)"],
|
|
28
|
+
["common.details", "Details", "자세히"],
|
|
29
|
+
["common.closeEsc", "Close (Esc)", "닫기 (Esc)"],
|
|
30
|
+
["common.checking", "Checking…", "확인 중…"],
|
|
31
|
+
["common.sending", "Sending…", "보내는 중…"],
|
|
32
|
+
["common.loading", "Loading…", "불러오는 중…"],
|
|
33
|
+
["common.processing", "Processing…", "처리 중…"],
|
|
34
|
+
["common.disconnected", "Disconnected.", "연결이 끊겼습니다."],
|
|
35
|
+
|
|
36
|
+
// Language names, each in its own language
|
|
37
|
+
["language.name.en", "English", "English"],
|
|
38
|
+
["language.name.ko", "한국어", "한국어"],
|
|
39
|
+
|
|
40
|
+
// Sidebar
|
|
41
|
+
["side.engine", "Engine", "엔진"],
|
|
42
|
+
["side.engine.tip", "Engine connection state", "엔진 연결 상태"],
|
|
43
|
+
["side.agents", "Agents", "에이전트"],
|
|
44
|
+
["side.agentManage.tip", "Manage agents: list, shared defaults, archive", "에이전트 관리: 목록, 공통 기본값, 보관함"],
|
|
45
|
+
["side.agentList.label", "Agent conversations", "에이전트 대화"],
|
|
46
|
+
["side.newAgent", "+ Agent", "+ 에이전트"],
|
|
47
|
+
|
|
48
|
+
// Work status region
|
|
49
|
+
["status.title", "Work status", "작업 상태"],
|
|
50
|
+
["status.open", "Show work status", "작업 상태 보기"],
|
|
51
|
+
["status.backToChat", "Back to the chat", "채팅으로 돌아가기"],
|
|
52
|
+
["status.fold", "Hide work status", "작업 상태 숨기기"],
|
|
53
|
+
["status.dismissFailed", "Could not clear the slot. Please press again shortly.", "칸을 비우지 못했습니다. 잠시 후 다시 눌러 주세요."],
|
|
54
|
+
|
|
55
|
+
// Profile block
|
|
56
|
+
["profile.me", "Me", "나"],
|
|
57
|
+
["profile.agent", "Default agent", "기본 에이전트"],
|
|
58
|
+
["profile.editNickname.tip", "Double-click to change your nickname", "더블클릭해서 닉네임 바꾸기"],
|
|
59
|
+
["profile.editAgentName.tip", "Double-click to change the default agent's name", "더블클릭해서 기본 에이전트 이름 바꾸기"],
|
|
60
|
+
["profile.editAgentIcon.tip", "Double-click to change the default agent's icon", "더블클릭해서 기본 에이전트 아이콘 바꾸기"],
|
|
61
|
+
["profile.agentName", "Default agent name", "기본 에이전트 이름"],
|
|
62
|
+
["profile.agentName.tooLong", "The default agent's name is too long: up to {hangul} Korean characters or {ascii} Latin letters. The name was not changed.",
|
|
63
|
+
"기본 에이전트 이름이 너무 깁니다. 한글은 {hangul}자, 영문은 {ascii}자까지 쓸 수 있습니다. 이름을 바꾸지 않았습니다."],
|
|
64
|
+
["profile.nickname.saveFailed", "Could not save the nickname to the gateway. The new name shows only in this browser.",
|
|
65
|
+
"닉네임을 게이트웨이에 저장하지 못했습니다. 이 브라우저에만 바뀐 이름이 보입니다."],
|
|
66
|
+
["profile.agentName.saveFailed", "Could not save the default agent's name to the gateway. The new name shows only in this browser.",
|
|
67
|
+
"기본 에이전트 이름을 게이트웨이에 저장하지 못했습니다. 이 브라우저에만 바뀐 이름이 보입니다."],
|
|
68
|
+
["profile.icon.tooLarge", "The image is larger than 1 MB.", "이미지가 1MB보다 큽니다."],
|
|
69
|
+
["profile.icon.type", "Only PNG, JPEG and WebP images can be used.", "PNG, JPEG, WebP 이미지만 쓸 수 있습니다."],
|
|
70
|
+
["profile.icon.empty", "The file is empty.", "빈 파일입니다."],
|
|
71
|
+
["profile.icon.saveFailed", "Could not save the icon to the gateway. Please try again shortly.", "아이콘을 게이트웨이에 저장하지 못했습니다. 잠시 후 다시 해 주세요."],
|
|
72
|
+
|
|
73
|
+
// Connection and engine state
|
|
74
|
+
["conn.connecting", "Connecting", "연결 중"],
|
|
75
|
+
["conn.connected", "Gateway connected", "게이트웨이 연결됨"],
|
|
76
|
+
["conn.waiting", "Waiting to reconnect", "재연결 대기"],
|
|
77
|
+
["engine.checking", "Checking work status", "작업 상태 확인 중"],
|
|
78
|
+
["engine.ready", "Engine connected", "엔진 연결됨"],
|
|
79
|
+
["engine.connecting", "Engine connecting", "엔진 연결 중"],
|
|
80
|
+
["engine.down", "Engine disconnected", "엔진 끊김"],
|
|
81
|
+
|
|
82
|
+
// Chat header
|
|
83
|
+
["head.sessionTransition", "Switching session", "세션 교체 중"],
|
|
84
|
+
["head.loginNotice", "Sign in to your model account", "모델 계정에 로그인하세요"],
|
|
85
|
+
["head.updateNotice.tip", "Open Update in Settings", "설정의 업데이트 열기"],
|
|
86
|
+
["head.newSession", "New session", "새 세션"],
|
|
87
|
+
["head.newSession.tip", "Starts a new engine session for this conversation. The transcript on screen stays.", "이 대화의 엔진 세션을 새로 시작합니다. 화면의 기록은 그대로 남습니다."],
|
|
88
|
+
["head.newSession.confirm", "Start a new engine session for this conversation?\nThe transcript on screen stays, and part of the recent conversation is handed to the new session.",
|
|
89
|
+
"이 대화의 엔진 세션을 새로 시작할까요?\n화면의 기록은 그대로 남고, 최근 대화 일부를 새 세션에 넘겨 줍니다."],
|
|
90
|
+
["head.voice.tip", "Turns this gateway's voice servers (speech recognition and speech synthesis) on or off. While off, the microphone, wake word, clap detection and spoken replies cannot be used.",
|
|
91
|
+
"이 게이트웨이의 음성 서버(음성 인식·음성 합성)를 켜고 끄기. 끄면 마이크·호출어·박수 감지·음성 답변을 쓸 수 없습니다."],
|
|
92
|
+
["head.voiceInstall.tip", "Downloads and installs the voice servers (uv, a Python environment, the voice models) into this Mac's zigmini folder",
|
|
93
|
+
"음성 서버(uv, Python 환경, 음성 모델)를 이 맥의 zigmini 폴더에 내려받아 설치합니다"],
|
|
94
|
+
["head.clap.tip", "Clap twice to turn wake-word listening on or off", "박수를 두 번 치면 호출어 대기를 켜고 끄기"],
|
|
95
|
+
["head.wake.tip", "Say \"Hey Zig\" to dictate into the composer", "\"헤이 지그\"라고 부르면 받아 적어 입력창에 채우기"],
|
|
96
|
+
["head.tts.tip", "Read replies aloud", "답변을 음성으로 읽기"],
|
|
97
|
+
["head.inbox.tip", "Questions and approval requests waiting for an answer (Ctrl+C)", "답을 기다리는 질문과 승인 요청 (Ctrl+C)"],
|
|
98
|
+
["head.events.tip", "Event panel (Ctrl+E)", "이벤트 패널 (Ctrl+E)"],
|
|
99
|
+
["head.agents.tip", "Agents: list, create, shared defaults, archive", "에이전트: 목록, 새로 만들기, 공통 기본값, 보관함"],
|
|
100
|
+
["head.settings.tip", "Settings: phone enrollment QR and registered devices", "설정: 폰 기기 등록 QR과 등록된 기기"],
|
|
101
|
+
["model.select.tip", "Model the engine uses", "엔진이 쓸 모델"],
|
|
102
|
+
["model.loading", "Loading models", "모델 불러오는 중"],
|
|
103
|
+
["model.title", "Engine model", "엔진 모델"],
|
|
104
|
+
["model.current", "Engine model: {name}", "엔진 모델: {name}"],
|
|
105
|
+
["model.currentFallback", "the current model", "현재 모델"],
|
|
106
|
+
["model.pending", "→ {name} pending", "→ {name} 대기"],
|
|
107
|
+
["model.pending.tip", "Switching to {name} needs a smaller context. It is applied after compaction when the next message is sent. Until then {current} is used.",
|
|
108
|
+
"{name}(으)로 바꾸려면 컨텍스트를 줄여야 합니다. 다음 메시지를 보낼 때 압축한 뒤 적용됩니다. 그때까지 {current}을(를) 씁니다."],
|
|
109
|
+
["model.pendingSuffix", " · {name}: applied after compaction at the next message", " · {name}: 다음 메시지 때 압축 뒤 적용"],
|
|
110
|
+
["model.loadFailed", "Could not load the model list: {error}", "모델 목록을 불러오지 못했습니다: {error}"],
|
|
111
|
+
["model.changeFailed", "Could not change the model: {error}", "모델을 바꾸지 못했습니다: {error}"],
|
|
112
|
+
|
|
113
|
+
// Chat transcript
|
|
114
|
+
["chat.lastSent.label", "Last message you sent", "마지막으로 보낸 메시지"],
|
|
115
|
+
["chat.lastSent.prefix", "Last sent · ", "마지막 보냄 · "],
|
|
116
|
+
["chat.nav.prev", "To my previous message", "이전 내 메시지로"],
|
|
117
|
+
["chat.nav.next", "To my next message · double-click for the bottom", "다음 내 메시지로 · 더블클릭하면 맨 아래로"],
|
|
118
|
+
["chat.nav.next.label", "To my next message, double-click for the bottom", "다음 내 메시지로, 더블클릭하면 맨 아래로"],
|
|
119
|
+
["chat.nav.unread", "New messages · double-click for the bottom", "새 메시지 있음 · 더블클릭하면 맨 아래로"],
|
|
120
|
+
["chat.read", "Read", "읽음"],
|
|
121
|
+
["chat.thinking", "thinking", "생각"],
|
|
122
|
+
["chat.tag.voice", "Voice", "음성"],
|
|
123
|
+
["chat.tag.notice", "Notice", "안내"],
|
|
124
|
+
["chat.turnStarted", "zigmini started working.", "zigmini가 작업을 시작했습니다."],
|
|
125
|
+
["chat.error", "Error: {message}", "오류: {message}"],
|
|
126
|
+
["chat.notice", "Notice: {message}", "알림: {message}"],
|
|
127
|
+
["progress.bash", "Command", "명령"],
|
|
128
|
+
["progress.eval", "Run code", "코드 실행"],
|
|
129
|
+
["progress.write", "Write file", "파일 쓰기"],
|
|
130
|
+
["progress.edit", "Edit file", "파일 수정"],
|
|
131
|
+
["progress.read", "Read file", "파일 읽기"],
|
|
132
|
+
["refs.label", "Messages to reference", "참조할 메시지"],
|
|
133
|
+
|
|
134
|
+
// Memo panel
|
|
135
|
+
["memo.title", "Memo", "쪽지"],
|
|
136
|
+
["memo.toggle.tip", "Open or close the memo", "쪽지 열기/닫기"],
|
|
137
|
+
["memo.addImage", "Keep an image", "이미지 보관"],
|
|
138
|
+
["memo.placeholder", "Keep prompts or notes you use often. Saved automatically.", "자주 쓰는 프롬프트나 메모를 적어 두세요. 자동 저장됩니다."],
|
|
139
|
+
["memo.imageInput.label", "Choose an image to keep in the memo", "쪽지에 보관할 이미지 선택"],
|
|
140
|
+
["memo.resize.tip", "Drag to resize", "드래그해서 크기 조절"],
|
|
141
|
+
|
|
142
|
+
// Composer
|
|
143
|
+
["composer.placeholder", "Send a message", "메시지 보내기"],
|
|
144
|
+
["composer.input.tip", "Enter sends, Shift+Enter adds a line", "Enter 전송, Shift+Enter 줄바꿈"],
|
|
145
|
+
["composer.send", "Send", "전송"],
|
|
146
|
+
["composer.sendIn", "Send {n}", "전송 {n}"],
|
|
147
|
+
["composer.stop", "Stop", "중단"],
|
|
148
|
+
["composer.stop.tip", "Stop the running work", "진행 중인 작업 중단"],
|
|
149
|
+
["composer.mic", "Mic", "마이크"],
|
|
150
|
+
["composer.mic.tip", "Press and speak (press again to send)", "누르고 말하기 (다시 누르면 전송)"],
|
|
151
|
+
["composer.mic.recognizing", "Recognizing", "인식 중"],
|
|
152
|
+
["composer.mic.recording", "Recording (press to send)", "녹음 중 (눌러서 전송)"],
|
|
153
|
+
["attach.button", "Image", "이미지"],
|
|
154
|
+
["attach.tip", "Attach images (up to 4 · paste or drop also works)", "이미지 첨부 (최대 4장 · 붙여넣기나 끌어놓기도 됩니다)"],
|
|
155
|
+
["attach.imageAlt", "Attached image", "첨부 이미지"],
|
|
156
|
+
["attach.remove", "Remove", "빼기"],
|
|
157
|
+
["attach.uploading", "Uploading…", "올리는 중…"],
|
|
158
|
+
["attach.busy", "Attachments cannot be added while images are uploading.", "이미지를 올리는 동안에는 첨부를 추가할 수 없습니다."],
|
|
159
|
+
["attach.types", "Only PNG, JPG, GIF and WebP images can be sent.", "PNG, JPG, GIF, WebP 이미지만 보낼 수 있습니다."],
|
|
160
|
+
["attach.max", "Up to {max} images can be sent at once.", "이미지는 한 번에 {max}장까지 보낼 수 있습니다."],
|
|
161
|
+
["attach.tooLarge", "Each image can be up to 10 MiB. Choose a smaller image.", "이미지는 한 장당 10 MiB까지 업로드할 수 있습니다. 더 작은 이미지를 선택하세요."],
|
|
162
|
+
["attach.rejected413", "The server or a proxy refused the request size (HTTP 413). Choose a smaller image. The draft was kept.",
|
|
163
|
+
"서버 또는 프록시가 요청 크기를 거부했습니다(HTTP 413). 더 작은 이미지를 선택하세요. 초안은 유지했습니다."],
|
|
164
|
+
["attach.uploadFailed", "Could not upload the image: {error}", "이미지를 올리지 못했습니다: {error}"],
|
|
165
|
+
["slash.label", "Commands and skills", "명령과 스킬"],
|
|
166
|
+
["slash.loading", "Loading engine commands and skills…", "엔진 명령과 스킬을 불러오는 중…"],
|
|
167
|
+
["slash.failed", "Could not load engine commands and skills. Only web Zig commands are shown.", "엔진 명령과 스킬을 불러오지 못했습니다. 웹 지그 명령만 보입니다."],
|
|
168
|
+
["slash.empty", "No matching command or skill.", "맞는 명령이나 스킬이 없습니다."],
|
|
169
|
+
|
|
170
|
+
// Voice features
|
|
171
|
+
["voice.ttsOn", "Spoken replies on", "음성 답변 켜짐"],
|
|
172
|
+
["voice.ttsOff", "Spoken replies off", "음성 답변 꺼짐"],
|
|
173
|
+
["voice.clapOn", "Clap detection on", "박수 감지 켜짐"],
|
|
174
|
+
["voice.clapOff", "Clap detection off", "박수 감지 꺼짐"],
|
|
175
|
+
["voice.clapSuspended", "Clap detection (click the page to start)", "박수 감지 (화면 클릭하면 시작)"],
|
|
176
|
+
["voice.wakeOff", "Wake word off", "호출어 꺼짐"],
|
|
177
|
+
["voice.wakeLoading", "Wake word loading", "호출어 준비 중"],
|
|
178
|
+
["voice.wakeListening", "Waiting for Hey Zig", "헤이 지그 대기"],
|
|
179
|
+
["voice.wakeArmed", "Speak now", "말씀하세요"],
|
|
180
|
+
// The wake phrases the recognizer is primed with; the wake word itself is Korean in both languages (web/wake.js matches it).
|
|
181
|
+
["voice.wakePrompt", "헤이 지그. 헤이 헤이 헤이.", "헤이 지그. 헤이 헤이 헤이."],
|
|
182
|
+
["voice.heard", "Heard: \"{text}\" (not the wake word)", "들은 말: \"{text}\" (호출어 아님)"],
|
|
183
|
+
["voice.tripleHey", "Hey hey hey: stopped the current work. Speak now.", "헤이 헤이 헤이: 하던 작업을 멈췄습니다. 말씀하세요."],
|
|
184
|
+
["voice.autoSendCancelled", "Auto-send cancelled ({reason})", "자동 전송 취소 ({reason})"],
|
|
185
|
+
["voice.autoSendCancel.edited", "the composer was edited", "입력창을 고쳐서"],
|
|
186
|
+
["voice.autoSendCancel.voice", "voice", "음성"],
|
|
187
|
+
["voice.sttFailed", "Speech recognition failed: {error}", "음성 인식 실패: {error}"],
|
|
188
|
+
["voice.micUnavailable", "The microphone cannot be used: {error}", "마이크를 쓸 수 없습니다: {error}"],
|
|
189
|
+
["voice.wakeSttFailed", "Wake word recognition failed: {error}", "호출어 인식 실패: {error}"],
|
|
190
|
+
["voice.wakeStartFailed", "Could not start wake-word listening: {error}", "호출어 대기를 시작하지 못했습니다: {error}"],
|
|
191
|
+
["voice.clapStartFailed", "Could not start clap detection: {error}", "박수 감지를 시작하지 못했습니다: {error}"],
|
|
192
|
+
["voice.clapEnableFailed", "Could not turn clap detection on: {error}", "박수 감지를 켜지 못했습니다: {error}"],
|
|
193
|
+
["voice.settingFailed", "Could not change the voice setting: {error}", "음성 설정을 바꾸지 못했습니다: {error}"],
|
|
194
|
+
["voice.playbackFailed", "Speech playback failed: {error}", "음성 재생 실패: {error}"],
|
|
195
|
+
["voice.ttsFailed", "Spoken reply failed: {error}", "음성 답변 실패: {error}"],
|
|
196
|
+
["voice.summaryFailed", "Speech summary failed ({error}); reading only the beginning.", "음성 요약 실패({error}), 앞부분만 읽습니다."],
|
|
197
|
+
["voice.nothingToRead", "There is no reply to read yet.", "읽을 답변이 아직 없습니다."],
|
|
198
|
+
["voice.installFailed", "Voice install failed: {message}", "음성 설치 실패: {message}"],
|
|
199
|
+
["voice.installDone", "Voice install finished. Press 'Voice off' to turn it on.", "음성 설치를 끝냈습니다. '음성 꺼짐'을 눌러 켜세요."],
|
|
200
|
+
["voice.installStartFailed", "Could not start the voice install: {error}", "음성 설치를 시작하지 못했습니다: {error}"],
|
|
201
|
+
|
|
202
|
+
// Approval and question cards
|
|
203
|
+
["approval.allowOnce", "Allow once", "승인"],
|
|
204
|
+
["approval.allowAlways", "Allow always", "항상 승인"],
|
|
205
|
+
["approval.deny", "Deny", "거절"],
|
|
206
|
+
["approval.denyFeedback", "Deny with feedback", "이유와 함께 거절"],
|
|
207
|
+
["approval.permissionRequest", "Permission request", "권한 요청"],
|
|
208
|
+
["approval.confirmRequest", "Confirmation request", "확인 요청"],
|
|
209
|
+
["approval.question", "Question", "질문"],
|
|
210
|
+
["approval.permission", "Permission", "권한"],
|
|
211
|
+
["approval.deadline", "Due {time}", "기한 {time}"],
|
|
212
|
+
["approval.noDeadline", "No deadline", "기한 없음"],
|
|
213
|
+
["approval.multiSelect", " (multiple choices allowed)", " (여러 개 선택 가능)"],
|
|
214
|
+
["approval.otherPlaceholder", "Type your own (optional)", "직접 입력 (선택)"],
|
|
215
|
+
["approval.otherFor", "{question} – type your own", "{question} 직접 입력"],
|
|
216
|
+
["approval.commentPlaceholder", "Anything to add (optional)", "덧붙일 말 (선택)"],
|
|
217
|
+
["approval.comment", "Anything to add", "덧붙일 말"],
|
|
218
|
+
["approval.answerInput", "Answer", "답변 입력"],
|
|
219
|
+
["approval.cancelled", "Cancelled", "취소됨"],
|
|
220
|
+
["approval.chosen", "Chosen: {value}", "선택: {value}"],
|
|
221
|
+
["approval.answered", "Answer: {value}", "답변: {value}"],
|
|
222
|
+
["approval.byTimeout", " (deadline passed)", " (기한 만료)"],
|
|
223
|
+
["approval.byCancelled", " (auto-cancelled)", " (자동 취소)"],
|
|
224
|
+
|
|
225
|
+
// Decisions (chat cards and inbox items)
|
|
226
|
+
["decision.primary.live", "Send the answer", "답변 보내기"],
|
|
227
|
+
["decision.primary.resume", "Answer and continue", "답변하고 이어가기"],
|
|
228
|
+
["decision.primary.permission", "New approval request", "새 승인 요청"],
|
|
229
|
+
["decision.primary.recheck", "Check the current situation", "현재 상황 확인"],
|
|
230
|
+
["decision.resend", "Send again", "다시 보내기"],
|
|
231
|
+
["decision.reviewLatest", "Check the latest content", "최신 내용 확인"],
|
|
232
|
+
["decision.later", "Later", "나중에"],
|
|
233
|
+
["decision.myAnswer", "My answer: {answer}", "내 답변: {answer}"],
|
|
234
|
+
["decision.originalChoices", "Original choices", "원래 선택지"],
|
|
235
|
+
["decision.lostAnswer", "Previously chosen answer (for reference; check the latest content and choose again before sending): {answer}",
|
|
236
|
+
"이전에 고른 답 (참고용, 최신 내용을 확인한 뒤 다시 골라야 보낼 수 있습니다): {answer}"],
|
|
237
|
+
["decision.unconfirmedAnswer", "Sent answer (delivery unconfirmed, for reference): {answer}", "보낸 답 (전달 확인 안 됨, 참고용): {answer}"],
|
|
238
|
+
["decision.reviewFirst", "Check the latest content, then answer again.", "최신 내용을 확인한 뒤 다시 답해 주세요."],
|
|
239
|
+
["decision.delivered", "The answer was delivered.", "답변이 전달됐습니다."],
|
|
240
|
+
["decision.userCancelled", "The question was cancelled by deleting it from the inbox.", "확인함에서 삭제해 질문을 취소했습니다."],
|
|
241
|
+
["decision.userDismissed", "Deleted from the inbox.", "확인함에서 삭제했습니다."],
|
|
242
|
+
["decision.superseded", "Replaced by a new question.", "새 질문으로 대체됐습니다."],
|
|
243
|
+
["decision.closed", "The request has ended.", "요청이 종료됐습니다."],
|
|
244
|
+
["decision.offline.answer", "Disconnected, so the answer cannot be sent. Please send it once reconnected.", "연결이 끊겨 답변을 보낼 수 없습니다. 다시 연결되면 보내 주세요."],
|
|
245
|
+
["decision.offline.send", "Disconnected, so it cannot be sent. Try again once connected.", "연결이 끊겨 보낼 수 없습니다. 연결된 뒤 다시 시도하세요."],
|
|
246
|
+
["decision.offline.kept", "Could not reach the server. Your draft is kept; send it again once connected.", "서버에 연결할 수 없습니다. 작성 내용은 남아 있으니 연결된 뒤 다시 보내 주세요."],
|
|
247
|
+
["decision.checkInboxLatest", "Please check the latest question in the inbox.", "확인함에서 최신 질문 내용을 확인해 주세요."],
|
|
248
|
+
["decision.incomplete", "Choose or fill in every required item before sending.", "필수 항목을 모두 고르거나 적어야 보낼 수 있습니다."],
|
|
249
|
+
["decision.unsupported", "This question format cannot be answered on the web.", "이 질문 형식은 웹에서 답할 수 없습니다."],
|
|
250
|
+
["decision.unsupportedRecheck", "This question format cannot be answered on the web. Use Check the current situation.", "이 질문 형식은 웹에서 답할 수 없습니다. 현재 상황 확인을 이용하세요."],
|
|
251
|
+
["decision.staleRequest", "Check the latest question, then answer again.", "최신 질문 내용을 확인한 뒤 다시 답해 주세요."],
|
|
252
|
+
["decision.conflict", "It was handled elsewhere first or the question changed. Check the latest content and choose again.", "다른 곳에서 먼저 처리됐거나 질문이 바뀌었습니다. 최신 내용을 확인하고 다시 골라 주세요."],
|
|
253
|
+
["decision.blocked", "{message} Choose send or do not send on the security check card in the chat.", "{message} 채팅의 보안검사 결과 카드에서 보내기 또는 보내지 않기를 고르세요."],
|
|
254
|
+
["decision.rejected", "The server did not accept the answer ({error}).", "서버가 답변을 받지 않았습니다 ({error})."],
|
|
255
|
+
["decision.gone", "This request no longer exists on the server.", "서버에 더 이상 없는 요청입니다."],
|
|
256
|
+
["decision.unavailable", "Server error ({status}{error}). Your draft is kept; please send it again shortly.", "서버 오류 ({status}{error}). 작성 내용은 남아 있으니 잠시 후 다시 보내 주세요."],
|
|
257
|
+
["decision.detailFailedStatus", "Could not load the decision state ({status}).", "결정 상태를 불러오지 못했습니다 ({status})."],
|
|
258
|
+
["decision.detailFailed", "Could not load the decision state: {error}", "결정 상태를 불러오지 못했습니다: {error}"],
|
|
259
|
+
["decision.idMismatch", "The decision identifier does not match.", "결정 식별자가 일치하지 않습니다."],
|
|
260
|
+
|
|
261
|
+
// Inbox panel
|
|
262
|
+
["inbox.title", "Inbox", "확인함"],
|
|
263
|
+
["inbox.close", "Close inbox", "확인함 닫기"],
|
|
264
|
+
["inbox.list.label", "Undecided items", "미결정 항목"],
|
|
265
|
+
["inbox.toggle.label", "Inbox, {count} need attention", "확인함, 확인 필요 {count}건"],
|
|
266
|
+
["inbox.summary", "Need attention {pending} · In transit {submitted}", "확인 필요 {pending} · 전달 중 {submitted}"],
|
|
267
|
+
["inbox.offline", "Disconnected. A connection is needed to send answers.", "연결이 끊겼습니다. 답변을 보내려면 연결이 필요합니다."],
|
|
268
|
+
["inbox.loadFailed", "Could not load the list: {error} ", "목록을 불러오지 못했습니다: {error} "],
|
|
269
|
+
["inbox.empty", "No items are waiting for an answer.", "답을 기다리는 항목이 없습니다."],
|
|
270
|
+
["inbox.mainConversation", "Main conversation", "메인 대화"],
|
|
271
|
+
["inbox.context", "Conversation context ({count})", "대화 맥락 ({count})"],
|
|
272
|
+
["inbox.meta.created", "Created", "생성"],
|
|
273
|
+
["inbox.meta.deadline", "Deadline", "기한"],
|
|
274
|
+
["inbox.meta.none", "None", "없음"],
|
|
275
|
+
["inbox.meta.expired", " (passed)", " (지남)"],
|
|
276
|
+
["inbox.meta.state", "State", "상태"],
|
|
277
|
+
["inbox.meta.required", " · required", " · 필수"],
|
|
278
|
+
["inbox.meta.waitReason", "Waiting because", "대기 이유"],
|
|
279
|
+
["inbox.deleteLabel", "Delete from the inbox", "확인함에서 삭제"],
|
|
280
|
+
["inbox.original", "View original", "원문 보기"],
|
|
281
|
+
["inbox.originalMissing", "The original card is not in the loaded history.", "원문 카드가 불러온 기록에 없습니다."],
|
|
282
|
+
["inbox.dismiss.label", "Delete confirmation", "삭제 확인"],
|
|
283
|
+
["inbox.dismiss.busy", "Deleting…", "지우는 중…"],
|
|
284
|
+
["inbox.dismiss.conflict", "It was handled elsewhere first or its state changed, so it could not be deleted. Check the latest content and delete again.",
|
|
285
|
+
"다른 곳에서 먼저 처리됐거나 상태가 바뀌어 지우지 못했습니다. 최신 내용을 확인한 뒤 다시 지워 주세요."],
|
|
286
|
+
["inbox.dismiss.rejected", "The server did not accept the deletion ({status}{error}).", "서버가 삭제를 받지 않았습니다 ({status}{error})."],
|
|
287
|
+
["inbox.dismiss.offline", "Could not reach the server to delete. Delete again once connected.", "서버에 연결할 수 없어 지우지 못했습니다. 연결된 뒤 다시 지워 주세요."],
|
|
288
|
+
|
|
289
|
+
// Security check cards (held messages and answers)
|
|
290
|
+
["security.cardLabel", "Security check", "보안 확인"],
|
|
291
|
+
["security.title.message", "Security check of the message", "메시지 보안 확인"],
|
|
292
|
+
["security.title.answer", "Security check of the answer", "답변 보안 확인"],
|
|
293
|
+
["security.question", "Approving sends the original and remembers the exact values above on this installation; the same values are allowed from the next check on. Cancelling stops only this transfer and does not stop existing work. ",
|
|
294
|
+
"승인하면 원본을 전송하고 위의 정확한 값 전체를 이 설치에 기억합니다. 같은 값은 다음 검사부터 허용합니다. 취소는 이번 전송만 중단하고 기존 작업은 멈추지 않습니다. "],
|
|
295
|
+
["security.question.answer", "This answer is not submitted; the original question and the answer you wrote stay as they are.", "이번 답은 제출하지 않으며 원래 질문과 답변 작성 내용은 그대로 둡니다."],
|
|
296
|
+
["security.question.message", "The message is restored only into the empty composer of the same conversation; a new draft, attachments or references are not changed.",
|
|
297
|
+
"메시지는 같은 대화의 빈 입력창에만 복구하며 새 초안·첨부·참조는 바꾸지 않습니다."],
|
|
298
|
+
["security.status.pending", "Awaiting your choice", "선택 대기"],
|
|
299
|
+
["security.status.processing", "Processing", "처리 중"],
|
|
300
|
+
["security.status.sent", "Transfer confirmed", "전송 확인"],
|
|
301
|
+
["security.status.cancelled", "This transfer cancelled", "이번 전송 취소"],
|
|
302
|
+
["security.status.failed", "Transfer failed", "전송 실패"],
|
|
303
|
+
["security.status.unconfirmed", "Transfer result unconfirmed · not resent automatically", "전송 결과 미확인 · 자동 재전송하지 않습니다"],
|
|
304
|
+
["security.remembered.unknown", "Remembering result unconfirmed", "값 기억 결과 미확인"],
|
|
305
|
+
["security.remembered.yes", "Exact values remembered", "정확한 값 기억됨"],
|
|
306
|
+
["security.remembered.no", "Values not remembered", "값 기억 안 됨"],
|
|
307
|
+
["security.reason.allowlist_persist_failed", "Could not save the allowed values", "허용 값을 저장하지 못했습니다"],
|
|
308
|
+
["security.reason.state_persist_failed", "Could not confirm the processing record", "처리 기록을 확인하지 못했습니다"],
|
|
309
|
+
["security.reason.payload_lost", "The held original is missing, so it could not be sent", "보류 원문이 없어 보내지 못했습니다"],
|
|
310
|
+
["security.reason.dispatch_failed", "Could not start the transfer", "전송을 시작하지 못했습니다"],
|
|
311
|
+
["security.reason.dispatch_unknown", "Could not confirm delivery", "전달 여부를 확인하지 못했습니다"],
|
|
312
|
+
["security.reason.original_decision_conflict", "The original question changed, so this answer was not sent", "원래 질문이 변경되어 이번 답을 보내지 않았습니다"],
|
|
313
|
+
["security.reason.unknown", "Check the status again", "상태를 다시 확인하세요"],
|
|
314
|
+
["security.approve", "Send the original and remember the values", "원본 전송하고 값 기억"],
|
|
315
|
+
["security.cancel", "Cancel this transfer", "이번 전송 취소"],
|
|
316
|
+
["security.refresh", "Check status", "상태 확인"],
|
|
317
|
+
["security.needsDetail", "Approval needs the gateway's remembering support and the full values confirmed.", "게이트웨이의 기억 지원과 전체 값을 확인해야 승인할 수 있습니다."],
|
|
318
|
+
["security.dismissText", "Cancels only this transfer. The original question and the answer you wrote remain.", "이번 전송만 취소합니다. 원래 질문과 답변 작성 내용은 남습니다."],
|
|
319
|
+
["security.dismissConfirm", "Cancel the transfer and delete", "전송 취소하고 삭제"],
|
|
320
|
+
["security.client.android", "Android app", "Android 앱"],
|
|
321
|
+
["security.client.web", "Web", "웹"],
|
|
322
|
+
|
|
323
|
+
// Device requests (banner and /기기 commands)
|
|
324
|
+
["device.locked", "Device enrollment is locked after {count} denied or expired requests. Unlock it to enroll a new device.",
|
|
325
|
+
"기기 등록 요청이 {count}번 거절·만료되어 잠겼습니다. 새 기기를 등록하려면 잠금을 푸세요."],
|
|
326
|
+
["device.unlock", "Unlock", "잠금 해제"],
|
|
327
|
+
["device.unlockFailed", "Unlock failed: {error}", "잠금 해제 실패: {error}"],
|
|
328
|
+
["device.request", "New device access request: {name} · code ", "새 기기 접속 요청: {name} · 확인 번호 "],
|
|
329
|
+
["device.autoDeny", " · denied automatically unless approved within 30 seconds", " · 30초 안에 승인하지 않으면 자동 거절"],
|
|
330
|
+
["device.actionFailed", "Device {action} failed: {error}", "기기 {action} 실패: {error}"],
|
|
331
|
+
["device.macOnly", "Devices can be managed only on the Mac", "기기 관리는 맥에서만 할 수 있습니다"],
|
|
332
|
+
["device.missing", "There is no device {index}", "{index}번 기기가 없습니다"],
|
|
333
|
+
["device.deleted", "Device deleted: {name} (it must enroll again to connect)", "기기 삭제: {name} (이 기기는 다시 등록해야 접속할 수 있습니다)"],
|
|
334
|
+
["device.status.pending", "Awaiting approval", "승인 대기"],
|
|
335
|
+
["device.status.approved", "Approved", "승인됨"],
|
|
336
|
+
["device.status.denied", "Denied", "거절됨"],
|
|
337
|
+
["device.neverSeen", "No connection yet", "접속 기록 없음"],
|
|
338
|
+
["device.list", "Registered devices: {list}", "등록된 기기: {list}"],
|
|
339
|
+
["device.listItem", "{index}. {name} · {status} · last seen {when}", "{index}. {name} · {status} · 마지막 접속 {when}"],
|
|
340
|
+
["device.none", "No registered devices.", "등록된 기기가 없습니다."],
|
|
341
|
+
["device.commandFailed", "Device command failed: {error}", "기기 명령 실패: {error}"],
|
|
342
|
+
|
|
343
|
+
// Settings dialog
|
|
344
|
+
["settings.title", "Settings", "설정"],
|
|
345
|
+
["settings.close", "Close settings", "설정 닫기"],
|
|
346
|
+
["settings.switchFailed", "Could not change the {name} setting: {error}", "{name} 설정을 바꾸지 못했습니다: {error}"],
|
|
347
|
+
["settings.language.title", "Language", "언어"],
|
|
348
|
+
["settings.language.note", "Applies to the web UI and the app of this gateway. The manual opens in this language too.", "이 게이트웨이의 웹 화면과 앱에 적용됩니다. 매뉴얼도 이 언어로 엽니다."],
|
|
349
|
+
["settings.language.saveFailed", "Could not save the language: {error}", "언어를 저장하지 못했습니다: {error}"],
|
|
350
|
+
["settings.update.title", "Update", "업데이트"],
|
|
351
|
+
["settings.update.changelog", "See what changed", "변경 내용 보기"],
|
|
352
|
+
["settings.update.openInbox", "Open the inbox", "확인함 열기"],
|
|
353
|
+
["settings.update.checkNow", "Check now", "지금 확인"],
|
|
354
|
+
["settings.update.checking", "Checking…", "확인 중…"],
|
|
355
|
+
["settings.update.run", "Update", "업데이트"],
|
|
356
|
+
["settings.update.consentInput.label", "Type the consent word", "동의하려면 동의를 입력하세요"],
|
|
357
|
+
["settings.update.consentGo", "Agree and update", "동의하고 업데이트"],
|
|
358
|
+
["settings.update.consentFailed", "Could not record the consent.", "동의를 기록하지 못했습니다."],
|
|
359
|
+
["settings.update.force", "Update anyway", "그래도 업데이트"],
|
|
360
|
+
["settings.enroll.title", "Device enrollment", "기기 등록"],
|
|
361
|
+
["settings.enroll.qrLabel", "Phone enrollment QR", "폰 등록 QR"],
|
|
362
|
+
["settings.enroll.renew", "Make a new one", "새로 만들기"],
|
|
363
|
+
["settings.devices.title", "Registered devices", "등록된 기기"],
|
|
364
|
+
["settings.devices.revokeFailed", "Could not revoke the device: {error}", "기기 등록 취소 실패: {error}"],
|
|
365
|
+
["settings.access.title", "External access", "외부 접속"],
|
|
366
|
+
["settings.access.choice.label", "External access method", "외부 접속 방식"],
|
|
367
|
+
["settings.access.homeWifi", "Home Wi-Fi only", "집 Wi-Fi만"],
|
|
368
|
+
["settings.access.tailscale", "Tailscale", "Tailscale"],
|
|
369
|
+
["settings.access.domain", "Your own domain", "자기 도메인"],
|
|
370
|
+
["settings.access.domainOption", "Your own domain (https)", "자기 도메인(https)"],
|
|
371
|
+
["settings.access.domain.placeholder", "https://your-domain", "https://도메인"],
|
|
372
|
+
["settings.access.domain.label", "Your domain address", "자기 도메인 주소"],
|
|
373
|
+
["settings.access.readFailed", "Could not read the external access state: {error}", "외부 접속 상태를 읽지 못했습니다: {error}"],
|
|
374
|
+
["settings.access.portOff", "The app port is off. Run `zigmini setup --access <choice>` in the Mac terminal first.", "앱 포트가 꺼져 있습니다. 맥 터미널에서 `zigmini setup --access <선택>`을 먼저 실행하세요."],
|
|
375
|
+
["settings.access.current", "Now: {choice} · {url}", "지금: {choice} · {url}"],
|
|
376
|
+
["settings.access.invalid", "Could not read access.json. Choose again.", "access.json을 읽지 못했습니다. 다시 고르세요."],
|
|
377
|
+
["settings.access.unset", "Now: not chosen", "지금: 고르지 않음"],
|
|
378
|
+
["settings.access.checking", "Checking…", "확인하는 중…"],
|
|
379
|
+
["settings.access.failedHttp", "Failed (HTTP {status})", "실패 (HTTP {status})"],
|
|
380
|
+
["settings.access.failed", "Failed: {error}", "실패: {error}"],
|
|
381
|
+
["settings.access.changed", "Changed. The enrollment QR is remade for the new address.", "바꿨습니다. 새 주소로 등록 QR을 다시 만듭니다."],
|
|
382
|
+
["settings.apk.title", "Download the app", "앱 내려받기"],
|
|
383
|
+
["settings.apk.qrLabel", "App download QR", "앱 내려받기 QR"],
|
|
384
|
+
["settings.formal.title", "Formal verification", "형식 검증"],
|
|
385
|
+
["settings.formal.tools.label", "Formal verification tools", "형식 검증 도구"],
|
|
386
|
+
["settings.formal.install", "Install", "설치"],
|
|
387
|
+
["settings.formal.installFailed", "Could not start the install: {error}", "설치를 시작하지 못했습니다: {error}"],
|
|
388
|
+
["settings.formal.status.off", "Off", "꺼짐"],
|
|
389
|
+
["settings.formal.status.not_installed", "Not installed", "설치 안 됨"],
|
|
390
|
+
["settings.formal.status.installing", "Installing…", "설치 중…"],
|
|
391
|
+
["settings.formal.status.installed", "Installed", "설치됨"],
|
|
392
|
+
["settings.formal.status.failed", "Install failed", "설치 실패"],
|
|
393
|
+
["settings.formal.tool.error", "Failure reason: {error}", "실패 원인: {error}"],
|
|
394
|
+
["settings.formal.toolSummary.tla-tlc", "Checks every execution order of concurrent designs. Install adds Homebrew openjdk@21 and tla2tools.jar.",
|
|
395
|
+
"동시 실행 설계의 모든 실행 순서를 검사합니다. 설치하면 Homebrew openjdk@21과 tla2tools.jar를 추가합니다."],
|
|
396
|
+
["settings.formal.tool.tla-tlc.detail", "Checks every execution order of concurrent designs (session rotation and others). The switch only chooses whether checks use the tool once it is installed. Install adds Homebrew openjdk@21 and tla2tools.jar 1.7.4; the system default java is not changed.",
|
|
397
|
+
"동시 실행 설계(세션 교체 등)의 모든 실행 순서를 검사합니다. 스위치는 설치된 도구를 검사에 쓸지만 정합니다. 설치를 누르면 Homebrew openjdk@21과 tla2tools.jar 1.7.4를 추가하고, 시스템 기본 java는 바꾸지 않습니다."],
|
|
398
|
+
["settings.formal.saveFailed", "Could not change the formal verification setting: {error}", "형식 검증 설정을 바꾸지 못했습니다: {error}"],
|
|
399
|
+
["settings.security.title", "Security check", "보안검사"],
|
|
400
|
+
["settings.security.message.title", "Message check before the engine", "엔진으로 가는 메시지 검사"],
|
|
401
|
+
["settings.security.message.summary", "A message that carries a secret, a home folder path or an internal IP is held, and you are asked before it goes to the engine.",
|
|
402
|
+
"비밀값·홈 폴더 경로·내부 IP가 든 메시지는 엔진에 보내기 전에 보류하고, 보낼지 묻습니다."],
|
|
403
|
+
["settings.security.message.detail", "If a sent message contains a value such as a secret key, token, password, home folder path or internal IP, it is held instead of going to the engine; the value is shown and you are asked whether to send it.",
|
|
404
|
+
"보낸 메시지에 비밀키, 토큰, 비밀번호, 홈 폴더 경로, 내부 IP 같은 값이 있으면 엔진에 보내지 않고 보류한 뒤, 값을 보여 주고 보낼지 묻습니다."],
|
|
405
|
+
["settings.security.message.saveFailed", "Could not change the security check setting: {error}", "보안검사 설정을 바꾸지 못했습니다: {error}"],
|
|
406
|
+
["settings.security.repo.title", "Output check", "결과물 검사"],
|
|
407
|
+
["settings.security.repo.summary", "zigmini scan finds secrets, personal data and the security baseline values in work output (repositories) before they leave for GitHub.",
|
|
408
|
+
"작업 결과물(저장소)에서 비밀값·개인정보와 보안 기준 값을 zigmini scan으로 찾아 GitHub 같은 외부로 나가지 않게 합니다."],
|
|
409
|
+
["settings.security.repo.detail", "Finds values that could be a security problem, such as secrets and personal data, and the values listed under \"Security baseline\" below in work output (repositories) with `zigmini scan`, so they do not leave for GitHub or elsewhere. While on, the rules of a new session also include the duty to \"check before merging\". When off, `zigmini scan` does not check and ends with exit code 4, and that duty leaves the new session rules. The `test:all` security check before a dev merge, set by the operating rules of the repository, runs regardless of this switch.",
|
|
410
|
+
"작업 결과물(저장소)에서 비밀값·개인정보처럼 보안 문제가 될 수 있는 값과 아래 \"보안 기준\"에 지정한 값을 `zigmini scan`으로 찾아, GitHub 같은 외부로 나가지 않게 합니다. 켜져 있으면 새 세션의 규칙에 \"머지 전에 검사한다\"는 의무도 들어갑니다. 끄면 `zigmini scan`이 검사하지 않고 종료 코드 4로 끝나며, 새 세션 규칙에서 그 의무가 빠집니다. 운영 규칙으로 정한 저장소의 dev 머지 전 `test:all` 보안검사는 이 스위치와 관계없이 그대로 돕니다."],
|
|
411
|
+
["settings.security.refreshList", "Check the list / retry", "목록 확인 / 다시 시도"],
|
|
412
|
+
["settings.security.allowed.title", "Remembered exact values", "기억한 정확한 값"],
|
|
413
|
+
["settings.security.allowed.note", "Only values approved on this installation are allowed from the next check on. Remove and Delete all drop the values as of that moment; they are held again at the next check, and a transfer already started is not cancelled. Allowing a transfer does not affect the repository and release security checks. Only a value with \"Also allowed in repository checks\" turned on passes the repository check; a value equal to an automatic item (home folder path, account name) cannot be turned on.",
|
|
414
|
+
"이 설치에서 승인한 값만 다음 검사부터 허용합니다. 제거·전체 삭제는 실행 시점의 값을 지웁니다. 다음 검사에서 다시 보류되며 이미 시작한 전송은 취소하지 않습니다. 전송 허용은 저장소·릴리스 보안검사에 영향이 없습니다. 값마다 \"저장소 검사에도 허용\"을 켠 값만 저장소 검사에서 통과합니다. 자동 항목(홈 폴더 경로·계정 이름)과 같은 값은 켤 수 없습니다."],
|
|
415
|
+
["settings.security.allowed.clearAll", "Delete all", "전체 삭제"],
|
|
416
|
+
["settings.security.allowed.empty", "No remembered values.", "기억한 값이 없습니다."],
|
|
417
|
+
["settings.security.allowed.repoOn", "Also allowed in repository checks: on", "저장소 검사에도 허용 켜짐"],
|
|
418
|
+
["settings.security.allowed.repoOff", "Also allowed in repository checks: off", "저장소 검사에도 허용 꺼짐"],
|
|
419
|
+
["settings.security.allowed.confirmText", "Removes the selected value, or every value as of now. They are held again from the next check; a transfer already started is not cancelled.",
|
|
420
|
+
"선택한 값 또는 실행 시점의 전체 값을 제거합니다. 다음 검사부터 다시 보류되며 이미 시작한 전송은 취소되지 않습니다."],
|
|
421
|
+
["settings.security.allowed.confirmRemove", "Confirm removal", "제거 확인"],
|
|
422
|
+
["settings.security.baseline.title", "Security baseline", "보안 기준"],
|
|
423
|
+
["settings.security.baseline.note", "The private strings the repository and release security checks look for. The gateway writes this list out as the baseline file, and `zigmini scan` checks with that file. The home folder path and the account name are automatic items and cannot be removed. The values show only on this screen.",
|
|
424
|
+
"저장소·릴리스 보안검사가 찾는 개인 문자열입니다. 게이트웨이가 이 목록을 기준 파일로 내보내고, `zigmini scan`이 그 파일로 검사합니다. 홈 폴더 경로와 계정 이름은 자동 항목이라 지울 수 없습니다. 값은 이 화면에서만 보입니다."],
|
|
425
|
+
["settings.security.baseline.input", "Private string to add", "추가할 개인 문자열"],
|
|
426
|
+
["settings.security.baseline.list.label", "Security baseline terms", "보안 기준 용어"],
|
|
427
|
+
["settings.security.baseline.empty", "No added terms.", "추가한 용어가 없습니다."],
|
|
428
|
+
["settings.security.baseline.file", "Baseline file: revision {revision} · {state}", "기준 파일: 개정 {revision} · {state}"],
|
|
429
|
+
["settings.security.baseline.exportFailed", "write failed ({error})", "기록 실패 ({error})"],
|
|
430
|
+
["settings.security.baseline.exportedAt", "last written {time}", "마지막 기록 {time}"],
|
|
431
|
+
["settings.security.baseline.notExported", "not written yet", "아직 기록하지 않았습니다"],
|
|
432
|
+
["settings.security.baseline.home", "Home folder path", "홈 폴더 경로"],
|
|
433
|
+
["settings.security.baseline.user", "Account name", "계정 이름"],
|
|
434
|
+
["settings.security.baseline.autoNote", "Automatic item · {label} · read-only", "자동 항목 · {label} · 읽기 전용"],
|
|
435
|
+
["settings.security.baseline.added", "Added {time}", "추가 {time}"],
|
|
436
|
+
["settings.security.baseline.confirmText", "Removes this term from the baseline. The next repository check no longer looks for it. A check already started does not change.",
|
|
437
|
+
"이 용어를 기준에서 지웁니다. 다음 저장소 검사부터 이 값을 찾지 않습니다. 이미 시작한 검사는 바뀌지 않습니다."],
|
|
438
|
+
["settings.security.baseline.confirmRemove", "Confirm deletion", "삭제 확인"],
|
|
439
|
+
["settings.notification.title", "Notifications", "알림"],
|
|
440
|
+
["settings.notification.inboxOnly", "Inbox notifications only", "확인함 알림만"],
|
|
441
|
+
["settings.notification.allReplies", "All reply notifications", "모든 답장 알림"],
|
|
442
|
+
["settings.notification.description", "All reply notifications include the inbox notifications and the finished-reply notifications of main and of works. Applies to every device connected to this gateway.",
|
|
443
|
+
"모든 답장 알림은 확인함 알림과 메인·작업의 완료된 답장 알림을 포함합니다. 이 게이트웨이에 연결된 모든 기기에 적용됩니다."],
|
|
444
|
+
["settings.gc.title", "Cleanup", "정리"],
|
|
445
|
+
["settings.gc.selectAll", "Select all", "전체 선택"],
|
|
446
|
+
["settings.gc.list.label", "Cleanup candidates", "정리 후보"],
|
|
447
|
+
["settings.gc.clean", "Clean the selected items", "선택한 항목 정리"],
|
|
448
|
+
["settings.gc.failedHttp", "Cleanup failed: HTTP {status}", "정리 실패: HTTP {status}"],
|
|
449
|
+
["settings.gc.failed", "Cleanup failed: {error}", "정리 실패: {error}"],
|
|
450
|
+
|
|
451
|
+
// Manual dialog (the texts of web/manual.js are in web/i18n/manual.js)
|
|
452
|
+
["manual.title", "Manual", "매뉴얼"],
|
|
453
|
+
["manual.open.tip", "User manual: screens, shortcuts, features", "사용자 매뉴얼: 화면, 단축키, 기능"],
|
|
454
|
+
["manual.close", "Close manual", "매뉴얼 닫기"],
|
|
455
|
+
["manual.loading", "Loading the manual.", "매뉴얼을 불러오는 중입니다."],
|
|
456
|
+
|
|
457
|
+
// Agents (sidebar, header and dialog)
|
|
458
|
+
["agent.staleBadge", "Definition changed · applies from the next session", "정의 바뀜 · 새 세션부터 적용"],
|
|
459
|
+
["agent.stale", "Definition changed", "정의 바뀜"],
|
|
460
|
+
["agent.answering", "Answering", "답하는 중"],
|
|
461
|
+
["agent.definitionError", "Error: the agent definition could not be read, so no session was opened. Check the definition in Edit.",
|
|
462
|
+
"오류: 에이전트 정의를 읽지 못해 세션을 열지 않았습니다. 편집에서 정의를 확인하세요."],
|
|
463
|
+
["agents.nav.label", "Agent views", "에이전트 화면"],
|
|
464
|
+
["agents.list", "List", "목록"],
|
|
465
|
+
["agents.list.note", "An agent is a conversation partner with one purpose. Each agent has one conversation and its own knowledge folder.",
|
|
466
|
+
"에이전트는 목적이 하나인 대화 상대입니다. 각 에이전트는 대화 하나와 전용 지식 폴더를 가집니다."],
|
|
467
|
+
["agents.defaults", "Shared defaults", "공통 기본값"],
|
|
468
|
+
["agents.trash", "Archive", "보관함"],
|
|
469
|
+
["agents.trash.note", "Deleted agents. Cleanup in Settings removes them after 30 days. Restoring brings back the definition, knowledge and conversation.",
|
|
470
|
+
"삭제한 에이전트입니다. 30일이 지나면 설정의 정리가 지웁니다. 되살리면 정의, 지식, 대화가 돌아옵니다."],
|
|
471
|
+
["agents.close", "Close agents", "에이전트 닫기"],
|
|
472
|
+
["agents.openConversation", "Open conversation", "대화 열기"],
|
|
473
|
+
["agents.clearOption", "(clear)", "(지우기)"],
|
|
474
|
+
["agents.inheritOption", "(inherit)", "(상속)"],
|
|
475
|
+
["agents.origin.tip", "Source of the value: {origin}", "값의 출처: {origin}"],
|
|
476
|
+
["agents.unparsed", "Kept as written", "원문 그대로"],
|
|
477
|
+
["agents.unparsed.tip", "The editor could not read this item's source text, so it is kept as is when saving. Changing it writes the new value.",
|
|
478
|
+
"편집기가 이 항목의 원문을 읽지 못해 저장할 때 그대로 둡니다. 바꾸면 새 값으로 씁니다."],
|
|
479
|
+
["agents.clearOverride", "Clear the override", "덮어쓰기 지우기"],
|
|
480
|
+
["agents.clearOverride.tip", "Clears this definition's value and uses the inherited one", "이 정의의 값을 지우고 상속값을 씁니다"],
|
|
481
|
+
["agents.files", "Knowledge files", "지식 파일"],
|
|
482
|
+
["agents.files.note", "The knowledge/ folder. Files are uploaded only here, into source/. The agent writes to notes/ and MEMORY.md.",
|
|
483
|
+
"knowledge/ 폴더입니다. source/에는 여기서만 파일을 올립니다. 에이전트는 notes/와 MEMORY.md에 씁니다."],
|
|
484
|
+
["agents.sourceFile.label", "File to upload into source/", "source/에 올릴 파일"],
|
|
485
|
+
["agents.sourceUpload", "Upload into source/", "source/에 올리기"],
|
|
486
|
+
["agents.defaultsSection", "Shared settings (defaults.md)", "공통 설정 (defaults.md)"],
|
|
487
|
+
["agents.new", "New agent", "새 에이전트"],
|
|
488
|
+
["agents.settingsFor", "Settings · {name}", "설정 · {name}"],
|
|
489
|
+
["agents.defaults.note", "Defaults that apply to every agent. Each agent's own values override them. A name and a one-line purpose cannot be set here.",
|
|
490
|
+
"모든 에이전트에 적용되는 기본값입니다. 각 에이전트의 값이 이것을 덮어씁니다. 이름과 목적 한 줄은 둘 수 없습니다."],
|
|
491
|
+
["agents.editor.note", "The tag beside each value shows where it comes from: the package default, shared (defaults.md) or this agent's definition. Changing a value makes it this agent's own. A saved change applies from the next session; open sessions keep the previous definition.",
|
|
492
|
+
"각 값 옆의 표시는 값의 출처입니다: 패키지 기본값, 공통(defaults.md), 에이전트(이 정의). 값을 바꾸면 이 에이전트의 값이 됩니다. 저장해도 열린 세션은 이전 정의를 쓰고 새 세션부터 적용됩니다."],
|
|
493
|
+
["agents.sharedInstructions", "Shared instructions", "공통 지시문"],
|
|
494
|
+
["agents.sharedInstructions.note", "Prepended to every agent's role instructions.", "모든 에이전트의 역할 지시문 앞에 붙습니다."],
|
|
495
|
+
["agents.roleInstructions", "Role instructions", "역할 지시문"],
|
|
496
|
+
["agents.roleInstructions.note", "Appended to the end of the system prompt. Describe the role, the tone, what to do and what not to do.",
|
|
497
|
+
"시스템 프롬프트 끝에 붙습니다. 역할, 말투, 해야 할 일과 하지 말아야 할 일을 적습니다."],
|
|
498
|
+
["agents.rawSection", "Other settings (raw YAML)", "기타 설정 (원문 YAML)"],
|
|
499
|
+
["agents.raw.note", "Items not in the registry appear here as written and are saved as they are.", "등록표에 없는 항목은 여기에 원문 그대로 보이고, 저장할 때도 그대로 둡니다."],
|
|
500
|
+
["agents.raw.label", "Other settings, raw YAML", "기타 설정 원문 YAML"],
|
|
501
|
+
["agents.clone", "Duplicate", "복제"],
|
|
502
|
+
["agents.deleteName.label", "Type the agent's name again to delete it", "삭제할 에이전트 이름 다시 입력"],
|
|
503
|
+
["agents.notSaved", "Not saved. Fix the marked items", "저장하지 않았습니다. 표시된 항목을 고치세요"],
|
|
504
|
+
["agents.defaultsSaved", "Shared defaults saved. Open sessions stay as they are; applies from the next session", "공통 기본값을 저장했습니다. 열린 세션은 그대로이고 새 세션부터 적용됩니다"],
|
|
505
|
+
["agents.saved", "Saved. Open sessions keep the previous definition; applies from the next session", "저장했습니다. 열린 세션은 이전 정의를 쓰고, 새 세션부터 적용됩니다"],
|
|
506
|
+
["agents.created", "\"{name}\" was created", "\"{name}\"을(를) 만들었습니다"],
|
|
507
|
+
["agents.created.line", "Agent \"{name}\" was created. Its session opens with the first message.", "에이전트 \"{name}\"을(를) 만들었습니다. 첫 메시지를 보내면 세션이 열립니다."],
|
|
508
|
+
["agents.archived", "\"{name}\" was moved to the archive. It can be restored within 30 days", "\"{name}\"을(를) 보관함으로 옮겼습니다. 30일 안에 되살릴 수 있습니다"],
|
|
509
|
+
["agents.restored", "\"{name}\" was restored", "\"{name}\"을(를) 되살렸습니다"],
|
|
510
|
+
["agents.restore", "Restore", "되살리기"],
|
|
511
|
+
["agents.deletedAt", " · deleted {time}", " · 삭제 {time}"],
|
|
512
|
+
["agents.pickFile", "Choose a file to upload", "올릴 파일을 고르세요"],
|
|
513
|
+
["agents.uploaded", "source/{name} uploaded ({size})", "source/{name} 올림 ({size})"],
|
|
514
|
+
|
|
515
|
+
// Event panel
|
|
516
|
+
["dev.title", "Events", "이벤트"],
|
|
517
|
+
["dev.clear", "Clear", "지우기"],
|
|
518
|
+
];
|
|
519
|
+
|
|
520
|
+
const en = {};
|
|
521
|
+
const ko = {};
|
|
522
|
+
for (const [key, english, korean] of STRINGS) {
|
|
523
|
+
en[key] = english;
|
|
524
|
+
ko[key] = korean;
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
export default { en, ko };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// The strings of web/manual.js (the user manual view) in English and Korean; manual.js registers them with registerStrings.
|
|
2
|
+
|
|
3
|
+
export default {
|
|
4
|
+
en: {
|
|
5
|
+
"manual.missing": "This gateway version has no manual. Update the gateway to see it.",
|
|
6
|
+
"manual.loadFailedOffline": "Could not load the manual. Check the gateway connection.",
|
|
7
|
+
"manual.loadFailedHttp": "Could not load the manual (HTTP {status}).",
|
|
8
|
+
},
|
|
9
|
+
ko: {
|
|
10
|
+
"manual.missing": "이 게이트웨이 버전에는 매뉴얼이 없습니다. 게이트웨이를 업데이트하면 볼 수 있습니다.",
|
|
11
|
+
"manual.loadFailedOffline": "매뉴얼을 불러오지 못했습니다. 게이트웨이 연결을 확인하세요.",
|
|
12
|
+
"manual.loadFailedHttp": "매뉴얼을 불러오지 못했습니다 (HTTP {status}).",
|
|
13
|
+
},
|
|
14
|
+
};
|
package/web/i18n/memo.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
en: {
|
|
3
|
+
"memo.savedImage": "Saved image {index}",
|
|
4
|
+
"memo.delete": "Delete",
|
|
5
|
+
"memo.deleteImage": "Delete saved image {index}",
|
|
6
|
+
"memo.saveFailed": "Could not save memo",
|
|
7
|
+
"memo.savingImage": "Saving image",
|
|
8
|
+
"memo.imageSaveFailed": "Could not save image",
|
|
9
|
+
"memo.imageLimit": "You can save up to two images.",
|
|
10
|
+
"memo.imageTypes": "Select PNG, JPEG, GIF, or WebP images.",
|
|
11
|
+
"memo.uploadingImage": "Uploading image",
|
|
12
|
+
"memo.imageStoreFailed": "Could not store image",
|
|
13
|
+
"memo.loadFailed": "Could not load memo",
|
|
14
|
+
"memo.resizeFailed": "Could not save memo size",
|
|
15
|
+
},
|
|
16
|
+
ko: {
|
|
17
|
+
"memo.savedImage": "보관한 이미지 {index}",
|
|
18
|
+
"memo.delete": "삭제",
|
|
19
|
+
"memo.deleteImage": "보관한 이미지 {index} 삭제",
|
|
20
|
+
"memo.saveFailed": "쪽지 저장 실패",
|
|
21
|
+
"memo.savingImage": "이미지 저장 중",
|
|
22
|
+
"memo.imageSaveFailed": "이미지 저장 실패",
|
|
23
|
+
"memo.imageLimit": "이미지는 두 개까지 보관할 수 있습니다.",
|
|
24
|
+
"memo.imageTypes": "PNG, JPEG, GIF, WebP 이미지를 선택해 주세요.",
|
|
25
|
+
"memo.uploadingImage": "이미지 업로드 중",
|
|
26
|
+
"memo.imageStoreFailed": "이미지 보관 실패",
|
|
27
|
+
"memo.loadFailed": "쪽지 불러오기 실패",
|
|
28
|
+
"memo.resizeFailed": "쪽지 크기 저장 실패",
|
|
29
|
+
},
|
|
30
|
+
};
|