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:&#160;pr&#160;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:&#160;pr&#160;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&#160;|&#160;translation:ca&#160;|&#160;translation:de&#160;|&#160;translation:default&#160;|&#160;translation:el&#160;|&#160;</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&#160;|&#160;translation:fr&#160;|&#160;translation:he&#160;|&#160;translation:hi&#160;|&#160;translation:hu&#160;|&#160;</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&#160;|&#160;translation:ja&#160;|&#160;translation:ko&#160;|&#160;translation:nl&#160;|&#160;translation:pl&#160;|&#160;</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&#160;|&#160;translation:th&#160;|&#160;translation:tr&#160;|&#160;translation:zh-CN&#160;|&#160;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&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</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&#160;PRs&#160;with&#160;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&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</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&#160;PRs&#160;created&#160;
 [...]
-</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&#160;&#160;&#160;&#160;&#160;&#160;&#160;</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&#160;PRs&#160;created&#160;on&#1
 [...]
-</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&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</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&#160;PRs&#160;updated&#160;
 [...]
-</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&#160;&#160;&#160;&#160;&#160;&#160;&#160;</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&#160;PRs&#160;updated&#160;on&#1
 [...]
-</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&#160;&#160;&#160;&#160;&#160;&#160;&#160;</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&#160;draft&#160;PRs&#160;in&#160;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.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
-</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&#160;show&#160;PRs&#160;with&#160;workflow&#160;runs&#160;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&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</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&#160;with&#160;&#x27;ready&#160;for&#160;maintainer&#160;review&#x27;&#160;label,&#160;run&#160;deterministic&#160;checks&#160;first,&#160;then&#160;LLM&#160;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&#160;with&#160;line-level&#160;comments.&#160;</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:&#160;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&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</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&#160;assess&#160;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&#160;&#160;&#160;</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&#160;assess&#160;PRs&#160;that&#160;are&#160;at&#160
 [...]
-</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)">&#160;Pagination&#160;and&#160;sorting&#160;</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&#160;of&#160;PRs&#160;to&#160;fetch&#160;per&#160;GraphQL&#160;page.&#160;</
 [...]
-</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&#160;&#160;&#160;</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&#160;number&#160;of&#160;non-collaborator&#160;PRs&#160;to&#16
 [...]
-</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&#160;&#160;&#160;&#160;&#160;&#160;</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&#160;order&#160;for&#160;PR&#160;search&#160;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)">&#160;Assessment&#160;options&#160;</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&#160;&#160;&#160;&#160;&#160;</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&#160;checks&#160;to&#160;run:&#160;&#x27;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&#160;&#160;&#160;&#160;&#160;&#160;</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&#160;model&#160;for&#160;assessment&#160;(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&#160;OpenAI&#160;Codex&#160;CLI.&#160;</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:&#160;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)">&gt;claude/claude-sonnet-4-6&lt;&#160;|&#160;claude/claude-opus-4-20250514&#160;|&#160;claude/claude-sonnet-4-20250514&#160;|&#160;</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&#160;|&#160;claude/sonnet&#160;|&#160;claude/opus&#160;|&#160;claude/haiku&#160;|&#160;codex/o3&#160;|&#160;</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&#160;|&#160;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&#160;of&#160;concurrent&#160;LLM&#160;assessment&#160;calls.&#160;</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&#160;the&#160;LLM&#160;review&#160;and&#160;triage&#160;caches&#160;before&#16
 [...]
-</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)">&#160;Action&#160;options&#160;</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&#160;answer&#160;to&#160;triage&#160;prompts:&#160;[d]raft,&#160;[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)">&#160;Common&#160;options&#160;</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&#160;&#160;&#160;</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&#160;|&#160;translation:ru&#160;|&#160;translation:th&#160;|&#160;translation:tr&#160;|&#160;translation:zh-CN&#160;|&#160;</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&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</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&#160;PRs&#160;with&#160;
 [...]
+</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&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</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&#160;PRs&#160;created&#160;
 [...]
+</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&#160;&#160;&#160;&#160;&#160;&#160;&#160;</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&#160;PRs&#160;created&#160;on&#1
 [...]
+</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&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</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&#160;PRs&#160;updated&#160;
 [...]
+</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&#160;&#160;&#160;&#160;&#160;&#160;&#160;</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&#160;PRs&#160;updated&#160;on&#160;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&#160;&#160;&#160;&#160;&#160;&#160;&#160;</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&#160;draft&#160;PRs&#160;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.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
+</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&#160;show&#160;PRs&#160;with&#160;workflow&#160;runs&#160;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&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</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&#160;with&#160;&#x27;ready&#160;for&#160;maintainer&#160;review&#x27;&#160;label,&#160;run&#160;deterministic&#160;checks&#160;first,&#160;then&#160;LLM&#160;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&#160;with&#160;line-level&#160;comments.&#160;</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:&#160;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&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</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&#160;assess&#160;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&#160;&#160;&#160;</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&#160;assess&#160;PRs&#160;that&#160;are&#160;at&#160
 [...]
+</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)">&#160;Pagination&#160;and&#160;sorting&#160;</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&#160;of&#160;PRs&#160;to&#160;fetch&#160;per&#160;GraphQL&#160;page.&#160;</
 [...]
+</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&#160;&#160;&#160;</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&#160;number&#160;of&#160;non-collaborator&#160;PRs&#160;to&#16
 [...]
+</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&#160;&#160;&#160;&#160;&#160;&#160;</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&#160;order&#160;for&#160;PR&#160;search&#160;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)">&#160;Assessment&#160;options&#160;</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&#160;&#160;&#160;&#160;&#160;</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&#160;checks&#160;to&#160;run:&#160;&#x27;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&#160;&#160;&#160;&#160;&#160;&#160;</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&#160;model&#160;for&#160;assessment&#160;(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&#160;OpenAI&#160;Codex&#160;CLI.&#160;</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:&#160;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)">&gt;claude/claude-sonnet-4-6&lt;&#160;|&#160;claude/claude-opus-4-20250514&#160;|&#160;claude/claude-sonnet-4-20250514&#160;|&#160;</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&#160;|&#160;claude/sonnet&#160;|&#160;claude/opus&#160;|&#160;claude/haiku&#160;|&#160;codex/o3&#160;|&#160;</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&#160;|&#160;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&#160;of&#160;concurrent&#160;LLM&#160;assessment&#160;calls.&#160;</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&#160;the&#160;LLM&#160;review&#160;and&#160;triage&#160;caches&#160;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)">&#160;Action&#160;options&#160;</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&#160;answer&#160;to&#160;triage&#160;prompts:&#160;[d]raft,&#160;[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)">&#160;Common&#160;options&#160;</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&#160;&#160;&#160;</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"],

Reply via email to