@hellolynk-ai/codex-plugin 0.0.0-stage → 0.2.100
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/.agents/plugins/marketplace.json +20 -0
- package/LICENSE +92 -0
- package/README.md +101 -2
- package/bin/hellolynk-client-setup.mjs +2748 -0
- package/bin/hellolynk-mcp-config-shape.mjs +23 -0
- package/hellolynk-client-pack-manifest.json +619 -0
- package/hellolynk-client-pack-pin.json +4 -0
- package/package.json +58 -4
- package/plugins/hellolynk-codex/.app.json +3 -0
- package/plugins/hellolynk-codex/.codex-plugin/plugin.json +38 -0
- package/plugins/hellolynk-codex/.mcp.json +19 -0
- package/plugins/hellolynk-codex/assets/hellolynk-mark.png +0 -0
- package/plugins/hellolynk-codex/package.json +11 -0
- package/plugins/hellolynk-codex/runtime/bootstrap/core/hellolynk-client-account.mjs +180 -0
- package/plugins/hellolynk-codex/runtime/bootstrap/core/hellolynk-client-core.mjs +770 -0
- package/plugins/hellolynk-codex/runtime/bootstrap/core/hellolynk-client-profile.mjs +191 -0
- package/plugins/hellolynk-codex/runtime/bootstrap/core/hellolynk-host-auth.mjs +347 -0
- package/plugins/hellolynk-codex/runtime/bootstrap/core/hellolynk-host-protected-store.mjs +2721 -0
- package/plugins/hellolynk-codex/runtime/bootstrap/core/hellolynk-local-process-lock.mjs +157 -0
- package/plugins/hellolynk-codex/runtime/bootstrap/core/hellolynk-neutral-host-installation-store.mjs +765 -0
- package/plugins/hellolynk-codex/runtime/bootstrap/core/hellolynk-platform-credential-store.mjs +773 -0
- package/plugins/hellolynk-codex/runtime/bootstrap/core/hellolynk-runtime-safety.cjs +471 -0
- package/plugins/hellolynk-codex/runtime/bootstrap/platform/windows/hellolynk-host-protected-store.ps1 +2866 -0
- package/plugins/hellolynk-codex/runtime/connect-activate.mjs +837 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-agent-configurator.mjs +701 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-client-account.mjs +180 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-client-core.mjs +770 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-client-profile.mjs +191 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-client-update-entry.mjs +31 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-client-update-runtime.mjs +600 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-client-update.mjs +453 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-contact-request-e2ee.mjs +867 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-device-enrollment.mjs +435 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-direct-text-e2ee-client.mjs +1964 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-direct-text-e2ee.mjs +1207 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-host-auth.mjs +347 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-host-protected-store.mjs +2721 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-host-transport-client.mjs +946 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-host.mjs +2374 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-human-confirmation-ledger.mjs +256 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-human-relationship-controller.mjs +1234 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-inbox-read-state.mjs +11 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-indexed-message-store.mjs +1558 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-instance-conversation.mjs +185 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-local-contact-requests.mjs +1733 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-local-contacts.mjs +1228 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-local-data-migration.mjs +766 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-local-data-protection.mjs +747 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-local-identity-trust.mjs +274 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-local-messaging.mjs +3043 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-local-peer-transport.mjs +103 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-local-process-lock.mjs +157 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-model-inbox.mjs +230 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-model-notices.cjs +60 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-native-addressing-tools.cjs +231 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-native-conversations.mjs +280 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-native-human-confirmation-broker.mjs +1036 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-native-inbox-runtime.mjs +553 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-native-notice.mjs +50 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-native-reply-routes.mjs +96 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-native-worker-lease.mjs +84 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-neutral-host-assembly.mjs +955 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-neutral-host-installation-store.mjs +765 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-neutral-host-launcher.mjs +665 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-neutral-host-process.mjs +4374 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-neutral-host-store-adapters.mjs +548 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-neutral-host-workbench-read-model.mjs +1365 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-platform-credential-store.mjs +773 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-relay-client-cli.mjs +232 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-release-retention.mjs +277 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-runtime-safety.cjs +471 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-workbench-action-grants.mjs +457 -0
- package/plugins/hellolynk-codex/runtime/core/hellolynk-workbench-connection.mjs +234 -0
- package/plugins/hellolynk-codex/runtime/neutral-host-bootstrap.mjs +64 -0
- package/plugins/hellolynk-codex/runtime/neutral-host-release-entry.mjs +70 -0
- package/plugins/hellolynk-codex/runtime/neutral-host-release-loader.mjs +156 -0
- package/plugins/hellolynk-codex/runtime/neutral-host-release-manifest.json +358 -0
- package/plugins/hellolynk-codex/runtime/neutral-host-release-pin.json +4 -0
- package/plugins/hellolynk-codex/runtime/platform/windows/configure-agent.ps1 +281 -0
- package/plugins/hellolynk-codex/runtime/platform/windows/credential-store.ps1 +844 -0
- package/plugins/hellolynk-codex/runtime/platform/windows/hellolynk-host-protected-store.ps1 +2866 -0
- package/plugins/hellolynk-codex/runtime/platform/windows/hellolynk-human-confirmation-ledger.ps1 +155 -0
- package/plugins/hellolynk-codex/runtime/platform/windows/hellolynk-local-data-key.ps1 +300 -0
- package/plugins/hellolynk-codex/runtime/platform/windows/hellolynk-native-human-confirmation-broker.ps1 +216 -0
- package/plugins/hellolynk-codex/runtime/workbench/candidate-bootstrap.mjs +54 -0
- package/plugins/hellolynk-codex/runtime/workbench/contract.mjs +1314 -0
- package/plugins/hellolynk-codex/runtime/workbench/hellolynk-workbench-build.json +215 -0
- package/plugins/hellolynk-codex/runtime/workbench/host-capabilities.mjs +80 -0
- package/plugins/hellolynk-codex/runtime/workbench/i18n.mjs +1127 -0
- package/plugins/hellolynk-codex/runtime/workbench/loopback-surface.mjs +740 -0
- package/plugins/hellolynk-codex/runtime/workbench/mcp-app-bundle.mjs +97 -0
- package/plugins/hellolynk-codex/runtime/workbench/service.mjs +485 -0
- package/plugins/hellolynk-codex/runtime/workbench/state.mjs +421 -0
- package/plugins/hellolynk-codex/runtime/workbench/transports.mjs +171 -0
- package/plugins/hellolynk-codex/runtime/workbench/ui/app.mjs +6120 -0
- package/plugins/hellolynk-codex/runtime/workbench/ui/connection-form.mjs +155 -0
- package/plugins/hellolynk-codex/runtime/workbench/ui/hellolynk-mark.png +0 -0
- package/plugins/hellolynk-codex/runtime/workbench/ui/http-transport.mjs +247 -0
- package/plugins/hellolynk-codex/runtime/workbench/ui/icons/arrow-left.svg +3 -0
- package/plugins/hellolynk-codex/runtime/workbench/ui/icons/close.svg +3 -0
- package/plugins/hellolynk-codex/runtime/workbench/ui/icons/contacts.svg +3 -0
- package/plugins/hellolynk-codex/runtime/workbench/ui/icons/inbox.svg +3 -0
- package/plugins/hellolynk-codex/runtime/workbench/ui/icons/refresh.svg +3 -0
- package/plugins/hellolynk-codex/runtime/workbench/ui/icons/search.svg +3 -0
- package/plugins/hellolynk-codex/runtime/workbench/ui/icons/security.svg +3 -0
- package/plugins/hellolynk-codex/runtime/workbench/ui/icons/settings.svg +3 -0
- package/plugins/hellolynk-codex/runtime/workbench/ui/index.html +139 -0
- package/plugins/hellolynk-codex/runtime/workbench/ui/loopback-entry.mjs +26 -0
- package/plugins/hellolynk-codex/runtime/workbench/ui/mcp-app-client.mjs +151 -0
- package/plugins/hellolynk-codex/runtime/workbench/ui/mcp-app-entry.mjs +452 -0
- package/plugins/hellolynk-codex/runtime/workbench/ui/styles.css +686 -0
- package/plugins/hellolynk-codex/server/codex-neutral-production.mjs +520 -0
- package/plugins/hellolynk-codex/server/mcp-proxy.mjs +306 -0
- package/plugins/hellolynk-codex/server/mcp-server.mjs +1193 -0
- package/plugins/hellolynk-codex/server/native-conversation-directory.mjs +33 -0
- package/plugins/hellolynk-codex/server/native-reply-routes.mjs +32 -0
- package/plugins/hellolynk-codex/server/native-task-client.mjs +382 -0
- package/plugins/hellolynk-codex/server/native-task-runtime.mjs +8 -0
- package/plugins/hellolynk-codex/server/neutral-host-adapter.mjs +649 -0
- package/plugins/hellolynk-codex/server/workbench-runtime.mjs +180 -0
- package/plugins/hellolynk-codex/skills/hellolynk-open/SKILL.md +11 -0
- package/plugins/hellolynk-codex/skills/hellolynk-open/agents/openai.yaml +4 -0
- package/tools/hellolynk-activate-neutral-host-clients.mjs +837 -0
|
@@ -0,0 +1,1127 @@
|
|
|
1
|
+
export const SUPPORTED_WORKBENCH_LOCALES = Object.freeze(["zh-CN", "en"]);
|
|
2
|
+
|
|
3
|
+
export const WORKBENCH_TRANSLATIONS = deepFreeze({
|
|
4
|
+
"zh-CN": {
|
|
5
|
+
"nativeNotice.source": "HelloLynk 自动提醒(不是用户本人发的)",
|
|
6
|
+
"nativeNotice.batch": "{source}:{count} 条来信,用 hellolynk_claim_message 读取 batchId={batchId}",
|
|
7
|
+
"nativeNotice.claudeIncoming": "{source}:{count} 条来信,用 hellolynk_claim_message 读取 batchId={batchId}",
|
|
8
|
+
"nativeNotice.claudeReply": "{source}:{count} 条回信,用 hellolynk_claim_message 读取 batchId={batchId}",
|
|
9
|
+
"nativeNotice.claudeTask": "独立 HelloLynk 会话。本轮调用 hellolynk_claim_message,batchId={batchId}。",
|
|
10
|
+
"nativeNotice.independentTitle": "HelloLynk · 独立会话",
|
|
11
|
+
"nativeNotice.externalHeader": "[HelloLynk 来信]",
|
|
12
|
+
"nativeNotice.senderUnavailable": "未设置称呼",
|
|
13
|
+
"nativeNotice.agentUnavailable": "名称不可用",
|
|
14
|
+
"nativeNotice.identityDetails": "仅在 HelloLynk 通讯的身份验证详情中提供",
|
|
15
|
+
"contacts.more": "更多",
|
|
16
|
+
"contacts.moreFor": "{name}的更多操作",
|
|
17
|
+
"contacts.saved": "联系人已保存",
|
|
18
|
+
"contacts.permissionsSaved": "权限已更新",
|
|
19
|
+
"contacts.permissionEnable": "允许",
|
|
20
|
+
"contacts.permissionRevoke": "撤销",
|
|
21
|
+
"contacts.permissionPending": "处理中…",
|
|
22
|
+
"instances.removed": "已移除这个 AI",
|
|
23
|
+
"instances.permissions": "AI 权限",
|
|
24
|
+
"authorization.title": "自主收发",
|
|
25
|
+
"details.aiRoute": "会话 AI",
|
|
26
|
+
"instances.count": "已添加 {count} 个 AI",
|
|
27
|
+
"instances.createdAt": "{time} 建立",
|
|
28
|
+
"instances.title": "对方的 AI",
|
|
29
|
+
"instances.directoryHint": "添加时只会列出对方实际登记并可用的 AI;你可以为选中的 AI 设置本机备注。",
|
|
30
|
+
"instances.current": "当前 AI",
|
|
31
|
+
"instances.local": "我的当前 AI:{name}",
|
|
32
|
+
"instances.recipient": "对方 AI",
|
|
33
|
+
"instances.choose": "请选择对方 AI",
|
|
34
|
+
"instances.route": "{local} → {peer}",
|
|
35
|
+
"instances.unavailable": "未命名的 AI",
|
|
36
|
+
"instances.open": "打开会话",
|
|
37
|
+
"instances.add": "添加 AI",
|
|
38
|
+
"instances.addNamed": "添加 {name} · {client}",
|
|
39
|
+
"instances.addSelected": "添加这个 AI",
|
|
40
|
+
"instances.added": "已添加",
|
|
41
|
+
"instances.backToContact": "返回联系人",
|
|
42
|
+
"instances.directoryStale": "AI 列表已过期,请刷新。",
|
|
43
|
+
"instances.directoryUnknown": "AI 列表加载结果未知,请刷新。",
|
|
44
|
+
"instances.localName": "本机显示备注(可选)",
|
|
45
|
+
"instances.editConflict": "这个 AI 刚被改动过,你的修改没有保存。请看一下最新内容,再改一次。",
|
|
46
|
+
"instances.editUnknown": "备注保存结果未知,请刷新确认。",
|
|
47
|
+
"instances.editName": "修改备注",
|
|
48
|
+
"instances.saveName": "保存备注",
|
|
49
|
+
"instances.remove": "移除这个 AI",
|
|
50
|
+
"instances.empty": "先添加对方的 AI,再开始会话。",
|
|
51
|
+
"instances.noMore": "对方没有更多可添加的 AI。",
|
|
52
|
+
"instances.authorizationHint": "每个 AI 入口单独授权。",
|
|
53
|
+
"app.name": "HelloLynk",
|
|
54
|
+
"app.title": "HelloLynk 通讯",
|
|
55
|
+
"shell.personalSpace": "个人空间",
|
|
56
|
+
"language.label": "界面语言",
|
|
57
|
+
"language.zh-CN": "中文",
|
|
58
|
+
"language.en": "EN",
|
|
59
|
+
"nav.messages": "消息",
|
|
60
|
+
"nav.inbox": "消息",
|
|
61
|
+
"nav.contacts": "联系人",
|
|
62
|
+
"nav.contactsPending": "联系人,{count} 条待处理申请",
|
|
63
|
+
"nav.contactRequestsPending": "联系申请,{count} 条待处理",
|
|
64
|
+
"nav.contactRequests": "联系申请",
|
|
65
|
+
"nav.security": "安全中心",
|
|
66
|
+
"nav.settings": "设置",
|
|
67
|
+
"filter.label": "会话筛选",
|
|
68
|
+
"filter.all": "全部",
|
|
69
|
+
"filter.unread": "未读",
|
|
70
|
+
"thread.sendFailed": "发送失败",
|
|
71
|
+
"shell.conversations": "会话",
|
|
72
|
+
"search.label": "搜索聊天",
|
|
73
|
+
"search.placeholder": "搜索聊天或消息",
|
|
74
|
+
"search.open": "搜索",
|
|
75
|
+
"search.close": "关闭搜索",
|
|
76
|
+
"state.loading.title": "正在打开 HelloLynk",
|
|
77
|
+
"state.loading.body": "正在读取这台电脑上的消息。",
|
|
78
|
+
"state.connecting.title": "正在连接本机 HelloLynk",
|
|
79
|
+
"state.connecting.body": "第一次连接可能要多等一会儿,请不要关闭客户端。",
|
|
80
|
+
"state.empty.title": "暂无会话",
|
|
81
|
+
"state.empty.body": "真实消息到达后,会话会显示在这里。",
|
|
82
|
+
"state.noResults.title": "没有匹配结果",
|
|
83
|
+
"state.noResults.body": "请调整搜索词或会话筛选。",
|
|
84
|
+
"state.error.title": "HelloLynk 暂时打不开",
|
|
85
|
+
"state.error.body": "这次没能读到页面数据。点“重试”再试一次;一直不行,请把下面的错误码告诉你的 AI。",
|
|
86
|
+
"state.error.timeout": "读取超时,请重试。",
|
|
87
|
+
"state.error.sessionExpired": "这个页面的连接已过期。请回到客户端,重新打开 HelloLynk 通讯。",
|
|
88
|
+
"state.error.reconnecting": "连接中断,正在重新连接。",
|
|
89
|
+
"state.error.unreachable": "页面连不上本机 HelloLynk。请回到客户端,重新打开 HelloLynk 通讯。",
|
|
90
|
+
"state.error.backendUnreachable": "页面暂时连不上本机 HelloLynk。点“重试”;还不行就回到客户端重新打开 HelloLynk 通讯。",
|
|
91
|
+
"state.error.hostConnection": "和本机 HelloLynk 的连接已失效。请回到客户端,重新打开 HelloLynk 通讯。",
|
|
92
|
+
"state.error.authorization": "这个页面的连接没有通过检查。请回到客户端,重新打开 HelloLynk 通讯。",
|
|
93
|
+
"state.error.invalidData": "读到的内容不完整。点“重试”;还是不行,请把错误码告诉你的 AI。",
|
|
94
|
+
"state.error.versionMismatch": "HelloLynk 客户端版本不一致。请把各个客户端的 HelloLynk 插件都更新到同一版本,再关闭并重新打开客户端。",
|
|
95
|
+
"state.error.notConnectedTitle": "连接你的 HelloLynk",
|
|
96
|
+
"state.error.cursorNotConnected": "输入你的灵信号,让消息和联系人来到这里。",
|
|
97
|
+
"connection.welcome": "欢迎使用 HelloLynk",
|
|
98
|
+
"connection.hint": "首次连接这台电脑时,我们会请你去官网确认。已确认过,就直接继续。",
|
|
99
|
+
"connection.start": "连接 HelloLynk",
|
|
100
|
+
"connection.recovered": "连接已完成,本次使用的 AI 名称为“{name}”。",
|
|
101
|
+
"connection.help": "确认只需一次,以后打开即可连接。",
|
|
102
|
+
"connection.commandHelp": "请从当前客户端重新打开 HelloLynk;若仍无法连接,把这个情况告诉本地 AI。",
|
|
103
|
+
"connection.openFailed": "没能打开连接入口。请重新打开 HelloLynk 通讯,再点击“连接 HelloLynk”。",
|
|
104
|
+
"connection.keyLink": "去官网获取 KEY ↗",
|
|
105
|
+
"connectionForm.idLabel": "灵信号",
|
|
106
|
+
"connectionForm.account": "去官网复制我的灵信号 ↗",
|
|
107
|
+
"connectionForm.nameLabel": "给这个 AI 起个名字(选填)",
|
|
108
|
+
"connectionForm.nameHelp": "1–40 个汉字、英文字母、数字、下划线或连字符;不能有空格,英文字母会保存为小写。",
|
|
109
|
+
"connectionForm.namePlaceholder": "例如:工作电脑-codex",
|
|
110
|
+
"connectionForm.confirmTitle": "请先在官网确认这台电脑",
|
|
111
|
+
"connectionForm.confirmHelp": "官网确认完成后,回到这里进行第2步。",
|
|
112
|
+
"connectionForm.step1": "第1步:前往官网确认 ↗",
|
|
113
|
+
"connectionForm.step2": "第2步:我已确认,继续连接",
|
|
114
|
+
"connectionForm.connect": "连接 HelloLynk",
|
|
115
|
+
"connectionForm.connectingButton": "正在连接…",
|
|
116
|
+
"connectionForm.errorCode": "错误码:",
|
|
117
|
+
"connectionForm.message.idRequired": "请粘贴从 hellolynk: 开始的完整灵信号。",
|
|
118
|
+
"connectionForm.message.idInvalid": "这个灵信号不能用。请回官网重新复制完整的灵信号。",
|
|
119
|
+
"connectionForm.message.nameInvalid": "AI 名称过长,或含有不可见字符。请修改后再连接。",
|
|
120
|
+
"connectionForm.message.connecting": "正在连接,请稍候。",
|
|
121
|
+
"connectionForm.message.networkCertificate": "无法信任当前网络的证书。请检查电脑时间和网络代理。",
|
|
122
|
+
"connectionForm.message.networkAddress": "无法连接到 HelloLynk 的网络地址。请检查网络和代理。",
|
|
123
|
+
"connectionForm.message.networkProxy": "当前代理无法用于 HelloLynk 连接。请把下面的错误码告诉你的 AI。",
|
|
124
|
+
"connectionForm.message.confirmationRequired": "还差一步:请点下面的“第1步”,在官网确认这台电脑。",
|
|
125
|
+
"connectionForm.message.enrollmentNameInvalid": "新的 AI 名称只能用 1–40 个汉字、英文字母、数字、下划线或连字符,不能有空格。",
|
|
126
|
+
"connectionForm.message.nameTaken": "你的另一个 AI 已在使用这个名称。请换一个名称,或留空自动命名。",
|
|
127
|
+
"connectionForm.message.busy": "上一次连接还在处理中,请稍后再点;已填内容保留。",
|
|
128
|
+
"connectionForm.message.resultPending": "还没有收到连接结果,请稍后再点一次;已填内容保留。",
|
|
129
|
+
"connectionForm.message.powershell7Missing": "这台电脑没有 PowerShell 7(pwsh),HelloLynk 需要它。安装后重新打开客户端。",
|
|
130
|
+
"connectionForm.message.credentialHelperUnavailable": "没能启动 PowerShell 7(pwsh),这台电脑可能没有安装。安装后重新打开客户端;已安装的话,请把下面的错误码告诉你的 AI。",
|
|
131
|
+
"connectionForm.message.existingConnection": "这台电脑上已有连接信息。请核对所填灵信号是否属于当前账号。",
|
|
132
|
+
"connectionForm.message.failed": "连接没有完成。请把下面的错误码告诉你的 AI。",
|
|
133
|
+
"connectionForm.message.websiteOpenFailed": "没能打开官网。请再点一次,或自己在浏览器里打开 hellolynk.com/account。",
|
|
134
|
+
"connectionForm.message.existingSetup": "此客户端已有连接资料,请按客户端的更新说明修复连接。",
|
|
135
|
+
"connectionForm.message.savedConnectionConflict": "这台电脑已有不同的连接记录。请把下面的错误码告诉你的 AI,先恢复已有连接。",
|
|
136
|
+
"connectionForm.message.authorizationExpired": "本次连接授权已过期。请把下面的错误码告诉你的 AI,协助恢复连接。",
|
|
137
|
+
"disconnect.title": "解除当前客户端的账号连接?",
|
|
138
|
+
"disconnect.copy": "旧账号的历史记录保留,解除后可以重新连接账号。",
|
|
139
|
+
"disconnect.progress": "正在解除连接…",
|
|
140
|
+
"disconnect.unknown": "尚未确认解除结果,关闭此窗口后会重新检查连接状态。错误码:",
|
|
141
|
+
"disconnect.checkStatus": "检查状态",
|
|
142
|
+
"state.error.disconnectUnknown": "暂时无法确认连接状态。请先刷新核对,再决定是否重新连接。",
|
|
143
|
+
"state.error.disconnectIncomplete": "上次解除连接被中断。请再点一次“解除连接”完成。",
|
|
144
|
+
"state.error.accountChanged": "当前客户端的账号连接已改变,请刷新后继续。",
|
|
145
|
+
"state.error.notificationTitle": "页面暂时不会自动更新",
|
|
146
|
+
"state.error.notificationBody": "连接恢复后会自动刷新,也可以现在点“重试”。",
|
|
147
|
+
"state.error.code": "错误码",
|
|
148
|
+
"state.stale.title": "当前内容可能已过期",
|
|
149
|
+
"state.stale.body": "请点“刷新”,再继续操作。",
|
|
150
|
+
"state.conflict.title": "本地数据已发生变化",
|
|
151
|
+
"state.conflict.body": "请点“刷新”查看最新内容。",
|
|
152
|
+
"thread.unreadCount": "{count} 条未读",
|
|
153
|
+
"thread.noMessages": "还没有消息",
|
|
154
|
+
"thread.incoming": "收到",
|
|
155
|
+
"thread.outgoing": "发出",
|
|
156
|
+
"conversation.selectThread": "请选择一个会话",
|
|
157
|
+
"conversation.messages": "会话消息",
|
|
158
|
+
"conversation.empty.title": "选择一个会话",
|
|
159
|
+
"conversation.empty.body": "消息会显示在这里。",
|
|
160
|
+
"conversation.noMessages.title": "还没有消息",
|
|
161
|
+
"conversation.noMessages.body": "在下方输入消息,开始聊天。",
|
|
162
|
+
"conversation.noMessages.readonly": "这个聊天在本机没有可显示的记录。",
|
|
163
|
+
"conversation.today": "今天",
|
|
164
|
+
"message.you": "你",
|
|
165
|
+
"message.details": "消息详情",
|
|
166
|
+
"message.detailsHint": "这条消息是谁、通过哪个 AI 发的。",
|
|
167
|
+
"message.principal": "所属账号",
|
|
168
|
+
"message.delegate": "实际 AI",
|
|
169
|
+
"message.intent": "发起方式",
|
|
170
|
+
"message.scope": "权限",
|
|
171
|
+
"message.scopeValue.textSend": "发送文字消息",
|
|
172
|
+
"message.intentValue.preauthorizedContact": "发送人已预先授权,由 AI 自主发出",
|
|
173
|
+
"message.intentValue.nativeDialog": "发送人在确认窗口里确认后发出",
|
|
174
|
+
"message.intentValue.explicitSend": "AI 通过 HelloLynk 发出",
|
|
175
|
+
"message.provenanceMissing": "历史未记录",
|
|
176
|
+
"message.markRead": "标为已读",
|
|
177
|
+
"message.markAllRead": "全部标为已读",
|
|
178
|
+
"message.markThreadRead": "全部已读",
|
|
179
|
+
"message.autoRead": "AI 读后自动已读",
|
|
180
|
+
"message.autoReadHint": "开启后,AI 读过这个聊天里的来信,就自动算你已读。关闭时由你自己标记。已有的未读请点“全部已读”。",
|
|
181
|
+
"action.on": "开",
|
|
182
|
+
"action.off": "关",
|
|
183
|
+
"message.markingRead": "正在标记…",
|
|
184
|
+
"message.markAllReadHint": "将当前客户端的未读消息标为已读",
|
|
185
|
+
"message.markThreadReadHint": "将当前对话的未读消息标为已读",
|
|
186
|
+
"message.sent": "已发送",
|
|
187
|
+
"message.delivered": "已送达",
|
|
188
|
+
"message.expired": "已过期 · AI 不再自动处理",
|
|
189
|
+
"message.deleteRead": "删除本机已读消息",
|
|
190
|
+
"message.deleteSent": "删除本机消息",
|
|
191
|
+
"history.manage": "管理",
|
|
192
|
+
"history.active": "聊天",
|
|
193
|
+
"history.archived": "已归档",
|
|
194
|
+
"history.archivedEmpty": "没有已归档会话",
|
|
195
|
+
"history.delete": "删除聊天",
|
|
196
|
+
"history.deleteTitle": "删除这段聊天?",
|
|
197
|
+
"history.deleteArchived": "删除全部归档会话",
|
|
198
|
+
"history.deleteArchivedTitle": "删除本机全部归档聊天?",
|
|
199
|
+
"history.deleteHint": "删除这台电脑上的这段聊天(含未读消息),不能恢复。",
|
|
200
|
+
"history.deleted": "聊天已删除。",
|
|
201
|
+
"history.hide": "归档",
|
|
202
|
+
"history.restore": "移回聊天",
|
|
203
|
+
"history.clear": "清理本机记录",
|
|
204
|
+
"history.clearTitle": "清理这个聊天的本机记录?",
|
|
205
|
+
"history.clearHint": "删除本机已读来信和已发送消息,不能恢复。未读和未送达的消息保留。",
|
|
206
|
+
"history.autoArchiveOn": "24 小时未活动自动归档:开",
|
|
207
|
+
"history.autoArchiveOff": "24 小时未活动自动归档:关",
|
|
208
|
+
"history.range": "清理范围",
|
|
209
|
+
"history.rangeAll": "全部",
|
|
210
|
+
"history.rangeDay": "一天前",
|
|
211
|
+
"history.rangeWeek": "7 天前",
|
|
212
|
+
"history.rangeMonth": "30 天前",
|
|
213
|
+
"history.rangeDate": "指定日期前",
|
|
214
|
+
"history.date": "早于日期",
|
|
215
|
+
"history.counting": "正在统计…",
|
|
216
|
+
"history.countUnavailable": "没能统计,请刷新后再试。",
|
|
217
|
+
"history.estimate": "可清理 {count} 条,正文约 {size};保留未读 {unread} 条、未交付 {outgoing} 条。",
|
|
218
|
+
"history.cleared": "已清理 {count} 条;保留未读 {unread} 条、未交付 {outgoing} 条。",
|
|
219
|
+
"history.changed": "这个聊天刚有变化。请关闭这个窗口,重新点一次清理。",
|
|
220
|
+
"history.unreadProtected": "这个聊天还有未读来信,请先标为已读,再从列表移除。",
|
|
221
|
+
"history.outgoingProtected": "这个聊天还有没发出去的消息,先不能从列表移除。",
|
|
222
|
+
"action.close": "关闭",
|
|
223
|
+
"outbox.noText": "没有可显示的正文。",
|
|
224
|
+
"outbox.retry": "重试",
|
|
225
|
+
"outbox.retrying": "正在重试…",
|
|
226
|
+
"outbox.inline.failed": "发送失败",
|
|
227
|
+
"outbox.error.connectivity": "连接暂时不可用",
|
|
228
|
+
"outbox.error.encryption": "加密连接暂不可用",
|
|
229
|
+
"outbox.error.message_time": "消息已过期或发送时间不一致,请检查电脑时间。",
|
|
230
|
+
"outbox.error.device_identity_changed": "设备连接信息已变化,请重新连接后重试",
|
|
231
|
+
"outbox.error.external_contact_disabled": "对方已不再对好友开放这个 AI,请选择对方开放的其他 AI。",
|
|
232
|
+
"composer.status.notDelivered": "未送达,草稿已保留。请按消息下方提示处理后再发送。",
|
|
233
|
+
"outbox.error.authorization": "发送授权已变化,请检查权限",
|
|
234
|
+
"outbox.error.rate_limit": "操作过于频繁,请稍后重试",
|
|
235
|
+
"outbox.error.validation": "消息或接收方信息已变化,请检查后重试",
|
|
236
|
+
"outbox.error.reply_target_deleted": "原对话已删除,回复未送达。",
|
|
237
|
+
"outbox.resend": "新建对话补发",
|
|
238
|
+
"outbox.resendTitle": "允许新建对话重新发送?",
|
|
239
|
+
"outbox.resendHint": "只将已保存的这条回复作为新消息发送给原接收方,不会重新执行任务。",
|
|
240
|
+
"outbox.resendConfirm": "允许,发送已有回复",
|
|
241
|
+
"outbox.resendCreated": "已另建一条补发消息,请查看它的发送状态。",
|
|
242
|
+
"outbox.resend.sent": "回复已送达,任务没有重新执行。",
|
|
243
|
+
"outbox.resend.not-delivered": "补发消息尚未送达,请查看新消息的发送状态。",
|
|
244
|
+
"outbox.resend.unknown": "补发结果未知,请查看新消息的状态,不要重复发送。",
|
|
245
|
+
"outbox.inline.unknown": "发送结果未知,先不要重发",
|
|
246
|
+
"outbox.inline.noRetryAvailable": "这里不能重试;需要的话,请让你的 AI 重新发送。",
|
|
247
|
+
"composer.placeholder": "输入消息…",
|
|
248
|
+
"composer.label": "发送消息",
|
|
249
|
+
"composer.recipient": "发送给 {name} · {hellolynkId}",
|
|
250
|
+
"composer.send": "发送",
|
|
251
|
+
"composer.awaitingConfirmation": "等待确认",
|
|
252
|
+
"composer.hint": "Enter 发送 · Shift+Enter 换行",
|
|
253
|
+
"composer.status.awaitingApproval": "等待你在确认窗口批准发送。草稿已保留。",
|
|
254
|
+
"composer.status.cancelled": "你已取消发送。草稿已保留,可修改后再次发送。",
|
|
255
|
+
"composer.status.expired": "发送确认已过期。草稿已保留,请再次点击发送。",
|
|
256
|
+
"composer.status.invalidated": "这次发送确认已失效。草稿已保留,请检查连接后再次发送。",
|
|
257
|
+
"composer.status.sendFailed": "发送结果未知。草稿已保留,请先看会话里这条消息的状态,不要重复发送。",
|
|
258
|
+
"composer.status.ok": "已发送。",
|
|
259
|
+
"composer.status.failed": "发送失败,草稿已保留,可以再发一次。",
|
|
260
|
+
"composer.status.unknown": "发送结果未知。消息已保留,请勿重复发送。",
|
|
261
|
+
"globalSend.title": "新消息",
|
|
262
|
+
"globalSend.contact": "联系人",
|
|
263
|
+
"globalSend.message": "消息",
|
|
264
|
+
"globalSend.placeholder": "输入消息…",
|
|
265
|
+
"globalSend.contactMissing": "所选联系人已不在联系人列表里,请重新选择。",
|
|
266
|
+
"pagination.loading": "正在加载…",
|
|
267
|
+
"pagination.threads": "下一页",
|
|
268
|
+
"pagination.previousThreads": "上一页",
|
|
269
|
+
"pagination.firstThreads": "回到第一页",
|
|
270
|
+
"pagination.pageNumber": "第 {page} 页",
|
|
271
|
+
"pagination.messages": "加载更早消息",
|
|
272
|
+
"pagination.historyLimit": "已显示 200 条消息。更早的消息可以让 AI 帮你查。",
|
|
273
|
+
"pagination.newer": "加载较新消息",
|
|
274
|
+
"pagination.latest": "回到最新",
|
|
275
|
+
"details.title": "会话详情",
|
|
276
|
+
"details.open": "会话设置",
|
|
277
|
+
"details.close": "关闭详情",
|
|
278
|
+
"details.relationship": "关系状态",
|
|
279
|
+
"details.status": "状态",
|
|
280
|
+
"details.established": "建立时间",
|
|
281
|
+
"details.notAvailable": "暂无",
|
|
282
|
+
"details.actions": "管理",
|
|
283
|
+
"details.contactTitle": "联系人详情",
|
|
284
|
+
"details.authorization": "AI 授权",
|
|
285
|
+
"details.localBoundary": "数据位置",
|
|
286
|
+
"details.messages": "消息与历史",
|
|
287
|
+
"details.onDevice": "保存在本机",
|
|
288
|
+
"details.cloud": "云端消息正文",
|
|
289
|
+
"details.none": "不保存",
|
|
290
|
+
"authorization.active": "AI 自主收发已开启",
|
|
291
|
+
"authorization.human": "发送由你确认",
|
|
292
|
+
"authorization.activeShort": "AI 自主收发已开启",
|
|
293
|
+
"authorization.humanShort": "发送由你确认",
|
|
294
|
+
"authorization.enable": "允许 AI 自主收发",
|
|
295
|
+
"authorization.revoke": "撤销 AI 自主收发",
|
|
296
|
+
"contacts.title": "联系人",
|
|
297
|
+
"contacts.body": "联系人和授权保存在本机,由你随时查看、暂停或撤销。",
|
|
298
|
+
"contacts.delegateFallback": "当前代表",
|
|
299
|
+
"contacts.add": "添加联系人",
|
|
300
|
+
"contacts.addRelationship": "添加并选择 AI",
|
|
301
|
+
"contacts.complete": "选择 AI",
|
|
302
|
+
"contacts.saving": "正在保存…",
|
|
303
|
+
"contacts.saveUnknownShort": "保存结果未知,请检查联系人列表。",
|
|
304
|
+
"contacts.edit": "修改",
|
|
305
|
+
"contacts.editName": "修改备注",
|
|
306
|
+
"contacts.delete": "删除本机联系人",
|
|
307
|
+
"contacts.empty": "没有联系人",
|
|
308
|
+
"contacts.emptySearch": "没有匹配结果",
|
|
309
|
+
"contacts.emptyBody": "点“添加联系人”,输入对方的灵信号或昵称。",
|
|
310
|
+
"contacts.addSummary": "输入对方的灵信号或昵称。",
|
|
311
|
+
"contacts.addById": "添加联系人",
|
|
312
|
+
"contacts.selectTitle": "选择一个联系人",
|
|
313
|
+
"contacts.selectBody": "联系人摘要会显示在这里。",
|
|
314
|
+
"contacts.relationshipSummary": "关系与授权",
|
|
315
|
+
"contacts.message": "发消息",
|
|
316
|
+
"relationship.activeShort": "关系已建立",
|
|
317
|
+
"relationship.localShort": "本机联系人",
|
|
318
|
+
"relationship.unsynced": "关系状态未同步",
|
|
319
|
+
"requests.unsynced": "联系申请还没有同步。请检查网络,再点“刷新”。",
|
|
320
|
+
"requests.summary": "处理联系申请、联系关系和屏蔽。",
|
|
321
|
+
"contacts.search": "搜索联系人和联系申请",
|
|
322
|
+
"contacts.searchPlaceholder": "搜索联系人",
|
|
323
|
+
"contacts.addTitle": "添加联系人",
|
|
324
|
+
"contacts.editTitle": "修改联系人",
|
|
325
|
+
"contacts.hellolynkId": "灵信号",
|
|
326
|
+
"contacts.displayName": "备注名称",
|
|
327
|
+
"contacts.editConflict": "这个联系人刚在别处被改过,你的修改没有保存。请重新打开最新的联系人再改。",
|
|
328
|
+
"contacts.deleteConflict": "这个联系人刚在别处被改过,没有删除。请看一下最新状态,再重新确认。",
|
|
329
|
+
"contacts.editUnknown": "联系人保存结果未知,请刷新确认。",
|
|
330
|
+
"contacts.deleteUnknown": "联系人删除结果未知,请刷新确认。",
|
|
331
|
+
"contacts.deleteConfirmTitle": "确认只删除这台电脑上的联系人?",
|
|
332
|
+
"contacts.deleteConfirmBody": "删除这台电脑上的这个联系人和对应的 AI 权限,不能恢复。",
|
|
333
|
+
"contacts.deleteConfirm": "确认删除本机联系人",
|
|
334
|
+
"discovery.title": "搜索联系人",
|
|
335
|
+
"discovery.body": "输入对方的灵信号或昵称。",
|
|
336
|
+
"discovery.mode": "搜索方式",
|
|
337
|
+
"discovery.modeId": "完整灵信号",
|
|
338
|
+
"discovery.modeNickname": "精确昵称",
|
|
339
|
+
"discovery.query": "搜索内容",
|
|
340
|
+
"discovery.idPlaceholder": "粘贴对方完整的灵信号",
|
|
341
|
+
"discovery.nicknamePlaceholder": "输入完整昵称",
|
|
342
|
+
"discovery.search": "搜索",
|
|
343
|
+
"discovery.searching": "正在搜索…",
|
|
344
|
+
"discovery.searchQuota": "今日搜索剩余 {remaining}/{limit}",
|
|
345
|
+
"discovery.empty": "没有找到。请核对灵信号或昵称是否完整、拼写正确。",
|
|
346
|
+
"discovery.unknown": "搜索结果未知,请重试。",
|
|
347
|
+
"discovery.timeout": "搜索超时,请重试。",
|
|
348
|
+
"discovery.stale": "搜索结果已过期,请重新搜索。",
|
|
349
|
+
"discovery.unnamed": "未命名联系人",
|
|
350
|
+
"discovery.nicknamePrivacy": "按昵称搜到的结果不会显示对方的灵信号。",
|
|
351
|
+
"discovery.selfName": "我",
|
|
352
|
+
"discovery.selfInstances": "我的其他 AI",
|
|
353
|
+
"discovery.chooseSelfInstance": "选择 AI",
|
|
354
|
+
"discovery.loadingInstances": "正在加载 AI…",
|
|
355
|
+
"instances.selfEmpty": "选择你的另一个 AI,再开始会话。",
|
|
356
|
+
"instances.selfDirectoryEmpty": "尚未找到其他已登记的 AI。连接另一个客户端后刷新。",
|
|
357
|
+
"discovery.intro": "介绍语(选填)",
|
|
358
|
+
"discovery.introWeight": "{weight}/40",
|
|
359
|
+
"discovery.send": "发送联系申请",
|
|
360
|
+
"discovery.sending": "正在发送…",
|
|
361
|
+
"discovery.sent": "已发送",
|
|
362
|
+
"discovery.deliveryUnknown": "发送结果未知,请到“联系申请”里确认。",
|
|
363
|
+
"discovery.waiting": "申请已发送,等待对方接受。",
|
|
364
|
+
"discovery.accepted": "对方已接受,正在同步。完成后就可以选择要添加的 AI。",
|
|
365
|
+
"discovery.aiAfterConsent": "对方同意后,可选择要添加的 AI。",
|
|
366
|
+
"discovery.sendQuota": "今天还可向此人发送 {remaining}/{limit} 次申请",
|
|
367
|
+
"discovery.error.query": "请输入完整的灵信号或完整的昵称。",
|
|
368
|
+
"discovery.error.searchQuota": "今天的搜索次数已用完,请在额度恢复后再搜索。",
|
|
369
|
+
"discovery.error.intro": "介绍语格式无效。",
|
|
370
|
+
"discovery.error.introLong": "介绍语过长。",
|
|
371
|
+
"discovery.error.introCharacter": "介绍语里不能有换行或看不见的特殊字符。",
|
|
372
|
+
"discovery.error.introLink": "介绍语不能包含链接、域名或邮箱地址。",
|
|
373
|
+
"discovery.error.recipientUnavailable": "申请未发送。对方暂时无法接收联系申请,请对方打开 HelloLynk 并完成客户端连接后再试。",
|
|
374
|
+
"discovery.error.recipientEndpointAmbiguous": "申请未发送。系统暂时无法确定对方接收申请的客户端,请稍后再试。",
|
|
375
|
+
"discovery.error.targetExpired": "搜索目标已过期或上下文已变化,请重新搜索。",
|
|
376
|
+
"requests.title": "联系申请",
|
|
377
|
+
"requests.empty": "没有匹配的本机联系申请。",
|
|
378
|
+
"requests.incomingTitle": "收到的联系申请",
|
|
379
|
+
"requests.incomingEmpty": "没有匹配的收到申请。",
|
|
380
|
+
"requests.incomingPageEmpty": "本页没有匹配的收到申请,可前后翻页查看。",
|
|
381
|
+
"requests.outgoingTitle": "发出的联系申请",
|
|
382
|
+
"requests.outgoingEmpty": "没有匹配的发出申请。",
|
|
383
|
+
"requests.outgoingPageEmpty": "本页没有匹配的发出申请,可前后翻页查看。",
|
|
384
|
+
"requests.unknownSender": "未命名申请人",
|
|
385
|
+
"requests.unknownRecipient": "未命名接收方",
|
|
386
|
+
"requests.intro": "介绍语",
|
|
387
|
+
"requests.pending": "等待你决定",
|
|
388
|
+
"requests.outgoingPending": "等待对方决定",
|
|
389
|
+
"requests.frozen": "等待重新核对",
|
|
390
|
+
"requests.accept": "接受",
|
|
391
|
+
"requests.acceptFor": "接受 {name} 的申请",
|
|
392
|
+
"requests.reject": "拒绝",
|
|
393
|
+
"requests.block": "屏蔽",
|
|
394
|
+
"requests.cancel": "取消发出的申请",
|
|
395
|
+
"requests.cancelConfirmTitle": "确认取消这条发出的联系申请?",
|
|
396
|
+
"requests.cancelConfirmBody": "撤回这条发出的联系申请。",
|
|
397
|
+
"requests.cancelConfirm": "确认取消申请",
|
|
398
|
+
"requests.outgoingTerminal": "这条申请的状态是“{state}”,不能再取消。",
|
|
399
|
+
"requests.loadMore": "下一页",
|
|
400
|
+
"requests.previousPage": "上一页",
|
|
401
|
+
"requests.firstPage": "回到第一页",
|
|
402
|
+
"requests.pageNumber": "第 {page} 页",
|
|
403
|
+
"requests.loadingMore": "正在加载…",
|
|
404
|
+
"requests.loadMoreLabel": "加载下一页收到和发出的联系申请",
|
|
405
|
+
"requests.decisionUnknown.accept": "上一次接受的结果未知,请点“重新核对状态”。",
|
|
406
|
+
"requests.decisionUnknown.reject": "上一次拒绝的结果未知,请点“重新核对状态”。",
|
|
407
|
+
"requests.decisionUnknown.block": "上一次屏蔽的结果未知,请点“重新核对状态”。",
|
|
408
|
+
"requests.recoveryRequired": "这条申请需要先重新核对,才能继续处理。核对完成前,不能操作联系申请。",
|
|
409
|
+
"requests.notActionable": "现在还不能确认这条申请能否处理,所以先不让操作。请稍后刷新再看。",
|
|
410
|
+
"requests.recover": "重新核对状态",
|
|
411
|
+
"requests.recoverWorking": "正在重新核对…",
|
|
412
|
+
"requests.recoverChecking": "正在重新核对这条申请的状态。",
|
|
413
|
+
"requests.recoverFailed": "核对没有成功,也没有重复提交你的决定。可以再点一次“重新核对状态”。",
|
|
414
|
+
"requests.recoverUnknown": "重新核对结果未知,请刷新确认。",
|
|
415
|
+
"requests.recoveredPending": "已核对:申请仍在等待决定。若要继续,请重新选择一次操作。",
|
|
416
|
+
"requests.recoveredTerminal": "已核对:这条申请的状态是“{state}”,没有重复提交你的决定。",
|
|
417
|
+
"requests.terminal": "这条申请的状态是“{state}”,不需要再处理。",
|
|
418
|
+
"requests.clearResolvedTitle": "清理已处理联系申请",
|
|
419
|
+
"requests.clearResolvedBody": "删除本机已处理的联系申请记录,等待中的申请保留。",
|
|
420
|
+
"requests.clearResolvedAction": "清理已处理记录",
|
|
421
|
+
"requests.clearResolvedConfirmTitle": "确认清理本机已处理联系申请?",
|
|
422
|
+
"requests.clearResolvedConfirmBody": "删除本机已处理的联系申请记录,不能恢复。等待中的申请保留。",
|
|
423
|
+
"requests.clearResolvedConfirm": "确认清理本机记录",
|
|
424
|
+
"requests.clearResolvedPending": "正在清理…",
|
|
425
|
+
"requests.clearResolvedZero": "没有可清理的记录。",
|
|
426
|
+
"requests.clearResolvedCount": "已清理 {count} 条已处理的联系申请记录。",
|
|
427
|
+
"requests.clearResolvedResumeScheduled": "正在尝试恢复接收联系申请。",
|
|
428
|
+
"requests.clearResolvedResumeAttempted": "已尝试恢复接收联系申请。如果仍显示暂停,请再点一次清理。",
|
|
429
|
+
"requests.clearResolvedRetryRequired": "接收联系申请仍暂停,请再点一次清理。",
|
|
430
|
+
"requests.clearResolvedUnknown": "清理结果未知,请刷新确认;确认之前不能再清理。",
|
|
431
|
+
"relationships.title": "联系关系",
|
|
432
|
+
"relationships.empty": "没有匹配的联系关系。",
|
|
433
|
+
"relationships.unknown": "未命名联系人",
|
|
434
|
+
"relationships.end": "结束联系关系",
|
|
435
|
+
"relationships.endConfirmTitle": "确认结束这段联系关系?",
|
|
436
|
+
"relationships.endConfirmBody": "结束后你们不能再互发消息,已有的聊天记录保留。",
|
|
437
|
+
"relationships.endConfirm": "确认结束联系关系",
|
|
438
|
+
"relationships.ended": "已结束联系关系。",
|
|
439
|
+
"blocks.title": "屏蔽列表",
|
|
440
|
+
"blocks.empty": "没有匹配的屏蔽记录。",
|
|
441
|
+
"blocks.unknown": "未命名联系人",
|
|
442
|
+
"blocks.remove": "解除屏蔽",
|
|
443
|
+
"blocks.removeConfirmTitle": "确认解除屏蔽?",
|
|
444
|
+
"blocks.removeConfirmBody": "解除屏蔽后,联系关系和 AI 权限需要重新设置。",
|
|
445
|
+
"blocks.removeConfirm": "确认解除屏蔽",
|
|
446
|
+
"lifecycle.unknown": "结果未知,请刷新确认;确认之前这一项不能再操作。",
|
|
447
|
+
"security.title": "安全中心",
|
|
448
|
+
"security.body": "看看这台电脑上的连接和安全状态。消息正文只保存在这台电脑上。",
|
|
449
|
+
"security.host": "本机 HelloLynk",
|
|
450
|
+
"security.hostBody": "这台电脑上 HelloLynk 的连接状态。",
|
|
451
|
+
"security.delegate": "当前代表",
|
|
452
|
+
"security.delegateUnavailable": "未标注代表名称",
|
|
453
|
+
"security.authorizationVersion": "授权版本 {version}",
|
|
454
|
+
"security.currentDelegate": "当前授权代表",
|
|
455
|
+
"security.authorizedContacts": "已授权联系人",
|
|
456
|
+
"security.authorizedContactsBody": "你的 AI 可自主收发的联系人",
|
|
457
|
+
"security.authorizedContactsCount.one": "{count} 个联系人",
|
|
458
|
+
"security.authorizedContactsCount.other": "{count} 个联系人",
|
|
459
|
+
"security.connectedClientBody": "这个客户端和 HelloLynk 的连接状态。",
|
|
460
|
+
"security.clientType.codex": "Codex",
|
|
461
|
+
"security.clientType.openclaw": "OpenClaw",
|
|
462
|
+
"security.clientType.trae-work": "TRAE Work",
|
|
463
|
+
"security.clientType.workbuddy": "WorkBuddy",
|
|
464
|
+
"security.clientType.claude-code": "Claude Code",
|
|
465
|
+
"security.clientType.cursor": "Cursor",
|
|
466
|
+
"security.clientType.dsh": "DSH",
|
|
467
|
+
"security.clientType.unknown": "未知客户端",
|
|
468
|
+
"portal.opening": "正在打开…",
|
|
469
|
+
"portal.openFailed": "打开失败,点此重试",
|
|
470
|
+
"portal.devices": "设备与撤销",
|
|
471
|
+
"portal.disconnect": "解除连接",
|
|
472
|
+
"portal.devicesExternal": "在浏览器中打开设备与撤销",
|
|
473
|
+
"settings.title": "设置",
|
|
474
|
+
"settings.body": "这台电脑上的 HelloLynk 设置。",
|
|
475
|
+
"settings.language": "界面语言",
|
|
476
|
+
"settings.contract": "HelloLynk 通讯版本",
|
|
477
|
+
"settings.savedLocal": "保存在本机浏览器",
|
|
478
|
+
"settings.sessionOnly": "当前会话有效,尚未保存在本机浏览器",
|
|
479
|
+
"module.empty": "这里还没有内容。",
|
|
480
|
+
"list.empty.title": "还没有会话",
|
|
481
|
+
"list.empty.search": "没有找到匹配的本机记录。",
|
|
482
|
+
"list.empty.search.title": "没有匹配的会话",
|
|
483
|
+
"list.empty.unread.title": "暂无未读会话",
|
|
484
|
+
"list.empty.unread.body": "切换到“全部”查看所有会话。",
|
|
485
|
+
"list.empty.body": "你的 AI 收到或发出消息后,会话会显示在这里。",
|
|
486
|
+
"host.online": "已连接",
|
|
487
|
+
"host.localOnly": "离线 · 可看本机记录",
|
|
488
|
+
"host.localOnlyHint": "断网时仍可查看和整理本机记录、调整本地设置。需要联网的操作恢复连接后再试。",
|
|
489
|
+
"host.unavailable": "未连接 · 请重新打开客户端",
|
|
490
|
+
"status.connecting": "正在连接",
|
|
491
|
+
"status.online": "在线",
|
|
492
|
+
"status.offline": "离线",
|
|
493
|
+
"status.rebind-required": "需要重新连接",
|
|
494
|
+
"status.error": "异常",
|
|
495
|
+
"status.available": "可用",
|
|
496
|
+
"status.unavailable": "暂不可用",
|
|
497
|
+
"status.verification-required": "连接待检查",
|
|
498
|
+
"status.connected": "已连接",
|
|
499
|
+
"status.disconnected": "未连接",
|
|
500
|
+
"status.stale": "状态待刷新",
|
|
501
|
+
"status.accepted": "已接受",
|
|
502
|
+
"status.rejected": "已拒绝",
|
|
503
|
+
"status.cancelled": "已取消",
|
|
504
|
+
"status.blocked": "已屏蔽",
|
|
505
|
+
"status.expired": "已过期",
|
|
506
|
+
"status.active": "有效",
|
|
507
|
+
"status.ended": "已结束",
|
|
508
|
+
"status.local": "仅本机联系人",
|
|
509
|
+
"action.back": "返回",
|
|
510
|
+
"action.retry": "重试",
|
|
511
|
+
"action.refresh": "刷新",
|
|
512
|
+
"action.refreshMessages": "刷新消息",
|
|
513
|
+
"action.refreshing": "正在刷新",
|
|
514
|
+
"action.refreshHint": "没看到新消息?点刷新",
|
|
515
|
+
"action.working": "正在处理…",
|
|
516
|
+
"action.status.pending": "正在处理…",
|
|
517
|
+
"action.status.refreshing": "正在更新状态…",
|
|
518
|
+
"action.status.ok": "已完成。",
|
|
519
|
+
"action.status.failed": "操作失败,可以再试一次。",
|
|
520
|
+
"action.status.unknown": "结果未知,请刷新确认。",
|
|
521
|
+
"action.status.conflict": "本机数据已在另一处发生变化。已刷新最新状态,没有覆盖新内容。",
|
|
522
|
+
"action.error.input": "输入的内容不对,请检查灵信号或备注。",
|
|
523
|
+
"action.error.missing": "这条本机记录已不存在,页面已刷新。",
|
|
524
|
+
"action.error.authorization": "你的 AI 没有权限做这件事。",
|
|
525
|
+
"action.error.stateConflict": "记录状态已变化,页面已刷新,没有覆盖新内容。",
|
|
526
|
+
"action.error.unavailable": "这个客户端不支持这个操作。",
|
|
527
|
+
"action.error.required": "请填写灵信号和备注名称。",
|
|
528
|
+
"action.error.hellolynkId": "请输入完整的灵信号。",
|
|
529
|
+
"action.error.grantExpired": "这次点击已过期,操作没有执行。请再点一次。",
|
|
530
|
+
"action.error.windowFull": "页面已刷新,本次操作没有执行。请重新点击。",
|
|
531
|
+
"action.error.windowExpired": "这次操作来自已过期的页面,结果未知。请先看一下记录,不要重复发送。",
|
|
532
|
+
"action.error.grantInvalid": "这次点击已失效或已用过,没有重复执行。请再点一次。",
|
|
533
|
+
"action.error.humanSendTextTooLarge": "这条消息太长,最多约 6800 字,请分成几条。",
|
|
534
|
+
"action.cancel": "取消",
|
|
535
|
+
"action.save": "保存",
|
|
536
|
+
"navigation.back": "返回",
|
|
537
|
+
"navigation.forward": "前进",
|
|
538
|
+
"common.retry": "重试",
|
|
539
|
+
"common.refresh": "刷新",
|
|
540
|
+
"common.close": "关闭",
|
|
541
|
+
"accessibility.skipToContent": "跳到主要内容",
|
|
542
|
+
"accessibility.threadList": "聊天列表",
|
|
543
|
+
"accessibility.conversation": "当前会话",
|
|
544
|
+
"accessibility.status": "HelloLynk 通讯状态",
|
|
545
|
+
},
|
|
546
|
+
en: {
|
|
547
|
+
"nativeNotice.source": "HelloLynk automatic reminder (not sent by the user)",
|
|
548
|
+
"nativeNotice.batch": "{source}: Incoming messages: {count}. Read with hellolynk_claim_message, batchId={batchId}",
|
|
549
|
+
"nativeNotice.claudeIncoming": "{source}: Incoming messages: {count}. Read with hellolynk_claim_message, batchId={batchId}",
|
|
550
|
+
"nativeNotice.claudeReply": "{source}: Replies: {count}. Read with hellolynk_claim_message, batchId={batchId}",
|
|
551
|
+
"nativeNotice.claudeTask": "Separate HelloLynk conversation. Call hellolynk_claim_message this turn, batchId={batchId}.",
|
|
552
|
+
"nativeNotice.independentTitle": "HelloLynk · Separate conversation",
|
|
553
|
+
"nativeNotice.externalHeader": "[HelloLynk message]",
|
|
554
|
+
"nativeNotice.senderUnavailable": "Name not set",
|
|
555
|
+
"nativeNotice.agentUnavailable": "Name unavailable",
|
|
556
|
+
"nativeNotice.identityDetails": "available only in HelloLynk Messaging identity verification details",
|
|
557
|
+
"contacts.more": "More",
|
|
558
|
+
"contacts.moreFor": "More actions for {name}",
|
|
559
|
+
"contacts.saved": "Contact saved",
|
|
560
|
+
"contacts.permissionsSaved": "Permissions updated",
|
|
561
|
+
"contacts.permissionEnable": "Allow",
|
|
562
|
+
"contacts.permissionRevoke": "Revoke",
|
|
563
|
+
"contacts.permissionPending": "Updating…",
|
|
564
|
+
"instances.removed": "AI removed",
|
|
565
|
+
"instances.permissions": "AI permissions",
|
|
566
|
+
"authorization.title": "Autonomous messaging",
|
|
567
|
+
"details.aiRoute": "Conversation AIs",
|
|
568
|
+
"instances.count": "{count} AIs added",
|
|
569
|
+
"instances.createdAt": "Created {time}",
|
|
570
|
+
"instances.title": "Their AIs",
|
|
571
|
+
"instances.directoryHint": "Only AIs registered by this person and currently available appear here. You can set a local note for the one you choose.",
|
|
572
|
+
"instances.current": "Current AI",
|
|
573
|
+
"instances.local": "My current AI: {name}",
|
|
574
|
+
"instances.recipient": "Recipient AI",
|
|
575
|
+
"instances.choose": "Choose their AI",
|
|
576
|
+
"instances.route": "{local} → {peer}",
|
|
577
|
+
"instances.unavailable": "Unnamed AI",
|
|
578
|
+
"instances.open": "Open conversation",
|
|
579
|
+
"instances.add": "Add AI",
|
|
580
|
+
"instances.addNamed": "Add {name} · {client}",
|
|
581
|
+
"instances.addSelected": "Add this AI",
|
|
582
|
+
"instances.added": "Added",
|
|
583
|
+
"instances.backToContact": "Back to contact",
|
|
584
|
+
"instances.directoryStale": "The AI list is out of date. Refresh to continue.",
|
|
585
|
+
"instances.directoryUnknown": "The AI list could not be confirmed. Refresh to try again.",
|
|
586
|
+
"instances.localName": "Local display name (optional)",
|
|
587
|
+
"instances.editConflict": "This AI was changed elsewhere, so your edit was not saved. Check the latest version and edit again.",
|
|
588
|
+
"instances.editUnknown": "The note’s save result is unknown. Refresh to confirm.",
|
|
589
|
+
"instances.editName": "Edit name",
|
|
590
|
+
"instances.saveName": "Save name",
|
|
591
|
+
"instances.remove": "Remove this AI",
|
|
592
|
+
"instances.empty": "Add their AI to start a conversation.",
|
|
593
|
+
"instances.noMore": "No more AIs available to add.",
|
|
594
|
+
"instances.authorizationHint": "Authorize each AI entry separately.",
|
|
595
|
+
"app.name": "HelloLynk",
|
|
596
|
+
"app.title": "HelloLynk Messaging",
|
|
597
|
+
"shell.personalSpace": "Personal space",
|
|
598
|
+
"language.label": "Interface language",
|
|
599
|
+
"language.zh-CN": "中文",
|
|
600
|
+
"language.en": "EN",
|
|
601
|
+
"nav.messages": "Messages",
|
|
602
|
+
"nav.inbox": "Messages",
|
|
603
|
+
"nav.contacts": "Contacts",
|
|
604
|
+
"nav.contactsPending": "Contacts, pending requests: {count}",
|
|
605
|
+
"nav.contactRequestsPending": "Contact requests, pending: {count}",
|
|
606
|
+
"nav.contactRequests": "Contact requests",
|
|
607
|
+
"nav.security": "Security",
|
|
608
|
+
"nav.settings": "Settings",
|
|
609
|
+
"filter.label": "Conversation filter",
|
|
610
|
+
"filter.all": "All",
|
|
611
|
+
"filter.unread": "Unread",
|
|
612
|
+
"thread.sendFailed": "Send failed",
|
|
613
|
+
"shell.conversations": "Conversations",
|
|
614
|
+
"search.label": "Search chats",
|
|
615
|
+
"search.placeholder": "Search chats",
|
|
616
|
+
"search.open": "Search",
|
|
617
|
+
"search.close": "Close search",
|
|
618
|
+
"state.loading.title": "Opening HelloLynk",
|
|
619
|
+
"state.loading.body": "Reading messages stored on this device.",
|
|
620
|
+
"state.connecting.title": "Connecting to HelloLynk on this computer",
|
|
621
|
+
"state.connecting.body": "The first connection may take a little longer. Please keep your client open.",
|
|
622
|
+
"state.empty.title": "No conversations yet",
|
|
623
|
+
"state.empty.body": "Real conversations will appear here when messages arrive.",
|
|
624
|
+
"state.noResults.title": "No matching results",
|
|
625
|
+
"state.noResults.body": "Adjust the search terms or conversation filter.",
|
|
626
|
+
"state.error.title": "HelloLynk couldn't open",
|
|
627
|
+
"state.error.body": "Couldn’t load your messages. Try again; if it keeps failing, tell your AI the error code below.",
|
|
628
|
+
"state.error.timeout": "Reading timed out. Please try again.",
|
|
629
|
+
"state.error.sessionExpired": "This page has expired. Go back to your client and reopen HelloLynk Messaging.",
|
|
630
|
+
"state.error.reconnecting": "Connection interrupted. Reconnecting.",
|
|
631
|
+
"state.error.unreachable": "The page can’t reach HelloLynk on this computer. Go back to your client and reopen HelloLynk Messaging.",
|
|
632
|
+
"state.error.backendUnreachable": "The page can’t reach HelloLynk on this computer for now. Try again; if that doesn’t help, go back to your client and reopen HelloLynk Messaging.",
|
|
633
|
+
"state.error.hostConnection": "The connection to HelloLynk was lost. Go back to your client and reopen HelloLynk Messaging.",
|
|
634
|
+
"state.error.authorization": "This page’s connection didn’t pass its check. Go back to your client and reopen HelloLynk Messaging.",
|
|
635
|
+
"state.error.invalidData": "What was loaded is incomplete. Try again; if it keeps failing, tell your AI the error code.",
|
|
636
|
+
"state.error.versionMismatch": "The HelloLynk versions in your clients don’t match. Update them all to the same version, then close and reopen your clients.",
|
|
637
|
+
"state.error.notConnectedTitle": "Connect your HelloLynk",
|
|
638
|
+
"state.error.cursorNotConnected": "Enter your HelloLynk ID to bring your messages and contacts here.",
|
|
639
|
+
"connection.welcome": "Welcome to HelloLynk",
|
|
640
|
+
"connection.hint": "First time on this computer? We will guide you to confirm it on the website. Already confirmed computers continue directly.",
|
|
641
|
+
"connection.start": "Connect HelloLynk",
|
|
642
|
+
"connection.recovered": "Connected. The AI name used for this connection is “{name}”.",
|
|
643
|
+
"connection.help": "Confirm once. Reconnect whenever you open HelloLynk.",
|
|
644
|
+
"connection.commandHelp": "Reopen HelloLynk from this client. If you still cannot connect, tell your local AI what happened.",
|
|
645
|
+
"connection.openFailed": "The connection prompt could not open. Reopen HelloLynk Messaging, then click “Connect HelloLynk”.",
|
|
646
|
+
"connection.keyLink": "Get a KEY on the website ↗",
|
|
647
|
+
"connectionForm.idLabel": "HelloLynk ID",
|
|
648
|
+
"connectionForm.account": "Find my HelloLynk ID on the website ↗",
|
|
649
|
+
"connectionForm.nameLabel": "Name this AI (optional)",
|
|
650
|
+
"connectionForm.nameHelp": "Use 1–40 Chinese characters, English letters, numbers, _ or -. No spaces; English letters are saved in lowercase.",
|
|
651
|
+
"connectionForm.namePlaceholder": "For example: work-codex",
|
|
652
|
+
"connectionForm.confirmTitle": "Confirm this computer on the website first",
|
|
653
|
+
"connectionForm.confirmHelp": "After confirming on the website, return here for step 2.",
|
|
654
|
+
"connectionForm.step1": "Step 1: Open website to confirm ↗",
|
|
655
|
+
"connectionForm.step2": "Step 2: I have confirmed — continue",
|
|
656
|
+
"connectionForm.connect": "Connect HelloLynk",
|
|
657
|
+
"connectionForm.connectingButton": "Connecting…",
|
|
658
|
+
"connectionForm.errorCode": "Error: ",
|
|
659
|
+
"connectionForm.message.idRequired": "Paste your complete HelloLynk ID, including hellolynk: at the beginning.",
|
|
660
|
+
"connectionForm.message.idInvalid": "This HelloLynk ID can’t be used. Copy the complete ID again from the website.",
|
|
661
|
+
"connectionForm.message.nameInvalid": "The AI name is too long or contains invisible characters. Edit it and connect again.",
|
|
662
|
+
"connectionForm.message.connecting": "Connecting. Please wait.",
|
|
663
|
+
"connectionForm.message.networkCertificate": "The current network’s certificate can’t be trusted. Check the computer clock and proxy.",
|
|
664
|
+
"connectionForm.message.networkAddress": "Can’t reach HelloLynk’s network address. Check the network and proxy.",
|
|
665
|
+
"connectionForm.message.networkProxy": "The current proxy can’t be used for this connection. Give the error code below to your AI.",
|
|
666
|
+
"connectionForm.message.confirmationRequired": "One more step: click “Step 1” below to confirm this computer on the website.",
|
|
667
|
+
"connectionForm.message.enrollmentNameInvalid": "New AI names must use 1–40 Chinese characters, English letters, numbers, _ or -, with no spaces.",
|
|
668
|
+
"connectionForm.message.nameTaken": "Another AI on your account already uses this name. Choose another, or leave it empty for an automatic name.",
|
|
669
|
+
"connectionForm.message.busy": "The previous connection is still in progress. Try again shortly; your entries are kept.",
|
|
670
|
+
"connectionForm.message.resultPending": "The connection result has not arrived. Try again shortly; your entries are kept.",
|
|
671
|
+
"connectionForm.message.powershell7Missing": "This computer doesn’t have PowerShell 7 (pwsh), which HelloLynk needs. Install it, then reopen your client.",
|
|
672
|
+
"connectionForm.message.credentialHelperUnavailable": "Couldn’t start PowerShell 7 (pwsh); it may not be installed. Install it, then reopen your client. If it is installed, give the error code below to your AI.",
|
|
673
|
+
"connectionForm.message.existingConnection": "This computer already has a connection. Check that this HelloLynk ID belongs to your account.",
|
|
674
|
+
"connectionForm.message.failed": "The connection didn’t complete. Give the error code below to your AI.",
|
|
675
|
+
"connectionForm.message.websiteOpenFailed": "Couldn’t open the website. Click again, or open hellolynk.com/account in your browser yourself.",
|
|
676
|
+
"connectionForm.message.existingSetup": "This client already has connection data. Repair the connection by following its update instructions.",
|
|
677
|
+
"connectionForm.message.savedConnectionConflict": "This computer has a different saved connection. Give the error code below to your AI to restore it.",
|
|
678
|
+
"connectionForm.message.authorizationExpired": "Authorization for this attempt has expired. Give the error code below to your AI to restore the connection.",
|
|
679
|
+
"disconnect.title": "Disconnect this client?",
|
|
680
|
+
"disconnect.copy": "History stays with the previous account. You can connect another account afterward.",
|
|
681
|
+
"disconnect.progress": "Disconnecting…",
|
|
682
|
+
"disconnect.unknown": "Disconnection is not confirmed. Closing this window will check the connection status. Error: ",
|
|
683
|
+
"disconnect.checkStatus": "Check status",
|
|
684
|
+
"state.error.disconnectUnknown": "The connection status is not confirmed. Refresh to check it before deciding whether to connect again.",
|
|
685
|
+
"state.error.disconnectIncomplete": "The previous disconnect was interrupted. Choose Disconnect account to finish.",
|
|
686
|
+
"state.error.accountChanged": "This client's account has changed. Refresh to continue.",
|
|
687
|
+
"state.error.notificationTitle": "Live updates paused",
|
|
688
|
+
"state.error.notificationBody": "The page will refresh by itself once the connection is back. You can also try again now.",
|
|
689
|
+
"state.error.code": "Error code",
|
|
690
|
+
"state.stale.title": "This content may be out of date",
|
|
691
|
+
"state.stale.body": "Click Refresh, then continue.",
|
|
692
|
+
"state.conflict.title": "Local data changed",
|
|
693
|
+
"state.conflict.body": "Click Refresh to see the latest content.",
|
|
694
|
+
"thread.unreadCount": "{count} unread",
|
|
695
|
+
"thread.noMessages": "No messages yet",
|
|
696
|
+
"thread.incoming": "Received",
|
|
697
|
+
"thread.outgoing": "Sent",
|
|
698
|
+
"conversation.selectThread": "Select a conversation",
|
|
699
|
+
"conversation.messages": "Conversation messages",
|
|
700
|
+
"conversation.empty.title": "Select a conversation",
|
|
701
|
+
"conversation.empty.body": "Messages will appear here.",
|
|
702
|
+
"conversation.noMessages.title": "No messages yet",
|
|
703
|
+
"conversation.noMessages.body": "Write a message below to start the conversation.",
|
|
704
|
+
"conversation.noMessages.readonly": "There are no local messages to show in this chat.",
|
|
705
|
+
"conversation.today": "Today",
|
|
706
|
+
"message.you": "You",
|
|
707
|
+
"message.details": "Message details",
|
|
708
|
+
"message.detailsHint": "Who sent this message, and through which AI.",
|
|
709
|
+
"message.principal": "Account",
|
|
710
|
+
"message.delegate": "AI",
|
|
711
|
+
"message.intent": "Initiated by",
|
|
712
|
+
"message.scope": "Permission",
|
|
713
|
+
"message.scopeValue.textSend": "Send text messages",
|
|
714
|
+
"message.intentValue.preauthorizedContact": "Pre-authorized by the sender; sent by an AI on its own",
|
|
715
|
+
"message.intentValue.nativeDialog": "Confirmed by the sender in a confirmation window",
|
|
716
|
+
"message.intentValue.explicitSend": "Sent by an AI through HelloLynk",
|
|
717
|
+
"message.provenanceMissing": "Not recorded historically",
|
|
718
|
+
"message.markRead": "Mark as read",
|
|
719
|
+
"message.markAllRead": "Mark all as read",
|
|
720
|
+
"message.markThreadRead": "Mark all read",
|
|
721
|
+
"message.autoRead": "Auto-read after AI",
|
|
722
|
+
"message.autoReadHint": "When on, once your AI reads an incoming message in this chat it counts as read for you. When off, mark messages yourself. For existing unread messages, click Mark all read.",
|
|
723
|
+
"action.on": "On",
|
|
724
|
+
"action.off": "Off",
|
|
725
|
+
"message.markingRead": "Marking…",
|
|
726
|
+
"message.markAllReadHint": "Mark unread messages in this client as read",
|
|
727
|
+
"message.markThreadReadHint": "Mark unread messages in this conversation as read",
|
|
728
|
+
"message.sent": "Sent",
|
|
729
|
+
"message.delivered": "Delivered",
|
|
730
|
+
"message.expired": "Expired · No automatic AI processing",
|
|
731
|
+
"message.deleteRead": "Delete read message from this device",
|
|
732
|
+
"message.deleteSent": "Delete local message",
|
|
733
|
+
"history.manage": "Manage",
|
|
734
|
+
"history.active": "Chats",
|
|
735
|
+
"history.archived": "Archived",
|
|
736
|
+
"history.archivedEmpty": "No archived chats",
|
|
737
|
+
"history.delete": "Delete chat",
|
|
738
|
+
"history.deleteTitle": "Delete this chat?",
|
|
739
|
+
"history.deleteArchived": "Delete all archived chats",
|
|
740
|
+
"history.deleteArchivedTitle": "Delete all archived chats on this device?",
|
|
741
|
+
"history.deleteHint": "Deletes this chat from this computer, including unread messages. This cannot be undone.",
|
|
742
|
+
"history.deleted": "Chat deleted.",
|
|
743
|
+
"history.hide": "Archive",
|
|
744
|
+
"history.restore": "Move to chats",
|
|
745
|
+
"history.clear": "Clear local history",
|
|
746
|
+
"history.clearTitle": "Clear this chat on this device?",
|
|
747
|
+
"history.clearHint": "Deletes read incoming and sent messages from this computer. This cannot be undone. Unread and undelivered messages are kept.",
|
|
748
|
+
"history.autoArchiveOn": "Archive after 24 hours of inactivity: On",
|
|
749
|
+
"history.autoArchiveOff": "Archive after 24 hours of inactivity: Off",
|
|
750
|
+
"history.range": "Clear range",
|
|
751
|
+
"history.rangeAll": "All",
|
|
752
|
+
"history.rangeDay": "Before one day ago",
|
|
753
|
+
"history.rangeWeek": "Before 7 days ago",
|
|
754
|
+
"history.rangeMonth": "Before 30 days ago",
|
|
755
|
+
"history.rangeDate": "Before a chosen date",
|
|
756
|
+
"history.date": "Before date",
|
|
757
|
+
"history.counting": "Counting…",
|
|
758
|
+
"history.countUnavailable": "Couldn’t count. Refresh and try again.",
|
|
759
|
+
"history.estimate": "Can clear {count} messages with about {size} of body text; keeps {unread} unread and {outgoing} undelivered.",
|
|
760
|
+
"history.cleared": "Cleared {count}; kept {unread} unread and {outgoing} undelivered.",
|
|
761
|
+
"history.changed": "This chat just changed. Close this window and start the clean-up again.",
|
|
762
|
+
"history.unreadProtected": "This chat still has unread messages. Mark them as read, then remove it from the list.",
|
|
763
|
+
"history.outgoingProtected": "This chat still has messages that haven’t been sent, so it can’t be removed from the list yet.",
|
|
764
|
+
"action.close": "Close",
|
|
765
|
+
"outbox.noText": "No message body to display.",
|
|
766
|
+
"outbox.retry": "Retry",
|
|
767
|
+
"outbox.retrying": "Retrying…",
|
|
768
|
+
"outbox.inline.failed": "Send failed",
|
|
769
|
+
"outbox.error.connectivity": "Connection unavailable",
|
|
770
|
+
"outbox.error.encryption": "Encrypted connection unavailable",
|
|
771
|
+
"outbox.error.message_time": "The message expired or its sending time does not match. Check the computer clock.",
|
|
772
|
+
"outbox.error.device_identity_changed": "Device connection information has changed. Reconnect and try again.",
|
|
773
|
+
"outbox.error.external_contact_disabled": "This AI is no longer open to friends. Choose another AI its owner has made available.",
|
|
774
|
+
"composer.status.notDelivered": "Not delivered. Your draft is saved. Follow the note below the message before sending again.",
|
|
775
|
+
"outbox.error.authorization": "Send authorization changed. Check permissions.",
|
|
776
|
+
"outbox.error.rate_limit": "Too many requests. Try again shortly.",
|
|
777
|
+
"outbox.error.validation": "Message or recipient details changed. Check before retrying.",
|
|
778
|
+
"outbox.error.reply_target_deleted": "The original conversation was deleted. Your reply was not delivered.",
|
|
779
|
+
"outbox.resend": "Resend in a new conversation",
|
|
780
|
+
"outbox.resendTitle": "Allow a new conversation for this reply?",
|
|
781
|
+
"outbox.resendHint": "Send only the saved reply to the original recipient as a new message. The task will not run again.",
|
|
782
|
+
"outbox.resendConfirm": "Allow and send saved reply",
|
|
783
|
+
"outbox.resendCreated": "A resend message was created. Check its delivery status.",
|
|
784
|
+
"outbox.resend.sent": "The saved reply was delivered. The task was not run again.",
|
|
785
|
+
"outbox.resend.not-delivered": "The resend has not been delivered. Check the new message's status.",
|
|
786
|
+
"outbox.resend.unknown": "Resend status is unknown. Check the new message; do not send another copy.",
|
|
787
|
+
"outbox.inline.unknown": "Send result unknown. Don’t resend yet",
|
|
788
|
+
"outbox.inline.noRetryAvailable": "Retry isn’t available here. Ask your AI to send it again.",
|
|
789
|
+
"composer.placeholder": "Write a message…",
|
|
790
|
+
"composer.label": "Send a message",
|
|
791
|
+
"composer.recipient": "Sending to {name} · {hellolynkId}",
|
|
792
|
+
"composer.send": "Send",
|
|
793
|
+
"composer.awaitingConfirmation": "Awaiting confirmation",
|
|
794
|
+
"composer.hint": "Enter to send · Shift+Enter for a new line",
|
|
795
|
+
"composer.status.awaitingApproval": "Waiting for your approval in the confirmation window. Your draft is preserved.",
|
|
796
|
+
"composer.status.cancelled": "You cancelled sending. Your draft is preserved; edit it or send again.",
|
|
797
|
+
"composer.status.expired": "Send confirmation expired. Your draft is preserved; click Send again.",
|
|
798
|
+
"composer.status.invalidated": "This send confirmation is no longer valid. Check your connection before sending again. Your draft is preserved.",
|
|
799
|
+
"composer.status.sendFailed": "The send result is unknown. Your draft is kept. Check this message’s status in the conversation before sending again.",
|
|
800
|
+
"composer.status.ok": "Sent.",
|
|
801
|
+
"composer.status.failed": "Sending failed. Your draft is kept; you can send again.",
|
|
802
|
+
"composer.status.unknown": "The send outcome is unknown. Your message is preserved; do not send it again.",
|
|
803
|
+
"globalSend.title": "New message",
|
|
804
|
+
"globalSend.contact": "Contact",
|
|
805
|
+
"globalSend.message": "Message",
|
|
806
|
+
"globalSend.placeholder": "Write a message…",
|
|
807
|
+
"globalSend.contactMissing": "The selected contact is no longer in your contacts. Choose again.",
|
|
808
|
+
"pagination.loading": "Loading…",
|
|
809
|
+
"pagination.threads": "Next page",
|
|
810
|
+
"pagination.previousThreads": "Previous page",
|
|
811
|
+
"pagination.firstThreads": "Back to first page",
|
|
812
|
+
"pagination.pageNumber": "Page {page}",
|
|
813
|
+
"pagination.messages": "Load earlier messages",
|
|
814
|
+
"pagination.historyLimit": "Showing 200 messages. Ask your AI to find older messages.",
|
|
815
|
+
"pagination.newer": "Load newer messages",
|
|
816
|
+
"pagination.latest": "Jump to latest",
|
|
817
|
+
"details.title": "Conversation details",
|
|
818
|
+
"details.open": "Conversation settings",
|
|
819
|
+
"details.close": "Close details",
|
|
820
|
+
"details.relationship": "Relationship",
|
|
821
|
+
"details.status": "Status",
|
|
822
|
+
"details.established": "Established",
|
|
823
|
+
"details.notAvailable": "Not available",
|
|
824
|
+
"details.actions": "Manage",
|
|
825
|
+
"details.contactTitle": "Contact details",
|
|
826
|
+
"details.authorization": "AI authorization",
|
|
827
|
+
"details.localBoundary": "Data location",
|
|
828
|
+
"details.messages": "Messages and history",
|
|
829
|
+
"details.onDevice": "Stored on this device",
|
|
830
|
+
"details.cloud": "Cloud message bodies",
|
|
831
|
+
"details.none": "Not stored",
|
|
832
|
+
"authorization.active": "Autonomous AI messaging on",
|
|
833
|
+
"authorization.human": "You confirm sends",
|
|
834
|
+
"authorization.activeShort": "Autonomous AI messaging on",
|
|
835
|
+
"authorization.humanShort": "You confirm sends",
|
|
836
|
+
"authorization.enable": "Allow autonomous AI messaging",
|
|
837
|
+
"authorization.revoke": "Revoke autonomous AI messaging",
|
|
838
|
+
"contacts.title": "Contacts",
|
|
839
|
+
"contacts.body": "Contacts and permissions stay on this device, where you can review, pause, or revoke them.",
|
|
840
|
+
"contacts.delegateFallback": "Current AI",
|
|
841
|
+
"contacts.add": "Add contact",
|
|
842
|
+
"contacts.addRelationship": "Add and choose AI",
|
|
843
|
+
"contacts.complete": "Choose AI",
|
|
844
|
+
"contacts.saving": "Saving…",
|
|
845
|
+
"contacts.saveUnknownShort": "Save result unknown. Check your contact list.",
|
|
846
|
+
"contacts.edit": "Edit",
|
|
847
|
+
"contacts.editName": "Edit note",
|
|
848
|
+
"contacts.delete": "Delete local contact",
|
|
849
|
+
"contacts.empty": "No contacts",
|
|
850
|
+
"contacts.emptySearch": "No matches",
|
|
851
|
+
"contacts.emptyBody": "Click Add contact, then enter their HelloLynk ID or nickname.",
|
|
852
|
+
"contacts.addSummary": "Enter their HelloLynk ID or nickname.",
|
|
853
|
+
"contacts.addById": "Add contact",
|
|
854
|
+
"contacts.selectTitle": "Select a contact",
|
|
855
|
+
"contacts.selectBody": "A contact summary will appear here.",
|
|
856
|
+
"contacts.relationshipSummary": "Relationship and authorization",
|
|
857
|
+
"contacts.message": "Message",
|
|
858
|
+
"relationship.activeShort": "Relationship active",
|
|
859
|
+
"relationship.localShort": "Local contact",
|
|
860
|
+
"relationship.unsynced": "Relationship status not synced",
|
|
861
|
+
"requests.unsynced": "Contact requests haven’t synced. Check your network, then click Refresh.",
|
|
862
|
+
"requests.summary": "Handle contact requests, relationships, and blocks.",
|
|
863
|
+
"contacts.search": "Search contacts and contact requests",
|
|
864
|
+
"contacts.searchPlaceholder": "Search contacts",
|
|
865
|
+
"contacts.addTitle": "Add contact",
|
|
866
|
+
"contacts.editTitle": "Edit contact",
|
|
867
|
+
"contacts.hellolynkId": "HelloLynk ID",
|
|
868
|
+
"contacts.displayName": "Display name",
|
|
869
|
+
"contacts.editConflict": "This contact was changed elsewhere, so your edit was not saved. Reopen the latest version and edit again.",
|
|
870
|
+
"contacts.deleteConflict": "This contact was changed elsewhere and nothing was deleted. Check the latest state, then confirm again.",
|
|
871
|
+
"contacts.editUnknown": "The contact’s save result is unknown. Refresh to confirm.",
|
|
872
|
+
"contacts.deleteUnknown": "The contact’s delete result is unknown. Refresh to confirm.",
|
|
873
|
+
"contacts.deleteConfirmTitle": "Delete only this device's contact?",
|
|
874
|
+
"contacts.deleteConfirmBody": "Deletes this contact and its AI permissions from this computer. This cannot be undone.",
|
|
875
|
+
"contacts.deleteConfirm": "Confirm local contact deletion",
|
|
876
|
+
"discovery.title": "Search contacts",
|
|
877
|
+
"discovery.body": "Enter their HelloLynk ID or nickname.",
|
|
878
|
+
"discovery.mode": "Search by",
|
|
879
|
+
"discovery.modeId": "Full HelloLynk ID",
|
|
880
|
+
"discovery.modeNickname": "Exact nickname",
|
|
881
|
+
"discovery.query": "Search",
|
|
882
|
+
"discovery.idPlaceholder": "Paste their full HelloLynk ID",
|
|
883
|
+
"discovery.nicknamePlaceholder": "Enter the complete nickname",
|
|
884
|
+
"discovery.search": "Search",
|
|
885
|
+
"discovery.searching": "Searching…",
|
|
886
|
+
"discovery.searchQuota": "Searches remaining today: {remaining}/{limit}",
|
|
887
|
+
"discovery.empty": "No contact found. Check that the HelloLynk ID or nickname is complete and spelled correctly.",
|
|
888
|
+
"discovery.unknown": "Search result unknown. Try again.",
|
|
889
|
+
"discovery.timeout": "Search timed out. Try again.",
|
|
890
|
+
"discovery.stale": "Search results expired. Search again.",
|
|
891
|
+
"discovery.unnamed": "Unnamed contact",
|
|
892
|
+
"discovery.nicknamePrivacy": "Nickname results don’t show the other person’s HelloLynk ID.",
|
|
893
|
+
"discovery.selfName": "Me",
|
|
894
|
+
"discovery.selfInstances": "My other AIs",
|
|
895
|
+
"discovery.chooseSelfInstance": "Choose AI",
|
|
896
|
+
"discovery.loadingInstances": "Loading AIs…",
|
|
897
|
+
"instances.selfEmpty": "Choose another one of your AIs to start a conversation.",
|
|
898
|
+
"instances.selfDirectoryEmpty": "No other registered AI was found. Connect HelloLynk in another client, then refresh.",
|
|
899
|
+
"discovery.intro": "Introduction (optional)",
|
|
900
|
+
"discovery.introWeight": "{weight}/40",
|
|
901
|
+
"discovery.send": "Send contact request",
|
|
902
|
+
"discovery.sending": "Sending…",
|
|
903
|
+
"discovery.sent": "Sent",
|
|
904
|
+
"discovery.deliveryUnknown": "The send result is unknown. Check Contact requests to confirm.",
|
|
905
|
+
"discovery.waiting": "Request sent. Waiting for the other person.",
|
|
906
|
+
"discovery.accepted": "Accepted. Syncing now; once done you can choose which AI to add.",
|
|
907
|
+
"discovery.aiAfterConsent": "After the other person accepts, you can choose which AI to add.",
|
|
908
|
+
"discovery.sendQuota": "Requests remaining for this person today: {remaining}/{limit}",
|
|
909
|
+
"discovery.error.query": "Enter a complete HelloLynk ID or a complete nickname.",
|
|
910
|
+
"discovery.error.searchQuota": "Today's search limit has been reached. Search again after the quota resets.",
|
|
911
|
+
"discovery.error.intro": "Invalid introduction format.",
|
|
912
|
+
"discovery.error.introLong": "The introduction is too long.",
|
|
913
|
+
"discovery.error.introCharacter": "Introductions cannot contain line breaks or invisible special characters.",
|
|
914
|
+
"discovery.error.introLink": "Introductions cannot contain links, domains, or email addresses.",
|
|
915
|
+
"discovery.error.recipientUnavailable": "The request was not sent. The other person cannot receive contact requests right now. Ask them to open HelloLynk and finish connecting a client, then try again.",
|
|
916
|
+
"discovery.error.recipientEndpointAmbiguous": "The request was not sent. The service cannot currently determine which of the other person's clients should receive it. Please try again later.",
|
|
917
|
+
"discovery.error.targetExpired": "The search target expired or its context changed. Search again.",
|
|
918
|
+
"requests.title": "Contact requests",
|
|
919
|
+
"requests.empty": "No matching local contact requests.",
|
|
920
|
+
"requests.incomingTitle": "Incoming contact requests",
|
|
921
|
+
"requests.incomingEmpty": "No matching incoming requests.",
|
|
922
|
+
"requests.incomingPageEmpty": "No matching incoming requests on this page; check other pages.",
|
|
923
|
+
"requests.outgoingTitle": "Outgoing contact requests",
|
|
924
|
+
"requests.outgoingEmpty": "No matching outgoing requests.",
|
|
925
|
+
"requests.outgoingPageEmpty": "No matching outgoing requests on this page; check other pages.",
|
|
926
|
+
"requests.unknownSender": "Unnamed requester",
|
|
927
|
+
"requests.unknownRecipient": "Unnamed recipient",
|
|
928
|
+
"requests.intro": "Introduction",
|
|
929
|
+
"requests.pending": "Waiting for your decision",
|
|
930
|
+
"requests.outgoingPending": "Waiting for the other person",
|
|
931
|
+
"requests.frozen": "Waiting for recheck",
|
|
932
|
+
"requests.accept": "Accept",
|
|
933
|
+
"requests.acceptFor": "Accept the request from {name}",
|
|
934
|
+
"requests.reject": "Reject",
|
|
935
|
+
"requests.block": "Block",
|
|
936
|
+
"requests.cancel": "Cancel outgoing request",
|
|
937
|
+
"requests.cancelConfirmTitle": "Cancel this outgoing contact request?",
|
|
938
|
+
"requests.cancelConfirmBody": "Withdraws this outgoing contact request.",
|
|
939
|
+
"requests.cancelConfirm": "Confirm request cancellation",
|
|
940
|
+
"requests.outgoingTerminal": "This request’s status is “{state}”, so it can no longer be cancelled.",
|
|
941
|
+
"requests.loadMore": "Next page",
|
|
942
|
+
"requests.previousPage": "Previous page",
|
|
943
|
+
"requests.firstPage": "First page",
|
|
944
|
+
"requests.pageNumber": "Page {page}",
|
|
945
|
+
"requests.loadingMore": "Loading…",
|
|
946
|
+
"requests.loadMoreLabel": "Load the next page of incoming and outgoing contact requests",
|
|
947
|
+
"requests.decisionUnknown.accept": "The result of the last Accept is unknown. Click Recheck status.",
|
|
948
|
+
"requests.decisionUnknown.reject": "The result of the last Reject is unknown. Click Recheck status.",
|
|
949
|
+
"requests.decisionUnknown.block": "The result of the last Block is unknown. Click Recheck status.",
|
|
950
|
+
"requests.recoveryRequired": "This request must be rechecked before you can continue. Contact requests stay locked until then.",
|
|
951
|
+
"requests.notActionable": "It isn’t clear yet whether this request can still be handled, so actions are off. Refresh and look again shortly.",
|
|
952
|
+
"requests.recover": "Recheck status",
|
|
953
|
+
"requests.recoverWorking": "Rechecking…",
|
|
954
|
+
"requests.recoverChecking": "Rechecking this request’s status.",
|
|
955
|
+
"requests.recoverFailed": "The recheck didn’t succeed, and your decision was not submitted again. You can click Recheck status again.",
|
|
956
|
+
"requests.recoverUnknown": "The recheck result is unknown. Refresh to confirm.",
|
|
957
|
+
"requests.recoveredPending": "Rechecked: the request is still pending. Choose a decision again if you want to continue.",
|
|
958
|
+
"requests.recoveredTerminal": "Rechecked: this request’s status is “{state}”. Your decision was not submitted again.",
|
|
959
|
+
"requests.terminal": "This request’s status is “{state}”; nothing more to do.",
|
|
960
|
+
"requests.clearResolvedTitle": "Clear processed contact requests",
|
|
961
|
+
"requests.clearResolvedBody": "Removes processed contact request records from this device. Pending requests are kept.",
|
|
962
|
+
"requests.clearResolvedAction": "Clear processed records",
|
|
963
|
+
"requests.clearResolvedConfirmTitle": "Clear processed contact requests on this device?",
|
|
964
|
+
"requests.clearResolvedConfirmBody": "Removes processed contact request records from this device. This cannot be undone. Pending requests are kept.",
|
|
965
|
+
"requests.clearResolvedConfirm": "Confirm local cleanup",
|
|
966
|
+
"requests.clearResolvedPending": "Clearing…",
|
|
967
|
+
"requests.clearResolvedZero": "There were no processed records to clear.",
|
|
968
|
+
"requests.clearResolvedCount": "Cleared {count} processed contact-request records.",
|
|
969
|
+
"requests.clearResolvedResumeScheduled": "Trying to resume receiving contact requests.",
|
|
970
|
+
"requests.clearResolvedResumeAttempted": "Tried to resume receiving contact requests. If it still shows as paused, click clear again.",
|
|
971
|
+
"requests.clearResolvedRetryRequired": "Receiving contact requests is still paused. Click clear again.",
|
|
972
|
+
"requests.clearResolvedUnknown": "The clear result is unknown. Refresh to confirm; clearing is locked until then.",
|
|
973
|
+
"relationships.title": "Relationships",
|
|
974
|
+
"relationships.empty": "No matching relationships.",
|
|
975
|
+
"relationships.unknown": "Unnamed contact",
|
|
976
|
+
"relationships.end": "End relationship",
|
|
977
|
+
"relationships.endConfirmTitle": "End this relationship?",
|
|
978
|
+
"relationships.endConfirmBody": "You will no longer be able to message each other. Existing chat history is kept.",
|
|
979
|
+
"relationships.endConfirm": "Confirm ending relationship",
|
|
980
|
+
"relationships.ended": "The relationship has ended.",
|
|
981
|
+
"blocks.title": "Blocked people",
|
|
982
|
+
"blocks.empty": "No matching blocked people.",
|
|
983
|
+
"blocks.unknown": "Unnamed contact",
|
|
984
|
+
"blocks.remove": "Unblock",
|
|
985
|
+
"blocks.removeConfirmTitle": "Unblock this person?",
|
|
986
|
+
"blocks.removeConfirmBody": "After unblocking, set up the relationship and AI permissions again if you need them.",
|
|
987
|
+
"blocks.removeConfirm": "Confirm unblock",
|
|
988
|
+
"lifecycle.unknown": "The result is unknown. Refresh to confirm; this item stays locked until then.",
|
|
989
|
+
"security.title": "Security",
|
|
990
|
+
"security.body": "See the connection and security status of this computer. Message text is stored only on this computer.",
|
|
991
|
+
"security.host": "This computer",
|
|
992
|
+
"security.hostBody": "Connection status of HelloLynk on this computer.",
|
|
993
|
+
"security.delegate": "Current AI",
|
|
994
|
+
"security.delegateUnavailable": "No AI name available",
|
|
995
|
+
"security.authorizationVersion": "Authorization version {version}",
|
|
996
|
+
"security.currentDelegate": "Current authorized AI",
|
|
997
|
+
"security.authorizedContacts": "Authorized contacts",
|
|
998
|
+
"security.authorizedContactsBody": "Contacts your AI can message on its own",
|
|
999
|
+
"security.authorizedContactsCount.one": "{count} contact",
|
|
1000
|
+
"security.authorizedContactsCount.other": "{count} contacts",
|
|
1001
|
+
"security.connectedClientBody": "This client’s connection status with HelloLynk.",
|
|
1002
|
+
"security.clientType.codex": "Codex",
|
|
1003
|
+
"security.clientType.openclaw": "OpenClaw",
|
|
1004
|
+
"security.clientType.trae-work": "TRAE Work",
|
|
1005
|
+
"security.clientType.workbuddy": "WorkBuddy",
|
|
1006
|
+
"security.clientType.claude-code": "Claude Code",
|
|
1007
|
+
"security.clientType.cursor": "Cursor",
|
|
1008
|
+
"security.clientType.dsh": "DSH",
|
|
1009
|
+
"security.clientType.unknown": "Unknown client",
|
|
1010
|
+
"portal.opening": "Opening…",
|
|
1011
|
+
"portal.openFailed": "Could not open. Try again",
|
|
1012
|
+
"portal.devices": "Devices & revocation",
|
|
1013
|
+
"portal.disconnect": "Disconnect",
|
|
1014
|
+
"portal.devicesExternal": "Open devices and revocation in your browser",
|
|
1015
|
+
"settings.title": "Settings",
|
|
1016
|
+
"settings.body": "HelloLynk settings for this computer.",
|
|
1017
|
+
"settings.language": "Interface language",
|
|
1018
|
+
"settings.contract": "HelloLynk Messaging version",
|
|
1019
|
+
"settings.savedLocal": "Saved in this local browser",
|
|
1020
|
+
"settings.sessionOnly": "Active for this session; not yet saved in this local browser",
|
|
1021
|
+
"module.empty": "There’s nothing here yet.",
|
|
1022
|
+
"list.empty.title": "No conversations yet",
|
|
1023
|
+
"list.empty.search": "No matching local records were found.",
|
|
1024
|
+
"list.empty.search.title": "No matching conversations",
|
|
1025
|
+
"list.empty.unread.title": "No unread conversations",
|
|
1026
|
+
"list.empty.unread.body": "Choose All to view all conversations.",
|
|
1027
|
+
"list.empty.body": "Conversations appear here once your AI receives or sends messages.",
|
|
1028
|
+
"host.online": "Connected",
|
|
1029
|
+
"host.localOnly": "Offline · local records only",
|
|
1030
|
+
"host.localOnlyHint": "You can view and organize local records and change local settings while offline. Reconnect for actions that need the network.",
|
|
1031
|
+
"host.unavailable": "Not connected · reopen your client",
|
|
1032
|
+
"status.connecting": "Connecting",
|
|
1033
|
+
"status.online": "Online",
|
|
1034
|
+
"status.offline": "Offline",
|
|
1035
|
+
"status.rebind-required": "Reconnect required",
|
|
1036
|
+
"status.error": "Error",
|
|
1037
|
+
"status.available": "Available",
|
|
1038
|
+
"status.unavailable": "Unavailable",
|
|
1039
|
+
"status.verification-required": "Connection check required",
|
|
1040
|
+
"status.connected": "Connected",
|
|
1041
|
+
"status.disconnected": "Disconnected",
|
|
1042
|
+
"status.stale": "Refresh required",
|
|
1043
|
+
"status.accepted": "Accepted",
|
|
1044
|
+
"status.rejected": "Rejected",
|
|
1045
|
+
"status.cancelled": "Cancelled",
|
|
1046
|
+
"status.blocked": "Blocked",
|
|
1047
|
+
"status.expired": "Expired",
|
|
1048
|
+
"status.active": "Active",
|
|
1049
|
+
"status.ended": "Ended",
|
|
1050
|
+
"status.local": "Local contact",
|
|
1051
|
+
"action.back": "Back",
|
|
1052
|
+
"action.retry": "Try again",
|
|
1053
|
+
"action.refresh": "Refresh",
|
|
1054
|
+
"action.refreshMessages": "Refresh messages",
|
|
1055
|
+
"action.refreshing": "Refreshing",
|
|
1056
|
+
"action.refreshHint": "Missing new messages? Refresh",
|
|
1057
|
+
"action.working": "Working…",
|
|
1058
|
+
"action.status.pending": "Working…",
|
|
1059
|
+
"action.status.refreshing": "Updating status…",
|
|
1060
|
+
"action.status.ok": "Done.",
|
|
1061
|
+
"action.status.failed": "It didn’t go through. You can try again.",
|
|
1062
|
+
"action.status.unknown": "The outcome is unknown. Refresh to confirm.",
|
|
1063
|
+
"action.status.conflict": "Local data changed elsewhere. The latest state was loaded and newer content was not overwritten.",
|
|
1064
|
+
"action.error.input": "That input isn’t valid. Check the HelloLynk ID or display name.",
|
|
1065
|
+
"action.error.missing": "This local record no longer exists. The page has been refreshed.",
|
|
1066
|
+
"action.error.authorization": "Your AI doesn’t have permission to do this.",
|
|
1067
|
+
"action.error.stateConflict": "The record state changed. The page was refreshed and newer content was not overwritten.",
|
|
1068
|
+
"action.error.unavailable": "This client doesn’t support that action.",
|
|
1069
|
+
"action.error.required": "Enter a HelloLynk ID and display name.",
|
|
1070
|
+
"action.error.hellolynkId": "Enter a complete HelloLynk ID.",
|
|
1071
|
+
"action.error.grantExpired": "That click expired and nothing ran. Click again.",
|
|
1072
|
+
"action.error.windowFull": "The page refreshed; this action did not run. Click again to continue.",
|
|
1073
|
+
"action.error.windowExpired": "This action came from an expired page, so its result is unknown. Check the records before sending again.",
|
|
1074
|
+
"action.error.grantInvalid": "That click is no longer valid or was already used; nothing ran twice. Click again.",
|
|
1075
|
+
"action.error.humanSendTextTooLarge": "This message is too long. Keep it to about 6,800 Chinese characters, or split it.",
|
|
1076
|
+
"action.cancel": "Cancel",
|
|
1077
|
+
"action.save": "Save",
|
|
1078
|
+
"navigation.back": "Back",
|
|
1079
|
+
"navigation.forward": "Forward",
|
|
1080
|
+
"common.retry": "Try again",
|
|
1081
|
+
"common.refresh": "Refresh",
|
|
1082
|
+
"common.close": "Close",
|
|
1083
|
+
"accessibility.skipToContent": "Skip to main content",
|
|
1084
|
+
"accessibility.threadList": "Chat list",
|
|
1085
|
+
"accessibility.conversation": "Current conversation",
|
|
1086
|
+
"accessibility.status": "HelloLynk Messaging status",
|
|
1087
|
+
},
|
|
1088
|
+
});
|
|
1089
|
+
|
|
1090
|
+
const REFERENCE_KEYS = Object.keys(WORKBENCH_TRANSLATIONS.en).sort();
|
|
1091
|
+
for (const locale of SUPPORTED_WORKBENCH_LOCALES) {
|
|
1092
|
+
const keys = Object.keys(WORKBENCH_TRANSLATIONS[locale] ?? {}).sort();
|
|
1093
|
+
if (keys.length !== REFERENCE_KEYS.length || keys.some((key, index) => key !== REFERENCE_KEYS[index])) {
|
|
1094
|
+
throw new Error(`workbench_i18n_catalog_mismatch:${locale}`);
|
|
1095
|
+
}
|
|
1096
|
+
}
|
|
1097
|
+
|
|
1098
|
+
export function normalizeWorkbenchLocale(value) {
|
|
1099
|
+
const candidates = Array.isArray(value) ? value : [value];
|
|
1100
|
+
for (const candidate of candidates) {
|
|
1101
|
+
if (typeof candidate !== "string") continue;
|
|
1102
|
+
const normalized = candidate.trim().replaceAll("_", "-").toLowerCase();
|
|
1103
|
+
if (normalized === "zh" || normalized.startsWith("zh-")) return "zh-CN";
|
|
1104
|
+
if (normalized === "en" || normalized.startsWith("en-")) return "en";
|
|
1105
|
+
}
|
|
1106
|
+
return "en";
|
|
1107
|
+
}
|
|
1108
|
+
|
|
1109
|
+
export function translateWorkbench(locale, key, vars = {}) {
|
|
1110
|
+
const normalizedLocale = normalizeWorkbenchLocale(locale);
|
|
1111
|
+
const catalog = WORKBENCH_TRANSLATIONS[normalizedLocale];
|
|
1112
|
+
const message = catalog[String(key)];
|
|
1113
|
+
if (message == null) throw new Error(`workbench_i18n_key_missing:${String(key)}`);
|
|
1114
|
+
if (!vars || typeof vars !== "object" || Array.isArray(vars)) {
|
|
1115
|
+
throw new Error("workbench_i18n_vars_invalid");
|
|
1116
|
+
}
|
|
1117
|
+
return message.replace(/\{([A-Za-z][A-Za-z0-9_]*)\}/g, (_match, variable) => {
|
|
1118
|
+
if (!Object.hasOwn(vars, variable)) throw new Error(`workbench_i18n_variable_missing:${variable}`);
|
|
1119
|
+
return String(vars[variable]);
|
|
1120
|
+
});
|
|
1121
|
+
}
|
|
1122
|
+
|
|
1123
|
+
function deepFreeze(value) {
|
|
1124
|
+
if (!value || typeof value !== "object" || Object.isFrozen(value)) return value;
|
|
1125
|
+
for (const nested of Object.values(value)) deepFreeze(nested);
|
|
1126
|
+
return Object.freeze(value);
|
|
1127
|
+
}
|