trypost/lang/pl/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' => 'Edytor automatyzacji działa najlepiej na większym ekranie. Otwórz go na komputerze, aby zbudować swój workflow.',
'title' => 'Automatyzacje',
'default_name' => 'Nowa automatyzacja',
'actions' => [
'new' => 'Nowa automatyzacja',
'edit' => 'Edytuj',
'save' => 'Zapisz',
'activate' => 'Aktywuj',
'pause' => 'Wstrzymaj',
'delete' => 'Usuń',
'retry' => 'Ponów',
'guide' => 'Dowiedz się, jak to działa',
],
'tabs' => [
'build' => 'Kreator',
'variables' => 'Zmienne',
'test' => 'Test',
],
'nav' => [
'workflow' => 'Przepływ pracy',
'invocations' => 'Wywołania',
'metrics' => 'Metryki',
'settings' => 'Ustawienia',
],
'settings' => [
'general' => 'Ogólne',
'general_description' => 'Zmień nazwę tej automatyzacji.',
'name_label' => 'Nazwa',
'name_saved' => 'Zmieniono nazwę automatyzacji.',
'status_title' => 'Status',
'status_description' => 'Aktywuj, aby ją uruchomić, lub wstrzymaj, aby zatrzymać.',
'activated_at' => 'Aktywowano :date',
'paused_at' => 'Wstrzymano :date',
'created_at' => 'Utworzono :date',
'danger_title' => 'Strefa zagrożenia',
'danger_description' => 'Nieodwracalne działania.',
'delete_title' => 'Usuń tę automatyzację',
'delete_description' => 'Trwale usuwa automatyzację i jej historię uruchomień.',
],
'status_run' => [
'pending' => 'Oczekuje',
'running' => 'W trakcie',
'waiting' => 'Oczekiwanie',
'completed' => 'Zakończone',
'failed' => 'Nieudane',
'cancelled' => 'Anulowane',
],
'node_type' => [
'trigger' => 'Wyzwalacz',
'generate' => 'Generuj treść',
'delay' => 'Opóźnienie',
'condition' => 'Warunek',
'publish' => 'Publikuj',
'end' => 'Koniec',
'fetch_rss' => 'Pobierz RSS',
'http_request' => 'Żądanie HTTP',
],
'invocations' => [
'empty' => 'Brak wywołań.',
'refresh' => 'Odśwież',
'search_placeholder' => 'Szukaj po identyfikatorze uruchomienia…',
'copied' => 'Skopiowano identyfikator uruchomienia.',
'loading' => 'Wczytywanie kroków…',
'no_steps' => 'Nie zarejestrowano żadnych kroków.',
'load_error' => 'Nie udało się wczytać kroków.',
'steps' => '{0}Brak kroków|{1}:count krok|[2,4]:count kroki|[5,*]:count kroków',
'filter' => [
'all' => 'Wszystkie statusy',
],
'columns' => [
'timestamp' => 'Znacznik czasu',
'run' => 'Uruchomienie',
'status' => 'Status',
'message' => 'Ostatnia wiadomość',
'duration' => 'Czas trwania',
],
'summary' => [
'completed' => 'Przepływ zakończony',
'failed' => 'Przepływ nieudany',
'running' => 'Przepływ w trakcie',
'cancelled' => 'Przepływ anulowany',
'pending' => 'Przepływ oczekuje',
],
],
'metrics' => [
'overview' => 'Przegląd',
'runs_over_time' => 'Uruchomienia w czasie',
'posts_by_platform' => 'Posty według platformy',
'no_posts' => 'W tym okresie nie opublikowano żadnych postów.',
'cards' => [
'runs' => 'Łączna liczba uruchomień',
'completed' => 'Zakończone',
'failed' => 'Nieudane',
'in_progress' => 'W trakcie',
'success_rate' => 'Wskaźnik powodzenia',
'avg_duration' => 'Śr. czas trwania',
'posts_created' => 'Utworzone posty',
],
'legend' => [
'started' => 'Rozpoczęte',
'completed' => 'Zakończone',
'failed' => 'Nieudane',
],
],
'categories' => [
'sources' => 'Źródła',
'content' => 'Treść',
'flow' => 'Przepływ',
'output' => 'Wyjście',
],
'variables' => [
'title' => 'Zmienne przepływu pracy',
'hint' => 'Wielokrotnego użytku wartości, do których odwołujesz się w dowolnym miejscu za pomocą {{ variables.KEY }}. Przechowywane w formie zaszyfrowanej.',
'empty' => 'Brak zmiennych.',
'key' => 'Klucz',
'value' => 'Wartość',
'key_placeholder' => 'API_KEY',
'value_placeholder' => 'Wartość',
'add' => 'Nowa zmienna',
],
'expr' => [
'trigger_event' => 'Nazwa zdarzenia wyzwalacza',
'trigger_fired_at' => 'Kiedy wyzwalacz się uruchomił',
'trigger_post_id' => 'Identyfikator posta wyzwalającego',
'trigger_post_content' => 'Treść posta wyzwalającego',
'trigger_post_status' => 'Status posta wyzwalającego',
'trigger_post_scheduled_at' => 'Kiedy post jest zaplanowany',
'trigger_post_published_at' => 'Kiedy post został opublikowany',
'fetched_title' => 'Tytuł pobranego elementu',
'fetched_link' => 'Link pobranego elementu',
'fetched_date' => 'Data publikacji pobranego elementu',
'fetched_content' => 'Pełna treść pobranego elementu',
'fetched_description' => 'Podsumowanie pobranego elementu',
'fetched_author' => 'Autor pobranego elementu',
'fetched_image' => 'Adres URL obrazu pobranego elementu',
'fetched_categories' => 'Kategorie pobranego elementu',
'fetched_enclosure' => 'Multimedia pobranego elementu (audio/wideo/plik)',
'fetched_pubdate' => 'Data publikacji pobranego elementu',
'fetched_http' => 'Pobrany element HTTP (dodaj pole)',
'generated_content' => 'Treść posta wygenerowana przez AI',
'generated_post_url' => 'Adres URL posta wygenerowanego przez AI',
'variable' => 'Zmienna przepływu pracy',
'now' => 'Bieżąca data i godzina',
],
'test' => [
'description' => 'Uruchamia automatyzację od początku do końca, używając wygenerowanego ładunku wyzwalacza. Przydatne do sprawdzania każdego węzła bez czekania na rzeczywisty harmonogram lub kanał.',
'starting' => 'Rozpoczynanie przebiegu testowego…',
'in_progress' => 'W trakcie',
'completed' => 'Zakończone',
'failed' => 'Nieudane',
'waiting' => 'Oczekiwanie',
'close' => 'Zamknij',
'no_node_runs' => 'Oczekiwanie na uruchomienie pierwszego węzła…',
'node_input' => 'Wejście',
'node_output' => 'Wyjście',
'node_error' => 'Błąd',
'no_new_items' => 'Brak nowych elementów — nic dalej się nie uruchomiło.',
'error_starting' => 'Nie udało się rozpocząć przebiegu testowego.',
'with_real_data' => 'Z rzeczywistymi danymi',
'run' => 'Uruchom test',
'idle_hint' => 'Kliknij Uruchom test, aby wykonać automatyzację od początku do końca.',
'real_data_hint' => 'Ten test opublikuje posty, przesunie znaczniki odpytywania i wywoła zewnętrzne skutki uboczne.',
'dry_badge' => 'Przebieg próbny',
],
'status' => [
'draft' => 'Szkic',
'active' => 'Aktywna',
'paused' => 'Wstrzymana',
],
'index' => [
'empty_title' => 'Brak automatyzacji',
'empty_description' => 'Utwórz swoją pierwszą automatyzację, aby publikować na autopilocie.',
'columns' => [
'name' => 'Nazwa',
'status' => 'Status',
'created' => 'Utworzono',
],
],
'form' => [
'activate_error_fallback' => 'Nie udało się aktywować automatyzacji.',
'pause_error_fallback' => 'Nie udało się wstrzymać automatyzacji.',
'save_error_fallback' => 'Nie udało się zapisać automatyzacji.',
'save_success' => 'Automatyzacja zapisana.',
'empty_canvas_title' => 'Zacznij budować swoją automatyzację',
'empty_canvas_description' => 'Przeciągnij węzeł z lewego panelu, aby rozpocząć.',
'name_placeholder' => 'Automatyzacja bez tytułu',
],
'nodes' => [
'trigger' => 'Wyzwalacz',
'generate' => 'Generuj',
'delay' => 'Opóźnienie',
'condition' => 'Warunek',
'publish' => 'Publikuj',
'end' => 'Koniec',
'end_summary' => 'Zatrzymuje automatyzację w tym miejscu',
'fetch_rss' => 'Pobierz RSS',
'http_request' => 'Żądanie HTTP',
'handles' => [
'items' => 'ma elementy',
'no_items' => 'brak elementów',
],
],
'config' => [
'select_placeholder' => 'Wybierz…',
'invalid_json' => 'To jeszcze nie jest prawidłowy JSON.',
'expand_editor' => 'Rozwiń edytor',
'minimize_editor' => 'Zminimalizuj',
'trigger' => [
'type' => 'Typ wyzwalacza',
'types' => [
'schedule' => 'Harmonogram',
'post_published' => 'Gdy post zostaje opublikowany',
'post_scheduled' => 'Gdy post zostaje zaplanowany',
],
'post_published_hint' => 'Uruchamia się za każdym razem, gdy dowolny post w tej przestrzeni roboczej zostanie opublikowany. Opublikowany post staje się dostępny pod {{ trigger.post }} dla kolejnych węzłów.',
'post_scheduled_hint' => 'Uruchamia się za każdym razem, gdy dowolny post w tej przestrzeni roboczej zostanie zaplanowany. Zaplanowany post jest dostępny pod {{ trigger.post }}.',
'schedule' => [
'field' => 'Interwał wyzwalania',
'fields' => [
'minutes' => 'Minuty',
'hours' => 'Godziny',
'days' => 'Dni',
'weeks' => 'Tygodnie',
'months' => 'Miesiące',
],
'minutes_interval' => 'Minuty między wyzwoleniami',
'hours_interval' => 'Godziny między wyzwoleniami',
'days_interval' => 'Dni między wyzwoleniami',
'hour' => 'Wyzwól o godzinie',
'minute' => 'Wyzwól w minucie',
'weekdays' => 'Wyzwól w dni tygodnia',
'day_of_month' => 'Dzień miesiąca',
'weekday_names' => [
'sun' => 'Nd',
'mon' => 'Pn',
'tue' => 'Wt',
'wed' => 'Śr',
'thu' => 'Cz',
'fri' => 'Pt',
'sat' => 'Sb',
],
'summary' => [
'every_n_minutes' => 'Uruchamia się co minutę|Uruchamia się co :count minuty|Uruchamia się co :count minut',
'every_n_hours' => 'Uruchamia się co godzinę o minucie :minute|Uruchamia się co :count godziny o minucie :minute|Uruchamia się co :count godzin o minucie :minute',
'every_n_days' => 'Uruchamia się codziennie o :time|Uruchamia się co :count dni o :time|Uruchamia się co :count dni o :time',
'weekly' => 'Uruchamia się w :days o :time',
'monthly' => 'Uruchamia się :day. dnia każdego miesiąca o :time',
],
],
],
'generate' => [
'social_accounts' => 'Konta społecznościowe',
'social_accounts_empty' => 'Brak połączonych kont społecznościowych. Najpierw połącz jedno.',
'target_slide_count' => 'Slajdy do wygenerowania',
'prompt_template' => 'Szablon promptu',
'prompt_template_hint' => 'Wpisz {{, aby wstawić dane z wcześniejszych kroków.',
'image_count' => 'Obrazy do wygenerowania',
'image_count_hint' => '0 = post tylko tekstowy (bez obrazu). 1 = pojedynczy obraz. 2+ = karuzela.',
'use_brand_voice' => 'Użyj głosu marki',
'use_brand_voice_hint' => 'Zastosuj opis i głos swojej marki. Wyłącz dla wiernego kuratorowania źródeł zewnętrznych (wiadomości, RSS).',
'use_brand_visuals' => 'Użyj wizualnej identyfikacji marki',
'use_brand_visuals_hint' => 'Kieruj obrazami AI za pomocą kolorów i tożsamości swojej marki. Wyłącz, aby uzyskać neutralne obrazy oparte wyłącznie na temacie posta.',
'style' => 'Styl',
'account_summary' => ':count konto · :format|:count konta · :format|:count kont · :format',
'formats' => [
'single' => 'pojedynczy',
'carousel' => 'karuzela',
],
],
'delay' => [
'duration' => 'Czas trwania',
'unit' => 'Jednostka',
'units' => [
'minutes' => 'Minuty',
'hours' => 'Godziny',
'days' => 'Dni',
],
],
'condition' => [
'field' => 'Pole',
'operator' => 'Operator',
'operators' => [
'contains' => 'zawiera',
'not_contains' => 'nie zawiera',
'equals' => 'równa się',
'not_equals' => 'nie równa się',
'matches' => 'pasuje (regex)',
'greater_than' => 'większe niż',
'less_than' => 'mniejsze niż',
],
'value' => 'Wartość',
],
'publish' => [
'mode' => 'Tryb',
'modes' => [
'now' => 'Opublikuj teraz',
'scheduled' => 'Zaplanuj',
'draft' => 'Zapisz jako szkic',
],
'scheduled_offset' => 'Przesunięcie od wyzwolenia (minuty)',
'offset_summary' => ':mode · +:offset min',
],
'end' => [
'reason' => 'Powód (opcjonalnie)',
'reason_placeholder' => 'np. Odfiltrowane przez warunek',
],
'fetch_rss' => [
'feed_url' => 'Adres URL kanału',
'feed_url_hint' => 'Przy pierwszym uruchomieniu znacznik jest ustawiany na „teraz”, aby elementy historyczne nie zalały kolejnych węzłów. Kolejne uruchomienia widzą tylko elementy nowsze niż poprzednie odpytanie.',
'inspect' => 'Zbadaj kanał',
'inspecting' => 'Badanie…',
'inspect_hint' => 'Pobierz próbkę, aby odkryć dostępne pola do użycia w kolejnych węzłach.',
'inspect_error' => 'Nie udało się odczytać tego kanału. Sprawdź adres URL i spróbuj ponownie.',
'discovered_fields' => 'Dostępne pola',
'discovered_empty' => 'Nie znaleziono pól w najnowszym elemencie.',
],
'http_request' => [
'url' => 'URL',
'method' => 'Metoda',
'auth_type' => 'Uwierzytelnianie',
'auth' => [
'none' => 'Brak (publiczne)',
'bearer' => 'Token Bearer',
'basic' => 'Uwierzytelnianie podstawowe',
'api_key' => 'Nagłówek z kluczem API',
],
'bearer_token' => 'Token Bearer',
'basic_username' => 'Nazwa użytkownika',
'basic_password' => 'Hasło',
'api_key_header' => 'Nazwa nagłówka',
'api_key_value' => 'Klucz API',
'body_template' => 'Szablon treści (JSON)',
'headers' => 'Nagłówki',
'header_name' => 'Nazwa nagłówka',
'header_value' => 'Wartość',
'add_header' => 'Dodaj nagłówek',
'polling_section' => 'Lista i deduplikacja (opcjonalnie)',
'polling_hint' => 'Gdy odpowiedź jest listą, każdy element uruchamia przepływ osobno. Pojedynczy obiekt uruchamia się raz.',
'items_path' => 'Ścieżka do elementów',
'items_path_hint' => 'Pozostaw puste, jeśli odpowiedź jest już tablicą. Użyj ścieżki z kropkami (np. data.items) dla zagnieżdżonej tablicy lub * dla obiektu z kluczami po id.',
'item_key_path' => 'Ścieżka do klucza elementu',
'item_key_path_hint' => 'Ścieżka JSON do unikalnego id (np. id). Elementy już widziane są pomijane, więc kanał bez dat nadal przekazuje dalej tylko nowe wpisy.',
'item_date_path' => 'Ścieżka do daty elementu',
'item_date_path_hint' => 'Ścieżka JSON do znacznika czasu elementu (np. published_at). Preferowana zamiast ścieżki klucza, gdy jest dostępna. Pierwsze odpytanie zapisuje punkt odniesienia i nic nie przekazuje, więc istniejący kanał nigdy nie zaleje systemu pierwszego dnia.',
],
],
'delete' => [
'title' => 'Usuń automatyzację',
'description' => 'Czy na pewno chcesz usunąć tę automatyzację? Wszystkie uruchomienia i elementy wyzwalacza również zostaną usunięte. Tej operacji nie można cofnąć.',
'confirm' => 'Usuń',
'cancel' => 'Anuluj',
],
'flash' => [
'deleted' => 'Automatyzacja została pomyślnie usunięta!',
],
'errors' => [
'no_active_social_accounts' => 'Brak aktywnych kont społecznościowych skonfigurowanych dla tej automatyzacji.',
'must_have_one_trigger' => 'Automatyzacja musi mieć dokładnie jeden węzeł wyzwalacza.',
'trigger_must_be_connected' => 'Węzeł wyzwalacza musi być połączony z co najmniej jednym węzłem.',
'graph_contains_cycle' => 'Graf automatyzacji zawiera cykl.',
'only_failed_can_retry' => 'Tylko nieudane uruchomienia można ponowić.',
'no_generated_post' => 'Nie znaleziono wygenerowanego posta w uruchomieniu.',
'url_not_allowed' => 'Adres URL żądania wskazuje na prywatny lub nieosiągalny adres i został zablokowany.',
'node_no_longer_exists' => 'Węzeł :node_id już nie istnieje w automatyzacji.',
'no_trigger_connection' => 'Żaden węzeł nie jest połączony z węzłem wyzwalacza.',
'fetch_rss_missing_url' => 'W węźle Pobierz RSS brakuje adresu URL kanału.',
'fetch_rss_request_failed' => 'Żądanie kanału RSS nie powiodło się.',
'fetch_rss_malformed' => 'Kanał RSS jest uszkodzony.',
'http_missing_url' => 'W węźle żądania HTTP brakuje adresu URL.',
'http_request_exception' => 'Żądanie HTTP zgłosiło wyjątek.',
'http_request_failed' => 'Żądanie HTTP nie powiodło się.',
'http_items_path_not_array' => 'Ścieżka do elementów nie zwróciła listy.',
'generate_image_format_required' => 'Generowanie AI tworzy tylko obrazy. Wybierz format obrazu (nie wideo).',
],
];