Если вы видите эту страницу, значит, вы обращаетесь не к "
+"порту, на который настроен nginx, удачи вам.
"
#: jumpserver/views/other.py:28
msgid ""
@@ -5341,16 +5355,16 @@ msgid ""
"configure nginx for url distribution, If you see this page, "
"prove that you are not accessing the nginx listening port. Good luck."
msgstr ""
-"Сервис Websocket работает на порту: {}, пожалуйста, проверьте, установлен ли "
-"прокси в nginx."
+"Сервис Websocket работает на порту: {}, пожалуйста, проверьте, установлен ли"
+" прокси в nginx."
#: jumpserver/views/other.py:76
msgid "Websocket server run on port: {}, you should proxy it on nginx"
msgstr ""
-"Koko является отдельной развертываемой программой, вам нужно развернуть "
-"Koko и убедиться, что конфигурация nginx настроена на пересылку."
-"div>
Если вы видите эту страницу, значит, вы обращаетесь не к порту, на "
-"который настроен nginx, удачи вам.
"
+"
Koko является отдельной развертываемой программой, вам нужно развернуть"
+" Koko и убедиться, что конфигурация nginx настроена на "
+"пересылку.
Если вы видите эту страницу, значит, вы обращаетесь не "
+"к порту, на который настроен nginx, удачи вам.
"
#: jumpserver/views/other.py:90
msgid ""
@@ -5379,10 +5393,6 @@ msgstr "Связанный ресурс"
msgid "Tagged resource"
msgstr "Количество ресурсов"
-#: labels/serializers.py:22
-msgid "Resource count"
-msgstr "Не может содержать \":,\""
-
#: labels/serializers.py:28
msgid "Cannot contain \":,\""
msgstr "Тип ресурса"
@@ -5421,29 +5431,25 @@ msgstr "Опубликовать сообщение внутри системы"
#: notifications/notifications.py:48
msgid ""
-"This task needs to be executed for sending internal messages for system "
-"alerts, \n"
+"This task needs to be executed for sending internal messages for system alerts, \n"
" work orders, and other notifications"
msgstr ""
"Некоторые предупреждения системы, такие как уведомления о заявках, требуют "
"выполнения этой задачи для отправки внутреннего сообщения"
-#: ops/ansible/inventory.py:117 ops/models/job.py:68
+#: ops/ansible/inventory.py:126 ops/ansible/inventory.py:196
+#: ops/models/job.py:69
msgid "No account available"
msgstr "Нет доступных аккаунтов"
-#: ops/ansible/inventory.py:298
+#: ops/ansible/inventory.py:318 ops/ansible/inventory.py:360
msgid "Ansible disabled"
msgstr "Ansible отключен"
-#: ops/ansible/inventory.py:314
+#: ops/ansible/inventory.py:376
msgid "Skip hosts below:"
msgstr "Пропустить следующие хосты:"
-#: ops/api/adhoc.py:32
-msgid "Deleting other people's script is not allowed"
-msgstr "Удаление чужих скриптов не разрешено"
-
#: ops/api/celery.py:66 ops/api/celery.py:81
msgid "Waiting task start"
msgstr "Ожидание начала выполнения задачи"
@@ -5456,7 +5462,7 @@ msgstr "Задача {} не существует"
msgid "Task {} args or kwargs error"
msgstr "Ошибка параметров выполнения задачи {}"
-#: ops/api/job.py:68
+#: ops/api/job.py:70
#, python-brace-format
msgid ""
"Asset ({asset}) must have at least one of the following protocols added: "
@@ -5465,22 +5471,22 @@ msgstr ""
"Актив(ы)({asset}) необходимо добавить как минимум один из протоколов ssh, "
"sftp или winrm"
-#: ops/api/job.py:69
+#: ops/api/job.py:71
#, python-brace-format
msgid "Asset ({asset}) authorization is missing SSH, SFTP, or WinRM protocol"
msgstr ""
"Авторизация для актива({asset}) не включает протоколы ssh, sftp или winrm"
-#: ops/api/job.py:70
+#: ops/api/job.py:72
#, python-brace-format
msgid "Asset ({asset}) authorization lacks upload permissions"
msgstr "Авторизация для актива({asset}) не включает права на загрузку."
-#: ops/api/job.py:158
+#: ops/api/job.py:160
msgid "Duplicate file exists"
msgstr ""
-"Существует файл с тем же именем. Размер файла превышает максимальный предел. "
-"Пожалуйста, выберите файл размером менее {limit}MB. В данный момент "
+"Существует файл с тем же именем. Размер файла превышает максимальный предел."
+" Пожалуйста, выберите файл размером менее {limit}MB. В данный момент "
"создается задача, ее нельзя прервать, пожалуйста, попробуйте снова позже. "
"Удаление чужого playbook не разрешено. Текущий playbook используется в "
"работе. Неподдерживаемое содержимое файла. Неверный путь к файлу. Этот файл "
@@ -5488,7 +5494,7 @@ msgstr ""
"является обязательным. Невозможно удалить этот файл. Центр заданий. "
"Отправка. Проверка. Сбор."
-#: ops/api/job.py:163
+#: ops/api/job.py:165
#, python-brace-format
msgid ""
"File size exceeds maximum limit. Please select a file smaller than {limit}MB"
@@ -5496,40 +5502,36 @@ msgstr ""
"Размер файла превышает максимальный лимит. Пожалуйста, выберите файл меньше "
"{limit}MB."
-#: ops/api/job.py:236
+#: ops/api/job.py:238
msgid ""
"The task is being created and cannot be interrupted. Please try again later."
msgstr "Задача создается, прервать нельзя, попробуйте позже."
#: ops/api/playbook.py:49
-msgid "Deleting other people's playbook is not allowed"
-msgstr "Удаление чужого playbook запрещено."
-
-#: ops/api/playbook.py:55
msgid "Currently playbook is being used in a job"
msgstr "Текущий playbook используется в работе."
-#: ops/api/playbook.py:128
+#: ops/api/playbook.py:122
msgid "Unsupported file content"
msgstr "Неподдерживаемое содержимое файла."
-#: ops/api/playbook.py:130 ops/api/playbook.py:176 ops/api/playbook.py:224
+#: ops/api/playbook.py:124 ops/api/playbook.py:170 ops/api/playbook.py:218
msgid "Invalid file path"
msgstr "Недопустимый путь к файлу."
-#: ops/api/playbook.py:202
+#: ops/api/playbook.py:196
msgid "This file can not be rename"
msgstr "Этот файл нельзя переименовать."
-#: ops/api/playbook.py:221
+#: ops/api/playbook.py:215
msgid "File already exists"
msgstr "Файл уже существует."
-#: ops/api/playbook.py:239
+#: ops/api/playbook.py:233
msgid "File key is required"
msgstr "Поле \"ключ файла\" является обязательным."
-#: ops/api/playbook.py:242
+#: ops/api/playbook.py:236
msgid "This file can not be delete"
msgstr "Не удалось удалить этот файл."
@@ -5578,7 +5580,7 @@ msgstr "VCS"
msgid "Adhoc"
msgstr "Команда"
-#: ops/const.py:39 ops/models/job.py:152 ops/models/playbook.py:89
+#: ops/const.py:39 ops/models/job.py:154 ops/models/playbook.py:89
#: ops/models/variable.py:23
msgid "Playbook"
msgstr "Playbook"
@@ -5665,17 +5667,19 @@ msgid "no valid program entry found."
msgstr "Нет доступных точек входа"
#: ops/mixin.py:34 ops/mixin.py:166 settings/serializers/auth/ldap.py:74
-#: settings/serializers/auth/ldap_ha.py:57
+#: settings/serializers/auth/ldap_ha.py:56
msgid "Periodic run"
msgstr "Циклическое выполнение"
#: ops/mixin.py:36 ops/mixin.py:113 ops/mixin.py:172
-#: settings/serializers/auth/ldap.py:81 settings/serializers/auth/ldap_ha.py:64
+#: settings/serializers/auth/ldap.py:81
+#: settings/serializers/auth/ldap_ha.py:63
msgid "Interval"
msgstr "Интервал"
#: ops/mixin.py:39 ops/mixin.py:111 ops/mixin.py:169
-#: settings/serializers/auth/ldap.py:78 settings/serializers/auth/ldap_ha.py:61
+#: settings/serializers/auth/ldap.py:78
+#: settings/serializers/auth/ldap_ha.py:60
msgid "Crontab"
msgstr "Crontab"
@@ -5699,7 +5703,11 @@ msgstr "Период выполнения"
msgid "* Please enter a valid crontab expression"
msgstr "* Пожалуйста, введите корректное выражение crontab"
-#: ops/mixin.py:204 settings/serializers/auth/mixin.py:12
+#: ops/mixin.py:194
+msgid "Crontab minute must not contain '*'"
+msgstr ""
+
+#: ops/mixin.py:208 settings/serializers/auth/mixin.py:12
msgid "Require interval or crontab setting"
msgstr "Требуется периодическая или регулярная настройка"
@@ -5707,18 +5715,19 @@ msgstr "Требуется периодическая или регулярна
msgid "Pattern"
msgstr "Режим"
-#: ops/models/adhoc.py:22 ops/models/job.py:149
+#: ops/models/adhoc.py:22 ops/models/job.py:151
msgid "Module"
msgstr "Модуль"
-#: ops/models/adhoc.py:23 ops/models/celery.py:82 ops/models/job.py:147
+#: ops/models/adhoc.py:23 ops/models/celery.py:82 ops/models/job.py:149
#: terminal/models/component/task.py:14
msgid "Args"
msgstr "Содержание"
-#: ops/models/adhoc.py:26 ops/models/playbook.py:34 ops/serializers/mixin.py:10
-#: rbac/models/role.py:31 rbac/models/rolebinding.py:46
-#: rbac/serializers/role.py:12 settings/serializers/auth/oauth2.py:37
+#: ops/models/adhoc.py:26 ops/models/playbook.py:34
+#: ops/serializers/mixin.py:10 rbac/models/role.py:31
+#: rbac/models/rolebinding.py:46 rbac/serializers/role.py:12
+#: settings/serializers/auth/oauth2.py:37
msgid "Scope"
msgstr "Диапазон"
@@ -5754,48 +5763,54 @@ msgstr "Дата выхода"
msgid "Celery Task Execution"
msgstr "Исполнение задачи Celery"
-#: ops/models/job.py:150
+#: ops/models/job.py:82
+#, fuzzy
+#| msgid "Anonymous account is not supported for this asset"
+msgid "Module {} is not suitable for this asset"
+msgstr "Анонимные учетные записи не поддерживают текущие активы."
+
+#: ops/models/job.py:152
msgid "Run dir"
msgstr "Рабочая директория"
-#: ops/models/job.py:151
+#: ops/models/job.py:153
msgid "Timeout (Seconds)"
msgstr "Время ожидания (сек)"
-#: ops/models/job.py:157
+#: ops/models/job.py:159
msgid "Use Parameter Define"
msgstr "Используемые параметры определения"
-#: ops/models/job.py:158
+#: ops/models/job.py:160
msgid "Parameters define"
msgstr "Определение параметров"
-#: ops/models/job.py:159
+#: ops/models/job.py:161
msgid "Periodic variable"
msgstr "Переменные периодического выполнения"
-#: ops/models/job.py:160
+#: ops/models/job.py:162
msgid "Run as"
msgstr "Пользователь для запуска"
-#: ops/models/job.py:162
+#: ops/models/job.py:164
msgid "Run as policy"
msgstr "Политика пользователя"
-#: ops/models/job.py:219 ops/models/variable.py:28 ops/serializers/job.py:111
+#: ops/models/job.py:221 ops/models/variable.py:28 ops/serializers/job.py:111
#: terminal/notifications.py:182
msgid "Job"
msgstr "Задача"
-#: ops/models/job.py:242
+#: ops/models/job.py:244
msgid "Material"
msgstr "Материал"
-#: ops/models/job.py:244
+#: ops/models/job.py:246
msgid "Material Type"
msgstr "Тип материала"
-#: ops/models/job.py:556
+#: ops/models/job.py:558
msgid "Job Execution"
msgstr "Исполнение задания"
@@ -5915,8 +5930,8 @@ msgid ""
"Execute scheduled adhoc and playbooks, periodically invoking the task for "
"execution"
msgstr ""
-"При выполнении регулярной команды быстрого доступа, плейбука, периодического "
-"вызова этой задачи"
+"При выполнении регулярной команды быстрого доступа, плейбука, периодического"
+" вызова этой задачи"
#: ops/tasks.py:88
msgid "Run ansible task execution"
@@ -5941,15 +5956,13 @@ msgstr "Создание или обновление периодической
#: ops/tasks.py:134
msgid ""
-"With version iterations, new tasks may be added, or task names and execution "
-"times may \n"
-" be modified. Therefore, upon system startup, tasks will be "
-"registered or the parameters \n"
+"With version iterations, new tasks may be added, or task names and execution times may \n"
+" be modified. Therefore, upon system startup, tasks will be registered or the parameters \n"
" of scheduled tasks will be updated"
msgstr ""
"С развитием версии могут быть добавлены новые задачи или изменены названия "
-"задач, время выполнения, поэтому при загрузке системы будут зарегистрированы "
-"задачи или обновлены параметры периодических задач"
+"задач, время выполнения, поэтому при загрузке системы будут зарегистрированы"
+" задачи или обновлены параметры периодических задач"
#: ops/tasks.py:147
msgid "Periodic check service performance"
@@ -5957,10 +5970,8 @@ msgstr "Периодическая проверка производительн
#: ops/tasks.py:149
msgid ""
-"Check every hour whether each component is offline and whether the CPU, "
-"memory, \n"
-" and disk usage exceed the thresholds, and send an alert message to "
-"the administrator"
+"Check every hour whether each component is offline and whether the CPU, memory, \n"
+" and disk usage exceed the thresholds, and send an alert message to the administrator"
msgstr ""
"Каждый час проверяется, отключены ли какие-либо компоненты, а также "
"превышает ли использование CPU, памяти и диска заданные пороговые значения, "
@@ -5972,12 +5983,9 @@ msgstr "Очистка аномальных действий."
#: ops/tasks.py:161
msgid ""
-"Due to exceptions caused by executing adhoc and playbooks in the Job "
-"Center, \n"
-" which result in the task status not being updated, the system will "
-"clean up abnormal jobs \n"
-" that have not been completed for more than 3 hours every hour and "
-"mark these tasks as \n"
+"Due to exceptions caused by executing adhoc and playbooks in the Job Center, \n"
+" which result in the task status not being updated, the system will clean up abnormal jobs \n"
+" that have not been completed for more than 3 hours every hour and mark these tasks as \n"
" failed"
msgstr ""
"Из-за выполнения команд быстрого доступа в центре заданий, playbook может "
@@ -5991,12 +5999,9 @@ msgstr "Очистка истории выполнения в центре за
#: ops/tasks.py:176
msgid ""
-"Due to the execution of adhoc and playbooks in the Job Center, execution "
-"records will \n"
-" be generated. The system will clean up records that exceed the "
-"retention period every day \n"
-" at 2 a.m., based on the configuration of 'System Settings - Tasks - "
-"Regular clean-up - \n"
+"Due to the execution of adhoc and playbooks in the Job Center, execution records will \n"
+" be generated. The system will clean up records that exceed the retention period every day \n"
+" at 2 a.m., based on the configuration of 'System Settings - Tasks - Regular clean-up - \n"
" Job execution retention days'"
msgstr ""
"Из-за выполнения команд быстрого доступа в центре заданий, playbook создает "
@@ -6075,7 +6080,8 @@ msgstr "Пожалуйста, выберите организацию перед
#: rbac/serializers/rolebinding.py:44 settings/serializers/auth/base.py:53
#: terminal/templates/terminal/_msg_command_warning.html:21
#: terminal/templates/terminal/_msg_session_sharing.html:14
-#: tickets/models/ticket/general.py:303 tickets/serializers/ticket/ticket.py:61
+#: tickets/models/ticket/general.py:303
+#: tickets/serializers/ticket/ticket.py:61
msgid "Organization"
msgstr "Организация"
@@ -6109,7 +6115,7 @@ msgid "Can not delete virtual org"
msgstr "Не удается удалить виртуальную организацию"
#: orgs/serializers.py:10 perms/serializers/permission.py:59
-#: rbac/serializers/role.py:27 users/serializers/group.py:54
+#: rbac/serializers/role.py:27 users/serializers/group.py:53
msgid "Users amount"
msgstr "Количество пользователей"
@@ -6257,14 +6263,10 @@ msgstr "Правила проверки разрешений активов ис
#: perms/tasks.py:30
msgid ""
-"The cache of organizational collections, which have completed user "
-"authorization tree \n"
-" construction, will expire. Therefore, expired collections need to be "
-"cleared from the \n"
-" cache, and this task will be executed periodically based on the time "
-"interval specified \n"
-" by PERM_EXPIRED_CHECK_PERIODIC in the system configuration file "
-"config.txt"
+"The cache of organizational collections, which have completed user authorization tree \n"
+" construction, will expire. Therefore, expired collections need to be cleared from the \n"
+" cache, and this task will be executed periodically based on the time interval specified \n"
+" by PERM_EXPIRED_CHECK_PERIODIC in the system configuration file config.txt"
msgstr ""
"Кэш организации, для которой уже построено дерево разрешений пользователей, "
"будет истекать, поэтому необходимо очищать просроченные наборы из кэша, "
@@ -6277,12 +6279,9 @@ msgstr "Отправка уведомления о истечении прав
#: perms/tasks.py:51
msgid ""
-"Check every day at 10 a.m. and send a notification message to users "
-"associated with \n"
-" assets whose authorization is about to expire, as well as to the "
-"organization's \n"
-" administrators, 3 days in advance, to remind them that the asset "
-"authorization will \n"
+"Check every day at 10 a.m. and send a notification message to users associated with \n"
+" assets whose authorization is about to expire, as well as to the organization's \n"
+" administrators, 3 days in advance, to remind them that the asset authorization will \n"
" expire in a few days"
msgstr ""
"Каждый день в 10 утра проверяется, и за три дня до истечения прав на активы "
@@ -6468,7 +6467,7 @@ msgid "Storage"
msgstr "Хранение"
#: rbac/tree.py:61 terminal/models/applet/applet.py:53
-#: terminal/models/applet/applet.py:328 terminal/models/applet/host.py:30
+#: terminal/models/applet/applet.py:369 terminal/models/applet/host.py:30
#: terminal/serializers/applet.py:15
msgid "Applet"
msgstr "Удаленные приложения"
@@ -6725,7 +6724,8 @@ msgid "CAS"
msgstr "CAS"
#: settings/serializers/auth/cas.py:15 settings/serializers/auth/ldap.py:45
-#: settings/serializers/auth/ldap_ha.py:28 settings/serializers/auth/oidc.py:61
+#: settings/serializers/auth/ldap_ha.py:27
+#: settings/serializers/auth/oidc.py:61
msgid "Server"
msgstr "Адрес сервера"
@@ -6750,9 +6750,11 @@ msgstr "Атрибут имени пользователя"
msgid "Enable attributes map"
msgstr "Включить сопоставление атрибутов"
-#: settings/serializers/auth/cas.py:34 settings/serializers/auth/dingtalk.py:18
+#: settings/serializers/auth/cas.py:34
+#: settings/serializers/auth/dingtalk.py:18
#: settings/serializers/auth/feishu.py:18 settings/serializers/auth/lark.py:17
-#: settings/serializers/auth/ldap.py:67 settings/serializers/auth/ldap_ha.py:50
+#: settings/serializers/auth/ldap.py:67
+#: settings/serializers/auth/ldap_ha.py:49
#: settings/serializers/auth/oauth2.py:60 settings/serializers/auth/oidc.py:39
#: settings/serializers/auth/saml2.py:35 settings/serializers/auth/slack.py:18
#: settings/serializers/auth/wecom.py:18
@@ -6814,7 +6816,7 @@ msgstr ""
"пользователя JumpServer, а `value` — это имя атрибута пользователя службы "
"Lark"
-#: settings/serializers/auth/ldap.py:42 settings/serializers/auth/ldap.py:104
+#: settings/serializers/auth/ldap.py:42 settings/serializers/auth/ldap.py:108
msgid "LDAP"
msgstr "LDAP"
@@ -6822,23 +6824,28 @@ msgstr "LDAP"
msgid "LDAP server URI"
msgstr "Домен службы LDAP"
-#: settings/serializers/auth/ldap.py:49 settings/serializers/auth/ldap_ha.py:32
+#: settings/serializers/auth/ldap.py:49
+#: settings/serializers/auth/ldap_ha.py:31
msgid "Bind DN"
msgstr "Связывание DN"
-#: settings/serializers/auth/ldap.py:50 settings/serializers/auth/ldap_ha.py:33
+#: settings/serializers/auth/ldap.py:50
+#: settings/serializers/auth/ldap_ha.py:32
msgid "Binding Distinguished Name"
msgstr "Администратор каталога"
-#: settings/serializers/auth/ldap.py:54 settings/serializers/auth/ldap_ha.py:37
+#: settings/serializers/auth/ldap.py:54
+#: settings/serializers/auth/ldap_ha.py:36
msgid "Binding password"
msgstr "Пароль связывания"
-#: settings/serializers/auth/ldap.py:57 settings/serializers/auth/ldap_ha.py:40
+#: settings/serializers/auth/ldap.py:57
+#: settings/serializers/auth/ldap_ha.py:39
msgid "Search OU"
msgstr "OU пользователя"
-#: settings/serializers/auth/ldap.py:59 settings/serializers/auth/ldap_ha.py:42
+#: settings/serializers/auth/ldap.py:59
+#: settings/serializers/auth/ldap_ha.py:41
msgid ""
"User Search Base, if there are multiple OUs, you can separate them with the "
"`|` symbol"
@@ -6846,16 +6853,19 @@ msgstr ""
"Поисковая база данных пользователя. Если есть несколько OU, можно "
"использовать символ `|` для разделения"
-#: settings/serializers/auth/ldap.py:63 settings/serializers/auth/ldap_ha.py:46
+#: settings/serializers/auth/ldap.py:63
+#: settings/serializers/auth/ldap_ha.py:45
msgid "Search filter"
msgstr "Фильтр пользователя"
-#: settings/serializers/auth/ldap.py:64 settings/serializers/auth/ldap_ha.py:47
+#: settings/serializers/auth/ldap.py:64
+#: settings/serializers/auth/ldap_ha.py:46
#, python-format
msgid "Selection could include (cn|uid|sAMAccountName=%(user)s)"
msgstr "Возможные опции: (cn или uid или sAMAccountName=%(user)s)"
-#: settings/serializers/auth/ldap.py:69 settings/serializers/auth/ldap_ha.py:52
+#: settings/serializers/auth/ldap.py:69
+#: settings/serializers/auth/ldap_ha.py:51
msgid ""
"User attribute mapping, where the `key` is the JumpServer user attribute "
"name and the `value` is the LDAP service user attribute name"
@@ -6864,15 +6874,31 @@ msgstr ""
"пользователя JumpServer, а `value` — это имя атрибута пользователя службы "
"LDAP"
-#: settings/serializers/auth/ldap.py:85 settings/serializers/auth/ldap_ha.py:68
+#: settings/serializers/auth/ldap.py:85
+#: settings/serializers/auth/ldap_ha.py:67
msgid "Connect timeout (s)"
msgstr "Время ожидания соединения (в секундах)"
-#: settings/serializers/auth/ldap.py:90 settings/serializers/auth/ldap_ha.py:73
+#: settings/serializers/auth/ldap.py:88
+#: settings/serializers/auth/ldap_ha.py:70
+msgid "Strict sync"
+msgstr "Строгий режим"
+
+#: settings/serializers/auth/ldap.py:89
+#: settings/serializers/auth/ldap_ha.py:71
+msgid ""
+"In strict mode, users not found in LDAP will be disabled during full or "
+"automatic sync"
+msgstr ""
+"После активации строгого режима, полная или автоматическая синхронизация "
+"запретит пользователей, не найденных в LDAP, в системе."
+
+#: settings/serializers/auth/ldap.py:94
+#: settings/serializers/auth/ldap_ha.py:76
msgid "User DN cache timeout (s)"
msgstr "Время кэширования User DN (в секундах)"
-#: settings/serializers/auth/ldap.py:92
+#: settings/serializers/auth/ldap.py:96
msgid ""
"Caching the User DN obtained during user login authentication can "
"effectively improve the speed of user authentication., 0 means no "
@@ -6883,28 +6909,29 @@ msgstr ""
"значительно ускорить процесс аутентификации
Если структура OU "
"пользователя изменена, нажмите \"Отправить\", чтобы очистить кэш User DN"
-#: settings/serializers/auth/ldap.py:98 settings/serializers/auth/ldap_ha.py:81
+#: settings/serializers/auth/ldap.py:102
+#: settings/serializers/auth/ldap_ha.py:84
msgid "Search paged size (piece)"
msgstr "Количество страниц поиска (штук)"
-#: settings/serializers/auth/ldap_ha.py:25
-#: settings/serializers/auth/ldap_ha.py:87
+#: settings/serializers/auth/ldap_ha.py:24
+#: settings/serializers/auth/ldap_ha.py:90
msgid "LDAP HA"
msgstr "LDAP аутентификация"
-#: settings/serializers/auth/ldap_ha.py:29
+#: settings/serializers/auth/ldap_ha.py:28
msgid "LDAP HA server URI"
msgstr "LDAP HA сервисное доменное имя"
-#: settings/serializers/auth/ldap_ha.py:75
+#: settings/serializers/auth/ldap_ha.py:78
msgid ""
"Caching the User DN obtained during user login authentication can "
-"effectivelyimprove the speed of user authentication., 0 means no cache
If "
-"the user OU structure has been adjusted, click Submit to clear the user DN "
+"effectivelyimprove the speed of user authentication., 0 means no cache
If"
+" the user OU structure has been adjusted, click Submit to clear the user DN "
"cache"
msgstr ""
-"Кэширование User DN, полученного при аутентификации пользователя, эффективно "
-"ускоряет процесс проверки подлинности
Если структура OU пользователя "
+"Кэширование User DN, полученного при аутентификации пользователя, эффективно"
+" ускоряет процесс проверки подлинности
Если структура OU пользователя "
"изменится, нажмите отправить, чтобы очистить кэш пользовательских DN"
#: settings/serializers/auth/oauth2.py:19
@@ -6949,7 +6976,8 @@ msgid "End session endpoint"
msgstr "Адрес конечной точки завершения сессии"
#: settings/serializers/auth/oauth2.py:57
-msgid "When the user signs out, they also be logged out from the OAuth2 server"
+msgid ""
+"When the user signs out, they also be logged out from the OAuth2 server"
msgstr "Когда пользователь выходит, он также выходит из сервера OAuth2"
#: settings/serializers/auth/oauth2.py:62
@@ -6961,8 +6989,8 @@ msgstr ""
"пользователя JumpServer, а `value` - название атрибута пользователя сервиса "
"OAuth2"
-#: settings/serializers/auth/oauth2.py:67 settings/serializers/auth/oidc.py:113
-#: settings/serializers/auth/saml2.py:45
+#: settings/serializers/auth/oauth2.py:67
+#: settings/serializers/auth/oidc.py:113 settings/serializers/auth/saml2.py:45
msgid "Always update user"
msgstr "Всегда обновляйте информацию о пользователе"
@@ -7092,7 +7120,8 @@ msgid "OTP in RADIUS"
msgstr "Использовать Radius OTP"
#: settings/serializers/auth/radius.py:24
-msgid "* Using OTP in RADIUS means users can employ RADIUS as a method for MFA"
+msgid ""
+"* Using OTP in RADIUS means users can employ RADIUS as a method for MFA"
msgstr ""
"* Использование OTP в RADIUS означает, что пользователь может использовать "
"RADIUS как метод MFA"
@@ -7131,7 +7160,8 @@ msgstr ""
#: settings/serializers/auth/saml2.py:43
msgid "When the user signs out, they also be logged out from the SAML2 server"
-msgstr "Когда пользователь выходит, он также будет разлогинен на SAML2 сервере"
+msgstr ""
+"Когда пользователь выходит, он также будет разлогинен на SAML2 сервере"
#: settings/serializers/auth/slack.py:20
msgid ""
@@ -7204,9 +7234,9 @@ msgstr "Тип приложения (ID Application)"
#: settings/serializers/auth/sms.py:85
#, python-brace-format
msgid ""
-"Template need contain {code} and Signature + template length does not exceed "
-"67 words. For example, your verification code is {code}, which is valid for "
-"5 minutes. Please do not disclose it to others."
+"Template need contain {code} and Signature + template length does not exceed"
+" 67 words. For example, your verification code is {code}, which is valid for"
+" 5 minutes. Please do not disclose it to others."
msgstr ""
"Шаблон должен содержать {code}, и длина шаблона + подписи не должна "
"превышать 67 символов. Например, ваш код подтверждения: {code}, действует 5 "
@@ -7259,11 +7289,11 @@ msgstr "Текущий URL сайта"
#: settings/serializers/basic.py:13
msgid ""
-"Site URL is the externally accessible address of the current product service "
-"and is usually used in links in system emails"
+"Site URL is the externally accessible address of the current product service"
+" and is usually used in links in system emails"
msgstr ""
-"Ссылка на сайт является внешним доступным адресом текущих продуктов и услуг, "
-"обычно используется в ссылках системных писем"
+"Ссылка на сайт является внешним доступным адресом текущих продуктов и услуг,"
+" обычно используется в ссылках системных писем"
#: settings/serializers/basic.py:18
msgid "User guide url"
@@ -7356,8 +7386,8 @@ msgid ""
"Session, record, command will be delete if more than duration, only in "
"database, OSS will not be affected."
msgstr ""
-"Сессии, видеозаписи и записи команд, превышающие этот временной лимит, будут "
-"удалены (влияет на хранение базы данных, но на OSS не влияет)"
+"Сессии, видеозаписи и записи команд, превышающие этот временной лимит, будут"
+" удалены (влияет на хранение базы данных, но на OSS не влияет)"
#: settings/serializers/cleaning.py:53
msgid "Change secret and push record retention days (day)"
@@ -7487,8 +7517,8 @@ msgstr "Цикл выполнения"
msgid ""
"Allow users to execute batch commands in the Workbench - Job Center - Adhoc"
msgstr ""
-"Позволяет пользователям выполнять пакетные команды на рабочем столе - Центре "
-"заданий - Adhoc"
+"Позволяет пользователям выполнять пакетные команды на рабочем столе - Центре"
+" заданий - Adhoc"
#: settings/serializers/feature.py:191
msgid "Command blacklist"
@@ -7580,8 +7610,8 @@ msgstr "Тема письма"
#: settings/serializers/msg.py:69
msgid ""
-"Tips: When creating a user, send the subject of the email (eg:Create account "
-"successfully)"
+"Tips: When creating a user, send the subject of the email (eg:Create account"
+" successfully)"
msgstr ""
"Подсказка: при создании пользователя отправьте тему письма для настройки "
"пароля (например: Успешное создание пользователя)"
@@ -7672,8 +7702,8 @@ msgid ""
"If the user has failed to log in for a limited number of times, no login is "
"allowed during this time interval."
msgstr ""
-"Когда количество неудачных попыток входа пользователя достигнет лимита, вход "
-"будет запрещен на установочный интервал."
+"Когда количество неудачных попыток входа пользователя достигнет лимита, вход"
+" будет запрещен на установочный интервал."
#: settings/serializers/security.py:63 settings/serializers/security.py:73
msgid "Login failures count"
@@ -7724,8 +7754,8 @@ msgstr "Вход только из источника пользователя."
#: settings/serializers/security.py:105
msgid ""
-"If it is enabled, the user will only authenticate to the source when logging "
-"in; if it is disabled, the user will authenticate all the enabled "
+"If it is enabled, the user will only authenticate to the source when logging"
+" in; if it is disabled, the user will authenticate all the enabled "
"authentication methods in a certain order when logging in, and as long as "
"one of the authentication methods is successful, they can log in directly"
msgstr ""
@@ -7759,19 +7789,29 @@ msgstr "Третья сторона активирует MFA"
msgid "The third-party login modes include OIDC, CAS, and SAML2"
msgstr "Методы входа третьих сторон включают: OIDC, CAS, SAML2"
-#: settings/serializers/security.py:128
+#: settings/serializers/security.py:129
+msgid "MFA via Email"
+msgstr "Проверка электронной почты MFA"
+
+#: settings/serializers/security.py:130
+msgid "Email as a method for multi-factor authentication"
+msgstr ""
+"Использование электронной почты как одного из способов многофакторной "
+"аутентификации"
+
+#: settings/serializers/security.py:133
msgid "OTP issuer name"
msgstr "Название после сканирования OTP"
-#: settings/serializers/security.py:132
+#: settings/serializers/security.py:137
msgid "OTP valid window"
msgstr "Количество запаса времени OTP"
-#: settings/serializers/security.py:136
+#: settings/serializers/security.py:141
msgid "MFA verify TTL"
msgstr "Срок действия проверки MFA"
-#: settings/serializers/security.py:138
+#: settings/serializers/security.py:143
msgid ""
"Unit: second, The verification MFA takes effect only when you view the "
"account password"
@@ -7779,45 +7819,45 @@ msgstr ""
"Единицы: секунды, в настоящее время действует только при просмотре проверки "
"паролей аккаунта с использованием MFA"
-#: settings/serializers/security.py:143
+#: settings/serializers/security.py:148
msgid "MFA in login page"
msgstr "Вход MFA на странице логина"
-#: settings/serializers/security.py:144
+#: settings/serializers/security.py:149
msgid "Eu security regulations(GDPR) require MFA to be on the login page"
msgstr ""
"Регламент безопасности данных ЕС (GDPR) требует, чтобы MFA была на странице "
"входа для обеспечения безопасности входа в систему"
-#: settings/serializers/security.py:148
+#: settings/serializers/security.py:153
msgid "Verify code TTL (second)"
msgstr "Время действия кода подтверждения (мин)"
-#: settings/serializers/security.py:149
+#: settings/serializers/security.py:154
msgid "Reset password and send SMS code expiration time"
msgstr ""
"Срок действия кода подтверждения для сброса пароля и срока действия кода "
"подтверждения для отправки SMS."
-#: settings/serializers/security.py:153
+#: settings/serializers/security.py:158
msgid "Login dynamic code"
msgstr ""
"Включить дополнительный код для входа. Пароль и код отправляются третьей "
"стороне для проверки, например, некоторые системы аутентификации требуют "
"пароль + 6-значный код для завершения аутентификации. Включить код "
"безопасности для входа, чтобы предотвратить вход ботов. Уведомление о входе "
-"из другого местоположения. Определяется по IP-адресу: если аккаунт входит из "
-"незнакомого города, отправляется уведомление о входе из другого "
+"из другого местоположения. Определяется по IP-адресу: если аккаунт входит из"
+" незнакомого города, отправляется уведомление о входе из другого "
"местоположения. Автоматическая блокировка неактивных пользователей (дни). "
"Проверка осуществляется раз в день; пользователи, превышающие установленное "
-"время, автоматически блокируются. Включить водяной знак. После активации веб-"
-"сеансы и записи будут содержать водяные знаки. Максимальное время простоя "
-"подключения (мин). Обратите внимание: если не будет действий в течение "
-"установленного времени, соединение будет разорвано. Сессия истекает при "
-"закрытии браузера. Означает ли закрытие браузера истечение сессии. Разрешить "
-"пользователям просматривать информацию о сеансах активов онлайн."
+"время, автоматически блокируются. Включить водяной знак. После активации "
+"веб-сеансы и записи будут содержать водяные знаки. Максимальное время "
+"простоя подключения (мин). Обратите внимание: если не будет действий в "
+"течение установленного времени, соединение будет разорвано. Сессия истекает "
+"при закрытии браузера. Означает ли закрытие браузера истечение сессии. "
+"Разрешить пользователям просматривать информацию о сеансах активов онлайн."
-#: settings/serializers/security.py:154
+#: settings/serializers/security.py:159
msgid ""
"The password and additional code are sent to a third party authentication "
"system for verification"
@@ -7826,74 +7866,68 @@ msgstr ""
"аутентификации, например, некоторые третьи системы требуют пароль + 6 цифр "
"для завершения аутентификации."
-#: settings/serializers/security.py:158
+#: settings/serializers/security.py:163
msgid "Login captcha"
msgstr "Включить проверочный код при входе"
-#: settings/serializers/security.py:159
+#: settings/serializers/security.py:164
msgid "Enable captcha to prevent robot authentication"
msgstr "Активируйте код для предотвращения входа роботов"
-#: settings/serializers/security.py:162
+#: settings/serializers/security.py:167
msgid "Suspicious Login Verification"
msgstr "Уведомление о входе из другого места"
-#: settings/serializers/security.py:164
+#: settings/serializers/security.py:169
msgid ""
-"The system determines whether the login IP address belongs to a common login "
-"city. If the account is logged in from a common login city, the system sends "
-"a remote login reminder"
+"The system determines whether the login IP address belongs to a common login"
+" city. If the account is logged in from a common login city, the system "
+"sends a remote login reminder"
msgstr ""
"Оно основано на проверке IP-адреса, чтобы определить, принадлежит ли он к "
"обычному городу входа. Если аккаунт входил из необычного города, будет "
"отправлено уведомление"
-#: settings/serializers/security.py:170
+#: settings/serializers/security.py:175
msgid "Auto Disable Threshold (day)"
msgstr "Автоматически отключать неактивных пользователей (дни)"
-#: settings/serializers/security.py:171
+#: settings/serializers/security.py:176
msgid ""
"Detect infrequent users daily and disable them if they exceed the "
"predetermined time limit"
msgstr ""
-"Каждый день проходит проверка, пользователи, которые превышают установленное "
-"время, автоматически отключаются"
+"Каждый день проходит проверка, пользователи, которые превышают установленное"
+" время, автоматически отключаются"
-#: settings/serializers/security.py:191
+#: settings/serializers/security.py:196
msgid "Watermark"
msgstr "Включить водяной знак"
-#: settings/serializers/security.py:192
-msgid "Enabled, the web session and replay contains watermark information"
-msgstr ""
-"После активации веб-сессии и записи будут содержать информацию о водяном "
-"знаке"
-
-#: settings/serializers/security.py:196
+#: settings/serializers/security.py:200
msgid "Max idle time (minute)"
msgstr "Максимальное время простоя подключения (мин)"
-#: settings/serializers/security.py:197
+#: settings/serializers/security.py:201
msgid "If idle time more than it, disconnect connection."
msgstr ""
"Совет: если по истечении этого времени не будет действий, подключение будет "
"разорвано"
-#: settings/serializers/security.py:200
+#: settings/serializers/security.py:204
msgid "Session expire at browser closed"
msgstr "Сессия истекает при закрытии браузера"
-#: settings/serializers/security.py:201
+#: settings/serializers/security.py:205
msgid "Whether to expire the session when the user closes their browser."
msgstr "Должна ли сессия истекать, когда пользователь закрывает браузер?"
-#: settings/serializers/security.py:206
+#: settings/serializers/security.py:210
msgid "Allow users to view asset session information"
msgstr ""
"Разрешить пользователю просматривать информацию о сессии активов онлайн"
-#: settings/serializers/security.py:208
+#: settings/serializers/security.py:212
msgid ""
"When a user connects to an asset, the account selection popup displays the "
"number of active sessions for the current asset (RDP protocol only)."
@@ -7902,40 +7936,40 @@ msgstr ""
"отображается текущее количество онлайн-сессий для данного актива (только "
"протокол rdp)."
-#: settings/serializers/security.py:214
+#: settings/serializers/security.py:218
msgid "Max online time (hour)"
msgstr "Максимальное время подключения к сессии (часы)"
-#: settings/serializers/security.py:215
+#: settings/serializers/security.py:219
msgid "If session connection time more than it, disconnect connection."
msgstr ""
"Подсказка: если время подключения к сессии превышает указанную настройку, "
"соединение будет разорвано."
-#: settings/serializers/security.py:218
+#: settings/serializers/security.py:222
msgid "Remember manual auth"
msgstr "Сохранить вручную введенный пароль"
-#: settings/serializers/security.py:221
+#: settings/serializers/security.py:225
#: terminal/templates/terminal/_msg_session_sharing.html:10
msgid "Session share"
msgstr "Поделитесь сессией"
-#: settings/serializers/security.py:222
+#: settings/serializers/security.py:226
msgid "Enabled, Allows user active session to be shared with other users"
msgstr ""
"При включении пользователю разрешается делиться подключенной сессией актива "
"с другими, для совместной работы."
-#: settings/serializers/security.py:228
+#: settings/serializers/security.py:232
msgid "Insecure command alert"
msgstr "Оповещение о опасных командах"
-#: settings/serializers/security.py:231
+#: settings/serializers/security.py:235
msgid "Email recipient"
msgstr "Получатель электронной почты"
-#: settings/serializers/security.py:232
+#: settings/serializers/security.py:236
msgid "Multiple user using , split"
msgstr "Несколько пользователей, разделите запятой."
@@ -7948,74 +7982,81 @@ msgstr "[%s] %s"
msgid "Auto"
msgstr "Авто"
-#: settings/serializers/terminal.py:22
+#: settings/serializers/terminal.py:23
+msgid "Auto(Enabled for the first 5 minutes after startup, then disabled.)"
+msgstr ""
+"Автоматически (включается в течение первых 5 минут после запуска, затем "
+"отключается.)"
+
+#: settings/serializers/terminal.py:26
msgid "Registration"
msgstr "Регистрация компонента"
-#: settings/serializers/terminal.py:24
+#: settings/serializers/terminal.py:28
msgid ""
-"Allow component register, after all component setup, you should disable this "
-"for security"
+"Allow component register, after all component setup, you should disable this"
+" for security"
msgstr ""
"Разрешить ли регистрацию компонента? После запуска всех терминалов для "
"безопасности это следует отключить."
-#: settings/serializers/terminal.py:30
+#: settings/serializers/terminal.py:34
msgid ""
"* Allow users to log in to the KoKo component via password authentication"
msgstr ""
"* Разрешить пользователям входить в компонент KoKo с использованием "
"аутентификации по паролю."
-#: settings/serializers/terminal.py:36
+#: settings/serializers/terminal.py:40
msgid ""
"* Allow users to log in to the KoKo component via Public key "
"authentication
If third-party authentication services, such as AD/LDAP, "
-"are enabled, you should disable this option to prevent users from logging in "
-"after being deleted from the AD/LDAP server"
+"are enabled, you should disable this option to prevent users from logging in"
+" after being deleted from the AD/LDAP server"
msgstr ""
"* Разрешить пользователям входить в компонент KoKo с использованием "
"аутентификации по открытому ключу.
Если сторонний сервис "
"аутентификации (например, AD/LDAP) включен, то эту опцию следует отключить, "
-"чтобы избежать повторного входа пользователей после их удаления с сервера AD/"
-"LDAP."
+"чтобы избежать повторного входа пользователей после их удаления с сервера "
+"AD/LDAP."
-#: settings/serializers/terminal.py:43
+#: settings/serializers/terminal.py:47
msgid "Asset sorting"
msgstr "Список активов сортировка"
-#: settings/serializers/terminal.py:46
+#: settings/serializers/terminal.py:50
msgid "Asset page size"
msgstr "Количество активов на странице"
-#: settings/serializers/terminal.py:51
+#: settings/serializers/terminal.py:55
msgid ""
-"* You can individually configure the service address and port in the service "
-"endpoint
If enabled, the Luna page will display the DB client launch "
+"* You can individually configure the service address and port in the service"
+" endpoint
If enabled, the Luna page will display the DB client launch "
"method when connecting to assets"
msgstr ""
-"* Вы можете отдельно настроить адрес и порт сервиса в конечной точке
Если включено, на странице Luna будет показан метод запуска DB клиента при "
-"подключении к активам"
+"* Вы можете отдельно настроить адрес и порт сервиса в конечной "
+"точке
Если включено, на странице Luna будет показан метод запуска DB "
+"клиента при подключении к активам"
-#: settings/serializers/terminal.py:59
+#: settings/serializers/terminal.py:63
msgid ""
-"* You can individually configure the service address and port in the service "
-"endpoint
If enabled, the Luna page will display the download rdp file "
+"* You can individually configure the service address and port in the service"
+" endpoint
If enabled, the Luna page will display the download rdp file "
"button and RDP Client launch method when connecting to assets"
msgstr ""
-"* Вы можете отдельно настроить адрес и порт сервиса в конечной точке
Если включено, на странице Luna будет показана кнопка для скачивания rdp "
-"файла и метод запуска RDP клиента при подключении к активам"
+"* Вы можете отдельно настроить адрес и порт сервиса в конечной "
+"точке
Если включено, на странице Luna будет показана кнопка для "
+"скачивания rdp файла и метод запуска RDP клиента при подключении к активам"
-#: settings/serializers/terminal.py:66
+#: settings/serializers/terminal.py:70
msgid "Client connection"
msgstr "Подключение клиента"
-#: settings/serializers/terminal.py:68
+#: settings/serializers/terminal.py:72
msgid ""
"* Allow connecting to the KoKo component via SSH client
If enabled, the "
-"Luna page will display the SSH client launch method when connecting to assets"
+"Luna page will display the SSH client launch method when connecting to "
+"assets"
msgstr ""
"* Разрешить подключение к компонентам KoKo через SSH клиент
Если "
"включено, на странице Luna будет показан метод запуска SSH клиента при "
@@ -8031,17 +8072,17 @@ msgstr "Инструменты на рабочем столе"
#: settings/serializers/tool.py:15
msgid ""
-"*! If enabled, users with RBAC permissions will be able to utilize all tools "
-"in the workbench"
+"*! If enabled, users with RBAC permissions will be able to utilize all tools"
+" in the workbench"
msgstr ""
"*! Если включено, пользователи с правами RBAC смогут использовать все "
"инструменты на рабочем столе"
-#: settings/tasks/ldap.py:73
+#: settings/tasks/ldap.py:67
msgid "Periodic import ldap user"
msgstr "Периодический импорт пользователей LDAP"
-#: settings/tasks/ldap.py:75 settings/tasks/ldap.py:85
+#: settings/tasks/ldap.py:69 settings/tasks/ldap.py:79
msgid ""
"When LDAP auto-sync is configured, this task will be invoked to synchronize "
"users"
@@ -8049,32 +8090,30 @@ msgstr ""
"Когда настроена автоматическая синхронизация LDAP, эта задача будет вызвана "
"для синхронизации пользователей"
-#: settings/tasks/ldap.py:83
+#: settings/tasks/ldap.py:77
msgid "Periodic import ldap ha user"
msgstr "Периодический импорт пользователей LDAP HA"
-#: settings/tasks/ldap.py:120
+#: settings/tasks/ldap.py:115
msgid "Registration periodic import ldap user task"
msgstr "Регистрация задачи периодического импорта пользователей LDAP"
-#: settings/tasks/ldap.py:122
+#: settings/tasks/ldap.py:117
msgid ""
-"When LDAP auto-sync parameters change, such as Crontab parameters, the LDAP "
-"sync task \n"
+"When LDAP auto-sync parameters change, such as Crontab parameters, the LDAP sync task \n"
" will be re-registered or updated, and this task will be invoked"
msgstr ""
"Когда изменяются параметры автоматической синхронизации LDAP, такие как "
-"параметры Crontab, повторная регистрация или обновление задачи синхронизации "
-"LDAP вызовет эту задачу"
+"параметры Crontab, повторная регистрация или обновление задачи синхронизации"
+" LDAP вызовет эту задачу"
-#: settings/tasks/ldap.py:136
+#: settings/tasks/ldap.py:131
msgid "Registration periodic import ldap ha user task"
msgstr "Регистрация задачи периодического импорта пользователей LDAP HA"
-#: settings/tasks/ldap.py:138
+#: settings/tasks/ldap.py:133
msgid ""
-"When LDAP HA auto-sync parameters change, such as Crontab parameters, the "
-"LDAP HA sync task \n"
+"When LDAP HA auto-sync parameters change, such as Crontab parameters, the LDAP HA sync task \n"
" will be re-registered or updated, and this task will be invoked"
msgstr ""
"Когда параметры автоматической синхронизации LDAP HA изменяются, например "
@@ -8097,114 +8136,114 @@ msgstr "Пользователь синхронизирован"
msgid "No user synchronization required"
msgstr "Нет пользователей для синхронизации"
-#: settings/utils/ldap.py:509
+#: settings/utils/ldap.py:529
msgid "ldap:// or ldaps:// protocol is used."
msgstr "Используйте протокол ldap:// или ldaps://"
-#: settings/utils/ldap.py:520
+#: settings/utils/ldap.py:540
msgid "Host or port is disconnected: {}"
msgstr "Хост или порт недоступны: {}"
-#: settings/utils/ldap.py:522
+#: settings/utils/ldap.py:542
msgid "The port is not the port of the LDAP service: {}"
msgstr "Порт не является портом LDAP-сервиса: {}"
-#: settings/utils/ldap.py:524
+#: settings/utils/ldap.py:544
msgid "Please add certificate: {}"
msgstr "Пожалуйста, добавьте сертификат"
-#: settings/utils/ldap.py:528 settings/utils/ldap.py:555
-#: settings/utils/ldap.py:585 settings/utils/ldap.py:613
+#: settings/utils/ldap.py:548 settings/utils/ldap.py:575
+#: settings/utils/ldap.py:605 settings/utils/ldap.py:633
msgid "Unknown error: {}"
msgstr "Неизвестная ошибка: {}"
-#: settings/utils/ldap.py:542
+#: settings/utils/ldap.py:562
msgid "Bind DN or Password incorrect"
msgstr "Ошибка DN привязки или пароля"
-#: settings/utils/ldap.py:549
+#: settings/utils/ldap.py:569
msgid "Please enter Bind DN: {}"
msgstr "Пожалуйста, введите DN привязки: {}"
-#: settings/utils/ldap.py:551
+#: settings/utils/ldap.py:571
msgid "Please enter Password: {}"
msgstr "Пожалуйста, введите пароль: {}"
-#: settings/utils/ldap.py:553
+#: settings/utils/ldap.py:573
msgid "Please enter correct Bind DN and Password: {}"
msgstr "Пожалуйста, введите правильный DN привязки и пароль: {}"
-#: settings/utils/ldap.py:571
+#: settings/utils/ldap.py:591
msgid "Invalid User OU or User search filter: {}"
msgstr "Недопустимый OU пользователя или фильтр пользователей: {}"
-#: settings/utils/ldap.py:602
+#: settings/utils/ldap.py:622
msgid "LDAP User attr map not include: {}"
msgstr "LDAP свойства сопоставления не включают: {}"
-#: settings/utils/ldap.py:609
+#: settings/utils/ldap.py:629
msgid "LDAP User attr map is not dict"
msgstr "LDAP свойства сопоставления недействительны"
-#: settings/utils/ldap.py:628
+#: settings/utils/ldap.py:648
msgid "LDAP authentication is not enabled"
msgstr "LDAP аутентификация не включена"
-#: settings/utils/ldap.py:646
+#: settings/utils/ldap.py:666
msgid "Error (Invalid LDAP server): {}"
msgstr "Ошибка (недопустимый адрес LDAP-сервера): {}"
-#: settings/utils/ldap.py:648
+#: settings/utils/ldap.py:668
msgid "Error (Invalid Bind DN): {}"
msgstr "Ошибка (недопустимый DN для связывания): {}"
-#: settings/utils/ldap.py:650
+#: settings/utils/ldap.py:670
msgid "Error (Invalid LDAP User attr map): {}"
msgstr "Ошибка (недопустимое сопоставление свойств LDAP): {}"
-#: settings/utils/ldap.py:652
+#: settings/utils/ldap.py:672
msgid "Error (Invalid User OU or User search filter): {}"
msgstr "Ошибка (недопустимый OU пользователя или фильтр пользователя): {}"
-#: settings/utils/ldap.py:654
+#: settings/utils/ldap.py:674
msgid "Error (Not enabled LDAP authentication): {}"
msgstr "Ошибка (LDAP аутентификация не включена): {}"
-#: settings/utils/ldap.py:656
+#: settings/utils/ldap.py:676
msgid "Error (Unknown): {}"
msgstr "Ошибка (неизвестная): {}"
-#: settings/utils/ldap.py:659
+#: settings/utils/ldap.py:679
msgid "Succeed: Match {} users"
msgstr "Успешно найдено {} пользователей"
-#: settings/utils/ldap.py:689
+#: settings/utils/ldap.py:709
msgid "Authentication failed (configuration incorrect): {}"
msgstr "Ошибка аутентификации (ошибка конфигурации): {}"
-#: settings/utils/ldap.py:693
+#: settings/utils/ldap.py:713
msgid "Authentication failed (username or password incorrect): {}"
msgstr "Ошибка аутентификации (неверное имя пользователя или пароль): {}"
-#: settings/utils/ldap.py:695
+#: settings/utils/ldap.py:715
msgid "Authentication failed (Unknown): {}"
msgstr "Ошибка аутентификации: (неизвестная): {}"
-#: settings/utils/ldap.py:698
+#: settings/utils/ldap.py:718
msgid "Authentication success: {}"
msgstr "Успешная аутентификация: {}"
-#: settings/ws.py:222
+#: settings/ws.py:223
msgid "No LDAP user was found"
msgstr "Не удалось получить LDAP пользователя"
-#: settings/ws.py:228
+#: settings/ws.py:232
msgid "Total {}, success {}, failure {}"
msgstr "Всего {} , успешно {} , неудачно {}"
-#: templates/_csv_import_export.html:8
-msgid "Export"
-msgstr "Экспорт"
+#: settings/ws.py:236
+msgid ", disabled {}"
+msgstr ", отключить {}"
#: templates/_csv_import_export.html:13 templates/_csv_import_modal.html:5
#: xpack/plugins/cloud/const.py:65
@@ -8430,7 +8469,7 @@ msgstr "Тестирование прошло успешно"
msgid "Test failure: Please check configuration"
msgstr "Тестирование не удалось: пожалуйста, проверьте конфигурацию"
-#: terminal/api/component/terminal.py:57
+#: terminal/api/component/terminal.py:56
msgid "Have online sessions"
msgstr "Есть онлайн-сессия"
@@ -8610,7 +8649,7 @@ msgstr "Версия"
msgid "Can concurrent"
msgstr "можно параллельно"
-#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:179
+#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:194
#: terminal/serializers/storage.py:193
msgid "Hosts"
msgstr "хост"
@@ -8632,12 +8671,12 @@ msgstr "Поддерживается только пользовательска
msgid "Missing type in platform.yml"
msgstr "Отсутствует тип в platform.yml"
-#: terminal/models/applet/applet.py:330 terminal/models/applet/host.py:36
+#: terminal/models/applet/applet.py:371 terminal/models/applet/host.py:36
#: terminal/models/applet/host.py:138
msgid "Hosting"
msgstr "хост-машина"
-#: terminal/models/applet/applet.py:336
+#: terminal/models/applet/applet.py:377
msgid "Applet Publication"
msgstr "публикация приложения"
@@ -8714,18 +8753,22 @@ msgid "SQLServer port"
msgstr "SQLServer порт"
#: terminal/models/component/endpoint.py:25
+msgid "Oracle port"
+msgstr "Порт Oracle"
+
+#: terminal/models/component/endpoint.py:26
msgid "VNC port"
msgstr "VNC порт"
-#: terminal/models/component/endpoint.py:33
-#: terminal/models/component/endpoint.py:120
-#: terminal/serializers/endpoint.py:80 terminal/serializers/storage.py:41
+#: terminal/models/component/endpoint.py:34
+#: terminal/models/component/endpoint.py:114
+#: terminal/serializers/endpoint.py:61 terminal/serializers/storage.py:41
#: terminal/serializers/storage.py:53 terminal/serializers/storage.py:83
#: terminal/serializers/storage.py:93 terminal/serializers/storage.py:101
msgid "Endpoint"
msgstr "конечная точка"
-#: terminal/models/component/endpoint.py:126
+#: terminal/models/component/endpoint.py:120
msgid "Endpoint rule"
msgstr "правила конечной точки"
@@ -8799,7 +8842,8 @@ msgstr "Можно скачать запись сеанса"
msgid "Account ID"
msgstr "Аккаунт"
-#: terminal/models/session/session.py:39 terminal/models/session/sharing.py:118
+#: terminal/models/session/session.py:39
+#: terminal/models/session/sharing.py:118
msgid "Login from"
msgstr "Источник входа"
@@ -8848,8 +8892,8 @@ msgstr "Права доступа"
msgid "Origin"
msgstr "Источник"
-#: terminal/models/session/sharing.py:42 terminal/models/session/sharing.py:100
-#: terminal/notifications.py:279
+#: terminal/models/session/sharing.py:42
+#: terminal/models/session/sharing.py:100 terminal/notifications.py:279
msgid "Session sharing"
msgstr "Обмен сеансом"
@@ -8932,7 +8976,7 @@ msgid "Command and replay storage"
msgstr "Команда и хранение записи"
#: terminal/notifications.py:258 terminal/tasks.py:212
-#: xpack/plugins/cloud/api.py:160
+#: xpack/plugins/cloud/api.py:175
#: xpack/plugins/cloud/serializers/account.py:121
#: xpack/plugins/cloud/serializers/account.py:123
msgid "Test failure: Account invalid"
@@ -8962,20 +9006,17 @@ msgstr "Адрес Core службы"
#: terminal/serializers/applet_host.py:38
msgid ""
" \n"
-" Tips: The application release machine communicates with the Core "
-"service. \n"
-" If the release machine and the Core service are on the same network "
-"segment, \n"
-" it is recommended to fill in the intranet address, otherwise fill in "
-"the current site URL \n"
+" Tips: The application release machine communicates with the Core service. \n"
+" If the release machine and the Core service are on the same network segment, \n"
+" it is recommended to fill in the intranet address, otherwise fill in the current site URL \n"
"
\n"
" eg: https://172.16.10.110 or https://dev.jumpserver.com\n"
" "
msgstr ""
"Подсказка: для связи между приложением и Core службой, если они находятся в "
"одной подсети, рекомендуется указывать внутренний адрес, в противном случае "
-"введите URL текущего сайта
Например: https://172.16.10.110 или https://"
-"dev.jumpserver.com"
+"введите URL текущего сайта
Например: https://172.16.10.110 или "
+"https://dev.jumpserver.com"
#: terminal/serializers/applet_host.py:46 terminal/serializers/storage.py:207
msgid "Ignore Certificate Verification"
@@ -8988,13 +9029,13 @@ msgstr "Существующая лицензия RDS"
#: terminal/serializers/applet_host.py:50
msgid ""
"If not exist, the RDS will be in trial mode, and the trial period is 120 "
-"days.
Detail"
+"days.
Detail"
msgstr ""
"Если лицензия отсутствует, RDS будет находиться в режиме пробной "
-"эксплуатации, который длится 120 дней.
Подробнее"
+"эксплуатации, который длится 120 дней.
Подробнее"
#: terminal/serializers/applet_host.py:55
msgid "RDS License Server"
@@ -9014,7 +9055,8 @@ msgid ""
"login connected, previous session will be disconnected."
msgstr ""
"Подсказка: RDS пользователь может иметь только одну сессию одновременно. "
-"Если установлено, при следующем подключении предыдущая сессия будет разорвана"
+"Если установлено, при следующем подключении предыдущая сессия будет "
+"разорвана"
#: terminal/serializers/applet_host.py:65
msgid "RDS Max Disconnection Time (ms)"
@@ -9036,8 +9078,8 @@ msgstr ""
#: terminal/serializers/applet_host.py:74
msgid ""
-"Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp "
-"programs (0 milliseconds, log off the session immediately)."
+"Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp"
+" programs (0 milliseconds, log off the session immediately)."
msgstr ""
"Подсказка: Установите время отключения сессии RemoteApp после закрытия всех "
"программ RemoteApp (0 миллисекунд, немедленное завершение сессии)"
@@ -9049,11 +9091,11 @@ msgstr "Статус нагрузки"
#: terminal/serializers/applet_host.py:97
msgid ""
-"These accounts are used to connect to the published application, the account "
-"is now divided into two types, one is dedicated to each account, each user "
+"These accounts are used to connect to the published application, the account"
+" is now divided into two types, one is dedicated to each account, each user "
"has a private account, the other is public, when the application does not "
-"support multiple open and the special has been used, the public account will "
-"be used to connect"
+"support multiple open and the special has been used, the public account will"
+" be used to connect"
msgstr ""
"Эти аккаунты используются для подключения к опубликованным приложениям. "
"Существует два типа аккаунтов:
Один — это персональный, у каждого "
@@ -9079,15 +9121,15 @@ msgstr ""
"установить CACHE_LOGIN_PASSWORD_ENABLED=true, после изменения перезапустите "
"службу"
-#: terminal/serializers/applet_host.py:149
+#: terminal/serializers/applet_host.py:164
msgid "Install applets"
msgstr "Установка приложения"
-#: terminal/serializers/applet_host.py:179
+#: terminal/serializers/applet_host.py:194
msgid "Host ID"
msgstr "ID хоста"
-#: terminal/serializers/applet_host.py:180
+#: terminal/serializers/applet_host.py:195
msgid "Applet ID"
msgstr "ID удаленного приложения"
@@ -9115,23 +9157,7 @@ msgstr "Недействительный Session ID"
msgid "Timestamp"
msgstr "Метка времени"
-#: terminal/serializers/endpoint.py:15
-msgid "Oracle port"
-msgstr "Порт Oracle"
-
-#: terminal/serializers/endpoint.py:18
-msgid "Oracle port range"
-msgstr "Диапазон портов Oracle"
-
-#: terminal/serializers/endpoint.py:20
-msgid ""
-"Oracle proxy server listen port is dynamic, Each additional Oracle database "
-"instance adds a port listener"
-msgstr ""
-"Порт прослушивания Oracle Proxy динамический, при добавлении каждого нового "
-"экземпляра базы данных Oracle добавляется новый порт для прослушивания"
-
-#: terminal/serializers/endpoint.py:38
+#: terminal/serializers/endpoint.py:26
msgid ""
"The host address accessed when connecting to assets, if it is empty, the "
"access address of the current browser will be used (the default endpoint "
@@ -9141,22 +9167,22 @@ msgstr ""
"Если он пустой, используется адрес доступа текущего браузера (по умолчанию "
"конечная точка не позволяет изменять хост)"
-#: terminal/serializers/endpoint.py:71
+#: terminal/serializers/endpoint.py:52
msgid ""
-"The assets within this IP range, the following endpoint will be used for the "
-"connection"
+"The assets within this IP range, the following endpoint will be used for the"
+" connection"
msgstr ""
-"Активы в этом диапазоне IP будут подключаться с использованием нижеуказанных "
-"конечных точек"
+"Активы в этом диапазоне IP будут подключаться с использованием нижеуказанных"
+" конечных точек"
-#: terminal/serializers/endpoint.py:72
+#: terminal/serializers/endpoint.py:53
msgid ""
"If asset IP addresses under different endpoints conflict, use asset labels"
msgstr ""
"Если есть конфликт IP активов под разными конечными точками, используйте "
"метки активов"
-#: terminal/serializers/endpoint.py:76
+#: terminal/serializers/endpoint.py:57
msgid "Asset IP"
msgstr "IP актива"
@@ -9241,8 +9267,8 @@ msgid ""
"If there are multiple hosts, use a comma (,) to separate them.
(For "
"example: http://www.jumpserver.a.com:9100, http://www.jumpserver.b.com:9100)"
msgstr ""
-"Если есть несколько хостов, разделите их запятыми (,)
(например: http://"
-"www.jumpserver.a.com:9100, http://www.jumpserver.b.com:9100)"
+"Если есть несколько хостов, разделите их запятыми (,)
(например: "
+"http://www.jumpserver.a.com:9100, http://www.jumpserver.b.com:9100)"
#: terminal/serializers/storage.py:199
msgid "Index by date"
@@ -9419,8 +9445,7 @@ msgstr "Удаление оффлайн сессий."
#: terminal/tasks.py:45
msgid ""
-"Check every 10 minutes for asset connection sessions that have been inactive "
-"for 3 \n"
+"Check every 10 minutes for asset connection sessions that have been inactive for 3 \n"
" minutes and mark these sessions as completed"
msgstr ""
"Каждые 10 минут проверяются подключения активов, неактивные в течение 3 "
@@ -9432,8 +9457,7 @@ msgstr "Загружать записи сессий на внешнее хра
#: terminal/tasks.py:70 terminal/tasks.py:104
msgid ""
-"If SERVER_REPLAY_STORAGE is configured in the config.txt, session commands "
-"and \n"
+"If SERVER_REPLAY_STORAGE is configured in the config.txt, session commands and \n"
" recordings will be uploaded to external storage"
msgstr ""
"Если установлено SERVER_REPLAY_STORAGE, файлы, загруженные через файловый "
@@ -9449,8 +9473,7 @@ msgstr "Запустите развертывание приложения"
#: terminal/tasks.py:126
msgid ""
-"When deploying from the remote application publisher details page, and the "
-"'Deploy' \n"
+"When deploying from the remote application publisher details page, and the 'Deploy' \n"
" button is clicked, this task will be executed"
msgstr ""
"Развертывание машин, при нажатии на развертывание выполнить это действие"
@@ -9461,8 +9484,7 @@ msgstr "Установите приложение"
#: terminal/tasks.py:140
msgid ""
-"When the 'Deploy' button is clicked in the 'Remote Application' section of "
-"the remote \n"
+"When the 'Deploy' button is clicked in the 'Remote Application' section of the remote \n"
" application publisher details page, this task will be executed"
msgstr ""
"Когда в деталях удаленной машины развертывания - удаленное приложение, при "
@@ -9474,8 +9496,7 @@ msgstr "Удалите приложение"
#: terminal/tasks.py:155
msgid ""
-"When the 'Uninstall' button is clicked in the 'Remote Application' section "
-"of the \n"
+"When the 'Uninstall' button is clicked in the 'Remote Application' section of the \n"
" remote application publisher details page, this task will be executed"
msgstr ""
"Когда в деталях удаленной машины развертывания - удаленное приложение, при "
@@ -9487,8 +9508,7 @@ msgstr "Соберите аккаунты на удаленном приложе
#: terminal/tasks.py:170
msgid ""
-"When a remote publishing server is created and an account needs to be "
-"created \n"
+"When a remote publishing server is created and an account needs to be created \n"
" automatically, this task will be executed"
msgstr ""
"Когда создается удаленная машина развертывания, необходимо автоматически "
@@ -9500,12 +9520,9 @@ msgstr "Проверьте доступность команд и хранили
#: terminal/tasks.py:186
msgid ""
-"Check every day at midnight whether the external storage for commands and "
-"recordings \n"
-" is accessible. If it is not accessible, send a notification to the "
-"recipients specified \n"
-" in 'System Settings - Notifications - Subscription - Storage - "
-"Connectivity'"
+"Check every day at midnight whether the external storage for commands and recordings \n"
+" is accessible. If it is not accessible, send a notification to the recipients specified \n"
+" in 'System Settings - Notifications - Subscription - Storage - Connectivity'"
msgstr ""
"Каждую полночь проверяйте доступность соединения команд и записи с внешним "
"хранилищем, при отсутствии соединения отправьте уведомление: Настройки "
@@ -9516,29 +9533,6 @@ msgstr ""
msgid "view"
msgstr "Просмотр"
-#: terminal/utils/db_port_mapper.py:88
-msgid ""
-"No available port is matched. The number of databases may have exceeded the "
-"number of ports open to the database agent service, Contact the "
-"administrator to open more ports."
-msgstr ""
-"Не удалось найти доступные порты, количество баз данных может превышать "
-"количество открытых портов службы прокси-базы данных; пожалуйста, свяжитесь "
-"с администратором для открытия большего количества портов."
-
-#: terminal/utils/db_port_mapper.py:116
-msgid ""
-"No ports can be used, check and modify the limit on the number of ports that "
-"Magnus listens on in the configuration file."
-msgstr ""
-"Нет доступных портов, проверьте и измените ограничение на количество портов "
-"в конфигурационном файле, прослушиваемых Magnus."
-
-#: terminal/utils/db_port_mapper.py:118
-msgid "All available port count: {}, Already use port count: {}"
-msgstr ""
-"Общее количество доступных портов: {} , количество использованных портов: {}"
-
#: tickets/api/ticket.py:88 tickets/models/ticket/general.py:289
msgid "Applicant"
msgstr "Заявитель"
@@ -9597,8 +9591,8 @@ msgid ""
"processor: {} ticket ID: {}"
msgstr ""
"Создано через рабочее задание, Заголовок рабочего задания: {}, Заявитель "
-"рабочего задания: {}, Исполнитель рабочего задания: {}, ID рабочего задания: "
-"{}"
+"рабочего задания: {}, Исполнитель рабочего задания: {}, ID рабочего задания:"
+" {}"
#: tickets/handlers/base.py:84
msgid "Change field"
@@ -9890,8 +9884,8 @@ msgstr "Организационный аудитор"
#: users/const.py:18
msgid "Reset link will be generated and sent to the user"
msgstr ""
-"Создайте ссылку для сброса пароля и отправьте ее пользователю по электронной "
-"почте."
+"Создайте ссылку для сброса пароля и отправьте ее пользователю по электронной"
+" почте."
#: users/const.py:19
msgid "Set password"
@@ -9968,8 +9962,8 @@ msgstr ""
#: users/forms/profile.py:69
msgid ""
-"In order to protect you and your company, please keep your account, password "
-"and key sensitive information properly. (for example: setting complex "
+"In order to protect you and your company, please keep your account, password"
+" and key sensitive information properly. (for example: setting complex "
"password, enabling MFA)"
msgstr ""
"Для защиты вас и компании храните вашу учетную запись, пароль и ключи, а "
@@ -10134,8 +10128,8 @@ msgstr "Название темы терминала"
#: users/serializers/preference/lina.py:12
msgid ""
"*! The password for file encryption, used for decryption when the system "
-"sends emails containing file attachments.
Such as: account backup files, "
-"account password change results files"
+"sends emails containing file attachments.
Such as: account backup files,"
+" account password change results files"
msgstr ""
"Пароль шифрования файлов, используемый для расшифровки, когда электронное "
"письмо от системы содержит вложение.
Например: файл резервной копии "
@@ -10219,7 +10213,7 @@ msgstr "Командная строка"
msgid "The old password is incorrect"
msgstr "Неверный старый пароль"
-#: users/serializers/profile.py:37 users/serializers/profile.py:148
+#: users/serializers/profile.py:37 users/serializers/profile.py:156
msgid "Password does not match security rules"
msgstr "Пароль не соответствует требованиям безопасности"
@@ -10233,8 +10227,8 @@ msgstr "Системная роль"
#: users/serializers/user.py:55
msgid ""
-"System roles are roles at the system level, and they will take effect across "
-"all organizations"
+"System roles are roles at the system level, and they will take effect across"
+" all organizations"
msgstr ""
"Системная роль — это роль на уровне системы, которая будет действовать во "
"всех организациях"
@@ -10315,7 +10309,8 @@ msgid ""
msgstr ""
"Идентификатор источника пользователя - место создания пользователя, может "
"быть AD или другой источник. Настройки безопасности могут ограничивать "
-"пользователей возможностью входа в систему только из определенных источников."
+"пользователей возможностью входа в систему только из определенных "
+"источников."
#: users/serializers/user.py:260
msgid "Is org admin"
@@ -10335,10 +10330,11 @@ msgstr "Аутентификация"
#: users/serializers/user.py:422
msgid ""
-"* For security, only a partial of users is displayed. You can search for more"
+"* For security, only a partial of users is displayed. You can search for "
+"more"
msgstr ""
-"* В целях безопасности отображаются только некоторые пользователи. Вы можете "
-"выполнить поиск по другим"
+"* В целях безопасности отображаются только некоторые пользователи. Вы можете"
+" выполнить поиск по другим"
#: users/serializers/user.py:457
msgid "name not unique"
@@ -10347,8 +10343,7 @@ msgstr "повторяющимся именам"
#: users/signal_handlers.py:41
msgid ""
"The administrator has enabled \"Only allow existing users to log in\", \n"
-" and the current user is not in the user list. Please contact the "
-"administrator."
+" and the current user is not in the user list. Please contact the administrator."
msgstr ""
"Администратор включил опцию 'разрешить вход только существующим "
"пользователям', текущий пользователь не входит в список пользователей, "
@@ -10360,8 +10355,7 @@ msgstr "Очистить истекшие пользовательские се
#: users/signal_handlers.py:179
msgid ""
-"After logging in via the web, a user session record is created. At 2 a.m. "
-"every day, \n"
+"After logging in via the web, a user session record is created. At 2 a.m. every day, \n"
" the system cleans up inactive user devices"
msgstr ""
"После входа через веб-версию создается запись о пользовательской сессии в "
@@ -10374,8 +10368,7 @@ msgstr "Проверка срока действия пароля"
#: users/tasks.py:28
msgid ""
-"Check every day at 10 AM whether the passwords of users in the system are "
-"expired, \n"
+"Check every day at 10 AM whether the passwords of users in the system are expired, \n"
" and send a notification 5 days in advance"
msgstr ""
"Каждое утро в 10 часов проверяется, истек ли срок действия пароля у "
@@ -10387,15 +10380,13 @@ msgstr "Периодическая проверка срока действия
#: users/tasks.py:48
msgid ""
-"With version iterations, new tasks may be added, or task names and execution "
-"times may \n"
-" be modified. Therefore, upon system startup, it is necessary to "
-"register or update the \n"
+"With version iterations, new tasks may be added, or task names and execution times may \n"
+" be modified. Therefore, upon system startup, it is necessary to register or update the \n"
" parameters of the task that checks if passwords have expired"
msgstr ""
"С увеличением версий могут добавляться новые задачи или изменяться названия "
-"задач и время выполнения, по этой причине при запуске системы регистрируются "
-"или обновляются параметры задачи проверки срока действия пароля"
+"задач и время выполнения, по этой причине при запуске системы регистрируются"
+" или обновляются параметры задачи проверки срока действия пароля"
#: users/tasks.py:67
msgid "Check user expired"
@@ -10403,8 +10394,7 @@ msgstr "Проверка истечения срока действия поль
#: users/tasks.py:69
msgid ""
-"Check every day at 2 p.m whether the users in the system are expired, and "
-"send a \n"
+"Check every day at 2 p.m whether the users in the system are expired, and send a \n"
" notification 5 days in advance"
msgstr ""
"Каждый день в 2 часа дня происходит проверка, истек ли срок действия "
@@ -10416,15 +10406,13 @@ msgstr "Периодическая проверка истечения срок
#: users/tasks.py:92
msgid ""
-"With version iterations, new tasks may be added, or task names and execution "
-"times may \n"
-" be modified. Therefore, upon system startup, it is necessary to "
-"register or update the \n"
+"With version iterations, new tasks may be added, or task names and execution times may \n"
+" be modified. Therefore, upon system startup, it is necessary to register or update the \n"
" parameters of the task that checks if users have expired"
msgstr ""
"С увеличением версий могут добавляться новые задачи или изменяться названия "
-"задач и время выполнения, по этой причине при запуске системы регистрируются "
-"или обновляются параметры задачи проверки истечения срока действия "
+"задач и время выполнения, по этой причине при запуске системы регистрируются"
+" или обновляются параметры задачи проверки истечения срока действия "
"пользователя."
#: users/tasks.py:111
@@ -10433,10 +10421,8 @@ msgstr "Проверка неиспользуемых пользователей
#: users/tasks.py:113
msgid ""
-"At 2 p.m. every day, according to the configuration in \"System Settings - "
-"Security - \n"
-" Auth security - Auto disable threshold\" users who have not logged "
-"in or whose API keys \n"
+"At 2 p.m. every day, according to the configuration in \"System Settings - Security - \n"
+" Auth security - Auto disable threshold\" users who have not logged in or whose API keys \n"
" have not been used for a long time will be disabled"
msgstr ""
"Каждый день в 14:00, в соответствии с настройками системы - безопасности - "
@@ -10510,7 +10496,8 @@ msgstr "Введите ваш email, мы отправим вам письмо
msgid ""
"Enter your mobile number and a verification code will be sent to your phone"
msgstr ""
-"Введите свой номер телефона, код подтверждения будет отправлен на ваш телефон"
+"Введите свой номер телефона, код подтверждения будет отправлен на ваш "
+"телефон"
#: users/templates/users/forgot_password.html:71
msgid "Email account"
@@ -10581,8 +10568,8 @@ msgstr "Привязать MFA-валидатор"
#: users/templates/users/user_otp_enable_bind.html:13
msgid ""
-"Use the MFA Authenticator application to scan the following qr code for a 6-"
-"bit verification code"
+"Use the MFA Authenticator application to scan the following qr code for a "
+"6-bit verification code"
msgstr ""
"Используйте приложение для MFA-валидатора для сканирования следующего QR-"
"кода и получения 6-значного кода"
@@ -10601,8 +10588,8 @@ msgid ""
"Download and install the MFA Authenticator application on your phone or "
"applet of WeChat"
msgstr ""
-"Пожалуйста, скачайте и установите приложение для MFA-валидатора на мобильном "
-"устройстве или через WeChat мини-программу"
+"Пожалуйста, скачайте и установите приложение для MFA-валидатора на мобильном"
+" устройстве или через WeChat мини-программу"
#: users/templates/users/user_otp_enable_install_app.html:18
msgid "Android downloads"
@@ -10666,7 +10653,8 @@ msgstr "Уже привязано"
#: users/views/profile/otp.py:107
msgid "MFA already bound, disable first, then bound"
msgstr ""
-"MFA(OTP) уже привязано, пожалуйста, сначала отключите, затем привяжите заново"
+"MFA(OTP) уже привязано, пожалуйста, сначала отключите, затем привяжите "
+"заново"
#: users/views/profile/otp.py:134
msgid "OTP enable success"
@@ -10694,8 +10682,8 @@ msgstr "Неправильное имя пользователя или паро
#: users/views/profile/reset.py:66
msgid ""
-"Non-local users can log in only from third-party platforms and cannot change "
-"their passwords: {}"
+"Non-local users can log in only from third-party platforms and cannot change"
+" their passwords: {}"
msgstr ""
"Несистемные пользователи могут входить только через сторонние платформы, "
"изменение пароля не поддерживается: {}"
@@ -10734,15 +10722,15 @@ msgstr ""
"Активы, не соответствующие политике, будут пропущены в соответствии с "
"текущей конфигурацией задачи."
-#: xpack/plugins/cloud/api.py:72
+#: xpack/plugins/cloud/api.py:74
msgid "Test connection successful"
msgstr "Тест успешен"
-#: xpack/plugins/cloud/api.py:74
+#: xpack/plugins/cloud/api.py:76
msgid "Test connection failed: {}"
msgstr "Ошибка соединения: {}"
-#: xpack/plugins/cloud/api.py:171
+#: xpack/plugins/cloud/api.py:196
msgid "User {} deleted the current resource and released the assets"
msgstr ""
"Пользователь {} удалил активы, которые были освобождены в текущем ресурсе"
@@ -11081,7 +11069,8 @@ msgstr "Экземпляр"
msgid "Sync instance detail"
msgstr "Детали синхронизации экземпляра"
-#: xpack/plugins/cloud/models.py:313 xpack/plugins/cloud/serializers/task.py:79
+#: xpack/plugins/cloud/models.py:313
+#: xpack/plugins/cloud/serializers/task.py:79
msgid "Rule relation"
msgstr "Условные отношения"
@@ -11137,7 +11126,8 @@ msgstr "Сопоставление правил"
msgid "Rule value"
msgstr "Значение правил"
-#: xpack/plugins/cloud/models.py:383 xpack/plugins/cloud/serializers/task.py:82
+#: xpack/plugins/cloud/models.py:383
+#: xpack/plugins/cloud/serializers/task.py:82
msgid "Strategy rule"
msgstr "Условие"
@@ -11153,7 +11143,8 @@ msgstr "Атрибуты действия"
msgid "Action value"
msgstr "Значение действия"
-#: xpack/plugins/cloud/models.py:410 xpack/plugins/cloud/serializers/task.py:85
+#: xpack/plugins/cloud/models.py:410
+#: xpack/plugins/cloud/serializers/task.py:85
msgid "Strategy action"
msgstr "Action"
@@ -11466,13 +11457,14 @@ msgstr "Количество экземпляров"
#: xpack/plugins/cloud/tasks.py:33
#, fuzzy
#| msgid ""
-#| "Execute this task when manually or scheduled cloud synchronization tasks "
-#| "are performed"
+#| "Execute this task when manually or scheduled cloud synchronization tasks are"
+#| " performed"
msgid ""
-"Execute this task when manually or scheduled cloud synchronization tasks are "
-"performed"
+"Execute this task when manually or scheduled cloud synchronization tasks are"
+" performed"
msgstr ""
-"В ручном или по расписанию выполняйте эту задачу облачной синхронизации"
+"Выполняйте это действие при ручной или запланированной синхронизации в "
+"облаке."
#: xpack/plugins/cloud/tasks.py:50
msgid "Period clean sync instance task execution"
@@ -11481,21 +11473,17 @@ msgstr "Регулярно очищать записи выполнения за
#: xpack/plugins/cloud/tasks.py:52
#, fuzzy
#| msgid ""
-#| "Every day, according to the configuration in \"System Settings - Tasks - "
-#| "Regular \n"
-#| " clean-up - Cloud sync task history retention days\" the system "
-#| "will clean up the execution \n"
+#| "Every day, according to the configuration in \"System Settings - Tasks - Regular \n"
+#| " clean-up - Cloud sync task history retention days\" the system will clean up the execution \n"
#| " records generated by cloud synchronization"
msgid ""
-"Every day, according to the configuration in \"System Settings - Tasks - "
-"Regular \n"
-" clean-up - Cloud sync task history retention days\" the system will "
-"clean up the execution \n"
+"Every day, according to the configuration in \"System Settings - Tasks - Regular \n"
+" clean-up - Cloud sync task history retention days\" the system will clean up the execution \n"
" records generated by cloud synchronization"
msgstr ""
-"Каждый день система будет регулярно очищать историю заданий облачной "
-"синхронизации в соответствии с конфигурацией в разделе «Настройки системы - "
-"Задания» в соответствии с установленным количеством дней хранения."
+"Каждый день система будет очищать историю выполнения задач облачной "
+"синхронизации в соответствии с конфигурацией в «Системные настройки - Задачи"
+" -», основываясь на количестве дней хранения."
#: xpack/plugins/interface/api.py:52
msgid "Restore default successfully."
@@ -11551,6 +11539,55 @@ msgstr "Лицензия успешно импортирована"
msgid "Invalid license"
msgstr "Лицензия недействительна"
+#~ msgid "Deleting other people's script is not allowed"
+#~ msgstr "Удаление чужих скриптов не разрешено"
+
+#~ msgid "Deleting other people's playbook is not allowed"
+#~ msgstr "Удаление чужого playbook запрещено."
+
+#, fuzzy
+#~ msgid "Directory services"
+#~ msgstr "Служба каталогов"
+
+#, python-format
+#~ msgid "User %s view/export secret"
+#~ msgstr "Пользователь %s просмотрел/экспортировал пароль"
+
+#~ msgid "Enabled, the web session and replay contains watermark information"
+#~ msgstr ""
+#~ "После активации веб-сессии и записи будут содержать информацию о водяном "
+#~ "знаке"
+
+#~ msgid "Oracle port range"
+#~ msgstr "Диапазон портов Oracle"
+
+#~ msgid ""
+#~ "Oracle proxy server listen port is dynamic, Each additional Oracle database "
+#~ "instance adds a port listener"
+#~ msgstr ""
+#~ "Порт прослушивания Oracle Proxy динамический, при добавлении каждого нового "
+#~ "экземпляра базы данных Oracle добавляется новый порт для прослушивания"
+
+#~ msgid ""
+#~ "No available port is matched. The number of databases may have exceeded the "
+#~ "number of ports open to the database agent service, Contact the "
+#~ "administrator to open more ports."
+#~ msgstr ""
+#~ "Не удалось найти доступные порты, количество баз данных может превышать "
+#~ "количество открытых портов службы прокси-базы данных; пожалуйста, свяжитесь "
+#~ "с администратором для открытия большего количества портов."
+
+#~ msgid ""
+#~ "No ports can be used, check and modify the limit on the number of ports that"
+#~ " Magnus listens on in the configuration file."
+#~ msgstr ""
+#~ "Нет доступных портов, проверьте и измените ограничение на количество портов "
+#~ "в конфигурационном файле, прослушиваемых Magnus."
+
+#~ msgid "All available port count: {}, Already use port count: {}"
+#~ msgstr ""
+#~ "Общее количество доступных портов: {} , количество использованных портов: {}"
+
#~ msgid "Password error"
#~ msgstr "Неверный пароль"
diff --git a/apps/i18n/core/zh/LC_MESSAGES/django.po b/apps/i18n/core/zh/LC_MESSAGES/django.po
index d8a1cb931..a539fc3d2 100644
--- a/apps/i18n/core/zh/LC_MESSAGES/django.po
+++ b/apps/i18n/core/zh/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: JumpServer 0.3.3\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-03-20 11:52+0800\n"
+"POT-Creation-Date: 2025-04-17 15:04+0800\n"
"PO-Revision-Date: 2021-05-20 10:54+0800\n"
"Last-Translator: ibuler
\n"
"Language-Team: JumpServer team\n"
@@ -17,18 +17,18 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.4.3\n"
-#: accounts/api/account/account.py:121
+#: accounts/api/account/account.py:131
#: accounts/serializers/account/account.py:181
-#: accounts/serializers/account/account.py:342
+#: accounts/serializers/account/account.py:344
msgid "Account already exists"
msgstr "账号已存在"
#: accounts/api/account/application.py:78
-#: authentication/api/connection_token.py:452
+#: authentication/api/connection_token.py:451
msgid "Account not found"
msgstr "账号未找到"
-#: accounts/api/automations/base.py:83 tickets/api/ticket.py:132
+#: accounts/api/automations/base.py:86 tickets/api/ticket.py:132
msgid "The parameter 'action' must be [{}]"
msgstr "参数 'action' 必须是 [{}]"
@@ -93,7 +93,7 @@ msgstr "账号备份计划正在执行"
msgid "Plan execution end"
msgstr "计划执行结束"
-#: accounts/automations/base/manager.py:118
+#: accounts/automations/base/manager.py:119
msgid "No pending accounts found"
msgstr "未找到待处理帐户"
@@ -129,8 +129,8 @@ msgstr ">>> 开始执行测试网关账号可连接性任务"
#: authentication/templates/authentication/login.html:362
#: authentication/templates/authentication/login.html:408
#: settings/serializers/auth/ldap.py:27 settings/serializers/auth/ldap.py:53
-#: settings/serializers/auth/ldap_ha.py:36 settings/serializers/msg.py:37
-#: settings/serializers/terminal.py:28 terminal/serializers/storage.py:123
+#: settings/serializers/auth/ldap_ha.py:35 settings/serializers/msg.py:37
+#: settings/serializers/terminal.py:32 terminal/serializers/storage.py:123
#: terminal/serializers/storage.py:142 users/forms/profile.py:22
#: users/serializers/user.py:148
#: users/templates/users/_msg_user_created.html:13
@@ -202,7 +202,7 @@ msgid "Update"
msgstr "更新"
#: accounts/const/account.py:34 accounts/const/automation.py:115
-#: accounts/serializers/automations/change_secret.py:169 audits/const.py:65
+#: accounts/serializers/automations/change_secret.py:169 audits/const.py:66
#: audits/signal_handlers/activity_log.py:34 common/const/choices.py:67
#: ops/const.py:76 terminal/const.py:81 xpack/plugins/cloud/const.py:47
msgid "Failed"
@@ -305,7 +305,7 @@ msgstr "创建并推送"
msgid "Only create"
msgstr "仅创建"
-#: accounts/const/automation.py:109
+#: accounts/const/automation.py:109 authentication/const.py:34
#: authentication/serializers/password_mfa.py:16
#: authentication/serializers/password_mfa.py:24
#: notifications/backends/__init__.py:10 settings/serializers/msg.py:21
@@ -321,7 +321,7 @@ msgid "SFTP"
msgstr "SFTP"
#: accounts/const/automation.py:116
-#: accounts/serializers/automations/change_secret.py:168 audits/const.py:64
+#: accounts/serializers/automations/change_secret.py:168 audits/const.py:65
#: audits/models.py:65 audits/signal_handlers/activity_log.py:34
#: common/const/choices.py:66 ops/const.py:74 ops/serializers/celery.py:48
#: terminal/const.py:80 terminal/models/session/sharing.py:121
@@ -412,33 +412,11 @@ msgid ""
"Vault."
msgstr "Vault 操作失败,请重试,或者检查 Vault 上的账号信息。"
-#: accounts/filters.py:194
-msgid "Enter a valid UUID."
-msgstr ""
-
-#: accounts/mixins.py:35
-msgid "Export all"
-msgstr "导出所有"
-
-#: accounts/mixins.py:37
-msgid "Export only selected items"
-msgstr "仅导出选择项"
-
-#: accounts/mixins.py:42
-#, python-format
-msgid "Export filtered: %s"
-msgstr "导出搜素: %s"
-
-#: accounts/mixins.py:48
-#, python-format
-msgid "User %s view/export secret"
-msgstr "用户 %s 查看/导出 了密码"
-
#: accounts/models/account.py:85
#: accounts/models/automations/check_account.py:59
#: accounts/models/automations/gather_account.py:17
-#: accounts/serializers/account/account.py:226
-#: accounts/serializers/account/account.py:274
+#: accounts/serializers/account/account.py:227
+#: accounts/serializers/account/account.py:276
#: accounts/serializers/automations/change_secret.py:113
#: accounts/serializers/automations/change_secret.py:145
#: accounts/serializers/automations/check_account.py:33
@@ -452,9 +430,9 @@ msgstr "用户 %s 查看/导出 了密码"
#: accounts/templates/accounts/push_account_report.html:78
#: accounts/templates/accounts/push_account_report.html:118
#: acls/serializers/base.py:130 assets/models/asset/common.py:102
-#: assets/models/asset/common.py:366 assets/models/cmd_filter.py:36
-#: audits/models.py:59 audits/models.py:312 audits/serializers.py:228
-#: authentication/models/connection_token.py:40
+#: assets/models/asset/common.py:428 assets/models/cmd_filter.py:36
+#: audits/models.py:59 audits/models.py:312 audits/serializers.py:230
+#: authentication/models/connection_token.py:41
#: perms/models/asset_permission.py:69 terminal/backends/command/models.py:17
#: terminal/models/session/session.py:34 terminal/notifications.py:156
#: terminal/serializers/command.py:17 terminal/serializers/session.py:30
@@ -465,10 +443,10 @@ msgid "Asset"
msgstr "资产"
#: accounts/models/account.py:89 accounts/models/template.py:16
-#: accounts/serializers/account/account.py:233
-#: accounts/serializers/account/account.py:284
+#: accounts/serializers/account/account.py:234
+#: accounts/serializers/account/account.py:286
#: accounts/serializers/account/template.py:35
-#: authentication/serializers/connect_token_secret.py:50
+#: authentication/serializers/connect_token_secret.py:51
msgid "Su from"
msgstr "切换自"
@@ -486,7 +464,7 @@ msgstr "历史账号"
msgid "Secret reset"
msgstr "可改密"
-#: accounts/models/account.py:97 accounts/serializers/account/account.py:228
+#: accounts/models/account.py:97 accounts/serializers/account/account.py:229
#: users/models/user/__init__.py:122
msgid "Source"
msgstr "来源"
@@ -513,14 +491,14 @@ msgstr "改密状态"
#: accounts/models/account.py:107
#: accounts/models/automations/check_account.py:64
-#: accounts/serializers/account/service.py:11
+#: accounts/serializers/account/service.py:12
#: accounts/serializers/automations/change_secret.py:115
#: accounts/serializers/automations/change_secret.py:146
#: accounts/templates/accounts/change_secret_failed_info.html:12
#: acls/serializers/base.py:131
#: acls/templates/acls/asset_login_reminder.html:10
#: assets/serializers/gateway.py:33 audits/models.py:60 audits/models.py:313
-#: audits/serializers.py:229 authentication/api/connection_token.py:464
+#: audits/serializers.py:231 authentication/api/connection_token.py:463
#: ops/models/base.py:18 perms/models/asset_permission.py:75
#: settings/serializers/msg.py:33 terminal/backends/command/models.py:18
#: terminal/models/session/session.py:36 terminal/serializers/command.py:72
@@ -557,28 +535,28 @@ msgstr "可以移除账号"
#: accounts/models/application.py:16
#: accounts/models/automations/check_account.py:116 accounts/models/base.py:63
-#: accounts/serializers/account/service.py:27
+#: accounts/serializers/account/service.py:28
#: accounts/serializers/account/virtual.py:20 acls/models/base.py:35
#: acls/models/base.py:96 acls/models/command_acl.py:21
#: acls/serializers/base.py:35 assets/models/asset/common.py:100
#: assets/models/asset/common.py:166 assets/models/cmd_filter.py:21
#: assets/models/domain.py:19 assets/models/label.py:18
#: assets/models/platform.py:15 assets/models/platform.py:94
-#: assets/serializers/asset/common.py:171 assets/serializers/platform.py:158
-#: assets/serializers/platform.py:278
+#: assets/serializers/asset/common.py:173 assets/serializers/platform.py:158
+#: assets/serializers/platform.py:283
#: authentication/backends/passkey/models.py:10
#: authentication/models/ssh_key.py:12
-#: authentication/serializers/connect_token_secret.py:113
-#: authentication/serializers/connect_token_secret.py:170 labels/models.py:11
+#: authentication/serializers/connect_token_secret.py:115
+#: authentication/serializers/connect_token_secret.py:172 labels/models.py:11
#: ops/mixin.py:32 ops/models/adhoc.py:19 ops/models/celery.py:15
-#: ops/models/celery.py:81 ops/models/job.py:145 ops/models/playbook.py:28
+#: ops/models/celery.py:81 ops/models/job.py:147 ops/models/playbook.py:28
#: ops/models/variable.py:9 ops/serializers/job.py:20
#: ops/serializers/variable.py:20 orgs/models.py:82
#: perms/models/asset_permission.py:61 rbac/models/role.py:29
#: rbac/serializers/role.py:28 settings/models.py:37 settings/models.py:186
#: settings/serializers/msg.py:89 settings/serializers/terminal.py:9
#: terminal/models/applet/applet.py:34 terminal/models/component/endpoint.py:13
-#: terminal/models/component/endpoint.py:112
+#: terminal/models/component/endpoint.py:106
#: terminal/models/component/storage.py:26 terminal/models/component/task.py:13
#: terminal/models/component/terminal.py:86
#: terminal/models/virtualapp/provider.py:10
@@ -605,13 +583,13 @@ msgstr "密文"
#: accounts/models/application.py:21 acls/models/base.py:98
#: assets/models/automations/base.py:22 assets/models/cmd_filter.py:38
#: assets/serializers/asset/common.py:148
-#: assets/serializers/asset/common.py:420 perms/serializers/permission.py:66
-#: perms/serializers/user_permission.py:75 rbac/tree.py:35
+#: assets/serializers/asset/common.py:423 perms/serializers/permission.py:66
+#: perms/serializers/user_permission.py:76 rbac/tree.py:35
msgid "Accounts"
msgstr "账号"
#: accounts/models/application.py:22 authentication/models/access_key.py:20
-#: terminal/models/component/endpoint.py:113
+#: terminal/models/component/endpoint.py:107
msgid "IP group"
msgstr "IP 组"
@@ -623,12 +601,12 @@ msgid "Date last used"
msgstr "最后使用日期"
#: accounts/models/application.py:24 acls/models/base.py:43
-#: assets/models/asset/common.py:178 authentication/models/access_key.py:23
-#: authentication/models/connection_token.py:58
+#: assets/models/asset/common.py:182 authentication/models/access_key.py:23
+#: authentication/models/connection_token.py:59
#: authentication/models/ssh_key.py:13 authentication/serializers/ssh_key.py:23
#: authentication/templates/authentication/_access_key_modal.html:32
-#: perms/models/asset_permission.py:82 terminal/models/component/endpoint.py:28
-#: terminal/models/component/endpoint.py:123
+#: perms/models/asset_permission.py:82 terminal/models/component/endpoint.py:29
+#: terminal/models/component/endpoint.py:117
#: terminal/models/session/sharing.py:29 terminal/serializers/terminal.py:44
#: tickets/const.py:36
msgid "Active"
@@ -729,8 +707,8 @@ msgstr "更改后检查连接"
#: accounts/models/automations/check_account.py:19
#: accounts/models/automations/gather_account.py:117
#: accounts/serializers/automations/change_secret.py:59
-#: settings/serializers/auth/ldap.py:101
-#: settings/serializers/auth/ldap_ha.py:84 settings/serializers/msg.py:45
+#: settings/serializers/auth/ldap.py:105
+#: settings/serializers/auth/ldap_ha.py:87 settings/serializers/msg.py:45
msgid "Recipient"
msgstr "收件人"
@@ -740,7 +718,7 @@ msgstr "自动化改密"
#: accounts/models/automations/change_secret.py:47
#: assets/models/automations/base.py:145 ops/models/base.py:56
-#: ops/models/celery.py:90 ops/models/job.py:240
+#: ops/models/celery.py:90 ops/models/job.py:242
#: terminal/models/applet/host.py:142
msgid "Date finished"
msgstr "结束日期"
@@ -751,11 +729,11 @@ msgstr "结束日期"
#: accounts/serializers/automations/check_account.py:39
#: assets/models/automations/base.py:137
#: assets/serializers/automations/base.py:45 audits/models.py:209
-#: audits/serializers.py:78 ops/models/base.py:49 ops/models/job.py:231
-#: terminal/models/applet/applet.py:331 terminal/models/applet/host.py:140
+#: audits/serializers.py:77 ops/models/base.py:49 ops/models/job.py:233
+#: terminal/models/applet/applet.py:372 terminal/models/applet/host.py:140
#: terminal/models/component/status.py:30
#: terminal/models/virtualapp/virtualapp.py:99
-#: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:148
+#: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:163
#: terminal/serializers/virtualapp.py:35 tickets/models/ticket/general.py:284
#: tickets/serializers/super_ticket.py:13
#: tickets/serializers/ticket/ticket.py:20 xpack/plugins/cloud/models.py:227
@@ -764,7 +742,7 @@ msgid "Status"
msgstr "状态"
#: accounts/models/automations/change_secret.py:51
-#: accounts/serializers/account/account.py:276
+#: accounts/serializers/account/account.py:278
#: accounts/templates/accounts/change_secret_failed_info.html:13
#: assets/const/automation.py:9
#: authentication/templates/authentication/passkey.html:173
@@ -866,6 +844,8 @@ msgstr "重复密码"
#: acls/serializers/base.py:19 acls/serializers/base.py:50 audits/models.py:189
#: authentication/forms.py:21 authentication/forms.py:23
#: authentication/models/temp_token.py:9
+#: authentication/serializers/connect_token_secret.py:43
+#: authentication/serializers/connect_token_secret.py:53
#: authentication/templates/authentication/_msg_different_city.html:9
#: authentication/templates/authentication/_msg_oauth_bind.html:9
#: authentication/templates/authentication/login.html:408
@@ -983,11 +963,11 @@ msgid "Verify asset account"
msgstr "账号验证"
#: accounts/models/base.py:37 accounts/models/base.py:66
-#: accounts/serializers/account/account.py:470
+#: accounts/serializers/account/account.py:471
#: accounts/serializers/account/base.py:17
#: accounts/serializers/automations/change_secret.py:48
#: authentication/serializers/connect_token_secret.py:42
-#: authentication/serializers/connect_token_secret.py:51
+#: authentication/serializers/connect_token_secret.py:52
#: terminal/serializers/storage.py:140
msgid "Secret type"
msgstr "密文类型"
@@ -1004,7 +984,7 @@ msgstr "密码规则"
#: accounts/models/base.py:69 assets/models/automations/base.py:28
#: assets/models/cmd_filter.py:39 assets/models/label.py:22
-#: authentication/serializers/connect_token_secret.py:117
+#: authentication/serializers/connect_token_secret.py:119
#: terminal/models/applet/applet.py:41
#: terminal/models/virtualapp/virtualapp.py:23 users/serializers/user.py:257
msgid "Is active"
@@ -1119,7 +1099,7 @@ msgstr "忽略"
msgid "Reopen"
msgstr "重新打开"
-#: accounts/risk_handlers.py:19 audits/const.py:38
+#: accounts/risk_handlers.py:19 audits/const.py:39
#: authentication/templates/authentication/_access_key_modal.html:155
#: authentication/templates/authentication/_mfa_confirm_modal.html:53
#: templates/_modal.html:22 tickets/const.py:43
@@ -1147,15 +1127,13 @@ msgstr "新增账号"
msgid "Change password and Add"
msgstr "改密并添加"
-#: accounts/risk_handlers.py:26 audits/const.py:31 ops/const.py:9
+#: accounts/risk_handlers.py:26 audits/const.py:32 ops/const.py:9
msgid "Change password"
msgstr "改密"
#: accounts/risk_handlers.py:127
-#, fuzzy
-#| msgid "Test connection failed: {}"
msgid "Execution failed: {}"
-msgstr "测试连接失败:{}"
+msgstr "执行失败:{}"
#: accounts/serializers/account/account.py:31
msgid "Push now"
@@ -1172,7 +1150,7 @@ msgstr "账号存在策略"
#: accounts/serializers/account/account.py:206 assets/models/label.py:21
#: assets/models/platform.py:95 assets/serializers/asset/common.py:145
#: assets/serializers/cagegory.py:12 assets/serializers/platform.py:173
-#: assets/serializers/platform.py:279 perms/serializers/user_permission.py:26
+#: assets/serializers/platform.py:284 perms/serializers/user_permission.py:26
#: settings/models.py:39 tickets/models/ticket/apply_application.py:13
#: users/models/preference.py:12
msgid "Category"
@@ -1183,9 +1161,9 @@ msgstr "类别"
#: assets/models/automations/base.py:146 assets/models/cmd_filter.py:74
#: assets/models/platform.py:96 assets/serializers/asset/common.py:146
#: assets/serializers/platform.py:160 assets/serializers/platform.py:172
-#: audits/serializers.py:77 audits/serializers.py:194
-#: authentication/models/connection_token.py:62
-#: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:153
+#: audits/serializers.py:76 audits/serializers.py:196
+#: authentication/models/connection_token.py:63
+#: authentication/serializers/connect_token_secret.py:128 ops/models/job.py:155
#: perms/serializers/user_permission.py:27 terminal/models/applet/applet.py:40
#: terminal/models/component/storage.py:58
#: terminal/models/component/storage.py:152 terminal/serializers/applet.py:29
@@ -1197,66 +1175,72 @@ msgstr "类别"
msgid "Type"
msgstr "类型"
-#: accounts/serializers/account/account.py:222
+#: accounts/serializers/account/account.py:223
msgid "Asset not found"
msgstr "资产不存在"
-#: accounts/serializers/account/account.py:265
+#: accounts/serializers/account/account.py:236 assets/const/category.py:15
+#: assets/models/asset/common.py:180 assets/models/asset/ds.py:14
+#: assets/serializers/asset/common.py:180
+msgid "Directory service"
+msgstr "目录服务"
+
+#: accounts/serializers/account/account.py:267
msgid "Has secret"
msgstr "已托管密码"
-#: accounts/serializers/account/account.py:275 ops/models/celery.py:84
+#: accounts/serializers/account/account.py:277 ops/models/celery.py:84
#: tickets/models/comment.py:13 tickets/models/ticket/general.py:49
#: tickets/models/ticket/general.py:280 tickets/serializers/super_ticket.py:14
msgid "State"
msgstr "状态"
-#: accounts/serializers/account/account.py:277
+#: accounts/serializers/account/account.py:279
msgid "Changed"
msgstr "已修改"
-#: accounts/serializers/account/account.py:287 acls/models/base.py:97
+#: accounts/serializers/account/account.py:289 acls/models/base.py:97
#: acls/templates/acls/asset_login_reminder.html:9
#: assets/models/automations/base.py:25
-#: assets/serializers/automations/base.py:20 assets/serializers/domain.py:34
+#: assets/serializers/automations/base.py:20 assets/serializers/domain.py:33
#: assets/serializers/platform.py:181 assets/serializers/platform.py:213
-#: authentication/api/connection_token.py:463 ops/models/base.py:17
-#: ops/models/job.py:155 ops/serializers/job.py:21
+#: authentication/api/connection_token.py:462 ops/models/base.py:17
+#: ops/models/job.py:157 ops/serializers/job.py:21
#: perms/serializers/permission.py:57
#: terminal/templates/terminal/_msg_command_execute_alert.html:16
#: xpack/plugins/cloud/manager.py:93
msgid "Assets"
msgstr "资产"
-#: accounts/serializers/account/account.py:392
+#: accounts/serializers/account/account.py:394
#, python-format
msgid "Asset does not support this secret type: %s"
msgstr "资产不支持账号类型: %s"
-#: accounts/serializers/account/account.py:424
+#: accounts/serializers/account/account.py:426
msgid "Account has exist"
msgstr "账号已存在"
-#: accounts/serializers/account/account.py:461
+#: accounts/serializers/account/account.py:463
#: accounts/serializers/account/base.py:86
#: accounts/serializers/account/template.py:66
-#: assets/serializers/asset/common.py:421
+#: assets/serializers/asset/common.py:424
msgid "Spec info"
msgstr "特殊信息"
-#: accounts/serializers/account/account.py:471
-#: authentication/serializers/connect_token_secret.py:160
+#: accounts/serializers/account/account.py:472
+#: authentication/serializers/connect_token_secret.py:162
#: authentication/templates/authentication/_access_key_modal.html:30
#: perms/models/perm_node.py:21 users/serializers/group.py:33
msgid "ID"
msgstr "ID"
-#: accounts/serializers/account/account.py:481 acls/serializers/base.py:123
+#: accounts/serializers/account/account.py:482 acls/serializers/base.py:123
#: acls/templates/acls/asset_login_reminder.html:8
#: acls/templates/acls/user_login_reminder.html:8
#: assets/models/cmd_filter.py:24 assets/models/label.py:16 audits/models.py:55
#: audits/models.py:91 audits/models.py:173 audits/models.py:272
-#: audits/serializers.py:195 authentication/models/connection_token.py:36
+#: audits/serializers.py:197 authentication/models/connection_token.py:37
#: authentication/models/ssh_key.py:22 authentication/models/sso_token.py:16
#: notifications/models/notification.py:12
#: perms/api/user_permission/mixin.py:58 perms/models/asset_permission.py:63
@@ -1273,7 +1257,7 @@ msgstr "ID"
msgid "User"
msgstr "用户"
-#: accounts/serializers/account/account.py:482
+#: accounts/serializers/account/account.py:483
#: authentication/templates/authentication/_access_key_modal.html:33
#: terminal/notifications.py:159 terminal/notifications.py:219
msgid "Date"
@@ -1291,19 +1275,19 @@ msgstr ""
"提示: 如果认证时不需要用户名,可填写为 null, 如果是 AD 账号,格式为 "
"username@domain"
-#: accounts/serializers/account/service.py:13
+#: accounts/serializers/account/service.py:14
#: authentication/serializers/token.py:22
msgid "Access IP"
msgstr "IP 白名单"
-#: accounts/serializers/account/service.py:26
+#: accounts/serializers/account/service.py:27
#: accounts/serializers/account/virtual.py:19 assets/models/cmd_filter.py:40
#: assets/models/cmd_filter.py:88 common/db/models.py:36 ops/models/adhoc.py:25
-#: ops/models/job.py:163 ops/models/playbook.py:31 rbac/models/role.py:37
+#: ops/models/job.py:165 ops/models/playbook.py:31 rbac/models/role.py:37
#: settings/models.py:42 terminal/models/applet/applet.py:46
-#: terminal/models/applet/applet.py:332 terminal/models/applet/host.py:143
-#: terminal/models/component/endpoint.py:27
-#: terminal/models/component/endpoint.py:122
+#: terminal/models/applet/applet.py:373 terminal/models/applet/host.py:143
+#: terminal/models/component/endpoint.py:28
+#: terminal/models/component/endpoint.py:116
#: terminal/models/session/session.py:49
#: terminal/models/virtualapp/virtualapp.py:28 tickets/models/comment.py:32
#: tickets/models/ticket/general.py:298 users/models/user/__init__.py:94
@@ -1311,9 +1295,9 @@ msgstr "IP 白名单"
msgid "Comment"
msgstr "备注"
-#: accounts/serializers/account/service.py:28
+#: accounts/serializers/account/service.py:29
#: accounts/templates/accounts/backup_account_report.html:33
-#: assets/serializers/asset/common.py:151
+#: assets/serializers/asset/common.py:152
msgid "Accounts amount"
msgstr "账号数量"
@@ -1624,7 +1608,7 @@ msgstr "任务名称"
#: accounts/templates/accounts/gather_account_report.html:21
#: accounts/templates/accounts/push_account_report.html:22
#: assets/models/automations/base.py:143 audits/models.py:66
-#: ops/models/base.py:55 ops/models/celery.py:89 ops/models/job.py:239
+#: ops/models/base.py:55 ops/models/celery.py:89 ops/models/job.py:241
#: ops/templates/ops/celery_task_log.html:101
#: perms/models/asset_permission.py:78 settings/serializers/feature.py:27
#: settings/templates/ldap/_msg_import_ldap_user.html:5
@@ -1674,7 +1658,7 @@ msgstr "你好! 以下是资产改密或推送账号失败的情况。 请及
#: accounts/templates/accounts/change_secret_report.html:33
#: accounts/templates/accounts/gather_account_report.html:31
#: accounts/templates/accounts/push_account_report.html:32
-#: assets/serializers/domain.py:24 assets/serializers/platform.py:182
+#: assets/serializers/domain.py:23 assets/serializers/platform.py:182
#: orgs/serializers.py:13 perms/serializers/permission.py:61
msgid "Assets amount"
msgstr "资产数量"
@@ -1713,7 +1697,6 @@ msgstr "否"
#: accounts/templates/accounts/change_secret_report.html:94
#: accounts/templates/accounts/change_secret_report.html:134
#: accounts/templates/accounts/gather_account_report.html:92
-#: accounts/templates/accounts/gather_account_report.html:132
#: accounts/templates/accounts/push_account_report.html:93
#: accounts/templates/accounts/push_account_report.html:133
msgid "No new accounts found"
@@ -1742,6 +1725,10 @@ msgstr "新发现的帐户"
msgid "Lost accounts"
msgstr "丢失的账号"
+#: accounts/templates/accounts/gather_account_report.html:132
+msgid "No lost accounts found"
+msgstr "未找到丢失的账号"
+
#: accounts/utils.py:54
msgid ""
"If the password starts with {{` and ends with }} `, then the password is not "
@@ -1756,16 +1743,16 @@ msgstr "密钥不合法或密钥密码错误"
msgid "App Acls"
msgstr "访问控制"
-#: acls/const.py:6 audits/const.py:36 terminal/const.py:11 tickets/const.py:44
+#: acls/const.py:6 audits/const.py:37 terminal/const.py:11 tickets/const.py:44
#: tickets/templates/tickets/approve_check_password.html:47
msgid "Reject"
msgstr "拒绝"
-#: acls/const.py:7 audits/const.py:33 terminal/const.py:9
+#: acls/const.py:7 audits/const.py:34 terminal/const.py:9
msgid "Accept"
msgstr "接受"
-#: acls/const.py:8 audits/const.py:34
+#: acls/const.py:8 audits/const.py:35
msgid "Review"
msgstr "审批"
@@ -1778,7 +1765,7 @@ msgid "Notify"
msgstr "通知"
#: acls/const.py:11
-msgid "Notify and warn"
+msgid "Prompt and warn"
msgstr "提示并告警"
#: acls/const.py:12
@@ -1790,18 +1777,18 @@ msgid "Face Online"
msgstr "人脸在线"
#: acls/models/base.py:37 assets/models/cmd_filter.py:76
-#: terminal/models/component/endpoint.py:115 xpack/plugins/cloud/models.py:316
+#: terminal/models/component/endpoint.py:109 xpack/plugins/cloud/models.py:316
msgid "Priority"
msgstr "优先级"
#: acls/models/base.py:38 assets/models/cmd_filter.py:76
-#: terminal/models/component/endpoint.py:116 xpack/plugins/cloud/models.py:317
+#: terminal/models/component/endpoint.py:110 xpack/plugins/cloud/models.py:317
msgid "1-100, the lower the value will be match first"
msgstr "优先级可选范围为 1-100 (数值越小越优先)"
#: acls/models/base.py:41 acls/serializers/base.py:57
-#: assets/models/cmd_filter.py:81 audits/models.py:93 audits/serializers.py:108
-#: authentication/serializers/connect_token_secret.py:119
+#: assets/models/cmd_filter.py:81 audits/models.py:93 audits/serializers.py:107
+#: authentication/serializers/connect_token_secret.py:121
#: authentication/templates/authentication/_access_key_modal.html:34
#: perms/serializers/permission.py:63 perms/serializers/permission.py:85
#: tickets/serializers/ticket/ticket.py:21
@@ -1809,7 +1796,7 @@ msgid "Action"
msgstr "动作"
#: acls/models/base.py:42 assets/models/cmd_filter.py:86
-#: authentication/serializers/connect_token_secret.py:91
+#: authentication/serializers/connect_token_secret.py:93
msgid "Reviewers"
msgstr "审批人"
@@ -1820,7 +1807,7 @@ msgid "Users"
msgstr "用户"
#: acls/models/command_acl.py:16 assets/models/cmd_filter.py:60
-#: audits/serializers.py:38 ops/serializers/job.py:92 terminal/const.py:88
+#: ops/serializers/job.py:92 terminal/const.py:88
#: terminal/models/session/session.py:45 terminal/serializers/command.py:18
#: terminal/templates/terminal/_msg_command_alert.html:12
#: terminal/templates/terminal/_msg_command_execute_alert.html:10
@@ -1849,7 +1836,7 @@ msgstr "忽略大小写"
#: acls/models/command_acl.py:33 acls/models/command_acl.py:97
#: acls/serializers/command_acl.py:29
-#: authentication/serializers/connect_token_secret.py:88
+#: authentication/serializers/connect_token_secret.py:90
#: terminal/templates/terminal/_msg_command_warning.html:14
msgid "Command group"
msgstr "命令组"
@@ -1950,7 +1937,7 @@ msgstr ""
#: authentication/templates/authentication/_msg_oauth_bind.html:12
#: authentication/templates/authentication/_msg_rest_password_success.html:8
#: authentication/templates/authentication/_msg_rest_public_key_success.html:8
-#: common/drf/renders/base.py:150 xpack/plugins/cloud/models.py:393
+#: common/drf/renders/base.py:152 xpack/plugins/cloud/models.py:393
msgid "IP"
msgstr "IP"
@@ -2008,15 +1995,15 @@ msgid "Login city"
msgstr "登录城市"
#: acls/templates/acls/user_login_reminder.html:11 audits/models.py:198
-#: audits/models.py:267 audits/serializers.py:92
+#: audits/models.py:267 audits/serializers.py:91
msgid "User agent"
msgstr "用户代理"
-#: assets/api/asset/asset.py:194
+#: assets/api/asset/asset.py:153
msgid "Cannot create asset directly, you should create a host or other"
msgstr "不能直接创建资产, 你应该创建主机或其他资产"
-#: assets/api/asset/asset.py:198
+#: assets/api/asset/asset.py:157
msgid "The number of assets exceeds the limit of 5000"
msgstr "资产数量超过了 5000 的限制"
@@ -2048,34 +2035,34 @@ msgstr "资产管理"
msgid "Task: {} finished"
msgstr "任务:{} 完成"
-#: assets/automations/base/manager.py:338
+#: assets/automations/base/manager.py:339
msgid " - Platform {} ansible disabled"
msgstr " - 平台 {} Ansible 已禁用, 无法执行任务"
-#: assets/automations/base/manager.py:524
+#: assets/automations/base/manager.py:525
msgid ">>> Task preparation phase"
msgstr ">>> 任务准备阶段"
-#: assets/automations/base/manager.py:528
+#: assets/automations/base/manager.py:529
#, python-brace-format
msgid ">>> Executing tasks in batches, total {runner_count}"
msgstr ">>> 分次执行任务,总共 {runner_count}"
-#: assets/automations/base/manager.py:533
+#: assets/automations/base/manager.py:534
msgid ">>> Start executing tasks"
msgstr ">>> 开始执行任务"
-#: assets/automations/base/manager.py:535
+#: assets/automations/base/manager.py:536
msgid ">>> No tasks need to be executed"
msgstr ">>> 没有需要执行的任务"
-#: assets/automations/base/manager.py:539
+#: assets/automations/base/manager.py:540
#, python-brace-format
msgid ">>> Begin executing batch {index} of tasks"
msgstr ">>> 开始执行第 {index} 批任务"
#: assets/automations/ping_gateway/manager.py:33
-#: authentication/models/connection_token.py:145
+#: authentication/models/connection_token.py:176
msgid "No account"
msgstr "没有账号"
@@ -2102,7 +2089,7 @@ msgstr "连接失败"
msgid ">>> Start executing the task to test gateway connectivity"
msgstr ">>> 开始执行测试网关可连接性任务"
-#: assets/const/automation.py:6 audits/const.py:6 audits/const.py:47
+#: assets/const/automation.py:6 audits/const.py:6 audits/const.py:48
#: audits/signal_handlers/activity_log.py:63 common/utils/ip/geoip/utils.py:31
#: common/utils/ip/geoip/utils.py:37 common/utils/ip/utils.py:104
msgid "Unknown"
@@ -2128,7 +2115,7 @@ msgstr "测试网关"
msgid "Gather facts"
msgstr "收集资产信息"
-#: assets/const/base.py:32 audits/const.py:58
+#: assets/const/base.py:32 audits/const.py:59
#: terminal/serializers/applet_host.py:32 users/models/user/_auth.py:31
msgid "Disabled"
msgstr "禁用"
@@ -2162,12 +2149,12 @@ msgid "Cloud service"
msgstr "云服务"
#: assets/const/category.py:14 assets/models/asset/gpt.py:11
-#: assets/models/asset/web.py:16 audits/const.py:45
+#: assets/models/asset/web.py:16 audits/const.py:46
#: terminal/models/applet/applet.py:28 users/const.py:76
msgid "Web"
msgstr "Web"
-#: assets/const/category.py:15 common/sdk/sms/endpoint.py:20
+#: assets/const/category.py:16 common/sdk/sms/endpoint.py:20
msgid "Custom type"
msgstr "自定义类型"
@@ -2203,8 +2190,8 @@ msgstr ""
msgid "TP-Link"
msgstr ""
-#: assets/const/device.py:12 terminal/models/applet/applet.py:27
-#: tickets/const.py:9
+#: assets/const/device.py:12 assets/const/ds.py:7
+#: terminal/models/applet/applet.py:27 tickets/const.py:9
msgid "General"
msgstr "一般"
@@ -2220,6 +2207,10 @@ msgstr "路由器"
msgid "Firewall"
msgstr "防火墙"
+#: assets/const/ds.py:10
+msgid "Windows Active Directory"
+msgstr ""
+
#: assets/const/gpt.py:7
msgid "ChatGPT"
msgstr "ChatGPT"
@@ -2270,7 +2261,7 @@ msgid "Any"
msgstr "任意"
#: assets/const/protocol.py:88 rbac/tree.py:62
-#: settings/serializers/security.py:241
+#: settings/serializers/security.py:245
msgid "Security"
msgstr "安全"
@@ -2343,7 +2334,7 @@ msgstr "认证数据库"
msgid "The database to authenticate against"
msgstr "要进行身份验证的数据库"
-#: assets/const/protocol.py:232 authentication/models/connection_token.py:47
+#: assets/const/protocol.py:232 authentication/models/connection_token.py:48
msgid "Connect options"
msgstr "连接项"
@@ -2387,7 +2378,7 @@ msgstr "确认按钮选择器"
msgid "API mode"
msgstr "API 模式"
-#: assets/const/types.py:249
+#: assets/const/types.py:252
msgid "All types"
msgstr "所有类型"
@@ -2410,15 +2401,15 @@ msgstr "云服务"
msgid "Port"
msgstr "端口"
-#: assets/models/asset/common.py:167 assets/serializers/asset/common.py:172
+#: assets/models/asset/common.py:167 assets/serializers/asset/common.py:174
#: settings/serializers/terminal.py:10
msgid "Address"
msgstr "地址"
-#: assets/models/asset/common.py:169 assets/models/platform.py:149
+#: assets/models/asset/common.py:169 assets/models/platform.py:155
#: assets/serializers/asset/common.py:150
#: authentication/backends/passkey/models.py:12
-#: authentication/serializers/connect_token_secret.py:118
+#: authentication/serializers/connect_token_secret.py:120
#: perms/serializers/user_permission.py:25 xpack/plugins/cloud/models.py:387
msgid "Platform"
msgstr "平台"
@@ -2427,34 +2418,34 @@ msgstr "平台"
msgid "Zone"
msgstr "网域"
-#: assets/models/asset/common.py:176 assets/serializers/asset/common.py:174
+#: assets/models/asset/common.py:176 assets/serializers/asset/common.py:176
#: assets/serializers/automations/base.py:21 ops/serializers/job.py:22
#: perms/serializers/permission.py:58
msgid "Nodes"
msgstr "节点"
-#: assets/models/asset/common.py:179 assets/serializers/asset/common.py:422
+#: assets/models/asset/common.py:183 assets/serializers/asset/common.py:425
#: assets/serializers/asset/host.py:11
msgid "Gathered info"
msgstr "收集资产硬件信息"
-#: assets/models/asset/common.py:180 assets/serializers/asset/custom.py:14
+#: assets/models/asset/common.py:184 assets/serializers/asset/custom.py:14
msgid "Custom info"
msgstr "自定义属性"
-#: assets/models/asset/common.py:369
+#: assets/models/asset/common.py:431
msgid "Can refresh asset hardware info"
msgstr "可以更新资产硬件信息"
-#: assets/models/asset/common.py:370
+#: assets/models/asset/common.py:432
msgid "Can test asset connectivity"
msgstr "可以测试资产连接性"
-#: assets/models/asset/common.py:371
+#: assets/models/asset/common.py:433
msgid "Can match asset"
msgstr "可以匹配资产"
-#: assets/models/asset/common.py:372
+#: assets/models/asset/common.py:434
msgid "Can change asset nodes"
msgstr "可以修改资产节点"
@@ -2482,19 +2473,23 @@ msgstr "忽略证书校验"
msgid "Postgresql SSL mode"
msgstr "PostgreSQL SSL 模式"
+#: assets/models/asset/ds.py:10 assets/serializers/asset/ds.py:20
+msgid "Domain name"
+msgstr "域名称"
+
#: assets/models/asset/gpt.py:8 settings/serializers/feature.py:139
#: settings/serializers/feature.py:154
msgid "Proxy"
msgstr "代理"
#: assets/models/automations/base.py:23 assets/models/cmd_filter.py:32
-#: assets/models/node.py:553 ops/models/job.py:156
+#: assets/models/node.py:553 ops/models/job.py:158
#: perms/models/asset_permission.py:72 tickets/models/ticket/apply_asset.py:15
#: xpack/plugins/cloud/models.py:388
msgid "Node"
msgstr "节点"
-#: assets/models/automations/base.py:29 ops/models/job.py:234
+#: assets/models/automations/base.py:29 ops/models/job.py:236
#: ops/serializers/job.py:24 settings/serializers/auth/sms.py:108
msgid "Parameters"
msgstr "参数"
@@ -2514,7 +2509,7 @@ msgstr "资产自动化任务"
# msgid "Comment"
# msgstr "备注"
#: assets/models/automations/base.py:140 assets/models/cmd_filter.py:41
-#: common/db/models.py:34 ops/models/base.py:54 ops/models/job.py:238
+#: common/db/models.py:34 ops/models/base.py:54 ops/models/job.py:240
#: users/models/user/__init__.py:317
msgid "Date created"
msgstr "创建日期"
@@ -2525,14 +2520,14 @@ msgstr "创建日期"
msgid "Trigger mode"
msgstr "触发模式"
-#: assets/models/automations/base.py:157 audits/serializers.py:39
-#: ops/models/base.py:52 ops/models/job.py:236
+#: assets/models/automations/base.py:157 audits/serializers.py:38
+#: ops/models/base.py:52 ops/models/job.py:238
#: xpack/plugins/cloud/manager.py:103
msgid "Summary"
msgstr "汇总"
#: assets/models/automations/base.py:158 ops/models/base.py:51
-#: ops/models/job.py:235 xpack/plugins/cloud/models.py:225
+#: ops/models/job.py:237 xpack/plugins/cloud/models.py:225
msgid "Result"
msgstr "结果"
@@ -2596,7 +2591,7 @@ msgstr "命令过滤规则"
msgid "Favorite asset"
msgstr "收藏的资产"
-#: assets/models/gateway.py:34 assets/serializers/domain.py:19
+#: assets/models/gateway.py:34 assets/serializers/domain.py:18
msgid "Gateway"
msgstr "网关"
@@ -2607,8 +2602,8 @@ msgstr "系统"
#: assets/models/label.py:19 assets/models/node.py:539
#: assets/serializers/cagegory.py:11 assets/serializers/cagegory.py:18
#: assets/serializers/cagegory.py:24
-#: authentication/models/connection_token.py:33
-#: authentication/serializers/connect_token_secret.py:125
+#: authentication/models/connection_token.py:34
+#: authentication/serializers/connect_token_secret.py:127
#: common/serializers/common.py:86 labels/models.py:12 settings/models.py:38
#: users/models/preference.py:13
msgid "Value"
@@ -2617,7 +2612,7 @@ msgstr "值"
#: assets/models/label.py:40 assets/serializers/cagegory.py:10
#: assets/serializers/cagegory.py:17 assets/serializers/cagegory.py:23
#: assets/serializers/platform.py:159
-#: authentication/serializers/connect_token_secret.py:124
+#: authentication/serializers/connect_token_secret.py:126
#: common/serializers/common.py:85 labels/serializers.py:45
#: settings/serializers/msg.py:90 xpack/plugins/cloud/models.py:392
msgid "Label"
@@ -2683,7 +2678,7 @@ msgstr "开放的"
msgid "Setting"
msgstr "设置"
-#: assets/models/platform.py:38 audits/const.py:59
+#: assets/models/platform.py:38 audits/const.py:60
#: authentication/backends/passkey/models.py:11 settings/models.py:41
#: terminal/serializers/applet_host.py:33 users/models/user/_auth.py:32
msgid "Enabled"
@@ -2783,15 +2778,19 @@ msgstr "编码"
msgid "Gateway enabled"
msgstr "启用网域"
-#: assets/models/platform.py:106 assets/serializers/platform.py:202
+#: assets/models/platform.py:105
+msgid "DS enabled"
+msgstr "目录服务已启用"
+
+#: assets/models/platform.py:107 assets/serializers/platform.py:202
msgid "Su enabled"
msgstr "启用账号切换"
-#: assets/models/platform.py:107 assets/serializers/platform.py:177
+#: assets/models/platform.py:108 assets/serializers/platform.py:177
msgid "Su method"
msgstr "账号切换方式"
-#: assets/models/platform.py:108 assets/serializers/platform.py:180
+#: assets/models/platform.py:109 assets/serializers/platform.py:180
msgid "Custom fields"
msgstr "自定义属性"
@@ -2830,36 +2829,36 @@ msgstr "节点路径,格式为 [\"/组织/节点名\"], 如果节点不存在
#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:174
#: authentication/serializers/connect_token_secret.py:30
-#: authentication/serializers/connect_token_secret.py:75
+#: authentication/serializers/connect_token_secret.py:77
#: perms/models/asset_permission.py:76 perms/serializers/permission.py:67
-#: perms/serializers/user_permission.py:74 xpack/plugins/cloud/models.py:390
+#: perms/serializers/user_permission.py:75 xpack/plugins/cloud/models.py:390
#: xpack/plugins/cloud/serializers/task.py:36
msgid "Protocols"
msgstr "协议组"
#: assets/serializers/asset/common.py:149
-#: assets/serializers/asset/common.py:173
+#: assets/serializers/asset/common.py:175
msgid "Node path"
msgstr "节点路径"
-#: assets/serializers/asset/common.py:170
-#: assets/serializers/asset/common.py:423
+#: assets/serializers/asset/common.py:172
+#: assets/serializers/asset/common.py:426
msgid "Auto info"
msgstr "自动化信息"
-#: assets/serializers/asset/common.py:268
+#: assets/serializers/asset/common.py:271
msgid "Platform not exist"
msgstr "平台不存在"
-#: assets/serializers/asset/common.py:304
+#: assets/serializers/asset/common.py:307
msgid "port out of range (0-65535)"
msgstr "端口超出范围 (0-65535)"
-#: assets/serializers/asset/common.py:311
+#: assets/serializers/asset/common.py:314
msgid "Protocol is required: {}"
msgstr "协议是必填的: {}"
-#: assets/serializers/asset/common.py:350
+#: assets/serializers/asset/common.py:353
msgid "Invalid data"
msgstr "无效的数据"
@@ -2884,6 +2883,14 @@ msgstr ""
"Verify Full:我希望我的数据被加密,我接受开销。我想确保我连接到我信任的服务"
"器,并且它是我指定的服务器。"
+#: assets/serializers/asset/ds.py:18
+msgid ""
+"The domain part used by the directory service (e.g., AD) and appended to the "
+"username during login, such as example.com in user@example.com."
+msgstr ""
+"域名(Domain Name) 用于目录服务(如 AD)登录时附加在用户名后的域名部分,例"
+"如 user@example.com 中的 example.com"
+
#: assets/serializers/asset/gpt.py:20
msgid ""
"If the server cannot directly connect to the API address, you need set up an "
@@ -2938,7 +2945,7 @@ msgid "Disk total"
msgstr "硬盘大小"
#: assets/serializers/asset/info/gathered.py:16
-#: authentication/serializers/connect_token_secret.py:115
+#: authentication/serializers/connect_token_secret.py:117
msgid "OS"
msgstr "操作系统"
@@ -2962,7 +2969,7 @@ msgstr "约束"
msgid "Types"
msgstr "类型"
-#: assets/serializers/domain.py:21
+#: assets/serializers/domain.py:20
msgid ""
"A gateway is a network proxy for a zone, and when connecting assets within "
"the zone, the connection is routed through the gateway."
@@ -3077,11 +3084,11 @@ msgstr "资产可以使用区域网关进行连接"
msgid "Default Domain"
msgstr "默认网域"
-#: assets/serializers/platform.py:234
+#: assets/serializers/platform.py:239
msgid "type is required"
msgstr "类型 该字段是必填项。"
-#: assets/serializers/platform.py:249
+#: assets/serializers/platform.py:254
msgid "Protocols is required"
msgstr "协议是必填的"
@@ -3239,7 +3246,7 @@ msgstr "重命名"
msgid "Symlink"
msgstr "建立软链接"
-#: audits/const.py:18 audits/const.py:28
+#: audits/const.py:18 audits/const.py:29
#: ops/templates/ops/celery_task_log.html:86
#: terminal/api/session/session.py:154
msgid "Download"
@@ -3262,56 +3269,60 @@ msgstr "查看"
msgid "Create"
msgstr "创建"
-#: audits/const.py:29
+#: audits/const.py:27 templates/_csv_import_export.html:8
+msgid "Export"
+msgstr "导出"
+
+#: audits/const.py:30
msgid "Connect"
msgstr "连接"
-#: audits/const.py:30 authentication/templates/authentication/login.html:329
+#: audits/const.py:31 authentication/templates/authentication/login.html:329
#: authentication/templates/authentication/login.html:401
#: templates/_header_bar.html:101
msgid "Login"
msgstr "登录"
-#: audits/const.py:35 rbac/tree.py:56
+#: audits/const.py:36 rbac/tree.py:56
msgid "Notifications"
msgstr "通知"
-#: audits/const.py:37 tickets/const.py:45
+#: audits/const.py:38 tickets/const.py:45
msgid "Approve"
msgstr "同意"
-#: audits/const.py:41 ops/models/celery.py:85
+#: audits/const.py:42 ops/models/celery.py:85
#: terminal/models/session/sharing.py:128 tickets/const.py:25
#: xpack/plugins/cloud/const.py:67
msgid "Finished"
msgstr "结束"
-#: audits/const.py:46 settings/serializers/terminal.py:6
+#: audits/const.py:47 settings/serializers/terminal.py:6
#: terminal/models/applet/host.py:26 terminal/models/component/terminal.py:185
#: terminal/models/virtualapp/provider.py:14 terminal/serializers/session.py:57
#: terminal/serializers/session.py:113
msgid "Terminal"
msgstr "终端"
-#: audits/const.py:51 audits/models.py:133
+#: audits/const.py:52 audits/models.py:133
msgid "Operate log"
msgstr "操作日志"
-#: audits/const.py:52
+#: audits/const.py:53
msgid "Session log"
msgstr "会话日志"
-#: audits/const.py:53
+#: audits/const.py:54
msgid "Login log"
msgstr "登录日志"
-#: audits/const.py:54 rbac/tree.py:64 terminal/models/applet/host.py:144
+#: audits/const.py:55 rbac/tree.py:64 terminal/models/applet/host.py:144
#: terminal/models/component/task.py:22
#: xpack/plugins/cloud/serializers/account.py:77
msgid "Task"
msgstr "任务"
-#: audits/const.py:60
+#: audits/const.py:61
msgid "-"
msgstr "-"
@@ -3329,7 +3340,7 @@ msgstr "作业审计日志"
msgid "Remote addr"
msgstr "远端地址"
-#: audits/models.py:62 audits/serializers.py:62
+#: audits/models.py:62 audits/serializers.py:61
msgid "Operate"
msgstr "操作"
@@ -3354,17 +3365,17 @@ msgstr "会话"
msgid "File transfer log"
msgstr "文件传输"
-#: audits/models.py:95 audits/serializers.py:110
+#: audits/models.py:95 audits/serializers.py:109
msgid "Resource Type"
msgstr "资源类型"
#: audits/models.py:96 audits/models.py:99 audits/models.py:145
-#: audits/serializers.py:109 labels/serializers.py:46
+#: audits/serializers.py:108 labels/serializers.py:46
msgid "Resource"
msgstr "资源"
#: audits/models.py:102 audits/models.py:148 audits/models.py:178
-#: audits/models.py:314 audits/serializers.py:230
+#: audits/models.py:314 audits/serializers.py:232
#: terminal/serializers/command.py:75
msgid "Datetime"
msgstr "日期"
@@ -3398,7 +3409,7 @@ msgstr "登录方式"
msgid "Login IP"
msgstr "登录 IP"
-#: audits/models.py:201 audits/serializers.py:76
+#: audits/models.py:201 audits/serializers.py:75
#: authentication/templates/authentication/_mfa_confirm_modal.html:14
#: users/forms/profile.py:64 users/models/user/__init__.py:82
#: users/serializers/profile.py:71
@@ -3449,37 +3460,37 @@ msgid "Application ID"
msgstr "应用 ID"
#: audits/serializers.py:33 ops/models/adhoc.py:24 ops/models/base.py:16
-#: ops/models/base.py:53 ops/models/celery.py:87 ops/models/job.py:154
-#: ops/models/job.py:237 ops/models/playbook.py:30 ops/models/variable.py:17
+#: ops/models/base.py:53 ops/models/celery.py:87 ops/models/job.py:156
+#: ops/models/job.py:239 ops/models/playbook.py:30 ops/models/variable.py:17
#: terminal/models/session/sharing.py:25
msgid "Creator"
msgstr "创建者"
-#: audits/serializers.py:40 ops/serializers/celery.py:33
+#: audits/serializers.py:39 ops/serializers/celery.py:33
msgid "Execution cycle"
msgstr "周期执行"
-#: audits/serializers.py:93
+#: audits/serializers.py:92
msgid "Reason display"
msgstr "原因描述"
-#: audits/serializers.py:94 audits/serializers.py:208
+#: audits/serializers.py:93 audits/serializers.py:210
msgid "Auth backend display"
msgstr "认证方式"
-#: audits/serializers.py:158
+#: audits/serializers.py:157
#, python-format
msgid "%s %s this resource"
msgstr "用户 %s %s 了当前资源"
-#: audits/serializers.py:196 authentication/models/connection_token.py:51
+#: audits/serializers.py:198 authentication/models/connection_token.py:52
#: authentication/models/temp_token.py:13 perms/models/asset_permission.py:80
#: tickets/models/ticket/apply_application.py:31
#: tickets/models/ticket/apply_asset.py:21 users/models/user/__init__.py:101
msgid "Date expired"
msgstr "失效日期"
-#: audits/serializers.py:227 terminal/models/component/terminal.py:91
+#: audits/serializers.py:229 terminal/models/component/terminal.py:91
#: terminal/serializers/command.py:76
msgid "Remote Address"
msgstr "远端地址"
@@ -3594,39 +3605,39 @@ msgstr "参数中的值必须包含 %s"
msgid "This action require verify your MFA"
msgstr "该操作需要验证您的 MFA, 请先开启并配置"
-#: authentication/api/connection_token.py:303
+#: authentication/api/connection_token.py:304
msgid "Reusable connection token is not allowed, global setting not enabled"
msgstr "不允许使用可重复使用的连接令牌,未启用全局设置"
-#: authentication/api/connection_token.py:423
+#: authentication/api/connection_token.py:424
msgid "Anonymous account is not supported for this asset"
msgstr "匿名账号不支持当前资产"
-#: authentication/api/connection_token.py:455
+#: authentication/api/connection_token.py:454
msgid "Permission expired"
msgstr "授权已过期"
-#: authentication/api/connection_token.py:488
+#: authentication/api/connection_token.py:487
msgid "ACL action is reject: {}({})"
msgstr "ACL 动作是拒绝: {}({})"
-#: authentication/api/connection_token.py:492
+#: authentication/api/connection_token.py:491
msgid "ACL action is review"
msgstr "ACL 动作是复核"
-#: authentication/api/connection_token.py:502
+#: authentication/api/connection_token.py:501
msgid "ACL action is face verify"
msgstr "ACL 动作是人脸验证"
-#: authentication/api/connection_token.py:507
+#: authentication/api/connection_token.py:506
msgid "ACL action not supported for this asset"
msgstr "资产登录规则不支持当前资产"
-#: authentication/api/connection_token.py:514
+#: authentication/api/connection_token.py:513
msgid "ACL action is face online"
msgstr "ACL 动作是人脸在线"
-#: authentication/api/connection_token.py:533
+#: authentication/api/connection_token.py:532
msgid "No available face feature"
msgstr "没有可用的人脸特征"
@@ -3743,16 +3754,16 @@ msgstr "虚拟 MFA"
msgid "SMS"
msgstr "短信"
-#: authentication/const.py:34
+#: authentication/const.py:35
msgid "Face Recognition"
msgstr "人脸识别"
-#: authentication/const.py:35 settings/serializers/auth/radius.py:14
+#: authentication/const.py:36 settings/serializers/auth/radius.py:14
#: settings/serializers/auth/radius.py:16
msgid "Radius"
msgstr "Radius"
-#: authentication/const.py:36
+#: authentication/const.py:37
msgid "Custom"
msgstr "自定义"
@@ -3938,7 +3949,9 @@ msgstr "MFA 类型"
msgid "Captcha"
msgstr "验证码"
-#: authentication/forms.py:66 users/forms/profile.py:28
+#: authentication/forms.py:66 authentication/mfa/email.py:41
+#: authentication/templates/authentication/_msg_mfa_email_code.html:12
+#: users/forms/profile.py:28
msgid "MFA code"
msgstr "MFA 验证码"
@@ -3968,6 +3981,14 @@ msgstr "自定义 MFA 验证码"
msgid "MFA custom global enabled, cannot disable"
msgstr "自定义 MFA 全局开启,无法被禁用"
+#: authentication/mfa/email.py:11
+msgid "Email verify code invalid"
+msgstr "邮件验证码校验失败"
+
+#: authentication/mfa/email.py:17
+msgid "Email verification code"
+msgstr "邮件验证码"
+
#: authentication/mfa/face.py:55
msgid "Bind face to enable"
msgstr "绑定人脸特征以启用"
@@ -4016,7 +4037,7 @@ msgstr "设置手机号码启用"
msgid "Clear phone number to disable"
msgstr "清空手机号码禁用"
-#: authentication/middleware.py:95 settings/utils/ldap.py:691
+#: authentication/middleware.py:95 settings/utils/ldap.py:711
msgid "Authentication failed (before login check failed): {}"
msgstr "认证失败 (登录前检查失败): {}"
@@ -4038,22 +4059,22 @@ msgstr "该 MFA ({}) 方式没有启用"
msgid "Please change your password"
msgstr "请修改密码"
-#: authentication/models/connection_token.py:42
+#: authentication/models/connection_token.py:43
#: terminal/serializers/storage.py:114
msgid "Account name"
msgstr "账号名称"
-#: authentication/models/connection_token.py:43
+#: authentication/models/connection_token.py:44
msgid "Input username"
msgstr "自定义用户名"
-#: authentication/models/connection_token.py:44
+#: authentication/models/connection_token.py:45
#: authentication/serializers/connection_token.py:18
msgid "Input secret"
msgstr "自定义密码"
-#: authentication/models/connection_token.py:45
-#: authentication/serializers/connect_token_secret.py:114
+#: authentication/models/connection_token.py:46
+#: authentication/serializers/connect_token_secret.py:116
#: settings/serializers/msg.py:28 terminal/models/applet/applet.py:43
#: terminal/models/virtualapp/virtualapp.py:24
#: terminal/serializers/session.py:23 terminal/serializers/session.py:50
@@ -4061,69 +4082,69 @@ msgstr "自定义密码"
msgid "Protocol"
msgstr "协议"
-#: authentication/models/connection_token.py:46
+#: authentication/models/connection_token.py:47
msgid "Connect method"
msgstr "连接方式"
-#: authentication/models/connection_token.py:48
+#: authentication/models/connection_token.py:49
msgid "User display"
msgstr "用户名称"
-#: authentication/models/connection_token.py:49
+#: authentication/models/connection_token.py:50
msgid "Asset display"
msgstr "资产名称"
-#: authentication/models/connection_token.py:50
+#: authentication/models/connection_token.py:51
msgid "Reusable"
msgstr "可以重复使用"
-#: authentication/models/connection_token.py:55
+#: authentication/models/connection_token.py:56
#: perms/models/asset_permission.py:83
msgid "From ticket"
msgstr "来自工单"
-#: authentication/models/connection_token.py:57
+#: authentication/models/connection_token.py:58
msgid "Face monitor token"
msgstr "人脸监控令牌"
-#: authentication/models/connection_token.py:68
+#: authentication/models/connection_token.py:69
msgid "Can expire connection token"
msgstr "可以失效连接令牌"
-#: authentication/models/connection_token.py:69
+#: authentication/models/connection_token.py:70
msgid "Can reuse connection token"
msgstr "可以复用连接令牌"
-#: authentication/models/connection_token.py:71
+#: authentication/models/connection_token.py:72
msgid "Connection token"
msgstr "连接令牌"
-#: authentication/models/connection_token.py:132
+#: authentication/models/connection_token.py:163
msgid "Connection token inactive"
msgstr "连接令牌未激活"
-#: authentication/models/connection_token.py:136
+#: authentication/models/connection_token.py:167
msgid "Connection token expired at: {}"
msgstr "连接令牌过期: {}"
-#: authentication/models/connection_token.py:139
+#: authentication/models/connection_token.py:170
#: terminal/serializers/session.py:95
msgid "No user or invalid user"
msgstr "没有用户或用户失效"
-#: authentication/models/connection_token.py:142
+#: authentication/models/connection_token.py:173
msgid "No asset or inactive asset"
msgstr "没有资产或资产未激活"
-#: authentication/models/connection_token.py:290
+#: authentication/models/connection_token.py:341
msgid "Can view super connection token secret"
msgstr "可以查看超级连接令牌密文"
-#: authentication/models/connection_token.py:292
+#: authentication/models/connection_token.py:343
msgid "Super connection token"
msgstr "超级连接令牌"
-#: authentication/models/connection_token.py:309
+#: authentication/models/connection_token.py:360
msgid "Admin connection token"
msgstr "管理员连接令牌"
@@ -4137,7 +4158,7 @@ msgstr "私有令牌"
msgid "Private key"
msgstr "ssh私钥"
-#: authentication/models/ssh_key.py:18 settings/serializers/terminal.py:34
+#: authentication/models/ssh_key.py:18 settings/serializers/terminal.py:38
#: users/forms/profile.py:175 users/models/user/__init__.py:92
#: xpack/plugins/cloud/serializers/account_attrs.py:211
msgid "Public key"
@@ -4163,39 +4184,39 @@ msgstr "异地登录提醒"
msgid "binding reminder"
msgstr "绑定提醒"
-#: authentication/serializers/connect_token_secret.py:116
+#: authentication/serializers/connect_token_secret.py:118
msgid "Is builtin"
msgstr "内置的"
-#: authentication/serializers/connect_token_secret.py:120
+#: authentication/serializers/connect_token_secret.py:122
msgid "Options"
msgstr "选项"
-#: authentication/serializers/connect_token_secret.py:127
+#: authentication/serializers/connect_token_secret.py:129
#: ops/notifications.py:19 rbac/tree.py:60
msgid "Component"
msgstr "组件"
-#: authentication/serializers/connect_token_secret.py:136
+#: authentication/serializers/connect_token_secret.py:138
#: perms/serializers/user_permission.py:28 xpack/plugins/cloud/models.py:389
msgid "Domain"
msgstr "网域"
-#: authentication/serializers/connect_token_secret.py:138
+#: authentication/serializers/connect_token_secret.py:140
msgid "Expired now"
msgstr "立刻过期"
-#: authentication/serializers/connect_token_secret.py:171
+#: authentication/serializers/connect_token_secret.py:173
#: terminal/models/virtualapp/virtualapp.py:25
msgid "Image name"
msgstr "镜像名称"
-#: authentication/serializers/connect_token_secret.py:172
+#: authentication/serializers/connect_token_secret.py:174
#: terminal/models/virtualapp/virtualapp.py:27
msgid "Image port"
msgstr "镜像端口"
-#: authentication/serializers/connect_token_secret.py:173
+#: authentication/serializers/connect_token_secret.py:175
#: terminal/models/virtualapp/virtualapp.py:26
msgid "Image protocol"
msgstr "镜像协议"
@@ -4250,7 +4271,7 @@ msgid ""
msgstr "创建完成后请下载私钥,每个私钥只有一次下载机会"
#: authentication/serializers/ssh_key.py:57 users/forms/profile.py:164
-#: users/serializers/profile.py:134 users/serializers/profile.py:161
+#: users/serializers/profile.py:142 users/serializers/profile.py:169
msgid "Not a valid ssh public key"
msgstr "SSH密钥不合法"
@@ -4287,12 +4308,14 @@ msgid "Show"
msgstr "显示"
#: authentication/templates/authentication/_access_key_modal.html:66
-#: users/const.py:42 users/templates/users/user_verify_mfa.html:36
+#: settings/serializers/terminal.py:24 users/const.py:42
+#: users/templates/users/user_verify_mfa.html:36
msgid "Disable"
msgstr "禁用"
#: authentication/templates/authentication/_access_key_modal.html:67
-#: users/const.py:43 users/templates/users/mfa_setting.html:120
+#: settings/serializers/terminal.py:24 users/const.py:43
+#: users/templates/users/mfa_setting.html:120
#: users/templates/users/mfa_setting.html:158
#: users/templates/users/mfa_setting.html:177
msgid "Enable"
@@ -4326,10 +4349,11 @@ msgid "Code error"
msgstr "代码错误"
#: authentication/templates/authentication/_msg_different_city.html:3
+#: authentication/templates/authentication/_msg_mfa_email_code.html:9
#: authentication/templates/authentication/_msg_oauth_bind.html:3
#: authentication/templates/authentication/_msg_reset_password.html:3
#: authentication/templates/authentication/_msg_reset_password_code.html:9
-#: jumpserver/conf.py:539
+#: jumpserver/conf.py:540
#: perms/templates/perms/_msg_item_permissions_expire.html:3
#: tickets/templates/tickets/approve_check_password.html:32
#: users/templates/users/_msg_account_expire_reminder.html:4
@@ -4348,6 +4372,11 @@ msgid ""
"account password in time."
msgstr "若怀疑此次登录行为异常,请及时修改账号密码"
+#: authentication/templates/authentication/_msg_mfa_email_code.html:15
+#: authentication/templates/authentication/_msg_reset_password_code.html:18
+msgid "The validity period of the verification code is one minute"
+msgstr "验证码有效期为 1 分钟"
+
#: authentication/templates/authentication/_msg_oauth_bind.html:6
msgid "Your account has just been bound to"
msgstr "您的帐户刚刚绑定到"
@@ -4394,10 +4423,6 @@ msgid ""
"Copy the verification code to the Reset Password page to reset the password."
msgstr "将验证码复制到重置密码页面,重置密码。"
-#: authentication/templates/authentication/_msg_reset_password_code.html:18
-msgid "The validity period of the verification code is one minute"
-msgstr "验证码有效期为 1 分钟"
-
#: authentication/templates/authentication/_msg_rest_password_success.html:5
msgid "Your password has just been successfully updated"
msgstr "你的密码刚刚成功更新"
@@ -4818,75 +4843,91 @@ msgstr "解析文件错误: {}"
msgid "Invalid excel file"
msgstr "无效的 excel 文件"
-#: common/drf/renders/base.py:138
+#: common/drf/renders/base.py:140
msgid "Yes/No"
msgstr "是/否"
-#: common/drf/renders/base.py:141
+#: common/drf/renders/base.py:143
msgid "Text, max length {}"
msgstr "文本,最大长度 {}"
-#: common/drf/renders/base.py:143
+#: common/drf/renders/base.py:145
msgid "Long text, no length limit"
msgstr "长文本,无长度限制"
-#: common/drf/renders/base.py:145
+#: common/drf/renders/base.py:147
msgid "Number, min {} max {}"
msgstr "数字,最小 {} 最大 {}"
-#: common/drf/renders/base.py:148
+#: common/drf/renders/base.py:150
msgid "Datetime format {}"
msgstr "日期时间格式 {}"
-#: common/drf/renders/base.py:154
+#: common/drf/renders/base.py:156
msgid ""
"Choices, format name(value), name is optional for human read, value is "
"requisite, options {}"
msgstr "选项,格式: 名称(值),名称是可选的,方便阅读,值是必填的,可选项有 {}"
-#: common/drf/renders/base.py:157
+#: common/drf/renders/base.py:159
msgid "Choices, options {}"
msgstr "选项,可选项有 {}"
-#: common/drf/renders/base.py:159
+#: common/drf/renders/base.py:161
msgid "Phone number, format +8612345678901"
msgstr "手机号,格式 +8612345678901"
-#: common/drf/renders/base.py:161
+#: common/drf/renders/base.py:163
msgid "Label, format [\"key:value\"]"
msgstr "标签,格式: [\"键:值\"]"
-#: common/drf/renders/base.py:163
+#: common/drf/renders/base.py:165
msgid ""
"Object, format name(id), name is optional for human read, id is requisite"
msgstr "关联项,格式: 名称(id), 名称是可选的,方便阅读,id 是必填的"
-#: common/drf/renders/base.py:165
+#: common/drf/renders/base.py:167
msgid "Object, format id"
msgstr "关联项,格式是 id"
-#: common/drf/renders/base.py:169
+#: common/drf/renders/base.py:171
msgid ""
"Objects, format [\"name(id)\", ...], name is optional for human read, id is "
"requisite"
msgstr ""
"多关联项,格式: [\"名称(id)\", ...], 名称是可选的,方便阅读,id 是必填的"
-#: common/drf/renders/base.py:171
+#: common/drf/renders/base.py:173
msgid ""
"Labels, format [\"key:value\", ...], if label not exists, will create it"
msgstr "标签,格式: [\"键:值\", ...], 如果标签不存在,将创建它"
-#: common/drf/renders/base.py:173
+#: common/drf/renders/base.py:175
msgid "Objects, format [\"id\", ...]"
msgstr "多关联项,格式是 [\"id\", ...]"
-#: common/drf/renders/base.py:271
+#: common/drf/renders/base.py:275
msgid ""
"{} - The encryption password has not been set - please go to personal "
"information -> file encryption password to set the encryption password"
msgstr "{} - 未设置加密密码 - 请前往个人信息 -> 文件加密密码中设置加密密码"
+#: common/drf/renders/mixins.py:37 labels/serializers.py:22
+msgid "Resource count"
+msgstr "资源数量"
+
+#: common/drf/renders/mixins.py:46
+msgid "Export all"
+msgstr "导出所有"
+
+#: common/drf/renders/mixins.py:48
+msgid "Export only selected items"
+msgstr "仅导出选择项"
+
+#: common/drf/renders/mixins.py:50
+msgid "Export filtered"
+msgstr "导出搜素"
+
#: common/exceptions.py:15 xpack/plugins/cloud/ws.py:37
#, python-format
msgid "%s object does not exist."
@@ -4916,15 +4957,15 @@ msgstr "此操作需要确认当前用户"
msgid "Unexpect error occur"
msgstr "发生意外错误"
-#: common/plugins/es.py:35
+#: common/plugins/es.py:36
msgid "Invalid elasticsearch config"
msgstr "无效的 Elasticsearch 配置"
-#: common/plugins/es.py:40
+#: common/plugins/es.py:41
msgid "Not Support Elasticsearch8"
msgstr "不支持 Elasticsearch8"
-#: common/plugins/es.py:46
+#: common/plugins/es.py:47
msgid ""
"Connection failed: Self-signed certificate used. Please check server "
"certificate configuration"
@@ -5114,16 +5155,16 @@ msgstr "未找到 Code"
msgid "The message code provided is invalid or has expired"
msgstr "提供的消息代码无效或已过期"
-#: jumpserver/conf.py:533
+#: jumpserver/conf.py:534
#, python-brace-format
msgid "The verification code is: {code}"
msgstr "验证码为: {code}"
-#: jumpserver/conf.py:538
+#: jumpserver/conf.py:539
msgid "Create account successfully"
msgstr "创建账号成功"
-#: jumpserver/conf.py:540
+#: jumpserver/conf.py:541
msgid "Your account has been created successfully"
msgstr "你的账号已创建成功"
@@ -5178,10 +5219,6 @@ msgstr "资源 ID"
msgid "Tagged resource"
msgstr "关联的资源"
-#: labels/serializers.py:22
-msgid "Resource count"
-msgstr "资源数量"
-
#: labels/serializers.py:28
msgid "Cannot contain \":,\""
msgstr "不能包含\":,\""
@@ -5225,22 +5262,19 @@ msgid ""
" work orders, and other notifications"
msgstr "系统一些告警,工单等需要发送站内信时执行该任务"
-#: ops/ansible/inventory.py:117 ops/models/job.py:68
+#: ops/ansible/inventory.py:126 ops/ansible/inventory.py:196
+#: ops/models/job.py:69
msgid "No account available"
msgstr "无可用账号"
-#: ops/ansible/inventory.py:298
+#: ops/ansible/inventory.py:318 ops/ansible/inventory.py:360
msgid "Ansible disabled"
msgstr "Ansible 已禁用"
-#: ops/ansible/inventory.py:314
+#: ops/ansible/inventory.py:376
msgid "Skip hosts below:"
msgstr "跳过以下主机: "
-#: ops/api/adhoc.py:32
-msgid "Deleting other people's script is not allowed"
-msgstr "不允许删除别人的脚本"
-
#: ops/api/celery.py:66 ops/api/celery.py:81
msgid "Waiting task start"
msgstr "等待任务开始"
@@ -5253,67 +5287,63 @@ msgstr "任务 {} 不存在"
msgid "Task {} args or kwargs error"
msgstr "任务 {} 执行参数错误"
-#: ops/api/job.py:68
+#: ops/api/job.py:70
#, python-brace-format
msgid ""
"Asset ({asset}) must have at least one of the following protocols added: "
"SSH, SFTP, or WinRM"
msgstr "资产({asset})至少要添加ssh,sftp,winrm其中一种协议"
-#: ops/api/job.py:69
+#: ops/api/job.py:71
#, python-brace-format
msgid "Asset ({asset}) authorization is missing SSH, SFTP, or WinRM protocol"
msgstr "资产({asset})授权缺少ssh,sftp或winrm协议"
-#: ops/api/job.py:70
+#: ops/api/job.py:72
#, python-brace-format
msgid "Asset ({asset}) authorization lacks upload permissions"
msgstr "资产({asset})授权缺少上传权限"
-#: ops/api/job.py:158
+#: ops/api/job.py:160
msgid "Duplicate file exists"
msgstr "存在同名文件"
-#: ops/api/job.py:163
+#: ops/api/job.py:165
#, python-brace-format
msgid ""
"File size exceeds maximum limit. Please select a file smaller than {limit}MB"
msgstr "文件大小超过最大限制。请选择小于 {limit}MB 的文件。"
-#: ops/api/job.py:236
+#: ops/api/job.py:238
msgid ""
"The task is being created and cannot be interrupted. Please try again later."
msgstr "正在创建任务,无法中断,请稍后重试。"
#: ops/api/playbook.py:49
-msgid "Deleting other people's playbook is not allowed"
-msgstr "不允许删除别人的playbook"
-
-#: ops/api/playbook.py:55
msgid "Currently playbook is being used in a job"
msgstr "当前 playbook 正在作业中使用"
-#: ops/api/playbook.py:128
+#: ops/api/playbook.py:122
msgid "Unsupported file content"
msgstr "不支持的文件内容"
-#: ops/api/playbook.py:130 ops/api/playbook.py:176 ops/api/playbook.py:224
+#: ops/api/playbook.py:124 ops/api/playbook.py:170 ops/api/playbook.py:218
msgid "Invalid file path"
msgstr "无效的文件路径"
-#: ops/api/playbook.py:202
+#: ops/api/playbook.py:196
msgid "This file can not be rename"
msgstr "该文件不能重命名"
-#: ops/api/playbook.py:221
+#: ops/api/playbook.py:215
msgid "File already exists"
msgstr "文件已存在"
-#: ops/api/playbook.py:239
+#: ops/api/playbook.py:233
msgid "File key is required"
msgstr "文件密钥该字段是必填项。"
-#: ops/api/playbook.py:242
+#: ops/api/playbook.py:236
msgid "This file can not be delete"
msgstr "无法删除此文件"
@@ -5362,7 +5392,7 @@ msgstr "VCS"
msgid "Adhoc"
msgstr "命令"
-#: ops/const.py:39 ops/models/job.py:152 ops/models/playbook.py:89
+#: ops/const.py:39 ops/models/job.py:154 ops/models/playbook.py:89
#: ops/models/variable.py:23
msgid "Playbook"
msgstr "Playbook"
@@ -5449,17 +5479,17 @@ msgid "no valid program entry found."
msgstr "没有可用程序入口"
#: ops/mixin.py:34 ops/mixin.py:166 settings/serializers/auth/ldap.py:74
-#: settings/serializers/auth/ldap_ha.py:57
+#: settings/serializers/auth/ldap_ha.py:56
msgid "Periodic run"
msgstr "周期执行"
#: ops/mixin.py:36 ops/mixin.py:113 ops/mixin.py:172
-#: settings/serializers/auth/ldap.py:81 settings/serializers/auth/ldap_ha.py:64
+#: settings/serializers/auth/ldap.py:81 settings/serializers/auth/ldap_ha.py:63
msgid "Interval"
msgstr "间隔"
#: ops/mixin.py:39 ops/mixin.py:111 ops/mixin.py:169
-#: settings/serializers/auth/ldap.py:78 settings/serializers/auth/ldap_ha.py:61
+#: settings/serializers/auth/ldap.py:78 settings/serializers/auth/ldap_ha.py:60
msgid "Crontab"
msgstr "Crontab"
@@ -5483,7 +5513,11 @@ msgstr "执行周期"
msgid "* Please enter a valid crontab expression"
msgstr "* 请输入有效的 crontab 表达式"
-#: ops/mixin.py:204 settings/serializers/auth/mixin.py:12
+#: ops/mixin.py:194
+msgid "Crontab minute must not contain '*'"
+msgstr ""
+
+#: ops/mixin.py:208 settings/serializers/auth/mixin.py:12
msgid "Require interval or crontab setting"
msgstr "需要周期或定期设置"
@@ -5491,11 +5525,11 @@ msgstr "需要周期或定期设置"
msgid "Pattern"
msgstr "模式"
-#: ops/models/adhoc.py:22 ops/models/job.py:149
+#: ops/models/adhoc.py:22 ops/models/job.py:151
msgid "Module"
msgstr "模块"
-#: ops/models/adhoc.py:23 ops/models/celery.py:82 ops/models/job.py:147
+#: ops/models/adhoc.py:23 ops/models/celery.py:82 ops/models/job.py:149
#: terminal/models/component/task.py:14
msgid "Args"
msgstr "内容"
@@ -5538,48 +5572,52 @@ msgstr "发布日期"
msgid "Celery Task Execution"
msgstr "Celery 任务执行"
-#: ops/models/job.py:150
+#: ops/models/job.py:82
+msgid "Module {} is not suitable for this asset"
+msgstr "模块 {} 不适用于此资产"
+
+#: ops/models/job.py:152
msgid "Run dir"
msgstr "运行目录"
-#: ops/models/job.py:151
+#: ops/models/job.py:153
msgid "Timeout (Seconds)"
msgstr "超时时间 (秒)"
-#: ops/models/job.py:157
+#: ops/models/job.py:159
msgid "Use Parameter Define"
msgstr "使用参数定义"
-#: ops/models/job.py:158
+#: ops/models/job.py:160
msgid "Parameters define"
msgstr "参数定义"
-#: ops/models/job.py:159
+#: ops/models/job.py:161
msgid "Periodic variable"
msgstr "周期执行变量"
-#: ops/models/job.py:160
+#: ops/models/job.py:162
msgid "Run as"
msgstr "运行用户"
-#: ops/models/job.py:162
+#: ops/models/job.py:164
msgid "Run as policy"
msgstr "用户策略"
-#: ops/models/job.py:219 ops/models/variable.py:28 ops/serializers/job.py:111
+#: ops/models/job.py:221 ops/models/variable.py:28 ops/serializers/job.py:111
#: terminal/notifications.py:182
msgid "Job"
msgstr "作业"
-#: ops/models/job.py:242
+#: ops/models/job.py:244
msgid "Material"
msgstr "Material"
-#: ops/models/job.py:244
+#: ops/models/job.py:246
msgid "Material Type"
msgstr "Material 类型"
-#: ops/models/job.py:556
+#: ops/models/job.py:558
msgid "Job Execution"
msgstr "作业执行"
@@ -5875,7 +5913,7 @@ msgid "Can not delete virtual org"
msgstr "无法删除虚拟组织"
#: orgs/serializers.py:10 perms/serializers/permission.py:59
-#: rbac/serializers/role.py:27 users/serializers/group.py:54
+#: rbac/serializers/role.py:27 users/serializers/group.py:53
msgid "Users amount"
msgstr "用户数量"
@@ -6229,7 +6267,7 @@ msgid "Storage"
msgstr "存储"
#: rbac/tree.py:61 terminal/models/applet/applet.py:53
-#: terminal/models/applet/applet.py:328 terminal/models/applet/host.py:30
+#: terminal/models/applet/applet.py:369 terminal/models/applet/host.py:30
#: terminal/serializers/applet.py:15
msgid "Applet"
msgstr "远程应用"
@@ -6482,7 +6520,7 @@ msgid "CAS"
msgstr "CAS"
#: settings/serializers/auth/cas.py:15 settings/serializers/auth/ldap.py:45
-#: settings/serializers/auth/ldap_ha.py:28 settings/serializers/auth/oidc.py:61
+#: settings/serializers/auth/ldap_ha.py:27 settings/serializers/auth/oidc.py:61
msgid "Server"
msgstr "服务端地址"
@@ -6509,7 +6547,7 @@ msgstr "启用属性映射"
#: settings/serializers/auth/cas.py:34 settings/serializers/auth/dingtalk.py:18
#: settings/serializers/auth/feishu.py:18 settings/serializers/auth/lark.py:17
-#: settings/serializers/auth/ldap.py:67 settings/serializers/auth/ldap_ha.py:50
+#: settings/serializers/auth/ldap.py:67 settings/serializers/auth/ldap_ha.py:49
#: settings/serializers/auth/oauth2.py:60 settings/serializers/auth/oidc.py:39
#: settings/serializers/auth/saml2.py:35 settings/serializers/auth/slack.py:18
#: settings/serializers/auth/wecom.py:18
@@ -6566,7 +6604,7 @@ msgstr ""
"用户属性映射,其中 `key` 是 JumpServer 用户属性名称,`value` 是 Lark 服务用户"
"属性名称"
-#: settings/serializers/auth/ldap.py:42 settings/serializers/auth/ldap.py:104
+#: settings/serializers/auth/ldap.py:42 settings/serializers/auth/ldap.py:108
msgid "LDAP"
msgstr "LDAP"
@@ -6574,38 +6612,38 @@ msgstr "LDAP"
msgid "LDAP server URI"
msgstr "LDAP 服务域名"
-#: settings/serializers/auth/ldap.py:49 settings/serializers/auth/ldap_ha.py:32
+#: settings/serializers/auth/ldap.py:49 settings/serializers/auth/ldap_ha.py:31
msgid "Bind DN"
msgstr "绑定 DN"
-#: settings/serializers/auth/ldap.py:50 settings/serializers/auth/ldap_ha.py:33
+#: settings/serializers/auth/ldap.py:50 settings/serializers/auth/ldap_ha.py:32
msgid "Binding Distinguished Name"
msgstr "绑定目录管理员"
-#: settings/serializers/auth/ldap.py:54 settings/serializers/auth/ldap_ha.py:37
+#: settings/serializers/auth/ldap.py:54 settings/serializers/auth/ldap_ha.py:36
msgid "Binding password"
msgstr "绑定密码"
-#: settings/serializers/auth/ldap.py:57 settings/serializers/auth/ldap_ha.py:40
+#: settings/serializers/auth/ldap.py:57 settings/serializers/auth/ldap_ha.py:39
msgid "Search OU"
msgstr "用户 OU"
-#: settings/serializers/auth/ldap.py:59 settings/serializers/auth/ldap_ha.py:42
+#: settings/serializers/auth/ldap.py:59 settings/serializers/auth/ldap_ha.py:41
msgid ""
"User Search Base, if there are multiple OUs, you can separate them with the "
"`|` symbol"
msgstr "用户搜索库,如果有多个OU,可以用`|`符号分隔"
-#: settings/serializers/auth/ldap.py:63 settings/serializers/auth/ldap_ha.py:46
+#: settings/serializers/auth/ldap.py:63 settings/serializers/auth/ldap_ha.py:45
msgid "Search filter"
msgstr "用户过滤器"
-#: settings/serializers/auth/ldap.py:64 settings/serializers/auth/ldap_ha.py:47
+#: settings/serializers/auth/ldap.py:64 settings/serializers/auth/ldap_ha.py:46
#, python-format
msgid "Selection could include (cn|uid|sAMAccountName=%(user)s)"
msgstr "可能的选项是(cn或uid或sAMAccountName=%(user)s)"
-#: settings/serializers/auth/ldap.py:69 settings/serializers/auth/ldap_ha.py:52
+#: settings/serializers/auth/ldap.py:69 settings/serializers/auth/ldap_ha.py:51
msgid ""
"User attribute mapping, where the `key` is the JumpServer user attribute "
"name and the `value` is the LDAP service user attribute name"
@@ -6613,15 +6651,25 @@ msgstr ""
"用户属性映射,其中 `key` 是 JumpServer 用户属性名称,`value` 是 LDAP 服务用户"
"属性名称"
-#: settings/serializers/auth/ldap.py:85 settings/serializers/auth/ldap_ha.py:68
+#: settings/serializers/auth/ldap.py:85 settings/serializers/auth/ldap_ha.py:67
msgid "Connect timeout (s)"
msgstr "连接超时时间 (秒)"
-#: settings/serializers/auth/ldap.py:90 settings/serializers/auth/ldap_ha.py:73
+#: settings/serializers/auth/ldap.py:88 settings/serializers/auth/ldap_ha.py:70
+msgid "Strict sync"
+msgstr "严格模式"
+
+#: settings/serializers/auth/ldap.py:89 settings/serializers/auth/ldap_ha.py:71
+msgid ""
+"In strict mode, users not found in LDAP will be disabled during full or "
+"automatic sync"
+msgstr "启用严格模式后,全量或自动同步将禁用系统中未在 LDAP 中发现的用户"
+
+#: settings/serializers/auth/ldap.py:94 settings/serializers/auth/ldap_ha.py:76
msgid "User DN cache timeout (s)"
msgstr "User DN 缓存超时时间 (秒)"
-#: settings/serializers/auth/ldap.py:92
+#: settings/serializers/auth/ldap.py:96
msgid ""
"Caching the User DN obtained during user login authentication can "
"effectively improve the speed of user authentication., 0 means no "
@@ -6631,20 +6679,21 @@ msgstr ""
"对用户登录认证时查询出的 User DN 进行缓存,可以有效提高用户认证的速度
如果"
"用户 OU 架构有调整,点击提交即可清除用户 DN 缓存"
-#: settings/serializers/auth/ldap.py:98 settings/serializers/auth/ldap_ha.py:81
+#: settings/serializers/auth/ldap.py:102
+#: settings/serializers/auth/ldap_ha.py:84
msgid "Search paged size (piece)"
msgstr "搜索分页数量 (条)"
-#: settings/serializers/auth/ldap_ha.py:25
-#: settings/serializers/auth/ldap_ha.py:87
+#: settings/serializers/auth/ldap_ha.py:24
+#: settings/serializers/auth/ldap_ha.py:90
msgid "LDAP HA"
msgstr "LDAP 认证"
-#: settings/serializers/auth/ldap_ha.py:29
+#: settings/serializers/auth/ldap_ha.py:28
msgid "LDAP HA server URI"
msgstr "LDAP HA 服务域名"
-#: settings/serializers/auth/ldap_ha.py:75
+#: settings/serializers/auth/ldap_ha.py:78
msgid ""
"Caching the User DN obtained during user login authentication can "
"effectivelyimprove the speed of user authentication., 0 means no cache
If "
@@ -7454,45 +7503,53 @@ msgstr "第三方认证开启 MFA"
msgid "The third-party login modes include OIDC, CAS, and SAML2"
msgstr "第三方登录方式包括: OIDC、CAS、SAML2"
-#: settings/serializers/security.py:128
+#: settings/serializers/security.py:129
+msgid "MFA via Email"
+msgstr "邮件验证 MFA"
+
+#: settings/serializers/security.py:130
+msgid "Email as a method for multi-factor authentication"
+msgstr "将电子邮件作为多因子认证的一种方式"
+
+#: settings/serializers/security.py:133
msgid "OTP issuer name"
msgstr "OTP 扫描后的名称"
-#: settings/serializers/security.py:132
+#: settings/serializers/security.py:137
msgid "OTP valid window"
msgstr "OTP 延迟有效次数"
-#: settings/serializers/security.py:136
+#: settings/serializers/security.py:141
msgid "MFA verify TTL"
msgstr "MFA 校验有效期"
-#: settings/serializers/security.py:138
+#: settings/serializers/security.py:143
msgid ""
"Unit: second, The verification MFA takes effect only when you view the "
"account password"
msgstr "单位:秒,目前仅在查看账号密码校验 MFA 时生效"
-#: settings/serializers/security.py:143
+#: settings/serializers/security.py:148
msgid "MFA in login page"
msgstr "MFA 在登录页面输入"
-#: settings/serializers/security.py:144
+#: settings/serializers/security.py:149
msgid "Eu security regulations(GDPR) require MFA to be on the login page"
msgstr "欧盟数据安全法规(GDPR) 要求 MFA 在登录页面,来确保系统登录安全"
-#: settings/serializers/security.py:148
+#: settings/serializers/security.py:153
msgid "Verify code TTL (second)"
msgstr "验证码有效时间 (分)"
-#: settings/serializers/security.py:149
+#: settings/serializers/security.py:154
msgid "Reset password and send SMS code expiration time"
msgstr "重置密码的验证码及发送短信的验证码过期时间"
-#: settings/serializers/security.py:153
+#: settings/serializers/security.py:158
msgid "Login dynamic code"
msgstr "启用登录附加码"
-#: settings/serializers/security.py:154
+#: settings/serializers/security.py:159
msgid ""
"The password and additional code are sent to a third party authentication "
"system for verification"
@@ -7500,19 +7557,19 @@ msgstr ""
"密码和附加码一并发送给第三方认证系统进行校验, 如:有的第三方认证系统,需要 密"
"码+6位数字 完成认证"
-#: settings/serializers/security.py:158
+#: settings/serializers/security.py:163
msgid "Login captcha"
msgstr "启用登录验证码"
-#: settings/serializers/security.py:159
+#: settings/serializers/security.py:164
msgid "Enable captcha to prevent robot authentication"
msgstr "开启验证码,防止机器人登录"
-#: settings/serializers/security.py:162
+#: settings/serializers/security.py:167
msgid "Suspicious Login Verification"
msgstr "异地登录通知"
-#: settings/serializers/security.py:164
+#: settings/serializers/security.py:169
msgid ""
"The system determines whether the login IP address belongs to a common login "
"city. If the account is logged in from a common login city, the system sends "
@@ -7521,81 +7578,77 @@ msgstr ""
"根据登录 IP 是否所属常用登录城市进行判断,若账号在非常用城市登录,会发送异地"
"登录提醒"
-#: settings/serializers/security.py:170
+#: settings/serializers/security.py:175
msgid "Auto Disable Threshold (day)"
msgstr "不活跃用户自动禁用 (天)"
-#: settings/serializers/security.py:171
+#: settings/serializers/security.py:176
msgid ""
"Detect infrequent users daily and disable them if they exceed the "
"predetermined time limit"
msgstr "每天检测一次,超过预设时间的用户自动禁用"
-#: settings/serializers/security.py:191
+#: settings/serializers/security.py:196
msgid "Watermark"
msgstr "开启水印"
-#: settings/serializers/security.py:192
-msgid "Enabled, the web session and replay contains watermark information"
-msgstr "启用后,Web 会话和录像将包含水印信息"
-
-#: settings/serializers/security.py:196
+#: settings/serializers/security.py:200
msgid "Max idle time (minute)"
msgstr "连接最大空闲时间 (分)"
-#: settings/serializers/security.py:197
+#: settings/serializers/security.py:201
msgid "If idle time more than it, disconnect connection."
msgstr "提示:如果超过该配置没有操作,连接会被断开"
-#: settings/serializers/security.py:200
+#: settings/serializers/security.py:204
msgid "Session expire at browser closed"
msgstr "会话在浏览器关闭时过期"
-#: settings/serializers/security.py:201
+#: settings/serializers/security.py:205
msgid "Whether to expire the session when the user closes their browser."
msgstr "当用户关闭浏览器时是否使会话过期。"
-#: settings/serializers/security.py:206
+#: settings/serializers/security.py:210
msgid "Allow users to view asset session information"
msgstr "允许用户查看资产在线会话信息"
-#: settings/serializers/security.py:208
+#: settings/serializers/security.py:212
msgid ""
"When a user connects to an asset, the account selection popup displays the "
"number of active sessions for the current asset (RDP protocol only)."
msgstr ""
"当用户连接资产时,账号选择弹窗中显示当前资产的在线会话数量(仅 rdp 协议)"
-#: settings/serializers/security.py:214
+#: settings/serializers/security.py:218
msgid "Max online time (hour)"
msgstr "会话连接最大时间 (时)"
-#: settings/serializers/security.py:215
+#: settings/serializers/security.py:219
msgid "If session connection time more than it, disconnect connection."
msgstr "提示:如果会话连接超过该配置,连接会被断开"
-#: settings/serializers/security.py:218
+#: settings/serializers/security.py:222
msgid "Remember manual auth"
msgstr "保存手动输入密码"
-#: settings/serializers/security.py:221
+#: settings/serializers/security.py:225
#: terminal/templates/terminal/_msg_session_sharing.html:10
msgid "Session share"
msgstr "会话分享"
-#: settings/serializers/security.py:222
+#: settings/serializers/security.py:226
msgid "Enabled, Allows user active session to be shared with other users"
msgstr "开启后允许用户分享已连接的资产会话给他人,协同工作"
-#: settings/serializers/security.py:228
+#: settings/serializers/security.py:232
msgid "Insecure command alert"
msgstr "危险命令告警"
-#: settings/serializers/security.py:231
+#: settings/serializers/security.py:235
msgid "Email recipient"
msgstr "邮件收件人"
-#: settings/serializers/security.py:232
+#: settings/serializers/security.py:236
msgid "Multiple user using , split"
msgstr "多个用户,使用 , 分割"
@@ -7608,22 +7661,26 @@ msgstr "[%s] %s"
msgid "Auto"
msgstr "自动"
-#: settings/serializers/terminal.py:22
+#: settings/serializers/terminal.py:23
+msgid "Auto(Enabled for the first 5 minutes after startup, then disabled.)"
+msgstr "自动(启动后前 5 分钟启用,然后禁用。)"
+
+#: settings/serializers/terminal.py:26
msgid "Registration"
msgstr "组件注册"
-#: settings/serializers/terminal.py:24
+#: settings/serializers/terminal.py:28
msgid ""
"Allow component register, after all component setup, you should disable this "
"for security"
msgstr "是否允许组件注册,当所有终端启动后,为了安全应该关闭"
-#: settings/serializers/terminal.py:30
+#: settings/serializers/terminal.py:34
msgid ""
"* Allow users to log in to the KoKo component via password authentication"
msgstr "* 允许用户通过密码验证登录KoKo组件"
-#: settings/serializers/terminal.py:36
+#: settings/serializers/terminal.py:40
msgid ""
"* Allow users to log in to the KoKo component via Public key "
"authentication
If third-party authentication services, such as AD/LDAP, "
@@ -7633,15 +7690,15 @@ msgstr ""
"* 允许用户通过公钥认证方式登录 KoKo 组件
如果第三方认证服务(如 AD/LDAP)"
"已启用,则应禁用此选项,以防止用户从 AD/LDAP 服务器中删除后再次登录"
-#: settings/serializers/terminal.py:43
+#: settings/serializers/terminal.py:47
msgid "Asset sorting"
msgstr "资产列表排序"
-#: settings/serializers/terminal.py:46
+#: settings/serializers/terminal.py:50
msgid "Asset page size"
msgstr "资产列表每页数量"
-#: settings/serializers/terminal.py:51
+#: settings/serializers/terminal.py:55
msgid ""
"* You can individually configure the service address and port in the service "
"endpoint
If enabled, the Luna page will display the DB client launch "
@@ -7650,7 +7707,7 @@ msgstr ""
"* 您可以在服务端点中单独配置服务地址和端口
如果启用,Luna 页面将在连接资"
"产时显示 DB 客户端启动方法"
-#: settings/serializers/terminal.py:59
+#: settings/serializers/terminal.py:63
msgid ""
"* You can individually configure the service address and port in the service "
"endpoint
If enabled, the Luna page will display the download rdp file "
@@ -7659,11 +7716,11 @@ msgstr ""
"* 您可以在服务端点中单独配置服务地址和端口
如果启用,Luna 页面将在连接资"
"产时显示下载 rdp 文件按钮和 RDP 客户端启动方法"
-#: settings/serializers/terminal.py:66
+#: settings/serializers/terminal.py:70
msgid "Client connection"
msgstr "客户端连接"
-#: settings/serializers/terminal.py:68
+#: settings/serializers/terminal.py:72
msgid ""
"* Allow connecting to the KoKo component via SSH client
If enabled, the "
"Luna page will display the SSH client launch method when connecting to assets"
@@ -7685,25 +7742,25 @@ msgid ""
"in the workbench"
msgstr "*! 如果启用,具有 RBAC 权限的用户将能够使用工作台中的所有工具"
-#: settings/tasks/ldap.py:73
+#: settings/tasks/ldap.py:67
msgid "Periodic import ldap user"
msgstr "周期导入 LDAP 用户"
-#: settings/tasks/ldap.py:75 settings/tasks/ldap.py:85
+#: settings/tasks/ldap.py:69 settings/tasks/ldap.py:79
msgid ""
"When LDAP auto-sync is configured, this task will be invoked to synchronize "
"users"
msgstr "当设置了LDAP自动同步,将调用该任务进行用户同步"
-#: settings/tasks/ldap.py:83
+#: settings/tasks/ldap.py:77
msgid "Periodic import ldap ha user"
msgstr "周期导入 LDAP HA 用户"
-#: settings/tasks/ldap.py:120
+#: settings/tasks/ldap.py:115
msgid "Registration periodic import ldap user task"
msgstr "注册周期导入 LDAP 用户 任务"
-#: settings/tasks/ldap.py:122
+#: settings/tasks/ldap.py:117
msgid ""
"When LDAP auto-sync parameters change, such as Crontab parameters, the LDAP "
"sync task \n"
@@ -7712,11 +7769,11 @@ msgstr ""
"当设置了LDAP自动同步参数发生变化时,比如Crontab参数,重新注册或更新ldap同步任"
"务将调用该任务"
-#: settings/tasks/ldap.py:136
+#: settings/tasks/ldap.py:131
msgid "Registration periodic import ldap ha user task"
msgstr "注册周期导入 LDAP HA 用户 任务"
-#: settings/tasks/ldap.py:138
+#: settings/tasks/ldap.py:133
msgid ""
"When LDAP HA auto-sync parameters change, such as Crontab parameters, the "
"LDAP HA sync task \n"
@@ -7741,114 +7798,114 @@ msgstr "已同步用户"
msgid "No user synchronization required"
msgstr "没有用户需要同步"
-#: settings/utils/ldap.py:509
+#: settings/utils/ldap.py:529
msgid "ldap:// or ldaps:// protocol is used."
msgstr "使用 ldap:// 或 ldaps:// 协议"
-#: settings/utils/ldap.py:520
+#: settings/utils/ldap.py:540
msgid "Host or port is disconnected: {}"
msgstr "主机或端口不可连接: {}"
-#: settings/utils/ldap.py:522
+#: settings/utils/ldap.py:542
msgid "The port is not the port of the LDAP service: {}"
msgstr "端口不是LDAP服务端口: {}"
-#: settings/utils/ldap.py:524
+#: settings/utils/ldap.py:544
msgid "Please add certificate: {}"
msgstr "请添加证书"
-#: settings/utils/ldap.py:528 settings/utils/ldap.py:555
-#: settings/utils/ldap.py:585 settings/utils/ldap.py:613
+#: settings/utils/ldap.py:548 settings/utils/ldap.py:575
+#: settings/utils/ldap.py:605 settings/utils/ldap.py:633
msgid "Unknown error: {}"
msgstr "未知错误: {}"
-#: settings/utils/ldap.py:542
+#: settings/utils/ldap.py:562
msgid "Bind DN or Password incorrect"
msgstr "绑定DN或密码错误"
-#: settings/utils/ldap.py:549
+#: settings/utils/ldap.py:569
msgid "Please enter Bind DN: {}"
msgstr "请输入绑定DN: {}"
-#: settings/utils/ldap.py:551
+#: settings/utils/ldap.py:571
msgid "Please enter Password: {}"
msgstr "请输入密码: {}"
-#: settings/utils/ldap.py:553
+#: settings/utils/ldap.py:573
msgid "Please enter correct Bind DN and Password: {}"
msgstr "请输入正确的绑定DN和密码: {}"
-#: settings/utils/ldap.py:571
+#: settings/utils/ldap.py:591
msgid "Invalid User OU or User search filter: {}"
msgstr "不合法的用户OU或用户过滤器: {}"
-#: settings/utils/ldap.py:602
+#: settings/utils/ldap.py:622
msgid "LDAP User attr map not include: {}"
msgstr "LDAP属性映射没有包含: {}"
-#: settings/utils/ldap.py:609
+#: settings/utils/ldap.py:629
msgid "LDAP User attr map is not dict"
msgstr "LDAP属性映射不合法"
-#: settings/utils/ldap.py:628
+#: settings/utils/ldap.py:648
msgid "LDAP authentication is not enabled"
msgstr "LDAP认证没有启用"
-#: settings/utils/ldap.py:646
+#: settings/utils/ldap.py:666
msgid "Error (Invalid LDAP server): {}"
msgstr "错误 (不合法的LDAP服务器地址): {}"
-#: settings/utils/ldap.py:648
+#: settings/utils/ldap.py:668
msgid "Error (Invalid Bind DN): {}"
msgstr "错误 (不合法的绑定DN): {}"
-#: settings/utils/ldap.py:650
+#: settings/utils/ldap.py:670
msgid "Error (Invalid LDAP User attr map): {}"
msgstr "错误 (不合法的LDAP属性映射): {}"
-#: settings/utils/ldap.py:652
+#: settings/utils/ldap.py:672
msgid "Error (Invalid User OU or User search filter): {}"
msgstr "错误 (不合法的用户OU或用户过滤器): {}"
-#: settings/utils/ldap.py:654
+#: settings/utils/ldap.py:674
msgid "Error (Not enabled LDAP authentication): {}"
msgstr "错误 (没有启用LDAP认证): {}"
-#: settings/utils/ldap.py:656
+#: settings/utils/ldap.py:676
msgid "Error (Unknown): {}"
msgstr "错误 (未知): {}"
-#: settings/utils/ldap.py:659
+#: settings/utils/ldap.py:679
msgid "Succeed: Match {} users"
msgstr "成功匹配 {} 个用户"
-#: settings/utils/ldap.py:689
+#: settings/utils/ldap.py:709
msgid "Authentication failed (configuration incorrect): {}"
msgstr "认证失败 (配置错误): {}"
-#: settings/utils/ldap.py:693
+#: settings/utils/ldap.py:713
msgid "Authentication failed (username or password incorrect): {}"
msgstr "认证失败 (用户名或密码不正确): {}"
-#: settings/utils/ldap.py:695
+#: settings/utils/ldap.py:715
msgid "Authentication failed (Unknown): {}"
msgstr "认证失败: (未知): {}"
-#: settings/utils/ldap.py:698
+#: settings/utils/ldap.py:718
msgid "Authentication success: {}"
msgstr "认证成功: {}"
-#: settings/ws.py:222
+#: settings/ws.py:223
msgid "No LDAP user was found"
msgstr "没有获取到 LDAP 用户"
-#: settings/ws.py:228
+#: settings/ws.py:232
msgid "Total {}, success {}, failure {}"
msgstr "总共 {},成功 {},失败 {}"
-#: templates/_csv_import_export.html:8
-msgid "Export"
-msgstr "导出"
+#: settings/ws.py:236
+msgid ", disabled {}"
+msgstr ", 禁用 {}"
#: templates/_csv_import_export.html:13 templates/_csv_import_modal.html:5
#: xpack/plugins/cloud/const.py:65
@@ -8062,7 +8119,7 @@ msgstr "测试成功"
msgid "Test failure: Please check configuration"
msgstr "测试失败:请检查配置"
-#: terminal/api/component/terminal.py:57
+#: terminal/api/component/terminal.py:56
msgid "Have online sessions"
msgstr "有在线会话"
@@ -8242,7 +8299,7 @@ msgstr "版本"
msgid "Can concurrent"
msgstr "可以并发"
-#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:179
+#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:194
#: terminal/serializers/storage.py:193
msgid "Hosts"
msgstr "主机"
@@ -8264,12 +8321,12 @@ msgstr "只支持自定义平台"
msgid "Missing type in platform.yml"
msgstr "在 platform.yml 中缺少类型"
-#: terminal/models/applet/applet.py:330 terminal/models/applet/host.py:36
+#: terminal/models/applet/applet.py:371 terminal/models/applet/host.py:36
#: terminal/models/applet/host.py:138
msgid "Hosting"
msgstr "宿主机"
-#: terminal/models/applet/applet.py:336
+#: terminal/models/applet/applet.py:377
msgid "Applet Publication"
msgstr "应用发布"
@@ -8346,18 +8403,22 @@ msgid "SQLServer port"
msgstr "SQLServer 端口"
#: terminal/models/component/endpoint.py:25
+msgid "Oracle port"
+msgstr "Oracle 端口"
+
+#: terminal/models/component/endpoint.py:26
msgid "VNC port"
msgstr "VNC 端口"
-#: terminal/models/component/endpoint.py:33
-#: terminal/models/component/endpoint.py:120
-#: terminal/serializers/endpoint.py:80 terminal/serializers/storage.py:41
+#: terminal/models/component/endpoint.py:34
+#: terminal/models/component/endpoint.py:114
+#: terminal/serializers/endpoint.py:61 terminal/serializers/storage.py:41
#: terminal/serializers/storage.py:53 terminal/serializers/storage.py:83
#: terminal/serializers/storage.py:93 terminal/serializers/storage.py:101
msgid "Endpoint"
msgstr "端点"
-#: terminal/models/component/endpoint.py:126
+#: terminal/models/component/endpoint.py:120
msgid "Endpoint rule"
msgstr "端点规则"
@@ -8564,7 +8625,7 @@ msgid "Command and replay storage"
msgstr "命令及录像存储"
#: terminal/notifications.py:258 terminal/tasks.py:212
-#: xpack/plugins/cloud/api.py:160
+#: xpack/plugins/cloud/api.py:175
#: xpack/plugins/cloud/serializers/account.py:121
#: xpack/plugins/cloud/serializers/account.py:123
msgid "Test failure: Account invalid"
@@ -8702,15 +8763,15 @@ msgstr ""
"优先使用同名账号连接发布机。为了安全,需配置文件中开启配置 "
"CACHE_LOGIN_PASSWORD_ENABLED=true, 修改后重启服务"
-#: terminal/serializers/applet_host.py:149
+#: terminal/serializers/applet_host.py:164
msgid "Install applets"
msgstr "安装应用"
-#: terminal/serializers/applet_host.py:179
+#: terminal/serializers/applet_host.py:194
msgid "Host ID"
msgstr "主机 ID"
-#: terminal/serializers/applet_host.py:180
+#: terminal/serializers/applet_host.py:195
msgid "Applet ID"
msgstr "远程应用 ID"
@@ -8738,23 +8799,7 @@ msgstr "无效的 Session ID"
msgid "Timestamp"
msgstr "时间戳"
-#: terminal/serializers/endpoint.py:15
-msgid "Oracle port"
-msgstr "Oracle 端口"
-
-#: terminal/serializers/endpoint.py:18
-msgid "Oracle port range"
-msgstr "Oracle 端口范围"
-
-#: terminal/serializers/endpoint.py:20
-msgid ""
-"Oracle proxy server listen port is dynamic, Each additional Oracle database "
-"instance adds a port listener"
-msgstr ""
-"Oracle 代理服务器监听端口是动态的,每增加一个 Oracle 数据库实例,就会增加一个"
-"端口监听"
-
-#: terminal/serializers/endpoint.py:38
+#: terminal/serializers/endpoint.py:26
msgid ""
"The host address accessed when connecting to assets, if it is empty, the "
"access address of the current browser will be used (the default endpoint "
@@ -8763,18 +8808,18 @@ msgstr ""
"连接资产时访问的主机地址,如果为空则使用当前浏览器的访问地址 (默认端点不允许"
"修改主机)"
-#: terminal/serializers/endpoint.py:71
+#: terminal/serializers/endpoint.py:52
msgid ""
"The assets within this IP range, the following endpoint will be used for the "
"connection"
msgstr "该 IP 范围内的资产,将使用下面的端点进行连接"
-#: terminal/serializers/endpoint.py:72
+#: terminal/serializers/endpoint.py:53
msgid ""
"If asset IP addresses under different endpoints conflict, use asset labels"
msgstr "如果不同端点下的资产 IP 有冲突,使用资产标签实现"
-#: terminal/serializers/endpoint.py:76
+#: terminal/serializers/endpoint.py:57
msgid "Asset IP"
msgstr "资产 IP"
@@ -9120,25 +9165,6 @@ msgstr ""
msgid "view"
msgstr "查看"
-#: terminal/utils/db_port_mapper.py:88
-msgid ""
-"No available port is matched. The number of databases may have exceeded the "
-"number of ports open to the database agent service, Contact the "
-"administrator to open more ports."
-msgstr ""
-"未匹配到可用端口,数据库的数量可能已经超过数据库代理服务开放的端口数量,请联"
-"系管理员开放更多端口。"
-
-#: terminal/utils/db_port_mapper.py:116
-msgid ""
-"No ports can be used, check and modify the limit on the number of ports that "
-"Magnus listens on in the configuration file."
-msgstr "没有端口可以使用,检查并修改配置文件中 Magnus 监听的端口数量限制。"
-
-#: terminal/utils/db_port_mapper.py:118
-msgid "All available port count: {}, Already use port count: {}"
-msgstr "所有可用端口数量:{},已使用端口数量:{}"
-
#: tickets/api/ticket.py:88 tickets/models/ticket/general.py:289
msgid "Applicant"
msgstr "申请人"
@@ -9806,7 +9832,7 @@ msgstr "命令行"
msgid "The old password is incorrect"
msgstr "旧密码错误"
-#: users/serializers/profile.py:37 users/serializers/profile.py:148
+#: users/serializers/profile.py:37 users/serializers/profile.py:156
msgid "Password does not match security rules"
msgstr "密码不满足安全规则"
@@ -10279,15 +10305,15 @@ msgid ""
"strategy will skipped."
msgstr "根据当前任务配置,不符合策略的资产将被跳过。"
-#: xpack/plugins/cloud/api.py:72
+#: xpack/plugins/cloud/api.py:74
msgid "Test connection successful"
msgstr "测试成功"
-#: xpack/plugins/cloud/api.py:74
+#: xpack/plugins/cloud/api.py:76
msgid "Test connection failed: {}"
msgstr "测试连接失败:{}"
-#: xpack/plugins/cloud/api.py:171
+#: xpack/plugins/cloud/api.py:196
msgid "User {} deleted the current resource and released the assets"
msgstr "用户 {} 删除了当前资源已释放的资产"
@@ -11005,27 +11031,16 @@ msgid "Instance count"
msgstr "实例个数"
#: xpack/plugins/cloud/tasks.py:33
-#, fuzzy
-#| msgid ""
-#| "Execute this task when manually or scheduled cloud synchronization tasks "
-#| "are performed"
msgid ""
"Execute this task when manually or scheduled cloud synchronization tasks are "
"performed"
-msgstr "手动,定时执行云同步任务时执行该任务"
+msgstr "执行手动或定时云同步任务时执行此任务"
#: xpack/plugins/cloud/tasks.py:50
msgid "Period clean sync instance task execution"
msgstr "定期清除同步实例任务执行记录"
#: xpack/plugins/cloud/tasks.py:52
-#, fuzzy
-#| msgid ""
-#| "Every day, according to the configuration in \"System Settings - Tasks - "
-#| "Regular \n"
-#| " clean-up - Cloud sync task history retention days\" the system "
-#| "will clean up the execution \n"
-#| " records generated by cloud synchronization"
msgid ""
"Every day, according to the configuration in \"System Settings - Tasks - "
"Regular \n"
@@ -11033,8 +11048,7 @@ msgid ""
"clean up the execution \n"
" records generated by cloud synchronization"
msgstr ""
-"每天,系统会根据“系统设置-任务-”中的配置定期清理云同步任务历史保留天数,对云"
-"同步产生的执行记录进行清理"
+"每天系统会根据“系统设置-任务-定期清理-云同步任务历史记录保留天数”中的配置,清理云同步执行过程中产生的记录。"
#: xpack/plugins/interface/api.py:52
msgid "Restore default successfully."
@@ -11089,45 +11103,3 @@ msgstr "许可证导入成功"
#: xpack/plugins/license/api.py:53
msgid "Invalid license"
msgstr "许可证无效"
-
-#, fuzzy
-#~| msgid "Container name"
-#~ msgid "domain_name"
-#~ msgstr "容器名称"
-
-#~ msgid "Password error"
-#~ msgstr "密码错误"
-
-#~ msgid "No admin account"
-#~ msgstr "没有管理账号"
-
-#~ msgid "Others"
-#~ msgstr "其它"
-
-#~ msgid "Ok count"
-#~ msgstr "成功数"
-
-#~ msgid "No password count"
-#~ msgstr "无密码数"
-
-#~ msgid "No weak password"
-#~ msgstr "无弱密码"
-
-#~ msgid ""
-#~ "The following is a summary of account backup tasks, please review and "
-#~ "handle them"
-#~ msgstr "以下是账户备份任务的概要,请查阅并处理"
-
-#~ msgid ""
-#~ "The following is a summary of account change secret tasks, please read "
-#~ "and process"
-#~ msgstr "以下是账号更改秘密任务的摘要,请阅读并处理"
-
-#~ msgid ""
-#~ "The following is a summary of the account check tasks. Please review and "
-#~ "handle them"
-#~ msgstr "以下是账号检查任务的汇总,请查阅并处理"
-
-#~ msgid ""
-#~ "The following is a summary of account push tasks, please read and process"
-#~ msgstr "以下是账号推送任务的汇总,请阅读并处理"
diff --git a/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po b/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po
index 7e3e6d5ca..c92823d79 100644
--- a/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po
+++ b/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: JumpServer 0.3.3\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-03-20 11:52+0800\n"
+"POT-Creation-Date: 2025-04-17 15:04+0800\n"
"PO-Revision-Date: 2021-05-20 10:54+0800\n"
"Last-Translator: ibuler \n"
"Language-Team: JumpServer team\n"
@@ -16,21 +16,20 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.4.3\n"
-"X-ZhConverter: 繁化姬 dict-74c8d060-r1048 @ 2024/04/07 18:19:20 | https://"
-"zhconvert.org\n"
+"X-ZhConverter: 繁化姬 dict-74c8d060-r1048 @ 2024/04/07 18:19:20 | https://zhconvert.org\n"
-#: accounts/api/account/account.py:121
+#: accounts/api/account/account.py:131
#: accounts/serializers/account/account.py:181
-#: accounts/serializers/account/account.py:342
+#: accounts/serializers/account/account.py:344
msgid "Account already exists"
msgstr "帳號已存在"
#: accounts/api/account/application.py:78
-#: authentication/api/connection_token.py:452
+#: authentication/api/connection_token.py:451
msgid "Account not found"
msgstr "帳號未找到"
-#: accounts/api/automations/base.py:83 tickets/api/ticket.py:132
+#: accounts/api/automations/base.py:86 tickets/api/ticket.py:132
msgid "The parameter 'action' must be [{}]"
msgstr "參數 'action' 必須是 [{}]"
@@ -95,7 +94,7 @@ msgstr "帳號備份計劃正在執行"
msgid "Plan execution end"
msgstr "計劃執行結束"
-#: accounts/automations/base/manager.py:118
+#: accounts/automations/base/manager.py:119
msgid "No pending accounts found"
msgstr "未找到待處理帳戶"
@@ -108,8 +107,7 @@ msgstr "成功: %s, 失敗: %s, 總數: %s"
msgid ""
"---\n"
"Summary: \n"
-"ok: {}, weak password: {}, leaked password: {}, repeated password: {}, no "
-"secret: {}, using time: {}s"
+"ok: {}, weak password: {}, leaked password: {}, repeated password: {}, no secret: {}, using time: {}s"
msgstr ""
"---\n"
"摘要: \n"
@@ -125,14 +123,14 @@ msgstr ">>> 開始執行測試閘道器帳號可連結性的任務"
#: accounts/const/account.py:6
#: accounts/serializers/automations/change_secret.py:34
-#: audits/signal_handlers/login_log.py:34 authentication/confirm/password.py:25
-#: authentication/confirm/password.py:27 authentication/const.py:10
-#: authentication/forms.py:28
+#: audits/signal_handlers/login_log.py:34
+#: authentication/confirm/password.py:25 authentication/confirm/password.py:27
+#: authentication/const.py:10 authentication/forms.py:28
#: authentication/templates/authentication/login.html:362
#: authentication/templates/authentication/login.html:408
#: settings/serializers/auth/ldap.py:27 settings/serializers/auth/ldap.py:53
-#: settings/serializers/auth/ldap_ha.py:36 settings/serializers/msg.py:37
-#: settings/serializers/terminal.py:28 terminal/serializers/storage.py:123
+#: settings/serializers/auth/ldap_ha.py:35 settings/serializers/msg.py:37
+#: settings/serializers/terminal.py:32 terminal/serializers/storage.py:123
#: terminal/serializers/storage.py:142 users/forms/profile.py:22
#: users/serializers/user.py:148
#: users/templates/users/_msg_user_created.html:13
@@ -194,7 +192,8 @@ msgstr "發現"
msgid "Template"
msgstr "模板"
-#: accounts/const/account.py:32 ops/const.py:46 xpack/plugins/cloud/const.py:68
+#: accounts/const/account.py:32 ops/const.py:46
+#: xpack/plugins/cloud/const.py:68
msgid "Skip"
msgstr "跳過"
@@ -204,7 +203,7 @@ msgid "Update"
msgstr "更新"
#: accounts/const/account.py:34 accounts/const/automation.py:115
-#: accounts/serializers/automations/change_secret.py:169 audits/const.py:65
+#: accounts/serializers/automations/change_secret.py:169 audits/const.py:66
#: audits/signal_handlers/activity_log.py:34 common/const/choices.py:67
#: ops/const.py:76 terminal/const.py:81 xpack/plugins/cloud/const.py:47
msgid "Failed"
@@ -307,7 +306,7 @@ msgstr "創建並推送"
msgid "Only create"
msgstr "僅創建"
-#: accounts/const/automation.py:109
+#: accounts/const/automation.py:109 authentication/const.py:34
#: authentication/serializers/password_mfa.py:16
#: authentication/serializers/password_mfa.py:24
#: notifications/backends/__init__.py:10 settings/serializers/msg.py:21
@@ -323,7 +322,7 @@ msgid "SFTP"
msgstr "SFTP"
#: accounts/const/automation.py:116
-#: accounts/serializers/automations/change_secret.py:168 audits/const.py:64
+#: accounts/serializers/automations/change_secret.py:168 audits/const.py:65
#: audits/models.py:65 audits/signal_handlers/activity_log.py:34
#: common/const/choices.py:66 ops/const.py:74 ops/serializers/celery.py:48
#: terminal/const.py:80 terminal/models/session/sharing.py:121
@@ -414,33 +413,11 @@ msgid ""
"Vault."
msgstr "Vault 操作失敗,請重試,或檢查 Vault 上的帳號信息。"
-#: accounts/filters.py:194
-msgid "Enter a valid UUID."
-msgstr ""
-
-#: accounts/mixins.py:35
-msgid "Export all"
-msgstr "匯出所有"
-
-#: accounts/mixins.py:37
-msgid "Export only selected items"
-msgstr "僅匯出選擇項"
-
-#: accounts/mixins.py:42
-#, python-format
-msgid "Export filtered: %s"
-msgstr "匯出搜素: %s"
-
-#: accounts/mixins.py:48
-#, python-format
-msgid "User %s view/export secret"
-msgstr "用戶 %s 查看/匯出 了密碼"
-
#: accounts/models/account.py:85
#: accounts/models/automations/check_account.py:59
#: accounts/models/automations/gather_account.py:17
-#: accounts/serializers/account/account.py:226
-#: accounts/serializers/account/account.py:274
+#: accounts/serializers/account/account.py:227
+#: accounts/serializers/account/account.py:276
#: accounts/serializers/automations/change_secret.py:113
#: accounts/serializers/automations/change_secret.py:145
#: accounts/serializers/automations/check_account.py:33
@@ -454,9 +431,9 @@ msgstr "用戶 %s 查看/匯出 了密碼"
#: accounts/templates/accounts/push_account_report.html:78
#: accounts/templates/accounts/push_account_report.html:118
#: acls/serializers/base.py:130 assets/models/asset/common.py:102
-#: assets/models/asset/common.py:366 assets/models/cmd_filter.py:36
-#: audits/models.py:59 audits/models.py:312 audits/serializers.py:228
-#: authentication/models/connection_token.py:40
+#: assets/models/asset/common.py:428 assets/models/cmd_filter.py:36
+#: audits/models.py:59 audits/models.py:312 audits/serializers.py:230
+#: authentication/models/connection_token.py:41
#: perms/models/asset_permission.py:69 terminal/backends/command/models.py:17
#: terminal/models/session/session.py:34 terminal/notifications.py:156
#: terminal/serializers/command.py:17 terminal/serializers/session.py:30
@@ -467,10 +444,10 @@ msgid "Asset"
msgstr "資產"
#: accounts/models/account.py:89 accounts/models/template.py:16
-#: accounts/serializers/account/account.py:233
-#: accounts/serializers/account/account.py:284
+#: accounts/serializers/account/account.py:234
+#: accounts/serializers/account/account.py:286
#: accounts/serializers/account/template.py:35
-#: authentication/serializers/connect_token_secret.py:50
+#: authentication/serializers/connect_token_secret.py:51
msgid "Su from"
msgstr "切換自"
@@ -488,7 +465,7 @@ msgstr "歷史帳號"
msgid "Secret reset"
msgstr "可改密"
-#: accounts/models/account.py:97 accounts/serializers/account/account.py:228
+#: accounts/models/account.py:97 accounts/serializers/account/account.py:229
#: users/models/user/__init__.py:122
msgid "Source"
msgstr "來源"
@@ -515,14 +492,14 @@ msgstr "改密狀態"
#: accounts/models/account.py:107
#: accounts/models/automations/check_account.py:64
-#: accounts/serializers/account/service.py:11
+#: accounts/serializers/account/service.py:12
#: accounts/serializers/automations/change_secret.py:115
#: accounts/serializers/automations/change_secret.py:146
#: accounts/templates/accounts/change_secret_failed_info.html:12
#: acls/serializers/base.py:131
#: acls/templates/acls/asset_login_reminder.html:10
#: assets/serializers/gateway.py:33 audits/models.py:60 audits/models.py:313
-#: audits/serializers.py:229 authentication/api/connection_token.py:464
+#: audits/serializers.py:231 authentication/api/connection_token.py:463
#: ops/models/base.py:18 perms/models/asset_permission.py:75
#: settings/serializers/msg.py:33 terminal/backends/command/models.py:18
#: terminal/models/session/session.py:36 terminal/serializers/command.py:72
@@ -559,29 +536,31 @@ msgstr "可以移除帳號"
#: accounts/models/application.py:16
#: accounts/models/automations/check_account.py:116 accounts/models/base.py:63
-#: accounts/serializers/account/service.py:27
+#: accounts/serializers/account/service.py:28
#: accounts/serializers/account/virtual.py:20 acls/models/base.py:35
#: acls/models/base.py:96 acls/models/command_acl.py:21
#: acls/serializers/base.py:35 assets/models/asset/common.py:100
#: assets/models/asset/common.py:166 assets/models/cmd_filter.py:21
#: assets/models/domain.py:19 assets/models/label.py:18
#: assets/models/platform.py:15 assets/models/platform.py:94
-#: assets/serializers/asset/common.py:171 assets/serializers/platform.py:158
-#: assets/serializers/platform.py:278
+#: assets/serializers/asset/common.py:173 assets/serializers/platform.py:158
+#: assets/serializers/platform.py:283
#: authentication/backends/passkey/models.py:10
#: authentication/models/ssh_key.py:12
-#: authentication/serializers/connect_token_secret.py:113
-#: authentication/serializers/connect_token_secret.py:170 labels/models.py:11
+#: authentication/serializers/connect_token_secret.py:115
+#: authentication/serializers/connect_token_secret.py:172 labels/models.py:11
#: ops/mixin.py:32 ops/models/adhoc.py:19 ops/models/celery.py:15
-#: ops/models/celery.py:81 ops/models/job.py:145 ops/models/playbook.py:28
+#: ops/models/celery.py:81 ops/models/job.py:147 ops/models/playbook.py:28
#: ops/models/variable.py:9 ops/serializers/job.py:20
#: ops/serializers/variable.py:20 orgs/models.py:82
#: perms/models/asset_permission.py:61 rbac/models/role.py:29
#: rbac/serializers/role.py:28 settings/models.py:37 settings/models.py:186
#: settings/serializers/msg.py:89 settings/serializers/terminal.py:9
-#: terminal/models/applet/applet.py:34 terminal/models/component/endpoint.py:13
-#: terminal/models/component/endpoint.py:112
-#: terminal/models/component/storage.py:26 terminal/models/component/task.py:13
+#: terminal/models/applet/applet.py:34
+#: terminal/models/component/endpoint.py:13
+#: terminal/models/component/endpoint.py:106
+#: terminal/models/component/storage.py:26
+#: terminal/models/component/task.py:13
#: terminal/models/component/terminal.py:86
#: terminal/models/virtualapp/provider.py:10
#: terminal/models/virtualapp/virtualapp.py:19 tickets/api/ticket.py:87
@@ -607,30 +586,33 @@ msgstr "金鑰"
#: accounts/models/application.py:21 acls/models/base.py:98
#: assets/models/automations/base.py:22 assets/models/cmd_filter.py:38
#: assets/serializers/asset/common.py:148
-#: assets/serializers/asset/common.py:420 perms/serializers/permission.py:66
-#: perms/serializers/user_permission.py:75 rbac/tree.py:35
+#: assets/serializers/asset/common.py:423 perms/serializers/permission.py:66
+#: perms/serializers/user_permission.py:76 rbac/tree.py:35
msgid "Accounts"
msgstr "帳號管理"
#: accounts/models/application.py:22 authentication/models/access_key.py:20
-#: terminal/models/component/endpoint.py:113
+#: terminal/models/component/endpoint.py:107
msgid "IP group"
msgstr "IPグループ"
#: accounts/models/application.py:23
#: authentication/backends/passkey/models.py:14
#: authentication/models/access_key.py:24
-#: authentication/models/private_token.py:8 authentication/models/ssh_key.py:20
+#: authentication/models/private_token.py:8
+#: authentication/models/ssh_key.py:20
msgid "Date last used"
msgstr "最後使用日期"
#: accounts/models/application.py:24 acls/models/base.py:43
-#: assets/models/asset/common.py:178 authentication/models/access_key.py:23
-#: authentication/models/connection_token.py:58
-#: authentication/models/ssh_key.py:13 authentication/serializers/ssh_key.py:23
+#: assets/models/asset/common.py:182 authentication/models/access_key.py:23
+#: authentication/models/connection_token.py:59
+#: authentication/models/ssh_key.py:13
+#: authentication/serializers/ssh_key.py:23
#: authentication/templates/authentication/_access_key_modal.html:32
-#: perms/models/asset_permission.py:82 terminal/models/component/endpoint.py:28
-#: terminal/models/component/endpoint.py:123
+#: perms/models/asset_permission.py:82
+#: terminal/models/component/endpoint.py:29
+#: terminal/models/component/endpoint.py:117
#: terminal/models/session/sharing.py:29 terminal/serializers/terminal.py:44
#: tickets/const.py:36
msgid "Active"
@@ -731,8 +713,8 @@ msgstr "更改後檢查連接"
#: accounts/models/automations/check_account.py:19
#: accounts/models/automations/gather_account.py:117
#: accounts/serializers/automations/change_secret.py:59
-#: settings/serializers/auth/ldap.py:101
-#: settings/serializers/auth/ldap_ha.py:84 settings/serializers/msg.py:45
+#: settings/serializers/auth/ldap.py:105
+#: settings/serializers/auth/ldap_ha.py:87 settings/serializers/msg.py:45
msgid "Recipient"
msgstr "收件人"
@@ -742,7 +724,7 @@ msgstr "自動化改密"
#: accounts/models/automations/change_secret.py:47
#: assets/models/automations/base.py:145 ops/models/base.py:56
-#: ops/models/celery.py:90 ops/models/job.py:240
+#: ops/models/celery.py:90 ops/models/job.py:242
#: terminal/models/applet/host.py:142
msgid "Date finished"
msgstr "結束日期"
@@ -753,11 +735,11 @@ msgstr "結束日期"
#: accounts/serializers/automations/check_account.py:39
#: assets/models/automations/base.py:137
#: assets/serializers/automations/base.py:45 audits/models.py:209
-#: audits/serializers.py:78 ops/models/base.py:49 ops/models/job.py:231
-#: terminal/models/applet/applet.py:331 terminal/models/applet/host.py:140
+#: audits/serializers.py:77 ops/models/base.py:49 ops/models/job.py:233
+#: terminal/models/applet/applet.py:372 terminal/models/applet/host.py:140
#: terminal/models/component/status.py:30
#: terminal/models/virtualapp/virtualapp.py:99
-#: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:148
+#: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:163
#: terminal/serializers/virtualapp.py:35 tickets/models/ticket/general.py:284
#: tickets/serializers/super_ticket.py:13
#: tickets/serializers/ticket/ticket.py:20 xpack/plugins/cloud/models.py:227
@@ -766,7 +748,7 @@ msgid "Status"
msgstr "狀態"
#: accounts/models/automations/change_secret.py:51
-#: accounts/serializers/account/account.py:276
+#: accounts/serializers/account/account.py:278
#: accounts/templates/accounts/change_secret_failed_info.html:13
#: assets/const/automation.py:9
#: authentication/templates/authentication/passkey.html:173
@@ -817,8 +799,6 @@ msgid "New found"
msgstr "新發現"
#: accounts/models/automations/check_account.py:45
-#, fuzzy
-#| msgid "Account delete"
msgid "Account deleted"
msgstr "帳號已刪除"
@@ -867,9 +847,11 @@ msgstr "重複密碼"
#: accounts/templates/accounts/gather_account_report.html:118
#: accounts/templates/accounts/push_account_report.html:79
#: accounts/templates/accounts/push_account_report.html:119
-#: acls/serializers/base.py:19 acls/serializers/base.py:50 audits/models.py:189
-#: authentication/forms.py:21 authentication/forms.py:23
+#: acls/serializers/base.py:19 acls/serializers/base.py:50
+#: audits/models.py:189 authentication/forms.py:21 authentication/forms.py:23
#: authentication/models/temp_token.py:9
+#: authentication/serializers/connect_token_secret.py:43
+#: authentication/serializers/connect_token_secret.py:53
#: authentication/templates/authentication/_msg_different_city.html:9
#: authentication/templates/authentication/_msg_oauth_bind.html:9
#: authentication/templates/authentication/login.html:408
@@ -987,11 +969,11 @@ msgid "Verify asset account"
msgstr "帳號驗證"
#: accounts/models/base.py:37 accounts/models/base.py:66
-#: accounts/serializers/account/account.py:470
+#: accounts/serializers/account/account.py:471
#: accounts/serializers/account/base.py:17
#: accounts/serializers/automations/change_secret.py:48
#: authentication/serializers/connect_token_secret.py:42
-#: authentication/serializers/connect_token_secret.py:51
+#: authentication/serializers/connect_token_secret.py:52
#: terminal/serializers/storage.py:140
msgid "Secret type"
msgstr "密文類型"
@@ -1008,7 +990,7 @@ msgstr "密碼規則"
#: accounts/models/base.py:69 assets/models/automations/base.py:28
#: assets/models/cmd_filter.py:39 assets/models/label.py:22
-#: authentication/serializers/connect_token_secret.py:117
+#: authentication/serializers/connect_token_secret.py:119
#: terminal/models/applet/applet.py:41
#: terminal/models/virtualapp/virtualapp.py:23 users/serializers/user.py:257
msgid "Is active"
@@ -1066,8 +1048,7 @@ msgstr "登錄資產時,帳號使用者名稱與使用者使用者名稱相同
msgid ""
"Connect asset without using a username and password, and it only supports "
"web-based and custom-type assets"
-msgstr ""
-"連接資產時不使用使用者名稱和密碼的帳號,僅支持 web類型 和 自訂類型 的資產"
+msgstr "連接資產時不使用使用者名稱和密碼的帳號,僅支持 web類型 和 自訂類型 的資產"
#: accounts/notifications.py:12 accounts/notifications.py:37
msgid "Notification of account backup route task results"
@@ -1084,9 +1065,7 @@ msgid ""
"{} - The account backup passage task has been completed: the encryption "
"password has not been set - please go to personal information -> Basic file "
"encryption password for preference settings"
-msgstr ""
-"{} - 帳號備份任務已完成: 未設置加密密碼 - 請前往個人資訊 -> 偏好設置的基本中"
-"設置文件加密密碼"
+msgstr "{} - 帳號備份任務已完成: 未設置加密密碼 - 請前往個人資訊 -> 偏好設置的基本中設置文件加密密碼"
#: accounts/notifications.py:56
msgid "Notification of implementation result of encryption change plan"
@@ -1103,9 +1082,7 @@ msgid ""
"{} - The encryption change task has been completed: the encryption password "
"has not been set - please go to personal information -> set encryption "
"password in preferences"
-msgstr ""
-"{} - 改密任務已完成: 未設置加密密碼 - 請前往個人資訊 -> 偏好設置中設置加密密"
-"碼"
+msgstr "{} - 改密任務已完成: 未設置加密密碼 - 請前往個人資訊 -> 偏好設置中設置加密密碼"
#: accounts/notifications.py:83
msgid "Gather account change information"
@@ -1123,7 +1100,7 @@ msgstr "忽略"
msgid "Reopen"
msgstr "重新打開"
-#: accounts/risk_handlers.py:19 audits/const.py:38
+#: accounts/risk_handlers.py:19 audits/const.py:39
#: authentication/templates/authentication/_access_key_modal.html:155
#: authentication/templates/authentication/_mfa_confirm_modal.html:53
#: templates/_modal.html:22 tickets/const.py:43
@@ -1151,15 +1128,13 @@ msgstr "新增帳號"
msgid "Change password and Add"
msgstr "改密並添加"
-#: accounts/risk_handlers.py:26 audits/const.py:31 ops/const.py:9
+#: accounts/risk_handlers.py:26 audits/const.py:32 ops/const.py:9
msgid "Change password"
msgstr "改密"
#: accounts/risk_handlers.py:127
-#, fuzzy
-#| msgid "Test connection failed: {}"
msgid "Execution failed: {}"
-msgstr "測試連接失敗:{}"
+msgstr "執行失敗:{}"
#: accounts/serializers/account/account.py:31
msgid "Push now"
@@ -1176,7 +1151,7 @@ msgstr "帳號存在策略"
#: accounts/serializers/account/account.py:206 assets/models/label.py:21
#: assets/models/platform.py:95 assets/serializers/asset/common.py:145
#: assets/serializers/cagegory.py:12 assets/serializers/platform.py:173
-#: assets/serializers/platform.py:279 perms/serializers/user_permission.py:26
+#: assets/serializers/platform.py:284 perms/serializers/user_permission.py:26
#: settings/models.py:39 tickets/models/ticket/apply_application.py:13
#: users/models/preference.py:12
msgid "Category"
@@ -1187,11 +1162,11 @@ msgstr "類別"
#: assets/models/automations/base.py:146 assets/models/cmd_filter.py:74
#: assets/models/platform.py:96 assets/serializers/asset/common.py:146
#: assets/serializers/platform.py:160 assets/serializers/platform.py:172
-#: audits/serializers.py:77 audits/serializers.py:194
-#: authentication/models/connection_token.py:62
-#: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:153
-#: perms/serializers/user_permission.py:27 terminal/models/applet/applet.py:40
-#: terminal/models/component/storage.py:58
+#: audits/serializers.py:76 audits/serializers.py:196
+#: authentication/models/connection_token.py:63
+#: authentication/serializers/connect_token_secret.py:128
+#: ops/models/job.py:155 perms/serializers/user_permission.py:27
+#: terminal/models/applet/applet.py:40 terminal/models/component/storage.py:58
#: terminal/models/component/storage.py:152 terminal/serializers/applet.py:29
#: terminal/serializers/session.py:25 terminal/serializers/storage.py:281
#: terminal/serializers/storage.py:294 tickets/models/comment.py:26
@@ -1201,66 +1176,73 @@ msgstr "類別"
msgid "Type"
msgstr "類型"
-#: accounts/serializers/account/account.py:222
+#: accounts/serializers/account/account.py:223
msgid "Asset not found"
msgstr "資產不存在"
-#: accounts/serializers/account/account.py:265
+#: accounts/serializers/account/account.py:236 assets/const/category.py:15
+#: assets/models/asset/common.py:180 assets/models/asset/ds.py:14
+#: assets/serializers/asset/common.py:180
+msgid "Directory service"
+msgstr "目錄服務"
+
+#: accounts/serializers/account/account.py:267
msgid "Has secret"
msgstr "已託管密碼"
-#: accounts/serializers/account/account.py:275 ops/models/celery.py:84
+#: accounts/serializers/account/account.py:277 ops/models/celery.py:84
#: tickets/models/comment.py:13 tickets/models/ticket/general.py:49
#: tickets/models/ticket/general.py:280 tickets/serializers/super_ticket.py:14
msgid "State"
msgstr "狀態"
-#: accounts/serializers/account/account.py:277
+#: accounts/serializers/account/account.py:279
msgid "Changed"
msgstr "已修改"
-#: accounts/serializers/account/account.py:287 acls/models/base.py:97
+#: accounts/serializers/account/account.py:289 acls/models/base.py:97
#: acls/templates/acls/asset_login_reminder.html:9
#: assets/models/automations/base.py:25
-#: assets/serializers/automations/base.py:20 assets/serializers/domain.py:34
+#: assets/serializers/automations/base.py:20 assets/serializers/domain.py:33
#: assets/serializers/platform.py:181 assets/serializers/platform.py:213
-#: authentication/api/connection_token.py:463 ops/models/base.py:17
-#: ops/models/job.py:155 ops/serializers/job.py:21
+#: authentication/api/connection_token.py:462 ops/models/base.py:17
+#: ops/models/job.py:157 ops/serializers/job.py:21
#: perms/serializers/permission.py:57
#: terminal/templates/terminal/_msg_command_execute_alert.html:16
#: xpack/plugins/cloud/manager.py:93
msgid "Assets"
msgstr "資產"
-#: accounts/serializers/account/account.py:392
+#: accounts/serializers/account/account.py:394
#, python-format
msgid "Asset does not support this secret type: %s"
msgstr "資產不支持帳號類型: %s"
-#: accounts/serializers/account/account.py:424
+#: accounts/serializers/account/account.py:426
msgid "Account has exist"
msgstr "帳號已存在"
-#: accounts/serializers/account/account.py:461
+#: accounts/serializers/account/account.py:463
#: accounts/serializers/account/base.py:86
#: accounts/serializers/account/template.py:66
-#: assets/serializers/asset/common.py:421
+#: assets/serializers/asset/common.py:424
msgid "Spec info"
msgstr "特殊資訊"
-#: accounts/serializers/account/account.py:471
-#: authentication/serializers/connect_token_secret.py:160
+#: accounts/serializers/account/account.py:472
+#: authentication/serializers/connect_token_secret.py:162
#: authentication/templates/authentication/_access_key_modal.html:30
#: perms/models/perm_node.py:21 users/serializers/group.py:33
msgid "ID"
msgstr "ID"
-#: accounts/serializers/account/account.py:481 acls/serializers/base.py:123
+#: accounts/serializers/account/account.py:482 acls/serializers/base.py:123
#: acls/templates/acls/asset_login_reminder.html:8
#: acls/templates/acls/user_login_reminder.html:8
-#: assets/models/cmd_filter.py:24 assets/models/label.py:16 audits/models.py:55
-#: audits/models.py:91 audits/models.py:173 audits/models.py:272
-#: audits/serializers.py:195 authentication/models/connection_token.py:36
+#: assets/models/cmd_filter.py:24 assets/models/label.py:16
+#: audits/models.py:55 audits/models.py:91 audits/models.py:173
+#: audits/models.py:272 audits/serializers.py:197
+#: authentication/models/connection_token.py:37
#: authentication/models/ssh_key.py:22 authentication/models/sso_token.py:16
#: notifications/models/notification.py:12
#: perms/api/user_permission/mixin.py:58 perms/models/asset_permission.py:63
@@ -1277,7 +1259,7 @@ msgstr "ID"
msgid "User"
msgstr "用戶"
-#: accounts/serializers/account/account.py:482
+#: accounts/serializers/account/account.py:483
#: authentication/templates/authentication/_access_key_modal.html:33
#: terminal/notifications.py:159 terminal/notifications.py:219
msgid "Date"
@@ -1291,23 +1273,21 @@ msgstr "密鑰密碼"
msgid ""
"* If no username is required for authentication, enter null. For AD "
"accounts, use the format username@domain."
-msgstr ""
-"提示:如果認證時不需要使用者名稱,可填寫為 null,如果是 AD 帳號,格式為 "
-"username@domain"
+msgstr "提示:如果認證時不需要使用者名稱,可填寫為 null,如果是 AD 帳號,格式為 username@domain"
-#: accounts/serializers/account/service.py:13
+#: accounts/serializers/account/service.py:14
#: authentication/serializers/token.py:22
msgid "Access IP"
msgstr "IP 白名單"
-#: accounts/serializers/account/service.py:26
+#: accounts/serializers/account/service.py:27
#: accounts/serializers/account/virtual.py:19 assets/models/cmd_filter.py:40
-#: assets/models/cmd_filter.py:88 common/db/models.py:36 ops/models/adhoc.py:25
-#: ops/models/job.py:163 ops/models/playbook.py:31 rbac/models/role.py:37
-#: settings/models.py:42 terminal/models/applet/applet.py:46
-#: terminal/models/applet/applet.py:332 terminal/models/applet/host.py:143
-#: terminal/models/component/endpoint.py:27
-#: terminal/models/component/endpoint.py:122
+#: assets/models/cmd_filter.py:88 common/db/models.py:36
+#: ops/models/adhoc.py:25 ops/models/job.py:165 ops/models/playbook.py:31
+#: rbac/models/role.py:37 settings/models.py:42
+#: terminal/models/applet/applet.py:46 terminal/models/applet/applet.py:373
+#: terminal/models/applet/host.py:143 terminal/models/component/endpoint.py:28
+#: terminal/models/component/endpoint.py:116
#: terminal/models/session/session.py:49
#: terminal/models/virtualapp/virtualapp.py:28 tickets/models/comment.py:32
#: tickets/models/ticket/general.py:298 users/models/user/__init__.py:94
@@ -1315,9 +1295,9 @@ msgstr "IP 白名單"
msgid "Comment"
msgstr "備註"
-#: accounts/serializers/account/service.py:28
+#: accounts/serializers/account/service.py:29
#: accounts/templates/accounts/backup_account_report.html:33
-#: assets/serializers/asset/common.py:151
+#: assets/serializers/asset/common.py:152
msgid "Accounts amount"
msgstr "帳號數量"
@@ -1352,20 +1332,16 @@ msgid ""
"length is the length of the password, and the range is 8 to 30.\n"
"lowercase indicates whether the password contains lowercase letters, \n"
"uppercase indicates whether it contains uppercase letters,\n"
-"digit indicates whether it contains numbers, and symbol indicates whether it "
-"contains special symbols.\n"
-"exclude_symbols is used to exclude specific symbols. You can fill in the "
-"symbol characters to be excluded (up to 16). \n"
+"digit indicates whether it contains numbers, and symbol indicates whether it contains special symbols.\n"
+"exclude_symbols is used to exclude specific symbols. You can fill in the symbol characters to be excluded (up to 16). \n"
"If you do not need to exclude symbols, you can leave it blank.\n"
-"default: {\"length\": 16, \"lowercase\": true, \"uppercase\": true, "
-"\"digit\": true, \"symbol\": true, \"exclude_symbols\": \"\"}"
+"default: {\"length\": 16, \"lowercase\": true, \"uppercase\": true, \"digit\": true, \"symbol\": true, \"exclude_symbols\": \"\"}"
msgstr ""
-"length 是密碼的長度,填入範圍為 8 到 30。lowercase 表示密碼中是否包含小寫字"
-"母,uppercase 表示是否包含大寫字母,digit 表示是否包含數字,symbol 表示是否包"
-"含特殊符號。exclude_symbols 用於排除特定符號,您可以填寫要排除的符號字元(最"
-"多 16 個),如果無需排除符號,可以留空。預設: {\"length\": 16, "
-"\"lowercase\": true, \"uppercase\": true, \"digit\": true, \"symbol\": true, "
-"\"exclude_symbols\": \"\"}"
+"length 是密碼的長度,填入範圍為 8 到 30。lowercase 表示密碼中是否包含小寫字母,uppercase "
+"表示是否包含大寫字母,digit 表示是否包含數字,symbol 表示是否包含特殊符號。exclude_symbols "
+"用於排除特定符號,您可以填寫要排除的符號字元(最多 16 個),如果無需排除符號,可以留空。預設: {\"length\": 16, "
+"\"lowercase\": true, \"uppercase\": true, \"digit\": true, \"symbol\": true,"
+" \"exclude_symbols\": \"\"}"
#: accounts/serializers/account/template.py:47
msgid "Secret generation strategy for account creation"
@@ -1387,9 +1363,8 @@ msgid ""
"asset secret > Login secret > Manual input.
For security, please set "
"config CACHE_LOGIN_PASSWORD_ENABLED to true"
msgstr ""
-"當前僅支持 AD/LDAP 登錄方式用戶。 同名帳號密碼生效順序: 資產上存在的同名帳號"
-"密碼 > 登錄密碼 > 手動輸入
為了安全起見,請設置配置項 "
-"CACHE_LOGIN_PASSWORD_ENABLED=true,重啟服務才能開啟"
+"當前僅支持 AD/LDAP 登錄方式用戶。 同名帳號密碼生效順序: 資產上存在的同名帳號密碼 > 登錄密碼 > 手動輸入
"
+"為了安全起見,請設置配置項 CACHE_LOGIN_PASSWORD_ENABLED=true,重啟服務才能開啟"
#: accounts/serializers/automations/backup.py:18
msgid "Zip Encrypt Password"
@@ -1481,15 +1456,10 @@ msgstr "帳號執行自動化"
#: accounts/tasks/automation.py:35
msgid ""
-"Unified execution entry for account automation tasks: when the system "
-"performs tasks \n"
-" such as account push, password change, account verification, account "
-"collection, \n"
-" and gateway account verification, all tasks are executed through "
-"this unified entry"
-msgstr ""
-"帳號自動化任務統一執行入口,當系統執行帳號推送、更改密碼、驗證帳號、收集帳號"
-"以及驗證網關帳號任務時,統一通過當前任務執行"
+"Unified execution entry for account automation tasks: when the system performs tasks \n"
+" such as account push, password change, account verification, account collection, \n"
+" and gateway account verification, all tasks are executed through this unified entry"
+msgstr "帳號自動化任務統一執行入口,當系統執行帳號推送、更改密碼、驗證帳號、收集帳號以及驗證網關帳號任務時,統一通過當前任務執行"
#: accounts/tasks/automation.py:64 accounts/tasks/automation.py:72
msgid "Execute automation record"
@@ -1505,28 +1475,18 @@ msgstr "週期清理改密記錄和推送記錄"
#: accounts/tasks/automation.py:98
msgid ""
-"The system will periodically clean up unnecessary password change and push "
-"records, \n"
-" including their associated change tasks, execution logs, assets, and "
-"accounts. When any \n"
-" of these associated items are deleted, the corresponding password "
-"change and push records \n"
-" become invalid. Therefore, to maintain a clean and efficient "
-"database, the system will \n"
-" clean up expired records at 2 a.m daily, based on the interval "
-"specified by \n"
-" PERM_EXPIRED_CHECK_PERIODIC in the config.txt configuration file. "
-"This periodic cleanup \n"
-" mechanism helps free up storage space and enhances the security and "
-"overall performance \n"
+"The system will periodically clean up unnecessary password change and push records, \n"
+" including their associated change tasks, execution logs, assets, and accounts. When any \n"
+" of these associated items are deleted, the corresponding password change and push records \n"
+" become invalid. Therefore, to maintain a clean and efficient database, the system will \n"
+" clean up expired records at 2 a.m daily, based on the interval specified by \n"
+" PERM_EXPIRED_CHECK_PERIODIC in the config.txt configuration file. This periodic cleanup \n"
+" mechanism helps free up storage space and enhances the security and overall performance \n"
" of data management"
msgstr ""
-"系統會定期清理不再需要的改密記錄和推送記錄,包括那些關聯的改密任務、執行記"
-"錄、資產和帳號。當這些關聯項中的任意一個被刪除時,對應的改密和推送記錄將變為"
-"無效。因此,為了保持資料庫的整潔和高效運行,根據系統配置文件 config.txt 中 "
-"PERM_EXPIRED_CHECK_PERIODIC 的時間間隔,對於超出時間的記錄,於每天凌晨2點進行"
-"清理。這種定期清理機制不僅有助於釋放儲存空間,還能提高資料管理的安全性和整體"
-"性能"
+"系統會定期清理不再需要的改密記錄和推送記錄,包括那些關聯的改密任務、執行記錄、資產和帳號。當這些關聯項中的任意一個被刪除時,對應的改密和推送記錄將變為無效。因此,為了保持資料庫的整潔和高效運行,根據系統配置文件"
+" config.txt 中 PERM_EXPIRED_CHECK_PERIODIC "
+"的時間間隔,對於超出時間的記錄,於每天凌晨2點進行清理。這種定期清理機制不僅有助於釋放儲存空間,還能提高資料管理的安全性和整體性能"
#: accounts/tasks/push_account.py:16 accounts/tasks/push_account.py:27
msgid "Push accounts to assets"
@@ -1540,8 +1500,7 @@ msgstr "當創建帳號或修改帳號時,需要帳號推送時執行該任務
#: accounts/tasks/remove_account.py:28
msgid ""
-"When clicking \"Sync deletion\" in 'Console - Gather Account - Gathered "
-"accounts' this \n"
+"When clicking \"Sync deletion\" in 'Console - Gather Account - Gathered accounts' this \n"
" task will be executed"
msgstr "在控制台-收集帳號-收集的帳號中單擊同步刪除時,將執行此任務"
@@ -1551,16 +1510,12 @@ msgstr "清理歷史帳號"
#: accounts/tasks/remove_account.py:52
msgid ""
-"Each time an asset account is updated, a historical account is generated, so "
-"it is \n"
-" necessary to clean up the asset account history. The system will "
-"clean up excess account \n"
-" records at 2 a.m. daily based on the configuration in the \"System "
-"settings - Features - \n"
+"Each time an asset account is updated, a historical account is generated, so it is \n"
+" necessary to clean up the asset account history. The system will clean up excess account \n"
+" records at 2 a.m. daily based on the configuration in the \"System settings - Features - \n"
" Account storage - Record limit"
msgstr ""
-"由於每次更新資產帳號,均會生成歷史帳號,因此需要清理資產帳號的歷史。系統會根"
-"據帳號存儲-記錄限制的配置,每天凌晨2點對於超出的數量的帳號記錄進行清理"
+"由於每次更新資產帳號,均會生成歷史帳號,因此需要清理資產帳號的歷史。系統會根據帳號存儲-記錄限制的配置,每天凌晨2點對於超出的數量的帳號記錄進行清理"
#: accounts/tasks/remove_account.py:89
msgid "Remove historical accounts that are out of range."
@@ -1572,8 +1527,7 @@ msgstr "同步資訊到關聯的帳號"
#: accounts/tasks/template.py:14
msgid ""
-"When clicking 'Sync new secret to accounts' in 'Console - Account - "
-"Templates - \n"
+"When clicking 'Sync new secret to accounts' in 'Console - Account - Templates - \n"
" Accounts' this task will be executed"
msgstr "當在控制台-帳號模板-帳號-同步更新帳號信息點擊同步時,執行該任務"
@@ -1629,7 +1583,7 @@ msgstr "任務名稱"
#: accounts/templates/accounts/gather_account_report.html:21
#: accounts/templates/accounts/push_account_report.html:22
#: assets/models/automations/base.py:143 audits/models.py:66
-#: ops/models/base.py:55 ops/models/celery.py:89 ops/models/job.py:239
+#: ops/models/base.py:55 ops/models/celery.py:89 ops/models/job.py:241
#: ops/templates/ops/celery_task_log.html:101
#: perms/models/asset_permission.py:78 settings/serializers/feature.py:27
#: settings/templates/ldap/_msg_import_ldap_user.html:5
@@ -1679,7 +1633,7 @@ msgstr "你好! 以下是資產改密或推送帳戶失敗的情況。 請及
#: accounts/templates/accounts/change_secret_report.html:33
#: accounts/templates/accounts/gather_account_report.html:31
#: accounts/templates/accounts/push_account_report.html:32
-#: assets/serializers/domain.py:24 assets/serializers/platform.py:182
+#: assets/serializers/domain.py:23 assets/serializers/platform.py:182
#: orgs/serializers.py:13 perms/serializers/permission.py:61
msgid "Assets amount"
msgstr "資產數量"
@@ -1718,7 +1672,6 @@ msgstr "否"
#: accounts/templates/accounts/change_secret_report.html:94
#: accounts/templates/accounts/change_secret_report.html:134
#: accounts/templates/accounts/gather_account_report.html:92
-#: accounts/templates/accounts/gather_account_report.html:132
#: accounts/templates/accounts/push_account_report.html:93
#: accounts/templates/accounts/push_account_report.html:133
msgid "No new accounts found"
@@ -1747,10 +1700,14 @@ msgstr "新發現的帳戶"
msgid "Lost accounts"
msgstr "遺失的帳號"
+#: accounts/templates/accounts/gather_account_report.html:132
+msgid "No lost accounts found"
+msgstr "未找到丟失的帳號"
+
#: accounts/utils.py:54
msgid ""
-"If the password starts with {{` and ends with }} `, then the password is not "
-"allowed."
+"If the password starts with {{` and ends with }} `, then the password is not"
+" allowed."
msgstr "如果密碼以 `{{` 開始,並且以 `}}` 結束,則該密碼是不允許的。"
#: accounts/utils.py:62
@@ -1761,16 +1718,16 @@ msgstr "金鑰不合法或金鑰密碼錯誤"
msgid "App Acls"
msgstr "存取控制"
-#: acls/const.py:6 audits/const.py:36 terminal/const.py:11 tickets/const.py:44
+#: acls/const.py:6 audits/const.py:37 terminal/const.py:11 tickets/const.py:44
#: tickets/templates/tickets/approve_check_password.html:47
msgid "Reject"
msgstr "拒絕"
-#: acls/const.py:7 audits/const.py:33 terminal/const.py:9
+#: acls/const.py:7 audits/const.py:34 terminal/const.py:9
msgid "Accept"
msgstr "接受"
-#: acls/const.py:8 audits/const.py:34
+#: acls/const.py:8 audits/const.py:35
msgid "Review"
msgstr "審批"
@@ -1783,7 +1740,7 @@ msgid "Notify"
msgstr "通知"
#: acls/const.py:11
-msgid "Notify and warn"
+msgid "Prompt and warn"
msgstr "提示並警告"
#: acls/const.py:12
@@ -1795,18 +1752,19 @@ msgid "Face Online"
msgstr "人臉在線"
#: acls/models/base.py:37 assets/models/cmd_filter.py:76
-#: terminal/models/component/endpoint.py:115 xpack/plugins/cloud/models.py:316
+#: terminal/models/component/endpoint.py:109 xpack/plugins/cloud/models.py:316
msgid "Priority"
msgstr "優先度"
#: acls/models/base.py:38 assets/models/cmd_filter.py:76
-#: terminal/models/component/endpoint.py:116 xpack/plugins/cloud/models.py:317
+#: terminal/models/component/endpoint.py:110 xpack/plugins/cloud/models.py:317
msgid "1-100, the lower the value will be match first"
msgstr "優先度可選範圍為 1-100 (數值越小越優先)"
#: acls/models/base.py:41 acls/serializers/base.py:57
-#: assets/models/cmd_filter.py:81 audits/models.py:93 audits/serializers.py:108
-#: authentication/serializers/connect_token_secret.py:119
+#: assets/models/cmd_filter.py:81 audits/models.py:93
+#: audits/serializers.py:107
+#: authentication/serializers/connect_token_secret.py:121
#: authentication/templates/authentication/_access_key_modal.html:34
#: perms/serializers/permission.py:63 perms/serializers/permission.py:85
#: tickets/serializers/ticket/ticket.py:21
@@ -1814,7 +1772,7 @@ msgid "Action"
msgstr "動作"
#: acls/models/base.py:42 assets/models/cmd_filter.py:86
-#: authentication/serializers/connect_token_secret.py:91
+#: authentication/serializers/connect_token_secret.py:93
msgid "Reviewers"
msgstr "審批人"
@@ -1825,7 +1783,7 @@ msgid "Users"
msgstr "用戶管理"
#: acls/models/command_acl.py:16 assets/models/cmd_filter.py:60
-#: audits/serializers.py:38 ops/serializers/job.py:92 terminal/const.py:88
+#: ops/serializers/job.py:92 terminal/const.py:88
#: terminal/models/session/session.py:45 terminal/serializers/command.py:18
#: terminal/templates/terminal/_msg_command_alert.html:12
#: terminal/templates/terminal/_msg_command_execute_alert.html:10
@@ -1854,7 +1812,7 @@ msgstr "忽略大小寫"
#: acls/models/command_acl.py:33 acls/models/command_acl.py:97
#: acls/serializers/command_acl.py:29
-#: authentication/serializers/connect_token_secret.py:88
+#: authentication/serializers/connect_token_secret.py:90
#: terminal/templates/terminal/_msg_command_warning.html:14
msgid "Command group"
msgstr "命令組"
@@ -1919,8 +1877,8 @@ msgid ""
"10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64 (Domain name "
"support)"
msgstr ""
-"* 表示匹配所有。例如: 192.168.10.1, 192.168.1.0/24, 10.1.1.1-10.1.1.20, 2001:"
-"db8:2de::e13, 2001:db8:1a:1110::/64 (支持網域)"
+"* 表示匹配所有。例如: 192.168.10.1, 192.168.1.0/24, 10.1.1.1-10.1.1.20, "
+"2001:db8:2de::e13, 2001:db8:1a:1110::/64 (支持網域)"
#: acls/serializers/base.py:41 assets/serializers/asset/host.py:19
msgid "IP/Host"
@@ -1948,14 +1906,14 @@ msgid ""
"With * indicating a match all. Such as: 192.168.10.1, 192.168.1.0/24, "
"10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64 "
msgstr ""
-"* 表示匹配所有。例如: 192.168.10.1, 192.168.1.0/24, 10.1.1.1-10.1.1.20, 2001:"
-"db8:2de::e13, 2001:db8:1a:1110::/64"
+"* 表示匹配所有。例如: 192.168.10.1, 192.168.1.0/24, 10.1.1.1-10.1.1.20, "
+"2001:db8:2de::e13, 2001:db8:1a:1110::/64"
#: acls/serializers/rules/rules.py:33
#: authentication/templates/authentication/_msg_oauth_bind.html:12
#: authentication/templates/authentication/_msg_rest_password_success.html:8
#: authentication/templates/authentication/_msg_rest_public_key_success.html:8
-#: common/drf/renders/base.py:150 xpack/plugins/cloud/models.py:393
+#: common/drf/renders/base.py:152 xpack/plugins/cloud/models.py:393
msgid "IP"
msgstr "IP"
@@ -1988,9 +1946,7 @@ msgid ""
"Please review the login activity to ensure the security and proper usage of "
"the asset. If you did not authorize this login or if you notice any "
"suspicious activity, please take the necessary actions immediately."
-msgstr ""
-"請您稽核此登入行為,以確保資產的安全和正確使用。如果您未授權此次登入或發現任"
-"何可疑行為,請立即採取必要的行動。"
+msgstr "請您稽核此登入行為,以確保資產的安全和正確使用。如果您未授權此次登入或發現任何可疑行為,請立即採取必要的行動。"
#: acls/templates/acls/asset_login_reminder.html:16
#: acls/templates/acls/user_login_reminder.html:16
@@ -2013,15 +1969,15 @@ msgid "Login city"
msgstr "登錄城市"
#: acls/templates/acls/user_login_reminder.html:11 audits/models.py:198
-#: audits/models.py:267 audits/serializers.py:92
+#: audits/models.py:267 audits/serializers.py:91
msgid "User agent"
msgstr "用戶代理"
-#: assets/api/asset/asset.py:194
+#: assets/api/asset/asset.py:153
msgid "Cannot create asset directly, you should create a host or other"
msgstr "不能直接創建資產, 你應該創建主機或其他資產"
-#: assets/api/asset/asset.py:198
+#: assets/api/asset/asset.py:157
msgid "The number of assets exceeds the limit of 5000"
msgstr "資產數量超過 5000 的限制"
@@ -2053,34 +2009,34 @@ msgstr "資產管理"
msgid "Task: {} finished"
msgstr "任務:{} 完成"
-#: assets/automations/base/manager.py:338
+#: assets/automations/base/manager.py:339
msgid " - Platform {} ansible disabled"
msgstr " - 平台 {} Ansible 已禁用, 無法執行任務"
-#: assets/automations/base/manager.py:524
+#: assets/automations/base/manager.py:525
msgid ">>> Task preparation phase"
msgstr ">>> 任務準備階段"
-#: assets/automations/base/manager.py:528
+#: assets/automations/base/manager.py:529
#, python-brace-format
msgid ">>> Executing tasks in batches, total {runner_count}"
msgstr ">>> 分次執行任務,總共 {runner_count}"
-#: assets/automations/base/manager.py:533
+#: assets/automations/base/manager.py:534
msgid ">>> Start executing tasks"
msgstr ">>> 開始執行任務"
-#: assets/automations/base/manager.py:535
+#: assets/automations/base/manager.py:536
msgid ">>> No tasks need to be executed"
msgstr ">>> 沒有需要執行的任務"
-#: assets/automations/base/manager.py:539
+#: assets/automations/base/manager.py:540
#, python-brace-format
msgid ">>> Begin executing batch {index} of tasks"
msgstr ">>> 開始執行第 {index} 批任務"
#: assets/automations/ping_gateway/manager.py:33
-#: authentication/models/connection_token.py:145
+#: authentication/models/connection_token.py:176
msgid "No account"
msgstr "沒有帳號"
@@ -2107,7 +2063,7 @@ msgstr "連接失敗"
msgid ">>> Start executing the task to test gateway connectivity"
msgstr ">>> 開始執行測試網關可連接性任務"
-#: assets/const/automation.py:6 audits/const.py:6 audits/const.py:47
+#: assets/const/automation.py:6 audits/const.py:6 audits/const.py:48
#: audits/signal_handlers/activity_log.py:63 common/utils/ip/geoip/utils.py:31
#: common/utils/ip/geoip/utils.py:37 common/utils/ip/utils.py:104
msgid "Unknown"
@@ -2133,7 +2089,7 @@ msgstr "測試網關"
msgid "Gather facts"
msgstr "收集資產資訊"
-#: assets/const/base.py:32 audits/const.py:58
+#: assets/const/base.py:32 audits/const.py:59
#: terminal/serializers/applet_host.py:32 users/models/user/_auth.py:31
msgid "Disabled"
msgstr "禁用"
@@ -2167,12 +2123,12 @@ msgid "Cloud service"
msgstr "雲服務"
#: assets/const/category.py:14 assets/models/asset/gpt.py:11
-#: assets/models/asset/web.py:16 audits/const.py:45
+#: assets/models/asset/web.py:16 audits/const.py:46
#: terminal/models/applet/applet.py:28 users/const.py:76
msgid "Web"
msgstr "Web"
-#: assets/const/category.py:15 common/sdk/sms/endpoint.py:20
+#: assets/const/category.py:16 common/sdk/sms/endpoint.py:20
msgid "Custom type"
msgstr "自訂"
@@ -2208,8 +2164,8 @@ msgstr ""
msgid "TP-Link"
msgstr ""
-#: assets/const/device.py:12 terminal/models/applet/applet.py:27
-#: tickets/const.py:9
+#: assets/const/device.py:12 assets/const/ds.py:7
+#: terminal/models/applet/applet.py:27 tickets/const.py:9
msgid "General"
msgstr "一般"
@@ -2225,6 +2181,10 @@ msgstr "路由器"
msgid "Firewall"
msgstr "防火牆"
+#: assets/const/ds.py:10
+msgid "Windows Active Directory"
+msgstr ""
+
#: assets/const/gpt.py:7
msgid "ChatGPT"
msgstr "ChatGPT"
@@ -2245,8 +2205,8 @@ msgstr "舊的 SSH 版本,例如 openssh 5.x 或 6.x"
#: assets/const/protocol.py:53
msgid "Netcat help text"
msgstr ""
-"使用 netcat (nc) 作為代理工具,將連線從代理伺服器轉送到目標主機。適用於不支"
-"援 SSH 原生代理選項 (-W) 的環境,或需要更多靈活性和逾時控制的場景。"
+"使用 netcat (nc) 作為代理工具,將連線從代理伺服器轉送到目標主機。適用於不支援 SSH 原生代理選項 (-W) "
+"的環境,或需要更多靈活性和逾時控制的場景。"
#: assets/const/protocol.py:64
msgid "SFTP root"
@@ -2259,8 +2219,7 @@ msgid ""
"account username
- ${HOME} The home directory of the connected account "
"
- ${USER} The username of the user"
msgstr ""
-"SFTP根目錄,支持變數:
-${ACCOUNT}已連接帳戶使用者名稱
-${HOME}連接帳戶"
-"的主目錄
-${USER}用戶的使用者名稱"
+"SFTP根目錄,支持變數:
-${ACCOUNT}已連接帳戶使用者名稱
-${HOME}連接帳戶的主目錄
-${USER}用戶的使用者名稱"
#: assets/const/protocol.py:81
msgid "Console"
@@ -2275,24 +2234,23 @@ msgid "Any"
msgstr "任意"
#: assets/const/protocol.py:88 rbac/tree.py:62
-#: settings/serializers/security.py:241
+#: settings/serializers/security.py:245
msgid "Security"
msgstr "安全"
#: assets/const/protocol.py:89
msgid ""
-"Security layer to use for the connection:
Any
Automatically select the "
-"security mode based on the security protocols supported by both the client "
+"Security layer to use for the connection:
Any
Automatically select the"
+" security mode based on the security protocols supported by both the client "
"and the server
RDP
Legacy RDP encryption. This mode is generally only "
"used for older Windows servers or in cases where a standard Windows login "
"screen is desired
TLS
RDP authentication and encryption implemented "
"via TLS.
NLA
This mode uses TLS encryption and requires the username "
"and password to be given in advance"
msgstr ""
-"連接的安全層:
Any
根據客戶端和伺服器支援的安全協議自動選擇安全模式"
-"
RDP
傳統的 RDP 加密模式。通常僅用於較舊的 Windows 伺服器或需要標準 "
-"Windows 登入螢幕的情況
TLS
通過 TLS 實現的 RDP 認證和加密
NLA
此"
-"模式使用 TLS 加密,並要求提前提供用戶名和密碼
"
+"連接的安全層:
Any
根據客戶端和伺服器支援的安全協議自動選擇安全模式
RDP
傳統的 RDP 加密模式。通常僅用於較舊的 "
+"Windows 伺服器或需要標準 Windows 登入螢幕的情況
TLS
通過 TLS 實現的 RDP "
+"認證和加密
NLA
此模式使用 TLS 加密,並要求提前提供用戶名和密碼
"
#: assets/const/protocol.py:106
msgid "AD domain"
@@ -2348,7 +2306,7 @@ msgstr "認證資料庫"
msgid "The database to authenticate against"
msgstr "要進行身份驗證的資料庫"
-#: assets/const/protocol.py:232 authentication/models/connection_token.py:47
+#: assets/const/protocol.py:232 authentication/models/connection_token.py:48
msgid "Connect options"
msgstr "連接項"
@@ -2368,8 +2326,7 @@ msgstr "安全模式"
msgid ""
"When safe mode is enabled, some operations will be disabled, such as: New "
"tab, right click, visit other website, etc."
-msgstr ""
-"當安全模式啟用時,一些操作將被禁用,例如:新建標籤頁、右鍵、訪問其它網站 等"
+msgstr "當安全模式啟用時,一些操作將被禁用,例如:新建標籤頁、右鍵、訪問其它網站 等"
#: assets/const/protocol.py:275 assets/models/asset/web.py:9
#: assets/serializers/asset/info/spec.py:16
@@ -2392,7 +2349,7 @@ msgstr "確認按鈕選擇器"
msgid "API mode"
msgstr "API 模式"
-#: assets/const/types.py:249
+#: assets/const/types.py:252
msgid "All types"
msgstr "所有類型"
@@ -2415,15 +2372,15 @@ msgstr "雲服務"
msgid "Port"
msgstr "埠"
-#: assets/models/asset/common.py:167 assets/serializers/asset/common.py:172
+#: assets/models/asset/common.py:167 assets/serializers/asset/common.py:174
#: settings/serializers/terminal.py:10
msgid "Address"
msgstr "地址"
-#: assets/models/asset/common.py:169 assets/models/platform.py:149
+#: assets/models/asset/common.py:169 assets/models/platform.py:155
#: assets/serializers/asset/common.py:150
#: authentication/backends/passkey/models.py:12
-#: authentication/serializers/connect_token_secret.py:118
+#: authentication/serializers/connect_token_secret.py:120
#: perms/serializers/user_permission.py:25 xpack/plugins/cloud/models.py:387
msgid "Platform"
msgstr "系統平台"
@@ -2432,34 +2389,34 @@ msgstr "系統平台"
msgid "Zone"
msgstr "網域"
-#: assets/models/asset/common.py:176 assets/serializers/asset/common.py:174
+#: assets/models/asset/common.py:176 assets/serializers/asset/common.py:176
#: assets/serializers/automations/base.py:21 ops/serializers/job.py:22
#: perms/serializers/permission.py:58
msgid "Nodes"
msgstr "節點"
-#: assets/models/asset/common.py:179 assets/serializers/asset/common.py:422
+#: assets/models/asset/common.py:183 assets/serializers/asset/common.py:425
#: assets/serializers/asset/host.py:11
msgid "Gathered info"
msgstr "收集資產硬體資訊"
-#: assets/models/asset/common.py:180 assets/serializers/asset/custom.py:14
+#: assets/models/asset/common.py:184 assets/serializers/asset/custom.py:14
msgid "Custom info"
msgstr "自訂屬性"
-#: assets/models/asset/common.py:369
+#: assets/models/asset/common.py:431
msgid "Can refresh asset hardware info"
msgstr "可以更新資產硬體資訊"
-#: assets/models/asset/common.py:370
+#: assets/models/asset/common.py:432
msgid "Can test asset connectivity"
msgstr "可以測試資產連接性"
-#: assets/models/asset/common.py:371
+#: assets/models/asset/common.py:433
msgid "Can match asset"
msgstr "可以匹配資產"
-#: assets/models/asset/common.py:372
+#: assets/models/asset/common.py:434
msgid "Can change asset nodes"
msgstr "可以修改資產節點"
@@ -2487,19 +2444,23 @@ msgstr "忽略證書校驗"
msgid "Postgresql SSL mode"
msgstr "PostgreSQL SSL 模式"
+#: assets/models/asset/ds.py:10 assets/serializers/asset/ds.py:20
+msgid "Domain name"
+msgstr "域名稱"
+
#: assets/models/asset/gpt.py:8 settings/serializers/feature.py:139
#: settings/serializers/feature.py:154
msgid "Proxy"
msgstr "代理"
#: assets/models/automations/base.py:23 assets/models/cmd_filter.py:32
-#: assets/models/node.py:553 ops/models/job.py:156
+#: assets/models/node.py:553 ops/models/job.py:158
#: perms/models/asset_permission.py:72 tickets/models/ticket/apply_asset.py:15
#: xpack/plugins/cloud/models.py:388
msgid "Node"
msgstr "節點"
-#: assets/models/automations/base.py:29 ops/models/job.py:234
+#: assets/models/automations/base.py:29 ops/models/job.py:236
#: ops/serializers/job.py:24 settings/serializers/auth/sms.py:108
msgid "Parameters"
msgstr "參數"
@@ -2519,7 +2480,7 @@ msgstr "資產自動化任務"
# msgid "Comment"
# msgstr "備註"
#: assets/models/automations/base.py:140 assets/models/cmd_filter.py:41
-#: common/db/models.py:34 ops/models/base.py:54 ops/models/job.py:238
+#: common/db/models.py:34 ops/models/base.py:54 ops/models/job.py:240
#: users/models/user/__init__.py:317
msgid "Date created"
msgstr "創建日期"
@@ -2530,14 +2491,14 @@ msgstr "創建日期"
msgid "Trigger mode"
msgstr "觸發模式"
-#: assets/models/automations/base.py:157 audits/serializers.py:39
-#: ops/models/base.py:52 ops/models/job.py:236
+#: assets/models/automations/base.py:157 audits/serializers.py:38
+#: ops/models/base.py:52 ops/models/job.py:238
#: xpack/plugins/cloud/manager.py:103
msgid "Summary"
msgstr "匯總"
#: assets/models/automations/base.py:158 ops/models/base.py:51
-#: ops/models/job.py:235 xpack/plugins/cloud/models.py:225
+#: ops/models/job.py:237 xpack/plugins/cloud/models.py:225
msgid "Result"
msgstr "結果"
@@ -2601,7 +2562,7 @@ msgstr "命令過濾規則"
msgid "Favorite asset"
msgstr "收藏的資產"
-#: assets/models/gateway.py:34 assets/serializers/domain.py:19
+#: assets/models/gateway.py:34 assets/serializers/domain.py:18
msgid "Gateway"
msgstr "網關"
@@ -2612,8 +2573,8 @@ msgstr "系統"
#: assets/models/label.py:19 assets/models/node.py:539
#: assets/serializers/cagegory.py:11 assets/serializers/cagegory.py:18
#: assets/serializers/cagegory.py:24
-#: authentication/models/connection_token.py:33
-#: authentication/serializers/connect_token_secret.py:125
+#: authentication/models/connection_token.py:34
+#: authentication/serializers/connect_token_secret.py:127
#: common/serializers/common.py:86 labels/models.py:12 settings/models.py:38
#: users/models/preference.py:13
msgid "Value"
@@ -2622,7 +2583,7 @@ msgstr "值"
#: assets/models/label.py:40 assets/serializers/cagegory.py:10
#: assets/serializers/cagegory.py:17 assets/serializers/cagegory.py:23
#: assets/serializers/platform.py:159
-#: authentication/serializers/connect_token_secret.py:124
+#: authentication/serializers/connect_token_secret.py:126
#: common/serializers/common.py:85 labels/serializers.py:45
#: settings/serializers/msg.py:90 xpack/plugins/cloud/models.py:392
msgid "Label"
@@ -2688,7 +2649,7 @@ msgstr "開放的"
msgid "Setting"
msgstr "設置"
-#: assets/models/platform.py:38 audits/const.py:59
+#: assets/models/platform.py:38 audits/const.py:60
#: authentication/backends/passkey/models.py:11 settings/models.py:41
#: terminal/serializers/applet_host.py:33 users/models/user/_auth.py:32
msgid "Enabled"
@@ -2788,15 +2749,19 @@ msgstr "編碼"
msgid "Gateway enabled"
msgstr "啟用網域"
-#: assets/models/platform.py:106 assets/serializers/platform.py:202
+#: assets/models/platform.py:105
+msgid "DS enabled"
+msgstr "目錄服務已啟用"
+
+#: assets/models/platform.py:107 assets/serializers/platform.py:202
msgid "Su enabled"
msgstr "啟用帳號切換"
-#: assets/models/platform.py:107 assets/serializers/platform.py:177
+#: assets/models/platform.py:108 assets/serializers/platform.py:177
msgid "Su method"
msgstr "帳號切換方式"
-#: assets/models/platform.py:108 assets/serializers/platform.py:180
+#: assets/models/platform.py:109 assets/serializers/platform.py:180
msgid "Custom fields"
msgstr "自訂屬性"
@@ -2823,9 +2788,7 @@ msgstr "協定,格式為 名稱/連接埠"
msgid ""
"Accounts, format [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", "
"\"secret_type\": \"password\"}]"
-msgstr ""
-"帳號,格式為 [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", "
-"\"secret_type\": \"password\"}]"
+msgstr "帳號,格式為 [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", \"secret_type\": \"password\"}]"
#: assets/serializers/asset/common.py:135
msgid ""
@@ -2835,36 +2798,36 @@ msgstr "節點路徑,格式為 [\"/組織/節點名稱\"], 如果節點不存
#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:174
#: authentication/serializers/connect_token_secret.py:30
-#: authentication/serializers/connect_token_secret.py:75
+#: authentication/serializers/connect_token_secret.py:77
#: perms/models/asset_permission.py:76 perms/serializers/permission.py:67
-#: perms/serializers/user_permission.py:74 xpack/plugins/cloud/models.py:390
+#: perms/serializers/user_permission.py:75 xpack/plugins/cloud/models.py:390
#: xpack/plugins/cloud/serializers/task.py:36
msgid "Protocols"
msgstr "協議組"
#: assets/serializers/asset/common.py:149
-#: assets/serializers/asset/common.py:173
+#: assets/serializers/asset/common.py:175
msgid "Node path"
msgstr "節點路徑"
-#: assets/serializers/asset/common.py:170
-#: assets/serializers/asset/common.py:423
+#: assets/serializers/asset/common.py:172
+#: assets/serializers/asset/common.py:426
msgid "Auto info"
msgstr "自動化資訊"
-#: assets/serializers/asset/common.py:268
+#: assets/serializers/asset/common.py:271
msgid "Platform not exist"
msgstr "平台不存在"
-#: assets/serializers/asset/common.py:304
+#: assets/serializers/asset/common.py:307
msgid "port out of range (0-65535)"
msgstr "埠超出範圍 (0-65535)"
-#: assets/serializers/asset/common.py:311
+#: assets/serializers/asset/common.py:314
msgid "Protocol is required: {}"
msgstr "協議是必填的: {}"
-#: assets/serializers/asset/common.py:350
+#: assets/serializers/asset/common.py:353
msgid "Invalid data"
msgstr "無效的數據"
@@ -2875,27 +2838,32 @@ msgstr "默認資料庫"
#: assets/serializers/asset/database.py:23
msgid "CA cert help text"
msgstr ""
-"Common Name (CN) 字段已被棄用,請根據 RFC 5280 使用 Subject Alternative Name "
-"(SAN) 字段來驗證網域名,以提高安全性。"
+"Common Name (CN) 字段已被棄用,請根據 RFC 5280 使用 Subject Alternative Name (SAN) "
+"字段來驗證網域名,以提高安全性。"
#: assets/serializers/asset/database.py:24
msgid "Postgresql ssl model help text"
msgstr ""
"Prefer:我不在乎是否加密,但如果伺服器支持加密,我願意支付加密的費用。\n"
-"Require:我希望我的資料被加密,我可以承擔那個費用。我相信網路將確保我始終連接"
-"到我想要的伺服器。\n"
-"Verify CA:我希望我的資料被加密,我可以承擔那個費用。我想要確認我連接到我信任"
-"的伺服器。\n"
-"Verify Full:我希望我的資料被加密,我接受負擔。我想確保我連接到我信任的伺服"
-"器,並且它是我指定的伺服器。"
+"Require:我希望我的資料被加密,我可以承擔那個費用。我相信網路將確保我始終連接到我想要的伺服器。\n"
+"Verify CA:我希望我的資料被加密,我可以承擔那個費用。我想要確認我連接到我信任的伺服器。\n"
+"Verify Full:我希望我的資料被加密,我接受負擔。我想確保我連接到我信任的伺服器,並且它是我指定的伺服器。"
+
+#: assets/serializers/asset/ds.py:18
+msgid ""
+"The domain part used by the directory service (e.g., AD) and appended to the"
+" username during login, such as example.com in user@example.com."
+msgstr ""
+"域名(Domain Name)用於目錄服務(如 AD)登錄時附加在用戶名後的域名部分,例如 user@example.com 中的 example.com \n"
+"模塊 {} 不適用於此資產 \n"
+"執行手動或定時雲同步任務時執行此任務 \n"
+"每天系統會根據「系統設定-任務-定期清理-雲同步任務歷史記錄保留天數」中的配置,清理雲同步執行過程中產生的記錄。"
#: assets/serializers/asset/gpt.py:20
msgid ""
-"If the server cannot directly connect to the API address, you need set up an "
-"HTTP proxy. e.g. http(s)://host:port"
-msgstr ""
-"如果伺服器不能直接訪問 api 地址,你需要設置一個 HTTP 代理。例如 http(s)://"
-"host:port"
+"If the server cannot directly connect to the API address, you need set up an"
+" HTTP proxy. e.g. http(s)://host:port"
+msgstr "如果伺服器不能直接訪問 api 地址,你需要設置一個 HTTP 代理。例如 http(s)://host:port"
#: assets/serializers/asset/gpt.py:24
msgid "HTTP proxy"
@@ -2943,7 +2911,7 @@ msgid "Disk total"
msgstr "硬碟大小"
#: assets/serializers/asset/info/gathered.py:16
-#: authentication/serializers/connect_token_secret.py:115
+#: authentication/serializers/connect_token_secret.py:117
msgid "OS"
msgstr "操作系統"
@@ -2967,7 +2935,7 @@ msgstr "約束"
msgid "Types"
msgstr "類型"
-#: assets/serializers/domain.py:21
+#: assets/serializers/domain.py:20
msgid ""
"A gateway is a network proxy for a zone, and when connecting assets within "
"the zone, the connection is routed through the gateway."
@@ -3070,9 +3038,7 @@ msgid ""
"Login with account when accessing assets, then automatically switch to "
"another, similar to logging in with a regular account and then switching to "
"root"
-msgstr ""
-"在訪問資產時使用帳戶登入,然後自動切換到另一個帳戶,就像用普通帳戶登入然後切"
-"換到 root 一樣"
+msgstr "在訪問資產時使用帳戶登入,然後自動切換到另一個帳戶,就像用普通帳戶登入然後切換到 root 一樣"
#: assets/serializers/platform.py:210
msgid "Assets can be connected using a zone gateway"
@@ -3082,11 +3048,11 @@ msgstr "資產可以使用區域網關進行連接"
msgid "Default Domain"
msgstr "默認網域"
-#: assets/serializers/platform.py:234
+#: assets/serializers/platform.py:239
msgid "type is required"
msgstr "類型 該欄位是必填項。"
-#: assets/serializers/platform.py:249
+#: assets/serializers/platform.py:254
msgid "Protocols is required"
msgstr "協議是必填的"
@@ -3112,8 +3078,7 @@ msgstr "收集資產資訊"
#: assets/tasks/gather_facts.py:25
msgid ""
-"When clicking 'Refresh hardware info' in 'Console - Asset Details - Basic' "
-"this task \n"
+"When clicking 'Refresh hardware info' in 'Console - Asset Details - Basic' this task \n"
" will be executed"
msgstr "當在控制台資產詳情-基本設置點擊更新硬體信息執行該任務"
@@ -3131,18 +3096,15 @@ msgstr "檢查節點下資產數量"
#: assets/tasks/nodes_amount.py:18
msgid ""
-"Manually verifying asset quantities updates the asset count for nodes under "
-"the \n"
-" current organization. This task will be called in the following two "
-"cases: when updating \n"
+"Manually verifying asset quantities updates the asset count for nodes under the \n"
+" current organization. This task will be called in the following two cases: when updating \n"
" nodes and when the number of nodes exceeds 100"
-msgstr ""
-"手動校對資產數量更新當前組織下的節點資產數量;更新節點時,當節點數量超過100"
-"時,會調用該任務"
+msgstr "手動校對資產數量更新當前組織下的節點資產數量;更新節點時,當節點數量超過100時,會調用該任務"
#: assets/tasks/nodes_amount.py:34
msgid ""
-"The task of self-checking is already running and cannot be started repeatedly"
+"The task of self-checking is already running and cannot be started "
+"repeatedly"
msgstr "自檢程序已經在運行,不能重複啟動"
#: assets/tasks/nodes_amount.py:40
@@ -3151,11 +3113,9 @@ msgstr "週期性檢查節點下資產數量"
#: assets/tasks/nodes_amount.py:42
msgid ""
-"Schedule the check_node_assets_amount_task to periodically update the asset "
-"count of \n"
+"Schedule the check_node_assets_amount_task to periodically update the asset count of \n"
" all nodes under all organizations"
-msgstr ""
-"定時調用check_node_assets_amount_task任務,更新所有組織下所有節點的資產數量"
+msgstr "定時調用check_node_assets_amount_task任務,更新所有組織下所有節點的資產數量"
#: assets/tasks/ping.py:20 assets/tasks/ping.py:30
msgid "Test assets connectivity"
@@ -3178,8 +3138,8 @@ msgstr "測試網關可連接性"
#: assets/tasks/ping_gateway.py:23
msgid ""
-"When clicking 'Test Connection' in 'Domain Details - Gateway' this task will "
-"be executed"
+"When clicking 'Test Connection' in 'Domain Details - Gateway' this task will"
+" be executed"
msgstr "當在網域詳情-網關-測試連接時,執行該任務"
#: assets/tasks/utils.py:16
@@ -3203,7 +3163,8 @@ msgid "App Audits"
msgstr "日志审计"
#: audits/backends/db.py:17
-msgid "The text content is too long. Use Elasticsearch to store operation logs"
+msgid ""
+"The text content is too long. Use Elasticsearch to store operation logs"
msgstr "文字內容太長。請使用 Elasticsearch 儲存操作日誌"
#: audits/backends/db.py:78
@@ -3244,7 +3205,7 @@ msgstr "重命名"
msgid "Symlink"
msgstr "建立軟連結"
-#: audits/const.py:18 audits/const.py:28
+#: audits/const.py:18 audits/const.py:29
#: ops/templates/ops/celery_task_log.html:86
#: terminal/api/session/session.py:154
msgid "Download"
@@ -3267,56 +3228,60 @@ msgstr "查看"
msgid "Create"
msgstr "創建"
-#: audits/const.py:29
+#: audits/const.py:27 templates/_csv_import_export.html:8
+msgid "Export"
+msgstr "匯出"
+
+#: audits/const.py:30
msgid "Connect"
msgstr "連接"
-#: audits/const.py:30 authentication/templates/authentication/login.html:329
+#: audits/const.py:31 authentication/templates/authentication/login.html:329
#: authentication/templates/authentication/login.html:401
#: templates/_header_bar.html:101
msgid "Login"
msgstr "登錄"
-#: audits/const.py:35 rbac/tree.py:56
+#: audits/const.py:36 rbac/tree.py:56
msgid "Notifications"
msgstr "通知"
-#: audits/const.py:37 tickets/const.py:45
+#: audits/const.py:38 tickets/const.py:45
msgid "Approve"
msgstr "同意"
-#: audits/const.py:41 ops/models/celery.py:85
+#: audits/const.py:42 ops/models/celery.py:85
#: terminal/models/session/sharing.py:128 tickets/const.py:25
#: xpack/plugins/cloud/const.py:67
msgid "Finished"
msgstr "結束"
-#: audits/const.py:46 settings/serializers/terminal.py:6
+#: audits/const.py:47 settings/serializers/terminal.py:6
#: terminal/models/applet/host.py:26 terminal/models/component/terminal.py:185
-#: terminal/models/virtualapp/provider.py:14 terminal/serializers/session.py:57
-#: terminal/serializers/session.py:113
+#: terminal/models/virtualapp/provider.py:14
+#: terminal/serializers/session.py:57 terminal/serializers/session.py:113
msgid "Terminal"
msgstr "終端"
-#: audits/const.py:51 audits/models.py:133
+#: audits/const.py:52 audits/models.py:133
msgid "Operate log"
msgstr "操作日誌"
-#: audits/const.py:52
+#: audits/const.py:53
msgid "Session log"
msgstr "會話日誌"
-#: audits/const.py:53
+#: audits/const.py:54
msgid "Login log"
msgstr "登錄日誌"
-#: audits/const.py:54 rbac/tree.py:64 terminal/models/applet/host.py:144
+#: audits/const.py:55 rbac/tree.py:64 terminal/models/applet/host.py:144
#: terminal/models/component/task.py:22
#: xpack/plugins/cloud/serializers/account.py:77
msgid "Task"
msgstr "任務"
-#: audits/const.py:60
+#: audits/const.py:61
msgid "-"
msgstr "-"
@@ -3334,7 +3299,7 @@ msgstr "作業審計"
msgid "Remote addr"
msgstr "遠端地址"
-#: audits/models.py:62 audits/serializers.py:62
+#: audits/models.py:62 audits/serializers.py:61
msgid "Operate"
msgstr "操作"
@@ -3359,17 +3324,17 @@ msgstr "會話"
msgid "File transfer log"
msgstr "文件管理"
-#: audits/models.py:95 audits/serializers.py:110
+#: audits/models.py:95 audits/serializers.py:109
msgid "Resource Type"
msgstr "資源類型"
#: audits/models.py:96 audits/models.py:99 audits/models.py:145
-#: audits/serializers.py:109 labels/serializers.py:46
+#: audits/serializers.py:108 labels/serializers.py:46
msgid "Resource"
msgstr "資源"
#: audits/models.py:102 audits/models.py:148 audits/models.py:178
-#: audits/models.py:314 audits/serializers.py:230
+#: audits/models.py:314 audits/serializers.py:232
#: terminal/serializers/command.py:75
msgid "Datetime"
msgstr "日期"
@@ -3403,7 +3368,7 @@ msgstr "登錄方式"
msgid "Login IP"
msgstr "登錄 IP"
-#: audits/models.py:201 audits/serializers.py:76
+#: audits/models.py:201 audits/serializers.py:75
#: authentication/templates/authentication/_mfa_confirm_modal.html:14
#: users/forms/profile.py:64 users/models/user/__init__.py:82
#: users/serializers/profile.py:71
@@ -3454,37 +3419,37 @@ msgid "Application ID"
msgstr "應用 ID"
#: audits/serializers.py:33 ops/models/adhoc.py:24 ops/models/base.py:16
-#: ops/models/base.py:53 ops/models/celery.py:87 ops/models/job.py:154
-#: ops/models/job.py:237 ops/models/playbook.py:30 ops/models/variable.py:17
+#: ops/models/base.py:53 ops/models/celery.py:87 ops/models/job.py:156
+#: ops/models/job.py:239 ops/models/playbook.py:30 ops/models/variable.py:17
#: terminal/models/session/sharing.py:25
msgid "Creator"
msgstr "創建者"
-#: audits/serializers.py:40 ops/serializers/celery.py:33
+#: audits/serializers.py:39 ops/serializers/celery.py:33
msgid "Execution cycle"
msgstr "週期性Action"
-#: audits/serializers.py:93
+#: audits/serializers.py:92
msgid "Reason display"
msgstr "原因描述"
-#: audits/serializers.py:94 audits/serializers.py:208
+#: audits/serializers.py:93 audits/serializers.py:210
msgid "Auth backend display"
msgstr "认证代币描述"
-#: audits/serializers.py:158
+#: audits/serializers.py:157
#, python-format
msgid "%s %s this resource"
msgstr "用户 %s %s 了当前资源"
-#: audits/serializers.py:196 authentication/models/connection_token.py:51
+#: audits/serializers.py:198 authentication/models/connection_token.py:52
#: authentication/models/temp_token.py:13 perms/models/asset_permission.py:80
#: tickets/models/ticket/apply_application.py:31
#: tickets/models/ticket/apply_asset.py:21 users/models/user/__init__.py:101
msgid "Date expired"
msgstr "失效日期"
-#: audits/serializers.py:227 terminal/models/component/terminal.py:91
+#: audits/serializers.py:229 terminal/models/component/terminal.py:91
#: terminal/serializers/command.py:76
msgid "Remote Address"
msgstr "遠端地址"
@@ -3562,17 +3527,13 @@ msgstr "清理資產審計會話任務日誌"
#: audits/tasks.py:134
msgid ""
-"Since the system generates login logs, operation logs, file upload logs, "
-"activity \n"
-" logs, Celery execution logs, session recordings, command records, "
-"and password change \n"
-" logs, it will perform cleanup of records that exceed the time limit "
-"according to the \n"
+"Since the system generates login logs, operation logs, file upload logs, activity \n"
+" logs, Celery execution logs, session recordings, command records, and password change \n"
+" logs, it will perform cleanup of records that exceed the time limit according to the \n"
" 'Tasks - Regular clean-up' in the system settings at 2 a.m daily"
msgstr ""
-"由於系統會產生登錄日誌、操作日誌、文件上傳日誌、活動日誌、celery執行日誌、會"
-"話錄像和命令記錄、改密日誌,系統會根據系統設置-任務列表定期清理配置,對於超出"
-"時間的,將於每天凌晨2點進行清理"
+"由於系統會產生登錄日誌、操作日誌、文件上傳日誌、活動日誌、celery執行日誌、會話錄像和命令記錄、改密日誌,系統會根據系統設置-"
+"任務列表定期清理配置,對於超出時間的,將於每天凌晨2點進行清理"
#: audits/tasks.py:154
msgid "Upload FTP file to external storage"
@@ -3580,11 +3541,9 @@ msgstr "上傳 FTP 文件到外部儲存"
#: audits/tasks.py:156
msgid ""
-"If SERVER_REPLAY_STORAGE is configured, files uploaded through file "
-"management will be \n"
+"If SERVER_REPLAY_STORAGE is configured, files uploaded through file management will be \n"
" synchronized to external storage"
-msgstr ""
-"如果設定了SERVER_REPLAY_STORAGE,將通過文件管理上傳的文件同步到外部儲存"
+msgstr "如果設定了SERVER_REPLAY_STORAGE,將通過文件管理上傳的文件同步到外部儲存"
#: authentication/api/access_key.py:39
msgid "Access keys can be created at most 10"
@@ -3599,39 +3558,39 @@ msgstr "參數中的值必須包含 %s"
msgid "This action require verify your MFA"
msgstr "該操作需要驗證您的 MFA, 請先開啟並配置"
-#: authentication/api/connection_token.py:303
+#: authentication/api/connection_token.py:304
msgid "Reusable connection token is not allowed, global setting not enabled"
msgstr "不允許使用可重複使用的連接令牌,未啟用全局設置"
-#: authentication/api/connection_token.py:423
+#: authentication/api/connection_token.py:424
msgid "Anonymous account is not supported for this asset"
msgstr "匿名帳號不支持當前資產"
-#: authentication/api/connection_token.py:455
+#: authentication/api/connection_token.py:454
msgid "Permission expired"
msgstr "授權已過期"
-#: authentication/api/connection_token.py:488
+#: authentication/api/connection_token.py:487
msgid "ACL action is reject: {}({})"
msgstr "ACL 動作是拒絕: {}({})"
-#: authentication/api/connection_token.py:492
+#: authentication/api/connection_token.py:491
msgid "ACL action is review"
msgstr "ACL 動作是覆核"
-#: authentication/api/connection_token.py:502
+#: authentication/api/connection_token.py:501
msgid "ACL action is face verify"
msgstr "ACL Action 係人臉驗證"
-#: authentication/api/connection_token.py:507
+#: authentication/api/connection_token.py:506
msgid "ACL action not supported for this asset"
msgstr "資產登錄規則不支持當前資產"
-#: authentication/api/connection_token.py:514
+#: authentication/api/connection_token.py:513
msgid "ACL action is face online"
msgstr "ACL Action 係人臉在線"
-#: authentication/api/connection_token.py:533
+#: authentication/api/connection_token.py:532
msgid "No available face feature"
msgstr "沒有可用的人臉特徵"
@@ -3748,16 +3707,16 @@ msgstr "虛擬 MFA"
msgid "SMS"
msgstr "簡訊"
-#: authentication/const.py:34
+#: authentication/const.py:35
msgid "Face Recognition"
msgstr "臉部辨識"
-#: authentication/const.py:35 settings/serializers/auth/radius.py:14
+#: authentication/const.py:36 settings/serializers/auth/radius.py:14
#: settings/serializers/auth/radius.py:16
msgid "Radius"
msgstr "Radius"
-#: authentication/const.py:36
+#: authentication/const.py:37
msgid "Custom"
msgstr "自定義"
@@ -3816,8 +3775,7 @@ msgid ""
"You can also try {times_try} times (The account will be temporarily locked "
"for {block_time} minutes)"
msgstr ""
-"您輸入的使用者名稱或密碼不正確,請重新輸入。 您還可以嘗試 {times_try} 次 (帳"
-"號將被臨時 鎖定 {block_time} 分鐘)"
+"您輸入的使用者名稱或密碼不正確,請重新輸入。 您還可以嘗試 {times_try} 次 (帳號將被臨時 鎖定 {block_time} 分鐘)"
#: authentication/errors/const.py:47 authentication/errors/const.py:55
msgid ""
@@ -3834,10 +3792,9 @@ msgstr "IP 已被鎖定 (請聯絡管理員解鎖或 {} 分鐘後重試)"
#: authentication/errors/const.py:59
#, python-brace-format
msgid ""
-"{error}, You can also try {times_try} times (The account will be temporarily "
-"locked for {block_time} minutes)"
-msgstr ""
-"{error} 您還可以嘗試 {times_try} 次 (帳號將被臨時鎖定 {block_time} 分鐘)"
+"{error}, You can also try {times_try} times (The account will be temporarily"
+" locked for {block_time} minutes)"
+msgstr "{error} 您還可以嘗試 {times_try} 次 (帳號將被臨時鎖定 {block_time} 分鐘)"
#: authentication/errors/const.py:63
msgid "MFA required"
@@ -3943,7 +3900,9 @@ msgstr "MFA 類型"
msgid "Captcha"
msgstr "驗證碼"
-#: authentication/forms.py:66 users/forms/profile.py:28
+#: authentication/forms.py:66 authentication/mfa/email.py:41
+#: authentication/templates/authentication/_msg_mfa_email_code.html:12
+#: users/forms/profile.py:28
msgid "MFA code"
msgstr "MFA 驗證碼"
@@ -3957,9 +3916,9 @@ msgstr "請輸入動態安全碼"
#: authentication/mfa/base.py:27
msgid ""
-"The two-factor code you entered has either already been used or has expired. "
-"Please request a new one."
-msgstr ""
+"The two-factor code you entered has either already been used or has expired."
+" Please request a new one."
+msgstr "您輸入的雙重驗證碼已被使用或已過期。請申請新的雙重驗證碼。"
#: authentication/mfa/custom.py:21
msgid "MFA Custom code invalid"
@@ -3973,6 +3932,14 @@ msgstr "自訂 MFA 驗證碼"
msgid "MFA custom global enabled, cannot disable"
msgstr "自訂 MFA 全局開啟,無法被禁用"
+#: authentication/mfa/email.py:11
+msgid "Email verify code invalid"
+msgstr "郵件驗證碼校驗失敗"
+
+#: authentication/mfa/email.py:17
+msgid "Email verification code"
+msgstr "郵件驗證碼"
+
#: authentication/mfa/face.py:55
msgid "Bind face to enable"
msgstr "綁定人臉特徵以啟用"
@@ -4021,7 +3988,7 @@ msgstr "設置手機號碼啟用"
msgid "Clear phone number to disable"
msgstr "清空手機號碼禁用"
-#: authentication/middleware.py:95 settings/utils/ldap.py:691
+#: authentication/middleware.py:95 settings/utils/ldap.py:711
msgid "Authentication failed (before login check failed): {}"
msgstr "認證失敗 (登錄前檢查失敗): {}"
@@ -4043,22 +4010,22 @@ msgstr "該 MFA ({}) 方式沒有啟用"
msgid "Please change your password"
msgstr "請修改密碼"
-#: authentication/models/connection_token.py:42
+#: authentication/models/connection_token.py:43
#: terminal/serializers/storage.py:114
msgid "Account name"
msgstr "帳號名稱"
-#: authentication/models/connection_token.py:43
+#: authentication/models/connection_token.py:44
msgid "Input username"
msgstr "自訂使用者名稱"
-#: authentication/models/connection_token.py:44
+#: authentication/models/connection_token.py:45
#: authentication/serializers/connection_token.py:18
msgid "Input secret"
msgstr "自訂密碼"
-#: authentication/models/connection_token.py:45
-#: authentication/serializers/connect_token_secret.py:114
+#: authentication/models/connection_token.py:46
+#: authentication/serializers/connect_token_secret.py:116
#: settings/serializers/msg.py:28 terminal/models/applet/applet.py:43
#: terminal/models/virtualapp/virtualapp.py:24
#: terminal/serializers/session.py:23 terminal/serializers/session.py:50
@@ -4066,69 +4033,69 @@ msgstr "自訂密碼"
msgid "Protocol"
msgstr "協議"
-#: authentication/models/connection_token.py:46
+#: authentication/models/connection_token.py:47
msgid "Connect method"
msgstr "連接方式"
-#: authentication/models/connection_token.py:48
+#: authentication/models/connection_token.py:49
msgid "User display"
msgstr "使用者名稱"
-#: authentication/models/connection_token.py:49
+#: authentication/models/connection_token.py:50
msgid "Asset display"
msgstr "資產名稱"
-#: authentication/models/connection_token.py:50
+#: authentication/models/connection_token.py:51
msgid "Reusable"
msgstr "可以重複使用"
-#: authentication/models/connection_token.py:55
+#: authentication/models/connection_token.py:56
#: perms/models/asset_permission.py:83
msgid "From ticket"
msgstr "來自工單"
-#: authentication/models/connection_token.py:57
+#: authentication/models/connection_token.py:58
msgid "Face monitor token"
msgstr "人臉監控令牌"
-#: authentication/models/connection_token.py:68
+#: authentication/models/connection_token.py:69
msgid "Can expire connection token"
msgstr "可以失效連接令牌"
-#: authentication/models/connection_token.py:69
+#: authentication/models/connection_token.py:70
msgid "Can reuse connection token"
msgstr "可以復用連接令牌"
-#: authentication/models/connection_token.py:71
+#: authentication/models/connection_token.py:72
msgid "Connection token"
msgstr "連接令牌"
-#: authentication/models/connection_token.py:132
+#: authentication/models/connection_token.py:163
msgid "Connection token inactive"
msgstr "連接令牌未啟用"
-#: authentication/models/connection_token.py:136
+#: authentication/models/connection_token.py:167
msgid "Connection token expired at: {}"
msgstr "連接令牌過期: {}"
-#: authentication/models/connection_token.py:139
+#: authentication/models/connection_token.py:170
#: terminal/serializers/session.py:95
msgid "No user or invalid user"
msgstr "沒有用戶或用戶失效"
-#: authentication/models/connection_token.py:142
+#: authentication/models/connection_token.py:173
msgid "No asset or inactive asset"
msgstr "沒有資產或資產未啟用"
-#: authentication/models/connection_token.py:290
+#: authentication/models/connection_token.py:341
msgid "Can view super connection token secret"
msgstr "可以查看超級連接令牌密文"
-#: authentication/models/connection_token.py:292
+#: authentication/models/connection_token.py:343
msgid "Super connection token"
msgstr "超級連接令牌"
-#: authentication/models/connection_token.py:309
+#: authentication/models/connection_token.py:360
msgid "Admin connection token"
msgstr "管理者連接令牌"
@@ -4142,7 +4109,7 @@ msgstr "私有令牌"
msgid "Private key"
msgstr "ssh私鑰"
-#: authentication/models/ssh_key.py:18 settings/serializers/terminal.py:34
+#: authentication/models/ssh_key.py:18 settings/serializers/terminal.py:38
#: users/forms/profile.py:175 users/models/user/__init__.py:92
#: xpack/plugins/cloud/serializers/account_attrs.py:211
msgid "Public key"
@@ -4168,39 +4135,39 @@ msgstr "異地登錄提醒"
msgid "binding reminder"
msgstr "綁定提醒"
-#: authentication/serializers/connect_token_secret.py:116
+#: authentication/serializers/connect_token_secret.py:118
msgid "Is builtin"
msgstr "內建的"
-#: authentication/serializers/connect_token_secret.py:120
+#: authentication/serializers/connect_token_secret.py:122
msgid "Options"
msgstr "選項"
-#: authentication/serializers/connect_token_secret.py:127
+#: authentication/serializers/connect_token_secret.py:129
#: ops/notifications.py:19 rbac/tree.py:60
msgid "Component"
msgstr "組件"
-#: authentication/serializers/connect_token_secret.py:136
+#: authentication/serializers/connect_token_secret.py:138
#: perms/serializers/user_permission.py:28 xpack/plugins/cloud/models.py:389
msgid "Domain"
msgstr "網域"
-#: authentication/serializers/connect_token_secret.py:138
+#: authentication/serializers/connect_token_secret.py:140
msgid "Expired now"
msgstr "立刻過期"
-#: authentication/serializers/connect_token_secret.py:171
+#: authentication/serializers/connect_token_secret.py:173
#: terminal/models/virtualapp/virtualapp.py:25
msgid "Image name"
msgstr "鏡像名稱"
-#: authentication/serializers/connect_token_secret.py:172
+#: authentication/serializers/connect_token_secret.py:174
#: terminal/models/virtualapp/virtualapp.py:27
msgid "Image port"
msgstr "鏡像埠"
-#: authentication/serializers/connect_token_secret.py:173
+#: authentication/serializers/connect_token_secret.py:175
#: terminal/models/virtualapp/virtualapp.py:26
msgid "Image protocol"
msgstr "鏡像協議"
@@ -4250,12 +4217,12 @@ msgstr "創建類型"
#: authentication/serializers/ssh_key.py:33
msgid ""
-"Please download the private key after creation. Each private key can only be "
-"downloaded once"
+"Please download the private key after creation. Each private key can only be"
+" downloaded once"
msgstr "創建完成後請下載私鑰,每個私鑰僅有一次下載機會"
#: authentication/serializers/ssh_key.py:57 users/forms/profile.py:164
-#: users/serializers/profile.py:134 users/serializers/profile.py:161
+#: users/serializers/profile.py:142 users/serializers/profile.py:169
msgid "Not a valid ssh public key"
msgstr "SSH金鑰不合法"
@@ -4271,8 +4238,8 @@ msgstr "清除過期會話"
#: authentication/tasks.py:15
msgid ""
-"Since user logins create sessions, the system will clean up expired sessions "
-"every 24 hours"
+"Since user logins create sessions, the system will clean up expired sessions"
+" every 24 hours"
msgstr "由於用戶登錄系統會產生會話,系統每24小時清理已過期的會話"
#: authentication/templates/authentication/_access_key_modal.html:6
@@ -4292,12 +4259,14 @@ msgid "Show"
msgstr "顯示"
#: authentication/templates/authentication/_access_key_modal.html:66
-#: users/const.py:42 users/templates/users/user_verify_mfa.html:36
+#: settings/serializers/terminal.py:24 users/const.py:42
+#: users/templates/users/user_verify_mfa.html:36
msgid "Disable"
msgstr "禁用"
#: authentication/templates/authentication/_access_key_modal.html:67
-#: users/const.py:43 users/templates/users/mfa_setting.html:120
+#: settings/serializers/terminal.py:24 users/const.py:43
+#: users/templates/users/mfa_setting.html:120
#: users/templates/users/mfa_setting.html:158
#: users/templates/users/mfa_setting.html:177
msgid "Enable"
@@ -4331,10 +4300,11 @@ msgid "Code error"
msgstr "代碼錯誤"
#: authentication/templates/authentication/_msg_different_city.html:3
+#: authentication/templates/authentication/_msg_mfa_email_code.html:9
#: authentication/templates/authentication/_msg_oauth_bind.html:3
#: authentication/templates/authentication/_msg_reset_password.html:3
#: authentication/templates/authentication/_msg_reset_password_code.html:9
-#: jumpserver/conf.py:539
+#: jumpserver/conf.py:540
#: perms/templates/perms/_msg_item_permissions_expire.html:3
#: tickets/templates/tickets/approve_check_password.html:32
#: users/templates/users/_msg_account_expire_reminder.html:4
@@ -4353,6 +4323,11 @@ msgid ""
"account password in time."
msgstr "若懷疑此次登錄行為異常,請及時修改帳號密碼"
+#: authentication/templates/authentication/_msg_mfa_email_code.html:15
+#: authentication/templates/authentication/_msg_reset_password_code.html:18
+msgid "The validity period of the verification code is one minute"
+msgstr "驗證碼有效期為 1 分鐘"
+
#: authentication/templates/authentication/_msg_oauth_bind.html:6
msgid "Your account has just been bound to"
msgstr "您的帳戶剛剛綁定到"
@@ -4399,10 +4374,6 @@ msgid ""
"Copy the verification code to the Reset Password page to reset the password."
msgstr "將驗證碼複製到重設密碼頁面,重設密碼。"
-#: authentication/templates/authentication/_msg_reset_password_code.html:18
-msgid "The validity period of the verification code is one minute"
-msgstr "驗證碼有效期為 1 分鐘"
-
#: authentication/templates/authentication/_msg_rest_password_success.html:5
msgid "Your password has just been successfully updated"
msgstr "你的密碼剛剛成功更新"
@@ -4621,10 +4592,9 @@ msgstr "退出登錄成功,返回到登入頁面"
#: authentication/views/mixins.py:39
msgid ""
-"For your safety, automatic redirection login is not supported on the client. "
-"If you need to open it in the client, please log in again"
-msgstr ""
-"為了您的安全,客戶端不支持自動跳轉登錄。如果需要在客戶端中打開,請重新登錄"
+"For your safety, automatic redirection login is not supported on the client."
+" If you need to open it in the client, please log in again"
+msgstr "為了您的安全,客戶端不支持自動跳轉登錄。如果需要在客戶端中打開,請重新登錄"
#: authentication/views/slack.py:35 authentication/views/slack.py:120
msgid "Slack Error"
@@ -4754,13 +4724,12 @@ msgstr "加密的欄位"
#: common/db/fields.py:578
msgid ""
-"Invalid JSON data for JSONManyToManyField, should be like {'type': 'all'} or "
-"{'type': 'ids', 'ids': []} or {'type': 'attrs', 'attrs': [{'name': 'ip', "
+"Invalid JSON data for JSONManyToManyField, should be like {'type': 'all'} or"
+" {'type': 'ids', 'ids': []} or {'type': 'attrs', 'attrs': [{'name': 'ip', "
"'match': 'exact', 'value': '1.1.1.1'}}"
msgstr ""
-"JSON 多對多欄位無效,應為 {'type': 'all'} 或 {'type': 'ids', 'ids': []} 或 "
-"{'type': 'attrs', 'attrs': [{'name': 'ip', 'match': 'exact', 'value': "
-"'1.1.1.1'}}"
+"JSON 多對多欄位無效,應為 {'type': 'all'} 或 {'type': 'ids', 'ids': []} 或 {'type': "
+"'attrs', 'attrs': [{'name': 'ip', 'match': 'exact', 'value': '1.1.1.1'}}"
#: common/db/fields.py:585
msgid "Invalid type, should be \"all\", \"ids\" or \"attrs\""
@@ -4823,75 +4792,89 @@ msgstr "解析文件錯誤: {}"
msgid "Invalid excel file"
msgstr "無效的 excel 文件"
-#: common/drf/renders/base.py:138
+#: common/drf/renders/base.py:140
msgid "Yes/No"
msgstr "是/否"
-#: common/drf/renders/base.py:141
+#: common/drf/renders/base.py:143
msgid "Text, max length {}"
msgstr "文字,最大長度 {}"
-#: common/drf/renders/base.py:143
+#: common/drf/renders/base.py:145
msgid "Long text, no length limit"
msgstr "長文字,無長度限制"
-#: common/drf/renders/base.py:145
+#: common/drf/renders/base.py:147
msgid "Number, min {} max {}"
msgstr "數字,最小 {} 最大 {}"
-#: common/drf/renders/base.py:148
+#: common/drf/renders/base.py:150
msgid "Datetime format {}"
msgstr "日期時間格式 {}"
-#: common/drf/renders/base.py:154
+#: common/drf/renders/base.py:156
msgid ""
"Choices, format name(value), name is optional for human read, value is "
"requisite, options {}"
msgstr "選項,格式: 名稱(值),名稱是可選的,方便閱讀,值是必填的,可選項有 {}"
-#: common/drf/renders/base.py:157
+#: common/drf/renders/base.py:159
msgid "Choices, options {}"
msgstr "選項,可選項有 {}"
-#: common/drf/renders/base.py:159
+#: common/drf/renders/base.py:161
msgid "Phone number, format +8612345678901"
msgstr "手機號碼,格式 +8612345678901"
-#: common/drf/renders/base.py:161
+#: common/drf/renders/base.py:163
msgid "Label, format [\"key:value\"]"
msgstr "標籤,格式: [\"鍵:值\"]"
-#: common/drf/renders/base.py:163
+#: common/drf/renders/base.py:165
msgid ""
"Object, format name(id), name is optional for human read, id is requisite"
msgstr "關聯項,格式: 名稱(id), 名稱是可選的,方便閱讀,id 是必填的"
-#: common/drf/renders/base.py:165
+#: common/drf/renders/base.py:167
msgid "Object, format id"
msgstr "關聯項,格式是 id"
-#: common/drf/renders/base.py:169
+#: common/drf/renders/base.py:171
msgid ""
"Objects, format [\"name(id)\", ...], name is optional for human read, id is "
"requisite"
-msgstr ""
-"多關聯項,格式: [\"名稱(id)\", ...], 名稱是可選的,方便閱讀,id 是必填的"
-
-#: common/drf/renders/base.py:171
-msgid ""
-"Labels, format [\"key:value\", ...], if label not exists, will create it"
-msgstr "標籤,格式: [\"鍵:值\", ...], 如果標籤不存在,將創建它"
+msgstr "多關聯項,格式: [\"名稱(id)\", ...], 名稱是可選的,方便閱讀,id 是必填的"
#: common/drf/renders/base.py:173
+msgid "Labels, format [\"key:value\", ...], if label not exists, will create it"
+msgstr "標籤,格式: [\"鍵:值\", ...], 如果標籤不存在,將創建它"
+
+#: common/drf/renders/base.py:175
msgid "Objects, format [\"id\", ...]"
msgstr "多關聯項,格式是 [\"id\", ...]"
-#: common/drf/renders/base.py:271
+#: common/drf/renders/base.py:275
msgid ""
"{} - The encryption password has not been set - please go to personal "
"information -> file encryption password to set the encryption password"
msgstr "{} - 未設置加密密碼 - 請前往個人資訊 -> 文件加密密碼中設置加密密碼"
+#: common/drf/renders/mixins.py:37 labels/serializers.py:22
+msgid "Resource count"
+msgstr "資源數量"
+
+#: common/drf/renders/mixins.py:46
+msgid "Export all"
+msgstr "匯出所有"
+
+#: common/drf/renders/mixins.py:48
+msgid "Export only selected items"
+msgstr "僅匯出選擇項"
+
+#: common/drf/renders/mixins.py:50
+msgid "Export filtered"
+msgstr "導出搜索"
+
#: common/exceptions.py:15 xpack/plugins/cloud/ws.py:37
#, python-format
msgid "%s object does not exist."
@@ -4921,15 +4904,15 @@ msgstr "此操作需要確認當前用戶"
msgid "Unexpect error occur"
msgstr "發生意外錯誤"
-#: common/plugins/es.py:35
+#: common/plugins/es.py:36
msgid "Invalid elasticsearch config"
msgstr "無效的 Elasticsearch 配置"
-#: common/plugins/es.py:40
+#: common/plugins/es.py:41
msgid "Not Support Elasticsearch8"
msgstr "不支持 Elasticsearch8"
-#: common/plugins/es.py:46
+#: common/plugins/es.py:47
msgid ""
"Connection failed: Self-signed certificate used. Please check server "
"certificate configuration"
@@ -5059,10 +5042,8 @@ msgstr "發送郵件附件"
#: common/tasks.py:68
msgid ""
-"When an account password is changed or an account backup generates "
-"attachments, \n"
-" this task needs to be executed for sending emails and handling "
-"attachments"
+"When an account password is changed or an account backup generates attachments, \n"
+" this task needs to be executed for sending emails and handling attachments"
msgstr "當帳號改密,帳號備份產生附件時,需對發送郵件及附件執行該任務"
#: common/tasks.py:94
@@ -5094,8 +5075,7 @@ msgstr "傳簡訊驗證碼"
#: common/utils/verify_code.py:19
msgid ""
-"When resetting a password, forgetting a password, or verifying MFA, this "
-"task needs to \n"
+"When resetting a password, forgetting a password, or verifying MFA, this task needs to \n"
" be executed to send SMS messages"
msgstr "當重置密碼、忘記密碼、驗證mfa時,需要發送短信,執行該任務"
@@ -5119,16 +5099,16 @@ msgstr "未找到 Code"
msgid "The message code provided is invalid or has expired"
msgstr "提供的消息代碼無效或已過期"
-#: jumpserver/conf.py:533
+#: jumpserver/conf.py:534
#, python-brace-format
msgid "The verification code is: {code}"
msgstr "驗證碼為: {code}"
-#: jumpserver/conf.py:538
+#: jumpserver/conf.py:539
msgid "Create account successfully"
msgstr "創建帳號成功"
-#: jumpserver/conf.py:540
+#: jumpserver/conf.py:541
msgid "Your account has been created successfully"
msgstr "你的帳號已創建成功"
@@ -5146,8 +5126,8 @@ msgid ""
"configure nginx for url distribution, If you see this page, "
"prove that you are not accessing the nginx listening port. Good luck."
msgstr ""
-"Koko是單獨部署的一個程序,你需要部署Koko, 並確保nginx配置轉發, "
-"div>
如果你看到了這個頁面,證明你訪問的不是nginx監聽的埠,祝你好運
"
+"
Koko是單獨部署的一個程序,你需要部署Koko, 並確保nginx配置轉發, "
+"
如果你看到了這個頁面,證明你訪問的不是nginx監聽的埠,祝你好運
"
#: labels/apps.py:8
msgid "App Labels"
@@ -5182,10 +5162,6 @@ msgstr "資源 ID"
msgid "Tagged resource"
msgstr "相關的資源"
-#: labels/serializers.py:22
-msgid "Resource count"
-msgstr "資源數量"
-
#: labels/serializers.py:28
msgid "Cannot contain \":,\""
msgstr "不能包含\":,\""
@@ -5224,27 +5200,23 @@ msgstr "發布站內消息"
#: notifications/notifications.py:48
msgid ""
-"This task needs to be executed for sending internal messages for system "
-"alerts, \n"
+"This task needs to be executed for sending internal messages for system alerts, \n"
" work orders, and other notifications"
msgstr "系統某些告警、工單等需要發送站內信時執行該任務"
-#: ops/ansible/inventory.py:117 ops/models/job.py:68
+#: ops/ansible/inventory.py:126 ops/ansible/inventory.py:196
+#: ops/models/job.py:69
msgid "No account available"
msgstr "無可用帳號"
-#: ops/ansible/inventory.py:298
+#: ops/ansible/inventory.py:318 ops/ansible/inventory.py:360
msgid "Ansible disabled"
msgstr "Ansible 已禁用"
-#: ops/ansible/inventory.py:314
+#: ops/ansible/inventory.py:376
msgid "Skip hosts below:"
msgstr "跳過以下主機: "
-#: ops/api/adhoc.py:32
-msgid "Deleting other people's script is not allowed"
-msgstr "不允許刪除別人的腳本"
-
#: ops/api/celery.py:66 ops/api/celery.py:81
msgid "Waiting task start"
msgstr "等待任務開始"
@@ -5257,67 +5229,63 @@ msgstr "任務 {} 不存在"
msgid "Task {} args or kwargs error"
msgstr "任務 {} 執行參數錯誤"
-#: ops/api/job.py:68
+#: ops/api/job.py:70
#, python-brace-format
msgid ""
"Asset ({asset}) must have at least one of the following protocols added: "
"SSH, SFTP, or WinRM"
msgstr "资产({asset})至少要添加ssh,sftp,winrm其中一种协议"
-#: ops/api/job.py:69
+#: ops/api/job.py:71
#, python-brace-format
msgid "Asset ({asset}) authorization is missing SSH, SFTP, or WinRM protocol"
msgstr "资产({asset})授权缺少ssh,sftp或winrm协议"
-#: ops/api/job.py:70
+#: ops/api/job.py:72
#, python-brace-format
msgid "Asset ({asset}) authorization lacks upload permissions"
msgstr "资产({asset})授权缺少上传权限"
-#: ops/api/job.py:158
+#: ops/api/job.py:160
msgid "Duplicate file exists"
msgstr "存在同名文件"
-#: ops/api/job.py:163
+#: ops/api/job.py:165
#, python-brace-format
msgid ""
"File size exceeds maximum limit. Please select a file smaller than {limit}MB"
msgstr "檔案大小超過最大限制。請選擇小於 {limit}MB 的文件。"
-#: ops/api/job.py:236
+#: ops/api/job.py:238
msgid ""
"The task is being created and cannot be interrupted. Please try again later."
msgstr "正在創建任務,無法中斷,請稍後重試。"
#: ops/api/playbook.py:49
-msgid "Deleting other people's playbook is not allowed"
-msgstr "不允許刪除他人的 playbook"
-
-#: ops/api/playbook.py:55
msgid "Currently playbook is being used in a job"
msgstr "當前 playbook 正在作業中使用"
-#: ops/api/playbook.py:128
+#: ops/api/playbook.py:122
msgid "Unsupported file content"
msgstr "不支持的文件內容"
-#: ops/api/playbook.py:130 ops/api/playbook.py:176 ops/api/playbook.py:224
+#: ops/api/playbook.py:124 ops/api/playbook.py:170 ops/api/playbook.py:218
msgid "Invalid file path"
msgstr "無效的文件路徑"
-#: ops/api/playbook.py:202
+#: ops/api/playbook.py:196
msgid "This file can not be rename"
msgstr "該文件不能重命名"
-#: ops/api/playbook.py:221
+#: ops/api/playbook.py:215
msgid "File already exists"
msgstr "文件已存在"
-#: ops/api/playbook.py:239
+#: ops/api/playbook.py:233
msgid "File key is required"
msgstr "文件金鑰該欄位是必填項。"
-#: ops/api/playbook.py:242
+#: ops/api/playbook.py:236
msgid "This file can not be delete"
msgstr "無法刪除此文件"
@@ -5366,7 +5334,7 @@ msgstr "VCS"
msgid "Adhoc"
msgstr "命令"
-#: ops/const.py:39 ops/models/job.py:152 ops/models/playbook.py:89
+#: ops/const.py:39 ops/models/job.py:154 ops/models/playbook.py:89
#: ops/models/variable.py:23
msgid "Playbook"
msgstr "Playbook"
@@ -5453,17 +5421,19 @@ msgid "no valid program entry found."
msgstr "沒有可用程序入口"
#: ops/mixin.py:34 ops/mixin.py:166 settings/serializers/auth/ldap.py:74
-#: settings/serializers/auth/ldap_ha.py:57
+#: settings/serializers/auth/ldap_ha.py:56
msgid "Periodic run"
msgstr "週期性執行"
#: ops/mixin.py:36 ops/mixin.py:113 ops/mixin.py:172
-#: settings/serializers/auth/ldap.py:81 settings/serializers/auth/ldap_ha.py:64
+#: settings/serializers/auth/ldap.py:81
+#: settings/serializers/auth/ldap_ha.py:63
msgid "Interval"
msgstr "間隔"
#: ops/mixin.py:39 ops/mixin.py:111 ops/mixin.py:169
-#: settings/serializers/auth/ldap.py:78 settings/serializers/auth/ldap_ha.py:61
+#: settings/serializers/auth/ldap.py:78
+#: settings/serializers/auth/ldap_ha.py:60
msgid "Crontab"
msgstr "Crontab"
@@ -5487,7 +5457,11 @@ msgstr "執行週期"
msgid "* Please enter a valid crontab expression"
msgstr "* 請輸入有效的 crontab 表達式"
-#: ops/mixin.py:204 settings/serializers/auth/mixin.py:12
+#: ops/mixin.py:194
+msgid "Crontab minute must not contain '*'"
+msgstr ""
+
+#: ops/mixin.py:208 settings/serializers/auth/mixin.py:12
msgid "Require interval or crontab setting"
msgstr "需要週期或定期設定"
@@ -5495,18 +5469,19 @@ msgstr "需要週期或定期設定"
msgid "Pattern"
msgstr "模式"
-#: ops/models/adhoc.py:22 ops/models/job.py:149
+#: ops/models/adhoc.py:22 ops/models/job.py:151
msgid "Module"
msgstr "模組"
-#: ops/models/adhoc.py:23 ops/models/celery.py:82 ops/models/job.py:147
+#: ops/models/adhoc.py:23 ops/models/celery.py:82 ops/models/job.py:149
#: terminal/models/component/task.py:14
msgid "Args"
msgstr "參數"
-#: ops/models/adhoc.py:26 ops/models/playbook.py:34 ops/serializers/mixin.py:10
-#: rbac/models/role.py:31 rbac/models/rolebinding.py:46
-#: rbac/serializers/role.py:12 settings/serializers/auth/oauth2.py:37
+#: ops/models/adhoc.py:26 ops/models/playbook.py:34
+#: ops/serializers/mixin.py:10 rbac/models/role.py:31
+#: rbac/models/rolebinding.py:46 rbac/serializers/role.py:12
+#: settings/serializers/auth/oauth2.py:37
msgid "Scope"
msgstr "範圍"
@@ -5544,48 +5519,54 @@ msgstr "發布日期"
msgid "Celery Task Execution"
msgstr "Celery 任務執行"
-#: ops/models/job.py:150
+#: ops/models/job.py:82
+#, fuzzy
+#| msgid "Anonymous account is not supported for this asset"
+msgid "Module {} is not suitable for this asset"
+msgstr "匿名帳號不支持當前資產"
+
+#: ops/models/job.py:152
msgid "Run dir"
msgstr "執行目錄"
-#: ops/models/job.py:151
+#: ops/models/job.py:153
msgid "Timeout (Seconds)"
msgstr "超時時間 (秒)"
-#: ops/models/job.py:157
+#: ops/models/job.py:159
msgid "Use Parameter Define"
msgstr "使用參數定義"
-#: ops/models/job.py:158
+#: ops/models/job.py:160
msgid "Parameters define"
msgstr "參數定義"
-#: ops/models/job.py:159
+#: ops/models/job.py:161
msgid "Periodic variable"
msgstr "週期執行變數"
-#: ops/models/job.py:160
+#: ops/models/job.py:162
msgid "Run as"
msgstr "執行使用者"
-#: ops/models/job.py:162
+#: ops/models/job.py:164
msgid "Run as policy"
msgstr "使用者策略"
-#: ops/models/job.py:219 ops/models/variable.py:28 ops/serializers/job.py:111
+#: ops/models/job.py:221 ops/models/variable.py:28 ops/serializers/job.py:111
#: terminal/notifications.py:182
msgid "Job"
msgstr "作業"
-#: ops/models/job.py:242
+#: ops/models/job.py:244
msgid "Material"
msgstr "Material"
-#: ops/models/job.py:244
+#: ops/models/job.py:246
msgid "Material Type"
msgstr "Material 類型"
-#: ops/models/job.py:556
+#: ops/models/job.py:558
msgid "Job Execution"
msgstr "作業執行"
@@ -5608,8 +5589,8 @@ msgid ""
"the resulting environment variable will be jms_name, and it can be "
"referenced in the script using {{ jms_name }}"
msgstr ""
-"在腳本中使用的變量名稱,固定前綴為 jms_ + 輸入的變量名,例如變量名為 name,則"
-"最終生成的環境變量為 jms_name。在腳本中引用時使用 {{ jms_name }}。"
+"在腳本中使用的變量名稱,固定前綴為 jms_ + 輸入的變量名,例如變量名為 name,則最終生成的環境變量為 jms_name。在腳本中引用時使用 "
+"{{ jms_name }}。"
#: ops/models/variable.py:16 ops/serializers/variable.py:32
msgid "Default Value"
@@ -5723,14 +5704,10 @@ msgstr "創建或更新週期任務"
#: ops/tasks.py:134
msgid ""
-"With version iterations, new tasks may be added, or task names and execution "
-"times may \n"
-" be modified. Therefore, upon system startup, tasks will be "
-"registered or the parameters \n"
+"With version iterations, new tasks may be added, or task names and execution times may \n"
+" be modified. Therefore, upon system startup, tasks will be registered or the parameters \n"
" of scheduled tasks will be updated"
-msgstr ""
-"隨著版本迭代,可能會新增任務或者修改任務的名稱,執行時間,所以在系統啟動時,"
-"將會註冊任務或者更新定時任務參數"
+msgstr "隨著版本迭代,可能會新增任務或者修改任務的名稱,執行時間,所以在系統啟動時,將會註冊任務或者更新定時任務參數"
#: ops/tasks.py:147
msgid "Periodic check service performance"
@@ -5738,13 +5715,9 @@ msgstr "週期檢測服務性能"
#: ops/tasks.py:149
msgid ""
-"Check every hour whether each component is offline and whether the CPU, "
-"memory, \n"
-" and disk usage exceed the thresholds, and send an alert message to "
-"the administrator"
-msgstr ""
-"每小時檢測各組件是否離線,cpu,內存,硬碟使用率是否超過閾值,向管理人員發送消"
-"息預警"
+"Check every hour whether each component is offline and whether the CPU, memory, \n"
+" and disk usage exceed the thresholds, and send an alert message to the administrator"
+msgstr "每小時檢測各組件是否離線,cpu,內存,硬碟使用率是否超過閾值,向管理人員發送消息預警"
#: ops/tasks.py:159
msgid "Clean up unexpected jobs"
@@ -5752,16 +5725,12 @@ msgstr "清理異常作業"
#: ops/tasks.py:161
msgid ""
-"Due to exceptions caused by executing adhoc and playbooks in the Job "
-"Center, \n"
-" which result in the task status not being updated, the system will "
-"clean up abnormal jobs \n"
-" that have not been completed for more than 3 hours every hour and "
-"mark these tasks as \n"
+"Due to exceptions caused by executing adhoc and playbooks in the Job Center, \n"
+" which result in the task status not being updated, the system will clean up abnormal jobs \n"
+" that have not been completed for more than 3 hours every hour and mark these tasks as \n"
" failed"
msgstr ""
-"由於作業中心執行快捷命令,playbook會產生異常,任務狀態未更新完成,系統將每小"
-"時執行清理超過3小時未完成的異常作業,並將任務標記為失敗"
+"由於作業中心執行快捷命令,playbook會產生異常,任務狀態未更新完成,系統將每小時執行清理超過3小時未完成的異常作業,並將任務標記為失敗"
#: ops/tasks.py:174
msgid "Clean job_execution db record"
@@ -5769,17 +5738,13 @@ msgstr "清理作業中心執行歷史"
#: ops/tasks.py:176
msgid ""
-"Due to the execution of adhoc and playbooks in the Job Center, execution "
-"records will \n"
-" be generated. The system will clean up records that exceed the "
-"retention period every day \n"
-" at 2 a.m., based on the configuration of 'System Settings - Tasks - "
-"Regular clean-up - \n"
+"Due to the execution of adhoc and playbooks in the Job Center, execution records will \n"
+" be generated. The system will clean up records that exceed the retention period every day \n"
+" at 2 a.m., based on the configuration of 'System Settings - Tasks - Regular clean-up - \n"
" Job execution retention days'"
msgstr ""
-"由於作業中心執行快捷命令,playbook,會產生執行記錄,系統會根據系統設置 - 任務"
-"列表 - 定期清理 - 作業中心執行歷史配置,每天凌晨2點對超出保存時間的記錄進行清"
-"理"
+"由於作業中心執行快捷命令,playbook,會產生執行記錄,系統會根據系統設置 - 任務列表 - 定期清理 - "
+"作業中心執行歷史配置,每天凌晨2點對超出保存時間的記錄進行清理"
#: ops/templates/ops/celery_task_log.html:4
msgid "Task log"
@@ -5848,7 +5813,8 @@ msgstr "請選擇一個組織後再保存"
#: rbac/serializers/rolebinding.py:44 settings/serializers/auth/base.py:53
#: terminal/templates/terminal/_msg_command_warning.html:21
#: terminal/templates/terminal/_msg_session_sharing.html:14
-#: tickets/models/ticket/general.py:303 tickets/serializers/ticket/ticket.py:61
+#: tickets/models/ticket/general.py:303
+#: tickets/serializers/ticket/ticket.py:61
msgid "Organization"
msgstr "組織"
@@ -5882,7 +5848,7 @@ msgid "Can not delete virtual org"
msgstr "無法刪除虛擬組織"
#: orgs/serializers.py:10 perms/serializers/permission.py:59
-#: rbac/serializers/role.py:27 users/serializers/group.py:54
+#: rbac/serializers/role.py:27 users/serializers/group.py:53
msgid "Users amount"
msgstr "用戶數量"
@@ -6011,9 +5977,7 @@ msgstr "組織 ({}) 的資產授權"
msgid ""
"Accounts, format [\"@virtual\", \"root\", \"%template_id\"], virtual "
"choices: @ALL, @SPEC, @USER, @ANON, @INPUT"
-msgstr ""
-"帳號,格式為 [\"@虛擬帳號\", \"root\", \"%模板id\"], 虛擬選項: @ALL, @SPEC, "
-"@USER, @ANON, @INPUT"
+msgstr "帳號,格式為 [\"@虛擬帳號\", \"root\", \"%模板id\"], 虛擬選項: @ALL, @SPEC, @USER, @ANON, @INPUT"
#: perms/serializers/permission.py:49
msgid "Protocols, format [\"ssh\", \"rdp\", \"vnc\"] or [\"all\"]"
@@ -6029,18 +5993,13 @@ msgstr "校驗資產授權規則已過期"
#: perms/tasks.py:30
msgid ""
-"The cache of organizational collections, which have completed user "
-"authorization tree \n"
-" construction, will expire. Therefore, expired collections need to be "
-"cleared from the \n"
-" cache, and this task will be executed periodically based on the time "
-"interval specified \n"
-" by PERM_EXPIRED_CHECK_PERIODIC in the system configuration file "
-"config.txt"
+"The cache of organizational collections, which have completed user authorization tree \n"
+" construction, will expire. Therefore, expired collections need to be cleared from the \n"
+" cache, and this task will be executed periodically based on the time interval specified \n"
+" by PERM_EXPIRED_CHECK_PERIODIC in the system configuration file config.txt"
msgstr ""
-"用戶授權樹已經構建完成的組織集合緩存會過期,所以需要將過期的集合從緩存中清理"
-"掉,根據系統配置文件 config.txt 中 PERM_EXPIRED_CHECK_PERIODIC 的時間間隔定時"
-"執行該任務"
+"用戶授權樹已經構建完成的組織集合緩存會過期,所以需要將過期的集合從緩存中清理掉,根據系統配置文件 config.txt 中 "
+"PERM_EXPIRED_CHECK_PERIODIC 的時間間隔定時執行該任務"
#: perms/tasks.py:49
msgid "Send asset permission expired notification"
@@ -6048,16 +6007,11 @@ msgstr "發送資產權限過期通知"
#: perms/tasks.py:51
msgid ""
-"Check every day at 10 a.m. and send a notification message to users "
-"associated with \n"
-" assets whose authorization is about to expire, as well as to the "
-"organization's \n"
-" administrators, 3 days in advance, to remind them that the asset "
-"authorization will \n"
+"Check every day at 10 a.m. and send a notification message to users associated with \n"
+" assets whose authorization is about to expire, as well as to the organization's \n"
+" administrators, 3 days in advance, to remind them that the asset authorization will \n"
" expire in a few days"
-msgstr ""
-"每天上午10點檢查,對資產授權即將過期的所關聯的用戶及該組織管理員提前三天發送"
-"消息通知,提示資產還有幾天即將過期"
+msgstr "每天上午10點檢查,對資產授權即將過期的所關聯的用戶及該組織管理員提前三天發送消息通知,提示資產還有幾天即將過期"
#: perms/templates/perms/_msg_item_permissions_expire.html:7
#: perms/templates/perms/_msg_permed_items_expire.html:7
@@ -6236,7 +6190,7 @@ msgid "Storage"
msgstr "儲存"
#: rbac/tree.py:61 terminal/models/applet/applet.py:53
-#: terminal/models/applet/applet.py:328 terminal/models/applet/host.py:30
+#: terminal/models/applet/applet.py:369 terminal/models/applet/host.py:30
#: terminal/serializers/applet.py:15
msgid "Applet"
msgstr "遠程應用"
@@ -6452,9 +6406,7 @@ msgid ""
"authentication service platform does not return the user's email "
"information, the system will automatically create the user using this email "
"suffix"
-msgstr ""
-"第三方使用者認證成功後,若第三方認證服務平台未回傳該使用者的電子信箱資訊,系"
-"統將自動以此電子信箱後綴建立使用者"
+msgstr "第三方使用者認證成功後,若第三方認證服務平台未回傳該使用者的電子信箱資訊,系統將自動以此電子信箱後綴建立使用者"
#: settings/serializers/auth/base.py:37
msgid "Forgot Password URL"
@@ -6473,23 +6425,21 @@ msgid ""
"Should an flash page be displayed before the user is redirected to third-"
"party authentication when the administrator enables third-party redirect "
"authentication"
-msgstr ""
-"Action管理員啟用第三方重新定向身份驗證時,在使用者重定向到第三方身份驗證之前"
-"是否顯示 Flash 頁面"
+msgstr "Action管理員啟用第三方重新定向身份驗證時,在使用者重定向到第三方身份驗證之前是否顯示 Flash 頁面"
#: settings/serializers/auth/base.py:55
msgid ""
"When you create a user, you associate the user to the organization of your "
"choice. Users always belong to the Default organization."
-msgstr ""
-"建立使用者時,您會將該使用者與您選擇的組織關聯。使用者始終屬於 Default 組織。"
+msgstr "建立使用者時,您會將該使用者與您選擇的組織關聯。使用者始終屬於 Default 組織。"
#: settings/serializers/auth/cas.py:12 settings/serializers/auth/cas.py:14
msgid "CAS"
msgstr "CAS"
#: settings/serializers/auth/cas.py:15 settings/serializers/auth/ldap.py:45
-#: settings/serializers/auth/ldap_ha.py:28 settings/serializers/auth/oidc.py:61
+#: settings/serializers/auth/ldap_ha.py:27
+#: settings/serializers/auth/oidc.py:61
msgid "Server"
msgstr "服務端地址"
@@ -6514,9 +6464,11 @@ msgstr "使用者名稱屬性"
msgid "Enable attributes map"
msgstr "啟用屬性映射"
-#: settings/serializers/auth/cas.py:34 settings/serializers/auth/dingtalk.py:18
+#: settings/serializers/auth/cas.py:34
+#: settings/serializers/auth/dingtalk.py:18
#: settings/serializers/auth/feishu.py:18 settings/serializers/auth/lark.py:17
-#: settings/serializers/auth/ldap.py:67 settings/serializers/auth/ldap_ha.py:50
+#: settings/serializers/auth/ldap.py:67
+#: settings/serializers/auth/ldap_ha.py:49
#: settings/serializers/auth/oauth2.py:60 settings/serializers/auth/oidc.py:39
#: settings/serializers/auth/saml2.py:35 settings/serializers/auth/slack.py:18
#: settings/serializers/auth/wecom.py:18
@@ -6527,9 +6479,7 @@ msgstr "映射屬性"
msgid ""
"User attribute mapping, where the `key` is the CAS service user attribute "
"name and the `value` is the JumpServer user attribute name"
-msgstr ""
-"使用者屬性對照,其中 `key` 是 CAS 服務使用者屬性名稱,`value` 是 JumpServer "
-"使用者屬性名稱"
+msgstr "使用者屬性對照,其中 `key` 是 CAS 服務使用者屬性名稱,`value` 是 JumpServer 使用者屬性名稱"
#: settings/serializers/auth/cas.py:41
msgid "Create user"
@@ -6549,17 +6499,13 @@ msgstr "啟用釘釘認證"
msgid ""
"User attribute mapping, where the `key` is the JumpServer user attribute "
"name and the `value` is the DingTalk service user attribute name"
-msgstr ""
-"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是釘釘服務使"
-"用者屬性名稱"
+msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是釘釘服務使用者屬性名稱"
#: settings/serializers/auth/feishu.py:20
msgid ""
"User attribute mapping, where the `key` is the JumpServer user attribute "
"name and the `value` is the FeiShu service user attribute name"
-msgstr ""
-"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是飛書服務使"
-"用者屬性名稱"
+msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是飛書服務使用者屬性名稱"
#: settings/serializers/auth/lark.py:13 users/models/user/_source.py:22
msgid "Lark"
@@ -6569,11 +6515,9 @@ msgstr ""
msgid ""
"User attribute mapping, where the `key` is the JumpServer user attribute "
"name and the `value` is the Lark service user attribute name"
-msgstr ""
-"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 Lark 服務"
-"使用者屬性名稱"
+msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 Lark 服務使用者屬性名稱"
-#: settings/serializers/auth/ldap.py:42 settings/serializers/auth/ldap.py:104
+#: settings/serializers/auth/ldap.py:42 settings/serializers/auth/ldap.py:108
msgid "LDAP"
msgstr "LDAP"
@@ -6581,85 +6525,104 @@ msgstr "LDAP"
msgid "LDAP server URI"
msgstr "LDAP 服務域名"
-#: settings/serializers/auth/ldap.py:49 settings/serializers/auth/ldap_ha.py:32
+#: settings/serializers/auth/ldap.py:49
+#: settings/serializers/auth/ldap_ha.py:31
msgid "Bind DN"
msgstr "綁定 DN"
-#: settings/serializers/auth/ldap.py:50 settings/serializers/auth/ldap_ha.py:33
+#: settings/serializers/auth/ldap.py:50
+#: settings/serializers/auth/ldap_ha.py:32
msgid "Binding Distinguished Name"
msgstr "綁定的 DN"
-#: settings/serializers/auth/ldap.py:54 settings/serializers/auth/ldap_ha.py:37
+#: settings/serializers/auth/ldap.py:54
+#: settings/serializers/auth/ldap_ha.py:36
msgid "Binding password"
msgstr "原來的密碼"
-#: settings/serializers/auth/ldap.py:57 settings/serializers/auth/ldap_ha.py:40
+#: settings/serializers/auth/ldap.py:57
+#: settings/serializers/auth/ldap_ha.py:39
msgid "Search OU"
msgstr "系統架構"
-#: settings/serializers/auth/ldap.py:59 settings/serializers/auth/ldap_ha.py:42
+#: settings/serializers/auth/ldap.py:59
+#: settings/serializers/auth/ldap_ha.py:41
msgid ""
"User Search Base, if there are multiple OUs, you can separate them with the "
"`|` symbol"
msgstr "使用者搜尋庫,如果有多個OU,可以用`|`符號分隔"
-#: settings/serializers/auth/ldap.py:63 settings/serializers/auth/ldap_ha.py:46
+#: settings/serializers/auth/ldap.py:63
+#: settings/serializers/auth/ldap_ha.py:45
msgid "Search filter"
msgstr "用戶過濾器"
-#: settings/serializers/auth/ldap.py:64 settings/serializers/auth/ldap_ha.py:47
+#: settings/serializers/auth/ldap.py:64
+#: settings/serializers/auth/ldap_ha.py:46
#, python-format
msgid "Selection could include (cn|uid|sAMAccountName=%(user)s)"
msgstr "可能的選項是(cn或uid或sAMAccountName=%(user)s)"
-#: settings/serializers/auth/ldap.py:69 settings/serializers/auth/ldap_ha.py:52
+#: settings/serializers/auth/ldap.py:69
+#: settings/serializers/auth/ldap_ha.py:51
msgid ""
"User attribute mapping, where the `key` is the JumpServer user attribute "
"name and the `value` is the LDAP service user attribute name"
-msgstr ""
-"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 LDAP 服務"
-"使用者屬性名稱"
+msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 LDAP 服務使用者屬性名稱"
-#: settings/serializers/auth/ldap.py:85 settings/serializers/auth/ldap_ha.py:68
+#: settings/serializers/auth/ldap.py:85
+#: settings/serializers/auth/ldap_ha.py:67
msgid "Connect timeout (s)"
msgstr "連接超時時間 (秒)"
-#: settings/serializers/auth/ldap.py:90 settings/serializers/auth/ldap_ha.py:73
+#: settings/serializers/auth/ldap.py:88
+#: settings/serializers/auth/ldap_ha.py:70
+msgid "Strict sync"
+msgstr "嚴格模式"
+
+#: settings/serializers/auth/ldap.py:89
+#: settings/serializers/auth/ldap_ha.py:71
+msgid ""
+"In strict mode, users not found in LDAP will be disabled during full or "
+"automatic sync"
+msgstr "啟用嚴格模式後,全量或自動同步將禁用系統中未在 LDAP 中發現的用戶"
+
+#: settings/serializers/auth/ldap.py:94
+#: settings/serializers/auth/ldap_ha.py:76
msgid "User DN cache timeout (s)"
msgstr "快取逾時時間 (秒)"
-#: settings/serializers/auth/ldap.py:92
+#: settings/serializers/auth/ldap.py:96
msgid ""
"Caching the User DN obtained during user login authentication can "
"effectively improve the speed of user authentication., 0 means no "
"cache
If the user OU structure has been adjusted, click Submit to clear "
"the user DN cache"
msgstr ""
-"對用戶登入驗證時查詢出的 User DN 進行緩存,可以有效提升用戶認證的速度
如果"
-"用戶 OU 架構有调整,點擊提交即可清除用戶 DN 緩存"
+"對用戶登入驗證時查詢出的 User DN 進行緩存,可以有效提升用戶認證的速度
如果用戶 OU 架構有调整,點擊提交即可清除用戶 DN 緩存"
-#: settings/serializers/auth/ldap.py:98 settings/serializers/auth/ldap_ha.py:81
+#: settings/serializers/auth/ldap.py:102
+#: settings/serializers/auth/ldap_ha.py:84
msgid "Search paged size (piece)"
msgstr "搜索分頁數量 (條)"
-#: settings/serializers/auth/ldap_ha.py:25
-#: settings/serializers/auth/ldap_ha.py:87
+#: settings/serializers/auth/ldap_ha.py:24
+#: settings/serializers/auth/ldap_ha.py:90
msgid "LDAP HA"
msgstr "LDAP 認證"
-#: settings/serializers/auth/ldap_ha.py:29
+#: settings/serializers/auth/ldap_ha.py:28
msgid "LDAP HA server URI"
msgstr "LDAP HA 服務域名"
-#: settings/serializers/auth/ldap_ha.py:75
+#: settings/serializers/auth/ldap_ha.py:78
msgid ""
"Caching the User DN obtained during user login authentication can "
-"effectivelyimprove the speed of user authentication., 0 means no cache
If "
-"the user OU structure has been adjusted, click Submit to clear the user DN "
+"effectivelyimprove the speed of user authentication., 0 means no cache
If"
+" the user OU structure has been adjusted, click Submit to clear the user DN "
"cache"
msgstr ""
-"對用戶登入認證時查詢出的 User DN 進行快取,可以有效提高用戶認證的速度
如果"
-"用戶 OU 架構有調整,點擊提交即可清除用戶 DN 快取"
+"對用戶登入認證時查詢出的 User DN 進行快取,可以有效提高用戶認證的速度
如果用戶 OU 架構有調整,點擊提交即可清除用戶 DN 快取"
#: settings/serializers/auth/oauth2.py:19
#: settings/serializers/auth/oauth2.py:22
@@ -6703,19 +6666,18 @@ msgid "End session endpoint"
msgstr "Logout session endpoint address"
#: settings/serializers/auth/oauth2.py:57
-msgid "When the user signs out, they also be logged out from the OAuth2 server"
+msgid ""
+"When the user signs out, they also be logged out from the OAuth2 server"
msgstr "當使用者退出時,他們也會從 OAuth2 伺服器退出"
#: settings/serializers/auth/oauth2.py:62
msgid ""
"User attribute mapping, where the `key` is the JumpServer user attribute "
"name and the `value` is the OAuth2 service user attribute name"
-msgstr ""
-"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 OAuth2 服"
-"務使用者屬性名稱"
+msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 OAuth2 服務使用者屬性名稱"
-#: settings/serializers/auth/oauth2.py:67 settings/serializers/auth/oidc.py:113
-#: settings/serializers/auth/saml2.py:45
+#: settings/serializers/auth/oauth2.py:67
+#: settings/serializers/auth/oidc.py:113 settings/serializers/auth/saml2.py:45
msgid "Always update user"
msgstr "總是更新用戶資訊"
@@ -6747,9 +6709,7 @@ msgstr "Ignore SSL certificate verification"
msgid ""
"User attribute mapping, where the `key` is the JumpServer user attribute "
"name and the `value` is the OIDC service user attribute name"
-msgstr ""
-"使用者屬性映射,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 OIDC 服務"
-"使用者屬性名稱"
+msgstr "使用者屬性映射,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 OIDC 服務使用者屬性名稱"
#: settings/serializers/auth/oidc.py:45
msgid "Enable PKCE"
@@ -6767,8 +6727,7 @@ msgstr "使用 Keycloak"
msgid ""
"Use Keycloak as the OpenID Connect server, or use standard OpenID Connect "
"Protocol"
-msgstr ""
-"使用 Keycloak 作為 OpenID Connect 伺服器,或者使用標準 OpenID Connect 協議"
+msgstr "使用 Keycloak 作為 OpenID Connect 伺服器,或者使用標準 OpenID Connect 協議"
#: settings/serializers/auth/oidc.py:64
msgid "Realm name"
@@ -6827,8 +6786,7 @@ msgid ""
"The hostname can using passkey auth, If not set, will use request host and "
"the request host in DOMAINS, If multiple domains, use comma to separate"
msgstr ""
-"可以使用 Passkey 認證的域名,如果不設置,將使用請求主機(主機名在可信域 "
-"DOMAINS中), 如果有多個域名,使用逗號分隔, 不需要埠號"
+"可以使用 Passkey 認證的域名,如果不設置,將使用請求主機(主機名在可信域 DOMAINS中), 如果有多個域名,使用逗號分隔, 不需要埠號"
#: settings/serializers/auth/passkey.py:22
msgid "FIDO Server name"
@@ -6839,7 +6797,8 @@ msgid "OTP in RADIUS"
msgstr "Use Radius OTP"
#: settings/serializers/auth/radius.py:24
-msgid "* Using OTP in RADIUS means users can employ RADIUS as a method for MFA"
+msgid ""
+"* Using OTP in RADIUS means users can employ RADIUS as a method for MFA"
msgstr "* 在 RADIUS 中使用 OTP 意味著使用者可以利用 RADIUS 作為 MFA 的方法 "
#: settings/serializers/auth/saml2.py:12 settings/serializers/auth/saml2.py:15
@@ -6870,9 +6829,7 @@ msgstr "SP 證書"
msgid ""
"User attribute mapping, where the `key` is the SAML2 service user attribute "
"name and the `value` is the JumpServer user attribute name"
-msgstr ""
-" 使用者屬性映射,其中 `key` 是 SAML2 服務使用者屬性名稱,`value` 是 "
-"JumpServer 使用者屬性名稱"
+msgstr " 使用者屬性映射,其中 `key` 是 SAML2 服務使用者屬性名稱,`value` 是 JumpServer 使用者屬性名稱"
#: settings/serializers/auth/saml2.py:43
msgid "When the user signs out, they also be logged out from the SAML2 server"
@@ -6882,9 +6839,7 @@ msgstr "當使用者登出時,他們也會從 SAML2 伺服器登出"
msgid ""
"User attribute mapping, where the `key` is the JumpServer user attribute "
"name and the `value` is the Slack service user attribute name"
-msgstr ""
-"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 Slack 服"
-"務使用者屬性名稱"
+msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 Slack 服務使用者屬性名稱"
#: settings/serializers/auth/sms.py:18
msgid "Enable Short Message Service (SMS)"
@@ -6949,12 +6904,10 @@ msgstr "業務型態(Application id)"
#: settings/serializers/auth/sms.py:85
#, python-brace-format
msgid ""
-"Template need contain {code} and Signature + template length does not exceed "
-"67 words. For example, your verification code is {code}, which is valid for "
-"5 minutes. Please do not disclose it to others."
-msgstr ""
-"模板需要包含 {code},並且模板+簽名長度不能超過67個字。例如, 您的驗證碼是 "
-"{code}, 有效期為5分鐘。請不要洩露給其他人。"
+"Template need contain {code} and Signature + template length does not exceed"
+" 67 words. For example, your verification code is {code}, which is valid for"
+" 5 minutes. Please do not disclose it to others."
+msgstr "模板需要包含 {code},並且模板+簽名長度不能超過67個字。例如, 您的驗證碼是 {code}, 有效期為5分鐘。請不要洩露給其他人。"
#: settings/serializers/auth/sms.py:94
#, python-brace-format
@@ -6990,9 +6943,7 @@ msgstr "單位: 秒"
msgid ""
"User attribute mapping, where the `key` is the JumpServer user attribute "
"name and the `value` is the WeCom service user attribute name"
-msgstr ""
-"使用者屬性映射,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是企業微信服"
-"務使用者屬性名稱"
+msgstr "使用者屬性映射,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是企業微信服務使用者屬性名稱"
#: settings/serializers/basic.py:11
msgid "Site URL"
@@ -7000,8 +6951,8 @@ msgstr "目前網站 URL"
#: settings/serializers/basic.py:13
msgid ""
-"Site URL is the externally accessible address of the current product service "
-"and is usually used in links in system emails"
+"Site URL is the externally accessible address of the current product service"
+" and is usually used in links in system emails"
msgstr "站點 URL 是目前產品服務的外部可訪問地址,通常在系統郵件的連結中使用"
#: settings/serializers/basic.py:18
@@ -7086,8 +7037,7 @@ msgstr "會話日誌 (天)"
msgid ""
"Session, record, command will be delete if more than duration, only in "
"database, OSS will not be affected."
-msgstr ""
-"會話、錄影,命令記錄超過該時長將會被清除 (影響資料庫儲存,OSS 等不受影響)"
+msgstr "會話、錄影,命令記錄超過該時長將會被清除 (影響資料庫儲存,OSS 等不受影響)"
#: settings/serializers/cleaning.py:53
msgid "Change secret and push record retention days (day)"
@@ -7125,8 +7075,7 @@ msgid ""
"accounts that exceed the predetermined number. If the value reaches or "
"exceeds 999 (default), no historical account deletion will be performed"
msgstr ""
-"如果特定數值小於999,系統將在每日晚間自動執行任務:檢查並刪除超出預定數量的歷"
-"史帳號。如果該數值達到或超過999,則不進行任何歷史帳號的刪除操作。"
+"如果特定數值小於999,系統將在每日晚間自動執行任務:檢查並刪除超出預定數量的歷史帳號。如果該數值達到或超過999,則不進行任何歷史帳號的刪除操作。"
#: settings/serializers/feature.py:87
msgid "Mount Point"
@@ -7278,8 +7227,7 @@ msgid ""
"server. In most email documentation this type of TLS connection is referred "
"to as SSL. It is generally used on port 465"
msgstr ""
-"與 SMTP 伺服器通信時是否使用隱式 TLS(安全)連接。在大多數電子郵件文檔中,這"
-"種類型的 TLS 連接稱為 SSL。它通常在埠 465 上使用"
+"與 SMTP 伺服器通信時是否使用隱式 TLS(安全)連接。在大多數電子郵件文檔中,這種類型的 TLS 連接稱為 SSL。它通常在埠 465 上使用"
#: settings/serializers/msg.py:54
msgid "Use TLS"
@@ -7289,9 +7237,7 @@ msgstr "使用 TLS"
msgid ""
"Whether to use a TLS (secure) connection when talking to the SMTP server. "
"This is used for explicit TLS connections, generally on port 587"
-msgstr ""
-"與 SMTP 伺服器通信時是否使用 TLS(安全)連接。這用於顯式 TLS 連接,通常在埠 "
-"587 上"
+msgstr "與 SMTP 伺服器通信時是否使用 TLS(安全)連接。這用於顯式 TLS 連接,通常在埠 587 上"
#: settings/serializers/msg.py:64
msgid "Subject prefix"
@@ -7299,8 +7245,8 @@ msgstr "主題前綴"
#: settings/serializers/msg.py:69
msgid ""
-"Tips: When creating a user, send the subject of the email (eg:Create account "
-"successfully)"
+"Tips: When creating a user, send the subject of the email (eg:Create account"
+" successfully)"
msgstr "提示: 創建用戶時,發送設置密碼郵件的主題 (例如: 創建用戶成功)"
#: settings/serializers/msg.py:73
@@ -7316,8 +7262,7 @@ msgstr "提示: 創建用戶時,發送設置密碼郵件的敬語 (例如: 你
msgid ""
"Tips: When creating a user, send the content of the email, support "
"{username} {name} {email} label"
-msgstr ""
-"提示: 創建用戶時,發送設置密碼郵件的內容, 支持 {username} {name} {email} 標籤"
+msgstr "提示: 創建用戶時,發送設置密碼郵件的內容, 支持 {username} {name} {email} 標籤"
#: settings/serializers/msg.py:84
msgid "Tips: Email signature (eg:jumpserver)"
@@ -7333,9 +7278,7 @@ msgstr "顯示未分組節點"
#: settings/serializers/other.py:12
msgid "Perm single to ungroup node"
-msgstr ""
-"放置單獨授權的資產到未分組節點, 避免能看到資產所在節點,但該節點未被授權的問"
-"題"
+msgstr "放置單獨授權的資產到未分組節點, 避免能看到資產所在節點,但該節點未被授權的問題"
#: settings/serializers/security.py:17
msgid "User password expiration (day)"
@@ -7346,9 +7289,7 @@ msgid ""
"If the user does not update the password during the time, the user password "
"will expire failure;The password expiration reminder mail will be automatic "
"sent to the user by system within 5 days (daily) before the password expires"
-msgstr ""
-"如果用戶在此期間沒有更新密碼,用戶密碼將過期失效; 密碼過期提醒郵件將在密碼過"
-"期前5天內由系統 (每天)自動發送給用戶"
+msgstr "如果用戶在此期間沒有更新密碼,用戶密碼將過期失效; 密碼過期提醒郵件將在密碼過期前5天內由系統 (每天)自動發送給用戶"
#: settings/serializers/security.py:26
msgid "Recent password count"
@@ -7418,9 +7359,7 @@ msgid ""
"users of other authentication methods except local authentication methods "
"are allowed to log in and automatically create users (if the user does not "
"exist)"
-msgstr ""
-"如果開啟,不存在的用戶將不被允許登錄;如果關閉,除本地認證方式外,其他認證方"
-"式的用戶都允許登錄並自動創建用戶 (如果用戶不存在)"
+msgstr "如果開啟,不存在的用戶將不被允許登錄;如果關閉,除本地認證方式外,其他認證方式的用戶都允許登錄並自動創建用戶 (如果用戶不存在)"
#: settings/serializers/security.py:103
msgid "Only from source login"
@@ -7428,13 +7367,12 @@ msgstr "僅從用戶來源登錄"
#: settings/serializers/security.py:105
msgid ""
-"If it is enabled, the user will only authenticate to the source when logging "
-"in; if it is disabled, the user will authenticate all the enabled "
+"If it is enabled, the user will only authenticate to the source when logging"
+" in; if it is disabled, the user will authenticate all the enabled "
"authentication methods in a certain order when logging in, and as long as "
"one of the authentication methods is successful, they can log in directly"
msgstr ""
-"如果開啟,用戶登錄時僅會向來源端進行認證;如果關閉,用戶登錄時會按照一定的順"
-"序對所有已開啟的認證方式進行順序認證,只要有一個認證成功就可以直接登錄"
+"如果開啟,用戶登錄時僅會向來源端進行認證;如果關閉,用戶登錄時會按照一定的順序對所有已開啟的認證方式進行順序認證,只要有一個認證成功就可以直接登錄"
#: settings/serializers/security.py:116
#: users/templates/users/mfa_setting.html:160
@@ -7461,148 +7399,147 @@ msgstr "第三方認證開啟 MFA"
msgid "The third-party login modes include OIDC, CAS, and SAML2"
msgstr "第三方登錄方式包括: OIDC、CAS、SAML2"
-#: settings/serializers/security.py:128
+#: settings/serializers/security.py:129
+msgid "MFA via Email"
+msgstr "郵件驗證 MFA"
+
+#: settings/serializers/security.py:130
+msgid "Email as a method for multi-factor authentication"
+msgstr "將電子郵件作為多因素認證的一種方式"
+
+#: settings/serializers/security.py:133
msgid "OTP issuer name"
msgstr "OTP 掃描後的名稱"
-#: settings/serializers/security.py:132
+#: settings/serializers/security.py:137
msgid "OTP valid window"
msgstr "OTP 延遲有效次數"
-#: settings/serializers/security.py:136
+#: settings/serializers/security.py:141
msgid "MFA verify TTL"
msgstr "MFA 校驗有效期"
-#: settings/serializers/security.py:138
+#: settings/serializers/security.py:143
msgid ""
"Unit: second, The verification MFA takes effect only when you view the "
"account password"
msgstr "單位:秒,目前僅在查看帳號密碼校驗 MFA 時生效"
-#: settings/serializers/security.py:143
+#: settings/serializers/security.py:148
msgid "MFA in login page"
msgstr "MFA 在登入頁面輸入"
-#: settings/serializers/security.py:144
+#: settings/serializers/security.py:149
msgid "Eu security regulations(GDPR) require MFA to be on the login page"
msgstr "歐盟數據安全法規(GDPR) 要求 MFA 在登入頁面,來確保系統登錄安全"
-#: settings/serializers/security.py:148
+#: settings/serializers/security.py:153
msgid "Verify code TTL (second)"
msgstr "驗證碼有效時間 (分)"
-#: settings/serializers/security.py:149
+#: settings/serializers/security.py:154
msgid "Reset password and send SMS code expiration time"
msgstr "重設密碼的驗證碼及發送簡訊的驗證碼過期時間"
-#: settings/serializers/security.py:153
+#: settings/serializers/security.py:158
msgid "Login dynamic code"
msgstr "啟用登入附加碼"
-#: settings/serializers/security.py:154
+#: settings/serializers/security.py:159
msgid ""
"The password and additional code are sent to a third party authentication "
"system for verification"
-msgstr ""
-"密碼和附加碼一併發送給第三方認證系統進行校驗, 如:有的第三方認證系統,需要 密"
-"碼+6位數字 完成認證"
+msgstr "密碼和附加碼一併發送給第三方認證系統進行校驗, 如:有的第三方認證系統,需要 密碼+6位數字 完成認證"
-#: settings/serializers/security.py:158
+#: settings/serializers/security.py:163
msgid "Login captcha"
msgstr "啟用登入驗證碼"
-#: settings/serializers/security.py:159
+#: settings/serializers/security.py:164
msgid "Enable captcha to prevent robot authentication"
msgstr "開啟驗證碼,防止機器人登錄"
-#: settings/serializers/security.py:162
+#: settings/serializers/security.py:167
msgid "Suspicious Login Verification"
msgstr "異地登入通知"
-#: settings/serializers/security.py:164
+#: settings/serializers/security.py:169
msgid ""
-"The system determines whether the login IP address belongs to a common login "
-"city. If the account is logged in from a common login city, the system sends "
-"a remote login reminder"
-msgstr ""
-"根據登錄 IP 是否所屬常用登錄城市進行判斷,若帳號在非常用城市登錄,會發送異地"
-"登錄提醒"
+"The system determines whether the login IP address belongs to a common login"
+" city. If the account is logged in from a common login city, the system "
+"sends a remote login reminder"
+msgstr "根據登錄 IP 是否所屬常用登錄城市進行判斷,若帳號在非常用城市登錄,會發送異地登錄提醒"
-#: settings/serializers/security.py:170
+#: settings/serializers/security.py:175
msgid "Auto Disable Threshold (day)"
msgstr "不活躍用戶自動禁用 (天)"
-#: settings/serializers/security.py:171
+#: settings/serializers/security.py:176
msgid ""
"Detect infrequent users daily and disable them if they exceed the "
"predetermined time limit"
msgstr "每天檢測一次,超過預設時間的用戶自動禁用"
-#: settings/serializers/security.py:191
+#: settings/serializers/security.py:196
msgid "Watermark"
msgstr "開啟浮水印"
-#: settings/serializers/security.py:192
-msgid "Enabled, the web session and replay contains watermark information"
-msgstr "啟用後,Web 會話和錄影將包含浮水印資訊"
-
-#: settings/serializers/security.py:196
+#: settings/serializers/security.py:200
msgid "Max idle time (minute)"
msgstr "連接最大空閒時間 (分)"
-#: settings/serializers/security.py:197
+#: settings/serializers/security.py:201
msgid "If idle time more than it, disconnect connection."
msgstr "提示:如果超過該配置沒有操作,連接會被斷開"
-#: settings/serializers/security.py:200
+#: settings/serializers/security.py:204
msgid "Session expire at browser closed"
msgstr "會話在瀏覽器關閉時過期"
-#: settings/serializers/security.py:201
+#: settings/serializers/security.py:205
msgid "Whether to expire the session when the user closes their browser."
msgstr "當用戶關閉瀏覽器時是否使會話過期。"
-#: settings/serializers/security.py:206
+#: settings/serializers/security.py:210
msgid "Allow users to view asset session information"
msgstr "允許用戶查看資產在線會話資訊"
-#: settings/serializers/security.py:208
+#: settings/serializers/security.py:212
msgid ""
"When a user connects to an asset, the account selection popup displays the "
"number of active sessions for the current asset (RDP protocol only)."
-msgstr ""
-"當用戶連接資產時,帳號選擇彈窗中顯示當前資產的在線會話數量(僅 rdp 協議)"
+msgstr "當用戶連接資產時,帳號選擇彈窗中顯示當前資產的在線會話數量(僅 rdp 協議)"
-#: settings/serializers/security.py:214
+#: settings/serializers/security.py:218
msgid "Max online time (hour)"
msgstr "會話連接最大時間 (時)"
-#: settings/serializers/security.py:215
+#: settings/serializers/security.py:219
msgid "If session connection time more than it, disconnect connection."
msgstr "提示:如果會話連接超過該配置,連接會被斷開"
-#: settings/serializers/security.py:218
+#: settings/serializers/security.py:222
msgid "Remember manual auth"
msgstr "保存手動輸入密碼"
-#: settings/serializers/security.py:221
+#: settings/serializers/security.py:225
#: terminal/templates/terminal/_msg_session_sharing.html:10
msgid "Session share"
msgstr "會話分享"
-#: settings/serializers/security.py:222
+#: settings/serializers/security.py:226
msgid "Enabled, Allows user active session to be shared with other users"
msgstr "開啟後允許用戶分享已連接的資產會話給他人,協同工作"
-#: settings/serializers/security.py:228
+#: settings/serializers/security.py:232
msgid "Insecure command alert"
msgstr "危險命令告警"
-#: settings/serializers/security.py:231
+#: settings/serializers/security.py:235
msgid "Email recipient"
msgstr "郵件收件人"
-#: settings/serializers/security.py:232
+#: settings/serializers/security.py:236
msgid "Multiple user using , split"
msgstr "多個用戶,使用 , 分割"
@@ -7615,68 +7552,68 @@ msgstr "[%s] %s"
msgid "Auto"
msgstr "自動"
-#: settings/serializers/terminal.py:22
+#: settings/serializers/terminal.py:23
+msgid "Auto(Enabled for the first 5 minutes after startup, then disabled.)"
+msgstr "自動(啟動後前 5 分鐘啟用,然後禁用。)"
+
+#: settings/serializers/terminal.py:26
msgid "Registration"
msgstr "元件註冊"
-#: settings/serializers/terminal.py:24
+#: settings/serializers/terminal.py:28
msgid ""
-"Allow component register, after all component setup, you should disable this "
-"for security"
+"Allow component register, after all component setup, you should disable this"
+" for security"
msgstr "是否允許元件註冊,當所有終端啟動後,為了安全應該關閉"
-#: settings/serializers/terminal.py:30
+#: settings/serializers/terminal.py:34
msgid ""
"* Allow users to log in to the KoKo component via password authentication"
msgstr "* 允許用戶透過密碼驗證登入KoKo元件"
-#: settings/serializers/terminal.py:36
+#: settings/serializers/terminal.py:40
msgid ""
"* Allow users to log in to the KoKo component via Public key "
"authentication
If third-party authentication services, such as AD/LDAP, "
-"are enabled, you should disable this option to prevent users from logging in "
-"after being deleted from the AD/LDAP server"
+"are enabled, you should disable this option to prevent users from logging in"
+" after being deleted from the AD/LDAP server"
msgstr ""
-"* 允許用戶透過公鑰驗證方式登入 KoKo 元件
如果第三方認證服務(如 AD/LDAP)"
-"已啟用,則應禁用此選項,以防止用戶從 AD/LDAP 伺服器中刪除後再次登入"
+"* 允許用戶透過公鑰驗證方式登入 KoKo 元件
如果第三方認證服務(如 AD/LDAP)已啟用,則應禁用此選項,以防止用戶從 AD/LDAP "
+"伺服器中刪除後再次登入"
-#: settings/serializers/terminal.py:43
+#: settings/serializers/terminal.py:47
msgid "Asset sorting"
msgstr "資產列表排序"
-#: settings/serializers/terminal.py:46
+#: settings/serializers/terminal.py:50
msgid "Asset page size"
msgstr "資產列表每頁數量"
-#: settings/serializers/terminal.py:51
+#: settings/serializers/terminal.py:55
msgid ""
-"* You can individually configure the service address and port in the service "
-"endpoint
If enabled, the Luna page will display the DB client launch "
+"* You can individually configure the service address and port in the service"
+" endpoint
If enabled, the Luna page will display the DB client launch "
"method when connecting to assets"
-msgstr ""
-"* 您可以在服務端點中單獨配置服務地址和端口
如果啟用,Luna 界面將在連接資"
-"產時顯示 DB 客戶端啟動方法"
+msgstr "* 您可以在服務端點中單獨配置服務地址和端口
如果啟用,Luna 界面將在連接資產時顯示 DB 客戶端啟動方法"
-#: settings/serializers/terminal.py:59
+#: settings/serializers/terminal.py:63
msgid ""
-"* You can individually configure the service address and port in the service "
-"endpoint
If enabled, the Luna page will display the download rdp file "
+"* You can individually configure the service address and port in the service"
+" endpoint
If enabled, the Luna page will display the download rdp file "
"button and RDP Client launch method when connecting to assets"
msgstr ""
-"* 您可以在服務端點中單獨配置服務地址和端口
如果啟用,Luna 界面將在連接資"
-"產時顯示下載 rdp 文件按鈕和 RDP 客戶端啟動方法"
+"* 您可以在服務端點中單獨配置服務地址和端口
如果啟用,Luna 界面將在連接資產時顯示下載 rdp 文件按鈕和 RDP 客戶端啟動方法"
-#: settings/serializers/terminal.py:66
+#: settings/serializers/terminal.py:70
msgid "Client connection"
msgstr "客戶端連接"
-#: settings/serializers/terminal.py:68
+#: settings/serializers/terminal.py:72
msgid ""
"* Allow connecting to the KoKo component via SSH client
If enabled, the "
-"Luna page will display the SSH client launch method when connecting to assets"
-msgstr ""
-"* 允許透過 SSH 客戶端連接到 KoKo 元件
如果啟用,則在連接到資產時,Luna 界"
-"面將顯示 SSH 客戶端啟動方法"
+"Luna page will display the SSH client launch method when connecting to "
+"assets"
+msgstr "* 允許透過 SSH 客戶端連接到 KoKo 元件
如果啟用,則在連接到資產時,Luna 界面將顯示 SSH 客戶端啟動方法"
#: settings/serializers/tool.py:10
msgid "Tool"
@@ -7688,49 +7625,43 @@ msgstr "工作台中的工具"
#: settings/serializers/tool.py:15
msgid ""
-"*! If enabled, users with RBAC permissions will be able to utilize all tools "
-"in the workbench"
+"*! If enabled, users with RBAC permissions will be able to utilize all tools"
+" in the workbench"
msgstr "*! 如果啟用,具有 RBAC 權限的用戶將能夠使用工作台中的所有工具"
-#: settings/tasks/ldap.py:73
+#: settings/tasks/ldap.py:67
msgid "Periodic import ldap user"
msgstr "週期匯入 LDAP 用戶"
-#: settings/tasks/ldap.py:75 settings/tasks/ldap.py:85
+#: settings/tasks/ldap.py:69 settings/tasks/ldap.py:79
msgid ""
"When LDAP auto-sync is configured, this task will be invoked to synchronize "
"users"
msgstr "當設置了LDAP自動同步,將調用該任務進行用戶同步"
-#: settings/tasks/ldap.py:83
+#: settings/tasks/ldap.py:77
msgid "Periodic import ldap ha user"
msgstr "定期導入 LDAP HA 用戶"
-#: settings/tasks/ldap.py:120
+#: settings/tasks/ldap.py:115
msgid "Registration periodic import ldap user task"
msgstr "註冊週期匯入 LDAP 用戶 任務"
-#: settings/tasks/ldap.py:122
+#: settings/tasks/ldap.py:117
msgid ""
-"When LDAP auto-sync parameters change, such as Crontab parameters, the LDAP "
-"sync task \n"
+"When LDAP auto-sync parameters change, such as Crontab parameters, the LDAP sync task \n"
" will be re-registered or updated, and this task will be invoked"
-msgstr ""
-"當設置了LDAP自動同步參數發生變化時,比如Crontab參數,重新註冊或更新ldap同步任"
-"務將調用該任務"
+msgstr "當設置了LDAP自動同步參數發生變化時,比如Crontab參數,重新註冊或更新ldap同步任務將調用該任務"
-#: settings/tasks/ldap.py:136
+#: settings/tasks/ldap.py:131
msgid "Registration periodic import ldap ha user task"
msgstr "註冊定期導入 LDAP HA 用戶 任務"
-#: settings/tasks/ldap.py:138
+#: settings/tasks/ldap.py:133
msgid ""
-"When LDAP HA auto-sync parameters change, such as Crontab parameters, the "
-"LDAP HA sync task \n"
+"When LDAP HA auto-sync parameters change, such as Crontab parameters, the LDAP HA sync task \n"
" will be re-registered or updated, and this task will be invoked"
-msgstr ""
-"當 LDAP HA 自動同步參數發生變化時,例如 Crontab 參數,將重新註冊或更新“LDAP "
-"HA 同步任務,並調用此任務"
+msgstr "當 LDAP HA 自動同步參數發生變化時,例如 Crontab 參數,將重新註冊或更新“LDAP HA 同步任務,並調用此任務"
#: settings/templates/ldap/_msg_import_ldap_user.html:2
msgid "Sync task finish"
@@ -7748,114 +7679,114 @@ msgstr "已同步用戶"
msgid "No user synchronization required"
msgstr "沒有用戶需要同步"
-#: settings/utils/ldap.py:509
+#: settings/utils/ldap.py:529
msgid "ldap:// or ldaps:// protocol is used."
msgstr "使用 ldap:// 或 ldaps:// 協議"
-#: settings/utils/ldap.py:520
+#: settings/utils/ldap.py:540
msgid "Host or port is disconnected: {}"
msgstr "主機或埠不可連接: {}"
-#: settings/utils/ldap.py:522
+#: settings/utils/ldap.py:542
msgid "The port is not the port of the LDAP service: {}"
msgstr "埠不是LDAP服務埠: {}"
-#: settings/utils/ldap.py:524
+#: settings/utils/ldap.py:544
msgid "Please add certificate: {}"
msgstr "請添加證書"
-#: settings/utils/ldap.py:528 settings/utils/ldap.py:555
-#: settings/utils/ldap.py:585 settings/utils/ldap.py:613
+#: settings/utils/ldap.py:548 settings/utils/ldap.py:575
+#: settings/utils/ldap.py:605 settings/utils/ldap.py:633
msgid "Unknown error: {}"
msgstr "未知錯誤: {}"
-#: settings/utils/ldap.py:542
+#: settings/utils/ldap.py:562
msgid "Bind DN or Password incorrect"
msgstr "綁定DN或密碼錯誤"
-#: settings/utils/ldap.py:549
+#: settings/utils/ldap.py:569
msgid "Please enter Bind DN: {}"
msgstr "請輸入綁定DN: {}"
-#: settings/utils/ldap.py:551
+#: settings/utils/ldap.py:571
msgid "Please enter Password: {}"
msgstr "請輸入密碼: {}"
-#: settings/utils/ldap.py:553
+#: settings/utils/ldap.py:573
msgid "Please enter correct Bind DN and Password: {}"
msgstr "請輸入正確的綁定DN和密碼: {}"
-#: settings/utils/ldap.py:571
+#: settings/utils/ldap.py:591
msgid "Invalid User OU or User search filter: {}"
msgstr "不合法的用戶OU或用戶過濾器: {}"
-#: settings/utils/ldap.py:602
+#: settings/utils/ldap.py:622
msgid "LDAP User attr map not include: {}"
msgstr "LDAP屬性映射沒有包含: {}"
-#: settings/utils/ldap.py:609
+#: settings/utils/ldap.py:629
msgid "LDAP User attr map is not dict"
msgstr "LDAP屬性映射不合法"
-#: settings/utils/ldap.py:628
+#: settings/utils/ldap.py:648
msgid "LDAP authentication is not enabled"
msgstr "LDAP認證沒有啟用"
-#: settings/utils/ldap.py:646
+#: settings/utils/ldap.py:666
msgid "Error (Invalid LDAP server): {}"
msgstr "錯誤 (不合法的LDAP伺服器地址): {}"
-#: settings/utils/ldap.py:648
+#: settings/utils/ldap.py:668
msgid "Error (Invalid Bind DN): {}"
msgstr "錯誤 (不合法的綁定DN): {}"
-#: settings/utils/ldap.py:650
+#: settings/utils/ldap.py:670
msgid "Error (Invalid LDAP User attr map): {}"
msgstr "錯誤 (不合法的LDAP屬性映射): {}"
-#: settings/utils/ldap.py:652
+#: settings/utils/ldap.py:672
msgid "Error (Invalid User OU or User search filter): {}"
msgstr "錯誤 (不合法的用戶OU或用戶過濾器): {}"
-#: settings/utils/ldap.py:654
+#: settings/utils/ldap.py:674
msgid "Error (Not enabled LDAP authentication): {}"
msgstr "錯誤 (沒有啟用LDAP認證): {}"
-#: settings/utils/ldap.py:656
+#: settings/utils/ldap.py:676
msgid "Error (Unknown): {}"
msgstr "錯誤 (未知): {}"
-#: settings/utils/ldap.py:659
+#: settings/utils/ldap.py:679
msgid "Succeed: Match {} users"
msgstr "成功配對 {} 個用戶"
-#: settings/utils/ldap.py:689
+#: settings/utils/ldap.py:709
msgid "Authentication failed (configuration incorrect): {}"
msgstr "認證失敗 (配置錯誤): {}"
-#: settings/utils/ldap.py:693
+#: settings/utils/ldap.py:713
msgid "Authentication failed (username or password incorrect): {}"
msgstr "認證失敗 (使用者名稱或密碼不正確): {}"
-#: settings/utils/ldap.py:695
+#: settings/utils/ldap.py:715
msgid "Authentication failed (Unknown): {}"
msgstr "認證失敗: (未知): {}"
-#: settings/utils/ldap.py:698
+#: settings/utils/ldap.py:718
msgid "Authentication success: {}"
msgstr "認證成功: {}"
-#: settings/ws.py:222
+#: settings/ws.py:223
msgid "No LDAP user was found"
msgstr "沒有取得到 LDAP 用戶"
-#: settings/ws.py:228
+#: settings/ws.py:232
msgid "Total {}, success {}, failure {}"
msgstr "總共 {},成功 {},失敗 {}"
-#: templates/_csv_import_export.html:8
-msgid "Export"
-msgstr "匯出"
+#: settings/ws.py:236
+msgid ", disabled {}"
+msgstr ",禁用 {}"
#: templates/_csv_import_export.html:13 templates/_csv_import_modal.html:5
#: xpack/plugins/cloud/const.py:65
@@ -7931,9 +7862,7 @@ msgstr "過期。"
msgid ""
"Your password has expired, please click
this link update password."
-msgstr ""
-"您的密碼已過期,請點擊
連結 更"
-"新密碼"
+msgstr "您的密碼已過期,請點擊
連結 更新密碼"
#: templates/_message.html:26
msgid "Your password will at"
@@ -7951,17 +7880,14 @@ msgstr "請點擊
連結 更新
msgid ""
"Your information was incomplete. Please click
this link to complete your information."
-msgstr ""
-"您的資訊不完整,請點擊
連結 補充完整"
+msgstr "您的資訊不完整,請點擊
連結 補充完整"
#: templates/_message.html:48
#, python-format
msgid ""
"Your ssh public key not set or expired. Please click
this link to update"
-msgstr ""
-"您的SSH金鑰尚未設定或已失效,請點擊
連結 "
-" 更新"
+msgstr "您的SSH金鑰尚未設定或已失效,請點擊
連結 更新"
#: templates/_mfa_login_field.html:31
#: users/templates/users/forgot_password.html:101
@@ -7991,9 +7917,7 @@ msgstr "用戶端"
msgid ""
"JumpServer Client, currently used to launch the client, now only support "
"launch RDP SSH client, The Telnet client will next"
-msgstr ""
-"JumpServer 用戶端,目前用來喚起 特定用戶端程序 連接資產, 目前僅支持 RDP SSH "
-"用戶端,Telnet 會在未來支持"
+msgstr "JumpServer 用戶端,目前用來喚起 特定用戶端程序 連接資產, 目前僅支持 RDP SSH 用戶端,Telnet 會在未來支持"
#: templates/resource_download.html:35
msgid "Microsoft"
@@ -8069,7 +7993,7 @@ msgstr "測試成功"
msgid "Test failure: Please check configuration"
msgstr "測試失敗:請檢查配置"
-#: terminal/api/component/terminal.py:57
+#: terminal/api/component/terminal.py:56
msgid "Have online sessions"
msgstr "有在線會話"
@@ -8249,7 +8173,7 @@ msgstr "版本"
msgid "Can concurrent"
msgstr "可以並發"
-#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:179
+#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:194
#: terminal/serializers/storage.py:193
msgid "Hosts"
msgstr "主機"
@@ -8271,12 +8195,12 @@ msgstr "只支持自訂平台"
msgid "Missing type in platform.yml"
msgstr "在 platform.yml 中缺少類型"
-#: terminal/models/applet/applet.py:330 terminal/models/applet/host.py:36
+#: terminal/models/applet/applet.py:371 terminal/models/applet/host.py:36
#: terminal/models/applet/host.py:138
msgid "Hosting"
msgstr "宿主機"
-#: terminal/models/applet/applet.py:336
+#: terminal/models/applet/applet.py:377
msgid "Applet Publication"
msgstr "應用發布"
@@ -8353,18 +8277,22 @@ msgid "SQLServer port"
msgstr "SQLServer 埠"
#: terminal/models/component/endpoint.py:25
+msgid "Oracle port"
+msgstr "Oracle 埠"
+
+#: terminal/models/component/endpoint.py:26
msgid "VNC port"
msgstr "VNC 端口"
-#: terminal/models/component/endpoint.py:33
-#: terminal/models/component/endpoint.py:120
-#: terminal/serializers/endpoint.py:80 terminal/serializers/storage.py:41
+#: terminal/models/component/endpoint.py:34
+#: terminal/models/component/endpoint.py:114
+#: terminal/serializers/endpoint.py:61 terminal/serializers/storage.py:41
#: terminal/serializers/storage.py:53 terminal/serializers/storage.py:83
#: terminal/serializers/storage.py:93 terminal/serializers/storage.py:101
msgid "Endpoint"
msgstr "端點"
-#: terminal/models/component/endpoint.py:126
+#: terminal/models/component/endpoint.py:120
msgid "Endpoint rule"
msgstr "端點規則"
@@ -8438,7 +8366,8 @@ msgstr "可以下載會話錄影"
msgid "Account ID"
msgstr "帳號"
-#: terminal/models/session/session.py:39 terminal/models/session/sharing.py:118
+#: terminal/models/session/session.py:39
+#: terminal/models/session/sharing.py:118
msgid "Login from"
msgstr "登錄來源"
@@ -8487,8 +8416,8 @@ msgstr "操作權限"
msgid "Origin"
msgstr "來源"
-#: terminal/models/session/sharing.py:42 terminal/models/session/sharing.py:100
-#: terminal/notifications.py:279
+#: terminal/models/session/sharing.py:42
+#: terminal/models/session/sharing.py:100 terminal/notifications.py:279
msgid "Session sharing"
msgstr "會話分享"
@@ -8571,7 +8500,7 @@ msgid "Command and replay storage"
msgstr "命令及錄影儲存"
#: terminal/notifications.py:258 terminal/tasks.py:212
-#: xpack/plugins/cloud/api.py:160
+#: xpack/plugins/cloud/api.py:175
#: xpack/plugins/cloud/serializers/account.py:121
#: xpack/plugins/cloud/serializers/account.py:123
msgid "Test failure: Account invalid"
@@ -8601,19 +8530,15 @@ msgstr "Core 服務地址"
#: terminal/serializers/applet_host.py:38
msgid ""
" \n"
-" Tips: The application release machine communicates with the Core "
-"service. \n"
-" If the release machine and the Core service are on the same network "
-"segment, \n"
-" it is recommended to fill in the intranet address, otherwise fill in "
-"the current site URL \n"
+" Tips: The application release machine communicates with the Core service. \n"
+" If the release machine and the Core service are on the same network segment, \n"
+" it is recommended to fill in the intranet address, otherwise fill in the current site URL \n"
"
\n"
" eg: https://172.16.10.110 or https://dev.jumpserver.com\n"
" "
msgstr ""
-"提示:應用發布機和 Core 服務進行通信使用,如果發布機和 Core 服務在同一網段,"
-"建議填寫內網地址,否則填寫當前站點 URL
例如:https://172.16.10.110 or "
-"https://dev.jumpserver.com"
+"提示:應用發布機和 Core 服務進行通信使用,如果發布機和 Core 服務在同一網段,建議填寫內網地址,否則填寫當前站點 "
+"URL
例如:https://172.16.10.110 or https://dev.jumpserver.com"
#: terminal/serializers/applet_host.py:46 terminal/serializers/storage.py:207
msgid "Ignore Certificate Verification"
@@ -8626,12 +8551,12 @@ msgstr "已有 RDS 許可證"
#: terminal/serializers/applet_host.py:50
msgid ""
"If not exist, the RDS will be in trial mode, and the trial period is 120 "
-"days.
Detail"
+"days.
Detail"
msgstr ""
-"如果不存在,RDS將處於試用模式,試用期為 120 天。
詳情"
+"如果不存在,RDS將處於試用模式,試用期為 120 天。
詳情"
#: terminal/serializers/applet_host.py:55
msgid "RDS License Server"
@@ -8649,9 +8574,7 @@ msgstr "RDS 單用戶單會話"
msgid ""
"Tips: A RDS user can have only one session at a time. If set, when next "
"login connected, previous session will be disconnected."
-msgstr ""
-"提示:RDS 用戶一次只能有一個會話。如果設定了,當下一次登入連接時,之前的會話"
-"將會被斷開"
+msgstr "提示:RDS 用戶一次只能有一個會話。如果設定了,當下一次登入連接時,之前的會話將會被斷開"
#: terminal/serializers/applet_host.py:65
msgid "RDS Max Disconnection Time (ms)"
@@ -8661,9 +8584,7 @@ msgstr "RDS 最大斷開時間(毫秒)"
msgid ""
"Tips: Set the maximum duration for keeping a disconnected session active on "
"the server (log off the session after 60000 milliseconds)."
-msgstr ""
-"提示:設置某個已斷開連接的會話在伺服器上能保持活動狀態的最長時間(60000 毫秒"
-"後註銷會話)"
+msgstr "提示:設置某個已斷開連接的會話在伺服器上能保持活動狀態的最長時間(60000 毫秒後註銷會話)"
#: terminal/serializers/applet_host.py:72
msgid "RDS Remote App Logoff Time Limit (ms)"
@@ -8671,11 +8592,9 @@ msgstr "RDS 遠程應用註銷時間限制(毫秒)"
#: terminal/serializers/applet_host.py:74
msgid ""
-"Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp "
-"programs (0 milliseconds, log off the session immediately)."
-msgstr ""
-"提示:關閉所有 RemoteApp 程序之後設置 RemoteAPP 會話的註銷時間(0 毫秒,立即"
-"註銷會話)"
+"Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp"
+" programs (0 milliseconds, log off the session immediately)."
+msgstr "提示:關閉所有 RemoteApp 程序之後設置 RemoteAPP 會話的註銷時間(0 毫秒,立即註銷會話)"
#: terminal/serializers/applet_host.py:83 terminal/serializers/terminal.py:47
#: terminal/serializers/virtualapp_provider.py:13
@@ -8684,16 +8603,15 @@ msgstr "負載狀態"
#: terminal/serializers/applet_host.py:97
msgid ""
-"These accounts are used to connect to the published application, the account "
-"is now divided into two types, one is dedicated to each account, each user "
+"These accounts are used to connect to the published application, the account"
+" is now divided into two types, one is dedicated to each account, each user "
"has a private account, the other is public, when the application does not "
-"support multiple open and the special has been used, the public account will "
-"be used to connect"
+"support multiple open and the special has been used, the public account will"
+" be used to connect"
msgstr ""
-"這些帳號用於連接髮布的應用,帳號現在分為兩種類型:
一種是專用的,每個用"
-"戶都有一個專用帳號。 另一種是公共的,當應用不支持多開且專用的已經被使用時,會"
-"使用公共帳號連接;
注意: 如果不開啟自動創建帳號, 當前發布機僅能被指定標"
-"簽的資產調度到,默認不會放到調度池中,且需要手動維護帳號"
+"這些帳號用於連接髮布的應用,帳號現在分為兩種類型:
一種是專用的,每個用戶都有一個專用帳號。 "
+"另一種是公共的,當應用不支持多開且專用的已經被使用時,會使用公共帳號連接;
注意: 如果不開啟自動創建帳號, "
+"當前發布機僅能被指定標簽的資產調度到,默認不會放到調度池中,且需要手動維護帳號"
#: terminal/serializers/applet_host.py:104
msgid "The number of public accounts created automatically"
@@ -8705,18 +8623,17 @@ msgid ""
"please set the configuration item CACHE_LOGIN_PASSWORD_ENABLED=true and "
"restart the service to enable it."
msgstr ""
-"優先使用同名帳號連接髮布機。為了安全,需配置文件中開啟配置 "
-"CACHE_LOGIN_PASSWORD_ENABLED=true, 修改後重啟服務"
+"優先使用同名帳號連接髮布機。為了安全,需配置文件中開啟配置 CACHE_LOGIN_PASSWORD_ENABLED=true, 修改後重啟服務"
-#: terminal/serializers/applet_host.py:149
+#: terminal/serializers/applet_host.py:164
msgid "Install applets"
msgstr "安裝應用"
-#: terminal/serializers/applet_host.py:179
+#: terminal/serializers/applet_host.py:194
msgid "Host ID"
msgstr "主機 ID"
-#: terminal/serializers/applet_host.py:180
+#: terminal/serializers/applet_host.py:195
msgid "Applet ID"
msgstr "遠程應用 ID"
@@ -8744,43 +8661,25 @@ msgstr "無效的 Session ID"
msgid "Timestamp"
msgstr "時間戳"
-#: terminal/serializers/endpoint.py:15
-msgid "Oracle port"
-msgstr "Oracle 埠"
-
-#: terminal/serializers/endpoint.py:18
-msgid "Oracle port range"
-msgstr "Oracle 埠範圍"
-
-#: terminal/serializers/endpoint.py:20
-msgid ""
-"Oracle proxy server listen port is dynamic, Each additional Oracle database "
-"instance adds a port listener"
-msgstr ""
-"Oracle 代理伺服器監聽埠是動態的,每增加一個 Oracle 資料庫實例,就會增加一個埠"
-"監聽"
-
-#: terminal/serializers/endpoint.py:38
+#: terminal/serializers/endpoint.py:26
msgid ""
"The host address accessed when connecting to assets, if it is empty, the "
"access address of the current browser will be used (the default endpoint "
"does not allow modification of the host)"
-msgstr ""
-"連接資產時訪問的主機地址,如果為空則使用當前瀏覽器的訪問地址 (默認端點不允許"
-"修改主機)"
+msgstr "連接資產時訪問的主機地址,如果為空則使用當前瀏覽器的訪問地址 (默認端點不允許修改主機)"
-#: terminal/serializers/endpoint.py:71
+#: terminal/serializers/endpoint.py:52
msgid ""
-"The assets within this IP range, the following endpoint will be used for the "
-"connection"
+"The assets within this IP range, the following endpoint will be used for the"
+" connection"
msgstr "該 IP 範圍內的資產,將使用下面的端點進行連接"
-#: terminal/serializers/endpoint.py:72
+#: terminal/serializers/endpoint.py:53
msgid ""
"If asset IP addresses under different endpoints conflict, use asset labels"
msgstr "如果不同端點下的資產 IP 有衝突,使用資產標籤實現"
-#: terminal/serializers/endpoint.py:76
+#: terminal/serializers/endpoint.py:57
msgid "Asset IP"
msgstr "資產 IP"
@@ -8865,8 +8764,8 @@ msgid ""
"If there are multiple hosts, use a comma (,) to separate them.
(For "
"example: http://www.jumpserver.a.com:9100, http://www.jumpserver.b.com:9100)"
msgstr ""
-"如果有多個主機,請用逗號 (,) 分隔它們。
(例如:http://www.jumpserver.a."
-"com:9100,http://www.jumpserver.b.com:9100)"
+"如果有多個主機,請用逗號 (,) "
+"分隔它們。
(例如:http://www.jumpserver.a.com:9100,http://www.jumpserver.b.com:9100)"
#: terminal/serializers/storage.py:199
msgid "Index by date"
@@ -9041,8 +8940,7 @@ msgstr "清除離線會話"
#: terminal/tasks.py:45
msgid ""
-"Check every 10 minutes for asset connection sessions that have been inactive "
-"for 3 \n"
+"Check every 10 minutes for asset connection sessions that have been inactive for 3 \n"
" minutes and mark these sessions as completed"
msgstr "每10分鐘檢查3分鐘未活躍的資產連接會話,將這些會話標記為已完成"
@@ -9052,11 +8950,9 @@ msgstr "上傳會話錄影到外部儲存"
#: terminal/tasks.py:70 terminal/tasks.py:104
msgid ""
-"If SERVER_REPLAY_STORAGE is configured in the config.txt, session commands "
-"and \n"
+"If SERVER_REPLAY_STORAGE is configured in the config.txt, session commands and \n"
" recordings will be uploaded to external storage"
-msgstr ""
-"如果設置了SERVER_REPLAY_STORAGE,將通過文件管理上傳的文件同步到外部存儲"
+msgstr "如果設置了SERVER_REPLAY_STORAGE,將通過文件管理上傳的文件同步到外部存儲"
#: terminal/tasks.py:102
msgid "Upload session replay part file to external storage"
@@ -9068,8 +8964,7 @@ msgstr "運行應用機部署"
#: terminal/tasks.py:126
msgid ""
-"When deploying from the remote application publisher details page, and the "
-"'Deploy' \n"
+"When deploying from the remote application publisher details page, and the 'Deploy' \n"
" button is clicked, this task will be executed"
msgstr "發布機部署,點擊部署時,執行該任務"
@@ -9079,8 +8974,7 @@ msgstr "安裝應用"
#: terminal/tasks.py:140
msgid ""
-"When the 'Deploy' button is clicked in the 'Remote Application' section of "
-"the remote \n"
+"When the 'Deploy' button is clicked in the 'Remote Application' section of the remote \n"
" application publisher details page, this task will be executed"
msgstr "當遠程應用發布機詳情-遠程應用,點擊部署時,執行該任務"
@@ -9090,8 +8984,7 @@ msgstr "卸載應用"
#: terminal/tasks.py:155
msgid ""
-"When the 'Uninstall' button is clicked in the 'Remote Application' section "
-"of the \n"
+"When the 'Uninstall' button is clicked in the 'Remote Application' section of the \n"
" remote application publisher details page, this task will be executed"
msgstr "當遠程應用發布機詳情-遠程應用,點擊卸載時,執行該任務"
@@ -9101,8 +8994,7 @@ msgstr "收集遠程應用上的帳號"
#: terminal/tasks.py:170
msgid ""
-"When a remote publishing server is created and an account needs to be "
-"created \n"
+"When a remote publishing server is created and an account needs to be created \n"
" automatically, this task will be executed"
msgstr "當創建遠程發布機後,需要自動創建帳號時,執行該任務"
@@ -9112,39 +9004,15 @@ msgstr "檢查命令及錄影儲存可連接性 "
#: terminal/tasks.py:186
msgid ""
-"Check every day at midnight whether the external storage for commands and "
-"recordings \n"
-" is accessible. If it is not accessible, send a notification to the "
-"recipients specified \n"
-" in 'System Settings - Notifications - Subscription - Storage - "
-"Connectivity'"
-msgstr ""
-"每天淩晨0點檢查命令及錄像外部存儲是否可連接,如不可連接則發送給:系統設置-通"
-"知設置-消息訂閱-命令及錄像存儲設置的接收人"
+"Check every day at midnight whether the external storage for commands and recordings \n"
+" is accessible. If it is not accessible, send a notification to the recipients specified \n"
+" in 'System Settings - Notifications - Subscription - Storage - Connectivity'"
+msgstr "每天淩晨0點檢查命令及錄像外部存儲是否可連接,如不可連接則發送給:系統設置-通知設置-消息訂閱-命令及錄像存儲設置的接收人"
#: terminal/templates/terminal/_msg_command_alert.html:10
msgid "view"
msgstr "查看"
-#: terminal/utils/db_port_mapper.py:88
-msgid ""
-"No available port is matched. The number of databases may have exceeded the "
-"number of ports open to the database agent service, Contact the "
-"administrator to open more ports."
-msgstr ""
-"未匹配到可用埠,資料庫的數量可能已經超過資料庫代理服務開放的埠數量,請聯系管"
-"理員開放更多埠。"
-
-#: terminal/utils/db_port_mapper.py:116
-msgid ""
-"No ports can be used, check and modify the limit on the number of ports that "
-"Magnus listens on in the configuration file."
-msgstr "沒有埠可以使用,檢查並修改配置文件中 Magnus 監聽的埠數量限制。"
-
-#: terminal/utils/db_port_mapper.py:118
-msgid "All available port count: {}, Already use port count: {}"
-msgstr "所有可用埠數量:{},已使用埠數量:{}"
-
#: tickets/api/ticket.py:88 tickets/models/ticket/general.py:289
msgid "Applicant"
msgstr "申請人"
@@ -9201,8 +9069,7 @@ msgstr "工單已經關閉"
msgid ""
"Created by the ticket ticket title: {} ticket applicant: {} ticket "
"processor: {} ticket ID: {}"
-msgstr ""
-"通過工單創建, 工單標題: {}, 工單申請人: {}, 工單處理人: {}, 工單 ID: {}"
+msgstr "通過工單創建, 工單標題: {}, 工單申請人: {}, 工單處理人: {}, 工單 ID: {}"
#: tickets/handlers/base.py:84
msgid "Change field"
@@ -9551,9 +9418,7 @@ msgid ""
"When enabled, you will enter the MFA binding process the next time you log "
"in. you can also directly bind in \"personal information -> quick "
"modification -> change MFA Settings\"!"
-msgstr ""
-"啟用之後您將會在下次登錄時進入多因子認證綁定流程;您也可以在 (個人資訊->快速"
-"修改->設置 MFA 多因子認證)中直接綁定!"
+msgstr "啟用之後您將會在下次登錄時進入多因子認證綁定流程;您也可以在 (個人資訊->快速修改->設置 MFA 多因子認證)中直接綁定!"
#: users/forms/profile.py:60
msgid "* Enable MFA to make the account more secure."
@@ -9561,12 +9426,10 @@ msgstr "* 啟用 MFA 多因子認證,使帳號更加安全。"
#: users/forms/profile.py:69
msgid ""
-"In order to protect you and your company, please keep your account, password "
-"and key sensitive information properly. (for example: setting complex "
+"In order to protect you and your company, please keep your account, password"
+" and key sensitive information properly. (for example: setting complex "
"password, enabling MFA)"
-msgstr ""
-"為了保護您和公司的安全,請妥善保管您的帳號、密碼和金鑰等重要敏感資訊; (如:"
-"設置複雜密碼,並啟用 MFA 多因子認證)"
+msgstr "為了保護您和公司的安全,請妥善保管您的帳號、密碼和金鑰等重要敏感資訊; (如:設置複雜密碼,並啟用 MFA 多因子認證)"
#: users/forms/profile.py:76
msgid "Finish"
@@ -9727,8 +9590,8 @@ msgstr "終端主題名稱"
#: users/serializers/preference/lina.py:12
msgid ""
"*! The password for file encryption, used for decryption when the system "
-"sends emails containing file attachments.
Such as: account backup files, "
-"account password change results files"
+"sends emails containing file attachments.
Such as: account backup files,"
+" account password change results files"
msgstr ""
"File Encryption Password, when the system sends mails containing file "
"attachments, use this password for decryption.
For example: Account "
@@ -9781,9 +9644,7 @@ msgid ""
"Determines whether the client computer should scale the content on the "
"remote computer to fit the window size of the client computer when the "
"window is resized."
-msgstr ""
-"確定調整窗口大小時用戶端計算機是否應縮放遠程計算機上的內容以適應用戶端計算機"
-"的窗口大小"
+msgstr "確定調整窗口大小時用戶端計算機是否應縮放遠程計算機上的內容以適應用戶端計算機的窗口大小"
#: users/serializers/preference/luna.py:59
msgid "Remote app connect method"
@@ -9813,7 +9674,7 @@ msgstr "命令行"
msgid "The old password is incorrect"
msgstr "舊密碼錯誤"
-#: users/serializers/profile.py:37 users/serializers/profile.py:148
+#: users/serializers/profile.py:37 users/serializers/profile.py:156
msgid "Password does not match security rules"
msgstr "密碼不滿足安全規則"
@@ -9827,10 +9688,11 @@ msgstr "系統角色"
#: users/serializers/user.py:55
msgid ""
-"System roles are roles at the system level, and they will take effect across "
-"all organizations"
+"System roles are roles at the system level, and they will take effect across"
+" all organizations"
msgstr ""
-"System role is a system-level role, it will be effective in all organizations"
+"System role is a system-level role, it will be effective in all "
+"organizations"
#: users/serializers/user.py:61
msgid "Org roles"
@@ -9841,8 +9703,8 @@ msgid ""
"Org roles are roles at the organization level, and they will only take "
"effect within current organization"
msgstr ""
-"Organization role is an organization-level role, it is only effective within "
-"the current organization"
+"Organization role is an organization-level role, it is only effective within"
+" the current organization"
#: users/serializers/user.py:70
msgid "Organizations and roles"
@@ -9906,8 +9768,8 @@ msgid ""
"other sources.There are security settings that can restrict users to log in "
"to the system only from the sources."
msgstr ""
-"User origin identifies the location where the user was created. It can be AD "
-"or other sources. Security settings can restrict users to log in to the "
+"User origin identifies the location where the user was created. It can be AD"
+" or other sources. Security settings can restrict users to log in to the "
"system only from designated sources."
#: users/serializers/user.py:260
@@ -9928,7 +9790,8 @@ msgstr "認證"
#: users/serializers/user.py:422
msgid ""
-"* For security, only a partial of users is displayed. You can search for more"
+"* For security, only a partial of users is displayed. You can search for "
+"more"
msgstr ""
"*For security reasons, only a portion of users is displayed. You can search "
"for more"
@@ -9940,10 +9803,8 @@ msgstr "名稱重複"
#: users/signal_handlers.py:41
msgid ""
"The administrator has enabled \"Only allow existing users to log in\", \n"
-" and the current user is not in the user list. Please contact the "
-"administrator."
-msgstr ""
-"管理員已開啟'僅允許已存在用戶登錄',當前用戶不在用戶列表中,請聯絡管理員。"
+" and the current user is not in the user list. Please contact the administrator."
+msgstr "管理員已開啟'僅允許已存在用戶登錄',當前用戶不在用戶列表中,請聯絡管理員。"
#: users/signal_handlers.py:177
msgid "Clean up expired user sessions"
@@ -9951,11 +9812,9 @@ msgstr "清除過期的用戶會話"
#: users/signal_handlers.py:179
msgid ""
-"After logging in via the web, a user session record is created. At 2 a.m. "
-"every day, \n"
+"After logging in via the web, a user session record is created. At 2 a.m. every day, \n"
" the system cleans up inactive user devices"
-msgstr ""
-"使用網頁登錄後,將產生用戶會話在線記錄,每天淩晨2點,清理未在線的用戶設備"
+msgstr "使用網頁登錄後,將產生用戶會話在線記錄,每天淩晨2點,清理未在線的用戶設備"
#: users/tasks.py:26
msgid "Check password expired"
@@ -9963,8 +9822,7 @@ msgstr "校驗密碼已過期"
#: users/tasks.py:28
msgid ""
-"Check every day at 10 AM whether the passwords of users in the system are "
-"expired, \n"
+"Check every day at 10 AM whether the passwords of users in the system are expired, \n"
" and send a notification 5 days in advance"
msgstr "每天上午10點檢查,系統中用戶的密碼是否過期,提前5天發送通知"
@@ -9974,14 +9832,10 @@ msgstr "週期校驗密碼過期"
#: users/tasks.py:48
msgid ""
-"With version iterations, new tasks may be added, or task names and execution "
-"times may \n"
-" be modified. Therefore, upon system startup, it is necessary to "
-"register or update the \n"
+"With version iterations, new tasks may be added, or task names and execution times may \n"
+" be modified. Therefore, upon system startup, it is necessary to register or update the \n"
" parameters of the task that checks if passwords have expired"
-msgstr ""
-"隨著版本迭代,可能會新增任務或修改任務的名稱、執行時間,因此在系統啟動時,註"
-"冊或更新校驗密碼已過期任務的參數"
+msgstr "隨著版本迭代,可能會新增任務或修改任務的名稱、執行時間,因此在系統啟動時,註冊或更新校驗密碼已過期任務的參數"
#: users/tasks.py:67
msgid "Check user expired"
@@ -9989,8 +9843,7 @@ msgstr "校驗用戶已過期"
#: users/tasks.py:69
msgid ""
-"Check every day at 2 p.m whether the users in the system are expired, and "
-"send a \n"
+"Check every day at 2 p.m whether the users in the system are expired, and send a \n"
" notification 5 days in advance"
msgstr "每天下午2點檢查,系統中的用戶是否過期,提前5天發送通知"
@@ -10000,14 +9853,10 @@ msgstr "週期檢測用戶過期"
#: users/tasks.py:92
msgid ""
-"With version iterations, new tasks may be added, or task names and execution "
-"times may \n"
-" be modified. Therefore, upon system startup, it is necessary to "
-"register or update the \n"
+"With version iterations, new tasks may be added, or task names and execution times may \n"
+" be modified. Therefore, upon system startup, it is necessary to register or update the \n"
" parameters of the task that checks if users have expired"
-msgstr ""
-"隨著版本迭代,可能會新增任務或修改任務的名稱、執行時間,因此在系統啟動時,註"
-"冊或更新校驗用戶已過期任務的參數"
+msgstr "隨著版本迭代,可能會新增任務或修改任務的名稱、執行時間,因此在系統啟動時,註冊或更新校驗用戶已過期任務的參數"
#: users/tasks.py:111
msgid "Check unused users"
@@ -10015,14 +9864,10 @@ msgstr "檢查未使用的用戶"
#: users/tasks.py:113
msgid ""
-"At 2 p.m. every day, according to the configuration in \"System Settings - "
-"Security - \n"
-" Auth security - Auto disable threshold\" users who have not logged "
-"in or whose API keys \n"
+"At 2 p.m. every day, according to the configuration in \"System Settings - Security - \n"
+" Auth security - Auto disable threshold\" users who have not logged in or whose API keys \n"
" have not been used for a long time will be disabled"
-msgstr ""
-"每天下午2點,根據系統配置-安全設置-不活躍用戶自動禁用配置,對長時間不登錄或"
-"api_key不使用的用戶進行禁用"
+msgstr "每天下午2點,根據系統配置-安全設置-不活躍用戶自動禁用配置,對長時間不登錄或api_key不使用的用戶進行禁用"
#: users/tasks.py:157
msgid "The user has not logged in recently and has been disabled."
@@ -10156,8 +10001,8 @@ msgstr "綁定MFA驗證器"
#: users/templates/users/user_otp_enable_bind.html:13
msgid ""
-"Use the MFA Authenticator application to scan the following qr code for a 6-"
-"bit verification code"
+"Use the MFA Authenticator application to scan the following qr code for a "
+"6-bit verification code"
msgstr "使用 MFA 驗證器應用掃描以下二維碼,獲取6位驗證碼"
#: users/templates/users/user_otp_enable_bind.html:22
@@ -10258,8 +10103,8 @@ msgstr "使用者名稱或密碼無效"
#: users/views/profile/reset.py:66
msgid ""
-"Non-local users can log in only from third-party platforms and cannot change "
-"their passwords: {}"
+"Non-local users can log in only from third-party platforms and cannot change"
+" their passwords: {}"
msgstr "非本地用戶僅允許從第三方平台登錄,不支持修改密碼: {}"
#: users/views/profile/reset.py:188 users/views/profile/reset.py:199
@@ -10294,15 +10139,15 @@ msgstr ""
"According to the current task configuration, assets that do not conform to "
"the \"\" policy will be skipped."
-#: xpack/plugins/cloud/api.py:72
+#: xpack/plugins/cloud/api.py:74
msgid "Test connection successful"
msgstr "測試成功"
-#: xpack/plugins/cloud/api.py:74
+#: xpack/plugins/cloud/api.py:76
msgid "Test connection failed: {}"
msgstr "測試連接失敗:{}"
-#: xpack/plugins/cloud/api.py:171
+#: xpack/plugins/cloud/api.py:196
msgid "User {} deleted the current resource and released the assets"
msgstr ""
"User {} deleted the assets that have been released by the current resource"
@@ -10487,8 +10332,7 @@ msgstr "同步地區"
#: xpack/plugins/cloud/manager.py:133
#, python-format
msgid "Get instances of region \"%s\" error, error: %s"
-msgstr ""
-"An error occurred while getting the instances of Region \"%s\", Error: %s"
+msgstr "An error occurred while getting the instances of Region \"%s\", Error: %s"
#: xpack/plugins/cloud/manager.py:179
#, python-format
@@ -10642,7 +10486,8 @@ msgstr "實例"
msgid "Sync instance detail"
msgstr "同步實例詳情"
-#: xpack/plugins/cloud/models.py:313 xpack/plugins/cloud/serializers/task.py:79
+#: xpack/plugins/cloud/models.py:313
+#: xpack/plugins/cloud/serializers/task.py:79
msgid "Rule relation"
msgstr "條件關係"
@@ -10698,7 +10543,8 @@ msgstr "規則匹配"
msgid "Rule value"
msgstr "規則值"
-#: xpack/plugins/cloud/models.py:383 xpack/plugins/cloud/serializers/task.py:82
+#: xpack/plugins/cloud/models.py:383
+#: xpack/plugins/cloud/serializers/task.py:82
msgid "Strategy rule"
msgstr "條件"
@@ -10714,7 +10560,8 @@ msgstr "動作屬性"
msgid "Action value"
msgstr "動作值"
-#: xpack/plugins/cloud/models.py:410 xpack/plugins/cloud/serializers/task.py:85
+#: xpack/plugins/cloud/models.py:410
+#: xpack/plugins/cloud/serializers/task.py:85
msgid "Strategy action"
msgstr "動作"
@@ -10991,9 +10838,7 @@ msgid ""
"The port is used to detect the validity of the IP address. When the "
"synchronization task is executed, only the valid IP address will be "
"synchronized.
If the port is 0, all IP addresses are valid."
-msgstr ""
-"埠用來檢測 IP 地址的有效性,在同步任務執行時,只會同步有效的 IP 地址。
如"
-"果埠為 0,則表示所有 IP 地址均有效。"
+msgstr "埠用來檢測 IP 地址的有效性,在同步任務執行時,只會同步有效的 IP 地址。
如果埠為 0,則表示所有 IP 地址均有效。"
#: xpack/plugins/cloud/serializers/account_attrs.py:191
msgid "Hostname prefix"
@@ -11026,12 +10871,12 @@ msgstr "實例個數"
#: xpack/plugins/cloud/tasks.py:33
#, fuzzy
#| msgid ""
-#| "Execute this task when manually or scheduled cloud synchronization tasks "
-#| "are performed"
+#| "Execute this task when manually or scheduled cloud synchronization tasks are"
+#| " performed"
msgid ""
-"Execute this task when manually or scheduled cloud synchronization tasks are "
-"performed"
-msgstr "手動,定時執行雲同步任務時執行該任務"
+"Execute this task when manually or scheduled cloud synchronization tasks are"
+" performed"
+msgstr "手動或定時雲同步任務執行時執行此任務"
#: xpack/plugins/cloud/tasks.py:50
msgid "Period clean sync instance task execution"
@@ -11040,20 +10885,14 @@ msgstr "定期清除同步實例任務執行記錄"
#: xpack/plugins/cloud/tasks.py:52
#, fuzzy
#| msgid ""
-#| "Every day, according to the configuration in \"System Settings - Tasks - "
-#| "Regular \n"
-#| " clean-up - Cloud sync task history retention days\" the system "
-#| "will clean up the execution \n"
+#| "Every day, according to the configuration in \"System Settings - Tasks - Regular \n"
+#| " clean-up - Cloud sync task history retention days\" the system will clean up the execution \n"
#| " records generated by cloud synchronization"
msgid ""
-"Every day, according to the configuration in \"System Settings - Tasks - "
-"Regular \n"
-" clean-up - Cloud sync task history retention days\" the system will "
-"clean up the execution \n"
+"Every day, according to the configuration in \"System Settings - Tasks - Regular \n"
+" clean-up - Cloud sync task history retention days\" the system will clean up the execution \n"
" records generated by cloud synchronization"
-msgstr ""
-"每天根據系統設定-任務列表-定期清理配置-雲同步記錄配置,對雲同步產生的執行記錄"
-"進行清理"
+msgstr "每天系統會根據「系統設置-任務-」中的配置定期清理雲同步任務歷史保留天數,對雲同步產生的執行記錄進行清理。"
#: xpack/plugins/interface/api.py:52
msgid "Restore default successfully."
@@ -11109,6 +10948,45 @@ msgstr "許可證匯入成功"
msgid "Invalid license"
msgstr "許可證無效"
+#~ msgid "Deleting other people's script is not allowed"
+#~ msgstr "不允許刪除別人的腳本"
+
+#~ msgid "Deleting other people's playbook is not allowed"
+#~ msgstr "不允許刪除他人的 playbook"
+
+#, fuzzy
+#~ msgid "Directory services"
+#~ msgstr "目錄服務"
+
+#, python-format
+#~ msgid "User %s view/export secret"
+#~ msgstr "用戶 %s 查看/匯出 了密碼"
+
+#~ msgid "Enabled, the web session and replay contains watermark information"
+#~ msgstr "啟用後,Web 會話和錄影將包含浮水印資訊"
+
+#~ msgid "Oracle port range"
+#~ msgstr "Oracle 埠範圍"
+
+#~ msgid ""
+#~ "Oracle proxy server listen port is dynamic, Each additional Oracle database "
+#~ "instance adds a port listener"
+#~ msgstr "Oracle 代理伺服器監聽埠是動態的,每增加一個 Oracle 資料庫實例,就會增加一個埠監聽"
+
+#~ msgid ""
+#~ "No available port is matched. The number of databases may have exceeded the "
+#~ "number of ports open to the database agent service, Contact the "
+#~ "administrator to open more ports."
+#~ msgstr "未匹配到可用埠,資料庫的數量可能已經超過資料庫代理服務開放的埠數量,請聯系管理員開放更多埠。"
+
+#~ msgid ""
+#~ "No ports can be used, check and modify the limit on the number of ports that"
+#~ " Magnus listens on in the configuration file."
+#~ msgstr "沒有埠可以使用,檢查並修改配置文件中 Magnus 監聽的埠數量限制。"
+
+#~ msgid "All available port count: {}, Already use port count: {}"
+#~ msgstr "所有可用埠數量:{},已使用埠數量:{}"
+
#~ msgid "Password error"
#~ msgstr "密碼錯誤"
@@ -11128,13 +11006,13 @@ msgstr "許可證無效"
#~ msgstr "無弱密碼"
#~ msgid ""
-#~ "The following is a summary of account backup tasks, please review and "
-#~ "handle them"
+#~ "The following is a summary of account backup tasks, please review and handle"
+#~ " them"
#~ msgstr "以下是帳戶備份任務的概要,請查閱並處理。"
#~ msgid ""
-#~ "The following is a summary of account change secret tasks, please read "
-#~ "and process"
+#~ "The following is a summary of account change secret tasks, please read and "
+#~ "process"
#~ msgstr "以下是帳號更改秘密任務的摘要,請閱讀並處理"
#~ msgid ""
diff --git a/apps/i18n/koko/en.json b/apps/i18n/koko/en.json
index 74a5fc5c3..710359f15 100644
--- a/apps/i18n/koko/en.json
+++ b/apps/i18n/koko/en.json
@@ -1,41 +1,57 @@
{
"ActionPerm": "Actions",
"Cancel": "Cancel",
+ "CancelFileUpload": "Cancel file upload",
"Clone Connect": "Clone Connect",
"Close All Tabs": "Close All Tabs",
"Close Current Tab": "Close Current Tab",
"Confirm": "Confirm",
"ConfirmBtn": "Confirm",
+ "ConfirmDelete": "Are you sure you want to delete this file?",
"Connect": "Connect",
"CopyLink": "Copy Link Address and Code",
"CopyShareURLSuccess": "Copy Share URL Success",
"CreateLink": "Create Share Link",
"CreateSuccess": "Success",
"Custom Setting": "Custom Setting",
+ "DangerWarning": "This is a dangerous action",
+ "Delete": "Delete",
"DownArrow": "Down arrow",
"Download": "Download",
+ "DownloadProgress": "Download progress",
"DownloadSuccess": "Download success",
+ "Downloading": "Downloading",
"EndFileTransfer": "File transfer end",
"ExceedTransferSize": "exceed max transfer size",
"Expand": "Expand",
"ExpiredTime": "Expired",
+ "FileListError": "Failed to get file list",
+ "FileManagement": "File",
+ "FileManagementExpired": "The current file management session has expired.",
+ "FileUploadInterrupted": "File upload interrupted",
"GetShareUser": "Enter username",
"Hotkeys": "Hotkeys",
"InputVerifyCode": "Input Verify Code",
"JoinShare": "Join Session",
"JoinedWithSuccess": "Successfully joined",
"KubernetesManagement": "Kubernetes management",
+ "LastModified": "Last Modified",
"LeaveShare": "Leave Session",
"LeftArrow": "Left arrow",
"LinkAddr": "Link",
+ "List": "List",
"Minute": "Minute",
"Minutes": "Minutes",
"MustOneFile": "Only support to select one file",
"MustSelectOneFile": "Must select one file",
+ "Name": "Name",
+ "NewFolder": "New Folder",
"NoLink": "No Link",
"OnlineUsers": "Online Users",
+ "OperationSuccessful": "Operation successful",
"Paste": "Paste",
"PauseSession": "Pause Session",
+ "PermissionDenied": "Permission denied",
"PermissionExpired": "Permission expired",
"PermissionValid": "Permission valid",
"ReadOnly": "Read-Only",
@@ -44,6 +60,7 @@
"Remove": "Remove",
"RemoveShareUser": "You have been removed from the shared session.",
"RemoveShareUserConfirm": "Are you sure to remove the user from the shared session?",
+ "Rename": "Rename",
"ResumeSession": "Resume Session",
"RightArrow": "Right arrow",
"Search": "Search",
@@ -54,15 +71,19 @@
"Share": "Share",
"ShareUser": "ForUser",
"ShareUserHelpText": "If left blank, everyone could join the session.",
+ "Size": "Size",
"Sync": "Sync",
"SyncUserPreferenceFailed": "Sync user preference failed",
"SyncUserPreferenceSuccess": "Sync user preference success",
"Theme": "Theme",
"ThemeColors": "Theme Colors",
"ThemeConfig": "Theme",
+ "TransferHistory": "Transfer history",
+ "Type": "Type",
"UpArrow": "Up arrow",
"Upload": "Upload",
"UploadEnd": "Upload completed, please wait for further processing",
+ "UploadProgress": "Upload progress",
"UploadStart": "Upload start",
"UploadSuccess": "Upload success",
"UploadTips": "Drag file here or click to upload",
diff --git a/apps/i18n/koko/es.json b/apps/i18n/koko/es.json
index c67d5ced2..2ff426f24 100644
--- a/apps/i18n/koko/es.json
+++ b/apps/i18n/koko/es.json
@@ -1,41 +1,57 @@
{
"ActionPerm": "Permisos de operación",
"Cancel": "Cancelar",
+ "CancelFileUpload": "Cancelar la subida del archivo",
"Clone Connect": "Copiar ventana",
"Close All Tabs": "Cerrar todo",
"Close Current Tab": "Cerrar actual \nColor del tema \nSin dirección \nPegar \nTema \nCerrar todo \nMinuto \nUnirse a compartir \nHas sido removido de la sesión compartida \nIntroduce el nombre de usuario \nPor favor selecciona \nBuscar \nConfirmar \nCrear enlace de compartición \nSubir archivo",
"Confirm": "Confirmar",
"ConfirmBtn": "Confirmar",
+ "ConfirmDelete": "¿Está seguro de que desea eliminar este archivo?",
"Connect": "Conectar",
"CopyLink": "Copiar enlace y código de verificación",
"CopyShareURLSuccess": "Dirección de compartición copiada con éxito",
"CreateLink": "Crear enlace compartido",
"CreateSuccess": "Creación exitosa",
"Custom Setting": "Ajustes personalizados",
+ "DangerWarning": "Esta es una operación peligrosa",
+ "Delete": "Eliminar",
"DownArrow": "Flecha hacia abajo",
"Download": "Descargar",
+ "DownloadProgress": "Progreso de descarga",
"DownloadSuccess": "Descarga exitosa",
+ "Downloading": "Descargando",
"EndFileTransfer": "Transferencia de archivos finalizada",
"ExceedTransferSize": "Superado el tamaño máximo de transferencia",
"Expand": "Expandir",
"ExpiredTime": "Fecha de caducidad",
+ "FileListError": "No se pudo obtener la información de la lista de archivos",
+ "FileManagement": "Gestión de archivos",
+ "FileManagementExpired": "La sesión actual de gestión de archivos ha expirado.",
+ "FileUploadInterrupted": "La subida del archivo se ha interrumpido",
"GetShareUser": "Introducir nombre de usuario",
"Hotkeys": "Atajos",
"InputVerifyCode": "Por favor, ingrese el código de verificación",
"JoinShare": "Unirse a la compartición",
"JoinedWithSuccess": "Se ha unido con éxito",
"KubernetesManagement": "Kubernetes gestión",
+ "LastModified": "Última fecha de modificación",
"LeaveShare": "Salir de compartir",
"LeftArrow": "Flecha hacia atrás",
"LinkAddr": "Dirección del enlace",
+ "List": "Lista",
"Minute": "Minutos",
"Minutes": "Minutos",
"MustOneFile": "Solo se puede seleccionar un archivo",
"MustSelectOneFile": "Debe seleccionar un archivo",
+ "Name": "Nombre",
+ "NewFolder": "Nueva carpeta",
"NoLink": "Sin dirección",
"OnlineUsers": "Personas en línea",
+ "OperationSuccessful": "La acción se realizó con éxito",
"Paste": "Pegar",
"PauseSession": "Pausar esta sesión",
+ "PermissionDenied": "Sin permiso",
"PermissionExpired": "Los permisos han expirado",
"PermissionValid": "Permisos válidos",
"ReadOnly": "Solo lectura",
@@ -44,6 +60,7 @@
"Remove": "Eliminar",
"RemoveShareUser": "Has sido eliminado de la sesión compartida",
"RemoveShareUserConfirm": "¿Está seguro de que desea eliminar a este usuario?",
+ "Rename": "Renombrar",
"ResumeSession": "Restaurar esta sesión",
"RightArrow": "Flecha hacia adelante",
"Search": "Buscar",
@@ -54,15 +71,19 @@
"Share": "Compartir",
"ShareUser": "Compartir usuario",
"ShareUserHelpText": "No se ha seleccionado un usuario, lo que permite la entrada de todos",
+ "Size": "Tamaño",
"Sync": "Sincronizar",
"SyncUserPreferenceFailed": "Falló la sincronización de ajustes",
"SyncUserPreferenceSuccess": "Sincronización de ajustes exitosa",
"Theme": "Tema",
"ThemeColors": "Color del tema",
"ThemeConfig": "Tema",
+ "TransferHistory": "Transmisión de historial",
+ "Type": "Tipo",
"UpArrow": "Flecha hacia arriba",
"Upload": "Subir",
"UploadEnd": "La subida ha finalizado, por favor espera el procesamiento posterior",
+ "UploadProgress": "Progreso de subida",
"UploadStart": "Inicio de carga",
"UploadSuccess": "Subida exitosa",
"UploadTips": "Arrastra el archivo aquí, o haz clic para subir",
diff --git a/apps/i18n/koko/ja.json b/apps/i18n/koko/ja.json
index d0880fb12..124aaac18 100644
--- a/apps/i18n/koko/ja.json
+++ b/apps/i18n/koko/ja.json
@@ -1,41 +1,57 @@
{
"ActionPerm": "アクション権限",
"Cancel": "キャンセル",
+ "CancelFileUpload": "ファイルアップロードをキャンセルする",
"Clone Connect": "ウィンドウをコピー",
"Close All Tabs": "すべてを閉じる",
"Close Current Tab": "現在を閉じる",
"Confirm": "確認",
"ConfirmBtn": "確定",
+ "ConfirmDelete": "このファイルを削除してもよろしいですか?",
"Connect": "接続",
"CopyLink": "リンクと認証コードのコピー",
"CopyShareURLSuccess": "レプリケーション共有住所成功",
"CreateLink": "シェアリンクの作成",
"CreateSuccess": "作成に成功しました",
"Custom Setting": "カスタム設定",
+ "DangerWarning": "これは危険な操作です",
+ "Delete": "削除",
"DownArrow": "下向き矢印",
"Download": "ダウンロード",
+ "DownloadProgress": "ダウンロード進捗",
"DownloadSuccess": "ダウンロードに成功しました",
+ "Downloading": "ダウンロード中",
"EndFileTransfer": "ファイル転送終了",
"ExceedTransferSize": "最大転送サイズを超えています",
"Expand": "展開",
"ExpiredTime": "有効期限",
+ "FileListError": "ファイルリスト情報の取得に失敗しました",
+ "FileManagement": "ファイル管理",
+ "FileManagementExpired": "現在のファイル管理セッションは期限切れです。",
+ "FileUploadInterrupted": "ファイルアップロードが中断されました",
"GetShareUser": "ユーザー名の入力",
"Hotkeys": "ショートカットキー",
"InputVerifyCode": "認証コードを入力してください",
"JoinShare": "共有セッションに参加",
"JoinedWithSuccess": "正常に参加しました",
"KubernetesManagement": "Kubernetes 管理",
+ "LastModified": "最終修正時間",
"LeaveShare": "共有セッションから退出",
"LeftArrow": "戻る矢印",
"LinkAddr": "リンク先",
+ "List": "リスト",
"Minute": "分間",
"Minutes": "分間",
"MustOneFile": "ファイルを1つだけ選択できます",
"MustSelectOneFile": "ファイルを選択する必要があります",
+ "Name": "名前",
+ "NewFolder": "新しいフォルダー",
"NoLink": "住所なし",
"OnlineUsers": "オンラインスタッフ",
+ "OperationSuccessful": "操作成功",
"Paste": "貼り付け",
"PauseSession": "セッションを一時停止",
+ "PermissionDenied": "権限がありません",
"PermissionExpired": "許可が期限切れになりました",
"PermissionValid": "権限は有効です",
"ReadOnly": "読み取り専用",
@@ -44,6 +60,7 @@
"Remove": "削除",
"RemoveShareUser": "あなたはすでに共有セッションから削除されました」という意味です",
"RemoveShareUserConfirm": "共有セッションから削除してもよろしいですか?",
+ "Rename": "再命名",
"ResumeSession": "セッションを再開",
"RightArrow": "進む矢印",
"Search": "検索",
@@ -54,15 +71,19 @@
"Share": "シェア",
"ShareUser": "共有ユーザー",
"ShareUserHelpText": "ユーザーが選択されていません。つまり、すべての人が参加できます。",
+ "Size": "サイズ",
"Sync": "同期",
"SyncUserPreferenceFailed": "ユーザー設定の同期に失敗しました",
"SyncUserPreferenceSuccess": "ユーザー設定の同期に成功しました",
"Theme": "テーマ",
"ThemeColors": "テーマカラー",
"ThemeConfig": "テーマ",
+ "TransferHistory": "転送履歴",
+ "Type": "タイプ",
"UpArrow": "上向き矢印",
"Upload": "アップロード",
"UploadEnd": "アップロードが完了しました。後の処理をお待ちください",
+ "UploadProgress": "アップロード進捗",
"UploadStart": "アップロード開始",
"UploadSuccess": "アップロード成功",
"UploadTips": "ファイルをここにドラッグするか、アップロードをクリックします",
diff --git a/apps/i18n/koko/pt_br.json b/apps/i18n/koko/pt_br.json
index 6114abe6b..c8af41f01 100644
--- a/apps/i18n/koko/pt_br.json
+++ b/apps/i18n/koko/pt_br.json
@@ -1,41 +1,57 @@
{
"ActionPerm": "Permissões de ação",
"Cancel": "Cancelar",
+ "CancelFileUpload": "Cancelar upload de arquivo",
"Clone Connect": "Copiar janela",
"Close All Tabs": "Fechar tudo",
"Close Current Tab": "Fechar a atual",
"Confirm": "Confirmar",
"ConfirmBtn": "Confirmar",
+ "ConfirmDelete": "Você tem certeza de que deseja excluir este arquivo?",
"Connect": "Conectar",
"CopyLink": "Copiar link e código",
"CopyShareURLSuccess": "Cópia de endereço compartilhado bem sucedida",
"CreateLink": "Criar link para compartilhar",
"CreateSuccess": "Criado com sucesso",
"Custom Setting": "Configurações personalizadas",
+ "DangerWarning": "Essa é uma operação arriscada",
+ "Delete": "Excluir",
"DownArrow": "Seta para baixo",
"Download": "Baixar",
+ "DownloadProgress": "Progresso do download",
"DownloadSuccess": "Download bem-sucedido",
+ "Downloading": "Baixando",
"EndFileTransfer": "Transferência de arquivo concluída",
"ExceedTransferSize": "Excede o tamanho máximo de transferência",
"Expand": "Expandir",
"ExpiredTime": "Período de validade",
+ "FileListError": "Falha ao obter informações da lista de arquivos",
+ "FileManagement": "Gerenciamento de Arquivos",
+ "FileManagementExpired": "A sessão atual de gerenciamento de arquivos expirou.",
+ "FileUploadInterrupted": "Upload de arquivo interrompido",
"GetShareUser": "Digite o nome de usuário",
"Hotkeys": "Atalhos",
"InputVerifyCode": "Por favor, insira o código de verificação",
"JoinShare": "Junte-se ao compartilhamento",
"JoinedWithSuccess": "Adicionado com sucesso",
"KubernetesManagement": "Kubernetes gerenciar",
+ "LastModified": "Última data de modificação",
"LeaveShare": "Sair do compartilhamento",
"LeftArrow": "Seta para trás",
"LinkAddr": "Endereço do link",
+ "List": "Lista",
"Minute": "Minutos",
"Minutes": "Minutos",
"MustOneFile": "Só pode escolher um arquivo",
"MustSelectOneFile": "É necessário selecionar um arquivo",
+ "Name": "Nome",
+ "NewFolder": "Criar nova pasta",
"NoLink": "Sem endereço",
"OnlineUsers": "Pessoas online",
+ "OperationSuccessful": "Ação bem-sucedida",
"Paste": "Colar",
"PauseSession": "Pausar esta sessão",
+ "PermissionDenied": "Sem permissão",
"PermissionExpired": "Permissão expirada",
"PermissionValid": "Permissão válida",
"ReadOnly": "Somente leitura",
@@ -44,6 +60,7 @@
"Remove": "Remover",
"RemoveShareUser": "Você foi removido da sessão compartilhada",
"RemoveShareUserConfirm": "Tem certeza de que deseja remover este usuário?",
+ "Rename": "Renomear",
"ResumeSession": "Restaurar esta sessão",
"RightArrow": "Seta para frente",
"Search": "Pesquisar",
@@ -54,15 +71,19 @@
"Share": "Compartilhar",
"ShareUser": "Compartilhar usuário",
"ShareUserHelpText": "Sem usuário selecionado, permitindo que todos se juntem",
+ "Size": "Tamanho",
"Sync": "Sincronizar",
"SyncUserPreferenceFailed": "Falha na configuração de sincronização",
"SyncUserPreferenceSuccess": "Configurações sincronizadas com sucesso",
"Theme": "Tema",
"ThemeColors": "Cor do tema",
"ThemeConfig": "Tema",
+ "TransferHistory": "Histórico de Transferência",
+ "Type": "Tipo",
"UpArrow": "Seta para cima",
"Upload": "Upload",
"UploadEnd": "O upload foi concluído, aguarde o processamento subsequente",
+ "UploadProgress": "Progresso do upload",
"UploadStart": "Início do upload",
"UploadSuccess": "Upload bem sucedido",
"UploadTips": "Arraste o arquivo para cá ou clique para fazer o upload",
diff --git a/apps/i18n/koko/ru.json b/apps/i18n/koko/ru.json
index 9c619d3a2..3ba667c8c 100644
--- a/apps/i18n/koko/ru.json
+++ b/apps/i18n/koko/ru.json
@@ -1,41 +1,57 @@
{
"ActionPerm": "Операционные права",
"Cancel": "Отмена",
+ "CancelFileUpload": "Отменить передачу файла",
"Clone Connect": "Скопировать окно",
"Close All Tabs": "закрыть все",
"Close Current Tab": "Закрыть текущий",
"Confirm": "Подтвердить",
"ConfirmBtn": "подтвердить",
+ "ConfirmDelete": "Вы уверены, что хотите удалить этот файл?",
"Connect": "Соединение",
"CopyLink": "Скопировать ссылку и код подтверждения",
"CopyShareURLSuccess": "Успешно скопирован адрес для",
"CreateLink": "создать ссылку для общего доступа",
"CreateSuccess": "Успешно создано",
"Custom Setting": "Настройка по индивидуальным параметрам",
+ "DangerWarning": "Это опасная операция",
+ "Delete": "Удалить",
"DownArrow": "Стрелка вниз",
"Download": "Скачать",
+ "DownloadProgress": "Прогресс загрузки",
"DownloadSuccess": "Скачивание успешно",
+ "Downloading": "Ведётся загрузка",
"EndFileTransfer": "Передача файла завершена",
"ExceedTransferSize": "Превышен максимальный размер передачи",
"Expand": "Развернуть",
"ExpiredTime": "Срок действия",
+ "FileListError": "Не удалось получить информацию о списке файлов",
+ "FileManagement": "Управление файлами",
+ "FileManagementExpired": "Текущая сессия управления файлами истекла.",
+ "FileUploadInterrupted": "Передача файла прервана",
"GetShareUser": "введите имя пользователя",
"Hotkeys": "Горячие клавиши",
"InputVerifyCode": "Пожалуйста, введите код подтверждения",
"JoinShare": "присоединиться к общему доступу",
"JoinedWithSuccess": "Успешно присоединился",
"KubernetesManagement": "Kubernetes 管理",
+ "LastModified": "Последнее время изменения",
"LeaveShare": "Выйти из общего доступа",
"LeftArrow": "Стрелка назад",
"LinkAddr": "Адрес ссылки",
+ "List": "Список",
"Minute": "минуты",
"Minutes": "минут",
"MustOneFile": "Можно выбрать только один файл",
"MustSelectOneFile": "Необходимо выбрать файл",
+ "Name": "Название",
+ "NewFolder": "Создать папку",
"NoLink": "без адреса",
"OnlineUsers": "Онлайн участники",
+ "OperationSuccessful": "Операция выполнена успешно",
"Paste": "вставить",
"PauseSession": "Приостановить эту сессию",
+ "PermissionDenied": "Нет разрешения",
"PermissionExpired": "Срок действия прав истек",
"PermissionValid": "Доступ разрешен",
"ReadOnly": "Только для чтения",
@@ -44,6 +60,7 @@
"Remove": "Удалить",
"RemoveShareUser": "вас удалили из общего сеанса",
"RemoveShareUserConfirm": "Вы уверены, что хотите удалить этого пользователя?",
+ "Rename": "Переименовать",
"ResumeSession": "Восстановить эту сессию",
"RightArrow": "Стрелка вперед",
"Search": "поиск",
@@ -54,15 +71,19 @@
"Share": "Поделиться",
"ShareUser": "Поделиться с пользователем",
"ShareUserHelpText": "Пользователь не выбран, разрешить вход всем",
+ "Size": "Размер",
"Sync": "Синхронизировать",
"SyncUserPreferenceFailed": "Ошибка синхронизации настроек",
"SyncUserPreferenceSuccess": "Синхронизация настроек выполнена успешно",
"Theme": "тему",
"ThemeColors": "цвет темы",
"ThemeConfig": "Тема",
+ "TransferHistory": "История передачи",
+ "Type": "Тип",
"UpArrow": "Кнопка вверх",
"Upload": "Загрузить",
"UploadEnd": "Загрузка завершена, пожалуйста, подождите дальнейшей обработки",
+ "UploadProgress": "Прогресс передачи",
"UploadStart": "Начало загрузки",
"UploadSuccess": "Загрузка прошла успешно",
"UploadTips": "Перетащите файл сюда или нажмите для загрузки",
diff --git a/apps/i18n/koko/zh.json b/apps/i18n/koko/zh.json
index d2c9ad124..a8b036801 100644
--- a/apps/i18n/koko/zh.json
+++ b/apps/i18n/koko/zh.json
@@ -1,41 +1,57 @@
{
"ActionPerm": "操作权限",
"Cancel": "取消",
+ "CancelFileUpload": "取消文件上传",
"Clone Connect": "复制窗口",
"Close All Tabs": "关闭所有",
"Close Current Tab": "关闭当前",
"Confirm": "确认",
"ConfirmBtn": "确定",
+ "ConfirmDelete": "您确定要删除该文件吗?",
"Connect": "连接",
"CopyLink": "复制链接及验证码",
"CopyShareURLSuccess": "复制分享地址成功",
"CreateLink": "创建分享链接",
"CreateSuccess": "创建成功",
"Custom Setting": "自定义设置",
+ "DangerWarning": "这是一个危险的操作",
+ "Delete": "删除",
"DownArrow": "向下箭头",
"Download": "下载",
+ "DownloadProgress": "下载进度",
"DownloadSuccess": "下载成功",
+ "Downloading": "正在下载",
"EndFileTransfer": "文件传输结束",
"ExceedTransferSize": "超过最大传输大小",
"Expand": "展开",
"ExpiredTime": "有效期限",
+ "FileListError": "获取文件列表信息失败",
+ "FileManagement": "文件管理",
+ "FileManagementExpired": "当前文件管理会话已过期。",
+ "FileUploadInterrupted": "文件上传中断",
"GetShareUser": "输入用户名",
"Hotkeys": "快捷键",
"InputVerifyCode": "请输入验证码",
"JoinShare": "加入共享",
"JoinedWithSuccess": "已成功加入",
"KubernetesManagement": "Kubernetes 管理",
+ "LastModified": "最后修改时间",
"LeaveShare": "离开共享",
"LeftArrow": "后退箭头",
"LinkAddr": "链接地址",
+ "List": "列表",
"Minute": "分钟",
"Minutes": "分钟",
"MustOneFile": "只能选择一个文件",
"MustSelectOneFile": "必须选择一个文件",
+ "Name": "名称",
+ "NewFolder": "新建文件夹",
"NoLink": "无地址",
"OnlineUsers": "在线人员",
+ "OperationSuccessful": "操作成功",
"Paste": "粘贴",
"PauseSession": "暂停此会话",
+ "PermissionDenied": "没有权限",
"PermissionExpired": "权限已过期",
"PermissionValid": "权限有效",
"ReadOnly": "只读",
@@ -44,6 +60,7 @@
"Remove": "移除",
"RemoveShareUser": "你已经被移除共享会话",
"RemoveShareUserConfirm": "确定要移除该用户吗?",
+ "Rename": "重命名",
"ResumeSession": "恢复此会话",
"RightArrow": "前进箭头",
"Search": "搜索",
@@ -54,15 +71,19 @@
"Share": "分享",
"ShareUser": "分享用户",
"ShareUserHelpText": "未选择用户,即允许所有人加入",
+ "Size": "大小",
"Sync": "同步",
"SyncUserPreferenceFailed": "同步设置失败",
"SyncUserPreferenceSuccess": "同步设置成功",
"Theme": "主题",
"ThemeColors": "主题颜色",
"ThemeConfig": "主题",
+ "TransferHistory": "传输历史",
+ "Type": "类型",
"UpArrow": "向上箭头",
"Upload": "上传",
"UploadEnd": "上传已完成,请等待后续处理",
+ "UploadProgress": "上传进度",
"UploadStart": "上传开始",
"UploadSuccess": "上传成功",
"UploadTips": "将文件拖到此处,或点击上传",
diff --git a/apps/i18n/koko/zh_hant.json b/apps/i18n/koko/zh_hant.json
index 36985132b..de66e17b3 100644
--- a/apps/i18n/koko/zh_hant.json
+++ b/apps/i18n/koko/zh_hant.json
@@ -1,41 +1,57 @@
{
"ActionPerm": "操作權限",
"Cancel": "取消",
+ "CancelFileUpload": "取消文件上傳",
"Clone Connect": "複製視窗",
"Close All Tabs": "關閉全部",
"Close Current Tab": "關閉當前",
"Confirm": "確認",
"ConfirmBtn": "確定",
+ "ConfirmDelete": "您確定要刪除該文件嗎?",
"Connect": "連接",
"CopyLink": "複製連結及驗證碼",
"CopyShareURLSuccess": "複製分享地址成功",
"CreateLink": "創建分享連結",
"CreateSuccess": "創建成功",
"Custom Setting": "自訂設定",
+ "DangerWarning": "這是一個危險的操作",
+ "Delete": "刪除",
"DownArrow": "向下箭頭",
"Download": "下載",
+ "DownloadProgress": "下載進度",
"DownloadSuccess": "下載成功",
+ "Downloading": "正在下載",
"EndFileTransfer": "文件傳輸結束",
"ExceedTransferSize": "超過最大傳輸大小",
"Expand": "展開",
"ExpiredTime": "有效期限",
+ "FileListError": "獲取文件列表資訊失敗",
+ "FileManagement": "文件管理",
+ "FileManagementExpired": "當前文件管理會話已過期。",
+ "FileUploadInterrupted": "文件上傳中斷",
"GetShareUser": "輸入使用者名稱",
"Hotkeys": "快速鍵",
"InputVerifyCode": "請輸入驗證碼",
"JoinShare": "加入共享",
"JoinedWithSuccess": "已成功加入",
"KubernetesManagement": "Kubernetes 管理",
+ "LastModified": "最後修改時間",
"LeaveShare": "離開共享",
"LeftArrow": "後退箭頭",
"LinkAddr": "連結地址",
+ "List": "列表",
"Minute": "分鐘",
"Minutes": "分鐘",
"MustOneFile": "只能選擇一個文件",
"MustSelectOneFile": "必須選擇一個文件",
+ "Name": "名稱",
+ "NewFolder": "新建文件夾",
"NoLink": "無地址",
"OnlineUsers": "在線人員",
+ "OperationSuccessful": "操作成功",
"Paste": "貼上",
"PauseSession": "暫停此會話",
+ "PermissionDenied": "沒有權限",
"PermissionExpired": "權限已過期",
"PermissionValid": "權限有效",
"ReadOnly": "只讀",
@@ -44,6 +60,7 @@
"Remove": "移除",
"RemoveShareUser": "你已經被移除共享會話",
"RemoveShareUserConfirm": "確定要移除該用戶嗎?",
+ "Rename": "重命名",
"ResumeSession": "恢復此會話",
"RightArrow": "前進箭頭",
"Search": "搜尋",
@@ -54,15 +71,19 @@
"Share": "分享",
"ShareUser": "分享用戶",
"ShareUserHelpText": "未選擇用戶,即允許所有人加入",
+ "Size": "大小",
"Sync": "同步",
"SyncUserPreferenceFailed": "同步設定失敗",
"SyncUserPreferenceSuccess": "同步設定成功",
"Theme": "主題",
"ThemeColors": "主題顏色",
"ThemeConfig": "主題",
+ "TransferHistory": "傳輸歷史",
+ "Type": "類型",
"UpArrow": "向上箭頭",
"Upload": "上傳",
"UploadEnd": "上傳已完成,請等待後續處理",
+ "UploadProgress": "上傳進度",
"UploadStart": "上傳開始",
"UploadSuccess": "上傳成功",
"UploadTips": "將文件拖到此處,或點擊上傳",
diff --git a/apps/i18n/lina/en.json b/apps/i18n/lina/en.json
index 6f6a7f485..cd3256532 100644
--- a/apps/i18n/lina/en.json
+++ b/apps/i18n/lina/en.json
@@ -168,6 +168,7 @@
"Assets": "Assets",
"AssetsAmount": "Assets",
"AssetsOfNumber": "Assets",
+ "AssetsSelected": " Assets Selected",
"AssetsTotal": "Total assets",
"AssignedInfo": "Approval information",
"Assignee": "Handler",
@@ -257,6 +258,7 @@
"CACertificate": "Ca certificate",
"CAS": "CAS",
"CMPP2": "Cmpp v2.0",
+ "CTYunPrivate": "eCloud Private Cloud",
"CalculationResults": "Error in cron expression",
"CallRecords": "Call Records",
"CanDragSelect": "Select by dragging; Empty means all selected",
@@ -349,6 +351,7 @@
"Configured": "Configured",
"Confirm": "Confirm",
"ConfirmPassword": "Confirm password",
+ "ConfirmRunningAssets": "Confirm running assets",
"Connect": "Connect",
"ConnectAssets": "Access assets",
"ConnectMethod": "Connect method",
@@ -358,6 +361,7 @@
"ConnectMethodACLHelpText": "Connect methods can be filtered to control whether users can use a certain connect method to login to the asset. according to your set rules, some connect methods can be allowed, while others can be prohibited.",
"ConnectMethodACLUpdate": "Update the connect method control",
"ConnectMethodACLs": "Connect method ACLs",
+ "ConnectMethodAclDetail": "Connect method acl detail",
"ConnectWebSocketError": "Connection to websocket failed",
"Connectable": "Connectable",
"ConnectionDropped": "Connection disconnected",
@@ -393,11 +397,10 @@
"CriticalLoad": "Serious",
"CronExpression": "Complete crontab expression",
"Crontab": "Crontab",
- "CrontabDiffError": "Please ensure that the interval for scheduled execution is no less than ten minutes!",
+ "CrontabDiffError": "Please ensure that the interval for scheduled execution is no less than {minutes} minutes!",
"CrontabHelpText": "If both interval and crontab are set, crontab is prioritized",
"CrontabHelpTip": "For example: perform every sunday at 03:05 <5 3 * * 0>
use 5-digit linux crontab expressions
(online tool)
",
"CrontabOfCreateUpdatePage": "",
- "CTYunPrivate": "eCloud Private Cloud",
"CurrentConnectionUsers": "Online users",
"CurrentConnections": "Current connections",
"CurrentStatus": "Current Status",
@@ -448,6 +451,8 @@
"DefaultValue": "Default value",
"DefaultValueTip": "Save and execute using default values for scheduled tasks. Not filling in the default values may cause the task to fail",
"Delete": "Delete",
+ "DeleteAccount": "Delete account",
+ "DeleteBoth": "Delete both",
"DeleteConfirmMessage": "Deletion is irreversible, do you wish to continue?",
"DeleteErrorMsg": "Delete failed",
"DeleteGatherAccountTitle": "Delete gather account",
@@ -475,6 +480,7 @@
"DingTalk": "Dingtalk",
"DingTalkOAuth": "DingTalk OAuth",
"DingTalkTest": "Test",
+ "DirectoryServiceHelpMessage": "Directory Service is a centralized system for storing, managing, and querying information about network resources. Common implementations include LDAP and Active Directory. In this system, once other assets are associated with a directory service, they will inherit user accounts from it.",
"Disable": "Disable",
"DisableSelected": "Disable selected",
"DisableSuccessMsg": "Successfully disabled",
@@ -649,6 +655,7 @@
"Id": "Id",
"IdeaContent": "I want you to act as a linux terminal. i will input the commands, you will respond with what the terminal should display. i hope you to reply only in a unique code block, not others. no interpretations. when i need to tell you something, i'm gonna put the words in braces {note text}",
"IdeaTitle": "🌱 linux terminal",
+ "IdentityDomain": "Identity domain",
"IdpMetadataHelpText": "Either idp metadata url or idp metadata xml is acceptable, with idp metadata url having higher priority",
"IdpMetadataUrlHelpText": "Load idp metadata from remote address",
"IgnoreAlert": "Ignore alert",
@@ -857,6 +864,7 @@
"NodeInformation": "Node information",
"NodeOfNumber": "Number of node",
"NodeSearchStrategy": "Node search strategy",
+ "NonRunnableAssets": "Non-runnable assets",
"NormalLoad": "Normal",
"NotEqual": "Not equal to",
"NotSet": "Not set",
@@ -1129,6 +1137,7 @@
"RunasHelpText": "Enter username for running script",
"RunasPolicy": "Account policy",
"RunasPolicyHelpText": "When there are no users currently running on the asset, what account selection strategy should be adopted. skip: do not execute. prioritize privileged accounts: if there are privileged accounts, select them first; if not, select regular accounts. only privileged accounts: select only from privileged accounts; if none exist, do not execute.",
+ "RunnableAssets": "Runnable assets",
"Running": "Running",
"RunningPath": "Running path",
"RunningPathHelpText": "Enter the run path of the script, this setting only applies to shell scripts",
@@ -1231,7 +1240,7 @@
"SignChannelNum": "Channel signature",
"SiteMessage": "Notifications",
"SiteMessageList": "Notifications",
- "SiteURLTip": "For example: https://demo.jumpserver.org",
+ "SiteURLTip": "For example: https://demo.example.com",
"Skip": "Skip this asset",
"Skipped": "Skipped",
"Slack": "Slack",
@@ -1254,6 +1263,7 @@
"StatusYellow": "There have been recent failures",
"Step": "Step",
"Stop": "Stop",
+ "StopJob": "Stop job",
"StopJobMsg": "Stop job successfully",
"StopLogOutput": "Task Canceled: The current task (currentTaskId) has been manually stopped. Since the progress of each task varies, the following is the final execution result of the task. A failed execution indicates that the task has been successfully stopped.",
"Storage": "Storage",
@@ -1525,9 +1535,5 @@
"disallowSelfUpdateFields": "Not allowed to modify the current fields yourself",
"forceEnableMFAHelpText": "If force enable, user can not disable by themselves",
"removeWarningMsg": "Are you sure you want to remove",
- "setVariable": "Set variable",
- "StopJob": "Stop job",
- "ConnectMethodAclDetail": "Connect method acl detail",
- "DeleteAccount": "Delete account",
- "DeleteBoth": "Delete both"
-}
+ "setVariable": "Set variable"
+}
\ No newline at end of file
diff --git a/apps/i18n/lina/es.json b/apps/i18n/lina/es.json
index a1f75bd80..338de72bf 100644
--- a/apps/i18n/lina/es.json
+++ b/apps/i18n/lina/es.json
@@ -168,6 +168,7 @@
"Assets": "Gestión de activos",
"AssetsAmount": "Cantidad de activos",
"AssetsOfNumber": "Número de activos",
+ "AssetsSelected": "Se han seleccionado activos",
"AssetsTotal": "Total de activos",
"AssignedInfo": "Información de aprobación",
"Assignee": "Responsable",
@@ -257,6 +258,7 @@
"CACertificate": "Certificado CA",
"CAS": "CAS",
"CMPP2": "CMPP v2.0",
+ "CTYunPrivate": "eCloud Nube Privada",
"CalculationResults": "Error en la expresión cron",
"CallRecords": "Registro de llamadas",
"CanDragSelect": "Se puede seleccionar el período de tiempo arrastrando el ratón; no seleccionar es igual a seleccionar todo",
@@ -348,6 +350,7 @@
"Configured": "Configurado",
"Confirm": "Confirmar",
"ConfirmPassword": "Confirmar contraseña",
+ "ConfirmRunningAssets": "Confirmar activo operativo",
"Connect": "Conexión",
"ConnectAssets": "Conectar activos",
"ConnectMethod": "Método de conexión",
@@ -357,6 +360,7 @@
"ConnectMethodACLHelpText": "A través del método de conexión, usted puede controlar si los usuarios pueden acceder al activo usando un determinado método de conexión. Según las reglas que establezca, ciertos métodos de conexión pueden ser permitidos, mientras que otros pueden ser prohibidos.",
"ConnectMethodACLUpdate": "Actualizar control de método de conexión",
"ConnectMethodACLs": "Método de conexión",
+ "ConnectMethodAclDetail": "Detalles del método de conexión",
"ConnectWebSocketError": "Conexión WebSocket fallida",
"Connectable": "Conectar",
"ConnectionDropped": "Conexión desconectada",
@@ -392,11 +396,10 @@
"CriticalLoad": "Severo",
"CronExpression": "Expresión completa de crontab",
"Crontab": "Tareas programadas",
- "CrontabDiffError": "¡Asegúrese de que el intervalo de tiempo para la ejecución regular no sea inferior a diez minutos!",
+ "CrontabDiffError": "¡Asegúrese de que el intervalo de tiempo para la ejecución regular no sea inferior a {minutes} minutos!",
"CrontabHelpText": "Si se configuran simultáneamente interval y crontab, se prioriza crontab",
"CrontabHelpTip": "Por ejemplo: ejecuta cada domingo a las 03:05 <5 3 * * 0>
utilizando una expresión de crontab de Linux de 5 posiciones (herramienta en línea)
",
"CrontabOfCreateUpdatePage": "Por ejemplo: ejecuta cada domingo a las 03:05 <5 3 * * 0>
utilizando una expresión de crontab de Linux de 5 posiciones (herramienta en línea)
Si se establecen tanto la ejecución programada como la ejecución cíclica, se dará prioridad a la ejecución programada.",
- "CTYunPrivate": "eCloud Nube Privada",
"CurrentConnectionUsers": "Número actual de usuarios en la conversación",
"CurrentConnections": "Número actual de conexiones",
"CurrentStatus": "estado actual",
@@ -447,6 +450,8 @@
"DefaultValue": "Valores predeterminados",
"DefaultValueTip": "Guardar y ejecutar las tareas programadas con valores por defecto puede llevar a fallos en la ejecución si no se completan dichos valores.",
"Delete": "Eliminar",
+ "DeleteAccount": "Eliminar cuenta",
+ "DeleteBoth": "Eliminar simultáneamente",
"DeleteConfirmMessage": "Una vez eliminado no se puede recuperar, ¿continuar?",
"DeleteErrorMsg": "Error al eliminar",
"DeleteGatherAccountTitle": "Eliminar la cuenta descubierta",
@@ -474,6 +479,7 @@
"DingTalk": "DingTalk",
"DingTalkOAuth": "Autenticación DingTalk",
"DingTalkTest": "Prueba",
+ "DirectoryServiceHelpMessage": "El Servicio de Directorio es un servicio utilizado para el almacenamiento centralizado, gestión y consulta de información sobre recursos de red, con implementaciones comunes que incluyen LDAP y Active Directory. Otros activos asociados al servicio de directorio heredarán las cuentas de éste.",
"Disable": "Desactivar",
"DisableSelected": "Deshabilitar seleccionado",
"DisableSuccessMsg": "Desactivación exitosa",
@@ -648,6 +654,7 @@
"Id": "ID",
"IdeaContent": "Quiero que actúes como un terminal Linux. Introduciré comandos y tú responderás con el contenido que debería mostrar el terminal. Espero que solo respondas en un único bloque de código, sin agregar nada más. No escribas explicaciones. Cuando necesite decirte algo, colocaré el texto entre llaves {texto de nota}.",
"IdeaTitle": "🌱 Terminal de Linux",
+ "IdentityDomain": "Dominio de identidad",
"IdpMetadataHelpText": "URL de metadatos IDP y parámetro MetadataXML, sólo uno es necesario; la URL de metadatos IDP tiene mayor prioridad",
"IdpMetadataUrlHelpText": "Cargar IDP Metadata desde una dirección remota",
"IgnoreAlert": "Ignorar alerta",
@@ -856,6 +863,7 @@
"NodeInformation": "Información del nodo",
"NodeOfNumber": "Número de nodos",
"NodeSearchStrategy": "Estrategia de búsqueda de nodos",
+ "NonRunnableAssets": "activo no operativo",
"NormalLoad": "Normal",
"NotEqual": "No igual a",
"NotSet": "No configurado",
@@ -1130,6 +1138,7 @@
"RunasHelpText": "Introduce el nombre de usuario para ejecutar el script",
"RunasPolicy": "política de cuentas",
"RunasPolicyHelpText": "Cuando no hay este usuario en la acción actual, se aplicará una estrategia de selección de cuenta. Omitir: no se ejecuta. Priorizar cuenta privilegiada: si hay una cuenta privilegiada, selecciona primero la cuenta privilegiada; si no, selecciona una cuenta normal. Solo cuentas privilegiadas: selecciona únicamente de las cuentas privilegiadas; si no hay, no se ejecuta.",
+ "RunnableAssets": "activos operativos.",
"Running": "En ejecución",
"RunningPath": "Ruta de ejecución",
"RunningPathHelpText": "Introduzca la ruta de ejecución del script, este ajuste solo es válido para scripts de shell",
@@ -1232,7 +1241,7 @@
"SignChannelNum": "Número de canal de firma",
"SiteMessage": "Mensaje interno",
"SiteMessageList": "Mensaje interno",
- "SiteURLTip": "Por ejemplo: https://demo.jumpserver.org",
+ "SiteURLTip": "Por ejemplo: https://demo.example.com",
"Skip": "Ignorar activo actual.",
"Skipped": "Saltado",
"Slack": "Slack",
@@ -1255,6 +1264,7 @@
"StatusYellow": "Recientemente se han producido fallos en la ejecución",
"Step": "Pasos",
"Stop": "Detener",
+ "StopJob": "Detener trabajo",
"StopJobMsg": "Detención exitosa",
"StopLogOutput": "Tarea cancelada: la tarea actual (currentTaskId) ha sido detenida manualmente, dado que el progreso de ejecución de cada tarea es diferente, a continuación se presenta el resultado final de la ejecución, donde la ejecución fallida indica que se ha detenido con éxito la ejecución de la tarea.",
"Storage": "Almacenamiento",
@@ -1528,4 +1538,4 @@
"forceEnableMFAHelpText": "Si se habilita forzosamente, el usuario no podrá desactivarlo por sí mismo",
"removeWarningMsg": "¿Está seguro de que desea eliminar?",
"setVariable": "configurar parámetros"
-}
+}
\ No newline at end of file
diff --git a/apps/i18n/lina/ja.json b/apps/i18n/lina/ja.json
index 0b35f4f53..3583a1b51 100644
--- a/apps/i18n/lina/ja.json
+++ b/apps/i18n/lina/ja.json
@@ -170,6 +170,7 @@
"Assets": "アセット",
"AssetsAmount": "資産数",
"AssetsOfNumber": "アセット数",
+ "AssetsSelected": "選択したアセット数",
"AssetsTotal": "総資産数",
"AssignedInfo": "承認情報",
"Assignee": "処理者",
@@ -261,6 +262,7 @@
"CACertificate": "CA 証明書",
"CAS": "CAS",
"CMPP2": "CMPP v2.0",
+ "CTYunPrivate": "イークラウド・プライベートクラウド",
"CalculationResults": "cron 式のエラー",
"CallRecords": "つうわきろく",
"CanDragSelect": "マウスドラッグで時間帯を選択可能;未選択は全選択と同じです",
@@ -352,6 +354,7 @@
"Configured": "設定済み",
"Confirm": "確認",
"ConfirmPassword": "パスワードの確認",
+ "ConfirmRunningAssets": "確認したアセット",
"Connect": "接続",
"ConnectAssets": "接続資産",
"ConnectMethod": "接続方法",
@@ -361,6 +364,7 @@
"ConnectMethodACLHelpText": "接続方法のフィルタリングにより、ユーザーが特定の接続方法を使用して資産にログインできるかどうかを制御できます。設定したルールにより、いくつかの接続方法は許可され、他の接続方法は禁止されます。",
"ConnectMethodACLUpdate": "接続方法のコントロールを更新",
"ConnectMethodACLs": "接続方法",
+ "ConnectMethodAclDetail": "接続方法の詳細",
"ConnectWebSocketError": "WebSocketへの接続に失敗",
"Connectable": " 接続可能",
"ConnectionDropped": "接続が切断された",
@@ -396,11 +400,10 @@
"CriticalLoad": "重大",
"CronExpression": "crontab完全表現",
"Crontab": "定時実行タスク",
- "CrontabDiffError": "定期実行の間隔が10分以上であることをご確認ください!",
+ "CrontabDiffError": "定期実行の間隔が{minutes}分以上であることをご確認ください!",
"CrontabHelpText": "同時にintervalとcrontabを設定した場合、crontabが優先されます",
- "CrontabHelpTip": "例えば:日曜日の03:05に実行 <5 3 * * 0>
5桁のlinux crontab表現を使用 (オンラインツール)
",
+ "CrontabHelpTip": "例えば:日曜日の03:05に実行 <5 3 * * 0>
5桁のlinux crontab表現を使用 (オンラインツール)
",
"CrontabOfCreateUpdatePage": "例:毎週日曜日の03:05に実行 <5 3 * * 0>
5桁のLinux crontab表現を使用してください <分 時 日 月 星期> (オンラインツール)
定期的な実行と周期的な実行が設定されている場合、定期的な実行が優先されます",
- "CTYunPrivate": "イークラウド・プライベートクラウド",
"CurrentConnectionUsers": "現在のセッションユーザー数",
"CurrentConnections": "現在のコネクション数",
"CurrentStatus": "現在の状態",
@@ -452,6 +455,8 @@
"DefaultValue": "デフォルト値",
"DefaultValueTip": "デフォルト値を使用して、保存、実行、定期的なタスクを実行します。デフォルト値を記入しないと、タスクの実行に失敗する可能性があります。",
"Delete": "削除",
+ "DeleteAccount": "アカウントの削除",
+ "DeleteBoth": "同時に削除する",
"DeleteConfirmMessage": "一度削除すると復元はできません、続けますか?",
"DeleteErrorMsg": "削除に失敗",
"DeleteGatherAccountTitle": "発見されたアカウントの削除",
@@ -479,6 +484,7 @@
"DingTalk": "ディーングトーク",
"DingTalkOAuth": "ディンディン認証",
"DingTalkTest": "テスト",
+ "DirectoryServiceHelpMessage": "ディレクトリサービスは、ネットワークリソース情報を集中管理・保存・照会するためのサービスであり、一般的な実装にはLDAPやActive Directoryが含まれます。他のアセットがディレクトリサービスに関連付けられると、ディレクトリサービスからアカウントを継承します。",
"Disable": "無効化",
"DisableSelected": "選択を無効にする",
"DisableSuccessMsg": "無効化成功",
@@ -653,6 +659,7 @@
"Id": "ID",
"IdeaContent": "あなたがLinuxターミナルとして機能することを望んでいます。私はコマンドを入力し、あなたはターミナルが表示すべき内容を回答します。ターミナルの出力はユニークなコードブロック内でだけ応答してほしい、その他ではない。説明を書かないでください。何かをあなたに伝える必要があるとき、私はテキストを大括弧{備考テキスト}の中に置きます。",
"IdeaTitle": "🌱 Linux 端末",
+ "IdentityDomain": "アイデンティティ領域",
"IdpMetadataHelpText": "IDP Metadata URLとIDP MetadataXMLのパラメータのうち、一つだけ選択すればよいです。 IDP Metadata URLは優先順位が高い",
"IdpMetadataUrlHelpText": "IDP Metadataをリモートアドレスから読み込むのを拒否",
"IgnoreAlert": "アラートを無視",
@@ -861,6 +868,7 @@
"NodeInformation": "ノード情報",
"NodeOfNumber": "ノード数",
"NodeSearchStrategy": "ノード検索戦略",
+ "NonRunnableAssets": "稼働不可アセット",
"NormalLoad": "正常",
"NotEqual": "等しくない",
"NotSet": "設定されていません",
@@ -1135,6 +1143,7 @@
"RunasHelpText": "実行スクリプトのユーザー名を入力してください",
"RunasPolicy": "アカウント戦略",
"RunasPolicyHelpText": "現在の資産にはこの実行ユーザーがいない場合、どのアカウント選択戦略を採用するか。スキップ:実行しない。特権アカウントを優先:特権アカウントがあれば最初に特権アカウントを選び、なければ一般アカウントを選ぶ。特権アカウントのみ:特権アカウントからのみ選択し、なければ実行しない",
+ "RunnableAssets": "稼働可能アセット",
"Running": "実行中",
"RunningPath": "実行パス",
"RunningPathHelpText": "スクリプトの実行パスを記入してください、この設定はシェルスクリプトのみ有効です",
@@ -1237,7 +1246,7 @@
"SignChannelNum": "署名チャネル番号",
"SiteMessage": "内部メール",
"SiteMessageList": "内部メール",
- "SiteURLTip": "例えば:https://demo.jumpserver.org",
+ "SiteURLTip": "例えば:https://demo.example.com",
"Skip": "現在の資産を無視する",
"Skipped": "スキップ済み",
"Slack": "Slack",
@@ -1260,6 +1269,7 @@
"StatusYellow": "最近、実行に失敗があり。",
"Step": "ステップ",
"Stop": "停止",
+ "StopJob": "作業の停止",
"StopJobMsg": "成功を停止",
"StopLogOutput": "ask Canceled:現在のタスク(currentTaskId)は手動で停止されました。各タスクの進行状況が異なるため、以下はタスクの最終実行結果です。実行が失敗した場合は、タスクが正常に停止されました。",
"Storage": "ストレージ",
@@ -1533,4 +1543,4 @@
"forceEnableMFAHelpText": "強制的に有効化すると、ユーザーは自分で無効化することができません。",
"removeWarningMsg": "削除してもよろしいですか",
"setVariable": "パラメータ設定"
-}
+}
\ No newline at end of file
diff --git a/apps/i18n/lina/pt_br.json b/apps/i18n/lina/pt_br.json
index eaab7ce7d..2ef6bef41 100644
--- a/apps/i18n/lina/pt_br.json
+++ b/apps/i18n/lina/pt_br.json
@@ -168,6 +168,7 @@
"Assets": "Gestão de ativos",
"AssetsAmount": "Número de ativos",
"AssetsOfNumber": "Número de ativos",
+ "AssetsSelected": "Ativos selecionados",
"AssetsTotal": "Total de ativos",
"AssignedInfo": "Informações de Aprovação",
"Assignee": "Handler",
@@ -258,6 +259,7 @@
"CACertificate": " Certificado CA",
"CAS": "CAS",
"CMPP2": "CMPP v2.0",
+ "CTYunPrivate": " eCloud Nuvem Privada",
"CalculationResults": "Erro de expressão cron",
"CallRecords": "Registro de chamadas",
"CanDragSelect": "Você pode selecionar o intervalo de tempo arrastando o mouse; não selecionar é equivalente a selecionar tudo",
@@ -349,6 +351,7 @@
"Configured": "Configurado",
"Confirm": "Confirmar",
"ConfirmPassword": "Confirmar senha",
+ "ConfirmRunningAssets": "Confirmar ativos em funcionamento",
"Connect": "Conectar",
"ConnectAssets": "Conectar ativos",
"ConnectMethod": "Método de Conexão",
@@ -358,6 +361,7 @@
"ConnectMethodACLHelpText": "Através do filtro por método de conexão, você pode controlar se os usuários podem usar um determinado método para acessar os recursos. De acordo com as regras que você configura, alguns métodos de conexão podem ser permitidos, enquanto outros podem ser proibidos.",
"ConnectMethodACLUpdate": "Atualizar controle de método de conexão",
"ConnectMethodACLs": "Método de conexão",
+ "ConnectMethodAclDetail": "Detalhes da forma de conexão",
"ConnectWebSocketError": "Falha ao conectar WebSocket",
"Connectable": " Conexão disponível",
"ConnectionDropped": "Conexão interrompida",
@@ -393,11 +397,10 @@
"CriticalLoad": "Grave",
"CronExpression": "Expressão Completa do Crontab",
"Crontab": "Tarefas programadas",
- "CrontabDiffError": "Por favor, certifique-se de que o intervalo de tempo para execução regular não seja menor que dez minutos!",
+ "CrontabDiffError": "Por favor, certifique-se de que o intervalo de tempo para execução regular não seja menor que {minutes} minutos!",
"CrontabHelpText": "Se interval e crontab estiverem configurados ao mesmo tempo, crontab terá prioridade",
- "CrontabHelpTip": "Por exemplo: execute todos os domingos às 03:05 <5 3 * * 0>
Use a expressão linux crontab de 5 posições (Ferramenta online)
",
+ "CrontabHelpTip": "Por exemplo: execute todos os domingos às 03:05 <5 3 * * 0>
Use a expressão linux crontab de 5 posições (Ferramenta online)
",
"CrontabOfCreateUpdatePage": "Por exemplo: Execute todos os domingos às 03:05 <5 3 * * 0>
Use a expressão crontab Linux de 5 dígitos (Ferramenta online)
Se a execução periódica e a execução regular forem definidas ao mesmo tempo, a execução regular terá prioridade",
- "CTYunPrivate": " eCloud Nuvem Privada",
"CurrentConnectionUsers": "Número atual de usuários na sessão",
"CurrentConnections": "Número atual de conexões",
"CurrentStatus": "Estado atual",
@@ -448,6 +451,8 @@
"DefaultValue": " Valor padrão",
"DefaultValueTip": " Salvar e executar tarefas agendadas usando valores padrão. Não preencher os valores padrão pode levar à falha na execução da tarefa. ",
"Delete": "Excluir",
+ "DeleteAccount": "Excluir conta",
+ "DeleteBoth": "Ao mesmo tempo, excluir os detalhes do método de conexão, interromper o trabalho e apagar a conta.",
"DeleteConfirmMessage": "A exclusão não pode ser revertida, você quer continuar?",
"DeleteErrorMsg": " Falha na exclusão ",
"DeleteGatherAccountTitle": "Excluir conta encontrada",
@@ -475,6 +480,7 @@
"DingTalk": "DingTalk",
"DingTalkOAuth": "Autenticação DingDing",
"DingTalkTest": "Teste",
+ "DirectoryServiceHelpMessage": "O serviço de Diretório (Directory Service) é uma ferramenta destinada ao armazenamento, gerenciamento e consulta centralizada das informações de recursos da rede. As implementações mais comuns incluem LDAP e Active Directory. Outros ativos que estão associados ao serviço de diretório herdarão as contas desse serviço.",
"Disable": "Desativado",
"DisableSelected": "Desativar selecionado",
"DisableSuccessMsg": "Desativado com sucesso",
@@ -649,6 +655,7 @@
"Id": "ID",
"IdeaContent": "Quero que você atue como um terminal Linux. Vou digitar comandos, e você responderá o que o terminal deveria mostrar. Quero que você responda a saída do terminal apenas em um bloco de código único, e não em outro. Não faça interpretações. Quando eu precisar te contar algo, eu colocarei o texto entre chaves {Texto de observação}.",
"IdeaTitle": "🌱 Linux terminal",
+ "IdentityDomain": "Domínio de identidade",
"IdpMetadataHelpText": "URL de Metadados IDP e Parâmetro MetadataXML IDP, escolha um dos dois, a URL do Metadados IDP tem prioridade",
"IdpMetadataUrlHelpText": "Carregar IDP Metadata a partir do endereço remoto",
"IgnoreAlert": "Ignorar alerta",
@@ -857,6 +864,7 @@
"NodeInformation": "Informações do nó",
"NodeOfNumber": "Número de nós",
"NodeSearchStrategy": "Estratégia de pesquisa de nó",
+ "NonRunnableAssets": "ativos não operacionais",
"NormalLoad": "Normal",
"NotEqual": "Não é igual a",
"NotSet": "Não configurado",
@@ -1131,6 +1139,7 @@
"RunasHelpText": "Preencha o nome de usuário para executar o script",
"RunasPolicy": "Política de Conta",
"RunasPolicyHelpText": "Qual estratégia de escolha de conta adotar quando o usuário atual não está executando neste recurso. Ignorar: não execute. Conta de privilégio prioritário: se houver uma conta de privilégios, escolha-a primeiro, se não, escolha uma conta comum. Apenas contas de privilégio: escolha apenas de contas de privilégio, se não houver, não execute",
+ "RunnableAssets": "ativos em funcionamento",
"Running": "Em execução",
"RunningPath": "Caminho de Execução",
"RunningPathHelpText": "Informe o caminho de execução do script, essa configuração só é válida para scripts shell",
@@ -1233,7 +1242,7 @@
"SignChannelNum": "Número do canal de assinatura",
"SiteMessage": "Mensagem interna",
"SiteMessageList": "Mensagem Interna",
- "SiteURLTip": "Por exemplo: https://demo.jumpserver.org",
+ "SiteURLTip": "Por exemplo: https://demo.example.com",
"Skip": "Ignorar ativo atual",
"Skipped": "Ignorado",
"Slack": "Slack",
@@ -1256,6 +1265,7 @@
"StatusYellow": "Recentemente houve falhas na execução",
"Step": "Passos",
"Stop": "Parar",
+ "StopJob": "Parar trabalho",
"StopJobMsg": "Parada bem-sucedida",
"StopLogOutput": "Ação cancelada: a tarefa atual (currentTaskId) foi interrompida manualmente. Como cada tarefa tem um andamento diferente, abaixo estão os resultados finais, a falha na execução significa que a tarefa foi interrompida com sucesso.",
"Storage": " Armazenamento ",
@@ -1529,4 +1539,4 @@
"forceEnableMFAHelpText": "Se for habilitado forçosamente, o usuário não pode desativar por conta própria",
"removeWarningMsg": "Tem certeza de que deseja remover",
"setVariable": "Parâmetros de configuração"
-}
+}
\ No newline at end of file
diff --git a/apps/i18n/lina/ru.json b/apps/i18n/lina/ru.json
index dedec1af6..337af1f4c 100644
--- a/apps/i18n/lina/ru.json
+++ b/apps/i18n/lina/ru.json
@@ -168,6 +168,7 @@
"Assets": "Управление активами",
"AssetsAmount": "Количество активов",
"AssetsOfNumber": "Активы",
+ "AssetsSelected": "Выбрано активов",
"AssetsTotal": "Общее количество активов",
"AssignedInfo": "Информация о审批",
"Assignee": "Ответственное лицо",
@@ -257,6 +258,7 @@
"CACertificate": "CA сертификат",
"CAS": "CAS",
"CMPP2": "CMPP v2.0",
+ "CTYunPrivate": "eCloud Частное Облако",
"CalculationResults": "Ошибка выражения cron",
"CallRecords": "Запись вызовов",
"CanDragSelect": "Можно перетаскивать мышь для выбора временного диапазона; не выбрано – значит, выбрано всё",
@@ -348,6 +350,7 @@
"Configured": "Настроено",
"Confirm": "Подтверждение",
"ConfirmPassword": "Подтвердите пароль",
+ "ConfirmRunningAssets": "Подтвердить активы в работе",
"Connect": "Соединение",
"ConnectAssets": "Подключить активы",
"ConnectMethod": "Способ подключения",
@@ -357,6 +360,7 @@
"ConnectMethodACLHelpText": "Фильтруя по способу подключения, вы можете контролировать, может ли пользователь заходить на актив с использованием определенного способа подключения. В зависимости от ваших установленных правил, некоторые способы подключения могут быть разрешены, в то время как другие будут запрещены.",
"ConnectMethodACLUpdate": "Обновить управление способами подключения",
"ConnectMethodACLs": "Способ подключения",
+ "ConnectMethodAclDetail": "детали способа подключения",
"ConnectWebSocketError": "Ошибка подключения к WebSocket",
"Connectable": "Можно подключиться",
"ConnectionDropped": "Соединение разорвано",
@@ -392,11 +396,10 @@
"CriticalLoad": "Серьезно",
"CronExpression": "Полное выражение crontab",
"Crontab": "Запланированные задачи",
- "CrontabDiffError": "Пожалуйста, убедитесь, что интервал выполнения регулярно составляет не менее десяти минут!",
+ "CrontabDiffError": "Пожалуйста, убедитесь, что интервал выполнения регулярно составляет не менее {minutes} минут!",
"CrontabHelpText": "Если одновременно установлены интервал и crontab, предпочтение отдается crontab",
- "CrontabHelpTip": "например: выполнять каждое воскресенье в 03:05 <5 3 * * 0>
использовать 5-значное выражение crontab Linux <минуты часы день месяц день_недели> (онлайн инструмент)
",
+ "CrontabHelpTip": "например: выполнять каждое воскресенье в 03:05 <5 3 * * 0>
использовать 5-значное выражение crontab Linux <минуты часы день месяц день_недели> (онлайн инструмент)
",
"CrontabOfCreateUpdatePage": "Например: выполнять каждое воскресенье в 03:05 <5 3 * * 0>
Использовать 5-значное выражение crontab Linux <минуты часы день месяц день_недели> (онлайн инструмент)
Если одновременно установлены периодическое выполнение и циклическое выполнение, приоритет отдается периодическому выполнению",
- "CTYunPrivate": "eCloud Частное Облако",
"CurrentConnectionUsers": "Текущее число пользователей в беседе",
"CurrentConnections": "Текущее количество подключений",
"CurrentStatus": "Текущий статус",
@@ -447,6 +450,8 @@
"DefaultValue": "Значение по умолчанию",
"DefaultValueTip": "Сохранить и выполнить, а также запланированные задачи использовать значения по умолчанию. Неполное заполнение значений по умолчанию может привести к сбою выполнения задачи.",
"Delete": "Удалить",
+ "DeleteAccount": "удалить аккаунт.",
+ "DeleteBoth": "Одновременно удалить",
"DeleteConfirmMessage": "После удаления восстановить невозможно, продолжить?",
"DeleteErrorMsg": "Удаление не удалось",
"DeleteGatherAccountTitle": "Удалить найденную учетную запись",
@@ -474,6 +479,7 @@
"DingTalk": "钉钉",
"DingTalkOAuth": "Аутентификация DingTalk",
"DingTalkTest": "Тест",
+ "DirectoryServiceHelpMessage": "Служба каталогов (Directory Service) — это сервис для централизованного хранения, управления и запроса информации о ресурсах сети, к распространенным реализациям относятся LDAP и Active Directory. Другие активы, подключенные к службе каталогов, будут наследовать аккаунты от службы каталогов.",
"Disable": "Запретить",
"DisableSelected": "Отключить выбранное",
"DisableSuccessMsg": "Успешно отключено",
@@ -648,6 +654,7 @@
"Id": "ID",
"IdeaContent": "Я хочу, чтобы ты выступил в роли терминала Linux. Я буду вводить команды, а ты будешь отвечать тем, что должен отображать терминал. Я прошу отвечать только в одном уникальном блоке кода, без дополнительных комментариев. Когда мне нужно будет что-то тебе сказать, я помещу текст в фигурные скобки{замечание текста}.",
"IdeaTitle": "🌱 терминал Linux",
+ "IdentityDomain": "Область идентичности",
"IdpMetadataHelpText": "IDP Metadata URL и параметр IDP Metadata XML могут быть выбраны по одному, при этом предпочтение отдается IDP Metadata URL",
"IdpMetadataUrlHelpText": "Загрузить IDP Metadata с удаленного адреса",
"IgnoreAlert": "Игнорировать оповещение",
@@ -856,6 +863,7 @@
"NodeInformation": "Информация о узле",
"NodeOfNumber": "Количество узлов",
"NodeSearchStrategy": "Стратегия поиска узлов",
+ "NonRunnableAssets": "Неактивные активы",
"NormalLoad": "Нормально",
"NotEqual": "Не равно",
"NotSet": "Не установлено",
@@ -1130,6 +1138,7 @@
"RunasHelpText": "Введите имя пользователя для запуска скрипта",
"RunasPolicy": "стратегия аккаунтов",
"RunasPolicyHelpText": "Когда на текущем активе нет этого пользователя, используйте следующую стратегию выбора аккаунта. Пропустить: не выполнять. Приоритетный привилегированный аккаунт: если есть привилегированный аккаунт, выбирайте его в первую очередь, если нет – выбирайте обычный аккаунт. Только привилегированные аккаунты: выбирайте только из привилегированных аккаунтов, если их нет – не выполнять",
+ "RunnableAssets": "Активы в работе",
"Running": "В процессе выполнения",
"RunningPath": "Путь выполнения",
"RunningPathHelpText": "Укажите путь выполнения скрипта, эта настройка действует только для shell-скриптов",
@@ -1232,7 +1241,7 @@
"SignChannelNum": "Номер канала подписи",
"SiteMessage": "Сообщение на сайте",
"SiteMessageList": "Внутреннее сообщение",
- "SiteURLTip": "Например: https://demo.jumpserver.org",
+ "SiteURLTip": "Например: https://demo.example.com",
"Skip": "Игнорировать текущие активы",
"Skipped": "Пропущено",
"Slack": "Slack",
@@ -1255,6 +1264,7 @@
"StatusYellow": "В последнее время были неудачные выполнения",
"Step": "Шаги",
"Stop": "Остановить",
+ "StopJob": "остановить действие",
"StopJobMsg": "Остановка завершена успешно",
"StopLogOutput": "Задача отменена: текущая задача (currentTaskId) была остановлена вручную. Поскольку выполнение каждой задачи идет с разной скоростью, ниже указаны окончательные результаты выполнения задачи. Ошибка выполнения означает, что задача была успешно остановлена.",
"Storage": "Хранилище",
@@ -1528,4 +1538,4 @@
"forceEnableMFAHelpText": "Если принудительно включено, пользователь не сможет отключить самостоятельно",
"removeWarningMsg": "Вы уверены, что хотите удалить",
"setVariable": "Настроить параметры"
-}
+}
\ No newline at end of file
diff --git a/apps/i18n/lina/zh.json b/apps/i18n/lina/zh.json
index ba960dad3..f812b8804 100644
--- a/apps/i18n/lina/zh.json
+++ b/apps/i18n/lina/zh.json
@@ -26,7 +26,7 @@
"AccountDiscoverTaskCreate": "创建发现帐户任务",
"AccountDiscoverTaskUpdate": "更新发现帐户任务",
"AccountExportTips": "导出信息中包含账号密文涉及敏感信息,导出的格式为一个加密的zip文件(若没有设置加密密码,请前往个人信息中设置文件加密密码)。",
- "AccountList": "账号",
+ "AccountList": "账号管理",
"AccountPolicy": "账号策略",
"AccountPolicyHelpText": "创建时对于不符合要求的账号,如:密钥类型不合规,唯一键约束,可选择以上策略。",
"AccountPushCreate": "创建账号推送",
@@ -168,6 +168,7 @@
"Assets": "资产管理",
"AssetsAmount": "资产数量",
"AssetsOfNumber": "资产数",
+ "AssetsSelected": " 个资产已选择",
"AssetsTotal": "资产总数",
"AssignedInfo": "审批信息",
"Assignee": "处理人",
@@ -257,6 +258,7 @@
"CACertificate": "CA 证书",
"CAS": "CAS",
"CMPP2": "CMPP v2.0",
+ "CTYunPrivate": "天翼私有云",
"CalculationResults": "cron 表达式错误",
"CallRecords": "调用记录",
"CanDragSelect": "可拖动鼠标选择时间段;未选择等同全选",
@@ -348,6 +350,7 @@
"Configured": "已配置",
"Confirm": "确认",
"ConfirmPassword": "确认密码",
+ "ConfirmRunningAssets": "确认运行资产",
"Connect": "连接",
"ConnectAssets": "连接资产",
"ConnectMethod": "连接方式",
@@ -357,6 +360,7 @@
"ConnectMethodACLHelpText": "通过连接方式过滤,您可以控制用户是否可以使用某种连接方式登录到资产上。根据您设定的规则,某些连接方式可以被放行,而另一些连接方式则被禁止。",
"ConnectMethodACLUpdate": "更新连接方式控制",
"ConnectMethodACLs": "连接方式",
+ "ConnectMethodAclDetail": "连接方式详情",
"ConnectWebSocketError": "连接 WebSocket 失败",
"Connectable": "可连接",
"ConnectionDropped": "连接已断开",
@@ -392,11 +396,10 @@
"CriticalLoad": "严重",
"CronExpression": "crontab完整表达式",
"Crontab": "定时任务",
- "CrontabDiffError": "请确保定期执行的时间间隔不少于十分钟!",
+ "CrontabDiffError": "请确保定期执行的时间间隔不少于 {minutes} 分钟!",
"CrontabHelpText": "如果同时设置了 interval 和 crontab,则优先考虑 crontab",
- "CrontabHelpTip": "例如:每周日 03:05 执行 <5 3 * * 0>
使用 5 位 linux crontab 表达式 (在线工具)
",
+ "CrontabHelpTip": "例如:每周日 03:05 执行 <5 3 * * 0>
使用 5 位 linux crontab 表达式 (在线工具)
",
"CrontabOfCreateUpdatePage": "例如:每周日 03:05 执行 <5 3 * * 0>
使用5位 Linux crontab 表达式 <分 时 日 月 星期> (在线工具)
如果同时设置了定期执行和周期执行,优先使用定期执行",
- "CTYunPrivate": "天翼私有云",
"CurrentConnectionUsers": "当前会话用户数",
"CurrentConnections": "当前连接数",
"CurrentStatus": "当前状态",
@@ -447,6 +450,8 @@
"DefaultValue": "默认值",
"DefaultValueTip": "保存并执行和定时任务使用默认值执行,不填写默认值可能会导致任务执行失败",
"Delete": "删除",
+ "DeleteAccount": "删除账号",
+ "DeleteBoth": "同时删除",
"DeleteConfirmMessage": "删除后无法恢复,是否继续?",
"DeleteErrorMsg": "删除失败",
"DeleteGatherAccountTitle": "删除发现的账号",
@@ -474,6 +479,7 @@
"DingTalk": "钉钉",
"DingTalkOAuth": "钉钉认证",
"DingTalkTest": "测试",
+ "DirectoryServiceHelpMessage": "目录服务(Directory Service) 是一种用于集中存储、管理和查询网络资源信息的服务,常见实现包括 LDAP 和 Active Directory。其它资产关联目录服务后,会继承来自目录服务的账号.",
"Disable": "禁用",
"DisableSelected": "禁用所选",
"DisableSuccessMsg": "禁用成功",
@@ -648,6 +654,7 @@
"Id": "ID",
"IdeaContent": "我想让你充当一个 Linux 终端。我将输入命令,你将回答终端应该显示的内容。我希望你只在一个独特的代码块内回复终端输出,而不是其他。不要写解释。当我需要告诉你一些事情时,我会把文字放在大括号里{备注文本}。",
"IdeaTitle": "🌱 Linux 终端",
+ "IdentityDomain": "身份域",
"IdpMetadataHelpText": "IDP Metadata URL 和 IDP MetadataXML参数二选一即可,IDP MetadataURL的优先级高",
"IdpMetadataUrlHelpText": "从远端地址中加载 IDP Metadata",
"IgnoreAlert": "忽略警报",
@@ -856,6 +863,7 @@
"NodeInformation": "节点信息",
"NodeOfNumber": "节点数",
"NodeSearchStrategy": "节点搜索策略",
+ "NonRunnableAssets": "不可运行资产",
"NormalLoad": "正常",
"NotEqual": "不等于",
"NotSet": "未设置",
@@ -1130,6 +1138,7 @@
"RunasHelpText": "填写运行脚本的用户名",
"RunasPolicy": "账号策略",
"RunasPolicyHelpText": "当前资产上没此运行用户时,采取什么账号选择策略。跳过:不执行。优先特权账号:如果有特权账号先选特权账号,如果没有就选普通账号。仅特权账号:只从特权账号中选择,如果没有则不执行",
+ "RunnableAssets": "可运行资产",
"Running": "运行中",
"RunningPath": "运行路径",
"RunningPathHelpText": "填写脚本的运行路径,此设置仅 shell 脚本生效",
@@ -1232,7 +1241,7 @@
"SignChannelNum": "签名通道号",
"SiteMessage": "站内信",
"SiteMessageList": "站内信",
- "SiteURLTip": "例如:https://demo.jumpserver.org",
+ "SiteURLTip": "例如:https://demo.example.com",
"Skip": "忽略当前资产",
"Skipped": "已跳过",
"Slack": "Slack",
@@ -1255,6 +1264,7 @@
"StatusYellow": "近期存在在执行失败",
"Step": "步骤",
"Stop": "停止",
+ "StopJob": "停止作业",
"StopJobMsg": "停止成功",
"StopLogOutput": "Task Canceled:当前任务(currentTaskId)已手动停止,由于每个任务的执行进度不一样,下面是任务最终的执行结果,执行失败表示已成功停止任务执行。",
"Storage": "存储",
@@ -1527,9 +1537,5 @@
"disallowSelfUpdateFields": "不允许自己修改当前字段",
"forceEnableMFAHelpText": "如果强制启用,用户无法自行禁用",
"removeWarningMsg": "你确定要移除",
- "setVariable": "设置参数",
- "StopJob": "停止作业",
- "ConnectMethodAclDetail": "连接方式详情",
- "DeleteAccount": "删除账号",
- "DeleteBoth": "同时删除"
-}
+ "setVariable": "设置参数"
+}
\ No newline at end of file
diff --git a/apps/i18n/lina/zh_hant.json b/apps/i18n/lina/zh_hant.json
index e03dede5b..4dc5a787d 100644
--- a/apps/i18n/lina/zh_hant.json
+++ b/apps/i18n/lina/zh_hant.json
@@ -170,6 +170,7 @@
"Assets": "資產管理",
"AssetsAmount": "資產數量",
"AssetsOfNumber": "資產數",
+ "AssetsSelected": "個資產已選擇",
"AssetsTotal": "資產總數",
"AssignedInfo": "審批資訊",
"Assignee": "處理人",
@@ -261,6 +262,7 @@
"CACertificate": "CA 證書",
"CAS": "CAS",
"CMPP2": "CMPP v2.0",
+ "CTYunPrivate": "天翼私有雲",
"CalculationResults": "呼叫記錄",
"CallRecords": "調用記錄",
"CanDragSelect": "可拖動滑鼠選擇時間段;未選擇等同全選",
@@ -352,6 +354,7 @@
"Configured": "已配置",
"Confirm": "確認",
"ConfirmPassword": "確認密碼",
+ "ConfirmRunningAssets": "確認運行資產",
"Connect": "連接",
"ConnectAssets": "連接資產",
"ConnectMethod": "連接方式",
@@ -361,6 +364,7 @@
"ConnectMethodACLHelpText": "您可以透過篩選連接方式,控制使用者能否使用特定方式登入到資產上。根據您設定的規則,有些連接方式可被允許,而其他連接方式則被禁止。",
"ConnectMethodACLUpdate": "更新連接方式控制",
"ConnectMethodACLs": "連接方式",
+ "ConnectMethodAclDetail": "連接方式詳情",
"ConnectWebSocketError": "連接 WebSocket 失敗",
"Connectable": "可連接",
"ConnectionDropped": "連接已斷開",
@@ -396,11 +400,10 @@
"CriticalLoad": "嚴重",
"CronExpression": "crontab完整表達式",
"Crontab": "定時任務",
- "CrontabDiffError": "請確保定期執行的時間間隔不少於十分鐘!",
+ "CrontabDiffError": "請確保定期執行的時間間隔不少於 {minutes} 分鐘!",
"CrontabHelpText": "如果同時設定了 interval 和 crontab,則優先考慮 crontab",
- "CrontabHelpTip": "例如:每週日 03:05 執行 <5 3 * * 0>
使用 5 位 linux crontab 表達式 (線上工具)
",
+ "CrontabHelpTip": "例如:每週日 03:05 執行 <5 3 * * 0>
使用 5 位 linux crontab 表達式 (線上工具)
",
"CrontabOfCreateUpdatePage": "例如:每週日 03:05 執行 <5 3 * * 0>
使用5位 Linux crontab 表達式 <分 時 日 月 星期> (線上工具)
如果同時設置了定期執行和週期執行,優先使用定期執行",
- "CTYunPrivate": "天翼私有雲",
"CurrentConnectionUsers": "當前會話用戶數",
"CurrentConnections": "當前連接數",
"CurrentStatus": "當前狀態",
@@ -452,6 +455,8 @@
"DefaultValue": "預設值",
"DefaultValueTip": "保存並執行及定時任務使用默認值執行,未填寫默認值可能會導致任務執行失敗",
"Delete": "刪除",
+ "DeleteAccount": "刪除帳號",
+ "DeleteBoth": "同時刪除",
"DeleteConfirmMessage": "刪除後無法恢復,是否繼續?",
"DeleteErrorMsg": "刪除失敗",
"DeleteGatherAccountTitle": "刪除發現的帳號",
@@ -479,6 +484,7 @@
"DingTalk": "釘釘",
"DingTalkOAuth": "釘釘認證",
"DingTalkTest": "測試",
+ "DirectoryServiceHelpMessage": "目錄服務(Directory Service)是一種用於集中儲存、管理和查詢網絡資源信息的服務,常見的實現包括 LDAP 和 Active Directory。其他資產關聯目錄服務後,將繼承來自目錄服務的帳號。",
"Disable": "禁用",
"DisableSelected": "停用所選",
"DisableSuccessMsg": "禁用成功",
@@ -653,6 +659,7 @@
"Id": "ID",
"IdeaContent": "我想讓你充當一個 Linux 終端。我將輸入命令,你將回答終端應該顯示的內容。我希望你只在一個獨特的代碼塊內回復終端輸出,而不是其他。不要寫解釋。當我需要告訴你一些事情時,我會把文字放在大括號裡{備註文本}。",
"IdeaTitle": "🌱 Linux 終端",
+ "IdentityDomain": "身份範疇",
"IdpMetadataHelpText": "IDP metadata URL 和 IDP metadata XML參數二選一即可,IDP metadata URL的優先度高",
"IdpMetadataUrlHelpText": "從遠端地址中載入 IDP Metadata",
"IgnoreAlert": "忽略警報",
@@ -861,6 +868,7 @@
"NodeInformation": "節點資訊",
"NodeOfNumber": "節點數",
"NodeSearchStrategy": "節點搜索策略",
+ "NonRunnableAssets": "不可運行資產",
"NormalLoad": "正常",
"NotEqual": "不等於",
"NotSet": "未設置",
@@ -1135,6 +1143,7 @@
"RunasHelpText": "填寫運行腳本的使用者名稱",
"RunasPolicy": "帳號策略",
"RunasPolicyHelpText": "當前資產上沒此運行用戶時,採取什麼帳號選擇策略。跳過:不執行。優先特權帳號:如果有特權帳號先選特權帳號,如果沒有就選普通帳號。僅特權帳號:只從特權帳號中選擇,如果沒有則不執行",
+ "RunnableAssets": "可運行資產",
"Running": "正在運行中的Vault 伺服器掛載點,預設為 jumpserver",
"RunningPath": "運行路徑",
"RunningPathHelpText": "填寫腳本的運行路徑,此設置僅 shell 腳本生效",
@@ -1237,7 +1246,7 @@
"SignChannelNum": "簽名通道號",
"SiteMessage": "站內信",
"SiteMessageList": "站內信",
- "SiteURLTip": "例如:https://demo.jumpserver.org",
+ "SiteURLTip": "例如:https://demo.example.com",
"Skip": "跳過",
"Skipped": "已跳過",
"Slack": "Slack",
@@ -1260,6 +1269,7 @@
"StatusYellow": "近期存在在執行失敗",
"Step": "步驟",
"Stop": "停止",
+ "StopJob": "停止作業",
"StopJobMsg": "停止成功",
"StopLogOutput": "任務已取消:當前任務(currentTaskId)已被手動停止。由於每個任務的執行進度不同,以下是任務的最終執行結果。執行失敗表示任務已成功停止。",
"Storage": "儲存設置",
@@ -1350,7 +1360,7 @@
"TerminalDetail": "組件詳情",
"TerminalUpdate": "更新終端機",
"TerminalUpdateStorage": "更新終端儲存",
- "Terminate": "終端",
+ "Terminate": "終斷",
"TerminateTaskSendSuccessMsg": "終斷任務已下發,請稍後刷新查看",
"TermsAndConditions": "條款和條件",
"Test": "測試",
@@ -1533,4 +1543,4 @@
"forceEnableMFAHelpText": "如果強制啟用,用戶無法自行禁用",
"removeWarningMsg": "你確定要移除",
"setVariable": "設置參數"
-}
+}
\ No newline at end of file
diff --git a/apps/i18n/luna/en.json b/apps/i18n/luna/en.json
index 754c3d635..79a519a38 100644
--- a/apps/i18n/luna/en.json
+++ b/apps/i18n/luna/en.json
@@ -46,6 +46,7 @@
"Connect checked": "Connect checked",
"Connect command line": "Connect command line",
"Connect method": "Connect method",
+ "ConnectionTime": "Connection time",
"Copied": "Copied",
"Copy link": "Copy link",
"Current online": "Current online",
@@ -171,6 +172,7 @@
"Select account": "Select account",
"Send command": "Send command",
"Send text to all ssh terminals": "Send text to all ssh terminals",
+ "Session": "Session",
"SessionIsBeingMonitored": "session is being monitored",
"Set reusable": "Set reusable",
"Setting": "Setting",
@@ -203,6 +205,7 @@
"Token expired": "Token has expired",
"Tool download": "Tool download",
"Turkey keyboard layout": "Turkish-Q (Qwerty)",
+ "TurnOffReminders": "Turn off reminders",
"Type tree": "Type tree",
"UK English keyboard layout": "UK English (Qwerty)",
"US English keyboard layout": "US English (Qwerty)",
diff --git a/apps/i18n/luna/es.json b/apps/i18n/luna/es.json
index a65de8c43..3b5ec9c36 100644
--- a/apps/i18n/luna/es.json
+++ b/apps/i18n/luna/es.json
@@ -45,6 +45,7 @@
"Connect checked": "Conexión seleccionada",
"Connect command line": "Conectar a la línea de comandos",
"Connect method": "Modo de conexión",
+ "ConnectionTime": "Tiempo de conexión",
"Copied": "Copiado",
"Copy link": "Copiar enlace",
"Current online": "Actualmente en línea",
@@ -169,6 +170,7 @@
"Select account": "Seleccionar cuenta",
"Send command": "Enviar comando",
"Send text to all ssh terminals": "Enviar texto a todos los terminales SSH",
+ "Session": "Sesión",
"SessionIsBeingMonitored": "La sesión está siendo monitoreada",
"Set reusable": "Activar reutilización",
"Setting": "Configuración",
@@ -201,6 +203,7 @@
"Token expired": "Token ha expirado, por favor reconéctese",
"Tool download": "Descarga de herramientas",
"Turkey keyboard layout": "Turco-Q (Qwerty)",
+ "TurnOffReminders": "¿Está seguro de que desea cerrar la conexión actual?",
"Type tree": "Tipo de árbol",
"UK English keyboard layout": "Inglés del Reino Unido (Qwerty)",
"US English keyboard layout": "Inglés estadounidense (Qwerty)",
diff --git a/apps/i18n/luna/ja.json b/apps/i18n/luna/ja.json
index 8da5e2d58..5b08a430e 100644
--- a/apps/i18n/luna/ja.json
+++ b/apps/i18n/luna/ja.json
@@ -45,6 +45,7 @@
"Connect checked": "接続済み",
"Connect command line": "接続コマンドライン",
"Connect method": "接続方法",
+ "ConnectionTime": "接続時間",
"Copied": "複製済み",
"Copy link": "リンクをコピーする",
"Current online": "現在オンライン",
@@ -169,6 +170,7 @@
"Select account": "システムユーザーの選択",
"Send command": "コマンドを送信",
"Send text to all ssh terminals": "すべてのssh端末にテキストを送信します",
+ "Session": "セッション",
"SessionIsBeingMonitored": "会話が監視されています。",
"Set reusable": "再利用可能な",
"Setting": "設定",
@@ -201,6 +203,7 @@
"Token expired": "トークンの有効期限が切れました",
"Tool download": "ツールダウンロード",
"Turkey keyboard layout": "Turkish-Q (Qwerty)",
+ "TurnOffReminders": "現在の接続を閉じますか?",
"Type tree": "タイプツリー",
"UK English keyboard layout": "UK English (Qwerty)",
"US English keyboard layout": "US English (Qwerty)",
diff --git a/apps/i18n/luna/pt_br.json b/apps/i18n/luna/pt_br.json
index f3d48bb55..02b0c5ac4 100644
--- a/apps/i18n/luna/pt_br.json
+++ b/apps/i18n/luna/pt_br.json
@@ -45,6 +45,7 @@
"Connect checked": "Conecte selecionado",
"Connect command line": "Conectar linha de comando",
"Connect method": "Forma de conexão",
+ "ConnectionTime": "Tempo de conexão",
"Copied": "Copiado",
"Copy link": "Copiar link",
"Current online": "Online Atual",
@@ -169,6 +170,7 @@
"Select account": "Selecionar conta",
"Send command": "Enviar comando",
"Send text to all ssh terminals": "Enviar texto para todos os terminais ssh",
+ "Session": "Sessão",
"SessionIsBeingMonitored": "A conversa está sendo monitorada.",
"Set reusable": "Iniciar reutilização",
"Setting": "Configurações",
@@ -201,6 +203,7 @@
"Token expired": "Token Expirou, Por Favor Reconecte",
"Tool download": "Download da ferramenta",
"Turkey keyboard layout": "Turkish-Q (Qwerty)",
+ "TurnOffReminders": "Você tem certeza de que deseja fechar a conexão atual?",
"Type tree": "Tipo de árvore",
"UK English keyboard layout": "Ingles do Reino Unido (Qwerty)",
"US English keyboard layout": "Inglês dos EUA (Qwerty)",
diff --git a/apps/i18n/luna/ru.json b/apps/i18n/luna/ru.json
index c8090f177..956c06559 100644
--- a/apps/i18n/luna/ru.json
+++ b/apps/i18n/luna/ru.json
@@ -45,6 +45,7 @@
"Connect checked": "Подключение выбрано",
"Connect command line": "Подключение к командной строке",
"Connect method": "Способ подключения",
+ "ConnectionTime": "Время соединения",
"Copied": "Скопировано",
"Copy link": "Копировать ссылку",
"Current online": "Текущий онлайн",
@@ -169,6 +170,7 @@
"Select account": "Выбрать аккаунт",
"Send command": "Отправить команду",
"Send text to all ssh terminals": "Отправить текст на все ssh терминалы",
+ "Session": "Сессия",
"SessionIsBeingMonitored": "Сессия находится под наблюдением",
"Set reusable": "Включить повторное использование",
"Setting": "Настройки",
@@ -201,6 +203,7 @@
"Token expired": "Токен истёк, пожалуйста, переподключитесь",
"Tool download": "Скачать инструменты",
"Turkey keyboard layout": "Турецкий-Q (Qwerty)",
+ "TurnOffReminders": "Вы уверены, что хотите закрыть текущее соединение?",
"Type tree": "Типовая структура",
"UK English keyboard layout": "Английский (Великобритания) (Qwerty)",
"US English keyboard layout": "US English (Qwerty)",
diff --git a/apps/i18n/luna/zh.json b/apps/i18n/luna/zh.json
index 636649d40..bc9b7c724 100644
--- a/apps/i18n/luna/zh.json
+++ b/apps/i18n/luna/zh.json
@@ -45,6 +45,7 @@
"Connect checked": "连接选中",
"Connect command line": "连接命令行",
"Connect method": "连接方式",
+ "ConnectionTime": "连接时间",
"Copied": "已复制",
"Copy link": "复制链接",
"Current online": "当前在线",
@@ -169,6 +170,7 @@
"Select account": "选择账号",
"Send command": "发送命令",
"Send text to all ssh terminals": "发送文本到所有ssh终端",
+ "Session": "会话",
"SessionIsBeingMonitored": "会话正在被监控",
"Set reusable": "开启复用",
"Setting": "设置",
@@ -201,6 +203,7 @@
"Token expired": "Token 已过期, 请重新连接",
"Tool download": "工具下载",
"Turkey keyboard layout": "Turkish-Q (Qwerty)",
+ "TurnOffReminders": "确定要关闭当前连接吗",
"Type tree": "类型树",
"UK English keyboard layout": "UK English (Qwerty)",
"US English keyboard layout": "US English (Qwerty)",
diff --git a/apps/i18n/luna/zh_hant.json b/apps/i18n/luna/zh_hant.json
index aa5c9cb1c..481863f08 100644
--- a/apps/i18n/luna/zh_hant.json
+++ b/apps/i18n/luna/zh_hant.json
@@ -45,6 +45,7 @@
"Connect checked": "連接選中",
"Connect command line": "連接命令行",
"Connect method": "連線方式",
+ "ConnectionTime": "連接時間",
"Copied": "已複製",
"Copy link": "複製連結",
"Current online": "當前在線",
@@ -169,6 +170,7 @@
"Select account": "選擇帳號",
"Send command": "發送命令",
"Send text to all ssh terminals": "發送文本到所有ssh終端",
+ "Session": "會話",
"SessionIsBeingMonitored": "對話正在被監控。",
"Set reusable": "開啟復用",
"Setting": "設置",
@@ -201,6 +203,7 @@
"Token expired": "Token 已過期, 請重新連接",
"Tool download": "工具下載",
"Turkey keyboard layout": "Turkish-Q (Qwerty)",
+ "TurnOffReminders": "確定要關閉當前連接嗎",
"Type tree": "類型樹",
"UK English keyboard layout": "UK English (Qwerty)",
"US English keyboard layout": "US English (Qwerty)",
diff --git a/apps/jumpserver/conf.py b/apps/jumpserver/conf.py
index 0471bcd9d..597ca3872 100644
--- a/apps/jumpserver/conf.py
+++ b/apps/jumpserver/conf.py
@@ -9,7 +9,6 @@
"""
import base64
import copy
-import errno
import json
import logging
import os
@@ -290,6 +289,7 @@ class Config(dict):
'AUTH_LDAP_START_TLS': False,
'AUTH_LDAP_USER_ATTR_MAP': {"username": "cn", "name": "sn", "email": "mail"},
'AUTH_LDAP_CONNECT_TIMEOUT': 10,
+ 'AUTH_LDAP_STRICT_SYNC': False,
'AUTH_LDAP_CACHE_TIMEOUT': 0,
'AUTH_LDAP_SEARCH_PAGED_SIZE': 1000,
'AUTH_LDAP_SYNC_IS_PERIODIC': False,
@@ -310,6 +310,7 @@ class Config(dict):
'AUTH_LDAP_HA_START_TLS': False,
'AUTH_LDAP_HA_USER_ATTR_MAP': {"username": "cn", "name": "sn", "email": "mail"},
'AUTH_LDAP_HA_CONNECT_TIMEOUT': 10,
+ 'AUTH_LDAP_HA_STRICT_SYNC': False,
'AUTH_LDAP_HA_CACHE_TIMEOUT': 0,
'AUTH_LDAP_HA_SEARCH_PAGED_SIZE': 1000,
'AUTH_LDAP_HA_SYNC_IS_PERIODIC': False,
@@ -393,7 +394,7 @@ class Config(dict):
"en": {
"name": "JumpServer",
"displayname": "JumpServer",
- "url": "https://jumpserver.org/"
+ "url": "https://jumpserver.com/"
}
},
"strict": True,
@@ -564,11 +565,12 @@ class Config(dict):
# 安全配置
'SECURITY_MFA_AUTH': 0, # 0 不开启 1 全局开启 2 管理员开启
'SECURITY_MFA_AUTH_ENABLED_FOR_THIRD_PARTY': True,
+ 'SECURITY_MFA_BY_EMAIL': False,
'SECURITY_COMMAND_EXECUTION': False,
'SECURITY_COMMAND_BLACKLIST': [
'reboot', 'shutdown', 'poweroff', 'halt', 'dd', 'half', 'top'
],
- 'SECURITY_SERVICE_ACCOUNT_REGISTRATION': True,
+ 'SECURITY_SERVICE_ACCOUNT_REGISTRATION': 'auto',
'SECURITY_VIEW_AUTH_NEED_MFA': True,
'SECURITY_MAX_IDLE_TIME': 30,
'SECURITY_MAX_SESSION_TIME': 24,
@@ -597,6 +599,7 @@ class Config(dict):
'USER_LOGIN_SINGLE_MACHINE_ENABLED': False,
'ONLY_ALLOW_EXIST_USER_AUTH': False,
'ONLY_ALLOW_AUTH_FROM_SOURCE': False,
+ 'PRIVACY_MODE': False,
# 用户登录限制的规则
'SECURITY_LOGIN_LIMIT_COUNT': 7,
'SECURITY_LOGIN_LIMIT_TIME': 30,
@@ -662,8 +665,8 @@ class Config(dict):
'TERMINAL_TELNET_REGEX': '',
# 导航栏 帮助
- 'HELP_DOCUMENT_URL': 'https://docs.jumpserver.org/zh/v3/',
- 'HELP_SUPPORT_URL': 'https://www.jumpserver.org/support/',
+ 'HELP_DOCUMENT_URL': 'https://jumpserver.com/docs',
+ 'HELP_SUPPORT_URL': 'https://www.lxware.hk/pages/about',
'FORGOT_PASSWORD_URL': '',
'HEALTH_CHECK_TOKEN': '',
@@ -695,6 +698,7 @@ class Config(dict):
'FILE_UPLOAD_SIZE_LIMIT_MB': 200,
'TICKET_APPLY_ASSET_SCOPE': 'all',
+ 'LEAK_PASSWORD_DB_PATH': os.path.join(PROJECT_DIR, 'data', 'leak_password.db'),
# Ansible Receptor
'RECEPTOR_ENABLED': False,
diff --git a/apps/jumpserver/settings/auth.py b/apps/jumpserver/settings/auth.py
index e69471dd4..20cd31b1a 100644
--- a/apps/jumpserver/settings/auth.py
+++ b/apps/jumpserver/settings/auth.py
@@ -42,6 +42,7 @@ AUTH_LDAP_CONNECTION_OPTIONS = {
ldap.OPT_TIMEOUT: CONFIG.AUTH_LDAP_CONNECT_TIMEOUT,
ldap.OPT_NETWORK_TIMEOUT: CONFIG.AUTH_LDAP_CONNECT_TIMEOUT
}
+AUTH_LDAP_STRICT_SYNC = CONFIG.AUTH_LDAP_STRICT_SYNC
AUTH_LDAP_CACHE_TIMEOUT = CONFIG.AUTH_LDAP_CACHE_TIMEOUT
AUTH_LDAP_ALWAYS_UPDATE_USER = True
@@ -80,6 +81,7 @@ AUTH_LDAP_HA_CONNECTION_OPTIONS = {
ldap.OPT_TIMEOUT: CONFIG.AUTH_LDAP_HA_CONNECT_TIMEOUT,
ldap.OPT_NETWORK_TIMEOUT: CONFIG.AUTH_LDAP_HA_CONNECT_TIMEOUT
}
+AUTH_LDAP_HA_STRICT_SYNC = CONFIG.AUTH_LDAP_HA_STRICT_SYNC
AUTH_LDAP_HA_CACHE_TIMEOUT = CONFIG.AUTH_LDAP_HA_CACHE_TIMEOUT
AUTH_LDAP_HA_ALWAYS_UPDATE_USER = True
@@ -325,9 +327,10 @@ MFA_BACKEND_OTP = 'authentication.mfa.otp.MFAOtp'
MFA_BACKEND_FACE = 'authentication.mfa.face.MFAFace'
MFA_BACKEND_RADIUS = 'authentication.mfa.radius.MFARadius'
MFA_BACKEND_SMS = 'authentication.mfa.sms.MFASms'
+MFA_BACKEND_EMAIL = 'authentication.mfa.email.MFAEmail'
MFA_BACKEND_CUSTOM = 'authentication.mfa.custom.MFACustom'
-MFA_BACKENDS = [MFA_BACKEND_OTP, MFA_BACKEND_RADIUS, MFA_BACKEND_SMS, MFA_BACKEND_FACE]
+MFA_BACKENDS = [MFA_BACKEND_OTP, MFA_BACKEND_RADIUS, MFA_BACKEND_SMS, MFA_BACKEND_FACE, MFA_BACKEND_EMAIL]
MFA_CUSTOM = CONFIG.MFA_CUSTOM
MFA_CUSTOM_FILE_MD5 = CONFIG.MFA_CUSTOM_FILE_MD5
@@ -345,5 +348,6 @@ AUTHENTICATION_BACKENDS_THIRD_PARTY = [
]
ONLY_ALLOW_EXIST_USER_AUTH = CONFIG.ONLY_ALLOW_EXIST_USER_AUTH
ONLY_ALLOW_AUTH_FROM_SOURCE = CONFIG.ONLY_ALLOW_AUTH_FROM_SOURCE
+PRIVACY_MODE = CONFIG.PRIVACY_MODE
SAML_FOLDER = os.path.join(BASE_DIR, 'authentication', 'backends', 'saml2')
diff --git a/apps/jumpserver/settings/custom.py b/apps/jumpserver/settings/custom.py
index f0ff095b1..49bdc7366 100644
--- a/apps/jumpserver/settings/custom.py
+++ b/apps/jumpserver/settings/custom.py
@@ -34,6 +34,7 @@ FTP_FILE_MAX_STORE = CONFIG.FTP_FILE_MAX_STORE
# Security settings
SECURITY_MFA_AUTH = CONFIG.SECURITY_MFA_AUTH
SECURITY_MFA_AUTH_ENABLED_FOR_THIRD_PARTY = CONFIG.SECURITY_MFA_AUTH_ENABLED_FOR_THIRD_PARTY
+SECURITY_MFA_BY_EMAIL = CONFIG.SECURITY_MFA_BY_EMAIL
SECURITY_MAX_IDLE_TIME = CONFIG.SECURITY_MAX_IDLE_TIME # Unit: minute
SECURITY_MAX_SESSION_TIME = CONFIG.SECURITY_MAX_SESSION_TIME # Unit: hour
SECURITY_COMMAND_EXECUTION = CONFIG.SECURITY_COMMAND_EXECUTION
diff --git a/apps/jumpserver/settings/libs.py b/apps/jumpserver/settings/libs.py
index d705939e6..70eee17e6 100644
--- a/apps/jumpserver/settings/libs.py
+++ b/apps/jumpserver/settings/libs.py
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
#
import os
-
+import time
from .base import (
REDIS_SSL_CA, REDIS_SSL_CERT, REDIS_SSL_KEY, REDIS_SSL_REQUIRED, REDIS_USE_SSL,
REDIS_PROTOCOL, REDIS_SENTINEL_SERVICE_NAME, REDIS_SENTINELS, REDIS_SENTINEL_PASSWORD,
@@ -197,3 +197,5 @@ PIICO_DEVICE_ENABLE = CONFIG.PIICO_DEVICE_ENABLE
PIICO_DRIVER_PATH = CONFIG.PIICO_DRIVER_PATH
LEAK_PASSWORD_DB_PATH = CONFIG.LEAK_PASSWORD_DB_PATH
+
+JUMPSERVER_UPTIME = int(time.time())
diff --git a/apps/jumpserver/settings/logging.py b/apps/jumpserver/settings/logging.py
index 23d15d970..289f4fa4f 100644
--- a/apps/jumpserver/settings/logging.py
+++ b/apps/jumpserver/settings/logging.py
@@ -121,8 +121,8 @@ LOGGING = {
if CONFIG.DEBUG_DEV:
LOGGING['loggers']['django.db'] = {
- 'handlers': ['console', 'file'],
- 'level': 'DEBUG'
+ 'handlers': ['console', 'file'],
+ 'level': 'DEBUG'
}
SYSLOG_ENABLE = CONFIG.SYSLOG_ENABLE
@@ -138,4 +138,3 @@ if CONFIG.SYSLOG_ADDR != '' and len(CONFIG.SYSLOG_ADDR.split(':')) == 2:
if not os.path.isdir(LOG_DIR):
os.makedirs(LOG_DIR, mode=0o755)
-
diff --git a/apps/jumpserver/urls.py b/apps/jumpserver/urls.py
index 881d5c57a..2cc8e02d1 100644
--- a/apps/jumpserver/urls.py
+++ b/apps/jumpserver/urls.py
@@ -2,6 +2,7 @@
from __future__ import unicode_literals
import os
+import uuid
import private_storage.urls
from django.conf import settings
@@ -74,12 +75,19 @@ urlpatterns += [
path('core/jsi18n/', JavaScriptCatalog.as_view(), name='javascript-catalog'),
]
+DOC_TTL = 60 * 60
+DOC_VERSION = uuid.uuid4().hex
+cache_kwargs = {
+ 'cache_timeout': DOC_TTL,
+ 'cache_kwargs': {
+ 'key_prefix': 'swagger-cache-' + DOC_VERSION,
+ },
+}
# docs 路由
urlpatterns += [
- re_path('^api/swagger(?P\.json|\.yaml)$',
- views.get_swagger_view().without_ui(cache_timeout=1), name='schema-json'),
- re_path('api/docs/?', views.get_swagger_view().with_ui('swagger', cache_timeout=1), name="docs"),
- re_path('api/redoc/?', views.get_swagger_view().with_ui('redoc', cache_timeout=1), name='redoc'),
+ path('api/swagger.', views.get_swagger_view(False).without_ui(**cache_kwargs), name='schema-json'),
+ re_path('api/docs/?', views.get_swagger_view().with_ui('swagger', **cache_kwargs), name="docs"),
+ re_path('api/redoc/?', views.get_swagger_view().with_ui('redoc', **cache_kwargs), name='redoc'),
]
if os.environ.get('DEBUG_TOOLBAR', False):
diff --git a/apps/jumpserver/views/other.py b/apps/jumpserver/views/other.py
index cd5da8a61..200d44802 100644
--- a/apps/jumpserver/views/other.py
+++ b/apps/jumpserver/views/other.py
@@ -102,7 +102,7 @@ class ResourceDownload(TemplateView):
OPENSSH_VERSION=v9.4.0.0
TINKER_VERSION=v0.1.6
VIDEO_PLAYER_VERSION=0.2.0
- CLIENT_VERSION=v3.0.1
+ CLIENT_VERSION=v3.0.3
"""
def get_meta_json(self):
diff --git a/apps/jumpserver/views/swagger.py b/apps/jumpserver/views/swagger.py
index 5a18b30f1..5ca1dd330 100644
--- a/apps/jumpserver/views/swagger.py
+++ b/apps/jumpserver/views/swagger.py
@@ -1,8 +1,60 @@
-from drf_yasg.inspectors import SwaggerAutoSchema
-
-from rest_framework import permissions
-from drf_yasg.views import get_schema_view
from drf_yasg import openapi
+from drf_yasg.generators import OpenAPISchemaGenerator
+from drf_yasg.inspectors import SwaggerAutoSchema
+from drf_yasg.views import get_schema_view
+from rest_framework import permissions
+
+
+class CustomSchemaGenerator(OpenAPISchemaGenerator):
+ from_mcp = False
+
+ def get_schema(self, request=None, public=False):
+ self.from_mcp = request.query_params.get('mcp') or request.path.endswith('swagger.json')
+ return super().get_schema(request, public)
+
+ @staticmethod
+ def exclude_some_paths(path):
+ # 这里可以对 paths 进行处理
+ excludes = [
+ '/report/', '/render-to-json/', '/suggestions/',
+ 'executions', 'automations', 'change-secret-records',
+ 'change-secret-dashboard', '/copy-to-assets/',
+ '/move-to-assets/', 'dashboard',
+
+ ]
+ for p in excludes:
+ if path.find(p) >= 0:
+ return True
+ return False
+
+ def exclude_some_app(self, path):
+ parts = path.split('/')
+ if len(parts) < 4:
+ return False
+
+ apps = []
+ if self.from_mcp:
+ apps = [
+ 'ops', 'tickets', 'common', 'authentication',
+ 'settings', 'xpack', 'terminal', 'rbac'
+ ]
+
+ app_name = parts[3]
+ if app_name in apps:
+ return True
+ return False
+
+ def get_operation(self, view, path, prefix, method, components, request):
+ # 这里可以对 path 进行处理
+ if self.exclude_some_paths(path):
+ return None
+ if self.exclude_some_app(path):
+ return None
+ operation = super().get_operation(view, path, prefix, method, components, request)
+ operation_id = operation.get('operationId')
+ if 'bulk' in operation_id:
+ return None
+ return operation
class CustomSwaggerAutoSchema(SwaggerAutoSchema):
@@ -53,23 +105,31 @@ api_info = openapi.Info(
title="JumpServer API Docs",
default_version='v1',
description="JumpServer Restful api docs",
- terms_of_service="https://www.jumpserver.org",
- contact=openapi.Contact(email="support@fit2cloud.com"),
+ terms_of_service="https://www.jumpserver.com",
+ contact=openapi.Contact(email="support@lxware.hk"),
license=openapi.License(name="GPLv3 License"),
)
-def get_swagger_view(version='v1'):
+def get_swagger_view(with_auth=True):
from ..urls import api_v1
from django.urls import path, include
- api_v1_patterns = [
+ patterns = [
path('api/v1/', include(api_v1))
]
- patterns = api_v1_patterns
+
+ if with_auth:
+ permission_classes = (permissions.IsAuthenticated,)
+ public = False
+ else:
+ permission_classes = []
+ public = True
+
schema_view = get_schema_view(
api_info,
+ public=public,
patterns=patterns,
- permission_classes=(permissions.IsAuthenticated,),
+ generator_class=CustomSchemaGenerator,
+ permission_classes=permission_classes
)
return schema_view
-
diff --git a/apps/ops/ansible/inventory.py b/apps/ops/ansible/inventory.py
index 2a5153c5a..164b44298 100644
--- a/apps/ops/ansible/inventory.py
+++ b/apps/ops/ansible/inventory.py
@@ -7,6 +7,8 @@ from collections import defaultdict
from django.utils.translation import gettext as _
+from assets import const
+
__all__ = ['JMSInventory']
@@ -38,6 +40,12 @@ class JMSInventory:
.prefetch_related('platform', 'domain', 'accounts')
return assets
+ @staticmethod
+ def get_username(asset, account):
+ if asset.category == const.Category.DS:
+ return account.full_username
+ return account.username
+
@staticmethod
def group_by_platform(assets):
groups = defaultdict(list)
@@ -76,10 +84,10 @@ class JMSInventory:
proxy_command = f"-o ProxyCommand='{' '.join(proxy_command_list)}'"
return {"ansible_ssh_common_args": proxy_command}
- @staticmethod
- def make_account_ansible_vars(account, path_dir):
+ def make_account_ansible_vars(self, asset, account, path_dir):
+ username = self.get_username(asset, account)
var = {
- 'ansible_user': account.username,
+ 'ansible_user': username,
}
if not account.secret:
return var
@@ -111,7 +119,8 @@ class JMSInventory:
setting = getattr(p, 'setting')
host['old_ssh_version'] = setting.get('old_ssh_version', False)
- def make_account_vars(self, host, asset, account, automation, protocol, platform, gateway, path_dir):
+ def make_account_vars(self, host, asset, account, automation, protocol, platform, gateway, path_dir,
+ ansible_config):
from accounts.const import AutomationTypes
if not account:
host['error'] = _("No account available")
@@ -128,12 +137,13 @@ class JMSInventory:
host.update(self.make_custom_become_ansible_vars(account, su_from_auth, path_dir))
elif platform.su_enabled and not su_from and \
self.task_type in (AutomationTypes.change_secret, AutomationTypes.push_account):
- host.update(self.make_account_ansible_vars(account, path_dir))
- host['ansible_become'] = True
+ host.update(self.make_account_ansible_vars(asset, account, path_dir))
+ if platform.type not in ["windows", "windows_ad"]:
+ host['ansible_become'] = True
host['ansible_become_user'] = 'root'
host['ansible_become_password'] = account.escape_jinja2_syntax(account.secret)
else:
- host.update(self.make_account_ansible_vars(account, path_dir))
+ host.update(self.make_account_ansible_vars(asset, account, path_dir))
if platform.is_huawei():
host['ansible_connection'] = 'network_cli'
@@ -180,6 +190,12 @@ class JMSInventory:
return ansible_config
def asset_to_host(self, asset, account, automation, protocols, platform, path_dir):
+ name = re.sub(r'[ \[\]/]', '_', asset.name)
+ host = {'name': name}
+ if account is None:
+ host['error'] = _('No account available')
+ return host
+
try:
ansible_config = dict(automation.ansible_config)
except (AttributeError, TypeError):
@@ -188,10 +204,10 @@ class JMSInventory:
protocol = self.get_primary_protocol(ansible_config, protocols)
tp, category = asset.type, asset.category
- name = re.sub(r'[ \[\]/]', '_', asset.name)
+
secret_info = {k: v for k, v in asset.secret_info.items() if v}
- host = {
- 'name': name,
+ username = self.get_username(asset, account)
+ host.update({
'local_python_interpreter': sys.executable,
'jms_asset': {
'id': str(asset.id), 'name': asset.name, 'address': asset.address,
@@ -202,11 +218,12 @@ class JMSInventory:
'origin_address': asset.address
},
'jms_account': {
- 'id': str(account.id), 'username': account.username,
+ 'id': str(account.id),
+ 'username': username,
'secret': account.escape_jinja2_syntax(account.secret),
'secret_type': account.secret_type, 'private_key_path': account.get_private_key_path(path_dir)
} if account else None
- }
+ })
self.make_protocol_setting_vars(host, protocols)
@@ -223,7 +240,7 @@ class JMSInventory:
gateway = asset.domain.select_gateway()
self.make_account_vars(
- host, asset, account, automation, protocol, platform, gateway, path_dir
+ host, asset, account, automation, protocol, platform, gateway, path_dir, ansible_config
)
return host
@@ -235,7 +252,7 @@ class JMSInventory:
return accounts_sorted
def get_asset_sorted_accounts(self, asset):
- accounts = list(asset.accounts.filter(is_active=True))
+ accounts = list(asset.all_accounts.filter(is_active=True))
accounts_sorted = self.sorted_accounts(accounts)
return accounts_sorted
@@ -281,6 +298,51 @@ class JMSInventory:
setattr(p, 'setting', platform_protocols.get(p.name, {}))
return asset_protocols
+ def get_classified_hosts(self, path_dir):
+ hosts = []
+ platform_assets = self.group_by_platform(self.assets)
+ runnable_hosts = []
+ error_hosts = []
+
+ for platform, assets in platform_assets.items():
+ automation = platform.automation
+ platform_protocols = {
+ p['name']: p['setting'] for p in platform.protocols.values('name', 'setting')
+ }
+ for asset in assets:
+ protocols = self.set_platform_protocol_setting_to_asset(asset, platform_protocols)
+ account = self.select_account(asset)
+ host = self.asset_to_host(asset, account, automation, protocols, platform, path_dir)
+
+ if not automation.ansible_enabled:
+ host['error'] = _('Ansible disabled')
+
+ if isinstance(host, list):
+ hosts.extend(host)
+ else:
+ hosts.append(host)
+
+ # 分类主机
+ for host in hosts:
+ if host.get('error'):
+ self.exclude_hosts[host['name']] = host['error']
+ error_hosts.append({
+ 'name': host['name'],
+ 'id': host.get('jms_asset', {}).get('id'),
+ 'error': host['error']
+ })
+ else:
+ runnable_hosts.append({
+ 'name': host['name'],
+ 'ip': host.get('ansible_host', ''),
+ 'id': host.get('jms_asset', {}).get('id')
+ })
+ result = {
+ 'runnable': runnable_hosts,
+ 'error': error_hosts,
+ }
+ return result
+
def generate(self, path_dir):
hosts = []
platform_assets = self.group_by_platform(self.assets)
diff --git a/apps/ops/api/adhoc.py b/apps/ops/api/adhoc.py
index d9eb35a51..6a153b83a 100644
--- a/apps/ops/api/adhoc.py
+++ b/apps/ops/api/adhoc.py
@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
from django.db.models import Q
-from django.utils.translation import gettext_lazy as _
from common.api.generic import JMSBulkModelViewSet
+from common.permissions import IsOwnerOrAdminWritable
from common.utils.http import is_true
from rbac.permissions import RBACPermission
from ..const import Scope
@@ -17,7 +17,7 @@ __all__ = [
class AdHocViewSet(JMSBulkModelViewSet):
queryset = AdHoc.objects.all()
serializer_class = AdHocSerializer
- permission_classes = (RBACPermission,)
+ permission_classes = (RBACPermission, IsOwnerOrAdminWritable)
search_fields = ('name', 'comment')
filterset_fields = ['scope', 'creator']
@@ -26,13 +26,6 @@ class AdHocViewSet(JMSBulkModelViewSet):
self.check_object_permissions(self.request, obj)
return True
- def check_object_permissions(self, request, obj):
- if request.method != 'GET' and obj.creator != request.user:
- self.permission_denied(
- request, message={"detail": _("Deleting other people's script is not allowed")}
- )
- return super().check_object_permissions(request, obj)
-
def get_queryset(self):
queryset = super().get_queryset()
user = self.request.user
diff --git a/apps/ops/api/job.py b/apps/ops/api/job.py
index d257d2209..23add9baa 100644
--- a/apps/ops/api/job.py
+++ b/apps/ops/api/job.py
@@ -1,5 +1,6 @@
import json
import os
+import uuid
from celery.result import AsyncResult
from django.conf import settings
@@ -18,14 +19,15 @@ from common.const.http import POST
from common.permissions import IsValidUser
from ops.celery import app
from ops.const import Types
-from ops.models import Job, JobExecution
+from ops.models import Job, JobExecution, JMSPermedInventory
from ops.serializers.job import (
JobSerializer, JobExecutionSerializer, FileSerializer, JobTaskStopSerializer
)
from ops.utils import merge_nodes_and_assets
__all__ = [
- 'JobViewSet', 'JobExecutionViewSet', 'JobRunVariableHelpAPIView', 'JobExecutionTaskDetail', 'UsernameHintsAPI'
+ 'JobViewSet', 'JobExecutionViewSet', 'JobRunVariableHelpAPIView', 'JobExecutionTaskDetail', 'UsernameHintsAPI',
+ 'ClassifiedHostsAPI'
]
from ops.tasks import run_ops_job_execution
@@ -309,3 +311,28 @@ class UsernameHintsAPI(APIView):
.annotate(total=Count('username')) \
.order_by('-total', '-username')[:10]
return Response(data=top_accounts)
+
+
+class ClassifiedHostsAPI(APIView):
+ permission_classes = [IsValidUser]
+
+ def post(self, request, **kwargs):
+ asset_ids = request.data.get('assets', [])
+ node_ids = request.data.get('nodes', [])
+ runas_policy = request.data.get('runas_policy', 'privileged_first')
+ account_prefer = request.data.get('runas', 'root,Administrator')
+ module = request.data.get('module', 'shell')
+ assets = list(Asset.objects.filter(id__in=asset_ids).all())
+ tmp_dir = os.path.join(settings.PROJECT_DIR, 'inventory', str(uuid.uuid4()))
+ os.makedirs(tmp_dir, exist_ok=True)
+ inventory = JMSPermedInventory(
+ assets=assets,
+ nodes=node_ids,
+ module=module,
+ account_policy=runas_policy,
+ account_prefer=account_prefer,
+ user=self.request.user
+ )
+ classified_hosts = inventory.get_classified_hosts(tmp_dir)
+
+ return Response(data=classified_hosts)
diff --git a/apps/ops/api/playbook.py b/apps/ops/api/playbook.py
index 292f8bd87..cec43e593 100644
--- a/apps/ops/api/playbook.py
+++ b/apps/ops/api/playbook.py
@@ -11,6 +11,7 @@ from rest_framework import status
from common.api.generic import JMSBulkModelViewSet
from common.exceptions import JMSException
+from common.permissions import IsOwnerOrAdminWritable
from common.utils.http import is_true
from rbac.permissions import RBACPermission
from ..const import Scope
@@ -33,7 +34,7 @@ def unzip_playbook(src, dist):
class PlaybookViewSet(JMSBulkModelViewSet):
serializer_class = PlaybookSerializer
- permission_classes = (RBACPermission,)
+ permission_classes = (RBACPermission, IsOwnerOrAdminWritable)
queryset = Playbook.objects.all()
search_fields = ('name', 'comment')
filterset_fields = ['scope', 'creator']
@@ -43,13 +44,6 @@ class PlaybookViewSet(JMSBulkModelViewSet):
self.check_object_permissions(self.request, obj)
return True
- def check_object_permissions(self, request, obj):
- if request.method != 'GET' and obj.creator != request.user:
- self.permission_denied(
- request, message={"detail": _("Deleting other people's playbook is not allowed")}
- )
- return super().check_object_permissions(request, obj)
-
def perform_destroy(self, instance):
if instance.job_set.exists():
raise JMSException(code='playbook_has_job', detail={"msg": _("Currently playbook is being used in a job")})
diff --git a/apps/ops/mixin.py b/apps/ops/mixin.py
index 1c8d1cff6..ab9149abe 100644
--- a/apps/ops/mixin.py
+++ b/apps/ops/mixin.py
@@ -188,6 +188,10 @@ class PeriodTaskSerializerMixin(serializers.Serializer):
if isinstance(crontab, str) and len(crontab.strip().split()) != 5:
msg = _('* Please enter a valid crontab expression')
raise serializers.ValidationError(msg)
+
+ crontab = crontab.strip()
+ if crontab.startswith('*'):
+ raise serializers.ValidationError(_("Crontab minute must not contain '*'"))
return crontab
def validate_interval(self, interval):
diff --git a/apps/ops/models/job.py b/apps/ops/models/job.py
index 673548f75..748bdb9ad 100644
--- a/apps/ops/models/job.py
+++ b/apps/ops/models/job.py
@@ -1,11 +1,11 @@
import json
import logging
import os
-import sys
import uuid
from collections import defaultdict
from datetime import timedelta
+import sys
from celery import current_task
from django.conf import settings
from django.db import models
@@ -63,7 +63,8 @@ class JMSPermedInventory(JMSInventory):
self.module = module
self.assets_accounts_mapper = self.get_assets_accounts_mapper()
- def make_account_vars(self, host, asset, account, automation, protocol, platform, gateway, path_dir):
+ def make_account_vars(self, host, asset, account, automation, protocol, platform, gateway, path_dir,
+ ansible_config):
if not account:
host['error'] = _("No account available")
return host
@@ -78,7 +79,7 @@ class JMSPermedInventory(JMSInventory):
}
if self.module not in protocol_supported_modules_mapping.get(protocol.name, []):
- host['error'] = "Module {} is not suitable for this asset".format(self.module)
+ host['error'] = _("Module {} is not suitable for this asset").format(self.module)
return host
if protocol.name in ('mariadb', 'mysql', 'postgresql', 'sqlserver'):
@@ -96,7 +97,8 @@ class JMSPermedInventory(JMSInventory):
}
host['jms_asset']['port'] = protocol.port
return host
- return super().make_account_vars(host, asset, account, automation, protocol, platform, gateway, path_dir)
+ return super().make_account_vars(host, asset, account, automation, protocol, platform, gateway, path_dir,
+ ansible_config)
def get_asset_sorted_accounts(self, asset):
accounts = self.assets_accounts_mapper.get(asset.id, [])
diff --git a/apps/ops/serializers/job.py b/apps/ops/serializers/job.py
index 0864b62d9..a184d63eb 100644
--- a/apps/ops/serializers/job.py
+++ b/apps/ops/serializers/job.py
@@ -54,7 +54,7 @@ class JobSerializer(BulkOrgResourceModelSerializer, PeriodTaskSerializerMixin, W
class Meta:
model = Job
read_only_fields = [
- "id", "date_last_run", "date_created",
+ "id", "date_last_run", "date_created", "periodic_display",
"date_updated", "average_time_cost", "created_by", "material"
]
fields_m2m = ['variable']
diff --git a/apps/ops/urls/api_urls.py b/apps/ops/urls/api_urls.py
index 12801b1a3..4cd182f4e 100644
--- a/apps/ops/urls/api_urls.py
+++ b/apps/ops/urls/api_urls.py
@@ -28,6 +28,7 @@ urlpatterns = [
path('job-execution/task-detail//', api.JobExecutionTaskDetail.as_view(), name='task-detail'),
path('username-hints/', api.UsernameHintsAPI.as_view(), name='username-hints'),
path('ansible/job-execution//log/', api.AnsibleTaskLogApi.as_view(), name='job-execution-log'),
+ path('classified-hosts/', api.ClassifiedHostsAPI.as_view(), name='classified-hosts'),
path('celery/task//task-execution//log/', api.CeleryTaskExecutionLogApi.as_view(),
name='celery-task-execution-log'),
diff --git a/apps/perms/api/asset_permission_relation.py b/apps/perms/api/asset_permission_relation.py
index 5a97192e0..c00870a6c 100644
--- a/apps/perms/api/asset_permission_relation.py
+++ b/apps/perms/api/asset_permission_relation.py
@@ -2,17 +2,16 @@
#
from functools import lru_cache
-from rest_framework import generics
from django.db.models import F
from django.shortcuts import get_object_or_404
+from rest_framework import generics
-from orgs.mixins.api import OrgRelationMixin
-from orgs.mixins.api import OrgBulkModelViewSet
-from orgs.utils import current_org
-from perms import serializers
-from perms import models
-from perms.utils import AssetPermissionPermAssetUtil
from accounts.serializers import AccountSerializer
+from orgs.mixins.api import OrgRelationMixin, OrgBulkModelViewSet
+from orgs.utils import current_org
+from perms import models
+from perms import serializers
+from perms.utils import AssetPermissionPermAssetUtil
__all__ = [
'AssetPermissionUserRelationViewSet', 'AssetPermissionUserGroupRelationViewSet',
@@ -24,6 +23,7 @@ __all__ = [
class RelationMixin(OrgRelationMixin, OrgBulkModelViewSet):
perm_model = models.AssetPermission
+ http_method_names = ['get', 'post', 'delete']
def get_queryset(self):
queryset = super().get_queryset()
diff --git a/apps/perms/serializers/permission.py b/apps/perms/serializers/permission.py
index 2cd16fbdb..82914b35d 100644
--- a/apps/perms/serializers/permission.py
+++ b/apps/perms/serializers/permission.py
@@ -132,6 +132,9 @@ class AssetPermissionSerializer(ResourceLabelsMixin, BulkOrgResourceModelSeriali
def create_account_through_template(self, nodes, assets):
if not self.template_accounts:
return
+ if self.instance:
+ assets = assets or self.instance.assets.all()
+ nodes = nodes or self.instance.nodes.all()
assets = self.get_all_assets(nodes, assets)
self.create_accounts(assets)
@@ -152,7 +155,7 @@ class AssetPermissionSerializer(ResourceLabelsMixin, BulkOrgResourceModelSeriali
"""Perform necessary eager loading of data."""
queryset = queryset.prefetch_related(
"users", "user_groups", "assets", "nodes",
- ).prefetch_related('labels', 'labels__label')
+ )
return queryset
@staticmethod
@@ -209,7 +212,6 @@ class AssetPermissionListSerializer(AssetPermissionSerializer):
def setup_eager_loading(cls, queryset):
"""Perform necessary eager loading of data."""
queryset = queryset \
- .prefetch_related('labels', 'labels__label') \
.annotate(users_amount=Count("users", distinct=True),
user_groups_amount=Count("user_groups", distinct=True),
assets_amount=Count("assets", distinct=True),
diff --git a/apps/perms/serializers/user_permission.py b/apps/perms/serializers/user_permission.py
index 1d108bb92..c1a2ecaa4 100644
--- a/apps/perms/serializers/user_permission.py
+++ b/apps/perms/serializers/user_permission.py
@@ -40,7 +40,7 @@ class AssetPermedSerializer(OrgResourceModelSerializerMixin, ResourceLabelsMixin
@classmethod
def setup_eager_loading(cls, queryset):
""" Perform necessary eager loading of data. """
- queryset = queryset.prefetch_related('domain', 'nodes', 'labels') \
+ queryset = queryset.prefetch_related('domain', 'nodes') \
.prefetch_related('platform') \
.annotate(category=F("platform__category")) \
.annotate(type=F("platform__type"))
@@ -59,6 +59,7 @@ class NodePermedSerializer(serializers.ModelSerializer):
class AccountsPermedSerializer(serializers.ModelSerializer):
actions = ActionChoicesField(read_only=True)
+ username = serializers.CharField(source='full_username', read_only=True)
class Meta:
model = Account
diff --git a/apps/perms/signal_handlers/refresh_perms.py b/apps/perms/signal_handlers/refresh_perms.py
index 7220bceba..3d4708c79 100644
--- a/apps/perms/signal_handlers/refresh_perms.py
+++ b/apps/perms/signal_handlers/refresh_perms.py
@@ -8,7 +8,7 @@ from common.const.signals import POST_ADD, POST_REMOVE, POST_CLEAR
from common.exceptions import M2MReverseNotAllowed
from common.utils import get_logger, get_object_or_none
from perms.models import AssetPermission
-from perms.utils import UserPermTreeExpireUtil
+from perms.utils import UserPermTreeExpireUtil, UserPermAssetUtil
from users.models import User, UserGroup
logger = get_logger(__file__)
@@ -42,6 +42,7 @@ def on_user_groups_change(sender, instance, action, reverse, pk_set, **kwargs):
return
UserPermTreeExpireUtil().expire_perm_tree_for_users_orgs(user_ids, [org_id])
+ UserPermAssetUtil.refresh_type_nodes_tree_cache(user_ids)
@receiver([pre_delete], sender=AssetPermission)
@@ -96,6 +97,7 @@ def on_asset_permission_users_changed(sender, action, reverse, instance, pk_set,
return
user_ids = pk_set
UserPermTreeExpireUtil().expire_perm_tree_for_users_orgs(user_ids, [instance.org.id])
+ UserPermAssetUtil.refresh_type_nodes_tree_cache(user_ids)
@receiver(m2m_changed, sender=AssetPermission.user_groups.through)
diff --git a/apps/perms/utils/asset_perm.py b/apps/perms/utils/asset_perm.py
index f6d4ab2ca..d72a107fd 100644
--- a/apps/perms/utils/asset_perm.py
+++ b/apps/perms/utils/asset_perm.py
@@ -38,14 +38,14 @@ class PermAssetDetailUtil:
queryset = Asset.objects.filter(id=self.asset_id)
return queryset.get()
- def validate_permission(self, account_name, protocol):
+ def validate_permission(self, account_alias, protocol):
with tmp_to_org(self.asset.org):
protocols = self.get_permed_protocols_for_user(only_name=True)
if 'all' not in protocols and protocol not in protocols:
return None
permed_accounts = self.get_permed_accounts_for_user()
accounts_mapper = {account.alias: account for account in permed_accounts}
- account = accounts_mapper.get(account_name)
+ account = accounts_mapper.get(account_alias)
return account
@lazyproperty
@@ -88,7 +88,7 @@ class PermAssetDetailUtil:
if not all_action_bit:
return alias_action_bit_mapper, alias_date_expired_mapper
- asset_account_usernames = asset.accounts.all().active().values_list('username', flat=True)
+ asset_account_usernames = asset.all_valid_accounts.values_list('username', flat=True)
for username in asset_account_usernames:
alias_action_bit_mapper[username] |= all_action_bit
alias_date_expired_mapper[username].extend(
@@ -100,7 +100,7 @@ class PermAssetDetailUtil:
def map_alias_to_accounts(cls, alias_action_bit_mapper, alias_date_expired_mapper, asset, user):
username_accounts_mapper = defaultdict(list)
cleaned_accounts_expired = defaultdict(list)
- asset_accounts = asset.accounts.all().active()
+ asset_accounts = asset.all_valid_accounts.all()
# 用户名 -> 账号
for account in asset_accounts:
@@ -135,11 +135,18 @@ class PermAssetDetailUtil:
alias_action_bit_mapper, alias_date_expired_mapper, asset, user
)
accounts = []
+ virtual_accounts = []
for account, action_bit in cleaned_accounts_action_bit.items():
account.actions = action_bit
account.date_expired = max(cleaned_accounts_expired[account])
- accounts.append(account)
- return accounts
+
+ if account.username.startswith('@'):
+ virtual_accounts.append(account)
+ else:
+ accounts.append(account)
+ accounts.sort(key=lambda x: x.username)
+ virtual_accounts.sort(key=lambda x: x.username)
+ return accounts + virtual_accounts
def check_perm_protocols(self, protocols):
"""
diff --git a/apps/perms/utils/user_perm.py b/apps/perms/utils/user_perm.py
index add9d8baf..80a3fa5b5 100644
--- a/apps/perms/utils/user_perm.py
+++ b/apps/perms/utils/user_perm.py
@@ -4,12 +4,13 @@ import re
from django.conf import settings
from django.core.cache import cache
from django.db.models import Q
+from django.utils.translation import get_language
from rest_framework.utils.encoders import JSONEncoder
from assets.const import AllTypes
from assets.models import FavoriteAsset, Asset, Node
from common.utils.common import timeit, get_logger
-from orgs.utils import current_org
+from orgs.utils import current_org, get_current_org_id
from perms.models import PermNode, UserAssetGrantedTreeNodeRelation, AssetPermission
from .permission import AssetPermissionUtil
@@ -93,7 +94,8 @@ class UserPermAssetUtil(AssetPermissionPermAssetUtil):
@classmethod
def get_type_nodes_tree_or_cached(cls, user):
- key = f'perms:type-nodes-tree:{user.id}:{current_org.id}'
+ lang = get_language()
+ key = f'perms:type-nodes-tree:{user.id}:{current_org.id}:{lang}'
nodes = cache.get(key)
if nodes is None:
nodes = cls(user).get_type_nodes_tree()
@@ -103,10 +105,18 @@ class UserPermAssetUtil(AssetPermissionPermAssetUtil):
nodes = json.loads(nodes)
return nodes
- def refresh_type_nodes_tree_cache(self):
+ @classmethod
+ def refresh_type_nodes_tree_cache(cls, user_ids=None, org_id=None):
+ if user_ids is None:
+ user_ids = []
+
+ if org_id is None:
+ org_id = get_current_org_id()
+
logger.debug("Refresh type nodes tree cache")
- key = f'perms:type-nodes-tree:{self.user.id}:{current_org.id}'
- cache.delete(key)
+ for user_id in user_ids:
+ key = f'perms:type-nodes-tree:{user_id}:{org_id}*'
+ cache.delete_pattern(key)
def refresh_favorite_assets(self):
favor_ids = FavoriteAsset.objects.filter(user=self.user).values_list('asset_id', flat=True)
diff --git a/apps/perms/utils/user_perm_tree.py b/apps/perms/utils/user_perm_tree.py
index f89f5cd46..2740d3578 100644
--- a/apps/perms/utils/user_perm_tree.py
+++ b/apps/perms/utils/user_perm_tree.py
@@ -182,6 +182,7 @@ class UserPermTreeExpireUtil(_UserPermTreeCacheMixin):
for org_id, perms_id in org_perms_mapper.items():
user_ids = AssetPermission.get_all_users_for_perms(perm_ids, flat=True)
self.expire_perm_tree_for_users_orgs(user_ids, [org_id])
+ UserPermAssetUtil.refresh_type_nodes_tree_cache(user_ids, org_id)
def expire_perm_tree_for_user_group(self, user_group):
group_ids = [user_group.id]
@@ -193,6 +194,7 @@ class UserPermTreeExpireUtil(_UserPermTreeCacheMixin):
.filter(usergroup_id__in=group_ids) \
.values_list('user_id', flat=True).distinct()
self.expire_perm_tree_for_users_orgs(user_ids, org_ids)
+ UserPermAssetUtil.refresh_type_nodes_tree_cache(user_ids)
@on_transaction_commit
def expire_perm_tree_for_users_orgs(self, user_ids, org_ids):
@@ -232,7 +234,7 @@ def refresh_user_favorite_assets(users=()):
for user in users:
util = UserPermAssetUtil(user)
util.refresh_favorite_assets()
- util.refresh_type_nodes_tree_cache()
+ util.refresh_type_nodes_tree_cache([user.id])
class UserPermTreeBuildUtil(object):
diff --git a/apps/settings/api/settings.py b/apps/settings/api/settings.py
index 00e6bd873..dbbf57938 100644
--- a/apps/settings/api/settings.py
+++ b/apps/settings/api/settings.py
@@ -1,6 +1,5 @@
# -*- coding: utf-8 -*-
#
-import re
from django.conf import settings
from django.core.cache import cache
@@ -14,6 +13,7 @@ from rest_framework.views import APIView
from common.utils import get_logger
from jumpserver.conf import Config
from rbac.permissions import RBACPermission
+from users.models import User
from .. import serializers
from ..models import Setting
from ..signals import category_setting_updated
@@ -182,7 +182,7 @@ class SettingsApi(generics.RetrieveUpdateAPIView):
if hasattr(serializer, 'post_save'):
serializer.post_save()
self.send_signal(serializer)
- if self.request.query_params.get('category') == 'ldap':
+ if self.request.query_params.get('category') == User.Source.ldap.value:
self.clean_ldap_user_dn_cache()
@staticmethod
diff --git a/apps/settings/serializers/auth/ldap.py b/apps/settings/serializers/auth/ldap.py
index 767bbdeea..06a856c62 100644
--- a/apps/settings/serializers/auth/ldap.py
+++ b/apps/settings/serializers/auth/ldap.py
@@ -84,6 +84,10 @@ class LDAPSettingSerializer(LDAPSerializerMixin, serializers.Serializer):
min_value=1, max_value=300,
required=False, label=_('Connect timeout (s)'),
)
+ AUTH_LDAP_STRICT_SYNC = serializers.BooleanField(
+ required=False, label=_('Strict sync'),
+ help_text=_('In strict mode, users not found in LDAP will be disabled during full or automatic sync')
+ )
AUTH_LDAP_CACHE_TIMEOUT = serializers.IntegerField(
min_value=0, max_value=3600 * 24 * 30 * 12,
default=0,
diff --git a/apps/settings/serializers/auth/ldap_ha.py b/apps/settings/serializers/auth/ldap_ha.py
index 95cf3c5b9..3f3acd187 100644
--- a/apps/settings/serializers/auth/ldap_ha.py
+++ b/apps/settings/serializers/auth/ldap_ha.py
@@ -4,7 +4,6 @@ from rest_framework import serializers
from common.serializers.fields import EncryptedField
from .base import OrgListField
from .mixin import LDAPSerializerMixin
-from ops.mixin import PeriodTaskSerializerMixin
__all__ = ['LDAPHATestConfigSerializer', 'LDAPHASettingSerializer']
@@ -67,6 +66,10 @@ class LDAPHASettingSerializer(LDAPSerializerMixin, serializers.Serializer):
min_value=1, max_value=300,
required=False, label=_('Connect timeout (s)'),
)
+ AUTH_LDAP_HA_STRICT_SYNC = serializers.BooleanField(
+ required=False, label=_('Strict sync'),
+ help_text=_('In strict mode, users not found in LDAP will be disabled during full or automatic sync')
+ )
AUTH_LDAP_HA_CACHE_TIMEOUT = serializers.IntegerField(
min_value=0, max_value=3600 * 24 * 30 * 12,
default=0,
diff --git a/apps/settings/serializers/public.py b/apps/settings/serializers/public.py
index d1f428b86..d3a1b1761 100644
--- a/apps/settings/serializers/public.py
+++ b/apps/settings/serializers/public.py
@@ -71,6 +71,7 @@ class PrivateSettingSerializer(PublicSettingSerializer):
TOOL_USER_ENABLED = serializers.BooleanField()
DEFAULT_EXPIRED_YEARS = serializers.IntegerField()
+ PRIVACY_MODE = serializers.BooleanField()
class ServerInfoSerializer(serializers.Serializer):
diff --git a/apps/settings/serializers/security.py b/apps/settings/serializers/security.py
index 9cb972c0c..a6cc54000 100644
--- a/apps/settings/serializers/security.py
+++ b/apps/settings/serializers/security.py
@@ -124,6 +124,11 @@ class SecurityAuthSerializer(serializers.Serializer):
label=_('Third-party login MFA'),
help_text=_('The third-party login modes include OIDC, CAS, and SAML2'),
)
+ SECURITY_MFA_BY_EMAIL = serializers.BooleanField(
+ required=False, default=False,
+ label=_('MFA via Email'),
+ help_text=_('Email as a method for multi-factor authentication')
+ )
OTP_ISSUER_NAME = serializers.CharField(
required=False, max_length=16, label=_('OTP issuer name'),
)
@@ -189,7 +194,6 @@ class SecurityAuthSerializer(serializers.Serializer):
class SecuritySessionSerializer(serializers.Serializer):
SECURITY_WATERMARK_ENABLED = serializers.BooleanField(
required=True, label=_('Watermark'),
- help_text=_('Enabled, the web session and replay contains watermark information')
)
SECURITY_MAX_IDLE_TIME = serializers.IntegerField(
min_value=1, max_value=99999, required=False,
diff --git a/apps/settings/serializers/terminal.py b/apps/settings/serializers/terminal.py
index c9172b228..5d51425a4 100644
--- a/apps/settings/serializers/terminal.py
+++ b/apps/settings/serializers/terminal.py
@@ -18,14 +18,18 @@ class TerminalSettingSerializer(serializers.Serializer):
('25', '25'),
('50', '50'),
)
- SECURITY_SERVICE_ACCOUNT_REGISTRATION = serializers.BooleanField(
+ SECURITY_SERVICE_ACCOUNT_REGISTRATION = serializers.ChoiceField(
+ choices=[
+ ('auto', _('Auto(Enabled for the first 5 minutes after startup, then disabled.)')),
+ (True, _('Enable')), (False, _('Disable'))
+ ],
required=True, label=_('Registration'),
help_text=_(
"Allow component register, after all component setup, you should disable this for security"
)
)
TERMINAL_PASSWORD_AUTH = serializers.BooleanField(
- required=False, label=_("Password"),
+ required=False, label=_("Password"),
help_text=_(
'* Allow users to log in to the KoKo component via password authentication'
)
@@ -46,7 +50,7 @@ class TerminalSettingSerializer(serializers.Serializer):
PAGE_SIZE_CHOICES, required=False, label=_('Asset page size')
)
TERMINAL_MAGNUS_ENABLED = serializers.BooleanField(
- label="Magnus",
+ label="Magnus",
help_text=_(
'* You can individually configure the service address and port in the service endpoint'
'
'
diff --git a/apps/settings/tasks/ldap.py b/apps/settings/tasks/ldap.py
index b90394814..d779ab134 100644
--- a/apps/settings/tasks/ldap.py
+++ b/apps/settings/tasks/ldap.py
@@ -1,6 +1,5 @@
# coding: utf-8
import time
-
from celery import shared_task
from django.conf import settings
from django.utils.translation import gettext_lazy as _
@@ -24,7 +23,7 @@ __all__ = [
logger = get_logger(__file__)
-def sync_ldap_user(category='ldap'):
+def sync_ldap_user(category=User.Source.ldap.value):
LDAPSyncUtil(category=category).perform_sync()
@@ -33,7 +32,7 @@ def perform_import(category, util_server):
time_start_display = local_now_display()
logger.info(f"Start import {category} ldap user task")
- util_import = LDAPImportUtil()
+ util_import = LDAPImportUtil(category)
users = util_server.search()
if settings.XPACK_ENABLED:
@@ -44,12 +43,7 @@ def perform_import(category, util_server):
default_org = Organization.default()
orgs = list(set([Organization.get_instance(org_id, default=default_org) for org_id in org_ids]))
- new_users, errors = util_import.perform_import(users, orgs)
-
- if errors:
- logger.error(f"Imported {category} LDAP users errors: {errors}")
- else:
- logger.info(f"Imported {len(users)} {category} users successfully")
+ new_users, errors, disable_users = util_import.perform_import(users, orgs)
receivers_setting = f"AUTH_{category.upper()}_SYNC_RECEIVERS"
if getattr(settings, receivers_setting, None):
@@ -76,7 +70,7 @@ def perform_import(category, util_server):
)
)
def import_ldap_user():
- perform_import('ldap', LDAPServerUtil())
+ perform_import(User.Source.ldap.value, LDAPServerUtil())
@shared_task(
@@ -86,7 +80,8 @@ def import_ldap_user():
)
)
def import_ldap_ha_user():
- perform_import('ldap_ha', LDAPServerUtil(category='ldap_ha'))
+ category = User.Source.ldap_ha.value
+ perform_import(category, LDAPServerUtil(category=category))
def register_periodic_task(task_name, task_func, interval_key, enabled_key, crontab_key, **kwargs):
diff --git a/apps/settings/utils/ldap.py b/apps/settings/utils/ldap.py
index e896c190e..24311adab 100644
--- a/apps/settings/utils/ldap.py
+++ b/apps/settings/utils/ldap.py
@@ -47,7 +47,7 @@ LDAP_USE_CACHE_FLAGS = [1, '1', 'true', 'True', True]
class LDAPConfig(object):
- def __init__(self, config=None, category='ldap'):
+ def __init__(self, config=None, category=User.Source.ldap.value):
self.server_uri = None
self.bind_dn = None
self.password = None
@@ -73,7 +73,7 @@ class LDAPConfig(object):
self.auth_ldap = config.get('auth_ldap')
def load_from_settings(self):
- prefix = 'AUTH_LDAP' if self.category == 'ldap' else 'AUTH_LDAP_HA'
+ prefix = 'AUTH_LDAP' if self.category == User.Source.ldap.value else 'AUTH_LDAP_HA'
self.server_uri = getattr(settings, f"{prefix}_SERVER_URI")
self.bind_dn = getattr(settings, f"{prefix}_BIND_DN")
self.password = getattr(settings, f"{prefix}_BIND_PASSWORD")
@@ -86,7 +86,7 @@ class LDAPConfig(object):
class LDAPServerUtil(object):
- def __init__(self, config=None, category='ldap'):
+ def __init__(self, config=None, category=User.Source.ldap.value):
if isinstance(config, dict):
self.config = LDAPConfig(config=config)
elif isinstance(config, LDAPConfig):
@@ -234,14 +234,11 @@ class LDAPServerUtil(object):
class LDAPCacheUtil(object):
- def __init__(self, category='ldap'):
+ def __init__(self, category=User.Source.ldap.value):
self.search_users = None
self.search_value = None
self.category = category
- if self.category == 'ldap':
- self.cache_key_users = 'CACHE_KEY_LDAP_USERS'
- else:
- self.cache_key_users = 'CACHE_KEY_LDAP_HA_USERS'
+ self.cache_key_users = 'CACHE_KEY_{}_USERS'.format(self.category.upper())
def set_users(self, users):
logger.info('Set ldap users to cache, count: {}'.format(len(users)))
@@ -295,7 +292,7 @@ class LDAPSyncUtil(object):
TASK_STATUS_IS_RUNNING = 'RUNNING'
TASK_STATUS_IS_OVER = 'OVER'
- def __init__(self, category='ldap'):
+ def __init__(self, category=User.Source.ldap.value):
self.server_util = LDAPServerUtil(category=category)
self.cache_util = LDAPCacheUtil(category=category)
self.task_error_msg = None
@@ -371,8 +368,9 @@ class LDAPSyncUtil(object):
class LDAPImportUtil(object):
user_group_name_prefix = 'AD '
- def __init__(self):
- pass
+ def __init__(self, category=User.Source.ldap.value, is_sync_all=True):
+ self.category = category
+ self.is_sync_all = is_sync_all
@staticmethod
def get_user_email(user):
@@ -384,7 +382,7 @@ class LDAPImportUtil(object):
def update_or_create(self, user):
user['email'] = self.get_user_email(user)
if user['username'] not in ['admin']:
- user['source'] = User.Source.ldap.value
+ user['source'] = self.category
user.pop('status', None)
obj, created = User.objects.update_or_create(
username=user['username'], defaults=user
@@ -435,7 +433,29 @@ class LDAPImportUtil(object):
for org in orgs:
self.bind_org(org, objs, group_users_mapper)
logger.info('End perform import ldap users')
- return new_users, errors
+ # 禁止ldap 不存在的用户的
+ disable_usernames = []
+ if self.strict_sync_enabled and self.is_sync_all:
+ disable_usernames = self.disable_not_exist_users(users)
+
+ if errors:
+ logger.error(f"Imported {self.category.upper()} users errors: {errors}")
+ else:
+ logger.info(f"Imported {len(users)} {self.category.upper()} users successfully")
+ return new_users, errors, disable_usernames
+
+ @property
+ def strict_sync_enabled(self):
+ return getattr(settings, 'AUTH_{}_STRICT_SYNC'.format(self.category.upper()), False)
+
+ def disable_not_exist_users(self, users):
+ ldap_users = [user['username'] for user in users]
+ disable_users = User.objects.filter(source=self.category, is_active=True).exclude(username__in=ldap_users).all()
+ disable_usernames = disable_users.values_list('username', flat=True)
+ disable_usernames = list(map(str, disable_usernames))
+ disable_users.update(is_active=False)
+ logger.info(f"Disable {len(disable_usernames)} {self.category.upper()} users successfully")
+ return disable_usernames
def exit_user_group(self, user_groups_mapper):
# 通过对比查询本次导入用户需要移除的用户组
@@ -485,10 +505,10 @@ class LDAPTestUtil(object):
class LDAPBeforeLoginCheckError(LDAPExceptionError):
pass
- def __init__(self, config=None, category='ldap'):
+ def __init__(self, config=None, category=User.Source.ldap.value):
self.config = LDAPConfig(config, category)
self.user_entries = []
- if category == 'ldap':
+ if category == User.Source.ldap.value:
self.backend = LDAPAuthorizationBackend()
else:
self.backend = LDAPHAAuthorizationBackend()
@@ -665,7 +685,7 @@ class LDAPTestUtil(object):
# test login
def _test_before_login_check(self, username, password):
- from settings.ws import CACHE_KEY_LDAP_TEST_CONFIG_TASK_STATUS, TASK_STATUS_IS_OVER
+ from settings.ws import CACHE_KEY_LDAP_TEST_CONFIG_TASK_STATUS
if not cache.get(CACHE_KEY_LDAP_TEST_CONFIG_TASK_STATUS):
self.test_config()
diff --git a/apps/settings/ws.py b/apps/settings/ws.py
index 5d119ceaa..e9d9ec8b3 100644
--- a/apps/settings/ws.py
+++ b/apps/settings/ws.py
@@ -1,30 +1,31 @@
# -*- coding: utf-8 -*-
#
-import json
import asyncio
+import json
+from urllib.parse import parse_qs
from asgiref.sync import sync_to_async
from channels.generic.websocket import AsyncJsonWebsocketConsumer
-from django.core.cache import cache
from django.conf import settings
-from django.utils.translation import gettext_lazy as _
+from django.core.cache import cache
from django.utils import translation
-from urllib.parse import parse_qs
+from django.utils.translation import gettext_lazy as _
from common.db.utils import close_old_connections
from common.utils import get_logger
+from orgs.models import Organization
+from orgs.utils import current_org
from settings.serializers import (
LDAPHATestConfigSerializer,
LDAPTestConfigSerializer,
LDAPTestLoginSerializer
)
-from orgs.models import Organization
-from orgs.utils import current_org
from settings.tasks import sync_ldap_user
from settings.utils import (
LDAPServerUtil, LDAPCacheUtil, LDAPImportUtil, LDAPSyncUtil,
LDAP_USE_CACHE_FLAGS, LDAPTestUtil
)
+from users.models import User
from .const import ImportStatus
from .tools import (
verbose_ping, verbose_telnet, verbose_nmap,
@@ -130,7 +131,7 @@ class LdapWebsocket(AsyncJsonWebsocketConsumer):
async def connect(self):
user = self.scope["user"]
query = parse_qs(self.scope['query_string'].decode())
- self.category = query.get('category', ['ldap'])[0]
+ self.category = query.get('category', [User.Source.ldap.value])[0]
if user.is_authenticated:
await self.accept()
else:
@@ -157,7 +158,7 @@ class LdapWebsocket(AsyncJsonWebsocketConsumer):
close_old_connections()
def get_ldap_config(self, serializer):
- prefix = 'AUTH_LDAP_' if self.category == 'ldap' else 'AUTH_LDAP_HA_'
+ prefix = 'AUTH_{}_'.format(self.category.upper())
config = {
'server_uri': serializer.validated_data.get(f"{prefix}SERVER_URI"),
@@ -182,7 +183,7 @@ class LdapWebsocket(AsyncJsonWebsocketConsumer):
cache.set(task_key, TASK_STATUS_IS_OVER, ttl)
def run_testing_config(self, data):
- if self.category == 'ldap':
+ if self.category == User.Source.ldap.value:
serializer = LDAPTestConfigSerializer(data=data)
else:
serializer = LDAPHATestConfigSerializer(data=data)
@@ -222,12 +223,17 @@ class LdapWebsocket(AsyncJsonWebsocketConsumer):
msg = _('No LDAP user was found')
else:
orgs = self.get_orgs(org_ids)
- new_users, error_msg = LDAPImportUtil().perform_import(users, orgs)
+ is_sync_all = '*' in username_list
+ new_users, error_msg, disable_users = LDAPImportUtil(
+ self.category, is_sync_all
+ ).perform_import(users, orgs)
ok = True
success_count = len(users) - len(error_msg)
msg = _('Total {}, success {}, failure {}').format(
len(users), success_count, len(error_msg)
)
+ if disable_users:
+ msg += _(', disabled {}').format(len(disable_users))
self.set_users_status(users, error_msg)
except Exception as e:
msg = str(e)
diff --git a/apps/templates/_footer.html b/apps/templates/_footer.html
index 3c05f9eb1..3935a5499 100644
--- a/apps/templates/_footer.html
+++ b/apps/templates/_footer.html
@@ -2,7 +2,6 @@