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
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
|
/**
* 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': '注册',
'login.forgot': '忘记密码短语?',
'reset.title': '重置密码短语',
'reset.request_intro': '输入您的用户名和账户的邮箱。如果二者匹配,重置码将发送至该邮箱。',
'reset.send_code': '发送验证码',
'reset.form_intro': '输入邮件中的验证码并设置新的密码短语。如果您有恢复密钥,请一并输入,以同时恢复对群组的访问。',
'reset.code': '重置码',
'reset.recovery_key': '恢复密钥(可选)',
'reset.recovery_key_hint': '如果没有请留空。没有它,您的登录会恢复,但每个群组都需要重新加入。',
'reset.new_pass': '新密码短语',
'reset.new_pass_repeat': '再次输入新密码短语',
'reset.submit': '重置密码短语',
'reset.working': '正在恢复您的群组身份…',
'reset.signin_restored': '您的登录已恢复。',
'reset.groups_restored': '您的群组身份已在所有可达节点上恢复。',
'reset.no_recovery': '您的群组身份未恢复。对于每个群组,请让其运营者取消对你的固定并发送新的邀请码,然后重新加入。',
'reset.needs_operator': '这些群组仍需处理——请让每位运营者取消对你的固定并发送新的代码:',
'reset.go_app': '前往应用',
'reset.back_to_login': '返回登录',
'reset.err_unsupported': '重置密码短语需要浏览器的加密模块,此处不可用。',
// Register
'register.title': '注册',
'register.username': '用户名',
'register.email': '电子邮箱',
'register.password': '密码短语(至少 12 个字符)',
'register.confirm': '确认密码',
'register.submit': '注册',
'register.loading': '正在创建账户…',
'register.has_account': '已经有账户了?',
'register.login_link': '登录',
'register.recovery_title': '保存您的恢复密钥',
'register.recovery_intro': '如果您忘记了密码短语,此密钥可恢复您的群组身份。请将其保存在密码管理器或安全的地方——它只显示一次,且 hub 永远看不到它。',
'register.recovery_copy': '复制',
'register.recovery_copied': '已复制',
'register.recovery_warning': '如果您同时丢失了密码短语和此密钥,您的文件仍会保留在各自的节点上,但您将以新身份重新加入每个群组。',
'register.recovery_saved': '我已将恢复密钥保存在安全的地方。',
'register.recovery_continue': '继续',
'register.recovery_email_opt': '同时将此恢复密钥通过邮件发送给我作为备份',
'register.recovery_emailed': '副本也已发送至您的邮箱,与验证码在同一封邮件中。',
'register.recovery_not_emailed': '这未通过邮件发送。请立即保存——它只显示这一次。',
'register.success_title': '验证您的邮箱',
'register.success_msg': '验证码已发送至您的邮箱。请在下方输入以激活账户。',
'register.go_login': '前往登录',
'register.code_placeholder': '验证码',
'register.verify_btn': '验证',
'register.verifying': '验证中…',
'register.verified_title': '邮箱已验证',
'register.verified_msg': '您的账户已激活。现在可以登录了。',
'register.resend': '重新发送验证码',
'register.resend_sent': '新验证码已发送。',
'login.pending_verification': '您的邮箱尚未验证。请查看收件箱中的验证码。',
'login.verify_link': '验证邮箱',
'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': '已加入',
'explore.disabled': "This hub does not have public groups.",
// Group page
'group.default_name': '群组',
'group.tab_files': '文件',
'group.tab_chat': '聊天',
'group.tab_video': '视频',
'group.tab_music': '音乐',
'group.tab_photos': '照片',
'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.refresh_index': '刷新列表',
'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.filter_all': 'All',
'video.filter_movies': 'Movies',
'video.filter_series': 'Series',
'video.empty': '未找到视频。',
'video.no_root_configured': '此群组尚未设置视频根目录 — 操作员可以在设置中选择一个。',
'music.no_root_configured': '此群组尚未设置音乐根目录 — 操作员可以在设置中选择一个。',
'video.director': '导演',
'video.specials': '特别篇',
'video.season_n': '第 {n} 季',
'video.episode_n': '第 {n} 集',
'video.n_episodes': {
one: '{n} 集',
other: '{n} 集',
},
'video.fix_match': '修正匹配…',
'video.search_title': '更正 TMDB 匹配',
'video.search_placeholder': '搜索 TMDB…',
'video.search_button': '搜索',
'video.search_no_results': '未找到匹配项。',
'video.search_apply_hint': '将应用于当前归类在此标题下的所有文件。',
'video.search_apply_hint_movie': '仅适用于此文件。',
'video.source_file': '文件:{name}',
'video.no_match': '没有可靠的 TMDB 匹配 — 显示文件名。',
'video.rematch_one': '重新匹配',
// 音乐
'music.mode_grid': '专辑',
'music.mode_flat': '平铺列表',
'music.empty': '未找到音乐。',
'music.unknown_album': '未知专辑',
'music.various': '其他',
'music.play_all': '全部播放',
'music.n_tracks': {
one: '{n} 首曲目',
other: '{n} 首曲目',
},
'music.err_transport': '传输未连接',
'music.err_playback': '播放错误',
'music.err_transcode': '格式转换失败',
'music.player_play': '播放',
'music.player_pause': '暂停',
'music.player_prev': '上一首',
'music.player_next': '下一首',
'music.player_shuffle': '随机播放',
'music.player_repeat_off': '不重复',
'music.player_repeat_all': '全部重复',
'music.player_repeat_one': '单曲重复',
'music.player_volume': '音量',
'music.player_close': '关闭播放器',
'music.player_queue': '当前队列',
'music.queue_title': '正在播放',
// Photos
'photo.empty': '未找到照片。',
'photo.no_roots_configured': '此群组尚未设置照片根目录 — 操作员可以在设置中选择一些。',
'photo.root_album': '(顶层)',
'photo.n_photos': {
one: '{n} 张照片',
other: '{n} 张照片',
},
'photo.back': '返回',
'photo.prev': '上一张(←)',
'photo.next': '下一张(→)',
'photo.zip_album': '将相册下载为 zip',
'photo.zoom_in': '放大',
'photo.zoom_out': '缩小',
'photo.zoom_fit_title': '适应窗口',
'photo.zoom_fit_label': '适应',
'photo.zoom_100': '实际大小(100%)',
// 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': '保存',
'settings.email_saved': '邮箱已更新',
'settings.email_code_sent': '验证码已发送至您的新邮箱地址。',
'settings.email_code_placeholder': '验证码',
'settings.email_verify_btn': '验证',
'settings.email_verifying': '验证中…',
'settings.email_verified': '邮箱地址修改成功。',
'settings.notif_global_disable': '关闭所有通知',
'settings.notif_global_hint': '启用后,所有群组都不会创建通知。',
'settings.defaults': '默认值',
'settings.default_tab': 'Default tab',
'settings.default_tab_hint': 'Which tab opens first when you enter a group.',
'settings.music_keep_screen_on': 'Keep screen on during music playback',
'settings.music_keep_screen_on_hint': 'Prevents the phone from locking on its own while a track is playing.',
'settings.node_pins': 'node 身份',
'settings.node_pins_hint': '每个 node 的身份密钥都会在您首次连接时被记住。'
+ '如果它发生变化,连接会被拒绝——只有当运营者重装 node 时才应如此。'
+ '清除之前请先与对方核实。',
'settings.node_pins_count': {
other: '已固定 {n} 个',
},
'settings.node_pins_clear': '清除已固定的身份',
'settings.passphrase': '密码短语',
'settings.passphrase_hint': '更改此账户的密码短语。你的身份密钥会在其节点在线的每个群组上重新封装;对于节点离线的群组,之后需要重新加入。',
'settings.passphrase_change': '更改密码短语',
'settings.passphrase_current': '当前密码短语',
'settings.passphrase_new': '新密码短语',
'settings.passphrase_new_repeat': '再次输入新密码短语',
'settings.continue': '继续',
'settings.done': '完成',
'settings.passphrase_confirm_intro': '你的身份密钥现在将在其节点可达的每个群组上重新封装:',
'settings.passphrase_reachable': '现在更新',
'settings.passphrase_unreachable': '无法连接',
'settings.passphrase_fallback_note': '对于无法连接的群组,请让其运营者取消对你的固定并发送新的邀请码,然后重新加入。你的文件和消息不会丢失。',
'settings.passphrase_confirm_btn': '更改',
'settings.passphrase_working': '正在重新封装你的密钥…',
'settings.passphrase_done': '密码短语已更改。',
'settings.passphrase_needs_operator': '这些群组仍需处理——请让每位运营者取消对你的固定并发送新的代码:',
'settings.pw_too_short': '新密码短语至少需要 12 个字符。',
'settings.pw_mismatch': '两个新密码短语不一致。',
'settings.pw_same': '新密码短语必须与当前的不同。',
'settings.pw_wrong_current': '当前密码短语不正确。未做任何更改。',
'settings.recovery': '恢复密钥',
'settings.recovery_hint': '为每个群组添加一份用你的恢复密钥加密的身份副本。在你使用的每个浏览器中执行一次;没有它,一旦丢失密码短语就只能手动重新加入每个群组。',
'settings.recovery_loaded': '已在此浏览器中加载——新群组会自动覆盖。',
'settings.recovery_open': '输入恢复密钥',
'settings.recovery_input_ph': '粘贴你的恢复密钥',
'settings.recovery_submit': '添加备份副本',
'settings.recovery_working': '正在更新你的群组…',
'settings.recovery_done': '你的群组现在有了恢复副本。',
'settings.recovery_partial': '无法连接这些群组。稍后打开它们,或再次运行此操作:',
'settings.recovery_need_relogin': '请先退出登录再重新登录,然后重试。',
'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.',
'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.tab_general': "General",
'admin.general_groups_heading': "Groups",
'admin.allow_public_groups_label': "Allow members to create public groups",
'admin.allow_public_groups_hint': "When off, new groups can only be private and invite-only. Existing public groups are left as they are — suspend them one by one from the Groups tab.",
'admin.settings_readonly': "Only an admin can change these settings.",
// 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_revoke': "Revoke",
'admin.revoke_group_confirm': "Revoke the group \"{group}\"? This pushes a signed revocation to every node hosting it and cannot be undone from here. Suspend it instead if you only need to pause it.",
'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} 的邀请码:',
'members.invite_email_sent': '包含验证码的邮件已发送给该成员。',
'members.invite_email_failed': '无法发送邮件——请手动分享验证码。',
'members.invite_code_hint': '您也可以通过其他渠道(如短信)分享此验证码。'
+ '验证码仅可使用一次,且绝不会经过 hub。',
'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': '加入',
'group.pass_title': '输入你的密码短语',
'group.pass_hint': '此浏览器尚未解锁你的密钥。输入一次密码短语即可在此打开你的群组。',
'group.pass_btn': '解锁',
'notif.purge': '全部清除',
'notif.title': '通知',
'notif.empty': '没有通知',
'notif.mark_all_read': '全部标为已读',
// Sidebar
'sidebar.search': '搜索文件',
// Status
// Search
'search.placeholder': '在所有群组中搜索…',
'search.no_results': '没有文件符合您的搜索。',
'search.col_group': '群组',
'search.result_count': {
other: '找到 {n} 个文件',
},
'search.hint': '输入关键词搜索所有群组。',
'search.indexing': '正在索引 {done} / {total} 个群组…',
'search.unreachable': { other: '{n} 个群组无法连接' },
'search.view_files': '文件',
'search.view_videos': '视频',
'search.view_music': '音乐',
'search.view_photos': '照片',
'search.connecting': '正在连接群组…',
// 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.pair_needed': '尚未配对操作员。请输入配对码以启用管理操作(邀请、文件删除)。',
'node.pair_code_placeholder': '配对码',
'node.pair_button': '配对此浏览器',
'node.pair_success': '配对成功。',
'node.reload': '重新加载配置',
'node.reloaded': '配置已重新加载。对现有群组的目录更改现已生效。',
'node.restart_needed': '添加后请初始化群组密钥(meshbay-node gek-init --group <名称>)。',
'node.no_groups': '此 node 上未配置任何群组。',
'node.stale': '不在 hub 上',
'node.settings': 'Node settings',
'node.settings_edit_hint': 'Changes are applied immediately and saved to node.toml.',
'node.settings_save': 'Save',
'node.settings_saving': 'Saving…',
'node.settings_saved': 'Settings saved.',
'node.setting_invite_ttl': 'Invitation TTL',
'node.setting_pair_ttl': 'Pairing code TTL',
'node.setting_device_ttl': 'Device request TTL',
'node.setting_max_streams': 'Max concurrent streams',
'node.setting_transcode': 'Transcode incompatible video',
'node.setting_unit_hours': 'hours',
'node.setting_unit_minutes': 'min',
'node.setting_on': 'On',
'node.setting_off': 'Off',
'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.musicbrainz_title': 'MusicBrainz 元数据',
'settings_node.musicbrainz_hint': '当曲目没有可用的内嵌封面时,允许音乐应用显示来自 MusicBrainz 的封面和规范名称。关闭表示仅按标签/文件名浏览,不向第三方发送请求。',
'settings_node.musicbrainz_enabled': '已启用',
'settings_node.musicbrainz_disabled': '已禁用',
'settings_node.video_root_save': '保存',
'settings_node.video_root_change_confirm': '更改视频根目录会替换每位成员在"视频"标签页中看到的内容。是否继续?',
'settings_node.audio_root_title': '音乐根目录',
'settings_node.audio_root_hint': '该文件夹(或子文件夹)将作为此群组“音乐”应用的入口。在选择之前,“音乐”中不会显示任何内容,也不会读取任何标签/封面信息。',
'settings_node.audio_root_none': '— 未选择 —',
'settings_node.audio_root_save': '保存',
'settings_node.audio_root_change_confirm': '更改音乐根目录会替换每位成员在“音乐”标签页中看到的内容。是否继续?',
'settings_node.photo_roots_title': '照片根目录',
'settings_node.photo_roots_hint': '该群组“照片”应用的入口文件夹 — 照片库通常分散在多个文件夹中,因此可以选择多个。在添加至少一个之前,“照片”中不会显示任何内容。',
'settings_node.photo_roots_none': '— 未选择 —',
'settings_node.photo_roots_add_placeholder': '添加文件夹…',
'settings_node.photo_roots_add': '添加',
'settings_node.photo_roots_remove': '移除',
'settings_node.photo_roots_save': '保存',
'settings_node.directories_title': '目录',
'settings_node.directories_hint': '共享文件夹,以及“视频”“音乐”和“照片”应用各自使用哪个(些)作为入口。',
// 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.wrong_account': 'node 正在运行,但配置的用户名与您的账户不匹配。请检查 node.toml 中的 hub.username。',
'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_apps': '选择应用',
'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': '稍后完成设置',
'node.stun_servers': 'STUN Servers',
'node.stun_hint': 'Servers used for WebRTC NAT traversal (ICE candidate gathering).',
'node.stun_add': 'Add',
'node.stun_add_placeholder': 'stun:host:port',
'node.stun_remove': 'Remove',
'node.stun_move_up': 'Move up',
'node.stun_move_down': 'Move down',
'node.stun_save': 'Save',
'node.stun_saving': 'Saving…',
'node.stun_saved': 'STUN servers saved.',
'node.stun_reset': 'Reset to defaults',
'node.stun_empty': 'No STUN servers configured. NAT traversal will not work.',
'node.stun_duplicate': 'This server is already in the list.',
'node.stun_invalid': 'STUN URL must start with stun:',
'node.ice_interfaces': 'ICE Interfaces',
'node.ice_auto_hint': 'Auto mode — virtual and VPN interfaces (Tailscale, Docker, libvirt, etc.) are excluded automatically.',
'node.ice_manual_hint': 'Manual mode — only the listed interfaces are used for ICE candidate gathering.',
'node.ice_add': 'Add',
'node.ice_add_placeholder': 'e.g. eth0, wlp0s20f3',
'node.ice_remove': 'Remove',
'node.ice_save': 'Save',
'node.ice_saving': 'Saving…',
'node.ice_saved': 'ICE interfaces saved.',
'node.ice_reset_auto': 'Switch to auto',
'node.ice_duplicate': 'This interface is already in the list.',
};
|