962 lines
53 KiB
TOML
962 lines
53 KiB
TOML
# Single source of truth for every user-facing control-console and OBS string.
|
||
# Keys are stable API; add a value to every locale before using a new key.
|
||
default_language = "zh-CN"
|
||
|
||
[locales."zh-CN"]
|
||
name = "简体中文"
|
||
|
||
[locales."zh-CN".messages]
|
||
"language.label" = "语言"
|
||
"language.save_failed" = "语言偏好保存失败,请稍后重试。"
|
||
"brand.name" = "直播组件控制台"
|
||
"brand.tagline" = "OBS 组件工作室"
|
||
"common.star" = "星"
|
||
"common.cloud" = "云"
|
||
"common.copy" = "复制"
|
||
"common.copied" = "已复制"
|
||
"common.cancel" = "取消"
|
||
"common.revoke" = "撤销"
|
||
"common.save" = "保存"
|
||
"common.loading" = "正在加载…"
|
||
"common.user" = "用户"
|
||
"common.system_admin" = "系统管理员"
|
||
"common.enabled" = "运行中"
|
||
"common.disabled" = "已停用"
|
||
"common.connected" = "已连接"
|
||
"common.disconnected" = "未连接"
|
||
"common.permanent" = "永久"
|
||
"common.viewer" = "直播间观众"
|
||
"common.not_provided" = "未提供"
|
||
"common.gift" = "礼物"
|
||
"common.guard" = "舰长"
|
||
"common.failed" = "操作失败,请稍后再试"
|
||
"api.offline" = "当前处于离线状态,操作没有提交;联网后请重试。"
|
||
"api.http_error" = "请求失败(HTTP {status})"
|
||
"api.error.invalid_input" = "输入内容无效,请检查后重试。"
|
||
"api.error.invalid_credentials" = "用户名、动态验证码或会话无效。"
|
||
"api.error.forbidden" = "当前账户没有执行此操作的权限。"
|
||
"api.error.not_found" = "请求的资源不存在。"
|
||
"api.error.room_unavailable" = "该直播间已经被其他账户使用。"
|
||
"api.error.cookiecloud_invalid" = "CookieCloud 凭据无效或无法取得 Bilibili Cookie。"
|
||
"api.error.cookiecloud_host_not_allowed" = "该 CookieCloud 地址不在部署白名单中。"
|
||
"api.error.invalid_component_token" = "OBS 访问令牌无效或已经轮换。"
|
||
"api.error.component_not_found" = "组件不存在或已经停用。"
|
||
"api.error.offline" = "当前离线,操作尚未提交。"
|
||
"api.error.setup_completed" = "系统初始化已经完成。"
|
||
"api.error.rate_limited" = "尝试次数过多,请稍后重试。"
|
||
"api.error.invalid_bootstrap_proof" = "一次性初始化口令无效。"
|
||
"api.error.invalid_scope" = "请求的列表范围无效。"
|
||
"api.error.song_component_not_found" = "点歌姬不存在或已停用。"
|
||
"api.error.component_invalid" = "组件配置或类型无效。"
|
||
"api.error.component_connection_limit" = "OBS 组件连接数已达上限。"
|
||
"api.error.authentication_required" = "请先登录后再继续。"
|
||
"api.error.system_admin_required" = "该操作需要系统管理员权限。"
|
||
"api.error.cross_site_request" = "已拒绝跨站请求。"
|
||
"api.error.origin_mismatch" = "请求来源与本站不匹配。"
|
||
"api.error.enrollment_rate_limited" = "注册尝试过于频繁,请稍后重试。"
|
||
"api.error.invitation_unavailable" = "邀请码无效、已过期或已使用。"
|
||
"api.error.enrollment_unavailable" = "注册流程无效或已过期。"
|
||
"api.error.account_unavailable" = "账户不可用或用户名已被使用。"
|
||
"api.error.song_request_not_found" = "点歌记录不存在。"
|
||
"api.error.song_request_conflict" = "点歌队列已变化,请刷新后重试。"
|
||
"api.error.invalid_song_request" = "点歌操作无效。"
|
||
"api.error.internal_error" = "服务器暂时无法完成操作。"
|
||
"main.obs_missing_credentials" = "OBS 地址缺少组件标识或访问令牌"
|
||
"main.obs_invalid_token" = "OBS 访问令牌无效或已经轮换"
|
||
"main.obs_connecting" = "正在连接组件…"
|
||
"main.redirecting" = "正在前往控制台…"
|
||
"main.not_found_title" = "这里没有组件"
|
||
"main.not_found_description" = "地址可能已经失效,或者组件已被所属用户删除。"
|
||
"main.back_to_console" = "返回控制台"
|
||
"main.auth_unavailable" = "无法连接认证服务"
|
||
"main.offline_title" = "控制台目前处于离线状态"
|
||
"main.unavailable_title" = "控制台暂时无法连接"
|
||
"main.offline_description" = "应用外壳已离线打开,但账户、直播源和组件数据不会缓存。联网后即可重新验证会话。"
|
||
"main.retry" = "重新连接"
|
||
"main.verifying_session" = "正在验证安全会话…"
|
||
"main.not_found_eyebrow" = "404 · 迷失云间"
|
||
"main.offline_eyebrow" = "离线应用"
|
||
"main.connection_error_eyebrow" = "连接错误"
|
||
"auth.totp_qr_alt" = "TOTP 验证器绑定二维码"
|
||
"auth.qr_unavailable" = "二维码暂不可用,请使用右侧密钥手工添加。"
|
||
"auth.bind_authenticator" = "绑定动态验证器"
|
||
"auth.totp_step_scan" = "使用 1Password、Aegis、Microsoft Authenticator 等应用扫描二维码。"
|
||
"auth.totp_step_manual" = "若无法扫码,选择“输入设置密钥”。"
|
||
"auth.totp_step_confirm" = "输入应用中出现的 6 位动态码完成绑定。"
|
||
"auth.manual_key" = "手工设置密钥"
|
||
"auth.recovery_file_title" = "直播组件控制台恢复码"
|
||
"auth.recovery_file_warning" = "每个恢复码只能使用一次,请离线妥善保存。"
|
||
"auth.security_complete" = "安全设置完成"
|
||
"auth.save_recovery_codes" = "保存账户恢复码"
|
||
"auth.recovery_description" = "手机丢失或验证器不可用时,可用恢复码登录。服务端不会再次显示这些明文恢复码。"
|
||
"auth.no_recovery_codes" = "服务端没有返回恢复码,请先联系管理员确认恢复策略。"
|
||
"auth.copy_all" = "复制全部"
|
||
"auth.download_text" = "下载文本"
|
||
"auth.recovery_saved" = "我已妥善保存"
|
||
"auth.login_blocker" = "完成或清空正在填写的登录表单"
|
||
"auth.login_failed" = "用户名或动态验证码不正确"
|
||
"auth.product_eyebrow" = "直播组件"
|
||
"auth.login_title" = "回到你的控制台"
|
||
"auth.first_deployment" = "首次部署?"
|
||
"auth.create_admin" = "创建系统管理员"
|
||
"auth.have_invitation" = "持有邀请码?"
|
||
"auth.register_account" = "注册新账户"
|
||
"auth.passwordless_description" = "这是无密码账户。输入用户名与验证器中的动态验证码即可登录。"
|
||
"auth.username" = "用户名"
|
||
"auth.recovery_code" = "账户恢复码"
|
||
"auth.totp_code" = "6 位动态验证码"
|
||
"auth.recovery_placeholder" = "输入一个尚未使用的恢复码"
|
||
"auth.use_totp" = "改用动态验证码"
|
||
"auth.use_recovery" = "验证器不可用?改用恢复码"
|
||
"auth.verifying" = "正在验证…"
|
||
"auth.login" = "安全登录"
|
||
"auth.enrollment_blocker" = "完成 TOTP 绑定并保存一次性恢复码"
|
||
"auth.registration_blocker" = "完成或清空正在填写的注册表单"
|
||
"auth.registration_missing_id" = "服务端未返回注册流程标识"
|
||
"auth.registration_start_failed" = "无法开始安全注册流程"
|
||
"auth.registration_confirm_failed" = "动态验证码无效或注册流程已过期"
|
||
"auth.setup_step_two" = "系统初始化 · 第二步"
|
||
"auth.register_step_two" = "邀请码注册 · 第二步"
|
||
"auth.require_totp" = "强制绑定 TOTP"
|
||
"auth.authenticator_code" = "验证器中的 6 位动态码"
|
||
"auth.confirming" = "正在确认…"
|
||
"auth.confirm_create" = "确认绑定并创建账户"
|
||
"auth.setup_only" = "仅首次部署可用"
|
||
"auth.invited_only" = "仅限受邀用户"
|
||
"auth.create_your_account" = "创建你的账户"
|
||
"auth.already_account" = "已有账户?"
|
||
"auth.back_to_login" = "返回登录"
|
||
"auth.setup_description" = "首位账户将拥有邀请码管理权限。旧管理员口令只授权这一次初始化,不会成为账户密码。"
|
||
"auth.register_description" = "邀请码只用于注册;这是无密码账户,创建后每次登录都必须验证 TOTP。"
|
||
"auth.invitation" = "邀请码"
|
||
"auth.bootstrap_password" = "一次性初始化口令"
|
||
"auth.bootstrap_help" = "填写部署配置中的旧管理员口令;它仅验证初始化权限,不会保存为用户密码。"
|
||
"auth.preparing_totp" = "正在准备 TOTP…"
|
||
"auth.next_bind" = "下一步:绑定验证器"
|
||
"nav.back_components" = "返回组件控制台"
|
||
"nav.console" = "控制台导航"
|
||
"nav.components" = "我的组件"
|
||
"nav.account" = "直播账户"
|
||
"nav.invitations" = "邀请码"
|
||
"nav.logout" = "退出"
|
||
"settings.theme" = "主题"
|
||
"settings.font_family" = "中文字体"
|
||
"settings.font_family_description" = "按 OBS 所在设备已安装字体依次匹配;缺失时自动回退到衬线字体。"
|
||
"settings.font_family.song" = "宋体 · 端正"
|
||
"settings.font_family.fang_song" = "仿宋 · 清雅"
|
||
"settings.font_family.kai" = "楷体 · 书卷"
|
||
"settings.font_brightness" = "文字亮度"
|
||
"settings.font_brightness_description" = "只提亮文字,不改变透明背景、礼物图片或直播画面。"
|
||
"settings.viewer_color" = "用户昵称颜色"
|
||
"settings.danmaku_color" = "弹幕内容颜色"
|
||
"settings.use_theme_color" = "跟随主题"
|
||
"settings.text_color_description" = "选择后覆盖主题颜色;恢复后会随主题自动变化。"
|
||
"settings.font_size" = "字号"
|
||
"settings.max_visible" = "最大可见条数"
|
||
"settings.auto_collapse" = "自动收缩"
|
||
"settings.unfold_duration" = "卷轴展开时长"
|
||
"settings.motion_intensity" = "动效强度"
|
||
"settings.particle_count" = "每卡粒子数量"
|
||
"settings.particle_speed" = "粒子动画速度"
|
||
"settings.show_events" = "显示事件"
|
||
"settings.event.danmaku" = "弹幕"
|
||
"settings.event.enter" = "进房"
|
||
"settings.event.gift" = "礼物"
|
||
"settings.event.superchat" = "醒目留言"
|
||
"settings.event.guard" = "舰长"
|
||
"settings.event.like" = "点赞"
|
||
"settings.event.share" = "分享"
|
||
"settings.low_performance" = "低性能模式"
|
||
"settings.high_gift" = "高价值礼物阈值(厘)"
|
||
"settings.featured_gift" = "特别高价值阈值(厘)"
|
||
"settings.saving" = "正在保存…"
|
||
"settings.save_sync" = "保存并实时同步"
|
||
"preview.adaptive" = "自适应预览"
|
||
"preview.adaptive_description" = "预设只改变预览尺寸;OBS 浏览器源仍可使用任意宽高。"
|
||
"preview.narrow" = "窄侧栏"
|
||
"preview.portrait" = "竖屏"
|
||
"preview.hd_portrait" = "高清竖栏"
|
||
"preview.horizontal" = "横向条"
|
||
"song.settings.scroll_speed" = "滚动速度"
|
||
"song.settings.edge_pause" = "两端暂停"
|
||
"song.settings.requester_color" = "点歌用户颜色"
|
||
"song.settings.title_color" = "歌名颜色"
|
||
"song.settings.limits" = "可选防刷限制(0 表示不限制)"
|
||
"song.settings.queue_limit" = "队列上限"
|
||
"song.settings.viewer_limit" = "每位观众上限"
|
||
"song.settings.cooldown" = "点歌冷却(秒)"
|
||
"song.preview.title" = "点歌姬预览"
|
||
"song.preview.description" = "当前歌曲固定在顶部;待唱列表溢出后会往返滚动。"
|
||
"source.blocker" = "保存或还原直播源与 CookieCloud 设置"
|
||
"source.saved" = "账户直播源已保存,所有组件会共享这条事件流。"
|
||
"source.save_failed" = "直播源保存失败"
|
||
"source.title" = "Bilibili 直播源"
|
||
"source.description" = "每个账户只有一条监听连接和一份 CookieCloud 凭据;监听事件会提供给本账户的所有组件。"
|
||
"source.current_room" = "当前直播间 ID"
|
||
"source.room_help" = "保存后会断开原直播间并立即切换监听;已配置的组件和 OBS 地址不变。"
|
||
"source.cookiecloud_host" = "CookieCloud 地址"
|
||
"source.host_placeholder" = "https://cookie.example.com"
|
||
"source.cookiecloud_key" = "CookieCloud UUID / Key"
|
||
"source.cookiecloud_password" = "CookieCloud 密码"
|
||
"source.secret_keep" = "已设置;留空保持不变"
|
||
"source.key_placeholder" = "请输入同步 UUID / Key"
|
||
"source.password_placeholder" = "请输入同步密码"
|
||
"source.validating" = "正在验证并保存…"
|
||
"source.save" = "保存直播源"
|
||
"obs.blocker" = "复制并妥善保存本次生成的 OBS 地址"
|
||
"obs.status_failed" = "无法读取当前组件的 OBS 令牌状态"
|
||
"obs.rotate_confirm" = "轮换后,所有使用旧地址的 OBS 浏览器源会立即失效。确定继续吗?"
|
||
"obs.token_created" = "新 OBS 令牌已生成。请立即复制,离开本页后不会再次显示明文令牌。"
|
||
"obs.rotate_failed" = "无法轮换 OBS 令牌"
|
||
"obs.address_copied" = "OBS 浏览器源地址已复制。"
|
||
"obs.copy_blocked" = "浏览器阻止了复制,请手工选择下方地址。"
|
||
"obs.access_title" = "OBS 只读访问"
|
||
"obs.access_description" = "令牌仅能订阅这一组件;轮换不会影响账户登录或其他组件。"
|
||
"obs.access_status" = "访问状态"
|
||
"obs.token_ready" = "已生成令牌"
|
||
"obs.token_missing" = "尚未生成"
|
||
"obs.public_id" = "组件公开标识"
|
||
"obs.last_rotated" = "最近轮换"
|
||
"obs.generated_address" = "本次生成的 OBS 地址"
|
||
"obs.generating" = "正在生成…"
|
||
"obs.rotate" = "轮换令牌"
|
||
"obs.generate" = "生成 OBS 地址"
|
||
"obs.copy_address" = "复制地址"
|
||
"test.default_viewer" = "测试观众"
|
||
"test.default_text" = "今天也要闪闪发光!"
|
||
"test.default_gift" = "小花花"
|
||
"test.default_guard" = "舰长"
|
||
"test.sent" = "测试事件已发送到当前组件。"
|
||
"test.failed" = "测试事件发送失败"
|
||
"test.title" = "事件测试"
|
||
"test.description" = "模拟事件只进入当前用户、当前组件,不会向 Bilibili 发送消息。"
|
||
"test.event_type" = "事件类型"
|
||
"test.enter" = "进入直播间"
|
||
"test.uid" = "测试 UID"
|
||
"test.nickname" = "测试昵称"
|
||
"test.danmaku_text" = "弹幕内容"
|
||
"test.gift_name" = "礼物名称"
|
||
"test.gift_id" = "礼物 ID(可选)"
|
||
"test.gift_id_placeholder" = "用于测试指定礼物菜单项"
|
||
"test.quantity" = "数量"
|
||
"test.battery" = "电池数"
|
||
"test.guard" = "上舰"
|
||
"test.guard_name" = "舰队身份"
|
||
"test.price" = "价值(电池)"
|
||
"test.sending" = "正在发送…"
|
||
"test.trigger" = "触发测试事件"
|
||
"components.title" = "我的组件"
|
||
"components.eyebrow" = "直播组件"
|
||
"components.empty_title" = "还没有组件"
|
||
"components.empty_description" = "账户初始化完成后,服务会为你创建默认弹幕姬。"
|
||
"components.danmaku_mark" = "弹"
|
||
"components.song_mark" = "歌"
|
||
"components.gift_mark" = "礼"
|
||
"components.gift_menu_mark" = "单"
|
||
"components.generic_mark" = "件"
|
||
"components.danmaku_type" = "直播弹幕姬"
|
||
"components.song_type" = "直播点歌姬"
|
||
"components.gift_type" = "全屏礼物星雨"
|
||
"components.gift_menu_type" = "直播礼物菜单"
|
||
"components.coming_soon" = "即将支持"
|
||
"components.future" = "更多主题 · 互动组件"
|
||
"components.settings_blocker" = "保存或还原当前组件设置"
|
||
"components.settings_load_failed" = "无法读取组件设置"
|
||
"components.load_failed" = "控制台数据加载失败"
|
||
"components.settings_saved" = "组件设置已保存,并实时同步到已连接的 OBS。"
|
||
"components.settings_save_failed" = "组件设置保存失败"
|
||
"components.loading" = "正在打开控制台…"
|
||
"components.danmaku_settings" = "弹幕姬设置"
|
||
"components.danmaku_description" = "每一项都独立保存在当前用户的组件下。"
|
||
"components.song_settings" = "点歌姬设置"
|
||
"components.song_description" = "观众发送「点歌 歌名」入队,发送「打分 1-5」评价当前歌曲。"
|
||
"components.gift_settings" = "全屏礼物特效设置"
|
||
"components.gift_description" = "礼物化作流星横跨透明画布;舰长、提督和总督触发全屏星光献礼。"
|
||
"components.gift_menu_settings" = "礼物菜单设置"
|
||
"components.gift_menu_description" = "把当前直播间的礼物、大航海身份或指定电池单价映射为主播提供的直播内容。"
|
||
"components.open_song_stats" = "打开点歌统计"
|
||
"components.generic_settings" = "组件设置"
|
||
"components.no_editor" = "该组件类型的设置编辑器尚未安装。"
|
||
"components.welcome" = "欢迎来到直播控制台"
|
||
"components.none_configurable" = "当前账户还没有可配置的组件。"
|
||
"account.load_failed" = "无法读取账户直播源"
|
||
"account.title" = "直播账户"
|
||
"account.eyebrow" = "账户直播源"
|
||
"account.description" = "配置一次直播间与 CookieCloud,供当前账户下所有现有及未来组件使用。"
|
||
"account.loading" = "正在读取账户直播源…"
|
||
"song.queue_changing" = "点歌队列正在频繁变化,请稍后重试"
|
||
"song.queue_load_failed" = "点歌队列读取失败"
|
||
"song.cancel_confirm" = "确定取消「{title}」吗?"
|
||
"song.promoted" = "已移到下一首。"
|
||
"song.completed" = "已完成并自动切换下一首。"
|
||
"song.cancelled" = "已取消点歌。"
|
||
"song.action_failed" = "队列操作失败"
|
||
"song.clear_queue" = "一键清空队列"
|
||
"song.clearing" = "正在清空…"
|
||
"song.clear_confirm" = "确定清空当前歌曲和全部待唱歌曲吗?它们会被标记为已取消并保留在历史记录中。"
|
||
"song.cleared" = "已清空点歌队列,共取消 {count} 首歌曲。"
|
||
"song.clear_failed" = "清空点歌队列失败"
|
||
"song.stats_title" = "点歌统计与队列"
|
||
"song.stats_eyebrow" = "点歌队列管理"
|
||
"song.back_settings" = "返回组件设置"
|
||
"song.stat.active" = "活动点歌"
|
||
"song.stat.completed" = "已经完成"
|
||
"song.stat.cancelled" = "已经取消"
|
||
"song.stat.ratings" = "累计评分"
|
||
"song.current" = "当前歌曲"
|
||
"song.current_description" = "完成或取消当前歌曲后,队首会自动接替。"
|
||
"song.average_score" = "平均 {score} 分 · {count} 人评分"
|
||
"song.no_rating" = "尚无评分"
|
||
"song.complete_current" = "完成当前歌曲"
|
||
"song.no_current" = "当前没有正在演唱的歌曲。"
|
||
"song.queue_title" = "待唱队列({count})"
|
||
"song.queue_description" = "置顶会把歌曲移动为下一首,不会打断当前歌曲。"
|
||
"song.promote" = "移到下一首"
|
||
"song.queue_empty" = "待唱队列为空。"
|
||
"song.queue_loading" = "正在读取完整队列…"
|
||
"song.history" = "近期历史"
|
||
"song.history_description" = "长期历史保存在数据库中;此处显示最近 50 条。"
|
||
"song.column.title" = "歌曲"
|
||
"song.column.requester" = "点歌用户"
|
||
"song.column.result" = "结果"
|
||
"song.column.rating" = "评分"
|
||
"song.column.finished" = "结束时间"
|
||
"song.status.completed" = "已完成"
|
||
"song.status.cancelled" = "已取消"
|
||
"song.no_history" = "尚无历史记录。"
|
||
"invitation.blocker" = "复制并妥善保存本次生成的一次性邀请码"
|
||
"invitation.load_failed" = "邀请码读取失败"
|
||
"invitation.created" = "邀请码已创建。明文只显示这一次。"
|
||
"invitation.create_failed" = "邀请码创建失败"
|
||
"invitation.revoke_confirm" = "确定撤销这个邀请码吗?尚未完成的注册会立即失效。"
|
||
"invitation.revoked" = "邀请码已撤销。"
|
||
"invitation.revoke_failed" = "邀请码撤销失败"
|
||
"invitation.title" = "邀请码管理"
|
||
"invitation.eyebrow" = "系统管理"
|
||
"invitation.admin_only" = "仅系统管理员"
|
||
"invitation.create" = "创建邀请码"
|
||
"invitation.create_description" = "默认单次使用、24 小时有效;邀请码只用于注册,不能用于日常登录。"
|
||
"invitation.initial_room" = "初始 Bilibili 直播间 ID"
|
||
"invitation.valid_hours" = "有效小时数"
|
||
"invitation.creating" = "正在创建…"
|
||
"invitation.one_time" = "仅显示一次"
|
||
"invitation.copy_code" = "复制邀请码"
|
||
"invitation.copy_link" = "复制注册链接"
|
||
"invitation.history" = "历史邀请码"
|
||
"invitation.history_description" = "列表不包含邀请码明文,只显示可审计的状态和使用次数。"
|
||
"invitation.column.room" = "直播间"
|
||
"invitation.column.prefix" = "邀请码前缀"
|
||
"invitation.column.created" = "创建时间"
|
||
"invitation.column.expires" = "有效期"
|
||
"invitation.column.status" = "状态"
|
||
"invitation.status.revoked" = "已撤销"
|
||
"invitation.status.expired" = "已过期"
|
||
"invitation.status.used" = "已使用"
|
||
"invitation.status.available" = "可使用"
|
||
"invitation.empty" = "尚未创建邀请码。"
|
||
"forbidden.title" = "没有访问权限"
|
||
"forbidden.description" = "邀请码管理仅对系统管理员开放。"
|
||
"forbidden.back" = "返回我的组件"
|
||
"overlay.enter" = "进入了直播间"
|
||
"overlay.guard" = "开通 {guard}"
|
||
"overlay.like" = "点亮了一颗星"
|
||
"overlay.share" = "分享了直播间"
|
||
"overlay.gift" = "献上 {gift} ×{quantity}"
|
||
"overlay.interaction" = "送来了一份互动"
|
||
"overlay.preview_viewer" = "青玉观众"
|
||
"overlay.preview_message" = "今天也要闪闪发光!"
|
||
"overlay.preview_gift_viewer" = "星光旅人"
|
||
"overlay.preview_gift" = "甜蜜告白"
|
||
"song.overlay.preview_title" = "星河入梦"
|
||
"song.overlay.preview_viewer" = "青玉观众"
|
||
"song.overlay.preview_titles" = "晚风告白|月下花笺|云海来信|落星成诗"
|
||
"song.overlay.preview_viewers" = "星光旅人|花间客|小瓷片|月桂"
|
||
"song.overlay.score" = "{score} ★ · {count} 人"
|
||
"song.overlay.current_aria" = "当前歌曲"
|
||
"song.overlay.sing_mark" = "唱"
|
||
"song.overlay.now_singing" = "正在演唱 · {viewer} 点歌"
|
||
"song.overlay.waiting" = "等待弹幕点歌"
|
||
"song.overlay.request_help" = "发送「点歌 歌名」加入队列"
|
||
"song.overlay.rate_help" = "发送「打分 1-5」"
|
||
"song.overlay.queue_aria" = "待唱队列"
|
||
"song.overlay.queue_title" = "待唱列表"
|
||
"song.overlay.queue_empty" = "下一首,会由谁来点呢?"
|
||
"theme.jade_scroll.name" = "青玉花卷"
|
||
"theme.jade_scroll.description" = "暗蓝青玉玻璃、古风花纹、星花粒子与横向卷轴展开。"
|
||
"theme.moonlit_water.name" = "静夜曲水"
|
||
"theme.moonlit_water.description" = "完全透明的月夜水色主题:青黛与米金衬线文字、细金分隔线和克制的花星微光。"
|
||
"gift.theme.jade_starfall.name" = "青玉星落"
|
||
"gift.theme.jade_starfall.description" = "青玉、流光花卷与金色星尘组成的古风礼物流星。"
|
||
"gift.theme.moonlit_water.name" = "静夜曲水"
|
||
"gift.theme.moonlit_water.description" = "50 元以下礼物以水纹短笺轻声出现;50 元及以上礼物与大航海触发透明全屏月下清供。"
|
||
"gift.settings.thresholds" = "礼物价值分档(原始价格,1000 = 1 元)"
|
||
"gift.settings.high_threshold" = "高价值阈值"
|
||
"gift.settings.featured_threshold" = "特别高价值阈值"
|
||
"gift.settings.tiers" = "分档流星参数"
|
||
"gift.settings.tiers_description" = "流星大小以 1920×1080 为参考,其他 OBS 尺寸会按实际视口自适应。"
|
||
"gift.settings.tier.normal" = "普通礼物"
|
||
"gift.settings.tier.high" = "高价礼物"
|
||
"gift.settings.tier.featured" = "特别高价礼物"
|
||
"gift.settings.count" = "流星数量"
|
||
"gift.settings.size" = "礼物主体大小"
|
||
"gift.settings.speed" = "飞行速度"
|
||
"gift.settings.trail" = "拖尾强度"
|
||
"gift.settings.guard_stars" = "大航海星光数量"
|
||
"gift.settings.guard_duration" = "大航海全屏时长"
|
||
"gift.settings.concurrent" = "最大同时特效数"
|
||
"gift.preview.title" = "全屏礼物特效预览"
|
||
"gift.preview.description" = "预览按 16:9 缩放显示;OBS 浏览器源默认可用 1920×1080,也可使用任意分辨率。"
|
||
"gift.preview.normal_button" = "预览普通礼物"
|
||
"gift.preview.high_button" = "预览高价礼物"
|
||
"gift.preview.featured_button" = "预览特别礼物"
|
||
"gift.preview.guard_button" = "预览舰长特效"
|
||
"gift.preview.viewer" = "星光观众"
|
||
"gift.preview.normal" = "小花花"
|
||
"gift.preview.high" = "青玉献礼"
|
||
"gift.preview.featured" = "星河之梦"
|
||
"gift.preview.guard" = "舰长"
|
||
"gift.guard_aria" = "大航海全屏庆祝特效"
|
||
"gift.guard_salute" = "星河为你闪耀"
|
||
"gift.guard_title" = "{guard}·星光献礼"
|
||
"gift.guard_viewer" = "感谢 {viewer} 的守护"
|
||
"gift.moonlit.ceremony_label" = "月下清供"
|
||
"gift_menu.theme.jade_banquet.name" = "青玉华宴"
|
||
"gift_menu.theme.jade_banquet.description" = "青玉玻璃、流金花枝和星光高亮组成的古风礼物菜单。"
|
||
"gift_menu.theme.moonlit_water.name" = "静夜曲水"
|
||
"gift_menu.theme.moonlit_water.description" = "全透明的月夜礼物清单,以青黛、米金文字和细水纹高亮呈现。"
|
||
"gift_menu.catalog.title" = "当前直播间礼物目录"
|
||
"gift_menu.catalog.loading" = "正在读取礼物与图标…"
|
||
"gift_menu.catalog.count" = "已加载 {count} 种礼物"
|
||
"gift_menu.catalog.refresh" = "立即刷新礼物目录"
|
||
"gift_menu.catalog.failed" = "礼物目录读取失败"
|
||
"gift_menu.editor.add_title" = "添加菜单项"
|
||
"gift_menu.editor.trigger_type" = "触发类型"
|
||
"gift_menu.trigger.gift" = "指定普通礼物"
|
||
"gift_menu.trigger.guard" = "指定大航海身份"
|
||
"gift_menu.trigger.battery" = "指定礼物单价"
|
||
"gift_menu.editor.gift" = "直播间礼物"
|
||
"gift_menu.editor.gift_option" = "{name} · {battery} 电池"
|
||
"gift_menu.editor.guard_level" = "大航海身份"
|
||
"gift_menu.editor.battery_amount" = "单价电池数"
|
||
"gift_menu.editor.description" = "对应直播内容"
|
||
"gift_menu.editor.description_placeholder" = "例如:点歌一首 / 学唱一首歌"
|
||
"gift_menu.editor.add" = "加入礼物菜单"
|
||
"gift_menu.editor.description_required" = "请填写该礼物对应的直播内容。"
|
||
"gift_menu.editor.gift_required" = "请先从当前直播间目录选择礼物。"
|
||
"gift_menu.editor.duplicate" = "这个触发条件已经存在于菜单中。"
|
||
"gift_menu.editor.empty" = "还没有菜单项,请从上方添加。"
|
||
"gift_menu.editor.move_up" = "上移菜单项"
|
||
"gift_menu.editor.move_down" = "下移菜单项"
|
||
"gift_menu.editor.remove" = "移除"
|
||
"gift_menu.guard.captain" = "舰长"
|
||
"gift_menu.guard.admiral" = "提督"
|
||
"gift_menu.guard.governor" = "总督"
|
||
"gift_menu.guard_mark.captain" = "舰"
|
||
"gift_menu.guard_mark.admiral" = "提"
|
||
"gift_menu.guard_mark.governor" = "总"
|
||
"gift_menu.battery_mark" = "电"
|
||
"gift_menu.settings.visible_rows" = "最多展示行数"
|
||
"gift_menu.settings.rows_per_page" = "每页展示行数"
|
||
"gift_menu.settings.row_height" = "每行高度"
|
||
"gift_menu.settings.scroll_speed" = "循环滚动速度"
|
||
"gift_menu.settings.page_interval" = "换页间隔"
|
||
"gift_menu.settings.highlight_duration" = "触发高亮时长"
|
||
"gift_menu.settings.font_scale" = "文字缩放"
|
||
"gift_menu.settings.motion" = "动效强度"
|
||
"gift_menu.unit.pixels" = "{value} 像素"
|
||
"gift_menu.unit.speed" = "{value} 像素/秒"
|
||
"gift_menu.unit.seconds" = "{value} 秒"
|
||
"gift_menu.preview.title" = "礼物菜单预览"
|
||
"gift_menu.preview.description" = "点击任意菜单行可预览定位与渐变高亮动画。"
|
||
"gift_menu.aria" = "直播间礼物菜单"
|
||
"gift_menu.overlay.battery" = "电池 ×{amount}"
|
||
"gift_menu.overlay.triggered_by" = "{viewer} 已触发"
|
||
"gift_menu.overlay.empty" = "请先在控制台配置礼物菜单"
|
||
"pwa.blocked" = "暂时不能更新,请先处理以下内容:\n\n{reasons}"
|
||
"pwa.confirm_update" = "更新会刷新控制台。请先保存设置、邀请码、恢复码或刚轮换的 OBS 令牌,确定现在更新吗?"
|
||
"pwa.offline" = "离线"
|
||
"pwa.update" = "更新可用"
|
||
"pwa.install" = "安装到设备"
|
||
"pwa.manifest.name" = "直播组件控制台"
|
||
"pwa.manifest.short_name" = "直播控制台"
|
||
"pwa.manifest.description" = "直播组件与 OBS 浏览器源控制台"
|
||
|
||
[locales."en-US"]
|
||
name = "English"
|
||
|
||
[locales."en-US".messages]
|
||
"language.label" = "Language"
|
||
"language.save_failed" = "Could not save the language preference. Try again later."
|
||
"brand.name" = "Live Component Console"
|
||
"brand.tagline" = "OBS COMPONENT STUDIO"
|
||
"common.star" = "Star"
|
||
"common.cloud" = "Cloud"
|
||
"common.copy" = "Copy"
|
||
"common.copied" = "Copied"
|
||
"common.cancel" = "Cancel"
|
||
"common.revoke" = "Revoke"
|
||
"common.save" = "Save"
|
||
"common.loading" = "Loading…"
|
||
"common.user" = "User"
|
||
"common.system_admin" = "System administrator"
|
||
"common.enabled" = "Running"
|
||
"common.disabled" = "Disabled"
|
||
"common.connected" = "Connected"
|
||
"common.disconnected" = "Disconnected"
|
||
"common.permanent" = "Never"
|
||
"common.viewer" = "Viewer"
|
||
"common.not_provided" = "Not provided"
|
||
"common.gift" = "Gift"
|
||
"common.guard" = "Guard"
|
||
"common.failed" = "The operation failed. Please try again later."
|
||
"api.offline" = "You are offline. Nothing was submitted; reconnect and try again."
|
||
"api.http_error" = "Request failed (HTTP {status})"
|
||
"api.error.invalid_input" = "Check the entered values and try again."
|
||
"api.error.invalid_credentials" = "The username, verification code, or session is invalid."
|
||
"api.error.forbidden" = "This account is not allowed to perform that operation."
|
||
"api.error.not_found" = "The requested resource does not exist."
|
||
"api.error.room_unavailable" = "That live room is already used by another account."
|
||
"api.error.cookiecloud_invalid" = "CookieCloud credentials are invalid or no Bilibili cookie could be fetched."
|
||
"api.error.cookiecloud_host_not_allowed" = "That CookieCloud host is not allowed by this deployment."
|
||
"api.error.invalid_component_token" = "The OBS access token is invalid or has been rotated."
|
||
"api.error.component_not_found" = "The component does not exist or is disabled."
|
||
"api.error.offline" = "You are offline. The operation was not submitted."
|
||
"api.error.setup_completed" = "Initial system setup is already complete."
|
||
"api.error.rate_limited" = "Too many attempts. Try again later."
|
||
"api.error.invalid_bootstrap_proof" = "The one-time setup secret is invalid."
|
||
"api.error.invalid_scope" = "The requested list scope is invalid."
|
||
"api.error.song_component_not_found" = "The song request component does not exist or is disabled."
|
||
"api.error.component_invalid" = "The component configuration or kind is invalid."
|
||
"api.error.component_connection_limit" = "The OBS component connection limit has been reached."
|
||
"api.error.authentication_required" = "Log in before continuing."
|
||
"api.error.system_admin_required" = "This operation requires a system administrator."
|
||
"api.error.cross_site_request" = "The cross-site request was rejected."
|
||
"api.error.origin_mismatch" = "The request origin does not match this site."
|
||
"api.error.enrollment_rate_limited" = "Too many registration attempts. Try again later."
|
||
"api.error.invitation_unavailable" = "The invitation is invalid, expired, or already used."
|
||
"api.error.enrollment_unavailable" = "The registration flow is invalid or expired."
|
||
"api.error.account_unavailable" = "The account is unavailable or the username is already used."
|
||
"api.error.song_request_not_found" = "The song request does not exist."
|
||
"api.error.song_request_conflict" = "The song queue changed. Refresh and try again."
|
||
"api.error.invalid_song_request" = "The song request operation is invalid."
|
||
"api.error.internal_error" = "The server could not complete the operation."
|
||
"main.obs_missing_credentials" = "The OBS URL is missing a component ID or access token"
|
||
"main.obs_invalid_token" = "The OBS access token is invalid or has been rotated"
|
||
"main.obs_connecting" = "Connecting to component…"
|
||
"main.redirecting" = "Opening the studio…"
|
||
"main.not_found_title" = "Component not found"
|
||
"main.not_found_description" = "The address may have expired, or the owner deleted the component."
|
||
"main.back_to_console" = "Back to console"
|
||
"main.auth_unavailable" = "Could not connect to the authentication service"
|
||
"main.offline_title" = "The console is offline"
|
||
"main.unavailable_title" = "The studio is temporarily unavailable"
|
||
"main.offline_description" = "The app shell opened offline, but account, live-source, and component data is never cached. Reconnect to verify your session."
|
||
"main.retry" = "Reconnect"
|
||
"main.verifying_session" = "Verifying secure session…"
|
||
"main.not_found_eyebrow" = "404 · LOST IN THE CLOUDS"
|
||
"main.offline_eyebrow" = "OFFLINE APP"
|
||
"main.connection_error_eyebrow" = "CONNECTION ERROR"
|
||
"auth.totp_qr_alt" = "TOTP authenticator enrollment QR code"
|
||
"auth.qr_unavailable" = "The QR code is unavailable. Add the key manually instead."
|
||
"auth.bind_authenticator" = "Connect an authenticator"
|
||
"auth.totp_step_scan" = "Scan the QR code with 1Password, Aegis, Microsoft Authenticator, or another TOTP app."
|
||
"auth.totp_step_manual" = "If scanning fails, choose the option to enter a setup key."
|
||
"auth.totp_step_confirm" = "Enter the six-digit code from the app to finish enrollment."
|
||
"auth.manual_key" = "Manual setup key"
|
||
"auth.recovery_file_title" = "Live Component Console recovery codes"
|
||
"auth.recovery_file_warning" = "Each recovery code works once. Store this file securely offline."
|
||
"auth.security_complete" = "Security setup complete"
|
||
"auth.save_recovery_codes" = "Save account recovery codes"
|
||
"auth.recovery_description" = "Use a recovery code if your phone or authenticator is unavailable. The server will never show these plaintext codes again."
|
||
"auth.no_recovery_codes" = "The server returned no recovery codes. Contact the administrator before continuing."
|
||
"auth.copy_all" = "Copy all"
|
||
"auth.download_text" = "Download text"
|
||
"auth.recovery_saved" = "I saved them securely"
|
||
"auth.login_blocker" = "finish or clear the login form"
|
||
"auth.login_failed" = "The username or verification code is incorrect"
|
||
"auth.product_eyebrow" = "Live Components"
|
||
"auth.login_title" = "Return to your studio"
|
||
"auth.first_deployment" = "First deployment?"
|
||
"auth.create_admin" = "Create system administrator"
|
||
"auth.have_invitation" = "Have an invitation?"
|
||
"auth.register_account" = "Register an account"
|
||
"auth.passwordless_description" = "This account has no password. Enter your username and the current authenticator code."
|
||
"auth.username" = "Username"
|
||
"auth.recovery_code" = "Account recovery code"
|
||
"auth.totp_code" = "Six-digit verification code"
|
||
"auth.recovery_placeholder" = "Enter an unused recovery code"
|
||
"auth.use_totp" = "Use a verification code"
|
||
"auth.use_recovery" = "Authenticator unavailable? Use a recovery code"
|
||
"auth.verifying" = "Verifying…"
|
||
"auth.login" = "Secure login"
|
||
"auth.enrollment_blocker" = "finish TOTP enrollment and save the one-time recovery codes"
|
||
"auth.registration_blocker" = "finish or clear the registration form"
|
||
"auth.registration_missing_id" = "The server did not return a registration flow ID"
|
||
"auth.registration_start_failed" = "Could not start secure registration"
|
||
"auth.registration_confirm_failed" = "The verification code is invalid or registration expired"
|
||
"auth.setup_step_two" = "System setup · Step two"
|
||
"auth.register_step_two" = "Invited registration · Step two"
|
||
"auth.require_totp" = "TOTP is required"
|
||
"auth.authenticator_code" = "Six-digit code from your authenticator"
|
||
"auth.confirming" = "Confirming…"
|
||
"auth.confirm_create" = "Confirm and create account"
|
||
"auth.setup_only" = "Available only during first setup"
|
||
"auth.invited_only" = "Invited users only"
|
||
"auth.create_your_account" = "Create your account"
|
||
"auth.already_account" = "Already have an account?"
|
||
"auth.back_to_login" = "Back to login"
|
||
"auth.setup_description" = "The first account can manage invitations. The legacy administrator secret authorizes this setup once and never becomes an account password."
|
||
"auth.register_description" = "The invitation is only for registration. This passwordless account will require TOTP for every login."
|
||
"auth.invitation" = "Invitation code"
|
||
"auth.bootstrap_password" = "One-time setup secret"
|
||
"auth.bootstrap_help" = "Enter the legacy administrator secret from deployment configuration. It only authorizes setup and is not stored as a user password."
|
||
"auth.preparing_totp" = "Preparing TOTP…"
|
||
"auth.next_bind" = "Next: connect authenticator"
|
||
"nav.back_components" = "Back to component console"
|
||
"nav.console" = "Console navigation"
|
||
"nav.components" = "My components"
|
||
"nav.account" = "Live account"
|
||
"nav.invitations" = "Invitations"
|
||
"nav.logout" = "Log out"
|
||
"settings.theme" = "Theme"
|
||
"settings.font_family" = "Chinese typeface"
|
||
"settings.font_family_description" = "Uses the first installed font on the OBS device and falls back safely to a serif face."
|
||
"settings.font_family.song" = "Song · Formal"
|
||
"settings.font_family.fang_song" = "FangSong · Refined"
|
||
"settings.font_family.kai" = "Kai · Calligraphic"
|
||
"settings.font_brightness" = "Text brightness"
|
||
"settings.font_brightness_description" = "Brightens text only; transparency, gift artwork, and the underlying scene are unchanged."
|
||
"settings.viewer_color" = "Viewer name color"
|
||
"settings.danmaku_color" = "Chat message color"
|
||
"settings.use_theme_color" = "Use theme color"
|
||
"settings.text_color_description" = "Overrides the theme when selected; reset to follow future theme changes."
|
||
"settings.font_size" = "Font size"
|
||
"settings.max_visible" = "Maximum visible items"
|
||
"settings.auto_collapse" = "Auto-collapse"
|
||
"settings.unfold_duration" = "Scroll-open duration"
|
||
"settings.motion_intensity" = "Motion intensity"
|
||
"settings.particle_count" = "Particles per card"
|
||
"settings.particle_speed" = "Particle speed"
|
||
"settings.show_events" = "Visible events"
|
||
"settings.event.danmaku" = "Chat"
|
||
"settings.event.enter" = "Room entry"
|
||
"settings.event.gift" = "Gift"
|
||
"settings.event.superchat" = "Super Chat"
|
||
"settings.event.guard" = "Guard"
|
||
"settings.event.like" = "Like"
|
||
"settings.event.share" = "Share"
|
||
"settings.low_performance" = "Low-performance mode"
|
||
"settings.high_gift" = "High-value gift threshold (milli-CNY)"
|
||
"settings.featured_gift" = "Featured gift threshold (milli-CNY)"
|
||
"settings.saving" = "Saving…"
|
||
"settings.save_sync" = "Save and sync live"
|
||
"preview.adaptive" = "Responsive preview"
|
||
"preview.adaptive_description" = "Presets only resize the preview. OBS browser sources may use any dimensions."
|
||
"preview.narrow" = "Narrow sidebar"
|
||
"preview.portrait" = "Portrait"
|
||
"preview.hd_portrait" = "HD portrait"
|
||
"preview.horizontal" = "Horizontal bar"
|
||
"song.settings.scroll_speed" = "Scroll speed"
|
||
"song.settings.edge_pause" = "Edge pause"
|
||
"song.settings.requester_color" = "Requester color"
|
||
"song.settings.title_color" = "Song title color"
|
||
"song.settings.limits" = "Optional anti-spam limits (0 means unlimited)"
|
||
"song.settings.queue_limit" = "Queue limit"
|
||
"song.settings.viewer_limit" = "Per-viewer limit"
|
||
"song.settings.cooldown" = "Request cooldown (seconds)"
|
||
"song.preview.title" = "Song request preview"
|
||
"song.preview.description" = "The current song stays pinned while an overflowing queue scrolls back and forth."
|
||
"source.blocker" = "save or revert live-source and CookieCloud settings"
|
||
"source.saved" = "Account live source saved. Every component shares this event stream."
|
||
"source.save_failed" = "Could not save the live source"
|
||
"source.title" = "Bilibili live source"
|
||
"source.description" = "Each account has one listener and one CookieCloud credential set. Every account component can consume its events."
|
||
"source.current_room" = "Current live room ID"
|
||
"source.room_help" = "Saving disconnects the old room and immediately starts the new listener. Components and OBS URLs do not change."
|
||
"source.cookiecloud_host" = "CookieCloud host"
|
||
"source.host_placeholder" = "https://cookie.example.com"
|
||
"source.cookiecloud_key" = "CookieCloud UUID / key"
|
||
"source.cookiecloud_password" = "CookieCloud password"
|
||
"source.secret_keep" = "Already set; leave blank to keep it"
|
||
"source.key_placeholder" = "Enter sync UUID / key"
|
||
"source.password_placeholder" = "Enter sync password"
|
||
"source.validating" = "Validating and saving…"
|
||
"source.save" = "Save live source"
|
||
"obs.blocker" = "copy and securely save the newly generated OBS URL"
|
||
"obs.status_failed" = "Could not read this component's OBS token status"
|
||
"obs.rotate_confirm" = "Rotating immediately invalidates every OBS browser source using the old URL. Continue?"
|
||
"obs.token_created" = "A new OBS token was created. Copy it now; the plaintext token will not be shown again after leaving this page."
|
||
"obs.rotate_failed" = "Could not rotate the OBS token"
|
||
"obs.address_copied" = "OBS browser source URL copied."
|
||
"obs.copy_blocked" = "The browser blocked copying. Select the URL below manually."
|
||
"obs.access_title" = "Read-only OBS access"
|
||
"obs.access_description" = "This token can only subscribe to this component. Rotation does not affect account login or other components."
|
||
"obs.access_status" = "Access status"
|
||
"obs.token_ready" = "Token generated"
|
||
"obs.token_missing" = "Not generated"
|
||
"obs.public_id" = "Public component ID"
|
||
"obs.last_rotated" = "Last rotated"
|
||
"obs.generated_address" = "New OBS URL"
|
||
"obs.generating" = "Generating…"
|
||
"obs.rotate" = "Rotate token"
|
||
"obs.generate" = "Generate OBS URL"
|
||
"obs.copy_address" = "Copy URL"
|
||
"test.default_viewer" = "Test viewer"
|
||
"test.default_text" = "Shine brightly today!"
|
||
"test.default_gift" = "Little flower"
|
||
"test.default_guard" = "Captain"
|
||
"test.sent" = "The test event was sent to this component."
|
||
"test.failed" = "Could not send the test event"
|
||
"test.title" = "Event testing"
|
||
"test.description" = "Simulated events only enter this user's selected component and never send anything to Bilibili."
|
||
"test.event_type" = "Event type"
|
||
"test.enter" = "Enter room"
|
||
"test.uid" = "Test UID"
|
||
"test.nickname" = "Test nickname"
|
||
"test.danmaku_text" = "Chat message"
|
||
"test.gift_name" = "Gift name"
|
||
"test.gift_id" = "Gift ID (optional)"
|
||
"test.gift_id_placeholder" = "Tests a specific gift-menu entry"
|
||
"test.quantity" = "Quantity"
|
||
"test.battery" = "Battery value"
|
||
"test.guard" = "Guard purchase"
|
||
"test.guard_name" = "Guard tier"
|
||
"test.price" = "Value (battery)"
|
||
"test.sending" = "Sending…"
|
||
"test.trigger" = "Trigger test event"
|
||
"components.title" = "My components"
|
||
"components.eyebrow" = "LIVE COMPONENTS"
|
||
"components.empty_title" = "No components yet"
|
||
"components.empty_description" = "The service creates a default chat overlay after account initialization."
|
||
"components.danmaku_mark" = "Chat"
|
||
"components.song_mark" = "Song"
|
||
"components.gift_mark" = "Gift"
|
||
"components.gift_menu_mark" = "Menu"
|
||
"components.generic_mark" = "App"
|
||
"components.danmaku_type" = "Live chat overlay"
|
||
"components.song_type" = "Song request overlay"
|
||
"components.gift_type" = "Full-screen gift starfall"
|
||
"components.gift_menu_type" = "Live gift menu"
|
||
"components.coming_soon" = "Coming soon"
|
||
"components.future" = "More themes · Interactive components"
|
||
"components.settings_blocker" = "save or revert the current component settings"
|
||
"components.settings_load_failed" = "Could not load component settings"
|
||
"components.load_failed" = "Could not load console data"
|
||
"components.settings_saved" = "Component settings saved and synced to connected OBS sources."
|
||
"components.settings_save_failed" = "Could not save component settings"
|
||
"components.loading" = "Opening the studio…"
|
||
"components.danmaku_settings" = "Chat overlay settings"
|
||
"components.danmaku_description" = "Every setting is stored independently on this user's component."
|
||
"components.song_settings" = "Song request settings"
|
||
"components.song_description" = "Viewers send “点歌 Song name” to queue a song and “打分 1-5” to rate the current song."
|
||
"components.gift_settings" = "Full-screen gift effect settings"
|
||
"components.gift_description" = "Gifts become meteors crossing a transparent canvas; Guard, Admiral, and Governor purchases trigger a full-screen starlight celebration."
|
||
"components.gift_menu_settings" = "Gift menu settings"
|
||
"components.gift_menu_description" = "Map gifts available in the current room, membership tiers, or a gift unit price to content the streamer will perform."
|
||
"components.open_song_stats" = "Open song statistics"
|
||
"components.generic_settings" = "Component settings"
|
||
"components.no_editor" = "No settings editor is installed for this component kind."
|
||
"components.welcome" = "Welcome to Live Studio"
|
||
"components.none_configurable" = "This account has no configurable components."
|
||
"account.load_failed" = "Could not load the account live source"
|
||
"account.title" = "Live account"
|
||
"account.eyebrow" = "ACCOUNT LIVE SOURCE"
|
||
"account.description" = "Configure the room and CookieCloud once for every current and future component in this account."
|
||
"account.loading" = "Loading account live source…"
|
||
"song.queue_changing" = "The song queue is changing rapidly. Try again shortly."
|
||
"song.queue_load_failed" = "Could not load the song queue"
|
||
"song.cancel_confirm" = "Cancel “{title}”?"
|
||
"song.promoted" = "Moved to next."
|
||
"song.completed" = "Completed and advanced to the next song."
|
||
"song.cancelled" = "Song request cancelled."
|
||
"song.action_failed" = "Queue operation failed"
|
||
"song.clear_queue" = "Clear entire queue"
|
||
"song.clearing" = "Clearing…"
|
||
"song.clear_confirm" = "Clear the current song and every upcoming request? They will be marked cancelled and retained in history."
|
||
"song.cleared" = "Queue cleared. {count} requests were cancelled."
|
||
"song.clear_failed" = "Could not clear the song queue"
|
||
"song.stats_title" = "Song statistics and queue"
|
||
"song.stats_eyebrow" = "SONG QUEUE MANAGER"
|
||
"song.back_settings" = "Back to component settings"
|
||
"song.stat.active" = "Active requests"
|
||
"song.stat.completed" = "Completed"
|
||
"song.stat.cancelled" = "Cancelled"
|
||
"song.stat.ratings" = "Ratings"
|
||
"song.current" = "Current song"
|
||
"song.current_description" = "Completing or cancelling the current song automatically advances the queue."
|
||
"song.average_score" = "Average {score} · {count} ratings"
|
||
"song.no_rating" = "No ratings yet"
|
||
"song.complete_current" = "Complete current song"
|
||
"song.no_current" = "No song is currently being performed."
|
||
"song.queue_title" = "Upcoming queue ({count})"
|
||
"song.queue_description" = "Promoting makes a song next without interrupting the current song."
|
||
"song.promote" = "Move to next"
|
||
"song.queue_empty" = "The upcoming queue is empty."
|
||
"song.queue_loading" = "Loading the full queue…"
|
||
"song.history" = "Recent history"
|
||
"song.history_description" = "Full history remains in the database; the latest 50 entries are shown here."
|
||
"song.column.title" = "Song"
|
||
"song.column.requester" = "Requested by"
|
||
"song.column.result" = "Result"
|
||
"song.column.rating" = "Rating"
|
||
"song.column.finished" = "Finished"
|
||
"song.status.completed" = "Completed"
|
||
"song.status.cancelled" = "Cancelled"
|
||
"song.no_history" = "No history yet."
|
||
"invitation.blocker" = "copy and securely save the new one-time invitation"
|
||
"invitation.load_failed" = "Could not load invitations"
|
||
"invitation.created" = "Invitation created. Its plaintext is shown only once."
|
||
"invitation.create_failed" = "Could not create invitation"
|
||
"invitation.revoke_confirm" = "Revoke this invitation? Any unfinished registration will immediately fail."
|
||
"invitation.revoked" = "Invitation revoked."
|
||
"invitation.revoke_failed" = "Could not revoke invitation"
|
||
"invitation.title" = "Invitation management"
|
||
"invitation.eyebrow" = "SYSTEM ADMINISTRATION"
|
||
"invitation.admin_only" = "System administrators only"
|
||
"invitation.create" = "Create invitation"
|
||
"invitation.create_description" = "Single-use and valid for 24 hours by default. Invitations are only for registration, never daily login."
|
||
"invitation.initial_room" = "Initial Bilibili live room ID"
|
||
"invitation.valid_hours" = "Valid hours"
|
||
"invitation.creating" = "Creating…"
|
||
"invitation.one_time" = "Shown once"
|
||
"invitation.copy_code" = "Copy invitation"
|
||
"invitation.copy_link" = "Copy registration link"
|
||
"invitation.history" = "Invitation history"
|
||
"invitation.history_description" = "Plaintext codes are omitted; only auditable state and usage are shown."
|
||
"invitation.column.room" = "Live room"
|
||
"invitation.column.prefix" = "Code prefix"
|
||
"invitation.column.created" = "Created"
|
||
"invitation.column.expires" = "Expires"
|
||
"invitation.column.status" = "Status"
|
||
"invitation.status.revoked" = "Revoked"
|
||
"invitation.status.expired" = "Expired"
|
||
"invitation.status.used" = "Used"
|
||
"invitation.status.available" = "Available"
|
||
"invitation.empty" = "No invitations have been created."
|
||
"forbidden.title" = "Access denied"
|
||
"forbidden.description" = "Only system administrators can manage invitations."
|
||
"forbidden.back" = "Back to my components"
|
||
"overlay.enter" = "entered the studio"
|
||
"overlay.guard" = "activated {guard}"
|
||
"overlay.like" = "lit up a star"
|
||
"overlay.share" = "shared the live room"
|
||
"overlay.gift" = "sent {gift} ×{quantity}"
|
||
"overlay.interaction" = "sent an interaction"
|
||
"overlay.preview_viewer" = "Jade Viewer"
|
||
"overlay.preview_message" = "Shine brightly today!"
|
||
"overlay.preview_gift_viewer" = "Starlight Traveler"
|
||
"overlay.preview_gift" = "Sweet Confession"
|
||
"song.overlay.preview_title" = "Dreaming in Starlight"
|
||
"song.overlay.preview_viewer" = "Jade Viewer"
|
||
"song.overlay.preview_titles" = "Evening Breeze|Moonlit Letter|Message from the Clouds|Poem of Falling Stars"
|
||
"song.overlay.preview_viewers" = "Starlight Traveler|Garden Guest|Little Porcelain|Laurel"
|
||
"song.overlay.score" = "{score} ★ · {count} viewers"
|
||
"song.overlay.current_aria" = "Current song"
|
||
"song.overlay.sing_mark" = "Sing"
|
||
"song.overlay.now_singing" = "Now singing · requested by {viewer}"
|
||
"song.overlay.waiting" = "Waiting for a chat request"
|
||
"song.overlay.request_help" = "Send “点歌 Song name” to join the queue"
|
||
"song.overlay.rate_help" = "Send “打分 1-5”"
|
||
"song.overlay.queue_aria" = "Upcoming queue"
|
||
"song.overlay.queue_title" = "Upcoming songs"
|
||
"song.overlay.queue_empty" = "Who will request the next song?"
|
||
"theme.jade_scroll.name" = "Jade Blossom Scroll"
|
||
"theme.jade_scroll.description" = "Dark jade glass, classical floral patterns, starlight particles, and a horizontal scroll reveal."
|
||
"theme.moonlit_water.name" = "Moonlit Stillwater"
|
||
"theme.moonlit_water.description" = "A fully transparent moonlit theme with deep-jade and ivory-gold serif type, fine rules, and restrained floral starlight."
|
||
"gift.theme.jade_starfall.name" = "Jade Starfall"
|
||
"gift.theme.jade_starfall.description" = "Traditional jade, luminous floral scrollwork, and golden stardust shape each gift meteor."
|
||
"gift.theme.moonlit_water.name" = "Moonlit Stillwater"
|
||
"gift.theme.moonlit_water.description" = "Gifts below CNY 50 arrive as a quiet waterline note; CNY 50+ gifts and membership purchases receive a transparent full-scene moonlit offering."
|
||
"gift.settings.thresholds" = "Gift value tiers (raw price, 1000 = CNY 1)"
|
||
"gift.settings.high_threshold" = "High-value threshold"
|
||
"gift.settings.featured_threshold" = "Featured-value threshold"
|
||
"gift.settings.tiers" = "Meteor settings by tier"
|
||
"gift.settings.tiers_description" = "Sizes use 1920×1080 as a reference; other OBS dimensions scale responsively to their actual viewport."
|
||
"gift.settings.tier.normal" = "Normal gift"
|
||
"gift.settings.tier.high" = "High-value gift"
|
||
"gift.settings.tier.featured" = "Featured gift"
|
||
"gift.settings.count" = "Meteor count"
|
||
"gift.settings.size" = "Gift core size"
|
||
"gift.settings.speed" = "Flight speed"
|
||
"gift.settings.trail" = "Trail intensity"
|
||
"gift.settings.guard_stars" = "Membership star count"
|
||
"gift.settings.guard_duration" = "Membership full-screen duration"
|
||
"gift.settings.concurrent" = "Maximum concurrent effects"
|
||
"gift.preview.title" = "Full-screen gift effect preview"
|
||
"gift.preview.description" = "The preview is scaled to 16:9. OBS browser sources may use the 1920×1080 default or any other resolution."
|
||
"gift.preview.normal_button" = "Preview normal gift"
|
||
"gift.preview.high_button" = "Preview high-value gift"
|
||
"gift.preview.featured_button" = "Preview featured gift"
|
||
"gift.preview.guard_button" = "Preview Guard effect"
|
||
"gift.preview.viewer" = "Starlight viewer"
|
||
"gift.preview.normal" = "Little flower"
|
||
"gift.preview.high" = "Jade offering"
|
||
"gift.preview.featured" = "Dream of the Stars"
|
||
"gift.preview.guard" = "Guard"
|
||
"gift.guard_aria" = "Full-screen membership celebration"
|
||
"gift.guard_salute" = "THE STARS SHINE FOR YOU"
|
||
"gift.guard_title" = "{guard} · STARLIGHT TRIBUTE"
|
||
"gift.guard_viewer" = "Thank you, {viewer}, for your support"
|
||
"gift.moonlit.ceremony_label" = "MOONLIT OFFERING"
|
||
"gift_menu.theme.jade_banquet.name" = "Jade Banquet"
|
||
"gift_menu.theme.jade_banquet.description" = "An ornate gift menu of jade glass, gilded blossoms, and starlight highlights."
|
||
"gift_menu.theme.moonlit_water.name" = "Moonlit Stillwater"
|
||
"gift_menu.theme.moonlit_water.description" = "A fully transparent moonlit gift list with deep-jade and ivory-gold type, fine rules, and waterline highlights."
|
||
"gift_menu.catalog.title" = "Current room gift catalog"
|
||
"gift_menu.catalog.loading" = "Loading gifts and icons…"
|
||
"gift_menu.catalog.count" = "Loaded {count} gifts"
|
||
"gift_menu.catalog.refresh" = "Refresh gift catalog"
|
||
"gift_menu.catalog.failed" = "Could not load the gift catalog"
|
||
"gift_menu.editor.add_title" = "Add menu item"
|
||
"gift_menu.editor.trigger_type" = "Trigger type"
|
||
"gift_menu.trigger.gift" = "Specific regular gift"
|
||
"gift_menu.trigger.guard" = "Specific membership tier"
|
||
"gift_menu.trigger.battery" = "Specific gift unit price"
|
||
"gift_menu.editor.gift" = "Room gift"
|
||
"gift_menu.editor.gift_option" = "{name} · {battery} battery"
|
||
"gift_menu.editor.guard_level" = "Membership tier"
|
||
"gift_menu.editor.battery_amount" = "Unit price in battery"
|
||
"gift_menu.editor.description" = "Stream content"
|
||
"gift_menu.editor.description_placeholder" = "For example: request a song / learn a song"
|
||
"gift_menu.editor.add" = "Add to gift menu"
|
||
"gift_menu.editor.description_required" = "Describe the content triggered by this gift."
|
||
"gift_menu.editor.gift_required" = "Select a gift from the current room catalog first."
|
||
"gift_menu.editor.duplicate" = "This trigger is already present in the menu."
|
||
"gift_menu.editor.empty" = "No menu items yet. Add one above."
|
||
"gift_menu.editor.move_up" = "Move menu item up"
|
||
"gift_menu.editor.move_down" = "Move menu item down"
|
||
"gift_menu.editor.remove" = "Remove"
|
||
"gift_menu.guard.captain" = "Guard"
|
||
"gift_menu.guard.admiral" = "Admiral"
|
||
"gift_menu.guard.governor" = "Governor"
|
||
"gift_menu.guard_mark.captain" = "G"
|
||
"gift_menu.guard_mark.admiral" = "A"
|
||
"gift_menu.guard_mark.governor" = "V"
|
||
"gift_menu.battery_mark" = "B"
|
||
"gift_menu.settings.visible_rows" = "Maximum visible rows"
|
||
"gift_menu.settings.rows_per_page" = "Rows per page"
|
||
"gift_menu.settings.row_height" = "Row height"
|
||
"gift_menu.settings.scroll_speed" = "Loop scroll speed"
|
||
"gift_menu.settings.page_interval" = "Page interval"
|
||
"gift_menu.settings.highlight_duration" = "Trigger highlight duration"
|
||
"gift_menu.settings.font_scale" = "Text scale"
|
||
"gift_menu.settings.motion" = "Motion intensity"
|
||
"gift_menu.unit.pixels" = "{value} px"
|
||
"gift_menu.unit.speed" = "{value} px/s"
|
||
"gift_menu.unit.seconds" = "{value} s"
|
||
"gift_menu.preview.title" = "Gift menu preview"
|
||
"gift_menu.preview.description" = "Click any row to preview targeting and the gradient highlight animation."
|
||
"gift_menu.aria" = "Live room gift menu"
|
||
"gift_menu.overlay.battery" = "Battery ×{amount}"
|
||
"gift_menu.overlay.triggered_by" = "Triggered by {viewer}"
|
||
"gift_menu.overlay.empty" = "Configure the gift menu in the control console"
|
||
"pwa.blocked" = "The update is blocked. Finish these items first:\n\n{reasons}"
|
||
"pwa.confirm_update" = "Updating refreshes the console. Save settings, invitations, recovery codes, and newly rotated OBS tokens first. Update now?"
|
||
"pwa.offline" = "Offline"
|
||
"pwa.update" = "Update available"
|
||
"pwa.install" = "Install app"
|
||
"pwa.manifest.name" = "Live Component Console"
|
||
"pwa.manifest.short_name" = "Live Studio"
|
||
"pwa.manifest.description" = "Live components and OBS browser-source console"
|