summaryrefslogtreecommitdiffstats
path: root/packages/meshbay-hub/src/meshbay_hub/static/locales/zh-CN.js
blob: 89927bb67ccde0b3f4bebec3ea4aaaedf94b5b79 (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
/**
 * 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_members': '成员',
  'group.tab_settings': "设置",
  'members.danger_leave_hint': "您将无法再访问该群组的文件和聊天。",
  '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.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}',

  // 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.dl_path_note': '网页无法被指定一个路径,因此这里没有什么需要输入:'
    + '由您的浏览器授予对所选文件夹的访问权限,而 MeshBay 只会写入该文件夹之内。'
    + '每个会话可能会要求您确认一次。',
  'settings.dl_unsupported': '此浏览器无法写入您指定的文件夹(不支持 File System '
    + 'Access API),因此下载内容会进入它自己的下载文件夹。Chrome 和 Edge 支持自行选择。',
  'settings.profile': '个人资料',
  'settings.username': '用户名',
  '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': '尚未检测',
  '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 也会保留它为您固定的身份,直到其运营者将其移除。',
  'profile.title': '个人资料',
  'usermenu.profile': '个人资料',
};