trypost/lang/ko/automations.php
Paulo Castellano 58d8e066b5
Add workspace webhooks and drop the unused automation webhook node (#326)
* 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.
2026-09-04 09:43:29 -03:00

402 lines
18 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' => '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 생성은 이미지만 만듭니다. 이미지 형식을 선택하세요(동영상 불가).',
],
];