/** * 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': '如果您忘记了密码短语,此密钥可恢复您的群组身份。请将其保存在密码管理器或安全的地方。', '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 上保存的密钥副本,' + '因此值得认真设置。', 'captcha.required': '请完成验证码。', 'captcha.failed': '验证码验证失败——请重试。', // 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.', 'node.overview': 'Overview', 'node.overview_version': 'Version', 'node.overview_node_id': 'Node ID', 'node.overview_quic_port': 'QUIC port', 'node.overview_hub': 'Hub', 'node.node_roster': 'Node roster', 'node.node_roster_hint': 'Every identity this node recognises, across all groups.', 'node.roster_scope': 'Scope', 'node.roster_scope_node': 'node-wide', 'node.peers_title': 'Connected peers', 'node.peers_empty': 'No peers connected.', 'node.peers_user': 'User', 'node.peers_ip': 'IP', 'node.peers_group': 'Group', 'node.peers_state': 'State', 'node.audit_title': 'Audit log', 'node.audit_all_events': 'All events', 'node.audit_empty': 'No audit entries.', 'node.audit_time': 'Time', 'node.audit_event': 'Event', 'node.audit_user': 'User', 'node.audit_ip': 'IP', 'node.audit_group': 'Group', 'node.audit_detail': 'Detail', 'node.maintenance': 'Maintenance', 'node.maintenance_cache': 'Index cache: {n} path(s) remembered.', 'node.maintenance_prune': 'Prune stale entries', 'node.maintenance_pruned': 'Pruned {n} stale cache entries.', 'node.loading': 'Loading…', 'node.audit_export': 'Export CSV', 'node.audit_exporting': 'Exporting…', 'node.audit_prev': 'Previous', 'node.audit_next': 'Next', 'node.audit_page': 'Page {n}', 'node.audit_exported': 'Exported {n} entries.', 'node.unlink_title': 'Unlink from hub', 'node.unlink_hint': 'Stops the hub from brokering connections to this node and listing it for group members. Your groups, keys, roster and files are untouched — the node keeps serving anyone who reaches it directly. Re-link any time from the group wizard or your profile.', 'node.unlink_button': 'Unlink this node', 'node.unlink_confirm': 'Unlink this node from the hub? The hub will stop routing members to it. Group data on disk is not affected.', 'node.unlink_done': 'Node unlinked from the hub. It may take a moment for the hub connection to drop.', 'node.tab_overview': 'Overview', 'node.tab_groups': 'Groups', 'node.tab_roster': 'Roster', 'node.tab_peers': 'Peers', 'node.tab_audit': 'Audit', 'node.tab_settings': 'Settings', };