This is an automated email from the ASF dual-hosted git repository.
jscheffl pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new f0018f8b2dc Adding Russian translation for UI (#63450)
f0018f8b2dc is described below
commit f0018f8b2dc3e1639646bb7a3c2e3eca593bf6de
Author: Puzzle Team <[email protected]>
AuthorDate: Wed Mar 18 00:34:39 2026 +0300
Adding Russian translation for UI (#63450)
* feat: added russian ui translation
* fix: missing "one" and "many" for "files"
* fix: added "_few"
* fix: removed unused "few"'s, added "asset_many"
* Update airflow-core/src/airflow/ui/public/i18n/locales/ru/common.json
Co-authored-by: renat-sagut <[email protected]>
* Update airflow-core/src/airflow/ui/public/i18n/locales/ru/common.json
Co-authored-by: renat-sagut <[email protected]>
* Apply suggestions from code review
Co-authored-by: renat-sagut <[email protected]>
* CODEOWNERS updated to include locales/ru
* Update .github/CODEOWNERS
* Fix static checks
* CODEOWNERS fixed + replaced "Даг" with "DAG"
* Apply suggestions from code review
Co-authored-by: renat-sagut <[email protected]>
* Apply suggestions from code review
Co-authored-by: renat-sagut <[email protected]>
* misc translation fixes
* Fix ts-compile-lint-ui
---------
Co-authored-by: o.marchuk <[email protected]>
Co-authored-by: renat-sagut <[email protected]>
Co-authored-by: Jens Scheffler <[email protected]>
Co-authored-by: Jens Scheffler <[email protected]>
---
.github/CODEOWNERS | 1 +
.github/boring-cyborg.yml | 3 +
.../airflow/ui/public/i18n/locales/ru/admin.json | 189 +++++++++++
.../airflow/ui/public/i18n/locales/ru/assets.json | 37 +++
.../airflow/ui/public/i18n/locales/ru/browse.json | 46 +++
.../airflow/ui/public/i18n/locales/ru/common.json | 362 +++++++++++++++++++++
.../ui/public/i18n/locales/ru/components.json | 176 ++++++++++
.../src/airflow/ui/public/i18n/locales/ru/dag.json | 191 +++++++++++
.../airflow/ui/public/i18n/locales/ru/dags.json | 101 ++++++
.../ui/public/i18n/locales/ru/dashboard.json | 47 +++
.../airflow/ui/public/i18n/locales/ru/hitl.json | 39 +++
.../airflow/ui/public/i18n/locales/ru/tasks.json | 10 +
airflow-core/src/airflow/ui/src/i18n/config.ts | 1 +
dev/breeze/doc/images/output_pr_auto-triage.svg | 94 +++---
dev/breeze/doc/images/output_pr_auto-triage.txt | 2 +-
.../src/airflow_breeze/commands/ui_commands.py | 1 +
16 files changed, 1254 insertions(+), 46 deletions(-)
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index dc6469419db..66204692181 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -53,6 +53,7 @@ airflow-core/src/airflow/ui/public/i18n/locales/ko/
@choo121600 # + @kgw7401 @on
airflow-core/src/airflow/ui/public/i18n/locales/nl/ @BasPH # + @DjVinnii
airflow-core/src/airflow/ui/public/i18n/locales/pl/ @potiuk @mobuchowski # +
@kacpermuda
airflow-core/src/airflow/ui/public/i18n/locales/pt/ @potiuk # + @aoelvp94
@victoru2
+airflow-core/src/airflow/ui/public/i18n/locales/ru/ @jscheffl # +
@puzzle-rpa-team @renat-sagut
airflow-core/src/airflow/ui/public/i18n/locales/th/ @potiuk # + @zkan
@blackbass64 @lifnaja @Aphinan-Th @chonla @Srabasti
airflow-core/src/airflow/ui/public/i18n/locales/tr/ @bugraoz93 #
+@hasancatalgol
airflow-core/src/airflow/ui/public/i18n/locales/zh-CN/ @potiuk # + @Fortytwoo
@gyli
diff --git a/.github/boring-cyborg.yml b/.github/boring-cyborg.yml
index d754e1be0e3..521429a8afb 100644
--- a/.github/boring-cyborg.yml
+++ b/.github/boring-cyborg.yml
@@ -429,6 +429,9 @@ labelPRBasedOnFilePath:
translation:pt:
- airflow-core/src/airflow/ui/public/i18n/locales/pt/*
+ translation:ru:
+ - airflow-core/src/airflow/ui/public/i18n/locales/ru/*
+
translation:th:
- airflow-core/src/airflow/ui/public/i18n/locales/th/*
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/ru/admin.json
b/airflow-core/src/airflow/ui/public/i18n/locales/ru/admin.json
new file mode 100644
index 00000000000..734dc18623a
--- /dev/null
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/ru/admin.json
@@ -0,0 +1,189 @@
+{
+ "columns": {
+ "description": "Описание",
+ "key": "Ключ",
+ "name": "Имя",
+ "team": "Команда",
+ "value": "Значение"
+ },
+ "config": {
+ "columns": {
+ "section": "Раздел"
+ },
+ "title": "Конфигурация Airflow"
+ },
+ "connections": {
+ "add": "Добавить соединение",
+ "columns": {
+ "connectionId": "ID соединения",
+ "connectionType": "Тип соединения",
+ "host": "Хост",
+ "port": "Порт"
+ },
+ "connection_one": "Соединение",
+ "connection_other": "Соединений",
+ "delete": {
+ "deleteConnection_few": "Удалить {{count}} соединения",
+ "deleteConnection_one": "Удалить 1 соединение",
+ "deleteConnection_other": "Удалить {{count}} соединений",
+ "firstConfirmMessage_one": "Вы собираетесь удалить следующее
соединение:",
+ "firstConfirmMessage_other": "Вы собираетесь удалить следующие
соединения:",
+ "title": "Удалить соединение"
+ },
+ "edit": "Редактировать соединение",
+ "form": {
+ "connectionIdRequired": "ID соединения обязателен",
+ "connectionIdRequirement": "ID соединения не может состоять только из
пробелов",
+ "connectionTypeRequired": "Тип соединения обязателен",
+ "extraFields": "Дополнительные поля",
+ "extraFieldsJson": "Дополнительные поля JSON",
+ "helperText": "Отсутствует тип соединения? Убедитесь, что вы установили
соответствующий пакет Airflow Providers.",
+ "helperTextForRedactedFields": "Скрытые поля ('***') останутся без
изменений, если их не редактировать.",
+ "selectConnectionType": "Выбрать тип соединения",
+ "standardFields": "Стандартные поля"
+ },
+ "nothingFound": {
+ "description": "Соединения, определенные через переменные окружения или
менеджеры секретов, здесь не перечислены.",
+ "documentationLink": "Узнайте больше в документации Airflow.",
+ "learnMore": "Эти соединения обрабатываются во время выполнения и не
отображаются в интерфейсе.",
+ "title": "Соединение не найдено!"
+ },
+ "searchPlaceholder": "Поиск соединений",
+ "test": "Тестировать соединение",
+ "testDisabled": "Функция тестирования соединения отключена. Пожалуйста,
свяжитесь с администратором, чтобы включить ее.",
+ "testError": {
+ "title": "Ошибка тестирования соединения"
+ },
+ "testSuccess": {
+ "title": "Тестирование соединения успешно"
+ },
+ "typeMeta": {
+ "error": "Не удалось получить метаданные типа соединения",
+ "standardFields": {
+ "description": "Описание",
+ "host": "Хост",
+ "login": "Логин",
+ "password": "Пароль",
+ "port": "Порт",
+ "url_schema": "Схема"
+ }
+ }
+ },
+ "deleteActions": {
+ "button": "Удалить",
+ "modal": {
+ "confirmButton": "Да, удалить",
+ "secondConfirmMessage": "Это действие необратимо и не может быть
отменено.",
+ "thirdConfirmMessage": "Вы уверены, что хотите продолжить?"
+ },
+ "selected": "Выбрано",
+ "tooltip": "Удалить выбранные соединения"
+ },
+ "formActions": {
+ "save": "Сохранить"
+ },
+ "jobs": {
+ "columns": {
+ "executorClass": "Класс исполнителя",
+ "hostname": "Имя хоста",
+ "id": "ID",
+ "jobType": "Тип задания",
+ "latestHeartbeat": "Последний heartbeat",
+ "unixname": "Unix имя"
+ },
+ "filters": {
+ "allStates": "Все состояния",
+ "allTypes": "Все типы",
+ "dagProcessorJob": "Задание обработки Dag-а",
+ "schedulerJob": "Задание планировщика",
+ "triggererJob": "Задание триггера"
+ }
+ },
+ "plugins": {
+ "columns": {
+ "source": "Источник"
+ },
+ "importError_one": "Ошибка импорта плагина",
+ "importError_other": "Ошибки импорта плагинов",
+ "searchPlaceholder": "Поиск по файлу"
+ },
+ "pools": {
+ "add": "Добавить пул",
+ "deferredSlotsIncluded": "Включены отложенные слоты",
+ "delete": {
+ "title": "Удалить пул",
+ "warning": "Это удалит все метаданные, связанные с пулом, и может
повлиять на задачи, использующие этот пул."
+ },
+ "edit": "Редактировать пул",
+ "form": {
+ "checkbox": "Учитывать отложенные задачи при подсчёте свободных слотов
пула",
+ "description": "Описание",
+ "includeDeferred": "Включить отложенные",
+ "nameMaxLength": "Имя может содержать максимум 256 символов",
+ "nameRequired": "Имя обязательно",
+ "slots": "Слоты"
+ },
+ "noPoolsFound": "Пулы не найдены",
+ "pool_one": "Пул",
+ "pool_other": "Пулы",
+ "searchPlaceholder": "Поиск пулов",
+ "sort": {
+ "asc": "Имя (A-Z)",
+ "desc": "Имя (Z-A)",
+ "placeholder": "Сортировать по"
+ }
+ },
+ "providers": {
+ "columns": {
+ "packageName": "Название пакета",
+ "version": "Версия"
+ }
+ },
+ "variables": {
+ "add": "Добавить переменную",
+ "columns": {
+ "isEncrypted": "Зашифровано"
+ },
+ "delete": {
+ "deleteVariable_one": "Удалить 1 переменную",
+ "deleteVariable_other": "Удалить {{count}} переменных",
+ "firstConfirmMessage_one": "Вы собираетесь удалить следующую
переменную:",
+ "firstConfirmMessage_other": "Вы собираетесь удалить следующие
переменные:",
+ "title": "Удалить переменную",
+ "tooltip": "Удалить выбранные переменные"
+ },
+ "edit": "Редактировать переменную",
+ "form": {
+ "invalidJson": "Некорректный JSON",
+ "keyMaxLength": "Ключ может содержать максимум 250 символов",
+ "keyRequired": "Ключ обязателен",
+ "valueRequired": "Значение обязательно"
+ },
+ "import": {
+ "button": "Импортировать",
+ "conflictResolution": "Выберите способ разрешения конфликтов переменных",
+ "errorParsingJsonFile": "Ошибка парсинга JSON файла: загрузите JSON
файл, содержащий переменные (например, {\"key\": \"value\", ...}).",
+ "options": {
+ "fail": {
+ "description": "Отклоняет импорт, если обнаружены существующие
переменные.",
+ "title": "Отклонить"
+ },
+ "overwrite": {
+ "description": "Перезаписывает переменную в случае конфликта.",
+ "title": "Перезаписать"
+ },
+ "skip": {
+ "description": "Пропускает импорт переменных, которые уже
существуют.",
+ "title": "Пропустить"
+ }
+ },
+ "title": "Импорт переменных",
+ "upload": "Загрузить JSON файл",
+ "uploadPlaceholder": "Загрузите JSON файл, содержащий переменные
(например, {\"key\": \"value\", ...})"
+ },
+ "noRowsMessage": "Переменные не найдены",
+ "searchPlaceholder": "Поиск ключей",
+ "variable_one": "Переменная",
+ "variable_other": "Переменные"
+ }
+}
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/ru/assets.json
b/airflow-core/src/airflow/ui/public/i18n/locales/ru/assets.json
new file mode 100644
index 00000000000..26c5614f135
--- /dev/null
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/ru/assets.json
@@ -0,0 +1,37 @@
+{
+ "additional_data": "Дополнительные данные",
+ "asset_many": "Активы",
+ "asset_one": "Актив",
+ "consumingDags": "Потребляющие Dag-и",
+ "consumingTasks": "Потребляющие задачи",
+ "createEvent": {
+ "button": "Создать событие",
+ "manual": {
+ "description": "Вручную создать событие актива",
+ "extra": "Дополнительные события актива",
+ "label": "Ручное"
+ },
+ "materialize": {
+ "description": "Запустить Dag выше по цепочке этого актива",
+ "descriptionWithDag": "Запустить Dag выше по цепочке этого актива:
{{dagName}}",
+ "label": "Материализовать",
+ "unpauseDag": "Снять паузу с {{dagName}} при запуске"
+ },
+ "success": {
+ "manualDescription": "Создание события актива вручную прошло успешно.",
+ "manualTitle": "Событие актива создано",
+ "materializeDescription": "Верхний Dag {{dagId}} был успешно запущен.",
+ "materializeTitle": "Материализация актива"
+ },
+ "title": "Создать событие актива для {{name}}"
+ },
+ "extra": "Дополнительно",
+ "group": "Группа",
+ "lastAssetEvent": "Последнее событие актива",
+ "name": "Имя",
+ "producingTasks": "Производящие задачи",
+ "scheduledDags": "Запланированные Dag-и",
+ "scheduling": "Расписание",
+ "searchPlaceholder": "Поиск активов",
+ "taskDependencies": "Зависимости задач"
+}
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/ru/browse.json
b/airflow-core/src/airflow/ui/public/i18n/locales/ru/browse.json
new file mode 100644
index 00000000000..4e18a73f06b
--- /dev/null
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/ru/browse.json
@@ -0,0 +1,46 @@
+{
+ "auditLog": {
+ "columns": {
+ "event": "Событие",
+ "extra": "Дополнительно",
+ "user": "Пользователь",
+ "when": "Когда"
+ },
+ "filters": {
+ "eventType": "Тип события"
+ },
+ "title": "Журнал аудита"
+ },
+ "xcom": {
+ "add": {
+ "error": "Не удалось добавить XCom",
+ "errorTitle": "Ошибка",
+ "success": "XCom успешно добавлен",
+ "successTitle": "XCom добавлен",
+ "title": "Добавить XCom"
+ },
+ "columns": {
+ "dag": "Dag",
+ "key": "Ключ",
+ "value": "Значение"
+ },
+ "delete": {
+ "error": "Не удалось удалить XCom",
+ "errorTitle": "Ошибка",
+ "success": "XCom успешно удалён",
+ "successTitle": "XCom удалён",
+ "title": "Удалить XCom",
+ "warning": "Вы уверены, что хотите удалить этот XCom? Это действие
нельзя отменить."
+ },
+ "edit": {
+ "error": "Не удалось обновить XCom",
+ "errorTitle": "Ошибка",
+ "success": "XCom успешно обновлён",
+ "successTitle": "XCom обновлён",
+ "title": "Редактировать XCom"
+ },
+ "key": "Ключ",
+ "title": "XCom",
+ "value": "Значение"
+ }
+}
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/ru/common.json
b/airflow-core/src/airflow/ui/public/i18n/locales/ru/common.json
new file mode 100644
index 00000000000..147626f6c69
--- /dev/null
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/ru/common.json
@@ -0,0 +1,362 @@
+{
+ "admin": {
+ "Config": "Конфигурация",
+ "Connections": "Соединения",
+ "Plugins": "Плагины",
+ "Pools": "Пулы",
+ "Providers": "Поставщики",
+ "Variables": "Переменные"
+ },
+ "allOperators": "Все операторы",
+ "appearance": {
+ "appearance": "Внешний вид",
+ "darkMode": "Тёмная тема",
+ "lightMode": "Светлая тема",
+ "systemMode": "Следовать системным настройкам"
+ },
+ "asset_one": "Актив",
+ "asset_other": "Активы",
+ "assetEvent_one": "Событие актива",
+ "assetEvent_other": "События активов",
+ "backfill_one": "Заполнение",
+ "backfill_other": "Заполнения",
+ "browse": {
+ "auditLog": "Журнал аудита",
+ "jobs": "Задания",
+ "requiredActions": "Необходимые действия",
+ "xcoms": "XCom-ы"
+ },
+ "collapseAllExtra": "Свернуть все дополнительные JSON",
+ "collapseDetailsPanel": "Свернуть панель деталей",
+ "createdAssetEvent_one": "Создано событие актива",
+ "createdAssetEvent_other": "Созданы события активов",
+ "dag_one": "Dag",
+ "dag_other": "Dag-и",
+ "dagDetails": {
+ "catchup": "Сбор данных",
+ "dagRunTimeout": "Тайм-аут запуска Dag-а",
+ "defaultArgs": "Аргументы по умолчанию",
+ "description": "Описание",
+ "documentation": "Документация Dag-а",
+ "fileLocation": "Место хранения файла",
+ "hasTaskConcurrencyLimits": "Имеет ограничения на параллельные задачи",
+ "lastExpired": "Последний истёкший",
+ "lastParseDuration": "Длительность последнего парсинга",
+ "lastParsed": "Последний распарсенный",
+ "latestDagVersion": "Последняя версия Dag-а",
+ "latestRun": "Последний запуск",
+ "maxActiveRuns": "Максимум активных запусков",
+ "maxActiveTasks": "Максимум активных задач",
+ "maxConsecutiveFailedDagRuns": "Максимум последовательных неудачных
запусков Dag-а",
+ "nextRun": "Следующий запуск",
+ "owner": "Владелец",
+ "params": "Параметры",
+ "schedule": "Расписание",
+ "tags": "Теги"
+ },
+ "dagId": "ID Dag-а",
+ "dagRun": {
+ "conf": "Конфигурация",
+ "dagVersions": "Версии Dag-а",
+ "dataIntervalEnd": "Конец временного интервала",
+ "dataIntervalStart": "Начало временного интервала",
+ "lastSchedulingDecision": "Последнее решение о расписании",
+ "mappedPartitionKey": "Ключ распределенной части",
+ "partitionKey": "Ключ части",
+ "queuedAt": "В очереди в",
+ "runAfter": "Запустить после",
+ "runType": "Тип запуска",
+ "sourceAssetEvent": "Источник события актива",
+ "triggeredBy": "Инициировано",
+ "triggeringUser": "Инициатор запуска"
+ },
+ "dagRun_few": "Запуск Dag-ов",
+ "dagRun_many": "Запуск Dag-ов",
+ "dagRun_one": "Запуск Dag-а",
+ "dagRun_other": "Запусков Dag-ов",
+ "dagRunId": "ID запуска Dag-а",
+ "dagWarnings": "Предупреждения/ошибки Dag-а",
+ "defaultToGraphView": "По умолчанию отображать график",
+ "defaultToGridView": "По умолчанию отображать в сетке",
+ "delete": "Удалить",
+ "diff": "Разница",
+ "diffCompareWith": "Сравнить с",
+ "diffExit": "Выйти из просмотра различий",
+ "diffSelectVersionToCompare": "Выбрать версию для сравнения",
+ "direction": "Направление",
+ "docs": {
+ "documentation": "Документация",
+ "githubRepo": "Репозиторий на GitHub",
+ "restApiReference": "Референс REST API"
+ },
+ "download": {
+ "download": "Скачать",
+ "hotkey": "D",
+ "tooltip": "Нажмите {{hotkey}}, чтобы скачать журналы"
+ },
+ "duration": "Длительность",
+ "edit": "Редактировать",
+ "endDate": "Дата окончания",
+ "error": {
+ "back": "Назад",
+ "defaultMessage": "Произошла непредвиденная ошибка",
+ "home": "Главная",
+ "invalidUrl": "Страница не найдена. Пожалуйста, проверьте URL и попробуйте
снова.",
+ "notFound": "Страница не найдена",
+ "title": "Ошибка"
+ },
+ "expand": {
+ "collapse": "Свернуть",
+ "expand": "Развернуть",
+ "hotkey": "E",
+ "tooltip": "Нажмите {{hotkey}}, чтобы переключить развертывание"
+ },
+ "expandAllExtra": "Развернуть все дополнительные JSON",
+ "expression": {
+ "all": "ВСЕ",
+ "and": "И",
+ "any": "ЛЮБОЙ",
+ "or": "ИЛИ"
+ },
+ "filter": "Фильтр",
+ "filters": {
+ "durationFrom": "Продолжительность с",
+ "durationTo": "Продолжительность до",
+ "endTime": "Время окончания",
+ "logicalDateFrom": "Логическая дата с",
+ "logicalDateTo": "Логическая дата до",
+ "runAfterFrom": "Запустить после с",
+ "runAfterTo": "Запустить после до",
+ "selectDateRange": "Выбрать диапазон дат",
+ "startTime": "Время начала"
+ },
+ "generateToken": "Сгенерировать токен",
+ "logicalDate": "Логическая дата",
+ "logout": "Выйти",
+ "logoutConfirmation": "Вы собираетесь выйти из приложения.",
+ "mapIndex": "Индекс отображения",
+ "modal": {
+ "add": "Добавить",
+ "cancel": "Отменить",
+ "confirm": "Подтвердить",
+ "delete": {
+ "button": "Удалить",
+ "confirmation": "Вы уверены, что хотите удалить {{resourceName}}? Это
действие нельзя будет отменить."
+ },
+ "save": "Сохранить"
+ },
+ "nav": {
+ "admin": "Администратор",
+ "assets": "Активы",
+ "browse": "Просмотр",
+ "dags": "Dag-и",
+ "docs": "Документы",
+ "home": "Главная",
+ "legacyFabViews": "Устаревшие виды",
+ "plugins": "Плагины",
+ "security": "Безопасность"
+ },
+ "noItemsFound": "Не найдено {{modelName}}",
+ "note": {
+ "add": "Добавить заметку",
+ "dagRun": "Заметка запуска Dag-а",
+ "label": "Заметка",
+ "placeholder": "Добавьте заметку...",
+ "taskInstance": "Заметка для экземпляра задачи"
+ },
+ "partitionedDagRun_one": "Разделенный запуск Dag-а",
+ "partitionedDagRun_other": "Разделенных запусков Dag-а",
+ "partitionedDagRunDetail": {
+ "receivedAssetEvents": "Полученные события актива"
+ },
+ "pendingDagRun_few": "{{count}} Dag-а ожидают запуска",
+ "pendingDagRun_one": "{{count}} Dag ожидает запуска",
+ "pendingDagRun_other": "{{count}} Dag-ов ожидают запуска",
+ "reset": "Сбросить",
+ "runId": "ID запуска",
+ "runTypes": {
+ "asset_triggered": "Запущено активом",
+ "backfill": "Заполнение",
+ "manual": "Вручную",
+ "scheduled": "Запланировано"
+ },
+ "scroll": {
+ "direction": {
+ "bottom": "вниз",
+ "top": "вверх"
+ },
+ "tooltip": "Нажмите {{hotkey}}, чтобы прокрутить {{direction}}"
+ },
+ "security": {
+ "actions": "Действия",
+ "permissions": "Разрешения",
+ "resources": "Ресурсы",
+ "roles": "Роли",
+ "users": "Пользователи"
+ },
+ "selectLanguage": "Выбор языка",
+ "showDetailsPanel": "Показать панель деталей",
+ "signedInAs": "Вошли как",
+ "source": {
+ "hide": "Скрыть источник",
+ "hotkey": "S",
+ "show": "Показать источник"
+ },
+ "sourceAssetEvent_one": "Событие источника актива",
+ "sourceAssetEvent_other": "Событий источника актива",
+ "startDate": "Дата начала",
+ "state": "Состояние",
+ "states": {
+ "deferred": "Отложен",
+ "failed": "Ошибка",
+ "no_status": "Нет статуса",
+ "none": "Нет статуса",
+ "open": "Открыт",
+ "planned": "Запланирован",
+ "queued": "В очереди",
+ "removed": "Удалён",
+ "restarting": "Перезапуск",
+ "running": "Выполняется",
+ "scheduled": "Запланирован",
+ "skipped": "Пропущен",
+ "success": "Успех",
+ "up_for_reschedule": "Готов к переназначению",
+ "up_for_retry": "Готов к повтору",
+ "upstream_failed": "Ошибка в upstream"
+ },
+ "table": {
+ "completedAt": "Завершен в",
+ "createdAt": "Создан в",
+ "filterByTag": "Фильтровать Dag-и по тегу",
+ "filterColumns": "Фильтровать столбцы таблицы",
+ "filterReset_one": "Сбросить фильтр",
+ "filterReset_other": "Сбросить фильтры",
+ "from": "От",
+ "maxActiveRuns": "Максимум активных запусков",
+ "noTagsFound": "Теги не найдены",
+ "tagMode": {
+ "all": "Все",
+ "any": "Любой"
+ },
+ "tagPlaceholder": "Фильтр по тегу",
+ "to": "До"
+ },
+ "task": {
+ "documentation": "Документация задачи",
+ "lastInstance": "Последний экземпляр",
+ "operator": "Оператор",
+ "triggerRule": "Правило запуска"
+ },
+ "task_one": "Задача",
+ "task_other": "Задач",
+ "taskGroup": "Группа задач",
+ "taskId": "ID задачи",
+ "taskInstance": {
+ "dagVersion": "Версия Dag-а",
+ "executor": "Исполнитель",
+ "executorConfig": "Конфигурация исполнителя",
+ "hostname": "Имя хоста",
+ "maxTries": "Максимум попыток",
+ "pid": "PID",
+ "pool": "Пул",
+ "poolSlots": "Слоты пула",
+ "priorityWeight": "Приоритетный вес",
+ "queue": "Очередь",
+ "queuedWhen": "В очереди в",
+ "scheduledWhen": "Запланировано в",
+ "triggerer": {
+ "assigned": "Назначенный триггер",
+ "class": "Класс триггера",
+ "createdAt": "Время создания триггера",
+ "id": "ID триггера",
+ "latestHeartbeat": "Последний heartbeat-сигнал триггера",
+ "title": "Информация о триггере"
+ },
+ "unixname": "Имя Unix"
+ },
+ "taskInstance_few": "Экземпляра задачи",
+ "taskInstance_many": "Экземпляров задачи",
+ "taskInstance_one": "Экземпляр задачи",
+ "taskInstance_other": "Экземпляров задачи",
+ "timeRange": {
+ "last12Hours": "Последние 12 часов",
+ "last24Hours": "Последние 24 часа",
+ "lastHour": "Последний час",
+ "pastWeek": "Прошлая неделя"
+ },
+ "timestamp": {
+ "hide": "Скрыть временные метки",
+ "hotkey": "T",
+ "show": "Показать временные метки"
+ },
+ "timezone": "Часовой пояс",
+ "timezoneModal": {
+ "current-timezone": "Текущее время в",
+ "placeholder": "Выбрать часовой пояс",
+ "title": "Выбрать часовой пояс",
+ "utc": "UTC (Всемирное координированное время)"
+ },
+ "toaster": {
+ "bulkDelete": {
+ "error": "Ошибка массового удаления {{resourceName}}",
+ "success": {
+ "description": "{{count}} {{resourceName}} успешно удалены. Ключи:
{{keys}}",
+ "title": "Запрос на массовое удаление {{resourceName}} отправлен"
+ }
+ },
+ "create": {
+ "error": "Ошибка создания {{resourceName}}",
+ "success": {
+ "description": "{{resourceName}} успешно создан.",
+ "title": "Запрос на создание {{resourceName}} отправлен"
+ }
+ },
+ "delete": {
+ "error": "Ошибка удаления {{resourceName}}",
+ "success": {
+ "description": "{{resourceName}} успешно удалён.",
+ "title": "Запрос на удаление {{resourceName}} отправлен"
+ }
+ },
+ "forbidden": {
+ "description": "У вас нет разрешения на выполнение этого действия.",
+ "title": "Доступ запрещён"
+ },
+ "import": {
+ "error": "Ошибка импорта {{resourceName}}",
+ "success": {
+ "description": "{{count}} {{resourceName}} успешно импортированы.",
+ "title": "Запрос на импорт {{resourceName}} отправлен"
+ }
+ },
+ "update": {
+ "error": "Ошибка обновления {{resourceName}}",
+ "success": {
+ "description": "{{resourceName}} успешно обновлён.",
+ "title": "Запрос на обновление {{resourceName}} отправлен"
+ }
+ }
+ },
+ "tokenGeneration": {
+ "apiToken": "API токен",
+ "cliToken": "CLI токен",
+ "errorDescription": "Произошла ошибка при генерации токена. Пожалуйста,
попробуйте снова.",
+ "errorTitle": "Ошибка генерации токена",
+ "generate": "Сгенерировать",
+ "selectType": "Выберите тип токена для генерации.",
+ "title": "Генерация токена",
+ "tokenExpiresIn": "Этот токен истекает через {{duration}}.",
+ "tokenGenerated": "Ваш токен сгенерирован.",
+ "tokenShownOnce": "Этот токен будет показан только один раз. Не забудьте
скопировать и сохранить его."
+ },
+ "total": "Итого {{state}}",
+ "triggered": "Запущено",
+ "tryNumber": "Номер попытки",
+ "user": "Пользователь",
+ "wrap": {
+ "hotkey": "W",
+ "tooltip": "Нажмите {{hotkey}}, чтобы свернуть/развернуть",
+ "unwrap": "Развернуть",
+ "wrap": "Свернуть"
+ }
+}
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/ru/components.json
b/airflow-core/src/airflow/ui/public/i18n/locales/ru/components.json
new file mode 100644
index 00000000000..5790128ef6c
--- /dev/null
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/ru/components.json
@@ -0,0 +1,176 @@
+{
+ "backfill": {
+ "affected_few": "Будет запущено {{count}} процесса.",
+ "affected_one": "Будет запущен 1 процесс.",
+ "affected_other": "Будет запущено {{count}} процессов.",
+ "affectedNone": "Нет процессов, соответствующих выбранным критериям.",
+ "allRuns": "Все процессы",
+ "backwards": "Запуск назад",
+ "dateRange": "Диапазон дат",
+ "errorStartDateBeforeEndDate": "Дата начала должна быть раньше даты
окончания",
+ "maxRuns": "Максимум активных запусков",
+ "missingAndErroredRuns": "Отсутствующие и ошибочные запуски",
+ "missingRuns": "Отсутствующие запуски",
+ "permissionDenied": "Не удалось выполнить пробный запуск, так как у
пользователя нет разрешения на создание Заполнения.",
+ "reprocessBehavior": "Поведение повторной обработки",
+ "run": "Запуск Заполнения",
+ "selectDescription": "Запуск этого Dag-а для диапазона дат",
+ "selectLabel": "Заполнение",
+ "title": "Запуск Заполнения",
+ "toaster": {
+ "success": {
+ "description": "Запуск выполнения Заполнения успешно инициирован.",
+ "title": "Заполнение сгенерировано"
+ }
+ },
+ "tooltip": "Заполнение требует расписания",
+ "unpause": "Возобновить {{dag_display_name}} при запуске",
+ "validation": {
+ "datesRequired": "Необходимо указать как дату начала, так и дату
окончания.",
+ "startBeforeEnd": "Дата начала должна быть меньше или равной дате
окончания."
+ }
+ },
+ "banner": {
+ "backfillInProgress": "Заполнение в процессе",
+ "cancel": "Отменить Заполнение",
+ "pause": "Приостановить Заполнение",
+ "unpause": "Возобновить Заполнения"
+ },
+ "clipboard": {
+ "copy": "Копировать"
+ },
+ "close": "Закрыть",
+ "configForm": {
+ "advancedOptions": "Расширенные параметры",
+ "configJson": "Конфигурация JSON",
+ "invalidJson": "Некорректный формат JSON: {{errorMessage}}"
+ },
+ "dagWarnings": {
+ "error_one": "1 ошибка",
+ "errorAndWarning": "1 ошибка и {{warningText}}",
+ "warning_few": "{{count}} предупреждения",
+ "warning_one": "1 предупреждение",
+ "warning_other": "{{count}} предупреждений"
+ },
+ "dateRangeFilter": {
+ "validation": {
+ "invalidDateFormat": "Некорректный формат даты.",
+ "invalidTimeFormat": "Некорректный формат времени.",
+ "startBeforeEnd": "Начальная дата/время должно быть раньше конечной
даты/времени"
+ }
+ },
+ "durationChart": {
+ "duration": "Продолжительность (секунды)",
+ "lastDagRun_few": "Последние {{count}} запуска Dag-а",
+ "lastDagRun_one": "Последний запуск Dag-а",
+ "lastDagRun_other": "Последние {{count}} запусков Dag-а",
+ "lastTaskInstance_few": "Последние {{count}} экземпляра задачи",
+ "lastTaskInstance_one": "Последний экземпляр задачи",
+ "lastTaskInstance_other": "Последние {{count}} экземпляров задачи",
+ "queuedDuration": "Длительность в очереди",
+ "runAfter": "Запустить после",
+ "runDuration": "Длительность запуска"
+ },
+ "fileUpload": {
+ "files_few": "{{count}} файла",
+ "files_one": "{{count}} файл",
+ "files_other": "{{count}} файлов"
+ },
+ "flexibleForm": {
+ "placeholder": "Выбрать значение",
+ "placeholderArray": "Введите каждую строку с новой строки",
+ "placeholderExamples": "Начните вводить текст, чтобы увидеть варианты",
+ "placeholderMulti": "Выберите одно или несколько значений",
+ "validationErrorArrayNotArray": "Значение должно быть массивом.",
+ "validationErrorArrayNotNumbers": "Все элементы в массиве должны быть
числами.",
+ "validationErrorArrayNotObject": "Все элементы в массиве должны быть
объектами.",
+ "validationErrorRequired": "Это поле обязательно для заполнения"
+ },
+ "graph": {
+ "directionDown": "Сверху вниз",
+ "directionLeft": "Справа налево",
+ "directionRight": "Слева направо",
+ "directionUp": "Снизу вверх",
+ "downloadImage": "Скачать изображение графа",
+ "downloadImageError": "Не удалось скачать изображение графа.",
+ "downloadImageErrorTitle": "Ошибка загрузки",
+ "otherDagRuns": "+Другие запуски Dag-а",
+ "taskCount_few": "{{count}} задачи",
+ "taskCount_one": "{{count}} задача",
+ "taskCount_other": "{{count}} задач",
+ "taskGroup": "Группа задач"
+ },
+ "limitedList": "Ещё +{{count}}",
+ "limitedList.allItems": "Все {{count}} элемента(ов):",
+ "limitedList.allTags_few": "Все теги ({{count}})",
+ "limitedList.allTags_one": "Все теги (1)",
+ "limitedList.allTags_other": "Все теги ({{count}})",
+ "limitedList.clickToInteract": "Нажмите на тег, чтобы фильтровать Dag-и",
+ "limitedList.clickToOpenFull": "Нажмите \"Ещё +{{count}}\", чтобы открыть
полный вид",
+ "limitedList.copyPasteText": "Вы можете скопировать и вставить текст выше",
+ "limitedList.showingItems_few": "Показано {{count}} элемента",
+ "limitedList.showingItems_one": "Показан 1 элемент",
+ "limitedList.showingItems_other": "Показано {{count}} элементов",
+ "logs": {
+ "file": "Файл",
+ "location": "строка {{line}} в {{name}}"
+ },
+ "reparseDag": "Повторный парсинг Dag-а",
+ "sortedAscending": "отсортировано по возрастанию",
+ "sortedDescending": "отсортировано по убыванию",
+ "sortedUnsorted": "не отсортировано",
+ "taskTries": "Попытки задачи",
+ "taskTryPlaceholder": "Попытка задачи",
+ "team": {
+ "selector": {
+ "helperText": "Необязательно. Ограничить использование для конкретной
команды.",
+ "label": "Команда",
+ "placeHolder": "Выберите команду"
+ }
+ },
+ "toggleCardView": "Карточный вид",
+ "toggleTableView": "Табличный вид",
+ "triggerDag": {
+ "button": "Запустить",
+ "dataInterval": "Временной интервал",
+ "dataIntervalAuto": "Предполагается из логической даты и расписания",
+ "dataIntervalManual": "Указать вручную",
+ "intervalEnd": "Конец",
+ "intervalStart": "Начало",
+ "loading": "Загрузка информации о Dag-е...",
+ "loadingFailed": "Не удалось загрузить информацию о Dag-е. Пожалуйста,
попробуйте снова.",
+ "manualRunDenied": "Ручные запуски не разрешены для этого Dag-а",
+ "runIdHelp": "Необязательно - будет сгенерирован, если не предоставлен",
+ "selectDescription": "Запустить один процесс этого Dag-а",
+ "selectLabel": "Единичный запуск",
+ "title": "Запуск Dag-а",
+ "toaster": {
+ "error": {
+ "title": "Не удалось запустить Dag"
+ },
+ "success": {
+ "description": "Запуск Dag-а успешно инициирован.",
+ "title": "Запуск Dag-а инициирован"
+ }
+ },
+ "triggerAgainWithConfig": "Запустить снова с этой конфигурацией",
+ "unpause": "Возобновить {{dagDisplayName}} при запуске"
+ },
+ "trimText": {
+ "details": "Детали",
+ "empty": "Пусто",
+ "noContent": "Нет доступного контента."
+ },
+ "versionDetails": {
+ "bundleLink": "Ссылка на пакет",
+ "bundleName": "Название пакета",
+ "bundleVersion": "Версия пакета",
+ "createdAt": "Создано в",
+ "versionId": "ID версии"
+ },
+ "versionSelect": {
+ "allVersions": "Все версии",
+ "dagVersion": "Версия Dag-а",
+ "versionCode": "v{{versionCode}}"
+ }
+}
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/ru/dag.json
b/airflow-core/src/airflow/ui/public/i18n/locales/ru/dag.json
new file mode 100644
index 00000000000..c878d7ec6fd
--- /dev/null
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/ru/dag.json
@@ -0,0 +1,191 @@
+{
+ "allRuns": "Все Запуски",
+ "blockingDeps": {
+ "dependency": "Зависимость",
+ "reason": "Причина",
+ "title": "Зависимости, которые блокируют Запуск задачи"
+ },
+ "calendar": {
+ "daily": "Ежедневно",
+ "hourly": "Каждый час",
+ "legend": {
+ "less": "Меньше",
+ "mixed": "Смешанные",
+ "more": "Больше"
+ },
+ "navigation": {
+ "nextMonth": "Следующий месяц",
+ "nextYear": "Следующий год",
+ "previousMonth": "Предыдущий месяц",
+ "previousYear": "Предыдущий год"
+ },
+ "noData": "Нет доступных данных",
+ "noFailedRuns": "Нет неудачных запусков",
+ "noRuns": "Нет запусков",
+ "totalRuns": "Всего запусков",
+ "week": "Неделя {{weekNumber}}",
+ "weekdays": {
+ "friday": "Пт",
+ "monday": "Пн",
+ "saturday": "Сб",
+ "sunday": "Вс",
+ "thursday": "Чт",
+ "tuesday": "Вт",
+ "wednesday": "Ср"
+ }
+ },
+ "code": {
+ "bundleUrl": "URL пакета",
+ "noCode": "Код не найден",
+ "parseDuration": "Длительность парсинга:",
+ "parsedAt": "Распарсен в:"
+ },
+ "extraLinks": "Дополнительные ссылки",
+ "grid": {
+ "buttons": {
+ "resetToLatest": "Сбросить до последнего",
+ "toggleGroup": "Переключить группу"
+ },
+ "runTypeLegend": "Легенда типа запуска"
+ },
+ "header": {
+ "buttons": {
+ "advanced": "Расширенные настройки",
+ "dagDocs": "Документация Dag-а"
+ }
+ },
+ "logs": {
+ "allLevels": "Все уровни логов",
+ "allSources": "Все источники",
+ "critical": "КРИТИЧЕСКИЙ",
+ "debug": "ОТЛАДКА",
+ "error": "ОШИБКА",
+ "fullscreen": {
+ "button": "На весь экран",
+ "tooltip": "Нажмите {{hotkey}} для полного экрана"
+ },
+ "info": "ИНФОРМАЦИЯ",
+ "noTryNumber": "Нет номера попытки",
+ "settings": "Настройки логов",
+ "viewInExternal": "Просмотреть логи в {{name}} (попытка {{attempt}})",
+ "warning": "ПРЕДУПРЕЖДЕНИЕ"
+ },
+ "navigation": {
+ "navigation": "Навигация: Shift+{{arrow}}",
+ "toggleGroup": "Переключить группу: Пробел"
+ },
+ "notFound": {
+ "back": "Назад",
+ "backToDags": "Назад к Dag-ам",
+ "message": "Dag \"{{dagId}}\" не существует.",
+ "title": "Dag не найден"
+ },
+ "overview": {
+ "buttons": {
+ "failedRun_one": "Неудачный запуск",
+ "failedRun_other": "Неудачные запуски",
+ "failedTask_one": "Неудачная задача",
+ "failedTask_other": "Неудачные задачи",
+ "failedTaskInstance_one": "Неудачный экземпляр задачи",
+ "failedTaskInstance_other": "Неудачные экземпляры задач"
+ },
+ "charts": {
+ "assetEvent_one": "Созданное событие актива",
+ "assetEvent_other": "Созданные события актива"
+ },
+ "failedLogs": {
+ "hideLogs": "Скрыть логи",
+ "showLogs": "Показать логи",
+ "title": "Недавние логи неудачных задач",
+ "viewFullLogs": "Просмотреть полные логи"
+ }
+ },
+ "panel": {
+ "buttons": {
+ "options": "Опции",
+ "showGantt": "Показать Гантт",
+ "showGraphShortcut": "Показать граф (нажмите g)",
+ "showGridShortcut": "Показать сетку (нажмите g)"
+ },
+ "dagRuns": {
+ "label": "Количество запусков Dag-а"
+ },
+ "dependencies": {
+ "label": "Зависимости",
+ "options": {
+ "allDagDependencies": "Все зависимости Dag-а",
+ "externalConditions": "Внешние условия",
+ "onlyTasks": "Только задачи"
+ },
+ "placeholder": "Зависимости"
+ },
+ "graphDirection": {
+ "label": "Направление графа"
+ },
+ "showVersionIndicator": {
+ "label": "Показать индикатор версии",
+ "options": {
+ "hideAll": "Скрыть все",
+ "showAll": "Показать все",
+ "showBundleVersion": "Показать версию пакета",
+ "showDagVersion": "Показать версию Dag-а"
+ }
+ },
+ "taskStreamFilter": {
+ "activeFilter": "Активный фильтр",
+ "clearFilter": "Очистить фильтр",
+ "clickTask": "Нажмите на задачу, чтобы выбрать ее в качестве корня
фильтра",
+ "depth": "Глубина",
+ "direction": "Направление",
+ "label": "Фильтр",
+ "mode": "Режим",
+ "modeTooltip": "Статический режим сохраняет текущее представление при
навигации к другим задачам, в то время как режим Traverse автоматически
обновляет активный фильтр до нажатой задачи для более легкой навигации по
Dag-у.",
+ "modes": {
+ "static": "Статический",
+ "traverse": "Traverse"
+ },
+ "options": {
+ "both": "Как вверх, так и вниз по потоку",
+ "downstream": "Вниз по потоку",
+ "upstream": "Вверх по потоку"
+ },
+ "selectedTask": "Выбранная задача"
+ }
+ },
+ "paramsFailed": "Не удалось загрузить параметры",
+ "parse": {
+ "toaster": {
+ "error": {
+ "description": "Запрос на парсинг Dag не выполнен. Возможно, есть
ожидающие запросы на парсинг, которые еще предстоит обработать.",
+ "title": "Не удалось выполнить повторный парсинг Dag-а"
+ },
+ "success": {
+ "description": "Dag скоро будет повторно распарсен.",
+ "title": "Запрос на повторный парсинг успешно отправлен"
+ }
+ }
+ },
+ "tabs": {
+ "assetEvents": "События активов",
+ "auditLog": "Аудиторский журнал",
+ "backfills": "Заполнение",
+ "calendar": "Календарь",
+ "code": "Код",
+ "details": "Детали",
+ "logs": "Логи",
+ "mappedTaskInstances_few": "Экземпляры задач [{{count}}]",
+ "mappedTaskInstances_one": "Экземпляр задачи [{{count}}]",
+ "mappedTaskInstances_other": "Экземпляры задач [{{count}}]",
+ "overview": "Обзор",
+ "renderedTemplates": "Отрендеренные шаблоны",
+ "requiredActions": "Необходимые действия",
+ "runs": "Запуски",
+ "taskInstances": "Экземпляры задач",
+ "tasks": "Задачи",
+ "xcom": "XCom"
+ },
+ "taskGroups": {
+ "collapseAll": "Свернуть все группы задач",
+ "expandAll": "Развернуть все группы задач"
+ }
+}
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/ru/dags.json
b/airflow-core/src/airflow/ui/public/i18n/locales/ru/dags.json
new file mode 100644
index 00000000000..3f5757f7822
--- /dev/null
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/ru/dags.json
@@ -0,0 +1,101 @@
+{
+ "assetSchedule": "{{count}} из {{total}} активов обновлены",
+ "dagActions": {
+ "delete": {
+ "button": "Удалить Dag",
+ "warning": "Это удалит все метаданные, связанные с Dag-ом, включая
Запуски и Задачи."
+ }
+ },
+ "favoriteDag": "Избранный Dag",
+ "filters": {
+ "allRunTypes": "Все типы запусков",
+ "allStates": "Все состояния",
+ "favorite": {
+ "all": "Все",
+ "favorite": "Избранное",
+ "unfavorite": "Удалить из избранного"
+ },
+ "paused": {
+ "active": "Активный",
+ "all": "Все",
+ "paused": "Приостановлен"
+ },
+ "runIdPatternFilter": "Поиск запусков Dag-ов"
+ },
+ "ownerLink": "Ссылка на владельца для {{owner}}",
+ "runAndTaskActions": {
+ "affectedTasks": {
+ "noItemsFound": "Задачи не найдены.",
+ "title": "Затронутые задачи: {{count}}"
+ },
+ "clear": {
+ "button": "Очистить {{type}}",
+ "buttonTooltip": "Нажмите SHIFT + C для очистки",
+ "error": "Не удалось очистить {{type}}",
+ "title": "Очистить {{type}}"
+ },
+ "confirmationDialog": {
+ "description": "Задача в настоящее время находится в состоянии
{{state}}, запущенном пользователем {{user}} в {{time}}. \nПользователь не
может очистить эту задачу, пока она не завершится, или пока другой пользователь
не снимет отметку с опции \"Предотвратить повторный запуск, если задача
выполняется\" в диалоге очистки задачи.",
+ "title": "Невозможно очистить экземпляр задачи"
+ },
+ "delete": {
+ "button": "Удалить {{type}}",
+ "dialog": {
+ "resourceName": "{{type}} {{id}}",
+ "title": "Удалить {{type}}",
+ "warning": "Это удалит все метаданные, связанные с {{type}}."
+ },
+ "error": "Ошибка при удалении {{type}}",
+ "success": {
+ "description": "Запрос на удаление {{type}} был успешным.",
+ "title": "{{type}} успешно удален"
+ }
+ },
+ "markAs": {
+ "button": "Отметить {{type}} как...",
+ "buttonTooltip": {
+ "failed": "Нажмите SHIFT + F, чтобы отметить как неудавшееся",
+ "success": "Нажмите SHIFT + S, чтобы отметить как успешное"
+ },
+ "title": "Отметить {{type}} как {{state}}"
+ },
+ "options": {
+ "downstream": "Вниз по потоку",
+ "existingTasks": "Очистить существующие задачи",
+ "future": "Будущее",
+ "onlyFailed": "Очистить только неудавшиеся задачи",
+ "past": "Прошлое",
+ "preventRunningTasks": "Предотвратить повторный запуск, если задача
выполняется",
+ "queueNew": "Поставить новые задачи в очередь",
+ "runOnLatestVersion": "Запустить с последней версией пакета",
+ "upstream": "Вверх по потоку"
+ }
+ },
+ "search": {
+ "advanced": "Расширенный поиск",
+ "clear": "Очистить поиск",
+ "dags": "Поиск Dagов",
+ "hotkey": "+ K",
+ "tasks": "Поиск задач"
+ },
+ "sort": {
+ "displayName": {
+ "asc": "Сортировать по имени (А-Z)",
+ "desc": "Сортировать по имени (Z-А)"
+ },
+ "lastRunStartDate": {
+ "asc": "Сортировать по дате начала последнего запуска (по возрастанию
даты)",
+ "desc": "Сортировать по дате начала последнего запуска (по убыванию
даты)"
+ },
+ "lastRunState": {
+ "asc": "Сортировать по состоянию последнего запуска (А-Z)",
+ "desc": "Сортировать по состоянию последнего запуска (Z-А)"
+ },
+ "nextDagRun": {
+ "asc": "Сортировать по следующему запуску Dag (по возрастанию даты)",
+ "desc": "Сортировать по следующему запуску Dag (по убыванию даты)"
+ },
+ "placeholder": "Сортировать по"
+ },
+ "unfavoriteDag": "Удалить из избранного Dag"
+}
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/ru/dashboard.json
b/airflow-core/src/airflow/ui/public/i18n/locales/ru/dashboard.json
new file mode 100644
index 00000000000..d2ef60c293c
--- /dev/null
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/ru/dashboard.json
@@ -0,0 +1,47 @@
+{
+ "favorite": {
+ "favoriteDags_few": "Первые {{count}} избранных Dag-а",
+ "favoriteDags_one": "Первый {{count}} избранный Dag",
+ "favoriteDags_other": "Первые {{count}} избранных Dag-ов",
+ "noDagRuns": "Для этого Dag-а еще нет запусков.",
+ "noFavoriteDags": "Ещё нет избранных. Нажмите на иконку со звёздочкой
рядом с Dag-ом в списке, чтобы добавить его в избранное."
+ },
+ "group": "Группа",
+ "health": {
+ "dagProcessor": "Процессор Dag-а",
+ "health": "Состояние",
+ "healthy": "Исправный",
+ "lastHeartbeat": "Последний hearbeat-сигнал",
+ "metaDatabase": "Метабаза данных",
+ "scheduler": "Планировщик",
+ "status": "Статус",
+ "triggerer": "Триггер",
+ "unhealthy": "Неисправный"
+ },
+ "history": "История",
+ "importErrors": {
+ "dagImportError_one": "Ошибка импорта Dag-ов",
+ "dagImportError_other": "Ошибки импорта Dag-ов",
+ "searchByFile": "Поиск по файлу",
+ "timestamp": "Отметка времени"
+ },
+ "managePools": "Управление пулами",
+ "noAssetEvents": "Нет найденных событий активов.",
+ "poolSlots": "Слоты пула",
+ "sortBy": {
+ "newestFirst": "Сначала новые",
+ "oldestFirst": "Сначала старые",
+ "placeholder": "Сортировать по"
+ },
+ "source": "Источник",
+ "stats": {
+ "activeDags": "Активные Dag-и",
+ "failedDags": "Dag-и с ошибками",
+ "queuedDags": "Dag-и в очереди",
+ "requiredActions": "Необходимые действия",
+ "runningDags": "Выполняющиеся Dag-и",
+ "stats": "Статистика"
+ },
+ "uri": "URI",
+ "welcome": "Добро пожаловать"
+}
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/ru/hitl.json
b/airflow-core/src/airflow/ui/public/i18n/locales/ru/hitl.json
new file mode 100644
index 00000000000..82c769dd267
--- /dev/null
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/ru/hitl.json
@@ -0,0 +1,39 @@
+{
+ "filters": {
+ "body": "Тело",
+ "createdAt": "Создано",
+ "response": {
+ "all": "Все",
+ "pending": "В ожидании",
+ "received": "Просмотрено"
+ }
+ },
+ "requiredAction_one": "Необходимое действие",
+ "requiredAction_other": "Необходимые действия",
+ "requiredActionCount_few": "Необходимые действия ({{count}})",
+ "requiredActionCount_one": "Необходимое действие ({{count}})",
+ "requiredActionCount_other": "Необходимые действия ({{count}})",
+ "requiredActionState": "Состояние необходимого действия",
+ "response": {
+ "created": "Ответ создан ",
+ "error": "Ошибка ответа",
+ "optionsDescription": "Выберите ваши опции для этого экземпляра задачи",
+ "optionsLabel": "Опции",
+ "received": "Ответ получен ",
+ "respond": "Ответить",
+ "responded_by_user_name": "Ответил (Имя пользователя)",
+ "success": "Ответ {{taskId}} успешен",
+ "title": "Экземпляр задачи для человека - {{taskId}}"
+ },
+ "state": {
+ "approvalReceived": "Одобрение получено",
+ "approvalRequired": "Необходимо одобрение",
+ "choiceReceived": "Выбор получен",
+ "choiceRequired": "Необходим выбор",
+ "noResponseReceived": "Ответ не получен",
+ "rejectionReceived": "Отказ получен",
+ "responseReceived": "Ответ получен",
+ "responseRequired": "Необходим ответ"
+ },
+ "subject": "Тема"
+}
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/ru/tasks.json
b/airflow-core/src/airflow/ui/public/i18n/locales/ru/tasks.json
new file mode 100644
index 00000000000..8fcc714bcff
--- /dev/null
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/ru/tasks.json
@@ -0,0 +1,10 @@
+{
+ "mapped": "Отображено",
+ "notMapped": "Не отображено",
+ "retries": "Повторные попытки",
+ "searchTasks": "Поиск задач",
+ "selectMapped": "Выбрать отображенные",
+ "selectOperator": "Выбрать операторы",
+ "selectRetryValues": "Выбрать значения повторов",
+ "selectTriggerRules": "Выбрать правила триггера"
+}
diff --git a/airflow-core/src/airflow/ui/src/i18n/config.ts
b/airflow-core/src/airflow/ui/src/i18n/config.ts
index da506ddcff9..3d5e5d03fbe 100644
--- a/airflow-core/src/airflow/ui/src/i18n/config.ts
+++ b/airflow-core/src/airflow/ui/src/i18n/config.ts
@@ -38,6 +38,7 @@ export const supportedLanguages = [
{ code: "nl", name: "Nederlands" },
{ code: "pl", name: "Polski" },
{ code: "pt", name: "Português" },
+ { code: "ru", name: "Русский" },
{ code: "th", name: "ไทย" },
{ code: "tr", name: "Türkçe" },
{ code: "zh-CN", name: "简体中文" },
diff --git a/dev/breeze/doc/images/output_pr_auto-triage.svg
b/dev/breeze/doc/images/output_pr_auto-triage.svg
index c3a56f415f0..8cbffab9f40 100644
--- a/dev/breeze/doc/images/output_pr_auto-triage.svg
+++ b/dev/breeze/doc/images/output_pr_auto-triage.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 2392.3999999999996"
xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 2416.7999999999997"
xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -43,7 +43,7 @@
<defs>
<clipPath id="breeze-pr-auto-triage-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="2341.3999999999996" />
+ <rect x="0" y="0" width="1463.0" height="2365.7999999999997" />
</clipPath>
<clipPath id="breeze-pr-auto-triage-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -330,9 +330,12 @@
<clipPath id="breeze-pr-auto-triage-line-94">
<rect x="0" y="2295.1" width="1464" height="24.65"/>
</clipPath>
+<clipPath id="breeze-pr-auto-triage-line-95">
+ <rect x="0" y="2319.5" width="1464" height="24.65"/>
+ </clipPath>
</defs>
- <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1"
x="1" y="1" width="1480" height="2390.4" rx="8"/><text
class="breeze-pr-auto-triage-title" fill="#c5c8c6" text-anchor="middle" x="740"
y="27">Command: pr auto-triage</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1"
x="1" y="1" width="1480" height="2414.8" rx="8"/><text
class="breeze-pr-auto-triage-title" fill="#c5c8c6" text-anchor="middle" x="740"
y="27">Command: pr auto-triage</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -396,48 +399,49 @@
</text><text class="breeze-pr-auto-triage-r5" x="0" y="1264.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-51)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1264.4" textLength="1098"
clip-path="url(#breeze-pr-auto-triage-line-51)">translation:ar | translation:ca | translation:de | translation:default | translation:el | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1264.4" textLength="12.2" cli
[...]
</text><text class="breeze-pr-auto-triage-r5" x="0" y="1288.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-52)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1288.8" textLength="1037"
clip-path="url(#breeze-pr-auto-triage-line-52)">translation:es | translation:fr | translation:he | translation:hi | translation:hu | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1288.8" textLength="12.2"
clip-pat [...]
</text><text class="breeze-pr-auto-triage-r5" x="0" y="1313.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-53)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1313.2" textLength="1037"
clip-path="url(#breeze-pr-auto-triage-line-53)">translation:it | translation:ja | translation:ko | translation:nl | translation:pl | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1313.2" textLength="12.2"
clip-pat [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1337.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-54)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1337.6" textLength="1085.8"
clip-path="url(#breeze-pr-auto-triage-line-54)">translation:pt | translation:th | translation:tr | translation:zh-CN | translation:zh-TW)</text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1337.6" textLength="12.2"
clip-path="u [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1362" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-55)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1362" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-55)">--exclude-label        </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1362" textLength="805.2"
clip-path="url(#breeze-pr-auto-triage-line-55)">Exclude PRs with this&#
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1386.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-56)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1386.4" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-56)">--created-after        </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1386.4" textLength="646.6"
clip-path="url(#breeze-pr-auto-triage-line-56)">Only PRs created 
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1410.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-57)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1410.8" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-57)">--created-before       </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1410.8" textLength="658.8"
clip-path="url(#breeze-pr-auto-triage-line-57)">Only PRs created on
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1435.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-58)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1435.2" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-58)">--updated-after        </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1435.2" textLength="646.6"
clip-path="url(#breeze-pr-auto-triage-line-58)">Only PRs updated 
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1459.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-59)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1459.6" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-59)">--updated-before       </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1459.6" textLength="658.8"
clip-path="url(#breeze-pr-auto-triage-line-59)">Only PRs updated on
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1484" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-60)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1484" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-60)">--include-drafts       </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1484" textLength="1110.2"
clip-path="url(#breeze-pr-auto-triage-line-60)">Include draft PRs in t
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1508.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-61)">│</text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1508.4" textLength="1110.2"
clip-path="url(#breeze-pr-auto-triage-line-61)">review.                                    
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1532.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-62)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1532.8" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-62)">--pending-approval-only</text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1532.8" textLength="622.2"
clip-path="url(#breeze-pr-auto-triage-line-62)">Only show PRs with workflow runs awaiting&
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1557.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-63)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1557.2" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-63)">--mode                 </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1557.2" textLength="1110.2"
clip-path="url(#breeze-pr-auto-tri [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1581.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-64)">│</text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1581.6" textLength="1110.2"
clip-path="url(#breeze-pr-auto-triage-line-64)">PRs with 'ready for maintainer review' label, run deterministic checks first, then LLM code</text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1 [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1606" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-65)">│</text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1606" textLength="402.6"
clip-path="url(#breeze-pr-auto-triage-line-65)">review with line-level comments. </text><text
class="breeze-pr-auto-triage-r5" x="732" y="1606" textLength="207.4"
clip-path="url(#breeze-pr-auto-triage-line-65)">[default: triage]</text><text
class="breeze- [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1630.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-66)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1630.4" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-66)">--checks-state         </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1630.4" textLength="524.6"
clip-path="url(#breeze-pr-auto-triage-line-66)">Only assess PRs&#
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1654.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-67)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1654.8" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-67)">--min-commits-behind   </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1654.8" textLength="878.4"
clip-path="url(#breeze-pr-auto-triage-line-67)">Only assess PRs that are at 
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1679.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-68)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1679.2" textLength="109.8"
clip-path="url(#breeze-pr-auto-triage-line-68)">(INTEGER)</text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1679.2" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-68)">│</text><text
class="breeze-pr-auto-triage-r1" x="1464" y="1679.2" textLength="12.2" [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1703.6"
textLength="1464"
clip-path="url(#breeze-pr-auto-triage-line-69)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-pr-auto-triage-r1" x="1464" y="1703.6" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-69)">
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1728" textLength="24.4"
clip-path="url(#breeze-pr-auto-triage-line-70)">╭─</text><text
class="breeze-pr-auto-triage-r5" x="24.4" y="1728" textLength="292.8"
clip-path="url(#breeze-pr-auto-triage-line-70)"> Pagination and sorting </text><text
class="breeze-pr-auto-triage-r5" x="317.2" y="1728" textLength="1122.4"
clip-path="url(#breeze-pr-auto-triage-line-70)">───────────────────────────────────────────────────────
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1752.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-71)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1752.4" textLength="146.4"
clip-path="url(#breeze-pr-auto-triage-line-71)">--batch-size</text><text
class="breeze-pr-auto-triage-r1" x="195.2" y="1752.4" textLength="500.2"
clip-path="url(#breeze-pr-auto-triage-line-71)">Number of PRs to fetch per GraphQL page. </
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1776.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-72)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1776.8" textLength="146.4"
clip-path="url(#breeze-pr-auto-triage-line-72)">--max-num   </text><text
class="breeze-pr-auto-triage-r1" x="195.2" y="1776.8" textLength="793"
clip-path="url(#breeze-pr-auto-triage-line-72)">Maximum number of non-collaborator PRs to
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1801.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-73)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1801.2" textLength="146.4"
clip-path="url(#breeze-pr-auto-triage-line-73)">--sort      </text><text
class="breeze-pr-auto-triage-r1" x="195.2" y="1801.2" textLength="414.8"
clip-path="url(#breeze-pr-auto-triage-line-73)">Sort order for PR search res
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1825.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-74)">│</text><text
class="breeze-pr-auto-triage-r6" x="195.2" y="1825.6" textLength="622.2"
clip-path="url(#breeze-pr-auto-triage-line-74)">(created-asc|created-desc|updated-asc|updated-desc)</text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1825.6" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-74)">│</text><text
class="breeze-pr-auto-triage- [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1850" textLength="1464"
clip-path="url(#breeze-pr-auto-triage-line-75)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-pr-auto-triage-r1" x="1464" y="1850" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-75)">
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1874.4"
textLength="24.4"
clip-path="url(#breeze-pr-auto-triage-line-76)">╭─</text><text
class="breeze-pr-auto-triage-r5" x="24.4" y="1874.4" textLength="244"
clip-path="url(#breeze-pr-auto-triage-line-76)"> Assessment options </text><text
class="breeze-pr-auto-triage-r5" x="268.4" y="1874.4" textLength="1171.2"
clip-path="url(#breeze-pr-auto-triage-line-76)">────────────────────────────────────────────────────────────
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1898.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-77)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1898.8" textLength="207.4"
clip-path="url(#breeze-pr-auto-triage-line-77)">--check-mode     </text><text
class="breeze-pr-auto-triage-r1" x="256.2" y="1898.8" textLength="1061.4"
clip-path="url(#breeze-pr-auto-triage-line-77)">Which checks to run: 'both&
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1923.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-78)">│</text><text
class="breeze-pr-auto-triage-r5" x="256.2" y="1923.2" textLength="61"
clip-path="url(#breeze-pr-auto-triage-line-78)">both]</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1923.2" textLength="170.8"
clip-path="url(#breeze-pr-auto-triage-line-78)">(both|api|llm)</text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1923.2" textLength [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1947.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-79)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1947.6" textLength="207.4"
clip-path="url(#breeze-pr-auto-triage-line-79)">--llm-model      </text><text
class="breeze-pr-auto-triage-r1" x="256.2" y="1947.6" textLength="1183.4"
clip-path="url(#breeze-pr-auto-triage-line-79)">LLM model for assessment (f
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1972" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-80)">│</text><text
class="breeze-pr-auto-triage-r1" x="256.2" y="1972" textLength="268.4"
clip-path="url(#breeze-pr-auto-triage-line-80)">for OpenAI Codex CLI. </text><text
class="breeze-pr-auto-triage-r5" x="524.6" y="1972" textLength="427"
clip-path="url(#breeze-pr-auto-triage-line-80)">[default: claude/claude-sonnet-4-6]</text><text
class=" [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1996.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-81)">│</text><text
class="breeze-pr-auto-triage-r6" x="256.2" y="1996.4" textLength="1159"
clip-path="url(#breeze-pr-auto-triage-line-81)">>claude/claude-sonnet-4-6< | claude/claude-opus-4-20250514 | claude/claude-sonnet-4-20250514 | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1996.4" textLength="12.2"
clip-path="u [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="2020.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-82)">│</text><text
class="breeze-pr-auto-triage-r6" x="256.2" y="2020.8" textLength="1110.2"
clip-path="url(#breeze-pr-auto-triage-line-82)">claude/claude-haiku-4-5-20251001 | claude/sonnet | claude/opus | claude/haiku | codex/o3 | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="2020.8" textLength="12.2" [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="2045.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-83)">│</text><text
class="breeze-pr-auto-triage-r6" x="256.2" y="2045.2" textLength="366"
clip-path="url(#breeze-pr-auto-triage-line-83)">codex/o4-mini | codex/gpt-4.1)</text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="2045.2" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-83)">│</text><text
class="breeze-pr-auto-triage-r1" x="1464" [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="2069.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-84)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="2069.6" textLength="207.4"
clip-path="url(#breeze-pr-auto-triage-line-84)">--llm-concurrency</text><text
class="breeze-pr-auto-triage-r1" x="256.2" y="2069.6" textLength="524.6"
clip-path="url(#breeze-pr-auto-triage-line-84)">Number of concurrent LLM assessment calls. </tex
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="2094" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-85)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="2094" textLength="207.4"
clip-path="url(#breeze-pr-auto-triage-line-85)">--clear-llm-cache</text><text
class="breeze-pr-auto-triage-r1" x="256.2" y="2094" textLength="658.8"
clip-path="url(#breeze-pr-auto-triage-line-85)">Clear the LLM review and triage caches before
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="2118.4"
textLength="1464"
clip-path="url(#breeze-pr-auto-triage-line-86)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-pr-auto-triage-r1" x="1464" y="2118.4" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-86)">
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="2142.8"
textLength="24.4"
clip-path="url(#breeze-pr-auto-triage-line-87)">╭─</text><text
class="breeze-pr-auto-triage-r5" x="24.4" y="2142.8" textLength="195.2"
clip-path="url(#breeze-pr-auto-triage-line-87)"> Action options </text><text
class="breeze-pr-auto-triage-r5" x="219.6" y="2142.8" textLength="1220"
clip-path="url(#breeze-pr-auto-triage-line-87)">────────────────────────────────────────────────────────────────
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="2167.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-88)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="2167.2" textLength="183"
clip-path="url(#breeze-pr-auto-triage-line-88)">--answer-triage</text><text
class="breeze-pr-auto-triage-r1" x="231.8" y="2167.2" textLength="1207.8"
clip-path="url(#breeze-pr-auto-triage-line-88)">Force answer to triage prompts: [d]raft, [c]lose,&#
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="2191.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-89)">│</text><text
class="breeze-pr-auto-triage-r6" x="231.8" y="2191.6" textLength="183"
clip-path="url(#breeze-pr-auto-triage-line-89)">(d|c|r|s|q|y|n)</text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="2191.6" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-89)">│</text><text
class="breeze-pr-auto-triage-r1" x="1464" y="2191.6" textLength="12 [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="2216" textLength="1464"
clip-path="url(#breeze-pr-auto-triage-line-90)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-pr-auto-triage-r1" x="1464" y="2216" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-90)">
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="2240.4"
textLength="24.4"
clip-path="url(#breeze-pr-auto-triage-line-91)">╭─</text><text
class="breeze-pr-auto-triage-r5" x="24.4" y="2240.4" textLength="195.2"
clip-path="url(#breeze-pr-auto-triage-line-91)"> Common options </text><text
class="breeze-pr-auto-triage-r5" x="219.6" y="2240.4" textLength="1220"
clip-path="url(#breeze-pr-auto-triage-line-91)">────────────────────────────────────────────────────────────────
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="2264.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-92)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="2264.8" textLength="109.8"
clip-path="url(#breeze-pr-auto-triage-line-92)">--dry-run</text><text
class="breeze-pr-auto-triage-r7" x="158.6" y="2264.8" textLength="24.4"
clip-path="url(#breeze-pr-auto-triage-line-92)">-D</text><text
class="breeze-pr-auto-triage-r1" x="207.4" y="2264.8" textLength="719.8" [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="2289.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-93)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="2289.2" textLength="109.8"
clip-path="url(#breeze-pr-auto-triage-line-93)">--verbose</text><text
class="breeze-pr-auto-triage-r7" x="158.6" y="2289.2" textLength="24.4"
clip-path="url(#breeze-pr-auto-triage-line-93)">-v</text><text
class="breeze-pr-auto-triage-r1" x="207.4" y="2289.2" textLength="585.6" [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="2313.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-94)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="2313.6" textLength="109.8"
clip-path="url(#breeze-pr-auto-triage-line-94)">--help   </text><text
class="breeze-pr-auto-triage-r7" x="158.6" y="2313.6" textLength="24.4"
clip-path="url(#breeze-pr-auto-triage-line-94)">-h</text><text
class="breeze-pr-auto-triage-r1" x="207.4" y="2313.6" tex [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="2338" textLength="1464"
clip-path="url(#breeze-pr-auto-triage-line-95)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-pr-auto-triage-r1" x="1464" y="2338" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-95)">
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1337.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-54)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1337.6" textLength="1073.6"
clip-path="url(#breeze-pr-auto-triage-line-54)">translation:pt | translation:ru | translation:th | translation:tr | translation:zh-CN | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1337.6" textLength="12.2" cli
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1362" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-55)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1362" textLength="219.6"
clip-path="url(#breeze-pr-auto-triage-line-55)">translation:zh-TW)</text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1362" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-55)">│</text><text
class="breeze-pr-auto-triage-r1" x="1464" y="1362" textLength="12.2" [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1386.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-56)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1386.4" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-56)">--exclude-label        </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1386.4" textLength="805.2"
clip-path="url(#breeze-pr-auto-triage-line-56)">Exclude PRs with 
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1410.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-57)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1410.8" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-57)">--created-after        </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1410.8" textLength="646.6"
clip-path="url(#breeze-pr-auto-triage-line-57)">Only PRs created 
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1435.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-58)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1435.2" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-58)">--created-before       </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1435.2" textLength="658.8"
clip-path="url(#breeze-pr-auto-triage-line-58)">Only PRs created on
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1459.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-59)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1459.6" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-59)">--updated-after        </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1459.6" textLength="646.6"
clip-path="url(#breeze-pr-auto-triage-line-59)">Only PRs updated 
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1484" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-60)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1484" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-60)">--updated-before       </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1484" textLength="658.8"
clip-path="url(#breeze-pr-auto-triage-line-60)">Only PRs updated on or&
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1508.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-61)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1508.4" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-61)">--include-drafts       </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1508.4" textLength="1110.2"
clip-path="url(#breeze-pr-auto-triage-line-61)">Include draft PRs in&
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1532.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-62)">│</text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1532.8" textLength="1110.2"
clip-path="url(#breeze-pr-auto-triage-line-62)">review.                                    
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1557.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-63)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1557.2" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-63)">--pending-approval-only</text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1557.2" textLength="622.2"
clip-path="url(#breeze-pr-auto-triage-line-63)">Only show PRs with workflow runs awaiting&
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1581.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-64)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1581.6" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-64)">--mode                 </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1581.6" textLength="1110.2"
clip-path="url(#breeze-pr-auto-tri [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1606" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-65)">│</text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1606" textLength="1110.2"
clip-path="url(#breeze-pr-auto-triage-line-65)">PRs with 'ready for maintainer review' label, run deterministic checks first, then LLM code</text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1606" [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1630.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-66)">│</text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1630.4" textLength="402.6"
clip-path="url(#breeze-pr-auto-triage-line-66)">review with line-level comments. </text><text
class="breeze-pr-auto-triage-r5" x="732" y="1630.4" textLength="207.4"
clip-path="url(#breeze-pr-auto-triage-line-66)">[default: triage]</text><text
class="b [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1654.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-67)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1654.8" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-67)">--checks-state         </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1654.8" textLength="524.6"
clip-path="url(#breeze-pr-auto-triage-line-67)">Only assess PRs&#
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1679.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-68)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1679.2" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-68)">--min-commits-behind   </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1679.2" textLength="878.4"
clip-path="url(#breeze-pr-auto-triage-line-68)">Only assess PRs that are at 
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1703.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-69)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1703.6" textLength="109.8"
clip-path="url(#breeze-pr-auto-triage-line-69)">(INTEGER)</text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1703.6" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-69)">│</text><text
class="breeze-pr-auto-triage-r1" x="1464" y="1703.6" textLength="12.2" [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1728" textLength="1464"
clip-path="url(#breeze-pr-auto-triage-line-70)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-pr-auto-triage-r1" x="1464" y="1728" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-70)">
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1752.4"
textLength="24.4"
clip-path="url(#breeze-pr-auto-triage-line-71)">╭─</text><text
class="breeze-pr-auto-triage-r5" x="24.4" y="1752.4" textLength="292.8"
clip-path="url(#breeze-pr-auto-triage-line-71)"> Pagination and sorting </text><text
class="breeze-pr-auto-triage-r5" x="317.2" y="1752.4" textLength="1122.4"
clip-path="url(#breeze-pr-auto-triage-line-71)">─────────────────────────────────────────────────
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1776.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-72)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1776.8" textLength="146.4"
clip-path="url(#breeze-pr-auto-triage-line-72)">--batch-size</text><text
class="breeze-pr-auto-triage-r1" x="195.2" y="1776.8" textLength="500.2"
clip-path="url(#breeze-pr-auto-triage-line-72)">Number of PRs to fetch per GraphQL page. </
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1801.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-73)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1801.2" textLength="146.4"
clip-path="url(#breeze-pr-auto-triage-line-73)">--max-num   </text><text
class="breeze-pr-auto-triage-r1" x="195.2" y="1801.2" textLength="793"
clip-path="url(#breeze-pr-auto-triage-line-73)">Maximum number of non-collaborator PRs to
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1825.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-74)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1825.6" textLength="146.4"
clip-path="url(#breeze-pr-auto-triage-line-74)">--sort      </text><text
class="breeze-pr-auto-triage-r1" x="195.2" y="1825.6" textLength="414.8"
clip-path="url(#breeze-pr-auto-triage-line-74)">Sort order for PR search res
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1850" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-75)">│</text><text
class="breeze-pr-auto-triage-r6" x="195.2" y="1850" textLength="622.2"
clip-path="url(#breeze-pr-auto-triage-line-75)">(created-asc|created-desc|updated-asc|updated-desc)</text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1850" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-75)">│</text><text
class="breeze-pr-auto-triage-r1" x= [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1874.4"
textLength="1464"
clip-path="url(#breeze-pr-auto-triage-line-76)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-pr-auto-triage-r1" x="1464" y="1874.4" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-76)">
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1898.8"
textLength="24.4"
clip-path="url(#breeze-pr-auto-triage-line-77)">╭─</text><text
class="breeze-pr-auto-triage-r5" x="24.4" y="1898.8" textLength="244"
clip-path="url(#breeze-pr-auto-triage-line-77)"> Assessment options </text><text
class="breeze-pr-auto-triage-r5" x="268.4" y="1898.8" textLength="1171.2"
clip-path="url(#breeze-pr-auto-triage-line-77)">────────────────────────────────────────────────────────────
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1923.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-78)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1923.2" textLength="207.4"
clip-path="url(#breeze-pr-auto-triage-line-78)">--check-mode     </text><text
class="breeze-pr-auto-triage-r1" x="256.2" y="1923.2" textLength="1061.4"
clip-path="url(#breeze-pr-auto-triage-line-78)">Which checks to run: 'both&
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1947.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-79)">│</text><text
class="breeze-pr-auto-triage-r5" x="256.2" y="1947.6" textLength="61"
clip-path="url(#breeze-pr-auto-triage-line-79)">both]</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1947.6" textLength="170.8"
clip-path="url(#breeze-pr-auto-triage-line-79)">(both|api|llm)</text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1947.6" textLength [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1972" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-80)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1972" textLength="207.4"
clip-path="url(#breeze-pr-auto-triage-line-80)">--llm-model      </text><text
class="breeze-pr-auto-triage-r1" x="256.2" y="1972" textLength="1183.4"
clip-path="url(#breeze-pr-auto-triage-line-80)">LLM model for assessment (format:
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1996.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-81)">│</text><text
class="breeze-pr-auto-triage-r1" x="256.2" y="1996.4" textLength="268.4"
clip-path="url(#breeze-pr-auto-triage-line-81)">for OpenAI Codex CLI. </text><text
class="breeze-pr-auto-triage-r5" x="524.6" y="1996.4" textLength="427"
clip-path="url(#breeze-pr-auto-triage-line-81)">[default: claude/claude-sonnet-4-6]</text><text
c [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="2020.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-82)">│</text><text
class="breeze-pr-auto-triage-r6" x="256.2" y="2020.8" textLength="1159"
clip-path="url(#breeze-pr-auto-triage-line-82)">>claude/claude-sonnet-4-6< | claude/claude-opus-4-20250514 | claude/claude-sonnet-4-20250514 | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="2020.8" textLength="12.2"
clip-path="u [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="2045.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-83)">│</text><text
class="breeze-pr-auto-triage-r6" x="256.2" y="2045.2" textLength="1110.2"
clip-path="url(#breeze-pr-auto-triage-line-83)">claude/claude-haiku-4-5-20251001 | claude/sonnet | claude/opus | claude/haiku | codex/o3 | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="2045.2" textLength="12.2" [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="2069.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-84)">│</text><text
class="breeze-pr-auto-triage-r6" x="256.2" y="2069.6" textLength="366"
clip-path="url(#breeze-pr-auto-triage-line-84)">codex/o4-mini | codex/gpt-4.1)</text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="2069.6" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-84)">│</text><text
class="breeze-pr-auto-triage-r1" x="1464" [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="2094" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-85)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="2094" textLength="207.4"
clip-path="url(#breeze-pr-auto-triage-line-85)">--llm-concurrency</text><text
class="breeze-pr-auto-triage-r1" x="256.2" y="2094" textLength="524.6"
clip-path="url(#breeze-pr-auto-triage-line-85)">Number of concurrent LLM assessment calls. </text><tex
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="2118.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-86)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="2118.4" textLength="207.4"
clip-path="url(#breeze-pr-auto-triage-line-86)">--clear-llm-cache</text><text
class="breeze-pr-auto-triage-r1" x="256.2" y="2118.4" textLength="658.8"
clip-path="url(#breeze-pr-auto-triage-line-86)">Clear the LLM review and triage caches befo
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="2142.8"
textLength="1464"
clip-path="url(#breeze-pr-auto-triage-line-87)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-pr-auto-triage-r1" x="1464" y="2142.8" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-87)">
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="2167.2"
textLength="24.4"
clip-path="url(#breeze-pr-auto-triage-line-88)">╭─</text><text
class="breeze-pr-auto-triage-r5" x="24.4" y="2167.2" textLength="195.2"
clip-path="url(#breeze-pr-auto-triage-line-88)"> Action options </text><text
class="breeze-pr-auto-triage-r5" x="219.6" y="2167.2" textLength="1220"
clip-path="url(#breeze-pr-auto-triage-line-88)">────────────────────────────────────────────────────────────────
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="2191.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-89)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="2191.6" textLength="183"
clip-path="url(#breeze-pr-auto-triage-line-89)">--answer-triage</text><text
class="breeze-pr-auto-triage-r1" x="231.8" y="2191.6" textLength="1207.8"
clip-path="url(#breeze-pr-auto-triage-line-89)">Force answer to triage prompts: [d]raft, [c]lose,&#
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="2216" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-90)">│</text><text
class="breeze-pr-auto-triage-r6" x="231.8" y="2216" textLength="183"
clip-path="url(#breeze-pr-auto-triage-line-90)">(d|c|r|s|q|y|n)</text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="2216" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-90)">│</text><text
class="breeze-pr-auto-triage-r1" x="1464" y="2216" textLength="12.2" clip [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="2240.4"
textLength="1464"
clip-path="url(#breeze-pr-auto-triage-line-91)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-pr-auto-triage-r1" x="1464" y="2240.4" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-91)">
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="2264.8"
textLength="24.4"
clip-path="url(#breeze-pr-auto-triage-line-92)">╭─</text><text
class="breeze-pr-auto-triage-r5" x="24.4" y="2264.8" textLength="195.2"
clip-path="url(#breeze-pr-auto-triage-line-92)"> Common options </text><text
class="breeze-pr-auto-triage-r5" x="219.6" y="2264.8" textLength="1220"
clip-path="url(#breeze-pr-auto-triage-line-92)">────────────────────────────────────────────────────────────────
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="2289.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-93)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="2289.2" textLength="109.8"
clip-path="url(#breeze-pr-auto-triage-line-93)">--dry-run</text><text
class="breeze-pr-auto-triage-r7" x="158.6" y="2289.2" textLength="24.4"
clip-path="url(#breeze-pr-auto-triage-line-93)">-D</text><text
class="breeze-pr-auto-triage-r1" x="207.4" y="2289.2" textLength="719.8" [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="2313.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-94)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="2313.6" textLength="109.8"
clip-path="url(#breeze-pr-auto-triage-line-94)">--verbose</text><text
class="breeze-pr-auto-triage-r7" x="158.6" y="2313.6" textLength="24.4"
clip-path="url(#breeze-pr-auto-triage-line-94)">-v</text><text
class="breeze-pr-auto-triage-r1" x="207.4" y="2313.6" textLength="585.6" [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="2338" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-95)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="2338" textLength="109.8"
clip-path="url(#breeze-pr-auto-triage-line-95)">--help   </text><text
class="breeze-pr-auto-triage-r7" x="158.6" y="2338" textLength="24.4"
clip-path="url(#breeze-pr-auto-triage-line-95)">-h</text><text
class="breeze-pr-auto-triage-r1" x="207.4" y="2338" textLength= [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="2362.4"
textLength="1464"
clip-path="url(#breeze-pr-auto-triage-line-96)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-pr-auto-triage-r1" x="1464" y="2362.4" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-96)">
</text>
</g>
</g>
diff --git a/dev/breeze/doc/images/output_pr_auto-triage.txt
b/dev/breeze/doc/images/output_pr_auto-triage.txt
index 66cedf08b8d..21f65be5aaa 100644
--- a/dev/breeze/doc/images/output_pr_auto-triage.txt
+++ b/dev/breeze/doc/images/output_pr_auto-triage.txt
@@ -1 +1 @@
-8107cecf84483d0900f542688f0d0247
+d8cea45c4870fdc6a06e25481f7c85c0
diff --git a/dev/breeze/src/airflow_breeze/commands/ui_commands.py
b/dev/breeze/src/airflow_breeze/commands/ui_commands.py
index 3836e76f7ef..a2770ead53f 100644
--- a/dev/breeze/src/airflow_breeze/commands/ui_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/ui_commands.py
@@ -89,6 +89,7 @@ PLURAL_SUFFIXES = {
"nl": MOST_COMMON_PLURAL_SUFFIXES,
"pl": ["_one", "_few", "_many", "_other"],
"pt": ["_zero", "_one", "_many", "_other"],
+ "ru": ["_one", "_few", "_other"],
"th": ["_other"],
"tr": MOST_COMMON_PLURAL_SUFFIXES,
"zh-CN": ["_other"],