summaryrefslogtreecommitdiffstats
path: root/packages/meshbay-hub/src/meshbay_hub/static/locales/zh-CN.js
blob: c9199c49e0eccf31b4861be93567901a1cdcb8d4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
/**
 * Simplified Chinese — translated from locales/en.js.
 *
 * Register: formal — the reader is addressed as 您 throughout.
 * `hub`, `node` and `GEK` are left in English: they name the CLI
 * (`meshbay-node`), node.toml and the docs, which are English throughout.
 * Chinese has a single plural category, so counted strings need only `other`.
 */

export default {
  // Nav
  'nav.toggle_menu': '显示菜单',
  'nav.light_mode': '浅色主题',
  'nav.dark_mode': '深色主题',
  'nav.logout': '退出登录',
  'nav.login': '登录',

  // Sidebar
  'sidebar.my_groups': '我的群组',
  'sidebar.no_groups': '暂无群组',
  'sidebar.discover': '发现',
  'sidebar.public_groups': '公开群组',

  // Login
  'login.title': '登录',
  'login.username': '用户名',
  'login.password': '密码',
  'login.submit': '登录',
  'login.loading': '正在登录…',
  'login.no_account': '还没有账户?',
  'login.register_link': '注册',

  // Register
  'register.title': '注册',
  'register.username': '用户名',
  'register.email': '电子邮箱',
  'register.password': '密码短语(至少 12 个字符)',
  'register.confirm': '确认密码',
  'register.submit': '注册',
  'register.loading': '正在创建账户…',
  'register.has_account': '已经有账户了?',
  'register.login_link': '登录',
  'register.success_title': '账户已创建',
  'register.success_msg': '您现在可以使用您的凭据登录了。',
  'register.go_login': '前往登录',
  'register.err_mismatch': '两次输入的密码不一致',
  'register.err_min_len': {
    other: '请至少使用 {n} 个字符',
  },
  'register.err_too_weak': '太容易被猜到了。您的密码短语正是保护密钥存放之处的东西——'
    + '几个互不相关的词就很好用。',
  'register.strength': '强度:约 {bits} 位。它保护的是您所加入的各个 node 上保存的密钥副本,'
    + '因此值得认真设置。',

  // Home
  'home.welcome': '欢迎使用 MeshBay',
  'home.no_groups': '您还不是任何群组的成员。',
  'home.browse_prefix': '浏览',
  'home.browse_link': '公开群组',
  'home.browse_suffix': ',或请群组管理员邀请您。',
  'home.my_groups': '我的群组',

  // Explore
  'explore.title': '公开群组',
  'explore.search': '搜索群组…',
  'explore.loading': '加载中…',
  'explore.empty': '暂无可用的公开群组。',
  'explore.create_group': '创建群组',
  'explore.join': '加入',
  'explore.member': '已加入',

  // Group page
  'group.default_name': '群组',
  'group.tab_files': '文件',
  'group.tab_chat': '聊天',
  'group.tab_video': '视频',
  'group.tab_members': '成员',
  'group.tab_settings': "设置",
  'members.danger_leave_hint': "您将无法再访问该群组的文件和聊天。",
  'members.uploads_title': "上传",
  'members.uploads_on': "成员可以添加文件",
  'members.uploads_off': "只有您可以添加文件",
  'members.uploads_disable': "关闭",
  'members.uploads_enable': "开启",
  'members.uploads_hint': "适用于除您之外的所有人。节点自身会拒绝上传,并非只是隐藏按钮。",
  'members.apps_title': "应用",
  'members.apps_hint': "成员可见的群组功能。至少需保留一个启用。",
  'members.apps_need_one': "至少需要保留一个已启用的应用。",
  'members.danger_delete_hint': "该群组将对所有成员消失,且无法恢复。",
  'group.filter': '筛选文件…',
  'group.col_name': '名称',
  'group.col_size': '大小',
  'group.col_type': '类型',
  'group.col_date': '日期',
  'group.empty_filter': '没有文件符合筛选条件',
  'group.empty_dir': '此文件夹为空',
  'group.download': '下载',
  'group.play': '播放',
  'group.offline_title': '当前没有为此群组提供服务的 node 在线。',
  'group.offline_hint': '当托管此群组的 node 连接后,文件就会出现。',
  'group.upload': '上传',
  'group.mkdir': '新建文件夹',
  'group.mkdir_prompt': '新文件夹的名称:',
  'device.add_title': 'This browser is not linked to this node yet',
  'device.add_hint': 'Your account is known here, but this browser holds a different key. Approve it from a device already linked — no operator needed.',
  'device.add_btn': 'Get a linking code',
  'device.add_show': 'Type this code into a device already linked to this node, within the hour:',
  'device.mine_title': 'Your devices on this node',
  'device.mine_hint': 'Each browser or client you use here holds its own key. They are separate from your devices on other nodes.',
  'device.mine_empty': 'No device is linked here yet.',
  'device.this_one': 'this one',
  'device.revoke': 'Remove',
  'device.revoke_confirm': 'Remove this device? It will lose access to this node until it is linked again.',
  'device.approve_hint': 'Linking a new device? Enter the code it is showing.',
  'device.approve_btn': 'Approve',
  'device.approved': 'Device linked.',
  'group.root_unavailable': '(不可用 — 驱动器已断开连接)',
  'group.view': '查看',
  'group.delete': '删除',
  'group.delete_confirm': '删除 {name}?',
  'group.delete_group': '删除群组',
  'group.delete_group_confirm': '永久删除“{name}”并移除所有成员?node 上的文件会被保留。',
  'group.err_transport': '传输模块未加载',

  // Status
  'status.idle': '空闲',
  'status.discovering': '正在查找 node…',
  'status.connecting': '正在通过 WebRTC 连接…',
  'status.connecting_short': '正在连接…',
  'status.fetching': '正在获取索引…',
  'status.files': {
    other: '{n} 个文件',
  },
  'status.offline': '没有 node 在线',
  'status.error': '连接失败',

  // Chat
  'chat.empty': '还没有消息。开始聊天吧!',
  'chat.placeholder': '输入消息…',
  'chat.send': '发送',
  'chat.attach': '添加附件',

  // Video player
  'video.loading': '正在加载 {name}…',
  'video.buffering': '正在缓冲…',
  'video.resumed_at': "已从 {time} 继续播放",
  'video.from_start': "从头开始播放",
  'video.close': '关闭(Esc)',
  'preview.pdf_fallback': '此浏览器不会在页面内显示该 PDF。请改为下载——无论如何它都已在本地解密。',
  'group.upload_indexing': '建立索引中…',
  'video.err_transport': '传输未连接',
  'video.err_mse': '该编解码器不支持流式播放:{codec}',
  'video.mode_poster': '海报视图',
  'video.mode_flat': '平铺列表',
  'video.empty': '未找到视频。',
  'video.no_root_configured': '此群组尚未设置视频根目录 — 操作员可以在设置中选择一个。',
  'video.director': '导演',
  'video.specials': '特别篇',
  'video.season_n': '第 {n} 季',
  'video.episode_n': '第 {n} 集',
  'video.n_episodes': {
    one: '{n} 集',
    other: '{n} 集',
  },

  // LAN cast
  'cast.start': '投射到设备',
  'cast.stop': '停止投射',
  'cast.copy_url': '复制流媒体链接',
  'cast.copied': '链接已复制',
  'cast.scanning': '正在搜索设备…',
  'cast.no_devices': '未找到设备',

  // Settings
  'settings.title': '设置',
  'settings.coming_soon': '即将推出。',
  'settings.downloads': '下载',
  'settings.dl_auto': '自动保存',
  'settings.dl_auto_hint': '文件会直接进入您在下方选择的文件夹,不弹出任何对话框。'
    + '下载二十个文件,那里就会多出二十个文件。',
  'settings.dl_ask': '每次都询问',
  'settings.dl_ask_hint': '每个文件弹出一次“另存为”对话框——每个文件一次,'
    + '批量下载时也是如此。',
  'settings.dl_folder': '文件夹:{name}',
  'settings.dl_no_folder': '未选择文件夹——下载内容会保存到浏览器指定的位置',
  'settings.dl_choose': '选择文件夹',
  'settings.dl_change': '更改',
  'settings.dl_forget': '忘记',

  'settings.profile': '个人资料',
  'settings.username': '用户名',
  'settings.email': 'Email',
  'settings.email_save': 'Save',
  'settings.email_saved': 'Email updated',
  'settings.notif_global_disable': 'Disable all notifications',
  'settings.notif_global_hint': 'When enabled, no notifications are created for any group.',
  'settings.defaults': '默认值',
  'settings.default_tab': 'Default tab',
  'settings.default_tab_hint': 'Which tab opens first when you enter a group.',
  'settings.node_pins': 'node 身份',
  'settings.node_pins_hint': '每个 node 的身份密钥都会在您首次连接时被记住。'
    + '如果它发生变化,连接会被拒绝——只有当运营者重装 node 时才应如此。'
    + '清除之前请先与对方核实。',
  'settings.node_pins_count': {
    other: '已固定 {n} 个',
  },
  'settings.node_pins_clear': '清除已固定的身份',
  'settings.danger': '删除账户',
  'settings.delete_hint': '这会从 hub 上删除您的账户、您的群组成员身份和您的通知,'
    + '并释放您的用户名。它无法触及存放在各个 node 上的内容:您上传的文件仍留在其运营者'
    + '保管之处,每个 node 也会保留它为您固定的身份,直到其运营者取消固定。'
    + '连接日志按法律要求保存一年。',
  'settings.delete_account': '删除我的账户',
  'settings.delete_confirm': '请输入您的密码短语以确认。此操作无法撤销。',
  'settings.delete_confirm_btn': '永久删除',
  'settings.cancel': '取消',
  'settings.appearance': '外观',
  'settings.theme': '主题',
  'settings.theme_light': '浅色',
  'settings.theme_dark': '深色',
  'settings.theme_system': '跟随系统',
  'settings.language': '语言',
  'settings.about': '关于',
  'firstrun.title': 'Which hub?',
  'firstrun.hint': 'A hub holds your account and introduces you to nodes. It never sees your files, your messages or your keys.',
  'firstrun.btn': 'Continue',
  'firstrun.checking': 'Checking…',
  'firstrun.note': 'There is no default on purpose: this application only trusts a hub for its API, never for the interface, which ships with the application itself.',
  'device.this_device': 'This device',
  'settings.keys_heading': 'Keys on this device',
  'settings.hub_heading': 'Hub',
  'settings.hub_current': 'Currently',
  'settings.hub_hint': 'Changing this signs you out and restarts the window. A hub on your own machine is usually http, not https.',
  'settings.hub_change': 'Change',
  'settings.keys_where': 'Protected by',
  'settings.keys_unprotected': 'No system keyring is running, so your keys are encrypted with a key that is not a secret. Anyone who can read this machine’s files can read them. Start a keyring, or treat this device as untrusted.',
  'settings.keys_unavailable': 'This system offers no key storage at all, so this device cannot be remembered — you will be asked for your passphrase each time. That is the safe outcome: nothing was stored unprotected.',
  'settings.version': '版本',
  'settings.protocol': '协议',
  'settings.role': '角色',
  'settings.groups': '群组通知',
  'settings.notifications': '通知',
  'settings.node_key': '关联 node',
  'settings.node_key_desc': '如果您运营着一个 MeshBay node,请在此粘贴它的 Ed25519 '
    + '公钥,以将其关联到您的账户。该密钥可在您 node 的管理面板中找到。',
  'settings.node_key_placeholder': '粘贴 node 的 Ed25519 公钥(base64)',
  'settings.node_key_submit': '关联 node',
  'settings.node_key_success': 'node 关联成功',
  'settings.node_key_current': '已关联的 node 密钥',

  // Sidebar
  'sidebar.create_group': '创建群组',
  'sidebar.settings': '设置',
  'sidebar.admin': '管理',

  // User menu
  'usermenu.language': '语言',
  'usermenu.settings': '设置',
  'usermenu.theme_light': '浅色主题',
  'usermenu.theme_dark': '深色主题',
  'usermenu.logout': '退出登录',

  // Admin panel
  'admin.title': '管理',
  'admin.tab_stats': '统计',
  'admin.tab_users': '用户',
  'admin.tab_groups': '群组',
  'admin.tab_nodes': 'node',
  'admin.tab_logs': '日志',
  'admin.col_observed_ip': '来源地址',
  'admin.col_hint': '自报地址',
  'admin.col_last_seen': '最近通告',
  'admin.node_online': '在线',
  'admin.node_offline': '离线',
  'admin.no_nodes': '没有已注册的 node',
  'admin.nodes_hint': '“来源地址”是该通告实际到达时的地址,请求由 node 密钥签名——'
    + '需要答复查询时应以此为准。自报地址是 node 自认为的地址,从 STUN 服务器获知后发给我们;'
    + '它有助于连上该 node,但不能证明任何事情。',
  'admin.tab_blocklist': '屏蔽列表',

  // Admin stats
  'admin.stat_users': '用户',
  'admin.stat_groups': '群组',
  'admin.stat_nodes': 'node',
  'admin.stat_online': '在线 node',

  // Admin users
  'admin.users_search': '搜索用户…',
  'admin.col_username': '用户名',
  'admin.col_role': '角色',
  'admin.col_status': '状态',
  'admin.col_created': '创建时间',
  'admin.col_actions': '操作',
  'admin.col_email': '电子邮箱',
  'admin.col_groups': '群组',
  'admin.no_users': '未找到用户',
  'admin.btn_suspend': '停用',
  'admin.btn_unsuspend': '恢复',
  'admin.btn_details': '详情',
  'admin.btn_delete': '删除',
  'admin.delete_confirm': '删除账户“{user}”?此操作无法撤销。'
    + '该用户上传的文件仍留在托管它们的 node 上,每个 node 也会保留它固定的身份,'
    + '直到其运营者取消固定。停用是可撤销的选项。',
  'admin.user_detail': '用户详情',
  'admin.btn_close': '关闭',
  'admin.self_note': '(您)',

  // Admin groups
  'admin.col_name': '名称',
  'admin.col_visibility': '可见性',
  'admin.col_members': '成员',
  'admin.no_groups': '未找到群组',

  // Admin logs
  'admin.col_time': '时间',
  'admin.col_event': '事件',
  'admin.col_user': '用户',
  'admin.col_ip': 'IP',
  'admin.col_detail': '详情',
  'admin.filter_all': '全部事件',
  'admin.no_logs': '未找到日志',
  'admin.btn_load_more': '加载更多',

  // Admin blocklist
  'admin.col_hash': '哈希',
  'admin.col_reason': '原因',
  'admin.col_date': '日期',
  'admin.col_added_by': '添加者',
  'admin.no_blocked': '没有被屏蔽的哈希',
  'admin.add_hash': '将哈希添加到屏蔽列表',
  'admin.hash_placeholder': 'blake3 哈希(64 个十六进制字符)',
  'admin.reason_placeholder': '原因',
  'admin.btn_block': '屏蔽',
  'admin.btn_unblock': '解除屏蔽',

  // Notifications
  // Create group
  'create_group.title': '创建群组',
  'create_group.name': '群组名称',
  'create_group.name_placeholder': '例如:家庭照片、项目文件…',
  'create_group.join_policy': '加入方式',
  'create_group.invite': '仅限邀请',
  'create_group.invite_desc': "成员须由管理员邀请,群组不会公开列出。",
  'create_group.open': '开放(任何人都可加入)',
  'create_group.open_desc': "列入公开群组,任何人都能找到并无需批准即可加入。",
  'create_group.description': '简介',
  'create_group.description_hint': '这个群组是做什么的?(可选)',
  'create_group.submit': '创建',
  'create_group.hint': '群组需要一个 node 来托管文件。您可以现在创建群组,稍后再接入 node。',
  'create_group.creating': '正在创建…',

  // Members
  'members.col_role': '角色',
  'members.group_role': '群组角色',
  'members.admin': '管理员',
  'members.group_admin': '群组管理员',
  'members.owner': '所有者',
  'members.member': '成员',
  'members.invite_title': '邀请成员',
  'members.username_placeholder': '用户名',
  'members.invite_btn': '邀请',
  'members.invite_needs_pairing': '邀请是用此 node 为您的浏览器固定的密钥签名的,'
    + '因此请先在下方完成配对,再邀请任何人。',
  'members.invite_ask_operator': '只有托管此群组的 node 的运营者才能邀请,'
    + '且须从与该 node 配对过的浏览器发起。',
  'members.remove': '移除',
  'members.remove_confirm': '将 {user} 从此群组移除?该用户的账户、其他群组'
    + '以及其上传的文件都不受影响。',
  'members.remove_hint': '移除某人会取消其成员身份,并使 node 不再向其提供群组密钥。'
    + '这不会删除其账户,也无法收回其已经持有的密钥——如果这一点很重要,'
    + '请在 node 上轮换密钥(meshbay-node gek-init)。',
  'members.pair_title': '将此浏览器与您的 node 配对',
  'members.pair_hint': '您的 node 只接受来自已配对浏览器的运营者操作——邀请、删除文件。'
    + '请在 node 上运行 `meshbay-node operator pair`,并在此输入配对码。'
    + '该配对码绝不会经过 hub。',
  'members.pair_btn': '配对',
  'members.pair_success': '此浏览器现已与该 node 配对。',
  'members.invite_code_ready': '给 {user} 的邀请码——用您平时联系的方式发给对方。'
    + '它只能使用一次,并且绝不会经过 hub。',
  'members.invite_code_hint': '对方第一次打开此群组时输入即可。那时您不需要在线。',
  'transfers.title': '传输',
  'transfers.clear': '清除已完成',
  'transfers.cancel': '取消',
  'transfers.open': '打开',
  'transfers.done': '已完成',
  'transfers.cancelled': '已取消',
  'transfers.failed': '失败',
  'group.select': '选择',
  'group.select_done': '完成',
  'group.actions': '操作({n})',
  'group.download_n': '下载({n})',
  'group.download_zip_n': '将文件夹打包为 zip 下载({n})',
  'group.delete_n': '删除({n})',
  'group.delete_n_confirm': {
    other: '删除 {n} 个项目?{names}',
  },
  'group.download_zip': {
    other: '打包为 zip 下载({n} 个文件)',
  },
  'group.zip_empty': '该文件夹里没有可下载的内容。',
  'group.zip_no_stream': '此浏览器无法把下载内容直接写入磁盘,'
    + '因此 {name}({size})必须先在内存中构建。若压缩包很大,这可能会失败。是否继续?',
  'group.rmdir': '删除文件夹',
  'group.rmdir_confirm': '删除文件夹“{name}”?它必须是空的。',
  'group.rmdir_not_empty': '该文件夹不是空的。请先删除其中的内容——'
    + '这里的任何操作都不会删除您看不到的文件。',
  'group.desc_edit': '编辑简介',
  'group.desc_add': '添加简介',
  'group.desc_save': '保存',
  'group.desc_cancel': '取消',
  'group.desc_placeholder': '这个群组的用途——成员会在他们的主页上看到。',
  'group.join_code_title': '此 node 需要认识您',
  'group.join_code_hint': '向邀请您的人索取一次性代码,并在此输入。'
    + '之后此浏览器即被认可,不会再次询问。',
  'group.join_code_btn': '加入',

  'notif.purge': '全部清除',
  'notif.title': '通知',
  'notif.empty': '没有通知',
  'notif.mark_all_read': '全部标为已读',

  // Sidebar
  'sidebar.search': '搜索文件',

  // Status

  // Search
  'search.title': '搜索文件',
  'search.placeholder': '在所有群组中搜索…',
  'search.no_results': '没有文件符合您的搜索。',
  'search.synced': '{ago}同步',
  'search.cache_note': '搜索依据的是您上次打开每个群组时的状态。'
    + '打开某个群组,即可在此更新它的文件。',
  'search.col_group': '群组',
  'search.result_count': {
    other: '找到 {n} 个文件',
  },
  'search.hint': '在所有已缓存的群组索引中搜索文件名。',

  // Presence, chat paging, leaving a group, the profile page
  'presence.online': '有一个服务本群组的 node 在线',
  'presence.offline': '本群组没有可达的 node',
  'presence.unknown': '尚未检测',
  'presence.indexing': '正在索引 — {pct}%',
  'chat.load_older': '加载更早的 {n} 条消息',
  'chat.start_of_history': '对话开头',
  'chat.today': '今天',
  'chat.yesterday': '昨天',
  'chat.unread': '新消息',
  'chat.jump_latest': '跳到最新',
  'chat.jump_new': '新消息',
  'group.leave': '退出群组',
  'group.leave_confirm': '退出“{name}”?您将失去其文件和聊天的访问权。您上传的文件仍留在 node 上,node 也会保留它为您固定的身份,直到其运营者将其移除。',
  'group.mute': 'Mute notifications',
  'group.unmute': 'Unmute notifications',
  'profile.title': '个人资料',
  'usermenu.profile': '个人资料',

  // First-run setup wizard
  'setup.welcome_title': '欢迎使用 MeshBay',
  'setup.welcome_message': '您的 node 在您自己的机器上加密存储文件。让我们启动它并创建您的第一个群组。',
  'setup.node_detected': '已检测到本地 node,正在运行。',
  'setup.node_not_running': '您的 node 已安装但未运行。',
  'setup.node_start': '启动 node',
  'setup.node_starting': '正在启动 node…',
  'setup.node_started': 'Node 已启动。',
  'setup.node_not_installed': '此机器上未安装 meshbay-node。',
  'setup.node_install_hint': '请使用包管理器安装,然后回到此处。',
  'setup.skip': '跳过 — 不使用本地 node 创建群组',
  'setup.create_group': '创建第一个群组',
  'setup.dismiss': '跳过设置',

  // Group
  'group.retry': '重试',

  // Sidebar
  'sidebar.node': 'Node',

  // Node admin
  'node.title': 'Node',
  'node.service_checking': '正在检查节点服务…',
  'node.service_not_installed': '未安装为服务',
  'node.service_state_active': '运行中',
  'node.service_state_inactive': '已停止',
  'node.service_state_failed': '失败',
  'node.service_state_activating': '正在启动…',
  'node.service_state_deactivating': '正在停止…',
  'node.service_state_unknown': '未知',
  'node.service_start': '启动',
  'node.service_starting': '正在启动…',
  'node.service_stop': '停止',
  'node.service_stopping': '正在停止…',
  'node.service_restart': '重启',
  'node.service_restarting': '正在重启…',
  'node.not_operator': '无法连接到您的 node。请确保它正在运行。',
  'node.offline': 'Node 已离线',
  'node.retry': '重试',
  'node.reload': '重新加载配置',
  'node.reloaded': '配置已重新加载。对现有群组的目录更改现已生效。',
  'node.restart_needed': '添加后请初始化群组密钥(meshbay-node gek-init --group <名称>)。',
  'node.no_groups': '此 node 上未配置任何群组。',
  'node.stale': '不在 hub 上',
  'node.unavailable': '不可用',
  'node.files': {
    other: '{n} 个文件',
  },
  'node.peers': {
    other: '{n} 个对等节点',
  },
  'node.roots': '目录',
  'node.add_root': '添加目录',
  'node.remove_root': '移除',
  'node.root_added': '目录已添加。',
  'node.root_remove_confirm': '从此群组中移除"{name}"?',
  'node.root_removed': '目录已移除。建议重启以更新索引。',
  'node.upload_root': '上传目录',
  'node.attach_group': '添加群组',
  'node.attach_pick': '要托管的群组',
  'node.attach_dir': '共享目录',
  'node.attach_upload_dir': '上传目录',
  'node.attach_upload_label': '上传目录(用于文件上传和聊天附件)',
  'node.attached': '群组已添加并加载。如果尚未操作,请运行 meshbay-node gek-init --group {name}。',
  'node.detach_group': '移除群组',
  'node.detach_confirm': '从此 node 中移除"{name}"?',
  'node.detached': '群组已移除。',
  'node.gek': '群组密钥',
  'node.no_gek': '无群组密钥',
  'node.gek_init_hint': '尚无群组密钥。请从命令行运行 GEK 初始化来设置。',
  'node.gek_public_hint': '公开群组不支持密钥轮换。',
  'node.gek_rotate': '轮换群组密钥',
  'node.gek_rotate_confirm': '轮换群组密钥?已连接的成员将自动收到新密钥。已下载的内容不受影响。',
  'node.gek_rotated': '群组密钥已轮换。',
  'node.roster': '花名册',
  'node.roster_load': '加载花名册',
  'node.roster_empty': '尚未固定任何成员。',
  'node.roster_user': '用户',
  'node.roster_role': '角色',
  'node.roster_status': '状态',
  'node.roster_via': '固定途径',
  'node.roster_invites': {
    other: '{n} 个待处理邀请',
  },
  'node.unpin': '取消固定',
  'node.unpin_confirm': '取消固定"{name}"?对方需要重新配对。',
  'node.unpin_done': '身份已取消固定。',
  'node.denylist': '拒绝列表',
  'node.denylist_load': '加载拒绝列表',
  'node.denylist_empty': '拒绝列表为空。',
  'node.denylist_count': {
    other: '{n} 条记录',
  },
  'node.denylist_remove': '移除',
  'node.denylist_clear_all': '全部清除',
  'node.denylist_clear_confirm': '从拒绝列表中移除"{subject}"?',
  'node.denylist_cleared': '拒绝列表条目已移除。',

  // Settings — node
  'settings_node.detach_failed_continue': '无法从 node 上分离此群组。是否仍然在 hub 上删除?',
  'settings_node.roots': '共享目录',
  'settings_node.scan_title': '扫描',
  'settings_node.scan_hint': 'node 多久重新检查一次目录以发现可能错过的变化,以及文件变化后等待多久才建立索引。',
  'settings_node.scan_reconcile_label': '重新检查间隔(分钟)',
  'settings_node.scan_debounce_label': '变化后的等待时间(秒)',
  'settings_node.scan_save': '保存',
  'settings_node.scan_saving': '保存中…',
  'settings_node.scan_saved': '已保存。',
  'settings_node.tmdb_title': 'TMDB 元数据',
  'settings_node.tmdb_hint': '允许视频应用显示来自 TMDB 的海报、简介和演职人员。关闭后仅显示缩略图浏览,不会向第三方发送任何请求。',
  'settings_node.tmdb_enabled': '已启用',
  'settings_node.tmdb_disabled': '已禁用',
  'settings_node.tmdb_token_label': '自定义 API 令牌(可选)',
  'settings_node.tmdb_token_placeholder': '留空以使用内置的默认令牌',
  'settings_node.tmdb_token_customized': '已设置自定义令牌。',
  'settings_node.tmdb_token_default': '正在使用内置的默认令牌。',
  'settings_node.tmdb_save': '保存',
  'settings_node.tmdb_language_label': '语言',
  'settings_node.tmdb_language_hint': '适用于所有人 — 共享同一个缓存,不是按观看者分别请求。',
  'settings_node.video_root_title': '视频根目录',
  'settings_node.video_root_hint': '该文件夹(或子文件夹)将作为此群组"视频"应用的入口。在选择之前,"视频"中不会显示任何内容,也不会执行任何 TMDB 查询。',
  'settings_node.video_root_none': '— 未选择 —',
  'settings_node.video_root_save': '保存',
  'settings_node.video_root_change_confirm': '更改视频根目录会替换每位成员在"视频"标签页中看到的内容。是否继续?',

  // Create group wizard
  'wizard.title': '创建群组',
  'wizard.detecting': '正在检测本地 node…',
  'wizard.node_not_found': '未检测到本地 node。请确保 meshbay-node 正在运行。',
  'wizard.node_offline_warning': 'Node 未在运行。群组将仅在 hub 上创建。'
    + '您可以之后在 Node 页面连接 node。',
  'wizard.retry': '重试',
  'wizard.skip_node': '不使用 node 继续',
  'wizard.directories': '共享目录',
  'wizard.directories_hint': '选择此群组要共享的目录。至少需要一个。',
  'wizard.add_directory': '添加目录',
  'wizard.remove': '移除',
  'wizard.set_upload': '设为上传目标',
  'wizard.upload_target': '上传目标',
  'wizard.create_and_setup': '创建并设置',
  'wizard.create_hub_only': '仅在 hub 上创建',
  'wizard.setting_up': '正在设置您的群组…',
  'wizard.step_create_hub': '在 hub 上创建群组',
  'wizard.step_attach': '关联到 node',
  'wizard.step_add_roots': '添加目录',
  'wizard.step_gek': '初始化加密密钥',
  'wizard.step_pair': '设置配对',
  'wizard.step_index': '正在索引文件',
  'wizard.indexing_progress': '正在索引… {pct}%',
  'wizard.indexing_current_dir': '正在扫描:{dir}',
  'wizard.done_title': '群组已创建',
  'wizard.done_message': '您的群组已就绪。您的 node 正在托管它,加密已设置完成。',
  'wizard.go_to_group': '前往群组',
  'wizard.finish_later': '稍后完成设置',
};