* Add workspace webhooks and drop the unused automation webhook node. Give workspaces HMAC-signed outgoing webhooks for the post lifecycle, with retry, auto-pause, replay, and live logs, and keep HTTP Request as the only outbound automation node. * Tighten webhook controller and validation after review. Drop the redundant workspace redirects, prune logs without counting, and validate events/status with Rule::enum. * Move leftover webhook UI copy behind i18n. HTTP status phrases, delete-cancel, and validation attribute names were still English literals. * Build the webhook-paused email through Maizzle. The hand-written Blade skipped the shared layout, header, and footer used by the other mail templates. * Cover real webhook dispatch paths and restyle the webhook pages. * Ask for the shared delete keyword when confirming a webhook delete. The endpoint URL is a poor confirm string; posts and assets already use the common "delete" keyword. * Fix webhook review blockers so CI can go green. Drop leftover French automation keys, stop mutating Inertia log props, and show delivered_at instead of created_at. * Close the remaining webhook review gaps. Keep Echo log updates across infinite scroll, align the channel with the policy, persist log ids across retries, and fail unknown automation nodes without throwing. * Stop webhook delivery after disable and record last sent only on success. Queued jobs now skip paused or disabled endpoints unless the user replays, and changing the URL re-pings it first. * Limit webhooks to owners and admins, and encrypt signing secrets. Members can no longer create or inspect outgoing integrations, and secrets stay encrypted at rest. * Cover webhook secret hiding, skip-ping, and failed-delivery edges. * Send the full post on webhooks after labels and platforms are saved. * Fix webhook payloads for integer media ids and type webhook status. * Split the webhook show page into focused components. * Reset live webhook logs when switching endpoints. * Keep the newest webhook logs at the top after live merges. * Cast media item ids to string without the extra scalar check. * Add post.unscheduled webhooks and put the log id on the envelope. Unscheduling is now a first-class event, and receivers can send the delivery id back so we can find the matching log. * Translate webhook event names in the UI. * Make the webhook show page full-width and stop stacking flash toasts. * Translate remaining webhook UI copy in every locale. * Sign webhook pings and drop author email from the payload. * Send signed webhook tests after create instead of pinging on save. Create and update only block private URLs so the receiver can copy the secret first. The show page then sends a signed webhook.test with an object data envelope. * Polish webhook test UX and always mint the dispatch log id in the job. Keep send-test in the actions menu (its own group) and drop the leftover constructor param so retries reuse the serialized id instead of a caller-supplied one.
402 lines
16 KiB
PHP
402 lines
16 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
return [
|
||
'mobile_notice' => '自动化编辑器在更大的屏幕上体验最佳。请在电脑上打开以搭建你的工作流。',
|
||
'title' => '自动化',
|
||
'default_name' => '新建自动化',
|
||
|
||
'actions' => [
|
||
'new' => '新建自动化',
|
||
'edit' => '编辑',
|
||
'save' => '保存',
|
||
'activate' => '启用',
|
||
'pause' => '暂停',
|
||
'delete' => '删除',
|
||
'retry' => '重试',
|
||
'guide' => '了解运作方式',
|
||
],
|
||
|
||
'tabs' => [
|
||
'build' => '搭建',
|
||
'variables' => '变量',
|
||
'test' => '测试',
|
||
],
|
||
|
||
'nav' => [
|
||
'workflow' => '工作流',
|
||
'invocations' => '执行记录',
|
||
'metrics' => '指标',
|
||
'settings' => '设置',
|
||
],
|
||
|
||
'settings' => [
|
||
'general' => '常规',
|
||
'general_description' => '重命名此自动化。',
|
||
'name_label' => '名称',
|
||
'name_saved' => '自动化已重命名。',
|
||
'status_title' => '状态',
|
||
'status_description' => '启用即开始运行,暂停即停止。',
|
||
'activated_at' => '于 :date 启用',
|
||
'paused_at' => '于 :date 暂停',
|
||
'created_at' => '于 :date 创建',
|
||
'danger_title' => '危险区域',
|
||
'danger_description' => '不可逆的操作。',
|
||
'delete_title' => '删除此自动化',
|
||
'delete_description' => '永久删除该自动化及其运行历史。',
|
||
],
|
||
|
||
'status_run' => [
|
||
'pending' => '等待中',
|
||
'running' => '运行中',
|
||
'waiting' => '等待中',
|
||
'completed' => '已完成',
|
||
'failed' => '已失败',
|
||
'cancelled' => '已取消',
|
||
],
|
||
|
||
'node_type' => [
|
||
'trigger' => '触发器',
|
||
'generate' => '生成内容',
|
||
'delay' => '延迟',
|
||
'condition' => '条件',
|
||
'publish' => '发布',
|
||
'end' => '结束',
|
||
'fetch_rss' => '抓取 RSS',
|
||
'http_request' => 'HTTP 请求',
|
||
],
|
||
|
||
'invocations' => [
|
||
'empty' => '暂无执行记录。',
|
||
'refresh' => '刷新',
|
||
'search_placeholder' => '按运行 ID 搜索…',
|
||
'copied' => '运行 ID 已复制。',
|
||
'loading' => '正在加载步骤…',
|
||
'no_steps' => '未记录任何步骤。',
|
||
'load_error' => '无法加载步骤。',
|
||
'steps' => '{0}无步骤|{1}:count 个步骤|[2,*]:count 个步骤',
|
||
'filter' => [
|
||
'all' => '所有状态',
|
||
],
|
||
'columns' => [
|
||
'timestamp' => '时间戳',
|
||
'run' => '运行',
|
||
'status' => '状态',
|
||
'message' => '最后一条消息',
|
||
'duration' => '时长',
|
||
],
|
||
'summary' => [
|
||
'completed' => '工作流已完成',
|
||
'failed' => '工作流已失败',
|
||
'running' => '工作流运行中',
|
||
'cancelled' => '工作流已取消',
|
||
'pending' => '工作流等待中',
|
||
],
|
||
],
|
||
|
||
'metrics' => [
|
||
'overview' => '概览',
|
||
'runs_over_time' => '运行次数趋势',
|
||
'posts_by_platform' => '各平台帖子数',
|
||
'no_posts' => '此时间段内未发布任何帖子。',
|
||
'cards' => [
|
||
'runs' => '总运行次数',
|
||
'completed' => '已完成',
|
||
'failed' => '已失败',
|
||
'in_progress' => '进行中',
|
||
'success_rate' => '成功率',
|
||
'avg_duration' => '平均时长',
|
||
'posts_created' => '已创建帖子数',
|
||
],
|
||
'legend' => [
|
||
'started' => '已开始',
|
||
'completed' => '已完成',
|
||
'failed' => '已失败',
|
||
],
|
||
],
|
||
|
||
'categories' => [
|
||
'sources' => '数据源',
|
||
'content' => '内容',
|
||
'flow' => '流程',
|
||
'output' => '输出',
|
||
],
|
||
|
||
'variables' => [
|
||
'title' => '工作流变量',
|
||
'hint' => '可在任意位置通过 {{ variables.KEY }} 引用的可复用值。加密存储。',
|
||
'empty' => '暂无变量。',
|
||
'key' => '键',
|
||
'value' => '值',
|
||
'key_placeholder' => 'API_KEY',
|
||
'value_placeholder' => '值',
|
||
'add' => '新建变量',
|
||
],
|
||
|
||
'expr' => [
|
||
'trigger_event' => '触发事件名称',
|
||
'trigger_fired_at' => '触发器触发时间',
|
||
'trigger_post_id' => '触发帖子 ID',
|
||
'trigger_post_content' => '触发帖子内容',
|
||
'trigger_post_status' => '触发帖子状态',
|
||
'trigger_post_scheduled_at' => '帖子的排期时间',
|
||
'trigger_post_published_at' => '帖子的发布时间',
|
||
'fetched_title' => '抓取条目的标题',
|
||
'fetched_link' => '抓取条目的链接',
|
||
'fetched_date' => '抓取条目的发布日期',
|
||
'fetched_content' => '抓取条目的完整内容',
|
||
'fetched_description' => '抓取条目的摘要',
|
||
'fetched_author' => '抓取条目的作者',
|
||
'fetched_image' => '抓取条目的图片 URL',
|
||
'fetched_categories' => '抓取条目的分类',
|
||
'fetched_enclosure' => '抓取条目的媒体(音频/视频/文件)',
|
||
'fetched_pubdate' => '抓取条目的发布日期',
|
||
'fetched_http' => '抓取的 HTTP 条目(追加一个字段)',
|
||
'generated_content' => 'AI 生成的帖子内容',
|
||
'generated_post_url' => 'AI 生成的帖子 URL',
|
||
'variable' => '工作流变量',
|
||
'now' => '当前日期和时间',
|
||
],
|
||
|
||
'test' => [
|
||
'description' => '使用合成的触发载荷端到端地运行该自动化。可用于验证每个节点,无需等待真实的排期或订阅源。',
|
||
'starting' => '正在启动测试运行…',
|
||
'in_progress' => '进行中',
|
||
'completed' => '已完成',
|
||
'failed' => '已失败',
|
||
'waiting' => '等待中',
|
||
'close' => '关闭',
|
||
'no_node_runs' => '正在等待第一个节点开始…',
|
||
'node_input' => '输入',
|
||
'node_output' => '输出',
|
||
'node_error' => '错误',
|
||
'no_new_items' => '没有新条目——后续节点未运行。',
|
||
'error_starting' => '无法启动测试运行。',
|
||
'with_real_data' => '使用真实数据',
|
||
'run' => '运行测试',
|
||
'idle_hint' => '点击“运行测试”即可端到端执行该自动化。',
|
||
'real_data_hint' => '此测试将会发布帖子、推进轮询水位线,并触发外部副作用。',
|
||
'dry_badge' => '试运行',
|
||
],
|
||
|
||
'status' => [
|
||
'draft' => '草稿',
|
||
'active' => '已启用',
|
||
'paused' => '已暂停',
|
||
],
|
||
|
||
'index' => [
|
||
'empty_title' => '暂无自动化',
|
||
'empty_description' => '创建你的第一个自动化,让发帖自动运行。',
|
||
'columns' => [
|
||
'name' => '名称',
|
||
'status' => '状态',
|
||
'created' => '创建时间',
|
||
],
|
||
],
|
||
|
||
'form' => [
|
||
'activate_error_fallback' => '无法启用自动化。',
|
||
'pause_error_fallback' => '无法暂停自动化。',
|
||
'save_error_fallback' => '无法保存自动化。',
|
||
'save_success' => '自动化已保存。',
|
||
'empty_canvas_title' => '开始搭建你的自动化',
|
||
'empty_canvas_description' => '从左侧面板拖入一个节点即可开始。',
|
||
'name_placeholder' => '未命名自动化',
|
||
],
|
||
|
||
'nodes' => [
|
||
'trigger' => '触发器',
|
||
'generate' => '生成',
|
||
'delay' => '延迟',
|
||
'condition' => '条件',
|
||
'publish' => '发布',
|
||
'end' => '结束',
|
||
'end_summary' => '在此停止自动化',
|
||
'fetch_rss' => '抓取 RSS',
|
||
'http_request' => 'HTTP 请求',
|
||
'handles' => [
|
||
'items' => '有条目',
|
||
'no_items' => '无条目',
|
||
],
|
||
],
|
||
|
||
'config' => [
|
||
'select_placeholder' => '选择…',
|
||
'invalid_json' => '这还不是有效的 JSON。',
|
||
'expand_editor' => '展开编辑器',
|
||
'minimize_editor' => '最小化',
|
||
|
||
'trigger' => [
|
||
'type' => '触发类型',
|
||
'types' => [
|
||
'schedule' => '定时',
|
||
'post_published' => '当帖子被发布时',
|
||
'post_scheduled' => '当帖子被排期时',
|
||
],
|
||
'post_published_hint' => '每当此工作区中的任意帖子被发布时运行。已发布的帖子将在 {{ trigger.post }} 处供后续节点使用。',
|
||
'post_scheduled_hint' => '每当此工作区中的任意帖子被排期时运行。已排期的帖子可在 {{ trigger.post }} 处获取。',
|
||
|
||
'schedule' => [
|
||
'field' => '触发间隔',
|
||
'fields' => [
|
||
'minutes' => '分钟',
|
||
'hours' => '小时',
|
||
'days' => '天',
|
||
'weeks' => '周',
|
||
'months' => '月',
|
||
],
|
||
'minutes_interval' => '每次触发间隔的分钟数',
|
||
'hours_interval' => '每次触发间隔的小时数',
|
||
'days_interval' => '每次触发间隔的天数',
|
||
'hour' => '触发的小时',
|
||
'minute' => '触发的分钟',
|
||
'weekdays' => '在这些工作日触发',
|
||
'day_of_month' => '每月的第几天',
|
||
'weekday_names' => [
|
||
'sun' => '周日',
|
||
'mon' => '周一',
|
||
'tue' => '周二',
|
||
'wed' => '周三',
|
||
'thu' => '周四',
|
||
'fri' => '周五',
|
||
'sat' => '周六',
|
||
],
|
||
'summary' => [
|
||
'every_n_minutes' => '每分钟运行一次|每 :count 分钟运行一次',
|
||
'every_n_hours' => '每小时在第 :minute 分钟运行|每 :count 小时在第 :minute 分钟运行',
|
||
'every_n_days' => '每天在 :time 运行|每 :count 天在 :time 运行',
|
||
'weekly' => '每 :days 在 :time 运行',
|
||
'monthly' => '每月 :day 日在 :time 运行',
|
||
],
|
||
],
|
||
],
|
||
'generate' => [
|
||
'social_accounts' => '社交账号',
|
||
'social_accounts_empty' => '没有已连接的社交账号。请先连接一个。',
|
||
'target_slide_count' => '要生成的幻灯片数量',
|
||
'prompt_template' => '提示词模板',
|
||
'prompt_template_hint' => '输入 {{ 即可插入前面步骤的数据。',
|
||
'image_count' => '要生成的图片数量',
|
||
'image_count_hint' => '0 = 纯文字帖子(无图片)。1 = 单张图片。2 及以上 = 轮播。',
|
||
'use_brand_voice' => '使用品牌语气',
|
||
'use_brand_voice_hint' => '应用你的品牌描述和语气。若要忠实呈现第三方来源(新闻、RSS),请关闭。',
|
||
'use_brand_visuals' => '使用品牌视觉',
|
||
'use_brand_visuals_hint' => '用你的品牌色彩和形象来引导 AI 图片。若要仅根据帖子主题生成中性图像,请关闭。',
|
||
'style' => '风格',
|
||
'account_summary' => ':count 个账号 · :format|:count 个账号 · :format',
|
||
'formats' => [
|
||
'single' => '单图',
|
||
'carousel' => '轮播',
|
||
],
|
||
],
|
||
'delay' => [
|
||
'duration' => '时长',
|
||
'unit' => '单位',
|
||
'units' => [
|
||
'minutes' => '分钟',
|
||
'hours' => '小时',
|
||
'days' => '天',
|
||
],
|
||
],
|
||
'condition' => [
|
||
'field' => '字段',
|
||
'operator' => '运算符',
|
||
'operators' => [
|
||
'contains' => '包含',
|
||
'not_contains' => '不包含',
|
||
'equals' => '等于',
|
||
'not_equals' => '不等于',
|
||
'matches' => '匹配(正则)',
|
||
'greater_than' => '大于',
|
||
'less_than' => '小于',
|
||
],
|
||
'value' => '值',
|
||
],
|
||
'publish' => [
|
||
'mode' => '模式',
|
||
'modes' => [
|
||
'now' => '立即发布',
|
||
'scheduled' => '排期',
|
||
'draft' => '存为草稿',
|
||
],
|
||
'scheduled_offset' => '相对触发的延迟(分钟)',
|
||
'offset_summary' => ':mode · +:offset 分钟',
|
||
],
|
||
'end' => [
|
||
'reason' => '原因(可选)',
|
||
'reason_placeholder' => '例如 被条件过滤掉',
|
||
],
|
||
'fetch_rss' => [
|
||
'feed_url' => '订阅源 URL',
|
||
'feed_url_hint' => '首次运行时,水位线会设为“当前”,以免历史条目涌入后续节点。之后的运行只会看到比上次轮询更新的条目。',
|
||
'inspect' => '检查订阅源',
|
||
'inspecting' => '检查中…',
|
||
'inspect_hint' => '抓取一份样本,以发现可在后续节点中使用的字段。',
|
||
'inspect_error' => '无法读取此订阅源。请检查 URL 后重试。',
|
||
'discovered_fields' => '可用字段',
|
||
'discovered_empty' => '在最新条目中未找到任何字段。',
|
||
],
|
||
'http_request' => [
|
||
'url' => 'URL',
|
||
'method' => '方法',
|
||
'auth_type' => '身份验证',
|
||
'auth' => [
|
||
'none' => '无(公开)',
|
||
'bearer' => 'Bearer 令牌',
|
||
'basic' => '基本认证',
|
||
'api_key' => 'API 密钥请求头',
|
||
],
|
||
'bearer_token' => 'Bearer 令牌',
|
||
'basic_username' => '用户名',
|
||
'basic_password' => '密码',
|
||
'api_key_header' => '请求头名称',
|
||
'api_key_value' => 'API 密钥',
|
||
'body_template' => '请求体模板(JSON)',
|
||
'headers' => '请求头',
|
||
'header_name' => '请求头名称',
|
||
'header_value' => '值',
|
||
'add_header' => '添加请求头',
|
||
'polling_section' => '列表与去重(可选)',
|
||
'polling_hint' => '当响应为列表时,每个条目会分别运行一次工作流。单个对象则运行一次。',
|
||
'items_path' => '条目路径',
|
||
'items_path_hint' => '如果响应本身已是数组,则留空。若为嵌套数组,请使用点分路径(例如 data.items);若为以 id 为键的对象,请使用 *。',
|
||
'item_key_path' => '条目键路径',
|
||
'item_key_path_hint' => '指向唯一 id 的 JSON 路径(例如 id)。已见过的条目会被跳过,因此即使订阅源没有日期,也只转发新条目。',
|
||
'item_date_path' => '条目日期路径',
|
||
'item_date_path_hint' => '指向条目时间戳的 JSON 路径(例如 published_at)。可用时优先于键路径。首次轮询会记录基准并不转发任何内容,因此现有订阅源第一天绝不会涌入。',
|
||
],
|
||
],
|
||
|
||
'delete' => [
|
||
'title' => '删除自动化',
|
||
'description' => '确定要删除此自动化吗?所有运行记录和触发条目也将被移除。此操作无法撤销。',
|
||
'confirm' => '删除',
|
||
'cancel' => '取消',
|
||
],
|
||
|
||
'flash' => [
|
||
'deleted' => '自动化删除成功!',
|
||
],
|
||
|
||
'errors' => [
|
||
'no_active_social_accounts' => '此自动化未配置任何已启用的社交账号。',
|
||
'must_have_one_trigger' => '自动化必须且只能有一个触发器节点。',
|
||
'trigger_must_be_connected' => '触发器节点必须至少连接到一个节点。',
|
||
'graph_contains_cycle' => '自动化流程图中包含环路。',
|
||
'only_failed_can_retry' => '只有失败的运行才能重试。',
|
||
'no_generated_post' => '在该运行中未找到已生成的帖子。',
|
||
'url_not_allowed' => '请求 URL 指向私有或无法访问的地址,已被拦截。',
|
||
'node_no_longer_exists' => '节点 :node_id 已不存在于该自动化中。',
|
||
'no_trigger_connection' => '没有节点连接到触发器节点。',
|
||
'fetch_rss_missing_url' => '抓取 RSS 节点缺少订阅源 URL。',
|
||
'fetch_rss_request_failed' => 'RSS 订阅源请求失败。',
|
||
'fetch_rss_malformed' => 'RSS 订阅源格式有误。',
|
||
'http_missing_url' => 'HTTP 请求节点缺少 URL。',
|
||
'http_request_exception' => 'HTTP 请求抛出了异常。',
|
||
'http_request_failed' => 'HTTP 请求失败。',
|
||
'http_items_path_not_array' => '条目路径未解析为列表。',
|
||
'generate_image_format_required' => 'AI 生成仅创建图片。请选择图片格式(不支持视频)。',
|
||
],
|
||
];
|