perf: Optimize the MFA email sending logic

pull/14832/head
halo 2025-01-22 18:04:18 +08:00
parent 557b58d815
commit bd969a5cd9
3 changed files with 178 additions and 146 deletions

View File

@ -5,32 +5,21 @@ from django.utils.translation import gettext_lazy as _
from common.utils import random_string from common.utils import random_string
from common.utils.verify_code import SendAndVerifyCodeUtil from common.utils.verify_code import SendAndVerifyCodeUtil
from settings.utils import get_login_title from settings.utils import get_login_title
from users.serializers import SmsUserSerializer
from .base import BaseMFA from .base import BaseMFA
otp_failed_msg = _("OTP code invalid, or server time error") email_failed_msg = _("Email verify code invalid")
class MFAEmail(BaseMFA): class MFAEmail(BaseMFA):
name = 'email' name = 'email'
display_name = _('Email') display_name = _('Email')
placeholder = _('OTP verification code') placeholder = _('Email verification code')
def __init__(self, user):
super().__init__(user)
self.email, self.user_info = '', None
if self.is_authenticated():
self.email = user.email
self.user_info = SmsUserSerializer(user).data
def check_code(self, code): def check_code(self, code):
assert self.is_authenticated() assert self.is_authenticated()
ok = False sender_util = SendAndVerifyCodeUtil(self.user.email, backend=self.name)
msg = '' ok = sender_util.verify(code)
try: msg = '' if ok else email_failed_msg
ok = self.email.verify(code)
except Exception as e:
msg = str(e)
return ok, msg return ok, msg
def is_active(self): def is_active(self):
@ -44,17 +33,16 @@ class MFAEmail(BaseMFA):
def send_challenge(self): def send_challenge(self):
code = random_string(6, lower=False, upper=False) code = random_string(6, lower=False, upper=False)
subject = '%s: %s' % (get_login_title(), _('Forgot password')) subject = '%s: %s' % (get_login_title(), _('MFA code'))
context = { context = {
'user': self.user, 'title': subject, 'code': code, 'user': self.user, 'title': subject, 'code': code,
} }
subject = '%s: %s' % (get_login_title(), _('Forgot password')) message = render_to_string('authentication/_msg_mfa_email_code.html', context)
message = render_to_string('authentication/_msg_reset_password_code.html', context)
content = {'subject': subject, 'message': message} content = {'subject': subject, 'message': message}
self.email = SendAndVerifyCodeUtil( sender_util = SendAndVerifyCodeUtil(
self.email, code=code, backend=self.name, user_info=self.user_info, **content self.user.email, code=code, backend=self.name, timeout=60, **content
) )
self.email.gen_and_send_async() sender_util.gen_and_send_async()
@staticmethod @staticmethod
def global_enabled(): def global_enabled():

View File

@ -0,0 +1,18 @@
{% load i18n %}
<div style="width: 100%; text-align: center">
<table style="margin: 0 auto; border: 1px solid #ccc; border-collapse: collapse; width: 60%">
<tr style="background-color: #1ab394; color: white">
<th style="height: 80px;">{{ title }}</th>
</tr>
<tr style="border: 1px solid #eee;">
<td style="height: 50px;">{% trans 'Hello' %} {{ user.name }},</td>
</tr>
<tr style="border: 1px solid #eee">
<td style="height: 50px;">{% trans 'MFA code' %}: <span style="font-weight: bold;">{{ code }}</span></td>
</tr>
<tr style="border: 1px solid #eee">
<td style="height: 30px;">{% trans 'The validity period of the verification code is one minute' %}</td>
</tr>
</table>
</div>

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: JumpServer 0.3.3\n" "Project-Id-Version: JumpServer 0.3.3\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-01-08 14:25+0800\n" "POT-Creation-Date: 2025-01-22 17:36+0800\n"
"PO-Revision-Date: 2021-05-20 10:54+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n"
"Last-Translator: ibuler <ibuler@qq.com>\n" "Last-Translator: ibuler <ibuler@qq.com>\n"
"Language-Team: JumpServer team<ibuler@qq.com>\n" "Language-Team: JumpServer team<ibuler@qq.com>\n"
@ -127,8 +127,8 @@ msgstr ">>> 开始执行测试网关账号可连接性任务"
#: authentication/confirm/password.py:24 authentication/confirm/password.py:26 #: authentication/confirm/password.py:24 authentication/confirm/password.py:26
#: authentication/forms.py:28 #: authentication/forms.py:28
#: authentication/templates/authentication/login.html:362 #: authentication/templates/authentication/login.html:362
#: settings/serializers/auth/ldap.py:26 settings/serializers/auth/ldap.py:52 #: settings/serializers/auth/ldap.py:27 settings/serializers/auth/ldap.py:53
#: settings/serializers/auth/ldap_ha.py:34 settings/serializers/msg.py:37 #: settings/serializers/auth/ldap_ha.py:36 settings/serializers/msg.py:37
#: settings/serializers/terminal.py:28 terminal/serializers/storage.py:123 #: settings/serializers/terminal.py:28 terminal/serializers/storage.py:123
#: terminal/serializers/storage.py:142 users/forms/profile.py:22 #: terminal/serializers/storage.py:142 users/forms/profile.py:22
#: users/serializers/user.py:148 #: users/serializers/user.py:148
@ -293,7 +293,7 @@ msgstr "创建并推送"
msgid "Only create" msgid "Only create"
msgstr "仅创建" msgstr "仅创建"
#: accounts/const/automation.py:103 #: accounts/const/automation.py:103 authentication/mfa/email.py:15
#: authentication/serializers/password_mfa.py:16 #: authentication/serializers/password_mfa.py:16
#: authentication/serializers/password_mfa.py:24 #: authentication/serializers/password_mfa.py:24
#: notifications/backends/__init__.py:10 settings/serializers/msg.py:21 #: notifications/backends/__init__.py:10 settings/serializers/msg.py:21
@ -507,12 +507,12 @@ msgstr "账号备份快照"
#: accounts/serializers/automations/base.py:56 #: accounts/serializers/automations/base.py:56
#: assets/models/automations/base.py:128 #: assets/models/automations/base.py:128
#: assets/serializers/automations/base.py:40 xpack/plugins/cloud/models.py:242 #: assets/serializers/automations/base.py:40 xpack/plugins/cloud/models.py:242
#: xpack/plugins/cloud/serializers/task.py:247 #: xpack/plugins/cloud/serializers/task.py:249
msgid "Trigger mode" msgid "Trigger mode"
msgstr "触发模式" msgstr "触发模式"
#: accounts/models/automations/backup_account.py:140 audits/models.py:203 #: accounts/models/automations/backup_account.py:140 audits/models.py:203
#: terminal/models/session/sharing.py:125 xpack/plugins/cloud/manager.py:179 #: terminal/models/session/sharing.py:125 xpack/plugins/cloud/manager.py:180
#: xpack/plugins/cloud/models.py:231 #: xpack/plugins/cloud/models.py:231
msgid "Reason" msgid "Reason"
msgstr "原因" msgstr "原因"
@ -572,8 +572,8 @@ msgstr "SSH 密钥推送方式"
#: accounts/models/automations/gather_account.py:58 #: accounts/models/automations/gather_account.py:58
#: accounts/serializers/account/backup.py:40 #: accounts/serializers/account/backup.py:40
#: accounts/serializers/automations/change_secret.py:58 #: accounts/serializers/automations/change_secret.py:58
#: settings/serializers/auth/ldap.py:100 #: settings/serializers/auth/ldap.py:101
#: settings/serializers/auth/ldap_ha.py:82 settings/serializers/msg.py:45 #: settings/serializers/auth/ldap_ha.py:84 settings/serializers/msg.py:45
msgid "Recipient" msgid "Recipient"
msgstr "收件人" msgstr "收件人"
@ -747,7 +747,7 @@ msgstr "密码规则"
#: users/forms/profile.py:33 users/models/group.py:13 #: users/forms/profile.py:33 users/models/group.py:13
#: users/models/preference.py:11 users/models/user/__init__.py:64 #: users/models/preference.py:11 users/models/user/__init__.py:64
#: xpack/plugins/cloud/models.py:34 xpack/plugins/cloud/models.py:310 #: xpack/plugins/cloud/models.py:34 xpack/plugins/cloud/models.py:310
#: xpack/plugins/cloud/serializers/task.py:75 #: xpack/plugins/cloud/serializers/task.py:77
msgid "Name" msgid "Name"
msgstr "名称" msgstr "名称"
@ -937,7 +937,7 @@ msgstr "已修改"
#: ops/models/job.py:155 ops/serializers/job.py:20 #: ops/models/job.py:155 ops/serializers/job.py:20
#: perms/serializers/permission.py:46 #: perms/serializers/permission.py:46
#: terminal/templates/terminal/_msg_command_execute_alert.html:16 #: terminal/templates/terminal/_msg_command_execute_alert.html:16
#: xpack/plugins/cloud/manager.py:92 #: xpack/plugins/cloud/manager.py:93
msgid "Assets" msgid "Assets"
msgstr "资产" msgstr "资产"
@ -1532,7 +1532,7 @@ msgid "None of the reviewers belong to Organization `{}`"
msgstr "所有复核人都不属于组织 `{}`" msgstr "所有复核人都不属于组织 `{}`"
#: acls/serializers/rules/rules.py:20 #: acls/serializers/rules/rules.py:20
#: xpack/plugins/cloud/serializers/task.py:150 #: xpack/plugins/cloud/serializers/task.py:152
msgid "IP address invalid: `{}`" msgid "IP address invalid: `{}`"
msgstr "IP 地址无效: `{}`" msgstr "IP 地址无效: `{}`"
@ -1548,7 +1548,7 @@ msgstr ""
#: authentication/templates/authentication/_msg_oauth_bind.html:12 #: authentication/templates/authentication/_msg_oauth_bind.html:12
#: authentication/templates/authentication/_msg_rest_password_success.html:8 #: authentication/templates/authentication/_msg_rest_password_success.html:8
#: authentication/templates/authentication/_msg_rest_public_key_success.html:8 #: authentication/templates/authentication/_msg_rest_public_key_success.html:8
#: common/drf/renders/base.py:150 xpack/plugins/cloud/models.py:392 #: common/drf/renders/base.py:150 xpack/plugins/cloud/models.py:393
msgid "IP" msgid "IP"
msgstr "IP" msgstr "IP"
@ -1742,7 +1742,7 @@ msgstr "脚本"
#: settings/serializers/auth/radius.py:17 settings/serializers/auth/sms.py:76 #: settings/serializers/auth/radius.py:17 settings/serializers/auth/sms.py:76
#: settings/serializers/feature.py:80 settings/serializers/feature.py:93 #: settings/serializers/feature.py:80 settings/serializers/feature.py:93
#: settings/serializers/msg.py:30 terminal/models/component/endpoint.py:14 #: settings/serializers/msg.py:30 terminal/models/component/endpoint.py:14
#: terminal/serializers/applet.py:17 xpack/plugins/cloud/manager.py:92 #: terminal/serializers/applet.py:17 xpack/plugins/cloud/manager.py:93
#: xpack/plugins/cloud/serializers/account_attrs.py:72 #: xpack/plugins/cloud/serializers/account_attrs.py:72
msgid "Host" msgid "Host"
msgstr "主机" msgstr "主机"
@ -1844,7 +1844,7 @@ msgid "Any"
msgstr "任意" msgstr "任意"
#: assets/const/protocol.py:88 rbac/tree.py:62 #: assets/const/protocol.py:88 rbac/tree.py:62
#: settings/serializers/security.py:241 #: settings/serializers/security.py:246
msgid "Security" msgid "Security"
msgstr "安全" msgstr "安全"
@ -2164,7 +2164,7 @@ msgstr "值"
#: assets/serializers/platform.py:158 #: assets/serializers/platform.py:158
#: authentication/serializers/connect_token_secret.py:124 #: authentication/serializers/connect_token_secret.py:124
#: common/serializers/common.py:85 labels/serializers.py:45 #: common/serializers/common.py:85 labels/serializers.py:45
#: settings/serializers/msg.py:90 #: settings/serializers/msg.py:90 xpack/plugins/cloud/models.py:392
msgid "Label" msgid "Label"
msgstr "标签" msgstr "标签"
@ -2378,7 +2378,7 @@ msgstr "节点路径,格式为 [\"/组织/节点名\"], 如果节点不存在
#: authentication/serializers/connect_token_secret.py:75 #: authentication/serializers/connect_token_secret.py:75
#: perms/models/asset_permission.py:76 perms/serializers/permission.py:56 #: perms/models/asset_permission.py:76 perms/serializers/permission.py:56
#: perms/serializers/user_permission.py:74 xpack/plugins/cloud/models.py:390 #: perms/serializers/user_permission.py:74 xpack/plugins/cloud/models.py:390
#: xpack/plugins/cloud/serializers/task.py:35 #: xpack/plugins/cloud/serializers/task.py:36
msgid "Protocols" msgid "Protocols"
msgstr "协议组" msgstr "协议组"
@ -2794,7 +2794,7 @@ msgstr "映射目录"
#: audits/const.py:23 rbac/tree.py:268 terminal/api/session/session.py:284 #: audits/const.py:23 rbac/tree.py:268 terminal/api/session/session.py:284
#: terminal/templates/terminal/_msg_command_warning.html:18 #: terminal/templates/terminal/_msg_command_warning.html:18
#: terminal/templates/terminal/_msg_session_sharing.html:10 #: terminal/templates/terminal/_msg_session_sharing.html:10
#: xpack/plugins/cloud/manager.py:93 #: xpack/plugins/cloud/manager.py:94
msgid "View" msgid "View"
msgstr "查看" msgstr "查看"
@ -3002,7 +3002,7 @@ msgid "Creator"
msgstr "创建者" msgstr "创建者"
#: audits/serializers.py:39 ops/models/base.py:52 ops/models/job.py:240 #: audits/serializers.py:39 ops/models/base.py:52 ops/models/job.py:240
#: xpack/plugins/cloud/manager.py:102 #: xpack/plugins/cloud/manager.py:103
msgid "Summary" msgid "Summary"
msgstr "汇总" msgstr "汇总"
@ -3472,7 +3472,9 @@ msgstr "MFA 类型"
msgid "Captcha" msgid "Captcha"
msgstr "验证码" msgstr "验证码"
#: authentication/forms.py:66 users/forms/profile.py:28 #: authentication/forms.py:66 authentication/mfa/email.py:36
#: authentication/templates/authentication/_msg_mfa_email_code.html:12
#: users/forms/profile.py:28
msgid "MFA code" msgid "MFA code"
msgstr "MFA 验证码" msgstr "MFA 验证码"
@ -3496,6 +3498,14 @@ msgstr "自定义 MFA 验证码"
msgid "MFA custom global enabled, cannot disable" msgid "MFA custom global enabled, cannot disable"
msgstr "自定义 MFA 全局开启,无法被禁用" msgstr "自定义 MFA 全局开启,无法被禁用"
#: authentication/mfa/email.py:10
msgid "Email verify code invalid"
msgstr "邮件验证码校验失败"
#: authentication/mfa/email.py:16
msgid "Email verification code"
msgstr "邮件验证码"
#: authentication/mfa/face.py:11 #: authentication/mfa/face.py:11
msgid "Face Recognition" msgid "Face Recognition"
msgstr "人脸识别" msgstr "人脸识别"
@ -3876,6 +3886,7 @@ msgid "Code error"
msgstr "代码错误" msgstr "代码错误"
#: authentication/templates/authentication/_msg_different_city.html:3 #: 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_oauth_bind.html:3
#: authentication/templates/authentication/_msg_reset_password.html:3 #: authentication/templates/authentication/_msg_reset_password.html:3
#: authentication/templates/authentication/_msg_reset_password_code.html:9 #: authentication/templates/authentication/_msg_reset_password_code.html:9
@ -3898,6 +3909,11 @@ msgid ""
"account password in time." "account password in time."
msgstr "若怀疑此次登录行为异常,请及时修改账号密码" 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 #: authentication/templates/authentication/_msg_oauth_bind.html:6
msgid "Your account has just been bound to" msgid "Your account has just been bound to"
msgstr "您的帐户刚刚绑定到" msgstr "您的帐户刚刚绑定到"
@ -3938,10 +3954,6 @@ msgid ""
"Copy the verification code to the Reset Password page to reset the password." "Copy the verification code to the Reset Password page to reset the password."
msgstr "将验证码复制到重置密码页面,重置密码。" 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 #: authentication/templates/authentication/_msg_rest_password_success.html:5
msgid "Your password has just been successfully updated" msgid "Your password has just been successfully updated"
msgstr "你的密码刚刚成功更新" msgstr "你的密码刚刚成功更新"
@ -4245,7 +4257,7 @@ msgstr "企业专业版"
msgid "Ultimate edition" msgid "Ultimate edition"
msgstr "企业旗舰版" msgstr "企业旗舰版"
#: common/const/common.py:5 xpack/plugins/cloud/manager.py:424 #: common/const/common.py:5 xpack/plugins/cloud/manager.py:427
#, python-format #, python-format
msgid "%(name)s was created successfully" msgid "%(name)s was created successfully"
msgstr "%(name)s 创建成功" msgstr "%(name)s 创建成功"
@ -4984,18 +4996,18 @@ msgstr "选择框"
msgid "no valid program entry found." msgid "no valid program entry found."
msgstr "没有可用程序入口" msgstr "没有可用程序入口"
#: ops/mixin.py:30 ops/mixin.py:110 settings/serializers/auth/ldap.py:73 #: ops/mixin.py:30 ops/mixin.py:110 settings/serializers/auth/ldap.py:74
#: settings/serializers/auth/ldap_ha.py:55 #: settings/serializers/auth/ldap_ha.py:57
msgid "Periodic run" msgid "Periodic run"
msgstr "周期执行" msgstr "周期执行"
#: ops/mixin.py:32 ops/mixin.py:96 ops/mixin.py:116 #: ops/mixin.py:32 ops/mixin.py:96 ops/mixin.py:116
#: settings/serializers/auth/ldap.py:80 settings/serializers/auth/ldap_ha.py:62 #: settings/serializers/auth/ldap.py:81 settings/serializers/auth/ldap_ha.py:64
msgid "Interval" msgid "Interval"
msgstr "间隔" msgstr "间隔"
#: ops/mixin.py:35 ops/mixin.py:94 ops/mixin.py:113 #: ops/mixin.py:35 ops/mixin.py:94 ops/mixin.py:113
#: settings/serializers/auth/ldap.py:77 settings/serializers/auth/ldap_ha.py:59 #: settings/serializers/auth/ldap.py:78 settings/serializers/auth/ldap_ha.py:61
msgid "Crontab" msgid "Crontab"
msgstr "Crontab" msgstr "Crontab"
@ -5011,7 +5023,7 @@ msgstr "* 请输入有效的 crontab 表达式"
msgid "Range {} to {}" msgid "Range {} to {}"
msgstr "输入在 {} - {} 范围之间" msgstr "输入在 {} - {} 范围之间"
#: ops/mixin.py:145 #: ops/mixin.py:145 settings/serializers/auth/mixin.py:12
msgid "Require interval or crontab setting" msgid "Require interval or crontab setting"
msgstr "需要周期或定期设置" msgstr "需要周期或定期设置"
@ -5756,7 +5768,7 @@ msgstr "系统设置"
msgid "Session audits" msgid "Session audits"
msgstr "会话审计" msgstr "会话审计"
#: rbac/tree.py:49 xpack/plugins/cloud/manager.py:93 #: rbac/tree.py:49 xpack/plugins/cloud/manager.py:94
msgid "Cloud import" msgid "Cloud import"
msgstr "云同步" msgstr "云同步"
@ -6041,8 +6053,8 @@ msgstr ""
msgid "CAS" msgid "CAS"
msgstr "CAS" msgstr "CAS"
#: settings/serializers/auth/cas.py:15 settings/serializers/auth/ldap.py:44 #: settings/serializers/auth/cas.py:15 settings/serializers/auth/ldap.py:45
#: settings/serializers/auth/ldap_ha.py:26 settings/serializers/auth/oidc.py:61 #: settings/serializers/auth/ldap_ha.py:28 settings/serializers/auth/oidc.py:61
msgid "Server" msgid "Server"
msgstr "服务端地址" msgstr "服务端地址"
@ -6069,7 +6081,7 @@ 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/feishu.py:18 settings/serializers/auth/lark.py:17
#: settings/serializers/auth/ldap.py:66 settings/serializers/auth/ldap_ha.py:48 #: settings/serializers/auth/ldap.py:67 settings/serializers/auth/ldap_ha.py:50
#: settings/serializers/auth/oauth2.py:60 settings/serializers/auth/oidc.py:39 #: 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/saml2.py:35 settings/serializers/auth/slack.py:18
#: settings/serializers/auth/wecom.py:18 #: settings/serializers/auth/wecom.py:18
@ -6126,46 +6138,46 @@ msgstr ""
"用户属性映射,其中 `key` 是 JumpServer 用户属性名称,`value` 是 Lark 服务用户" "用户属性映射,其中 `key` 是 JumpServer 用户属性名称,`value` 是 Lark 服务用户"
"属性名称" "属性名称"
#: settings/serializers/auth/ldap.py:41 settings/serializers/auth/ldap.py:103 #: settings/serializers/auth/ldap.py:42 settings/serializers/auth/ldap.py:104
msgid "LDAP" msgid "LDAP"
msgstr "LDAP" msgstr "LDAP"
#: settings/serializers/auth/ldap.py:45 #: settings/serializers/auth/ldap.py:46
msgid "LDAP server URI" msgid "LDAP server URI"
msgstr "LDAP 服务域名" msgstr "LDAP 服务域名"
#: settings/serializers/auth/ldap.py:48 settings/serializers/auth/ldap_ha.py:30 #: settings/serializers/auth/ldap.py:49 settings/serializers/auth/ldap_ha.py:32
msgid "Bind DN" msgid "Bind DN"
msgstr "绑定 DN" msgstr "绑定 DN"
#: settings/serializers/auth/ldap.py:49 settings/serializers/auth/ldap_ha.py:31 #: settings/serializers/auth/ldap.py:50 settings/serializers/auth/ldap_ha.py:33
msgid "Binding Distinguished Name" msgid "Binding Distinguished Name"
msgstr "绑定目录管理员" msgstr "绑定目录管理员"
#: settings/serializers/auth/ldap.py:53 settings/serializers/auth/ldap_ha.py:35 #: settings/serializers/auth/ldap.py:54 settings/serializers/auth/ldap_ha.py:37
msgid "Binding password" msgid "Binding password"
msgstr "绑定密码" msgstr "绑定密码"
#: settings/serializers/auth/ldap.py:56 settings/serializers/auth/ldap_ha.py:38 #: settings/serializers/auth/ldap.py:57 settings/serializers/auth/ldap_ha.py:40
msgid "Search OU" msgid "Search OU"
msgstr "用户 OU" msgstr "用户 OU"
#: settings/serializers/auth/ldap.py:58 settings/serializers/auth/ldap_ha.py:40 #: settings/serializers/auth/ldap.py:59 settings/serializers/auth/ldap_ha.py:42
msgid "" msgid ""
"User Search Base, if there are multiple OUs, you can separate them with the " "User Search Base, if there are multiple OUs, you can separate them with the "
"`|` symbol" "`|` symbol"
msgstr "用户搜索库如果有多个OU可以用`|`符号分隔" msgstr "用户搜索库如果有多个OU可以用`|`符号分隔"
#: settings/serializers/auth/ldap.py:62 settings/serializers/auth/ldap_ha.py:44 #: settings/serializers/auth/ldap.py:63 settings/serializers/auth/ldap_ha.py:46
msgid "Search filter" msgid "Search filter"
msgstr "用户过滤器" msgstr "用户过滤器"
#: settings/serializers/auth/ldap.py:63 settings/serializers/auth/ldap_ha.py:45 #: settings/serializers/auth/ldap.py:64 settings/serializers/auth/ldap_ha.py:47
#, python-format #, python-format
msgid "Selection could include (cn|uid|sAMAccountName=%(user)s)" msgid "Selection could include (cn|uid|sAMAccountName=%(user)s)"
msgstr "可能的选项是(cn或uid或sAMAccountName=%(user)s)" msgstr "可能的选项是(cn或uid或sAMAccountName=%(user)s)"
#: settings/serializers/auth/ldap.py:68 settings/serializers/auth/ldap_ha.py:50 #: settings/serializers/auth/ldap.py:69 settings/serializers/auth/ldap_ha.py:52
msgid "" msgid ""
"User attribute mapping, where the `key` is the JumpServer user attribute " "User attribute mapping, where the `key` is the JumpServer user attribute "
"name and the `value` is the LDAP service user attribute name" "name and the `value` is the LDAP service user attribute name"
@ -6173,15 +6185,15 @@ msgstr ""
"用户属性映射,其中 `key` 是 JumpServer 用户属性名称,`value` 是 LDAP 服务用户" "用户属性映射,其中 `key` 是 JumpServer 用户属性名称,`value` 是 LDAP 服务用户"
"属性名称" "属性名称"
#: settings/serializers/auth/ldap.py:84 settings/serializers/auth/ldap_ha.py:66 #: settings/serializers/auth/ldap.py:85 settings/serializers/auth/ldap_ha.py:68
msgid "Connect timeout (s)" msgid "Connect timeout (s)"
msgstr "连接超时时间 (秒)" msgstr "连接超时时间 (秒)"
#: settings/serializers/auth/ldap.py:89 settings/serializers/auth/ldap_ha.py:71 #: settings/serializers/auth/ldap.py:90 settings/serializers/auth/ldap_ha.py:73
msgid "User DN cache timeout (s)" msgid "User DN cache timeout (s)"
msgstr "User DN 缓存超时时间 (秒)" msgstr "User DN 缓存超时时间 (秒)"
#: settings/serializers/auth/ldap.py:91 #: settings/serializers/auth/ldap.py:92
msgid "" msgid ""
"Caching the User DN obtained during user login authentication can " "Caching the User DN obtained during user login authentication can "
"effectively improve the speed of user authentication., 0 means no " "effectively improve the speed of user authentication., 0 means no "
@ -6191,20 +6203,20 @@ msgstr ""
"对用户登录认证时查询出的 User DN 进行缓存,可以有效提高用户认证的速度<br>如果" "对用户登录认证时查询出的 User DN 进行缓存,可以有效提高用户认证的速度<br>如果"
"用户 OU 架构有调整,点击提交即可清除用户 DN 缓存" "用户 OU 架构有调整,点击提交即可清除用户 DN 缓存"
#: settings/serializers/auth/ldap.py:97 settings/serializers/auth/ldap_ha.py:79 #: settings/serializers/auth/ldap.py:98 settings/serializers/auth/ldap_ha.py:81
msgid "Search paged size (piece)" msgid "Search paged size (piece)"
msgstr "搜索分页数量 (条)" msgstr "搜索分页数量 (条)"
#: settings/serializers/auth/ldap_ha.py:23 #: settings/serializers/auth/ldap_ha.py:25
#: settings/serializers/auth/ldap_ha.py:85 #: settings/serializers/auth/ldap_ha.py:87
msgid "LDAP HA" msgid "LDAP HA"
msgstr "LDAP 认证" msgstr "LDAP 认证"
#: settings/serializers/auth/ldap_ha.py:27 #: settings/serializers/auth/ldap_ha.py:29
msgid "LDAP HA server URI" msgid "LDAP HA server URI"
msgstr "LDAP HA 服务域名" msgstr "LDAP HA 服务域名"
#: settings/serializers/auth/ldap_ha.py:73 #: settings/serializers/auth/ldap_ha.py:75
msgid "" msgid ""
"Caching the User DN obtained during user login authentication can " "Caching the User DN obtained during user login authentication can "
"effectivelyimprove the speed of user authentication., 0 means no cache<br>If " "effectivelyimprove the speed of user authentication., 0 means no cache<br>If "
@ -6706,7 +6718,7 @@ msgid "Tenant ID"
msgstr "租户 ID" msgstr "租户 ID"
#: settings/serializers/feature.py:109 terminal/serializers/storage.py:68 #: settings/serializers/feature.py:109 terminal/serializers/storage.py:68
#: xpack/plugins/cloud/manager.py:110 xpack/plugins/cloud/manager.py:115 #: xpack/plugins/cloud/manager.py:111 xpack/plugins/cloud/manager.py:116
#: xpack/plugins/cloud/models.py:287 #: xpack/plugins/cloud/models.py:287
msgid "Region" msgid "Region"
msgstr "地域" msgstr "地域"
@ -7024,45 +7036,53 @@ msgstr "第三方认证开启 MFA"
msgid "The third-party login modes include OIDC, CAS, and SAML2" msgid "The third-party login modes include OIDC, CAS, and SAML2"
msgstr "第三方登录方式包括: OIDC、CAS、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" msgid "OTP issuer name"
msgstr "OTP 扫描后的名称" msgstr "OTP 扫描后的名称"
#: settings/serializers/security.py:132 #: settings/serializers/security.py:137
msgid "OTP valid window" msgid "OTP valid window"
msgstr "OTP 延迟有效次数" msgstr "OTP 延迟有效次数"
#: settings/serializers/security.py:136 #: settings/serializers/security.py:141
msgid "MFA verify TTL" msgid "MFA verify TTL"
msgstr "MFA 校验有效期" msgstr "MFA 校验有效期"
#: settings/serializers/security.py:138 #: settings/serializers/security.py:143
msgid "" msgid ""
"Unit: second, The verification MFA takes effect only when you view the " "Unit: second, The verification MFA takes effect only when you view the "
"account password" "account password"
msgstr "单位:秒,目前仅在查看账号密码校验 MFA 时生效" msgstr "单位:秒,目前仅在查看账号密码校验 MFA 时生效"
#: settings/serializers/security.py:143 #: settings/serializers/security.py:148
msgid "MFA in login page" msgid "MFA in login page"
msgstr "MFA 在登录页面输入" 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" msgid "Eu security regulations(GDPR) require MFA to be on the login page"
msgstr "欧盟数据安全法规(GDPR) 要求 MFA 在登录页面,来确保系统登录安全" msgstr "欧盟数据安全法规(GDPR) 要求 MFA 在登录页面,来确保系统登录安全"
#: settings/serializers/security.py:148 #: settings/serializers/security.py:153
msgid "Verify code TTL (second)" msgid "Verify code TTL (second)"
msgstr "验证码有效时间 (分)" msgstr "验证码有效时间 (分)"
#: settings/serializers/security.py:149 #: settings/serializers/security.py:154
msgid "Reset password and send SMS code expiration time" msgid "Reset password and send SMS code expiration time"
msgstr "重置密码的验证码及发送短信的验证码过期时间" msgstr "重置密码的验证码及发送短信的验证码过期时间"
#: settings/serializers/security.py:153 #: settings/serializers/security.py:158
msgid "Login dynamic code" msgid "Login dynamic code"
msgstr "启用登录附加码" msgstr "启用登录附加码"
#: settings/serializers/security.py:154 #: settings/serializers/security.py:159
msgid "" msgid ""
"The password and additional code are sent to a third party authentication " "The password and additional code are sent to a third party authentication "
"system for verification" "system for verification"
@ -7070,19 +7090,19 @@ msgstr ""
"密码和附加码一并发送给第三方认证系统进行校验, 如:有的第三方认证系统,需要 密" "密码和附加码一并发送给第三方认证系统进行校验, 如:有的第三方认证系统,需要 密"
"码+6位数字 完成认证" "码+6位数字 完成认证"
#: settings/serializers/security.py:158 #: settings/serializers/security.py:163
msgid "Login captcha" msgid "Login captcha"
msgstr "启用登录验证码" msgstr "启用登录验证码"
#: settings/serializers/security.py:159 #: settings/serializers/security.py:164
msgid "Enable captcha to prevent robot authentication" msgid "Enable captcha to prevent robot authentication"
msgstr "开启验证码,防止机器人登录" msgstr "开启验证码,防止机器人登录"
#: settings/serializers/security.py:162 #: settings/serializers/security.py:167
msgid "Suspicious Login Verification" msgid "Suspicious Login Verification"
msgstr "异地登录通知" msgstr "异地登录通知"
#: settings/serializers/security.py:164 #: settings/serializers/security.py:169
msgid "" msgid ""
"The system determines whether the login IP address belongs to a common login " "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 " "city. If the account is logged in from a common login city, the system sends "
@ -7091,81 +7111,81 @@ msgstr ""
"根据登录 IP 是否所属常用登录城市进行判断,若账号在非常用城市登录,会发送异地" "根据登录 IP 是否所属常用登录城市进行判断,若账号在非常用城市登录,会发送异地"
"登录提醒" "登录提醒"
#: settings/serializers/security.py:170 #: settings/serializers/security.py:175
msgid "Auto Disable Threshold (day)" msgid "Auto Disable Threshold (day)"
msgstr "不活跃用户自动禁用 (天)" msgstr "不活跃用户自动禁用 (天)"
#: settings/serializers/security.py:171 #: settings/serializers/security.py:176
msgid "" msgid ""
"Detect infrequent users daily and disable them if they exceed the " "Detect infrequent users daily and disable them if they exceed the "
"predetermined time limit" "predetermined time limit"
msgstr "每天检测一次,超过预设时间的用户自动禁用" msgstr "每天检测一次,超过预设时间的用户自动禁用"
#: settings/serializers/security.py:191 #: settings/serializers/security.py:196
msgid "Watermark" msgid "Watermark"
msgstr "开启水印" msgstr "开启水印"
#: settings/serializers/security.py:192 #: settings/serializers/security.py:197
msgid "Enabled, the web session and replay contains watermark information" msgid "Enabled, the web session and replay contains watermark information"
msgstr "启用后Web 会话和录像将包含水印信息" msgstr "启用后Web 会话和录像将包含水印信息"
#: settings/serializers/security.py:196 #: settings/serializers/security.py:201
msgid "Max idle time (minute)" msgid "Max idle time (minute)"
msgstr "连接最大空闲时间 (分)" msgstr "连接最大空闲时间 (分)"
#: settings/serializers/security.py:197 #: settings/serializers/security.py:202
msgid "If idle time more than it, disconnect connection." msgid "If idle time more than it, disconnect connection."
msgstr "提示:如果超过该配置没有操作,连接会被断开" msgstr "提示:如果超过该配置没有操作,连接会被断开"
#: settings/serializers/security.py:200 #: settings/serializers/security.py:205
msgid "Session expire at browser closed" msgid "Session expire at browser closed"
msgstr "会话在浏览器关闭时过期" msgstr "会话在浏览器关闭时过期"
#: settings/serializers/security.py:201 #: settings/serializers/security.py:206
msgid "Whether to expire the session when the user closes their browser." msgid "Whether to expire the session when the user closes their browser."
msgstr "当用户关闭浏览器时是否使会话过期。" msgstr "当用户关闭浏览器时是否使会话过期。"
#: settings/serializers/security.py:206 #: settings/serializers/security.py:211
msgid "Allow users to view asset session information" msgid "Allow users to view asset session information"
msgstr "允许用户查看资产在线会话信息" msgstr "允许用户查看资产在线会话信息"
#: settings/serializers/security.py:208 #: settings/serializers/security.py:213
msgid "" msgid ""
"When a user connects to an asset, the account selection popup displays the " "When a user connects to an asset, the account selection popup displays the "
"number of active sessions for the current asset (RDP protocol only)." "number of active sessions for the current asset (RDP protocol only)."
msgstr "" msgstr ""
"当用户连接资产时,账号选择弹窗中显示当前资产的在线会话数量(仅 rdp 协议)" "当用户连接资产时,账号选择弹窗中显示当前资产的在线会话数量(仅 rdp 协议)"
#: settings/serializers/security.py:214 #: settings/serializers/security.py:219
msgid "Max online time (hour)" msgid "Max online time (hour)"
msgstr "会话连接最大时间 (时)" msgstr "会话连接最大时间 (时)"
#: settings/serializers/security.py:215 #: settings/serializers/security.py:220
msgid "If session connection time more than it, disconnect connection." msgid "If session connection time more than it, disconnect connection."
msgstr "提示:如果会话连接超过该配置,连接会被断开" msgstr "提示:如果会话连接超过该配置,连接会被断开"
#: settings/serializers/security.py:218 #: settings/serializers/security.py:223
msgid "Remember manual auth" msgid "Remember manual auth"
msgstr "保存手动输入密码" msgstr "保存手动输入密码"
#: settings/serializers/security.py:221 #: settings/serializers/security.py:226
#: terminal/templates/terminal/_msg_session_sharing.html:10 #: terminal/templates/terminal/_msg_session_sharing.html:10
msgid "Session share" msgid "Session share"
msgstr "会话分享" msgstr "会话分享"
#: settings/serializers/security.py:222 #: settings/serializers/security.py:227
msgid "Enabled, Allows user active session to be shared with other users" msgid "Enabled, Allows user active session to be shared with other users"
msgstr "开启后允许用户分享已连接的资产会话给他人,协同工作" msgstr "开启后允许用户分享已连接的资产会话给他人,协同工作"
#: settings/serializers/security.py:228 #: settings/serializers/security.py:233
msgid "Insecure command alert" msgid "Insecure command alert"
msgstr "危险命令告警" msgstr "危险命令告警"
#: settings/serializers/security.py:231 #: settings/serializers/security.py:236
msgid "Email recipient" msgid "Email recipient"
msgstr "邮件收件人" msgstr "邮件收件人"
#: settings/serializers/security.py:232 #: settings/serializers/security.py:237
msgid "Multiple user using , split" msgid "Multiple user using , split"
msgstr "多个用户,使用 , 分割" msgstr "多个用户,使用 , 分割"
@ -7269,11 +7289,11 @@ msgstr "当设置了LDAP自动同步将调用该任务进行用户同步"
msgid "Periodic import ldap ha user" msgid "Periodic import ldap ha user"
msgstr "周期导入 LDAP HA 用户" msgstr "周期导入 LDAP HA 用户"
#: settings/tasks/ldap.py:117 #: settings/tasks/ldap.py:120
msgid "Registration periodic import ldap user task" msgid "Registration periodic import ldap user task"
msgstr "注册周期导入 LDAP 用户 任务" msgstr "注册周期导入 LDAP 用户 任务"
#: settings/tasks/ldap.py:119 #: settings/tasks/ldap.py:122
msgid "" msgid ""
"When LDAP auto-sync parameters change, such as Crontab parameters, the LDAP " "When LDAP auto-sync parameters change, such as Crontab parameters, the LDAP "
"sync task \n" "sync task \n"
@ -7282,11 +7302,11 @@ msgstr ""
"当设置了LDAP自动同步参数发生变化时比如Crontab参数重新注册或更新ldap同步任" "当设置了LDAP自动同步参数发生变化时比如Crontab参数重新注册或更新ldap同步任"
"务将调用该任务" "务将调用该任务"
#: settings/tasks/ldap.py:133 #: settings/tasks/ldap.py:136
msgid "Registration periodic import ldap ha user task" msgid "Registration periodic import ldap ha user task"
msgstr "注册周期导入 LDAP HA 用户 任务" msgstr "注册周期导入 LDAP HA 用户 任务"
#: settings/tasks/ldap.py:135 #: settings/tasks/ldap.py:138
msgid "" msgid ""
"When LDAP HA auto-sync parameters change, such as Crontab parameters, the " "When LDAP HA auto-sync parameters change, such as Crontab parameters, the "
"LDAP HA sync task \n" "LDAP HA sync task \n"
@ -7640,7 +7660,7 @@ msgstr "无法删除正在使用的存储: {}"
msgid "Command storages" msgid "Command storages"
msgstr "命令存储" msgstr "命令存储"
#: terminal/api/component/storage.py:84 xpack/plugins/cloud/manager.py:110 #: terminal/api/component/storage.py:84 xpack/plugins/cloud/manager.py:111
msgid "Invalid" msgid "Invalid"
msgstr "无效" msgstr "无效"
@ -10006,19 +10026,19 @@ msgstr "实例名称和部分IP"
msgid "Succeed" msgid "Succeed"
msgstr "成功" msgstr "成功"
#: xpack/plugins/cloud/const.py:52 xpack/plugins/cloud/manager.py:98 #: xpack/plugins/cloud/const.py:52 xpack/plugins/cloud/manager.py:99
msgid "Unsync" msgid "Unsync"
msgstr "未同步" msgstr "未同步"
#: xpack/plugins/cloud/const.py:53 xpack/plugins/cloud/manager.py:97 #: xpack/plugins/cloud/const.py:53 xpack/plugins/cloud/manager.py:98
msgid "New Sync" msgid "New Sync"
msgstr "新同步" msgstr "新同步"
#: xpack/plugins/cloud/const.py:54 xpack/plugins/cloud/manager.py:97 #: xpack/plugins/cloud/const.py:54 xpack/plugins/cloud/manager.py:98
msgid "Synced" msgid "Synced"
msgstr "已同步" msgstr "已同步"
#: xpack/plugins/cloud/const.py:55 xpack/plugins/cloud/manager.py:99 #: xpack/plugins/cloud/const.py:55 xpack/plugins/cloud/manager.py:100
msgid "Released" msgid "Released"
msgstr "已释放" msgstr "已释放"
@ -10038,92 +10058,98 @@ msgstr "已同步组织"
msgid "Imported" msgid "Imported"
msgstr "导入" msgstr "导入"
#: xpack/plugins/cloud/manager.py:51 #: xpack/plugins/cloud/manager.py:52
#, python-format #, python-format
msgid "Task \"%s\" starts executing" msgid "Task \"%s\" starts executing"
msgstr "任务 \"%s\" 开始执行" msgstr "任务 \"%s\" 开始执行"
#: xpack/plugins/cloud/manager.py:90 #: xpack/plugins/cloud/manager.py:91
msgid "View the task details path: " msgid "View the task details path: "
msgstr "查看详情" msgstr "查看详情"
#: xpack/plugins/cloud/manager.py:93 #: xpack/plugins/cloud/manager.py:94
msgid "Account Details" msgid "Account Details"
msgstr "账号" msgstr "账号"
#: xpack/plugins/cloud/manager.py:94 #: xpack/plugins/cloud/manager.py:95
msgid "Synchronization History List" msgid "Synchronization History List"
msgstr "同步历史列表" msgstr "同步历史列表"
#: xpack/plugins/cloud/manager.py:94 #: xpack/plugins/cloud/manager.py:95
msgid "Synchronization Instance List" msgid "Synchronization Instance List"
msgstr "同步实例列表" msgstr "同步实例列表"
#: xpack/plugins/cloud/manager.py:98 #: xpack/plugins/cloud/manager.py:99
msgid "To be released" msgid "To be released"
msgstr "待释放" msgstr "待释放"
#: xpack/plugins/cloud/manager.py:102 #: xpack/plugins/cloud/manager.py:103
msgid "Task execution completed" msgid "Task execution completed"
msgstr "任务执行完成" msgstr "任务执行完成"
#: xpack/plugins/cloud/manager.py:107 #: xpack/plugins/cloud/manager.py:108
msgid "Synchronization regions" msgid "Synchronization regions"
msgstr "同步地区" msgstr "同步地区"
#: xpack/plugins/cloud/manager.py:132 #: xpack/plugins/cloud/manager.py:133
#, python-format #, python-format
msgid "Get instances of region \"%s\" error, error: %s" msgid "Get instances of region \"%s\" error, error: %s"
msgstr "获取区域 \"%s\" 的实例错误,错误:%s" msgstr "获取区域 \"%s\" 的实例错误,错误:%s"
#: xpack/plugins/cloud/manager.py:178 #: xpack/plugins/cloud/manager.py:179
#, python-format #, python-format
msgid "Failed to synchronize the instance \"%s\"" msgid "Failed to synchronize the instance \"%s\""
msgstr "无法同步实例 %s" msgstr "无法同步实例 %s"
#: xpack/plugins/cloud/manager.py:354 #: xpack/plugins/cloud/manager.py:357
#, python-format #, python-format
msgid "" msgid ""
"The updated platform of asset \"%s\" is inconsistent with the original " "The updated platform of asset \"%s\" is inconsistent with the original "
"platform type. Skip platform and protocol updates" "platform type. Skip platform and protocol updates"
msgstr "资产“%s”的更新平台与原平台类型不一致。跳过平台和协议更新" msgstr "资产“%s”的更新平台与原平台类型不一致。跳过平台和协议更新"
#: xpack/plugins/cloud/manager.py:406 #: xpack/plugins/cloud/manager.py:409
#, python-format #, python-format
msgid "The asset \"%s\" already exists" msgid "The asset \"%s\" already exists"
msgstr "资产 \"%s\" 已存在" msgstr "资产 \"%s\" 已存在"
#: xpack/plugins/cloud/manager.py:408 #: xpack/plugins/cloud/manager.py:411
#, python-format #, python-format
msgid "Update asset \"%s\"" msgid "Update asset \"%s\""
msgstr "更新资产 \"%s\"" msgstr "更新资产 \"%s\""
#: xpack/plugins/cloud/manager.py:411 #: xpack/plugins/cloud/manager.py:414
#, python-format #, python-format
msgid "Asset \"%s\" has been updated" msgid "Asset \"%s\" has been updated"
msgstr "资产 \"%s\" 已更新" msgstr "资产 \"%s\" 已更新"
#: xpack/plugins/cloud/manager.py:420 #: xpack/plugins/cloud/manager.py:423
#, python-format #, python-format
msgid "Prepare to create asset \"%s\"" msgid "Prepare to create asset \"%s\""
msgstr "准备创建资产 %s" msgstr "准备创建资产 %s"
#: xpack/plugins/cloud/manager.py:441 #: xpack/plugins/cloud/manager.py:444
#, python-format #, python-format
msgid "Set nodes \"%s\"" msgid "Set nodes \"%s\""
msgstr "设置节点: \"%s\"" msgstr "设置节点: \"%s\""
#: xpack/plugins/cloud/manager.py:467 #: xpack/plugins/cloud/manager.py:470
#, python-format #, python-format
msgid "Set accounts \"%s\"" msgid "Set accounts \"%s\""
msgstr "设置账号: %s" msgstr "设置账号: %s"
#: xpack/plugins/cloud/manager.py:483 #: xpack/plugins/cloud/manager.py:486
#, python-format #, python-format
msgid "Set protocols \"%s\"" msgid "Set protocols \"%s\""
msgstr "设置协议 \"%s\"" msgstr "设置协议 \"%s\""
#: xpack/plugins/cloud/manager.py:497 xpack/plugins/cloud/tasks.py:31 #: xpack/plugins/cloud/manager.py:494
#, fuzzy, python-format
#| msgid "Set nodes \"%s\""
msgid "Set labels \"%s\""
msgstr "设置节点: \"%s\""
#: xpack/plugins/cloud/manager.py:508 xpack/plugins/cloud/tasks.py:31
msgid "Run sync instance task" msgid "Run sync instance task"
msgstr "执行同步实例任务" msgstr "执行同步实例任务"
@ -10150,8 +10176,8 @@ msgstr "测试云账号"
#: xpack/plugins/cloud/models.py:104 #: xpack/plugins/cloud/models.py:104
#: xpack/plugins/cloud/serializers/account.py:76 #: xpack/plugins/cloud/serializers/account.py:76
#: xpack/plugins/cloud/serializers/task.py:157 #: xpack/plugins/cloud/serializers/task.py:159
#: xpack/plugins/cloud/serializers/task.py:158 #: xpack/plugins/cloud/serializers/task.py:160
msgid "Regions" msgid "Regions"
msgstr "地域" msgstr "地域"
@ -10164,7 +10190,7 @@ msgid "IP network segment group"
msgstr "IP网段组" msgstr "IP网段组"
#: xpack/plugins/cloud/models.py:116 #: xpack/plugins/cloud/models.py:116
#: xpack/plugins/cloud/serializers/task.py:161 #: xpack/plugins/cloud/serializers/task.py:163
msgid "Preferred IP type" msgid "Preferred IP type"
msgstr "" msgstr ""
@ -10185,7 +10211,7 @@ msgid "Date last sync"
msgstr "最后同步日期" msgstr "最后同步日期"
#: xpack/plugins/cloud/models.py:130 xpack/plugins/cloud/models.py:379 #: xpack/plugins/cloud/models.py:130 xpack/plugins/cloud/models.py:379
#: xpack/plugins/cloud/models.py:405 #: xpack/plugins/cloud/models.py:406
msgid "Strategy" msgid "Strategy"
msgstr "策略" msgstr "策略"
@ -10221,7 +10247,7 @@ msgstr "实例"
msgid "Sync instance detail" msgid "Sync instance detail"
msgstr "同步实例详情" msgstr "同步实例详情"
#: xpack/plugins/cloud/models.py:313 xpack/plugins/cloud/serializers/task.py:77 #: xpack/plugins/cloud/models.py:313 xpack/plugins/cloud/serializers/task.py:79
msgid "Rule relation" msgid "Rule relation"
msgstr "条件关系" msgstr "条件关系"
@ -10277,23 +10303,23 @@ msgstr "规则匹配"
msgid "Rule value" msgid "Rule value"
msgstr "规则值" msgstr "规则值"
#: xpack/plugins/cloud/models.py:383 xpack/plugins/cloud/serializers/task.py:80 #: xpack/plugins/cloud/models.py:383 xpack/plugins/cloud/serializers/task.py:82
msgid "Strategy rule" msgid "Strategy rule"
msgstr "条件" msgstr "条件"
#: xpack/plugins/cloud/models.py:393 #: xpack/plugins/cloud/models.py:394
msgid "Name strategy" msgid "Name strategy"
msgstr "主机名策略" msgstr "主机名策略"
#: xpack/plugins/cloud/models.py:400 #: xpack/plugins/cloud/models.py:401
msgid "Action attr" msgid "Action attr"
msgstr "动作属性" msgstr "动作属性"
#: xpack/plugins/cloud/models.py:402 #: xpack/plugins/cloud/models.py:403
msgid "Action value" msgid "Action value"
msgstr "动作值" msgstr "动作值"
#: xpack/plugins/cloud/models.py:409 xpack/plugins/cloud/serializers/task.py:83 #: xpack/plugins/cloud/models.py:410 xpack/plugins/cloud/serializers/task.py:85
msgid "Strategy action" msgid "Strategy action"
msgstr "动作" msgstr "动作"
@ -10594,11 +10620,11 @@ msgstr "测试超时时间"
msgid "Project" msgid "Project"
msgstr "project" msgstr "project"
#: xpack/plugins/cloud/serializers/task.py:155 #: xpack/plugins/cloud/serializers/task.py:157
msgid "History count" msgid "History count"
msgstr "执行次数" msgstr "执行次数"
#: xpack/plugins/cloud/serializers/task.py:156 #: xpack/plugins/cloud/serializers/task.py:158
msgid "Instance count" msgid "Instance count"
msgstr "实例个数" msgstr "实例个数"