* Default AI content language to Ukrainian * Keep English as the default content language * refactor: update content language handling in workspace creation - Changed the default content language in CreateWorkspace to inherit the app's locale instead of defaulting to English. - Updated related tests to reflect this change, ensuring that the content language aligns with the application's current locale settings. - Cleaned up unnecessary code in the BrandTab component for better readability. * Add Ukrainian as a full platform UI locale. Wire uk into languages config with complete lang/uk translations and restore ContentLanguage↔UI parity checks. Co-authored-by: Cursor <cursoragent@cursor.com> * Wire Ukrainian into dayjs and locale coverage tests. Import the uk dayjs locale with Monday week-start and cover uk/uk-UA in brand autofill and SetLocale assertions. Co-authored-by: Cursor <cursoragent@cursor.com> * Harden Ukrainian UI and AI content-language coverage. Cover generator/reviewer/humanizer/image prompts, workspace pickers, persona labels, UI locale switch, and README for uk as a first-class platform language. Co-authored-by: Cursor <cursoragent@cursor.com> * Add Ukrainian Pinterest form strings after main merge. Restore lang/uk posts.php key parity for the new pin title and destination link fields. Co-authored-by: Cursor <cursoragent@cursor.com> * List every supported UI language in the README. Replace the abbreviated multi-language blurb with the full locale set from config. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Paulo Castellano <paulo@castellanos.llc> Co-authored-by: Cursor <cursoragent@cursor.com>
413 lines
24 KiB
PHP
413 lines
24 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
return [
|
||
'mobile_notice' => 'Редактор автоматизацій найкраще працює на великому екрані. Відкрийте його на комп’ютері, щоб побудувати workflow.',
|
||
'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' => 'Публікація',
|
||
'webhook' => 'Webhook',
|
||
'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' => 'URL AI-згенерованого поста',
|
||
'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' => 'Публікація',
|
||
'webhook' => 'Webhook',
|
||
'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 хвилини|Запускається кожні :count хвилин',
|
||
'every_n_hours' => 'Запускається щогодини на :minute-й хвилині|Запускається кожні :count години на :minute-й хвилині|Запускається кожні :count годин на :minute-й хвилині',
|
||
'every_n_days' => 'Запускається щодня о :time|Запускається кожні :count дні о :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|:count акаунтів · :format',
|
||
'formats' => [
|
||
'single' => 'один',
|
||
'carousel' => 'карусель',
|
||
],
|
||
],
|
||
'delay' => [
|
||
'duration' => 'Тривалість',
|
||
'unit' => 'Одиниця',
|
||
'units' => [
|
||
'minutes' => 'Хвилини',
|
||
'hours' => 'Години',
|
||
'days' => 'Дні',
|
||
],
|
||
],
|
||
'condition' => [
|
||
'field' => 'Поле',
|
||
'operator' => 'Оператор',
|
||
'operators' => [
|
||
'contains' => 'містить',
|
||
'not_contains' => 'не містить',
|
||
'equals' => 'дорівнює',
|
||
'not_equals' => 'не дорівнює',
|
||
'matches' => 'відповідає (regex)',
|
||
'greater_than' => 'більше ніж',
|
||
'less_than' => 'менше ніж',
|
||
],
|
||
'value' => 'Значення',
|
||
],
|
||
'publish' => [
|
||
'mode' => 'Режим',
|
||
'modes' => [
|
||
'now' => 'Опублікувати зараз',
|
||
'scheduled' => 'Запланувати',
|
||
'draft' => 'Зберегти як чернетку',
|
||
],
|
||
'scheduled_offset' => 'Зміщення від тригера (хвилини)',
|
||
'offset_summary' => ':mode · +:offset хв',
|
||
],
|
||
'webhook' => [
|
||
'url' => 'URL',
|
||
'method' => 'Метод',
|
||
'payload_template' => 'Шаблон payload (JSON)',
|
||
],
|
||
'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' => 'JSON-шлях до унікального id (напр. 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' => 'У запуску не знайдено згенерованого поста.',
|
||
'webhook_server_error' => 'Помилка сервера webhook.',
|
||
'webhook_request_failed' => 'Не вдалося виконати запит webhook.',
|
||
'webhook_missing_url' => 'У вузлі webhook відсутній URL.',
|
||
'webhook_invalid_payload_json' => 'Шаблон payload не є коректним JSON.',
|
||
'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 генерує лише зображення. Виберіть формат зображення (не відео).',
|
||
],
|
||
];
|