{
  "pageTitle": "VDO.Ninja OBS 控制面板",
  "mainHeading": "VDO.Ninja OBS 控制",
  "languageSwitcher": {
    "label": "语言："
  },
  "collapsible": {
    "clickToExpand": "点击展开",
    "clickToCollapse": "点击折叠"
  },
  "customCss": {
    "title": "自定义 CSS",
    "label": "在此输入您的自定义 CSS：",
    "description": "此 CSS 将应用于源。"
  },
  "obsConnection": {
    "title": "OBS WebSocket 连接",
    "websocketUrlLabel": "WebSocket URL：",
    "passwordLabel": "密码：",
    "cameraPrefixLabel": "通用摄像头前缀：",
    "reactionPrefixLabel": "反应前缀：VDO.",
    "highlightPrefixLabel": "高亮前缀：VDO.",
    "reactionPrefixDynamicLabel": "反应前缀：{{prefix}}{{separator}}{{subPrefix}}",
    "highlightPrefixDynamicLabel": "高亮前缀：{{prefix}}{{separator}}{{subPrefix}}",
    "connectButton": "连接",
    "disconnectButton": "断开连接",
    "statusDisconnected": "状态：已断开",
    "statusConnected": "状态：已连接",
    "statusConnecting": "状态：连接中...",
    "statusError": "状态：错误",
    "statusErrorUrlMissing": "状态：错误 - URL 缺失",
    "statusErrorTimeout": "状态：错误 - 连接超时",
    "statusErrorCameraPrefixMissing": "状态：错误 - 摄像头前缀缺失"
  },
  "vdoNinjaSettings": {
    "title": "VDO.Ninja 设置",
    "baseUrlLabel": "VDO.Ninja 基础 URL：",
    "baseUrlPlaceholder": "https://vdo.ninja",
    "roomNameLabel": "房间名称：",
    "roomNamePlaceholder": "例如：MyNinjaRoom",
    "passwordLabel": "密码：",
    "passwordPlaceholder": "房间或 &password",
    "streamIdsLabel": "流 ID：",
    "streamIdsPlaceholder": "streamId1,streamId2",
    "roomOrStreamIdsNeeded": "需要房间名称或流 ID",
    "connectButton": "连接",
    "disconnectButton": "断开连接",
    "cancelButton": "取消",
    "statusDisconnected": "状态：已断开",
    "statusConnected": "状态：已连接",
    "statusConnecting": "状态：连接中...",
    "statusConnectionFailed": "状态：连接失败",
    "statusConnectionLost": "状态：连接丢失"
  },
  "streamIdMappings": {
    "title": "流 ID 映射",
    "addNewMappingButton": "添加新映射",
    "ruleTitle": "流映射规则",
    "streamIdPlaceholder": "流 ID",
    "streamIdTooltip": "VDO.Ninja 流 ID",
    "labelPlaceholder": "标签（可选）",
    "labelTooltip": "VDO.Ninja 流标签",
    "matchTypeTooltip": "如何匹配流",
    "matchType": {
        "idOnly": "仅 ID",
        "labelOnly": "仅标签",
        "bothRequired": "两者都需要",
        "eitherMatch": "任一匹配"
    },
    "targetSceneTooltip": "目标 OBS 场景",
    "selectSceneOption": "选择场景...",
    "removeRuleTooltip": "删除此映射规则",
    "cloneToMainSceneLabel": "克隆到主场景",
    "switchToSceneOnAddLabel": "添加时切换到场景",
    "ruleDescription": "定义传入流如何路由到 OBS 场景。"
  },
  "obsTargetSettings": {
    "title": "OBS 目标设置",
    "sourceCreationScenesLabel": "源创建的场景：",
    "sourceCreationScenesDesc": "选择一个或多个场景。第一个将作为主要场景，其他用于复制。",
    "loadingScenes": "加载场景中...",
    "noScenesFound": "未找到场景",
    "refetchScenesButton": "重新获取场景",
    "screenShareSettings": {
        "title": "屏幕共享设置：",
        "widthLabel": "宽度：",
        "heightLabel": "高度：",
        "resolutionNote": "此分辨率将用于具有反应布局的场景中的屏幕共享源。"
    },
    "autoAddSourcesLabel": "自动将新流添加为源",
    "autoRemoveSourcesLabel": "断开连接时自动删除源",
    "newSourceSizing": {
        "label": "默认源大小：",
        "defaultSizeOption": "默认（1920x1080 位于 0,0）",
        "bestFitOption": "最佳适配（保持纵横比）",
        "stretchToFillOption": "拉伸以填充屏幕",
        "overrideNote": "布局部分中定义的特定布局将覆盖这些场景的设置。"
    },
    "codec": {
        "label": "编解码器：",
        "noneOption": "无",
        "learnMoreTitle": "了解更多编解码器选项"
    }
  },
  "sceneLayouts": {
    "title": "场景布局",
    "addNewLayoutButton": "添加新布局",
    "description": "为特定 OBS 场景定义自动布局。这些将覆盖配置场景的默认源大小。",
    "sceneLabel": "场景：",
    "selectSceneOption": "选择场景...",
    "layoutLabel": "布局：",
    "selectLayoutOption": "选择布局...",
    "layoutTypes": {
        "grid": "网格",
        "reaction": "反应",
        "highlight": "高亮"
    },
    "noActiveLayouts": "无活动布局",
    "removeLayoutTooltip": "删除此布局配置",
    "sceneAlreadyConfiguredTooltip": "（已在使用中）",
    "sceneAlreadyConfiguredAlert": "场景 '{{sceneName}}' 已被另一个布局配置使用。",
    "controls": {
        "margin": "边距",
        "spacing": "间距",
        "offsetX": "X 偏移",
        "offsetY": "Y 偏移",
        "gridSplitScreenTwoCameras": "2 个摄像头分屏（网格）",
        "distributeCameras": "分布摄像头（反应/高亮）"
    }
  },
  "activeStreams": {
    "title": "活动流",
    "noActiveStreams": "无活动流",
    "streamIdLabel": "ID：{{id}}",
    "labelLabel": "标签：{{label}}",
    "targetSceneLabelText": "目标场景：{{sceneName}}",
    "notSet": "未设置",
    "defaultSceneTag": "默认",
    "mappedSceneTag": "已映射",
    "addedToObs": "✓ 已添加到 OBS",
    "notInObs": "✗ 不在 OBS 中",
    "buttons": {
        "addToObs": "添加到 OBS",
        "removeFromObs": "从 OBS 删除",
        "highlight": "高亮",
        "unhighlight": "取消高亮",
        "screenShare": "屏幕共享",
        "stopScreenShare": "停止屏幕共享"
    }
  },
  "log": {
    "title": "日志"
  },
  "vdoNinja": {
    "defaultStreamLabel": "流 {{id}}"
  },
  "logMessages": {
    "settingsSaved": "设置已保存。",
    "settingsLoaded": "已从 localStorage 加载设置。",
    "customCssChangedWillApplyToSource": "自定义 CSS 输入已更改。将在下次创建/更新时直接应用于 OBS 源设置。",
    "errorLoadingSettings": "从 localStorage 加载设置时出错：{{message}}。使用默认值。",
    "noSavedSettings": "未找到保存的设置。使用默认值。",
    "appInitialized": "VDO.Ninja OBS 控制面板已初始化。欢迎使用！",
    "jsShaLoaded": "jsSHA 库已成功加载（Web Crypto 的后备方案）。",
    "errorLoadingJsSha": "错误：无法加载 jsSHA 库。如果 Web Crypto 也不可用，OBS 身份验证可能会失败。",
    "loadedStreamMappings": "已加载 {{count}} 个流映射。",
    "errorLoadingStreamMappings": "从 localStorage 加载流映射时出错：{{message}}",
    "warningStreamMappingElementsNotFound": "警告：无法在流映射 UI div 中找到所有预期元素。",
    "loadedLayoutConfigs": "已加载 {{count}} 个场景布局配置。",
    "errorLoadingLayoutConfigs": "加载场景布局配置时出错：{{message}}",
    "savedLayoutConfigs": "已保存 {{count}} 个场景布局配置。",
    "errorSavingLayoutsDuplicateScene": "保存布局时出错：场景 '{{sceneName}}' 配置了多次。请确保每个场景只有一个布局。",
    "layoutSceneNotFound": "为布局保存的场景 '{{sceneName}}' 在当前 OBS 场景中未找到。",
    "errorHidingSource": "在 {{sceneName}} 中隐藏源项目 {{sourceName}} 时出错：{{message}}",
    "sceneAlreadyConfiguredError": "场景 '{{sceneName}}' 已为另一个布局配置。恢复选择。",
    "vdoNinja": {
        "disconnected": "已断开与 VDO.Ninja 的连接。",
        "alreadyConnected": "已连接到 VDO.Ninja。",
        "errorRoomOrStreamIdNeeded": "VDO.Ninja 错误：必须提供房间名称或流 ID。",
        "connectionTimeout": "VDO.Ninja 连接超时。未从 iframe 收到任何活动。",
        "roomOrStreamIdNeededForConnect": "VDO.Ninja：必须提供房间名称或特定流 ID 才能连接。",
        "streamIdsEmptyAfterTrim": "VDO.Ninja：提供了流 ID，但修剪后为空。",
        "initializingIframe": "使用 URL 初始化 VDO.Ninja iframe：{{url}}",
        "invalidBaseUrl": "设置中的 VDO.Ninja 基础 URL 无效：{{url}}",
        "iframeConnectedActive": "VDO.Ninja iframe 连接已建立并激活。",
        "streamConnectedActive": "VDO.Ninja 流已连接/激活：\"{{label}}\"（ID：{{id}}）",
        "autoAddingStream": "自动将流 {{id}} 添加到 OBS。",
        "streamDisconnectedInactive": "VDO.Ninja 流已断开/非活动：\"{{label}}\"（ID：{{id}}）",
        "autoRemovingStream": "自动从 OBS 删除流 {{id}}。",
        "streamLabelUpdated": "ID {{id}} 的 VDO.Ninja 流标签已更新：\"{{newLabel}}\"（原为 \"{{oldLabel}}\"）",
        "connectionLostResetting": "VDO.Ninja 连接丢失（iframe 无活动）。尝试重置。"
    },
    "obs": {
        "disconnecting": "正在断开 OBS WebSocket 连接...",
        "errorCameraPrefixRequired": "错误：OBS 连接需要通用摄像头前缀。",
        "errorUrlRequired": "错误：需要 OBS WebSocket URL。",
        "attemptingConnection": "尝试连接到 OBS WebSocket：{{url}}...",
        "connectionTimeout": "OBS WebSocket 连接尝试超时。",
        "connectionOpenedWaitingHello": "OBS WebSocket 连接已打开。等待服务器 Hello...",
        "receivedHelloSendingIdentify": "收到来自 OBS 的 Hello。发送 Identify...",
        "authDataPrepared": "已为 Identify 消息准备身份验证数据。",
        "warningAuthRequiredNoPassword": "警告：OBS 服务器需要身份验证，但未提供密码。",
        "authSuccessConnected": "OBS WebSocket 身份验证成功！连接已建立。",
        "requestError": "OBS 请求错误（类型：{{type}}，ID：{{id}}）：{{error}}（代码：{{code}}）",
        "eventSceneListChanged": "OBS 事件：场景列表已更改。重新获取场景。",
        "errorProcessingMessage": "处理 OBS WebSocket 消息时出错：{{message}}。数据：{{data}}",
        "webSocketError": "OBS WebSocket 错误：{{error}}",
        "authFailedReason": "身份验证失败 - 密码错误或需要身份验证但未提供。",
        "connectionClosedReasonCode": "代码：{{code}}{{wasClean}}",
        "uncleanDisconnection": "（非正常断开）",
        "connectionClosed": "OBS WebSocket 连接已关闭。原因：{{reason}}",
        "errorCreatingConnection": "创建 OBS WebSocket 连接时出错：{{message}}",
        "authGenerationError": "OBS 身份验证生成错误：{{message}}",
        "cannotSendRequestNotConnected": "无法发送请求 '{{requestType}}'：未连接到 OBS。",
        "errorSendingRequest": "发送 OBS 请求 '{{requestType}}' 时出错：{{message}}",
        "requestTimeout": "OBS 请求 '{{requestType}}'（ID：{{id}}）超时。",
        "connectionEstablishedFetchingData": "OBS 连接已完全建立。获取初始数据...",
        "errorPostConnectionSetup": "OBS 连接后设置期间出错（获取场景）：{{message}}",
        "connectionClosedOrLost": "OBS 连接已关闭或丢失。",
        "cannotFetchScenesNotConnected": "无法获取 OBS 场景：未连接到 OBS。",
        "fetchingScenes": "正在获取 OBS 场景...",
        "fetchedScenesCount": "从 OBS 获取了 {{count}} 个场景。",
        "failedToFetchScenes": "无法获取 OBS 场景或未返回场景。",
        "errorFetchingScenes": "获取 OBS 场景时出错：{{message}}",
        "cannotHighlightNotConnected": "无法高亮：未连接到 OBS。",
        "highlightLayoutActiveManualLegacy": "场景 '{{sceneName}}' 使用新的高亮布局。手动高亮按钮可能效果有限或被替代。",
        "stoppingScreenShareForHighlight": "屏幕共享处于活动状态（{{id}}）。在高亮之前停止它。",
        "cannotScreenShareNotConnected": "无法开始屏幕共享：未连接到 OBS。",
        "unhighlightingForScreenShare": "摄像头被高亮（{{id}}）。在开始屏幕共享之前取消高亮。",
        "cannotAddScreenShareNotConnected": "无法添加屏幕共享：未连接到 OBS。",
        "cannotAddScreenShareNoRoom": "无法添加屏幕共享：屏幕共享 URL 需要 VDO.Ninja 房间名称。",
        "cannotAddScreenShareNoReactionLayoutScene": "无法添加屏幕共享：没有配置反应布局的场景。",
        "addingUpdatingScreenShareToReactionScenes": "向反应场景添加/更新屏幕共享源 '{{sourceName}}'（URL：{{url}}）。在 '{{primaryScene}}' 中主要创建。（共 {{count}} 个场景）",
        "reconfiguringExistingScreenShare": "重新配置现有屏幕共享源 '{{oldName}}' 为 '{{newName}}'。",
        "reconfiguredRenamedScreenShare": "已重新配置并重命名现有屏幕共享源为 '{{sourceName}}'。",
        "screenShareExistsUpdating": "屏幕共享源 '{{sourceName}}' 已存在。更新其设置。",
        "creatingNewScreenShareInScene": "在场景 '{{sceneName}}' 中创建新的屏幕共享源 '{{sourceName}}'。",
        "ensuredTransformedScreenShareReaction": "确保并转换了反应场景 '{{sceneName}}' 中的屏幕共享源 '{{sourceName}}'。",
        "sourceFoundInSceneEnabled": "在场景 '{{sceneName}}' 中找到源 '{{sourceName}}'，项目 ID：{{itemId}}。确保其已启用。",
        "sourceAddedToScene": "源 '{{sourceName}}' 已添加到场景 '{{sceneName}}'，项目 ID：{{itemId}}。",
        "errorCreatingSceneItem": "在 '{{sceneName}}' 中为 '{{sourceName}}' 创建场景项目时出错：{{message}}",
        "errorCheckingSceneForItem": "在场景 '{{sceneName}}' 中检查 '{{sourceName}}' 时出错：{{message}}",
        "errorApplyingInitialTransform": "将初始默认变换应用于 '{{sceneName}}' 中的 '{{sourceName}}' 时出错：{{message}}",
        "successConfigScreenShare": "成功配置流 {{streamId}}（{{label}}）的屏幕共享。",
        "errorAddingUpdatingScreenShare": "添加/更新屏幕共享源 '{{sourceName}}' 时出错：{{message}}。",
        "cannotToggleHighlightNotConnected": "无法切换高亮：未连接到 OBS。",
        "streamUnhighlighted": "流 {{id}} 取消高亮（从 {{oldName}} 重命名为 {{newName}}）",
        "streamSuccessfullyUnhighlighted": "流 {{id}} 成功取消高亮（重命名为 {{newName}}）",
        "streamSuccessfullyHighlighted": "流 {{id}} 成功高亮（重命名为 {{newName}}）",
        "unhighlightError": "无法取消高亮（重命名）{{sourceName}}，可能不存在或其他错误：{{message}}",
        "highlightError": "无法高亮（重命名）{{sourceName}}，可能不存在或其他错误：{{message}}",
        "legacyHighlightUnhighlightOnRemove": "流 {{id}} 是旧版高亮。取消高亮。",
        "cannotAddStreamNotConnected": "无法将流 \"{{label}}\"（{{id}}）添加到 OBS：未连接到 OBS。",
        "cannotAddStreamNoTargetSceneName": "无法添加流 \"{{label}}\"（{{id}}）：需要目标 OBS 场景名称但未设置（无默认值且无映射）。",
        "foundExistingStandardSource": "为流 {{streamId}} 找到现有标准源 '{{sourceName}}'。",
        "foundExistingHighlightForConnectingStream": "找到与连接流 {{streamId}} 的高亮命名匹配的现有 OBS 源 '{{sourceName}}'。更新内部高亮状态。",
        "foundExistingHighlightedSource": "为流 {{streamId}} 找到现有高亮源 '{{sourceName}}'。",
        "noExistingSourceFoundWillCreate": "未找到流 {{streamId}} 的标准（'{{baseSourceName}}'）或高亮（'{{highlightedSourceName}}'）源。将创建新的。",
        "noExistingStandardSourceSamePrefix": "未找到流 {{streamId}} 的标准源 '{{sourceName}}'（高亮前缀相同）。将创建新的。",
        "errorGettingCanvasSize": "获取 OBS 画布大小时出错：{{message}}。使用默认 {{width}}x{{height}}。",
        "sourceNotGlobalCreating": "源 '{{sourceName}}' 不存在于全局。在场景 '{{sceneName}}' 中创建它。",
        "sourceCreatedAddedToScene": "源 '{{sourceName}}' 已创建并添加到场景 '{{sceneName}}'。",
        "sourceGlobalUpdatingWithUrl": "源 '{{sourceName}}' 已全局存在。更新其设置。URL：{{url}}",
        "sourceFoundAsItemInScene": "源 '{{sourceName}}' 作为项目在场景 '{{sceneName}}' 中找到。",
        "sourceNotInSceneAdding": "源 '{{sourceName}}' 不在场景 '{{sceneName}}' 中。正在添加。",
        "cloningToMainScene": "由于映射规则，将源 '{{sourceName}}' 克隆到主场景（从复选框）'{{sceneName}}'。",
        "addingSourceToOtherScene": "将源 '{{sourceName}}' 作为项目添加到其他选定场景 '{{sceneName}}'。",
        "switchingProgramScene": "切换 OBS 当前节目场景到 '{{sceneName}}'。",
        "successfullyProcessedStream": "成功处理流 \"{{label}}\"（{{id}}），有效 OBS 源：'{{sourceName}}'。",
        "errorManagingStream": "在 OBS 中管理流 '{{sourceName}}'（\"{{label}}\"）时出错：{{message}}",
        "applyTransformAndGridCalled": "为 {{sceneName}} 中的 {{sourceName}} 调用了 applyTransformAndGrid。触发场景的完整布局更新。",
        "triggeringLayoutUpdate": "触发场景 '{{sceneName}}' 的布局更新...",
        "gridFallbackSourceChanged": "'{{sourceGridScene}}'（主要后备候选）的网格设置已更改。触发反应/高亮场景 '{{dependentScene}}' 的更新。",
        "noSceneItemsForLayout": "在场景 '{{sceneName}}' 中未找到用于布局更新的场景项目。",
        "applyingConfiguredLayout": "将 '{{layoutType}}' 布局应用于场景 '{{sceneName}}'。（{{count}} 个项目）",
        "unknownLayoutType": "场景 '{{sceneName}}' 的未知布局类型 '{{layoutType}}'。应用默认大小。",
        "noSpecificLayoutApplyingDefault": "场景 '{{sceneName}}' 没有特定布局。应用默认源大小（'{{sizing}}'）。",
        "errorTriggeringLayoutUpdate": "场景 '{{sceneName}}' 的布局更新期间出错：{{message}}",
        "applyingDefaultSizing": "将默认源大小（'{{sizing}}'）应用于场景 '{{sceneName}}' 中的 {{count}} 个项目。",
        "errorApplyingDefaultTransformItem": "将默认变换应用于 {{sceneName}} 中的 {{sourceName}} 时出错：{{message}}",
        "noSourcesForGridLayout": "场景 '{{sceneName}}' 中没有 VDO.Ninja 摄像头源来应用网格布局。",
        "applyingGridLayoutScene": "将网格布局应用于场景 '{{sceneName}}' 中的 {{count}} 个 VDO.Ninja 摄像头源。",
        "applyingGridSplitScreen": "将 2 摄像头分屏网格布局应用于场景 '{{sceneName}}'。",
        "reactionMainNotFoundFallbackGrid": "在场景 '{{sceneName}}' 中未找到/不可见反应布局的主内容。应用摄像头的后备网格。",
        "highlightMainNotFoundFallbackGrid": "在场景 '{{sceneName}}' 中未找到/不可见高亮布局的主内容。应用摄像头的后备网格。",
        "usingGridSceneFallbackSettings": "使用第一个配置的网格布局场景（'{{sceneName}}'）的网格设置作为 '{{targetScene}}' 的后备。",
        "usingDefaultGridFallbackSettings": "未找到网格布局场景。使用默认网格设置作为 '{{targetScene}}' 的后备。",
        "applyingFallbackGridToCameras": "将后备网格布局应用于场景 '{{sceneName}}' 中的 {{count}} 个摄像头源。",
        "noCamerasForFallbackGridHidingAll": "场景 '{{sceneName}}' 的后备网格中没有要显示的摄像头项目。此场景中的所有 VDO 源将被隐藏。",
        "cannotRemoveStreamNotConnected": "无法从 OBS 删除流 {{id}}：未连接到 OBS。",
        "triggeredRemoval": "用户或自动触发从 OBS 删除流 '{{id}}'。基础源：'{{baseName}}'。",
        "streamScreenSharingRemoving": "流 {{id}} 正在积极共享屏幕。启动屏幕共享删除。",
        "finishedRemovingSourceItems": "完成从指定 OBS 场景删除流 {{id}} 的源项目。",
        "cannotRemoveScreenShareNotConnected": "无法删除屏幕共享：未连接到 OBS。",
        "attemptingRemoveScreenShareSource": "尝试从 OBS 完全删除屏幕共享源 '{{sourceName}}'（所有场景和输入）。",
        "removingGlobalInput": "从 OBS 删除全局输入 '{{sourceName}}'。",
        "successfullyRemovedInput": "成功删除输入 '{{sourceName}}'。",
        "errorScreenShareRemovalProcess": "'{{sourceName}}' 的屏幕共享删除过程中出错：{{message}}",
        "removingSourceItemFromScene": "从场景 '{{sceneName}}' 删除源项目 '{{sourceName}}'（ID：{{itemId}}）。",
        "errorTryingRemoveSourceItem": "尝试从场景 '{{sceneName}}' 删除源项目 '{{sourceName}}' 时出错：{{message}}",
        "codecChangedUpdatingSources": "编解码器更改为：{{codec}}。更新 OBS 源...",
        "codecChangedNotConnected": "OBS 未连接。在重新连接和新操作之前，源不会使用新编解码器更新。",
        "sourceUpdatedWithUrlAndCss": "源 '{{sourceName}}' 已使用 URL：{{url}} 和自定义 CSS 更新。",
        "screenShareSourceUpdatedWithUrlAndCss": "屏幕共享源 '{{sourceName}}' 已使用 URL：{{url}} 和自定义 CSS 更新。",
        "codecUpdateComplete": "OBS 源的编解码器更新完成。",
        "codecCssUpdateComplete": "OBS 源的编解码器/CSS 更新完成。",
        "inputNameChanged": "OBS 事件：输入名称从 '{{oldName}}' 更改为 '{{newName}}'。检查相关场景以进行布局更新。",
        "foundPreExistingHighlight": "在 OBS 中找到预先存在的高亮源：'{{sourceName}}'。将活动高亮设置为流 ID：{{streamId}}。",
        "errorCheckingMainContentEnabled": "检查主内容 {{sourceName}} 是否已启用时出错：{{message}}"
    }
  }
}
