herdr-remote 0.2.2 → 0.2.4
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 -121
- package/README.zh-CN.md +50 -0
- package/bin/herdr-remote.js +14 -15
- package/dist/tui.mjs +327 -199
- package/herdr-plugin.toml +7 -7
- package/package.json +4 -3
- package/src/i18n/en.js +76 -72
- package/src/i18n/zh.js +77 -73
- package/src/settings-model.js +44 -1
- package/src/updater.js +127 -23
package/herdr-plugin.toml
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
id = "herdr.remote.web"
|
|
2
2
|
name = "Herdr Remote Web"
|
|
3
|
-
version = "0.2.
|
|
3
|
+
version = "0.2.3"
|
|
4
4
|
min_herdr_version = "0.8.2"
|
|
5
|
-
description = "
|
|
5
|
+
description = "Browser access to Herdr workspaces via local or self-hosted relay"
|
|
6
6
|
platforms = ["linux", "macos"]
|
|
7
7
|
|
|
8
8
|
# No [[build]] steps: this package is installed from npm with its TUI bundle and
|
|
@@ -20,31 +20,31 @@ command = ["node", "bin/herdr-remote.js"]
|
|
|
20
20
|
|
|
21
21
|
[[actions]]
|
|
22
22
|
id = "configure"
|
|
23
|
-
title = "Configure
|
|
23
|
+
title = "Configure"
|
|
24
24
|
contexts = ["workspace", "pane"]
|
|
25
25
|
command = ["herdr", "plugin", "pane", "open", "--plugin", "herdr.remote.web", "--entrypoint", "config", "--placement", "zoomed", "--focus"]
|
|
26
26
|
|
|
27
27
|
[[actions]]
|
|
28
28
|
id = "start"
|
|
29
|
-
title = "Start
|
|
29
|
+
title = "Start"
|
|
30
30
|
contexts = ["workspace", "pane"]
|
|
31
31
|
command = ["node", "bin/herdr-remote.js", "start"]
|
|
32
32
|
|
|
33
33
|
[[actions]]
|
|
34
34
|
id = "stop"
|
|
35
|
-
title = "Stop
|
|
35
|
+
title = "Stop"
|
|
36
36
|
contexts = ["workspace", "pane"]
|
|
37
37
|
command = ["node", "bin/herdr-remote.js", "stop"]
|
|
38
38
|
|
|
39
39
|
[[actions]]
|
|
40
40
|
id = "status"
|
|
41
|
-
title = "
|
|
41
|
+
title = "Status"
|
|
42
42
|
contexts = ["workspace", "pane"]
|
|
43
43
|
command = ["node", "bin/herdr-remote.js", "status"]
|
|
44
44
|
|
|
45
45
|
[[actions]]
|
|
46
46
|
id = "pair"
|
|
47
|
-
title = "
|
|
47
|
+
title = "Pair"
|
|
48
48
|
contexts = ["workspace", "pane"]
|
|
49
49
|
command = ["node", "bin/herdr-remote.js", "pair"]
|
|
50
50
|
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "herdr-remote",
|
|
3
|
-
"version": "0.2.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.2.4",
|
|
4
|
+
"description": "Browser access to Herdr workspaces: plugin, host connector, and configuration TUI",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -32,7 +32,8 @@
|
|
|
32
32
|
"dist",
|
|
33
33
|
"src",
|
|
34
34
|
"herdr-plugin.toml",
|
|
35
|
-
"config.example.json"
|
|
35
|
+
"config.example.json",
|
|
36
|
+
"README.zh-CN.md"
|
|
36
37
|
],
|
|
37
38
|
"scripts": {
|
|
38
39
|
"build": "node scripts/build-tui.mjs",
|
package/src/i18n/en.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
module.exports = {
|
|
7
7
|
'app.name': 'Herdr Remote',
|
|
8
|
-
'app.tagline': 'Remote browser access to
|
|
8
|
+
'app.tagline': 'Remote browser access to Herdr workspaces',
|
|
9
9
|
|
|
10
10
|
'common.yes': 'Yes',
|
|
11
11
|
'common.no': 'No',
|
|
@@ -41,12 +41,12 @@ module.exports = {
|
|
|
41
41
|
|
|
42
42
|
'mode.local': 'This machine only',
|
|
43
43
|
'mode.lan': 'Local network / Tailscale',
|
|
44
|
-
'mode.official': 'Official relay
|
|
44
|
+
'mode.official': 'Official relay',
|
|
45
45
|
'mode.remote': 'Self-hosted relay',
|
|
46
|
-
'mode.local.description': '
|
|
47
|
-
'mode.lan.description': '
|
|
48
|
-
'mode.official.description': '
|
|
49
|
-
'mode.remote.description': '
|
|
46
|
+
'mode.local.description': 'Relay listens on 127.0.0.1. Local browser only.',
|
|
47
|
+
'mode.lan.description': 'Relay listens on 0.0.0.0. Accessible over LAN or Tailscale.',
|
|
48
|
+
'mode.official.description': 'Connect via official relay. No server needed.',
|
|
49
|
+
'mode.remote.description': 'Connect via self-hosted relay for external access.',
|
|
50
50
|
|
|
51
51
|
'overview.title': 'Status',
|
|
52
52
|
'overview.mode': 'Access mode',
|
|
@@ -62,21 +62,21 @@ module.exports = {
|
|
|
62
62
|
'overview.relayRemote': 'remote, {url}',
|
|
63
63
|
'overview.socketMissing': 'not found — is Herdr running?',
|
|
64
64
|
'overview.unreachable': 'unreachable: {message}',
|
|
65
|
-
'overview.notStarted': 'Services
|
|
65
|
+
'overview.notStarted': 'Services not running. Open Services tab to start.',
|
|
66
66
|
|
|
67
67
|
'pair.title': 'Pair a device',
|
|
68
|
-
'pair.generate': 'Generate
|
|
69
|
-
'pair.regenerate': '
|
|
70
|
-
'pair.working': '
|
|
68
|
+
'pair.generate': 'Generate pairing code',
|
|
69
|
+
'pair.regenerate': 'Regenerate code',
|
|
70
|
+
'pair.working': 'Generating pairing code…',
|
|
71
71
|
'pair.code': 'Pairing code',
|
|
72
|
-
'pair.url': '
|
|
72
|
+
'pair.url': 'Access URL',
|
|
73
73
|
'pair.expires': 'Expires in {minutes} (at {time})',
|
|
74
|
-
'pair.expired': '
|
|
75
|
-
'pair.instructions': 'Open
|
|
76
|
-
'pair.qrHint': 'Scan
|
|
77
|
-
'pair.qrUnavailable': '
|
|
78
|
-
'pair.failed': 'Could not create
|
|
79
|
-
'pair.hostOffline': '
|
|
74
|
+
'pair.expired': 'Code expired. Generate a new one.',
|
|
75
|
+
'pair.instructions': 'Open URL and enter code to pair.',
|
|
76
|
+
'pair.qrHint': 'Scan QR code to open URL.',
|
|
77
|
+
'pair.qrUnavailable': 'Terminal too narrow for QR code; use URL above.',
|
|
78
|
+
'pair.failed': 'Could not create pairing code: {message}',
|
|
79
|
+
'pair.hostOffline': 'Relay has no workstation connected. Start services first.',
|
|
80
80
|
|
|
81
81
|
'services.title': 'Services',
|
|
82
82
|
'services.start': 'Start services',
|
|
@@ -87,58 +87,61 @@ module.exports = {
|
|
|
87
87
|
'services.restarted': 'Services restarted.',
|
|
88
88
|
'services.startFailed': 'Could not start services: {message}',
|
|
89
89
|
'services.stopFailed': 'Could not stop services: {message}',
|
|
90
|
-
'services.unsavedBlocked': '
|
|
91
|
-
'services.managedNotice': '
|
|
92
|
-
'services.logs': 'Recent
|
|
93
|
-
'services.logEmpty': 'No
|
|
90
|
+
'services.unsavedBlocked': 'Unsaved changes. Save before restarting.',
|
|
91
|
+
'services.managedNotice': 'Managed by {manager}; applied via keep-alive service.',
|
|
92
|
+
'services.logs': 'Recent logs',
|
|
93
|
+
'services.logEmpty': 'No logs.',
|
|
94
94
|
'services.logRelay': 'Relay',
|
|
95
95
|
'services.logHost': 'Host connector',
|
|
96
96
|
|
|
97
97
|
'relay.title': 'Relay settings',
|
|
98
98
|
'relay.settings': 'Settings',
|
|
99
|
+
'relay.locked': 'fixed',
|
|
100
|
+
'relay.officialFixed': 'The official relay address is fixed and cannot be edited.',
|
|
101
|
+
'relay.officialHint': 'Official relay: address is fixed and no password is needed.',
|
|
99
102
|
'relay.password': 'Relay password',
|
|
100
|
-
'relay.passwordHint': 'Must match RELAY_PASSWORD on
|
|
103
|
+
'relay.passwordHint': 'Must match RELAY_PASSWORD on relay. Leave empty if public.',
|
|
101
104
|
'relay.passwordSet': 'set',
|
|
102
|
-
'relay.passwordEmpty': 'not set (public
|
|
103
|
-
'relay.passwordSaved': 'Relay password saved. Restart
|
|
104
|
-
'relay.showPassword': 'Show
|
|
105
|
-
'relay.hidePassword': 'Hide
|
|
106
|
-
'relay.identity': 'Workstation
|
|
107
|
-
'relay.regenerate': 'Generate
|
|
108
|
-
'relay.regenerated': 'New workstation identity generated. Restart
|
|
109
|
-
'relay.envSnippet': '
|
|
110
|
-
'relay.envHint': 'Run this on the relay host.',
|
|
111
|
-
'relay.test': 'Test
|
|
105
|
+
'relay.passwordEmpty': 'not set (public)',
|
|
106
|
+
'relay.passwordSaved': 'Relay password saved. Restart services to apply.',
|
|
107
|
+
'relay.showPassword': 'Show password',
|
|
108
|
+
'relay.hidePassword': 'Hide password',
|
|
109
|
+
'relay.identity': 'Workstation ID',
|
|
110
|
+
'relay.regenerate': 'Generate new ID',
|
|
111
|
+
'relay.regenerated': 'New workstation identity generated. Restart services to re-register.',
|
|
112
|
+
'relay.envSnippet': 'Relay startup command',
|
|
113
|
+
'relay.envHint': 'Run this command on the relay host.',
|
|
114
|
+
'relay.test': 'Test relay connection',
|
|
112
115
|
'relay.testOk': 'Relay reachable: version {version}, {hosts} workstation(s) connected.',
|
|
113
116
|
'relay.testFailed': 'Relay unreachable: {message}',
|
|
114
|
-
'relay.selectAddress': 'Choose
|
|
117
|
+
'relay.selectAddress': 'Choose advertised address',
|
|
115
118
|
'relay.listenAddress': 'Listen address',
|
|
116
|
-
'relay.listenAddressHint': '
|
|
119
|
+
'relay.listenAddressHint': 'Server bind address. Browsers use advertised address below.',
|
|
117
120
|
'relay.addressTailscale': 'Tailscale',
|
|
118
121
|
'relay.addressLan': 'LAN',
|
|
119
122
|
'relay.addressVirtual': 'virtual',
|
|
120
123
|
'relay.addressLoopback': 'loopback',
|
|
121
|
-
'relay.noAddresses': 'No non-loopback addresses found.
|
|
122
|
-
'relay.docsHint': '
|
|
124
|
+
'relay.noAddresses': 'No non-loopback addresses found.',
|
|
125
|
+
'relay.docsHint': 'Self-hosting guide: docs/self-hosted-relay.md',
|
|
123
126
|
|
|
124
127
|
'keepalive.title': 'Keep-alive service',
|
|
125
128
|
'keepalive.manager': 'Manager',
|
|
126
129
|
'keepalive.state': 'State',
|
|
127
130
|
'keepalive.install': 'Install and start',
|
|
128
131
|
'keepalive.uninstall': 'Stop and remove',
|
|
129
|
-
'keepalive.restart': 'Restart
|
|
132
|
+
'keepalive.restart': 'Restart service',
|
|
130
133
|
'keepalive.installed': 'Keep-alive installed with {manager}.',
|
|
131
134
|
'keepalive.uninstalled': 'Keep-alive removed.',
|
|
132
135
|
'keepalive.restarted': 'Keep-alive service restarted.',
|
|
133
136
|
'keepalive.failed': 'Keep-alive operation failed: {message}',
|
|
134
137
|
'keepalive.unitPath': 'Unit file',
|
|
135
|
-
'keepalive.logsHint': '
|
|
136
|
-
'keepalive.linger': 'Start at boot
|
|
137
|
-
'keepalive.lingerEnabled': '
|
|
138
|
-
'keepalive.lingerDisabled': '
|
|
138
|
+
'keepalive.logsHint': 'View logs: {command}',
|
|
139
|
+
'keepalive.linger': 'Start at boot',
|
|
140
|
+
'keepalive.lingerEnabled': 'Start at boot enabled.',
|
|
141
|
+
'keepalive.lingerDisabled': 'Start at boot disabled (runs while logged in).',
|
|
139
142
|
'keepalive.enableLinger': 'Enable start at boot',
|
|
140
|
-
'keepalive.lingerDone': '
|
|
141
|
-
'keepalive.fallbackNote': 'No system service manager
|
|
143
|
+
'keepalive.lingerDone': 'Start at boot enabled for {username}.',
|
|
144
|
+
'keepalive.fallbackNote': 'No system service manager found; background process will not survive reboot.',
|
|
142
145
|
|
|
143
146
|
'herdr.title': 'Herdr integration',
|
|
144
147
|
'herdr.socketPath': 'Socket path',
|
|
@@ -146,16 +149,16 @@ module.exports = {
|
|
|
146
149
|
'herdr.plugin': 'Plugin registration',
|
|
147
150
|
'herdr.pluginRegistered': 'Registered with Herdr.',
|
|
148
151
|
'herdr.pluginMissing': 'Not registered with Herdr.',
|
|
149
|
-
'herdr.register': 'Register
|
|
150
|
-
'herdr.unregister': 'Unregister
|
|
152
|
+
'herdr.register': 'Register as Herdr plugin',
|
|
153
|
+
'herdr.unregister': 'Unregister plugin',
|
|
151
154
|
'herdr.registerDone': 'Registered: {path}',
|
|
152
155
|
'herdr.unregisterDone': 'Plugin unregistered.',
|
|
153
156
|
'herdr.registerFailed': 'Registration failed: {message}',
|
|
154
|
-
'herdr.cliMissing': '
|
|
157
|
+
'herdr.cliMissing': 'Command herdr not found in PATH.',
|
|
155
158
|
|
|
156
159
|
'about.title': 'Language & about',
|
|
157
160
|
'about.language': 'Interface language',
|
|
158
|
-
'about.languageAuto': 'Follow
|
|
161
|
+
'about.languageAuto': 'Follow system ({detected})',
|
|
159
162
|
'about.languageZh': '中文',
|
|
160
163
|
'about.languageEn': 'English',
|
|
161
164
|
'about.version': 'Version',
|
|
@@ -166,20 +169,20 @@ module.exports = {
|
|
|
166
169
|
|
|
167
170
|
'wizard.title': 'First-time setup',
|
|
168
171
|
'wizard.step': 'Step {current} of {total}',
|
|
169
|
-
'wizard.languageTitle': 'Choose
|
|
170
|
-
'wizard.accessTitle': '
|
|
171
|
-
'wizard.accessHint': '
|
|
172
|
-
'wizard.addressTitle': '
|
|
173
|
-
'wizard.relayTitle': '
|
|
172
|
+
'wizard.languageTitle': 'Choose language',
|
|
173
|
+
'wizard.accessTitle': 'Access mode',
|
|
174
|
+
'wizard.accessHint': 'Can be changed later in Relay settings.',
|
|
175
|
+
'wizard.addressTitle': 'Browser access address',
|
|
176
|
+
'wizard.relayTitle': 'Relay server',
|
|
174
177
|
'wizard.relayUrlLabel': 'Relay URL (wss://…)',
|
|
175
|
-
'wizard.relayHint': '
|
|
178
|
+
'wizard.relayHint': 'Relay must be running. See docs/self-hosted-relay.md.',
|
|
176
179
|
'wizard.passwordTitle': 'Relay password',
|
|
177
|
-
'wizard.passwordHint': '
|
|
178
|
-
'wizard.finishTitle': '
|
|
180
|
+
'wizard.passwordHint': 'RELAY_PASSWORD of the relay. Leave empty if unset.',
|
|
181
|
+
'wizard.finishTitle': 'Finish',
|
|
179
182
|
'wizard.finishHint': 'Configuration will be saved to {path}.',
|
|
180
|
-
'wizard.startNow': 'Start
|
|
181
|
-
'wizard.installKeepalive': '
|
|
182
|
-
'wizard.finish': 'Save and
|
|
183
|
+
'wizard.startNow': 'Start services now',
|
|
184
|
+
'wizard.installKeepalive': 'Run in background',
|
|
185
|
+
'wizard.finish': 'Save and finish',
|
|
183
186
|
|
|
184
187
|
'field.mode': 'Access mode',
|
|
185
188
|
'field.port': 'Relay port',
|
|
@@ -195,15 +198,15 @@ module.exports = {
|
|
|
195
198
|
'placeholder.none': 'none',
|
|
196
199
|
|
|
197
200
|
'error.invalidMode': 'Unknown access mode.',
|
|
198
|
-
'error.invalidPort': '
|
|
199
|
-
'error.invalidLanHost': '
|
|
200
|
-
'error.invalidRelayUrl': '
|
|
201
|
-
'error.invalidPublicUrl': '
|
|
201
|
+
'error.invalidPort': 'Port must be a number between 1 and 65535.',
|
|
202
|
+
'error.invalidLanHost': 'Browser address must be a reachable LAN or Tailscale address, not loopback or 0.0.0.0.',
|
|
203
|
+
'error.invalidRelayUrl': 'Relay URL must start with wss://, ws://, https:// or http://.',
|
|
204
|
+
'error.invalidPublicUrl': 'Browser URL must start with https:// or http:// and cannot use 0.0.0.0 or ::.',
|
|
202
205
|
'error.invalidLanguage': 'Unknown language.',
|
|
203
206
|
'error.invalidKeepalive': 'Unknown keep-alive manager.',
|
|
204
207
|
'error.unknownField': 'Unknown setting.',
|
|
205
|
-
'error.remoteUrlRequired': '
|
|
206
|
-
'error.saveFailed': 'Could not save
|
|
208
|
+
'error.remoteUrlRequired': 'Relay URL is required for self-hosted relay mode.',
|
|
209
|
+
'error.saveFailed': 'Could not save configuration: {message}',
|
|
207
210
|
|
|
208
211
|
'hint.navigate': '↑↓ move',
|
|
209
212
|
'hint.select': '↵ select',
|
|
@@ -214,20 +217,21 @@ module.exports = {
|
|
|
214
217
|
'hint.mouseOn': 'm mouse off',
|
|
215
218
|
'hint.mouseOff': 'm mouse on',
|
|
216
219
|
'hint.mouseUnsupported': 'mouse unsupported',
|
|
217
|
-
'hint.restartRequired': 'Restart
|
|
218
|
-
'hint.unsavedChanges': 'Unsaved changes
|
|
220
|
+
'hint.restartRequired': 'Restart services to apply changes.',
|
|
221
|
+
'hint.unsavedChanges': 'Unsaved changes (press s to save).',
|
|
219
222
|
'hint.save': 's save',
|
|
220
223
|
'hint.editing': '↵ confirm · esc cancel',
|
|
221
224
|
'update.title': 'Updates',
|
|
222
225
|
'update.check': 'Check for updates',
|
|
223
226
|
'update.checking': 'Checking npm…',
|
|
224
227
|
'update.upToDate': 'Up to date ({version})',
|
|
225
|
-
'update.available': 'Update
|
|
228
|
+
'update.available': 'Update {version} available (press Enter to install)',
|
|
226
229
|
'update.updating': 'Installing {version}…',
|
|
227
230
|
'update.done': 'Updated to {version}',
|
|
228
|
-
'update.restartHint': 'Update installed. Restart herdr-remote to
|
|
229
|
-
'update.errorNetwork': 'Could not reach
|
|
230
|
-
'update.
|
|
231
|
-
'update.
|
|
232
|
-
'update.cannot.
|
|
231
|
+
'update.restartHint': 'Update installed. Restart herdr-remote to apply.',
|
|
232
|
+
'update.errorNetwork': 'Could not reach any npm registry',
|
|
233
|
+
'update.errorNetworkDetail': 'No registry answered: {message}',
|
|
234
|
+
'update.errorFailed': 'Update failed. Run: npm install -g herdr-remote@latest',
|
|
235
|
+
'update.cannot.source': 'Source checkout — update with git',
|
|
236
|
+
'update.cannot.linked': 'Linked package — managed by npm link',
|
|
233
237
|
};
|
package/src/i18n/zh.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
module.exports = {
|
|
6
6
|
'app.name': 'Herdr Remote',
|
|
7
|
-
'app.tagline': '
|
|
7
|
+
'app.tagline': '在浏览器中使用 Herdr 工作区',
|
|
8
8
|
|
|
9
9
|
'common.yes': '是',
|
|
10
10
|
'common.no': '否',
|
|
@@ -23,11 +23,11 @@ module.exports = {
|
|
|
23
23
|
'common.disabled': '已停用',
|
|
24
24
|
'common.loading': '处理中…',
|
|
25
25
|
'common.save': '保存设置',
|
|
26
|
-
'common.saved': '
|
|
26
|
+
'common.saved': '配置已保存至 {path}',
|
|
27
27
|
'common.back': '返回',
|
|
28
28
|
'common.cancel': '取消',
|
|
29
29
|
'common.confirm': '确认',
|
|
30
|
-
'common.pid': '
|
|
30
|
+
'common.pid': 'PID {pid}',
|
|
31
31
|
'common.notApplicable': '不适用',
|
|
32
32
|
|
|
33
33
|
'nav.overview': '概览',
|
|
@@ -40,12 +40,12 @@ module.exports = {
|
|
|
40
40
|
|
|
41
41
|
'mode.local': '仅本机',
|
|
42
42
|
'mode.lan': '局域网 / Tailscale',
|
|
43
|
-
'mode.official': '官方
|
|
44
|
-
'mode.remote': '自建
|
|
45
|
-
'mode.local.description': '
|
|
46
|
-
'mode.lan.description': '
|
|
47
|
-
'mode.official.description': '
|
|
48
|
-
'mode.remote.description': '
|
|
43
|
+
'mode.official': '官方 Relay',
|
|
44
|
+
'mode.remote': '自建 Relay',
|
|
45
|
+
'mode.local.description': '监听 127.0.0.1,仅本机可访问。',
|
|
46
|
+
'mode.lan.description': '监听 0.0.0.0,局域网与 Tailscale 设备可访问。',
|
|
47
|
+
'mode.official.description': '使用官方 Relay 跨网访问,无需自建服务器。',
|
|
48
|
+
'mode.remote.description': '连接自建 Relay 跨网访问。',
|
|
49
49
|
|
|
50
50
|
'overview.title': '状态',
|
|
51
51
|
'overview.mode': '访问方式',
|
|
@@ -56,26 +56,26 @@ module.exports = {
|
|
|
56
56
|
'overview.keepalive': '保活服务',
|
|
57
57
|
'overview.devices': '浏览器',
|
|
58
58
|
'overview.hosts': '工作站',
|
|
59
|
-
'overview.uptime': 'Relay
|
|
59
|
+
'overview.uptime': 'Relay 运行时间',
|
|
60
60
|
'overview.relayLocal': '本地,{bind}:{port}',
|
|
61
61
|
'overview.relayRemote': '远程,{url}',
|
|
62
|
-
'overview.socketMissing': '
|
|
62
|
+
'overview.socketMissing': '未找到,请确认 Herdr 是否运行',
|
|
63
63
|
'overview.unreachable': '无法访问:{message}',
|
|
64
|
-
'overview.notStarted': '
|
|
64
|
+
'overview.notStarted': '服务未运行,可前往「服务」启动。',
|
|
65
65
|
|
|
66
66
|
'pair.title': '配对设备',
|
|
67
|
-
'pair.generate': '
|
|
68
|
-
'pair.regenerate': '
|
|
69
|
-
'pair.working': '
|
|
67
|
+
'pair.generate': '生成配对码',
|
|
68
|
+
'pair.regenerate': '重新生成',
|
|
69
|
+
'pair.working': '生成配对码中…',
|
|
70
70
|
'pair.code': '配对码',
|
|
71
|
-
'pair.url': '
|
|
71
|
+
'pair.url': '访问地址',
|
|
72
72
|
'pair.expires': '剩余 {minutes}(至 {time})',
|
|
73
|
-
'pair.expired': '
|
|
74
|
-
'pair.instructions': '
|
|
75
|
-
'pair.qrHint': '
|
|
76
|
-
'pair.qrUnavailable': '
|
|
73
|
+
'pair.expired': '配对码已过期,需重新生成。',
|
|
74
|
+
'pair.instructions': '打开链接并输入配对码。',
|
|
75
|
+
'pair.qrHint': '扫描二维码打开链接。',
|
|
76
|
+
'pair.qrUnavailable': '终端宽度不足,无法显示二维码。',
|
|
77
77
|
'pair.failed': '生成配对码失败:{message}',
|
|
78
|
-
'pair.hostOffline': '
|
|
78
|
+
'pair.hostOffline': 'Relay 未连接工作站,需先启动服务。',
|
|
79
79
|
|
|
80
80
|
'services.title': '服务',
|
|
81
81
|
'services.start': '启动服务',
|
|
@@ -86,39 +86,42 @@ module.exports = {
|
|
|
86
86
|
'services.restarted': '服务已重启。',
|
|
87
87
|
'services.startFailed': '启动服务失败:{message}',
|
|
88
88
|
'services.stopFailed': '停止服务失败:{message}',
|
|
89
|
-
'services.unsavedBlocked': '
|
|
90
|
-
'services.managedNotice': '
|
|
89
|
+
'services.unsavedBlocked': '配置未保存,请先保存再重启。',
|
|
90
|
+
'services.managedNotice': '由 {manager} 托管,已通过保活服务执行。',
|
|
91
91
|
'services.logs': '最近日志',
|
|
92
|
-
'services.logEmpty': '
|
|
92
|
+
'services.logEmpty': '暂无日志。',
|
|
93
93
|
'services.logRelay': 'Relay',
|
|
94
94
|
'services.logHost': '主机连接器',
|
|
95
95
|
|
|
96
96
|
'relay.title': 'Relay 设置',
|
|
97
97
|
'relay.settings': '设置',
|
|
98
|
+
'relay.locked': '固定',
|
|
99
|
+
'relay.officialFixed': '官方 relay 地址固定,不可修改。',
|
|
100
|
+
'relay.officialHint': '官方 relay:地址固定,无需密码。',
|
|
98
101
|
'relay.password': 'Relay 密码',
|
|
99
|
-
'relay.passwordHint': '
|
|
102
|
+
'relay.passwordHint': '须与 Relay 端的 RELAY_PASSWORD 一致。留空为公用 Relay。',
|
|
100
103
|
'relay.passwordSet': '已设置',
|
|
101
|
-
'relay.passwordEmpty': '
|
|
102
|
-
'relay.passwordSaved': 'Relay
|
|
104
|
+
'relay.passwordEmpty': '未设置(公用)',
|
|
105
|
+
'relay.passwordSaved': 'Relay 密码已保存,重启服务生效。',
|
|
103
106
|
'relay.showPassword': '显示密码',
|
|
104
107
|
'relay.hidePassword': '隐藏密码',
|
|
105
108
|
'relay.identity': '工作站标识',
|
|
106
|
-
'relay.regenerate': '
|
|
107
|
-
'relay.regenerated': '
|
|
108
|
-
'relay.envSnippet': '
|
|
109
|
-
'relay.envHint': '在
|
|
110
|
-
'relay.test': '测试
|
|
111
|
-
'relay.testOk': '
|
|
112
|
-
'relay.testFailed': '
|
|
113
|
-
'relay.selectAddress': '
|
|
109
|
+
'relay.regenerate': '重新生成标识',
|
|
110
|
+
'relay.regenerated': '已生成新标识,重启后重新注册。',
|
|
111
|
+
'relay.envSnippet': 'Relay 启动命令',
|
|
112
|
+
'relay.envHint': '在 Relay 主机执行此命令。',
|
|
113
|
+
'relay.test': '测试 Relay 连接',
|
|
114
|
+
'relay.testOk': 'Relay 可访问:版本 {version},已连接 {hosts} 台工作站。',
|
|
115
|
+
'relay.testFailed': 'Relay 无法访问:{message}',
|
|
116
|
+
'relay.selectAddress': '选择公布地址',
|
|
114
117
|
'relay.listenAddress': '监听地址',
|
|
115
|
-
'relay.listenAddressHint': '
|
|
118
|
+
'relay.listenAddressHint': '服务器绑定地址;浏览器访问下方公布地址。',
|
|
116
119
|
'relay.addressTailscale': 'Tailscale',
|
|
117
120
|
'relay.addressLan': '局域网',
|
|
118
121
|
'relay.addressVirtual': '虚拟网卡',
|
|
119
122
|
'relay.addressLoopback': '回环',
|
|
120
|
-
'relay.noAddresses': '
|
|
121
|
-
'relay.docsHint': '
|
|
123
|
+
'relay.noAddresses': '未找到非回环地址。',
|
|
124
|
+
'relay.docsHint': '自建指南:docs/self-hosted-relay.zh-CN.md',
|
|
122
125
|
|
|
123
126
|
'keepalive.title': '后台保活服务',
|
|
124
127
|
'keepalive.manager': '管理方式',
|
|
@@ -132,12 +135,12 @@ module.exports = {
|
|
|
132
135
|
'keepalive.failed': '保活操作失败:{message}',
|
|
133
136
|
'keepalive.unitPath': '单元文件',
|
|
134
137
|
'keepalive.logsHint': '查看日志:{command}',
|
|
135
|
-
'keepalive.linger': '
|
|
136
|
-
'keepalive.lingerEnabled': '
|
|
137
|
-
'keepalive.lingerDisabled': '
|
|
138
|
+
'keepalive.linger': '开机自启',
|
|
139
|
+
'keepalive.lingerEnabled': '已开启开机自启。',
|
|
140
|
+
'keepalive.lingerDisabled': '未开启开机自启(仅登录期间运行)。',
|
|
138
141
|
'keepalive.enableLinger': '开启开机自启',
|
|
139
|
-
'keepalive.lingerDone': '已为 {username}
|
|
140
|
-
'keepalive.fallbackNote': '
|
|
142
|
+
'keepalive.lingerDone': '已为 {username} 开启开机自启。',
|
|
143
|
+
'keepalive.fallbackNote': '无系统服务管理器,使用后台守护进程,重启后不自动恢复。',
|
|
141
144
|
|
|
142
145
|
'herdr.title': 'Herdr 集成',
|
|
143
146
|
'herdr.socketPath': '套接字路径',
|
|
@@ -145,12 +148,12 @@ module.exports = {
|
|
|
145
148
|
'herdr.plugin': '插件注册',
|
|
146
149
|
'herdr.pluginRegistered': '已注册到 Herdr。',
|
|
147
150
|
'herdr.pluginMissing': '尚未注册到 Herdr。',
|
|
148
|
-
'herdr.register': '
|
|
149
|
-
'herdr.unregister': '取消注册
|
|
151
|
+
'herdr.register': '注册为 Herdr 插件',
|
|
152
|
+
'herdr.unregister': '取消注册',
|
|
150
153
|
'herdr.registerDone': '已注册:{path}',
|
|
151
|
-
'herdr.unregisterDone': '
|
|
154
|
+
'herdr.unregisterDone': '已取消注册。',
|
|
152
155
|
'herdr.registerFailed': '注册失败:{message}',
|
|
153
|
-
'herdr.cliMissing': 'PATH
|
|
156
|
+
'herdr.cliMissing': 'PATH 中未找到 herdr 命令。',
|
|
154
157
|
|
|
155
158
|
'about.title': '语言与关于',
|
|
156
159
|
'about.language': '界面语言',
|
|
@@ -161,24 +164,24 @@ module.exports = {
|
|
|
161
164
|
'about.configPath': '配置文件',
|
|
162
165
|
'about.statePath': '状态目录',
|
|
163
166
|
'about.relayPackage': 'Relay 包',
|
|
164
|
-
'about.docs': '
|
|
167
|
+
'about.docs': '自建指南:docs/self-hosted-relay.zh-CN.md',
|
|
165
168
|
|
|
166
169
|
'wizard.title': '首次设置',
|
|
167
170
|
'wizard.step': '第 {current} / {total} 步',
|
|
168
171
|
'wizard.languageTitle': '选择语言',
|
|
169
|
-
'wizard.accessTitle': '
|
|
170
|
-
'wizard.accessHint': '
|
|
171
|
-
'wizard.addressTitle': '
|
|
172
|
-
'wizard.relayTitle': '
|
|
172
|
+
'wizard.accessTitle': '选择访问方式',
|
|
173
|
+
'wizard.accessHint': '后续可在 Relay 页面修改。',
|
|
174
|
+
'wizard.addressTitle': '选择访问地址',
|
|
175
|
+
'wizard.relayTitle': 'Relay 服务器',
|
|
173
176
|
'wizard.relayUrlLabel': 'Relay 地址(wss://…)',
|
|
174
|
-
'wizard.relayHint': '
|
|
175
|
-
'wizard.passwordTitle': 'Relay 密码',
|
|
176
|
-
'wizard.passwordHint': '
|
|
177
|
+
'wizard.relayHint': 'Relay 需先运行。搭建指南见 docs/self-hosted-relay.zh-CN.md。',
|
|
178
|
+
'wizard.passwordTitle' : 'Relay 密码',
|
|
179
|
+
'wizard.passwordHint': 'Relay 的 RELAY_PASSWORD。未设留空。',
|
|
177
180
|
'wizard.finishTitle': '完成',
|
|
178
|
-
'wizard.finishHint': '
|
|
181
|
+
'wizard.finishHint': '配置将保存至 {path}。',
|
|
179
182
|
'wizard.startNow': '立即启动服务',
|
|
180
|
-
'wizard.installKeepalive': '
|
|
181
|
-
'wizard.finish': '
|
|
183
|
+
'wizard.installKeepalive': '后台保活',
|
|
184
|
+
'wizard.finish': '保存并完成',
|
|
182
185
|
|
|
183
186
|
'field.mode': '访问方式',
|
|
184
187
|
'field.port': 'Relay 端口',
|
|
@@ -194,14 +197,14 @@ module.exports = {
|
|
|
194
197
|
'placeholder.none': '无',
|
|
195
198
|
|
|
196
199
|
'error.invalidMode': '未知的访问方式。',
|
|
197
|
-
'error.invalidPort': '
|
|
198
|
-
'error.invalidLanHost': '
|
|
199
|
-
'error.invalidRelayUrl': 'Relay
|
|
200
|
-
'error.invalidPublicUrl': '
|
|
200
|
+
'error.invalidPort': '端口须为 1 到 65535 之间的数字。',
|
|
201
|
+
'error.invalidLanHost': '浏览器地址须为可访问局域网或 Tailscale 地址,不能为回环或 0.0.0.0。',
|
|
202
|
+
'error.invalidRelayUrl': 'Relay 地址须以 wss://、ws://、https:// 或 http:// 开头。',
|
|
203
|
+
'error.invalidPublicUrl': '浏览器地址须以 https:// 或 http:// 开头,不能为 0.0.0.0 或 ::。',
|
|
201
204
|
'error.invalidLanguage': '未知的语言。',
|
|
202
205
|
'error.invalidKeepalive': '未知的保活管理方式。',
|
|
203
206
|
'error.unknownField': '未知的设置项。',
|
|
204
|
-
'error.remoteUrlRequired': '自建
|
|
207
|
+
'error.remoteUrlRequired': '自建 Relay 模式须填写 Relay 地址。',
|
|
205
208
|
'error.saveFailed': '保存配置失败:{message}',
|
|
206
209
|
|
|
207
210
|
'hint.navigate': '↑↓ 移动',
|
|
@@ -213,20 +216,21 @@ module.exports = {
|
|
|
213
216
|
'hint.mouseOn': 'm 关闭鼠标',
|
|
214
217
|
'hint.mouseOff': 'm 开启鼠标',
|
|
215
218
|
'hint.mouseUnsupported': '不支持鼠标',
|
|
216
|
-
'hint.restartRequired': '
|
|
217
|
-
'hint.unsavedChanges': '
|
|
219
|
+
'hint.restartRequired': '重启服务生效。',
|
|
220
|
+
'hint.unsavedChanges': '有未保存修改(按 s 保存)。',
|
|
218
221
|
'hint.save': 's 保存',
|
|
219
222
|
'hint.editing': '↵ 确认 · esc 取消',
|
|
220
223
|
'update.title': '更新',
|
|
221
224
|
'update.check': '检查更新',
|
|
222
|
-
'update.checking': '
|
|
225
|
+
'update.checking': '查询 npm 中…',
|
|
223
226
|
'update.upToDate': '已是最新({version})',
|
|
224
|
-
'update.available': '
|
|
225
|
-
'update.updating': '
|
|
226
|
-
'update.done': '
|
|
227
|
-
'update.restartHint': '更新已安装,重启 herdr-remote
|
|
228
|
-
'update.errorNetwork': '
|
|
227
|
+
'update.available': '新版本 {version} 可用(按 Enter 安装)',
|
|
228
|
+
'update.updating': '安装 {version} 中…',
|
|
229
|
+
'update.done': '已更新至 {version}',
|
|
230
|
+
'update.restartHint': '更新已安装,重启 herdr-remote 生效。',
|
|
231
|
+
'update.errorNetwork': '所有 npm registry 均无法连接',
|
|
232
|
+
'update.errorNetworkDetail': '无 registry 应答:{message}',
|
|
229
233
|
'update.errorFailed': '更新失败,可手动执行:npm install -g herdr-remote@latest',
|
|
230
|
-
'update.cannot.source': '
|
|
231
|
-
'update.cannot.linked': '
|
|
234
|
+
'update.cannot.source': '源码目录运行,请使用 git 更新',
|
|
235
|
+
'update.cannot.linked': 'npm link 工作副本,由 npm link 管理',
|
|
232
236
|
};
|