411 lines
18 KiB
PHP
411 lines
18 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
return [
|
|
'title' => 'Automatizaciones',
|
|
'default_name' => 'Nueva automatización',
|
|
|
|
'actions' => [
|
|
'new' => 'Nueva automatización',
|
|
'edit' => 'Editar',
|
|
'save' => 'Guardar',
|
|
'activate' => 'Activar',
|
|
'pause' => 'Pausar',
|
|
'delete' => 'Eliminar',
|
|
'retry' => 'Reintentar',
|
|
'guide' => 'Aprende cómo funciona',
|
|
],
|
|
|
|
'tabs' => [
|
|
'build' => 'Construir',
|
|
'variables' => 'Variables',
|
|
'test' => 'Probar',
|
|
],
|
|
|
|
'nav' => [
|
|
'workflow' => 'Workflow',
|
|
'invocations' => 'Invocaciones',
|
|
'metrics' => 'Métricas',
|
|
'settings' => 'Configuración',
|
|
],
|
|
|
|
'settings' => [
|
|
'general' => 'General',
|
|
'general_description' => 'Renombra esta automatización.',
|
|
'name_label' => 'Nombre',
|
|
'name_saved' => 'Automatización renombrada.',
|
|
'status_title' => 'Estado',
|
|
'status_description' => 'Actívala para que empiece a ejecutarse, o pausa para detenerla.',
|
|
'activated_at' => 'Activada el :date',
|
|
'paused_at' => 'Pausada el :date',
|
|
'created_at' => 'Creada el :date',
|
|
'danger_title' => 'Zona de peligro',
|
|
'danger_description' => 'Acciones irreversibles.',
|
|
'delete_title' => 'Eliminar esta automatización',
|
|
'delete_description' => 'Elimina permanentemente la automatización y su historial de ejecuciones.',
|
|
],
|
|
|
|
'status_run' => [
|
|
'pending' => 'Pendiente',
|
|
'running' => 'Ejecutando',
|
|
'waiting' => 'Esperando',
|
|
'completed' => 'Completado',
|
|
'failed' => 'Fallido',
|
|
'cancelled' => 'Cancelado',
|
|
],
|
|
|
|
'node_type' => [
|
|
'trigger' => 'Disparador',
|
|
'generate' => 'Generar contenido',
|
|
'delay' => 'Espera',
|
|
'condition' => 'Condición',
|
|
'publish' => 'Publicar',
|
|
'webhook' => 'Webhook',
|
|
'end' => 'Fin',
|
|
'fetch_rss' => 'Obtener RSS',
|
|
'http_request' => 'Petición HTTP',
|
|
],
|
|
|
|
'invocations' => [
|
|
'empty' => 'Aún no hay invocaciones.',
|
|
'refresh' => 'Actualizar',
|
|
'search_placeholder' => 'Buscar por ID de ejecución…',
|
|
'copied' => 'ID de ejecución copiado.',
|
|
'loading' => 'Cargando pasos…',
|
|
'no_steps' => 'Sin pasos registrados.',
|
|
'load_error' => 'No se pudieron cargar los pasos.',
|
|
'steps' => '{0}Sin pasos|{1}:count paso|[2,*]:count pasos',
|
|
'filter' => [
|
|
'all' => 'Todos los estados',
|
|
],
|
|
'columns' => [
|
|
'timestamp' => 'Fecha',
|
|
'run' => 'Ejecución',
|
|
'status' => 'Estado',
|
|
'message' => 'Último mensaje',
|
|
'duration' => 'Duración',
|
|
],
|
|
'summary' => [
|
|
'completed' => 'Workflow completado',
|
|
'failed' => 'Workflow fallido',
|
|
'running' => 'Workflow en ejecución',
|
|
'cancelled' => 'Workflow cancelado',
|
|
'pending' => 'Workflow pendiente',
|
|
],
|
|
],
|
|
|
|
'metrics' => [
|
|
'overview' => 'Resumen',
|
|
'runs_over_time' => 'Ejecuciones a lo largo del tiempo',
|
|
'posts_by_platform' => 'Posts por plataforma',
|
|
'no_posts' => 'No se publicaron posts en este período.',
|
|
'cards' => [
|
|
'runs' => 'Total de ejecuciones',
|
|
'completed' => 'Completadas',
|
|
'failed' => 'Fallidas',
|
|
'in_progress' => 'En progreso',
|
|
'success_rate' => 'Tasa de éxito',
|
|
'avg_duration' => 'Duración media',
|
|
'posts_created' => 'Posts creados',
|
|
],
|
|
'legend' => [
|
|
'started' => 'Iniciadas',
|
|
'completed' => 'Completadas',
|
|
'failed' => 'Fallidas',
|
|
],
|
|
],
|
|
|
|
'categories' => [
|
|
'sources' => 'Fuentes',
|
|
'content' => 'Contenido',
|
|
'flow' => 'Flujo',
|
|
'output' => 'Salida',
|
|
],
|
|
|
|
'variables' => [
|
|
'title' => 'Variables del workflow',
|
|
'hint' => 'Valores reutilizables referenciados en cualquier lugar con {{ variables.KEY }}. Almacenados cifrados.',
|
|
'empty' => 'Aún no hay variables.',
|
|
'key' => 'Clave',
|
|
'value' => 'Valor',
|
|
'key_placeholder' => 'API_KEY',
|
|
'value_placeholder' => 'Valor',
|
|
'add' => 'Nueva variable',
|
|
],
|
|
|
|
'expr' => [
|
|
'trigger_event' => 'Nombre del evento del disparador',
|
|
'trigger_fired_at' => 'Cuándo se disparó',
|
|
'trigger_post_id' => 'ID del post que disparó',
|
|
'trigger_post_content' => 'Contenido del post que disparó',
|
|
'trigger_post_status' => 'Estado del post que disparó',
|
|
'trigger_post_scheduled_at' => 'Cuándo está programado el post',
|
|
'trigger_post_published_at' => 'Cuándo se publicó el post',
|
|
'fetched_title' => 'Título del ítem obtenido',
|
|
'fetched_link' => 'Enlace del ítem obtenido',
|
|
'fetched_date' => 'Fecha de publicación del ítem obtenido',
|
|
'fetched_content' => 'Contenido completo del ítem obtenido',
|
|
'fetched_description' => 'Resumen del ítem obtenido',
|
|
'fetched_author' => 'Autor del ítem obtenido',
|
|
'fetched_image' => 'URL de la imagen del ítem obtenido',
|
|
'fetched_categories' => 'Categorías del ítem obtenido',
|
|
'fetched_enclosure' => 'Multimedia del ítem (audio/vídeo/archivo)',
|
|
'fetched_pubdate' => 'Fecha de publicación del ítem obtenido',
|
|
'fetched_http' => 'Ítem HTTP obtenido (añade un campo)',
|
|
'generated_content' => 'Contenido del post generado por IA',
|
|
'generated_post_url' => 'URL del post generado por IA',
|
|
'variable' => 'Variable del flujo',
|
|
'now' => 'Fecha y hora actuales',
|
|
],
|
|
|
|
'test' => [
|
|
'description' => 'Ejecuta la automatización de punta a punta usando un payload de disparo sintético. Útil para validar cada nodo sin esperar el cronograma o el feed real.',
|
|
'starting' => 'Iniciando ejecución de prueba…',
|
|
'in_progress' => 'En progreso',
|
|
'completed' => 'Completado',
|
|
'failed' => 'Fallido',
|
|
'waiting' => 'Esperando',
|
|
'close' => 'Cerrar',
|
|
'no_node_runs' => 'Esperando que el primer nodo comience…',
|
|
'node_input' => 'Entrada',
|
|
'node_output' => 'Salida',
|
|
'node_error' => 'Error',
|
|
'no_new_items' => 'Sin elementos nuevos — no se ejecutó nada después.',
|
|
'error_starting' => 'No se pudo iniciar la ejecución de prueba.',
|
|
'with_real_data' => 'Con datos reales',
|
|
'run' => 'Ejecutar prueba',
|
|
'idle_hint' => 'Pulsa Ejecutar prueba para correr la automatización de principio a fin.',
|
|
'real_data_hint' => 'Esta prueba publicará posts, avanzará marcadores de polling y disparará efectos secundarios externos.',
|
|
'dry_badge' => 'Prueba seca',
|
|
],
|
|
|
|
'status' => [
|
|
'draft' => 'Borrador',
|
|
'active' => 'Activa',
|
|
'paused' => 'Pausada',
|
|
],
|
|
|
|
'index' => [
|
|
'empty_title' => 'Aún no hay automatizaciones',
|
|
'empty_description' => 'Crea tu primera automatización para empezar a publicar en piloto automático.',
|
|
'columns' => [
|
|
'name' => 'Nombre',
|
|
'status' => 'Estado',
|
|
'created' => 'Creada',
|
|
],
|
|
],
|
|
|
|
'form' => [
|
|
'activate_error_fallback' => 'No se pudo activar la automatización.',
|
|
'pause_error_fallback' => 'No se pudo pausar la automatización.',
|
|
'save_error_fallback' => 'No se pudo guardar la automatización.',
|
|
'save_success' => 'Automatización guardada.',
|
|
'empty_canvas_title' => 'Empieza a construir tu automatización',
|
|
'empty_canvas_description' => 'Arrastra un nodo del panel izquierdo para empezar.',
|
|
'name_placeholder' => 'Automatización sin título',
|
|
],
|
|
|
|
'nodes' => [
|
|
'trigger' => 'Disparador',
|
|
'generate' => 'Generar',
|
|
'delay' => 'Retraso',
|
|
'condition' => 'Condición',
|
|
'publish' => 'Publicar',
|
|
'webhook' => 'Webhook',
|
|
'end' => 'Terminar',
|
|
'end_summary' => 'Termina la automatización aquí',
|
|
'fetch_rss' => 'Obtener RSS',
|
|
'http_request' => 'Petición HTTP',
|
|
'handles' => [
|
|
'items' => 'con elementos',
|
|
'no_items' => 'sin elementos',
|
|
],
|
|
],
|
|
|
|
'config' => [
|
|
'select_placeholder' => 'Selecciona…',
|
|
'invalid_json' => 'Esto aún no es un JSON válido.',
|
|
'expand_editor' => 'Expandir editor',
|
|
'minimize_editor' => 'Minimizar',
|
|
|
|
'trigger' => [
|
|
'type' => 'Tipo de disparador',
|
|
'types' => [
|
|
'schedule' => 'Programación',
|
|
'post_published' => 'Cuando un post se publica',
|
|
'post_scheduled' => 'Cuando un post se programa',
|
|
],
|
|
'post_published_hint' => 'Se ejecuta cada vez que un post en este workspace se publica. El post queda disponible en {{ trigger.post }} para los siguientes nodos.',
|
|
'post_scheduled_hint' => 'Se ejecuta cada vez que un post en este workspace se programa. El post queda disponible en {{ trigger.post }}.',
|
|
|
|
'schedule' => [
|
|
'field' => 'Intervalo de disparo',
|
|
'fields' => [
|
|
'minutes' => 'Minutos',
|
|
'hours' => 'Horas',
|
|
'days' => 'Días',
|
|
'weeks' => 'Semanas',
|
|
'months' => 'Meses',
|
|
],
|
|
'minutes_interval' => 'Minutos entre disparos',
|
|
'hours_interval' => 'Horas entre disparos',
|
|
'days_interval' => 'Días entre disparos',
|
|
'hour' => 'Disparar a la hora',
|
|
'minute' => 'Disparar al minuto',
|
|
'weekdays' => 'Disparar en días',
|
|
'day_of_month' => 'Día del mes',
|
|
'weekday_names' => [
|
|
'sun' => 'Dom',
|
|
'mon' => 'Lun',
|
|
'tue' => 'Mar',
|
|
'wed' => 'Mié',
|
|
'thu' => 'Jue',
|
|
'fri' => 'Vie',
|
|
'sat' => 'Sáb',
|
|
],
|
|
'summary' => [
|
|
'every_n_minutes' => 'Se ejecuta cada minuto|Se ejecuta cada :count minutos',
|
|
'every_n_hours' => 'Se ejecuta cada hora en el minuto :minute|Se ejecuta cada :count horas en el minuto :minute',
|
|
'every_n_days' => 'Se ejecuta cada día a las :time|Se ejecuta cada :count días a las :time',
|
|
'weekly' => 'Se ejecuta :days a las :time',
|
|
'monthly' => 'Se ejecuta el día :day de cada mes a las :time',
|
|
],
|
|
],
|
|
],
|
|
'generate' => [
|
|
'social_accounts' => 'Cuentas sociales',
|
|
'social_accounts_empty' => 'Sin cuentas sociales conectadas. Conecta una primero.',
|
|
'target_slide_count' => 'Diapositivas a generar',
|
|
'prompt_template' => 'Plantilla de prompt',
|
|
'prompt_template_hint' => 'Escribe {{ para insertar datos de pasos anteriores.',
|
|
'image_count' => 'Imágenes a generar',
|
|
'image_count_hint' => '0 = post solo texto (sin imagen). 1 = imagen única. 2+ = carrusel.',
|
|
'use_brand_voice' => 'Usar voz de marca',
|
|
'use_brand_voice_hint' => 'Aplica la descripción y la voz de tu marca. Desactiva para curaduría fiel de fuentes de terceros (noticias, RSS).',
|
|
'use_brand_visuals' => 'Usar visual de marca',
|
|
'use_brand_visuals_hint' => 'Guía las imágenes de IA con los colores e identidad de tu marca. Desactiva para imágenes neutrales, guiadas solo por el tema del post.',
|
|
'style' => 'Estilo',
|
|
'account_summary' => ':count cuenta · :format|:count cuentas · :format',
|
|
'formats' => [
|
|
'single' => 'único',
|
|
'carousel' => 'carrusel',
|
|
],
|
|
],
|
|
'delay' => [
|
|
'duration' => 'Duración',
|
|
'unit' => 'Unidad',
|
|
'units' => [
|
|
'minutes' => 'Minutos',
|
|
'hours' => 'Horas',
|
|
'days' => 'Días',
|
|
],
|
|
],
|
|
'condition' => [
|
|
'field' => 'Campo',
|
|
'operator' => 'Operador',
|
|
'operators' => [
|
|
'contains' => 'contiene',
|
|
'not_contains' => 'no contiene',
|
|
'equals' => 'es igual a',
|
|
'not_equals' => 'no es igual a',
|
|
'matches' => 'coincide (regex)',
|
|
'greater_than' => 'mayor que',
|
|
'less_than' => 'menor que',
|
|
],
|
|
'value' => 'Valor',
|
|
],
|
|
'publish' => [
|
|
'mode' => 'Modo',
|
|
'modes' => [
|
|
'now' => 'Publicar ahora',
|
|
'scheduled' => 'Programar',
|
|
'draft' => 'Guardar como borrador',
|
|
],
|
|
'scheduled_offset' => 'Diferencia desde el disparador (minutos)',
|
|
'offset_summary' => ':mode · +:offset min',
|
|
],
|
|
'webhook' => [
|
|
'url' => 'URL',
|
|
'method' => 'Método',
|
|
'payload_template' => 'Plantilla de payload (JSON)',
|
|
],
|
|
'end' => [
|
|
'reason' => 'Razón (opcional)',
|
|
'reason_placeholder' => 'p.ej. Filtrado por la condición',
|
|
],
|
|
'fetch_rss' => [
|
|
'feed_url' => 'URL del feed',
|
|
'feed_url_hint' => 'En la primera ejecución, el watermark se fija en "ahora" para no inundar los siguientes nodos con ítems históricos. Ejecuciones siguientes solo ven ítems nuevos.',
|
|
'inspect' => 'Inspeccionar feed',
|
|
'inspecting' => 'Inspeccionando…',
|
|
'inspect_hint' => 'Obtén una muestra para descubrir los campos disponibles para usar en los siguientes nodos.',
|
|
'inspect_error' => 'No se pudo leer este feed. Revisa la URL e inténtalo de nuevo.',
|
|
'discovered_fields' => 'Campos disponibles',
|
|
'discovered_empty' => 'No se encontraron campos en el último ítem.',
|
|
],
|
|
'http_request' => [
|
|
'url' => 'URL',
|
|
'method' => 'Método',
|
|
'auth_type' => 'Autenticación',
|
|
'auth' => [
|
|
'none' => 'Ninguna (pública)',
|
|
'bearer' => 'Bearer token',
|
|
'basic' => 'Basic auth',
|
|
'api_key' => 'Header de API key',
|
|
],
|
|
'bearer_token' => 'Bearer token',
|
|
'basic_username' => 'Usuario',
|
|
'basic_password' => 'Contraseña',
|
|
'api_key_header' => 'Nombre del header',
|
|
'api_key_value' => 'API key',
|
|
'body_template' => 'Plantilla del body (JSON)',
|
|
'headers' => 'Headers',
|
|
'header_name' => 'Nombre del header',
|
|
'header_value' => 'Valor',
|
|
'add_header' => 'Agregar header',
|
|
'polling_section' => 'Lista y deduplicación (opcional)',
|
|
'polling_hint' => 'Cuando la respuesta es una lista, cada ítem ejecuta el flujo por separado. Un objeto único se ejecuta una vez.',
|
|
'items_path' => 'Ruta de ítems',
|
|
'items_path_hint' => 'Deja vacío si la respuesta ya es un array. Usa una ruta con puntos (ej: data.items) para un array anidado, o * para un objeto con claves por id.',
|
|
'item_key_path' => 'Ruta de clave del ítem',
|
|
'item_key_path_hint' => 'Ruta JSON a un id único (ej: id). Los ítems ya vistos se omiten, así un feed sin fechas aún reenvía solo los nuevos.',
|
|
'item_date_path' => 'Ruta de fecha del ítem',
|
|
'item_date_path_hint' => 'Ruta JSON al timestamp del ítem (ej: published_at). Preferido sobre la ruta de clave cuando existe. La primera obtención registra el punto de partida y no reenvía nada, así un feed existente nunca inunda el primer día.',
|
|
],
|
|
],
|
|
|
|
'delete' => [
|
|
'title' => 'Eliminar automatización',
|
|
'description' => '¿Estás seguro de que deseas eliminar esta automatización? Todas las ejecuciones y elementos del disparador también serán eliminados. Esta acción no se puede deshacer.',
|
|
'confirm' => 'Eliminar',
|
|
'cancel' => 'Cancelar',
|
|
],
|
|
|
|
'flash' => [
|
|
'deleted' => '¡Automatización eliminada correctamente!',
|
|
],
|
|
|
|
'errors' => [
|
|
'no_active_social_accounts' => 'No hay cuentas sociales activas configuradas para esta automatización.',
|
|
'must_have_one_trigger' => 'La automatización debe tener exactamente un nodo disparador.',
|
|
'trigger_must_be_connected' => 'El nodo disparador debe estar conectado a al menos un nodo.',
|
|
'graph_contains_cycle' => 'El grafo de la automatización contiene un ciclo.',
|
|
'only_failed_can_retry' => 'Solo se pueden reintentar ejecuciones fallidas.',
|
|
'no_generated_post' => 'No se encontró un post generado en la ejecución.',
|
|
'webhook_server_error' => 'Error del servidor del webhook.',
|
|
'webhook_request_failed' => 'No se pudo completar la solicitud del webhook.',
|
|
'webhook_missing_url' => 'Al nodo de webhook le falta la URL.',
|
|
'webhook_invalid_payload_json' => 'La plantilla de payload no es un JSON válido.',
|
|
'url_not_allowed' => 'La URL de la petición apunta a una dirección privada o inaccesible y fue bloqueada.',
|
|
'node_no_longer_exists' => 'El nodo :node_id ya no existe en la automatización.',
|
|
'no_trigger_connection' => 'Ningún nodo está conectado al nodo disparador.',
|
|
'fetch_rss_missing_url' => 'Al nodo Obtener RSS le falta la URL del feed.',
|
|
'fetch_rss_request_failed' => 'La solicitud del feed RSS falló.',
|
|
'fetch_rss_malformed' => 'El feed RSS está mal formado.',
|
|
'http_missing_url' => 'Al nodo de petición HTTP le falta la URL.',
|
|
'http_request_exception' => 'La petición HTTP lanzó una excepción.',
|
|
'http_request_failed' => 'La petición HTTP falló.',
|
|
'http_items_path_not_array' => 'El items path no resolvió a una lista.',
|
|
],
|
|
];
|