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/herdr-plugin.toml CHANGED
@@ -1,8 +1,8 @@
1
1
  id = "herdr.remote.web"
2
2
  name = "Herdr Remote Web"
3
- version = "0.2.2"
3
+ version = "0.2.3"
4
4
  min_herdr_version = "0.8.2"
5
- description = "Mobile-first remote access to the native Herdr TUI through a local or self-hosted relay"
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 Herdr Remote"
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 Herdr Remote"
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 Herdr Remote"
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 = "Show Herdr Remote status"
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 = "Create a phone pairing code"
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.2",
4
- "description": "Remote browser access to your Herdr terminal workspaces: Herdr plugin, host connector, and bilingual configuration TUI",
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 your Herdr workspaces',
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 (no server needed)',
44
+ 'mode.official': 'Official relay',
45
45
  'mode.remote': 'Self-hosted relay',
46
- 'mode.local.description': 'The relay listens on 127.0.0.1. Only a browser on this machine can reach it.',
47
- 'mode.lan.description': 'The relay listens on 0.0.0.0 (every interface), so phones on your LAN or tailnet can reach it.',
48
- 'mode.official.description': 'Reach this machine from anywhere through the relay run by the Herdr Remote project. Nothing to deploy. Your terminal traffic passes through a server you do not control, and only devices you pair can open it.',
49
- 'mode.remote.description': 'No local relay. The workstation dials a relay you run, which is the only way in from outside your network.',
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 are not running. Open the Services tab to start them.',
65
+ 'overview.notStarted': 'Services not running. Open Services tab to start.',
66
66
 
67
67
  'pair.title': 'Pair a device',
68
- 'pair.generate': 'Generate a one-time pairing code',
69
- 'pair.regenerate': 'Generate another code',
70
- 'pair.working': 'Starting services and requesting a code…',
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': 'Open on your phone',
72
+ 'pair.url': 'Access URL',
73
73
  'pair.expires': 'Expires in {minutes} (at {time})',
74
- 'pair.expired': 'This code has expired. Generate a new one.',
75
- 'pair.instructions': 'Open the URL, enter the code, and the browser is paired for good.',
76
- 'pair.qrHint': 'Scan the code with your phone camera to open the URL.',
77
- 'pair.qrUnavailable': 'The terminal is too narrow for a QR code; use the URL above.',
78
- 'pair.failed': 'Could not create a pairing code: {message}',
79
- 'pair.hostOffline': 'The relay has no workstation connected yet. Start the services first.',
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': 'There are unsaved changes. Save them first, or the services restart on the configuration still on disk.',
91
- 'services.managedNotice': 'These services are managed by {manager}; the keep-alive unit was used to apply the change.',
92
- 'services.logs': 'Recent log output',
93
- 'services.logEmpty': 'No log output yet.',
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 the relay. Leave empty for a public relay.',
103
+ 'relay.passwordHint': 'Must match RELAY_PASSWORD on relay. Leave empty if public.',
101
104
  'relay.passwordSet': 'set',
102
- 'relay.passwordEmpty': 'not set (public relay)',
103
- 'relay.passwordSaved': 'Relay password saved. Restart the services to apply it.',
104
- 'relay.showPassword': 'Show the password',
105
- 'relay.hidePassword': 'Hide the password',
106
- 'relay.identity': 'Workstation id',
107
- 'relay.regenerate': 'Generate a new workstation identity',
108
- 'relay.regenerated': 'New workstation identity generated. Restart the services to enrol again.',
109
- 'relay.envSnippet': 'Command for your relay server',
110
- 'relay.envHint': 'Run this on the relay host.',
111
- 'relay.test': 'Test the relay connection',
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 the address to advertise',
117
+ 'relay.selectAddress': 'Choose advertised address',
115
118
  'relay.listenAddress': 'Listen address',
116
- 'relay.listenAddressHint': 'This is the server bind address. The advertised address below is what browsers open.',
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. Connect to a network or start Tailscale.',
122
- 'relay.docsHint': 'Running your own relay: see docs/self-hosted-relay.md',
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 the service',
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': 'Follow logs with: {command}',
136
- 'keepalive.linger': 'Start at boot without logging in',
137
- 'keepalive.lingerEnabled': 'Lingering is enabled: the service starts at boot.',
138
- 'keepalive.lingerDisabled': 'Lingering is off, so the service only runs while you are logged in.',
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': 'Lingering enabled for {username}.',
141
- 'keepalive.fallbackNote': 'No system service manager is available; a supervised background process is used instead. It does not survive a reboot.',
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 this package as a Herdr plugin',
150
- 'herdr.unregister': 'Unregister the Herdr plugin',
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': 'The herdr command was not found on PATH.',
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 the system ({detected})',
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 your language',
170
- 'wizard.accessTitle': 'How do you want to reach this machine?',
171
- 'wizard.accessHint': 'You can change this later on the Relay screen.',
172
- 'wizard.addressTitle': 'Which address should phones use?',
173
- 'wizard.relayTitle': 'Your relay server',
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': 'The relay must already be running. See docs/self-hosted-relay.md to set one up.',
178
+ 'wizard.relayHint': 'Relay must be running. See docs/self-hosted-relay.md.',
176
179
  'wizard.passwordTitle': 'Relay password',
177
- 'wizard.passwordHint': 'The RELAY_PASSWORD your relay was started with. Leave it empty if the relay has none.',
178
- 'wizard.finishTitle': 'Ready',
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 the services now',
181
- 'wizard.installKeepalive': 'Keep the services running in the background',
182
- 'wizard.finish': 'Save and continue',
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': 'The port must be a number between 1 and 65535.',
199
- 'error.invalidLanHost': 'The browser address must be a reachable LAN or Tailscale address, not loopback or 0.0.0.0.',
200
- 'error.invalidRelayUrl': 'The relay URL must start with wss://, ws://, https:// or http://.',
201
- 'error.invalidPublicUrl': 'The browser URL must start with https:// or http:// and cannot use 0.0.0.0 or ::.',
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': 'A relay URL is required for the self-hosted relay mode.',
206
- 'error.saveFailed': 'Could not save the configuration: {message}',
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 the services to apply these changes.',
218
- 'hint.unsavedChanges': 'Unsaved changes press s to save.',
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 available: {version} press Enter to install',
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 use it.',
229
- 'update.errorNetwork': 'Could not reach the npm registry',
230
- 'update.errorFailed': 'The update failed. Try: npm install -g herdr-remote@latest',
231
- 'update.cannot.source': 'Running from a source checkout update with git, not npm',
232
- 'update.cannot.linked': 'Running from a linked working copy npm link manages this one',
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 checkoutupdate 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': '在浏览器里远程使用你的 Herdr 工作区',
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': '配置已保存到 {path}',
26
+ 'common.saved': '配置已保存至 {path}',
27
27
  'common.back': '返回',
28
28
  'common.cancel': '取消',
29
29
  'common.confirm': '确认',
30
- 'common.pid': '进程 {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': '官方 relay(无需自建服务器)',
44
- 'mode.remote': '自建 relay',
45
- 'mode.local.description': 'relay 监听 127.0.0.1,只有本机浏览器能访问。',
46
- 'mode.lan.description': 'relay 监听 0.0.0.0(所有网卡),局域网或 tailnet 里的手机都能访问。',
47
- 'mode.official.description': '通过 Herdr Remote 官方 relay 从任意网络访问本机,无需部署任何服务器。终端流量会经过一台你无法控制的服务器,但只有你配对过的设备才能打开终端。',
48
- 'mode.remote.description': '不启动本地 relay。本机连接你自建的 relay,这是从外网访问的唯一方式。',
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': '未找到 Herdr 在运行吗?',
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': 'relay 上还没有工作站连接,请先启动服务。',
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': '服务由 {manager} 托管,已通过保活服务执行此操作。',
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': '需与 relay 上的 RELAY_PASSWORD 一致。留空表示公用 relay。',
102
+ 'relay.passwordHint': '须与 Relay 端的 RELAY_PASSWORD 一致。留空为公用 Relay。',
100
103
  'relay.passwordSet': '已设置',
101
- 'relay.passwordEmpty': '未设置(公用 relay)',
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': 'relay 服务器启动命令',
109
- 'relay.envHint': '在 relay 主机上执行这条命令。',
110
- 'relay.test': '测试 relay 连接',
111
- 'relay.testOk': 'relay 可访问:版本 {version},已连接 {hosts} 台工作站。',
112
- 'relay.testFailed': 'relay 无法访问:{message}',
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': '没有找到非回环地址,请先连接网络或启动 Tailscale。',
121
- 'relay.docsHint': '自建 relay 请参阅 docs/self-hosted-relay.zh-CN.md',
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': '已开启 linger:开机即启动。',
137
- 'keepalive.lingerDisabled': '未开启 linger,服务只在你登录期间运行。',
138
+ 'keepalive.linger': '开机自启',
139
+ 'keepalive.lingerEnabled': '已开启开机自启。',
140
+ 'keepalive.lingerDisabled': '未开启开机自启(仅登录期间运行)。',
138
141
  'keepalive.enableLinger': '开启开机自启',
139
- 'keepalive.lingerDone': '已为 {username} 开启 linger。',
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': '把本包注册为 Herdr 插件',
149
- 'herdr.unregister': '取消注册 Herdr 插件',
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 中找不到 herdr 命令。',
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': '自建 relay 指南:docs/self-hosted-relay.zh-CN.md',
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': '之后可以在 Relay 页面随时修改。',
171
- 'wizard.addressTitle': '手机应该使用哪个地址?',
172
- 'wizard.relayTitle': '你的 relay 服务器',
172
+ 'wizard.accessTitle': '选择访问方式',
173
+ 'wizard.accessHint': '后续可在 Relay 页面修改。',
174
+ 'wizard.addressTitle': '选择访问地址',
175
+ 'wizard.relayTitle': 'Relay 服务器',
173
176
  'wizard.relayUrlLabel': 'Relay 地址(wss://…)',
174
- 'wizard.relayHint': 'relay 需要已经在运行。搭建方法见 docs/self-hosted-relay.zh-CN.md。',
175
- 'wizard.passwordTitle': 'Relay 密码',
176
- 'wizard.passwordHint': 'relay 启动时设置的 RELAY_PASSWORD。relay 没设密码就留空。',
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': '配置将保存到 {path}。',
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': '端口必须是 1 到 65535 之间的数字。',
198
- 'error.invalidLanHost': '浏览器地址必须是可访问的局域网或 Tailscale 地址,不能填写回环地址或 0.0.0.0。',
199
- 'error.invalidRelayUrl': 'Relay 地址需以 wss://、ws://、https:// 或 http:// 开头。',
200
- 'error.invalidPublicUrl': '浏览器地址需以 https:// 或 http:// 开头,不能使用 0.0.0.0 或 ::。',
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': '自建 relay 模式必须填写 Relay 地址。',
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': '有未保存的修改 — 按 s 保存。',
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': '正在查询 npm',
225
+ 'update.checking': '查询 npm 中…',
223
226
  'update.upToDate': '已是最新({version})',
224
- 'update.available': '有新版本 {version} —— Enter 安装',
225
- 'update.updating': '正在安装 {version}',
226
- 'update.done': '已更新到 {version}',
227
- 'update.restartHint': '更新已安装,重启 herdr-remote 后生效。',
228
- 'update.errorNetwork': '无法连接 npm registry',
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': '当前从源码目录运行 —— 请用 git 更新,而不是 npm',
231
- 'update.cannot.linked': '当前是 npm link 的工作副本 —— 由 npm link 管理',
234
+ 'update.cannot.source': '源码目录运行,请使用 git 更新',
235
+ 'update.cannot.linked': 'npm link 工作副本,由 npm link 管理',
232
236
  };