@tunnelbox/core 0.1.0 → 0.1.7
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.md +16 -11
- package/README.zh-CN.md +28 -0
- package/dist/index.js +1630 -0
- package/locales/de-DE.json +161 -0
- package/locales/en-US.json +161 -0
- package/locales/es-ES.json +161 -0
- package/locales/fr-FR.json +161 -0
- package/locales/ja-JP.json +161 -0
- package/locales/ko-KR.json +161 -0
- package/locales/zh-CN.json +161 -0
- package/locales/zh-TW.json +161 -0
- package/package.json +18 -4
- package/src/env.ts +15 -0
- package/src/i18n.ts +114 -0
- package/src/index.ts +11 -9
- package/src/qr.ts +84 -18
- package/src/state.ts +101 -105
- package/src/types.ts +156 -127
package/dist/index.js
ADDED
|
@@ -0,0 +1,1630 @@
|
|
|
1
|
+
// @tunnelbox/core — built by scripts/build.mjs
|
|
2
|
+
|
|
3
|
+
// src/types.ts
|
|
4
|
+
function envelope(type, payload, id) {
|
|
5
|
+
return { id, type, payload, ts: Date.now() };
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
// src/relay.ts
|
|
9
|
+
var BASE_DELAY = 1e3;
|
|
10
|
+
var MAX_DELAY = 15e3;
|
|
11
|
+
var RelayClient = class {
|
|
12
|
+
ws = null;
|
|
13
|
+
url = "";
|
|
14
|
+
headers = {};
|
|
15
|
+
handlers = null;
|
|
16
|
+
timer = null;
|
|
17
|
+
retry = 0;
|
|
18
|
+
stopped = false;
|
|
19
|
+
connected = false;
|
|
20
|
+
get isConnected() {
|
|
21
|
+
return this.connected;
|
|
22
|
+
}
|
|
23
|
+
connect(url, headers, handlers) {
|
|
24
|
+
this.url = url;
|
|
25
|
+
this.headers = headers;
|
|
26
|
+
this.handlers = handlers;
|
|
27
|
+
this.stopped = false;
|
|
28
|
+
this.retry = 0;
|
|
29
|
+
this.open();
|
|
30
|
+
}
|
|
31
|
+
send(env) {
|
|
32
|
+
if (this.ws && this.connected) {
|
|
33
|
+
try {
|
|
34
|
+
this.ws.send(JSON.stringify(env));
|
|
35
|
+
return true;
|
|
36
|
+
} catch {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
close() {
|
|
43
|
+
this.stopped = true;
|
|
44
|
+
if (this.timer) clearTimeout(this.timer);
|
|
45
|
+
this.timer = null;
|
|
46
|
+
if (this.ws) {
|
|
47
|
+
try {
|
|
48
|
+
this.ws.close();
|
|
49
|
+
} catch {
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
this.ws = null;
|
|
53
|
+
this.connected = false;
|
|
54
|
+
}
|
|
55
|
+
open() {
|
|
56
|
+
if (this.stopped) return;
|
|
57
|
+
try {
|
|
58
|
+
const ws = new WebSocket(this.url, { headers: this.headers });
|
|
59
|
+
this.ws = ws;
|
|
60
|
+
ws.onopen = () => {
|
|
61
|
+
this.connected = true;
|
|
62
|
+
this.retry = 0;
|
|
63
|
+
this.handlers?.onOpen();
|
|
64
|
+
};
|
|
65
|
+
ws.onmessage = (ev) => {
|
|
66
|
+
try {
|
|
67
|
+
const msg = JSON.parse(String(ev.data));
|
|
68
|
+
this.handlers?.onMessage(msg);
|
|
69
|
+
} catch {
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
ws.onerror = (e) => this.handlers?.onError(e);
|
|
73
|
+
ws.onclose = () => {
|
|
74
|
+
this.connected = false;
|
|
75
|
+
this.ws = null;
|
|
76
|
+
this.handlers?.onClose();
|
|
77
|
+
this.scheduleReconnect();
|
|
78
|
+
};
|
|
79
|
+
} catch (e) {
|
|
80
|
+
this.handlers?.onError(e);
|
|
81
|
+
this.scheduleReconnect();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
scheduleReconnect() {
|
|
85
|
+
if (this.stopped) return;
|
|
86
|
+
const delay = Math.min(BASE_DELAY * 2 ** this.retry, MAX_DELAY);
|
|
87
|
+
this.retry++;
|
|
88
|
+
this.timer = setTimeout(() => this.open(), delay);
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
// src/state.ts
|
|
93
|
+
import { randomBytes } from "crypto";
|
|
94
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
|
|
95
|
+
import { homedir } from "os";
|
|
96
|
+
import { dirname, join } from "path";
|
|
97
|
+
|
|
98
|
+
// locales/zh-CN.json
|
|
99
|
+
var zh_CN_default = {
|
|
100
|
+
"agent.err.createSession": "\u521B\u5EFA\u4F1A\u8BDD\u5931\u8D25",
|
|
101
|
+
"agent.err.httpClient": "\u65E0\u6CD5\u8BBF\u95EE opencode HTTP client",
|
|
102
|
+
"agent.err.unknownPerm": "\u672A\u77E5\u7684\u6743\u9650\u8BF7\u6C42: {id}",
|
|
103
|
+
"agent.err.unknownQuestion": "\u672A\u77E5\u7684\u63D0\u95EE\u8BF7\u6C42: {id}",
|
|
104
|
+
"agent.log.fallback404": "\u56DE\u5305\u9996\u9009\u7AEF\u70B9 404\uFF0C\u56DE\u9000\u53E6\u4E00\u7AEF\u70B9: {message}",
|
|
105
|
+
"agent.log.gotPermReply": "\u6536\u5230\u624B\u673A\u6743\u9650\u56DE\u590D (id={id} {reply} {version})",
|
|
106
|
+
"agent.log.gotQuestionReply": "\u6536\u5230\u624B\u673A\u63D0\u95EE\u56DE\u590D (id={id} {status} {version})",
|
|
107
|
+
"agent.log.handleFailed": "\u5904\u7406 {type} \u5931\u8D25: {message}",
|
|
108
|
+
"agent.log.httpOk": "opencode HTTP {status} {path}",
|
|
109
|
+
"agent.log.pendingResent": "session.pending: \u8865\u53D1 {session} \u79EF\u538B\u8BF7\u6C42 {count} \u6761",
|
|
110
|
+
"agent.log.unhandledType": "\u672A\u5904\u7406\u7684\u6D88\u606F\u7C7B\u578B: {type}",
|
|
111
|
+
"events.log.fwdPermission": "\u8F6C\u53D1\u6743\u9650\u8BF7\u6C42\u5230\u624B\u673A (id={id} tool={tool} {version})",
|
|
112
|
+
"events.log.permissionReplied": "opencode \u56DE\u6267 permission.replied (id={id} {response})",
|
|
113
|
+
"events.log.questionRejected": "opencode \u56DE\u6267 question.rejected (id={id})",
|
|
114
|
+
"events.log.questionReplied": "opencode \u56DE\u6267 question.replied (id={id})",
|
|
115
|
+
"index.error.connectRelay": "\u65E0\u6CD5\u8FDE\u63A5\u4E2D\u7EE7\uFF0C\u8BF7\u68C0\u67E5\u4E2D\u7EE7\u5730\u5740\u540E\u91CD\u8BD5",
|
|
116
|
+
"index.error.pairTimeout": "\u7B49\u5F85\u914D\u5BF9\u7801\u8D85\u65F6\uFF08\u4E2D\u7EE7\u672A\u54CD\u5E94\uFF09",
|
|
117
|
+
"index.log.claimed": "\u5DF2\u7ED1\u5B9A\u5230\u624B\u673A\u8D26\u53F7\uFF0C\u4E4B\u540E\u624B\u673A\u4ECE\u300C\u6211\u7684\u7535\u8111\u300D\u76F4\u63A5\u8FDE\u63A5\uFF0C\u65E0\u9700\u518D\u626B\u7801",
|
|
118
|
+
"index.log.connectedRelay": "\u5DF2\u8FDE\u63A5\u4E2D\u7EE7 {url}",
|
|
119
|
+
"index.log.disconnected": "\u4E0E\u4E2D\u7EE7\u65AD\u5F00\uFF0C\u6B63\u5728\u81EA\u52A8\u91CD\u8FDE\u2026",
|
|
120
|
+
"index.log.exit": "\u5DF2\u9000\u51FA",
|
|
121
|
+
"index.log.pairCode": "\u751F\u6210\u914D\u5BF9\u7801: {code}",
|
|
122
|
+
"index.log.pairingStillClaimed": "\u6B64\u914D\u5BF9\u7801\u4EC5\u4F9B\u540C\u8D26\u53F7\u7684\u65B0\u624B\u673A\u91CD\u65B0\u914D\u5BF9\uFF1B\u672C\u673A\u5DF2\u7ED1\u5B9A\uFF0C\u4ECD\u53EF\u4ECE\u624B\u673A\u300C\u6211\u7684\u7535\u8111\u300D\u76F4\u63A5\u8FDE\u63A5\u3002",
|
|
123
|
+
"index.log.pairingPreparing": "\u6B63\u5728\u8FDE\u63A5\u4E2D\u7EE7\u5E76\u751F\u6210\u914D\u5BF9\u7801\u2026",
|
|
124
|
+
"index.log.permissionToPhone": "\u6743\u9650\u8BF7\u6C42 \u2192 \u624B\u673A\u5BA1\u6279 (id={id} tool={tool})",
|
|
125
|
+
"index.log.permissionTuiFallback": "app \u79BB\u7EBF\uFF0C\u6743\u9650\u8BF7\u6C42\u7531 opencode TUI \u515C\u5E95 (id={id} tool={tool})",
|
|
126
|
+
"index.log.relayError": "\u4E2D\u7EE7\u9519\u8BEF: {msg}",
|
|
127
|
+
"index.log.resetIdentity": "\u88AB\u8D26\u53F7\u89E3\u7ED1\uFF0C\u6B63\u5728\u91CD\u7F6E\u8EAB\u4EFD\u5E76\u91CD\u65B0\u751F\u6210\u914D\u5BF9\u7801\u2026",
|
|
128
|
+
"index.log.unknown": "\u672A\u77E5",
|
|
129
|
+
"install.codeLine": "\u914D\u5BF9\u7801: {code}",
|
|
130
|
+
"install.commandInstalled": "\u5DF2\u5B89\u88C5\u547D\u4EE4: {path}",
|
|
131
|
+
"install.done": "\u5B8C\u6210\u3002\u5DF2\u5C1D\u8BD5\u8FDE\u63A5\u4E2D\u7EE7\u8F93\u51FA\u672C\u673A\u914D\u5BF9\u4FE1\u606F\uFF1A",
|
|
132
|
+
"install.failConnect": "\uFF08\u672A\u80FD\u5373\u65F6\u8FDE\u63A5\u4E2D\u7EE7\u6253\u5370\u914D\u5BF9\u4FE1\u606F\u2014\u2014\u4E2D\u7EE7\u4E0D\u53EF\u8FBE\u6216\u5F53\u524D Node \u8FC7\u65E7\u3002",
|
|
133
|
+
"install.failConnectHint": "\u91CD\u542F opencode \u540E\u53EF\u7528 --print-logs \u67E5\u770B\u7EC8\u7AEF\u4E8C\u7EF4\u7801\uFF0C\u6216\u5728 opencode \u5185\u8F93\u5165\u201C\u663E\u793A\u624B\u673A\u914D\u5BF9\u7801\u201D\u6216 /pair\u3002\uFF09",
|
|
134
|
+
"install.hintFresh": "\u63D0\u793A\uFF1A\u914D\u5BF9\u7801\u4E3A\u4E00\u6B21\u6027\uFF0C\u7EA6 10 \u5206\u949F\u6709\u6548\uFF1B\u82E5\u7A0D\u540E\u624D\u542F\u52A8 opencode\uFF0C\u4EE5\u542F\u52A8\u65F6\u7EC8\u7AEF\u6253\u5370\u6216 /pair \u53D6\u5F97\u7684\u6700\u65B0\u914D\u5BF9\u4FE1\u606F\u4E3A\u51C6\u3002",
|
|
135
|
+
"install.pluginInstalled": "\u5DF2\u5B89\u88C5\u63D2\u4EF6: {path}",
|
|
136
|
+
"install.qrUnavailable": "\uFF08\u4E8C\u7EF4\u7801\u6E32\u67D3\u4E0D\u53EF\u7528\uFF0C\u8BF7\u4F7F\u7528\u4E0A\u65B9\u914D\u5BF9\u7801\uFF09",
|
|
137
|
+
"install.qrcodeEnsure": "\u5B89\u88C5 qrcode \u5230 opencode \u914D\u7F6E\u76EE\u5F55\u2026",
|
|
138
|
+
"install.qrcodeFail": "qrcode \u5B89\u88C5\u5931\u8D25\uFF08\u4E0D\u5F71\u54CD\u4F7F\u7528\uFF0C\u4EC5\u663E\u793A\u914D\u5BF9\u7801\uFF09: {err}",
|
|
139
|
+
"install.relayError": "\u4E2D\u7EE7\u8FD4\u56DE\u9519\u8BEF: {msg}",
|
|
140
|
+
"install.scanHint": "\u624B\u673A\u6253\u5F00 tunnelbox App\u300C\u626B\u4E00\u626B\u914D\u5BF9\u300D\uFF0C\u626B\u63CF\u4E0A\u65B9\u4E8C\u7EF4\u7801\u5373\u53EF\u8FDE\u63A5\uFF1A",
|
|
141
|
+
"pair.heading": "tunnelbox \u624B\u673A\u914D\u5BF9",
|
|
142
|
+
"pair.howTo": "\u5728\u624B\u673A\u4E0A\u6253\u5F00 tunnelbox App\uFF0C\u7528\u300C\u626B\u4E00\u626B\u914D\u5BF9\u300D\u626B\u63CF\u4E0A\u65B9\u4E8C\u7EF4\u7801\uFF0C\u6216\u624B\u52A8\u8F93\u5165\u914D\u5BF9\u7801\u3002",
|
|
143
|
+
"pair.oneTime": "\u914D\u5BF9\u7801\u4E3A\u4E00\u6B21\u6027\uFF0C\u4F7F\u7528\u540E\u5373\u5931\u6548\uFF1B\u5982\u9700\u65B0\u7801\uFF0C\u53EF\u8981\u6C42\u201C\u5237\u65B0\u914D\u5BF9\u7801\u201D\u3002",
|
|
144
|
+
"pair.promptBody": "\u8BF7\u5E2E\u6211\u67E5\u770B\u672C\u673A\u624B\u673A\u8FDC\u7A0B\u914D\u5BF9\u4FE1\u606F\uFF1A\u663E\u793A\u914D\u5BF9\u7801\u4E0E\u53EF\u4F9B\u626B\u7801\u7684\u4E8C\u7EF4\u7801\u3002\u4E8C\u7EF4\u7801\u8BF7\u653E\u5728\u7B49\u5BBD\u4EE3\u7801\u5757\u91CC\u5E76\u9010\u5B57\u539F\u6837\u4FDD\u7559\uFF0C\u65B9\u4FBF\u6211\u7528\u624B\u673A\u626B\u7801\u3002",
|
|
145
|
+
"pair.promptDescription": "\u663E\u793A\u624B\u673A\u8FDC\u7A0B\u914D\u5BF9\u7684\u914D\u5BF9\u7801\u4E0E\u626B\u7801\u4E8C\u7EF4\u7801",
|
|
146
|
+
"pair.scanIntro": "**\u626B\u4E00\u626B\u914D\u5BF9**\uFF1A\u624B\u673A\u6253\u5F00 tunnelbox App\u300C\u626B\u4E00\u626B\u914D\u5BF9\u300D\uFF0C\u626B\u63CF\u4E0B\u65B9\u4E8C\u7EF4\u7801\u5373\u53EF\u81EA\u52A8\u8FDE\u63A5\u3002",
|
|
147
|
+
"perm.promptAuthorize": "opencode \u8BF7\u6C42\u6388\u6743",
|
|
148
|
+
"perm.promptPatterns": "opencode \u8BF7\u6C42\u8BBF\u95EE\uFF1A{list}",
|
|
149
|
+
"perm.promptResource": "opencode \u8BF7\u6C42\u8BBF\u95EE\u8D44\u6E90\uFF1A{list}",
|
|
150
|
+
"perm.promptTool": "opencode \u8BF7\u6C42\u6267\u884C {tool}",
|
|
151
|
+
"qr.codeLabel": "\u914D\u5BF9\u7801",
|
|
152
|
+
"qr.fileWritten": "\u914D\u5BF9\u4FE1\u606F\u5DF2\u5199\u5165: {path}",
|
|
153
|
+
"qr.openHint": "\u6253\u5F00 tunnelbox App\uFF0C\u7528\u300C\u626B\u4E00\u626B\u914D\u5BF9\u300D\u626B\u63CF\u4E0A\u65B9\u4E8C\u7EF4\u7801\uFF0C\u6216\u624B\u52A8\u8F93\u5165\u914D\u5BF9\u7801\u3002",
|
|
154
|
+
"qr.titleNoType": "tunnelbox \u624B\u673A\u914D\u5BF9",
|
|
155
|
+
"qr.titleWithType": "tunnelbox {type} \u624B\u673A\u914D\u5BF9",
|
|
156
|
+
"qr.unavailable": "\uFF08\u672A\u5B89\u88C5 qrcode\uFF0C\u8BF7\u4F7F\u7528\u4E0A\u65B9\u914D\u5BF9\u7801\uFF09",
|
|
157
|
+
"claude.errBusy": "\u8BE5\u4F1A\u8BDD\u6B63\u5728\u751F\u6210\u4E2D\uFF0C\u8BF7\u7B49\u5F85\u5B8C\u6210\u6216\u5148\u505C\u6B62",
|
|
158
|
+
"claude.errTurn": "\u751F\u6210\u51FA\u9519",
|
|
159
|
+
"claude.pairingStillClaimed": "\u5DF2\u7ED1\u5B9A\u624B\u673A\u8D26\u53F7\uFF1A\u6B64\u914D\u5BF9\u7801\u4EC5\u7528\u4E8E\u540C\u8D26\u53F7\u65B0\u8BBE\u5907\u91CD\u65B0\u914D\u5BF9\uFF0C\u5F53\u524D\u8BBE\u5907\u53EF\u76F4\u63A5\u4ECE\u624B\u673A\u300C\u6211\u7684\u7535\u8111\u300D\u8FDE\u63A5",
|
|
160
|
+
"claude.pairForced": "--pair\uFF1A\u5DF2\u5F3A\u5236\u7533\u8BF7\u914D\u5BF9\u7801\uFF08\u4EC5\u672C\u6B21\uFF09",
|
|
161
|
+
"claude.pairUnclaimed": "\u672A\u68C0\u6D4B\u5230\u5DF2\u7ED1\u5B9A\u8D26\u53F7\uFF0C\u5F00\u59CB\u914D\u5BF9\u5F15\u5BFC\uFF1A",
|
|
162
|
+
"claude.claimedHint": "\u5DF2\u7ED1\u5B9A\u624B\u673A\u8D26\u53F7\uFF1A\u4ECE\u624B\u673A\u300C\u6211\u7684\u7535\u8111\u300D\u76F4\u63A5\u8FDE\u63A5\u5373\u53EF",
|
|
163
|
+
"claude.errStartFailed": "\u542F\u52A8\u5931\u8D25:",
|
|
164
|
+
"claude.msgStarted": "Claude Code \u9002\u914D\u5668\u5DF2\u542F\u52A8\uFF08Ctrl+C \u9000\u51FA\uFF09",
|
|
165
|
+
"claude.warnInvalidMode": "\u5FFD\u7565\u65E0\u6548 TUNNELBOX_CLAUDE_MODE: {raw}\uFF08\u5141\u8BB8 {list}\uFF09",
|
|
166
|
+
"claude.warnInvalidThinking": "\u5FFD\u7565\u65E0\u6548 TUNNELBOX_CLAUDE_THINKING: {raw}\uFF08off|adaptive|enabled[:budget]\uFF09",
|
|
167
|
+
"claude.cmdNew": "\u65B0\u5EFA\u4F1A\u8BDD",
|
|
168
|
+
"claude.cmdHelp": "\u663E\u793A\u5E2E\u52A9",
|
|
169
|
+
"claude.errNoRelay": "\u672A\u914D\u7F6E\u4E2D\u7EE7\u5730\u5740\uFF1A\u6784\u5EFA\u8BF7\u7528 --env \u6CE8\u5165\u9ED8\u8BA4\uFF0C\u8FD0\u884C\u53EF\u7528 TUNNELBOX_RELAY_URL \u8986\u76D6",
|
|
170
|
+
"claude.logConnected": "\u5DF2\u8FDE\u63A5\u4E2D\u7EE7 {url}",
|
|
171
|
+
"claude.logMsgUncaught": "\u6D88\u606F\u5904\u7406\u672A\u6355\u83B7\u5F02\u5E38: {message}",
|
|
172
|
+
"claude.reasonDisconnect": "\u4E2D\u7EE7\u65AD\u5F00\uFF08fail-closed \u81EA\u52A8\u62D2\u7EDD\uFF09",
|
|
173
|
+
"claude.reasonUnbind": "\u8D26\u53F7\u89E3\u7ED1\uFF08fail-closed \u81EA\u52A8\u62D2\u7EDD\uFF09",
|
|
174
|
+
"claude.logDisconnected": "\u4E0E\u4E2D\u7EE7\u65AD\u5F00\uFF0C\u6B63\u5728\u81EA\u52A8\u91CD\u8FDE\u2026",
|
|
175
|
+
"claude.logPairCode": "\u751F\u6210\u914D\u5BF9\u7801: {code}",
|
|
176
|
+
"claude.logUnhandledType": "\u672A\u5904\u7406\u7684\u6D88\u606F\u7C7B\u578B: {type}",
|
|
177
|
+
"claude.logHandleFailed": "\u5904\u7406 {type} \u5931\u8D25: {message}",
|
|
178
|
+
"claude.newSessionTitle": "\u65B0\u4F1A\u8BDD",
|
|
179
|
+
"claude.helpText": "\u652F\u6301\u7684\u547D\u4EE4\uFF1A\n- /new \u65B0\u5EFA\u4F1A\u8BDD\n- /help \u663E\u793A\u5E2E\u52A9",
|
|
180
|
+
"claude.logPromptFailed": "session.prompt \u5931\u8D25: {message}",
|
|
181
|
+
"claude.logAbortSent": "\u5DF2\u53D1\u9001\u4E2D\u6B62 (session={session})",
|
|
182
|
+
"claude.logAbortFailed": "\u4E2D\u6B62\u5931\u8D25 (session={session}): {message}",
|
|
183
|
+
"claude.errBadWorkspaceEmpty": "\u7F3A\u5C11\u5DE5\u4F5C\u533A\u8DEF\u5F84",
|
|
184
|
+
"claude.errBadWorkspaceNotDir": "\u8BE5\u76EE\u5F55\u4E0D\u5B58\u5728\u6216\u4E0D\u53EF\u7528",
|
|
185
|
+
"claude.logWorkspaceSwitched": "\u5207\u6362\u5DE5\u4F5C\u533A: {path}",
|
|
186
|
+
"claude.logUnknownQuestionReply": "\u672A\u5339\u914D\u7684\u7ED3\u6784\u5316\u63D0\u95EE\u5E94\u7B54 (id={id})",
|
|
187
|
+
"claude.logFlushedQuestions": "\u5DF2\u53D6\u6D88 {count} \u4E2A\u5F85\u4F5C\u7B54\u63D0\u95EE: {reason}",
|
|
188
|
+
"claude.logFlushedApprovals": "\u5DF2\u62D2\u7EDD {count} \u4E2A\u5F85\u4F5C\u7B54\u8BF7\u6C42: {reason}",
|
|
189
|
+
"claude.logPendingResent": "session.pending \u8865\u53D1\u5F85\u529E {count} \u6761 (session={session})",
|
|
190
|
+
"claude.logSetModeFailed": "setPermissionMode \u5931\u8D25 (session={session}): {message}",
|
|
191
|
+
"claude.errWorkspaceMissing": "\u5DE5\u4F5C\u533A\u4E0D\u5B58\u5728: {dir}",
|
|
192
|
+
"claude.logSessionError": "\u4F1A\u8BDD\u51FA\u9519 (session={session}): {message}",
|
|
193
|
+
"claude.logOfflineDenyTool": "\u4E2D\u7EE7\u79BB\u7EBF\uFF0C\u81EA\u52A8\u62D2\u7EDD\u5DE5\u5177 {tool}",
|
|
194
|
+
"claude.errOfflineDeny": "\u4E2D\u7EE7\u79BB\u7EBF\uFF0C\u81EA\u52A8\u62D2\u7EDD\uFF08fail-closed\uFF09",
|
|
195
|
+
"claude.logAuqDisabled": "AskUserQuestion \u5DF2\u5173\u95ED\uFF08TUNNELBOX_CLAUDE_ASK_USER_QUESTION=0\uFF09\uFF0C\u81EA\u52A8\u62D2\u7EDD",
|
|
196
|
+
"claude.errAuqDisabled": "AskUserQuestion \u63D0\u95EE\u672A\u542F\u7528",
|
|
197
|
+
"claude.logAuqParseFailed": "AskUserQuestion input \u89E3\u6790\u5931\u8D25\uFF0C\u81EA\u52A8\u62D2\u7EDD\uFF08fail-closed\uFF09",
|
|
198
|
+
"claude.errAuqParse": "\u65E0\u6CD5\u89E3\u6790\u9898\u76EE",
|
|
199
|
+
"claude.logAuqSkipped": "AskUserQuestion \u672A\u4F5C\u7B54/\u53D6\u6D88 (session={session})",
|
|
200
|
+
"claude.errAuqCancelled": "\u7528\u6237\u672A\u9009\u62E9\uFF08cancelled\uFF09",
|
|
201
|
+
"claude.logAuqDone": "AskUserQuestion \u4F5C\u7B54\u5B8C\u6210 (session={session})",
|
|
202
|
+
"claude.promptRunTool": "Claude Code \u8BF7\u6C42\u6267\u884C {tool}",
|
|
203
|
+
"claude.errApprovalTimeout": "\u5BA1\u6279\u8D85\u65F6\uFF0C\u81EA\u52A8\u62D2\u7EDD\uFF08fail-closed\uFF09",
|
|
204
|
+
"claude.errUserDenied": "\u7528\u6237\u62D2\u7EDD",
|
|
205
|
+
"claude.errAborted": "\u8BF7\u6C42\u5DF2\u4E2D\u6B62",
|
|
206
|
+
"claude.logPermToPhone": "\u5BA1\u6279\u8BF7\u6C42(tool={tool}) \u2192 \u53D1\u9001\u5230\u624B\u673A\u6743\u9650\u5361 permissionID={id}",
|
|
207
|
+
"claude.errRelayUnreachable": "\u4E2D\u7EE7\u4E0D\u53EF\u8FBE\uFF0C\u81EA\u52A8\u62D2\u7EDD\uFF08fail-closed\uFF09",
|
|
208
|
+
"claude.logQuestionOffline": "\u4E2D\u7EE7\u79BB\u7EBF\uFF0C\u7ED3\u6784\u5316\u63D0\u95EE\u81EA\u52A8\u53D6\u6D88",
|
|
209
|
+
"claude.logQuestionToPhone": "\u7ED3\u6784\u5316\u63D0\u95EE({count} \u9898) \u2192 \u53D1\u9001\u5230\u624B\u673A questionID={id}",
|
|
210
|
+
"claude.logDialogOffline": "\u4E2D\u7EE7\u79BB\u7EBF\uFF0C\u5BF9\u8BDD\u6846\u81EA\u52A8\u53D6\u6D88\uFF08{tool}\uFF09",
|
|
211
|
+
"claude.logDialogToPhone": "\u5BF9\u8BDD\u6846\u8BF7\u6C42(kind={kind} tool={tool}) \u2192 \u53D1\u9001\u5230\u624B\u673A\u6743\u9650\u5361 permissionID={id}",
|
|
212
|
+
"claude.logAuqDialogParse": "AskUserQuestion payload \u89E3\u6790\u5931\u8D25\uFF0C\u4FDD\u6301\u9ED8\u8BA4\u884C\u4E3A\uFF08session={session}\uFF09",
|
|
213
|
+
"claude.logDialogUnmapped": "request_user_dialog(kind={kind}) \u672A\u63A5\u5165\u6620\u5C04\uFF0C\u4FDD\u6301\u9ED8\u8BA4\u884C\u4E3A\uFF08session={session}\uFF09",
|
|
214
|
+
"claude.promptMcpAuth": "MCP\u300C{server}\u300D\u8BF7\u6C42\u6388\u6743",
|
|
215
|
+
"claude.logElicitUnmapped": "MCP elicitation(server={server}, mode={mode}) \u672A\u63A5\u5165\uFF0C\u81EA\u52A8\u62D2\u7EDD\uFF08session={session}\uFF09",
|
|
216
|
+
"claude.logResetIdentity": "\u88AB\u8D26\u53F7\u89E3\u7ED1\uFF0C\u6B63\u5728\u91CD\u7F6E\u8EAB\u4EFD\u5E76\u91CD\u65B0\u751F\u6210\u914D\u5BF9\u7801\u2026",
|
|
217
|
+
"claude.dialogConfirm": "Claude Code \u8BF7\u6C42\u786E\u8BA4\uFF08{kind}\uFF09",
|
|
218
|
+
"claude.resultTruncated": "\u2026\uFF08\u7ED3\u679C\u8FC7\u957F\u5DF2\u622A\u65AD\uFF09",
|
|
219
|
+
"claude.streamError": "claude \u6D41\u5F0F\u51FA\u9519",
|
|
220
|
+
"claude.errListSessions": "\u8BFB\u53D6 Claude \u4F1A\u8BDD\u5217\u8868\u5931\u8D25",
|
|
221
|
+
"claude.errReadHistory": "\u8BFB\u53D6\u4F1A\u8BDD\u5386\u53F2\u5931\u8D25({id})",
|
|
222
|
+
"setup.langSet": "\u5DF2\u8BBE\u7F6E\u8FD0\u884C\u8BED\u8A00",
|
|
223
|
+
"setup.langHint": "\u91CD\u542F\u9002\u914D\u5668\u540E\u6309\u8BE5\u8BED\u8A00\u8F93\u51FA\uFF08\u8FD0\u884C\u65F6\u53EF\u88AB TUNNELBOX_LANG \u8986\u76D6\uFF09\u3002\u72B6\u6001\u6587\u4EF6\uFF1A",
|
|
224
|
+
"setup.langCurrent": "\u5F53\u524D\u8FD0\u884C\u8BED\u8A00",
|
|
225
|
+
"hermes.errNoRelay": "\u672A\u914D\u7F6E\u4E2D\u7EE7\u5730\u5740\uFF1A\u6784\u5EFA\u8BF7\u7528 --env \u6CE8\u5165\u9ED8\u8BA4\uFF0C\u8FD0\u884C\u53EF\u7528 TUNNELBOX_RELAY_URL \u8986\u76D6",
|
|
226
|
+
"hermes.logConnected": "\u5DF2\u8FDE\u63A5\u4E2D\u7EE7 {url}",
|
|
227
|
+
"hermes.logMsgUncaught": "\u6D88\u606F\u5904\u7406\u672A\u6355\u83B7\u5F02\u5E38: {message}",
|
|
228
|
+
"hermes.logDisconnected": "\u4E0E\u4E2D\u7EE7\u65AD\u5F00\uFF0C\u6B63\u5728\u81EA\u52A8\u91CD\u8FDE\u2026",
|
|
229
|
+
"hermes.logPairCode": "\u751F\u6210\u914D\u5BF9\u7801: {code}",
|
|
230
|
+
"hermes.logUnhandledType": "\u672A\u5904\u7406\u7684\u6D88\u606F\u7C7B\u578B: {type}",
|
|
231
|
+
"hermes.logHandleFailed": "\u5904\u7406 {type} \u5931\u8D25: {message}",
|
|
232
|
+
"hermes.logClaimed": "\u5DF2\u7ED1\u5B9A\u5230\u624B\u673A\u8D26\u53F7\uFF0C\u4E4B\u540E\u624B\u673A\u4ECE\u300C\u6211\u7684\u7535\u8111\u300D\u76F4\u63A5\u8FDE\u63A5",
|
|
233
|
+
"hermes.logResetIdentity": "\u88AB\u8D26\u53F7\u89E3\u7ED1\uFF0C\u6B63\u5728\u91CD\u7F6E\u8EAB\u4EFD\u5E76\u91CD\u65B0\u751F\u6210\u914D\u5BF9\u7801\u2026",
|
|
234
|
+
"hermes.cmdNew": "\u65B0\u5EFA\u4F1A\u8BDD",
|
|
235
|
+
"hermes.cmdHelp": "\u663E\u793A\u5E2E\u52A9",
|
|
236
|
+
"hermes.newSessionTitle": "\u65B0\u4F1A\u8BDD",
|
|
237
|
+
"hermes.helpText": "\u652F\u6301\u7684\u547D\u4EE4\uFF1A\n- /new \u65B0\u5EFA\u4F1A\u8BDD\n- /help \u663E\u793A\u5E2E\u52A9",
|
|
238
|
+
"hermes.errBusy": "\u8BE5\u4F1A\u8BDD\u6B63\u5728\u751F\u6210\u4E2D\uFF0C\u8BF7\u7B49\u5F85\u5B8C\u6210\u6216\u5148\u505C\u6B62",
|
|
239
|
+
"hermes.errBadWorkspace": "\u8BE5\u76EE\u5F55\u4E0D\u5B58\u5728\u6216\u4E0D\u53EF\u7528",
|
|
240
|
+
"hermes.logWorkspaceSwitched": "\u5207\u6362\u5DE5\u4F5C\u533A: {path}",
|
|
241
|
+
"hermes.errWorkspaceMissing": "\u5DE5\u4F5C\u533A\u4E0D\u5B58\u5728: {dir}",
|
|
242
|
+
"hermes.errStartFailed": "\u542F\u52A8\u5931\u8D25: {message}",
|
|
243
|
+
"hermes.msgStarted": "Hermes \u9002\u914D\u5668\u5DF2\u542F\u52A8\uFF08Ctrl+C \u9000\u51FA\uFF09",
|
|
244
|
+
"hermes.logAbortSent": "\u5DF2\u53D1\u9001\u4E2D\u6B62 (session={session})",
|
|
245
|
+
"hermes.logPromptFailed": "session.prompt \u5931\u8D25: {message}",
|
|
246
|
+
"hermes.logTurnError": "\u56DE\u5408\u51FA\u9519 (session={session}): {message}",
|
|
247
|
+
"hermes.logPairForced": "--pair\uFF1A\u5DF2\u5F3A\u5236\u7533\u8BF7\u914D\u5BF9\u7801\uFF08\u4EC5\u672C\u6B21\uFF09",
|
|
248
|
+
"hermes.pairingStillClaimed": "\u5DF2\u7ED1\u5B9A\u624B\u673A\u8D26\u53F7\uFF1A\u6B64\u914D\u5BF9\u7801\u4EC5\u7528\u4E8E\u540C\u8D26\u53F7\u65B0\u8BBE\u5907\u91CD\u65B0\u914D\u5BF9\uFF0C\u5F53\u524D\u8BBE\u5907\u53EF\u76F4\u63A5\u4ECE\u624B\u673A\u300C\u6211\u7684\u7535\u8111\u300D\u8FDE\u63A5",
|
|
249
|
+
"hermes.logPairNoRelay": "\u672A\u914D\u7F6E\u4E2D\u7EE7\u5730\u5740\uFF0C\u65E0\u6CD5\u7533\u8BF7\u914D\u5BF9\u7801",
|
|
250
|
+
"hermes.errSpawnHermes": "\u65E0\u6CD5\u542F\u52A8 Hermes\uFF08{bin}\uFF09\uFF1A\u8BF7\u786E\u8BA4\u5DF2\u5B89\u88C5\uFF08{err}\uFF09",
|
|
251
|
+
"hermes.errHermesExit": "hermes \u9000\u51FA({code}): {err}",
|
|
252
|
+
"hermes.logSessionUpdated": "\u4F1A\u8BDD\u5DF2\u66F4\u65B0 (session={session})",
|
|
253
|
+
"hermes.errNoInject": "\u624B\u673A\u6D88\u606F\u6CE8\u5165\u4E0D\u53EF\u7528\uFF08\u5F53\u524D\u4F1A\u8BDD\u975E\u4EA4\u4E92\u5F0F\u6216\u8FDB\u7A0B\u672A\u5C31\u7EEA\uFF09",
|
|
254
|
+
"hermes.pairNoRelay": "\u65E0\u6CD5\u8FDE\u63A5\u4E2D\u7EE7\uFF08relay \u4E0D\u53EF\u8FBE\u6216 websockets \u7F3A\u5931\uFF09",
|
|
255
|
+
"hermes.pairTimeout": "\u7533\u8BF7\u914D\u5BF9\u7801\u8D85\u65F6\uFF08\u4E2D\u7EE7\u672A\u54CD\u5E94\uFF09",
|
|
256
|
+
"hermes.errToolPair": "tunnelbox_pair \u5931\u8D25: {err}",
|
|
257
|
+
"hermes.errToolStatus": "tunnelbox_status \u5931\u8D25: {err}",
|
|
258
|
+
"hermes.cliUsage": "\u7528\u6CD5: /tunnelbox <pair|status>\n pair \u5411\u4E2D\u7EE7\u7533\u8BF7\u624B\u673A\u914D\u5BF9\u7801\u5E76\u6253\u5370\n status \u663E\u793A\u4E2D\u7EE7/\u7ED1\u5B9A/\u8FDE\u63A5\u72B6\u6001"
|
|
259
|
+
};
|
|
260
|
+
|
|
261
|
+
// locales/zh-TW.json
|
|
262
|
+
var zh_TW_default = {
|
|
263
|
+
"agent.err.createSession": "\u5EFA\u7ACB\u6703\u8A71\u5931\u6557",
|
|
264
|
+
"agent.err.httpClient": "\u7121\u6CD5\u5B58\u53D6 opencode HTTP client",
|
|
265
|
+
"agent.err.unknownPerm": "\u672A\u77E5\u7684\u6B0A\u9650\u8ACB\u6C42: {id}",
|
|
266
|
+
"agent.err.unknownQuestion": "\u672A\u77E5\u7684\u63D0\u554F\u8ACB\u6C42: {id}",
|
|
267
|
+
"agent.log.fallback404": "\u56DE\u5305\u9996\u9078\u7AEF\u9EDE 404\uFF0C\u6539\u8D70\u53E6\u4E00\u7AEF\u9EDE: {message}",
|
|
268
|
+
"agent.log.gotPermReply": "\u6536\u5230\u624B\u6A5F\u6B0A\u9650\u56DE\u8986 (id={id} {reply} {version})",
|
|
269
|
+
"agent.log.gotQuestionReply": "\u6536\u5230\u624B\u6A5F\u63D0\u554F\u56DE\u8986 (id={id} {status} {version})",
|
|
270
|
+
"agent.log.handleFailed": "\u8655\u7406 {type} \u5931\u6557: {message}",
|
|
271
|
+
"agent.log.httpOk": "opencode HTTP {status} {path}",
|
|
272
|
+
"agent.log.pendingResent": "session.pending: \u88DC\u767C {session} \u7A4D\u58D3\u8ACB\u6C42 {count} \u689D",
|
|
273
|
+
"agent.log.unhandledType": "\u672A\u8655\u7406\u7684\u8A0A\u606F\u985E\u578B: {type}",
|
|
274
|
+
"events.log.fwdPermission": "\u8F49\u767C\u6B0A\u9650\u8ACB\u6C42\u5230\u624B\u6A5F (id={id} tool={tool} {version})",
|
|
275
|
+
"events.log.permissionReplied": "opencode \u56DE\u57F7 permission.replied (id={id} {response})",
|
|
276
|
+
"events.log.questionRejected": "opencode \u56DE\u57F7 question.rejected (id={id})",
|
|
277
|
+
"events.log.questionReplied": "opencode \u56DE\u57F7 question.replied (id={id})",
|
|
278
|
+
"index.error.connectRelay": "\u7121\u6CD5\u9023\u63A5\u4E2D\u7E7C\uFF0C\u8ACB\u6AA2\u67E5\u4E2D\u7E7C\u4F4D\u5740\u5F8C\u91CD\u8A66",
|
|
279
|
+
"index.error.pairTimeout": "\u7B49\u5F85\u914D\u5C0D\u78BC\u903E\u6642\uFF08\u4E2D\u7E7C\u672A\u56DE\u61C9\uFF09",
|
|
280
|
+
"index.log.claimed": "\u5DF2\u7D81\u5B9A\u5230\u624B\u6A5F\u5E33\u865F\uFF0C\u4E4B\u5F8C\u624B\u6A5F\u76F4\u63A5\u5F9E\u300C\u6211\u7684\u96FB\u8166\u300D\u9023\u63A5\uFF0C\u4E0D\u9700\u518D\u6383\u78BC",
|
|
281
|
+
"index.log.connectedRelay": "\u5DF2\u9023\u63A5\u4E2D\u7E7C {url}",
|
|
282
|
+
"index.log.disconnected": "\u8207\u4E2D\u7E7C\u65B7\u7DDA\uFF0C\u6B63\u5728\u81EA\u52D5\u91CD\u9023\u2026",
|
|
283
|
+
"index.log.exit": "\u5DF2\u9000\u51FA",
|
|
284
|
+
"index.log.pairCode": "\u7522\u751F\u914D\u5C0D\u78BC: {code}",
|
|
285
|
+
"index.log.pairingStillClaimed": "\u6B64\u914D\u5C0D\u78BC\u50C5\u4F9B\u540C\u5E33\u865F\u7684\u65B0\u624B\u6A5F\u91CD\u65B0\u914D\u5C0D\uFF1B\u672C\u6A5F\u5DF2\u7D81\u5B9A\uFF0C\u4ECD\u53EF\u5F9E\u624B\u6A5F\u300C\u6211\u7684\u96FB\u8166\u300D\u76F4\u63A5\u9023\u63A5\u3002",
|
|
286
|
+
"index.log.pairingPreparing": "\u6B63\u5728\u9023\u7DDA\u4E2D\u7E7C\u4E26\u7522\u751F\u914D\u5C0D\u78BC\u2026",
|
|
287
|
+
"index.log.permissionToPhone": "\u6B0A\u9650\u8ACB\u6C42 \u2192 \u624B\u6A5F\u5BE9\u6279 (id={id} tool={tool})",
|
|
288
|
+
"index.log.permissionTuiFallback": "app \u96E2\u7DDA\uFF0C\u6B0A\u9650\u8ACB\u6C42\u7531 opencode TUI \u4EE3\u7BA1 (id={id} tool={tool})",
|
|
289
|
+
"index.log.relayError": "\u4E2D\u7E7C\u932F\u8AA4: {msg}",
|
|
290
|
+
"index.log.resetIdentity": "\u5DF2\u89E3\u9664\u5E33\u865F\u7D81\u5B9A\uFF0C\u6B63\u5728\u91CD\u8A2D\u8EAB\u5206\u4E26\u91CD\u65B0\u7522\u751F\u914D\u5C0D\u78BC\u2026",
|
|
291
|
+
"index.log.unknown": "\u672A\u77E5",
|
|
292
|
+
"install.codeLine": "\u914D\u5C0D\u78BC: {code}",
|
|
293
|
+
"install.commandInstalled": "\u5DF2\u5B89\u88DD\u6307\u4EE4: {path}",
|
|
294
|
+
"install.done": "\u5B8C\u6210\u3002\u5DF2\u5617\u8A66\u9023\u63A5\u4E2D\u7E7C\u8F38\u51FA\u672C\u6A5F\u914D\u5C0D\u8CC7\u8A0A\uFF1A",
|
|
295
|
+
"install.failConnect": "\uFF08\u672A\u80FD\u5373\u6642\u9023\u63A5\u4E2D\u7E7C\u5217\u5370\u914D\u5C0D\u8CC7\u8A0A\u2014\u2014\u4E2D\u7E7C\u7121\u6CD5\u9023\u7DDA\u6216\u76EE\u524D Node \u904E\u820A\u3002",
|
|
296
|
+
"install.failConnectHint": "\u91CD\u555F opencode \u5F8C\u53EF\u7528 --print-logs \u67E5\u770B\u7D42\u7AEF QR Code\uFF0C\u6216\u662F\u5728 opencode \u5167\u8F38\u5165\u300C\u986F\u793A\u624B\u6A5F\u914D\u5C0D\u78BC\u300D\u6216 /pair\u3002\uFF09",
|
|
297
|
+
"install.hintFresh": "\u63D0\u793A\uFF1A\u914D\u5C0D\u78BC\u70BA\u4E00\u6B21\u6027\uFF0C\u7D04 10 \u5206\u9418\u6709\u6548\uFF1B\u82E5\u7A0D\u5F8C\u624D\u555F\u52D5 opencode\uFF0C\u4EE5\u555F\u52D5\u6642\u7D42\u7AEF\u5217\u5370\u6216 /pair \u53D6\u5F97\u7684\u6700\u65B0\u914D\u5C0D\u8CC7\u8A0A\u70BA\u6E96\u3002",
|
|
298
|
+
"install.pluginInstalled": "\u5DF2\u5B89\u88DD\u5916\u639B: {path}",
|
|
299
|
+
"install.qrUnavailable": "\uFF08QR Code \u7121\u6CD5\u986F\u793A\uFF0C\u8ACB\u4F7F\u7528\u4E0A\u65B9\u914D\u5C0D\u78BC\uFF09",
|
|
300
|
+
"install.qrcodeEnsure": "\u6B63\u5728\u5C07 qrcode \u5B89\u88DD\u5230 opencode \u8A2D\u5B9A\u76EE\u9304\u2026",
|
|
301
|
+
"install.qrcodeFail": "qrcode \u5B89\u88DD\u5931\u6557\uFF08\u4E0D\u5F71\u97FF\u4F7F\u7528\uFF0C\u50C5\u986F\u793A\u914D\u5C0D\u78BC\uFF09: {err}",
|
|
302
|
+
"install.relayError": "\u4E2D\u7E7C\u50B3\u56DE\u932F\u8AA4: {msg}",
|
|
303
|
+
"install.scanHint": "\u624B\u6A5F\u958B\u555F tunnelbox App\u300C\u6383\u63CF\u914D\u5C0D\u300D\uFF0C\u6383\u63CF\u4E0A\u65B9 QR Code \u5373\u53EF\u9023\u63A5\uFF1A",
|
|
304
|
+
"pair.heading": "tunnelbox \u624B\u6A5F\u914D\u5C0D",
|
|
305
|
+
"pair.howTo": "\u5728\u624B\u6A5F\u4E0A\u958B\u555F tunnelbox App\uFF0C\u7528\u300C\u6383\u63CF\u914D\u5C0D\u300D\u6383\u63CF\u4E0A\u65B9 QR Code\uFF0C\u6216\u624B\u52D5\u8F38\u5165\u914D\u5C0D\u78BC\u3002",
|
|
306
|
+
"pair.oneTime": "\u914D\u5C0D\u78BC\u70BA\u4E00\u6B21\u6027\uFF0C\u4F7F\u7528\u5F8C\u5373\u5931\u6548\uFF1B\u5982\u9700\u65B0\u78BC\uFF0C\u53EF\u8981\u6C42\u300C\u91CD\u65B0\u6574\u7406\u914D\u5C0D\u78BC\u300D\u3002",
|
|
307
|
+
"pair.promptBody": "\u8ACB\u5E6B\u6211\u67E5\u770B\u672C\u6A5F\u624B\u6A5F\u9060\u7AEF\u914D\u5C0D\u8CC7\u8A0A\uFF1A\u986F\u793A\u914D\u5C0D\u78BC\u8207\u53EF\u4F9B\u6383\u78BC\u7684 QR Code\u3002QR Code \u8ACB\u653E\u5728\u7B49\u5BEC\u7A0B\u5F0F\u78BC\u5340\u584A\u5167\u4E26\u9010\u5B57\u539F\u6A23\u4FDD\u7559\uFF0C\u65B9\u4FBF\u6211\u7528\u624B\u6A5F\u6383\u63CF\u3002",
|
|
308
|
+
"pair.promptDescription": "\u986F\u793A\u624B\u6A5F\u9060\u7AEF\u914D\u5C0D\u7684\u914D\u5C0D\u78BC\u8207\u6383\u78BC QR Code",
|
|
309
|
+
"pair.scanIntro": "**\u6383\u78BC\u914D\u5C0D**\uFF1A\u624B\u6A5F\u958B\u555F tunnelbox App\u300C\u6383\u63CF\u914D\u5C0D\u300D\uFF0C\u6383\u63CF\u4E0B\u65B9 QR Code \u5373\u53EF\u81EA\u52D5\u9023\u63A5\u3002",
|
|
310
|
+
"perm.promptAuthorize": "opencode \u8ACB\u6C42\u6388\u6B0A",
|
|
311
|
+
"perm.promptPatterns": "opencode \u8ACB\u6C42\u5B58\u53D6\uFF1A{list}",
|
|
312
|
+
"perm.promptResource": "opencode \u8ACB\u6C42\u5B58\u53D6\u8CC7\u6E90\uFF1A{list}",
|
|
313
|
+
"perm.promptTool": "opencode \u8ACB\u6C42\u57F7\u884C {tool}",
|
|
314
|
+
"qr.codeLabel": "\u914D\u5C0D\u78BC",
|
|
315
|
+
"qr.fileWritten": "\u914D\u5C0D\u8CC7\u8A0A\u5DF2\u5BEB\u5165: {path}",
|
|
316
|
+
"qr.openHint": "\u958B\u555F tunnelbox App\uFF0C\u7528\u300C\u6383\u63CF\u914D\u5C0D\u300D\u6383\u63CF\u4E0A\u65B9 QR Code\uFF0C\u6216\u624B\u52D5\u8F38\u5165\u914D\u5C0D\u78BC\u3002",
|
|
317
|
+
"qr.titleNoType": "tunnelbox \u624B\u6A5F\u914D\u5C0D",
|
|
318
|
+
"qr.titleWithType": "tunnelbox {type} \u624B\u6A5F\u914D\u5C0D",
|
|
319
|
+
"qr.unavailable": "\uFF08\u672A\u5B89\u88DD qrcode\uFF0C\u8ACB\u4F7F\u7528\u4E0A\u65B9\u914D\u5C0D\u78BC\uFF09",
|
|
320
|
+
"claude.errBusy": "\u8A72\u6703\u8A71\u6B63\u5728\u7522\u751F\u4E2D\uFF0C\u8ACB\u7B49\u5F85\u5B8C\u6210\u6216\u5148\u505C\u6B62",
|
|
321
|
+
"claude.errTurn": "\u7522\u751F\u51FA\u932F",
|
|
322
|
+
"claude.pairingStillClaimed": "\u5DF2\u7D81\u5B9A\u624B\u6A5F\u5E33\u865F\uFF1A\u6B64\u914D\u5C0D\u78BC\u50C5\u4F9B\u540C\u5E33\u865F\u65B0\u88DD\u7F6E\u91CD\u65B0\u914D\u5C0D\uFF0C\u76EE\u524D\u88DD\u7F6E\u53EF\u76F4\u63A5\u5F9E\u624B\u6A5F\u300C\u6211\u7684\u96FB\u8166\u300D\u9023\u63A5",
|
|
323
|
+
"claude.pairForced": "--pair\uFF1A\u5DF2\u5F37\u5236\u7533\u8ACB\u914D\u5C0D\u78BC\uFF08\u50C5\u672C\u6B21\uFF09",
|
|
324
|
+
"claude.pairUnclaimed": "\u672A\u5075\u6E2C\u5230\u5DF2\u7D81\u5B9A\u5E33\u865F\uFF0C\u958B\u59CB\u914D\u5C0D\u5F15\u5C0E\uFF1A",
|
|
325
|
+
"claude.claimedHint": "\u5DF2\u7D81\u5B9A\u624B\u6A5F\u5E33\u865F\uFF1A\u5F9E\u624B\u6A5F\u300C\u6211\u7684\u96FB\u8166\u300D\u76F4\u63A5\u9023\u63A5\u5373\u53EF",
|
|
326
|
+
"claude.errStartFailed": "\u555F\u52D5\u5931\u6557:",
|
|
327
|
+
"claude.msgStarted": "Claude Code \u4ECB\u9762\u5361\u5DF2\u555F\u52D5\uFF08Ctrl+C \u7D50\u675F\uFF09",
|
|
328
|
+
"claude.warnInvalidMode": "\u5FFD\u7565\u7121\u6548 TUNNELBOX_CLAUDE_MODE: {raw}\uFF08\u5141\u8A31 {list}\uFF09",
|
|
329
|
+
"claude.warnInvalidThinking": "\u5FFD\u7565\u7121\u6548 TUNNELBOX_CLAUDE_THINKING: {raw}\uFF08off|adaptive|enabled[:budget]\uFF09",
|
|
330
|
+
"claude.cmdNew": "\u65B0\u958B\u6703\u8A71",
|
|
331
|
+
"claude.cmdHelp": "\u986F\u793A\u8AAA\u660E",
|
|
332
|
+
"claude.errNoRelay": "\u672A\u8A2D\u5B9A\u4E2D\u7E7C\u4F4D\u5740\uFF1A\u5EFA\u7F6E\u8ACB\u7528 --env \u6CE8\u5165\u9810\u8A2D\uFF0C\u57F7\u884C\u53EF\u7528 TUNNELBOX_RELAY_URL \u8986\u5BEB",
|
|
333
|
+
"claude.logConnected": "\u5DF2\u9023\u7DDA\u4E2D\u7E7C {url}",
|
|
334
|
+
"claude.logMsgUncaught": "\u8A0A\u606F\u8655\u7406\u672A\u6355\u7372\u4F8B\u5916: {message}",
|
|
335
|
+
"claude.reasonDisconnect": "\u4E2D\u7E7C\u65B7\u7DDA\uFF08fail-closed \u81EA\u52D5\u62D2\u7D55\uFF09",
|
|
336
|
+
"claude.reasonUnbind": "\u5E33\u865F\u89E3\u9664\u7D81\u5B9A\uFF08fail-closed \u81EA\u52D5\u62D2\u7D55\uFF09",
|
|
337
|
+
"claude.logDisconnected": "\u8207\u4E2D\u7E7C\u65B7\u7DDA\uFF0C\u6B63\u5728\u81EA\u52D5\u91CD\u9023\u2026",
|
|
338
|
+
"claude.logPairCode": "\u7522\u751F\u914D\u5C0D\u78BC: {code}",
|
|
339
|
+
"claude.logUnhandledType": "\u672A\u8655\u7406\u7684\u8A0A\u606F\u985E\u578B: {type}",
|
|
340
|
+
"claude.logHandleFailed": "\u8655\u7406 {type} \u5931\u6557: {message}",
|
|
341
|
+
"claude.newSessionTitle": "\u65B0\u6703\u8A71",
|
|
342
|
+
"claude.helpText": "\u652F\u63F4\u7684\u6307\u4EE4\uFF1A\n- /new \u65B0\u958B\u6703\u8A71\n- /help \u986F\u793A\u8AAA\u660E",
|
|
343
|
+
"claude.logPromptFailed": "session.prompt \u5931\u6557: {message}",
|
|
344
|
+
"claude.logAbortSent": "\u5DF2\u9001\u51FA\u4E2D\u6B62 (session={session})",
|
|
345
|
+
"claude.logAbortFailed": "\u4E2D\u6B62\u5931\u6557 (session={session}): {message}",
|
|
346
|
+
"claude.errBadWorkspaceEmpty": "\u7F3A\u5C11\u5DE5\u4F5C\u5340\u8DEF\u5F91",
|
|
347
|
+
"claude.errBadWorkspaceNotDir": "\u8A72\u76EE\u9304\u4E0D\u5B58\u5728\u6216\u4E0D\u53EF\u7528",
|
|
348
|
+
"claude.logWorkspaceSwitched": "\u5207\u63DB\u5DE5\u4F5C\u5340: {path}",
|
|
349
|
+
"claude.logUnknownQuestionReply": "\u672A\u76F8\u7B26\u7684\u7D50\u69CB\u5316\u63D0\u554F\u61C9\u7B54 (id={id})",
|
|
350
|
+
"claude.logFlushedQuestions": "\u5DF2\u53D6\u6D88 {count} \u500B\u5F85\u56DE\u7B54\u63D0\u554F: {reason}",
|
|
351
|
+
"claude.logFlushedApprovals": "\u5DF2\u62D2\u7D55 {count} \u500B\u5F85\u4F5C\u7B54\u8ACB\u6C42: {reason}",
|
|
352
|
+
"claude.logPendingResent": "session.pending \u88DC\u767C\u5F85\u8FA6 {count} \u7B46 (session={session})",
|
|
353
|
+
"claude.logSetModeFailed": "setPermissionMode \u5931\u6557 (session={session}): {message}",
|
|
354
|
+
"claude.errWorkspaceMissing": "\u5DE5\u4F5C\u5340\u4E0D\u5B58\u5728: {dir}",
|
|
355
|
+
"claude.logSessionError": "\u6703\u8A71\u51FA\u932F (session={session}): {message}",
|
|
356
|
+
"claude.logOfflineDenyTool": "\u4E2D\u7E7C\u96E2\u7DDA\uFF0C\u81EA\u52D5\u62D2\u7D55\u5DE5\u5177 {tool}",
|
|
357
|
+
"claude.errOfflineDeny": "\u4E2D\u7E7C\u96E2\u7DDA\uFF0C\u81EA\u52D5\u62D2\u7D55\uFF08fail-closed\uFF09",
|
|
358
|
+
"claude.logAuqDisabled": "AskUserQuestion \u5DF2\u95DC\u9589\uFF08TUNNELBOX_CLAUDE_ASK_USER_QUESTION=0\uFF09\uFF0C\u81EA\u52D5\u62D2\u7D55",
|
|
359
|
+
"claude.errAuqDisabled": "AskUserQuestion \u63D0\u554F\u672A\u555F\u7528",
|
|
360
|
+
"claude.logAuqParseFailed": "AskUserQuestion input \u89E3\u6790\u5931\u6557\uFF0C\u81EA\u52D5\u62D2\u7D55\uFF08fail-closed\uFF09",
|
|
361
|
+
"claude.errAuqParse": "\u7121\u6CD5\u89E3\u6790\u984C\u76EE",
|
|
362
|
+
"claude.logAuqSkipped": "AskUserQuestion \u672A\u4F5C\u7B54/\u53D6\u6D88 (session={session})",
|
|
363
|
+
"claude.errAuqCancelled": "\u4F7F\u7528\u8005\u672A\u9078\u64C7\uFF08cancelled\uFF09",
|
|
364
|
+
"claude.logAuqDone": "AskUserQuestion \u4F5C\u7B54\u5B8C\u6210 (session={session})",
|
|
365
|
+
"claude.promptRunTool": "Claude Code \u8ACB\u6C42\u57F7\u884C {tool}",
|
|
366
|
+
"claude.errApprovalTimeout": "\u5BE9\u6279\u903E\u6642\uFF0C\u81EA\u52D5\u62D2\u7D55\uFF08fail-closed\uFF09",
|
|
367
|
+
"claude.errUserDenied": "\u4F7F\u7528\u8005\u62D2\u7D55",
|
|
368
|
+
"claude.errAborted": "\u8ACB\u6C42\u5DF2\u4E2D\u6B62",
|
|
369
|
+
"claude.logPermToPhone": "\u5BE9\u6279\u8ACB\u6C42(tool={tool}) \u2192 \u50B3\u9001\u5230\u624B\u6A5F\u6B0A\u9650\u5361 permissionID={id}",
|
|
370
|
+
"claude.errRelayUnreachable": "\u4E2D\u7E7C\u4E0D\u53EF\u9054\uFF0C\u81EA\u52D5\u62D2\u7D55\uFF08fail-closed\uFF09",
|
|
371
|
+
"claude.logQuestionOffline": "\u4E2D\u7E7C\u96E2\u7DDA\uFF0C\u7D50\u69CB\u5316\u63D0\u554F\u81EA\u52D5\u53D6\u6D88",
|
|
372
|
+
"claude.logQuestionToPhone": "\u7D50\u69CB\u5316\u63D0\u554F({count} \u984C) \u2192 \u50B3\u9001\u5230\u624B\u6A5F questionID={id}",
|
|
373
|
+
"claude.logDialogOffline": "\u4E2D\u7E7C\u96E2\u7DDA\uFF0C\u5C0D\u8A71\u6846\u81EA\u52D5\u53D6\u6D88\uFF08{tool}\uFF09",
|
|
374
|
+
"claude.logDialogToPhone": "\u5C0D\u8A71\u6846\u8ACB\u6C42(kind={kind} tool={tool}) \u2192 \u50B3\u9001\u5230\u624B\u6A5F\u6B0A\u9650\u5361 permissionID={id}",
|
|
375
|
+
"claude.logAuqDialogParse": "AskUserQuestion payload \u89E3\u6790\u5931\u6557\uFF0C\u7DAD\u6301\u9810\u8A2D\u884C\u70BA\uFF08session={session}\uFF09",
|
|
376
|
+
"claude.logDialogUnmapped": "request_user_dialog(kind={kind}) \u672A\u63A5\u5165\u5C0D\u61C9\uFF0C\u7DAD\u6301\u9810\u8A2D\u884C\u70BA\uFF08session={session}\uFF09",
|
|
377
|
+
"claude.promptMcpAuth": "MCP\u300C{server}\u300D\u8ACB\u6C42\u6388\u6B0A",
|
|
378
|
+
"claude.logElicitUnmapped": "MCP elicitation(server={server}, mode={mode}) \u672A\u63A5\u5165\uFF0C\u81EA\u52D5\u62D2\u7D55\uFF08session={session}\uFF09",
|
|
379
|
+
"claude.logResetIdentity": "\u88AB\u5E33\u865F\u89E3\u9664\u7D81\u5B9A\uFF0C\u6B63\u5728\u91CD\u8A2D\u8EAB\u5206\u4E26\u91CD\u65B0\u7522\u751F\u914D\u5C0D\u78BC\u2026",
|
|
380
|
+
"claude.dialogConfirm": "Claude Code \u8ACB\u6C42\u78BA\u8A8D\uFF08{kind}\uFF09",
|
|
381
|
+
"claude.resultTruncated": "\u2026\uFF08\u7D50\u679C\u904E\u9577\u5DF2\u622A\u65B7\uFF09",
|
|
382
|
+
"claude.streamError": "claude \u4E32\u6D41\u51FA\u932F",
|
|
383
|
+
"claude.errListSessions": "\u8B80\u53D6 Claude \u6703\u8A71\u5217\u8868\u5931\u6557",
|
|
384
|
+
"claude.errReadHistory": "\u8B80\u53D6\u6703\u8A71\u6B77\u53F2\u5931\u6557({id})",
|
|
385
|
+
"setup.langSet": "\u5DF2\u8A2D\u5B9A\u57F7\u884C\u8A9E\u8A00",
|
|
386
|
+
"setup.langHint": "\u91CD\u65B0\u555F\u52D5\u4ECB\u9762\u5361\u5F8C\u5C07\u4EE5\u8A72\u8A9E\u8A00\u8F38\u51FA\uFF08\u57F7\u884C\u6642\u53EF\u88AB TUNNELBOX_LANG \u8986\u5BEB\uFF09\u3002\u72C0\u614B\u6A94\uFF1A",
|
|
387
|
+
"setup.langCurrent": "\u76EE\u524D\u57F7\u884C\u8A9E\u8A00",
|
|
388
|
+
"hermes.errNoRelay": "\u672A\u8A2D\u5B9A\u4E2D\u7E7C\u4F4D\u5740\uFF1A\u5EFA\u7F6E\u8ACB\u7528 --env \u6CE8\u5165\u9810\u8A2D\uFF0C\u57F7\u884C\u53EF\u7528 TUNNELBOX_RELAY_URL \u8986\u5BEB",
|
|
389
|
+
"hermes.logConnected": "\u5DF2\u9023\u7DDA\u4E2D\u7E7C {url}",
|
|
390
|
+
"hermes.logMsgUncaught": "\u8A0A\u606F\u8655\u7406\u672A\u6355\u7372\u4F8B\u5916: {message}",
|
|
391
|
+
"hermes.logDisconnected": "\u8207\u4E2D\u7E7C\u65B7\u7DDA\uFF0C\u6B63\u5728\u81EA\u52D5\u91CD\u65B0\u9023\u7DDA\u2026",
|
|
392
|
+
"hermes.logPairCode": "\u7522\u751F\u914D\u5C0D\u78BC: {code}",
|
|
393
|
+
"hermes.logUnhandledType": "\u672A\u8655\u7406\u7684\u8A0A\u606F\u985E\u578B: {type}",
|
|
394
|
+
"hermes.logHandleFailed": "\u8655\u7406 {type} \u5931\u6557: {message}",
|
|
395
|
+
"hermes.logClaimed": "\u5DF2\u7D81\u5B9A\u5230\u624B\u6A5F\u5E33\u865F\uFF0C\u4E4B\u5F8C\u624B\u6A5F\u5F9E\u300C\u6211\u7684\u96FB\u8166\u300D\u76F4\u63A5\u9023\u7DDA",
|
|
396
|
+
"hermes.logResetIdentity": "\u88AB\u5E33\u865F\u89E3\u7D81\uFF0C\u6B63\u5728\u91CD\u8A2D\u8EAB\u5206\u4E26\u91CD\u65B0\u7522\u751F\u914D\u5C0D\u78BC\u2026",
|
|
397
|
+
"hermes.cmdNew": "\u65B0\u589E\u6703\u8A71",
|
|
398
|
+
"hermes.cmdHelp": "\u986F\u793A\u8AAA\u660E",
|
|
399
|
+
"hermes.newSessionTitle": "\u65B0\u6703\u8A71",
|
|
400
|
+
"hermes.helpText": "\u652F\u63F4\u7684\u547D\u4EE4\uFF1A\n- /new \u65B0\u589E\u6703\u8A71\n- /help \u986F\u793A\u8AAA\u660E",
|
|
401
|
+
"hermes.errBusy": "\u6B64\u6703\u8A71\u6B63\u5728\u7522\u751F\u4E2D\uFF0C\u8ACB\u7B49\u5F85\u5B8C\u6210\u6216\u5148\u505C\u6B62",
|
|
402
|
+
"hermes.errBadWorkspace": "\u6B64\u76EE\u9304\u4E0D\u5B58\u5728\u6216\u7121\u6CD5\u4F7F\u7528",
|
|
403
|
+
"hermes.logWorkspaceSwitched": "\u5207\u63DB\u5DE5\u4F5C\u5340: {path}",
|
|
404
|
+
"hermes.errWorkspaceMissing": "\u5DE5\u4F5C\u5340\u4E0D\u5B58\u5728: {dir}",
|
|
405
|
+
"hermes.errStartFailed": "\u555F\u52D5\u5931\u6557: {message}",
|
|
406
|
+
"hermes.msgStarted": "Hermes \u4ECB\u63A5\u5668\u5DF2\u555F\u52D5\uFF08Ctrl+C \u9000\u51FA\uFF09",
|
|
407
|
+
"hermes.logAbortSent": "\u5DF2\u50B3\u9001\u4E2D\u6B62 (session={session})",
|
|
408
|
+
"hermes.logPromptFailed": "session.prompt \u5931\u6557: {message}",
|
|
409
|
+
"hermes.logTurnError": "\u56DE\u5408\u51FA\u932F (session={session}): {message}",
|
|
410
|
+
"hermes.logPairForced": "--pair\uFF1A\u5DF2\u5F37\u5236\u7533\u8ACB\u914D\u5C0D\u78BC\uFF08\u50C5\u672C\u6B21\uFF09",
|
|
411
|
+
"hermes.pairingStillClaimed": "\u5DF2\u7D81\u5B9A\u624B\u6A5F\u5E33\u865F\uFF1A\u6B64\u914D\u5C0D\u78BC\u50C5\u4F9B\u540C\u5E33\u865F\u65B0\u88DD\u7F6E\u91CD\u65B0\u914D\u5C0D\uFF0C\u76EE\u524D\u88DD\u7F6E\u53EF\u76F4\u63A5\u5F9E\u624B\u6A5F\u300C\u6211\u7684\u96FB\u8166\u300D\u9023\u7DDA",
|
|
412
|
+
"hermes.logPairNoRelay": "\u672A\u8A2D\u5B9A\u4E2D\u7E7C\u4F4D\u5740\uFF0C\u7121\u6CD5\u7533\u8ACB\u914D\u5C0D\u78BC",
|
|
413
|
+
"hermes.errSpawnHermes": "\u7121\u6CD5\u555F\u52D5 Hermes\uFF08{bin}\uFF09\uFF1A\u8ACB\u78BA\u8A8D\u5DF2\u5B89\u88DD\uFF08{err}\uFF09",
|
|
414
|
+
"hermes.errHermesExit": "hermes \u9000\u51FA({code}): {err}",
|
|
415
|
+
"hermes.logSessionUpdated": "\u6703\u8A71\u5DF2\u66F4\u65B0 (session={session})",
|
|
416
|
+
"hermes.errNoInject": "\u624B\u6A5F\u8A0A\u606F\u6CE8\u5165\u4E0D\u53EF\u7528\uFF08\u76EE\u524D\u5DE5\u4F5C\u968E\u6BB5\u975E\u4E92\u52D5\u5F0F\u6216\u8655\u7406\u7A0B\u5E8F\u672A\u5C31\u7DD2\uFF09",
|
|
417
|
+
"hermes.pairNoRelay": "\u7121\u6CD5\u9023\u7DDA\u4E2D\u7E7C\uFF08relay \u4E0D\u53EF\u9054\u6216 websockets \u7F3A\u5931\uFF09",
|
|
418
|
+
"hermes.pairTimeout": "\u7533\u8ACB\u914D\u5C0D\u78BC\u903E\u6642\uFF08\u4E2D\u7E7C\u672A\u56DE\u61C9\uFF09",
|
|
419
|
+
"hermes.errToolPair": "tunnelbox_pair \u5931\u6557: {err}",
|
|
420
|
+
"hermes.errToolStatus": "tunnelbox_status \u5931\u6557: {err}",
|
|
421
|
+
"hermes.cliUsage": "\u7528\u6CD5: /tunnelbox <pair|status>\n pair \u5411\u4E2D\u7E7C\u7533\u8ACB\u624B\u6A5F\u914D\u5C0D\u78BC\u4E26\u5217\u5370\n status \u986F\u793A\u4E2D\u7E7C/\u7D81\u5B9A/\u9023\u7DDA\u72C0\u614B"
|
|
422
|
+
};
|
|
423
|
+
|
|
424
|
+
// locales/en-US.json
|
|
425
|
+
var en_US_default = {
|
|
426
|
+
"agent.err.createSession": "Failed to create session",
|
|
427
|
+
"agent.err.httpClient": "Cannot access the opencode HTTP client",
|
|
428
|
+
"agent.err.unknownPerm": "Unknown permission request: {id}",
|
|
429
|
+
"agent.err.unknownQuestion": "Unknown question request: {id}",
|
|
430
|
+
"agent.log.fallback404": "Preferred endpoint returned 404, falling back to the other one: {message}",
|
|
431
|
+
"agent.log.gotPermReply": "Received permission reply from phone (id={id} {reply} {version})",
|
|
432
|
+
"agent.log.gotQuestionReply": "Received question reply from phone (id={id} {status} {version})",
|
|
433
|
+
"agent.log.handleFailed": "Failed to handle {type}: {message}",
|
|
434
|
+
"agent.log.httpOk": "opencode HTTP {status} {path}",
|
|
435
|
+
"agent.log.pendingResent": "session.pending: resent {count} pending request(s) for {session}",
|
|
436
|
+
"agent.log.unhandledType": "Unhandled message type: {type}",
|
|
437
|
+
"events.log.fwdPermission": "Forwarded permission request to phone (id={id} tool={tool} {version})",
|
|
438
|
+
"events.log.permissionReplied": "opencode acked permission.replied (id={id} {response})",
|
|
439
|
+
"events.log.questionRejected": "opencode acked question.rejected (id={id})",
|
|
440
|
+
"events.log.questionReplied": "opencode acked question.replied (id={id})",
|
|
441
|
+
"index.error.connectRelay": "Cannot connect to the relay; check the relay address and try again",
|
|
442
|
+
"index.error.pairTimeout": "Timed out waiting for a pairing code (the relay did not respond)",
|
|
443
|
+
"index.log.claimed": "Bound to your phone account. From now on the phone connects directly from My Computers; no need to scan again",
|
|
444
|
+
"index.log.connectedRelay": "Connected to relay {url}",
|
|
445
|
+
"index.log.disconnected": "Disconnected from relay, reconnecting automatically\u2026",
|
|
446
|
+
"index.log.exit": "Exited",
|
|
447
|
+
"index.log.pairCode": "Generated pairing code: {code}",
|
|
448
|
+
"index.log.pairingStillClaimed": "This pairing code is for re-pairing a new phone under the same account. This computer is already linked and stays reachable from \u201CMy Computers\u201D on your phone.",
|
|
449
|
+
"index.log.pairingPreparing": "Connecting to the relay and generating a pairing code\u2026",
|
|
450
|
+
"index.log.permissionToPhone": "Permission request \u2192 phone approval (id={id} tool={tool})",
|
|
451
|
+
"index.log.permissionTuiFallback": "App offline; permission request handled by the opencode TUI (id={id} tool={tool})",
|
|
452
|
+
"index.log.relayError": "Relay error: {msg}",
|
|
453
|
+
"index.log.resetIdentity": "Unbound from the account; resetting identity and generating a new pairing code\u2026",
|
|
454
|
+
"index.log.unknown": "Unknown",
|
|
455
|
+
"install.codeLine": "Pairing code: {code}",
|
|
456
|
+
"install.commandInstalled": "Installed command: {path}",
|
|
457
|
+
"install.done": "Done. Attempted to connect to the relay and output pairing info:",
|
|
458
|
+
"install.failConnect": "(Could not connect to the relay to print pairing info \u2014 the relay may be unreachable or the Node version is too old.",
|
|
459
|
+
"install.failConnectHint": "After restarting opencode, check the terminal QR code with --print-logs, or type \u201Cshow phone pairing code\u201D / /pair inside opencode.)",
|
|
460
|
+
"install.hintFresh": "Note: the pairing code is single-use and valid for about 10 minutes. If you start opencode later, use the latest pairing info printed at startup or obtained via /pair.",
|
|
461
|
+
"install.pluginInstalled": "Installed plugin: {path}",
|
|
462
|
+
"install.qrUnavailable": "(QR rendering unavailable \u2014 use the pairing code above)",
|
|
463
|
+
"install.qrcodeEnsure": "Installing qrcode into the opencode config directory\u2026",
|
|
464
|
+
"install.qrcodeFail": "qrcode installation failed (not critical \u2014 only the pairing code is shown): {err}",
|
|
465
|
+
"install.relayError": "Relay returned an error: {msg}",
|
|
466
|
+
"install.scanHint": "Open tunnelbox on your phone, tap \u201CScan to pair\u201D, and scan the QR code above to connect:",
|
|
467
|
+
"pair.heading": "tunnelbox phone pairing",
|
|
468
|
+
"pair.howTo": "Open the tunnelbox app on your phone and scan the QR code above with \u201CScan to pair\u201D, or enter the pairing code manually.",
|
|
469
|
+
"pair.oneTime": "The pairing code is single-use and invalidates after it is claimed; ask to \u201Crefresh the pairing code\u201D for a new one.",
|
|
470
|
+
"pair.promptBody": "Please show this computer's phone pairing info: the pairing code and a QR code I can scan. Keep the QR code inside a monospaced code block and reproduce it character-for-character so my phone can scan it.",
|
|
471
|
+
"pair.promptDescription": "Show the phone pairing code and scan-able QR code",
|
|
472
|
+
"pair.scanIntro": "**Pair by scanning**: open the tunnelbox app on your phone, tap \u201CScan to pair\u201D, and scan the QR code below to connect automatically.",
|
|
473
|
+
"perm.promptAuthorize": "opencode requests authorization",
|
|
474
|
+
"perm.promptPatterns": "opencode requests access to: {list}",
|
|
475
|
+
"perm.promptResource": "opencode requests access to resources: {list}",
|
|
476
|
+
"perm.promptTool": "opencode requests to run {tool}",
|
|
477
|
+
"qr.codeLabel": "Pairing code",
|
|
478
|
+
"qr.fileWritten": "Pairing info written to: {path}",
|
|
479
|
+
"qr.openHint": "Open the tunnelbox app on your phone and scan the QR code above, or enter the pairing code manually in the app.",
|
|
480
|
+
"qr.titleNoType": "tunnelbox phone pairing",
|
|
481
|
+
"qr.titleWithType": "tunnelbox {type} phone pairing",
|
|
482
|
+
"qr.unavailable": "(qrcode not installed \u2014 use the pairing code above)",
|
|
483
|
+
"claude.errBusy": "This session is still running; wait for it to finish or stop it first",
|
|
484
|
+
"claude.errTurn": "generation error",
|
|
485
|
+
"claude.pairingStillClaimed": "Already bound to a phone account: this code is only for pairing a new device on the same account; the current device connects directly from My Computers",
|
|
486
|
+
"claude.pairForced": "--pair: forcing a pairing code request (this run only)",
|
|
487
|
+
"claude.pairUnclaimed": "No bound account detected; starting pairing guide:",
|
|
488
|
+
"claude.claimedHint": "Bound to a phone account: connect directly from My Computers on the phone",
|
|
489
|
+
"claude.errStartFailed": "Failed to start:",
|
|
490
|
+
"claude.msgStarted": "Claude Code adapter started (Ctrl+C to quit)",
|
|
491
|
+
"claude.warnInvalidMode": "Ignoring invalid TUNNELBOX_CLAUDE_MODE: {raw} (allowed {list})",
|
|
492
|
+
"claude.warnInvalidThinking": "Ignoring invalid TUNNELBOX_CLAUDE_THINKING: {raw} (off|adaptive|enabled[:budget])",
|
|
493
|
+
"claude.cmdNew": "New session",
|
|
494
|
+
"claude.cmdHelp": "Show help",
|
|
495
|
+
"claude.errNoRelay": "No relay URL configured: build with --env to inject a default, or override at runtime with TUNNELBOX_RELAY_URL",
|
|
496
|
+
"claude.logConnected": "Connected to relay {url}",
|
|
497
|
+
"claude.logMsgUncaught": "Uncaught exception while handling message: {message}",
|
|
498
|
+
"claude.reasonDisconnect": "Relay disconnected (fail-closed auto-reject)",
|
|
499
|
+
"claude.reasonUnbind": "Account unbound (fail-closed auto-reject)",
|
|
500
|
+
"claude.logDisconnected": "Disconnected from relay, reconnecting automatically\u2026",
|
|
501
|
+
"claude.logPairCode": "Generated pairing code: {code}",
|
|
502
|
+
"claude.logUnhandledType": "Unhandled message type: {type}",
|
|
503
|
+
"claude.logHandleFailed": "Failed to handle {type}: {message}",
|
|
504
|
+
"claude.newSessionTitle": "New session",
|
|
505
|
+
"claude.helpText": "Supported commands:\n- /new new session\n- /help show help",
|
|
506
|
+
"claude.logPromptFailed": "session.prompt failed: {message}",
|
|
507
|
+
"claude.logAbortSent": "Abort sent (session={session})",
|
|
508
|
+
"claude.logAbortFailed": "Abort failed (session={session}): {message}",
|
|
509
|
+
"claude.errBadWorkspaceEmpty": "Missing workspace path",
|
|
510
|
+
"claude.errBadWorkspaceNotDir": "Directory does not exist or is unusable",
|
|
511
|
+
"claude.logWorkspaceSwitched": "Switched workspace: {path}",
|
|
512
|
+
"claude.logUnknownQuestionReply": "Unmatched structured question reply (id={id})",
|
|
513
|
+
"claude.logFlushedQuestions": "Cancelled {count} pending question(s): {reason}",
|
|
514
|
+
"claude.logFlushedApprovals": "Rejected {count} pending request(s): {reason}",
|
|
515
|
+
"claude.logPendingResent": "session.pending: resent {count} pending item(s) for {session}",
|
|
516
|
+
"claude.logSetModeFailed": "setPermissionMode failed (session={session}): {message}",
|
|
517
|
+
"claude.errWorkspaceMissing": "Workspace does not exist: {dir}",
|
|
518
|
+
"claude.logSessionError": "Session error (session={session}): {message}",
|
|
519
|
+
"claude.logOfflineDenyTool": "Relay offline, auto-rejecting tool {tool}",
|
|
520
|
+
"claude.errOfflineDeny": "Relay offline, auto-rejected (fail-closed)",
|
|
521
|
+
"claude.logAuqDisabled": "AskUserQuestion disabled (TUNNELBOX_CLAUDE_ASK_USER_QUESTION=0), auto-rejected",
|
|
522
|
+
"claude.errAuqDisabled": "AskUserQuestion is not enabled",
|
|
523
|
+
"claude.logAuqParseFailed": "Failed to parse AskUserQuestion input, auto-rejected (fail-closed)",
|
|
524
|
+
"claude.errAuqParse": "Could not parse the questions",
|
|
525
|
+
"claude.logAuqSkipped": "AskUserQuestion unanswered/cancelled (session={session})",
|
|
526
|
+
"claude.errAuqCancelled": "User did not select (cancelled)",
|
|
527
|
+
"claude.logAuqDone": "AskUserQuestion answered (session={session})",
|
|
528
|
+
"claude.promptRunTool": "Claude Code requests to run {tool}",
|
|
529
|
+
"claude.errApprovalTimeout": "Approval timed out, auto-rejected (fail-closed)",
|
|
530
|
+
"claude.errUserDenied": "Rejected by user",
|
|
531
|
+
"claude.errAborted": "Request aborted",
|
|
532
|
+
"claude.logPermToPhone": "Permission request (tool={tool}) \u2192 sent to phone as permissionID={id}",
|
|
533
|
+
"claude.errRelayUnreachable": "Relay unreachable, auto-rejected (fail-closed)",
|
|
534
|
+
"claude.logQuestionOffline": "Relay offline, structured question auto-cancelled",
|
|
535
|
+
"claude.logQuestionToPhone": "Structured question ({count} item(s)) \u2192 sent to phone questionID={id}",
|
|
536
|
+
"claude.logDialogOffline": "Relay offline, dialog auto-cancelled ({tool})",
|
|
537
|
+
"claude.logDialogToPhone": "Dialog request (kind={kind} tool={tool}) \u2192 sent to phone as permissionID={id}",
|
|
538
|
+
"claude.logAuqDialogParse": "Failed to parse AskUserQuestion payload, keeping default behavior (session={session})",
|
|
539
|
+
"claude.logDialogUnmapped": "request_user_dialog(kind={kind}) has no mapping, keeping default behavior (session={session})",
|
|
540
|
+
"claude.promptMcpAuth": "MCP \u201C{server}\u201D requests authorization",
|
|
541
|
+
"claude.logElicitUnmapped": "MCP elicitation (server={server}, mode={mode}) not handled, auto-rejected (session={session})",
|
|
542
|
+
"claude.logResetIdentity": "Unbound from account; resetting identity and generating a new pairing code\u2026",
|
|
543
|
+
"claude.dialogConfirm": "Claude Code requests confirmation ({kind})",
|
|
544
|
+
"claude.resultTruncated": "\u2026 (result truncated)",
|
|
545
|
+
"claude.streamError": "claude streaming error",
|
|
546
|
+
"claude.errListSessions": "Failed to read Claude session list",
|
|
547
|
+
"claude.errReadHistory": "Failed to read session history ({id})",
|
|
548
|
+
"setup.langSet": "Runtime language set to",
|
|
549
|
+
"setup.langHint": "The adapter will output in this language after restart (runtime TUNNELBOX_LANG can override). State file:",
|
|
550
|
+
"setup.langCurrent": "Current runtime language",
|
|
551
|
+
"hermes.errNoRelay": "No relay URL configured: build with --env to inject a default, or override at runtime with TUNNELBOX_RELAY_URL",
|
|
552
|
+
"hermes.logConnected": "Connected to relay {url}",
|
|
553
|
+
"hermes.logMsgUncaught": "Uncaught exception while handling message: {message}",
|
|
554
|
+
"hermes.logDisconnected": "Disconnected from relay, reconnecting automatically\u2026",
|
|
555
|
+
"hermes.logPairCode": "Generated pairing code: {code}",
|
|
556
|
+
"hermes.logUnhandledType": "Unhandled message type: {type}",
|
|
557
|
+
"hermes.logHandleFailed": "Failed to handle {type}: {message}",
|
|
558
|
+
"hermes.logClaimed": "Bound to your phone account. From now on the phone connects directly from My Computers",
|
|
559
|
+
"hermes.logResetIdentity": "Unbound from the account; resetting identity and generating a new pairing code\u2026",
|
|
560
|
+
"hermes.cmdNew": "New session",
|
|
561
|
+
"hermes.cmdHelp": "Show help",
|
|
562
|
+
"hermes.newSessionTitle": "New session",
|
|
563
|
+
"hermes.helpText": "Supported commands:\n- /new new session\n- /help show help",
|
|
564
|
+
"hermes.errBusy": "This session is still running; wait for it to finish or stop it first",
|
|
565
|
+
"hermes.errBadWorkspace": "Directory does not exist or is unusable",
|
|
566
|
+
"hermes.logWorkspaceSwitched": "Switched workspace: {path}",
|
|
567
|
+
"hermes.errWorkspaceMissing": "Workspace does not exist: {dir}",
|
|
568
|
+
"hermes.errStartFailed": "Failed to start: {message}",
|
|
569
|
+
"hermes.msgStarted": "Hermes adapter started (Ctrl+C to quit)",
|
|
570
|
+
"hermes.logAbortSent": "Abort sent (session={session})",
|
|
571
|
+
"hermes.logPromptFailed": "session.prompt failed: {message}",
|
|
572
|
+
"hermes.logTurnError": "Turn error (session={session}): {message}",
|
|
573
|
+
"hermes.logPairForced": "--pair: forcing a pairing code request (this run only)",
|
|
574
|
+
"hermes.pairingStillClaimed": "Already bound to a phone account: this code is only for pairing a new device on the same account; the current device connects directly from My Computers",
|
|
575
|
+
"hermes.logPairNoRelay": "Cannot request a pairing code: no relay URL configured",
|
|
576
|
+
"hermes.errSpawnHermes": "Cannot start Hermes ({bin}): please confirm it is installed ({err})",
|
|
577
|
+
"hermes.errHermesExit": "hermes exited ({code}): {err}",
|
|
578
|
+
"hermes.logSessionUpdated": "Session updated (session={session})",
|
|
579
|
+
"hermes.errNoInject": "Phone message injection unavailable (session not interactive or process not ready)",
|
|
580
|
+
"hermes.pairNoRelay": "Cannot reach the relay (relay unreachable or websockets missing)",
|
|
581
|
+
"hermes.pairTimeout": "Timed out requesting a pairing code (relay did not respond)",
|
|
582
|
+
"hermes.errToolPair": "tunnelbox_pair failed: {err}",
|
|
583
|
+
"hermes.errToolStatus": "tunnelbox_status failed: {err}",
|
|
584
|
+
"hermes.cliUsage": "Usage: /tunnelbox <pair|status>\n pair request and print a phone pairing code\n status show relay/binding/connection status"
|
|
585
|
+
};
|
|
586
|
+
|
|
587
|
+
// locales/ja-JP.json
|
|
588
|
+
var ja_JP_default = {
|
|
589
|
+
"agent.err.createSession": "\u30BB\u30C3\u30B7\u30E7\u30F3\u306E\u4F5C\u6210\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
|
|
590
|
+
"agent.err.httpClient": "opencode HTTP client \u306B\u30A2\u30AF\u30BB\u30B9\u3067\u304D\u307E\u305B\u3093",
|
|
591
|
+
"agent.err.unknownPerm": "\u4E0D\u660E\u306A\u6A29\u9650\u30EA\u30AF\u30A8\u30B9\u30C8: {id}",
|
|
592
|
+
"agent.err.unknownQuestion": "\u4E0D\u660E\u306A\u8CEA\u554F\u30EA\u30AF\u30A8\u30B9\u30C8: {id}",
|
|
593
|
+
"agent.log.fallback404": "\u512A\u5148\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u304C 404 \u3092\u8FD4\u3057\u305F\u305F\u3081\u3001\u5225\u306E\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u3078\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF: {message}",
|
|
594
|
+
"agent.log.gotPermReply": "\u643A\u5E2F\u304B\u3089\u6A29\u9650\u306E\u8FD4\u4FE1\u3092\u53D7\u4FE1 (id={id} {reply} {version})",
|
|
595
|
+
"agent.log.gotQuestionReply": "\u643A\u5E2F\u304B\u3089\u8CEA\u554F\u306E\u8FD4\u4FE1\u3092\u53D7\u4FE1 (id={id} {status} {version})",
|
|
596
|
+
"agent.log.handleFailed": "{type} \u306E\u51E6\u7406\u306B\u5931\u6557: {message}",
|
|
597
|
+
"agent.log.httpOk": "opencode HTTP {status} {path}",
|
|
598
|
+
"agent.log.pendingResent": "session.pending: {session} \u306E\u4FDD\u7559\u30EA\u30AF\u30A8\u30B9\u30C8 {count} \u4EF6\u3092\u518D\u9001",
|
|
599
|
+
"agent.log.unhandledType": "\u672A\u51E6\u7406\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u30BF\u30A4\u30D7: {type}",
|
|
600
|
+
"events.log.fwdPermission": "\u6A29\u9650\u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u643A\u5E2F\u3078\u8EE2\u9001 (id={id} tool={tool} {version})",
|
|
601
|
+
"events.log.permissionReplied": "opencode \u5FDC\u7B54 permission.replied (id={id} {response})",
|
|
602
|
+
"events.log.questionRejected": "opencode \u5FDC\u7B54 question.rejected (id={id})",
|
|
603
|
+
"events.log.questionReplied": "opencode \u5FDC\u7B54 question.replied (id={id})",
|
|
604
|
+
"index.error.connectRelay": "\u30EA\u30EC\u30FC\u306B\u63A5\u7D9A\u3067\u304D\u307E\u305B\u3093\u3002\u30EA\u30EC\u30FC\u30A2\u30C9\u30EC\u30B9\u3092\u78BA\u8A8D\u3057\u3066\u518D\u8A66\u884C\u3057\u3066\u304F\u3060\u3055\u3044",
|
|
605
|
+
"index.error.pairTimeout": "\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u306E\u53D6\u5F97\u304C\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u3057\u307E\u3057\u305F\uFF08\u30EA\u30EC\u30FC\u304C\u5FDC\u7B54\u3057\u307E\u305B\u3093\uFF09",
|
|
606
|
+
"index.log.claimed": "\u30B9\u30DE\u30DB\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u306B\u7D10\u4ED8\u3051\u307E\u3057\u305F\u3002\u4EE5\u964D\u306F\u300C\u30DE\u30A4 PC\u300D\u304B\u3089\u76F4\u63A5\u63A5\u7D9A\u3055\u308C\u308B\u305F\u3081\u3001\u518D\u30B9\u30AD\u30E3\u30F3\u306F\u4E0D\u8981\u3067\u3059",
|
|
607
|
+
"index.log.connectedRelay": "\u30EA\u30EC\u30FC\u306B\u63A5\u7D9A\u3057\u307E\u3057\u305F {url}",
|
|
608
|
+
"index.log.disconnected": "\u30EA\u30EC\u30FC\u304B\u3089\u5207\u65AD\u3001\u81EA\u52D5\u7684\u306B\u518D\u63A5\u7D9A\u3057\u3066\u3044\u307E\u3059\u2026",
|
|
609
|
+
"index.log.exit": "\u7D42\u4E86\u3057\u307E\u3057\u305F",
|
|
610
|
+
"index.log.pairCode": "\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u751F\u6210: {code}",
|
|
611
|
+
"index.log.pairingStillClaimed": "\u3053\u306E\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u306F\u540C\u4E00\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u65B0\u3057\u3044\u30B9\u30DE\u30FC\u30C8\u30D5\u30A9\u30F3\u3068\u306E\u518D\u30DA\u30A2\u30EA\u30F3\u30B0\u5C02\u7528\u3067\u3059\u3002\u3053\u306E PC \u306F\u65E2\u306B\u9023\u643A\u6E08\u307F\u3067\u3001\u30B9\u30DE\u30FC\u30C8\u30D5\u30A9\u30F3\u306E\u300C\u30DE\u30A4 \u30B3\u30F3\u30D4\u30E5\u30FC\u30BF\u30FC\u300D\u304B\u3089\u5F15\u304D\u7D9A\u304D\u63A5\u7D9A\u3067\u304D\u307E\u3059\u3002",
|
|
612
|
+
"index.log.pairingPreparing": "\u30EA\u30EC\u30FC\u3078\u63A5\u7D9A\u3057\u3066\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u751F\u6210\u3057\u3066\u3044\u307E\u3059\u2026",
|
|
613
|
+
"index.log.permissionToPhone": "\u6A29\u9650\u30EA\u30AF\u30A8\u30B9\u30C8 \u2192 \u30B9\u30DE\u30DB\u3067\u627F\u8A8D (id={id} tool={tool})",
|
|
614
|
+
"index.log.permissionTuiFallback": "App \u304C\u30AA\u30D5\u30E9\u30A4\u30F3\u306E\u305F\u3081\u3001\u6A29\u9650\u30EA\u30AF\u30A8\u30B9\u30C8\u306F opencode TUI \u3067\u5BFE\u5FDC (id={id} tool={tool})",
|
|
615
|
+
"index.log.relayError": "\u30EA\u30EC\u30FC\u30A8\u30E9\u30FC: {msg}",
|
|
616
|
+
"index.log.resetIdentity": "\u30A2\u30AB\u30A6\u30F3\u30C8\u304B\u3089\u89E3\u9664\u3055\u308C\u307E\u3057\u305F\u3002ID \u3092\u30EA\u30BB\u30C3\u30C8\u3057\u3066\u65B0\u3057\u3044\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u751F\u6210\u3057\u307E\u3059\u2026",
|
|
617
|
+
"index.log.unknown": "\u4E0D\u660E",
|
|
618
|
+
"install.codeLine": "\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9: {code}",
|
|
619
|
+
"install.commandInstalled": "\u30B3\u30DE\u30F3\u30C9\u3092\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB: {path}",
|
|
620
|
+
"install.done": "\u5B8C\u4E86\u3002\u30EA\u30EC\u30FC\u306B\u63A5\u7D9A\u3057\u3066\u672C\u6A5F\u306E\u30DA\u30A2\u30EA\u30F3\u30B0\u60C5\u5831\u3092\u51FA\u529B\u3057\u307E\u3057\u305F\uFF1A",
|
|
621
|
+
"install.failConnect": "\uFF08\u30DA\u30A2\u30EA\u30F3\u30B0\u60C5\u5831\u3092\u51FA\u529B\u3059\u308B\u305F\u3081\u30EA\u30EC\u30FC\u306B\u63A5\u7D9A\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F \u2014 \u30EA\u30EC\u30FC\u306B\u5230\u9054\u3067\u304D\u306A\u3044\u304B Node \u304C\u53E4\u3059\u304E\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002",
|
|
622
|
+
"install.failConnectHint": "opencode \u3092\u518D\u8D77\u52D5\u5F8C\u3001--print-logs \u3067\u30BF\u30FC\u30DF\u30CA\u30EB\u306E QR \u30B3\u30FC\u30C9\u3092\u78BA\u8A8D\u3059\u308B\u304B\u3001opencode \u5185\u3067\u300C\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u8868\u793A\u300D\u307E\u305F\u306F /pair \u3068\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002\uFF09",
|
|
623
|
+
"install.hintFresh": "\u6CE8\u610F\uFF1A\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u306F\u4E00\u5EA6\u304D\u308A\u3067\u3001\u7D04 10 \u5206\u9593\u6709\u52B9\u3067\u3059\u3002\u5F8C\u304B\u3089 opencode \u3092\u8D77\u52D5\u3059\u308B\u5834\u5408\u306F\u3001\u8D77\u52D5\u6642\u306B\u8868\u793A\u3055\u308C\u308B\u304B /pair \u3067\u53D6\u5F97\u3057\u305F\u6700\u65B0\u60C5\u5831\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
624
|
+
"install.pluginInstalled": "\u30D7\u30E9\u30B0\u30A4\u30F3\u3092\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB: {path}",
|
|
625
|
+
"install.qrUnavailable": "\uFF08QR \u30B3\u30FC\u30C9\u3092\u8868\u793A\u3067\u304D\u307E\u305B\u3093 \u2014 \u4E0A\u8A18\u306E\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\uFF09",
|
|
626
|
+
"install.qrcodeEnsure": "qrcode \u3092 opencode \u8A2D\u5B9A\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306B\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3057\u3066\u3044\u307E\u3059\u2026",
|
|
627
|
+
"install.qrcodeFail": "qrcode \u306E\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u4F7F\u7528\u306B\u306F\u5F71\u97FF\u305B\u305A\u3001\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u306E\u307F\u8868\u793A\u3055\u308C\u307E\u3059\uFF09: {err}",
|
|
628
|
+
"install.relayError": "\u30EA\u30EC\u30FC\u304C\u30A8\u30E9\u30FC\u3092\u8FD4\u3057\u307E\u3057\u305F: {msg}",
|
|
629
|
+
"install.scanHint": "\u30B9\u30DE\u30DB\u3067 tunnelbox App\u300C\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u30DA\u30A2\u30EA\u30F3\u30B0\u300D\u3092\u958B\u304D\u3001\u4E0A\u306E QR \u30B3\u30FC\u30C9\u3092\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u63A5\u7D9A\uFF1A",
|
|
630
|
+
"pair.heading": "tunnelbox \u30B9\u30DE\u30DB\u30DA\u30A2\u30EA\u30F3\u30B0",
|
|
631
|
+
"pair.howTo": "\u30B9\u30DE\u30DB\u3067 tunnelbox App \u3092\u958B\u304D\u3001\u300C\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u30DA\u30A2\u30EA\u30F3\u30B0\u300D\u3067\u4E0A\u306E QR \u30B3\u30FC\u30C9\u3092\u30B9\u30AD\u30E3\u30F3\u3059\u308B\u304B\u3001\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u624B\u52D5\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
632
|
+
"pair.oneTime": "\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u306F\u4E00\u5EA6\u304D\u308A\u3067\u3001\u4F7F\u7528\u5F8C\u306F\u7121\u52B9\u306B\u306A\u308A\u307E\u3059\u3002\u65B0\u3057\u3044\u30B3\u30FC\u30C9\u304C\u5FC5\u8981\u306A\u5834\u5408\u306F\u300C\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u66F4\u65B0\u300D\u3068\u4F9D\u983C\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
633
|
+
"pair.promptBody": "\u3053\u306E PC \u306E\u30B9\u30DE\u30DB\u9060\u9694\u30DA\u30A2\u30EA\u30F3\u30B0\u60C5\u5831\u3092\u8868\u793A\u3057\u3066\u304F\u3060\u3055\u3044\uFF1A\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3068\u3001\u30B9\u30AD\u30E3\u30F3\u3067\u304D\u308B QR \u30B3\u30FC\u30C9\u3002QR \u30B3\u30FC\u30C9\u306F\u7B49\u5E45\u30B3\u30FC\u30C9\u30D6\u30ED\u30C3\u30AF\u306B\u5165\u308C\u30011 \u6587\u5B57\u3082\u5909\u3048\u305A\u305D\u306E\u307E\u307E\u51FA\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u30B9\u30DE\u30DB\u3067\u30B9\u30AD\u30E3\u30F3\u3067\u304D\u308B\u3088\u3046\u306B\u3059\u308B\u305F\u3081\u3067\u3059\u3002",
|
|
634
|
+
"pair.promptDescription": "\u30B9\u30DE\u30DB\u9060\u9694\u30DA\u30A2\u30EA\u30F3\u30B0\u306E\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u30FB\u30B9\u30AD\u30E3\u30F3\u7528 QR \u30B3\u30FC\u30C9\u3092\u8868\u793A",
|
|
635
|
+
"pair.scanIntro": "**\u30B9\u30AD\u30E3\u30F3\u3067\u30DA\u30A2\u30EA\u30F3\u30B0**\uFF1A\u30B9\u30DE\u30DB\u3067 tunnelbox App\u300C\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u30DA\u30A2\u30EA\u30F3\u30B0\u300D\u3092\u958B\u304D\u3001\u4E0B\u306E QR \u30B3\u30FC\u30C9\u3092\u30B9\u30AD\u30E3\u30F3\u3059\u308B\u3068\u81EA\u52D5\u7684\u306B\u63A5\u7D9A\u3055\u308C\u307E\u3059\u3002",
|
|
636
|
+
"perm.promptAuthorize": "opencode \u304C\u8A8D\u53EF\u3092\u8981\u6C42\u3057\u3066\u3044\u307E\u3059",
|
|
637
|
+
"perm.promptPatterns": "opencode \u304C\u30A2\u30AF\u30BB\u30B9\u3092\u8981\u6C42: {list}",
|
|
638
|
+
"perm.promptResource": "opencode \u304C\u30EA\u30BD\u30FC\u30B9\u3078\u306E\u30A2\u30AF\u30BB\u30B9\u3092\u8981\u6C42: {list}",
|
|
639
|
+
"perm.promptTool": "opencode \u304C {tool} \u306E\u5B9F\u884C\u3092\u8981\u6C42",
|
|
640
|
+
"qr.codeLabel": "\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9",
|
|
641
|
+
"qr.fileWritten": "\u30DA\u30A2\u30EA\u30F3\u30B0\u60C5\u5831\u3092\u66F8\u304D\u8FBC\u307F\u307E\u3057\u305F: {path}",
|
|
642
|
+
"qr.openHint": "tunnelbox App \u3092\u958B\u304D\u3001\u4E0A\u306E QR \u30B3\u30FC\u30C9\u3092\u30B9\u30AD\u30E3\u30F3\u3059\u308B\u304B\u3001App \u3067\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u624B\u52D5\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
643
|
+
"qr.titleNoType": "tunnelbox \u30B9\u30DE\u30DB\u30DA\u30A2\u30EA\u30F3\u30B0",
|
|
644
|
+
"qr.titleWithType": "tunnelbox {type} \u30B9\u30DE\u30DB\u30DA\u30A2\u30EA\u30F3\u30B0",
|
|
645
|
+
"qr.unavailable": "\uFF08qrcode \u304C\u672A\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB \u2014 \u4E0A\u8A18\u306E\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\uFF09",
|
|
646
|
+
"claude.errBusy": "\u3053\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\u306F\u5B9F\u884C\u4E2D\u3067\u3059\u3002\u5B8C\u4E86\u3059\u308B\u307E\u3067\u304A\u5F85\u3061\u3044\u305F\u3060\u304F\u304B\u3001\u5148\u306B\u505C\u6B62\u3057\u3066\u304F\u3060\u3055\u3044",
|
|
647
|
+
"claude.errTurn": "\u751F\u6210\u30A8\u30E9\u30FC",
|
|
648
|
+
"claude.pairingStillClaimed": "\u3059\u3067\u306B\u30A2\u30AB\u30A6\u30F3\u30C8\u306B\u7D10\u4ED8\u3051\u6E08\u307F\u3067\u3059\u3002\u3053\u306E\u30B3\u30FC\u30C9\u306F\u540C\u3058\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u65B0\u3057\u3044\u7AEF\u672B\u306E\u30DA\u30A2\u30EA\u30F3\u30B0\u5C02\u7528\u3067\u3059\u3002\u73FE\u5728\u306E\u7AEF\u672B\u306F\u300C\u30DE\u30A4\u30B3\u30F3\u30D4\u30E5\u30FC\u30BF\u300D\u304B\u3089\u76F4\u63A5\u63A5\u7D9A\u3067\u304D\u307E\u3059",
|
|
649
|
+
"claude.pairForced": "--pair\uFF1A\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u5F37\u5236\u30EA\u30AF\u30A8\u30B9\u30C8\u3057\u307E\u3057\u305F\uFF08\u4ECA\u56DE\u306E\u307F\uFF09",
|
|
650
|
+
"claude.pairUnclaimed": "\u7D10\u4ED8\u3051\u6E08\u307F\u30A2\u30AB\u30A6\u30F3\u30C8\u3092\u691C\u51FA\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u30DA\u30A2\u30EA\u30F3\u30B0\u6848\u5185\u3092\u958B\u59CB\u3057\u307E\u3059\uFF1A",
|
|
651
|
+
"claude.claimedHint": "\u643A\u5E2F\u30A2\u30AB\u30A6\u30F3\u30C8\u306B\u7D10\u4ED8\u3051\u6E08\u307F\u3067\u3059\uFF1A\u643A\u5E2F\u306E\u300C\u30DE\u30A4\u30B3\u30F3\u30D4\u30E5\u30FC\u30BF\u300D\u304B\u3089\u76F4\u63A5\u63A5\u7D9A\u3057\u3066\u304F\u3060\u3055\u3044",
|
|
652
|
+
"claude.errStartFailed": "\u8D77\u52D5\u306B\u5931\u6557\u3057\u307E\u3057\u305F:",
|
|
653
|
+
"claude.msgStarted": "Claude Code \u30A2\u30C0\u30D7\u30BF\u30FC\u3092\u8D77\u52D5\u3057\u307E\u3057\u305F\uFF08Ctrl+C \u3067\u7D42\u4E86\uFF09",
|
|
654
|
+
"claude.warnInvalidMode": "\u7121\u52B9\u306A TUNNELBOX_CLAUDE_MODE \u3092\u7121\u8996: {raw}\uFF08\u8A31\u53EF {list}\uFF09",
|
|
655
|
+
"claude.warnInvalidThinking": "\u7121\u52B9\u306A TUNNELBOX_CLAUDE_THINKING \u3092\u7121\u8996: {raw}\uFF08off|adaptive|enabled[:budget]\uFF09",
|
|
656
|
+
"claude.cmdNew": "\u65B0\u3057\u3044\u30BB\u30C3\u30B7\u30E7\u30F3",
|
|
657
|
+
"claude.cmdHelp": "\u30D8\u30EB\u30D7\u3092\u8868\u793A",
|
|
658
|
+
"claude.errNoRelay": "\u4E2D\u7D99 URL \u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093: \u30D3\u30EB\u30C9\u6642\u306F --env \u3067\u30C7\u30D5\u30A9\u30EB\u30C8\u3092\u6CE8\u5165\u3057\u3001\u5B9F\u884C\u6642\u306F TUNNELBOX_RELAY_URL \u3067\u4E0A\u66F8\u304D\u3067\u304D\u307E\u3059",
|
|
659
|
+
"claude.logConnected": "\u4E2D\u7D99 {url} \u306B\u63A5\u7D9A\u3057\u307E\u3057\u305F",
|
|
660
|
+
"claude.logMsgUncaught": "\u30E1\u30C3\u30BB\u30FC\u30B8\u51E6\u7406\u4E2D\u306B\u672A\u6355\u6349\u306E\u4F8B\u5916: {message}",
|
|
661
|
+
"claude.reasonDisconnect": "\u4E2D\u7D99\u304C\u5207\u65AD\u3055\u308C\u307E\u3057\u305F\uFF08fail-closed \u81EA\u52D5\u62D2\u5426\uFF09",
|
|
662
|
+
"claude.reasonUnbind": "\u30A2\u30AB\u30A6\u30F3\u30C8\u9023\u643A\u89E3\u9664\uFF08fail-closed \u81EA\u52D5\u62D2\u5426\uFF09",
|
|
663
|
+
"claude.logDisconnected": "\u4E2D\u7D99\u304B\u3089\u5207\u65AD\u3001\u81EA\u52D5\u3067\u518D\u63A5\u7D9A\u4E2D\u2026",
|
|
664
|
+
"claude.logPairCode": "\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u751F\u6210: {code}",
|
|
665
|
+
"claude.logUnhandledType": "\u672A\u51E6\u7406\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u30BF\u30A4\u30D7: {type}",
|
|
666
|
+
"claude.logHandleFailed": "{type} \u306E\u51E6\u7406\u306B\u5931\u6557: {message}",
|
|
667
|
+
"claude.newSessionTitle": "\u65B0\u3057\u3044\u30BB\u30C3\u30B7\u30E7\u30F3",
|
|
668
|
+
"claude.helpText": "\u4F7F\u7528\u53EF\u80FD\u306A\u30B3\u30DE\u30F3\u30C9\uFF1A\n- /new \u65B0\u3057\u3044\u30BB\u30C3\u30B7\u30E7\u30F3\n- /help \u30D8\u30EB\u30D7\u3092\u8868\u793A",
|
|
669
|
+
"claude.logPromptFailed": "session.prompt \u306B\u5931\u6557: {message}",
|
|
670
|
+
"claude.logAbortSent": "\u4E2D\u6B62\u3092\u9001\u4FE1\u3057\u307E\u3057\u305F (session={session})",
|
|
671
|
+
"claude.logAbortFailed": "\u4E2D\u6B62\u306B\u5931\u6557 (session={session}): {message}",
|
|
672
|
+
"claude.errBadWorkspaceEmpty": "\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u306E\u30D1\u30B9\u304C\u3042\u308A\u307E\u305B\u3093",
|
|
673
|
+
"claude.errBadWorkspaceNotDir": "\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u304C\u5B58\u5728\u3057\u306A\u3044\u304B\u5229\u7528\u3067\u304D\u307E\u305B\u3093",
|
|
674
|
+
"claude.logWorkspaceSwitched": "\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u3092\u5207\u66FF: {path}",
|
|
675
|
+
"claude.logUnknownQuestionReply": "\u4E00\u81F4\u3057\u306A\u3044\u69CB\u9020\u5316\u8CEA\u554F\u306E\u5FDC\u7B54 (id={id})",
|
|
676
|
+
"claude.logFlushedQuestions": "\u672A\u56DE\u7B54\u306E\u8CEA\u554F {count} \u4EF6\u3092\u30AD\u30E3\u30F3\u30BB\u30EB: {reason}",
|
|
677
|
+
"claude.logFlushedApprovals": "\u672A\u56DE\u7B54\u306E\u30EA\u30AF\u30A8\u30B9\u30C8 {count} \u4EF6\u3092\u62D2\u5426: {reason}",
|
|
678
|
+
"claude.logPendingResent": "session.pending: {session} \u306E\u4FDD\u7559\u9805\u76EE {count} \u4EF6\u3092\u518D\u9001\u4FE1",
|
|
679
|
+
"claude.logSetModeFailed": "setPermissionMode \u306B\u5931\u6557 (session={session}): {message}",
|
|
680
|
+
"claude.errWorkspaceMissing": "\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u304C\u5B58\u5728\u3057\u307E\u305B\u3093: {dir}",
|
|
681
|
+
"claude.logSessionError": "\u30BB\u30C3\u30B7\u30E7\u30F3\u30A8\u30E9\u30FC (session={session}): {message}",
|
|
682
|
+
"claude.logOfflineDenyTool": "\u4E2D\u7D99\u30AA\u30D5\u30E9\u30A4\u30F3\u3001\u30C4\u30FC\u30EB {tool} \u3092\u81EA\u52D5\u62D2\u5426",
|
|
683
|
+
"claude.errOfflineDeny": "\u4E2D\u7D99\u30AA\u30D5\u30E9\u30A4\u30F3\u3001\u81EA\u52D5\u62D2\u5426\uFF08fail-closed\uFF09",
|
|
684
|
+
"claude.logAuqDisabled": "AskUserQuestion \u306F\u7121\u52B9\u3067\u3059\uFF08TUNNELBOX_CLAUDE_ASK_USER_QUESTION=0\uFF09\u3001\u81EA\u52D5\u62D2\u5426",
|
|
685
|
+
"claude.errAuqDisabled": "AskUserQuestion \u306F\u6709\u52B9\u306B\u306A\u3063\u3066\u3044\u307E\u305B\u3093",
|
|
686
|
+
"claude.logAuqParseFailed": "AskUserQuestion \u5165\u529B\u306E\u89E3\u6790\u306B\u5931\u6557\u3001\u81EA\u52D5\u62D2\u5426\uFF08fail-closed\uFF09",
|
|
687
|
+
"claude.errAuqParse": "\u8CEA\u554F\u3092\u89E3\u6790\u3067\u304D\u307E\u305B\u3093",
|
|
688
|
+
"claude.logAuqSkipped": "AskUserQuestion \u672A\u56DE\u7B54/\u30AD\u30E3\u30F3\u30BB\u30EB (session={session})",
|
|
689
|
+
"claude.errAuqCancelled": "\u30E6\u30FC\u30B6\u30FC\u304C\u9078\u629E\u3057\u307E\u305B\u3093\u3067\u3057\u305F\uFF08\u30AD\u30E3\u30F3\u30BB\u30EB\uFF09",
|
|
690
|
+
"claude.logAuqDone": "AskUserQuestion \u306B\u56DE\u7B54\u3057\u307E\u3057\u305F (session={session})",
|
|
691
|
+
"claude.promptRunTool": "Claude Code \u304C {tool} \u306E\u5B9F\u884C\u3092\u8981\u6C42",
|
|
692
|
+
"claude.errApprovalTimeout": "\u627F\u8A8D\u304C\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u3001\u81EA\u52D5\u62D2\u5426\uFF08fail-closed\uFF09",
|
|
693
|
+
"claude.errUserDenied": "\u30E6\u30FC\u30B6\u30FC\u304C\u62D2\u5426",
|
|
694
|
+
"claude.errAborted": "\u30EA\u30AF\u30A8\u30B9\u30C8\u306F\u4E2D\u6B62\u3055\u308C\u307E\u3057\u305F",
|
|
695
|
+
"claude.logPermToPhone": "\u6A29\u9650\u30EA\u30AF\u30A8\u30B9\u30C8(tool={tool}) \u2192 \u30B9\u30DE\u30DB\u3078\u9001\u4FE1 permissionID={id}",
|
|
696
|
+
"claude.errRelayUnreachable": "\u4E2D\u7D99\u306B\u5230\u9054\u3067\u304D\u305A\u3001\u81EA\u52D5\u62D2\u5426\uFF08fail-closed\uFF09",
|
|
697
|
+
"claude.logQuestionOffline": "\u4E2D\u7D99\u30AA\u30D5\u30E9\u30A4\u30F3\u3001\u69CB\u9020\u5316\u8CEA\u554F\u3092\u81EA\u52D5\u30AD\u30E3\u30F3\u30BB\u30EB",
|
|
698
|
+
"claude.logQuestionToPhone": "\u69CB\u9020\u5316\u8CEA\u554F\uFF08{count} \u554F\uFF09\u2192 \u30B9\u30DE\u30DB\u3078\u9001\u4FE1 questionID={id}",
|
|
699
|
+
"claude.logDialogOffline": "\u4E2D\u7D99\u30AA\u30D5\u30E9\u30A4\u30F3\u3001\u30C0\u30A4\u30A2\u30ED\u30B0\u3092\u81EA\u52D5\u30AD\u30E3\u30F3\u30BB\u30EB\uFF08{tool}\uFF09",
|
|
700
|
+
"claude.logDialogToPhone": "\u30C0\u30A4\u30A2\u30ED\u30B0\u8981\u6C42(kind={kind} tool={tool}) \u2192 \u30B9\u30DE\u30DB\u3078\u9001\u4FE1 permissionID={id}",
|
|
701
|
+
"claude.logAuqDialogParse": "AskUserQuestion \u30DA\u30A4\u30ED\u30FC\u30C9\u306E\u89E3\u6790\u306B\u5931\u6557\u3001\u65E2\u5B9A\u306E\u52D5\u4F5C\u3092\u7DAD\u6301\uFF08session={session}\uFF09",
|
|
702
|
+
"claude.logDialogUnmapped": "request_user_dialog(kind={kind}) \u306E\u30DE\u30C3\u30D4\u30F3\u30B0\u304C\u306A\u304F\u3001\u65E2\u5B9A\u306E\u52D5\u4F5C\u3092\u7DAD\u6301\uFF08session={session}\uFF09",
|
|
703
|
+
"claude.promptMcpAuth": "MCP\u300C{server}\u300D\u304C\u8A8D\u53EF\u3092\u8981\u6C42",
|
|
704
|
+
"claude.logElicitUnmapped": "MCP elicitation\uFF08server={server}, mode={mode}\uFF09\u306F\u672A\u5BFE\u5FDC\u3001\u81EA\u52D5\u62D2\u5426\uFF08session={session}\uFF09",
|
|
705
|
+
"claude.logResetIdentity": "\u30A2\u30AB\u30A6\u30F3\u30C8\u9023\u643A\u304C\u89E3\u9664\u3055\u308C\u307E\u3057\u305F\u3002ID \u3092\u30EA\u30BB\u30C3\u30C8\u3057\u3001\u65B0\u3057\u3044\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u751F\u6210\u3057\u3066\u3044\u307E\u3059\u2026",
|
|
706
|
+
"claude.dialogConfirm": "Claude Code \u304C\u78BA\u8A8D\u3092\u8981\u6C42\uFF08{kind}\uFF09",
|
|
707
|
+
"claude.resultTruncated": "\u2026\uFF08\u7D50\u679C\u304C\u9577\u3059\u304E\u308B\u305F\u3081\u7701\u7565\uFF09",
|
|
708
|
+
"claude.streamError": "claude \u30B9\u30C8\u30EA\u30FC\u30DF\u30F3\u30B0\u30A8\u30E9\u30FC",
|
|
709
|
+
"claude.errListSessions": "Claude \u30BB\u30C3\u30B7\u30E7\u30F3\u4E00\u89A7\u306E\u8AAD\u307F\u53D6\u308A\u306B\u5931\u6557",
|
|
710
|
+
"claude.errReadHistory": "\u30BB\u30C3\u30B7\u30E7\u30F3\u5C65\u6B74\u306E\u8AAD\u307F\u53D6\u308A\u306B\u5931\u6557\uFF08{id}\uFF09",
|
|
711
|
+
"setup.langSet": "\u5B9F\u884C\u8A00\u8A9E\u3092\u8A2D\u5B9A\u3057\u307E\u3057\u305F",
|
|
712
|
+
"setup.langHint": "\u518D\u8D77\u52D5\u5F8C\u306B\u3053\u306E\u8A00\u8A9E\u3067\u51FA\u529B\u3057\u307E\u3059\uFF08\u5B9F\u884C\u6642\u306F TUNNELBOX_LANG \u3067\u4E0A\u66F8\u304D\u53EF\u80FD\uFF09\u3002\u72B6\u614B\u30D5\u30A1\u30A4\u30EB\uFF1A",
|
|
713
|
+
"setup.langCurrent": "\u73FE\u5728\u306E\u5B9F\u884C\u8A00\u8A9E",
|
|
714
|
+
"hermes.errNoRelay": "\u30EA\u30EC\u30FCURL\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\uFF1A--env \u3067\u30C7\u30D5\u30A9\u30EB\u30C8\u3092\u6CE8\u5165\u3001\u5B9F\u884C\u6642\u306F TUNNELBOX_RELAY_URL \u3067\u4E0A\u66F8\u304D\u3057\u3066\u304F\u3060\u3055\u3044",
|
|
715
|
+
"hermes.logConnected": "\u30EA\u30EC\u30FC\u306B\u63A5\u7D9A\u3057\u307E\u3057\u305F {url}",
|
|
716
|
+
"hermes.logMsgUncaught": "\u30E1\u30C3\u30BB\u30FC\u30B8\u51E6\u7406\u4E2D\u306E\u672A\u6355\u6349\u4F8B\u5916: {message}",
|
|
717
|
+
"hermes.logDisconnected": "\u30EA\u30EC\u30FC\u304B\u3089\u5207\u65AD\u3001\u81EA\u52D5\u518D\u63A5\u7D9A\u4E2D\u2026",
|
|
718
|
+
"hermes.logPairCode": "\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u751F\u6210: {code}",
|
|
719
|
+
"hermes.logUnhandledType": "\u672A\u51E6\u7406\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u30BF\u30A4\u30D7: {type}",
|
|
720
|
+
"hermes.logHandleFailed": "{type} \u306E\u51E6\u7406\u306B\u5931\u6557: {message}",
|
|
721
|
+
"hermes.logClaimed": "\u30B9\u30DE\u30DB\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u306B\u30D0\u30A4\u30F3\u30C9\u3057\u307E\u3057\u305F\u3002\u4EE5\u5F8C\u306F\u30B9\u30DE\u30DB\u306E\u300C\u30DE\u30A4\u30B3\u30F3\u30D4\u30E5\u30FC\u30BF\u300D\u304B\u3089\u76F4\u63A5\u63A5\u7D9A\u3057\u307E\u3059",
|
|
722
|
+
"hermes.logResetIdentity": "\u30A2\u30AB\u30A6\u30F3\u30C8\u304B\u3089\u30D0\u30A4\u30F3\u30C9\u89E3\u9664\u3001ID\u3092\u30EA\u30BB\u30C3\u30C8\u3057\u3066\u65B0\u3057\u3044\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u751F\u6210\u4E2D\u2026",
|
|
723
|
+
"hermes.cmdNew": "\u65B0\u898F\u30BB\u30C3\u30B7\u30E7\u30F3",
|
|
724
|
+
"hermes.cmdHelp": "\u30D8\u30EB\u30D7\u3092\u8868\u793A",
|
|
725
|
+
"hermes.newSessionTitle": "\u65B0\u898F\u30BB\u30C3\u30B7\u30E7\u30F3",
|
|
726
|
+
"hermes.helpText": "\u30B5\u30DD\u30FC\u30C8\u30B3\u30DE\u30F3\u30C9\uFF1A\n- /new \u65B0\u898F\u30BB\u30C3\u30B7\u30E7\u30F3\n- /help \u30D8\u30EB\u30D7\u3092\u8868\u793A",
|
|
727
|
+
"hermes.errBusy": "\u3053\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\u306F\u751F\u6210\u4E2D\u3067\u3059\u3002\u5B8C\u4E86\u3092\u5F85\u3064\u304B\u3001\u5148\u306B\u505C\u6B62\u3057\u3066\u304F\u3060\u3055\u3044",
|
|
728
|
+
"hermes.errBadWorkspace": "\u3053\u306E\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306F\u5B58\u5728\u3057\u306A\u3044\u304B\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093",
|
|
729
|
+
"hermes.logWorkspaceSwitched": "\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u3092\u5207\u66FF: {path}",
|
|
730
|
+
"hermes.errWorkspaceMissing": "\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u304C\u5B58\u5728\u3057\u307E\u305B\u3093: {dir}",
|
|
731
|
+
"hermes.errStartFailed": "\u8D77\u52D5\u306B\u5931\u6557: {message}",
|
|
732
|
+
"hermes.msgStarted": "Hermes \u30A2\u30C0\u30D7\u30BF\u3092\u8D77\u52D5\u3057\u307E\u3057\u305F\uFF08Ctrl+C \u3067\u7D42\u4E86\uFF09",
|
|
733
|
+
"hermes.logAbortSent": "\u4E2D\u6B62\u3092\u9001\u4FE1 (session={session})",
|
|
734
|
+
"hermes.logPromptFailed": "session.prompt \u306B\u5931\u6557: {message}",
|
|
735
|
+
"hermes.logTurnError": "\u30BF\u30FC\u30F3\u30A8\u30E9\u30FC (session={session}): {message}",
|
|
736
|
+
"hermes.logPairForced": "--pair\uFF1A\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u5F37\u5236\u53D6\u5F97\uFF08\u4ECA\u56DE\u306E\u307F\uFF09",
|
|
737
|
+
"hermes.pairingStillClaimed": "\u30B9\u30DE\u30DB\u30A2\u30AB\u30A6\u30F3\u30C8\u306B\u30D0\u30A4\u30F3\u30C9\u6E08\u307F\uFF1A\u3053\u306E\u30B3\u30FC\u30C9\u306F\u540C\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u65B0\u30C7\u30D0\u30A4\u30B9\u518D\u30DA\u30A2\u30EA\u30F3\u30B0\u7528\u3067\u3059\u3002\u73FE\u5728\u306E\u30C7\u30D0\u30A4\u30B9\u306F\u30B9\u30DE\u30DB\u306E\u300C\u30DE\u30A4\u30B3\u30F3\u30D4\u30E5\u30FC\u30BF\u300D\u304B\u3089\u76F4\u63A5\u63A5\u7D9A\u3067\u304D\u307E\u3059",
|
|
738
|
+
"hermes.logPairNoRelay": "\u30EA\u30EC\u30FCURL\u304C\u672A\u8A2D\u5B9A\u306E\u305F\u3081\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093",
|
|
739
|
+
"hermes.errSpawnHermes": "Hermes\uFF08{bin}\uFF09\u3092\u8D77\u52D5\u3067\u304D\u307E\u305B\u3093\uFF1A\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\uFF08{err}\uFF09",
|
|
740
|
+
"hermes.errHermesExit": "hermes \u7D42\u4E86({code}): {err}",
|
|
741
|
+
"hermes.logSessionUpdated": "\u30BB\u30C3\u30B7\u30E7\u30F3\u3092\u66F4\u65B0 (session={session})",
|
|
742
|
+
"hermes.errNoInject": "\u30B9\u30DE\u30DB\u304B\u3089\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u633F\u5165\u304C\u5229\u7528\u3067\u304D\u307E\u305B\u3093\uFF08\u975E\u5BFE\u8A71\u30BB\u30C3\u30B7\u30E7\u30F3\u307E\u305F\u306F\u30D7\u30ED\u30BB\u30B9\u672A\u6E96\u5099\uFF09",
|
|
743
|
+
"hermes.pairNoRelay": "\u30EA\u30EC\u30FC\u306B\u63A5\u7D9A\u3067\u304D\u307E\u305B\u3093\uFF08\u30EA\u30EC\u30FC\u5230\u9054\u4E0D\u80FD\u307E\u305F\u306F websockets \u6B20\u843D\uFF09",
|
|
744
|
+
"hermes.pairTimeout": "\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u8981\u6C42\u304C\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\uFF08\u30EA\u30EC\u30FC\u672A\u5FDC\u7B54\uFF09",
|
|
745
|
+
"hermes.errToolPair": "tunnelbox_pair \u5931\u6557: {err}",
|
|
746
|
+
"hermes.errToolStatus": "tunnelbox_status \u5931\u6557: {err}",
|
|
747
|
+
"hermes.cliUsage": "\u4F7F\u7528\u65B9\u6CD5: /tunnelbox <pair|status>\n pair \u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u53D6\u5F97\u3057\u3066\u8868\u793A\n status \u30EA\u30EC\u30FC/\u30D0\u30A4\u30F3\u30C9/\u63A5\u7D9A\u72B6\u614B\u3092\u8868\u793A"
|
|
748
|
+
};
|
|
749
|
+
|
|
750
|
+
// locales/ko-KR.json
|
|
751
|
+
var ko_KR_default = {
|
|
752
|
+
"agent.err.createSession": "\uC138\uC158 \uC0DD\uC131 \uC2E4\uD328",
|
|
753
|
+
"agent.err.httpClient": "opencode HTTP client\uC5D0 \uC811\uADFC\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",
|
|
754
|
+
"agent.err.unknownPerm": "\uC54C \uC218 \uC5C6\uB294 \uAD8C\uD55C \uC694\uCCAD: {id}",
|
|
755
|
+
"agent.err.unknownQuestion": "\uC54C \uC218 \uC5C6\uB294 \uC9C8\uBB38 \uC694\uCCAD: {id}",
|
|
756
|
+
"agent.log.fallback404": "\uC120\uD638 \uC5D4\uB4DC\uD3EC\uC778\uD2B8\uAC00 404\uB97C \uBC18\uD658\uD574 \uB2E4\uB978 \uC5D4\uB4DC\uD3EC\uC778\uD2B8\uB85C \uB300\uCCB4: {message}",
|
|
757
|
+
"agent.log.gotPermReply": "\uD734\uB300\uD3F0\uC5D0\uC11C \uAD8C\uD55C \uC751\uB2F5 \uC218\uC2E0 (id={id} {reply} {version})",
|
|
758
|
+
"agent.log.gotQuestionReply": "\uD734\uB300\uD3F0\uC5D0\uC11C \uC9C8\uBB38 \uC751\uB2F5 \uC218\uC2E0 (id={id} {status} {version})",
|
|
759
|
+
"agent.log.handleFailed": "{type} \uCC98\uB9AC \uC2E4\uD328: {message}",
|
|
760
|
+
"agent.log.httpOk": "opencode HTTP {status} {path}",
|
|
761
|
+
"agent.log.pendingResent": "session.pending: {session} \uBCF4\uB958 \uC694\uCCAD {count}\uAC74 \uC7AC\uC804\uC1A1",
|
|
762
|
+
"agent.log.unhandledType": "\uCC98\uB9AC\uB418\uC9C0 \uC54A\uC740 \uBA54\uC2DC\uC9C0 \uC720\uD615: {type}",
|
|
763
|
+
"events.log.fwdPermission": "\uAD8C\uD55C \uC694\uCCAD\uC744 \uD734\uB300\uD3F0\uC73C\uB85C \uC804\uB2EC (id={id} tool={tool} {version})",
|
|
764
|
+
"events.log.permissionReplied": "opencode \uC751\uB2F5 permission.replied (id={id} {response})",
|
|
765
|
+
"events.log.questionRejected": "opencode \uC751\uB2F5 question.rejected (id={id})",
|
|
766
|
+
"events.log.questionReplied": "opencode \uC751\uB2F5 question.replied (id={id})",
|
|
767
|
+
"index.error.connectRelay": "\uB9B4\uB808\uC774\uC5D0 \uC5F0\uACB0\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uB9B4\uB808\uC774 \uC8FC\uC18C\uB97C \uD655\uC778\uD55C \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694",
|
|
768
|
+
"index.error.pairTimeout": "\uD398\uC5B4\uB9C1 \uCF54\uB4DC \uB300\uAE30 \uC2DC\uAC04 \uCD08\uACFC(\uB9B4\uB808\uC774\uAC00 \uC751\uB2F5\uD558\uC9C0 \uC54A\uC74C)",
|
|
769
|
+
"index.log.claimed": "\uD734\uB300\uD3F0 \uACC4\uC815\uC5D0 \uC5F0\uACB0\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uC774\uC81C \uD734\uB300\uD3F0\uC740 \u300C\uB0B4 PC\u300D\uC5D0\uC11C \uC9C1\uC811 \uC5F0\uACB0\uD558\uBA70 \uB2E4\uC2DC \uC2A4\uCE94\uD560 \uD544\uC694\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4",
|
|
770
|
+
"index.log.connectedRelay": "\uB9B4\uB808\uC774\uC5D0 \uC5F0\uACB0\uB428 {url}",
|
|
771
|
+
"index.log.disconnected": "\uB9B4\uB808\uC774 \uC5F0\uACB0\uC774 \uB04A\uACA8 \uC790\uB3D9\uC73C\uB85C \uC7AC\uC5F0\uACB0 \uC911\u2026",
|
|
772
|
+
"index.log.exit": "\uC885\uB8CC\uB428",
|
|
773
|
+
"index.log.pairCode": "\uD398\uC5B4\uB9C1 \uCF54\uB4DC \uC0DD\uC131: {code}",
|
|
774
|
+
"index.log.pairingStillClaimed": "\uC774 \uD398\uC5B4\uB9C1 \uCF54\uB4DC\uB294 \uAC19\uC740 \uACC4\uC815\uC758 \uC0C8 \uD734\uB300\uD3F0 \uC7AC\uC5F0\uACB0 \uC804\uC6A9\uC785\uB2C8\uB2E4. \uC774 PC\uB294 \uC774\uBBF8 \uC5F0\uACB0\uB418\uC5B4 \uD734\uB300\uD3F0\uC758 '\uB0B4 \uCEF4\uD4E8\uD130'\uC5D0\uC11C \uACC4\uC18D \uC811\uC18D\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.",
|
|
775
|
+
"index.log.pairingPreparing": "\uB9B4\uB808\uC774\uC5D0 \uC5F0\uACB0\uD558\uC5EC \uD398\uC5B4\uB9C1 \uCF54\uB4DC\uB97C \uC0DD\uC131\uD558\uB294 \uC911\uC785\uB2C8\uB2E4\u2026",
|
|
776
|
+
"index.log.permissionToPhone": "\uAD8C\uD55C \uC694\uCCAD \u2192 \uD734\uB300\uD3F0 \uC2B9\uC778 (id={id} tool={tool})",
|
|
777
|
+
"index.log.permissionTuiFallback": "\uC571 \uC624\uD504\uB77C\uC778, \uAD8C\uD55C \uC694\uCCAD\uC740 opencode TUI\uAC00 \uCC98\uB9AC (id={id} tool={tool})",
|
|
778
|
+
"index.log.relayError": "\uB9B4\uB808\uC774 \uC624\uB958: {msg}",
|
|
779
|
+
"index.log.resetIdentity": "\uACC4\uC815\uC5D0\uC11C \uD574\uC81C\uB418\uC5B4 ID\uB97C \uC7AC\uC124\uC815\uD558\uACE0 \uC0C8 \uD398\uC5B4\uB9C1 \uCF54\uB4DC\uB97C \uC0DD\uC131\uD569\uB2C8\uB2E4\u2026",
|
|
780
|
+
"index.log.unknown": "\uC54C \uC218 \uC5C6\uC74C",
|
|
781
|
+
"install.codeLine": "\uD398\uC5B4\uB9C1 \uCF54\uB4DC: {code}",
|
|
782
|
+
"install.commandInstalled": "\uBA85\uB839 \uC124\uCE58\uB428: {path}",
|
|
783
|
+
"install.done": "\uC644\uB8CC. \uB9B4\uB808\uC774\uC5D0 \uC5F0\uACB0\uD574 \uC774 PC\uC758 \uD398\uC5B4\uB9C1 \uC815\uBCF4\uB97C \uCD9C\uB825\uD569\uB2C8\uB2E4:",
|
|
784
|
+
"install.failConnect": "(\uD398\uC5B4\uB9C1 \uC815\uBCF4\uB97C \uCD9C\uB825\uD558\uB824\uACE0 \uB9B4\uB808\uC774\uC5D0 \uC989\uC2DC \uC5F0\uACB0\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4 \u2014 \uB9B4\uB808\uC774\uC5D0 \uC5F0\uACB0\uD560 \uC218 \uC5C6\uAC70\uB098 Node \uBC84\uC804\uC774 \uB108\uBB34 \uC624\uB798\uB410\uC2B5\uB2C8\uB2E4.",
|
|
785
|
+
"install.failConnectHint": "opencode\uB97C \uB2E4\uC2DC \uC2DC\uC791\uD55C \uB4A4 --print-logs\uB85C \uD130\uBBF8\uB110 QR \uCF54\uB4DC\uB97C \uD655\uC778\uD558\uAC70\uB098, opencode \uC548\uC5D0\uC11C \u201C\uD734\uB300\uD3F0 \uD398\uC5B4\uB9C1 \uCF54\uB4DC \uD45C\uC2DC\u201D \uB610\uB294 /pair\uB97C \uC785\uB825\uD558\uC138\uC694.)",
|
|
786
|
+
"install.hintFresh": "\uCC38\uACE0: \uD398\uC5B4\uB9C1 \uCF54\uB4DC\uB294 \uC77C\uD68C\uC6A9\uC774\uBA70 \uC57D 10\uBD84\uAC04 \uC720\uD6A8\uD569\uB2C8\uB2E4. \uB098\uC911\uC5D0 opencode\uB97C \uC2DC\uC791\uD55C\uB2E4\uBA74 \uC2DC\uC791 \uC2DC \uCD9C\uB825\uB418\uAC70\uB098 /pair\uB85C \uBC1B\uC740 \uCD5C\uC2E0 \uC815\uBCF4\uB97C \uC0AC\uC6A9\uD558\uC138\uC694.",
|
|
787
|
+
"install.pluginInstalled": "\uD50C\uB7EC\uADF8\uC778 \uC124\uCE58\uB428: {path}",
|
|
788
|
+
"install.qrUnavailable": "(QR \uCF54\uB4DC\uB97C \uD45C\uC2DC\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uC704\uC758 \uD398\uC5B4\uB9C1 \uCF54\uB4DC\uB97C \uC0AC\uC6A9\uD558\uC138\uC694)",
|
|
789
|
+
"install.qrcodeEnsure": "qrcode\uB97C opencode \uC124\uC815 \uB514\uB809\uD130\uB9AC\uC5D0 \uC124\uCE58\uD558\uB294 \uC911\u2026",
|
|
790
|
+
"install.qrcodeFail": "qrcode \uC124\uCE58 \uC2E4\uD328(\uC0AC\uC6A9\uC5D0\uB294 \uC601\uD5A5\uC774 \uC5C6\uC73C\uBA70 \uD398\uC5B4\uB9C1 \uCF54\uB4DC\uB9CC \uD45C\uC2DC\uB429\uB2C8\uB2E4): {err}",
|
|
791
|
+
"install.relayError": "\uB9B4\uB808\uC774 \uC624\uB958 \uC751\uB2F5: {msg}",
|
|
792
|
+
"install.scanHint": "\uD734\uB300\uD3F0\uC5D0\uC11C tunnelbox \uC571 \u201C\uC2A4\uCE94\uD558\uC5EC \uC5F0\uACB0\u201D\uC744 \uC5F4\uACE0 \uC704 QR \uCF54\uB4DC\uB97C \uC2A4\uCE94\uD558\uC5EC \uC5F0\uACB0\uD558\uC138\uC694:",
|
|
793
|
+
"pair.heading": "tunnelbox \uD734\uB300\uD3F0 \uD398\uC5B4\uB9C1",
|
|
794
|
+
"pair.howTo": "\uD734\uB300\uD3F0\uC5D0\uC11C tunnelbox \uC571\uC744 \uC5F4\uACE0 \u201C\uC2A4\uCE94\uD558\uC5EC \uC5F0\uACB0\u201D\uB85C \uC704 QR \uCF54\uB4DC\uB97C \uC2A4\uCE94\uD558\uAC70\uB098 \uD398\uC5B4\uB9C1 \uCF54\uB4DC\uB97C \uC9C1\uC811 \uC785\uB825\uD558\uC138\uC694.",
|
|
795
|
+
"pair.oneTime": "\uD398\uC5B4\uB9C1 \uCF54\uB4DC\uB294 \uC77C\uD68C\uC6A9\uC774\uBA70 \uC0AC\uC6A9 \uD6C4\uC5D0\uB294 \uB9CC\uB8CC\uB429\uB2C8\uB2E4. \uC0C8 \uCF54\uB4DC\uAC00 \uD544\uC694\uD558\uBA74 \u201C\uD398\uC5B4\uB9C1 \uCF54\uB4DC \uC0C8\uB85C\uACE0\uCE68\u201D\uC744 \uC694\uCCAD\uD558\uC138\uC694.",
|
|
796
|
+
"pair.promptBody": "\uC774 PC\uC758 \uD734\uB300\uD3F0 \uC6D0\uACA9 \uD398\uC5B4\uB9C1 \uC815\uBCF4\uB97C \uBCF4\uC5EC\uC8FC\uC138\uC694: \uD398\uC5B4\uB9C1 \uCF54\uB4DC\uC640 \uC2A4\uCE94\uD560 \uC218 \uC788\uB294 QR \uCF54\uB4DC. QR \uCF54\uB4DC\uB294 \uACE0\uC815\uD3ED \uCF54\uB4DC \uBE14\uB85D\uC5D0 \uB123\uACE0 \uD55C \uAE00\uC790\uB3C4 \uBC14\uAFB8\uC9C0 \uB9D0\uACE0 \uADF8\uB300\uB85C \uD45C\uC2DC\uD574 \uC8FC\uC138\uC694. \uD734\uB300\uD3F0\uC73C\uB85C \uC2A4\uCE94\uD560 \uC218 \uC788\uB3C4\uB85D \uD558\uAE30 \uC704\uD568\uC785\uB2C8\uB2E4.",
|
|
797
|
+
"pair.promptDescription": "\uD734\uB300\uD3F0 \uC6D0\uACA9 \uD398\uC5B4\uB9C1\uC758 \uD398\uC5B4\uB9C1 \uCF54\uB4DC\xB7\uC2A4\uCE94\uC6A9 QR \uCF54\uB4DC \uD45C\uC2DC",
|
|
798
|
+
"pair.scanIntro": "**\uC2A4\uCE94\uC73C\uB85C \uC5F0\uACB0**: \uD734\uB300\uD3F0\uC5D0\uC11C tunnelbox \uC571 \u201C\uC2A4\uCE94\uD558\uC5EC \uC5F0\uACB0\u201D\uC744 \uC5F4\uACE0 \uC544\uB798 QR \uCF54\uB4DC\uB97C \uC2A4\uCE94\uD558\uBA74 \uC790\uB3D9\uC73C\uB85C \uC5F0\uACB0\uB429\uB2C8\uB2E4.",
|
|
799
|
+
"perm.promptAuthorize": "opencode\uAC00 \uAD8C\uD55C\uC744 \uC694\uCCAD\uD569\uB2C8\uB2E4",
|
|
800
|
+
"perm.promptPatterns": "opencode\uAC00 \uC811\uADFC\uC744 \uC694\uCCAD: {list}",
|
|
801
|
+
"perm.promptResource": "opencode\uAC00 \uB9AC\uC18C\uC2A4 \uC811\uADFC\uC744 \uC694\uCCAD: {list}",
|
|
802
|
+
"perm.promptTool": "opencode\uAC00 {tool} \uC2E4\uD589\uC744 \uC694\uCCAD",
|
|
803
|
+
"qr.codeLabel": "\uD398\uC5B4\uB9C1 \uCF54\uB4DC",
|
|
804
|
+
"qr.fileWritten": "\uD398\uC5B4\uB9C1 \uC815\uBCF4\uAC00 \uAE30\uB85D\uB428: {path}",
|
|
805
|
+
"qr.openHint": "tunnelbox \uC571\uC744 \uC5F4\uACE0 \uC704 QR \uCF54\uB4DC\uB97C \uC2A4\uCE94\uD558\uAC70\uB098, \uC571\uC5D0\uC11C \uD398\uC5B4\uB9C1 \uCF54\uB4DC\uB97C \uC9C1\uC811 \uC785\uB825\uD558\uC138\uC694.",
|
|
806
|
+
"qr.titleNoType": "tunnelbox \uD734\uB300\uD3F0 \uD398\uC5B4\uB9C1",
|
|
807
|
+
"qr.titleWithType": "tunnelbox {type} \uD734\uB300\uD3F0 \uD398\uC5B4\uB9C1",
|
|
808
|
+
"qr.unavailable": "(qrcode\uAC00 \uC124\uCE58\uB418\uC9C0 \uC54A\uC74C \u2014 \uC704\uC758 \uD398\uC5B4\uB9C1 \uCF54\uB4DC\uB97C \uC0AC\uC6A9\uD558\uC138\uC694)",
|
|
809
|
+
"claude.errBusy": "\uC774 \uC138\uC158\uC774 \uC2E4\uD589 \uC911\uC785\uB2C8\uB2E4. \uC644\uB8CC\uB420 \uB54C\uAE4C\uC9C0 \uAE30\uB2E4\uB9AC\uAC70\uB098 \uBA3C\uC800 \uC911\uC9C0\uD558\uC138\uC694",
|
|
810
|
+
"claude.errTurn": "\uC0DD\uC131 \uC624\uB958",
|
|
811
|
+
"claude.pairingStillClaimed": "\uC774\uBBF8 \uACC4\uC815\uC5D0 \uC5F0\uACB0\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. \uC774 \uCF54\uB4DC\uB294 \uAC19\uC740 \uACC4\uC815\uC758 \uC0C8 \uAE30\uAE30 \uC5F0\uACB0 \uC804\uC6A9\uC774\uBA70, \uD604\uC7AC \uAE30\uAE30\uB294 '\uB0B4 \uCEF4\uD4E8\uD130'\uC5D0\uC11C \uC9C1\uC811 \uC5F0\uACB0\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4",
|
|
812
|
+
"claude.pairForced": "--pair: \uD398\uC5B4\uB9C1 \uCF54\uB4DC\uB97C \uAC15\uC81C \uC694\uCCAD\uD588\uC2B5\uB2C8\uB2E4(\uC774\uBC88 \uC2E4\uD589\uB9CC)",
|
|
813
|
+
"claude.pairUnclaimed": "\uC5F0\uACB0\uB41C \uACC4\uC815\uC744 \uAC10\uC9C0\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uD398\uC5B4\uB9C1 \uC548\uB0B4\uB97C \uC2DC\uC791\uD569\uB2C8\uB2E4:",
|
|
814
|
+
"claude.claimedHint": "\uD734\uB300\uD3F0 \uACC4\uC815\uC5D0 \uC5F0\uACB0\uB428: \uD734\uB300\uD3F0\uC758 '\uB0B4 \uCEF4\uD4E8\uD130'\uC5D0\uC11C \uC9C1\uC811 \uC5F0\uACB0\uD558\uC138\uC694",
|
|
815
|
+
"claude.errStartFailed": "\uC2DC\uC791 \uC2E4\uD328:",
|
|
816
|
+
"claude.msgStarted": "Claude Code \uC5B4\uB311\uD130\uAC00 \uC2DC\uC791\uB418\uC5C8\uC2B5\uB2C8\uB2E4(Ctrl+C\uB85C \uC885\uB8CC)",
|
|
817
|
+
"claude.warnInvalidMode": "\uC798\uBABB\uB41C TUNNELBOX_CLAUDE_MODE \uBB34\uC2DC: {raw}(\uD5C8\uC6A9 {list})",
|
|
818
|
+
"claude.warnInvalidThinking": "\uC798\uBABB\uB41C TUNNELBOX_CLAUDE_THINKING \uBB34\uC2DC: {raw}(off|adaptive|enabled[:budget])",
|
|
819
|
+
"claude.cmdNew": "\uC0C8 \uC138\uC158",
|
|
820
|
+
"claude.cmdHelp": "\uB3C4\uC6C0\uB9D0 \uBCF4\uAE30",
|
|
821
|
+
"claude.errNoRelay": "\uB9B4\uB808\uC774 URL\uC774 \uC124\uC815\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4: --env\uB85C \uAE30\uBCF8\uAC12\uC744 \uC8FC\uC785\uD558\uAC70\uB098 \uC2E4\uD589 \uC2DC TUNNELBOX_RELAY_URL\uB85C \uB36E\uC5B4\uC4F0\uC138\uC694",
|
|
822
|
+
"claude.logConnected": "\uB9B4\uB808\uC774 {url}\uC5D0 \uC5F0\uACB0\uB428",
|
|
823
|
+
"claude.logMsgUncaught": "\uBA54\uC2DC\uC9C0 \uCC98\uB9AC \uC911 \uCC98\uB9AC\uB418\uC9C0 \uC54A\uC740 \uC608\uC678: {message}",
|
|
824
|
+
"claude.reasonDisconnect": "\uB9B4\uB808\uC774 \uC5F0\uACB0 \uB04A\uAE40(fail-closed \uC790\uB3D9 \uAC70\uBD80)",
|
|
825
|
+
"claude.reasonUnbind": "\uACC4\uC815 \uC5F0\uACB0 \uD574\uC81C(fail-closed \uC790\uB3D9 \uAC70\uBD80)",
|
|
826
|
+
"claude.logDisconnected": "\uB9B4\uB808\uC774 \uC5F0\uACB0\uC774 \uB04A\uC5B4\uC838 \uC790\uB3D9 \uC7AC\uC5F0\uACB0 \uC911\u2026",
|
|
827
|
+
"claude.logPairCode": "\uD398\uC5B4\uB9C1 \uCF54\uB4DC \uC0DD\uC131: {code}",
|
|
828
|
+
"claude.logUnhandledType": "\uCC98\uB9AC\uB418\uC9C0 \uC54A\uC740 \uBA54\uC2DC\uC9C0 \uC720\uD615: {type}",
|
|
829
|
+
"claude.logHandleFailed": "{type} \uCC98\uB9AC \uC2E4\uD328: {message}",
|
|
830
|
+
"claude.newSessionTitle": "\uC0C8 \uC138\uC158",
|
|
831
|
+
"claude.helpText": "\uC9C0\uC6D0 \uBA85\uB839:\n- /new \uC0C8 \uC138\uC158\n- /help \uB3C4\uC6C0\uB9D0 \uBCF4\uAE30",
|
|
832
|
+
"claude.logPromptFailed": "session.prompt \uC2E4\uD328: {message}",
|
|
833
|
+
"claude.logAbortSent": "\uC911\uC9C0 \uC804\uC1A1\uB428 (session={session})",
|
|
834
|
+
"claude.logAbortFailed": "\uC911\uC9C0 \uC2E4\uD328 (session={session}): {message}",
|
|
835
|
+
"claude.errBadWorkspaceEmpty": "\uC791\uC5C5 \uC601\uC5ED \uACBD\uB85C\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4",
|
|
836
|
+
"claude.errBadWorkspaceNotDir": "\uB514\uB809\uD130\uB9AC\uAC00 \uC5C6\uAC70\uB098 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",
|
|
837
|
+
"claude.logWorkspaceSwitched": "\uC791\uC5C5 \uC601\uC5ED \uC804\uD658: {path}",
|
|
838
|
+
"claude.logUnknownQuestionReply": "\uC77C\uCE58\uD558\uC9C0 \uC54A\uB294 \uAD6C\uC870\uD654 \uC9C8\uBB38 \uC751\uB2F5 (id={id})",
|
|
839
|
+
"claude.logFlushedQuestions": "\uB300\uAE30 \uC911 \uC9C8\uBB38 {count}\uAC1C \uCDE8\uC18C: {reason}",
|
|
840
|
+
"claude.logFlushedApprovals": "\uB300\uAE30 \uC911 \uC694\uCCAD {count}\uAC1C \uAC70\uBD80: {reason}",
|
|
841
|
+
"claude.logPendingResent": "session.pending: {session}\uC758 \uB300\uAE30 \uD56D\uBAA9 {count}\uAC1C \uC7AC\uC804\uC1A1",
|
|
842
|
+
"claude.logSetModeFailed": "setPermissionMode \uC2E4\uD328 (session={session}): {message}",
|
|
843
|
+
"claude.errWorkspaceMissing": "\uC791\uC5C5 \uC601\uC5ED\uC774 \uC5C6\uC2B5\uB2C8\uB2E4: {dir}",
|
|
844
|
+
"claude.logSessionError": "\uC138\uC158 \uC624\uB958 (session={session}): {message}",
|
|
845
|
+
"claude.logOfflineDenyTool": "\uB9B4\uB808\uC774 \uC624\uD504\uB77C\uC778, \uB3C4\uAD6C {tool} \uC790\uB3D9 \uAC70\uBD80",
|
|
846
|
+
"claude.errOfflineDeny": "\uB9B4\uB808\uC774 \uC624\uD504\uB77C\uC778, \uC790\uB3D9 \uAC70\uBD80(fail-closed)",
|
|
847
|
+
"claude.logAuqDisabled": "AskUserQuestion \uBE44\uD65C\uC131\uD654\uB428(TUNNELBOX_CLAUDE_ASK_USER_QUESTION=0), \uC790\uB3D9 \uAC70\uBD80",
|
|
848
|
+
"claude.errAuqDisabled": "AskUserQuestion\uC774 \uD65C\uC131\uD654\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4",
|
|
849
|
+
"claude.logAuqParseFailed": "AskUserQuestion \uC785\uB825 \uAD6C\uBB38 \uBD84\uC11D \uC2E4\uD328, \uC790\uB3D9 \uAC70\uBD80(fail-closed)",
|
|
850
|
+
"claude.errAuqParse": "\uC9C8\uBB38\uC744 \uAD6C\uBB38 \uBD84\uC11D\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",
|
|
851
|
+
"claude.logAuqSkipped": "AskUserQuestion \uBB34\uC751\uB2F5/\uCDE8\uC18C\uB428 (session={session})",
|
|
852
|
+
"claude.errAuqCancelled": "\uC0AC\uC6A9\uC790\uAC00 \uC120\uD0DD\uD558\uC9C0 \uC54A\uC74C(\uCDE8\uC18C\uB428)",
|
|
853
|
+
"claude.logAuqDone": "AskUserQuestion \uB2F5\uBCC0 \uC644\uB8CC (session={session})",
|
|
854
|
+
"claude.promptRunTool": "Claude Code\uAC00 {tool} \uC2E4\uD589\uC744 \uC694\uCCAD",
|
|
855
|
+
"claude.errApprovalTimeout": "\uC2B9\uC778 \uC2DC\uAC04 \uCD08\uACFC, \uC790\uB3D9 \uAC70\uBD80(fail-closed)",
|
|
856
|
+
"claude.errUserDenied": "\uC0AC\uC6A9\uC790\uAC00 \uAC70\uBD80",
|
|
857
|
+
"claude.errAborted": "\uC694\uCCAD\uC774 \uC911\uB2E8\uB418\uC5C8\uC2B5\uB2C8\uB2E4",
|
|
858
|
+
"claude.logPermToPhone": "\uAD8C\uD55C \uC694\uCCAD(tool={tool}) \u2192 \uD734\uB300\uD3F0\uC73C\uB85C \uC804\uC1A1 permissionID={id}",
|
|
859
|
+
"claude.errRelayUnreachable": "\uB9B4\uB808\uC774\uC5D0 \uC5F0\uACB0\uD560 \uC218 \uC5C6\uC74C, \uC790\uB3D9 \uAC70\uBD80(fail-closed)",
|
|
860
|
+
"claude.logQuestionOffline": "\uB9B4\uB808\uC774 \uC624\uD504\uB77C\uC778, \uAD6C\uC870\uD654 \uC9C8\uBB38 \uC790\uB3D9 \uCDE8\uC18C",
|
|
861
|
+
"claude.logQuestionToPhone": "\uAD6C\uC870\uD654 \uC9C8\uBB38({count}\uAC1C) \u2192 \uD734\uB300\uD3F0\uC73C\uB85C \uC804\uC1A1 questionID={id}",
|
|
862
|
+
"claude.logDialogOffline": "\uB9B4\uB808\uC774 \uC624\uD504\uB77C\uC778, \uB300\uD654 \uC0C1\uC790 \uC790\uB3D9 \uCDE8\uC18C({tool})",
|
|
863
|
+
"claude.logDialogToPhone": "\uB300\uD654 \uC0C1\uC790 \uC694\uCCAD(kind={kind} tool={tool}) \u2192 \uD734\uB300\uD3F0\uC73C\uB85C \uC804\uC1A1 permissionID={id}",
|
|
864
|
+
"claude.logAuqDialogParse": "AskUserQuestion \uD398\uC774\uB85C\uB4DC \uAD6C\uBB38 \uBD84\uC11D \uC2E4\uD328, \uAE30\uBCF8 \uB3D9\uC791 \uC720\uC9C0(session={session})",
|
|
865
|
+
"claude.logDialogUnmapped": "request_user_dialog(kind={kind}) \uB9E4\uD551 \uC5C6\uC74C, \uAE30\uBCF8 \uB3D9\uC791 \uC720\uC9C0(session={session})",
|
|
866
|
+
"claude.promptMcpAuth": 'MCP "{server}" \uC778\uC99D \uC694\uCCAD',
|
|
867
|
+
"claude.logElicitUnmapped": "MCP elicitation(server={server}, mode={mode}) \uBBF8\uCC98\uB9AC, \uC790\uB3D9 \uAC70\uBD80(session={session})",
|
|
868
|
+
"claude.logResetIdentity": "\uACC4\uC815 \uC5F0\uACB0\uC774 \uD574\uC81C\uB418\uC5C8\uC2B5\uB2C8\uB2E4. ID\uB97C \uC7AC\uC124\uC815\uD558\uACE0 \uC0C8 \uD398\uC5B4\uB9C1 \uCF54\uB4DC\uB97C \uC0DD\uC131\uD558\uB294 \uC911\u2026",
|
|
869
|
+
"claude.dialogConfirm": "Claude Code\uAC00 \uD655\uC778\uC744 \uC694\uCCAD({kind})",
|
|
870
|
+
"claude.resultTruncated": "\u2026(\uACB0\uACFC\uAC00 \uB108\uBB34 \uAE38\uC5B4 \uC798\uB9BC)",
|
|
871
|
+
"claude.streamError": "claude \uC2A4\uD2B8\uB9AC\uBC0D \uC624\uB958",
|
|
872
|
+
"claude.errListSessions": "Claude \uC138\uC158 \uBAA9\uB85D\uC744 \uC77D\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4",
|
|
873
|
+
"claude.errReadHistory": "\uC138\uC158 \uAE30\uB85D\uC744 \uC77D\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4({id})",
|
|
874
|
+
"setup.langSet": "\uC2E4\uD589 \uC5B8\uC5B4\uB97C \uC124\uC815\uD588\uC2B5\uB2C8\uB2E4",
|
|
875
|
+
"setup.langHint": "\uB2E4\uC2DC \uC2DC\uC791\uD558\uBA74 \uC774 \uC5B8\uC5B4\uB85C \uCD9C\uB825\uB429\uB2C8\uB2E4(\uC2E4\uD589 \uC2DC TUNNELBOX_LANG\uC73C\uB85C \uC7AC\uC815\uC758 \uAC00\uB2A5). \uC0C1\uD0DC \uD30C\uC77C:",
|
|
876
|
+
"setup.langCurrent": "\uD604\uC7AC \uC2E4\uD589 \uC5B8\uC5B4",
|
|
877
|
+
"hermes.errNoRelay": "\uB9B4\uB808\uC774 URL\uC774 \uC124\uC815\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4: --env\uB85C \uAE30\uBCF8\uAC12\uC744 \uC8FC\uC785\uD558\uAC70\uB098 \uC2E4\uD589 \uC2DC TUNNELBOX_RELAY_URL\uB85C \uC7AC\uC815\uC758\uD558\uC138\uC694",
|
|
878
|
+
"hermes.logConnected": "\uB9B4\uB808\uC774\uC5D0 \uC5F0\uACB0\uB428 {url}",
|
|
879
|
+
"hermes.logMsgUncaught": "\uBA54\uC2DC\uC9C0 \uCC98\uB9AC \uC911 \uCC98\uB9AC\uB418\uC9C0 \uC54A\uC740 \uC608\uC678: {message}",
|
|
880
|
+
"hermes.logDisconnected": "\uB9B4\uB808\uC774\uC640 \uC5F0\uACB0 \uB04A\uAE40, \uC790\uB3D9 \uC7AC\uC5F0\uACB0 \uC911\u2026",
|
|
881
|
+
"hermes.logPairCode": "\uD398\uC5B4\uB9C1 \uCF54\uB4DC \uC0DD\uC131: {code}",
|
|
882
|
+
"hermes.logUnhandledType": "\uCC98\uB9AC\uB418\uC9C0 \uC54A\uC740 \uBA54\uC2DC\uC9C0 \uC720\uD615: {type}",
|
|
883
|
+
"hermes.logHandleFailed": "{type} \uCC98\uB9AC \uC2E4\uD328: {message}",
|
|
884
|
+
"hermes.logClaimed": "\uD734\uB300\uD3F0 \uACC4\uC815\uC5D0 \uBC14\uC778\uB529\uB428. \uC774\uC81C \uD734\uB300\uD3F0\uC758 '\uB0B4 \uCEF4\uD4E8\uD130'\uC5D0\uC11C \uC9C1\uC811 \uC5F0\uACB0\uD569\uB2C8\uB2E4",
|
|
885
|
+
"hermes.logResetIdentity": "\uACC4\uC815\uC5D0\uC11C \uBC14\uC778\uB529 \uD574\uC81C\uB428, ID \uC7AC\uC124\uC815 \uBC0F \uC0C8 \uD398\uC5B4\uB9C1 \uCF54\uB4DC \uC0DD\uC131 \uC911\u2026",
|
|
886
|
+
"hermes.cmdNew": "\uC0C8 \uC138\uC158",
|
|
887
|
+
"hermes.cmdHelp": "\uB3C4\uC6C0\uB9D0 \uD45C\uC2DC",
|
|
888
|
+
"hermes.newSessionTitle": "\uC0C8 \uC138\uC158",
|
|
889
|
+
"hermes.helpText": "\uC9C0\uC6D0 \uBA85\uB839:\n- /new \uC0C8 \uC138\uC158\n- /help \uB3C4\uC6C0\uB9D0 \uD45C\uC2DC",
|
|
890
|
+
"hermes.errBusy": "\uC774 \uC138\uC158\uC774 \uC0DD\uC131 \uC911\uC785\uB2C8\uB2E4. \uC644\uB8CC\uB97C \uAE30\uB2E4\uB9AC\uAC70\uB098 \uBA3C\uC800 \uC911\uC9C0\uD558\uC138\uC694",
|
|
891
|
+
"hermes.errBadWorkspace": "\uC774 \uB514\uB809\uD1A0\uB9AC\uB294 \uC874\uC7AC\uD558\uC9C0 \uC54A\uAC70\uB098 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",
|
|
892
|
+
"hermes.logWorkspaceSwitched": "\uC791\uC5C5\uACF5\uAC04 \uC804\uD658: {path}",
|
|
893
|
+
"hermes.errWorkspaceMissing": "\uC791\uC5C5\uACF5\uAC04\uC774 \uC5C6\uC2B5\uB2C8\uB2E4: {dir}",
|
|
894
|
+
"hermes.errStartFailed": "\uC2DC\uC791 \uC2E4\uD328: {message}",
|
|
895
|
+
"hermes.msgStarted": "Hermes \uC5B4\uB311\uD130 \uC2DC\uC791\uB428 (Ctrl+C\uB85C \uC885\uB8CC)",
|
|
896
|
+
"hermes.logAbortSent": "\uC911\uC9C0 \uC804\uC1A1\uB428 (session={session})",
|
|
897
|
+
"hermes.logPromptFailed": "session.prompt \uC2E4\uD328: {message}",
|
|
898
|
+
"hermes.logTurnError": "\uD134 \uC624\uB958 (session={session}): {message}",
|
|
899
|
+
"hermes.logPairForced": "--pair: \uD398\uC5B4\uB9C1 \uCF54\uB4DC \uAC15\uC81C \uC694\uCCAD (\uC774\uBC88\uC5D0\uB9CC)",
|
|
900
|
+
"hermes.pairingStillClaimed": "\uD734\uB300\uD3F0 \uACC4\uC815\uC5D0 \uC774\uBBF8 \uBC14\uC778\uB529\uB428: \uC774 \uCF54\uB4DC\uB294 \uAC19\uC740 \uACC4\uC815\uC758 \uC0C8 \uAE30\uAE30 \uC7AC\uD398\uC5B4\uB9C1\uC6A9\uC785\uB2C8\uB2E4. \uD604\uC7AC \uAE30\uAE30\uB294 \uD734\uB300\uD3F0\uC758 '\uB0B4 \uCEF4\uD4E8\uD130'\uC5D0\uC11C \uC9C1\uC811 \uC5F0\uACB0\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4",
|
|
901
|
+
"hermes.logPairNoRelay": "\uB9B4\uB808\uC774 URL\uC774 \uC124\uC815\uB418\uC9C0 \uC54A\uC544 \uD398\uC5B4\uB9C1 \uCF54\uB4DC\uB97C \uC694\uCCAD\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",
|
|
902
|
+
"hermes.errSpawnHermes": "Hermes({bin})\uB97C \uC2DC\uC791\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: \uC124\uCE58 \uC5EC\uBD80\uB97C \uD655\uC778\uD558\uC138\uC694 ({err})",
|
|
903
|
+
"hermes.errHermesExit": "hermes \uC885\uB8CC({code}): {err}",
|
|
904
|
+
"hermes.logSessionUpdated": "\uC138\uC158 \uC5C5\uB370\uC774\uD2B8\uB428 (session={session})",
|
|
905
|
+
"hermes.errNoInject": "\uD734\uB300\uD3F0 \uBA54\uC2DC\uC9C0 \uC8FC\uC785\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4(\uBE44\uB300\uD654\uD615 \uC138\uC158 \uB610\uB294 \uD504\uB85C\uC138\uC2A4 \uBBF8\uC900\uBE44)",
|
|
906
|
+
"hermes.pairNoRelay": "\uB9B4\uB808\uC774\uC5D0 \uC5F0\uACB0\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4(\uB9B4\uB808\uC774 \uB3C4\uB2EC \uBD88\uAC00 \uB610\uB294 websockets \uB204\uB77D)",
|
|
907
|
+
"hermes.pairTimeout": "\uD398\uC5B4\uB9C1 \uCF54\uB4DC \uC694\uCCAD \uC2DC\uAC04 \uCD08\uACFC(\uB9B4\uB808\uC774 \uBBF8\uC751\uB2F5)",
|
|
908
|
+
"hermes.errToolPair": "tunnelbox_pair \uC2E4\uD328: {err}",
|
|
909
|
+
"hermes.errToolStatus": "tunnelbox_status \uC2E4\uD328: {err}",
|
|
910
|
+
"hermes.cliUsage": "\uC0AC\uC6A9\uBC95: /tunnelbox <pair|status>\n pair \uD734\uB300\uD3F0 \uD398\uC5B4\uB9C1 \uCF54\uB4DC \uC694\uCCAD/\uCD9C\uB825\n status \uB9B4\uB808\uC774/\uBC14\uC778\uB529/\uC5F0\uACB0 \uC0C1\uD0DC \uD45C\uC2DC"
|
|
911
|
+
};
|
|
912
|
+
|
|
913
|
+
// locales/fr-FR.json
|
|
914
|
+
var fr_FR_default = {
|
|
915
|
+
"agent.err.createSession": "\xC9chec de la cr\xE9ation de la session",
|
|
916
|
+
"agent.err.httpClient": "Impossible d'acc\xE9der au client HTTP d'opencode",
|
|
917
|
+
"agent.err.unknownPerm": "Demande d'autorisation inconnue : {id}",
|
|
918
|
+
"agent.err.unknownQuestion": "Demande de question inconnue : {id}",
|
|
919
|
+
"agent.log.fallback404": "Le point d'acc\xE8s pr\xE9f\xE9r\xE9 a renvoy\xE9 404, bascule sur l'autre : {message}",
|
|
920
|
+
"agent.log.gotPermReply": "R\xE9ponse d'autorisation re\xE7ue du t\xE9l\xE9phone (id={id} {reply} {version})",
|
|
921
|
+
"agent.log.gotQuestionReply": "R\xE9ponse de question re\xE7ue du t\xE9l\xE9phone (id={id} {status} {version})",
|
|
922
|
+
"agent.log.handleFailed": "\xC9chec du traitement de {type} : {message}",
|
|
923
|
+
"agent.log.httpOk": "opencode HTTP {status} {path}",
|
|
924
|
+
"agent.log.pendingResent": "session.pending : renvoi de {count} demande(s) en attente pour {session}",
|
|
925
|
+
"agent.log.unhandledType": "Type de message non g\xE9r\xE9 : {type}",
|
|
926
|
+
"events.log.fwdPermission": "Demande d'autorisation transmise au t\xE9l\xE9phone (id={id} tool={tool} {version})",
|
|
927
|
+
"events.log.permissionReplied": "opencode a accus\xE9 permission.replied (id={id} {response})",
|
|
928
|
+
"events.log.questionRejected": "opencode a accus\xE9 question.rejected (id={id})",
|
|
929
|
+
"events.log.questionReplied": "opencode a accus\xE9 question.replied (id={id})",
|
|
930
|
+
"index.error.connectRelay": "Impossible de se connecter au relais ; v\xE9rifiez son adresse et r\xE9essayez",
|
|
931
|
+
"index.error.pairTimeout": "D\xE9lai d'attente du code d'appairage d\xE9pass\xE9 (le relais ne r\xE9pond pas)",
|
|
932
|
+
"index.log.claimed": "Li\xE9 \xE0 votre compte t\xE9l\xE9phone. Le t\xE9l\xE9phone se connecte d\xE9sormais directement depuis \xAB Mes PC \xBB ; plus besoin de scanner",
|
|
933
|
+
"index.log.connectedRelay": "Connect\xE9 au relais {url}",
|
|
934
|
+
"index.log.disconnected": "D\xE9connect\xE9 du relais, reconnexion automatique\u2026",
|
|
935
|
+
"index.log.exit": "Arr\xEAt\xE9",
|
|
936
|
+
"index.log.pairCode": "Code d'appairage g\xE9n\xE9r\xE9 : {code}",
|
|
937
|
+
"index.log.pairingStillClaimed": "Ce code d'appairage sert uniquement \xE0 r\xE9-appairer un nouveau t\xE9l\xE9phone du m\xEAme compte ; cet ordinateur est d\xE9j\xE0 li\xE9 et reste accessible depuis \xAB Mes ordinateurs \xBB sur votre t\xE9l\xE9phone.",
|
|
938
|
+
"index.log.pairingPreparing": "Connexion au relais et g\xE9n\xE9ration du code d'appairage\u2026",
|
|
939
|
+
"index.log.permissionToPhone": "Demande d'autorisation \u2192 approbation sur t\xE9l\xE9phone (id={id} tool={tool})",
|
|
940
|
+
"index.log.permissionTuiFallback": "App hors ligne ; la demande est g\xE9r\xE9e par le TUI opencode (id={id} tool={tool})",
|
|
941
|
+
"index.log.relayError": "Erreur du relais : {msg}",
|
|
942
|
+
"index.log.resetIdentity": "D\xE9li\xE9 du compte ; r\xE9initialisation de l'identit\xE9 et g\xE9n\xE9ration d'un nouveau code d'appairage\u2026",
|
|
943
|
+
"index.log.unknown": "Inconnu",
|
|
944
|
+
"install.codeLine": "Code d'appairage : {code}",
|
|
945
|
+
"install.commandInstalled": "Commande install\xE9e : {path}",
|
|
946
|
+
"install.done": "Termin\xE9. Tentative de connexion au relais pour afficher les informations d'appairage :",
|
|
947
|
+
"install.failConnect": "(Impossible de se connecter au relais pour afficher l'appairage \u2014 relais injoignable ou version de Node trop ancienne.",
|
|
948
|
+
"install.failConnectHint": "Apr\xE8s le red\xE9marrage d'opencode, consultez le QR code du terminal avec --print-logs, ou tapez \u201Cafficher le code d'appairage\u201D / /pair dans opencode.)",
|
|
949
|
+
"install.hintFresh": "Remarque : le code d'appairage est \xE0 usage unique et valide environ 10 minutes. Si vous d\xE9marrez opencode plus tard, utilisez les informations imprim\xE9es au d\xE9marrage ou obtenues via /pair.",
|
|
950
|
+
"install.pluginInstalled": "Plugin install\xE9 : {path}",
|
|
951
|
+
"install.qrUnavailable": "(Rendu du QR indisponible \u2014 utilisez le code ci-dessus)",
|
|
952
|
+
"install.qrcodeEnsure": "Installation de qrcode dans le r\xE9pertoire de configuration d'opencode\u2026",
|
|
953
|
+
"install.qrcodeFail": "\xC9chec de l'installation de qrcode (sans cons\xE9quence \u2014 seul le code d'appairage est affich\xE9) : {err}",
|
|
954
|
+
"install.relayError": "Le relais a renvoy\xE9 une erreur : {msg}",
|
|
955
|
+
"install.scanHint": "Ouvrez tunnelbox sur votre t\xE9l\xE9phone, touchez \u201CScanner pour appairer\u201D, puis scannez le QR ci-dessus pour connecter :",
|
|
956
|
+
"pair.heading": "Appairage t\xE9l\xE9phone tunnelbox",
|
|
957
|
+
"pair.howTo": "Ouvrez l'application tunnelbox sur votre t\xE9l\xE9phone, scannez le QR ci-dessus avec \u201CScanner pour appairer\u201D, ou saisissez le code d'appairage manuellement.",
|
|
958
|
+
"pair.oneTime": "Le code d'appairage est \xE0 usage unique et expire apr\xE8s utilisation ; demandez \xE0 \u201Craffra\xEEchir le code d'appairage\u201D pour en obtenir un nouveau.",
|
|
959
|
+
"pair.promptBody": "Veuillez afficher les informations d'appairage t\xE9l\xE9phone de cet ordinateur : le code d'appairage et un QR code scannable. Gardez le QR code dans un bloc de code \xE0 largeur fixe et reproduisez-le caract\xE8re par caract\xE8re pour que mon t\xE9l\xE9phone puisse le scanner.",
|
|
960
|
+
"pair.promptDescription": "Afficher le code d'appairage et le QR code scannable",
|
|
961
|
+
"pair.scanIntro": "**Appairer par scan** : ouvrez l'application tunnelbox sur votre t\xE9l\xE9phone, touchez \u201CScanner pour appairer\u201D, puis scannez le QR ci-dessous pour vous connecter automatiquement.",
|
|
962
|
+
"perm.promptAuthorize": "opencode demande une autorisation",
|
|
963
|
+
"perm.promptPatterns": "opencode demande l'acc\xE8s \xE0 : {list}",
|
|
964
|
+
"perm.promptResource": "opencode demande l'acc\xE8s aux ressources : {list}",
|
|
965
|
+
"perm.promptTool": "opencode demande d'ex\xE9cuter {tool}",
|
|
966
|
+
"qr.codeLabel": "Code d'appairage",
|
|
967
|
+
"qr.fileWritten": "Informations d'appairage \xE9crites dans : {path}",
|
|
968
|
+
"qr.openHint": "Ouvrez l'application tunnelbox sur votre t\xE9l\xE9phone et scannez le QR ci-dessus, ou saisissez le code d'appairage manuellement dans l'application.",
|
|
969
|
+
"qr.titleNoType": "appairage t\xE9l\xE9phone tunnelbox",
|
|
970
|
+
"qr.titleWithType": "appairage t\xE9l\xE9phone tunnelbox {type}",
|
|
971
|
+
"qr.unavailable": "(qrcode non install\xE9 \u2014 utilisez le code d'appairage ci-dessus)",
|
|
972
|
+
"claude.errBusy": "Cette session est en cours d'ex\xE9cution ; attendez la fin ou arr\xEAtez-la d'abord",
|
|
973
|
+
"claude.errTurn": "erreur de g\xE9n\xE9ration",
|
|
974
|
+
"claude.pairingStillClaimed": "D\xE9j\xE0 li\xE9 \xE0 un compte t\xE9l\xE9phone : ce code sert uniquement \xE0 appairer un nouvel appareil sur le m\xEAme compte ; l'appareil actuel se connecte directement depuis Mes ordinateurs",
|
|
975
|
+
"claude.pairForced": "--pair : demande forc\xE9e d'un code d'appairage (cette ex\xE9cution uniquement)",
|
|
976
|
+
"claude.pairUnclaimed": "Aucun compte li\xE9 d\xE9tect\xE9 ; lancement du guide d'appairage :",
|
|
977
|
+
"claude.claimedHint": "Li\xE9 \xE0 un compte t\xE9l\xE9phone : connectez-vous directement depuis Mes ordinateurs sur le t\xE9l\xE9phone",
|
|
978
|
+
"claude.errStartFailed": "\xC9chec du d\xE9marrage :",
|
|
979
|
+
"claude.msgStarted": "Adaptateur Claude Code d\xE9marr\xE9 (Ctrl+C pour quitter)",
|
|
980
|
+
"claude.warnInvalidMode": "TUNNELBOX_CLAUDE_MODE invalide ignor\xE9 : {raw} (autoris\xE9 {list})",
|
|
981
|
+
"claude.warnInvalidThinking": "TUNNELBOX_CLAUDE_THINKING invalide ignor\xE9 : {raw} (off|adaptive|enabled[:budget])",
|
|
982
|
+
"claude.cmdNew": "Nouvelle session",
|
|
983
|
+
"claude.cmdHelp": "Afficher l'aide",
|
|
984
|
+
"claude.errNoRelay": "Aucune URL de relais configur\xE9e : injectez une valeur par d\xE9faut avec --env, ou remplacez-la via TUNNELBOX_RELAY_URL",
|
|
985
|
+
"claude.logConnected": "Connect\xE9 au relais {url}",
|
|
986
|
+
"claude.logMsgUncaught": "Exception non intercept\xE9e lors du traitement du message : {message}",
|
|
987
|
+
"claude.reasonDisconnect": "Relais d\xE9connect\xE9 (rejet automatique fail-closed)",
|
|
988
|
+
"claude.reasonUnbind": "Compte dissoci\xE9 (rejet automatique fail-closed)",
|
|
989
|
+
"claude.logDisconnected": "D\xE9connect\xE9 du relais, reconnexion automatique\u2026",
|
|
990
|
+
"claude.logPairCode": "Code d'appairage g\xE9n\xE9r\xE9 : {code}",
|
|
991
|
+
"claude.logUnhandledType": "Type de message non g\xE9r\xE9 : {type}",
|
|
992
|
+
"claude.logHandleFailed": "\xC9chec du traitement de {type} : {message}",
|
|
993
|
+
"claude.newSessionTitle": "Nouvelle session",
|
|
994
|
+
"claude.helpText": "Commandes prises en charge :\n- /new nouvelle session\n- /help afficher l'aide",
|
|
995
|
+
"claude.logPromptFailed": "\xC9chec de session.prompt : {message}",
|
|
996
|
+
"claude.logAbortSent": "Interruption envoy\xE9e (session={session})",
|
|
997
|
+
"claude.logAbortFailed": "\xC9chec de l'interruption (session={session}) : {message}",
|
|
998
|
+
"claude.errBadWorkspaceEmpty": "Chemin de l'espace de travail manquant",
|
|
999
|
+
"claude.errBadWorkspaceNotDir": "Le r\xE9pertoire n'existe pas ou est inutilisable",
|
|
1000
|
+
"claude.logWorkspaceSwitched": "Espace de travail chang\xE9 : {path}",
|
|
1001
|
+
"claude.logUnknownQuestionReply": "R\xE9ponse de question structur\xE9e sans correspondance (id={id})",
|
|
1002
|
+
"claude.logFlushedQuestions": "{count} question(s) en attente annul\xE9e(s) : {reason}",
|
|
1003
|
+
"claude.logFlushedApprovals": "{count} demande(s) en attente rejet\xE9e(s) : {reason}",
|
|
1004
|
+
"claude.logPendingResent": "session.pending : {count} \xE9l\xE9ment(s) en attente renvoy\xE9(s) pour {session}",
|
|
1005
|
+
"claude.logSetModeFailed": "\xC9chec de setPermissionMode (session={session}) : {message}",
|
|
1006
|
+
"claude.errWorkspaceMissing": "L'espace de travail n'existe pas : {dir}",
|
|
1007
|
+
"claude.logSessionError": "Erreur de session (session={session}) : {message}",
|
|
1008
|
+
"claude.logOfflineDenyTool": "Relais hors ligne, rejet automatique de l'outil {tool}",
|
|
1009
|
+
"claude.errOfflineDeny": "Relais hors ligne, rejet automatique (fail-closed)",
|
|
1010
|
+
"claude.logAuqDisabled": "AskUserQuestion d\xE9sactiv\xE9 (TUNNELBOX_CLAUDE_ASK_USER_QUESTION=0), rejet automatique",
|
|
1011
|
+
"claude.errAuqDisabled": "AskUserQuestion n'est pas activ\xE9",
|
|
1012
|
+
"claude.logAuqParseFailed": "\xC9chec de l'analyse de l'entr\xE9e AskUserQuestion, rejet automatique (fail-closed)",
|
|
1013
|
+
"claude.errAuqParse": "Impossible d'analyser les questions",
|
|
1014
|
+
"claude.logAuqSkipped": "AskUserQuestion sans r\xE9ponse/annul\xE9e (session={session})",
|
|
1015
|
+
"claude.errAuqCancelled": "L'utilisateur n'a pas fait de choix (annul\xE9)",
|
|
1016
|
+
"claude.logAuqDone": "AskUserQuestion r\xE9pondue (session={session})",
|
|
1017
|
+
"claude.promptRunTool": "Claude Code demande \xE0 ex\xE9cuter {tool}",
|
|
1018
|
+
"claude.errApprovalTimeout": "Approbation expir\xE9e, rejet automatique (fail-closed)",
|
|
1019
|
+
"claude.errUserDenied": "Rejet\xE9 par l'utilisateur",
|
|
1020
|
+
"claude.errAborted": "Requ\xEAte interrompue",
|
|
1021
|
+
"claude.logPermToPhone": "Demande d'autorisation (tool={tool}) \u2192 envoy\xE9e au t\xE9l\xE9phone permissionID={id}",
|
|
1022
|
+
"claude.errRelayUnreachable": "Relais injoignable, rejet automatique (fail-closed)",
|
|
1023
|
+
"claude.logQuestionOffline": "Relais hors ligne, question structur\xE9e annul\xE9e automatiquement",
|
|
1024
|
+
"claude.logQuestionToPhone": "Question structur\xE9e ({count} \xE9l\xE9ment(s)) \u2192 envoy\xE9e au t\xE9l\xE9phone questionID={id}",
|
|
1025
|
+
"claude.logDialogOffline": "Relais hors ligne, dialogue annul\xE9 automatiquement ({tool})",
|
|
1026
|
+
"claude.logDialogToPhone": "Demande de dialogue (kind={kind} tool={tool}) \u2192 envoy\xE9e au t\xE9l\xE9phone permissionID={id}",
|
|
1027
|
+
"claude.logAuqDialogParse": "\xC9chec de l'analyse du payload AskUserQuestion, comportement par d\xE9faut conserv\xE9 (session={session})",
|
|
1028
|
+
"claude.logDialogUnmapped": "request_user_dialog(kind={kind}) sans correspondance, comportement par d\xE9faut conserv\xE9 (session={session})",
|
|
1029
|
+
"claude.promptMcpAuth": "MCP \xAB {server} \xBB demande une autorisation",
|
|
1030
|
+
"claude.logElicitUnmapped": "\xC9licitation MCP (server={server}, mode={mode}) non trait\xE9e, rejet automatique (session={session})",
|
|
1031
|
+
"claude.logResetIdentity": "Compte dissoci\xE9 ; r\xE9initialisation de l'identit\xE9 et g\xE9n\xE9ration d'un nouveau code d'appairage\u2026",
|
|
1032
|
+
"claude.dialogConfirm": "Claude Code demande une confirmation ({kind})",
|
|
1033
|
+
"claude.resultTruncated": "\u2026 (r\xE9sultat tronqu\xE9)",
|
|
1034
|
+
"claude.streamError": "erreur de streaming claude",
|
|
1035
|
+
"claude.errListSessions": "\xC9chec de la lecture de la liste des sessions Claude",
|
|
1036
|
+
"claude.errReadHistory": "\xC9chec de la lecture de l'historique de session ({id})",
|
|
1037
|
+
"setup.langSet": "Langue d'ex\xE9cution d\xE9finie sur",
|
|
1038
|
+
"setup.langHint": "L'adaptateur utilisera cette langue au prochain d\xE9marrage (TUNNELBOX_LANG peut la remplacer). Fichier d'\xE9tat :",
|
|
1039
|
+
"setup.langCurrent": "Langue d'ex\xE9cution actuelle",
|
|
1040
|
+
"hermes.errNoRelay": "URL du relais non configur\xE9e : utilisez --env pour injecter une valeur par d\xE9faut, ou remplacez \xE0 l'ex\xE9cution avec TUNNELBOX_RELAY_URL",
|
|
1041
|
+
"hermes.logConnected": "Connect\xE9 au relais {url}",
|
|
1042
|
+
"hermes.logMsgUncaught": "Exception non intercept\xE9e lors du traitement du message : {message}",
|
|
1043
|
+
"hermes.logDisconnected": "D\xE9connect\xE9 du relais, reconnexion automatique\u2026",
|
|
1044
|
+
"hermes.logPairCode": "Code d'appairage g\xE9n\xE9r\xE9 : {code}",
|
|
1045
|
+
"hermes.logUnhandledType": "Type de message non trait\xE9 : {type}",
|
|
1046
|
+
"hermes.logHandleFailed": "\xC9chec du traitement de {type} : {message}",
|
|
1047
|
+
"hermes.logClaimed": "Li\xE9 \xE0 votre compte t\xE9l\xE9phone. Le t\xE9l\xE9phone se connecte d\xE9sormais directement depuis Mes ordinateurs",
|
|
1048
|
+
"hermes.logResetIdentity": "Dissoci\xE9 du compte ; r\xE9initialisation de l'identit\xE9 et g\xE9n\xE9ration d'un nouveau code d'appairage\u2026",
|
|
1049
|
+
"hermes.cmdNew": "Nouvelle session",
|
|
1050
|
+
"hermes.cmdHelp": "Afficher l'aide",
|
|
1051
|
+
"hermes.newSessionTitle": "Nouvelle session",
|
|
1052
|
+
"hermes.helpText": "Commandes prises en charge :\n- /new nouvelle session\n- /help afficher l'aide",
|
|
1053
|
+
"hermes.errBusy": "Cette session est en cours de g\xE9n\xE9ration ; attendez la fin ou arr\xEAtez-la d'abord",
|
|
1054
|
+
"hermes.errBadWorkspace": "Ce r\xE9pertoire n'existe pas ou est inutilisable",
|
|
1055
|
+
"hermes.logWorkspaceSwitched": "Espace de travail chang\xE9 : {path}",
|
|
1056
|
+
"hermes.errWorkspaceMissing": "L'espace de travail n'existe pas : {dir}",
|
|
1057
|
+
"hermes.errStartFailed": "\xC9chec du d\xE9marrage : {message}",
|
|
1058
|
+
"hermes.msgStarted": "Adaptateur Hermes d\xE9marr\xE9 (Ctrl+C pour quitter)",
|
|
1059
|
+
"hermes.logAbortSent": "Interruption envoy\xE9e (session={session})",
|
|
1060
|
+
"hermes.logPromptFailed": "session.prompt a \xE9chou\xE9 : {message}",
|
|
1061
|
+
"hermes.logTurnError": "Erreur de tour (session={session}) : {message}",
|
|
1062
|
+
"hermes.logPairForced": "--pair : demande forc\xE9e du code d'appairage (cet ex\xE9cution uniquement)",
|
|
1063
|
+
"hermes.pairingStillClaimed": "D\xE9j\xE0 li\xE9 \xE0 un compte t\xE9l\xE9phone : ce code ne sert qu'\xE0 r\xE9appairer un nouvel appareil sur le m\xEAme compte ; l'appareil actuel se connecte directement depuis Mes ordinateurs",
|
|
1064
|
+
"hermes.logPairNoRelay": "Impossible de demander un code d'appairage : URL du relais non configur\xE9e",
|
|
1065
|
+
"hermes.errSpawnHermes": "Impossible de d\xE9marrer Hermes ({bin}) : v\xE9rifiez qu'il est install\xE9 ({err})",
|
|
1066
|
+
"hermes.errHermesExit": "hermes a quitt\xE9 ({code}) : {err}",
|
|
1067
|
+
"hermes.logSessionUpdated": "Session mise \xE0 jour (session={session})",
|
|
1068
|
+
"hermes.errNoInject": "Injection du message t\xE9l\xE9phone indisponible (session non interactive ou processus non pr\xEAt)",
|
|
1069
|
+
"hermes.pairNoRelay": "Impossible de joindre le relais (relais injoignable ou websockets manquant)",
|
|
1070
|
+
"hermes.pairTimeout": "D\xE9lai d\xE9pass\xE9 pour le code d'appairage (relais sans r\xE9ponse)",
|
|
1071
|
+
"hermes.errToolPair": "\xE9chec de tunnelbox_pair : {err}",
|
|
1072
|
+
"hermes.errToolStatus": "\xE9chec de tunnelbox_status : {err}",
|
|
1073
|
+
"hermes.cliUsage": "Utilisation : /tunnelbox <pair|status>\n pair demander et afficher un code d'appairage\n status afficher l'\xE9tat relais/liaison/connexion"
|
|
1074
|
+
};
|
|
1075
|
+
|
|
1076
|
+
// locales/de-DE.json
|
|
1077
|
+
var de_DE_default = {
|
|
1078
|
+
"agent.err.createSession": "Sitzung konnte nicht erstellt werden",
|
|
1079
|
+
"agent.err.httpClient": "Auf den opencode-HTTP-Client kann nicht zugegriffen werden",
|
|
1080
|
+
"agent.err.unknownPerm": "Unbekannte Berechtigungsanfrage: {id}",
|
|
1081
|
+
"agent.err.unknownQuestion": "Unbekannte Frageanfrage: {id}",
|
|
1082
|
+
"agent.log.fallback404": "Bevorzugter Endpunkt lieferte 404, Fallback auf den anderen: {message}",
|
|
1083
|
+
"agent.log.gotPermReply": "Berechtigungsantwort vom Telefon erhalten (id={id} {reply} {version})",
|
|
1084
|
+
"agent.log.gotQuestionReply": "Frageantwort vom Telefon erhalten (id={id} {status} {version})",
|
|
1085
|
+
"agent.log.handleFailed": "Fehler beim Verarbeiten von {type}: {message}",
|
|
1086
|
+
"agent.log.httpOk": "opencode HTTP {status} {path}",
|
|
1087
|
+
"agent.log.pendingResent": "session.pending: {count} ausstehende Anfrage(n) f\xFCr {session} erneut gesendet",
|
|
1088
|
+
"agent.log.unhandledType": "Nicht behandelter Nachrichtentyp: {type}",
|
|
1089
|
+
"events.log.fwdPermission": "Berechtigungsanfrage an Telefon weitergeleitet (id={id} tool={tool} {version})",
|
|
1090
|
+
"events.log.permissionReplied": "opencode quittierte permission.replied (id={id} {response})",
|
|
1091
|
+
"events.log.questionRejected": "opencode quittierte question.rejected (id={id})",
|
|
1092
|
+
"events.log.questionReplied": "opencode quittierte question.replied (id={id})",
|
|
1093
|
+
"index.error.connectRelay": "Verbindung zum Relay nicht m\xF6glich; pr\xFCfen Sie die Relay-Adresse und versuchen Sie es erneut",
|
|
1094
|
+
"index.error.pairTimeout": "Zeit\xFCberschreitung beim Warten auf einen Pairing-Code (Relay antwortet nicht)",
|
|
1095
|
+
"index.log.claimed": "An Ihr Telefonkonto gebunden. Das Telefon verbindet sich nun direkt \xFCber \u201CMeine PCs\u201D; kein erneutes Scannen n\xF6tig",
|
|
1096
|
+
"index.log.connectedRelay": "Mit Relay verbunden {url}",
|
|
1097
|
+
"index.log.disconnected": "Vom Relay getrennt, verbinde automatisch neu\u2026",
|
|
1098
|
+
"index.log.exit": "Beendet",
|
|
1099
|
+
"index.log.pairCode": "Pairing-Code erzeugt: {code}",
|
|
1100
|
+
"index.log.pairingStillClaimed": "Dieser Pairing-Code dient nur zum erneuten Pairing eines neuen Telefons im selben Konto. Dieser Computer ist bereits verkn\xFCpft und bleibt \xFCber \u201EMeine Computer\u201C auf Ihrem Telefon erreichbar.",
|
|
1101
|
+
"index.log.pairingPreparing": "Verbindung zum Relay wird hergestellt und Pairing-Code generiert\u2026",
|
|
1102
|
+
"index.log.permissionToPhone": "Berechtigungsanfrage \u2192 Genehmigung am Telefon (id={id} tool={tool})",
|
|
1103
|
+
"index.log.permissionTuiFallback": "App offline; Berechtigungsanfrage wird vom opencode-TUI \xFCbernommen (id={id} tool={tool})",
|
|
1104
|
+
"index.log.relayError": "Relay-Fehler: {msg}",
|
|
1105
|
+
"index.log.resetIdentity": "Vom Konto gel\xF6st; Identit\xE4t wird zur\xFCckgesetzt und ein neuer Pairing-Code erzeugt\u2026",
|
|
1106
|
+
"index.log.unknown": "Unbekannt",
|
|
1107
|
+
"install.codeLine": "Pairing-Code: {code}",
|
|
1108
|
+
"install.commandInstalled": "Befehl installiert: {path}",
|
|
1109
|
+
"install.done": "Fertig. Versuche, eine Verbindung zum Relay herzustellen und Pairing-Informationen auszugeben:",
|
|
1110
|
+
"install.failConnect": "(Keine sofortige Verbindung zum Relay zum Drucken der Pairing-Informationen m\xF6glich \u2014 Relay nicht erreichbar oder Node zu alt.",
|
|
1111
|
+
"install.failConnectHint": "Nach dem Neustart von opencode den Terminal-QR-Code mit --print-logs anzeigen oder im opencode \u201CTelefon-Pairing-Code anzeigen\u201D bzw. /pair eingeben.)",
|
|
1112
|
+
"install.hintFresh": "Hinweis: Der Pairing-Code ist einmalig und etwa 10 Minuten g\xFCltig. Wenn Sie opencode sp\xE4ter starten, nutzen Sie die beim Start gedruckten oder per /pair abgerufenen aktuellen Informationen.",
|
|
1113
|
+
"install.pluginInstalled": "Plugin installiert: {path}",
|
|
1114
|
+
"install.qrUnavailable": "(QR-Darstellung nicht verf\xFCgbar \u2014 nutzen Sie den Code oben)",
|
|
1115
|
+
"install.qrcodeEnsure": "Installiere qrcode in das opencode-Konfigurationsverzeichnis\u2026",
|
|
1116
|
+
"install.qrcodeFail": "qrcode-Installation fehlgeschlagen (nicht kritisch \u2014 nur der Pairing-Code wird angezeigt): {err}",
|
|
1117
|
+
"install.relayError": "Relay hat einen Fehler zur\xFCckgegeben: {msg}",
|
|
1118
|
+
"install.scanHint": "\xD6ffnen Sie tunnelbox auf dem Telefon, tippen Sie auf \u201CZum Pairing scannen\u201D und scannen Sie den QR-Code oben zum Verbinden:",
|
|
1119
|
+
"pair.heading": "tunnelbox Telefon-Pairing",
|
|
1120
|
+
"pair.howTo": "\xD6ffnen Sie die tunnelbox-App auf dem Telefon und scannen Sie den QR-Code oben mit \u201CZum Pairing scannen\u201D, oder geben Sie den Pairing-Code manuell ein.",
|
|
1121
|
+
"pair.oneTime": "Der Pairing-Code ist einmalig und verf\xE4llt nach der Nutzung; f\xFCr einen neuen Code \u201CPairing-Code aktualisieren\u201D anfordern.",
|
|
1122
|
+
"pair.promptBody": "Zeigen Sie bitte die Telefon-Pairing-Informationen dieses Computers an: den Pairing-Code und einen scannbaren QR-Code. Behalten Sie den QR-Code in einem Codeblock mit fester Breite und geben Sie ihn zeichengenau wieder, damit mein Telefon ihn scannen kann.",
|
|
1123
|
+
"pair.promptDescription": "Pairing-Code und scannbaren QR-Code anzeigen",
|
|
1124
|
+
"pair.scanIntro": "**Per Scan pairen**: \xD6ffnen Sie die tunnelbox-App auf dem Telefon, tippen Sie auf \u201CZum Pairing scannen\u201D und scannen Sie den QR-Code unten, um sich automatisch zu verbinden.",
|
|
1125
|
+
"perm.promptAuthorize": "opencode fordert eine Genehmigung an",
|
|
1126
|
+
"perm.promptPatterns": "opencode fordert Zugriff auf: {list}",
|
|
1127
|
+
"perm.promptResource": "opencode fordert Zugriff auf Ressourcen: {list}",
|
|
1128
|
+
"perm.promptTool": "opencode fordert die Ausf\xFChrung von {tool} an",
|
|
1129
|
+
"qr.codeLabel": "Pairing-Code",
|
|
1130
|
+
"qr.fileWritten": "Pairing-Informationen geschrieben in: {path}",
|
|
1131
|
+
"qr.openHint": "\xD6ffnen Sie die tunnelbox-App auf dem Telefon und scannen Sie den QR-Code oben, oder geben Sie den Pairing-Code manuell in der App ein.",
|
|
1132
|
+
"qr.titleNoType": "tunnelbox Telefon-Pairing",
|
|
1133
|
+
"qr.titleWithType": "tunnelbox {type} Telefon-Pairing",
|
|
1134
|
+
"qr.unavailable": "(qrcode nicht installiert \u2014 nutzen Sie den Pairing-Code oben)",
|
|
1135
|
+
"claude.errBusy": "Diese Sitzung l\xE4uft noch; warten Sie auf das Ende oder stoppen Sie sie zuerst",
|
|
1136
|
+
"claude.errTurn": "Generierungsfehler",
|
|
1137
|
+
"claude.pairingStillClaimed": "Bereits an ein Telefonkonto gebunden: Dieser Code dient nur zum Koppeln eines neuen Ger\xE4ts auf demselben Konto; das aktuelle Ger\xE4t verbindet sich direkt \xFCber \u201EMeine Computer\u201C",
|
|
1138
|
+
"claude.pairForced": "--pair: Pairing-Code erzwungen (nur dieser Lauf)",
|
|
1139
|
+
"claude.pairUnclaimed": "Kein gebundenes Konto erkannt; Start der Pairing-Anleitung:",
|
|
1140
|
+
"claude.claimedHint": "An ein Telefonkonto gebunden: direkt \xFCber \u201EMeine Computer\u201C auf dem Telefon verbinden",
|
|
1141
|
+
"claude.errStartFailed": "Start fehlgeschlagen:",
|
|
1142
|
+
"claude.msgStarted": "Claude-Code-Adapter gestartet (Strg+C zum Beenden)",
|
|
1143
|
+
"claude.warnInvalidMode": "Ung\xFCltiges TUNNELBOX_CLAUDE_MODE ignoriert: {raw} (erlaubt {list})",
|
|
1144
|
+
"claude.warnInvalidThinking": "Ung\xFCltiges TUNNELBOX_CLAUDE_THINKING ignoriert: {raw} (off|adaptive|enabled[:budget])",
|
|
1145
|
+
"claude.cmdNew": "Neue Sitzung",
|
|
1146
|
+
"claude.cmdHelp": "Hilfe anzeigen",
|
|
1147
|
+
"claude.errNoRelay": "Keine Relay-URL konfiguriert: Standard mit --env injizieren oder zur Laufzeit per TUNNELBOX_RELAY_URL \xFCberschreiben",
|
|
1148
|
+
"claude.logConnected": "Mit Relay {url} verbunden",
|
|
1149
|
+
"claude.logMsgUncaught": "Unbehandelte Ausnahme bei der Nachrichtenverarbeitung: {message}",
|
|
1150
|
+
"claude.reasonDisconnect": "Relay getrennt (fail-closed automatische Ablehnung)",
|
|
1151
|
+
"claude.reasonUnbind": "Konto entbunden (fail-closed automatische Ablehnung)",
|
|
1152
|
+
"claude.logDisconnected": "Vom Relay getrennt, verbinde automatisch neu\u2026",
|
|
1153
|
+
"claude.logPairCode": "Pairing-Code generiert: {code}",
|
|
1154
|
+
"claude.logUnhandledType": "Unbehandelter Nachrichtentyp: {type}",
|
|
1155
|
+
"claude.logHandleFailed": "{type} konnte nicht verarbeitet werden: {message}",
|
|
1156
|
+
"claude.newSessionTitle": "Neue Sitzung",
|
|
1157
|
+
"claude.helpText": "Unterst\xFCtzte Befehle:\n- /new neue Sitzung\n- /help Hilfe anzeigen",
|
|
1158
|
+
"claude.logPromptFailed": "session.prompt fehlgeschlagen: {message}",
|
|
1159
|
+
"claude.logAbortSent": "Abbruch gesendet (session={session})",
|
|
1160
|
+
"claude.logAbortFailed": "Abbruch fehlgeschlagen (session={session}): {message}",
|
|
1161
|
+
"claude.errBadWorkspaceEmpty": "Pfad zum Arbeitsbereich fehlt",
|
|
1162
|
+
"claude.errBadWorkspaceNotDir": "Verzeichnis existiert nicht oder ist unbrauchbar",
|
|
1163
|
+
"claude.logWorkspaceSwitched": "Arbeitsbereich gewechselt: {path}",
|
|
1164
|
+
"claude.logUnknownQuestionReply": "Keine \xDCbereinstimmung f\xFCr strukturierte Frage-Antwort (id={id})",
|
|
1165
|
+
"claude.logFlushedQuestions": "{count} ausstehende Frage(n) abgebrochen: {reason}",
|
|
1166
|
+
"claude.logFlushedApprovals": "{count} ausstehende Anfrage(n) abgelehnt: {reason}",
|
|
1167
|
+
"claude.logPendingResent": "session.pending: {count} ausstehende(r) Eintrag/Eintr\xE4ge f\xFCr {session} erneut gesendet",
|
|
1168
|
+
"claude.logSetModeFailed": "setPermissionMode fehlgeschlagen (session={session}): {message}",
|
|
1169
|
+
"claude.errWorkspaceMissing": "Arbeitsbereich existiert nicht: {dir}",
|
|
1170
|
+
"claude.logSessionError": "Sitzungsfehler (session={session}): {message}",
|
|
1171
|
+
"claude.logOfflineDenyTool": "Relay offline, Tool {tool} automatisch abgelehnt",
|
|
1172
|
+
"claude.errOfflineDeny": "Relay offline, automatisch abgelehnt (fail-closed)",
|
|
1173
|
+
"claude.logAuqDisabled": "AskUserQuestion deaktiviert (TUNNELBOX_CLAUDE_ASK_USER_QUESTION=0), automatisch abgelehnt",
|
|
1174
|
+
"claude.errAuqDisabled": "AskUserQuestion ist nicht aktiviert",
|
|
1175
|
+
"claude.logAuqParseFailed": "AskUserQuestion-Eingabe konnte nicht geparst werden, automatisch abgelehnt (fail-closed)",
|
|
1176
|
+
"claude.errAuqParse": "Fragen konnten nicht geparst werden",
|
|
1177
|
+
"claude.logAuqSkipped": "AskUserQuestion unbeantwortet/abgebrochen (session={session})",
|
|
1178
|
+
"claude.errAuqCancelled": "Keine Auswahl durch Benutzer (abgebrochen)",
|
|
1179
|
+
"claude.logAuqDone": "AskUserQuestion beantwortet (session={session})",
|
|
1180
|
+
"claude.promptRunTool": "Claude Code fordert Ausf\xFChrung von {tool}",
|
|
1181
|
+
"claude.errApprovalTimeout": "Genehmigung abgelaufen, automatisch abgelehnt (fail-closed)",
|
|
1182
|
+
"claude.errUserDenied": "Vom Benutzer abgelehnt",
|
|
1183
|
+
"claude.errAborted": "Anfrage abgebrochen",
|
|
1184
|
+
"claude.logPermToPhone": "Berechtigungsanfrage (tool={tool}) \u2192 an Telefon gesendet permissionID={id}",
|
|
1185
|
+
"claude.errRelayUnreachable": "Relay nicht erreichbar, automatisch abgelehnt (fail-closed)",
|
|
1186
|
+
"claude.logQuestionOffline": "Relay offline, strukturierte Frage automatisch abgebrochen",
|
|
1187
|
+
"claude.logQuestionToPhone": "Strukturierte Frage ({count}) \u2192 an Telefon gesendet questionID={id}",
|
|
1188
|
+
"claude.logDialogOffline": "Relay offline, Dialog automatisch abgebrochen ({tool})",
|
|
1189
|
+
"claude.logDialogToPhone": "Dialoganfrage (kind={kind} tool={tool}) \u2192 an Telefon gesendet permissionID={id}",
|
|
1190
|
+
"claude.logAuqDialogParse": "AskUserQuestion-Payload konnte nicht geparst werden, Standardverhalten beibehalten (session={session})",
|
|
1191
|
+
"claude.logDialogUnmapped": "request_user_dialog(kind={kind}) ohne Zuordnung, Standardverhalten beibehalten (session={session})",
|
|
1192
|
+
"claude.promptMcpAuth": "MCP \u201E{server}\u201C fordert Autorisierung",
|
|
1193
|
+
"claude.logElicitUnmapped": "MCP-Elicitation (server={server}, mode={mode}) nicht behandelt, automatisch abgelehnt (session={session})",
|
|
1194
|
+
"claude.logResetIdentity": "Konto entbunden; Identit\xE4t wird zur\xFCckgesetzt und ein neuer Pairing-Code erzeugt\u2026",
|
|
1195
|
+
"claude.dialogConfirm": "Claude Code fordert Best\xE4tigung an ({kind})",
|
|
1196
|
+
"claude.resultTruncated": "\u2026 (Ergebnis gek\xFCrzt)",
|
|
1197
|
+
"claude.streamError": "claude-Streaming-Fehler",
|
|
1198
|
+
"claude.errListSessions": "Claude-Sitzungsliste konnte nicht gelesen werden",
|
|
1199
|
+
"claude.errReadHistory": "Sitzungsverlauf konnte nicht gelesen werden ({id})",
|
|
1200
|
+
"setup.langSet": "Laufzeitsprache gesetzt auf",
|
|
1201
|
+
"setup.langHint": "Der Adapter gibt nach dem Neustart in dieser Sprache aus (TUNNELBOX_LANG kann zur Laufzeit \xFCberschreiben). Statusdatei:",
|
|
1202
|
+
"setup.langCurrent": "Aktuelle Laufzeitsprache",
|
|
1203
|
+
"hermes.errNoRelay": "Keine Relay-URL konfiguriert: mit --env einen Standardwert einf\xFCgen oder zur Laufzeit mit TUNNELBOX_RELAY_URL \xFCberschreiben",
|
|
1204
|
+
"hermes.logConnected": "Mit Relay verbunden {url}",
|
|
1205
|
+
"hermes.logMsgUncaught": "Nicht abgefangene Ausnahme bei der Nachrichtenverarbeitung: {message}",
|
|
1206
|
+
"hermes.logDisconnected": "Vom Relay getrennt, automatische Neuverbindung\u2026",
|
|
1207
|
+
"hermes.logPairCode": "Pairing-Code generiert: {code}",
|
|
1208
|
+
"hermes.logUnhandledType": "Nicht behandelter Nachrichtentyp: {type}",
|
|
1209
|
+
"hermes.logHandleFailed": "Fehler beim Verarbeiten von {type}: {message}",
|
|
1210
|
+
"hermes.logClaimed": "An Ihr Telefonkonto gebunden. Das Telefon verbindet sich k\xFCnftig direkt \xFCber Meine Computer",
|
|
1211
|
+
"hermes.logResetIdentity": "Vom Konto entbunden; Identit\xE4t wird zur\xFCckgesetzt und ein neuer Pairing-Code generiert\u2026",
|
|
1212
|
+
"hermes.cmdNew": "Neue Sitzung",
|
|
1213
|
+
"hermes.cmdHelp": "Hilfe anzeigen",
|
|
1214
|
+
"hermes.newSessionTitle": "Neue Sitzung",
|
|
1215
|
+
"hermes.helpText": "Unterst\xFCtzte Befehle:\n- /new neue Sitzung\n- /help Hilfe anzeigen",
|
|
1216
|
+
"hermes.errBusy": "Diese Sitzung wird gerade generiert; warten Sie auf den Abschluss oder stoppen Sie sie zuerst",
|
|
1217
|
+
"hermes.errBadWorkspace": "Dieses Verzeichnis existiert nicht oder ist unbrauchbar",
|
|
1218
|
+
"hermes.logWorkspaceSwitched": "Arbeitsbereich gewechselt: {path}",
|
|
1219
|
+
"hermes.errWorkspaceMissing": "Arbeitsbereich existiert nicht: {dir}",
|
|
1220
|
+
"hermes.errStartFailed": "Start fehlgeschlagen: {message}",
|
|
1221
|
+
"hermes.msgStarted": "Hermes-Adapter gestartet (Strg+C zum Beenden)",
|
|
1222
|
+
"hermes.logAbortSent": "Abbruch gesendet (session={session})",
|
|
1223
|
+
"hermes.logPromptFailed": "session.prompt fehlgeschlagen: {message}",
|
|
1224
|
+
"hermes.logTurnError": "Fehler bei Runde (session={session}): {message}",
|
|
1225
|
+
"hermes.logPairForced": "--pair: Pairing-Code erzwungen (nur dieser Lauf)",
|
|
1226
|
+
"hermes.pairingStillClaimed": "Bereits an ein Telefonkonto gebunden: Dieser Code dient nur zum erneuten Pairing eines neuen Ger\xE4ts desselben Kontos; das aktuelle Ger\xE4t verbindet sich direkt \xFCber Meine Computer",
|
|
1227
|
+
"hermes.logPairNoRelay": "Kein Pairing-Code anforderbar: keine Relay-URL konfiguriert",
|
|
1228
|
+
"hermes.errSpawnHermes": "Hermes ({bin}) kann nicht gestartet werden: bitte Installation pr\xFCfen ({err})",
|
|
1229
|
+
"hermes.errHermesExit": "hermes beendet ({code}): {err}",
|
|
1230
|
+
"hermes.logSessionUpdated": "Sitzung aktualisiert (session={session})",
|
|
1231
|
+
"hermes.errNoInject": "Telefon-Nachrichteneinspeisung nicht verf\xFCgbar (Sitzung nicht interaktiv oder Prozess nicht bereit)",
|
|
1232
|
+
"hermes.pairNoRelay": "Relay nicht erreichbar (Relay nicht erreichbar oder websockets fehlt)",
|
|
1233
|
+
"hermes.pairTimeout": "Zeit\xFCberschreitung bei der Pairing-Code-Anfrage (Relay antwortete nicht)",
|
|
1234
|
+
"hermes.errToolPair": "tunnelbox_pair fehlgeschlagen: {err}",
|
|
1235
|
+
"hermes.errToolStatus": "tunnelbox_status fehlgeschlagen: {err}",
|
|
1236
|
+
"hermes.cliUsage": "Verwendung: /tunnelbox <pair|status>\n pair Pairing-Code anfordern und anzeigen\n status Relay/Bindung/Verbindung anzeigen"
|
|
1237
|
+
};
|
|
1238
|
+
|
|
1239
|
+
// locales/es-ES.json
|
|
1240
|
+
var es_ES_default = {
|
|
1241
|
+
"agent.err.createSession": "No se pudo crear la sesi\xF3n",
|
|
1242
|
+
"agent.err.httpClient": "No se puede acceder al cliente HTTP de opencode",
|
|
1243
|
+
"agent.err.unknownPerm": "Solicitud de permiso desconocida: {id}",
|
|
1244
|
+
"agent.err.unknownQuestion": "Solicitud de pregunta desconocida: {id}",
|
|
1245
|
+
"agent.log.fallback404": "El punto de acceso preferido devolvi\xF3 404; se recurre al otro: {message}",
|
|
1246
|
+
"agent.log.gotPermReply": "Respuesta de permiso recibida del tel\xE9fono (id={id} {reply} {version})",
|
|
1247
|
+
"agent.log.gotQuestionReply": "Respuesta de pregunta recibida del tel\xE9fono (id={id} {status} {version})",
|
|
1248
|
+
"agent.log.handleFailed": "Error al procesar {type}: {message}",
|
|
1249
|
+
"agent.log.httpOk": "opencode HTTP {status} {path}",
|
|
1250
|
+
"agent.log.pendingResent": "session.pending: reenviadas {count} solicitud(es) pendientes para {session}",
|
|
1251
|
+
"agent.log.unhandledType": "Tipo de mensaje no gestionado: {type}",
|
|
1252
|
+
"events.log.fwdPermission": "Solicitud de permiso reenviada al tel\xE9fono (id={id} tool={tool} {version})",
|
|
1253
|
+
"events.log.permissionReplied": "opencode confirm\xF3 permission.replied (id={id} {response})",
|
|
1254
|
+
"events.log.questionRejected": "opencode confirm\xF3 question.rejected (id={id})",
|
|
1255
|
+
"events.log.questionReplied": "opencode confirm\xF3 question.replied (id={id})",
|
|
1256
|
+
"index.error.connectRelay": "No se pudo conectar con el relay; compruebe su direcci\xF3n e int\xE9ntelo de nuevo",
|
|
1257
|
+
"index.error.pairTimeout": "Tiempo de espera agotado al obtener el c\xF3digo de emparejamiento (el relay no responde)",
|
|
1258
|
+
"index.log.claimed": "Vinculado a su cuenta de tel\xE9fono. El tel\xE9fono se conecta ahora directamente desde \xABMis PC\xBB; no hace falta volver a escanear",
|
|
1259
|
+
"index.log.connectedRelay": "Conectado al relay {url}",
|
|
1260
|
+
"index.log.disconnected": "Desconectado del relay, reconectando autom\xE1ticamente\u2026",
|
|
1261
|
+
"index.log.exit": "Salido",
|
|
1262
|
+
"index.log.pairCode": "C\xF3digo de emparejamiento generado: {code}",
|
|
1263
|
+
"index.log.pairingStillClaimed": "Este c\xF3digo de emparejamiento es solo para volver a emparejar un tel\xE9fono nuevo con la misma cuenta; este equipo ya est\xE1 vinculado y sigue accesible desde \xABMis computadoras\xBB en el tel\xE9fono.",
|
|
1264
|
+
"index.log.pairingPreparing": "Conectando al relay y generando el c\xF3digo de emparejamiento\u2026",
|
|
1265
|
+
"index.log.permissionToPhone": "Solicitud de permiso \u2192 aprobaci\xF3n en el tel\xE9fono (id={id} tool={tool})",
|
|
1266
|
+
"index.log.permissionTuiFallback": "App sin conexi\xF3n; la solicitud la gestiona el TUI de opencode (id={id} tool={tool})",
|
|
1267
|
+
"index.log.relayError": "Error del relay: {msg}",
|
|
1268
|
+
"index.log.resetIdentity": "Desvinculado de la cuenta; se restablece la identidad y se genera un nuevo c\xF3digo de emparejamiento\u2026",
|
|
1269
|
+
"index.log.unknown": "Desconocido",
|
|
1270
|
+
"install.codeLine": "C\xF3digo de emparejamiento: {code}",
|
|
1271
|
+
"install.commandInstalled": "Comando instalado: {path}",
|
|
1272
|
+
"install.done": "Hecho. Se intent\xF3 conectar con el relay para mostrar la informaci\xF3n de emparejamiento:",
|
|
1273
|
+
"install.failConnect": "(No se pudo conectar de inmediato con el relay para imprimir el emparejamiento \u2014 relay inaccesible o versi\xF3n de Node demasiado antigua.",
|
|
1274
|
+
"install.failConnectHint": "Tras reiniciar opencode, consulte el c\xF3digo QR del terminal con --print-logs, o escriba \u201Cmostrar c\xF3digo de emparejamiento del tel\xE9fono\u201D o /pair en opencode.)",
|
|
1275
|
+
"install.hintFresh": "Nota: el c\xF3digo de emparejamiento es de un solo uso y v\xE1lido durante unos 10 minutos. Si inicia opencode m\xE1s tarde, use la informaci\xF3n m\xE1s reciente impresa al iniciar u obtenida con /pair.",
|
|
1276
|
+
"install.pluginInstalled": "Complemento instalado: {path}",
|
|
1277
|
+
"install.qrUnavailable": "(Representaci\xF3n del QR no disponible: use el c\xF3digo anterior)",
|
|
1278
|
+
"install.qrcodeEnsure": "Instalando qrcode en el directorio de configuraci\xF3n de opencode\u2026",
|
|
1279
|
+
"install.qrcodeFail": "Error al instalar qrcode (no es cr\xEDtico; solo se muestra el c\xF3digo de emparejamiento): {err}",
|
|
1280
|
+
"install.relayError": "El relay devolvi\xF3 un error: {msg}",
|
|
1281
|
+
"install.scanHint": "Abra tunnelbox en el tel\xE9fono, pulse \u201CEscanear para emparejar\u201D y escanee el c\xF3digo QR superior para conectar:",
|
|
1282
|
+
"pair.heading": "Emparejamiento de tel\xE9fono tunnelbox",
|
|
1283
|
+
"pair.howTo": "Abra la aplicaci\xF3n tunnelbox en el tel\xE9fono y escanee el c\xF3digo QR superior con \u201CEscanear para emparejar\u201D, o introduzca el c\xF3digo de emparejamiento manualmente.",
|
|
1284
|
+
"pair.oneTime": "El c\xF3digo de emparejamiento es de un solo uso y caduca al utilizarse; pida \u201Cactualizar el c\xF3digo de emparejamiento\u201D para obtener uno nuevo.",
|
|
1285
|
+
"pair.promptBody": "Mu\xE9strame la informaci\xF3n de emparejamiento con el tel\xE9fono de este ordenador: el c\xF3digo de emparejamiento y un c\xF3digo QR escaneable. Mant\xE9n el c\xF3digo QR dentro de un bloque de c\xF3digo de ancho fijo y reprod\xFAcelo car\xE1cter por car\xE1cter para que mi tel\xE9fono pueda escanearlo.",
|
|
1286
|
+
"pair.promptDescription": "Mostrar el c\xF3digo de emparejamiento y el QR escaneable",
|
|
1287
|
+
"pair.scanIntro": "**Emparejar escaneando**: abra la aplicaci\xF3n tunnelbox en el tel\xE9fono, pulse \u201CEscanear para emparejar\u201D y escanee el c\xF3digo QR inferior para conectar autom\xE1ticamente.",
|
|
1288
|
+
"perm.promptAuthorize": "opencode solicita autorizaci\xF3n",
|
|
1289
|
+
"perm.promptPatterns": "opencode solicita acceso a: {list}",
|
|
1290
|
+
"perm.promptResource": "opencode solicita acceso a los recursos: {list}",
|
|
1291
|
+
"perm.promptTool": "opencode solicita ejecutar {tool}",
|
|
1292
|
+
"qr.codeLabel": "C\xF3digo de emparejamiento",
|
|
1293
|
+
"qr.fileWritten": "Informaci\xF3n de emparejamiento escrita en: {path}",
|
|
1294
|
+
"qr.openHint": "Abra la aplicaci\xF3n tunnelbox en el tel\xE9fono y escanee el c\xF3digo QR superior, o introduzca el c\xF3digo de emparejamiento manualmente en la aplicaci\xF3n.",
|
|
1295
|
+
"qr.titleNoType": "emparejamiento de tel\xE9fono tunnelbox",
|
|
1296
|
+
"qr.titleWithType": "emparejamiento de tel\xE9fono tunnelbox {type}",
|
|
1297
|
+
"qr.unavailable": "(qrcode no instalado: use el c\xF3digo de emparejamiento anterior)",
|
|
1298
|
+
"claude.errBusy": "Esta sesi\xF3n est\xE1 en ejecuci\xF3n; espere a que termine o det\xE9ngala primero",
|
|
1299
|
+
"claude.errTurn": "error de generaci\xF3n",
|
|
1300
|
+
"claude.pairingStillClaimed": "Ya vinculado a una cuenta de tel\xE9fono: este c\xF3digo solo sirve para emparejar un nuevo dispositivo en la misma cuenta; el dispositivo actual se conecta directamente desde Mis computadoras",
|
|
1301
|
+
"claude.pairForced": "--pair: solicitud forzada de c\xF3digo de emparejamiento (solo esta ejecuci\xF3n)",
|
|
1302
|
+
"claude.pairUnclaimed": "No se detect\xF3 una cuenta vinculada; iniciando la gu\xEDa de emparejamiento:",
|
|
1303
|
+
"claude.claimedHint": "Vinculado a una cuenta de tel\xE9fono: con\xE9ctese directamente desde Mis computadoras en el tel\xE9fono",
|
|
1304
|
+
"claude.errStartFailed": "Error al iniciar:",
|
|
1305
|
+
"claude.msgStarted": "Adaptador de Claude Code iniciado (Ctrl+C para salir)",
|
|
1306
|
+
"claude.warnInvalidMode": "Se ignora TUNNELBOX_CLAUDE_MODE no v\xE1lido: {raw} (permitido {list})",
|
|
1307
|
+
"claude.warnInvalidThinking": "Se ignora TUNNELBOX_CLAUDE_THINKING no v\xE1lido: {raw} (off|adaptive|enabled[:budget])",
|
|
1308
|
+
"claude.cmdNew": "Nueva sesi\xF3n",
|
|
1309
|
+
"claude.cmdHelp": "Mostrar ayuda",
|
|
1310
|
+
"claude.errNoRelay": "No hay URL de relay configurada: inyecte un valor con --env o sobrescr\xEDbalo con TUNNELBOX_RELAY_URL",
|
|
1311
|
+
"claude.logConnected": "Conectado al relay {url}",
|
|
1312
|
+
"claude.logMsgUncaught": "Excepci\xF3n no capturada al procesar el mensaje: {message}",
|
|
1313
|
+
"claude.reasonDisconnect": "Relay desconectado (rechazo autom\xE1tico fail-closed)",
|
|
1314
|
+
"claude.reasonUnbind": "Cuenta desvinculada (rechazo autom\xE1tico fail-closed)",
|
|
1315
|
+
"claude.logDisconnected": "Desconectado del relay, reconectando autom\xE1ticamente\u2026",
|
|
1316
|
+
"claude.logPairCode": "C\xF3digo de emparejamiento generado: {code}",
|
|
1317
|
+
"claude.logUnhandledType": "Tipo de mensaje no manejado: {type}",
|
|
1318
|
+
"claude.logHandleFailed": "No se pudo procesar {type}: {message}",
|
|
1319
|
+
"claude.newSessionTitle": "Nueva sesi\xF3n",
|
|
1320
|
+
"claude.helpText": "Comandos compatibles:\n- /new nueva sesi\xF3n\n- /help mostrar ayuda",
|
|
1321
|
+
"claude.logPromptFailed": "session.prompt fall\xF3: {message}",
|
|
1322
|
+
"claude.logAbortSent": "Se envi\xF3 la interrupci\xF3n (session={session})",
|
|
1323
|
+
"claude.logAbortFailed": "Error al interrumpir (session={session}): {message}",
|
|
1324
|
+
"claude.errBadWorkspaceEmpty": "Falta la ruta del espacio de trabajo",
|
|
1325
|
+
"claude.errBadWorkspaceNotDir": "El directorio no existe o no se puede usar",
|
|
1326
|
+
"claude.logWorkspaceSwitched": "Espacio de trabajo cambiado: {path}",
|
|
1327
|
+
"claude.logUnknownQuestionReply": "Respuesta de pregunta estructurada sin coincidencia (id={id})",
|
|
1328
|
+
"claude.logFlushedQuestions": "{count} pregunta(s) pendiente(s) cancelada(s): {reason}",
|
|
1329
|
+
"claude.logFlushedApprovals": "{count} solicitud(es) pendiente(s) rechazada(s): {reason}",
|
|
1330
|
+
"claude.logPendingResent": "session.pending: se reenviaron {count} elemento(s) pendiente(s) de {session}",
|
|
1331
|
+
"claude.logSetModeFailed": "setPermissionMode fall\xF3 (session={session}): {message}",
|
|
1332
|
+
"claude.errWorkspaceMissing": "El espacio de trabajo no existe: {dir}",
|
|
1333
|
+
"claude.logSessionError": "Error de sesi\xF3n (session={session}): {message}",
|
|
1334
|
+
"claude.logOfflineDenyTool": "Relay sin conexi\xF3n, rechazo autom\xE1tico de la herramienta {tool}",
|
|
1335
|
+
"claude.errOfflineDeny": "Relay sin conexi\xF3n, rechazo autom\xE1tico (fail-closed)",
|
|
1336
|
+
"claude.logAuqDisabled": "AskUserQuestion deshabilitado (TUNNELBOX_CLAUDE_ASK_USER_QUESTION=0), rechazo autom\xE1tico",
|
|
1337
|
+
"claude.errAuqDisabled": "AskUserQuestion no est\xE1 habilitado",
|
|
1338
|
+
"claude.logAuqParseFailed": "No se pudo analizar la entrada de AskUserQuestion, rechazo autom\xE1tico (fail-closed)",
|
|
1339
|
+
"claude.errAuqParse": "No se pudieron analizar las preguntas",
|
|
1340
|
+
"claude.logAuqSkipped": "AskUserQuestion sin respuesta/cancelada (session={session})",
|
|
1341
|
+
"claude.errAuqCancelled": "El usuario no seleccion\xF3 (cancelado)",
|
|
1342
|
+
"claude.logAuqDone": "AskUserQuestion respondida (session={session})",
|
|
1343
|
+
"claude.promptRunTool": "Claude Code solicita ejecutar {tool}",
|
|
1344
|
+
"claude.errApprovalTimeout": "Tiempo de aprobaci\xF3n agotado, rechazo autom\xE1tico (fail-closed)",
|
|
1345
|
+
"claude.errUserDenied": "Rechazado por el usuario",
|
|
1346
|
+
"claude.errAborted": "Solicitud interrumpida",
|
|
1347
|
+
"claude.logPermToPhone": "Solicitud de permiso (tool={tool}) \u2192 enviada al tel\xE9fono permissionID={id}",
|
|
1348
|
+
"claude.errRelayUnreachable": "Relay inaccesible, rechazo autom\xE1tico (fail-closed)",
|
|
1349
|
+
"claude.logQuestionOffline": "Relay sin conexi\xF3n, pregunta estructurada cancelada autom\xE1ticamente",
|
|
1350
|
+
"claude.logQuestionToPhone": "Pregunta estructurada ({count}) \u2192 enviada al tel\xE9fono questionID={id}",
|
|
1351
|
+
"claude.logDialogOffline": "Relay sin conexi\xF3n, di\xE1logo cancelado autom\xE1ticamente ({tool})",
|
|
1352
|
+
"claude.logDialogToPhone": "Solicitud de di\xE1logo (kind={kind} tool={tool}) \u2192 enviada al tel\xE9fono permissionID={id}",
|
|
1353
|
+
"claude.logAuqDialogParse": "No se pudo analizar el payload de AskUserQuestion; se mantiene el comportamiento predeterminado (session={session})",
|
|
1354
|
+
"claude.logDialogUnmapped": "request_user_dialog(kind={kind}) sin correspondencia, se mantiene el comportamiento predeterminado (session={session})",
|
|
1355
|
+
"claude.promptMcpAuth": "MCP \xAB{server}\xBB solicita autorizaci\xF3n",
|
|
1356
|
+
"claude.logElicitUnmapped": "Elicitaci\xF3n MCP (server={server}, mode={mode}) no manejada, rechazo autom\xE1tico (session={session})",
|
|
1357
|
+
"claude.logResetIdentity": "Cuenta desvinculada; restableciendo identidad y generando un nuevo c\xF3digo de emparejamiento\u2026",
|
|
1358
|
+
"claude.dialogConfirm": "Claude Code solicita confirmaci\xF3n ({kind})",
|
|
1359
|
+
"claude.resultTruncated": "\u2026 (resultado truncado)",
|
|
1360
|
+
"claude.streamError": "error de streaming de claude",
|
|
1361
|
+
"claude.errListSessions": "No se pudo leer la lista de sesiones de Claude",
|
|
1362
|
+
"claude.errReadHistory": "No se pudo leer el historial de la sesi\xF3n ({id})",
|
|
1363
|
+
"setup.langSet": "Idioma de ejecuci\xF3n establecido en",
|
|
1364
|
+
"setup.langHint": "El adaptador emitir\xE1 en este idioma tras reiniciar (TUNNELBOX_LANG puede sobrescribirlo en tiempo de ejecuci\xF3n). Archivo de estado:",
|
|
1365
|
+
"setup.langCurrent": "Idioma de ejecuci\xF3n actual",
|
|
1366
|
+
"hermes.errNoRelay": "URL del rel\xE9 no configurada: use --env para inyectar un valor predeterminado o sobrescr\xEDbalo en tiempo de ejecuci\xF3n con TUNNELBOX_RELAY_URL",
|
|
1367
|
+
"hermes.logConnected": "Conectado al rel\xE9 {url}",
|
|
1368
|
+
"hermes.logMsgUncaught": "Excepci\xF3n no capturada al procesar el mensaje: {message}",
|
|
1369
|
+
"hermes.logDisconnected": "Desconectado del rel\xE9, reconectando autom\xE1ticamente\u2026",
|
|
1370
|
+
"hermes.logPairCode": "C\xF3digo de emparejamiento generado: {code}",
|
|
1371
|
+
"hermes.logUnhandledType": "Tipo de mensaje no procesado: {type}",
|
|
1372
|
+
"hermes.logHandleFailed": "Error al procesar {type}: {message}",
|
|
1373
|
+
"hermes.logClaimed": "Vinculado a su cuenta de tel\xE9fono. El tel\xE9fono se conecta ahora directamente desde Mis computadoras",
|
|
1374
|
+
"hermes.logResetIdentity": "Desvinculado de la cuenta; restableciendo identidad y generando un nuevo c\xF3digo de emparejamiento\u2026",
|
|
1375
|
+
"hermes.cmdNew": "Nueva sesi\xF3n",
|
|
1376
|
+
"hermes.cmdHelp": "Mostrar ayuda",
|
|
1377
|
+
"hermes.newSessionTitle": "Nueva sesi\xF3n",
|
|
1378
|
+
"hermes.helpText": "Comandos admitidos:\n- /new nueva sesi\xF3n\n- /help mostrar ayuda",
|
|
1379
|
+
"hermes.errBusy": "Esta sesi\xF3n se est\xE1 generando; espere a que termine o det\xE9ngala primero",
|
|
1380
|
+
"hermes.errBadWorkspace": "Este directorio no existe o no se puede usar",
|
|
1381
|
+
"hermes.logWorkspaceSwitched": "Espacio de trabajo cambiado: {path}",
|
|
1382
|
+
"hermes.errWorkspaceMissing": "El espacio de trabajo no existe: {dir}",
|
|
1383
|
+
"hermes.errStartFailed": "Error al iniciar: {message}",
|
|
1384
|
+
"hermes.msgStarted": "Adaptador de Hermes iniciado (Ctrl+C para salir)",
|
|
1385
|
+
"hermes.logAbortSent": "Interrupci\xF3n enviada (session={session})",
|
|
1386
|
+
"hermes.logPromptFailed": "session.prompt fall\xF3: {message}",
|
|
1387
|
+
"hermes.logTurnError": "Error de turno (session={session}): {message}",
|
|
1388
|
+
"hermes.logPairForced": "--pair: solicitud forzada del c\xF3digo de emparejamiento (solo esta ejecuci\xF3n)",
|
|
1389
|
+
"hermes.pairingStillClaimed": "Ya vinculado a una cuenta de tel\xE9fono: este c\xF3digo solo sirve para reemparejar un nuevo dispositivo en la misma cuenta; el dispositivo actual se conecta directamente desde Mis computadoras",
|
|
1390
|
+
"hermes.logPairNoRelay": "No se puede solicitar un c\xF3digo de emparejamiento: no hay URL de rel\xE9 configurada",
|
|
1391
|
+
"hermes.errSpawnHermes": "No se puede iniciar Hermes ({bin}): confirme que est\xE1 instalado ({err})",
|
|
1392
|
+
"hermes.errHermesExit": "hermes sali\xF3 ({code}): {err}",
|
|
1393
|
+
"hermes.logSessionUpdated": "Sesi\xF3n actualizada (session={session})",
|
|
1394
|
+
"hermes.errNoInject": "Inyecci\xF3n de mensaje del tel\xE9fono no disponible (sesi\xF3n no interactiva o proceso no listo)",
|
|
1395
|
+
"hermes.pairNoRelay": "No se puede alcanzar el rel\xE9 (rel\xE9 inaccesible o websockets ausente)",
|
|
1396
|
+
"hermes.pairTimeout": "Tiempo de espera agotado al solicitar el c\xF3digo de emparejamiento (rel\xE9 sin respuesta)",
|
|
1397
|
+
"hermes.errToolPair": "fallo de tunnelbox_pair: {err}",
|
|
1398
|
+
"hermes.errToolStatus": "fallo de tunnelbox_status: {err}",
|
|
1399
|
+
"hermes.cliUsage": "Uso: /tunnelbox <pair|status>\n pair solicitar e imprimir un c\xF3digo de emparejamiento\n status mostrar estado de rel\xE9/enlace/conexi\xF3n"
|
|
1400
|
+
};
|
|
1401
|
+
|
|
1402
|
+
// src/i18n.ts
|
|
1403
|
+
var DEFAULT_LANG = "en-US";
|
|
1404
|
+
var LANG_TAGS = [
|
|
1405
|
+
"zh-CN",
|
|
1406
|
+
"zh-TW",
|
|
1407
|
+
"en-US",
|
|
1408
|
+
"ja-JP",
|
|
1409
|
+
"ko-KR",
|
|
1410
|
+
"fr-FR",
|
|
1411
|
+
"de-DE",
|
|
1412
|
+
"es-ES"
|
|
1413
|
+
];
|
|
1414
|
+
var dicts = {
|
|
1415
|
+
"zh-CN": zh_CN_default,
|
|
1416
|
+
"zh-TW": zh_TW_default,
|
|
1417
|
+
"en-US": en_US_default,
|
|
1418
|
+
"ja-JP": ja_JP_default,
|
|
1419
|
+
"ko-KR": ko_KR_default,
|
|
1420
|
+
"fr-FR": fr_FR_default,
|
|
1421
|
+
"de-DE": de_DE_default,
|
|
1422
|
+
"es-ES": es_ES_default
|
|
1423
|
+
};
|
|
1424
|
+
function normalizeLang(raw) {
|
|
1425
|
+
if (!raw) return DEFAULT_LANG;
|
|
1426
|
+
const s = raw.trim().replace(/_/g, "-").toLowerCase();
|
|
1427
|
+
if (!s) return DEFAULT_LANG;
|
|
1428
|
+
if (s.startsWith("zh")) {
|
|
1429
|
+
if (s.startsWith("zh-tw") || s.includes("hant")) return "zh-TW";
|
|
1430
|
+
return "zh-CN";
|
|
1431
|
+
}
|
|
1432
|
+
const base = s.split("-")[0];
|
|
1433
|
+
const map = {
|
|
1434
|
+
en: "en-US",
|
|
1435
|
+
ja: "ja-JP",
|
|
1436
|
+
ko: "ko-KR",
|
|
1437
|
+
fr: "fr-FR",
|
|
1438
|
+
de: "de-DE",
|
|
1439
|
+
es: "es-ES"
|
|
1440
|
+
};
|
|
1441
|
+
return map[base] ?? DEFAULT_LANG;
|
|
1442
|
+
}
|
|
1443
|
+
function detectSystemLang() {
|
|
1444
|
+
for (const k of ["LC_ALL", "LC_MESSAGES", "LANG"]) {
|
|
1445
|
+
const v = process.env[k];
|
|
1446
|
+
if (v && v.trim()) return v.trim().split(".")[0];
|
|
1447
|
+
}
|
|
1448
|
+
return null;
|
|
1449
|
+
}
|
|
1450
|
+
function resolveLang(opts = {}) {
|
|
1451
|
+
const env = process.env.TUNNELBOX_LANG;
|
|
1452
|
+
if (opts.config) return normalizeLang(opts.config);
|
|
1453
|
+
if (env) return normalizeLang(env);
|
|
1454
|
+
if (opts.saved) return normalizeLang(opts.saved);
|
|
1455
|
+
return normalizeLang(detectSystemLang());
|
|
1456
|
+
}
|
|
1457
|
+
function t(lang, key, vars) {
|
|
1458
|
+
const dict = dicts[lang] ?? dicts[DEFAULT_LANG];
|
|
1459
|
+
let text = dict[key] ?? dicts[DEFAULT_LANG][key] ?? key;
|
|
1460
|
+
if (vars) {
|
|
1461
|
+
for (const [k, v] of Object.entries(vars)) {
|
|
1462
|
+
text = text.replaceAll(`{${k}}`, String(v));
|
|
1463
|
+
}
|
|
1464
|
+
}
|
|
1465
|
+
return text;
|
|
1466
|
+
}
|
|
1467
|
+
function makeT(lang) {
|
|
1468
|
+
return (key, vars) => t(lang, key, vars);
|
|
1469
|
+
}
|
|
1470
|
+
|
|
1471
|
+
// src/state.ts
|
|
1472
|
+
function baseName() {
|
|
1473
|
+
return join(homedir(), ".tunnelbox");
|
|
1474
|
+
}
|
|
1475
|
+
function suffix(type) {
|
|
1476
|
+
return type ? `.${type}` : "";
|
|
1477
|
+
}
|
|
1478
|
+
function statePath(type) {
|
|
1479
|
+
return join(baseName(), `remote-state${suffix(type)}.json`);
|
|
1480
|
+
}
|
|
1481
|
+
function saveState(st, type) {
|
|
1482
|
+
try {
|
|
1483
|
+
const p = statePath(type);
|
|
1484
|
+
mkdirSync(dirname(p), { recursive: true });
|
|
1485
|
+
writeFileSync(p, JSON.stringify(st, null, 2), "utf8");
|
|
1486
|
+
} catch (e) {
|
|
1487
|
+
console.error("[tunnelbox] \u4FDD\u5B58\u72B6\u6001\u5931\u8D25", e);
|
|
1488
|
+
}
|
|
1489
|
+
}
|
|
1490
|
+
function loadState(type) {
|
|
1491
|
+
const fallback = {
|
|
1492
|
+
agentId: randomBytes(16).toString("hex")
|
|
1493
|
+
};
|
|
1494
|
+
try {
|
|
1495
|
+
if (!existsSync(statePath(type))) {
|
|
1496
|
+
saveState(fallback, type);
|
|
1497
|
+
return fallback;
|
|
1498
|
+
}
|
|
1499
|
+
const parsed = JSON.parse(readFileSync(statePath(type), "utf8"));
|
|
1500
|
+
if (parsed.agentId && parsed.agentId.length >= 16) {
|
|
1501
|
+
return {
|
|
1502
|
+
agentId: parsed.agentId,
|
|
1503
|
+
relayUrl: parsed.relayUrl || "",
|
|
1504
|
+
claimed: parsed.claimed === true,
|
|
1505
|
+
lang: parsed.lang ? normalizeLang(parsed.lang) : void 0
|
|
1506
|
+
};
|
|
1507
|
+
}
|
|
1508
|
+
saveState(fallback, type);
|
|
1509
|
+
return fallback;
|
|
1510
|
+
} catch {
|
|
1511
|
+
saveState(fallback, type);
|
|
1512
|
+
return fallback;
|
|
1513
|
+
}
|
|
1514
|
+
}
|
|
1515
|
+
function writePairingFile(code, type) {
|
|
1516
|
+
const p = join(baseName(), `remote-pairing${suffix(type)}.txt`);
|
|
1517
|
+
try {
|
|
1518
|
+
mkdirSync(dirname(p), { recursive: true });
|
|
1519
|
+
writeFileSync(p, `\u914D\u5BF9\u7801: ${code}
|
|
1520
|
+
`, "utf8");
|
|
1521
|
+
} catch {
|
|
1522
|
+
}
|
|
1523
|
+
return p;
|
|
1524
|
+
}
|
|
1525
|
+
function writePairingJson(info, type) {
|
|
1526
|
+
const p = join(baseName(), `remote-pairing${suffix(type)}.json`);
|
|
1527
|
+
try {
|
|
1528
|
+
mkdirSync(dirname(p), { recursive: true });
|
|
1529
|
+
writeFileSync(p, JSON.stringify(info, null, 2), "utf8");
|
|
1530
|
+
} catch {
|
|
1531
|
+
}
|
|
1532
|
+
return p;
|
|
1533
|
+
}
|
|
1534
|
+
|
|
1535
|
+
// src/env.ts
|
|
1536
|
+
function injectedRelayUrl() {
|
|
1537
|
+
return typeof __TB_DEFAULT_RELAY__ === "string" && __TB_DEFAULT_RELAY__ ? __TB_DEFAULT_RELAY__.replace(/\/+$/, "") : "";
|
|
1538
|
+
}
|
|
1539
|
+
|
|
1540
|
+
// src/qr.ts
|
|
1541
|
+
async function loadQrcode() {
|
|
1542
|
+
try {
|
|
1543
|
+
const mod = await import("qrcode");
|
|
1544
|
+
const render = mod.default ?? mod;
|
|
1545
|
+
const toString = render.toString;
|
|
1546
|
+
return toString ? { toString } : null;
|
|
1547
|
+
} catch {
|
|
1548
|
+
return null;
|
|
1549
|
+
}
|
|
1550
|
+
}
|
|
1551
|
+
async function renderPairingQrText(text) {
|
|
1552
|
+
const render = await loadQrcode();
|
|
1553
|
+
if (!render?.toString) return "";
|
|
1554
|
+
try {
|
|
1555
|
+
const qr = await render.toString(text, {
|
|
1556
|
+
type: "utf8",
|
|
1557
|
+
margin: 4,
|
|
1558
|
+
// 令 qrcode 选用反相块字符表(dark=白/light=黑 → INVERTED_BLOCK_CHAR)
|
|
1559
|
+
color: { dark: "#ffffff", light: "#000000" }
|
|
1560
|
+
});
|
|
1561
|
+
return qr || "";
|
|
1562
|
+
} catch {
|
|
1563
|
+
return "";
|
|
1564
|
+
}
|
|
1565
|
+
}
|
|
1566
|
+
function dispWidth(s) {
|
|
1567
|
+
let w = 0;
|
|
1568
|
+
for (const ch of s) w += ch.charCodeAt(0) > 255 ? 2 : 1;
|
|
1569
|
+
return w;
|
|
1570
|
+
}
|
|
1571
|
+
function padVisual(s, width, align = "left") {
|
|
1572
|
+
const cur = dispWidth(s);
|
|
1573
|
+
if (cur >= width) return s;
|
|
1574
|
+
const pad = width - cur;
|
|
1575
|
+
if (align === "center") {
|
|
1576
|
+
const left = Math.floor(pad / 2);
|
|
1577
|
+
return " ".repeat(left) + s + " ".repeat(pad - left);
|
|
1578
|
+
}
|
|
1579
|
+
return s + " ".repeat(pad);
|
|
1580
|
+
}
|
|
1581
|
+
async function printPairing(code, type, name, lang) {
|
|
1582
|
+
const resolved = lang ? normalizeLang(lang) : resolveLang();
|
|
1583
|
+
const file = writePairingFile(code, type);
|
|
1584
|
+
const tt = (key, vars) => t(resolved, key, vars);
|
|
1585
|
+
const title = type ? tt("qr.titleWithType", { type }) : tt("qr.titleNoType");
|
|
1586
|
+
const codeLine = `${tt("qr.codeLabel")}: ${code}`;
|
|
1587
|
+
const hint = tt("qr.openHint");
|
|
1588
|
+
const inner = Math.max(40, dispWidth(codeLine), dispWidth(title));
|
|
1589
|
+
const W = Math.min(76, inner + 4);
|
|
1590
|
+
const bar = "\u2500".repeat(W);
|
|
1591
|
+
console.log("");
|
|
1592
|
+
console.log("\u250C" + bar + "\u2510");
|
|
1593
|
+
console.log("\u2502 " + padVisual(title, W - 2, "center") + " \u2502");
|
|
1594
|
+
console.log("\u251C" + bar + "\u2524");
|
|
1595
|
+
console.log("\u2502 " + padVisual(codeLine, W - 2) + " \u2502");
|
|
1596
|
+
console.log("\u2514" + bar + "\u2518");
|
|
1597
|
+
console.log(" " + hint);
|
|
1598
|
+
try {
|
|
1599
|
+
const mod = await import("qrcode");
|
|
1600
|
+
const render = mod.default ?? mod;
|
|
1601
|
+
const toString = render.toString;
|
|
1602
|
+
if (toString) {
|
|
1603
|
+
const qr = await toString(code, { type: "terminal", small: true });
|
|
1604
|
+
if (qr) console.log(qr);
|
|
1605
|
+
}
|
|
1606
|
+
} catch {
|
|
1607
|
+
console.log(" " + tt("qr.unavailable"));
|
|
1608
|
+
}
|
|
1609
|
+
console.log(" " + tt("qr.fileWritten", { path: file }));
|
|
1610
|
+
console.log("");
|
|
1611
|
+
}
|
|
1612
|
+
export {
|
|
1613
|
+
DEFAULT_LANG,
|
|
1614
|
+
LANG_TAGS,
|
|
1615
|
+
RelayClient,
|
|
1616
|
+
detectSystemLang,
|
|
1617
|
+
envelope,
|
|
1618
|
+
injectedRelayUrl,
|
|
1619
|
+
loadState,
|
|
1620
|
+
makeT,
|
|
1621
|
+
normalizeLang,
|
|
1622
|
+
printPairing,
|
|
1623
|
+
renderPairingQrText,
|
|
1624
|
+
resolveLang,
|
|
1625
|
+
saveState,
|
|
1626
|
+
statePath,
|
|
1627
|
+
t,
|
|
1628
|
+
writePairingFile,
|
|
1629
|
+
writePairingJson
|
|
1630
|
+
};
|