* 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
18 KiB
PHP
402 lines
18 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
return [
|
||
'mobile_notice' => 'Otomasyon düzenleyicisi daha büyük bir ekranda en iyi şekilde çalışır. İş akışınızı oluşturmak için masaüstünde açın.',
|
||
'title' => 'Otomasyonlar',
|
||
'default_name' => 'Yeni otomasyon',
|
||
|
||
'actions' => [
|
||
'new' => 'Yeni otomasyon',
|
||
'edit' => 'Düzenle',
|
||
'save' => 'Kaydet',
|
||
'activate' => 'Etkinleştir',
|
||
'pause' => 'Duraklat',
|
||
'delete' => 'Sil',
|
||
'retry' => 'Tekrar dene',
|
||
'guide' => 'Nasıl çalıştığını öğren',
|
||
],
|
||
|
||
'tabs' => [
|
||
'build' => 'Oluştur',
|
||
'variables' => 'Değişkenler',
|
||
'test' => 'Test',
|
||
],
|
||
|
||
'nav' => [
|
||
'workflow' => 'İş Akışı',
|
||
'invocations' => 'Çalıştırmalar',
|
||
'metrics' => 'Metrikler',
|
||
'settings' => 'Ayarlar',
|
||
],
|
||
|
||
'settings' => [
|
||
'general' => 'Genel',
|
||
'general_description' => 'Bu otomasyonu yeniden adlandırın.',
|
||
'name_label' => 'Ad',
|
||
'name_saved' => 'Otomasyon yeniden adlandırıldı.',
|
||
'status_title' => 'Durum',
|
||
'status_description' => 'Çalıştırmaya başlamak için etkinleştirin veya durdurmak için duraklatın.',
|
||
'activated_at' => 'Etkinleştirildi: :date',
|
||
'paused_at' => 'Duraklatıldı: :date',
|
||
'created_at' => 'Oluşturuldu: :date',
|
||
'danger_title' => 'Tehlikeli bölge',
|
||
'danger_description' => 'Geri alınamaz işlemler.',
|
||
'delete_title' => 'Bu otomasyonu sil',
|
||
'delete_description' => 'Otomasyonu ve çalışma geçmişini kalıcı olarak kaldırır.',
|
||
],
|
||
|
||
'status_run' => [
|
||
'pending' => 'Beklemede',
|
||
'running' => 'Çalışıyor',
|
||
'waiting' => 'Bekliyor',
|
||
'completed' => 'Tamamlandı',
|
||
'failed' => 'Başarısız',
|
||
'cancelled' => 'İptal edildi',
|
||
],
|
||
|
||
'node_type' => [
|
||
'trigger' => 'Tetikleyici',
|
||
'generate' => 'İçerik oluştur',
|
||
'delay' => 'Gecikme',
|
||
'condition' => 'Koşul',
|
||
'publish' => 'Yayınla',
|
||
'end' => 'Bitir',
|
||
'fetch_rss' => 'RSS Getir',
|
||
'http_request' => 'HTTP isteği',
|
||
],
|
||
|
||
'invocations' => [
|
||
'empty' => 'Henüz çalıştırma yok.',
|
||
'refresh' => 'Yenile',
|
||
'search_placeholder' => 'Çalıştırma kimliğine göre ara…',
|
||
'copied' => 'Çalıştırma kimliği kopyalandı.',
|
||
'loading' => 'Adımlar yükleniyor…',
|
||
'no_steps' => 'Kaydedilmiş adım yok.',
|
||
'load_error' => 'Adımlar yüklenemedi.',
|
||
'steps' => '{0}Adım yok|{1}:count adım|[2,*]:count adım',
|
||
'filter' => [
|
||
'all' => 'Tüm durumlar',
|
||
],
|
||
'columns' => [
|
||
'timestamp' => 'Zaman damgası',
|
||
'run' => 'Çalıştırma',
|
||
'status' => 'Durum',
|
||
'message' => 'Son mesaj',
|
||
'duration' => 'Süre',
|
||
],
|
||
'summary' => [
|
||
'completed' => 'İş akışı tamamlandı',
|
||
'failed' => 'İş akışı başarısız oldu',
|
||
'running' => 'İş akışı çalışıyor',
|
||
'cancelled' => 'İş akışı iptal edildi',
|
||
'pending' => 'İş akışı beklemede',
|
||
],
|
||
],
|
||
|
||
'metrics' => [
|
||
'overview' => 'Genel Bakış',
|
||
'runs_over_time' => 'Zaman içindeki çalıştırmalar',
|
||
'posts_by_platform' => 'Platforma göre gönderiler',
|
||
'no_posts' => 'Bu dönemde yayınlanan gönderi yok.',
|
||
'cards' => [
|
||
'runs' => 'Toplam çalıştırma',
|
||
'completed' => 'Tamamlanan',
|
||
'failed' => 'Başarısız',
|
||
'in_progress' => 'Devam eden',
|
||
'success_rate' => 'Başarı oranı',
|
||
'avg_duration' => 'Ort. süre',
|
||
'posts_created' => 'Oluşturulan gönderi',
|
||
],
|
||
'legend' => [
|
||
'started' => 'Başlatıldı',
|
||
'completed' => 'Tamamlandı',
|
||
'failed' => 'Başarısız',
|
||
],
|
||
],
|
||
|
||
'categories' => [
|
||
'sources' => 'Kaynaklar',
|
||
'content' => 'İçerik',
|
||
'flow' => 'Akış',
|
||
'output' => 'Çıktı',
|
||
],
|
||
|
||
'variables' => [
|
||
'title' => 'İş akışı değişkenleri',
|
||
'hint' => '{{ variables.KEY }} ile herhangi bir yerde başvurulan yeniden kullanılabilir değerler. Şifrelenmiş olarak saklanır.',
|
||
'empty' => 'Henüz değişken yok.',
|
||
'key' => 'Anahtar',
|
||
'value' => 'Değer',
|
||
'key_placeholder' => 'API_KEY',
|
||
'value_placeholder' => 'Değer',
|
||
'add' => 'Yeni değişken',
|
||
],
|
||
|
||
'expr' => [
|
||
'trigger_event' => 'Tetikleyici olay adı',
|
||
'trigger_fired_at' => 'Tetikleyicinin tetiklenme zamanı',
|
||
'trigger_post_id' => 'Tetikleyen gönderi kimliği',
|
||
'trigger_post_content' => 'Tetikleyen gönderi içeriği',
|
||
'trigger_post_status' => 'Tetikleyen gönderi durumu',
|
||
'trigger_post_scheduled_at' => 'Gönderinin zamanlandığı an',
|
||
'trigger_post_published_at' => 'Gönderinin yayınlandığı an',
|
||
'fetched_title' => 'Getirilen öğe başlığı',
|
||
'fetched_link' => 'Getirilen öğe bağlantısı',
|
||
'fetched_date' => 'Getirilen öğe yayın tarihi',
|
||
'fetched_content' => 'Getirilen öğenin tam içeriği',
|
||
'fetched_description' => 'Getirilen öğe özeti',
|
||
'fetched_author' => 'Getirilen öğe yazarı',
|
||
'fetched_image' => 'Getirilen öğe görsel URL\'si',
|
||
'fetched_categories' => 'Getirilen öğe kategorileri',
|
||
'fetched_enclosure' => 'Getirilen öğe medyası (ses/video/dosya)',
|
||
'fetched_pubdate' => 'Getirilen öğe yayın tarihi',
|
||
'fetched_http' => 'Getirilen HTTP öğesi (bir alan ekleyin)',
|
||
'generated_content' => 'AI ile oluşturulan gönderi içeriği',
|
||
'generated_post_url' => 'AI ile oluşturulan gönderi URL\'si',
|
||
'variable' => 'İş akışı değişkeni',
|
||
'now' => 'Geçerli tarih ve saat',
|
||
],
|
||
|
||
'test' => [
|
||
'description' => 'Otomasyonu, sentezlenmiş bir tetikleyici yükü kullanarak baştan sona çalıştırır. Gerçek zamanlamayı veya beslemeyi beklemeden her düğümü doğrulamak için kullanışlıdır.',
|
||
'starting' => 'Test çalıştırması başlatılıyor…',
|
||
'in_progress' => 'Devam ediyor',
|
||
'completed' => 'Tamamlandı',
|
||
'failed' => 'Başarısız',
|
||
'waiting' => 'Bekliyor',
|
||
'close' => 'Kapat',
|
||
'no_node_runs' => 'İlk düğümün başlaması bekleniyor…',
|
||
'node_input' => 'Girdi',
|
||
'node_output' => 'Çıktı',
|
||
'node_error' => 'Hata',
|
||
'no_new_items' => 'Yeni öğe yok — sonraki hiçbir adım çalışmadı.',
|
||
'error_starting' => 'Test çalıştırması başlatılamadı.',
|
||
'with_real_data' => 'Gerçek verilerle',
|
||
'run' => 'Testi çalıştır',
|
||
'idle_hint' => 'Otomasyonu baştan sona çalıştırmak için Testi çalıştır\'a basın.',
|
||
'real_data_hint' => 'Bu test gönderileri yayınlar, yoklama işaretlerini ilerletir ve dış yan etkileri tetikler.',
|
||
'dry_badge' => 'Deneme çalıştırması',
|
||
],
|
||
|
||
'status' => [
|
||
'draft' => 'Taslak',
|
||
'active' => 'Etkin',
|
||
'paused' => 'Duraklatıldı',
|
||
],
|
||
|
||
'index' => [
|
||
'empty_title' => 'Henüz otomasyon yok',
|
||
'empty_description' => 'Otomatik pilotta yayınlamaya başlamak için ilk otomasyonunuzu oluşturun.',
|
||
'columns' => [
|
||
'name' => 'Ad',
|
||
'status' => 'Durum',
|
||
'created' => 'Oluşturuldu',
|
||
],
|
||
],
|
||
|
||
'form' => [
|
||
'activate_error_fallback' => 'Otomasyon etkinleştirilemedi.',
|
||
'pause_error_fallback' => 'Otomasyon duraklatılamadı.',
|
||
'save_error_fallback' => 'Otomasyon kaydedilemedi.',
|
||
'save_success' => 'Otomasyon kaydedildi.',
|
||
'empty_canvas_title' => 'Otomasyonunuzu oluşturmaya başlayın',
|
||
'empty_canvas_description' => 'Başlamak için sol panelden bir düğüm sürükleyin.',
|
||
'name_placeholder' => 'Adsız otomasyon',
|
||
],
|
||
|
||
'nodes' => [
|
||
'trigger' => 'Tetikleyici',
|
||
'generate' => 'Oluştur',
|
||
'delay' => 'Gecikme',
|
||
'condition' => 'Koşul',
|
||
'publish' => 'Yayınla',
|
||
'end' => 'Bitir',
|
||
'end_summary' => 'Otomasyonu burada durdurur',
|
||
'fetch_rss' => 'RSS Getir',
|
||
'http_request' => 'HTTP İsteği',
|
||
'handles' => [
|
||
'items' => 'öğeleri var',
|
||
'no_items' => 'öğe yok',
|
||
],
|
||
],
|
||
|
||
'config' => [
|
||
'select_placeholder' => 'Seç…',
|
||
'invalid_json' => 'Bu henüz geçerli JSON değil.',
|
||
'expand_editor' => 'Düzenleyiciyi genişlet',
|
||
'minimize_editor' => 'Küçült',
|
||
|
||
'trigger' => [
|
||
'type' => 'Tetikleyici türü',
|
||
'types' => [
|
||
'schedule' => 'Zamanlama',
|
||
'post_published' => 'Bir gönderi yayınlandığında',
|
||
'post_scheduled' => 'Bir gönderi zamanlandığında',
|
||
],
|
||
'post_published_hint' => 'Bu çalışma alanındaki herhangi bir gönderi yayınlandığında çalışır. Yayınlanan gönderi, sonraki düğümler için {{ trigger.post }} adresinde kullanılabilir hale gelir.',
|
||
'post_scheduled_hint' => 'Bu çalışma alanındaki herhangi bir gönderi zamanlandığında çalışır. Zamanlanan gönderi {{ trigger.post }} adresinde kullanılabilir.',
|
||
|
||
'schedule' => [
|
||
'field' => 'Tetikleme aralığı',
|
||
'fields' => [
|
||
'minutes' => 'Dakika',
|
||
'hours' => 'Saat',
|
||
'days' => 'Gün',
|
||
'weeks' => 'Hafta',
|
||
'months' => 'Ay',
|
||
],
|
||
'minutes_interval' => 'Tetiklemeler arasındaki dakika',
|
||
'hours_interval' => 'Tetiklemeler arasındaki saat',
|
||
'days_interval' => 'Tetiklemeler arasındaki gün',
|
||
'hour' => 'Şu saatte tetikle',
|
||
'minute' => 'Şu dakikada tetikle',
|
||
'weekdays' => 'Şu günlerde tetikle',
|
||
'day_of_month' => 'Ayın günü',
|
||
'weekday_names' => [
|
||
'sun' => 'Paz',
|
||
'mon' => 'Pzt',
|
||
'tue' => 'Sal',
|
||
'wed' => 'Çar',
|
||
'thu' => 'Per',
|
||
'fri' => 'Cum',
|
||
'sat' => 'Cmt',
|
||
],
|
||
'summary' => [
|
||
'every_n_minutes' => 'Her dakika çalışır|Her :count dakikada bir çalışır',
|
||
'every_n_hours' => 'Her saat :minute. dakikada çalışır|Her :count saatte bir :minute. dakikada çalışır',
|
||
'every_n_days' => 'Her gün :time saatinde çalışır|Her :count günde bir :time saatinde çalışır',
|
||
'weekly' => 'Her :days günü :time saatinde çalışır',
|
||
'monthly' => 'Her ayın :day. günü :time saatinde çalışır',
|
||
],
|
||
],
|
||
],
|
||
'generate' => [
|
||
'social_accounts' => 'Sosyal hesaplar',
|
||
'social_accounts_empty' => 'Bağlı sosyal hesap yok. Önce bir tane bağlayın.',
|
||
'target_slide_count' => 'Oluşturulacak slayt',
|
||
'prompt_template' => 'İstem şablonu',
|
||
'prompt_template_hint' => 'Önceki adımlardan veri eklemek için {{ yazın.',
|
||
'image_count' => 'Oluşturulacak görsel',
|
||
'image_count_hint' => '0 = yalnızca metin gönderisi (görsel yok). 1 = tek görsel. 2+ = karusel.',
|
||
'use_brand_voice' => 'Marka sesini kullan',
|
||
'use_brand_voice_hint' => 'Marka açıklamanızı ve sesinizi uygular. Üçüncü taraf kaynakların (haber, RSS) sadık bir şekilde derlenmesi için kapatın.',
|
||
'use_brand_visuals' => 'Marka görsellerini kullan',
|
||
'use_brand_visuals_hint' => 'AI görsellerini marka renklerinizle ve kimliğinizle yönlendirin. Yalnızca gönderi konusuna dayalı nötr görseller için kapatın.',
|
||
'style' => 'Stil',
|
||
'account_summary' => ':count hesap · :format|:count hesap · :format',
|
||
'formats' => [
|
||
'single' => 'tekli',
|
||
'carousel' => 'karusel',
|
||
],
|
||
],
|
||
'delay' => [
|
||
'duration' => 'Süre',
|
||
'unit' => 'Birim',
|
||
'units' => [
|
||
'minutes' => 'Dakika',
|
||
'hours' => 'Saat',
|
||
'days' => 'Gün',
|
||
],
|
||
],
|
||
'condition' => [
|
||
'field' => 'Alan',
|
||
'operator' => 'Operatör',
|
||
'operators' => [
|
||
'contains' => 'içerir',
|
||
'not_contains' => 'içermez',
|
||
'equals' => 'eşittir',
|
||
'not_equals' => 'eşit değildir',
|
||
'matches' => 'eşleşir (regex)',
|
||
'greater_than' => 'büyüktür',
|
||
'less_than' => 'küçüktür',
|
||
],
|
||
'value' => 'Değer',
|
||
],
|
||
'publish' => [
|
||
'mode' => 'Mod',
|
||
'modes' => [
|
||
'now' => 'Şimdi yayınla',
|
||
'scheduled' => 'Zamanla',
|
||
'draft' => 'Taslak olarak kaydet',
|
||
],
|
||
'scheduled_offset' => 'Tetikleyiciden kayma (dakika)',
|
||
'offset_summary' => ':mode · +:offset dk',
|
||
],
|
||
'end' => [
|
||
'reason' => 'Neden (isteğe bağlı)',
|
||
'reason_placeholder' => 'örn. Koşul tarafından filtrelendi',
|
||
],
|
||
'fetch_rss' => [
|
||
'feed_url' => 'Besleme URL\'si',
|
||
'feed_url_hint' => 'İlk çalıştırmada işaret "şimdi" olarak ayarlanır; böylece eski öğeler sonraki düğümleri doldurmaz. Sonraki çalıştırmalar yalnızca önceki yoklamadan daha yeni öğeleri görür.',
|
||
'inspect' => 'Beslemeyi incele',
|
||
'inspecting' => 'İnceleniyor…',
|
||
'inspect_hint' => 'Sonraki düğümlerde kullanmak üzere mevcut alanları keşfetmek için bir örnek getirin.',
|
||
'inspect_error' => 'Bu besleme okunamadı. URL\'yi kontrol edip tekrar deneyin.',
|
||
'discovered_fields' => 'Mevcut alanlar',
|
||
'discovered_empty' => 'En son öğede alan bulunamadı.',
|
||
],
|
||
'http_request' => [
|
||
'url' => 'URL',
|
||
'method' => 'Yöntem',
|
||
'auth_type' => 'Kimlik doğrulama',
|
||
'auth' => [
|
||
'none' => 'Yok (herkese açık)',
|
||
'bearer' => 'Bearer token',
|
||
'basic' => 'Temel kimlik doğrulama',
|
||
'api_key' => 'API anahtarı başlığı',
|
||
],
|
||
'bearer_token' => 'Bearer token',
|
||
'basic_username' => 'Kullanıcı adı',
|
||
'basic_password' => 'Parola',
|
||
'api_key_header' => 'Başlık adı',
|
||
'api_key_value' => 'API anahtarı',
|
||
'body_template' => 'Gövde şablonu (JSON)',
|
||
'headers' => 'Başlıklar',
|
||
'header_name' => 'Başlık adı',
|
||
'header_value' => 'Değer',
|
||
'add_header' => 'Başlık ekle',
|
||
'polling_section' => 'Liste ve yinelenenleri kaldırma (isteğe bağlı)',
|
||
'polling_hint' => 'Yanıt bir liste olduğunda, her öğe iş akışını ayrı ayrı çalıştırır. Tek bir nesne bir kez çalışır.',
|
||
'items_path' => 'Öğe yolu',
|
||
'items_path_hint' => 'Yanıt zaten bir diziyse boş bırakın. İç içe bir dizi için noktalı bir yol (örn. data.items) veya kimliğe göre anahtarlanan bir nesne için * kullanın.',
|
||
'item_key_path' => 'Öğe anahtar yolu',
|
||
'item_key_path_hint' => 'Benzersiz bir kimliğe giden JSON yolu (örn. id). Zaten görülen öğeler atlanır; böylece tarihsiz bir besleme bile yalnızca yeni girişleri iletir.',
|
||
'item_date_path' => 'Öğe tarih yolu',
|
||
'item_date_path_hint' => 'Öğe zaman damgasına giden JSON yolu (örn. published_at). Varsa anahtar yolu yerine tercih edilir. İlk yoklama temeli kaydeder ve hiçbir şey iletmez; böylece mevcut bir besleme ilk gün taşmaz.',
|
||
],
|
||
],
|
||
|
||
'delete' => [
|
||
'title' => 'Otomasyonu sil',
|
||
'description' => 'Bu otomasyonu silmek istediğinizden emin misiniz? Tüm çalıştırmalar ve tetikleyici öğeleri de kaldırılacak. Bu işlem geri alınamaz.',
|
||
'confirm' => 'Sil',
|
||
'cancel' => 'İptal',
|
||
],
|
||
|
||
'flash' => [
|
||
'deleted' => 'Otomasyon başarıyla silindi!',
|
||
],
|
||
|
||
'errors' => [
|
||
'no_active_social_accounts' => 'Bu otomasyon için yapılandırılmış etkin sosyal hesap yok.',
|
||
'must_have_one_trigger' => 'Otomasyonda tam olarak bir tetikleyici düğümü olmalıdır.',
|
||
'trigger_must_be_connected' => 'Tetikleyici düğümü en az bir düğüme bağlı olmalıdır.',
|
||
'graph_contains_cycle' => 'Otomasyon grafiği bir döngü içeriyor.',
|
||
'only_failed_can_retry' => 'Yalnızca başarısız çalıştırmalar yeniden denenebilir.',
|
||
'no_generated_post' => 'Çalıştırmada oluşturulmuş gönderi bulunamadı.',
|
||
'url_not_allowed' => 'İstek URL\'si özel veya erişilemez bir adrese işaret ediyor ve engellendi.',
|
||
'node_no_longer_exists' => ':node_id düğümü artık otomasyonda yok.',
|
||
'no_trigger_connection' => 'Tetikleyici düğümüne bağlı düğüm yok.',
|
||
'fetch_rss_missing_url' => 'RSS Getir düğümünde besleme URL\'si eksik.',
|
||
'fetch_rss_request_failed' => 'RSS besleme isteği başarısız oldu.',
|
||
'fetch_rss_malformed' => 'RSS beslemesi bozuk.',
|
||
'http_missing_url' => 'HTTP istek düğümünde URL eksik.',
|
||
'http_request_exception' => 'HTTP isteği bir istisna oluşturdu.',
|
||
'http_request_failed' => 'HTTP isteği başarısız oldu.',
|
||
'http_items_path_not_array' => 'Öğe yolu bir listeye çözümlenmedi.',
|
||
'generate_image_format_required' => 'AI oluşturma yalnızca görsel üretir. Görsel formatı seçin (video değil).',
|
||
],
|
||
];
|