Luna is a separately deployed program, you need to deploy Luna, koko, "
+"configure nginx for url distribution,
If you see this page, "
+"prove that you are not accessing the nginx listening port. Good luck."
+msgstr ""
+
+#: jumpserver/views/other.py:72
+msgid "Websocket server run on port: {}, you should proxy it on nginx"
+msgstr ""
+
+#: jumpserver/views/other.py:86
+msgid ""
+"Koko is a separately deployed program, you need to deploy Koko, "
+"configure nginx for url distribution,
If you see this page, "
+"prove that you are not accessing the nginx listening port. Good luck."
+msgstr ""
+
+#: labels/apps.py:8
+msgid "App Labels"
+msgstr ""
+
+#: labels/models.py:36
+msgid "Resource ID"
+msgstr ""
+
+#: labels/models.py:41
+msgid "Labeled resource"
+msgstr ""
+
+#: labels/serializers.py:22
+msgid "Resource count"
+msgstr "Resource count"
+
+#: labels/serializers.py:28
+msgid "Cannot contain \":,\""
+msgstr ""
+
+#: labels/serializers.py:43
+msgid "Resource type"
+msgstr ""
+
+#: notifications/apps.py:7
+msgid "App Notifications"
+msgstr ""
+
+#: notifications/backends/__init__.py:13
+msgid "Site message"
+msgstr ""
+
+#: notifications/models/notification.py:14
+msgid "receive backend"
+msgstr ""
+
+#: notifications/models/notification.py:18
+msgid "User message"
+msgstr ""
+
+#: notifications/models/notification.py:21
+msgid "{} subscription"
+msgstr ""
+
+#: notifications/models/notification.py:34
+msgid "System message"
+msgstr ""
+
+#: notifications/notifications.py:46
+msgid "Publish the station message"
+msgstr ""
+
+#: ops/ansible/inventory.py:97 ops/models/job.py:62
+msgid "No account available"
+msgstr ""
+
+#: ops/ansible/inventory.py:264
+msgid "Ansible disabled"
+msgstr ""
+
+#: ops/ansible/inventory.py:280
+msgid "Skip hosts below:"
+msgstr ""
+
+#: ops/api/celery.py:66 ops/api/celery.py:81
+msgid "Waiting task start"
+msgstr ""
+
+#: ops/api/celery.py:246
+msgid "Task {} not found"
+msgstr ""
+
+#: ops/api/celery.py:251
+msgid "Task {} args or kwargs error"
+msgstr ""
+
+#: ops/api/job.py:132
+msgid "Duplicate file exists"
+msgstr ""
+
+#: ops/api/job.py:137
+#, python-brace-format
+msgid ""
+"File size exceeds maximum limit. Please select a file smaller than {limit}MB"
+msgstr ""
+
+#: ops/api/playbook.py:39
+msgid "Currently playbook is being used in a job"
+msgstr ""
+
+#: ops/api/playbook.py:93
+msgid "Unsupported file content"
+msgstr ""
+
+#: ops/api/playbook.py:95 ops/api/playbook.py:141 ops/api/playbook.py:189
+msgid "Invalid file path"
+msgstr ""
+
+#: ops/api/playbook.py:167
+msgid "This file can not be rename"
+msgstr ""
+
+#: ops/api/playbook.py:186
+msgid "File already exists"
+msgstr ""
+
+#: ops/api/playbook.py:204
+msgid "File key is required"
+msgstr ""
+
+#: ops/api/playbook.py:207
+msgid "This file can not be delete"
+msgstr ""
+
+#: ops/apps.py:9
+msgid "App Ops"
+msgstr ""
+
+#: ops/const.py:6
+msgid "Push"
+msgstr ""
+
+#: ops/const.py:7
+msgid "Verify"
+msgstr ""
+
+#: ops/const.py:8
+msgid "Collect"
+msgstr ""
+
+#: ops/const.py:19
+msgid "Custom password"
+msgstr ""
+
+#: ops/const.py:20
+msgid "All assets use the same random password"
+msgstr ""
+
+#: ops/const.py:21
+msgid "All assets use different random password"
+msgstr ""
+
+#: ops/const.py:33
+msgid "Blank"
+msgstr ""
+
+#: ops/const.py:34
+msgid "VCS"
+msgstr ""
+
+#: ops/const.py:38 ops/models/adhoc.py:44
+msgid "Adhoc"
+msgstr ""
+
+#: ops/const.py:39 ops/models/job.py:144
+msgid "Playbook"
+msgstr ""
+
+#: ops/const.py:40
+msgid "Upload File"
+msgstr ""
+
+#: ops/const.py:44
+msgid "Privileged Only"
+msgstr ""
+
+#: ops/const.py:45
+msgid "Privileged First"
+msgstr ""
+
+#: ops/const.py:51 ops/const.py:61
+msgid "Powershell"
+msgstr ""
+
+#: ops/const.py:52 ops/const.py:62
+msgid "Python"
+msgstr ""
+
+#: ops/const.py:53 ops/const.py:63
+msgid "MySQL"
+msgstr ""
+
+#: ops/const.py:54 ops/const.py:65
+msgid "PostgreSQL"
+msgstr ""
+
+#: ops/const.py:55 ops/const.py:66
+msgid "SQLServer"
+msgstr ""
+
+#: ops/const.py:56 ops/const.py:68
+msgid "Raw"
+msgstr ""
+
+#: ops/const.py:64
+msgid "MariaDB"
+msgstr ""
+
+#: ops/const.py:67
+msgid "Oracle"
+msgstr ""
+
+#: ops/const.py:74
+msgid "Timeout"
+msgstr ""
+
+#: ops/exception.py:6
+msgid "no valid program entry found."
+msgstr ""
+
+#: ops/mixin.py:23 ops/mixin.py:102 settings/serializers/auth/ldap.py:66
+msgid "Periodic run"
+msgstr "Periodic"
+
+#: ops/mixin.py:25 ops/mixin.py:88 ops/mixin.py:108
+#: settings/serializers/auth/ldap.py:73
+msgid "Interval"
+msgstr ""
+
+#: ops/mixin.py:28 ops/mixin.py:86 ops/mixin.py:105
+#: settings/serializers/auth/ldap.py:70
+msgid "Crontab"
+msgstr ""
+
+#: ops/mixin.py:110
+msgid "Run period"
+msgstr "Period"
+
+#: ops/mixin.py:119
+msgid "* Please enter a valid crontab expression"
+msgstr ""
+
+#: ops/mixin.py:126
+msgid "Range {} to {}"
+msgstr ""
+
+#: ops/mixin.py:137
+msgid "Require interval or crontab setting"
+msgstr ""
+
+#: ops/models/adhoc.py:21
+msgid "Pattern"
+msgstr ""
+
+#: ops/models/adhoc.py:23 ops/models/job.py:141
+msgid "Module"
+msgstr ""
+
+#: ops/models/adhoc.py:24 ops/models/celery.py:81 ops/models/job.py:139
+#: terminal/models/component/task.py:14
+msgid "Args"
+msgstr ""
+
+#: ops/models/base.py:19
+msgid "Account policy"
+msgstr ""
+
+#: ops/models/base.py:20
+msgid "Last execution"
+msgstr ""
+
+#: ops/models/base.py:22 ops/serializers/job.py:17
+msgid "Date last run"
+msgstr ""
+
+#: ops/models/base.py:51 ops/models/job.py:232
+#: xpack/plugins/cloud/models.py:202
+msgid "Result"
+msgstr ""
+
+#: ops/models/base.py:52 ops/models/job.py:233
+msgid "Summary"
+msgstr ""
+
+#: ops/models/celery.py:16
+msgid "Date last publish"
+msgstr ""
+
+#: ops/models/celery.py:70
+msgid "Celery Task"
+msgstr ""
+
+#: ops/models/celery.py:73
+msgid "Can view task monitor"
+msgstr ""
+
+#: ops/models/celery.py:82 terminal/models/component/task.py:15
+msgid "Kwargs"
+msgstr ""
+
+#: ops/models/celery.py:84 terminal/models/session/sharing.py:128
+#: tickets/const.py:26
+msgid "Finished"
+msgstr ""
+
+#: ops/models/celery.py:85
+msgid "Date published"
+msgstr ""
+
+#: ops/models/celery.py:110
+msgid "Celery Task Execution"
+msgstr ""
+
+#: ops/models/job.py:142
+msgid "Chdir"
+msgstr ""
+
+#: ops/models/job.py:143
+msgid "Timeout (Seconds)"
+msgstr ""
+
+#: ops/models/job.py:148
+msgid "Use Parameter Define"
+msgstr ""
+
+#: ops/models/job.py:149
+msgid "Parameters define"
+msgstr ""
+
+#: ops/models/job.py:150
+msgid "Runas"
+msgstr ""
+
+#: ops/models/job.py:152
+msgid "Runas policy"
+msgstr ""
+
+#: ops/models/job.py:216 terminal/notifications.py:174
+msgid "Job"
+msgstr ""
+
+#: ops/models/job.py:239
+msgid "Material"
+msgstr ""
+
+#: ops/models/job.py:241
+msgid "Material Type"
+msgstr ""
+
+#: ops/models/job.py:558
+msgid "Job Execution"
+msgstr ""
+
+#: ops/models/playbook.py:33
+msgid "CreateMethod"
+msgstr ""
+
+#: ops/models/playbook.py:34
+msgid "VCS URL"
+msgstr ""
+
+#: ops/notifications.py:18
+msgid "Server performance"
+msgstr ""
+
+#: ops/notifications.py:24
+msgid "Terminal health check warning"
+msgstr ""
+
+#: ops/notifications.py:69
+#, python-brace-format
+msgid "The terminal is offline: {name}"
+msgstr ""
+
+#: ops/notifications.py:74
+#, python-brace-format
+msgid "Disk used more than {max_threshold}%: => {value}"
+msgstr ""
+
+#: ops/notifications.py:79
+#, python-brace-format
+msgid "Memory used more than {max_threshold}%: => {value}"
+msgstr ""
+
+#: ops/notifications.py:84
+#, python-brace-format
+msgid "CPU load more than {max_threshold}: => {value}"
+msgstr ""
+
+#: ops/serializers/celery.py:33
+msgid "Execution cycle"
+msgstr ""
+
+#: ops/serializers/celery.py:35
+msgid "Next execution time"
+msgstr ""
+
+#: ops/serializers/job.py:15
+msgid "Execute after saving"
+msgstr "Execute after saving"
+
+#: ops/serializers/job.py:52
+msgid "Average time cost"
+msgstr ""
+
+#: ops/serializers/job.py:65
+msgid "Job type"
+msgstr ""
+
+#: ops/serializers/job.py:68 terminal/serializers/session.py:53
+msgid "Is finished"
+msgstr "Finished"
+
+#: ops/serializers/job.py:69
+#: settings/templates/ldap/_msg_import_ldap_user.html:7
+msgid "Time cost"
+msgstr ""
+
+#: ops/tasks.py:37
+msgid "Run ansible task"
+msgstr ""
+
+#: ops/tasks.py:71
+msgid "Run ansible task execution"
+msgstr ""
+
+#: ops/tasks.py:93
+msgid "Clear celery periodic tasks"
+msgstr ""
+
+#: ops/tasks.py:114
+msgid "Create or update periodic tasks"
+msgstr ""
+
+#: ops/tasks.py:122
+msgid "Periodic check service performance"
+msgstr ""
+
+#: ops/tasks.py:128
+msgid "Clean up unexpected jobs"
+msgstr ""
+
+#: ops/tasks.py:135
+msgid "Clean job_execution db record"
+msgstr ""
+
+#: ops/templates/ops/celery_task_log.html:4
+msgid "Task log"
+msgstr ""
+
+#: ops/templates/ops/celery_task_log.html:71 terminal/serializers/task.py:10
+msgid "Task name"
+msgstr ""
+
+#: ops/variables.py:24
+msgid "The current user`s username of JumpServer"
+msgstr ""
+
+#: ops/variables.py:25
+msgid "The id of the asset in the JumpServer"
+msgstr ""
+
+#: ops/variables.py:26
+msgid "The type of the asset in the JumpServer"
+msgstr ""
+
+#: ops/variables.py:27
+msgid "The category of the asset in the JumpServer"
+msgstr ""
+
+#: ops/variables.py:28
+msgid "The name of the asset in the JumpServer"
+msgstr ""
+
+#: ops/variables.py:29
+msgid "Address used to connect this asset in JumpServer"
+msgstr ""
+
+#: ops/variables.py:30
+msgid "Port used to connect this asset in JumpServer"
+msgstr ""
+
+#: ops/variables.py:31
+msgid "ID of the job"
+msgstr ""
+
+#: ops/variables.py:32
+msgid "Name of the job"
+msgstr ""
+
+#: orgs/api.py:62
+msgid "The current organization ({}) cannot be deleted"
+msgstr ""
+
+#: orgs/api.py:67
+msgid ""
+"LDAP synchronization is set to the current organization. Please switch to "
+"another organization before deleting"
+msgstr ""
+
+#: orgs/api.py:77
+msgid "The organization have resource ({}) cannot be deleted"
+msgstr ""
+
+#: orgs/apps.py:7
+msgid "App Organizations"
+msgstr ""
+
+#: orgs/mixins/models.py:57 orgs/mixins/serializers.py:25 orgs/models.py:91
+#: rbac/const.py:7 rbac/models/rolebinding.py:56
+#: rbac/serializers/rolebinding.py:44 settings/serializers/auth/ldap.py:63
+#: terminal/templates/terminal/_msg_command_warning.html:21
+#: terminal/templates/terminal/_msg_session_sharing.html:14
+#: tickets/models/ticket/general.py:302 tickets/serializers/ticket/ticket.py:60
+msgid "Organization"
+msgstr ""
+
+#: orgs/mixins/serializers.py:26 rbac/serializers/rolebinding.py:27
+msgid "Org name"
+msgstr ""
+
+#: orgs/models.py:14
+msgid "GLOBAL"
+msgstr ""
+
+#: orgs/models.py:16
+msgid "DEFAULT"
+msgstr ""
+
+#: orgs/models.py:18
+msgid "SYSTEM"
+msgstr ""
+
+#: orgs/models.py:83 rbac/models/role.py:36 settings/models.py:185
+#: terminal/models/applet/applet.py:41
+msgid "Builtin"
+msgstr "Builtin"
+
+#: orgs/models.py:93
+msgid "Can view root org"
+msgstr ""
+
+#: orgs/models.py:94
+msgid "Can view all joined org"
+msgstr ""
+
+#: orgs/models.py:233
+msgid "Can not delete virtual org"
+msgstr ""
+
+#: orgs/serializers.py:10 perms/serializers/permission.py:38
+#: rbac/serializers/role.py:27 users/serializers/group.py:54
+msgid "Users amount"
+msgstr ""
+
+#: orgs/serializers.py:11 perms/serializers/permission.py:39
+msgid "User groups amount"
+msgstr ""
+
+#: orgs/serializers.py:14 perms/serializers/permission.py:41
+msgid "Nodes amount"
+msgstr ""
+
+#: orgs/serializers.py:15
+msgid "Domains amount"
+msgstr ""
+
+#: orgs/serializers.py:16
+msgid "Gateways amount"
+msgstr ""
+
+#: orgs/serializers.py:18
+msgid "Asset permissions amount"
+msgstr ""
+
+#: orgs/tasks.py:9
+msgid "Refresh organization cache"
+msgstr ""
+
+#: perms/apps.py:9
+msgid "App Permissions"
+msgstr ""
+
+#: perms/const.py:12
+msgid "Connect (All protocols)"
+msgstr ""
+
+#: perms/const.py:13
+msgid "Upload (RDP, SFTP)"
+msgstr ""
+
+#: perms/const.py:14
+msgid "Download (RDP, SFTP)"
+msgstr ""
+
+#: perms/const.py:15
+msgid "Copy (RDP, VNC)"
+msgstr ""
+
+#: perms/const.py:16
+msgid "Paste (RDP, VNC)"
+msgstr ""
+
+#: perms/const.py:17
+msgid "Delete (SFTP)"
+msgstr ""
+
+#: perms/const.py:18
+msgid "Share (SSH)"
+msgstr ""
+
+#: perms/const.py:28
+msgid "Transfer"
+msgstr ""
+
+#: perms/const.py:29
+msgid "Clipboard"
+msgstr ""
+
+#: perms/models/asset_permission.py:89
+msgid "Asset permission"
+msgstr ""
+
+#: perms/models/perm_node.py:68
+msgid "Ungrouped"
+msgstr ""
+
+#: perms/models/perm_node.py:70
+msgid "Favorite"
+msgstr ""
+
+#: perms/models/perm_node.py:121
+msgid "Permed asset"
+msgstr ""
+
+#: perms/models/perm_node.py:123
+msgid "Can view my assets"
+msgstr ""
+
+#: perms/models/perm_node.py:124
+msgid "Can view user assets"
+msgstr ""
+
+#: perms/models/perm_node.py:125
+msgid "Can view usergroup assets"
+msgstr ""
+
+#: perms/models/perm_node.py:136
+msgid "Permed account"
+msgstr ""
+
+#: perms/notifications.py:12 perms/notifications.py:44
+msgid "today"
+msgstr ""
+
+#: perms/notifications.py:12 perms/notifications.py:44
+#: settings/serializers/feature.py:117
+msgid "day"
+msgstr ""
+
+#: perms/notifications.py:15
+msgid "You permed assets is about to expire"
+msgstr ""
+
+#: perms/notifications.py:20
+msgid "permed assets"
+msgstr ""
+
+#: perms/notifications.py:59
+msgid "Asset permissions is about to expire"
+msgstr ""
+
+#: perms/notifications.py:64
+msgid "asset permissions of organization {}"
+msgstr ""
+
+#: perms/tasks.py:27
+msgid "Check asset permission expired"
+msgstr ""
+
+#: perms/tasks.py:40
+msgid "Send asset permission expired notification"
+msgstr ""
+
+#: perms/templates/perms/_msg_item_permissions_expire.html:7
+#: perms/templates/perms/_msg_permed_items_expire.html:7
+#, python-format
+msgid ""
+"\n"
+" The following %(item_type)s will expire in %(count)s\n"
+" "
+msgstr ""
+
+#: rbac/api/role.py:35
+msgid "Internal role, can't be destroy"
+msgstr ""
+
+#: rbac/api/role.py:40
+msgid "The role has been bound to users, can't be destroy"
+msgstr ""
+
+#: rbac/api/role.py:102
+msgid "Internal role, can't be update"
+msgstr ""
+
+#: rbac/api/rolebinding.py:45
+msgid "{} at least one system role"
+msgstr ""
+
+#: rbac/apps.py:7
+msgid "App RBAC"
+msgstr ""
+
+#: rbac/builtin.py:115
+msgid "SystemAdmin"
+msgstr ""
+
+#: rbac/builtin.py:118
+msgid "SystemAuditor"
+msgstr ""
+
+#: rbac/builtin.py:121
+msgid "SystemComponent"
+msgstr ""
+
+#: rbac/builtin.py:127
+msgid "OrgAdmin"
+msgstr "Org Admin"
+
+#: rbac/builtin.py:130
+msgid "OrgAuditor"
+msgstr "Org Auditor"
+
+#: rbac/builtin.py:133
+msgid "OrgUser"
+msgstr "Org User"
+
+#: rbac/models/menu.py:13
+msgid "Menu permission"
+msgstr ""
+
+#: rbac/models/menu.py:15
+msgid "Can view console view"
+msgstr ""
+
+#: rbac/models/menu.py:16
+msgid "Can view audit view"
+msgstr ""
+
+#: rbac/models/menu.py:17
+msgid "Can view workbench view"
+msgstr ""
+
+#: rbac/models/menu.py:18
+msgid "Can view web terminal"
+msgstr ""
+
+#: rbac/models/menu.py:19
+msgid "Can view file manager"
+msgstr ""
+
+#: rbac/models/menu.py:20
+msgid "Can view System Tools"
+msgstr ""
+
+#: rbac/models/permission.py:78 rbac/models/role.py:34
+msgid "Permissions"
+msgstr ""
+
+#: rbac/models/role.py:31 rbac/models/rolebinding.py:46
+#: rbac/serializers/role.py:12 settings/serializers/auth/oauth2.py:36
+msgid "Scope"
+msgstr ""
+
+#: rbac/models/role.py:46 rbac/models/rolebinding.py:52
+#: users/models/user.py:870
+msgid "Role"
+msgstr ""
+
+#: rbac/models/role.py:144
+msgid "System role"
+msgstr ""
+
+#: rbac/models/role.py:152
+msgid "Organization role"
+msgstr ""
+
+#: rbac/models/rolebinding.py:61
+msgid "Role binding"
+msgstr ""
+
+#: rbac/models/rolebinding.py:161
+msgid "All organizations"
+msgstr ""
+
+#: rbac/models/rolebinding.py:190
+msgid ""
+"User last role in org, can not be delete, you can remove user from org "
+"instead"
+msgstr ""
+
+#: rbac/models/rolebinding.py:197
+msgid "Organization role binding"
+msgstr ""
+
+#: rbac/models/rolebinding.py:212
+msgid "System role binding"
+msgstr ""
+
+#: rbac/serializers/permission.py:25 users/serializers/profile.py:108
+msgid "Perms"
+msgstr ""
+
+#: rbac/serializers/role.py:28 terminal/models/applet/applet.py:34
+#: terminal/models/virtualapp/virtualapp.py:20
+msgid "Display name"
+msgstr ""
+
+#: rbac/serializers/rolebinding.py:60
+msgid "Has bound this role"
+msgstr ""
+
+#: rbac/tree.py:17 rbac/tree.py:18
+msgid "All permissions"
+msgstr ""
+
+#: rbac/tree.py:24
+msgid "Console view"
+msgstr ""
+
+#: rbac/tree.py:25
+msgid "Workbench view"
+msgstr ""
+
+#: rbac/tree.py:26
+msgid "Audit view"
+msgstr ""
+
+#: rbac/tree.py:27 settings/models.py:161
+msgid "System setting"
+msgstr ""
+
+#: rbac/tree.py:37
+msgid "Session audits"
+msgstr ""
+
+#: rbac/tree.py:49
+msgid "Cloud import"
+msgstr ""
+
+#: rbac/tree.py:50
+msgid "Backup account"
+msgstr ""
+
+#: rbac/tree.py:51
+msgid "Gather account"
+msgstr ""
+
+#: rbac/tree.py:53
+msgid "Asset change auth"
+msgstr ""
+
+#: rbac/tree.py:54
+msgid "Terminal setting"
+msgstr ""
+
+#: rbac/tree.py:55 settings/serializers/feature.py:126
+msgid "Job center"
+msgstr ""
+
+#: rbac/tree.py:56
+msgid "My assets"
+msgstr ""
+
+#: rbac/tree.py:57
+msgid "App ops"
+msgstr ""
+
+#: rbac/tree.py:58 terminal/models/applet/applet.py:52
+#: terminal/models/applet/applet.py:317 terminal/models/applet/host.py:30
+#: terminal/serializers/applet.py:15
+msgid "Applet"
+msgstr ""
+
+#: rbac/tree.py:128
+msgid "App organizations"
+msgstr ""
+
+#: rbac/tree.py:129
+msgid "Ticket comment"
+msgstr ""
+
+#: rbac/tree.py:130 settings/serializers/feature.py:109
+#: settings/serializers/feature.py:111 tickets/models/ticket/general.py:307
+msgid "Ticket"
+msgstr ""
+
+#: rbac/tree.py:131
+msgid "Common setting"
+msgstr ""
+
+#: rbac/tree.py:132
+msgid "View permission tree"
+msgstr ""
+
+#: settings/api/chat.py:40
+msgid "Chat AI is not enabled"
+msgstr ""
+
+#: settings/api/chat.py:79 settings/api/dingtalk.py:31
+#: settings/api/feishu.py:36 settings/api/slack.py:34 settings/api/sms.py:160
+#: settings/api/vault.py:40 settings/api/wecom.py:37
+msgid "Test success"
+msgstr ""
+
+#: settings/api/email.py:22
+msgid "Test mail sent to {}, please check"
+msgstr ""
+
+#: settings/api/ldap.py:101
+msgid ""
+"Users are not synchronized, please click the user synchronization button"
+msgstr ""
+
+#: settings/api/ldap.py:137
+msgid "Get ldap users is None"
+msgstr ""
+
+#: settings/api/ldap.py:147
+msgid "Imported {} users successfully (Organization: {})"
+msgstr ""
+
+#: settings/api/sms.py:142
+msgid "Invalid SMS platform"
+msgstr ""
+
+#: settings/api/sms.py:148
+msgid "test_phone is required"
+msgstr ""
+
+#: settings/apps.py:7
+msgid "App Settings"
+msgstr ""
+
+#: settings/models.py:37 users/models/preference.py:14
+msgid "Encrypted"
+msgstr ""
+
+#: settings/models.py:163
+msgid "Can change email setting"
+msgstr ""
+
+#: settings/models.py:164
+msgid "Can change auth setting"
+msgstr ""
+
+#: settings/models.py:165
+msgid "Can change auth ops"
+msgstr ""
+
+#: settings/models.py:166
+msgid "Can change auth ticket"
+msgstr ""
+
+#: settings/models.py:167
+msgid "Can change virtual app setting"
+msgstr ""
+
+#: settings/models.py:168
+msgid "Can change auth announcement"
+msgstr ""
+
+#: settings/models.py:169
+msgid "Can change vault setting"
+msgstr ""
+
+#: settings/models.py:170
+msgid "Can change chat ai setting"
+msgstr ""
+
+#: settings/models.py:171
+msgid "Can change system msg sub setting"
+msgstr ""
+
+#: settings/models.py:172
+msgid "Can change sms setting"
+msgstr ""
+
+#: settings/models.py:173
+msgid "Can change security setting"
+msgstr ""
+
+#: settings/models.py:174
+msgid "Can change clean setting"
+msgstr ""
+
+#: settings/models.py:175
+msgid "Can change interface setting"
+msgstr ""
+
+#: settings/models.py:176
+msgid "Can change license setting"
+msgstr ""
+
+#: settings/models.py:177
+msgid "Can change terminal setting"
+msgstr ""
+
+#: settings/models.py:178
+msgid "Can change other setting"
+msgstr ""
+
+#: settings/models.py:188
+msgid "Chat prompt"
+msgstr ""
+
+#: settings/notifications.py:23
+msgid "Notification of Synchronized LDAP User Task Results"
+msgstr ""
+
+#: settings/serializers/auth/base.py:10
+msgid "Authentication"
+msgstr ""
+
+#: settings/serializers/auth/base.py:12
+msgid "LDAP Auth"
+msgstr ""
+
+#: settings/serializers/auth/base.py:13
+msgid "CAS Auth"
+msgstr ""
+
+#: settings/serializers/auth/base.py:14
+msgid "OPENID Auth"
+msgstr ""
+
+#: settings/serializers/auth/base.py:15
+msgid "SAML2 Auth"
+msgstr ""
+
+#: settings/serializers/auth/base.py:16
+msgid "OAuth2 Auth"
+msgstr ""
+
+#: settings/serializers/auth/base.py:17
+msgid "RADIUS Auth"
+msgstr ""
+
+#: settings/serializers/auth/base.py:18
+msgid "DingTalk Auth"
+msgstr ""
+
+#: settings/serializers/auth/base.py:19
+msgid "FeiShu Auth"
+msgstr ""
+
+#: settings/serializers/auth/base.py:20
+msgid "Slack Auth"
+msgstr ""
+
+#: settings/serializers/auth/base.py:21
+msgid "WeCom Auth"
+msgstr ""
+
+#: settings/serializers/auth/base.py:22
+msgid "SSO Auth"
+msgstr ""
+
+#: settings/serializers/auth/base.py:23
+msgid "Passkey Auth"
+msgstr ""
+
+#: settings/serializers/auth/base.py:26
+msgid "Forgot Password URL"
+msgstr ""
+
+#: settings/serializers/auth/base.py:29
+msgid "Login redirection prompt"
+msgstr ""
+
+#: settings/serializers/auth/cas.py:10 settings/serializers/auth/cas.py:12
+msgid "CAS"
+msgstr ""
+
+#: settings/serializers/auth/cas.py:13 settings/serializers/auth/ldap.py:42
+#: settings/serializers/auth/oidc.py:54
+msgid "Server"
+msgstr ""
+
+#: settings/serializers/auth/cas.py:16
+msgid "Proxy Server"
+msgstr ""
+
+#: settings/serializers/auth/cas.py:18 settings/serializers/auth/oauth2.py:54
+#: settings/serializers/auth/saml2.py:33
+msgid "Logout completely"
+msgstr ""
+
+#: settings/serializers/auth/cas.py:23
+msgid "Username attr"
+msgstr ""
+
+#: settings/serializers/auth/cas.py:26
+msgid "Enable attributes map"
+msgstr ""
+
+#: settings/serializers/auth/cas.py:28 settings/serializers/auth/ldap.py:58
+#: settings/serializers/auth/oauth2.py:56 settings/serializers/auth/oidc.py:37
+#: settings/serializers/auth/saml2.py:32
+msgid "User attribute"
+msgstr ""
+
+#: settings/serializers/auth/cas.py:30
+msgid "Create user"
+msgstr ""
+
+#: settings/serializers/auth/cas.py:31
+msgid "Automatically create a new user if not found."
+msgstr ""
+
+#: settings/serializers/auth/dingtalk.py:15
+msgid "Dingtalk"
+msgstr ""
+
+#: settings/serializers/auth/feishu.py:16
+msgid "Lark"
+msgstr ""
+
+#: settings/serializers/auth/ldap.py:39 settings/serializers/auth/ldap.py:84
+msgid "LDAP"
+msgstr ""
+
+#: settings/serializers/auth/ldap.py:43
+msgid "eg: ldap://localhost:389"
+msgstr ""
+
+#: settings/serializers/auth/ldap.py:45
+msgid "Bind DN"
+msgstr ""
+
+#: settings/serializers/auth/ldap.py:50
+msgid "User OU"
+msgstr ""
+
+#: settings/serializers/auth/ldap.py:51
+msgid "Use | split multi OUs"
+msgstr ""
+
+#: settings/serializers/auth/ldap.py:54
+msgid "User search filter"
+msgstr ""
+
+#: settings/serializers/auth/ldap.py:55
+#, python-format
+msgid "Choice may be (cn|uid|sAMAccountName)=%(user)s)"
+msgstr ""
+
+#: settings/serializers/auth/ldap.py:59
+msgid ""
+"User attr map present how to map LDAP user attr to jumpserver, username,name,"
+"email is jumpserver attr"
+msgstr ""
+
+#: settings/serializers/auth/ldap.py:77
+msgid "Connect timeout (s)"
+msgstr ""
+
+#: settings/serializers/auth/ldap.py:79
+msgid "Search paged size (piece)"
+msgstr ""
+
+#: settings/serializers/auth/oauth2.py:18
+#: settings/serializers/auth/oauth2.py:21
+msgid "OAuth2"
+msgstr ""
+
+#: settings/serializers/auth/oauth2.py:24
+msgid "Logo"
+msgstr ""
+
+#: settings/serializers/auth/oauth2.py:27
+msgid "Service provider"
+msgstr ""
+
+#: settings/serializers/auth/oauth2.py:30 settings/serializers/auth/oidc.py:19
+msgid "Client Id"
+msgstr ""
+
+#: settings/serializers/auth/oauth2.py:33 settings/serializers/auth/oidc.py:22
+#: xpack/plugins/cloud/serializers/account_attrs.py:38
+msgid "Client Secret"
+msgstr ""
+
+#: settings/serializers/auth/oauth2.py:39 settings/serializers/auth/oidc.py:68
+msgid "Authorization endpoint"
+msgstr ""
+
+#: settings/serializers/auth/oauth2.py:42 settings/serializers/auth/oidc.py:71
+msgid "Token endpoint"
+msgstr ""
+
+#: settings/serializers/auth/oauth2.py:45 settings/serializers/auth/oidc.py:30
+#: settings/serializers/auth/sms.py:106
+msgid "Request method"
+msgstr ""
+
+#: settings/serializers/auth/oauth2.py:49 settings/serializers/auth/oidc.py:77
+msgid "Userinfo endpoint"
+msgstr ""
+
+#: settings/serializers/auth/oauth2.py:52 settings/serializers/auth/oidc.py:80
+msgid "End session endpoint"
+msgstr ""
+
+#: settings/serializers/auth/oauth2.py:59 settings/serializers/auth/oidc.py:98
+#: settings/serializers/auth/saml2.py:34
+msgid "Always update user"
+msgstr ""
+
+#: settings/serializers/auth/oidc.py:12 settings/serializers/auth/oidc.py:63
+msgid "OIDC"
+msgstr ""
+
+#: settings/serializers/auth/oidc.py:16
+msgid "Base site URL"
+msgstr ""
+
+#: settings/serializers/auth/oidc.py:32
+msgid "Share session"
+msgstr ""
+
+#: settings/serializers/auth/oidc.py:34
+msgid "Ignore SSL verification"
+msgstr ""
+
+#: settings/serializers/auth/oidc.py:38
+msgid ""
+"User attr map present how to map OpenID user attr to jumpserver, username,"
+"name,email is jumpserver attr"
+msgstr ""
+
+#: settings/serializers/auth/oidc.py:41
+msgid "Enable PKCE"
+msgstr ""
+
+#: settings/serializers/auth/oidc.py:43
+msgid "Code challenge method"
+msgstr ""
+
+#: settings/serializers/auth/oidc.py:51
+msgid "Use Keycloak"
+msgstr ""
+
+#: settings/serializers/auth/oidc.py:57
+msgid "Realm name"
+msgstr ""
+
+#: settings/serializers/auth/oidc.py:65
+msgid "Provider endpoint"
+msgstr ""
+
+#: settings/serializers/auth/oidc.py:74
+msgid "JWKS endpoint"
+msgstr ""
+
+#: settings/serializers/auth/oidc.py:83
+msgid "Signature algorithm"
+msgstr ""
+
+#: settings/serializers/auth/oidc.py:86
+msgid "Signing key"
+msgstr ""
+
+#: settings/serializers/auth/oidc.py:88
+msgid "Scopes"
+msgstr ""
+
+#: settings/serializers/auth/oidc.py:90
+msgid "ID Token max age (s)"
+msgstr ""
+
+#: settings/serializers/auth/oidc.py:93
+msgid "ID Token include claims"
+msgstr ""
+
+#: settings/serializers/auth/oidc.py:95
+msgid "Use state"
+msgstr ""
+
+#: settings/serializers/auth/oidc.py:96
+msgid "Use nonce"
+msgstr ""
+
+#: settings/serializers/auth/passkey.py:12
+msgid "Only SSL domain can use passkey auth"
+msgstr ""
+
+#: settings/serializers/auth/passkey.py:15
+msgid "FIDO Server ID"
+msgstr ""
+
+#: settings/serializers/auth/passkey.py:17
+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 ""
+
+#: settings/serializers/auth/passkey.py:22
+msgid "FIDO Server name"
+msgstr ""
+
+#: settings/serializers/auth/radius.py:13
+#: settings/serializers/auth/radius.py:15
+msgid "Radius"
+msgstr ""
+
+#: settings/serializers/auth/radius.py:21
+msgid "OTP in Radius"
+msgstr ""
+
+#: settings/serializers/auth/saml2.py:10 settings/serializers/auth/saml2.py:13
+msgid "SAML2"
+msgstr ""
+
+#: settings/serializers/auth/saml2.py:16
+msgid "IDP Metadata URL"
+msgstr ""
+
+#: settings/serializers/auth/saml2.py:19
+msgid "IDP Metadata XML"
+msgstr ""
+
+#: settings/serializers/auth/saml2.py:22
+msgid "SP advanced settings"
+msgstr ""
+
+#: settings/serializers/auth/saml2.py:26
+msgid "SP private key"
+msgstr ""
+
+#: settings/serializers/auth/saml2.py:30
+msgid "SP cert"
+msgstr ""
+
+#: settings/serializers/auth/sms.py:19
+msgid "SMS provider / Protocol"
+msgstr ""
+
+#: settings/serializers/auth/sms.py:22
+msgid "SMS code length"
+msgstr ""
+
+#: settings/serializers/auth/sms.py:27 settings/serializers/auth/sms.py:49
+#: settings/serializers/auth/sms.py:57 settings/serializers/auth/sms.py:66
+#: settings/serializers/auth/sms.py:77 settings/serializers/msg.py:83
+msgid "Signature"
+msgstr ""
+
+#: settings/serializers/auth/sms.py:28 settings/serializers/auth/sms.py:50
+#: settings/serializers/auth/sms.py:58 settings/serializers/auth/sms.py:67
+msgid "Template code"
+msgstr ""
+
+#: settings/serializers/auth/sms.py:35
+msgid "Test phone"
+msgstr ""
+
+#: settings/serializers/auth/sms.py:64
+msgid "App Access Address"
+msgstr ""
+
+#: settings/serializers/auth/sms.py:65
+msgid "Signature channel number"
+msgstr ""
+
+#: settings/serializers/auth/sms.py:73
+msgid "Enterprise code"
+msgstr ""
+
+#: settings/serializers/auth/sms.py:74
+msgid "Shared secret"
+msgstr ""
+
+#: settings/serializers/auth/sms.py:75
+msgid "Original number"
+msgstr ""
+
+#: settings/serializers/auth/sms.py:76
+msgid "Business type"
+msgstr ""
+
+#: settings/serializers/auth/sms.py:80
+#, 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 ""
+
+#: settings/serializers/auth/sms.py:89
+#, python-brace-format
+msgid "The template needs to contain {code}"
+msgstr ""
+
+#: settings/serializers/auth/sms.py:92
+msgid "Signature + Template must not exceed 65 words"
+msgstr ""
+
+#: settings/serializers/auth/sms.py:101
+msgid "URL"
+msgstr ""
+
+#: settings/serializers/auth/sso.py:16
+msgid "Enable SSO auth"
+msgstr ""
+
+#: settings/serializers/auth/sso.py:17
+msgid "Other service can using SSO token login to JumpServer without password"
+msgstr ""
+
+#: settings/serializers/auth/sso.py:20
+msgid "SSO auth key TTL"
+msgstr ""
+
+#: settings/serializers/auth/sso.py:20
+#: xpack/plugins/cloud/serializers/account_attrs.py:200
+msgid "Unit: second"
+msgstr ""
+
+#: settings/serializers/basic.py:11
+msgid "Site URL"
+msgstr ""
+
+#: settings/serializers/basic.py:13
+msgid ""
+"External URL, email links or other system callbacks are used to access it, "
+"eg: http://dev.jumpserver.org:8080"
+msgstr ""
+"Site URL are commonly used in emails sent or as callback addresses for "
+"external systems. eg: http://dev.jumpserver.org:8080"
+
+#: settings/serializers/basic.py:18
+msgid "User guide url"
+msgstr ""
+
+#: settings/serializers/basic.py:19
+msgid "User first login update profile done redirect to it"
+msgstr ""
+
+#: settings/serializers/basic.py:22
+msgid "Global organization"
+msgstr ""
+
+#: settings/serializers/basic.py:23
+msgid "The name of global organization to display"
+msgstr ""
+
+#: settings/serializers/basic.py:26
+msgid "Help Docs URL"
+msgstr "Document URL"
+
+#: settings/serializers/basic.py:27
+msgid "default: http://docs.jumpserver.org"
+msgstr ""
+
+#: settings/serializers/basic.py:30
+msgid "Help Support URL"
+msgstr "Support URL"
+
+#: settings/serializers/basic.py:31
+msgid "default: http://www.jumpserver.org/support/"
+msgstr ""
+
+#: settings/serializers/basic.py:44
+msgid "Organization name already exists"
+msgstr ""
+
+#: settings/serializers/cleaning.py:11
+msgid "Period clean"
+msgstr ""
+
+#: settings/serializers/cleaning.py:15
+msgid "Login log retention days (day)"
+msgstr ""
+
+#: settings/serializers/cleaning.py:19
+msgid "Task log retention days (day)"
+msgstr ""
+
+#: settings/serializers/cleaning.py:23
+msgid "Operate log retention days (day)"
+msgstr ""
+
+#: settings/serializers/cleaning.py:27
+msgid "FTP log retention days (day)"
+msgstr ""
+
+#: settings/serializers/cleaning.py:31
+msgid "Cloud sync task history retention days (day)"
+msgstr ""
+
+#: settings/serializers/cleaning.py:35
+msgid "job execution retention days (day)"
+msgstr ""
+
+#: settings/serializers/cleaning.py:39
+msgid "Activity log retention days (day)"
+msgstr ""
+
+#: settings/serializers/cleaning.py:42
+msgid "Session log retention days (day)"
+msgstr ""
+
+#: settings/serializers/cleaning.py:44
+msgid ""
+"Session, record, command will be delete if more than duration, only in "
+"database, OSS will not be affected."
+msgstr ""
+
+#: settings/serializers/feature.py:18 settings/serializers/msg.py:68
+msgid "Subject"
+msgstr ""
+
+#: settings/serializers/feature.py:22
+msgid "More URL"
+msgstr ""
+
+#: settings/serializers/feature.py:36 settings/serializers/feature.py:38
+#: settings/serializers/feature.py:39
+msgid "Announcement"
+msgstr ""
+
+#: settings/serializers/feature.py:46
+msgid "Vault"
+msgstr ""
+
+#: settings/serializers/feature.py:55
+msgid "Mount Point"
+msgstr ""
+
+#: settings/serializers/feature.py:60
+msgid "Historical accounts retained count"
+msgstr "Retention"
+
+#: settings/serializers/feature.py:62
+msgid ""
+"If the specific value is less than 999, the system will automatically "
+"perform a task every night: check and delete historical accounts that exceed "
+"the predetermined number. If the value reaches or exceeds 999, no historical "
+"account deletion will be performed."
+msgstr ""
+
+#: settings/serializers/feature.py:71 settings/serializers/feature.py:75
+msgid "Chat AI"
+msgstr ""
+
+#: settings/serializers/feature.py:78
+msgid "Base URL"
+msgstr ""
+
+#: settings/serializers/feature.py:81 templates/_header_bar.html:90
+msgid "API Key"
+msgstr ""
+
+#: settings/serializers/feature.py:87
+msgid "GPT Model"
+msgstr ""
+
+#: settings/serializers/feature.py:114
+msgid "Default period"
+msgstr ""
+
+#: settings/serializers/feature.py:117
+msgid "hour"
+msgstr ""
+
+#: settings/serializers/feature.py:118
+msgid "Default unit"
+msgstr ""
+
+#: settings/serializers/feature.py:123
+msgid "Feature"
+msgstr ""
+
+#: settings/serializers/feature.py:127
+msgid "Allow user run batch command or not using ansible"
+msgstr ""
+
+#: settings/serializers/feature.py:131
+msgid "Command blacklist"
+msgstr ""
+
+#: settings/serializers/feature.py:132
+msgid "Commands that are not allowed execute."
+msgstr ""
+
+#: settings/serializers/feature.py:137 settings/serializers/feature.py:140
+#: terminal/models/virtualapp/provider.py:17
+#: terminal/models/virtualapp/virtualapp.py:36
+#: terminal/models/virtualapp/virtualapp.py:97
+#: terminal/serializers/virtualapp.py:32
+msgid "Virtual app"
+msgstr ""
+
+#: settings/serializers/msg.py:25
+msgid "SMTP"
+msgstr ""
+
+#: settings/serializers/msg.py:26
+msgid "EXCHANGE"
+msgstr ""
+
+#: settings/serializers/msg.py:36
+msgid "Tips: Some provider use token except password"
+msgstr ""
+
+#: settings/serializers/msg.py:39
+msgid "Sender"
+msgstr ""
+
+#: settings/serializers/msg.py:40
+msgid "Tips: Send mail account, default SMTP account as the send account"
+msgstr ""
+
+#: settings/serializers/msg.py:43
+msgid "Test recipient"
+msgstr ""
+
+#: settings/serializers/msg.py:44
+msgid "Tips: Used only as a test mail recipient"
+msgstr ""
+
+#: settings/serializers/msg.py:48
+msgid "If SMTP port is 465, may be select"
+msgstr ""
+
+#: settings/serializers/msg.py:51
+msgid "Use TLS"
+msgstr ""
+
+#: settings/serializers/msg.py:52
+msgid "If SMTP port is 587, may be select"
+msgstr ""
+
+#: settings/serializers/msg.py:55
+msgid "Subject prefix"
+msgstr ""
+
+#: settings/serializers/msg.py:58
+msgid "Email suffix"
+msgstr ""
+
+#: settings/serializers/msg.py:59
+msgid ""
+"This is used by default if no email is returned during SSO authentication"
+msgstr ""
+
+#: settings/serializers/msg.py:69
+msgid ""
+"Tips: When creating a user, send the subject of the email (eg:Create account "
+"successfully)"
+msgstr ""
+
+#: settings/serializers/msg.py:73
+msgid "Honorific"
+msgstr ""
+
+#: settings/serializers/msg.py:74
+msgid "Tips: When creating a user, send the honorific of the email (eg:Hello)"
+msgstr ""
+
+#: settings/serializers/msg.py:80
+#, python-brace-format
+msgid ""
+"Tips: When creating a user, send the content of the email, support "
+"{username} {name} {email} label"
+msgstr ""
+
+#: settings/serializers/msg.py:84
+msgid "Tips: Email signature (eg:jumpserver)"
+msgstr ""
+
+#: settings/serializers/other.py:8
+msgid "More..."
+msgstr ""
+
+#: settings/serializers/other.py:11
+msgid "Perm ungroup node"
+msgstr ""
+
+#: settings/serializers/other.py:12
+msgid "Perm single to ungroup node"
+msgstr ""
+
+#: settings/serializers/security.py:17
+msgid "User password expiration (day)"
+msgstr ""
+
+#: settings/serializers/security.py:19
+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 ""
+
+#: settings/serializers/security.py:26
+msgid "Recent password count"
+msgstr ""
+
+#: settings/serializers/security.py:28
+msgid ""
+"Tip: When the user resets the password, it cannot be the previous n "
+"historical passwords of the user"
+msgstr ""
+
+#: settings/serializers/security.py:34
+msgid "Minimum length (User)"
+msgstr ""
+
+#: settings/serializers/security.py:38
+msgid "Minimum length (Admin)"
+msgstr ""
+
+#: settings/serializers/security.py:47
+msgid "Digits"
+msgstr ""
+
+#: settings/serializers/security.py:50
+msgid "Special characters"
+msgstr ""
+
+#: settings/serializers/security.py:55
+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"
+msgstr ""
+
+#: settings/serializers/security.py:67 settings/serializers/security.py:77
+msgid "Login failure period (minute)"
+msgstr ""
+
+#: settings/serializers/security.py:81
+msgid "Login IP whitelist"
+msgstr ""
+
+#: settings/serializers/security.py:86
+msgid "Login IP blacklist"
+msgstr ""
+
+#: settings/serializers/security.py:91
+msgid "Only single device login"
+msgstr ""
+
+#: settings/serializers/security.py:92
+msgid ""
+"After the user logs in on the new device, other logged-in devices will "
+"automatically log out"
+msgstr ""
+
+#: settings/serializers/security.py:95
+msgid "Only exist user login"
+msgstr ""
+
+#: settings/serializers/security.py:97
+msgid ""
+"If enabled, non-existent users will not be allowed to log in; if disabled, "
+"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 ""
+
+#: settings/serializers/security.py:103
+msgid "Only from source login"
+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 "
+"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
+msgid "Not enabled"
+msgstr ""
+
+#: settings/serializers/security.py:117
+msgid "All users"
+msgstr ""
+
+#: settings/serializers/security.py:118
+msgid "Only admin users"
+msgstr ""
+
+#: settings/serializers/security.py:120
+msgid "Global MFA auth"
+msgstr ""
+
+#: settings/serializers/security.py:124
+msgid "Third-party login MFA"
+msgstr ""
+
+#: settings/serializers/security.py:125
+msgid "The third-party login modes include OIDC, CAS, and SAML2"
+msgstr ""
+
+#: settings/serializers/security.py:128
+msgid "OTP issuer name"
+msgstr ""
+
+#: settings/serializers/security.py:132
+msgid "OTP valid window"
+msgstr ""
+
+#: settings/serializers/security.py:136
+msgid "MFA verify TTL"
+msgstr ""
+
+#: settings/serializers/security.py:138
+msgid ""
+"Unit: second, The verification MFA takes effect only when you view the "
+"account password"
+msgstr ""
+
+#: settings/serializers/security.py:143
+msgid "MFA in login page"
+msgstr ""
+
+#: settings/serializers/security.py:144
+msgid "Eu security regulations(GDPR) require MFA to be on the login page"
+msgstr ""
+
+#: settings/serializers/security.py:148
+msgid "Verify code TTL (second)"
+msgstr ""
+
+#: settings/serializers/security.py:149
+msgid "Reset password and send SMS code expiration time"
+msgstr ""
+
+#: settings/serializers/security.py:153
+msgid "Login dynamic code"
+msgstr ""
+
+#: settings/serializers/security.py:154
+msgid ""
+"The password and additional code are sent to a third party authentication "
+"system for verification"
+msgstr ""
+
+#: settings/serializers/security.py:158
+msgid "Login captcha"
+msgstr ""
+
+#: settings/serializers/security.py:159
+msgid "Enable captcha to prevent robot authentication"
+msgstr ""
+
+#: settings/serializers/security.py:162
+msgid "Suspicious Login Verification"
+msgstr ""
+
+#: settings/serializers/security.py:164
+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 ""
+
+#: settings/serializers/security.py:170
+msgid "Auto Disable Threshold (day)"
+msgstr ""
+
+#: settings/serializers/security.py:171
+msgid ""
+"Detect infrequent users daily and disable them if they exceed the "
+"predetermined time limit."
+msgstr ""
+
+#: settings/serializers/security.py:191
+msgid "Watermark"
+msgstr ""
+
+#: settings/serializers/security.py:192
+msgid "Enabled, the web session and replay contains watermark information"
+msgstr ""
+
+#: settings/serializers/security.py:196
+msgid "Max idle time (minute)"
+msgstr ""
+
+#: settings/serializers/security.py:197
+msgid "If idle time more than it, disconnect connection."
+msgstr ""
+
+#: settings/serializers/security.py:201
+msgid "Max online time (hour)"
+msgstr ""
+
+#: settings/serializers/security.py:202
+msgid "If session connection time more than it, disconnect connection."
+msgstr ""
+
+#: settings/serializers/security.py:205
+msgid "Remember manual auth"
+msgstr ""
+
+#: settings/serializers/security.py:208
+#: terminal/templates/terminal/_msg_session_sharing.html:10
+msgid "Session share"
+msgstr ""
+
+#: settings/serializers/security.py:209
+msgid "Enabled, Allows user active session to be shared with other users"
+msgstr ""
+
+#: settings/serializers/security.py:215
+msgid "Insecure command alert"
+msgstr ""
+
+#: settings/serializers/security.py:218
+msgid "Email recipient"
+msgstr ""
+
+#: settings/serializers/security.py:219
+msgid "Multiple user using , split"
+msgstr ""
+
+#: settings/serializers/settings.py:70
+#, python-format
+msgid "[%s] %s"
+msgstr ""
+
+#: settings/serializers/terminal.py:15
+msgid "Auto"
+msgstr ""
+
+#: settings/serializers/terminal.py:22
+msgid "Terminal registration"
+msgstr ""
+
+#: settings/serializers/terminal.py:24
+msgid ""
+"Allow terminal register, after all terminal setup, you should disable this "
+"for security"
+msgstr ""
+
+#: settings/serializers/terminal.py:27
+msgid "Password auth"
+msgstr ""
+
+#: settings/serializers/terminal.py:29
+msgid "Public key auth"
+msgstr "Public key auth"
+
+#: settings/serializers/terminal.py:30
+msgid ""
+"Information: If use other auth method, like AD/LDAP, you should disable this "
+"to avoid being able to log in after deleting"
+msgstr ""
+
+#: settings/serializers/terminal.py:34
+msgid "Asset list sorting"
+msgstr ""
+
+#: settings/serializers/terminal.py:37
+msgid "Asset list page size"
+msgstr ""
+
+#: settings/tasks/ldap.py:28
+msgid "Periodic import ldap user"
+msgstr ""
+
+#: settings/tasks/ldap.py:66
+msgid "Registration periodic import ldap user task"
+msgstr ""
+
+#: settings/templates/ldap/_msg_import_ldap_user.html:2
+msgid "Sync task Finish"
+msgstr ""
+
+#: settings/templates/ldap/_msg_import_ldap_user.html:6
+#: terminal/models/session/session.py:45
+msgid "Date end"
+msgstr ""
+
+#: settings/templates/ldap/_msg_import_ldap_user.html:9
+msgid "Synced Organization"
+msgstr ""
+
+#: settings/templates/ldap/_msg_import_ldap_user.html:15
+msgid "Synced User"
+msgstr ""
+
+#: settings/templates/ldap/_msg_import_ldap_user.html:22
+msgid "No user synchronization required"
+msgstr ""
+
+#: settings/utils/ldap.py:494
+msgid "ldap:// or ldaps:// protocol is used."
+msgstr ""
+
+#: settings/utils/ldap.py:505
+msgid "Host or port is disconnected: {}"
+msgstr ""
+
+#: settings/utils/ldap.py:507
+msgid "The port is not the port of the LDAP service: {}"
+msgstr ""
+
+#: settings/utils/ldap.py:509
+msgid "Please add certificate: {}"
+msgstr ""
+
+#: settings/utils/ldap.py:513 settings/utils/ldap.py:540
+#: settings/utils/ldap.py:570 settings/utils/ldap.py:598
+msgid "Unknown error: {}"
+msgstr ""
+
+#: settings/utils/ldap.py:527
+msgid "Bind DN or Password incorrect"
+msgstr ""
+
+#: settings/utils/ldap.py:534
+msgid "Please enter Bind DN: {}"
+msgstr ""
+
+#: settings/utils/ldap.py:536
+msgid "Please enter Password: {}"
+msgstr ""
+
+#: settings/utils/ldap.py:538
+msgid "Please enter correct Bind DN and Password: {}"
+msgstr ""
+
+#: settings/utils/ldap.py:556
+msgid "Invalid User OU or User search filter: {}"
+msgstr ""
+
+#: settings/utils/ldap.py:587
+msgid "LDAP User attr map not include: {}"
+msgstr ""
+
+#: settings/utils/ldap.py:594
+msgid "LDAP User attr map is not dict"
+msgstr ""
+
+#: settings/utils/ldap.py:613
+msgid "LDAP authentication is not enabled"
+msgstr ""
+
+#: settings/utils/ldap.py:631
+msgid "Error (Invalid LDAP server): {}"
+msgstr ""
+
+#: settings/utils/ldap.py:633
+msgid "Error (Invalid Bind DN): {}"
+msgstr ""
+
+#: settings/utils/ldap.py:635
+msgid "Error (Invalid LDAP User attr map): {}"
+msgstr ""
+
+#: settings/utils/ldap.py:637
+msgid "Error (Invalid User OU or User search filter): {}"
+msgstr ""
+
+#: settings/utils/ldap.py:639
+msgid "Error (Not enabled LDAP authentication): {}"
+msgstr ""
+
+#: settings/utils/ldap.py:641
+msgid "Error (Unknown): {}"
+msgstr ""
+
+#: settings/utils/ldap.py:644
+msgid "Succeed: Match {} s user"
+msgstr ""
+
+#: settings/utils/ldap.py:655
+msgid "Please test the connection first"
+msgstr ""
+
+#: settings/utils/ldap.py:677
+msgid "Authentication failed (configuration incorrect): {}"
+msgstr ""
+
+#: settings/utils/ldap.py:681
+msgid "Authentication failed (username or password incorrect): {}"
+msgstr ""
+
+#: settings/utils/ldap.py:683
+msgid "Authentication failed (Unknown): {}"
+msgstr ""
+
+#: settings/utils/ldap.py:686
+msgid "Authentication success: {}"
+msgstr ""
+
+#: templates/_csv_import_export.html:8
+msgid "Export"
+msgstr ""
+
+#: templates/_csv_import_export.html:13 templates/_csv_import_modal.html:5
+msgid "Import"
+msgstr ""
+
+#: templates/_csv_import_modal.html:12
+msgid "Download the imported template or use the exported CSV file format"
+msgstr ""
+
+#: templates/_csv_import_modal.html:13
+msgid "Download the import template"
+msgstr ""
+
+#: templates/_csv_import_modal.html:17 templates/_csv_update_modal.html:17
+msgid "Select the CSV file to import"
+msgstr ""
+
+#: templates/_csv_import_modal.html:39 templates/_csv_update_modal.html:42
+msgid "Please select file"
+msgstr ""
+
+#: templates/_csv_update_modal.html:12
+msgid "Download the update template or use the exported CSV file format"
+msgstr ""
+
+#: templates/_csv_update_modal.html:13
+msgid "Download the update template"
+msgstr ""
+
+#: templates/_header_bar.html:12
+msgid "Help"
+msgstr ""
+
+#: templates/_header_bar.html:19
+msgid "Docs"
+msgstr ""
+
+#: templates/_header_bar.html:27
+msgid "Commercial support"
+msgstr ""
+
+#: templates/_header_bar.html:79 users/forms/profile.py:44
+msgid "Profile"
+msgstr ""
+
+#: templates/_header_bar.html:83
+msgid "Admin page"
+msgstr ""
+
+#: templates/_header_bar.html:86
+msgid "User page"
+msgstr ""
+
+#: templates/_header_bar.html:91
+msgid "Logout"
+msgstr ""
+
+#: templates/_message.html:6
+msgid ""
+"\n"
+" Your account has expired, please contact the administrator.\n"
+" "
+msgstr ""
+
+#: templates/_message.html:13
+msgid "Your account will at"
+msgstr ""
+
+#: templates/_message.html:13 templates/_message.html:30
+msgid "expired. "
+msgstr ""
+
+#: templates/_message.html:23
+#, python-format
+msgid ""
+"\n"
+" Your password has expired, please click Luna is a separately deployed program, you need to deploy Luna, koko, "
"configure nginx for url distribution,
If you see this page, "
@@ -4057,13 +4134,13 @@ msgstr ""
"ページが表示されている場合は、nginxリスニングポートにアクセスしていないことを"
"証明してください。頑張ってください。"
-#: jumpserver/views/other.py:70
+#: jumpserver/views/other.py:72
msgid "Websocket server run on port: {}, you should proxy it on nginx"
msgstr ""
"Websocket サーバーはport: {}で実行されます。nginxでプロキシする必要がありま"
"す。"
-#: jumpserver/views/other.py:84
+#: jumpserver/views/other.py:86
msgid ""
"Koko is a separately deployed program, you need to deploy Koko, "
"configure nginx for url distribution,
If you see this page, "
@@ -4074,17 +4151,25 @@ msgstr ""
"いる場合は、nginxリスニングポートにアクセスしていないことを証明してください。"
"頑張ってください。"
+#: labels/apps.py:8
+#, fuzzy
+#| msgid "Labels"
+msgid "App Labels"
+msgstr "ラベル"
+
#: labels/models.py:36
msgid "Resource ID"
msgstr "リソースID"
#: labels/models.py:41
msgid "Labeled resource"
-msgstr ""
+msgstr "関連リソース"
#: labels/serializers.py:22
+#, fuzzy
+#| msgid "Resource type"
msgid "Resource count"
-msgstr "リソース数"
+msgstr "リソースタイプ"
#: labels/serializers.py:28
msgid "Cannot contain \":,\""
@@ -4094,6 +4179,12 @@ msgstr "\":,\"を含めることはできません"
msgid "Resource type"
msgstr "リソースタイプ"
+#: notifications/apps.py:7
+#, fuzzy
+#| msgid "Notifications"
+msgid "App Notifications"
+msgstr "通知"
+
#: notifications/backends/__init__.py:13
msgid "Site message"
msgstr "サイトメッセージ"
@@ -4285,7 +4376,7 @@ msgstr "SQLServer"
#: ops/const.py:56 ops/const.py:69
msgid "Raw"
-msgstr ""
+msgstr "Raw"
#: ops/const.py:57
msgid "HUAWEI"
@@ -4307,29 +4398,42 @@ msgstr "タイムアウト"
msgid "no valid program entry found."
msgstr "利用可能なプログラムポータルがありません"
-#: ops/mixin.py:26 ops/mixin.py:90 settings/serializers/auth/ldap.py:73
-msgid "Cycle perform"
-msgstr "サイクル実行"
+#: ops/mixin.py:23 ops/mixin.py:102 settings/serializers/auth/ldap.py:66
+#, fuzzy
+#| msgid "Periodic run"
+msgid "Periodic run"
+msgstr "定期的なパフォーマンス"
-#: ops/mixin.py:30 ops/mixin.py:88 ops/mixin.py:107
-#: settings/serializers/auth/ldap.py:70
-msgid "Regularly perform"
-msgstr "定期的に実行する"
-
-#: ops/mixin.py:110
+#: ops/mixin.py:25 ops/mixin.py:88 ops/mixin.py:108
+#: settings/serializers/auth/ldap.py:73
msgid "Interval"
msgstr "間隔"
-#: ops/mixin.py:120
+#: ops/mixin.py:28 ops/mixin.py:86 ops/mixin.py:105
+#: settings/serializers/auth/ldap.py:70
+#, fuzzy
+#| msgid "Contains"
+msgid "Crontab"
+msgstr "含む"
+
+#: ops/mixin.py:110
+#, fuzzy
+#| msgid "Run user"
+msgid "Run period"
+msgstr "ユーザーの実行"
+
+#: ops/mixin.py:119
msgid "* Please enter a valid crontab expression"
msgstr "* 有効なcrontab式を入力してください"
-#: ops/mixin.py:127
+#: ops/mixin.py:126
msgid "Range {} to {}"
msgstr "{} から {} までの範囲"
-#: ops/mixin.py:138
-msgid "Require periodic or regularly perform setting"
+#: ops/mixin.py:137
+#, fuzzy
+#| msgid "Require periodic or regularly perform setting"
+msgid "Require interval or crontab setting"
msgstr "定期的または定期的に設定を行う必要があります"
#: ops/models/adhoc.py:21
@@ -4385,7 +4489,7 @@ msgid "Kwargs"
msgstr "クワーグ"
#: ops/models/celery.py:84 terminal/models/session/sharing.py:128
-#: tickets/const.py:25
+#: tickets/const.py:26
msgid "Finished"
msgstr "終了"
@@ -4473,8 +4577,22 @@ msgstr "{max_threshold}%: => {value} を超える使用メモリ"
msgid "CPU load more than {max_threshold}: => {value}"
msgstr "{max_threshold} を超えるCPUロード: => {value}"
+#: ops/serializers/celery.py:33
+#, fuzzy
+#| msgid "Job Execution"
+msgid "Execution cycle"
+msgstr "ジョブ実行"
+
+#: ops/serializers/celery.py:35
+#, fuzzy
+#| msgid "Last execution"
+msgid "Next execution time"
+msgstr "最後の実行"
+
#: ops/serializers/job.py:15
-msgid "Run after save"
+#, fuzzy
+#| msgid "Run after save"
+msgid "Execute after saving"
msgstr "保存後に実行"
#: ops/serializers/job.py:69
@@ -4577,8 +4695,10 @@ msgstr ""
msgid "The organization have resource ({}) cannot be deleted"
msgstr "組織のリソース ({}) は削除できません"
-#: orgs/apps.py:7 rbac/tree.py:128
-msgid "App organizations"
+#: orgs/apps.py:7
+#, fuzzy
+#| msgid "App organizations"
+msgid "App Organizations"
msgstr "アプリ組織"
#: orgs/mixins/models.py:57 orgs/mixins/serializers.py:25 orgs/models.py:91
@@ -4606,7 +4726,7 @@ msgstr "デフォルト組織"
msgid "SYSTEM"
msgstr "システム組織"
-#: orgs/models.py:83 rbac/models/role.py:36 settings/models.py:183
+#: orgs/models.py:83 rbac/models/role.py:36 settings/models.py:185
#: terminal/models/applet/applet.py:41
msgid "Builtin"
msgstr "ビルトイン"
@@ -4623,12 +4743,45 @@ msgstr "参加しているすべての組織を表示できます"
msgid "Can not delete virtual org"
msgstr "仮想組織を削除できませんでした"
+#: orgs/serializers.py:10 perms/serializers/permission.py:38
+#: rbac/serializers/role.py:27 users/serializers/group.py:54
+msgid "Users amount"
+msgstr "ユーザー数"
+
+#: orgs/serializers.py:11 perms/serializers/permission.py:39
+msgid "User groups amount"
+msgstr "ユーザーグループの数"
+
+#: orgs/serializers.py:14 perms/serializers/permission.py:41
+msgid "Nodes amount"
+msgstr "ノード数"
+
+#: orgs/serializers.py:15
+#, fuzzy
+#| msgid "Command amount"
+msgid "Domains amount"
+msgstr "コマンド量"
+
+#: orgs/serializers.py:16
+#, fuzzy
+#| msgid "Gather account"
+msgid "Gateways amount"
+msgstr "アカウントを集める"
+
+#: orgs/serializers.py:18
+#, fuzzy
+#| msgid "Asset permission"
+msgid "Asset permissions amount"
+msgstr "資産権限"
+
#: orgs/tasks.py:9
msgid "Refresh organization cache"
msgstr "組織キャッシュを更新する"
#: perms/apps.py:9
-msgid "App permissions"
+#, fuzzy
+#| msgid "App permissions"
+msgid "App Permissions"
msgstr "アプリの権限"
#: perms/const.py:12
@@ -4724,19 +4877,6 @@ msgstr "資産権限の有効期限が近づいています"
msgid "asset permissions of organization {}"
msgstr "組織 {} の資産権限"
-#: perms/serializers/permission.py:186 rbac/serializers/role.py:27
-#: users/serializers/group.py:54 users/serializers/group.py:60
-msgid "Users amount"
-msgstr "ユーザー数"
-
-#: perms/serializers/permission.py:187
-msgid "User groups amount"
-msgstr "ユーザーグループの数"
-
-#: perms/serializers/permission.py:189
-msgid "Nodes amount"
-msgstr "ノード数"
-
#: perms/tasks.py:27
msgid "Check asset permission expired"
msgstr "アセット認証ルールの有効期限が切れていることを確認する"
@@ -4774,7 +4914,9 @@ msgid "{} at least one system role"
msgstr "{} 少なくとも1つのシステムロール"
#: rbac/apps.py:7
-msgid "RBAC"
+#, fuzzy
+#| msgid "RBAC"
+msgid "App RBAC"
msgstr "RBAC"
#: rbac/builtin.py:115
@@ -4903,7 +5045,7 @@ msgstr "ワークスペースビュー"
msgid "Audit view"
msgstr "監査ビュー"
-#: rbac/tree.py:27 settings/models.py:159
+#: rbac/tree.py:27 settings/models.py:161
msgid "System setting"
msgstr "システム設定"
@@ -4931,20 +5073,28 @@ msgstr "資産の改ざん"
msgid "Terminal setting"
msgstr "ターミナル設定"
-#: rbac/tree.py:55
-msgid "Task Center"
+#: rbac/tree.py:55 settings/serializers/feature.py:126
+msgid "Job center"
msgstr "タスクセンター"
#: rbac/tree.py:56
msgid "My assets"
msgstr "私の資産"
+#: rbac/tree.py:57
+msgid "App ops"
+msgstr "アプリ操作"
+
#: rbac/tree.py:58 terminal/models/applet/applet.py:52
#: terminal/models/applet/applet.py:317 terminal/models/applet/host.py:30
#: terminal/serializers/applet.py:15
msgid "Applet"
msgstr "リモートアプリケーション"
+#: rbac/tree.py:128
+msgid "App organizations"
+msgstr "アプリ組織"
+
#: rbac/tree.py:129
msgid "Ticket comment"
msgstr "チケットコメント"
@@ -4992,84 +5142,94 @@ msgid "test_phone is required"
msgstr "携帯番号をテストこのフィールドは必須です"
#: settings/apps.py:7
-msgid "Settings"
+#, fuzzy
+#| msgid "Settings"
+msgid "App Settings"
msgstr "設定"
-#: settings/models.py:36 users/models/preference.py:14
+#: settings/models.py:37 users/models/preference.py:14
msgid "Encrypted"
msgstr "暗号化された"
-#: settings/models.py:161
+#: settings/models.py:163
msgid "Can change email setting"
msgstr "メール設定を変更できます"
-#: settings/models.py:162
+#: settings/models.py:164
msgid "Can change auth setting"
msgstr "資格認定の設定"
-#: settings/models.py:163
+#: settings/models.py:165
msgid "Can change auth ops"
msgstr "タスクセンターの設定"
-#: settings/models.py:164
+#: settings/models.py:166
msgid "Can change auth ticket"
msgstr "製造オーダ設定"
-#: settings/models.py:165
+#: settings/models.py:167
msgid "Can change virtual app setting"
msgstr "仮想アプリケーション設定を変更できます"
-#: settings/models.py:166
+#: settings/models.py:168
msgid "Can change auth announcement"
msgstr "公告の設定"
-#: settings/models.py:167
+#: settings/models.py:169
msgid "Can change vault setting"
msgstr "金庫の設定を変えることができます"
-#: settings/models.py:168
+#: settings/models.py:170
msgid "Can change chat ai setting"
msgstr "チャットAI設定を変更できます"
-#: settings/models.py:169
+#: settings/models.py:171
msgid "Can change system msg sub setting"
msgstr "システムmsgサブ设定を変更できます"
-#: settings/models.py:170
+#: settings/models.py:172
msgid "Can change sms setting"
msgstr "Smsの設定を変えることができます"
-#: settings/models.py:171
+#: settings/models.py:173
msgid "Can change security setting"
msgstr "セキュリティ設定を変更できます"
-#: settings/models.py:172
+#: settings/models.py:174
msgid "Can change clean setting"
msgstr "きれいな設定を変えることができます"
-#: settings/models.py:173
+#: settings/models.py:175
msgid "Can change interface setting"
msgstr "インターフェイスの設定を変えることができます"
-#: settings/models.py:174
+#: settings/models.py:176
msgid "Can change license setting"
msgstr "ライセンス設定を変更できます"
-#: settings/models.py:175
+#: settings/models.py:177
msgid "Can change terminal setting"
msgstr "ターミナルの設定を変えることができます"
-#: settings/models.py:176
+#: settings/models.py:178
msgid "Can change other setting"
msgstr "他の設定を変えることができます"
-#: settings/models.py:186
+#: settings/models.py:188
msgid "Chat prompt"
msgstr "チャットのヒント"
#: settings/notifications.py:23
+#, fuzzy
+#| msgid "Notification of account backup route task results"
msgid "Notification of Synchronized LDAP User Task Results"
-msgstr "LDAPユーザータスクの結果通知を同期する"
+msgstr "アカウントバックアップルートタスクの結果の通知"
+
+#: settings/serializers/auth/base.py:10
+#, fuzzy
+#| msgid "Authentication"
+msgid "Authentication"
+msgstr "認証"
#: settings/serializers/auth/base.py:12
msgid "LDAP Auth"
@@ -5131,20 +5291,17 @@ msgstr "パスワードのURLを忘れた"
msgid "Enable login redirect msg"
msgstr "ログインリダイレクトの有効化msg"
-#: settings/serializers/auth/cas.py:10
+#: settings/serializers/auth/cas.py:10 settings/serializers/auth/cas.py:12
msgid "CAS"
msgstr "CAS"
-#: settings/serializers/auth/cas.py:12
-msgid "Enable CAS Auth"
-msgstr "CAS 認証の有効化"
-
-#: settings/serializers/auth/cas.py:13 settings/serializers/auth/oidc.py:54
-msgid "Server url"
-msgstr "サービス側アドレス"
+#: settings/serializers/auth/cas.py:13 settings/serializers/auth/ldap.py:42
+#: settings/serializers/auth/oidc.py:54
+msgid "Server"
+msgstr "LDAPサーバー"
#: settings/serializers/auth/cas.py:16
-msgid "Proxy server url"
+msgid "Proxy Server"
msgstr "コールバックアドレス"
#: settings/serializers/auth/cas.py:18 settings/serializers/auth/oauth2.py:54
@@ -5160,16 +5317,22 @@ msgstr "ユーザー名のプロパティ"
msgid "Enable attributes map"
msgstr "属性マップの有効化"
-#: settings/serializers/auth/cas.py:28 settings/serializers/auth/saml2.py:32
-msgid "Rename attr"
+#: settings/serializers/auth/cas.py:28 settings/serializers/auth/ldap.py:58
+#: settings/serializers/auth/oauth2.py:56 settings/serializers/auth/oidc.py:37
+#: settings/serializers/auth/saml2.py:32
+msgid "User attribute"
msgstr "マッピングのプロパティ"
-#: settings/serializers/auth/cas.py:29
-msgid "Create user if not"
+#: settings/serializers/auth/cas.py:30
+msgid "Create user"
msgstr "そうでない場合はユーザーを作成"
+#: settings/serializers/auth/cas.py:31
+msgid "Automatically create a new user if not found."
+msgstr ""
+
#: settings/serializers/auth/dingtalk.py:15
-msgid "Enable DingTalk Auth"
+msgid "Dingtalk"
msgstr "ピン認証の有効化"
#: settings/serializers/auth/feishu.py:12
@@ -5184,10 +5347,6 @@ msgstr "Lark 認証の有効化"
msgid "LDAP"
msgstr "LDAP"
-#: settings/serializers/auth/ldap.py:42
-msgid "LDAP server"
-msgstr "LDAPサーバー"
-
#: settings/serializers/auth/ldap.py:43
msgid "eg: ldap://localhost:389"
msgstr "例: ldap://localhost:389"
@@ -5213,11 +5372,6 @@ msgstr "ユーザー検索フィルター"
msgid "Choice may be (cn|uid|sAMAccountName)=%(user)s)"
msgstr "選択は (cnまたはuidまたはsAMAccountName)=%(user)s)"
-#: settings/serializers/auth/ldap.py:58 settings/serializers/auth/oauth2.py:56
-#: settings/serializers/auth/oidc.py:37
-msgid "User attr map"
-msgstr "ユーザー属性マッピング"
-
#: settings/serializers/auth/ldap.py:59
msgid ""
"User attr map present how to map LDAP user attr to jumpserver, username,name,"
@@ -5251,13 +5405,10 @@ msgid "Enable LDAP auth"
msgstr "LDAP認証の有効化"
#: settings/serializers/auth/oauth2.py:18
+#: settings/serializers/auth/oauth2.py:21
msgid "OAuth2"
msgstr "OAuth2"
-#: settings/serializers/auth/oauth2.py:21
-msgid "Enable OAuth2 Auth"
-msgstr "OAuth2認証の有効化"
-
#: settings/serializers/auth/oauth2.py:24
msgid "Logo"
msgstr "アイコン"
@@ -5276,23 +5427,24 @@ msgid "Client Secret"
msgstr "クライアント秘密"
#: settings/serializers/auth/oauth2.py:39 settings/serializers/auth/oidc.py:68
-msgid "Provider auth endpoint"
+msgid "Authorization endpoint"
msgstr "認証エンドポイントアドレス"
#: settings/serializers/auth/oauth2.py:42 settings/serializers/auth/oidc.py:71
-msgid "Provider token endpoint"
+msgid "Token endpoint"
msgstr "プロバイダートークンエンドポイント"
#: settings/serializers/auth/oauth2.py:45 settings/serializers/auth/oidc.py:30
-msgid "Client authentication method"
+#: settings/serializers/auth/sms.py:106
+msgid "Request method"
msgstr "クライアント認証方式"
#: settings/serializers/auth/oauth2.py:49 settings/serializers/auth/oidc.py:77
-msgid "Provider userinfo endpoint"
+msgid "Userinfo endpoint"
msgstr "プロバイダーuserinfoエンドポイント"
#: settings/serializers/auth/oauth2.py:52 settings/serializers/auth/oidc.py:80
-msgid "Provider end session endpoint"
+msgid "End session endpoint"
msgstr "プロバイダーのセッション終了エンドポイント"
#: settings/serializers/auth/oauth2.py:59 settings/serializers/auth/oidc.py:98
@@ -5300,12 +5452,12 @@ msgstr "プロバイダーのセッション終了エンドポイント"
msgid "Always update user"
msgstr "常にユーザーを更新"
-#: settings/serializers/auth/oidc.py:12
+#: settings/serializers/auth/oidc.py:12 settings/serializers/auth/oidc.py:63
msgid "OIDC"
msgstr "OIDC"
#: settings/serializers/auth/oidc.py:16
-msgid "Base site url"
+msgid "Base site URL"
msgstr "ベースサイトのアドレス"
#: settings/serializers/auth/oidc.py:32
@@ -5313,7 +5465,7 @@ msgid "Share session"
msgstr "セッションの共有"
#: settings/serializers/auth/oidc.py:34
-msgid "Ignore ssl verification"
+msgid "Ignore SSL verification"
msgstr "Ssl検証を無視する"
#: settings/serializers/auth/oidc.py:38
@@ -5340,24 +5492,20 @@ msgstr "Keycloakを使用する"
msgid "Realm name"
msgstr "レルム名"
-#: settings/serializers/auth/oidc.py:63
-msgid "Enable OPENID Auth"
-msgstr "OIDC認証の有効化"
-
#: settings/serializers/auth/oidc.py:65
msgid "Provider endpoint"
msgstr "プロバイダーエンドポイント"
#: settings/serializers/auth/oidc.py:74
-msgid "Provider jwks endpoint"
+msgid "JWKS endpoint"
msgstr "プロバイダーjwksエンドポイント"
#: settings/serializers/auth/oidc.py:83
-msgid "Provider sign alg"
+msgid "Signature algorithm"
msgstr "プロビダーサインalg"
#: settings/serializers/auth/oidc.py:86
-msgid "Provider sign key"
+msgid "Signing key"
msgstr "プロバイダ署名キー"
#: settings/serializers/auth/oidc.py:88
@@ -5365,11 +5513,11 @@ msgid "Scopes"
msgstr "スコープ"
#: settings/serializers/auth/oidc.py:90
-msgid "Id token max age (s)"
+msgid "ID Token max age (s)"
msgstr "IDトークンの最大年齢 (秒)"
#: settings/serializers/auth/oidc.py:93
-msgid "Id token include claims"
+msgid "ID Token include claims"
msgstr "IDトークンにはクレームが含まれます"
#: settings/serializers/auth/oidc.py:95
@@ -5380,16 +5528,12 @@ msgstr "使用状態"
msgid "Use nonce"
msgstr "Nonceを使用"
-#: settings/serializers/auth/passkey.py:11
-msgid "Enable passkey Auth"
-msgstr "パスキー認証を有効にする"
-
#: settings/serializers/auth/passkey.py:12
msgid "Only SSL domain can use passkey auth"
msgstr "SSLドメインのみがパスキー認証を使用できます"
#: settings/serializers/auth/passkey.py:15
-msgid "FIDO server ID"
+msgid "FIDO Server ID"
msgstr "FIDOサーバーID"
#: settings/serializers/auth/passkey.py:17
@@ -5402,36 +5546,29 @@ msgstr ""
"ます"
#: settings/serializers/auth/passkey.py:22
-msgid "FIDO server name"
+msgid "FIDO Server name"
msgstr "FIDOサーバー名"
#: settings/serializers/auth/radius.py:13
+#: settings/serializers/auth/radius.py:15
msgid "Radius"
msgstr "Radius"
-#: settings/serializers/auth/radius.py:15
-msgid "Enable Radius Auth"
-msgstr "Radius認証の有効化"
-
#: settings/serializers/auth/radius.py:21
msgid "OTP in Radius"
msgstr "Radius のOTP"
-#: settings/serializers/auth/saml2.py:10
+#: settings/serializers/auth/saml2.py:10 settings/serializers/auth/saml2.py:13
msgid "SAML2"
msgstr "SAML2"
-#: settings/serializers/auth/saml2.py:13
-msgid "Enable SAML2 Auth"
-msgstr "SAML2認証の有効化"
-
#: settings/serializers/auth/saml2.py:16
-msgid "IDP metadata URL"
-msgstr "IDP metadata アドレス"
+msgid "IDP Metadata URL"
+msgstr "IDP Metadataアドレス"
#: settings/serializers/auth/saml2.py:19
-msgid "IDP metadata XML"
-msgstr "IDP metadata XML"
+msgid "IDP Metadata XML"
+msgstr "IDP Metadata XML"
#: settings/serializers/auth/saml2.py:22
msgid "SP advanced settings"
@@ -5445,14 +5582,6 @@ msgstr "SP プライベートキー"
msgid "SP cert"
msgstr "SP 証明書"
-#: settings/serializers/auth/slack.py:12
-msgid "Enable Slack Auth"
-msgstr "Slack 認証の有効化"
-
-#: settings/serializers/auth/sms.py:17
-msgid "Enable SMS"
-msgstr "SMSの有効化"
-
#: settings/serializers/auth/sms.py:19
msgid "SMS provider / Protocol"
msgstr "SMSプロバイダ / プロトコル"
@@ -5485,19 +5614,19 @@ msgid "Signature channel number"
msgstr "署名チャネル番号"
#: settings/serializers/auth/sms.py:73
-msgid "Enterprise code(SP id)"
+msgid "Enterprise code"
msgstr "企業コード(SP id)"
#: settings/serializers/auth/sms.py:74
-msgid "Shared secret(Shared secret)"
+msgid "Shared secret"
msgstr "パスワードを共有する(Shared secret)"
#: settings/serializers/auth/sms.py:75
-msgid "Original number(Src id)"
+msgid "Original number"
msgstr "元の番号(Src id)"
#: settings/serializers/auth/sms.py:76
-msgid "Business type(Service id)"
+msgid "Business type"
msgstr "ビジネス・タイプ(Service id)"
#: settings/serializers/auth/sms.py:80
@@ -5524,10 +5653,6 @@ msgstr "署名+テンプレートの長さは65文字以内"
msgid "URL"
msgstr "URL"
-#: settings/serializers/auth/sms.py:106
-msgid "Request method"
-msgstr "請求方法です"
-
#: settings/serializers/auth/sso.py:16
msgid "Enable SSO auth"
msgstr "SSO Token認証の有効化"
@@ -5546,12 +5671,8 @@ msgstr "Token有効期間"
msgid "Unit: second"
msgstr "単位: 秒"
-#: settings/serializers/auth/wecom.py:15
-msgid "Enable WeCom Auth"
-msgstr "企業微信認証の有効化"
-
#: settings/serializers/basic.py:11
-msgid "Site url"
+msgid "Site URL"
msgstr "サイトURL"
#: settings/serializers/basic.py:13
@@ -5571,7 +5692,7 @@ msgid "User first login update profile done redirect to it"
msgstr "ユーザーの最初のログイン更新プロファイルがリダイレクトされました"
#: settings/serializers/basic.py:22
-msgid "Global organization name"
+msgid "Global organization"
msgstr "グローバル組織名"
#: settings/serializers/basic.py:23
@@ -5603,15 +5724,15 @@ msgid "Period clean"
msgstr "定時清掃"
#: settings/serializers/cleaning.py:15
-msgid "Login log keep days (day)"
+msgid "Login log retention days (day)"
msgstr "ログインログは日数を保持します(天)"
#: settings/serializers/cleaning.py:19
-msgid "Task log keep days (day)"
+msgid "Task log retention days (day)"
msgstr "タスクログは日数を保持します(天)"
#: settings/serializers/cleaning.py:23
-msgid "Operate log keep days (day)"
+msgid "Operate log retention days (day)"
msgstr "ログ管理日を操作する(天)"
#: settings/serializers/cleaning.py:27
@@ -5646,24 +5767,21 @@ msgstr ""
"この期間を超えるセッション、録音、およびコマンド レコードは削除されます (デー"
"タベースのバックアップに影響し、OSS などには影響しません)"
-#: settings/serializers/feature.py:18
+#: settings/serializers/feature.py:18 settings/serializers/msg.py:68
msgid "Subject"
msgstr "件名"
#: settings/serializers/feature.py:22
-msgid "More url"
+msgid "More URL"
msgstr "もっとURL"
-#: settings/serializers/feature.py:36 settings/serializers/feature.py:39
+#: settings/serializers/feature.py:36 settings/serializers/feature.py:38
+#: settings/serializers/feature.py:39
msgid "Announcement"
msgstr "発表"
-#: settings/serializers/feature.py:38
-msgid "Enable announcement"
-msgstr "アナウンスの有効化"
-
#: settings/serializers/feature.py:46
-msgid "Enable Vault"
+msgid "Vault"
msgstr "有効化 Vault"
#: settings/serializers/feature.py:55
@@ -5685,16 +5803,12 @@ msgstr ""
"所定の数を超える履歴アカウントを確認して削除します。 値が 999 以上の場合、履"
"歴アカウントの削除は実行されません。"
-#: settings/serializers/feature.py:71
+#: settings/serializers/feature.py:71 settings/serializers/feature.py:75
msgid "Chat AI"
msgstr "チャットAI"
-#: settings/serializers/feature.py:75
-msgid "Enable Chat AI"
-msgstr "チャットAIを起動する"
-
#: settings/serializers/feature.py:78
-msgid "Base Url"
+msgid "Base URL"
msgstr "基本的なUrl"
#: settings/serializers/feature.py:81 templates/_header_bar.html:96
@@ -5758,8 +5872,10 @@ msgid "Enable virtual app"
msgstr "仮想アプリケーションの有効化"
#: settings/serializers/msg.py:25
+#, fuzzy
+#| msgid "SMTP host"
msgid "SMTP"
-msgstr "SMTP"
+msgstr "SMTPホスト"
#: settings/serializers/msg.py:26
msgid "EXCHANGE"
@@ -5770,7 +5886,7 @@ msgid "Tips: Some provider use token except password"
msgstr "ヒント: 一部のプロバイダーはパスワード以外のトークンを使用します"
#: settings/serializers/msg.py:39
-msgid "Send user"
+msgid "Sender"
msgstr "ユーザーを送信"
#: settings/serializers/msg.py:40
@@ -5812,10 +5928,6 @@ msgid ""
"This is used by default if no email is returned during SSO authentication"
msgstr "これは、SSO認証中にメールが返されない場合にデフォルトで使用されます。"
-#: settings/serializers/msg.py:68
-msgid "Create user email subject"
-msgstr "ユーザーメール件名の作成"
-
#: settings/serializers/msg.py:69
msgid ""
"Tips: When creating a user, send the subject of the email (eg:Create account "
@@ -5825,7 +5937,7 @@ msgstr ""
"正常に作成)"
#: settings/serializers/msg.py:73
-msgid "Create user honorific"
+msgid "Honorific"
msgstr "ユーザー敬語の作成"
#: settings/serializers/msg.py:74
@@ -5833,10 +5945,6 @@ msgid "Tips: When creating a user, send the honorific of the email (eg:Hello)"
msgstr ""
"ヒント: ユーザーを作成するときは、メールの敬語を送信します (例: こんにちは)"
-#: settings/serializers/msg.py:78
-msgid "Create user email content"
-msgstr "ユーザーのメールコンテンツを作成する"
-
#: settings/serializers/msg.py:80
#, python-brace-format
msgid ""
@@ -5881,7 +5989,7 @@ msgstr ""
"れます。"
#: settings/serializers/security.py:26
-msgid "Number of repeated historical passwords"
+msgid "Recent password count"
msgstr "繰り返された履歴パスワードの数"
#: settings/serializers/security.py:28
@@ -5893,27 +6001,19 @@ msgstr ""
"にすることはできません"
#: settings/serializers/security.py:34
-msgid "Password minimum length"
+msgid "Minimum length (User)"
msgstr "パスワードの最小長"
#: settings/serializers/security.py:38
-msgid "Admin user password minimum length"
+msgid "Minimum length (Admin)"
msgstr "管理者ユーザーパスワードの最小長"
-#: settings/serializers/security.py:41
-msgid "Must contain capital"
-msgstr "資本を含める必要があります"
-
-#: settings/serializers/security.py:44
-msgid "Must contain lowercase"
-msgstr "小文字を含める必要があります。"
-
#: settings/serializers/security.py:47
-msgid "Must contain numeric"
+msgid "Digits"
msgstr "数値を含める必要があります"
#: settings/serializers/security.py:50
-msgid "Must contain special"
+msgid "Special characters"
msgstr "特別な"
#: settings/serializers/security.py:55
@@ -5924,28 +6024,20 @@ msgstr ""
"ユーザーが限られた回数だけログインできなかった場合、この時間間隔ではログイン"
"はできません。"
-#: settings/serializers/security.py:63
-msgid "Limit the number of user login failures"
+#: settings/serializers/security.py:63 settings/serializers/security.py:73
+msgid "Login failures count"
msgstr "ユーザーログインの失敗数を制限する"
-#: settings/serializers/security.py:67
-msgid "Block user login interval (minute)"
+#: settings/serializers/security.py:67 settings/serializers/security.py:77
+msgid "Login failure period (minute)"
msgstr "ユーザーのログイン間隔をブロックする(分)"
-#: settings/serializers/security.py:73
-msgid "Limit the number of IP login failures"
-msgstr "IPログイン失敗の数を制限する"
-
-#: settings/serializers/security.py:77
-msgid "Block IP login interval (minute)"
-msgstr "IPログイン間隔をブロックする(分)"
-
#: settings/serializers/security.py:81
-msgid "Login IP White List"
+msgid "Login IP whitelist"
msgstr "ログインIPホワイトリスト"
#: settings/serializers/security.py:86
-msgid "Login IP Black List"
+msgid "Login IP blacklist"
msgstr "ログインIPブラックリスト"
#: settings/serializers/security.py:91
@@ -6007,7 +6099,7 @@ msgid "Global MFA auth"
msgstr "グローバル有効化MFA認証"
#: settings/serializers/security.py:124
-msgid "Third-party login users perform MFA authentication"
+msgid "Third-party login MFA"
msgstr "サードパーティのログインユーザーがMFA認証を実行"
#: settings/serializers/security.py:125
@@ -6050,7 +6142,7 @@ msgid "Reset password and send SMS code expiration time"
msgstr "パスワードをリセットしてSMSコードの有効期限を送信します"
#: settings/serializers/security.py:153
-msgid "Enable Login dynamic code"
+msgid "Login dynamic code"
msgstr "ログイン動的コードの有効化"
#: settings/serializers/security.py:154
@@ -6062,7 +6154,7 @@ msgstr ""
"ます"
#: settings/serializers/security.py:158
-msgid "Enable Login captcha"
+msgid "Login captcha"
msgstr "ログインcaptchaの有効化"
#: settings/serializers/security.py:159
@@ -6070,7 +6162,7 @@ msgid "Enable captcha to prevent robot authentication"
msgstr "Captchaを有効にしてロボット認証を防止する"
#: settings/serializers/security.py:162
-msgid "Remote Login Protection"
+msgid "Suspicious Login Verification"
msgstr "リモートログイン保護"
#: settings/serializers/security.py:164
@@ -6084,7 +6176,7 @@ msgstr ""
"モートログインリマインダーを送信します"
#: settings/serializers/security.py:170
-msgid "Unused user timeout (day)"
+msgid "Auto Disable Threshold (day)"
msgstr "未使用のユーザータイムアウト(日)"
#: settings/serializers/security.py:171
@@ -6096,7 +6188,7 @@ msgstr ""
"します。"
#: settings/serializers/security.py:191
-msgid "Enable watermark"
+msgid "Watermark"
msgstr "透かしの有効化"
#: settings/serializers/security.py:192
@@ -6104,7 +6196,7 @@ msgid "Enabled, the web session and replay contains watermark information"
msgstr "Webセッションとリプレイには透かし情報が含まれています。"
#: settings/serializers/security.py:196
-msgid "Connection max idle time (minute)"
+msgid "Max idle time (minute)"
msgstr "接続最大アイドル時間(分)"
#: settings/serializers/security.py:197
@@ -6158,16 +6250,12 @@ msgstr "複数のユーザーを使用して、分割"
msgid "[%s] %s"
msgstr "[%s] %s"
-#: settings/serializers/terminal.py:9 terminal/models/virtualapp/provider.py:11
-msgid "Hostname"
-msgstr "ホスト名"
-
#: settings/serializers/terminal.py:15
msgid "Auto"
msgstr "自動"
#: settings/serializers/terminal.py:22
-msgid "Enable terminal register"
+msgid "Terminal registration"
msgstr "ターミナルレジスタの有効化"
#: settings/serializers/terminal.py:24
@@ -6183,37 +6271,27 @@ msgid "Password auth"
msgstr "パスワード認証"
#: settings/serializers/terminal.py:29
+#, fuzzy
+#| msgid "Public key auth"
msgid "Public key auth"
msgstr "鍵認証"
#: settings/serializers/terminal.py:30
msgid ""
-"Tips: If use other auth method, like AD/LDAP, you should disable this to "
-"avoid being able to log in after deleting"
+"Information: If use other auth method, like AD/LDAP, you should disable this "
+"to avoid being able to log in after deleting"
msgstr ""
"ヒント: AD/LDAPなどの他の認証方法を使用する場合は、サードパーティ製システムの"
"削除後にこの項目を無効にする必要があります, ログインも可能"
#: settings/serializers/terminal.py:34
-msgid "List sort by"
+msgid "Asset list sorting"
msgstr "リストの並べ替え"
#: settings/serializers/terminal.py:37
-msgid "List page size"
+msgid "Asset list page size"
msgstr "ページサイズを一覧表示"
-#: settings/serializers/terminal.py:39
-msgid "Enable database proxy"
-msgstr "属性マップの有効化"
-
-#: settings/serializers/terminal.py:40
-msgid "Enable Razor"
-msgstr "Razor の有効化"
-
-#: settings/serializers/terminal.py:41
-msgid "Enable SSH Client"
-msgstr "SSH Clientの有効化"
-
#: settings/tasks/ldap.py:28
msgid "Periodic import ldap user"
msgstr "LDAP ユーザーを定期的にインポートする"
@@ -6618,7 +6696,9 @@ msgid "Secure session sharing settings is disabled"
msgstr "安全なセッション共有設定が無効になっています"
#: terminal/apps.py:9
-msgid "Terminals"
+#, fuzzy
+#| msgid "Terminals"
+msgid "App Terminals"
msgstr "ターミナル管理"
#: terminal/backends/command/models.py:19
@@ -6636,7 +6716,7 @@ msgstr "リスクレベル"
#: terminal/connect_methods.py:29
msgid "SSH Client"
-msgstr "SSH クライアント"
+msgstr "SSH Clientの有効化"
#: terminal/connect_methods.py:30
msgid "SSH Guide"
@@ -7048,6 +7128,10 @@ msgstr "検証コードが無効"
msgid "You have already joined this session"
msgstr "すでにこのセッションに参加しています"
+#: terminal/models/virtualapp/provider.py:11
+msgid "Hostname"
+msgstr "ホスト名"
+
#: terminal/models/virtualapp/virtualapp.py:32
msgid "Providers"
msgstr "プロバイダ"
@@ -7069,7 +7153,7 @@ msgstr "セッション"
msgid "Command warning"
msgstr "コマンド警告"
-#: terminal/notifications.py:130
+#: terminal/notifications.py:130 terminal/notifications.py:175
msgid "Command reject"
msgstr "コマンド拒否"
@@ -7077,10 +7161,6 @@ msgstr "コマンド拒否"
msgid "Level"
msgstr "レベル"
-#: terminal/notifications.py:175
-msgid "Batch danger command alert"
-msgstr "一括危険コマンド警告"
-
#: terminal/notifications.py:224
msgid "Command and replay storage"
msgstr "コマンド及び録画記憶"
@@ -7246,10 +7326,6 @@ msgstr "無効なコマンドグループID"
msgid "Invalid session id"
msgstr "無効なセッションID"
-#: terminal/serializers/command.py:72
-msgid "Account "
-msgstr "アカウント"
-
#: terminal/serializers/command.py:74
msgid "Timestamp"
msgstr "タイムスタンプ"
@@ -7338,8 +7414,7 @@ msgid "Bucket"
msgstr "バケット"
#: terminal/serializers/storage.py:33
-#: xpack/plugins/cloud/serializers/account_attrs.py:17
-msgid "Access key id"
+msgid "Access key ID"
msgstr "アクセスキー"
#: terminal/serializers/storage.py:37
@@ -7408,6 +7483,24 @@ msgstr "Docタイプ"
msgid "Session id"
msgstr "セッション"
+#: terminal/serializers/terminal.py:42
+#, fuzzy
+#| msgid "Have online sessions"
+msgid "Online sessions"
+msgstr "オンラインセッションを持つ"
+
+#: terminal/serializers/terminal.py:43
+#, fuzzy
+#| msgid "Is active"
+msgid "Is alive"
+msgstr "アクティブです。"
+
+#: terminal/serializers/terminal.py:49
+#, fuzzy
+#| msgid "State"
+msgid "Stat"
+msgstr "状態"
+
#: terminal/serializers/terminal.py:83 terminal/serializers/terminal.py:91
msgid "Not found"
msgstr "見つかりません"
@@ -7584,7 +7677,9 @@ msgid "Applicant"
msgstr "応募者"
#: tickets/apps.py:7
-msgid "Tickets"
+#, fuzzy
+#| msgid "Tickets"
+msgid "App Tickets"
msgstr "チケット"
#: tickets/const.py:10
@@ -7802,10 +7897,6 @@ msgstr "ログインアカウント"
msgid "Apply Login Asset Ticket"
msgstr "資産ログインレビュー製造オーダ"
-#: tickets/models/ticket/login_confirm.py:12
-msgid "Login datetime"
-msgstr "ログイン日時"
-
#: tickets/models/ticket/login_confirm.py:15
msgid "Apply Login Ticket"
msgstr "ユーザーログインレビュー製造オーダ"
@@ -7935,6 +8026,12 @@ msgstr "自分自身を招待することはできません"
msgid "Could not reset self otp, use profile reset instead"
msgstr "自己otpをリセットできませんでした、代わりにプロファイルリセットを使用"
+#: users/apps.py:9
+#, fuzzy
+#| msgid "App assets"
+msgid "App Users"
+msgstr "アプリ資産"
+
#: users/const.py:10
msgid "System administrator"
msgstr "システム管理者"
@@ -8251,6 +8348,9 @@ msgid ""
"remote computer to fit the window size of the client computer when the "
"window is resized."
msgstr ""
+"ウィンドウサイズを調整したときに、クライアントコンピューターがリモートコン"
+"ピューター上の内容をクライアントコンピューターのウィンドウサイズに合うように"
+"拡大または縮小するかどうかを決定します。"
# msgid ""
# "Determines whether the client computer should scale the content on the "
@@ -8288,7 +8388,7 @@ msgstr "コマンドライン"
msgid "The old password is incorrect"
msgstr "古いパスワードが正しくありません"
-#: users/serializers/profile.py:36 users/serializers/profile.py:178
+#: users/serializers/profile.py:36 users/serializers/profile.py:179
msgid "Password does not match security rules"
msgstr "パスワードがセキュリティルールと一致しない"
@@ -9173,6 +9273,12 @@ msgstr "有効表示"
msgid "Provider display"
msgstr "プロバイダ表示"
+#: xpack/plugins/cloud/serializers/account_attrs.py:17
+#, fuzzy
+#| msgid "Access key"
+msgid "Access key id"
+msgstr "アクセスキー"
+
#: xpack/plugins/cloud/serializers/account_attrs.py:35
msgid "Client ID"
msgstr "クライアントID"
@@ -9298,11 +9404,11 @@ msgid "Interface settings"
msgstr "インターフェイスの設定"
#: xpack/plugins/interface/models.py:23
-msgid "Title of login page"
+msgid "Login title"
msgstr "ログインページのタイトル"
#: xpack/plugins/interface/models.py:27
-msgid "Image of login page"
+msgid "Login image"
msgstr "ログインページのイメージ"
#: xpack/plugins/interface/models.py:31
@@ -9310,14 +9416,17 @@ msgid "Website icon"
msgstr "ウェブサイトのアイコン"
#: xpack/plugins/interface/models.py:35
-msgid "Logo of management page"
+msgid "Index logo"
msgstr "管理ページのロゴ"
#: xpack/plugins/interface/models.py:39
-msgid "Logo of logout page"
-msgstr "ログアウトページのロゴ"
+#, fuzzy
+#| msgid "Logout"
+msgid "Logout logo"
+msgstr "ログアウト"
#: xpack/plugins/interface/models.py:41
+#: xpack/plugins/interface/serializers/interface.py:26
msgid "Theme"
msgstr "テーマ"
@@ -9329,6 +9438,14 @@ msgstr "フッターの内容"
msgid "Interface setting"
msgstr "インターフェイスの設定"
+#: xpack/plugins/interface/serializers/interface.py:37
+msgid "Wide logo on top"
+msgstr ""
+
+#: xpack/plugins/interface/serializers/interface.py:38
+msgid "Small logo without text"
+msgstr ""
+
#: xpack/plugins/license/api.py:52
msgid "License import successfully"
msgstr "ライセンスのインポートに成功"
diff --git a/apps/locale/ja/LC_MESSAGES/djangojs.mo b/apps/i18n/core/ja/LC_MESSAGES/djangojs.mo
similarity index 100%
rename from apps/locale/ja/LC_MESSAGES/djangojs.mo
rename to apps/i18n/core/ja/LC_MESSAGES/djangojs.mo
diff --git a/apps/locale/ja/LC_MESSAGES/djangojs.po b/apps/i18n/core/ja/LC_MESSAGES/djangojs.po
similarity index 100%
rename from apps/locale/ja/LC_MESSAGES/djangojs.po
rename to apps/i18n/core/ja/LC_MESSAGES/djangojs.po
diff --git a/apps/i18n/core/zh/LC_MESSAGES/django.mo b/apps/i18n/core/zh/LC_MESSAGES/django.mo
new file mode 100644
index 000000000..8f7b4fa62
--- /dev/null
+++ b/apps/i18n/core/zh/LC_MESSAGES/django.mo
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3453782a925aafc7fe2e05cf07299f8c35dc239f9e09e539d905d10cae15ecea
+size 138663
diff --git a/apps/locale/zh/LC_MESSAGES/django.po b/apps/i18n/core/zh/LC_MESSAGES/django.po
similarity index 92%
rename from apps/locale/zh/LC_MESSAGES/django.po
rename to apps/i18n/core/zh/LC_MESSAGES/django.po
index f5b2d3a99..a94576224 100644
--- a/apps/locale/zh/LC_MESSAGES/django.po
+++ b/apps/i18n/core/zh/LC_MESSAGES/django.po
@@ -30,8 +30,6 @@ msgstr "成功: %s, 失败: %s, 总数: %s"
#: accounts/serializers/automations/change_secret.py:34
#: assets/models/_user.py:24 audits/signal_handlers/login_log.py:34
#: authentication/confirm/password.py:9 authentication/confirm/password.py:24
-#: authentication/confirm/password.py:26 authentication/forms.py:28
-#: authentication/templates/authentication/login.html:330
#: settings/serializers/auth/ldap.py:25 settings/serializers/auth/ldap.py:47
#: settings/serializers/msg.py:35 terminal/serializers/storage.py:123
#: terminal/serializers/storage.py:142 users/forms/profile.py:21
@@ -209,9 +207,9 @@ msgstr "仅创建"
#: authentication/serializers/password_mfa.py:16
#: authentication/serializers/password_mfa.py:24
#: notifications/backends/__init__.py:10 settings/serializers/msg.py:22
-#: settings/serializers/msg.py:64 users/forms/profile.py:100
-#: users/forms/profile.py:108 users/models/user.py:816
-#: users/templates/users/forgot_password.html:162
+#: settings/serializers/msg.py:64 users/forms/profile.py:102
+#: users/forms/profile.py:109 users/models/user.py:862
+#: users/templates/users/forgot_password.html:160
#: users/views/profile/reset.py:94
msgid "Email"
msgstr "邮箱"
@@ -263,15 +261,15 @@ msgstr "用户 %s 查看/导出 了密码"
#: accounts/models/account.py:49
#: accounts/models/automations/gather_account.py:16
-#: accounts/serializers/account/account.py:213
-#: accounts/serializers/account/account.py:258
+#: accounts/serializers/account/account.py:215
+#: accounts/serializers/account/account.py:260
#: accounts/serializers/account/gathered_account.py:10
#: accounts/serializers/automations/change_secret.py:108
#: accounts/serializers/automations/change_secret.py:140
#: accounts/templates/accounts/asset_account_change_info.html:7
#: accounts/templates/accounts/change_secret_failed_info.html:11
#: acls/serializers/base.py:123 assets/models/asset/common.py:95
-#: assets/models/asset/common.py:350 assets/models/cmd_filter.py:36
+#: assets/models/asset/common.py:349 assets/models/cmd_filter.py:36
#: audits/models.py:58 authentication/models/connection_token.py:36
#: perms/models/asset_permission.py:69 perms/serializers/permission.py:36
#: terminal/backends/command/models.py:17 terminal/models/session/session.py:32
@@ -284,8 +282,8 @@ msgid "Asset"
msgstr "资产"
#: accounts/models/account.py:53 accounts/models/template.py:16
-#: accounts/serializers/account/account.py:220
-#: accounts/serializers/account/account.py:268
+#: accounts/serializers/account/account.py:222
+#: accounts/serializers/account/account.py:270
#: accounts/serializers/account/template.py:27
#: authentication/serializers/connect_token_secret.py:50
msgid "Su from"
@@ -297,8 +295,8 @@ msgstr "切换自"
msgid "Version"
msgstr "版本"
-#: accounts/models/account.py:57 accounts/serializers/account/account.py:215
-#: users/models/user.py:859
+#: accounts/models/account.py:57 accounts/serializers/account/account.py:217
+#: users/models/user.py:914
msgid "Source"
msgstr "来源"
@@ -311,11 +309,11 @@ msgstr "来源 ID"
#: accounts/serializers/automations/change_secret.py:141
#: accounts/templates/accounts/change_secret_failed_info.html:12
#: acls/serializers/base.py:124 acls/templates/acls/asset_login_reminder.html:7
-#: assets/serializers/asset/common.py:128 assets/serializers/gateway.py:28
-#: audits/models.py:59 authentication/api/connection_token.py:411
-#: ops/models/base.py:18 perms/models/asset_permission.py:75
-#: perms/serializers/permission.py:41 settings/serializers/msg.py:33
-#: terminal/backends/command/models.py:18 terminal/models/session/session.py:34
+#: assets/serializers/gateway.py:28 audits/models.py:59
+#: authentication/api/connection_token.py:405 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:33
+#: terminal/serializers/command.py:72
#: terminal/templates/terminal/_msg_command_warning.html:8
#: terminal/templates/terminal/_msg_session_sharing.html:8
#: tickets/models/ticket/command_confirm.py:13 xpack/plugins/cloud/models.py:85
@@ -347,12 +345,14 @@ msgid "Can remove account"
msgstr "可以移除账号"
#: accounts/models/automations/backup_account.py:27
-msgid "Backup Type"
+#, fuzzy
+#| msgid "Backup Type"
+msgid "Backup type"
msgstr "备份类型"
#: accounts/models/automations/backup_account.py:28
#: accounts/models/automations/backup_account.py:29
-msgid "Is Password Divided"
+msgid "Password divided"
msgstr "密钥是否拆分成前后两部分"
#: accounts/models/automations/backup_account.py:32
@@ -364,26 +364,31 @@ msgid "Recipient part two"
msgstr "收件人部分二"
#: accounts/models/automations/backup_account.py:40
-msgid "Object Storage Recipient part one"
+#, fuzzy
+#| msgid "Object Storage Recipient part one"
+msgid "Object storage recipient part one"
msgstr "接收服务器一"
#: accounts/models/automations/backup_account.py:44
-msgid "Object Storage Recipient part two"
+#, fuzzy
+#| msgid "Object Storage Recipient part two"
+msgid "Object storage recipient part two"
msgstr "接收服务器二"
#: accounts/models/automations/backup_account.py:47
-#: accounts/serializers/account/backup.py:20
-msgid "Zip Encrypt Password"
+#, fuzzy
+#| msgid "Zip Encrypt Password"
+msgid "Zip encrypt password"
msgstr "文件加密密码"
-#: accounts/models/automations/backup_account.py:55
-#: accounts/models/automations/backup_account.py:138
+#: accounts/models/automations/backup_account.py:56
+#: accounts/models/automations/backup_account.py:139
msgid "Account backup plan"
msgstr "账号备份计划"
-#: accounts/models/automations/backup_account.py:119
+#: accounts/models/automations/backup_account.py:120
#: assets/models/automations/base.py:115 audits/models.py:65
-#: ops/models/base.py:55 ops/models/celery.py:88 ops/models/job.py:238
+#: ops/models/base.py:55 ops/models/celery.py:86 ops/models/job.py:236
#: ops/templates/ops/celery_task_log.html:75
#: perms/models/asset_permission.py:78
#: settings/templates/ldap/_msg_import_ldap_user.html:5
@@ -393,38 +398,38 @@ msgstr "账号备份计划"
msgid "Date start"
msgstr "开始日期"
-#: accounts/models/automations/backup_account.py:122
+#: accounts/models/automations/backup_account.py:123
#: authentication/templates/authentication/_msg_oauth_bind.html:11
#: notifications/notifications.py:186
#: settings/templates/ldap/_msg_import_ldap_user.html:3
msgid "Time"
msgstr "时间"
-#: accounts/models/automations/backup_account.py:126
+#: accounts/models/automations/backup_account.py:127
msgid "Account backup snapshot"
msgstr "账号备份快照"
-#: accounts/models/automations/backup_account.py:130
-#: accounts/serializers/account/backup.py:49
-#: accounts/serializers/automations/base.py:56
+#: accounts/models/automations/backup_account.py:131
+#: accounts/serializers/account/backup.py:48
+#: accounts/serializers/automations/base.py:55
#: assets/models/automations/base.py:122
-#: assets/serializers/automations/base.py:40
+#: assets/serializers/automations/base.py:39
msgid "Trigger mode"
msgstr "触发模式"
-#: accounts/models/automations/backup_account.py:133 audits/models.py:203
-#: terminal/models/session/sharing.py:125 xpack/plugins/cloud/models.py:204
+#: accounts/models/automations/backup_account.py:134 audits/models.py:203
+#: terminal/models/session/sharing.py:125 xpack/plugins/cloud/models.py:208
msgid "Reason"
msgstr "原因"
-#: accounts/models/automations/backup_account.py:135
-#: accounts/serializers/automations/change_secret.py:107
-#: accounts/serializers/automations/change_secret.py:142
-#: ops/serializers/job.py:71 terminal/serializers/session.py:52
+#: accounts/models/automations/backup_account.py:136
+#: accounts/serializers/automations/change_secret.py:105
+#: accounts/serializers/automations/change_secret.py:128
+#: ops/serializers/job.py:67 terminal/serializers/session.py:49
msgid "Is success"
msgstr "是否成功"
-#: accounts/models/automations/backup_account.py:143
+#: accounts/models/automations/backup_account.py:144
msgid "Account backup execution"
msgstr "账号备份执行"
@@ -470,9 +475,9 @@ msgstr "SSH 密钥推送方式"
#: accounts/models/automations/change_secret.py:15
#: accounts/models/automations/gather_account.py:58
-#: accounts/serializers/account/backup.py:41
-#: accounts/serializers/automations/change_secret.py:58
-#: settings/serializers/auth/ldap.py:90
+#: accounts/serializers/account/backup.py:40
+#: accounts/serializers/automations/change_secret.py:56
+#: settings/serializers/auth/ldap.py:81
msgid "Recipient"
msgstr "收件人"
@@ -494,14 +499,14 @@ msgstr "开始日期"
#: accounts/models/automations/change_secret.py:42
#: assets/models/automations/base.py:116 ops/models/base.py:56
-#: ops/models/celery.py:89 ops/models/job.py:239
+#: ops/models/celery.py:87 ops/models/job.py:237
#: terminal/models/applet/host.py:142
msgid "Date finished"
msgstr "结束日期"
#: accounts/models/automations/change_secret.py:44
#: assets/models/automations/base.py:113 audits/models.py:208
-#: audits/serializers.py:54 ops/models/base.py:49 ops/models/job.py:230
+#: audits/serializers.py:54 ops/models/base.py:49 ops/models/job.py:228
#: terminal/models/applet/applet.py:320 terminal/models/applet/host.py:140
#: terminal/models/component/status.py:30
#: terminal/models/virtualapp/virtualapp.py:99
@@ -513,10 +518,8 @@ msgstr "结束日期"
msgid "Status"
msgstr "状态"
-#: accounts/models/automations/change_secret.py:47
-#: accounts/serializers/account/account.py:260
-#: accounts/templates/accounts/change_secret_failed_info.html:13
-#: assets/const/automation.py:8
+#: accounts/models/automations/change_secret.py:44
+#: accounts/serializers/account/account.py:262 assets/const/automation.py:8
#: authentication/templates/authentication/passkey.html:173
#: authentication/views/base.py:42 authentication/views/base.py:43
#: authentication/views/base.py:44 common/const/choices.py:20
@@ -533,7 +536,9 @@ msgid "Present"
msgstr "存在"
#: accounts/models/automations/gather_account.py:15
-msgid "Date last login"
+#, fuzzy
+#| msgid "Date last login"
+msgid "Date login"
msgstr "最后登录日期"
#: accounts/models/automations/gather_account.py:17
@@ -544,15 +549,17 @@ msgstr "最后登录日期"
#: authentication/models/temp_token.py:9
#: authentication/templates/authentication/_msg_different_city.html:9
#: authentication/templates/authentication/_msg_oauth_bind.html:9
-#: terminal/serializers/storage.py:136 users/forms/profile.py:31
-#: users/forms/profile.py:114 users/models/user.py:812
+#: terminal/serializers/storage.py:136 users/forms/profile.py:32
+#: users/forms/profile.py:115 users/models/user.py:858
#: users/templates/users/_msg_user_created.html:12
#: xpack/plugins/cloud/serializers/account_attrs.py:26
msgid "Username"
msgstr "用户名"
#: accounts/models/automations/gather_account.py:18
-msgid "Address last login"
+#, fuzzy
+#| msgid "Address last login"
+msgid "Address login"
msgstr "最后登录地址"
#: accounts/models/automations/gather_account.py:44
@@ -590,7 +597,7 @@ msgid "Verify asset account"
msgstr "账号验证"
#: accounts/models/base.py:37 accounts/models/base.py:67
-#: accounts/serializers/account/account.py:440
+#: accounts/serializers/account/account.py:442
#: accounts/serializers/account/base.py:17
#: accounts/serializers/automations/change_secret.py:47
#: authentication/serializers/connect_token_secret.py:42
@@ -625,24 +632,25 @@ msgstr "密码规则"
#: assets/models/domain.py:19 assets/models/group.py:17
#: assets/models/label.py:18 assets/models/platform.py:16
#: assets/models/platform.py:95 assets/serializers/asset/common.py:149
-#: assets/serializers/platform.py:118 assets/serializers/platform.py:228
+#: assets/serializers/platform.py:136 assets/serializers/platform.py:254
#: authentication/backends/passkey/models.py:10
#: authentication/serializers/connect_token_secret.py:113
#: authentication/serializers/connect_token_secret.py:168 labels/models.py:11
#: ops/mixin.py:21 ops/models/adhoc.py:20 ops/models/celery.py:15
-#: ops/models/celery.py:80 ops/models/job.py:139 ops/models/playbook.py:28
+#: ops/models/celery.py:80 ops/models/job.py:137 ops/models/playbook.py:28
#: ops/serializers/job.py:18 orgs/models.py:82
#: perms/models/asset_permission.py:61 rbac/models/role.py:29
-#: settings/models.py:33 settings/models.py:181 settings/serializers/msg.py:89
-#: terminal/models/applet/applet.py:33 terminal/models/component/endpoint.py:12
+#: settings/models.py:34 settings/models.py:183 settings/serializers/msg.py:89
+#: settings/serializers/terminal.py:9 terminal/models/applet/applet.py:33
+#: terminal/models/component/endpoint.py:12
#: terminal/models/component/endpoint.py:109
#: terminal/models/component/storage.py:26 terminal/models/component/task.py:13
#: terminal/models/component/terminal.py:85
#: terminal/models/virtualapp/provider.py:10
#: terminal/models/virtualapp/virtualapp.py:19 tickets/api/ticket.py:87
-#: users/forms/profile.py:32 users/models/group.py:13
-#: users/models/preference.py:11 users/models/user.py:814
-#: xpack/plugins/cloud/models.py:32 xpack/plugins/cloud/models.py:272
+#: users/forms/profile.py:33 users/models/group.py:13
+#: users/models/preference.py:11 users/models/user.py:860
+#: xpack/plugins/cloud/models.py:32 xpack/plugins/cloud/models.py:276
#: xpack/plugins/cloud/serializers/task.py:70
msgid "Name"
msgstr "名称"
@@ -651,13 +659,13 @@ msgstr "名称"
msgid "Privileged"
msgstr "特权账号"
-#: accounts/models/base.py:70 assets/models/asset/common.py:166
+#: accounts/models/base.py:70 assets/models/asset/common.py:165
#: assets/models/automations/base.py:21 assets/models/cmd_filter.py:39
#: assets/models/label.py:22
#: authentication/serializers/connect_token_secret.py:117
#: terminal/models/applet/applet.py:40
#: terminal/models/component/endpoint.py:120
-#: terminal/models/virtualapp/virtualapp.py:23 users/serializers/user.py:173
+#: terminal/models/virtualapp/virtualapp.py:23 users/serializers/user.py:172
msgid "Is active"
msgstr "激活"
@@ -667,7 +675,7 @@ msgstr "自动推送"
#: accounts/models/template.py:21
msgid "Platforms"
-msgstr "系统平台"
+msgstr "平台"
#: accounts/models/template.py:23
msgid "Push params"
@@ -767,28 +775,32 @@ msgstr "改密或推送账号失败信息"
msgid "Push now"
msgstr "立即推送"
-#: accounts/serializers/account/account.py:38
+#: accounts/serializers/account/account.py:36
+msgid "Params"
+msgstr "参数"
+
+#: accounts/serializers/account/account.py:40
msgid "Exist policy"
msgstr "账号存在策略"
-#: accounts/serializers/account/account.py:193 applications/models.py:11
+#: accounts/serializers/account/account.py:195 applications/models.py:11
#: assets/models/label.py:21 assets/models/platform.py:96
#: assets/serializers/asset/common.py:125 assets/serializers/cagegory.py:12
-#: assets/serializers/platform.py:140 assets/serializers/platform.py:229
-#: perms/serializers/user_permission.py:26 settings/models.py:35
+#: assets/serializers/platform.py:158 assets/serializers/platform.py:255
+#: perms/serializers/user_permission.py:26 settings/models.py:36
#: tickets/models/ticket/apply_application.py:13 users/models/preference.py:12
msgid "Category"
msgstr "类别"
-#: accounts/serializers/account/account.py:194
-#: accounts/serializers/automations/base.py:55 acls/models/command_acl.py:24
+#: accounts/serializers/account/account.py:196
+#: accounts/serializers/automations/base.py:54 acls/models/command_acl.py:24
#: acls/serializers/command_acl.py:19 applications/models.py:14
#: assets/models/_user.py:50 assets/models/automations/base.py:20
#: assets/models/cmd_filter.py:74 assets/models/platform.py:97
-#: assets/serializers/asset/common.py:126 assets/serializers/platform.py:120
-#: assets/serializers/platform.py:139 audits/serializers.py:53
+#: assets/serializers/asset/common.py:126 assets/serializers/platform.py:138
+#: assets/serializers/platform.py:157 audits/serializers.py:53
#: audits/serializers.py:170
-#: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:147
+#: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:145
#: perms/serializers/user_permission.py:27 terminal/models/applet/applet.py:39
#: terminal/models/component/storage.py:57
#: terminal/models/component/storage.py:146 terminal/serializers/applet.py:29
@@ -800,56 +812,57 @@ msgstr "类别"
msgid "Type"
msgstr "类型"
-#: accounts/serializers/account/account.py:209
+#: accounts/serializers/account/account.py:211
msgid "Asset not found"
msgstr "资产不存在"
-#: accounts/serializers/account/account.py:249
+#: accounts/serializers/account/account.py:251
msgid "Has secret"
msgstr "已托管密码"
-#: accounts/serializers/account/account.py:259 ops/models/celery.py:83
-#: tickets/models/comment.py:13 tickets/models/ticket/general.py:46
-#: tickets/models/ticket/general.py:277 tickets/serializers/super_ticket.py:14
+#: accounts/serializers/account/account.py:261 ops/models/celery.py:83
+#: tickets/models/comment.py:13 tickets/models/ticket/general.py:45
+#: tickets/models/ticket/general.py:279 tickets/serializers/super_ticket.py:14
+#: tickets/serializers/ticket/ticket.py:21
msgid "State"
msgstr "状态"
-#: accounts/serializers/account/account.py:261
+#: accounts/serializers/account/account.py:263
msgid "Changed"
msgstr "已修改"
-#: accounts/serializers/account/account.py:271
+#: accounts/serializers/account/account.py:273
#: accounts/serializers/automations/base.py:22 acls/models/base.py:97
#: acls/templates/acls/asset_login_reminder.html:6
#: assets/models/automations/base.py:19
-#: assets/serializers/automations/base.py:20
-#: authentication/api/connection_token.py:410 ops/models/base.py:17
-#: ops/models/job.py:149 ops/serializers/job.py:19
+#: assets/serializers/automations/base.py:20 assets/serializers/domain.py:30
+#: authentication/api/connection_token.py:404 ops/models/base.py:17
+#: ops/models/job.py:147 ops/serializers/job.py:19
#: terminal/templates/terminal/_msg_command_execute_alert.html:16
msgid "Assets"
msgstr "资产"
-#: accounts/serializers/account/account.py:326
+#: accounts/serializers/account/account.py:328
msgid "Account already exists"
msgstr "账号已存在"
-#: accounts/serializers/account/account.py:376
+#: accounts/serializers/account/account.py:378
#, python-format
msgid "Asset does not support this secret type: %s"
msgstr "资产不支持账号类型: %s"
-#: accounts/serializers/account/account.py:408
+#: accounts/serializers/account/account.py:410
msgid "Account has exist"
msgstr "账号已存在"
-#: accounts/serializers/account/account.py:441
+#: accounts/serializers/account/account.py:443
#: authentication/serializers/connect_token_secret.py:159
#: 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:451 acls/serializers/base.py:116
+#: accounts/serializers/account/account.py:453 acls/serializers/base.py:116
#: acls/templates/acls/asset_login_reminder.html:5
#: acls/templates/acls/user_login_reminder.html:5
#: assets/models/cmd_filter.py:24 assets/models/label.py:16 audits/models.py:54
@@ -865,42 +878,38 @@ msgstr "ID"
#: terminal/notifications.py:205 terminal/serializers/command.py:16
#: terminal/templates/terminal/_msg_command_warning.html:6
#: terminal/templates/terminal/_msg_session_sharing.html:6
-#: tickets/models/comment.py:21 users/const.py:14 users/models/user.py:1019
-#: users/models/user.py:1057 users/serializers/group.py:21
+#: tickets/models/comment.py:21 users/const.py:14 users/models/user.py:1044
+#: users/models/user.py:1081
msgid "User"
msgstr "用户"
-#: accounts/serializers/account/account.py:452
+#: accounts/serializers/account/account.py:454
#: authentication/templates/authentication/_access_key_modal.html:33
#: terminal/notifications.py:158 terminal/notifications.py:207
msgid "Date"
msgstr "日期"
-#: accounts/serializers/account/backup.py:38
-#: accounts/serializers/automations/base.py:24
-#: accounts/serializers/automations/base.py:37
-#: assets/serializers/automations/base.py:34 ops/mixin.py:23 ops/mixin.py:104
-#: settings/serializers/auth/ldap.py:66
-msgid "Periodic perform"
-msgstr "定时执行"
+#: accounts/serializers/account/backup.py:20
+msgid "Zip Encrypt Password"
+msgstr "文件加密密码"
-#: accounts/serializers/account/backup.py:39
-#: accounts/serializers/automations/base.py:38
-msgid "Executed amount"
+#: accounts/serializers/account/backup.py:38
+#: accounts/serializers/automations/base.py:37
+msgid "Executions"
msgstr "执行次数"
-#: accounts/serializers/account/backup.py:42
-#: accounts/serializers/automations/change_secret.py:59
+#: accounts/serializers/account/backup.py:41
+#: accounts/serializers/automations/change_secret.py:57
msgid "Currently only mail sending is supported"
msgstr "当前只支持邮件发送"
-#: accounts/serializers/account/backup.py:44
+#: accounts/serializers/account/backup.py:43
msgid "Asset type"
msgstr "资产类型"
#: accounts/serializers/account/base.py:25 terminal/serializers/storage.py:149
-msgid "Key password"
-msgstr "密钥密码"
+msgid "Passphrase"
+msgstr ""
#: accounts/serializers/account/base.py:78
#: assets/serializers/asset/common.py:384
@@ -920,10 +929,12 @@ msgid "Password length"
msgstr "密码长度"
#: accounts/serializers/account/template.py:14
+#: settings/serializers/security.py:44
msgid "Lowercase"
msgstr "小写字母"
#: accounts/serializers/account/template.py:15
+#: settings/serializers/security.py:41
msgid "Uppercase"
msgstr "大写字母"
@@ -956,15 +967,15 @@ msgstr "关联平台,可配置推送参数,如果不关联,将使用默认
#: accounts/serializers/account/virtual.py:19 assets/models/_user.py:27
#: assets/models/cmd_filter.py:40 assets/models/cmd_filter.py:88
#: assets/models/group.py:20 common/db/models.py:36 ops/models/adhoc.py:26
-#: ops/models/job.py:155 ops/models/playbook.py:31 rbac/models/role.py:37
-#: settings/models.py:38 terminal/models/applet/applet.py:45
+#: ops/models/job.py:153 ops/models/playbook.py:31 rbac/models/role.py:37
+#: settings/models.py:39 terminal/models/applet/applet.py:45
#: terminal/models/applet/applet.py:321 terminal/models/applet/host.py:143
#: terminal/models/component/endpoint.py:25
#: terminal/models/component/endpoint.py:119
#: terminal/models/session/session.py:47
#: terminal/models/virtualapp/virtualapp.py:28 tickets/models/comment.py:32
-#: tickets/models/ticket/general.py:295 users/models/user.py:850
-#: xpack/plugins/cloud/models.py:39 xpack/plugins/cloud/models.py:106
+#: tickets/models/ticket/general.py:297 users/models/user.py:896
+#: xpack/plugins/cloud/models.py:39 xpack/plugins/cloud/models.py:110
msgid "Comment"
msgstr "备注"
@@ -979,6 +990,7 @@ msgstr ""
"CACHE_LOGIN_PASSWORD_ENABLED=true,重启服务才能开启"
#: accounts/serializers/automations/base.py:23
+#: assets/models/asset/common.py:164 assets/serializers/asset/common.py:152
#: assets/serializers/automations/base.py:21
msgid "Nodes"
msgstr "节点"
@@ -989,7 +1001,7 @@ msgstr "名称已存在"
#: accounts/serializers/automations/base.py:54
#: assets/models/automations/base.py:118
-#: assets/serializers/automations/base.py:39
+#: assets/serializers/automations/base.py:38
msgid "Automation snapshot"
msgstr "自动化快照"
@@ -1010,6 +1022,14 @@ msgstr "* 密码长度范围 6-30 位"
msgid "Automation task execution"
msgstr "自动化任务执行历史"
+#: accounts/serializers/automations/change_secret.py:149 audits/const.py:61
+#: audits/models.py:64 audits/signal_handlers/activity_log.py:33
+#: common/const/choices.py:18 ops/const.py:73 ops/serializers/celery.py:48
+#: terminal/const.py:78 terminal/models/session/sharing.py:121
+#: tickets/views/approve.py:117
+msgid "Success"
+msgstr "成功"
+
#: accounts/signal_handlers.py:47
#, python-format
msgid "Push related accounts to assets: %s, by system"
@@ -1109,10 +1129,10 @@ msgid "private key invalid or passphrase error"
msgstr "密钥不合法或密钥密码错误"
#: acls/apps.py:7
-msgid "Acls"
+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:36 terminal/const.py:11 tickets/const.py:46
#: tickets/templates/tickets/approve_check_password.html:47
msgid "Reject"
msgstr "拒绝"
@@ -1129,7 +1149,7 @@ msgstr "审批"
msgid "Warning"
msgstr "告警"
-#: acls/const.py:10 audits/const.py:35 notifications/apps.py:7
+#: acls/const.py:10 audits/const.py:35
msgid "Notifications"
msgstr "通知"
@@ -1158,19 +1178,19 @@ msgstr "审批人"
msgid "Active"
msgstr "激活中"
-#: acls/models/base.py:81 users/apps.py:9 users/models/preference.py:16
+#: acls/models/base.py:81 users/models/preference.py:16
+#: users/serializers/group.py:21 users/serializers/user.py:302
msgid "Users"
-msgstr "用户管理"
+msgstr "用户"
#: acls/models/base.py:98 assets/models/automations/base.py:17
-#: assets/models/cmd_filter.py:38 perms/serializers/user_permission.py:75
+#: assets/models/cmd_filter.py:38 assets/serializers/asset/common.py:128
+#: perms/serializers/permission.py:45 perms/serializers/user_permission.py:75
#: rbac/tree.py:35
msgid "Accounts"
-msgstr "账号管理"
+msgstr "账号"
#: acls/models/command_acl.py:16 assets/models/cmd_filter.py:60
-#: ops/serializers/job.py:70 terminal/const.py:86
-#: terminal/models/session/session.py:43 terminal/serializers/command.py:18
#: terminal/templates/terminal/_msg_command_alert.html:12
#: terminal/templates/terminal/_msg_command_execute_alert.html:10
#: terminal/templates/terminal/_msg_command_warning.html:23
@@ -1183,8 +1203,8 @@ msgid "Regex"
msgstr "正则表达式"
#: acls/models/command_acl.py:26 assets/models/cmd_filter.py:79
-#: settings/models.py:182 settings/serializers/feature.py:19
-#: xpack/plugins/license/models.py:30
+#: settings/models.py:184 settings/serializers/feature.py:19
+#: settings/serializers/msg.py:78 xpack/plugins/license/models.py:30
msgid "Content"
msgstr "内容"
@@ -1299,7 +1319,6 @@ 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
-#: settings/serializers/terminal.py:10
msgid "IP"
msgstr "IP"
@@ -1343,7 +1362,7 @@ msgstr ""
"问,请立即采取适当的措施。"
#: applications/apps.py:9
-msgid "Applications"
+msgid "App Applications"
msgstr "应用管理"
#: applications/models.py:16 xpack/plugins/cloud/models.py:37
@@ -1384,7 +1403,7 @@ msgid "The same level node name cannot be the same"
msgstr "同级别节点名字不能重复"
#: assets/apps.py:9
-msgid "App assets"
+msgid "App Assets"
msgstr "资产管理"
#: assets/automations/base/manager.py:188
@@ -1679,18 +1698,15 @@ msgstr "SSH公钥"
#: assets/models/_user.py:28 assets/models/automations/base.py:114
#: assets/models/cmd_filter.py:41 assets/models/group.py:19
#: audits/models.py:267 common/db/models.py:34 ops/models/base.py:54
-#: ops/models/job.py:237 users/models/user.py:1058
msgid "Date created"
msgstr "创建日期"
#: assets/models/_user.py:29 assets/models/cmd_filter.py:42
-#: common/db/models.py:35 users/models/user.py:868
msgid "Date updated"
msgstr "更新日期"
#: assets/models/_user.py:30 assets/models/cmd_filter.py:44
#: assets/models/cmd_filter.py:91 assets/models/group.py:18
-#: common/db/models.py:32 users/models/user.py:857
#: users/serializers/group.py:32
msgid "Created by"
msgstr "创建者"
@@ -1776,6 +1792,7 @@ msgid "Port"
msgstr "端口"
#: assets/models/asset/common.py:160 assets/serializers/asset/common.py:150
+#: settings/serializers/terminal.py:10
msgid "Address"
msgstr "地址"
@@ -1784,7 +1801,7 @@ msgstr "地址"
#: authentication/serializers/connect_token_secret.py:118
#: perms/serializers/user_permission.py:25 xpack/plugins/cloud/models.py:325
msgid "Platform"
-msgstr "系统平台"
+msgstr "平台"
#: assets/models/asset/common.py:163 assets/models/domain.py:22
#: authentication/serializers/connect_token_secret.py:136
@@ -1804,23 +1821,23 @@ msgstr "节点"
msgid "Gathered info"
msgstr "收集资产硬件信息"
-#: assets/models/asset/common.py:168 assets/serializers/asset/custom.py:14
+#: assets/models/asset/common.py:167 assets/serializers/asset/custom.py:14
msgid "Custom info"
msgstr "自定义属性"
-#: assets/models/asset/common.py:353
+#: assets/models/asset/common.py:352
msgid "Can refresh asset hardware info"
msgstr "可以更新资产硬件信息"
-#: assets/models/asset/common.py:354
+#: assets/models/asset/common.py:353
msgid "Can test asset connectivity"
msgstr "可以测试资产连接性"
-#: assets/models/asset/common.py:355
+#: assets/models/asset/common.py:354
msgid "Can match asset"
msgstr "可以匹配资产"
-#: assets/models/asset/common.py:356
+#: assets/models/asset/common.py:355
msgid "Can change asset nodes"
msgstr "可以修改资产节点"
@@ -1869,9 +1886,9 @@ msgstr "收集资产信息"
msgid "Ping asset"
msgstr "测试资产"
-#: assets/models/base.py:19
+#: assets/models/base.py:19 terminal/notifications.py:225
msgid "Connectivity"
-msgstr "可连接性"
+msgstr "连接性"
#: assets/models/base.py:21 authentication/models/temp_token.py:12
msgid "Date verified"
@@ -1879,7 +1896,6 @@ msgstr "校验日期"
#: assets/models/cmd_filter.py:28 perms/models/asset_permission.py:66
#: perms/serializers/permission.py:34 users/models/group.py:25
-#: users/models/user.py:820
msgid "User group"
msgstr "用户组"
@@ -1920,7 +1936,7 @@ msgid "Asset group"
msgstr "资产组"
#: assets/models/group.py:31 assets/models/platform.py:20
-#: assets/serializers/platform.py:121
+#: assets/serializers/platform.py:139
#: xpack/plugins/cloud/providers/nutanix.py:30
msgid "Default"
msgstr "默认"
@@ -1938,14 +1954,14 @@ msgstr "系统"
#: assets/serializers/cagegory.py:24
#: authentication/models/connection_token.py:29
#: authentication/serializers/connect_token_secret.py:125
-#: common/serializers/common.py:86 labels/models.py:12 settings/models.py:34
+#: common/serializers/common.py:86 labels/models.py:12 settings/models.py:35
#: users/models/preference.py:13
msgid "Value"
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:119
+#: assets/serializers/platform.py:137
#: authentication/serializers/connect_token_secret.py:124
#: common/serializers/common.py:85 labels/models.py:17 labels/models.py:33
#: labels/serializers.py:45 settings/serializers/msg.py:90
@@ -1988,14 +2004,14 @@ msgstr "必须的"
msgid "Public"
msgstr "开放的"
-#: assets/models/platform.py:22 assets/serializers/platform.py:49
-#: settings/serializers/settings.py:95
+#: assets/models/platform.py:22 assets/serializers/platform.py:67
+#: settings/serializers/settings.py:66
#: users/templates/users/reset_password.html:29
msgid "Setting"
msgstr "设置"
#: assets/models/platform.py:39 audits/const.py:56
-#: authentication/backends/passkey/models.py:11 settings/models.py:37
+#: authentication/backends/passkey/models.py:11 settings/models.py:38
#: terminal/serializers/applet_host.py:33
msgid "Enabled"
msgstr "启用"
@@ -2022,7 +2038,7 @@ msgid "Gather facts enabled"
msgstr "启用收集资产信息"
#: assets/models/platform.py:48 assets/models/platform.py:72
-#: assets/serializers/platform.py:36
+#: assets/serializers/platform.py:37
msgid "Gather facts method"
msgstr "收集信息方式"
@@ -2030,11 +2046,11 @@ msgstr "收集信息方式"
msgid "Gather facts params"
msgstr "收集信息参数"
-#: assets/models/platform.py:52 assets/serializers/platform.py:39
+#: assets/models/platform.py:52 assets/serializers/platform.py:45
msgid "Change secret enabled"
msgstr "启用改密"
-#: assets/models/platform.py:54 assets/serializers/platform.py:40
+#: assets/models/platform.py:54 assets/serializers/platform.py:48
msgid "Change secret method"
msgstr "改密方式"
@@ -2042,11 +2058,11 @@ msgstr "改密方式"
msgid "Change secret params"
msgstr "改密参数"
-#: assets/models/platform.py:58 assets/serializers/platform.py:41
+#: assets/models/platform.py:58 assets/serializers/platform.py:51
msgid "Push account enabled"
msgstr "启用账号推送"
-#: assets/models/platform.py:60 assets/serializers/platform.py:42
+#: assets/models/platform.py:60 assets/serializers/platform.py:53
msgid "Push account method"
msgstr "账号推送方式"
@@ -2054,11 +2070,11 @@ msgstr "账号推送方式"
msgid "Push account params"
msgstr "账号推送参数"
-#: assets/models/platform.py:64 assets/serializers/platform.py:37
+#: assets/models/platform.py:64
msgid "Verify account enabled"
msgstr "开启账号验证"
-#: assets/models/platform.py:66 assets/serializers/platform.py:38
+#: assets/models/platform.py:66 assets/serializers/platform.py:41
msgid "Verify account method"
msgstr "账号验证方式"
@@ -2086,23 +2102,23 @@ msgstr "元数据"
msgid "Internal"
msgstr "内置"
-#: assets/models/platform.py:103 assets/serializers/platform.py:138
+#: assets/models/platform.py:103 assets/serializers/platform.py:156
msgid "Charset"
msgstr "编码"
-#: assets/models/platform.py:105 assets/serializers/platform.py:167
+#: assets/models/platform.py:105 assets/serializers/platform.py:191
msgid "Domain enabled"
msgstr "启用网域"
-#: assets/models/platform.py:107 assets/serializers/platform.py:166
+#: assets/models/platform.py:107 assets/serializers/platform.py:184
msgid "Su enabled"
msgstr "启用账号切换"
-#: assets/models/platform.py:108 assets/serializers/platform.py:144
+#: assets/models/platform.py:108 assets/serializers/platform.py:162
msgid "Su method"
msgstr "账号切换方式"
-#: assets/models/platform.py:109 assets/serializers/platform.py:147
+#: assets/models/platform.py:109 assets/serializers/platform.py:165
msgid "Custom fields"
msgstr "自定义属性"
@@ -2117,11 +2133,9 @@ msgid ""
"type"
msgstr "资产中批量更新平台,不符合平台类型跳过的资产"
-#: assets/serializers/asset/common.py:127 assets/serializers/platform.py:141
+#: assets/serializers/asset/common.py:127 assets/serializers/platform.py:159
#: authentication/serializers/connect_token_secret.py:30
#: authentication/serializers/connect_token_secret.py:75
-#: perms/models/asset_permission.py:76 perms/serializers/permission.py:42
-#: perms/serializers/user_permission.py:74 xpack/plugins/cloud/models.py:328
#: xpack/plugins/cloud/serializers/task.py:33
msgid "Protocols"
msgstr "协议组"
@@ -2246,59 +2260,102 @@ msgstr "值"
msgid "Can't contains: /"
msgstr "不能包含: /"
-#: assets/serializers/platform.py:43
+#: assets/serializers/platform.py:34
+#, fuzzy
+#| msgid "Run ansible task execution"
+msgid "Enable asset detection"
+msgstr "开始执行 Ansible 任务"
+
+#: assets/serializers/platform.py:38
+msgid "Enable asset information collection"
+msgstr ""
+
+#: assets/serializers/platform.py:42
+#, fuzzy
+#| msgid "Ignore SSL verification"
+msgid "Enable account verification"
+msgstr "忽略 SSL 证书验证"
+
+#: assets/serializers/platform.py:49
+msgid "Enable account secret auto change"
+msgstr ""
+
+#: assets/serializers/platform.py:54
+#, fuzzy
+#| msgid "Enable SSO auth"
+msgid "Enable account auto push"
+msgstr "启用 SSO 令牌认证"
+
+#: assets/serializers/platform.py:57
msgid "Gather accounts enabled"
msgstr "启用账号收集"
-#: assets/serializers/platform.py:44
+#: assets/serializers/platform.py:60
msgid "Gather accounts method"
msgstr "收集账号方式"
-#: assets/serializers/platform.py:50
+#: assets/serializers/platform.py:61
+#, fuzzy
+#| msgid "Gather account automation"
+msgid "Enable account collection"
+msgstr "自动化收集账号"
+
+#: assets/serializers/platform.py:68
msgid "Port from addr"
msgstr "端口来自地址"
-#: assets/serializers/platform.py:62
+#: assets/serializers/platform.py:80
msgid ""
"This protocol is primary, and it must be set when adding assets. "
"Additionally, there can only be one primary protocol."
msgstr "该协议是主要的,添加资产时必须设置。并且只能有一个主要协议"
-#: assets/serializers/platform.py:67
+#: assets/serializers/platform.py:85
msgid "This protocol is required, and it must be set when adding assets."
msgstr "该协议是必填的,添加资产时必须设置"
-#: assets/serializers/platform.py:70
+#: assets/serializers/platform.py:88
msgid ""
"This protocol is default, when adding assets, it will be displayed by "
"default."
msgstr "该协议是默认的,添加资产时,将默认显示"
-#: assets/serializers/platform.py:73
+#: assets/serializers/platform.py:91
msgid "This protocol is public, asset will show this protocol to user"
msgstr "该协议是公开的,资产将向用户显示该协议并可以连接使用"
-#: assets/serializers/platform.py:122
+#: assets/serializers/platform.py:140
msgid "Help text"
msgstr "帮助"
-#: assets/serializers/platform.py:123
+#: assets/serializers/platform.py:141
msgid "Choices"
msgstr "选择"
-#: assets/serializers/platform.py:142
+#: assets/serializers/platform.py:160
msgid "Automation"
msgstr "自动化"
-#: assets/serializers/platform.py:168
+#: assets/serializers/platform.py:186
+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 ""
+
+#: assets/serializers/platform.py:192
+msgid "Assets can be connected using a domain gateway"
+msgstr ""
+
+#: assets/serializers/platform.py:194
msgid "Default Domain"
msgstr "默认网域"
-#: assets/serializers/platform.py:189
+#: assets/serializers/platform.py:215
msgid "type is required"
msgstr "类型 该字段是必填项。"
-#: assets/serializers/platform.py:204
+#: assets/serializers/platform.py:230
msgid "Protocols is required"
msgstr "协议是必填的"
@@ -2369,7 +2426,7 @@ msgid "No assets matched, stop task"
msgstr "没有匹配到资产,结束任务"
#: audits/apps.py:9
-msgid "Audits"
+msgid "App Audits"
msgstr "日志审计"
#: audits/backends/db.py:16
@@ -2431,8 +2488,6 @@ msgid "Connect"
msgstr "连接"
#: audits/const.py:30 authentication/templates/authentication/login.html:296
-#: authentication/templates/authentication/login.html:369
-#: templates/_header_bar.html:101
msgid "Login"
msgstr "登录"
@@ -2447,7 +2502,6 @@ msgstr "同意"
#: audits/const.py:38
#: authentication/templates/authentication/_access_key_modal.html:155
#: authentication/templates/authentication/_mfa_confirm_modal.html:53
-#: templates/_modal.html:22 tickets/const.py:43
msgid "Close"
msgstr "关闭"
@@ -2519,7 +2573,7 @@ msgstr "会话"
#: audits/models.py:70
msgid "File transfer log"
-msgstr "文件管理"
+msgstr "文件传输"
#: audits/models.py:94 audits/serializers.py:86
msgid "Resource Type"
@@ -2569,14 +2623,14 @@ msgid "Login IP"
msgstr "登录 IP"
#: audits/models.py:200 audits/serializers.py:52
-#: authentication/templates/authentication/_mfa_confirm_modal.html:14
-#: users/forms/profile.py:63 users/models/user.py:837
#: users/serializers/profile.py:102
msgid "MFA"
msgstr "MFA"
#: audits/models.py:210
-msgid "Date login"
+#: authentication/templates/authentication/_msg_different_city.html:10
+#: tickets/models/ticket/login_confirm.py:12
+msgid "Login Date"
msgstr "登录日期"
#: audits/models.py:212 audits/models.py:266 audits/serializers.py:70
@@ -2613,13 +2667,11 @@ msgstr "原因描述"
#: audits/serializers.py:134
#, python-format
-msgid "User %s %s this resource"
+msgid "%s %s this resource"
msgstr "用户 %s %s 了当前资源"
#: audits/serializers.py:172 authentication/models/connection_token.py:47
#: 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:20 users/models/user.py:855
msgid "Date expired"
msgstr "失效日期"
@@ -2652,8 +2704,6 @@ msgstr "认证令牌"
#: audits/signal_handlers/login_log.py:37 authentication/notifications.py:73
#: authentication/views/login.py:77 notifications/backends/__init__.py:11
-#: settings/serializers/auth/wecom.py:10 users/models/user.py:759
-#: users/models/user.py:869
msgid "WeCom"
msgstr "企业微信"
@@ -2685,6 +2735,7 @@ msgstr "临时密码"
#: audits/signal_handlers/login_log.py:43 authentication/views/login.py:107
#: settings/serializers/auth/passkey.py:8
+#: settings/serializers/auth/passkey.py:11
msgid "Passkey"
msgstr "Passkey"
@@ -2742,7 +2793,7 @@ msgstr "当前用户不支持 MFA 类型: {}"
msgid "User does not exist: {}"
msgstr "用户不存在: {}"
-#: authentication/api/password.py:33 users/views/profile/reset.py:166
+#: authentication/api/password.py:33 users/views/profile/reset.py:164
msgid "No user matched"
msgstr "没有匹配到用户"
@@ -2753,7 +2804,6 @@ msgid ""
msgstr "用户来自 {} 请去相应系统修改密码"
#: authentication/api/password.py:65
-#: authentication/templates/authentication/login.html:361
#: users/templates/users/forgot_password.html:41
#: users/templates/users/forgot_password.html:42
#: users/templates/users/forgot_password_previewing.html:13
@@ -2761,9 +2811,9 @@ msgstr "用户来自 {} 请去相应系统修改密码"
msgid "Forgot password"
msgstr "忘记密码"
-#: authentication/apps.py:7 settings/serializers/auth/base.py:10
-msgid "Authentication"
-msgstr "认证"
+#: authentication/apps.py:7
+msgid "App Authentication"
+msgstr "认证管理"
#: authentication/backends/custom.py:59
#: authentication/backends/oauth2/backends.py:173
@@ -3065,8 +3115,6 @@ msgstr "短信验证码校验失败"
#: authentication/mfa/sms.py:12 authentication/serializers/password_mfa.py:16
#: authentication/serializers/password_mfa.py:24
-#: settings/serializers/auth/sms.py:32 users/forms/profile.py:103
-#: users/forms/profile.py:108 users/templates/users/forgot_password.html:157
#: users/views/profile/reset.py:100
msgid "SMS"
msgstr "短信"
@@ -3218,6 +3266,7 @@ msgid "Options"
msgstr "选项"
#: authentication/serializers/connect_token_secret.py:127
+#: ops/notifications.py:17
msgid "Component"
msgstr "组件"
@@ -3249,21 +3298,18 @@ msgid "Ticket info"
msgstr "工单信息"
#: authentication/serializers/connection_token.py:21
-#: perms/models/asset_permission.py:77 perms/serializers/permission.py:38
-#: perms/serializers/permission.py:59
+#: perms/models/asset_permission.py:77 perms/serializers/permission.py:42
+#: perms/serializers/permission.py:64
#: tickets/models/ticket/apply_application.py:28
#: tickets/models/ticket/apply_asset.py:18
msgid "Actions"
msgstr "动作"
#: authentication/serializers/connection_token.py:42
-#: perms/serializers/permission.py:40 perms/serializers/permission.py:60
-#: users/serializers/user.py:100 users/serializers/user.py:177
msgid "Is expired"
msgstr "已过期"
#: authentication/serializers/password_mfa.py:29
-#: users/templates/users/forgot_password.html:153
msgid "The {} cannot be empty"
msgstr "{} 不能为空"
@@ -3274,6 +3320,8 @@ msgstr "IP 白名单"
#: authentication/serializers/token.py:92 perms/serializers/permission.py:39
#: perms/serializers/permission.py:61 users/serializers/user.py:101
#: users/serializers/user.py:174
+#: perms/serializers/permission.py:66 users/serializers/user.py:98
+#: users/serializers/user.py:173
msgid "Is valid"
msgstr "是否有效"
@@ -3358,10 +3406,6 @@ msgstr "你好"
msgid "Your account has remote login behavior, please pay attention"
msgstr "你的账号存在异地登录行为,请关注。"
-#: authentication/templates/authentication/_msg_different_city.html:10
-msgid "Login time"
-msgstr "登录日期"
-
#: authentication/templates/authentication/_msg_different_city.html:16
msgid ""
"If you suspect that the login behavior is abnormal, please modify the "
@@ -3399,7 +3443,6 @@ msgstr "重新申请"
#: authentication/templates/authentication/_msg_reset_password_code.html:12
#: terminal/models/session/sharing.py:27 terminal/models/session/sharing.py:97
#: terminal/templates/terminal/_msg_session_sharing.html:12
-#: users/forms/profile.py:106 users/templates/users/forgot_password.html:98
msgid "Verify code"
msgstr "验证码"
@@ -3457,7 +3500,7 @@ msgstr "配置文件有问题,无法登录,请联系管理员或查看最新
msgid "If you are administrator, you can update the config resolve it, set"
msgstr "如果你是管理员,可以更新配置文件解决,设置配置项"
-#: authentication/templates/authentication/login.html:376
+#: authentication/templates/authentication/login.html:375
msgid "More login options"
msgstr "其他方式登录"
@@ -3678,7 +3721,12 @@ msgstr "定时触发"
msgid "Ready"
msgstr "准备"
-#: common/const/choices.py:17 ops/const.py:73
+#: common/const/choices.py:16 terminal/const.py:77 tickets/const.py:30
+#: tickets/const.py:40
+msgid "Pending"
+msgstr "待定的"
+
+#: common/const/choices.py:17 ops/const.py:72
msgid "Running"
msgstr "运行中"
@@ -3770,7 +3818,7 @@ msgstr "忽略的"
msgid "discard time"
msgstr "忽略时间"
-#: common/db/models.py:33 users/models/user.py:858
+#: common/db/models.py:33 users/models/user.py:904
msgid "Updated by"
msgstr "最后更新者"
@@ -3783,7 +3831,7 @@ msgid "Object"
msgstr "对象"
#: common/drf/metadata.py:127
-msgid "Organization ID"
+msgid "Org ID"
msgstr "组织 ID"
#: common/drf/parsers/base.py:21
@@ -3936,9 +3984,9 @@ msgstr "错误的数据类型,应该是列表"
msgid "Invalid choice: {}"
msgstr "无效选项: {}"
-#: common/serializers/mixin.py:397 labels/apps.py:8
+#: common/serializers/mixin.py:400
msgid "Labels"
-msgstr "标签管理"
+msgstr "标签"
# msgid "Labels"
# msgstr "标签管理"
@@ -4000,7 +4048,7 @@ msgstr "JumpServer 开源堡垒机"
msgid "Luna is a separately deployed program, you need to deploy Luna, koko, "
"configure nginx for url distribution,
If you see this page, "
@@ -4009,11 +4057,11 @@ msgstr ""
"Koko is a separately deployed program, you need to deploy Koko, "
"configure nginx for url distribution,
If you see this page, "
@@ -4023,6 +4071,10 @@ msgstr ""
"div>如果你看到了这个页面,证明你访问的不是nginx监听的端口,祝你好运"
"div>"
+#: labels/apps.py:8
+msgid "App Labels"
+msgstr "标签管理"
+
#: labels/models.py:36
msgid "Resource ID"
msgstr "资源 ID"
@@ -4043,6 +4095,10 @@ msgstr "不能包含\":,\""
msgid "Resource type"
msgstr "资源类型"
+#: notifications/apps.py:7
+msgid "App Notifications"
+msgstr "通知管理"
+
#: notifications/backends/__init__.py:13
msgid "Site message"
msgstr "站内信"
@@ -4151,8 +4207,8 @@ msgstr "文件密钥该字段是必填项。"
msgid "This file can not be delete"
msgstr "无法删除此文件"
-#: ops/apps.py:9 ops/notifications.py:18 rbac/tree.py:57
-msgid "App ops"
+#: ops/apps.py:9
+msgid "App Ops"
msgstr "作业中心"
#: ops/const.py:6
@@ -4191,7 +4247,7 @@ msgstr "VCS"
msgid "Adhoc"
msgstr "命令"
-#: ops/const.py:39 ops/models/job.py:146
+#: ops/const.py:39 ops/models/job.py:144
msgid "Playbook"
msgstr "Playbook"
@@ -4251,40 +4307,45 @@ msgstr "超时"
msgid "no valid program entry found."
msgstr "没有可用程序入口"
-#: ops/mixin.py:26 ops/mixin.py:90 settings/serializers/auth/ldap.py:73
-msgid "Cycle perform"
+#: ops/mixin.py:23 ops/mixin.py:102 settings/serializers/auth/ldap.py:66
+msgid "Periodic run"
msgstr "周期执行"
-#: ops/mixin.py:30 ops/mixin.py:88 ops/mixin.py:107
-#: settings/serializers/auth/ldap.py:70
-msgid "Regularly perform"
-msgstr "定期执行"
-
-#: ops/mixin.py:110
+#: ops/mixin.py:25 ops/mixin.py:88 ops/mixin.py:108
+#: settings/serializers/auth/ldap.py:73
msgid "Interval"
msgstr "间隔"
-#: ops/mixin.py:120
+#: ops/mixin.py:28 ops/mixin.py:86 ops/mixin.py:105
+#: settings/serializers/auth/ldap.py:70
+msgid "Crontab"
+msgstr "Crontab"
+
+#: ops/mixin.py:110
+msgid "Run period"
+msgstr "执行周期"
+
+#: ops/mixin.py:119
msgid "* Please enter a valid crontab expression"
msgstr "* 请输入有效的 crontab 表达式"
-#: ops/mixin.py:127
+#: ops/mixin.py:126
msgid "Range {} to {}"
msgstr "输入在 {} - {} 范围之间"
-#: ops/mixin.py:138
-msgid "Require periodic or regularly perform setting"
+#: ops/mixin.py:137
+msgid "Require interval or crontab setting"
msgstr "需要周期或定期设置"
#: ops/models/adhoc.py:21
msgid "Pattern"
msgstr "模式"
-#: ops/models/adhoc.py:23 ops/models/job.py:143
+#: ops/models/adhoc.py:23 ops/models/job.py:141
msgid "Module"
msgstr "模块"
-#: ops/models/adhoc.py:24 ops/models/celery.py:81 ops/models/job.py:141
+#: ops/models/adhoc.py:24 ops/models/celery.py:81 ops/models/job.py:139
#: terminal/models/component/task.py:14
msgid "Args"
msgstr "参数"
@@ -4303,12 +4364,12 @@ msgstr "最后执行"
msgid "Date last run"
msgstr "最后运行日期"
-#: ops/models/base.py:51 ops/models/job.py:234
-#: xpack/plugins/cloud/models.py:198
+#: ops/models/base.py:51 ops/models/job.py:232
+#: xpack/plugins/cloud/models.py:202
msgid "Result"
msgstr "结果"
-#: ops/models/base.py:52 ops/models/job.py:235
+#: ops/models/base.py:52 ops/models/job.py:233
msgid "Summary"
msgstr "汇总"
@@ -4329,7 +4390,7 @@ msgid "Kwargs"
msgstr "其它参数"
#: ops/models/celery.py:84 terminal/models/session/sharing.py:128
-#: tickets/const.py:25
+#: tickets/const.py:26
msgid "Finished"
msgstr "结束"
@@ -4341,43 +4402,43 @@ msgstr "发布日期"
msgid "Celery Task Execution"
msgstr "Celery 任务执行"
-#: ops/models/job.py:144
+#: ops/models/job.py:142
msgid "Chdir"
msgstr "运行目录"
-#: ops/models/job.py:145
+#: ops/models/job.py:143
msgid "Timeout (Seconds)"
msgstr "超时时间 (秒)"
-#: ops/models/job.py:150
+#: ops/models/job.py:148
msgid "Use Parameter Define"
msgstr "使用参数定义"
-#: ops/models/job.py:151
+#: ops/models/job.py:149
msgid "Parameters define"
msgstr "参数定义"
-#: ops/models/job.py:152
+#: ops/models/job.py:150
msgid "Runas"
msgstr "运行用户"
-#: ops/models/job.py:154
+#: ops/models/job.py:152
msgid "Runas policy"
msgstr "用户策略"
-#: ops/models/job.py:218
+#: ops/models/job.py:216 terminal/notifications.py:174
msgid "Job"
msgstr "作业"
-#: ops/models/job.py:241
+#: ops/models/job.py:239
msgid "Material"
msgstr "Material"
-#: ops/models/job.py:243
+#: ops/models/job.py:241
msgid "Material Type"
msgstr "Material 类型"
-#: ops/models/job.py:540
+#: ops/models/job.py:558
msgid "Job Execution"
msgstr "作业执行"
@@ -4417,19 +4478,31 @@ msgstr "内存使用率超过 {max_threshold}%: => {value}"
msgid "CPU load more than {max_threshold}: => {value}"
msgstr "CPU 使用率超过 {max_threshold}: => {value}"
+#: ops/serializers/celery.py:33
+msgid "Execution cycle"
+msgstr "周期执行"
+
+#: ops/serializers/celery.py:35
+msgid "Next execution time"
+msgstr "下次执行时间"
+
#: ops/serializers/job.py:15
-msgid "Run after save"
+msgid "Execute after saving"
msgstr "保存后执行"
-#: ops/serializers/job.py:69
+#: ops/serializers/job.py:52
+msgid "Average time cost"
+msgstr "平均耗时"
+
+#: ops/serializers/job.py:65
msgid "Job type"
msgstr "任务类型"
-#: ops/serializers/job.py:72 terminal/serializers/session.py:56
+#: ops/serializers/job.py:68 terminal/serializers/session.py:53
msgid "Is finished"
msgstr "是否完成"
-#: ops/serializers/job.py:73
+#: ops/serializers/job.py:69
#: settings/templates/ldap/_msg_import_ldap_user.html:7
msgid "Time cost"
msgstr "花费时间"
@@ -4520,8 +4593,8 @@ msgstr "LDAP 同步设置组织为当前组织,请切换其他组织后再进
msgid "The organization have resource ({}) cannot be deleted"
msgstr "组织存在资源 ({}) 不能被删除"
-#: orgs/apps.py:7 rbac/tree.py:128
-msgid "App organizations"
+#: orgs/apps.py:7
+msgid "App Organizations"
msgstr "组织管理"
#: orgs/mixins/models.py:57 orgs/mixins/serializers.py:25 orgs/models.py:91
@@ -4549,7 +4622,7 @@ msgstr "默认组织"
msgid "SYSTEM"
msgstr "系统组织"
-#: orgs/models.py:83 rbac/models/role.py:36 settings/models.py:183
+#: orgs/models.py:83 rbac/models/role.py:36 settings/models.py:185
#: terminal/models/applet/applet.py:41
msgid "Builtin"
msgstr "内置的"
@@ -4566,12 +4639,37 @@ msgstr "可以查看所有加入的组织"
msgid "Can not delete virtual org"
msgstr "无法删除虚拟组织"
+#: orgs/serializers.py:10 perms/serializers/permission.py:38
+#: rbac/serializers/role.py:27 users/serializers/group.py:54
+msgid "Users amount"
+msgstr "用户数量"
+
+#: orgs/serializers.py:11 perms/serializers/permission.py:39
+msgid "User groups amount"
+msgstr "用户组数量"
+
+#: orgs/serializers.py:14 perms/serializers/permission.py:41
+msgid "Nodes amount"
+msgstr "节点数量"
+
+#: orgs/serializers.py:15
+msgid "Domains amount"
+msgstr "网域数量"
+
+#: orgs/serializers.py:16
+msgid "Gateways amount"
+msgstr "网关数量"
+
+#: orgs/serializers.py:18
+msgid "Asset permissions amount"
+msgstr "资产授权数量"
+
#: orgs/tasks.py:9
msgid "Refresh organization cache"
msgstr "刷新组织缓存"
#: perms/apps.py:9
-msgid "App permissions"
+msgid "App Permissions"
msgstr "授权管理"
#: perms/const.py:12
@@ -4667,19 +4765,6 @@ msgstr "资产授权规则将要过期"
msgid "asset permissions of organization {}"
msgstr "组织 ({}) 的资产授权"
-#: perms/serializers/permission.py:186 rbac/serializers/role.py:27
-#: users/serializers/group.py:54 users/serializers/group.py:60
-msgid "Users amount"
-msgstr "用户数量"
-
-#: perms/serializers/permission.py:187
-msgid "User groups amount"
-msgstr "用户组数量"
-
-#: perms/serializers/permission.py:189
-msgid "Nodes amount"
-msgstr "节点数量"
-
#: perms/tasks.py:27
msgid "Check asset permission expired"
msgstr "校验资产授权规则已过期"
@@ -4717,7 +4802,7 @@ msgid "{} at least one system role"
msgstr "{} 至少有一个系统角色"
#: rbac/apps.py:7
-msgid "RBAC"
+msgid "App RBAC"
msgstr "RBAC"
#: rbac/builtin.py:115
@@ -4766,7 +4851,7 @@ msgstr "Web终端"
#: rbac/models/menu.py:19
msgid "Can view file manager"
-msgstr "文件管理"
+msgstr "可以查看文件管理"
#: rbac/models/menu.py:20
msgid "Can view System Tools"
@@ -4782,7 +4867,7 @@ msgid "Scope"
msgstr "范围"
#: rbac/models/role.py:46 rbac/models/rolebinding.py:52
-#: users/models/user.py:824
+#: users/models/user.py:870
msgid "Role"
msgstr "角色"
@@ -4845,7 +4930,7 @@ msgstr "工作台"
msgid "Audit view"
msgstr "审计台"
-#: rbac/tree.py:27 settings/models.py:159
+#: rbac/tree.py:27 settings/models.py:161
msgid "System setting"
msgstr "系统设置"
@@ -4873,28 +4958,36 @@ msgstr "资产改密"
msgid "Terminal setting"
msgstr "终端设置"
-#: rbac/tree.py:55
-msgid "Task Center"
+#: rbac/tree.py:55 settings/serializers/feature.py:126
+msgid "Job center"
msgstr "任务中心"
#: rbac/tree.py:56
msgid "My assets"
msgstr "我的资产"
+#: rbac/tree.py:57
+msgid "App ops"
+msgstr "作业中心"
+
#: rbac/tree.py:58 terminal/models/applet/applet.py:52
#: terminal/models/applet/applet.py:317 terminal/models/applet/host.py:30
#: terminal/serializers/applet.py:15
msgid "Applet"
msgstr "远程应用"
+#: rbac/tree.py:128
+msgid "App organizations"
+msgstr "组织管理"
+
#: rbac/tree.py:129
msgid "Ticket comment"
msgstr "工单评论"
#: rbac/tree.py:130 settings/serializers/feature.py:109
-#: tickets/models/ticket/general.py:305
+#: settings/serializers/feature.py:111 tickets/models/ticket/general.py:307
msgid "Ticket"
-msgstr "工单管理"
+msgstr "工单"
#: rbac/tree.py:131
msgid "Common setting"
@@ -4932,84 +5025,88 @@ msgid "test_phone is required"
msgstr "测试手机号 该字段是必填项。"
#: settings/apps.py:7
-msgid "Settings"
+msgid "App Settings"
msgstr "系统设置"
-#: settings/models.py:36 users/models/preference.py:14
+#: settings/models.py:37 users/models/preference.py:14
msgid "Encrypted"
msgstr "加密的"
-#: settings/models.py:161
+#: settings/models.py:163
msgid "Can change email setting"
msgstr "邮件设置"
-#: settings/models.py:162
+#: settings/models.py:164
msgid "Can change auth setting"
msgstr "认证设置"
-#: settings/models.py:163
+#: settings/models.py:165
msgid "Can change auth ops"
msgstr "任务中心设置"
-#: settings/models.py:164
+#: settings/models.py:166
msgid "Can change auth ticket"
msgstr "工单设置"
-#: settings/models.py:165
+#: settings/models.py:167
msgid "Can change virtual app setting"
msgstr "可以更改虚拟应用设置"
-#: settings/models.py:166
+#: settings/models.py:168
msgid "Can change auth announcement"
msgstr "公告设置"
-#: settings/models.py:167
+#: settings/models.py:169
msgid "Can change vault setting"
msgstr "可以更改 vault 设置"
-#: settings/models.py:168
+#: settings/models.py:170
msgid "Can change chat ai setting"
msgstr "可以修改聊天 AI 设置"
-#: settings/models.py:169
+#: settings/models.py:171
msgid "Can change system msg sub setting"
msgstr "消息订阅设置"
-#: settings/models.py:170
+#: settings/models.py:172
msgid "Can change sms setting"
msgstr "短信设置"
-#: settings/models.py:171
+#: settings/models.py:173
msgid "Can change security setting"
msgstr "安全设置"
-#: settings/models.py:172
+#: settings/models.py:174
msgid "Can change clean setting"
msgstr "定期清理"
-#: settings/models.py:173
+#: settings/models.py:175
msgid "Can change interface setting"
msgstr "界面设置"
-#: settings/models.py:174
+#: settings/models.py:176
msgid "Can change license setting"
msgstr "许可证设置"
-#: settings/models.py:175
+#: settings/models.py:177
msgid "Can change terminal setting"
msgstr "终端设置"
-#: settings/models.py:176
+#: settings/models.py:178
msgid "Can change other setting"
msgstr "其它设置"
-#: settings/models.py:186
+#: settings/models.py:188
msgid "Chat prompt"
msgstr "聊天提示"
#: settings/notifications.py:23
msgid "Notification of Synchronized LDAP User Task Results"
-msgstr "同步LDAP用户任务结果通知"
+msgstr "同步 LDAP 用户任务结果的通知"
+
+#: settings/serializers/auth/base.py:10
+msgid "Authentication"
+msgstr "认证"
#: settings/serializers/auth/base.py:12
msgid "LDAP Auth"
@@ -5063,28 +5160,25 @@ msgstr "SSO 令牌认证"
msgid "Passkey Auth"
msgstr "Passkey 认证"
-#: settings/serializers/auth/base.py:27
-msgid "Forgot password url"
+#: settings/serializers/auth/base.py:26
+msgid "Forgot Password URL"
msgstr "忘记密码 URL"
-#: settings/serializers/auth/base.py:30
-msgid "Enable login redirect msg"
+#: settings/serializers/auth/base.py:29
+msgid "Login redirection prompt"
msgstr "启用登录跳转提示"
-#: settings/serializers/auth/cas.py:10
+#: settings/serializers/auth/cas.py:10 settings/serializers/auth/cas.py:12
msgid "CAS"
msgstr "CAS"
-#: settings/serializers/auth/cas.py:12
-msgid "Enable CAS Auth"
-msgstr "启用 CAS 认证"
-
-#: settings/serializers/auth/cas.py:13 settings/serializers/auth/oidc.py:54
-msgid "Server url"
-msgstr "服务端地址"
+#: settings/serializers/auth/cas.py:13 settings/serializers/auth/ldap.py:42
+#: settings/serializers/auth/oidc.py:54
+msgid "Server"
+msgstr "LDAP 地址"
#: settings/serializers/auth/cas.py:16
-msgid "Proxy server url"
+msgid "Proxy Server"
msgstr "回调地址"
#: settings/serializers/auth/cas.py:18 settings/serializers/auth/oauth2.py:54
@@ -5100,34 +5194,32 @@ msgstr "用户名属性"
msgid "Enable attributes map"
msgstr "启用属性映射"
-#: settings/serializers/auth/cas.py:28 settings/serializers/auth/saml2.py:32
-msgid "Rename attr"
+#: settings/serializers/auth/cas.py:28 settings/serializers/auth/ldap.py:58
+#: settings/serializers/auth/oauth2.py:56 settings/serializers/auth/oidc.py:37
+#: settings/serializers/auth/saml2.py:32
+msgid "User attribute"
msgstr "映射属性"
-#: settings/serializers/auth/cas.py:29
-msgid "Create user if not"
+#: settings/serializers/auth/cas.py:30
+msgid "Create user"
msgstr "创建用户(如果不存在)"
+#: settings/serializers/auth/cas.py:31
+msgid "Automatically create a new user if not found."
+msgstr ""
+
#: settings/serializers/auth/dingtalk.py:15
-msgid "Enable DingTalk Auth"
+msgid "Dingtalk"
msgstr "启用钉钉认证"
-#: settings/serializers/auth/feishu.py:12
-msgid "Enable FeiShu Auth"
+#: settings/serializers/auth/feishu.py:16
+msgid "Lark"
msgstr "启用飞书认证"
-#: settings/serializers/auth/lark.py:12
-msgid "Enable Lark Auth"
-msgstr "启用 Lark 认证"
-
-#: settings/serializers/auth/ldap.py:39
+#: settings/serializers/auth/ldap.py:39 settings/serializers/auth/ldap.py:84
msgid "LDAP"
msgstr "LDAP"
-#: settings/serializers/auth/ldap.py:42
-msgid "LDAP server"
-msgstr "LDAP 地址"
-
#: settings/serializers/auth/ldap.py:43
msgid "eg: ldap://localhost:389"
msgstr "如: ldap://localhost:389"
@@ -5153,11 +5245,6 @@ msgstr "用户过滤器"
msgid "Choice may be (cn|uid|sAMAccountName)=%(user)s)"
msgstr "可能的选项是(cn或uid或sAMAccountName=%(user)s)"
-#: settings/serializers/auth/ldap.py:58 settings/serializers/auth/oauth2.py:56
-#: settings/serializers/auth/oidc.py:37
-msgid "User attr map"
-msgstr "用户属性映射"
-
#: settings/serializers/auth/ldap.py:59
msgid ""
"User attr map present how to map LDAP user attr to jumpserver, username,name,"
@@ -5184,18 +5271,11 @@ msgstr "对用户登录认证时查询出的 User DN 进行缓存,可以有效
msgid "Search paged size (piece)"
msgstr "搜索分页数量 (条)"
-#: settings/serializers/auth/ldap.py:93
-msgid "Enable LDAP auth"
-msgstr "启用 LDAP 认证"
-
#: settings/serializers/auth/oauth2.py:18
+#: settings/serializers/auth/oauth2.py:21
msgid "OAuth2"
msgstr "OAuth2"
-#: settings/serializers/auth/oauth2.py:21
-msgid "Enable OAuth2 Auth"
-msgstr "启用 OAuth2 认证"
-
#: settings/serializers/auth/oauth2.py:24
msgid "Logo"
msgstr "图标"
@@ -5214,23 +5294,24 @@ msgid "Client Secret"
msgstr "客户端密钥"
#: settings/serializers/auth/oauth2.py:39 settings/serializers/auth/oidc.py:68
-msgid "Provider auth endpoint"
+msgid "Authorization endpoint"
msgstr "授权端点地址"
#: settings/serializers/auth/oauth2.py:42 settings/serializers/auth/oidc.py:71
-msgid "Provider token endpoint"
+msgid "Token endpoint"
msgstr "token 端点地址"
#: settings/serializers/auth/oauth2.py:45 settings/serializers/auth/oidc.py:30
-msgid "Client authentication method"
+#: settings/serializers/auth/sms.py:106
+msgid "Request method"
msgstr "客户端认证方式"
#: settings/serializers/auth/oauth2.py:49 settings/serializers/auth/oidc.py:77
-msgid "Provider userinfo endpoint"
+msgid "Userinfo endpoint"
msgstr "用户信息端点地址"
#: settings/serializers/auth/oauth2.py:52 settings/serializers/auth/oidc.py:80
-msgid "Provider end session endpoint"
+msgid "End session endpoint"
msgstr "注销会话端点地址"
#: settings/serializers/auth/oauth2.py:59 settings/serializers/auth/oidc.py:98
@@ -5238,12 +5319,12 @@ msgstr "注销会话端点地址"
msgid "Always update user"
msgstr "总是更新用户信息"
-#: settings/serializers/auth/oidc.py:12
+#: settings/serializers/auth/oidc.py:12 settings/serializers/auth/oidc.py:63
msgid "OIDC"
-msgstr "OIDC"
+msgstr "启用 OIDC 认证"
#: settings/serializers/auth/oidc.py:16
-msgid "Base site url"
+msgid "Base site URL"
msgstr "JumpServer 地址"
#: settings/serializers/auth/oidc.py:32
@@ -5251,7 +5332,7 @@ msgid "Share session"
msgstr "共享会话"
#: settings/serializers/auth/oidc.py:34
-msgid "Ignore ssl verification"
+msgid "Ignore SSL verification"
msgstr "忽略 SSL 证书验证"
#: settings/serializers/auth/oidc.py:38
@@ -5278,24 +5359,20 @@ msgstr "使用 Keycloak"
msgid "Realm name"
msgstr "域"
-#: settings/serializers/auth/oidc.py:63
-msgid "Enable OPENID Auth"
-msgstr "启用 OIDC 认证"
-
#: settings/serializers/auth/oidc.py:65
msgid "Provider endpoint"
msgstr "端点地址"
#: settings/serializers/auth/oidc.py:74
-msgid "Provider jwks endpoint"
+msgid "JWKS endpoint"
msgstr "jwks 端点地址"
#: settings/serializers/auth/oidc.py:83
-msgid "Provider sign alg"
+msgid "Signature algorithm"
msgstr "签名算法"
#: settings/serializers/auth/oidc.py:86
-msgid "Provider sign key"
+msgid "Signing key"
msgstr "签名 Key"
#: settings/serializers/auth/oidc.py:88
@@ -5303,11 +5380,11 @@ msgid "Scopes"
msgstr "连接范围"
#: settings/serializers/auth/oidc.py:90
-msgid "Id token max age (s)"
+msgid "ID Token max age (s)"
msgstr "令牌有效时间 (秒)"
#: settings/serializers/auth/oidc.py:93
-msgid "Id token include claims"
+msgid "ID Token include claims"
msgstr "声明"
#: settings/serializers/auth/oidc.py:95
@@ -5318,16 +5395,12 @@ msgstr "使用状态"
msgid "Use nonce"
msgstr "临时使用"
-#: settings/serializers/auth/passkey.py:11
-msgid "Enable passkey Auth"
-msgstr "启用 Passkey 认证"
-
#: settings/serializers/auth/passkey.py:12
msgid "Only SSL domain can use passkey auth"
msgstr "只有 SSL 域名可以使用 Passkey(通行密钥)认证"
#: settings/serializers/auth/passkey.py:15
-msgid "FIDO server ID"
+msgid "FIDO Server ID"
msgstr "Passkey 服务域名"
#: settings/serializers/auth/passkey.py:17
@@ -5339,36 +5412,29 @@ msgstr ""
"DOMAINS中), 如果有多个域名,使用逗号分隔, 不需要端口号"
#: settings/serializers/auth/passkey.py:22
-msgid "FIDO server name"
+msgid "FIDO Server name"
msgstr "Passkey 服务名称"
#: settings/serializers/auth/radius.py:13
+#: settings/serializers/auth/radius.py:15
msgid "Radius"
msgstr "Radius"
-#: settings/serializers/auth/radius.py:15
-msgid "Enable Radius Auth"
-msgstr "启用 Radius 认证"
-
#: settings/serializers/auth/radius.py:21
msgid "OTP in Radius"
msgstr "使用 Radius OTP"
-#: settings/serializers/auth/saml2.py:10
+#: settings/serializers/auth/saml2.py:10 settings/serializers/auth/saml2.py:13
msgid "SAML2"
msgstr "SAML2"
-#: settings/serializers/auth/saml2.py:13
-msgid "Enable SAML2 Auth"
-msgstr "启用 SAML2 认证"
-
#: settings/serializers/auth/saml2.py:16
-msgid "IDP metadata URL"
-msgstr "IDP metadata 地址"
+msgid "IDP Metadata URL"
+msgstr "IDP Metadata 地址"
#: settings/serializers/auth/saml2.py:19
-msgid "IDP metadata XML"
-msgstr "IDP metadata XML"
+msgid "IDP Metadata XML"
+msgstr "IDP Metadata XML"
#: settings/serializers/auth/saml2.py:22
msgid "SP advanced settings"
@@ -5382,14 +5448,6 @@ msgstr "SP 密钥"
msgid "SP cert"
msgstr "SP 证书"
-#: settings/serializers/auth/slack.py:12
-msgid "Enable Slack Auth"
-msgstr "启用 Slack 认证"
-
-#: settings/serializers/auth/sms.py:17
-msgid "Enable SMS"
-msgstr "启用 SMS"
-
#: settings/serializers/auth/sms.py:19
msgid "SMS provider / Protocol"
msgstr "短信服务商 / 协议"
@@ -5422,19 +5480,19 @@ msgid "Signature channel number"
msgstr "签名通道号"
#: settings/serializers/auth/sms.py:73
-msgid "Enterprise code(SP id)"
+msgid "Enterprise code"
msgstr "企业代码(SP id)"
#: settings/serializers/auth/sms.py:74
-msgid "Shared secret(Shared secret)"
+msgid "Shared secret"
msgstr "共享密码(Shared secret)"
#: settings/serializers/auth/sms.py:75
-msgid "Original number(Src id)"
+msgid "Original number"
msgstr "原始号码(Src id)"
#: settings/serializers/auth/sms.py:76
-msgid "Business type(Service id)"
+msgid "Business type"
msgstr "业务类型(Service id)"
#: settings/serializers/auth/sms.py:80
@@ -5460,10 +5518,6 @@ msgstr "模板+签名不能超过65个字"
msgid "URL"
msgstr "URL"
-#: settings/serializers/auth/sms.py:106
-msgid "Request method"
-msgstr "请求方式"
-
#: settings/serializers/auth/sso.py:16
msgid "Enable SSO auth"
msgstr "启用 SSO 令牌认证"
@@ -5481,12 +5535,8 @@ msgstr "令牌有效期"
msgid "Unit: second"
msgstr "单位: 秒"
-#: settings/serializers/auth/wecom.py:15
-msgid "Enable WeCom Auth"
-msgstr "启用企业微信认证"
-
#: settings/serializers/basic.py:11
-msgid "Site url"
+msgid "Site URL"
msgstr "当前站点 URL"
#: settings/serializers/basic.py:13
@@ -5506,7 +5556,7 @@ msgid "User first login update profile done redirect to it"
msgstr "用户第一次登录,修改profile后重定向到地址, 可以是 wiki 或 其他说明文档"
#: settings/serializers/basic.py:22
-msgid "Global organization name"
+msgid "Global organization"
msgstr "全局组织名"
#: settings/serializers/basic.py:23
@@ -5538,39 +5588,35 @@ msgid "Period clean"
msgstr "定時清掃"
#: settings/serializers/cleaning.py:15
-msgid "Login log keep days (day)"
+msgid "Login log retention days (day)"
msgstr "登录日志 (天)"
#: settings/serializers/cleaning.py:19
-msgid "Task log keep days (day)"
+msgid "Task log retention days (day)"
msgstr "任务日志 (天)"
#: settings/serializers/cleaning.py:23
-msgid "Operate log keep days (day)"
+msgid "Operate log retention days (day)"
msgstr "操作日志 (天)"
#: settings/serializers/cleaning.py:27
-msgid "password change log keep days (day)"
-msgstr "改密日志 (天)"
-
-#: settings/serializers/cleaning.py:31
-msgid "FTP log keep days (day)"
+msgid "FTP log retention days (day)"
msgstr "上传下载 (天)"
-#: settings/serializers/cleaning.py:35
-msgid "Cloud sync record keep days (day)"
+#: settings/serializers/cleaning.py:31
+msgid "Cloud sync task history retention days (day)"
msgstr "云同步记录 (天)"
-#: settings/serializers/cleaning.py:39
-msgid "job execution keep days (day)"
+#: settings/serializers/cleaning.py:35
+msgid "job execution retention days (day)"
msgstr "作业中心执行历史 (天)"
-#: settings/serializers/cleaning.py:43
-msgid "Activity log keep days (day)"
+#: settings/serializers/cleaning.py:39
+msgid "Activity log retention days (day)"
msgstr "活动记录 (天)"
-#: settings/serializers/cleaning.py:46
-msgid "Session keep duration (day)"
+#: settings/serializers/cleaning.py:42
+msgid "Session log retention days (day)"
msgstr "会话日志 (天)"
#: settings/serializers/cleaning.py:48
@@ -5580,24 +5626,21 @@ msgid ""
msgstr ""
"会话、录像,命令记录超过该时长将会被清除 (影响数据库存储,OSS 等不受影响)"
-#: settings/serializers/feature.py:18
+#: settings/serializers/feature.py:18 settings/serializers/msg.py:68
msgid "Subject"
msgstr "主题"
#: settings/serializers/feature.py:22
-msgid "More url"
+msgid "More URL"
msgstr "更多信息 URL"
-#: settings/serializers/feature.py:36 settings/serializers/feature.py:39
+#: settings/serializers/feature.py:36 settings/serializers/feature.py:38
+#: settings/serializers/feature.py:39
msgid "Announcement"
msgstr "公告"
-#: settings/serializers/feature.py:38
-msgid "Enable announcement"
-msgstr "启用公告"
-
#: settings/serializers/feature.py:46
-msgid "Enable Vault"
+msgid "Vault"
msgstr "启用 Vault"
#: settings/serializers/feature.py:55
@@ -5618,16 +5661,12 @@ msgstr ""
"若特定数值小于999,系统将在每日晚间自动执行任务:检查并删除超出预定数量的历史"
"账号。如果该数值达到或超过999,则不进行任何历史账号的删除操作。"
-#: settings/serializers/feature.py:71
+#: settings/serializers/feature.py:71 settings/serializers/feature.py:75
msgid "Chat AI"
msgstr "聊天 AI"
-#: settings/serializers/feature.py:75
-msgid "Enable Chat AI"
-msgstr "启动聊天 AI"
-
#: settings/serializers/feature.py:78
-msgid "Base Url"
+msgid "Base URL"
msgstr "基本地址"
#: settings/serializers/feature.py:81 templates/_header_bar.html:96
@@ -5638,24 +5677,16 @@ msgstr "API Key"
msgid "GPT Model"
msgstr "GPT 模型"
-#: settings/serializers/feature.py:111
-msgid "Enable tickets"
-msgstr "启用工单"
-
-#: settings/serializers/feature.py:112
-msgid "No login approval"
-msgstr "免登录审批"
-
-#: settings/serializers/feature.py:115
-msgid "Ticket authorize default time"
+#: settings/serializers/feature.py:114
+msgid "Default period"
msgstr "默认工单授权时间"
#: settings/serializers/feature.py:118
msgid "hour"
msgstr "时"
-#: settings/serializers/feature.py:119
-msgid "Ticket authorize default time unit"
+#: settings/serializers/feature.py:118
+msgid "Default unit"
msgstr "默认工单授权时间单位"
#: settings/serializers/feature.py:124
@@ -5663,22 +5694,18 @@ msgid "Feature"
msgstr "功能"
#: settings/serializers/feature.py:127
-msgid "Operation center"
-msgstr "作业中心"
-
-#: settings/serializers/feature.py:128
msgid "Allow user run batch command or not using ansible"
msgstr "是否允许用户使用 ansible 执行批量命令"
-#: settings/serializers/feature.py:132
-msgid "Operation center command blacklist"
+#: settings/serializers/feature.py:131
+msgid "Command blacklist"
msgstr "作业中心命令黑名单"
#: settings/serializers/feature.py:133
msgid "Commands that are not allowed execute."
msgstr "不允许执行的命令"
-#: settings/serializers/feature.py:138
+#: settings/serializers/feature.py:137 settings/serializers/feature.py:140
#: terminal/models/virtualapp/provider.py:17
#: terminal/models/virtualapp/virtualapp.py:36
#: terminal/models/virtualapp/virtualapp.py:97
@@ -5686,10 +5713,6 @@ msgstr "不允许执行的命令"
msgid "Virtual app"
msgstr "虚拟应用"
-#: settings/serializers/feature.py:141
-msgid "Enable virtual app"
-msgstr "启用虚拟应用"
-
#: settings/serializers/msg.py:25
msgid "SMTP"
msgstr "SMTP"
@@ -5703,7 +5726,7 @@ msgid "Tips: Some provider use token except password"
msgstr "提示:一些邮件提供商需要输入的是授权码"
#: settings/serializers/msg.py:39
-msgid "Send user"
+msgid "Sender"
msgstr "发件人"
#: settings/serializers/msg.py:40
@@ -5743,10 +5766,6 @@ msgid ""
"This is used by default if no email is returned during SSO authentication"
msgstr "SSO认证时,如果没有返回邮件地址,将使用该后缀"
-#: settings/serializers/msg.py:68
-msgid "Create user email subject"
-msgstr "邮件主题"
-
#: settings/serializers/msg.py:69
msgid ""
"Tips: When creating a user, send the subject of the email (eg:Create account "
@@ -5754,17 +5773,13 @@ msgid ""
msgstr "提示: 创建用户时,发送设置密码邮件的主题 (例如: 创建用户成功)"
#: settings/serializers/msg.py:73
-msgid "Create user honorific"
+msgid "Honorific"
msgstr "邮件问候语"
#: settings/serializers/msg.py:74
msgid "Tips: When creating a user, send the honorific of the email (eg:Hello)"
msgstr "提示: 创建用户时,发送设置密码邮件的敬语 (例如: 你好)"
-#: settings/serializers/msg.py:78
-msgid "Create user email content"
-msgstr "邮件的内容"
-
#: settings/serializers/msg.py:80
#, python-brace-format
msgid ""
@@ -5805,7 +5820,7 @@ msgstr ""
"期前5天内由系统 (每天)自动发送给用户"
#: settings/serializers/security.py:26
-msgid "Number of repeated historical passwords"
+msgid "Recent password count"
msgstr "不能设置近几次密码"
#: settings/serializers/security.py:28
@@ -5815,27 +5830,19 @@ msgid ""
msgstr "提示:用户重置密码时,不能为该用户前几次使用过的密码"
#: settings/serializers/security.py:34
-msgid "Password minimum length"
+msgid "Minimum length (User)"
msgstr "密码最小长度"
#: settings/serializers/security.py:38
-msgid "Admin user password minimum length"
+msgid "Minimum length (Admin)"
msgstr "管理员密码最小长度"
-#: settings/serializers/security.py:41
-msgid "Must contain capital"
-msgstr "必须包含大写字符"
-
-#: settings/serializers/security.py:44
-msgid "Must contain lowercase"
-msgstr "必须包含小写字符"
-
#: settings/serializers/security.py:47
-msgid "Must contain numeric"
+msgid "Digits"
msgstr "必须包含数字"
#: settings/serializers/security.py:50
-msgid "Must contain special"
+msgid "Special characters"
msgstr "必须包含特殊字符"
#: settings/serializers/security.py:55
@@ -5844,28 +5851,20 @@ msgid ""
"allowed during this time interval."
msgstr "当用户登录失败次数达到限制后,那么在此间隔内禁止登录"
-#: settings/serializers/security.py:63
-msgid "Limit the number of user login failures"
+#: settings/serializers/security.py:63 settings/serializers/security.py:73
+msgid "Login failures count"
msgstr "限制用户登录失败次数"
-#: settings/serializers/security.py:67
-msgid "Block user login interval (minute)"
+#: settings/serializers/security.py:67 settings/serializers/security.py:77
+msgid "Login failure period (minute)"
msgstr "禁止用户登录间隔 (分)"
-#: settings/serializers/security.py:73
-msgid "Limit the number of IP login failures"
-msgstr "限制 IP 登录失败次数"
-
-#: settings/serializers/security.py:77
-msgid "Block IP login interval (minute)"
-msgstr "禁止 IP 登录间隔 (分)"
-
#: settings/serializers/security.py:81
-msgid "Login IP White List"
+msgid "Login IP whitelist"
msgstr "IP 登录白名单"
#: settings/serializers/security.py:86
-msgid "Login IP Black List"
+msgid "Login IP blacklist"
msgstr "IP 登录黑名单"
#: settings/serializers/security.py:91
@@ -5923,7 +5922,7 @@ msgid "Global MFA auth"
msgstr "全局启用 MFA 认证"
#: settings/serializers/security.py:124
-msgid "Third-party login users perform MFA authentication"
+msgid "Third-party login MFA"
msgstr "第三方认证开启 MFA"
#: settings/serializers/security.py:125
@@ -5965,7 +5964,7 @@ msgid "Reset password and send SMS code expiration time"
msgstr "重置密码的验证码及发送短信的验证码过期时间"
#: settings/serializers/security.py:153
-msgid "Enable Login dynamic code"
+msgid "Login dynamic code"
msgstr "启用登录附加码"
#: settings/serializers/security.py:154
@@ -5977,7 +5976,7 @@ msgstr ""
"码+6位数字 完成认证"
#: settings/serializers/security.py:158
-msgid "Enable Login captcha"
+msgid "Login captcha"
msgstr "启用登录验证码"
#: settings/serializers/security.py:159
@@ -5985,7 +5984,7 @@ msgid "Enable captcha to prevent robot authentication"
msgstr "开启验证码,防止机器人登录"
#: settings/serializers/security.py:162
-msgid "Remote Login Protection"
+msgid "Suspicious Login Verification"
msgstr "异地登录通知"
#: settings/serializers/security.py:164
@@ -5998,7 +5997,7 @@ msgstr ""
"登录提醒"
#: settings/serializers/security.py:170
-msgid "Unused user timeout (day)"
+msgid "Auto Disable Threshold (day)"
msgstr "不活跃用户自动禁用 (天)"
#: settings/serializers/security.py:171
@@ -6008,7 +6007,7 @@ msgid ""
msgstr "每天检测一次,超过预设时间的用户自动禁用"
#: settings/serializers/security.py:191
-msgid "Enable watermark"
+msgid "Watermark"
msgstr "开启水印"
#: settings/serializers/security.py:192
@@ -6016,7 +6015,7 @@ msgid "Enabled, the web session and replay contains watermark information"
msgstr "启用后,Web 会话和录像将包含水印信息"
#: settings/serializers/security.py:196
-msgid "Connection max idle time (minute)"
+msgid "Max idle time (minute)"
msgstr "连接最大空闲时间 (分)"
#: settings/serializers/security.py:197
@@ -6028,11 +6027,7 @@ msgid "Session expire at browser closed"
msgstr "会话在浏览器关闭时过期"
#: settings/serializers/security.py:201
-msgid "Whether to expire the session when the user closes their browser."
-msgstr "当用户关闭浏览器时是否使会话过期。"
-
-#: settings/serializers/security.py:205
-msgid "Session max connection time (hour)"
+msgid "Max online time (hour)"
msgstr "会话连接最大时间 (时)"
#: settings/serializers/security.py:206
@@ -6069,16 +6064,12 @@ msgstr "多个用户,使用 , 分割"
msgid "[%s] %s"
msgstr "[%s] %s"
-#: settings/serializers/terminal.py:9 terminal/models/virtualapp/provider.py:11
-msgid "Hostname"
-msgstr "主机名"
-
#: settings/serializers/terminal.py:15
msgid "Auto"
msgstr "自动"
#: settings/serializers/terminal.py:22
-msgid "Enable terminal register"
+msgid "Terminal registration"
msgstr "组件注册"
#: settings/serializers/terminal.py:24
@@ -6093,36 +6084,24 @@ msgstr "密码认证"
#: settings/serializers/terminal.py:29
msgid "Public key auth"
-msgstr "密钥认证"
+msgstr "公钥授权"
#: settings/serializers/terminal.py:30
msgid ""
-"Tips: If use other auth method, like AD/LDAP, you should disable this to "
-"avoid being able to log in after deleting"
+"Information: If use other auth method, like AD/LDAP, you should disable this "
+"to avoid being able to log in after deleting"
msgstr ""
"提示:如果你使用其它认证方式,如 AD/LDAP,你应该禁用此项,以避免第三方系统删"
"除后,还可以登录"
#: settings/serializers/terminal.py:34
-msgid "List sort by"
+msgid "Asset list sorting"
msgstr "资产列表排序"
#: settings/serializers/terminal.py:37
-msgid "List page size"
+msgid "Asset list page size"
msgstr "资产列表每页数量"
-#: settings/serializers/terminal.py:39
-msgid "Enable database proxy"
-msgstr "启用数据库组件"
-
-#: settings/serializers/terminal.py:40
-msgid "Enable Razor"
-msgstr "启用 Razor 服务"
-
-#: settings/serializers/terminal.py:41
-msgid "Enable SSH Client"
-msgstr "启用 SSH Client"
-
#: settings/tasks/ldap.py:28
msgid "Periodic import ldap user"
msgstr "周期导入 LDAP 用户"
@@ -6394,13 +6373,13 @@ msgstr ""
msgid "Send verification code"
msgstr "发送验证码"
-#: templates/_mfa_login_field.html:107
-#: users/templates/users/forgot_password.html:176
+#: templates/_mfa_login_field.html:106
+#: users/templates/users/forgot_password.html:174
msgid "Wait: "
msgstr "等待:"
-#: templates/_mfa_login_field.html:117
-#: users/templates/users/forgot_password.html:192
+#: templates/_mfa_login_field.html:116
+#: users/templates/users/forgot_password.html:190
msgid "The verification code has been sent"
msgstr "验证码已发送"
@@ -6517,7 +6496,7 @@ msgid "Secure session sharing settings is disabled"
msgstr "未开启会话共享"
#: terminal/apps.py:9
-msgid "Terminals"
+msgid "App Terminals"
msgstr "终端管理"
#: terminal/backends/command/models.py:19
@@ -6535,7 +6514,7 @@ msgstr "风险等级"
#: terminal/connect_methods.py:29
msgid "SSH Client"
-msgstr "SSH 客户端"
+msgstr "启用 SSH Client"
#: terminal/connect_methods.py:30
msgid "SSH Guide"
@@ -6947,6 +6926,10 @@ msgstr "验证码不正确"
msgid "You have already joined this session"
msgstr "您已经加入过此会话"
+#: terminal/models/virtualapp/provider.py:11
+msgid "Hostname"
+msgstr "主机名"
+
#: terminal/models/virtualapp/virtualapp.py:32
msgid "Providers"
msgstr "提供商"
@@ -6962,13 +6945,13 @@ msgstr "虚拟应用发布"
#: terminal/notifications.py:25
msgid "Sessions"
-msgstr "会话管理"
+msgstr "会话"
#: terminal/notifications.py:72
msgid "Command warning"
msgstr "命令告警"
-#: terminal/notifications.py:130
+#: terminal/notifications.py:130 terminal/notifications.py:175
msgid "Command reject"
msgstr "命令拒绝"
@@ -6976,19 +6959,11 @@ msgstr "命令拒绝"
msgid "Level"
msgstr "级别"
-#: terminal/notifications.py:175
-msgid "Batch danger command alert"
-msgstr "批量危险命令告警"
-
#: terminal/notifications.py:224
msgid "Command and replay storage"
msgstr "命令及录像存储"
-#: terminal/notifications.py:225
-msgid "Connectivity alarm"
-msgstr "可连接性告警"
-
-#: terminal/notifications.py:240 terminal/tasks.py:153
+#: terminal/notifications.py:240 terminal/tasks.py:146
msgid "Test failure: Account invalid"
msgstr "测试失败: 账号无效"
@@ -7141,10 +7116,6 @@ msgstr "无效的 命令组 ID"
msgid "Invalid session id"
msgstr "无效的 Session ID"
-#: terminal/serializers/command.py:72
-msgid "Account "
-msgstr "账号"
-
#: terminal/serializers/command.py:74
msgid "Timestamp"
msgstr "时间戳"
@@ -7230,8 +7201,7 @@ msgid "Bucket"
msgstr "桶名称"
#: terminal/serializers/storage.py:33
-#: xpack/plugins/cloud/serializers/account_attrs.py:17
-msgid "Access key id"
+msgid "Access key ID"
msgstr "Access key ID(AK)"
#: terminal/serializers/storage.py:37
@@ -7259,7 +7229,7 @@ msgstr "端点后缀"
msgid "HOST"
msgstr "主机"
-#: terminal/serializers/storage.py:146 users/models/user.py:844
+#: terminal/serializers/storage.py:146 users/models/user.py:890
#: xpack/plugins/cloud/serializers/account_attrs.py:213
msgid "Private key"
msgstr "ssh私钥"
@@ -7300,6 +7270,18 @@ msgstr "文档类型"
msgid "Session id"
msgstr "会话 ID"
+#: terminal/serializers/terminal.py:42
+msgid "Online sessions"
+msgstr "在线会话"
+
+#: terminal/serializers/terminal.py:43
+msgid "Is alive"
+msgstr "在线"
+
+#: terminal/serializers/terminal.py:49
+msgid "Stat"
+msgstr "状态"
+
#: terminal/serializers/terminal.py:83 terminal/serializers/terminal.py:91
msgid "Not found"
msgstr "没有发现"
@@ -7473,62 +7455,66 @@ msgid "Applicant"
msgstr "申请人"
#: tickets/apps.py:7
-msgid "Tickets"
+msgid "App Tickets"
msgstr "工单管理"
#: tickets/const.py:10
msgid "Apply for asset"
msgstr "申请资产"
-#: tickets/const.py:17 tickets/const.py:24 tickets/const.py:42
+#: tickets/const.py:17 tickets/const.py:25 tickets/const.py:44
msgid "Open"
msgstr "打开"
-#: tickets/const.py:19 tickets/const.py:31
+#: tickets/const.py:19 tickets/const.py:32
+msgid "Reopen"
+msgstr "重新打开"
+
+#: tickets/const.py:20 tickets/const.py:33
msgid "Approved"
msgstr "已同意"
-#: tickets/const.py:20 tickets/const.py:32
+#: tickets/const.py:21 tickets/const.py:34
msgid "Rejected"
msgstr "已拒绝"
-#: tickets/const.py:30 tickets/const.py:37
+#: tickets/const.py:31 tickets/const.py:39
msgid "Closed"
msgstr "关闭的"
-#: tickets/const.py:49
+#: tickets/const.py:51
msgid "One level"
msgstr "1 级"
-#: tickets/const.py:50
+#: tickets/const.py:52
msgid "Two level"
msgstr "2 级"
-#: tickets/const.py:54
+#: tickets/const.py:56
msgid "Org admin"
msgstr "组织管理员"
-#: tickets/const.py:55
+#: tickets/const.py:57
msgid "Custom user"
msgstr "自定义用户"
-#: tickets/const.py:56
+#: tickets/const.py:58
msgid "Super admin"
msgstr "超级管理员"
-#: tickets/const.py:57
+#: tickets/const.py:59
msgid "Super admin and org admin"
msgstr "组织管理员或超级管理员"
-#: tickets/const.py:61
+#: tickets/const.py:63
msgid "All assets"
msgstr "所有资产"
-#: tickets/const.py:62
+#: tickets/const.py:64
msgid "Permed assets"
msgstr "授权的资产"
-#: tickets/const.py:63
+#: tickets/const.py:65
msgid "Permed valid assets"
msgstr "有效授权的资产"
@@ -7690,10 +7676,6 @@ msgstr "登录账号"
msgid "Apply Login Asset Ticket"
msgstr "资产登录复核工单"
-#: tickets/models/ticket/login_confirm.py:12
-msgid "Login datetime"
-msgstr "登录日期"
-
#: tickets/models/ticket/login_confirm.py:15
msgid "Apply Login Ticket"
msgstr "用户登录复核工单"
@@ -7821,6 +7803,10 @@ msgstr "不能邀请自己"
msgid "Could not reset self otp, use profile reset instead"
msgstr "不能在该页面重置 MFA 多因子认证, 请去个人信息页面重置"
+#: users/apps.py:9
+msgid "App Users"
+msgstr "用户管理"
+
#: users/const.py:10
msgid "System administrator"
msgstr "系统管理员"
@@ -7963,12 +7949,12 @@ msgstr "复制你的公钥到这里"
msgid "Public key should not be the same as your old one."
msgstr "不能和原来的密钥相同"
-#: users/forms/profile.py:161 users/serializers/profile.py:76
-#: users/serializers/profile.py:164 users/serializers/profile.py:191
+#: users/forms/profile.py:162 users/serializers/profile.py:76
+#: users/serializers/profile.py:165 users/serializers/profile.py:192
msgid "Not a valid ssh public key"
msgstr "SSH密钥不合法"
-#: users/forms/profile.py:172 users/models/user.py:847
+#: users/forms/profile.py:173 users/models/user.py:893
#: xpack/plugins/cloud/serializers/account_attrs.py:210
msgid "Public key"
msgstr "SSH公钥"
@@ -7981,74 +7967,70 @@ msgstr "用户设置"
msgid "Force enable"
msgstr "强制启用"
-#: users/models/user.py:762
-msgid "Lark"
-msgstr ""
-
-#: users/models/user.py:826 users/serializers/user.py:175
+#: users/models/user.py:872 users/serializers/user.py:174
msgid "Is service account"
msgstr "服务账号"
-#: users/models/user.py:828
+#: users/models/user.py:874
msgid "Avatar"
msgstr "头像"
-#: users/models/user.py:831
+#: users/models/user.py:877
msgid "Wechat"
msgstr "微信"
-#: users/models/user.py:834 users/serializers/user.py:111
+#: users/models/user.py:880 users/serializers/user.py:106
msgid "Phone"
msgstr "手机"
-#: users/models/user.py:840
+#: users/models/user.py:886
msgid "OTP secret key"
msgstr "OTP 密钥"
# msgid "Private key"
# msgstr "ssh私钥"
-#: users/models/user.py:852 users/serializers/profile.py:128
-#: users/serializers/user.py:172
+#: users/models/user.py:898 users/serializers/profile.py:129
+#: users/serializers/user.py:171
msgid "Is first login"
msgstr "首次登录"
-#: users/models/user.py:862
+#: users/models/user.py:907
msgid "Date password last updated"
msgstr "最后更新密码日期"
-#: users/models/user.py:865
+#: users/models/user.py:910
msgid "Need update password"
msgstr "需要更新密码"
-#: users/models/user.py:867
+#: users/models/user.py:920
msgid "Date api key used"
msgstr "Api key 最后使用日期"
-#: users/models/user.py:1000
+#: users/models/user.py:1039
msgid "Can not delete admin user"
msgstr "无法删除管理员用户"
-#: users/models/user.py:1028
+#: users/models/user.py:1052
msgid "Can invite user"
msgstr "可以邀请用户"
-#: users/models/user.py:1029
+#: users/models/user.py:1053
msgid "Can remove user"
msgstr "可以移除用户"
-#: users/models/user.py:1030
+#: users/models/user.py:1054
msgid "Can match user"
msgstr "可以匹配用户"
-#: users/models/user.py:1039
+#: users/models/user.py:1063
msgid "Administrator"
msgstr "管理员"
-#: users/models/user.py:1042
+#: users/models/user.py:1066
msgid "Administrator is the super user of system"
msgstr "Administrator是初始的超级管理员"
-#: users/models/user.py:1067
+#: users/models/user.py:1091
msgid "User password history"
msgstr "用户密码历史"
@@ -8059,7 +8041,7 @@ msgstr "用户密码历史"
msgid "Reset password"
msgstr "重置密码"
-#: users/notifications.py:85 users/views/profile/reset.py:233
+#: users/notifications.py:85 users/views/profile/reset.py:231
msgid "Reset password success"
msgstr "重置密码成功"
@@ -8170,7 +8152,7 @@ msgstr "命令行"
msgid "The old password is incorrect"
msgstr "旧密码错误"
-#: users/serializers/profile.py:36 users/serializers/profile.py:178
+#: users/serializers/profile.py:36 users/serializers/profile.py:179
msgid "Password does not match security rules"
msgstr "密码不满足安全规则"
@@ -8186,13 +8168,9 @@ msgstr "系统角色"
msgid "Org roles"
msgstr "组织角色"
-#: users/serializers/user.py:51
-msgid "Organizations and roles"
-msgstr "组织和角色"
-
-#: users/serializers/user.py:93
-msgid "Password strategy"
-msgstr "密码策略"
+#: users/serializers/user.py:90
+msgid "Password setting"
+msgstr "密码选项"
#: users/serializers/user.py:95
msgid "MFA enabled"
@@ -8206,7 +8184,7 @@ msgstr "强制 MFA"
msgid "Login blocked"
msgstr "登录被锁定"
-#: users/serializers/user.py:102 users/serializers/user.py:181
+#: users/serializers/user.py:99 users/serializers/user.py:180
msgid "Is OTP bound"
msgstr "是否绑定了虚拟 MFA"
@@ -8220,33 +8198,39 @@ msgstr "组织管理员"
#: users/serializers/user.py:106
msgid "Can public key authentication"
-msgstr "可以使用公钥认证"
+msgstr "可以公钥认证吗"
-#: users/serializers/user.py:176
+#: users/serializers/user.py:165
+msgid "Groups"
+msgstr "用户组"
+
+#: users/serializers/user.py:168
+msgid "Superuser"
+msgstr "超级用户"
+
+#: users/serializers/user.py:175
msgid "Is org admin"
msgstr "组织管理员"
-#: users/serializers/user.py:178
+#: users/serializers/user.py:177
msgid "Avatar url"
msgstr "头像路径"
-#: users/serializers/user.py:182
+#: users/serializers/user.py:181
msgid "MFA level"
-msgstr "MFA 级别"
+msgstr "MFA"
-#: users/serializers/user.py:304
-msgid "Select users"
-msgstr "选择用户"
+#: users/serializers/user.py:303
+msgid ""
+"For security, only a partial list of users is displayed. You can search for "
+"more"
+msgstr ""
-#: users/serializers/user.py:305
-msgid "For security, only list several users"
-msgstr "为了安全,仅列出几个用户"
-
-#: users/serializers/user.py:338
+#: users/serializers/user.py:336
msgid "name not unique"
msgstr "名称重复"
-#: users/signal_handlers.py:33
+#: users/signal_handlers.py:34
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 "
@@ -8254,7 +8238,7 @@ msgid ""
msgstr ""
"管理员已开启'仅允许已存在用户登录',当前用户不在用户列表中,请联系管理员。"
-#: users/signal_handlers.py:167
+#: users/signal_handlers.py:168
msgid "Clean up expired user sessions"
msgstr "清除过期的用户会话"
@@ -8347,15 +8331,15 @@ msgstr "输入您的手机号码,验证码将发送到您的手机"
msgid "Email account"
msgstr "邮箱账号"
-#: users/templates/users/forgot_password.html:93
+#: users/templates/users/forgot_password.html:92
msgid "Mobile number"
msgstr "手机号码"
-#: users/templates/users/forgot_password.html:101
+#: users/templates/users/forgot_password.html:100
msgid "Send"
msgstr "发送"
-#: users/templates/users/forgot_password.html:105
+#: users/templates/users/forgot_password.html:104
#: users/templates/users/forgot_password_previewing.html:30
msgid "Submit"
msgstr "提交"
@@ -8508,23 +8492,23 @@ msgid ""
"their passwords: {}"
msgstr "非本地用户仅允许从第三方平台登录,不支持修改密码: {}"
-#: users/views/profile/reset.py:188 users/views/profile/reset.py:199
+#: users/views/profile/reset.py:186 users/views/profile/reset.py:197
msgid "Token invalid or expired"
msgstr "令牌错误或失效"
-#: users/views/profile/reset.py:204
+#: users/views/profile/reset.py:202
msgid "User auth from {}, go there change password"
msgstr "用户认证源来自 {}, 请去相应系统修改密码"
-#: users/views/profile/reset.py:211
+#: users/views/profile/reset.py:209
msgid "* Your password does not meet the requirements"
msgstr "* 您的密码不符合要求"
-#: users/views/profile/reset.py:217
+#: users/views/profile/reset.py:215
msgid "* The new password cannot be the last {} passwords"
msgstr "* 新密码不能是最近 {} 次的密码"
-#: users/views/profile/reset.py:234
+#: users/views/profile/reset.py:232
msgid "Reset password success, return to login page"
msgstr "重置密码成功,返回到登录页面"
@@ -8681,8 +8665,7 @@ msgstr "与"
msgid "Or"
msgstr "或"
-#: xpack/plugins/cloud/manager.py:55 xpack/plugins/cloud/providers/gcp.py:64
-#: xpack/plugins/cloud/providers/huaweicloud.py:34
+#: xpack/plugins/cloud/manager.py:56
msgid "Account unavailable"
msgstr "账号无效"
@@ -9042,6 +9025,10 @@ msgstr "有效性显示"
msgid "Provider display"
msgstr "服务商显示"
+#: xpack/plugins/cloud/serializers/account_attrs.py:17
+msgid "Access key id"
+msgstr "Access key id"
+
#: xpack/plugins/cloud/serializers/account_attrs.py:35
msgid "Client ID"
msgstr "客户端 ID"
@@ -9164,11 +9151,11 @@ msgid "Interface settings"
msgstr "界面设置"
#: xpack/plugins/interface/models.py:23
-msgid "Title of login page"
+msgid "Login title"
msgstr "登录页面标题"
#: xpack/plugins/interface/models.py:27
-msgid "Image of login page"
+msgid "Login image"
msgstr "登录页面图片"
#: xpack/plugins/interface/models.py:31
@@ -9176,14 +9163,17 @@ msgid "Website icon"
msgstr "网站图标"
#: xpack/plugins/interface/models.py:35
-msgid "Logo of management page"
-msgstr "管理页面logo"
+msgid "Index logo"
+msgstr "管理页面 Logo"
#: xpack/plugins/interface/models.py:39
-msgid "Logo of logout page"
-msgstr "退出页面logo"
+#, fuzzy
+#| msgid "Logout"
+msgid "Logout logo"
+msgstr "注销登录"
#: xpack/plugins/interface/models.py:41
+#: xpack/plugins/interface/serializers/interface.py:26
msgid "Theme"
msgstr "主题"
@@ -9195,6 +9185,14 @@ msgstr "页脚内容"
msgid "Interface setting"
msgstr "界面设置"
+#: xpack/plugins/interface/serializers/interface.py:37
+msgid "Wide logo on top"
+msgstr "顶部宽 Logo"
+
+#: xpack/plugins/interface/serializers/interface.py:38
+msgid "Small logo without text"
+msgstr "方形小 Logo"
+
#: xpack/plugins/license/api.py:52
msgid "License import successfully"
msgstr "许可证导入成功"
@@ -9223,5 +9221,53 @@ msgstr "企业专业版"
msgid "Ultimate edition"
msgstr "企业旗舰版"
-#~ msgid "Please test the connection first"
-#~ msgstr "请先测试连接"
+#~ msgid "Key password"
+#~ msgstr "密钥密码"
+
+#~ msgid "Title of login page"
+#~ msgstr "登录页标题"
+
+#~ msgid "Image of login page"
+#~ msgstr "登录页图片"
+
+#~ msgid "Logo of management page"
+#~ msgstr "管理页面 Logo"
+
+#~ msgid "Logo of logout page"
+#~ msgstr "退出页面小 Logo"
+
+#~ msgid "Organization ID"
+#~ msgstr "组织 ID"
+
+#~ msgid "Password strategy"
+#~ msgstr "密码策略"
+
+#~ msgid "Enable database proxy"
+#~ msgstr "启用数据库组件"
+
+#~ msgid "Enable Razor"
+#~ msgstr "启用 Razor 服务"
+
+#~ msgid "Email Subject"
+#~ msgstr "邮件主题"
+
+#~ msgid "Command reject (Job)"
+#~ msgstr "批量危险命令告警"
+
+#~ msgid "Account "
+#~ msgstr "账号"
+
+#~ msgid "Password can not contains `{{` or `}}`"
+#~ msgstr "密码不能包含 `{{` 或 `}}` 字符"
+
+#~ msgid "Password can not contains `{%` or `%}`"
+#~ msgstr "密码不能包含 `{%` 或 `%}` 字符"
+
+#~ msgid "FeiShu query user failed"
+#~ msgstr "飞书查询用户失败"
+
+#~ msgid "The FeiShu is already bound to another user"
+#~ msgstr "该飞书已经绑定其他用户"
+
+#~ msgid "Binding FeiShu successfully"
+#~ msgstr "绑定 飞书 成功"
diff --git a/apps/locale/zh/LC_MESSAGES/djangojs.mo b/apps/i18n/core/zh/LC_MESSAGES/djangojs.mo
similarity index 100%
rename from apps/locale/zh/LC_MESSAGES/djangojs.mo
rename to apps/i18n/core/zh/LC_MESSAGES/djangojs.mo
diff --git a/apps/locale/zh/LC_MESSAGES/djangojs.po b/apps/i18n/core/zh/LC_MESSAGES/djangojs.po
similarity index 100%
rename from apps/locale/zh/LC_MESSAGES/djangojs.po
rename to apps/i18n/core/zh/LC_MESSAGES/djangojs.po
diff --git a/apps/i18n/lina/en.json b/apps/i18n/lina/en.json
new file mode 100644
index 000000000..985327301
--- /dev/null
+++ b/apps/i18n/lina/en.json
@@ -0,0 +1,1271 @@
+{
+ "APIKey": "API Key",
+ "About": "About",
+ "Accept": "Agree",
+ "AccessIP": "IP Whitelist",
+ "AccessKey": "Access Key",
+ "Account": "Account",
+ "AccountBackup": "Backup Accounts",
+ "AccountBackupCreate": "Create Account Backup",
+ "AccountBackupPlanCreate": "Create a Backup Account Task",
+ "AccountBackupPlanDetail": "Backup Account Task Details",
+ "AccountBackupPlanList": "Backup account tasks",
+ "AccountBackupPlanUpdate": "Update the Account Backup Plan",
+ "AccountBackupUpdate": "Update the Account Backup",
+ "AccountBatchUpdate": "Updated selected",
+ "AccountChangeSecret": "Change Account Credential tasks",
+ "AccountCreate": "Create a account",
+ "AccountDeleteConfirmMsg": "Delete Account, continue?",
+ "AccountExportTips": "The exported information contains sensitive information such as encrypted account numbers. The exported format is an encrypted zip file (if you have not set the encryption password, please go to Personal Info to set the file encryption password).",
+ "AccountGatherList": "Gather Tasks",
+ "AccountGatherTaskCreate": "Create a gather accounts task",
+ "AccountGatherTaskList": "Gather account tasks",
+ "AccountGatherTaskUpdate": "Update the gather accounts task",
+ "AccountList": "Accounts",
+ "AccountPolicy": "Account Policy",
+ "AccountPolicyHelpText": "For accounts that do not meet the requirements when creating, such as: non-compliant key types and unique key constraints, you can choose the above strategy.",
+ "AccountPushCreate": "Create a Push Account task",
+ "AccountPushExecutionList": "Execute History",
+ "AccountPushList": "Push Account Tasks",
+ "AccountPushUpdate": "Update the Push Account task",
+ "AccountStorage": "Account",
+ "AccountTemplate": "Template",
+ "AccountTemplateList": "Account Templates",
+ "AccountTemplateUpdateSecretHelpText": "The account list shows the accounts created through the template. When the secret is updated, the ciphertext of the accounts created through the template will be updated.",
+ "Accounts": "Accounts",
+ "Action": "Action",
+ "ActionCount": "Actions",
+ "ActionSetting": "Action Settings",
+ "Actions": "Action",
+ "ActionsTips": "The effects of each authority's agreement are different, click on the icon behind the authority to view",
+ "Activate": "Activate",
+ "ActivateSelected": "Activate selected",
+ "Active": "Active",
+ "ActiveAsset": "Recently Logged in",
+ "ActiveAssetRanking": "Login asset ranking",
+ "ActiveUser": "Logged in recently",
+ "ActiveUsers": "Active users",
+ "Activity": "Activities",
+ "Add": "Add",
+ "AddAll": "Add all",
+ "AddAccount": "Add account",
+ "AddAccountResult": "Second-Level Approver",
+ "AddAllMembersWarningMsg": "Are you sure add all user to this group ?",
+ "AddAsset": "Add Assets",
+ "AddAssetToNode": "Add Assets to Node",
+ "AddAssetToThisPermission": "Add Assets",
+ "AddNode": "Add Node",
+ "AddNodeToThisPermission": "Add Node",
+ "AddPassKey": "Add Passkey",
+ "AddRolePermissions": "Add permissions to the details after successful creation/update",
+ "AddSuccessMsg": "Add Successful",
+ "AddUserGroupToThisPermission": "Add User Group",
+ "AddUserToThisPermission": "Add User",
+ "Address": "Address",
+ "Addressee": "Recipient",
+ "AdhocDetail": "Command Details",
+ "AdhocManage": "Command",
+ "AdhocUpdate": "Update the Command",
+ "Advanced": "Advanced Settings",
+ "AfterChange": "After Changes",
+ "AjaxError404": "404 Request Error",
+ "AlibabaCloud": "Alibaba Cloud",
+ "Aliyun": "Alibaba Cloud",
+ "All": "All",
+ "AllAccountTip": "All accounts already added on the asset",
+ "AllAccounts": "All accounts",
+ "AllClickRead": "All Marked as Read",
+ "AllMembers": "All Members",
+ "AllowInvalidCert": "Ignore certificate check",
+ "Announcement": "Announcement",
+ "AnonymousAccount": "Anonymous account",
+ "AnonymousAccountTip": "Connect to Assets Without Using Username and Password, Only Support Web Type and Custom Type Assets",
+ "ApiKey": "API Key",
+ "ApiKeyList": "Authenticate via Api key in the header of each request, which differs from one request to another, offering greater security than Token method. Please consult the documentation for usage.
To minimize the risk of leaks, the Secret can only be viewed upon creation, and each user can create up to 10",
+ "ApiKeyWarning": "To reduce the risk of AccessKey leakage, the Secret is only provided at creation and cannot be queried later, please keep it safe.",
+ "AppEndpoint": "App Access Address",
+ "AppOps": "Job center",
+ "AppProvider": "Application Providers",
+ "AppProviderDetail": "Application Provider Details",
+ "AppletDetail": "RemoteApp",
+ "AppletHelpText": "In the upload process, if the application does not exist, create the application; If it exists, update the application.",
+ "AppletHostCreate": "Add Remote Application Release Machine",
+ "AppletHostDetail": "Remote Application Publishing Machine Details",
+ "AppletHostDomainHelpText": "This domain belongs to the System Organization",
+ "AppletHostSelectHelpMessage": "When connecting to an asset, the selection of the application publishing machine is random (but the last used one is preferred). If you want to assign a specific publishing machine to an asset, you can tag it as
or ;
When selecting an account for the publishing machine, the following situations will choose the user's own account with the same name or proprietary account (starting with js), otherwise use a public account (starting with jms):
1. Both the publishing machine and application support concurrent;
2. The publishing machine supports concurrent, but the application does not, and the current application does not use a proprietary account;
3. The publishing machine does not support concurrent, the application either supports or does not support concurrent, and no application uses a proprietary account;
Note: Whether the application supports concurrent connections is decided by the developer, and whether the host supports concurrent connections is decided by the single user single session setting in the publishing machine configuration",
+ "AppletHostUpdate": "Update the Remote App Publishing Machine",
+ "AppletHosts": "RemoteApp machine",
+ "Applets": "RemoteApp",
+ "Applicant": "Applicant",
+ "Applications": "Assets",
+ "ApplyAsset": "Apply for Assets",
+ "ApplyFromCMDFilterRule": "Command Filter Rules",
+ "ApplyFromSession": "Session",
+ "ApplyInfo": "Application Information",
+ "ApplyRunAsset": "Assets for which operations are requested",
+ "ApplyRunCommand": "Command for application",
+ "ApplyRunUser": "Users Applying for Run",
+ "Appoint": "Specify",
+ "ApprovaLevel": "Approval Information",
+ "ApprovalLevel": "Approval Level",
+ "ApprovalProcess": "Approval Process",
+ "Approved": "Agreed",
+ "ApproverNumbers": "Approvers",
+ "ApsaraStack": "Alibaba Cloud Private Cloud",
+ "Asset": "Asset",
+ "AssetAccount": "Accounts",
+ "AssetAccountDetail": "Account Details",
+ "AssetAclCreate": "Create a Asset Connect Rule",
+ "AssetAclDetail": "Asset Connect Rule Details",
+ "AssetAclList": "Asset Connect",
+ "AssetAclUpdate": "Update the Asset Connect Rules",
+ "AssetAddress": "Asset (IP/Hostname)",
+ "AssetAmount": "Asset amount",
+ "AssetAndNode": "Assets/Nodes",
+ "AssetBulkUpdateTips": "Network Devices, Cloud Services, Web, Batch Updating of Domains Not Supported",
+ "AssetChangeSecretCreate": "Create a change account credentials task",
+ "AssetChangeSecretUpdate": "Update the change account credentials task",
+ "AssetData": "Asset",
+ "AssetDetail": "Asset Detail",
+ "AssetList": "Assets",
+ "AssetListHelpMessage": "On the left is the asset tree. Right-click to create, delete or modify tree nodes. Assets are also organized in node form. On the right are the assets under this node. \n",
+ "AssetLoginACLHelpMsg": "When logging into assets, it can be audited based on the user's login IP and time segment to determine whether the assets can be logged into",
+ "AssetName": "Asset name",
+ "AssetPermission": "Authorization",
+ "AssetPermissionCreate": "Create a Asset Authorization Rule",
+ "AssetPermissionDetail": "Asset Authorization Details",
+ "AssetPermissionHelpMsg": "Asset authorization allows you to select users and assets, grant the assets to users for access. Once completed, users can conveniently view these assets. Additionally, you can set specific permissions to further define the users' rights to the assets.",
+ "AssetPermissionRules": "Authorization Rules",
+ "AssetPermissionUpdate": "Update the Asset Authorization Rules",
+ "AssetPermsAmount": "Asset authorization",
+ "AssetProtocolHelpText": "The protocols supported by the assets are restricted by the platform, click the settings button to view the protocol settings. If updates are required, please update the platform",
+ "AssetTree": "Asset Tree",
+ "Assets": "Assets",
+ "AssetsAmount": "Asset amount",
+ "AssetsTotal": "Asset total",
+ "AssignedInfo": "Approval Information",
+ "Assignee": "Handler",
+ "Assignees": "Pending Handler",
+ "AttrName": "Attribute Name",
+ "AttrValue": "Attribute value",
+ "Audits": "Audits",
+ "Auth": "Authentication",
+ "AuthLimit": "Login restriction",
+ "AuthSAMLCertHelpText": "Save after uploading the certificate key, then view SP Metadata",
+ "AuthSAMLKeyHelpText": "SP Certificates and keys are used for encrypted communication with IDP",
+ "AuthSaml2UserAttrMapHelpText": "The keys on the left are SAML2 user attributes, the values on the right are authentication platform user attributes",
+ "AuthSecurity": "Auth security",
+ "AuthSetting": "Authentication",
+ "AuthSettings": "Authentication Configuration",
+ "AuthUserAttrMapHelpText": "The Key on the Left Belongs to the JumpServer User Properties, and the Value on the Right Belongs to the Authentication Platform User Properties",
+ "Authentication": "Authentication",
+ "AutoPush": "Auto Push",
+ "Automations": "Automations",
+ "AverageTimeCost": "Average spend time",
+ "AwaitingMyApproval": "Assigned to me",
+ "Azure": "Azure (China)",
+ "Backup": "Backup",
+ "BackupAccounts": "Backup Accounts",
+ "BadConflictErrorMsg": "Refreshing, please try again later",
+ "BadRequestErrorMsg": "Request Error, please check the filled content",
+ "BadRoleErrorMsg": "Request Error, No Permission for this Action",
+ "BaiduCloud": "Baidu Cloud",
+ "BasePort": "Listening Ports",
+ "Basic": "Basic",
+ "BasicInfo": "Basic",
+ "BasicSetting": "Basic",
+ "BatchClearErrorMsg": "Batch Clearing Failed:",
+ "BatchConsent": "Batch Approval",
+ "BatchDeleteErrorMsg": "Batch deletion failed",
+ "BatchDeleteSuccessMsg": "Batch deletion successful",
+ "BatchDeployment": "Batch deployment",
+ "BatchOffline": "Batch Offline",
+ "BatchProcessing": "{Number} items selected",
+ "BatchReject": "Batch Deny",
+ "BatchSync": "Batch sync",
+ "BatchSyncDelete": "Batch sync deletion",
+ "BatchSyncErrorMsg": "Batch sync Failed",
+ "BatchTest": "Batch Test",
+ "BatchTransfer": "Batch Transfer",
+ "BatchUpdate": "Batch edit",
+ "BatchUpdatePlatformHelpTxt": "The asset will be updated only if the original platform type is the same as the selected platform type. If the platform types before and after the update are different, it will not be updated.",
+ "BeforeChange": "Before Change",
+ "Beian": "Record",
+ "BelongAll": "Including at the same time",
+ "BelongTo": "Any includes",
+ "Bind": "Binding",
+ "BindLabel": "Associated Tags",
+ "BindResource": "Associated resources",
+ "BindSuccess": "Binding Successful",
+ "BlockedIPS": "Locked IPs",
+ "BuiltinVariable": "Built-in variables",
+ "BulkUnblock": "Batch Unlock",
+ "CACertificate": "CA Certificate",
+ "CAS": "CAS",
+ "CMPP2": "CMPP v2.0",
+ "CTYunPrivate": "Tianyi Private Cloud",
+ "CalculationResults": "Error in cron expression",
+ "CanDragSelect": "Select time period by dragging mouse",
+ "Cancel": "Cancel",
+ "CancelCollection": "Cancel Favorite",
+ "CannotAccess": "Can't Access the Current Page",
+ "Category": "Category",
+ "CeleryTaskLog": "Celery Task Log",
+ "Certificate": "Certificate",
+ "CertificateKey": "Client Key",
+ "ChangeCredentials": "Change Secrets",
+ "ChangeCredentialsHelpText": "The secret is the password or key used to connect to the asset. When the secret is changed, the asset will be updated with the new secret",
+ "GatherAccountsHelpText": "Collect account information on assets. The collected account information can be imported into the system for centralized management.",
+ "BackupAccountsHelpText": "Backup account information externally. It can be stored in an external system or sent via email, supporting segmented delivery.",
+ "CommandFilterACLHelpText": "By filtering commands, you can control if commands can be sent to assets. Based on your set rules, some commands can be allowed while others are prohibited.",
+ "AssetLoginACLHelpText": "When logging into assets, it can be audited based on the user's login IP and time segment to determine whether the assets can be logged into",
+ "ConnectMethodACLHelpText": "Connect Methods can be filtered to control whether users can use a certain Connect Method to log in to the asset. According to your set rules, some Connect Methods can be allowed, while others can be prohibited.",
+ "UserLoginACLHelpText": "When logging in, it can be audited based on the user's login IP and time segment to determine whether the user can log in",
+ "ChangeField": "Change Field",
+ "ChangeOrganization": "Change organization",
+ "ChangePassword": "Change Password",
+ "ChangeReceiver": "Change Recipient",
+ "ChangeSecretParams": "Change Password Parameters",
+ "ChangeViewHelpText": "Click to Switch Different Views",
+ "Chat": "Chat",
+ "ChatAI": "Chat AI",
+ "ChatHello": "Hello! Can I help you?",
+ "ChdirHelpText": "By Default, the execution directory is the user's home directory",
+ "CheckAssetsAmount": "Check Asset Quantity",
+ "CheckViewAcceptor": "Click to View the Acceptance Person",
+ "CleanHelpText": "A scheduled cleanup task will be carried out every day at 2 a.m. The data cleaned up will not be recoverable",
+ "Cleaning": "Regular Clean-up",
+ "Clear": "Clear",
+ "ClearScreen": "Clear Screen",
+ "ClearSecret": "Clear secret",
+ "ClearSelection": "Clear selection",
+ "ClearSuccessMsg": "Clear successful",
+ "ClickCopy": "Click to Copy",
+ "ClientCertificate": "Client certificate",
+ "ClipboardCopyPaste": "Clipboard Copy and Paste",
+ "Clone": "Duplicate",
+ "CloneFrom": "Duplicate",
+ "Close": "Close",
+ "CloseConfirm": "Confirm Close",
+ "CloseConfirmMessage": "File has changed, save?",
+ "CloseStatus": "Completed",
+ "Closed": "Completed",
+ "CloudAccountList": "Cloud Accounts",
+ "CloudCreate": "Create a Asset - Cloud",
+ "CloudSource": "Sync Source",
+ "CloudSync": "Cloud Provider",
+ "CloudUpdate": "Update the Asset - Cloud",
+ "Cluster": "Cluster",
+ "CollectionSucceed": "Collection successful",
+ "Command": "Command",
+ "CommandConfirm": "Command Review",
+ "CommandFilterACL": "Command Filter",
+ "CommandFilterACLHelpMsg": "By filtering commands, you can control if commands can be sent to assets. Based on your set rules, some commands can be allowed while others are prohibited.",
+ "CommandFilterAclCreate": "Create a Command Filter Rule",
+ "CommandFilterAclDetail": "Details of Command Filter Rule",
+ "CommandFilterAclList": "Command Filter",
+ "CommandFilterAclUpdate": "Update the Command Filter Rule",
+ "CommandFilterRuleContentHelpText": "One command per line",
+ "CommandFilterRules": "Command Filter Rules",
+ "CommandGroup": "Command Group",
+ "CommandGroupCreate": "Create a Command Group",
+ "CommandGroupDetail": "Command Set Details",
+ "CommandGroupList": "Command Group",
+ "CommandGroupUpdate": "Update the Command Group",
+ "CommandStorage": "Command Storage",
+ "CommandStorageUpdate": "Update the Cmd Storage",
+ "Commands": "Commands",
+ "CommandsTotal": "Commands total",
+ "Comment": "Description",
+ "CommentHelpText": "Note: Remarks will be displayed when hovered over in the Luna page's user authorization asset tree. Ordinary users can view, please do not fill in sensitive information.",
+ "CommunityEdition": "Community Version",
+ "Component": "Component",
+ "ComponentMonitor": "Monitoring",
+ "ConceptContent": "I want you to act like a Python interpreter. I will give you Python code, and you will execute it. Do not provide any explanations. Respond with nothing except the output of the code.",
+ "ConceptTitle": "🤔 Python Interpreter",
+ "Config": "Settings",
+ "Confirm": "Confirm",
+ "ConfirmPassword": "Confirm Password",
+ "ConnectMethod": "Connect Method",
+ "ConnectMethodACLHelpMsg": "Connect Methods can be filtered to control whether users can use a certain Connect Method to log in to the asset. According to your set rules, some Connect Methods can be allowed, while others can be prohibited (globally effective).",
+ "ConnectMethodAclCreate": "Create a Connect Method Control",
+ "ConnectMethodAclDetail": "Connect Method Control Details",
+ "ConnectMethodAclList": "Connect Method",
+ "ConnectMethodAclUpdate": "Update the Connect Method Control",
+ "ConnectWebSocketError": "Connection to WebSocket Failed",
+ "ConnectionDropped": "Connection Disconnected",
+ "ConnectionToken": "Connection token",
+ "ConnectionTokenList": "The connection token is a type of authentication information that combines identity verification with connecting assets. It supports one-click user login to assets. Currently supported components include: KoKo, Lion, Magnus, Razor, etc.",
+ "Console": "Console",
+ "Consult": "Consult",
+ "ContainAttachment": "With Attachment",
+ "Containers": "Container",
+ "Contains": "Contains",
+ "Continue": "Continue",
+ "ConvenientOperate": "Convenient Action",
+ "Copy": "Copy",
+ "CopySuccess": "Copy Successful",
+ "Corporation": "Company",
+ "Create": "Create",
+ "CreateAccessKey": "Create a Access Key",
+ "CreateAccountTemplate": "Create a Account Template",
+ "CreateCommandStorage": "Create a command storage",
+ "CreateEndpoint": "Create a Endpoint",
+ "CreateEndpointRule": "Create a EndPoint Rule",
+ "CreateErrorMsg": "Creation Failed",
+ "CreateNode": "Create a Node",
+ "CreatePlaybook": "Create a Playbook",
+ "CreateReplayStorage": "Create a Object Storage",
+ "CreateSuccessMsg": "Import Successful, Total: {count}",
+ "CreateUserSetting": "User creation",
+ "Created": "Created",
+ "CreatedBy": "Creator",
+ "CriticalLoad": "Serious",
+ "CronExpression": "Complete crontab expression",
+ "CrontabOfCreateUpdatePage": "",
+ "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)
",
+ "CurrentConnectionUsers": "Online users",
+ "CurrentConnections": "Current Connections",
+ "CurrentUserVerify": "Verify Current User",
+ "Custom": "Custom",
+ "CustomCol": "Customize Display Columns",
+ "CustomCreate": "Create a Asset - Custom",
+ "CustomFields": "Custom Attributes",
+ "CustomFile": "Please Place Custom Files in the Specified Directory (data/sms/main.py), and Enable Configuration Item SMS_CUSTOM_FILE_MD5= in config.txt",
+ "CustomHelpMessage": "Custom Assets Type is dependent on remote applications. Please configure it in system settings in the remote applications",
+ "CustomParams": "The left side are parameters received by the SMS platform, and the right side are JumpServer parameters waiting for formatting, which will eventually be as follows:
{\"phone_numbers\": \"123,134\", \"content\": \"verification code: 666666\"}",
+ "CustomUpdate": "Update the Asset - Custom",
+ "CustomUser": "Customized User",
+ "CycleFromWeek": "Week Cycle From",
+ "CyclePerform": "Execute periodically",
+ "DangerCommand": "Dangerous Command",
+ "DangerousCommandNum": "Dangerous command count",
+ "Dashboard": "Dashboard",
+ "Database": "Database",
+ "DatabaseCreate": "Create a Asset - Database",
+ "DatabasePort": "Database Protocol Port",
+ "DatabaseUpdate": "Update the Asset-Database",
+ "Date": "Date",
+ "DateCreated": "Creation Time",
+ "DateEnd": "End Date",
+ "DateExpired": "Expiration Date",
+ "DateFinished": "Completion Date",
+ "DateJoined": "Creation Date",
+ "DateLast24Hours": "Last Day",
+ "DateLast3Months": "Quarter of Year",
+ "DateLastHarfYear": "Half of Year",
+ "DateLastLogin": "Last Login Date",
+ "DateLastMonth": "Last Month",
+ "DateLastSync": "Last synchronization date",
+ "DateLastWeek": "Last Week",
+ "DateLastYear": "Last Year",
+ "DatePasswordLastUpdated": "Last Password Update Date",
+ "DateStart": "Start Date",
+ "DateSync": "Sync Date",
+ "DateUpdated": "Update Date",
+ "Day": "Day",
+ "DeclassificationLogNum": "Password change logs",
+ "DefaultDatabase": "Default Database",
+ "DefaultPort": "Default Port",
+ "Delete": "Delete",
+ "DeleteConfirmMessage": "Deletion is irreversible, do you wish to continue?",
+ "DeleteErrorMsg": "Delete Failed",
+ "DeleteNode": "Delete Node",
+ "DeleteOrgMsg": "User List, User Group, Asset List, Network Domain List, Manage Users, System Users, Tag Management, Asset Authorization Rules",
+ "DeleteOrgTitle": "Please Ensure the Following Information within the Organization has been Deleted",
+ "DeleteReleasedAssets": "Delete Released Assets",
+ "DeleteSelected": "Delete selected",
+ "DeleteSuccess": "Delete Successfully",
+ "DeleteSuccessMsg": "Delete Successful",
+ "DeleteWarningMsg": "Are You Sure You Want to Delete",
+ "Deploy": "Deployment",
+ "Description": "Description",
+ "DestinationIP": "Destination address",
+ "DestinationPort": "Destination port",
+ "Detail": "Detail",
+ "DeviceCreate": "Create a Asset - Device",
+ "DeviceUpdate": "Update the Asset - Device",
+ "Digit": "Number",
+ "DingTalk": "DingTalk",
+ "DingTalkTest": "Test",
+ "Disable": "Disable",
+ "DisableSelected": "Disable selected",
+ "DisplayName": "Name",
+ "Docs": "Document",
+ "Domain": "Domain",
+ "DomainCreate": "Create a Domain",
+ "DomainEnabled": "Enable Domain",
+ "DomainHelpMessage": "Domain function is designed to solve the problem that some environments (such as: hybrid cloud) cannot be directly connected, and a new function is added. The principle is to log in through the gateway server.
Server -> Domain Gateway -> Target Assets",
+ "DomainList": "Domains",
+ "DomainUpdate": "Update the Domain",
+ "Download": "Download",
+ "DownloadCenter": "Download Center",
+ "AddAccountByTemplate": "Add account from template",
+ "DownloadFTPFileTip": "The current action does not record files, or the file size exceeds the threshold (default 100M), or it has not yet been saved to the corresponding storage",
+ "DownloadImportTemplateMsg": "Download creation template",
+ "DownloadReplay": "Download Recording",
+ "DownloadUpdateTemplateMsg": "Download update template",
+ "DragUploadFileInfo": "Drag files here, or click to upload",
+ "DuplicateFileExists": "Uploading a file with the same name is not allowed, please delete the file with the same name",
+ "Duration": "Duration",
+ "DynamicUsername": "Dynamic Username",
+ "Edit": "Edit",
+ "Edition": "Version",
+ "Email": "Email",
+ "EmailContent": "Custom Content",
+ "EmailTest": "Test Connection",
+ "Empty": "Empty",
+ "Enable": "Enable",
+ "EnableKoKoSSHHelpText": "When switched on, connecting to the asset will display SSH Client pull-up method",
+ "Endpoint": "Service Endpoint",
+ "EndpointListHelpMessage": "The service endpoint is the address (port) for users to access the service. When users connect to assets, they choose service endpoints based on endpoint rules and asset labels, using them as access points to establish connections and achieve distributed connections to assets",
+ "EndpointRule": "Endpoint Rules",
+ "EndpointRuleListHelpMessage": "For the server endpoint selection strategy, there are currently two options:
1、Specify the endpoint according to the endpoint rule (current page);
2、Choose the endpoint through asset labels, with the fixed label name being 'endpoint' and the value being the name of the endpoint.
The tag matching method is preferred for both methods, as the IP range may conflict, and the tag method exists as a supplement to the rules.",
+ "Endswith": "Ending with...",
+ "EnsureThisValueIsGreaterThanOrEqualTo1": "Please Make Sure this Number is Greater Than or Equal to 1",
+ "EnterForSearch": "Press Enter to Search",
+ "EnterRunUser": "Enter running account",
+ "EnterRunningPath": "Enter Running Path",
+ "EnterToContinue": "Press Enter to Continue",
+ "EnterUploadPath": "Enter Upload Path",
+ "Enterprise": "Enterprise Edition",
+ "EnterpriseEdition": "Enterprise Edition",
+ "Equal": "Equals",
+ "Error": "Error",
+ "AccountTemplates": "Templates",
+ "ErrorMsg": "Error",
+ "EsDisabled": "Node is unavailable, please contact administrator",
+ "EsIndex": "ES provides the default index: JumpServer. If indexing by date is enabled, the entered value will serve as the index prefix",
+ "EsUrl": "Cannot include special Char `#`; eg: http://es_user:es_password@es_host:es_port",
+ "Every": "Every",
+ "Exclude": "Does Not Include",
+ "ExcludeAsset": "Skipped Assets",
+ "ExcludeSymbol": "Exclude Char",
+ "Execute": "Execute",
+ "ExecuteOnce": "Execute Once",
+ "ExecutionDetail": "Execution History Details",
+ "ExecutionHistory": "History",
+ "ExecutionList": "Execute History",
+ "ExistError": "This Element Already Exists",
+ "Existing": "Already Exists",
+ "ExpirationTimeout": "Expiration Timeout (Seconds)",
+ "Expire": "Expired",
+ "Expired": "Expiration Date",
+ "Export": "Export",
+ "ExportAll": "Export all",
+ "ExportOnlyFiltered": "Export filtered items",
+ "ExportOnlySelectedItems": "Export selected items",
+ "ExportRange": "Export Range",
+ "FC": "Fusion Compute",
+ "Failed": "Failed",
+ "FailedAsset": "Failed Assets",
+ "FaviconTip": "Note: Website Icon (Suggested Image Size: 16px*16px)",
+ "Features": "Features",
+ "FeiShu": "Lark",
+ "FeiShuTest": "Test",
+ "FieldRequiredError": "This field is required",
+ "FileExplorer": "File Explorer",
+ "FileManagement": "File Manager",
+ "FileNameTooLong": "File name too long",
+ "FileSizeExceedsLimit": "File size exceeds limit",
+ "FileTransfer": "File Transfer",
+ "FileTransferNum": "Number of file transfers",
+ "FileType": "File Type",
+ "Filename": "File name",
+ "FingerPrint": "Fingerprint",
+ "Finished": "Complete",
+ "FinishedTicket": "Complete Work Order",
+ "FirstLogin": "First Login",
+ "FlowSetUp": "Flow set up",
+ "FormatError": "Format Error",
+ "Friday": "Fri",
+ "From": "From",
+ "FromTicket": "From the work order",
+ "FullName": "Full name",
+ "FullySynchronous": "Assets completely synchronized",
+ "FullySynchronousHelpTip": "Whether to continue synchronizing such assets when the asset conditions do not meet the matching policy rules",
+ "GCP": "Google Cloud",
+ "GPTCreate": "Create a Asset - GPT",
+ "GPTUpdate": "Update the Asset - GPT",
+ "GatewayCreate": "Create a Gateway",
+ "GatewayList": "Gateways",
+ "GatewayUpdate": "Update the Gateway",
+ "GatherAccounts": "Gather Accounts",
+ "GatheredAccounts": "Gathered Accounts",
+ "GeneralAccounts": "General Accounts",
+ "Generate": "Generate",
+ "GenerateAccounts": "Regenerate Account",
+ "GenerateSuccessMsg": "Account Creation Successful",
+ "GoHomePage": "Go to Homepage",
+ "Goto": "Go to",
+ "GrantedAssets": "Authorized Assets",
+ "GreatEqualThan": "Greater than or Equal to",
+ "GroupsAmount": "User group",
+ "HandleTicket": "Handle Work Orders",
+ "Hardware": "Hardware Information",
+ "HardwareInfo": "Hardware Information",
+ "HasImportErrorItemMsg": "There are import failures, click on the left x to view the failure reasons, after editing the table, you can continue to import failures.",
+ "Help": "Help",
+ "HelpDocumentTip": "Document URL for navigation bar 'Help -> Document' redirection.",
+ "HelpSupportTip": "Support URL for the navigation bar 'Help -> Support' redirection.",
+ "HighLoad": "Higher",
+ "HistoricalSessionNum": "Historical session count",
+ "History": "History",
+ "HistoryDate": "Date",
+ "CommandJob": "Command",
+ "PlayBookJob": "Playbook",
+ "HistoryPassword": "Historical Password",
+ "HistoryRecord": "History record",
+ "Host": "Asset",
+ "HostCreate": "Create a Asset - Host",
+ "HostDeployment": "Deploy Publishing Machine",
+ "HostList": "Host List",
+ "HostUpdate": "Update the Asset - Host",
+ "HostnameStrategy": "Used to Generate Hostnames for Assets. For Example: 1. Instance Name (instanceDemo); 2. Instance Name and Part of IP (last two letters) (instanceDemo-250.1)",
+ "Hour": "Hour",
+ "HuaweiCloud": "Huawei Cloud",
+ "HuaweiPrivateCloud": "Huawei Private Cloud",
+ "IAgree": "I agree",
+ "ID": "ID",
+ "IP": "IP",
+ "IPLoginLimit": "IP restriction",
+ "IPMatch": "IP Matching",
+ "IPNetworkSegment": "IP Segment",
+ "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",
+ "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",
+ "ImageName": "Image Name",
+ "Images": "Image",
+ "Import": "Import",
+ "ImportAll": "Import All",
+ "ImportFail": "Import Failed",
+ "ImportLdapUserTip": "Please submit LDAP configuration before import",
+ "ImportLdapUserTitle": "LDAP user list",
+ "ImportLicense": "Import License",
+ "ImportLicenseTip": "Please Import License",
+ "ImportMessage": "Please go to the corresponding type of page to import data",
+ "ImportOrg": "Import Organization",
+ "InActiveAsset": "Not Recently Logged In",
+ "InActiveUser": "No Recent Login",
+ "InAssetDetail": "Update Account Info in Asset Details",
+ "Inactive": "Disabled",
+ "Index": "Index",
+ "Info": "Information",
+ "InheritPlatformConfig": "Inherited from platform configuration, to change, please modify the configuration in the platform",
+ "InitialDeploy": "Initialization Deployment",
+ "Input": "Input",
+ "InputEmailAddress": "Please enter the correct email address",
+ "InputMessage": "Enter message...",
+ "InputPhone": "Phone number",
+ "InstanceAddress": "Instance Address",
+ "InstanceName": "Instance Name",
+ "InstancePlatformName": "Instance Platform Name",
+ "Interface": "Appearance",
+ "InterfaceSettings": "Appearance",
+ "IntervalOfCreateUpdatePage": "Unit: Hour",
+ "InvalidJson": "Invalid JSON",
+ "InviteSuccess": "Invitation Successful",
+ "InviteUser": "Invite",
+ "InviteUserInOrg": "Invite users to join this organization",
+ "Ip": "IP",
+ "IpGroup": "IP Group",
+ "IpGroupHelpText": "* indicates match all. For example: 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",
+ "IsActive": "Active",
+ "IsAlwaysUpdate": "Keeping Assets Up to Date",
+ "IsAlwaysUpdateHelpTip": "Whether to synchronize and update asset information, including hostname, IP, platform, domain, node, etc. each time a synchronization task is performed",
+ "IsFinished": "Is It Done",
+ "IsLocked": "Suspend?",
+ "IsSuccess": "Success",
+ "IsSyncAccountHelpText": "Upon Collection Completion, the Collected Account Will Be Synced to Asset",
+ "IsSyncAccountLabel": "Sync to Assets",
+ "JDCloud": "JD Cloud",
+ "Job": "Job",
+ "JobCenter": "Job center",
+ "JobCreate": "Create a Job",
+ "JobDetail": "Job Details",
+ "JobExecutionLog": "Job logs",
+ "JobManagement": "Jobs",
+ "JobUpdate": "Update the Job",
+ "KingSoftCloud": "KingSoft Cloud",
+ "KokoSettingUpdate": "Koko",
+ "LAN": "Bulk Account Add Results",
+ "LDAPUser": "LDAP Users",
+ "Label": "Label",
+ "LabelCreate": "Create a Label",
+ "LabelInputFormatValidation": "Label format error, the correct format is: name:value",
+ "LabelList": "Labels",
+ "LabelUpdate": "Update the Label",
+ "Language": "Language",
+ "Last30": "Recent 30 items",
+ "Last30Days": "Monthly",
+ "Last7Days": "Weekly",
+ "LastPublishedTime": "Last Publish Time",
+ "Ldap": "LDAP",
+ "LdapBulkImport": "User Import",
+ "LdapConnectTest": "Test Connection",
+ "LdapLoginTest": "Test Login",
+ "Length": "Length",
+ "LessEqualThan": "Less Than or Equal To",
+ "LevelApproval": "Level Approval",
+ "License": "License",
+ "LicenseExpired": "The license has expired",
+ "LicenseFile": "License File",
+ "LicenseForTest": "Test Purpose License, This License is Only for Testing (PoC) and Demonstration",
+ "LicenseReachedAssetAmountLimit": "The assets has exceeded the license limit",
+ "LicenseWillBe": "License Expiring Soon",
+ "Loading": "Loading",
+ "LockedIP": "Locked IP {count}",
+ "Log": "Log",
+ "LogData": "Log data",
+ "LogOfLoginSuccessNum": "The successful login logs",
+ "Logging": "Log Record",
+ "LoginAssetConfirm": "Asset Connect Review",
+ "LoginAssetToday": "Active assets today",
+ "LoginAssets": "Active assets",
+ "LoginConfirm": "Login review",
+ "LoginCount": "Login times",
+ "LoginDate": "Login Date",
+ "LoginFailed": "Login Failed",
+ "LoginFrom": "Login Source",
+ "LoginImageTip": "Note: It will appear on the enterprise user login page (recommended image size: 492*472px)",
+ "LoginLog": "Login logs",
+ "LoginLogTotal": "Login log total",
+ "LoginNum": "Login count",
+ "LoginPasswordSetting": "Login Password",
+ "LoginRequiredMsg": "The account has logged out, please log in again.",
+ "LoginSucceeded": "Login Successful",
+ "LoginTitleTip": "Note: It will be displayed on the enterprise edition user SSH login KoKo login page (e.g.: Welcome to use JumpServer Open Source Bastion)",
+ "LoginUserRanking": "Login account ranking",
+ "LoginUserToday": "Users logged today",
+ "LoginUsers": "Active Account",
+ "LogoIndexTip": "Tip: It will be displayed in the upper left corner of the page (Recommended image size: 185px*55px)",
+ "LogoLogoutTip": "Tip: It will be displayed on the web terminal page of Enterprise Edition users (recommended image size: 82px*82px)",
+ "Logout": "Logout",
+ "LogsAudit": "Activities",
+ "Lowercase": "Lowercase",
+ "LunaSettingUpdate": "Luna",
+ "MFAErrorMsg": "MFA errors, please check",
+ "MFAOfUserFirstLoginPersonalInformationImprovementPage": "Enable multi-factor authentication to make your account more secure.
After enabling, you will enter the multi-factor authentication binding process the next time you log in; you can also directly bind in (Personal Information->Quick Modification->Change Multi-factor Settings)!",
+ "MFAOfUserFirstLoginUserGuidePage": "In order to protect your and the company's security, please carefully safeguard important sensitive information such as your account, password, and key (for example, set a complex password, and enable multi-factor authentication)
Personal information such as email, mobile number, and WeChat are only used for user authentication and platform internal message notifications.",
+ "MailRecipient": "Email Recipient",
+ "MailSend": "Sending",
+ "ManualAccount": "Manual account",
+ "ManualAccountTip": "Manual input of Username/Password upon Login",
+ "ManualExecute": "Manual execution",
+ "ManyChoose": "Select Multiple",
+ "MarkAsRead": "Mark as read",
+ "Marketplace": "App Market",
+ "Match": "Match",
+ "MatchIn": "In...",
+ "MatchResult": "Match Results",
+ "MatchedCount": "Match Results",
+ "Members": "Members",
+ "MenuAccounts": "Accounts",
+ "MenuAcls": "ACLs",
+ "MenuAssets": "Assets",
+ "MenuMore": "Others",
+ "MenuPermissions": "Policies",
+ "MenuUsers": "Users",
+ "Message": "Message",
+ "MessageSubscription": "Message Subscription",
+ "MessageType": "Message Type",
+ "MfaLevel": "MFA",
+ "Min": "Min",
+ "Modify": "Edit",
+ "Module": "Module",
+ "Monday": "Mon",
+ "Monitor": "Monitoring",
+ "Month": "Month",
+ "More": "More",
+ "MoreActions": "Actions",
+ "MoveAssetToNode": "Move Assets to Nodes",
+ "MsgSubscribe": "Subscription",
+ "AllUser": "All users",
+ "AllAsset": "All assets",
+ "SpecificUser": "Specific user",
+ "SpecificAsset": "Specific asset",
+ "MyAssets": "My Assets",
+ "MyTickets": "Submitted by me",
+ "Name": "Name",
+ "NavHelp": "Navigation",
+ "NeedReLogin": "Need to Re-Login",
+ "New": "Create",
+ "NewChat": "New Chat",
+ "NewCount": "Add",
+ "NewCron": "Generate Cron",
+ "NewDirectory": "Create New Directory",
+ "NewFile": "Create a New File",
+ "NewPassword": "New Password",
+ "NewSyncCount": "New Sync",
+ "No": "No",
+ "NoContent": "No Content",
+ "NoData": "No data available",
+ "NoFiles": "No Files Currently",
+ "NoPermission": "No Permissions",
+ "NoPermission403": "403 No Permission",
+ "NoPermissionVew": "No Permission to View the Current Page",
+ "NoUnreadMsg": "No unread messages",
+ "Node": "Node",
+ "NodeAmount": "Nodes",
+ "NodeInformation": "Node Information",
+ "NodeSearchStrategy": "Node Search Strategy",
+ "NormalLoad": "Normal",
+ "NotEqual": "Not Equal To",
+ "NotSet": "Not Set",
+ "NotSpecialEmoji": "Special Emoji Input Not Allowed",
+ "Nothing": "None",
+ "Notifications": "Notifications",
+ "Now": "Now",
+ "Number": "No.",
+ "NumberOfVisits": "Visits",
+ "OAuth2": "OAuth2",
+ "OAuth2LogoTip": "Note: Authentication Provider (Recommended image size: 64px*64px)",
+ "OIDC": "OIDC",
+ "ObjectNotFoundOrDeletedMsg": "No corresponding resources found or it has been deleted.",
+ "Offline": "Offline",
+ "OfflineSuccessMsg": "Offline Successfully",
+ "OfflineUpload": "Offline Upload",
+ "OldPassword": "Old Password",
+ "OldSSHKey": "Old SSH Public Key",
+ "OneAssignee": "First-Level Approver",
+ "OneAssigneeType": "First-Level Handler Type",
+ "OneClickReadMsg": "Are you sure you want to mark the current information as read?",
+ "OnlineSession": "Online devices",
+ "OnlineSessionHelpMsg": "Unable to log out of the current session because it is the current user's online session. Currently only users logged in via Web are being logged.",
+ "OnlineSessions": "Online sessions",
+ "OnlineUserDevices": "Online User Devices",
+ "OnlyMailSend": "Current support for email sending",
+ "OnlySearchCurrentNodePerm": "Only Search the Current Node's Authorization",
+ "OpenCommand": "Open Command",
+ "OpenStack": "OpenStack",
+ "OpenStatus": "In Approval",
+ "OpenTicket": "Create a Ticket",
+ "OperateLog": "Operate Logs",
+ "OperationLogNum": "Operation logs",
+ "UserPasswordChangeLog": "User Password Change Log",
+ "OrgAdmin": "Organization Admin",
+ "OrgAuditor": "Org Auditors",
+ "OrgName": "Authorized Organization Name",
+ "OrgRole": "Org Roles",
+ "OrgRoleHelpMsg": "Organization roles are roles tailored to individual organizations within the platform. These roles are assigned when inviting users to join a particular organization and dictate their permissions and access levels within that organization. Unlike system roles, organization roles are customizable and apply only within the scope of the organization they are assigned to.",
+ "OrgRoleHelpText": "The Org role is the user's role within the current organization",
+ "OrgRoles": "Org Role",
+ "OrgUser": "Organize Users",
+ "OrganizationCreate": "Create a organization",
+ "OrganizationDetail": "Organization Details",
+ "OrganizationList": "Organizations",
+ "OrganizationManage": "Manage orgs",
+ "OrganizationUpdate": "Update the Organization",
+ "Other": "Other",
+ "Output": "Output",
+ "Overview": "Overview",
+ "PageNext": "Next",
+ "PagePrev": "Previous",
+ "Params": "Parameter",
+ "ParamsHelpText": "Password parameter settings, currently only effective for assets of the host type.",
+ "PassKey": "Passkey",
+ "Passkey": "Passkey",
+ "PasskeyAddDisableInfo": "Your authentication source is {source}, and adding a Passkey is not supported",
+ "Passphrase": "Key Password",
+ "Password": "Password",
+ "PasswordChangeLog": "Password Change",
+ "PasswordExpired": "Password Expired",
+ "PasswordPlaceholder": "Please Enter Password",
+ "PasswordRecord": "Password Record",
+ "PasswordRule": "Password Rules",
+ "PasswordSecurity": "User Password",
+ "PasswordStrategy": "Secret Strategy",
+ "PasswordWillExpiredPrefixMsg": "Password will be in",
+ "PasswordWillExpiredSuffixMsg": "It will expire in days, please change your password as soon as possible.",
+ "Paste": "Paste",
+ "Pause": "Pause",
+ "PauseTaskSendSuccessMsg": "Task Pausing Issued, Please Refresh and Check Later",
+ "Pending": "Pending",
+ "PermAccount": "Authorized Account",
+ "PermUserList": "Authorized Users",
+ "PermissionCompany": "Authorized Companies",
+ "PermissionName": "Authorization Rule Name",
+ "Permissions": "Permission",
+ "PersonalInformationImprovement": "Complete Personal Information",
+ "Plan": "Plan",
+ "Platform": "Platform",
+ "PlatformCreate": "Create a Platform",
+ "PlatformDetail": "Platform Details",
+ "PlatformList": "Platforms",
+ "PlatformPageHelpMsg": "The platform categorizes assets, such as Windows, Linux, network devices, etc. Configuration settings, such as protocols, gateways, etc., can also be specified on the platform to determine whether certain features are enabled on assets.",
+ "PlatformProtocolConfig": "Platform Protocol Configuration",
+ "PlatformUpdate": "Update the Platform",
+ "PlaybookDetail": "Playbook Details",
+ "PlaybookManage": "Playbook",
+ "PlaybookUpdate": "Update the Playbook",
+ "PleaseAgreeToTheTerms": "Please Agree to the Terms",
+ "PleaseSelect": "Please select",
+ "PolicyName": "Policy Name",
+ "Port": "Port",
+ "Ports": "Port",
+ "Priority": "Priority",
+ "PrivateCloud": "Private Cloud",
+ "PrivateKey": "Private Key",
+ "Privileged": "Privileged",
+ "PrivilegedFirst": "Privileged First",
+ "PrivilegedOnly": "Privileged Accounts Only",
+ "PrivilegedTemplate": "Privileged",
+ "Product": "Product",
+ "Profile": "Profile",
+ "ProfileSetting": "Profile Info",
+ "Project": "Project Name",
+ "Prompt": "Prompt",
+ "Proportion": "Proportion",
+ "ProportionOfAssetTypes": "Asset type proportion",
+ "Protocol": "Protocol",
+ "Protocols": "Protocols",
+ "Proxy": "Agent",
+ "PublicCloud": "Public Cloud",
+ "PublicKey": "Public Key",
+ "Publish": "Publish",
+ "PublishAllApplets": "Publish All Applications",
+ "PublishStatus": "Release Status",
+ "Push": "Push",
+ "PushAccount": "Push Account",
+ "PushAccounts": "Push Accounts",
+ "PushAccountsHelpText": "Pushing the account to the target asset allows for configuring different push methods for assets on different platforms.",
+ "PushParams": "Push Parameters",
+ "Qcloud": "Tencent Cloud",
+ "QcloudLighthouse": "Tencent Cloud (Lightweight Application Server)",
+ "QingYunPrivateCloud": "QingYun Private Cloud",
+ "Queue": "Queue",
+ "QuickAdd": "Quick Add",
+ "QuickJob": "AdHoc",
+ "QuickUpdate": "Quick update",
+ "Radius": "Radius",
+ "Ranking": "Ranking",
+ "RazorNotSupport": "RDP Client Session, Monitoring Not Supported",
+ "ReLogin": "Log in Again",
+ "ReLoginTitle": "Current Third-party Login User (CAS/SAML), Not Bound to MFA and Does Not Support Password Verification, Please Log in Again.",
+ "RealTimeData": "Real-Time",
+ "Reason": "Reason",
+ "Receivers": "Receiver",
+ "RecentLogin": "Recent login",
+ "RecentSession": "Recent sessions",
+ "RecentlyUsed": "Recently",
+ "RecipientHelpText": "If both recipient A and B are set, the account's key will be split into two parts",
+ "RecipientServer": "Receiving Server",
+ "Reconnect": "Reconnect",
+ "Refresh": "Refresh",
+ "RefreshHardware": "Refresh hardware info",
+ "Regex": "Regular Expression",
+ "Region": "Region",
+ "RegularlyPerform": "Periodic Execution",
+ "Reject": "Refuse",
+ "Rejected": "Rejected",
+ "ReleasedCount": "Released",
+ "RelevantApp": "Application",
+ "RelevantAsset": "Assets",
+ "RelevantAssignees": "Related Recipient",
+ "RelevantCommand": "Command",
+ "RelevantSystemUser": "System User",
+ "RemoteAddr": "Remote Address",
+ "Remove": "Remove",
+ "RemoveAssetFromNode": "Remove Asset From Node",
+ "RemoveSelected": "Remove selected",
+ "RemoveSuccessMsg": "Successfully removed",
+ "Rename": "Rename",
+ "RenameNode": "Rename Nodes",
+ "ReplaceNodeAssetsAdminUserWithThis": "Replace Asset Admin",
+ "Replay": "Playback",
+ "ReplaySession": "Session Replay",
+ "ReplayStorage": "Object Storage",
+ "ReplayStorageCreateUpdateHelpMessage": "Notice: Current SFTP storage only supports account backup, video storage is not yet supported.",
+ "ReplayStorageUpdate": "Update the object storage",
+ "Reply": "Reply",
+ "RequestAssetPerm": "Request asset authorization",
+ "RequestPerm": "Authorization Request",
+ "RequestTickets": "New ticket",
+ "RequiredAssetOrNode": "Please Select at Least One Asset or Node",
+ "RequiredContent": "Please Input Command",
+ "RequiredEntryFile": "This file acts as the entry point for running and must be present",
+ "RequiredRunas": "Please Enter the Execution User",
+ "RequiredSystemUserErrMsg": "Please Select Account",
+ "RequiredUploadFile": "Please upload the file!",
+ "Reset": "Reset",
+ "ResetAndDownloadSSHKey": "Reset and Download Key",
+ "ResetMFA": "Reset MFA",
+ "ResetMFAWarningMsg": "Are you sure you want to reset the user's MFA?",
+ "ResetMFAdSuccessMsg": "MFA Reset Successful, User Can Reset MFA Again",
+ "ResetPassword": "Reset Password",
+ "ResetPasswordNextLogin": "Password must be changed during next log in",
+ "ResetPasswordSuccessMsg": "Reset Password Message Sent to User",
+ "ResetPasswordWarningMsg": "Are you sure you want to send the password reset email for the user",
+ "ResetPublicKeyAndDownload": "Reset and Download SSH Key",
+ "ResetSSHKey": "Reset SSH key",
+ "ResetSSHKeySuccessMsg": "Email Task Submitted, User Will Receive a Key Reset Email Shortly",
+ "ResetSSHKeyWarningMsg": "Are you sure you want to send a reset SSH Key email to the user?",
+ "Resource": "Resources",
+ "ResourceType": "Resource Type",
+ "RestoreButton": "Restore",
+ "RestoreDefault": "Reset to default",
+ "RestoreDialogMessage": "Are you sure you want to restore to default initialization?",
+ "RestoreDialogTitle": "Do you confirm?",
+ "Result": "Result",
+ "Resume": "Recovery",
+ "ResumeTaskSendSuccessMsg": "Recovery Task Issued, Please Refresh Later",
+ "Retry": "Retry",
+ "ConnectAssets": "Connect",
+ "Reviewer": "Approvers",
+ "Role": "Role",
+ "RoleCreate": "Create a role",
+ "RoleDetail": "Role Details",
+ "RoleInfo": "Role Information",
+ "RoleList": "Roles",
+ "RoleUpdate": "Update the Role",
+ "RoleUsers": "Authorized Users",
+ "Rows": "Row",
+ "Rule": "Condition",
+ "RuleCount": "Condition Quantity",
+ "RuleDetail": "Rule Details",
+ "RuleRelation": "Relationship Conditions",
+ "RuleRelationHelpTip": "And: the action will be executed only when all conditions are met; Or: the action will be executed as long as one condition is met",
+ "RuleSetting": "Condition Settings",
+ "Rules": "Rules",
+ "Run": "Execute",
+ "RunAgain": "Execute Again",
+ "RunAs": "Run User",
+ "RunCommand": "Run Command",
+ "RunJob": "Run Job",
+ "RunSucceed": "Task Successfully Completed",
+ "RunTaskManually": "Manually Execute",
+ "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.",
+ "RunningPath": "Running Path",
+ "RunningPathHelpText": "Enter the run path of the script, this setting only applies to shell scripts",
+ "RunningTimes": "Last 5 Run Times",
+ "SCP": "Sangfor Cloud Platform",
+ "SMS": "Message",
+ "SMSProvider": "SMS Service Provider",
+ "SMTP": "Email Server",
+ "SSHKey": "SSH Key",
+ "SSHKeyOfProfileSSHUpdatePage": "Copy Your Public Key Here",
+ "SSHKeySetting": "SSH Key",
+ "SSHPort": "SSH Port",
+ "SSHSecretKey": "SSH Key",
+ "SafeCommand": "Secure Command",
+ "SameAccount": "Same account",
+ "SameAccountTip": "Accounts with the Same Username as Authorized Users",
+ "SameTypeAccountTip": "An account with the same username and key type already exists",
+ "Saturday": "Sat",
+ "Save": "Save",
+ "SaveAdhoc": "Save Command",
+ "SaveAndAddAnother": "Save & Continue",
+ "SaveCommand": "Save Command",
+ "SaveCommandSuccess": "Command Saved Successfully",
+ "SaveSetting": "Synchronization Settings",
+ "SaveSuccess": "Save Successful",
+ "SaveSuccessContinueMsg": "Creation Successful, you can continue to add content after updating.",
+ "ScrollToBottom": "Scroll to the Bottom",
+ "ScrollToTop": "Scroll to Top",
+ "Search": "Search",
+ "SearchAncestorNodePerm": "Search for authorizations simultaneously on the current node and ancestor nodes",
+ "Secret": "Password",
+ "SecretKey": "Key",
+ "SecretKeyStrategy": "Password Policy",
+ "Secure": "Security",
+ "Security": "Security",
+ "Select": "Select",
+ "SelectAdhoc": "Select Command",
+ "SelectAll": "Select all",
+ "SelectAtLeastOneAssetOrNodeErrMsg": "Select at Least One Asset or Node",
+ "SelectAttrs": "Select attributes",
+ "SelectByAttr": "Attribute Filter",
+ "SelectFile": "Select File",
+ "SelectKeyOrCreateNew": "Select Tag Key or Create New One",
+ "SelectLabelFilter": "Select label for search",
+ "SelectPlatforms": "Select Platform",
+ "SelectProperties": "Attributes",
+ "SelectResource": "Select Resources",
+ "SelectTemplate": "Select Template",
+ "SelectValueOrCreateNew": "Select Tag Value or Create New One",
+ "Selected": "Selected",
+ "Selection": "Selection",
+ "Selector": "Selector",
+ "Send": "Send",
+ "SendVerificationCode": "Send Verification Code",
+ "SerialNumber": "Serial Number",
+ "Server": "Server",
+ "ServerAccountKey": "Service Account Key",
+ "ServerError": "Server Error",
+ "ServerTime": "Server Time",
+ "Session": "Session",
+ "SessionConnectTrend": "Session connection trends",
+ "SessionData": "Session data",
+ "SessionDetail": "Session Details",
+ "SessionID": "Session ID",
+ "SessionCommands": "Session Commands",
+ "SessionList": "Asset Sessions",
+ "SessionMonitor": "Monitor",
+ "SessionOffline": "Historical Sessions",
+ "SessionOnline": "Online Sessions",
+ "SessionSecurity": "Asset Session",
+ "SessionState": "Session Status",
+ "SessionTerminate": "Session Termination",
+ "SessionTrend": "Session trends",
+ "Sessions": "Sessions",
+ "SessionsAudit": "Sessions",
+ "SessionsNum": "Sessions",
+ "Set": "Configured",
+ "SetDingTalk": "DingTalk OAuth",
+ "SetFailed": "Setting Failed",
+ "SetFeiShu": "Set Feishu Authentication",
+ "SetMFA": "Multi-factor Auth",
+ "SetSlack": "Slack OAuth",
+ "SetStatus": "Status Setting",
+ "SetSuccess": "Successfully Set",
+ "SetToDefault": "Set as Default",
+ "SetToDefaultStorage": "Set as Default Storage",
+ "SetWeCom": "WeCom OAuth",
+ "Setting": "Setting",
+ "SettingInEndpointHelpText": "Configure service address and port in System Settings / Component Settings / Server Endpoints",
+ "Settings": "System Settings",
+ "Show": "Display",
+ "ShowAssetAllChildrenNode": "Show All Sub-nodes Assets",
+ "ShowAssetOnlyCurrentNode": "Only Show Current Node Assets",
+ "ShowNodeInfo": "Show Node Details",
+ "SignChannelNum": "Channel Signature",
+ "SiteMessage": "Notifications",
+ "SiteMessageList": "Notifications",
+ "Skip": "Ignore Current Asset",
+ "Skipped": "Skipped",
+ "Slack": "Slack",
+ "Source": "Source",
+ "SourceIP": "Source address",
+ "SourcePort": "Source port",
+ "Spec": "Specific",
+ "SpecAccount": "Specified accounts",
+ "SpecAccountTip": "Specify username to choose authorized account",
+ "SpecialSymbol": "Special Char",
+ "SpecificInfo": "Special Information",
+ "SshKeyFingerprint": "SSH Fingerprint",
+ "Startswith": "Starts with...",
+ "State": "Status",
+ "StateClosed": "Is Closed",
+ "Status": "Status",
+ "StatusGreen": "Recently in Good Condition",
+ "StatusRed": "Last Task Execution Failed",
+ "StatusYellow": "There have been recent failures",
+ "Stop": "Stop",
+ "Storage": "Storage",
+ "StorageSetting": "Storage",
+ "Strategy": "Strategy",
+ "StrategyCreate": "Create a Policy",
+ "StrategyDetail": "Policy Details",
+ "StrategyHelpTip": "Identify the unique attributes of assets (such as platforms) based on priority of strategies; when an asset's attribute (like nodes) can be configured to multiple, all Actions of the strategies will be executed.",
+ "StrategyList": "Policy List",
+ "StrategyUpdate": "Update the Policy",
+ "SuEnabled": "Enable switch",
+ "SuFrom": "Switch From",
+ "Submit": "Submit",
+ "Success": "Success",
+ "SuccessAsset": "Successful Assets",
+ "SuccessfulOperation": "Action successful",
+ "AddInDetailText": "After successful creation or update, add to the details",
+ "Summary(success/total)": " Overview( Successful/Total )",
+ "Sunday": "Sun",
+ "SuperAdmin": "Super Administrator",
+ "SuperOrgAdmin": "Super Admin + Organization Admin",
+ "Support": "Support",
+ "SupportedProtocol": "Protocols",
+ "SupportedProtocolHelpText": "Set supported protocols for the asset, you can modify the custom configurations, such as SFTP directory, RDP AD domain, etc., by clicking on the set button",
+ "Sync": "Sync",
+ "SyncDelete": "Sync Deletion",
+ "SyncInstanceTaskCreate": "Create a Sync Task",
+ "SyncInstanceTaskDetail": "Sync Task Details",
+ "SyncInstanceTaskHistoryAssetList": "Synchronize instance list",
+ "SyncInstanceTaskHistoryList": "Synchronization History List",
+ "SyncInstanceTaskList": "Synchronization Task List",
+ "SyncInstanceTaskUpdate": "Update the Sync Task",
+ "SyncProtocolToAsset": "Protocols to Assets",
+ "SyncSetting": "Sync Settings",
+ "SyncStrategy": "Sync Policy",
+ "SyncSuccessMsg": "Sync Succeeded",
+ "SyncTask": "Sync Tasks",
+ "SyncUpdateAccountInfo": "Sync new secret to accounts",
+ "SyncUser": "Sync Users",
+ "SyncedCount": "Synchronized",
+ "SystemError": "System Error",
+ "SystemRole": "System Roles",
+ "SystemRoleHelpMsg": "System roles are roles that apply universally across all organizations within the platform. These roles allow you to define specific permissions and access levels for users across the entire system. Changes made to system roles will affect all organizations using the platform.",
+ "SystemRoles": "System Roles",
+ "SystemSetting": "System Settings",
+ "SystemTools": "System Tools",
+ "TableColSetting": "Select visible attribute columns",
+ "TableSetting": "Table preference",
+ "Target": "Target",
+ "TargetResources": "Target Resource",
+ "Task": "Task",
+ "TaskDetail": "Task Details",
+ "TaskDone": "Task Finished",
+ "TaskID": "Task ID",
+ "TaskList": "System Tasks",
+ "TaskMonitor": "Monitoring",
+ "TechnologyConsult": "Technical Consultation",
+ "TempPassword": "The temporary password is valid for 300 seconds and becomes invalid immediately after use",
+ "TemplateAdd": "Add from template",
+ "TemplateCreate": "Create a Template",
+ "TemplateHelpText": "When selecting a template to add, accounts that do not exist under the asset will be automatically created and pushed",
+ "TemplateManagement": "Templates",
+ "TencentCloud": "Tencent Cloud",
+ "Terminal": "Components",
+ "TerminalDetail": "Terminal Details",
+ "TerminalUpdate": "Update the Terminal",
+ "TerminalUpdateStorage": "Update the Terminal Storage",
+ "Terminate": "Termination",
+ "TerminateTaskSendSuccessMsg": "Task termination has been issued, please refresh and check later",
+ "TermsAndConditions": "Terms and Conditions",
+ "Test": "Test",
+ "TestAccountConnective": "Test Connectivity",
+ "TestAssetsConnective": "Test Connectivity",
+ "TestConnection": "Test Connection",
+ "TestGatewayHelpMessage": "If NAT port mapping is used, please set it to the real port listened to by SSH",
+ "TestGatewayTestConnection": "Test Connect to Gateway",
+ "TestLdapLoginTitle": "Test LDAP user login",
+ "TestNodeAssetConnectivity": "Test Connectivity of Asset Nodes",
+ "TestPortErrorMsg": "Port Error, Please Re-enter",
+ "TestSuccessMsg": "Test Succeeded",
+ "Thursday": "Thu",
+ "Ticket": "Ticket",
+ "TicketDetail": "Work Order Details",
+ "TicketFlow": "Work Order Flow",
+ "TicketFlowCreate": "Create a Approval Flow",
+ "TicketFlowUpdate": "Update the Approval Flow",
+ "Tickets": "Tickets",
+ "Time": "Time",
+ "TimeDelta": "Time Cost",
+ "TimeExpression": "Time Expression",
+ "Timeout": "Timeout",
+ "TimeoutHelpText": "When this value is -1, no timeout is specified.",
+ "Timer": "Timer",
+ "Title": "Title",
+ "To": "To",
+ "Today": "Today",
+ "TodayFailedConnections": "Failed session today",
+ "Token": "Token",
+ "Total": "Total",
+ "TotalJobFailed": "Failed execution actions",
+ "TotalJobLog": "Total job executions",
+ "TotalJobRunning": "Running jobs",
+ "Transfer": "Transfer",
+ "Tuesday": "Tue",
+ "TwoAssignee": "Subscribe to Authorization ID",
+ "TwoAssigneeType": "Secondary Recipient Type",
+ "Type": "Type",
+ "TypeTree": "Type Tree",
+ "Types": "Type",
+ "UCloud": "UCloud UHost",
+ "UnSyncCount": "Not Synced",
+ "Unbind": "Unlink",
+ "UnbindHelpText": "Local users are the source of this authentication and cannot be unbound",
+ "Unblock": "Unlock",
+ "UnblockSuccessMsg": "Unlock Successful",
+ "UnblockUser": "Unlock User",
+ "UniqueError": "Only One of the Following Properties Can Be Set",
+ "UnlockSuccessMsg": "Unlock Successful",
+ "UnselectedOrg": "No Organization selected",
+ "UnselectedUser": "No User selected",
+ "UpDownload": "Upload & Download",
+ "Update": "Update",
+ "UpdateAccount": "Update the Account",
+ "UpdateAccountTemplate": "Update the Account Template",
+ "UpdateAssetDetail": "Configure more information",
+ "UpdateAssetUserToken": "Update Account Authentication Information",
+ "UpdateEndpoint": "Update the Endpoint",
+ "UpdateEndpointRule": "Update the Endpoint Rule",
+ "UpdateErrorMsg": "Update Failed",
+ "UpdateNodeAssetHardwareInfo": "Update Node Assets Hardware Information",
+ "UpdateSSHKey": "Change SSH Public Key",
+ "UpdateSelected": "Update selected",
+ "UpdateSuccessMsg": "Update Successful",
+ "Updated": "Updated",
+ "Upload": "Upload",
+ "UploadCsvLth10MHelpText": "Only csv/xlsx can be uploaded, and no more than 10M",
+ "UploadDir": "Upload path",
+ "UploadFileLthHelpText": "Smaller than {limit}MB supported",
+ "UploadPlaybook": "Upload Playbook",
+ "UploadSucceed": "Upload Succeeded",
+ "UploadZipTips": "Please upload a file in zip format",
+ "Uploading": "Uploading File",
+ "Uppercase": "Uppercase",
+ "UseProtocol": "User Agreement",
+ "UseSSL": "Use SSL/TLS",
+ "User": "User",
+ "UserAclLists": "Login ACLs",
+ "UserAssetActivity": "User/Asset activity",
+ "UserCreate": "Create a User",
+ "UserData": "User",
+ "UserDetail": "User Details",
+ "UserGroupCreate": "Create a User Group",
+ "UserGroupDetail": "User Group Details",
+ "UserGroupList": "Groups",
+ "UserGroupUpdate": "Update the User Group",
+ "UserGroups": "User Groups",
+ "UserInformation": "User Info",
+ "UserList": "Users",
+ "UserLoginACLHelpMsg": "When logging into the system, the user's login IP and time range can be audited to determine whether they are allowed to log into the system (effective globally)",
+ "UserLoginAclCreate": "Create a User Login Control",
+ "UserLoginAclDetail": "User Login Control Details",
+ "UserLoginAclList": "User Login",
+ "UserLoginAclUpdate": "Update the User Login Control",
+ "UserLoginLimit": "User Restriction",
+ "IpDomain": "Address",
+ "UserLoginTrend": "Account Login Trend",
+ "UserProfile": "Profile",
+ "UserSession": "Asset Sessions",
+ "UserSetting": "Preference",
+ "UserSwitchFrom": "Switch from",
+ "UserUpdate": "Update the User",
+ "Username": "Username",
+ "UsernamePlaceholder": "Please Enter Username",
+ "Users": "User",
+ "UsersAmount": "User",
+ "UsersAndUserGroups": "User/User Group",
+ "UsersTotal": "Total accounts",
+ "Valid": "Valid",
+ "Variable": "Variable",
+ "VariableHelpText": "You Can Use {{ key }} to Read Built-in Variables in Commands",
+ "VaultHelpText": "1. For security reasons, Vault storage must be enabled in the configuration file.
2. After enabled, fill in other configurations, and perform tests.
3. Carry out data synchronization, which is one-way, only syncing from the local database to the distant Vault, once synchronization is completed, the local database will no longer store passwords, please back up your data.
4. After modifying Vault configuration the second time, you need to restart the service.",
+ "VerificationCodeSent": "Verification code has been sent",
+ "VerifySignTmpl": "SMS Template",
+ "Version": "Version",
+ "View": "View",
+ "ViewBlockedIPSHelpText": "View List of Locked IPs",
+ "ViewMore": "View More",
+ "ViewPerm": "View",
+ "ViewSecret": "View Ciphertext",
+ "VirtualAccountDetail": "Details of virtual account",
+ "VirtualAccountHelpMsg": "Virtual accounts are specialized accounts with specific purposes when connecting assets.",
+ "VirtualAccountUpdate": "Virtual Account Update",
+ "VirtualAccounts": "Virtual Accounts",
+ "VirtualApp": "Virtual App",
+ "VirtualAppDetail": "Virtual App Details",
+ "VirtualApps": "Virtual App",
+ "WeCom": "WeCom",
+ "WeComTest": "Test",
+ "WebCreate": "Create a Asset - Web",
+ "WebHelpMessage": "Web type assets depend on remote applications, please go to system settings and configure in remote applications",
+ "WebSocketDisconnect": "WebSocket Disconnected",
+ "WebTerminal": "Web Terminal",
+ "WebUpdate": "Update the Asset - Web",
+ "Wednesday": "Wed",
+ "Week": "Week",
+ "WeekAdd": "New this week",
+ "WeekOrTime": "Day/Time",
+ "WildcardsAllowed": "Allowed Wildcards",
+ "WindowsPushHelpText": "Windows assets temporarily do not support key push",
+ "WordSep": " ",
+ "Workbench": "Workbench",
+ "Workspace": "Workspace",
+ "Yes": "Yes",
+ "ZStack": "ZStack"
+}
diff --git a/apps/i18n/lina/zh.json b/apps/i18n/lina/zh.json
new file mode 100644
index 000000000..0151b73af
--- /dev/null
+++ b/apps/i18n/lina/zh.json
@@ -0,0 +1,1219 @@
+{
+ "APIKey": "API Key",
+ "About": "关于",
+ "Accept": "同意",
+ "AccessIP": "IP 白名单",
+ "AccessKey": "访问密钥",
+ "Account": "账号信息",
+ "AccountBackup": "账号备份",
+ "AccountChangeSecret": "账号改密",
+ "AccountDeleteConfirmMsg": "删除账号,是否继续?",
+ "AccountExportTips": "导出信息中包含账号密文涉及敏感信息,导出的格式为一个加密的zip文件(若没有设置加密密码,请前往个人信息中设置文件加密密码)。",
+ "AccountGatherList": "收集任务",
+ "AccountGatherTaskList": "账号收集",
+ "AccountList": "云账号",
+ "AccountPolicy": "账号策略",
+ "AccountPolicyHelpText": "创建时对于不符合要求的账号,如:密钥类型不合规,唯一键约束,可选择以上策略。",
+ "AccountPushExecutionList": "执行列表",
+ "AccountPushList": "账号推送",
+ "AccountStorage": "账号存储",
+ "AccountTemplate": "账号模版",
+ "AccountTemplates": "账号模版",
+ "AccountTemplateList": "模版列表",
+ "ACLs": "访问控制",
+ "FileExplorer": "文件浏览",
+ "SessionCommands": "会话命令",
+ "AccountTemplateUpdateSecretHelpText": "账号列表展示通过模版创建的账号。更新密文时,会更新通过模版所创建账号的密文。",
+ "Accounts": "账号管理",
+ "Action": "动作",
+ "ActionCount": "动作数量",
+ "ActionSetting": "动作设置",
+ "Actions": "动作",
+ "ActionsTips": "各个权限作用协议不尽相同,点击权限后面的图标查看",
+ "Activate": "激活",
+ "Active": "激活中",
+ "ActiveAsset": "近期被登录过",
+ "ActiveAssetRanking": "登录资产排名",
+ "ActiveUser": "近期登录过",
+ "Activity": "活动",
+ "Add": "新增",
+ "AddAccountResult": "账号批量添加结果",
+ "AddAllMembersWarningMsg": "你确定要添加全部成员?",
+ "AddAsset": "添加资产",
+ "AddAssetToNode": "添加资产到节点",
+ "AddAssetToThisPermission": "添加资产",
+ "AddNode": "添加节点",
+ "AddNodeToThisPermission": "添加节点",
+ "AddPassKey": "添加 Passkey(通行密钥)",
+ "AddRolePermissions": "创建/更新成功后,详情中添加权限",
+ "AddSuccessMsg": "添加成功",
+ "AddUserGroupToThisPermission": "添加用户组",
+ "AddUserToThisPermission": "添加用户",
+ "Address": "地址",
+ "Addressee": "收件人",
+ "AdhocDetail": "命令详情",
+ "AdhocManage": "命令管理",
+ "AdhocUpdate": "更新命令",
+ "Advanced": "高级设置",
+ "AfterChange": "变更后",
+ "AjaxError404": "404 请求错误",
+ "AlibabaCloud": "阿里云",
+ "Aliyun": "阿里云",
+ "All": "全部",
+ "AllAccountTip": "资产上已添加的所有账号",
+ "AllAccounts": "所有账号",
+ "AllClickRead": "全部已读",
+ "AllMembers": "全部成员",
+ "AllowInvalidCert": "忽略证书检查",
+ "Announcement": "公告",
+ "AnonymousAccount": "匿名账号",
+ "AnonymousAccountTip": "连接资产时不使用用户名和密码,仅支持 web类型 和 自定义类型 的资产",
+ "ApiKey": "API Key",
+ "ApiKeyList": "使用 Api key 签名请求头进行认证,每个请求的头部是不一样的, 相对于 Token 方式,更加安全,请查阅文档使用;
为降低泄露风险,Secret 仅在生成时可以查看, 每个用户最多支持创建 10 个",
+ "ApiKeyWarning": "为降低 AccessKey 泄露的风险,只在创建时提供 Secret,后续不可再进行查询,请妥善保存。",
+ "AppEndpoint": "应用接入地址",
+ "AppOps": "任务中心",
+ "AppProvider": "应用提供者",
+ "AppProviderDetail": "应用提供者详情",
+ "AppletDetail": "远程应用",
+ "AppletHelpText": "在上传过程中,如果应用不存在,则创建该应用;如果已存在,则进行应用更新。",
+ "AppletHostCreate": "添加远程应用发布机",
+ "AppletHostDetail": "远程应用发布机详情",
+ "AppletHostDomainHelpText": "这里的网域属于 System 组织",
+ "AppletHostSelectHelpMessage": "连接资产时,应用发布机选择是随机的(但优先选择上次使用的),如果想为某个资产固定发布机,可以指定标签 <发布机:发布机名称> 或 ;
连接该发布机选择账号时,以下情况会选择用户的 同名账号 或 专有账号(js开头),否则使用公用账号(jms开头):
1. 发布机和应用都支持并发;
2. 发布机支持并发,应用不支持并发,当前应用没有使用专有账号;
3. 发布机不支持并发,应用支持并发或不支持,没有任一应用使用专有账号;
注意: 应用支不支持并发是开发者决定,主机支不支持是发布机配置中的 单用户单会话决定",
+ "AppletHostUpdate": "更新远程应用发布机",
+ "AppletHosts": "应用发布机",
+ "Applets": "远程应用",
+ "Applicant": "申请人",
+ "Applications": "应用管理",
+ "ApplyAsset": "申请资产",
+ "ApplyFromCMDFilterRule": "命令过滤规则",
+ "ApplyFromSession": "会话",
+ "ApplyInfo": "申请信息",
+ "ApplyRunAsset": "申请运行的资产",
+ "ApplyRunCommand": "申请运行的命令",
+ "ApplyRunUser": "申请运行的用户",
+ "Appoint": "指定",
+ "ApprovaLevel": "审批信息",
+ "ApprovalLevel": "审批级别",
+ "ApprovalProcess": "审批流程",
+ "Approved": "已同意",
+ "ApproverNumbers": "审批人数量",
+ "ApsaraStack": "阿里云专有云",
+ "Asset": "资产",
+ "AssetAccount": "账号列表",
+ "AssetAccountDetail": "账号详情",
+ "AssetAclCreate": "创建资产登录规则",
+ "AssetAclDetail": "资产登录规则详情",
+ "AssetAclList": "资产登录",
+ "AssetAclUpdate": "更新资产登录规则",
+ "AssetAddress": "资产(IP/主机名)",
+ "AssetAmount": "资产数量",
+ "AssetAndNode": "资产/节点",
+ "AssetBulkUpdateTips": "网络设备、云服务、web,不支持批量更新网域",
+ "AssetChangeSecretCreate": "创建账号改密",
+ "AssetChangeSecretUpdate": "更新账号改密",
+ "AssetData": "资产数据",
+ "AssetDetail": "资产详情",
+ "AssetList": "资产列表",
+ "AssetListHelpMessage": "左侧是资产树,右击可以新建、删除、更改树节点,授权资产也是以节点方式组织的,右侧是属于该节点下的资产\n",
+ "AssetLoginACLHelpMsg": "登录资产时,可以根据用户的登录 IP 和时间段进行审核,判断是否可以登录资产",
+ "AssetName": "资产名称",
+ "AssetPermission": "资产授权",
+ "AssetPermissionCreate": "创建资产授权规则",
+ "AssetPermissionDetail": "资产授权详情",
+ "AssetPermissionHelpMsg": "资产授权允许您选择用户和资产,将资产授权给用户以便访问。一旦授权完成,用户便可便捷地浏览这些资产。此外,您还可以设置特定的权限位,以进一步定义用户对资产的权限范围。",
+ "AssetPermissionRules": "资产授权规则",
+ "AssetPermissionUpdate": "更新资产授权规则",
+ "AssetProtocolHelpText": "资产支持的协议受平台限制,点击设置按钮可以查看协议的设置。 如果需要更新,请更新平台",
+ "AssetTree": "资产树",
+ "Assets": "资产管理",
+ "AssetsAmount": "资产数量",
+ "AssetsTotal": "资产总数",
+ "AssignedInfo": "审批信息",
+ "Assignee": "处理人",
+ "Assignees": "待处理人",
+ "AttrName": "属性名",
+ "AttrValue": "属性值",
+ "Audits": "审计台",
+ "Auth": "认证设置",
+ "AuthLimit": "登录限制",
+ "AuthSAMLCertHelpText": "上传证书密钥后保存, 然后查看 SP Metadata",
+ "AuthSAMLKeyHelpText": "SP 证书和密钥 是用来和 IDP 加密通信的",
+ "AuthSaml2UserAttrMapHelpText": "左侧的键为 SAML2 用户属性,右侧的值为认证平台用户属性",
+ "AuthSecurity": "认证安全",
+ "AuthSetting": "认证设置",
+ "AuthSettings": "认证配置",
+ "AuthUserAttrMapHelpText": "左侧的键为 JumpServer 用户属性,右侧的值为认证平台用户属性",
+ "Authentication": "认证",
+ "AutoPush": "自动推送",
+ "Automations": "自动化",
+ "AverageTimeCost": "平均花费时间",
+ "AwaitingMyApproval": "待我审批",
+ "Azure": "Azure(中国)",
+ "Backup": "备份",
+ "BadConflictErrorMsg": "正在刷新中,请稍后再试",
+ "BadRequestErrorMsg": "请求错误,请检查填写内容",
+ "BadRoleErrorMsg": "请求错误,无该操作权限",
+ "BaiduCloud": "百度云",
+ "BasePort": "监听端口",
+ "Basic": "基本设置",
+ "BasicInfo": "基本信息",
+ "BasicSetting": "基本设置",
+ "BatchClearErrorMsg": "批量清除失败:",
+ "BatchConsent": "批量同意",
+ "BatchDelete": "批量删除",
+ "BatchDeleteErrorMsg": "批量删除失败",
+ "BatchDeleteSuccessMsg": "批量删除成功",
+ "BatchDeployment": "批量部署",
+ "BatchOffline": "批量下线",
+ "BatchProcessing": "批量处理(选中 {Number} 项)",
+ "BatchReject": "批量拒绝",
+ "BatchSync": "批量同步",
+ "BatchSyncDelete": "批量同步删除",
+ "BatchSyncErrorMsg": "批量同步失败: ",
+ "BatchTest": "批量测试",
+ "BatchTransfer": "批量传输",
+ "BatchUnblock": "批量解锁",
+ "BatchUpdate": "批量更新",
+ "BatchUpdatePlatformHelpText": "只有资产的原平台类型与所选平台类型相同时才会进行更新,若更新前后的平台类型不同则不会更新。",
+ "BeforeChange": "变更前",
+ "Beian": "备案",
+ "BelongAll": "同时包含",
+ "BelongTo": "任意包含",
+ "Bind": "绑定",
+ "BindLabel": "关联标签",
+ "BindResource": "关联资源",
+ "BindSuccess": "绑定成功",
+ "BlockedIPS": "已锁定的 IP",
+ "BuiltinVariable": "内置变量",
+ "CACertificate": "CA 证书",
+ "CAS": "CAS",
+ "CMPP2": "CMPP v2.0",
+ "CTYunPrivate": "天翼私有云",
+ "CalculationResults": "cron 表达式错误",
+ "CanDragSelect": "可拖动鼠标选择时间段",
+ "Cancel": "取消",
+ "CancelCollection": "取消收藏",
+ "CannotAccess": "无法访问当前页面",
+ "Category": "类别",
+ "CeleryTaskLog": "Celery任务日志",
+ "Certificate": "证书",
+ "CertificateKey": "客户端密钥",
+ "ChangeField": "变更字段",
+ "ChangeOrganization": "更改组织",
+ "ChangePassword": "更新密码",
+ "ChangeReceiver": "修改消息接收人",
+ "ChangeSecretParams": "改密参数",
+ "ChangeViewHelpText": "点击切换不同视图",
+ "Chat": "聊天",
+ "ChatAI": "智能问答",
+ "ChatHello": "你好!我能为你提供什么帮助?",
+ "ChdirHelpText": "默认执行目录为执行用户的 home 目录",
+ "CheckAssetsAmount": "校对资产数量",
+ "CheckViewAcceptor": "点击查看受理人",
+ "CleanHelpText": "定期清理任务会在 每天凌晨 2 点执行, 清理后的数据将无法恢复",
+ "Cleaning": "定期清理",
+ "Clear": "清除",
+ "ClearScreen": "清屏",
+ "ClearSecret": "清除密文",
+ "ClearSelection": "清空选择",
+ "ClearSuccessMsg": "清除成功",
+ "ClickCopy": "点击复制",
+ "ClientCertificate": "客户端证书",
+ "ClipboardCopyPaste": "剪贴板复制粘贴",
+ "Clone": "克隆",
+ "CloneFrom": "副本",
+ "Close": "关闭",
+ "CloseConfirm": "确认关闭",
+ "CloseConfirmMessage": "文件发生变化,是否保存?",
+ "CloseStatus": "已完成",
+ "Closed": "已完成",
+ "CloudCreate": "创建资产-云平台",
+ "CloudSource": "同步源",
+ "CloudSync": "云同步",
+ "CloudUpdate": "更新资产-云平台",
+ "Cluster": "集群",
+ "CollectionSucceed": "收藏成功",
+ "Command": "命令",
+ "CommandConfirm": "命令复核",
+ "CommandFilterACL": "命令过滤",
+ "CommandFilterACLHelpMsg": "通过命令过滤,您可以控制命令是否可以发送到资产上。根据您设定的规则,某些命令可以被放行,而另一些命令则被禁止。",
+ "AssetLoginACLHelpText": "登录资产时,可以根据用户的登录 IP 和时间段进行审核,判断是否可以登录资产",
+ "ConnectMethodACLHelpText": "通过连接方式过滤,您可以控制用户是否可以使用某种连接方式登录到资产上。根据您设定的规则,某些连接方式可以被放行,而另一些连接方式则被禁止。",
+ "UserLoginACLHelpText": "登录系统时,可以根据用户的登录 IP 和时间段进行审核,判断是否可以登录",
+ "CommandFilterAclCreate": "创建命令过滤规则",
+ "CommandFilterAclDetail": "命令过滤规则详情",
+ "CommandFilterAclList": "命令过滤",
+ "CommandFilterAclUpdate": "更新命令过滤规则",
+ "CommandFilterRuleContentHelpText": "每行一个命令",
+ "CommandFilterRules": "命令过滤器规则",
+ "CommandGroup": "命令组",
+ "CommandGroupCreate": "创建命令组",
+ "CommandGroupDetail": "命令组详情",
+ "CommandGroupList": "命令组",
+ "CommandGroupUpdate": "更新命令组",
+ "CommandStorage": "命令存储",
+ "CommandStorageUpdate": "更新命令存储",
+ "Commands": "命令记录",
+ "Comment": "备注",
+ "CommentHelpText": "注意:备注信息会在 Luna 页面的用户授权资产树中进行悬停显示,普通用户可以查看,请不要填写敏感信息。",
+ "CommunityEdition": "社区版",
+ "Component": "组件",
+ "ComponentMonitor": "组件监控",
+ "ConceptContent": "我想让你像一个 Python 解释器一样行事。我将给你 Python 代码,你将执行它。不要提供任何解释。除了代码的输出,不要用任何东西来回应。",
+ "ConceptTitle": "🤔 Python 解释器 ",
+ "Config": "配置",
+ "Confirm": "确认",
+ "ConfirmPassword": "确认密码",
+ "ConnectMethod": "连接方式",
+ "ConnectMethodACLHelpMsg": "通过连接方式过滤,您可以控制用户是否可以使用某种连接方式登录到资产上。根据您设定的规则,某些连接方式可以被放行,而另一些连接方式则被禁止(全局生效)。",
+ "ConnectMethodAclCreate": "创建连接方式控制",
+ "ConnectMethodAclDetail": "连接方式控制详情",
+ "ConnectMethodAclList": "连接方式",
+ "ConnectMethodAclUpdate": "更新连接方式控制",
+ "ConnectWebSocketError": "连接 WebSocket 失败",
+ "ConnectionDropped": "连接已断开",
+ "ConnectionToken": "连接令牌",
+ "ConnectionTokenList": "连接令牌是将身份验证和连接资产结合起来使用的一种认证信息,支持用户一键登录到资产,目前支持的组件包括:KoKo、Lion、Magnus、Razor 等",
+ "Console": "控制台",
+ "Consult": "咨询",
+ "ContainAttachment": "含附件",
+ "Containers": "容器",
+ "Contains": "包含",
+ "Continue": "继续",
+ "ConvenientOperate": "便捷操作",
+ "Copy": "复制",
+ "CopySuccess": "复制成功",
+ "Corporation": "公司",
+ "Create": "创建",
+ "CreateAccessKey": "创建访问密钥",
+ "CreateAccountTemplate": "创建账号模版",
+ "CreateCommandStorage": "创建命令存储",
+ "CreateEndpoint": "创建端点",
+ "CreateEndpointRule": "创建端点规则",
+ "CreateErrorMsg": "创建失败",
+ "CreateNode": "创建节点",
+ "CreatePlaybook": "创建 Playbook",
+ "CreateReplayStorage": "创建对象存储",
+ "CreateSuccessMsg": "导入创建成功,总共:{count}",
+ "CreateUserSetting": "创建用户内容",
+ "Created": "已创建",
+ "CreatedBy": "创建者",
+ "CriticalLoad": "严重",
+ "CronExpression": "crontab完整表达式",
+ "CrontabOfCreateUpdatePage": "例如:每周日 03:05 执行 <5 3 * * 0>
使用5位 Linux crontab 表达式 <分 时 日 月 星期> (在线工具)
如果同时设置了定期执行和周期执行,优先使用定期执行",
+ "CurrentConnections": "当前连接数",
+ "CurrentUserVerify": "验证当前用户",
+ "Custom": "自定义",
+ "CustomCol": "自定义列表字段",
+ "CustomCreate": "创建资产-自定义",
+ "CustomFields": "自定义属性",
+ "CustomFile": "请将自定义的文件放到指定目录下(data/sms/main.py),并在 config.txt 中启用配置项 SMS_CUSTOM_FILE_MD5=<文件md5值>",
+ "CustomHelpMessage": "自定义类型资产,依赖于远程应用,请前往系统设置在远程应用中配置",
+ "CustomParams": "左侧为短信平台接收的参数,右侧为JumpServer待格式化参数,最终如下:
{\"phone_numbers\": \"123,134\", \"content\": \"验证码为: 666666\"}",
+ "CustomUpdate": "更新资产-自定义",
+ "CustomUser": "自定义用户",
+ "CycleFromWeek": "周期从星期",
+ "CyclePerform": "周期执行",
+ "DangerCommand": "危险命令",
+ "DangerousCommandNum": "危险命令数",
+ "Dashboard": "仪表盘",
+ "Database": "数据库",
+ "DatabaseCreate": "创建资产-数据库",
+ "DatabasePort": "数据库协议端口",
+ "DatabaseUpdate": "更新资产-数据库",
+ "Date": "日期",
+ "DateCreated": "创建时间",
+ "DateEnd": "结束日期",
+ "DateExpired": "失效日期",
+ "DateFinished": "完成日期",
+ "DateJoined": "创建日期",
+ "DateLast24Hours": "最近一天",
+ "DateLast3Months": "最近三月",
+ "DateLastHarfYear": "最近半年",
+ "DateLastLogin": "最后登录日期",
+ "DateLastMonth": "最近一月",
+ "DateLastSync": "最后同步日期",
+ "DateLastWeek": "最近一周",
+ "DateLastYear": "最近一年",
+ "DatePasswordLastUpdated": "最后更新密码日期",
+ "DateStart": "开始日期",
+ "DateSync": "同步日期",
+ "DateUpdated": "更新日期",
+ "Day": "日",
+ "DeclassificationLogNum": "改密日志数",
+ "DefaultDatabase": "默认数据库",
+ "DefaultPort": "默认端口",
+ "Delete": "删除",
+ "DeleteConfirmMessage": "删除后无法恢复,是否继续?",
+ "DeleteErrorMsg": "删除失败",
+ "PushAccountsHelpText": "推送已有账号到资产上。推送账号时,如果账号已存在,会更新账号的密码,如果账号不存在,会创建账号",
+ "ChangeCredentialsHelpText": "定时修改账号密钥密码。账号随机生成密码,并同步到目标资产,如果同步成功,更新该账号的密码",
+ "GatherAccountsHelpText": "收集资产上的账号信息。收集后的账号信息可以导入到系统中,方便统一管理",
+ "BackupAccountsHelpText": "备份账号信息到外部。可以存储到外部系统或发送邮件,支持分段方式",
+ "CommandFilterACLHelpText": "通过命令过滤,您可以控制命令是否可以发送到资产上。根据您设定的规则,某些命令可以被放行,而另一些命令则被禁止",
+ "DeleteNode": "删除节点",
+ "DeleteOrgMsg": "用户列表、用户组、资产列表、网域列表、管理用户、系统用户、标签管理、资产授权规则",
+ "DeleteOrgTitle": "请确保组织内的以下信息已删除",
+ "DeleteReleasedAssets": "删除已释放资产",
+ "DeleteSuccess": "删除成功",
+ "DeleteSuccessMsg": "删除成功",
+ "DeleteWarningMsg": "你确定要删除",
+ "Deploy": "部署",
+ "Description": "描述",
+ "DestinationIP": "目的地址",
+ "DestinationPort": "目的端口",
+ "Detail": "详情",
+ "DeviceCreate": "创建资产-网络设备",
+ "DeviceUpdate": "更新资产-网络设备",
+ "Digit": "数字",
+ "DingTalk": "钉钉",
+ "DingTalkTest": "测试",
+ "Disable": "禁用",
+ "DisplayName": "名称",
+ "Docs": "文档",
+ "Domain": "网域",
+ "DomainCreate": "创建网域",
+ "DomainEnabled": "启用网域",
+ "DomainHelpMessage": "网域功能是为了解决部分环境(如:混合云)无法直接连接而新增的功能,原理是通过网关服务器进行跳转登录。
JMS => 网域网关 => 目标资产",
+ "DomainList": "网域列表",
+ "DomainUpdate": "更新网域",
+ "Download": "下载",
+ "DownloadCenter": "下载中心",
+ "DownloadFTPFileTip": "当前动作不记录文件,或者文件大小超过阈值(默认100M),或者还未保存到对应存储中",
+ "DownloadImportTemplateMsg": "下载创建模板",
+ "DownloadReplay": "下载录像",
+ "DownloadUpdateTemplateMsg": "下载更新模板",
+ "DragUploadFileInfo": "将文件拖到此处,或点击此处上传",
+ "DuplicateFileExists": "不允许上传同名文件,请删除同名文件",
+ "Duration": "时长",
+ "DynamicUsername": "动态用户名",
+ "Edit": "编辑",
+ "Edition": "版本",
+ "Email": "邮箱",
+ "EmailContent": "邮件内容定制",
+ "EmailTest": "测试连接",
+ "Empty": "空",
+ "Enable": "启用",
+ "EnableKoKoSSHHelpText": "开启时连接资产会显示 SSH Client 拉起方式",
+ "Endpoint": "服务端点",
+ "EndpointListHelpMessage": "服务端点是用户访问服务的地址(端口),当用户在连接资产时,会根据端点规则和资产标签选择服务端点,作为访问入口建立连接,实现分布式连接资产",
+ "EndpointRule": "端点规则",
+ "EndpointRuleListHelpMessage": "对于服务端点选择策略,目前支持两种:
1、根据端点规则指定端点(当前页面);
2、通过资产标签选择端点,标签名固定是 endpoint,值是端点的名称。
两种方式优先使用标签匹配,因为 IP 段可能冲突,标签方式是作为规则的补充存在的。",
+ "Endswith": "以...结尾",
+ "EnsureThisValueIsGreaterThanOrEqualTo1": "请确保该值大于或者等于 1",
+ "EnterForSearch": "按下 Enter 进行搜索",
+ "EnterRunUser": "输入运行用户",
+ "EnterRunningPath": "输入运行路径",
+ "EnterToContinue": "按下 Enter 继续输入",
+ "EnterUploadPath": "输入上传路径",
+ "Enterprise": "企业版",
+ "EnterpriseEdition": "企业版",
+ "Equal": "等于",
+ "Error": "错误",
+ "ErrorMsg": "错误",
+ "EsDisabled": "节点不可用, 请联系管理员",
+ "EsIndex": "es 提供默认 index:jumpserver。如果开启按日期建立索引,那么输入的值会作为索引前缀",
+ "EsUrl": "不能包含特殊字符 `#`;eg: http://es_user:es_password@es_host:es_port",
+ "Every": "每",
+ "Exclude": "不包含",
+ "ExcludeAsset": "跳过的资产",
+ "ExcludeSymbol": "排除字符",
+ "Execute": "执行",
+ "ExecuteOnce": "执行一次",
+ "ExecutionDetail": "执行历史详情",
+ "ExecutionHistory": "执行历史",
+ "ExecutionList": "执行列表",
+ "ExistError": "这个元素已经存在",
+ "Existing": "已存在",
+ "ExpirationTimeout": "过期超时时间(秒)",
+ "Expire": " 过期",
+ "Expired": "过期时间",
+ "Export": "导出",
+ "ExportAll": "导出所有",
+ "ExportOnlyFiltered": "仅导出搜索结果",
+ "ExportOnlySelectedItems": "仅导出选择项",
+ "ExportRange": "导出范围",
+ "FC": "Fusion Compute",
+ "Failed": "失败",
+ "FailedAsset": "失败的资产",
+ "FaviconTip": "提示:网站图标(建议图片大小为: 16px*16px)",
+ "Features": "功能设置",
+ "FeiShu": "飞书",
+ "FeiShuTest": "测试",
+ "FieldRequiredError": "此字段是必填项",
+ "FileManagement": "文件管理",
+ "FileNameTooLong": "文件名太长",
+ "FileSizeExceedsLimit": "文件大小超出限制",
+ "FileTransfer": "文件传输",
+ "FileTransferNum": "文件传输数",
+ "FileType": "文件类型",
+ "Filename": "文件名",
+ "FingerPrint": "指纹",
+ "Finished": "完成",
+ "FinishedTicket": "完成工单",
+ "FirstLogin": "首次登录",
+ "FlowSetUp": "流程设置",
+ "FormatError": "格式错误",
+ "Friday": "周五",
+ "From": "从",
+ "FromTicket": "来自工单",
+ "FullName": "全称",
+ "FullySynchronous": "资产完全同步",
+ "FullySynchronousHelpTips": "当资产条件不满足匹配策略规则时,是否继续同步此类资产",
+ "GCP": "谷歌云",
+ "GPTCreate": "创建资产-GPT",
+ "GPTUpdate": "更新资产-GPT",
+ "GatewayCreate": "创建网关",
+ "GatewayList": "网关列表",
+ "GatewayUpdate": "更新网关",
+ "GeneralAccounts": "普通账号",
+ "Generate": "生成",
+ "GenerateAccounts": "重新生成账号",
+ "GenerateSuccessMsg": "账号生成成功",
+ "GoHomePage": "去往首页",
+ "Goto": "转到",
+ "GrantedAssets": "授权的资产",
+ "GreatEqualThan": "大于等于",
+ "GroupsAmount": "用户组",
+ "HandleTicket": "处理工单",
+ "Hardware": "硬件信息",
+ "HardwareInfo": "硬件信息",
+ "HasImportErrorItemMsg": "存在导入失败项,点击左侧 x 查看失败原因,点击表格编辑后,可以继续导入失败项",
+ "Help": "帮助",
+ "HelpDocumentTip": "可以更改网站导航栏 帮助 -> 文档 的网址",
+ "HelpSupportTip": "可以更改网站导航栏 帮助 -> 支持 的网址",
+ "HighLoad": "较高",
+ "HistoricalSessionNum": "历史会话数",
+ "History": "历史记录",
+ "HistoryDate": "日期",
+ "HistoryPassword": "历史密码",
+ "Host": "资产",
+ "HostCreate": "创建资产-主机",
+ "HostDeployment": "发布机部署",
+ "HostList": "主机列表",
+ "HostUpdate": "更新资产-主机",
+ "HostnameStrategy": "用于生成资产主机名。例如:1. 实例名称 (instanceDemo);2. 实例名称和部分IP(后两位) (instanceDemo-250.1)",
+ "Hour": "小时",
+ "HuaweiCloud": "华为云",
+ "HuaweiPrivateCloud": "华为私有云",
+ "IAgree": "我同意",
+ "ID": "ID",
+ "IP": "IP",
+ "IPLoginLimit": "IP 登录限制",
+ "IPMatch": "IP 匹配",
+ "IPNetworkSegment": "IP网段",
+ "Id": "ID",
+ "IdeaContent": "我想让你充当一个 Linux 终端。我将输入命令,你将回答终端应该显示的内容。我希望你只在一个独特的代码块内回复终端输出,而不是其他。不要写解释。当我需要告诉你一些事情时,我会把文字放在大括号里{备注文本}。",
+ "IdeaTitle": "🌱 Linux 终端",
+ "IdpMetadataHelpText": "IDP Metadata URL 和 IDP MetadataXML参数二选一即可,IDP MetadataURL的优先级高",
+ "IdpMetadataUrlHelpText": "从远端地址中加载 IDP Metadata",
+ "ImageName": "镜像名",
+ "Images": "图片",
+ "Import": "导入",
+ "ImportAll": "导入全部",
+ "ImportFail": "导入失败",
+ "ImportLdapUserTip": "请先提交LDAP配置再进行导入",
+ "ImportLdapUserTitle": "LDAP 用户列表",
+ "ImportLicense": "导入许可证",
+ "ImportLicenseTip": "请导入许可证",
+ "ImportMessage": "请前往对应类型的页面导入数据",
+ "ImportOrg": "导入组织",
+ "InActiveAsset": "近期未被登录",
+ "InActiveUser": "近期未登录过",
+ "InAssetDetail": "在资产详情中更新账号信息",
+ "Inactive": "禁用",
+ "Index": "索引",
+ "Info": "信息",
+ "InheritPlatformConfig": "继承自平台配置,如需更改,请更改平台中的配置。",
+ "InitialDeploy": "初始化部署",
+ "Input": "输入",
+ "InputEmailAddress": "请输入正确的邮箱地址",
+ "InputMessage": "输入消息...",
+ "InputPhone": "请输入手机号码",
+ "InstanceAddress": "实例地址",
+ "InstanceName": "实例名称",
+ "InstancePlatformName": "实例平台名称",
+ "Interface": "网络接口",
+ "InterfaceSettings": "界面设置",
+ "IntervalOfCreateUpdatePage": "单位:时",
+ "InvalidJson": "不是合法 JSON",
+ "InviteSuccess": "邀请成功",
+ "InviteUser": "邀请用户",
+ "InviteUserInOrg": "邀请用户加入此组织",
+ "Ip": "IP",
+ "IpGroup": "IP 组",
+ "IpGroupHelpText": "* 表示匹配所有。例如: 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",
+ "IsActive": "激活",
+ "IsAlwaysUpdate": "资产保持最新",
+ "IsAlwaysUpdateHelpTips": "每次执行同步任务时,是否同步更新资产的信息,包括主机名、IP、平台、网域、节点等信息",
+ "IsFinished": "是否完成",
+ "IsLocked": "是否暂停",
+ "IsSuccess": "成功",
+ "IsSyncAccountHelpText": "收集完成后会把收集的账号同步到资产",
+ "IsSyncAccountLabel": "同步到资产",
+ "JDCloud": "京东云",
+ "Job": "作业",
+ "JobCenter": "作业中心",
+ "JobCreate": "创建作业",
+ "JobDetail": "作业详情",
+ "JobExecutionLog": "作业日志",
+ "JobManagement": "作业管理",
+ "JobUpdate": "更新作业",
+ "KingSoftCloud": "金山云",
+ "KokoSettingUpdate": "Koko 配置设置",
+ "LAN": "局域网",
+ "LDAPUser": "LDAP 用户",
+ "Label": "标签",
+ "LabelCreate": "创建标签",
+ "LabelInputFormatValidation": "标签格式错误,正确格式为:name:value",
+ "LabelList": "标签列表",
+ "LabelUpdate": "更新标签",
+ "Language": "语言",
+ "Last30": "最近 30 次",
+ "Last30Days": "近30天",
+ "Last7Days": "近7天",
+ "LastPublishedTime": "最后发布时间",
+ "Ldap": "LDAP",
+ "LdapBulkImport": "用户导入",
+ "LdapConnectTest": "测试连接",
+ "LdapLoginTest": "测试登录",
+ "Length": "长度",
+ "LessEqualThan": "小于等于",
+ "LevelApproval": "级审批",
+ "License": "许可证",
+ "LicenseExpired": "许可证已经过期",
+ "LicenseFile": "许可证文件",
+ "LicenseForTest": "测试用途许可证, 本许可证仅用于 测试(PoC)和演示",
+ "LicenseReachedAssetAmountLimit": "资产数量已经超过许可证数量限制",
+ "LicenseWillBe": "许可证即将在 ",
+ "Loading": "加载中",
+ "LockedIP": "已锁定 IP {count} 个",
+ "Log": "日志",
+ "LogData": "日志数据",
+ "LogOfLoginSuccessNum": "登录成功日志数",
+ "Logging": "日志记录",
+ "LoginAssetConfirm": "资产登录复核",
+ "LoginAssetToday": "今日活跃资产数",
+ "LoginAssets": "活跃资产",
+ "LoginConfirm": "登录复核",
+ "LoginCount": "登录次数",
+ "LoginDate": "登录日期",
+ "LoginFailed": "登录失败",
+ "LoginFrom": "登录来源",
+ "LoginImageTip": "提示:将会显示在企业版用户登录页面(建议图片大小为: 492*472px)",
+ "LoginLog": "登录日志",
+ "LoginNum": "登录数",
+ "LoginPasswordSetting": "登录密码设置",
+ "LoginRequiredMsg": "账号已退出,请重新登录",
+ "LoginSucceeded": "登录成功",
+ "LoginTitleTip": "提示:将会显示在企业版用户 SSH 登录 KoKo 登录页面(eg: 欢迎使用JumpServer开源堡垒机)",
+ "LoginUserRanking": "登录账号排名",
+ "LoginUserToday": "今日登录账号数",
+ "LoginUsers": "活跃账号",
+ "LogoIndexTip": "提示:将会显示在管理页面左上方(建议图片大小为: 185px*55px)",
+ "LogoLogoutTip": "提示:将会显示在企业版用户的 Web 终端页面(建议图片大小为:82px*82px)",
+ "Logout": "退出登录",
+ "LogsAudit": "日志审计",
+ "Lowercase": "小写字母",
+ "LunaSettingUpdate": "Luna 配置设置",
+ "MFAErrorMsg": "MFA错误,请检查",
+ "MFAOfUserFirstLoginPersonalInformationImprovementPage": "启用多因子认证,使账号更加安全。
启用之后您将会在下次登录时进入多因子认证绑定流程;您也可以在(个人信息->快速修改->更改多因子设置)中直接绑定!",
+ "MFAOfUserFirstLoginUserGuidePage": "为了保护您和公司的安全,请妥善保管您的账户、密码和密钥等重要敏感信息;(如:设置复杂密码,并启用多因子认证)
邮箱、手机号、微信等个人信息,仅作为用户认证和平台内部消息通知使用。",
+ "MailRecipient": "邮件收件人",
+ "MailSend": "邮件发送",
+ "ManualAccount": "手动账号",
+ "ManualAccountTip": "登录时手动输入 用户名/密码",
+ "ManualExecutePlan": "手动执行",
+ "ManyChoose": "可多选",
+ "MarkAsRead": "标记已读",
+ "Marketplace": "应用市场",
+ "Match": "匹配",
+ "MatchIn": "在...中",
+ "MatchResult": "匹配结果",
+ "MatchedCount": "匹配结果",
+ "Members": "成员",
+ "MenuAccounts": "账号管理",
+ "MenuAcls": "访问控制",
+ "MenuAssets": "资产管理",
+ "MenuMore": "更多...",
+ "MenuPermissions": "授权管理",
+ "MenuUsers": "用户管理",
+ "Message": "消息",
+ "MessageSubscription": "消息订阅",
+ "MessageType": "消息类型",
+ "MfaLevel": "多因子认证",
+ "Min": "分钟",
+ "Modify": "修改",
+ "Module": "模块",
+ "Monday": "周一",
+ "Monitor": "监控",
+ "Month": "月",
+ "More": "更多",
+ "MoreActions": "更多操作",
+ "MoveAssetToNode": "移动资产到节点",
+ "MsgSubscribe": "消息订阅",
+ "MyAssets": "我的资产",
+ "MyTickets": "我发起的",
+ "Name": "名称",
+ "NavHelp": "导航栏链接",
+ "NeedReLogin": "需要重新登录",
+ "New": "新建",
+ "NewChat": "新聊天",
+ "NewCount": "新增",
+ "NewCron": "生成 Cron",
+ "NewDirectory": "新建目录",
+ "NewFile": "新建文件",
+ "NewPassword": "新密码",
+ "NewSyncCount": "新同步",
+ "No": "否",
+ "NoContent": "暂无内容",
+ "NoData": "暂无数据",
+ "NoFiles": "暂无文件",
+ "NoPermission": "暂无权限",
+ "NoPermission403": "403 暂无权限",
+ "NoPermissionVew": "没有权限查看当前页面",
+ "NoUnreadMsg": "暂无未读消息",
+ "Node": "节点",
+ "NodeAmount": "节点数量",
+ "NodeInformation": "节点信息",
+ "NodeSearchStrategy": "节点搜索策略",
+ "NormalLoad": "正常",
+ "NotEqual": "不等于",
+ "NotSet": "未设置",
+ "NotSpecialEmoji": "不允许输入特殊表情符号",
+ "Nothing": "无",
+ "Notifications": "通知设置",
+ "Now": "现在",
+ "Number": "编号",
+ "NumberOfVisits": "访问次数",
+ "OAuth2": "OAuth2",
+ "OAuth2LogoTip": "提示:认证服务提供商(建议图片大小为: 64px*64px)",
+ "OIDC": "OIDC",
+ "ObjectNotFoundOrDeletedMsg": "没有找到对应资源或者已被删除",
+ "Offline": "离线",
+ "OfflineSuccessMsg": "下线成功",
+ "OfflineUpload": "离线上传",
+ "OldPassword": "原密码",
+ "OldSSHKey": "原来SSH公钥",
+ "OneAssignee": "一级受理人",
+ "OneAssigneeType": "一级受理人类型",
+ "OneClickReadMsg": "你确定要将当前信息标记为已读吗?",
+ "OnlineSession": "在线用户",
+ "OnlineSessionHelpMsg": "无法下线当前会话,因为该会话是当前用户的在线会话。当前只记录以 Web 方式登录的用户。",
+ "OnlineSessions": "在线会话数",
+ "OnlineUserDevices": "在线用户设备",
+ "OnlyMailSend": "当前只支持邮件发送",
+ "OnlySearchCurrentNodePerm": "仅搜索当前节点的授权",
+ "OpenCommand": "打开命令",
+ "OpenStack": "OpenStack",
+ "OpenStatus": "审批中",
+ "OpenTicket": "创建工单",
+ "OperateLog": "操作日志",
+ "OperationLogNum": "操作日志数",
+ "OrgAdmin": "组织管理员",
+ "OrgAuditor": "组织审计员",
+ "OrgName": "授权组织名称",
+ "OrgRole": "组织角色",
+ "OrgRoleHelpText": "组织角色是用户在当前组织中的角色",
+ "OrgRoles": "组织角色",
+ "OrgUser": "组织用户",
+ "OrganizationCreate": "创建组织",
+ "OrganizationDetail": "组织详情",
+ "OrganizationList": "组织管理",
+ "OrganizationLists": "组织列表",
+ "OrganizationUpdate": "更新组织",
+ "Other": "其它设置",
+ "Output": "输出",
+ "Overview": "概览",
+ "PageNext": "下一页",
+ "PagePrev": "上一页",
+ "Params": "参数",
+ "ParamsHelpText": "改密参数设置,目前仅对平台种类为主机的资产生效。",
+ "PassKey": "Passkey",
+ "Passkey": "Passkey",
+ "PasskeyAddDisableInfo": "你的认证来源是 {source}, 不支持添加 Passkey",
+ "Passphrase": "密钥密码",
+ "Password": "密码",
+ "PasswordChangeLog": "改密日志",
+ "PasswordExpired": "密码过期了",
+ "PasswordPlaceholder": "请输入密码",
+ "PasswordRecord": "密码记录",
+ "PasswordRule": "密码规则",
+ "PasswordSecurity": "密码安全",
+ "PasswordStrategy": "密文生成策略",
+ "PasswordWillExpiredPrefixMsg": "密码即将在 ",
+ "PasswordWillExpiredSuffixMsg": "天 后过期,请尽快修改您的密码。",
+ "Paste": "粘贴",
+ "Pause": "暂停",
+ "PauseTaskSendSuccessMsg": "暂停任务已下发,请稍后刷新查看",
+ "Pending": "待处理",
+ "PermAccount": "授权账号",
+ "PermUserList": "授权用户",
+ "PermissionCompany": "授权公司",
+ "PermissionName": "授权规则名称",
+ "Permissions": "权限",
+ "PersonalInformationImprovement": "个人信息完善",
+ "Plan": "计划",
+ "Platform": "平台",
+ "PlatformCreate": "创建平台",
+ "PlatformDetail": "平台详情",
+ "PlatformList": "平台列表",
+ "PlatformPageHelpMsg": "平台是资产的分类,例如:Windows、Linux、网络设备等。也可以在平台上指定一些配置,如 协议,网关 等,决定资产上是否启用某些功能。",
+ "PlatformProtocolConfig": "平台协议配置",
+ "PlatformUpdate": "更新平台",
+ "PlaybookDetail": "Playbook详情",
+ "PlaybookManage": "Playbook管理",
+ "PlaybookUpdate": "更新Playbook",
+ "PleaseAgreeToTheTerms": "请同意条款",
+ "PolicyName": "策略名称",
+ "Port": "端口",
+ "Ports": "端口",
+ "Priority": "优先级",
+ "PrivateCloud": "私有云",
+ "PrivateKey": "私钥",
+ "Privileged": "特权账号",
+ "PrivilegedFirst": "优先特权账号",
+ "PrivilegedOnly": "仅特权账号",
+ "PrivilegedTemplate": "特权的",
+ "Product": "产品",
+ "Profile": "个人信息",
+ "ProfileSetting": "个人信息设置",
+ "Project": "项目名",
+ "Prompt": "提示词",
+ "Proportion": "占比",
+ "ProportionOfAssetTypes": "资产类型占比",
+ "Protocol": "协议",
+ "Protocols": "协议",
+ "Proxy": "代理",
+ "PublicCloud": "公有云",
+ "PublicKey": "公钥",
+ "Publish": "发布",
+ "PublishAllApplets": "发布所有应用",
+ "PublishStatus": "发布状态",
+ "Push": "推送",
+ "PushAccount": "推送账号",
+ "PushParams": "推送参数",
+ "Qcloud": "腾讯云",
+ "QcloudLighthouse": "腾讯云(轻量应用服务器)",
+ "QingYunPrivateCloud": "青云私有云",
+ "Queue": "队列",
+ "QuickAdd": "快速添加",
+ "QuickJob": "快捷命令",
+ "QuickUpdate": "快速更新",
+ "Radius": "Radius",
+ "Ranking": "排名",
+ "RazorNotSupport": "RDP 客户端会话, 暂不支持监控",
+ "ReLogin": "重新登录",
+ "ReLoginTitle": "当前三方登录用户(CAS/SAML),未绑定 MFA 且不支持密码校验,请重新登录。",
+ "RealTimeData": "实时数据",
+ "Reason": "原因",
+ "Receivers": "接收人",
+ "RecentLogin": "最近登录",
+ "RecentSession": "最近会话",
+ "RecentlyUsed": "最近使用",
+ "RecipientHelpText": "若收件人 A B 都设置,账号的密钥将被拆分成前后两部分",
+ "RecipientServer": "接收服务器",
+ "Reconnect": "重新连接",
+ "Refresh": "刷新",
+ "RefreshHardware": "更新硬件信息",
+ "Regex": "正则表达式",
+ "Region": "地域",
+ "RegularlyPerform": "定期执行",
+ "Reject": "拒绝",
+ "Rejected": "已拒绝",
+ "ReleasedCount": "已释放",
+ "RelevantApp": "应用",
+ "RelevantAsset": "资产",
+ "RelevantAssignees": "相关受理人",
+ "RelevantCommand": "命令",
+ "RelevantSystemUser": "系统用户",
+ "RemoteAddr": "远端地址",
+ "Remove": "移除",
+ "RemoveAssetFromNode": "从节点移除资产",
+ "RemoveSuccessMsg": "移除成功",
+ "Rename": "重命名",
+ "RenameNode": "重命名节点",
+ "ReplaceNodeAssetsAdminUserWithThis": "替换资产的管理员",
+ "Replay": "回放",
+ "ReplaySession": "回放会话",
+ "ReplayStorage": "对象存储",
+ "ReplayStorageCreateUpdateHelpMessage": "注意:目前 SFTP 存储仅支持账号备份,暂不支持录像存储。",
+ "ReplayStorageUpdate": "更新对象存储",
+ "Reply": "回复",
+ "RequestAssetPerm": "申请资产授权",
+ "RequestPerm": "授权申请",
+ "RequestTickets": "申请工单",
+ "RequiredAssetOrNode": "请至少选择一个资产或节点",
+ "RequiredContent": "请输入命令",
+ "RequiredEntryFile": "此文件作为运行的入口文件,必须存在",
+ "RequiredRunas": "请输入运行用户",
+ "RequiredSystemUserErrMsg": "请选择账号",
+ "RequiredUploadFile": "请上传文件!",
+ "Reset": "还原",
+ "ResetAndDownloadSSHKey": "重置并下载密钥",
+ "ResetMFA": "重置MFA",
+ "ResetMFAWarningMsg": "你确定要重置用户的 MFA 吗?",
+ "ResetMFAdSuccessMsg": "重置MFA成功, 用户可以重新设置MFA了",
+ "ResetPassword": "重置密码",
+ "ResetPasswordNextLogin": "下次登录须修改密码",
+ "ResetPasswordSuccessMsg": "已向用户发送重置密码消息",
+ "ResetPasswordWarningMsg": "你确定要发送重置用户密码的邮件吗",
+ "ResetPublicKeyAndDownload": "重置并下载SSH密钥",
+ "ResetSSHKey": "重置SSH密钥",
+ "ResetSSHKeySuccessMsg": "发送邮件任务已提交, 用户稍后会收到重置密钥邮件",
+ "ResetSSHKeyWarningMsg": "你确定要发送重置用户的SSH Key的邮件吗?",
+ "Resource": "资源",
+ "ResourceType": "资源类型",
+ "RestoreButton": "恢复默认",
+ "RestoreDefault": "恢复默认",
+ "RestoreDialogMessage": "您确定要恢复默认初始化吗?",
+ "RestoreDialogTitle": "你确认吗",
+ "Result": "结果",
+ "Resume": "恢复",
+ "ResumeTaskSendSuccessMsg": "恢复任务已下发,请稍后刷新查看",
+ "Retry": "重试",
+ "Reviewer": "审批人",
+ "Role": "角色",
+ "RoleCreate": "创建角色",
+ "RoleDetail": "角色详情",
+ "RoleInfo": "角色信息",
+ "RoleList": "角色列表",
+ "RoleUpdate": "更新角色",
+ "RoleUsers": "授权用户",
+ "Rows": "行",
+ "Rule": "条件",
+ "RuleCount": "条件数量",
+ "RuleDetail": "规则详情",
+ "RuleRelation": "条件关系",
+ "RuleRelationHelpTips": "且:当所有条件都满足时,才会执行动作;或:有一个条件满足,就会执行动作",
+ "RuleSetting": "条件设置",
+ "Rules": "规则",
+ "Run": "执行",
+ "RunAgain": "再次执行",
+ "RunAs": "运行用户",
+ "RunCommand": "运行命令",
+ "RunJob": "运行作业",
+ "RunSucceed": "任务执行成功",
+ "RunTaskManually": "手动执行",
+ "RunasHelpText": "填写运行脚本的用户名",
+ "RunasPolicy": "账号策略",
+ "RunasPolicyHelpText": "当前资产上没此运行用户时,采取什么账号选择策略。跳过:不执行。优先特权账号:如果有特权账号先选特权账号,如果没有就选普通账号。仅特权账号:只从特权账号中选择,如果没有则不执行",
+ "RunningPath": "运行路径",
+ "RunningPathHelpText": "填写脚本的运行路径,此设置仅 shell 脚本生效",
+ "RunningTimes": "最近5次运行时间",
+ "SCP": "深信服云平台",
+ "SMS": "短信",
+ "SMSProvider": "短信服务商",
+ "SMTP": "邮件服务器",
+ "SSHKey": "SSH公钥",
+ "SSHKeyOfProfileSSHUpdatePage": "复制你的公钥到这里",
+ "SSHKeySetting": "SSH公钥设置",
+ "SSHPort": "SSH 端口",
+ "SSHSecretKey": "SSH 密钥",
+ "SafeCommand": "安全命令",
+ "SameAccount": "同名账号",
+ "SameAccountTip": "与被授权人用户名相同的账号",
+ "SameTypeAccountTip": "相同用户名、密钥类型的账号已存在",
+ "Saturday": "周六",
+ "Save": "保存",
+ "SaveAdhoc": "保存命令",
+ "SaveAndAddAnother": "保存并继续添加",
+ "SaveCommand": "保存命令 ",
+ "SaveCommandSuccess": "保存命令成功",
+ "SaveSetting": "同步设置",
+ "SaveSuccess": "保存成功",
+ "SaveSuccessContinueMsg": "创建成功,更新内容后可以继续添加",
+ "ScrollToBottom": "滚动到底部",
+ "ScrollToTop": "滚动到顶部",
+ "Search": "搜索",
+ "SearchAncestorNodePerm": "同时搜索当前节点和祖先节点的授权",
+ "Secret": "密码",
+ "SecretKey": "密钥",
+ "SecretKeyStrategy": "密码策略",
+ "Secure": "安全",
+ "Security": "安全设置",
+ "Select": "选择",
+ "SelectAdhoc": "选择命令",
+ "SelectAll": "全选",
+ "SelectAtLeastOneAssetOrNodeErrMsg": "资产或者节点至少选择一项",
+ "SelectAttrs": "选择属性",
+ "SelectByAttr": "属性筛选",
+ "SelectFile": "选择文件",
+ "SelectKeyOrCreateNew": "选择标签键或创建新的",
+ "SelectLabelFilter": "选择标签搜索",
+ "SelectPlatforms": "选择平台",
+ "SelectProperties": "选择属性",
+ "SelectResource": "选择资源",
+ "SelectTemplate": "选择模版",
+ "SelectValueOrCreateNew": "选择标签值或创建新的",
+ "Selected": "已选择",
+ "Selection": "可选择",
+ "Selector": "选择器",
+ "Send": "发送",
+ "SendVerificationCode": "发送验证码",
+ "SerialNumber": "序列号",
+ "ServerAccountKey": "服务账号密钥",
+ "ServerError": "服务器错误",
+ "ServerTime": "服务器时间",
+ "Session": "会话",
+ "SessionData": "会话数据",
+ "SessionDetail": "会话详情",
+ "SessionID": "会话ID",
+ "SessionList": "会话记录",
+ "SessionMonitor": "监控",
+ "SessionOffline": "历史会话",
+ "SessionOnline": "在线会话",
+ "SessionSecurity": "会话安全",
+ "SessionState": "会话状态",
+ "SessionTerminate": "会话终断",
+ "SessionTrend": "会话趋势",
+ "Sessions": "会话管理",
+ "SessionsAudit": "会话审计",
+ "SessionsNum": "会话数",
+ "Set": "已设置",
+ "SetDingTalk": "设置钉钉认证",
+ "SetFailed": "设置失败",
+ "SetFeiShu": "设置飞书认证",
+ "SetMFA": "设置多因子认证",
+ "SetSlack": "设置Slack认证",
+ "SetStatus": "设置状态",
+ "SetSuccess": "设置成功",
+ "SetToDefault": "设为默认",
+ "SetToDefaultStorage": "设置为默认存储",
+ "SetWeCom": "设置企业微信认证",
+ "Setting": "设置",
+ "SettingInEndpointHelpText": "在 系统设置 / 组件设置 / 服务端点 中配置服务地址和端口",
+ "Settings": "系统设置",
+ "Show": "显示",
+ "ShowAssetAllChildrenNode": "显示所有子节点资产",
+ "ShowAssetOnlyCurrentNode": "仅显示当前节点资产",
+ "ShowNodeInfo": "显示节点详情",
+ "SignChannelNum": "签名通道号",
+ "SiteMessage": "站内信",
+ "SiteMessageList": "站内信",
+ "Skip": "忽略当前资产",
+ "Skipped": "已跳过",
+ "Slack": "Slack",
+ "Source": "来源",
+ "SourceIP": "源地址",
+ "SourcePort": "源端口",
+ "Spec": "指定",
+ "SpecAccount": "指定账号",
+ "SpecAccountTip": "指定用户名选择授权账号",
+ "SpecialSymbol": "特殊字符",
+ "SpecificInfo": "特殊信息",
+ "SshKeyFingerprint": "SSH 指纹",
+ "Startswith": "以...开头",
+ "State": "状态",
+ "StateClosed": "已关闭",
+ "Status": "状态",
+ "StatusGreen": "近期状态良好",
+ "StatusRed": "上一次任务执行失败",
+ "StatusYellow": "近期存在在执行失败",
+ "Stop": "停止",
+ "StorageSetting": "存储设置",
+ "Strategy": "策略",
+ "StrategyCreate": "创建策略",
+ "StrategyDetail": "策略详情",
+ "StrategyHelpTips": "根据策略优先级确定资产的唯一属性(如平台),当资产属性(如节点)可配置多个的时候,所有策略的动作都会被执行",
+ "StrategyList": "策略列表",
+ "StrategyUpdate": "更新策略",
+ "SuFrom": "切换自",
+ "Submit": "提交",
+ "SubscriptionID": "订阅授权ID",
+ "Success": "成功",
+ "SuccessAsset": "成功的资产",
+ "SuccessfulOperation": "操作成功",
+ "Summary(success/total)": "概况( 成功/总数 )",
+ "Sunday": "周日",
+ "SuperAdmin": "超级管理员",
+ "SuperOrgAdmin": "超级管理员+组织管理员",
+ "Support": "支持",
+ "SupportedProtocol": "支持的协议",
+ "SupportedProtocolHelpText": "设置资产支持的协议,点击设置按钮可以为协议修改自定义配置,如 SFTP 目录,RDP AD 域等",
+ "Sync": "同步",
+ "SyncDelete": "同步删除",
+ "SyncInstanceTaskCreate": "创建同步任务",
+ "SyncInstanceTaskDetail": "同步任务详情",
+ "SyncInstanceTaskHistoryAssetList": "同步实例列表",
+ "SyncInstanceTaskHistoryList": "同步历史列表",
+ "SyncInstanceTaskList": "同步任务列表",
+ "SyncInstanceTaskUpdate": "更新同步任务",
+ "SyncSetting": "同步设置",
+ "SyncStrategy": "同步策略",
+ "SyncSuccessMsg": "同步成功",
+ "SyncTask": "同步任务",
+ "SyncUpdateAccountInfo": "同步更新账号信息",
+ "SyncUser": "同步用户",
+ "SyncedCount": "已同步",
+ "SystemError": "系统错误",
+ "SystemRole": "系统角色",
+ "SystemRoles": "系统角色",
+ "SystemSetting": "系统设置",
+ "SystemTools": "系统工具",
+ "TableColSettingInfo": "请选择您想显示的列表详细信息。",
+ "Target": "目标",
+ "TargetResources": "目标资源",
+ "Task": "任务",
+ "TaskDetail": "任务详情",
+ "TaskDone": "任务结束",
+ "TaskID": "任务 ID",
+ "TaskList": "任务列表",
+ "TaskMonitor": "任务监控",
+ "TechnologyConsult": "技术咨询",
+ "TempPassword": "临时密码有效期为 300 秒,使用后立刻失效",
+ "TemplateAdd": "模版添加",
+ "TemplateCreate": "创建模版",
+ "TemplateHelpText": "选择模版添加时,会自动创建资产下不存在的账号并推送",
+ "TemplateManagement": "模版管理",
+ "TencentCloud": "腾讯云",
+ "Terminal": "组件设置",
+ "TerminalDetail": "终端详情",
+ "TerminalUpdate": "更新终端",
+ "TerminalUpdateStorage": "更新终端存储",
+ "Terminate": "终断",
+ "TerminateTaskSendSuccessMsg": "终断任务已下发,请稍后刷新查看",
+ "TermsAndConditions": "条款和条件",
+ "Test": "测试",
+ "TestAccountConnective": "测试账号可连接性",
+ "TestAssetsConnective": "测试资产可连接性",
+ "TestConnection": "测试连接",
+ "TestGatewayHelpMessage": "如果使用了nat端口映射,请设置为ssh真实监听的端口",
+ "TestGatewayTestConnection": "测试连接网关",
+ "TestLdapLoginTitle": "测试LDAP 用户登录",
+ "TestNodeAssetConnectivity": "测试资产节点可连接性",
+ "TestPortErrorMsg": "端口错误,请重新输入",
+ "TestSuccessMsg": "测试成功",
+ "Thursday": "周四",
+ "Ticket": "工单",
+ "TicketDetail": "工单详情",
+ "TicketFlow": "工单流",
+ "TicketFlowCreate": "创建审批流",
+ "TicketFlowUpdate": "更新审批流",
+ "Tickets": "工单列表",
+ "Time": "时间",
+ "TimeDelta": "运行时间",
+ "TimeExpression": "时间表达式",
+ "Timeout": "超时",
+ "TimeoutHelpText": "当此值为-1时,不指定超时时间",
+ "Timer": "定时执行",
+ "Title": "标题",
+ "To": "至",
+ "Today": "今天",
+ "TodayFailedConnections": "今日连接失败数",
+ "Token": "令牌",
+ "Total": "总共",
+ "TotalJobFailed": "执行失败作业数",
+ "TotalJobLog": "作业执行总数",
+ "TotalJobRunning": "运行中作业数",
+ "Transfer": "传输",
+ "Tuesday": "周二",
+ "TwoAssignee": "二级受理人",
+ "TwoAssigneeType": "二级受理人类型",
+ "Type": "类型",
+ "Types": "类型",
+ "UCloud": "UCloud优刻得",
+ "UnSyncCount": "未同步",
+ "Unbind": "解绑",
+ "UnbindHelpText": "本地用户为此认证来源用户,无法解绑",
+ "Unblock": "解锁",
+ "UnblockSuccessMsg": "解锁成功",
+ "UnblockUser": "解锁用户",
+ "UniqueError": "以下属性只能设置一个",
+ "UnlockSuccessMsg": "解锁成功",
+ "UnselectedOrg": "没有选择组织",
+ "UnselectedUser": "没有选择用户",
+ "UpDownload": "上传下载",
+ "Update": "更新",
+ "UpdateAccount": "更新账号",
+ "UpdateAccountTemplate": "更新账号模版",
+ "UpdateAssetDetail": "配置更多信息",
+ "UpdateAssetUserToken": "更新账号认证信息",
+ "UpdateEndpoint": "更新端点",
+ "UpdateEndpointRule": "更新端点规则",
+ "UpdateErrorMsg": "更新失败",
+ "UpdateNodeAssetHardwareInfo": "更新节点资产硬件信息",
+ "UpdateSSHKey": "更新SSH公钥",
+ "UpdateSelected": "更新所选",
+ "UpdateSuccessMsg": "更新成功",
+ "Updated": "已更新",
+ "Upload": "上传",
+ "UploadCsvLth10MHelpText": "只能上传 csv/xlsx, 且不超过 10M",
+ "UploadDir": "上传目录",
+ "UploadFileLthHelpText": "只能上传小于{limit}MB文件",
+ "UploadPlaybook": "上传 Playbook",
+ "UploadSucceed": "上传成功",
+ "UploadZipTips": "请上传 zip 格式的文件",
+ "Uploading": "文件上传中",
+ "Uppercase": "大写字母",
+ "UseProtocol": "使用协议",
+ "UseSSL": "使用 SSL/TLS",
+ "User": "用户",
+ "UserAclLists": "用户登录规则",
+ "UserAssetActivity": "账号/资产活跃情况",
+ "UserCreate": "创建用户",
+ "UserData": "账号数据",
+ "UserDetail": "用户详情",
+ "UserGroupCreate": "创建用户组",
+ "UserGroupDetail": "用户组详情",
+ "UserGroupList": "用户组",
+ "UserGroupUpdate": "更新用户组",
+ "UserGroups": "用户组",
+ "UserInformation": "用户信息",
+ "UserList": "用户列表",
+ "UserLoginACLHelpMsg": "登录系统时,可以根据用户的登录 IP 和时间段进行审核,判断是否可以登录系统(全局生效)",
+ "UserLoginAclCreate": "创建用户登录控制",
+ "UserLoginAclDetail": "用户登录控制详情",
+ "UserLoginAclList": "用户登录",
+ "UserLoginAclUpdate": "更新用户登录控制",
+ "UserLoginLimit": "用户登录限制",
+ "UserLoginTrend": "账号登录趋势",
+ "UserProfile": "个人信息",
+ "UserSession": "用户会话",
+ "UserSetting": "偏好设置",
+ "UserUpdate": "更新用户",
+ "Username": "用户名",
+ "UsernamePlaceholder": "请输入用户名",
+ "Users": "用户",
+ "UsersAmount": "用户",
+ "UsersAndUserGroups": "用户/用户组",
+ "UsersTotal": "账号总数",
+ "Valid": "有效",
+ "Variable": "变量",
+ "VariableHelpText": "您可以在命令中使用 {{ key }} 读取内置变量",
+ "VaultHelpText": "1. 由于安全原因,需要配置文件中开启 Vault 存储。
2. 开启后,填写其他配置,进行测试。
3. 进行数据同步,同步是单向的,只会从本地数据库同步到远端 Vault,同步完成本地数据库不再存储密码,请备份好数据。
4. 二次修改 Vault 配置后需重启服务。",
+ "VerificationCodeSent": "验证码已发送",
+ "VerifySignTmpl": "验证码短信模板",
+ "Version": "版本",
+ "View": "查看",
+ "ViewBlockedIPSHelpText": "查看已被锁定的 IP 列表",
+ "ViewMore": "查看更多",
+ "ViewPerm": "查看授权",
+ "ViewSecret": "查看密文",
+ "VirtualAccountDetail": "虚拟账号详情",
+ "VirtualAccountUpdate": "虚拟账号更新",
+ "VirtualAccounts": "虚拟账号",
+ "VirtualApp": "虚拟应用",
+ "VirtualAppDetail": "虚拟应用详情",
+ "VirtualApps": "虚拟应用",
+ "WeCom": "企业微信",
+ "WeComTest": "测试",
+ "WebCreate": "创建资产-Web",
+ "WebHelpMessage": "Web 类型资产依赖于远程应用,请前往系统设置在远程应用中配置",
+ "WebSocketDisconnect": "WebSocket 断开",
+ "WebTerminal": "Web终端",
+ "WebUpdate": "更新资产-Web",
+ "Wednesday": "周三",
+ "Week": "周",
+ "WeekAdd": "本周新增",
+ "WeekOrTime": "星期/时间",
+ "WildcardsAllowed": "允许的通配符",
+ "WindowsPushHelpText": "windows 资产暂不支持推送密钥",
+ "WordSep": "",
+ "Workbench": "工作台",
+ "Workspace": "工作空间",
+ "Yes": "是",
+ "ZStack": "ZStack"
+}
diff --git a/apps/i18n/luna/en.json b/apps/i18n/luna/en.json
new file mode 100644
index 000000000..79476c90b
--- /dev/null
+++ b/apps/i18n/luna/en.json
@@ -0,0 +1,211 @@
+{
+ "ACL reject login asset": "This login has been rejected due to access control policy restrictions",
+ "Account info": "Account info",
+ "Account not found": "Account not found",
+ "Account: ": "Account: {{value}}",
+ "Action: ": "Action:",
+ "Advanced option": "Advanced option",
+ "All sessions": "All sessions",
+ "Applet": "Applet",
+ "Applet connect method": "Applet connect method",
+ "Are you sure to reconnect it?(RDP not support)": "Are you sure to reconnect it?(RDP not support)",
+ "Asset disabled": "This asset has been disabled, please contact an administrator",
+ "Asset not found or You have no permission to access it, please refresh asset tree": "Asset not found or You have no permission to access it, please refresh asset tree",
+ "Asset tree loading method": "Configure Asset Tree Loading Method",
+ "Asset: ": "Asset: {{value}}",
+ "Assignees": "Assignees",
+ "Automatic login next": "Automatic Login next (right click asset to re-select)",
+ "Backspace as Ctrl+H": "Backspace as Ctrl+H",
+ "Batch actions": "Batch actions",
+ "Batch connect": "Batch connect",
+ "Belgian French keyboard layout": "Belgian French (Azerty)",
+ "CLI": "CLI",
+ "CLI font size": "CLI font size",
+ "Cancel": "Cancel",
+ "Charset": "Charset",
+ "Checkbox": "Checkbox",
+ "Choose a User": "Choose a User",
+ "Click to copy": "Click to copy",
+ "Client": "Client",
+ "Clone Connect": "Clone Connect",
+ "Close": "Close",
+ "Close All Tabs": "Close All Tabs",
+ "Close Current Tab": "Close Current Tab",
+ "Close Left Tabs": "Close Left Tabs",
+ "Close Other Tabs": "Close Other Tabs",
+ "Close Right Tabs": "Close Right Tabs",
+ "Close split connect": "Close split connect",
+ "Collapse": "Collapse",
+ "Command Line": "Command Line",
+ "Command line": "Command line",
+ "Confirm": "Confirm",
+ "Connect": "Connect",
+ "Connect method": "Connect method",
+ "Connect checked": "Connect checked",
+ "Connect command line": "Connect command line",
+ "Copied": "Copied",
+ "Copy link": "Copy link",
+ "Current online": "Current online",
+ "Current session": "Current session",
+ "Database": "Database",
+ "Database connect info": "Database Connection Information",
+ "Database disabled": "This type of connection is not supported, please contact an administrator.",
+ "Database info": "Database info",
+ "Database token help text": "The database type token that the client connects to will be cached by the component for 5 minutes, which means that the token will not be invalidated immediately after it is used, but five minutes after the client disconnects",
+ "Databases": "Databases",
+ "Directly": "Directly",
+ "Disable auto completion": "Disable auto completion",
+ "Disconnect": "Disconnect",
+ "Disfavor": "Disfavor",
+ "Do not close this page": "Do not close this page",
+ "Document": "Document",
+ "Don't prompt again": "Don't prompt again",
+ "Download": "Download",
+ "Download the client": "Please download",
+ "Download the latest client": "Download the latest client",
+ "Driver redirect": "Driver redirect",
+ "Expand": "Expand",
+ "Expand all": "Expand all",
+ "Expand all asset": "Expand all assets under the current node",
+ "Expire time": "Expire time",
+ "Failed to open address": "Failed to Open Address",
+ "Favorite": "Favorite",
+ "File Manager": "File Manager",
+ "Fold": "Collapse",
+ "Fold all": "Collapse All",
+ "Force refresh": "Force refresh",
+ "Found": "Found",
+ "French keyboard layout": "French (Azerty)",
+ "Full Screen": "Full Screen",
+ "Full screen": "Full screen",
+ "GUI": "GUI",
+ "General": "General",
+ "Help": "Help",
+ "Help or download": "Help → Download",
+ "Help text": "Help text",
+ "Hide left manager": "Hide left manager",
+ "Host": "Host",
+ "Info": "Info",
+ "WordSep": " ",
+ "InstallClientMsg": "JumpServer client not found, Go to download and install?",
+ "Japanese keyboard layout": "Japanese (Qwerty)",
+ "Keyboard keys": "Option + Left / Option + Right",
+ "Keyboard layout": "Keyboard layout",
+ "Keyboard switch session": "Switch session → Shortcut keys",
+ "Kubernetes": "Kubernetes",
+ "Language": "Language",
+ "Last login": "Last login",
+ "Launch Program": "Launch Program",
+ "LeftInfo": "Click the command record to quickly locate the video",
+ "Load tree async": "Load tree async",
+ "Loading": "Loading",
+ "Log out": "Log out",
+ "Login reminder": "Login reminder",
+ "Login review approved": "Login review has been approved, connecting assets...",
+ "LoginExpireMsg": "Login session expired, please re-login",
+ "Manual accounts": "Manual accounts",
+ "Module": "Module",
+ "Multi Screen": "Multi Screen",
+ "My applications": "My applications",
+ "My assets": "My assets",
+ "Name": "Name",
+ "Native": "Client",
+ "Need review for login asset": "This login needs manual review. Do you want to continue?",
+ "Need to use": "Need to use",
+ "No": "No",
+ "No account available": "No available accounts",
+ "No available connect method": "No available connect method",
+ "No matching found": "No matching found",
+ "No permission": "No permission",
+ "No protocol available": "No protocol available",
+ "Not quick command": "Not quick command",
+ "Open in new window": "Open in new window",
+ "Password": "Password",
+ "Password is token password on the table": "Password is token password on the table",
+ "Password is your password login to system": "Password is your password login to system",
+ "Pause": "Pause",
+ "Pause task has been send": "Pause task has been send",
+ "Please choose an account": "Please choose an account",
+ "Please input password": "Please input password",
+ "Port": "Port",
+ "Protocol": "Protocol",
+ "Protocol: ": "Protocol: {{value}}",
+ "RDP Client": "RDP Client",
+ "RDP File": "RDP File",
+ "RDP client options": "RDP client options",
+ "RDP color quality": "RDP Color Quality",
+ "RDP resolution": "RDP resolution",
+ "RDP smart size": "RDP smart size",
+ "Re-use for a long time after opening": "Re-use for a long time after opening",
+ "Reconnect": "Reconnect",
+ "Refresh": "Refresh",
+ "Remember password": "Remember me",
+ "Remember select": "Remember selected",
+ "RemoteApp": "RemoteApp",
+ "Reselect connection method": "Reselect asset connection method",
+ "Resume": "Resume",
+ "Resume task has been send": "Resume task has been send",
+ "Right click asset": "Right click on the asset",
+ "Right click node": "Right click node",
+ "Right mouse quick paste": "Right mouse quick paste",
+ "Run it by client": "Run it by client",
+ "SQL Client": "SQL Client",
+ "Save command": "Save command",
+ "Save success": "Save success",
+ "Search": "Search",
+ "Select account": "Select account",
+ "Send command": "Send command",
+ "Send text to all ssh terminals": "Send text to all ssh terminals",
+ "Set reusable": "Set reusable",
+ "Setting": "Setting",
+ "Settings or basic settings": "Settings → Basic Settings",
+ "Show left manager": "Show left manager",
+ "Skip": "Skip",
+ "Skip manual password": "Skip manual password",
+ "Special accounts": "Special accounts",
+ "Speed": "Speed",
+ "Split connect": "Split connect",
+ "Split connect number": "One session can support up to three split screen connection",
+ "Split vertically": "Split vertically",
+ "Start Time: ": "Start time: {{value}}",
+ "Stop": "Stop",
+ "Support": "Support",
+ "Swiss French keyboard layout": "Swiss French (Qwertz)",
+ "Switch to input command": "Switch to input command",
+ "Switch to quick command": "Switch to quick command",
+ "Tab List": "Tabs",
+ "The connection method is invalid, please refresh the page": "The connection method is invalid, please refresh the page",
+ "Ticket review approved for login asset": " The login audit has been approved, connect to the asset?",
+ "Ticket review closed for login asset": "This login review has been closed, and the asset cannot be connected",
+ "Ticket review pending for login asset": "The login asset has been submitted, waiting for review by the assignee, you can also copy the link and send it to he",
+ "Ticket review rejected for login asset": "This login review has been rejected, and the asset cannot be connected",
+ "Tips": "Tips",
+ "Token expired": "Token has expired",
+ "Tool download": "Tool download",
+ "Turkey keyboard layout": "Turkish-Q (Qwerty)",
+ "Type tree": "Type tree",
+ "UK English keyboard layout": "UK English (Qwerty)",
+ "US English keyboard layout": "US English (Qwerty)",
+ "User": "User",
+ "User: ": "User: {{value}}",
+ "Username": "Username",
+ "Username@Domain": "Username@Domain",
+ "Users": "",
+ "Using token": "Using token",
+ "View": "View",
+ "VirtualApp": "Virtual App",
+ "Web Terminal": "Web Terminal",
+ "Website": "Website",
+ "With secret accounts": "With secret accounts",
+ "Yes": "Yes",
+ "asset": "asset",
+ "cols": "cols",
+ "confirm": "confirm",
+ "connect info": "connect info",
+ "download": "download",
+ "rows": "rows",
+ "start time": "start time",
+ "success": "success",
+ "system user": "system user",
+ "user": "user"
+}
diff --git a/apps/i18n/luna/zh.json b/apps/i18n/luna/zh.json
new file mode 100644
index 000000000..6c7ef2b74
--- /dev/null
+++ b/apps/i18n/luna/zh.json
@@ -0,0 +1,208 @@
+{
+ "ACL reject login asset": "本次登录已拒绝,原因是访问控制策略的限制",
+ "Account info": "账号信息",
+ "Account not found": "账号未找到",
+ "Account: ": "账号: {{value}}",
+ "Action: ": "操作: ",
+ "Advanced option": "高级选项",
+ "All sessions": "全部会话",
+ "Applet": "远程应用",
+ "Applet connect method": "远程应用连接方式",
+ "Are you sure to reconnect it?(RDP not support)": "确定要重新连接吗? (RDP暂不支持)",
+ "Asset disabled": "该资产已被禁用,请联系管理员",
+ "Asset not found or You have no permission to access it, please refresh asset tree": "未找到资产或您无权访问它,请刷新资产树",
+ "Asset tree loading method": "配置资产树加载方式",
+ "Asset: ": "资产: {{value}}",
+ "Assignees": "受理人",
+ "Automatic login next": "下次自动登录 (右击资产连接可以重新选择)",
+ "Backspace as Ctrl+H": "字符终端Backspace As Ctrl+H",
+ "Batch actions": "批量操作",
+ "Batch connect": "批量连接",
+ "Belgian French keyboard layout": "Belgian French (Azerty)",
+ "CLI": "命令行",
+ "CLI font size": "字符终端字体大小",
+ "Cancel": "取消",
+ "Charset": "字符集",
+ "Checkbox": "多选",
+ "Choose a User": "选择一个用户",
+ "Click to copy": "点击复制",
+ "Client": "客户端",
+ "Clone Connect": "复制窗口",
+ "Close": "关闭",
+ "Close All Tabs": "关闭所有",
+ "Close Current Tab": "关闭当前",
+ "Close Left Tabs": "关闭左侧",
+ "Close Other Tabs": "关闭其它",
+ "Close Right Tabs": "关闭右侧",
+ "Close split connect": "关闭分屏",
+ "Command Line": "命令行",
+ "Command line": "连接命令行",
+ "Confirm": "确认",
+ "Connect": "连接",
+ "Connect method": "连接方式",
+ "Connect checked": "连接选中",
+ "Connect command line": "连接命令行",
+ "Copied": "已复制",
+ "Copy link": "复制链接",
+ "Current online": "当前在线",
+ "Current session": "当前会话",
+ "Database": "数据库",
+ "Database connect info": "数据库连接信息",
+ "Database disabled": "不支持此种链接方式,请联系管理员",
+ "Database info": "数据库信息",
+ "Database token help text": "数据库类型 token 会缓存 5 分钟,也就是说 token 使用后,不会立刻失效,而是客户端断开 5 分钟后,这个 token 才会完全失效",
+ "Databases": "数据库",
+ "Directly": "用户名指定连接的资产和账号",
+ "Disable auto completion": "禁用自动补全",
+ "Disconnect": "断开链接",
+ "Disfavor": "取消收藏",
+ "Do not close this page": "不要关闭本页面",
+ "Document": "文档",
+ "Don't prompt again": "下次不再提示",
+ "Download": "下载",
+ "Download the latest client": "下载最新客户端",
+ "Driver redirect": "磁盘挂载",
+ "Expand": "展开",
+ "Expand all": "展开全部",
+ "Expand all asset": "展开节点下的所有资产",
+ "Expire time": "过期时间",
+ "Failed to open address": "打开地址失败",
+ "Favorite": "收藏",
+ "File Manager": "文件管理",
+ "Fold": "折叠",
+ "Fold all": "折叠全部",
+ "Force refresh": "强制刷新",
+ "Found": "发现",
+ "French keyboard layout": "French (Azerty)",
+ "Full Screen": "全屏显示",
+ "Full screen": "全屏",
+ "GUI": "图形化",
+ "General": "基本配置",
+ "Help": "帮助",
+ "Help or download": "菜单帮助 → 下载",
+ "Help text": "说明",
+ "Hide left manager": "隐藏左边栏",
+ "Host": "主机",
+ "Info": "提示",
+ "InstallClientMsg": "JumpServer 客户端没有安装,现在去下载安装?",
+ "Japanese keyboard layout": "Japanese (Qwerty)",
+ "Keyboard keys": "Option + Left / Option + Right",
+ "Keyboard layout": "键盘布局",
+ "Keyboard switch session": "切换会话 → 快捷键",
+ "Kubernetes": "Kubernetes",
+ "Language": "语言",
+ "Last login": "上次登录",
+ "Launch Program": "启动程序",
+ "LeftInfo": "点击命令记录可快速定位录像",
+ "Load tree async": "异步加载资产树",
+ "Loading": "加载中",
+ "Log out": "退出登录",
+ "Login reminder": "登录提醒",
+ "Login review approved": "登录审核已通过, 正在连接资产...",
+ "LoginExpireMsg": "登录已过期,请重新登录",
+ "Manual accounts": "手动账号",
+ "Module": "模块",
+ "Multi Screen": "多屏显示",
+ "My applications": "我的应用",
+ "My assets": "我的资产",
+ "Name": "名称",
+ "Native": "客户端",
+ "Need review for login asset": "本次登录需要进行人工审核,是否继续?",
+ "Need to use": "需要使用",
+ "No": "否",
+ "No account available": "没有可用账号",
+ "No available connect method": "没有可用的连接方法",
+ "No matching found": "没有匹配项",
+ "No permission": "没有权限",
+ "No protocol available": "没有可用的协议",
+ "Not quick command": "暂无快捷命令",
+ "Open in new window": "新窗口打开",
+ "Password": "密码",
+ "Password is token password on the table": "密码是表格中的 Token 密码",
+ "Password is your password login to system": "密码是你登录系统的密码",
+ "Pause": "暂停",
+ "Pause task has been send": "暂停任务已发送",
+ "Please choose an account": "请选择一个用户",
+ "Please input password": "请输入密码",
+ "Port": "端口",
+ "Protocol": "协议",
+ "Protocol: ": "协议: {{value}}",
+ "RDP Client": "RDP 客户端",
+ "RDP File": "RDP 文件",
+ "RDP client options": "RDP 客户端选项",
+ "RDP color quality": "RDP 颜色质量",
+ "RDP resolution": "RDP 分辨率",
+ "RDP smart size": "RDP 智能大小",
+ "Re-use for a long time after opening": "开启后该连接信息可长时间多次使用",
+ "Reconnect": "重新连接",
+ "Refresh": "刷新",
+ "Remember password": "记住密码",
+ "Remember select": "记住选择",
+ "RemoteApp": "远程应用",
+ "Reselect connection method": "可重新选择连接方式",
+ "Resume": "恢复",
+ "Resume task has been send": "恢复任务已发送",
+ "Right click asset": "右击资产 → 连接",
+ "Right click node": "右击节点 → 展开全部",
+ "Right mouse quick paste": "右键快速粘贴",
+ "Run it by client": "使用客户端执行",
+ "SQL Client": "SQL 客户端",
+ "Save command": "保存命令",
+ "Save success": "保存成功",
+ "Search": "搜索",
+ "Select account": "选择账号",
+ "Send command": "发送命令",
+ "Send text to all ssh terminals": "发送文本到所有ssh终端",
+ "Set reusable": "开启复用",
+ "Setting": "设置",
+ "Settings or basic settings": "菜单设置 → 基本设置",
+ "Show left manager": "显示左边栏",
+ "Skip": "跳过",
+ "Skip manual password": "跳过手动密码窗",
+ "Special accounts": "特殊账号",
+ "Speed": "速度",
+ "Split connect": "分屏连接",
+ "Split connect number": "一个会话最多支持3个分屏连接",
+ "Split vertically": "垂直分屏",
+ "Start Time: ": "开始时间: {{value}}",
+ "Stop": "停止",
+ "Support": "支持",
+ "Swiss French keyboard layout": "Swiss French (Qwertz)",
+ "Switch to input command": "切换到输入命令",
+ "Switch to quick command": "切换到快捷命令",
+ "Tab List": "窗口列表",
+ "The connection method is invalid, please refresh the page": "该连接方式已失效,请刷新页面",
+ "Ticket review approved for login asset": "本次登录审核已通过,是否连接资产?",
+ "Ticket review closed for login asset": "本次登录审核已关闭,不能连接资产",
+ "Ticket review pending for login asset": "登录申请已提交,等待受理人进行复核,你也可以复制链接发给他",
+ "Ticket review rejected for login asset": "本次登录审核已拒绝,不能连接资产",
+ "Tips": "提示",
+ "Token expired": "Token 已过期, 请重新连接",
+ "Tool download": "工具下载",
+ "Turkey keyboard layout": "Turkish-Q (Qwerty)",
+ "Type tree": "类型树",
+ "UK English keyboard layout": "UK English (Qwerty)",
+ "US English keyboard layout": "US English (Qwerty)",
+ "User": "用户",
+ "User: ": "用户: {{value}}",
+ "Username": "用户名",
+ "Username@Domain": "用户名@AD域",
+ "Users": "用户",
+ "Using token": "使用 Token",
+ "View": "视图",
+ "VirtualApp": "虚拟应用",
+ "Web Terminal": "Web终端",
+ "Website": "官网",
+ "With secret accounts": "托管账号",
+ "Yes": "是",
+ "asset": "资产",
+ "cols": "列数",
+ "confirm": "确认",
+ "connect info": "连接信息",
+ "download": "下载",
+ "rows": "行数",
+ "start time": "开始时间",
+ "success": "成功",
+ "system user": "系统用户",
+ "user": "用户"
+}
diff --git a/apps/i18n/sort_json.py b/apps/i18n/sort_json.py
new file mode 100644
index 000000000..24db7404f
--- /dev/null
+++ b/apps/i18n/sort_json.py
@@ -0,0 +1,25 @@
+#!/usr/bin/env python
+#
+
+import json
+import os
+
+
+def sort_json(json_file):
+ with open(json_file, 'r') as f:
+ json_data = json.load(f)
+
+ with open(json_file, 'w') as f:
+ json.dump(json_data, f, indent=4, sort_keys=True, ensure_ascii=False)
+
+
+def walk_dir(dir_path):
+ for root, dirs, files in os.walk(dir_path):
+ for file in files:
+ if file.endswith('.json'):
+ sort_json(os.path.join(root, file))
+
+
+if __name__ == '__main__':
+ base_dir = os.path.dirname(os.path.abspath(__file__))
+ walk_dir(base_dir)
diff --git a/apps/i18n/translate.py b/apps/i18n/translate.py
new file mode 100644
index 000000000..cd5be62f8
--- /dev/null
+++ b/apps/i18n/translate.py
@@ -0,0 +1,61 @@
+import asyncio
+import os
+
+from _translator.const import LOCALE_DIR, RED
+from _translator.core import CoreTranslateManager
+from _translator.other import OtherTranslateManager
+from _translator.utils import OpenAITranslate
+
+
+class Translate:
+ IGNORE_TRANSLATE_DIRS = ('translate',)
+
+ def __init__(self, oai_trans_instance):
+ self.oai_trans = oai_trans_instance
+
+ def get_dir_names(self):
+ dir_names = []
+ for name in os.listdir(LOCALE_DIR):
+ _path = os.path.join(LOCALE_DIR, name)
+ if not os.path.isdir(_path) or name in self.IGNORE_TRANSLATE_DIRS:
+ continue
+ dir_names.append(name)
+ return dir_names
+
+ async def core_trans(self, dir_name):
+ return
+ _dir = os.path.join(LOCALE_DIR, dir_name)
+ zh_file = os.path.join(_dir, 'zh', 'LC_MESSAGES', 'django.po')
+ if not os.path.exists(zh_file):
+ print(f'{RED}File: {zh_file} not exists.{RED}')
+ return
+
+ await CoreTranslateManager(_dir, self.oai_trans).run()
+
+ async def other_trans(self, dir_name):
+ _dir = os.path.join(LOCALE_DIR, dir_name)
+ zh_file = os.path.join(_dir, 'zh.json')
+ if not os.path.exists(zh_file):
+ print(f'{RED}File: {zh_file} not exists.{RED}\n')
+ return
+
+ await OtherTranslateManager(_dir, self.oai_trans).run()
+
+ async def run(self):
+ dir_names = self.get_dir_names()
+ if not dir_names:
+ return
+
+ for dir_name in dir_names:
+ if dir_name.startswith('_'):
+ continue
+ if hasattr(self, f'{dir_name}_trans'):
+ await getattr(self, f'{dir_name}_trans')(dir_name)
+ else:
+ await self.other_trans(dir_name)
+
+
+if __name__ == '__main__':
+ oai_trans = OpenAITranslate()
+ manager = Translate(oai_trans)
+ asyncio.run(manager.run())
diff --git a/apps/jumpserver/settings/base.py b/apps/jumpserver/settings/base.py
index a17c48bfc..46c688d05 100644
--- a/apps/jumpserver/settings/base.py
+++ b/apps/jumpserver/settings/base.py
@@ -297,7 +297,7 @@ USE_TZ = True
# I18N translation
LOCALE_PATHS = [
- os.path.join(BASE_DIR, 'locale'),
+ os.path.join(BASE_DIR, 'i18n', 'core'),
]
# Static files (CSS, JavaScript, Images)
diff --git a/apps/jumpserver/views/other.py b/apps/jumpserver/views/other.py
index 6a05acaa5..6ff280d57 100644
--- a/apps/jumpserver/views/other.py
+++ b/apps/jumpserver/views/other.py
@@ -6,6 +6,7 @@ from django.conf import settings
from django.http import HttpResponse
from django.http import HttpResponseRedirect, JsonResponse, Http404
from django.shortcuts import redirect
+from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from django.views.decorators.csrf import csrf_exempt
from django.views.generic import View, TemplateView
@@ -32,7 +33,8 @@ class I18NView(View):
def get(self, request, lang):
referer_url = request.META.get('HTTP_REFERER', '/')
response = HttpResponseRedirect(referer_url)
- response.set_cookie(settings.LANGUAGE_COOKIE_NAME, lang)
+ expires = timezone.now() + timezone.timedelta(days=365)
+ response.set_cookie(settings.LANGUAGE_COOKIE_NAME, lang, expires=expires)
return response
diff --git a/apps/labels/apps.py b/apps/labels/apps.py
index a3bf4dabd..de4a313a5 100644
--- a/apps/labels/apps.py
+++ b/apps/labels/apps.py
@@ -5,4 +5,4 @@ from django.utils.translation import gettext_lazy as _
class LabelsConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'labels'
- verbose_name = _('Labels')
+ verbose_name = _('App Labels')
diff --git a/apps/notifications/apps.py b/apps/notifications/apps.py
index 07ce8ff48..98f9e7cab 100644
--- a/apps/notifications/apps.py
+++ b/apps/notifications/apps.py
@@ -4,7 +4,7 @@ from django.utils.translation import gettext_lazy as _
class NotificationsConfig(AppConfig):
name = 'notifications'
- verbose_name = _('Notifications')
+ verbose_name = _('App Notifications')
def ready(self):
from . import signal_handlers # noqa
diff --git a/apps/ops/apps.py b/apps/ops/apps.py
index a29a03749..cf41034df 100644
--- a/apps/ops/apps.py
+++ b/apps/ops/apps.py
@@ -6,7 +6,7 @@ from django.utils.translation import gettext_lazy as _
class OpsConfig(AppConfig):
name = 'ops'
- verbose_name = _('App ops')
+ verbose_name = _('App Ops')
def ready(self):
from orgs.models import Organization
diff --git a/apps/ops/migrations/0001_initial.py b/apps/ops/migrations/0001_initial.py
index 94643ffa0..56a6030ba 100644
--- a/apps/ops/migrations/0001_initial.py
+++ b/apps/ops/migrations/0001_initial.py
@@ -59,7 +59,7 @@ class Migration(migrations.Migration):
('name', models.CharField(max_length=128, unique=True, verbose_name='Name')),
('interval', models.IntegerField(blank=True, help_text='Units: seconds', null=True, verbose_name='Interval')),
('crontab', models.CharField(blank=True, help_text='5 * * * *', max_length=128, null=True, verbose_name='Crontab')),
- ('is_periodic', models.BooleanField(default=False, verbose_name='Periodic perform')),
+ ('is_periodic', models.BooleanField(default=False, verbose_name='Periodic run')),
('callback', models.CharField(blank=True, max_length=128, null=True, verbose_name='Callback')),
('is_deleted', models.BooleanField(default=False)),
('comment', models.TextField(blank=True, verbose_name='Comment')),
diff --git a/apps/ops/migrations/0017_auto_20200306_1747.py b/apps/ops/migrations/0017_auto_20200306_1747.py
index 8eb64257c..efcea5d4d 100644
--- a/apps/ops/migrations/0017_auto_20200306_1747.py
+++ b/apps/ops/migrations/0017_auto_20200306_1747.py
@@ -13,11 +13,11 @@ class Migration(migrations.Migration):
migrations.AlterField(
model_name='task',
name='crontab',
- field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Regularly perform'),
+ field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Crontab'),
),
migrations.AlterField(
model_name='task',
name='interval',
- field=models.IntegerField(blank=True, default=24, null=True, verbose_name='Cycle perform'),
+ field=models.IntegerField(blank=True, default=24, null=True, verbose_name='Interval'),
),
]
diff --git a/apps/ops/migrations/0023_auto_20220912_0021.py b/apps/ops/migrations/0023_auto_20220912_0021.py
index a55ba48f1..15af282fe 100644
--- a/apps/ops/migrations/0023_auto_20220912_0021.py
+++ b/apps/ops/migrations/0023_auto_20220912_0021.py
@@ -60,9 +60,9 @@ class Migration(migrations.Migration):
('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
('org_id',
models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')),
- ('is_periodic', models.BooleanField(default=False, verbose_name='Periodic perform')),
- ('interval', models.IntegerField(blank=True, default=24, null=True, verbose_name='Cycle perform')),
- ('crontab', models.CharField(blank=True, max_length=128, null=True, verbose_name='Regularly perform')),
+ ('is_periodic', models.BooleanField(default=False, verbose_name='Periodic run')),
+ ('interval', models.IntegerField(blank=True, default=24, null=True, verbose_name='Interval')),
+ ('crontab', models.CharField(blank=True, max_length=128, null=True, verbose_name='Crontab')),
('name', models.CharField(max_length=128, null=True, verbose_name='Name')),
('instant', models.BooleanField(default=False)),
('args', models.CharField(blank=True, default='', max_length=1024, null=True, verbose_name='Args')),
@@ -164,9 +164,9 @@ class Migration(migrations.Migration):
('id', models.UUIDField(db_index=True, default=uuid.uuid4)),
('org_id',
models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')),
- ('is_periodic', models.BooleanField(default=False, verbose_name='Periodic perform')),
- ('interval', models.IntegerField(blank=True, default=24, null=True, verbose_name='Cycle perform')),
- ('crontab', models.CharField(blank=True, max_length=128, null=True, verbose_name='Regularly perform')),
+ ('is_periodic', models.BooleanField(default=False, verbose_name='Periodic run')),
+ ('interval', models.IntegerField(blank=True, default=24, null=True, verbose_name='Interval')),
+ ('crontab', models.CharField(blank=True, max_length=128, null=True, verbose_name='Crontab')),
('name', models.CharField(max_length=128, null=True, verbose_name='Name')),
('instant', models.BooleanField(default=False)),
('args', models.CharField(blank=True, default='', max_length=1024, null=True, verbose_name='Args')),
diff --git a/apps/ops/mixin.py b/apps/ops/mixin.py
index 549e422ee..9e884ee4b 100644
--- a/apps/ops/mixin.py
+++ b/apps/ops/mixin.py
@@ -20,14 +20,12 @@ class PeriodTaskModelMixin(models.Model):
name = models.CharField(
max_length=128, unique=False, verbose_name=_("Name")
)
- is_periodic = models.BooleanField(default=False, verbose_name=_("Periodic perform"))
+ is_periodic = models.BooleanField(default=False, verbose_name=_("Periodic run"))
interval = models.IntegerField(
- default=24, null=True, blank=True,
- verbose_name=_("Cycle perform"),
+ default=24, null=True, blank=True, verbose_name=_("Interval"),
)
crontab = models.CharField(
- null=True, blank=True, max_length=128,
- verbose_name=_("Regularly perform"),
+ blank=True, max_length=128, null=True, verbose_name=_("Crontab"),
)
@abc.abstractmethod
@@ -85,9 +83,9 @@ class PeriodTaskModelMixin(models.Model):
@property
def periodic_display(self):
if self.is_periodic and self.crontab:
- return _('Regularly perform') + " ( {} )".format(self.crontab)
+ return _('Crontab') + " ( {} )".format(self.crontab)
if self.is_periodic and self.interval:
- return _('Cycle perform') + " ( {} h )".format(self.interval)
+ return _('Interval') + " ( {} h )".format(self.interval)
return '-'
@property
@@ -101,14 +99,15 @@ class PeriodTaskModelMixin(models.Model):
class PeriodTaskSerializerMixin(serializers.Serializer):
- is_periodic = serializers.BooleanField(default=True, label=_("Periodic perform"))
+ is_periodic = serializers.BooleanField(default=True, label=_("Periodic run"))
crontab = serializers.CharField(
max_length=128, allow_blank=True,
- allow_null=True, required=False, label=_('Regularly perform')
+ allow_null=True, required=False, label=_('Crontab')
)
interval = serializers.IntegerField(
default=24, allow_null=True, required=False, label=_('Interval')
)
+ periodic_display = serializers.CharField(read_only=True, label=_('Run period'))
INTERVAL_MAX = 65535
INTERVAL_MIN = 1
@@ -135,6 +134,15 @@ class PeriodTaskSerializerMixin(serializers.Serializer):
crontab = self.initial_data.get('crontab')
interval = self.initial_data.get('interval')
if ok and not any([crontab, interval]):
- msg = _("Require periodic or regularly perform setting")
+ msg = _("Require interval or crontab setting")
raise serializers.ValidationError(msg)
return ok
+
+ def validate(self, attrs):
+ attrs = super().validate(attrs)
+ if not attrs.get('is_periodic'):
+ attrs['interval'] = None
+ attrs['crontab'] = ''
+ if attrs.get('crontab'):
+ attrs['interval'] = None
+ return attrs
diff --git a/apps/ops/models/adhoc.py b/apps/ops/models/adhoc.py
index f55b6f3d0..3ca2fa281 100644
--- a/apps/ops/models/adhoc.py
+++ b/apps/ops/models/adhoc.py
@@ -8,7 +8,7 @@ from common.utils import get_logger
__all__ = ["AdHoc"]
-from ops.const import AdHocModules
+from ops.const import AdHocModules
from orgs.mixins.models import JMSOrgBaseModel
diff --git a/apps/ops/notifications.py b/apps/ops/notifications.py
index b7b8a0164..1e63a0527 100644
--- a/apps/ops/notifications.py
+++ b/apps/ops/notifications.py
@@ -14,8 +14,8 @@ __all__ = ('ServerPerformanceMessage', 'ServerPerformanceCheckUtil')
class ServerPerformanceMessage(SystemMessage):
- category = 'Operations'
- category_label = _('App ops')
+ category = 'Components'
+ category_label = _('Component')
message_type_label = _('Server performance')
def __init__(self, terms_with_errors):
diff --git a/apps/ops/serializers/celery.py b/apps/ops/serializers/celery.py
index aeaabd783..1ed7a2bc7 100644
--- a/apps/ops/serializers/celery.py
+++ b/apps/ops/serializers/celery.py
@@ -29,9 +29,11 @@ class CeleryPeriodTaskSerializer(serializers.ModelSerializer):
class CeleryTaskSerializer(serializers.ModelSerializer):
- exec_cycle = serializers.CharField(read_only=True)
- next_exec_time = serializers.DateTimeField(format="%Y/%m/%d %H:%M:%S", read_only=True)
enabled = serializers.BooleanField(required=False)
+ exec_cycle = serializers.CharField(read_only=True, label=_('Execution cycle'))
+ next_exec_time = serializers.DateTimeField(
+ format="%Y/%m/%d %H:%M:%S", read_only=True, label=_('Next execution time')
+ )
class Meta:
model = CeleryTask
diff --git a/apps/ops/serializers/job.py b/apps/ops/serializers/job.py
index 915e19575..b05727596 100644
--- a/apps/ops/serializers/job.py
+++ b/apps/ops/serializers/job.py
@@ -12,7 +12,7 @@ from orgs.mixins.serializers import BulkOrgResourceModelSerializer
class JobSerializer(BulkOrgResourceModelSerializer, PeriodTaskSerializerMixin):
creator = ReadableHiddenField(default=serializers.CurrentUserDefault())
- run_after_save = serializers.BooleanField(label=_("Run after save"), default=False, required=False)
+ run_after_save = serializers.BooleanField(label=_("Execute after saving"), default=False, required=False)
nodes = serializers.ListField(required=False, child=serializers.CharField())
date_last_run = serializers.DateTimeField(label=_('Date last run'), read_only=True)
name = serializers.CharField(label=_('Name'), max_length=128, allow_blank=True, required=False)
@@ -48,6 +48,9 @@ class JobSerializer(BulkOrgResourceModelSerializer, PeriodTaskSerializerMixin):
"is_periodic", "interval", "crontab", "nodes",
"run_after_save"
]
+ extra_kwargs = {
+ 'average_time_cost': {'label': _('Average time cost')},
+ }
class FileSerializer(serializers.Serializer):
diff --git a/apps/orgs/apps.py b/apps/orgs/apps.py
index 150f346ec..361b53dc6 100644
--- a/apps/orgs/apps.py
+++ b/apps/orgs/apps.py
@@ -4,7 +4,7 @@ from django.utils.translation import gettext_lazy as _
class OrgsConfig(AppConfig):
name = 'orgs'
- verbose_name = _('App organizations')
+ verbose_name = _('App Organizations')
def ready(self):
from . import signal_handlers # noqa
diff --git a/apps/orgs/serializers.py b/apps/orgs/serializers.py
index efa1fa311..fd4c16059 100644
--- a/apps/orgs/serializers.py
+++ b/apps/orgs/serializers.py
@@ -1,3 +1,4 @@
+from django.utils.translation import gettext_lazy as _
from rest_framework import serializers
from rest_framework.serializers import ModelSerializer
@@ -6,15 +7,15 @@ from .utils import get_current_org
class ResourceStatisticsSerializer(serializers.Serializer):
- users_amount = serializers.IntegerField(required=False)
- groups_amount = serializers.IntegerField(required=False)
+ users_amount = serializers.IntegerField(required=False, label=_('Users amount'))
+ groups_amount = serializers.IntegerField(required=False, label=_('User groups amount'))
- assets_amount = serializers.IntegerField(required=False)
- nodes_amount = serializers.IntegerField(required=False)
- domains_amount = serializers.IntegerField(required=False)
- gateways_amount = serializers.IntegerField(required=False)
+ assets_amount = serializers.IntegerField(required=False, label=_('Assets amount'))
+ nodes_amount = serializers.IntegerField(required=False, label=_('Nodes amount'))
+ domains_amount = serializers.IntegerField(required=False, label=_('Domains amount'))
+ gateways_amount = serializers.IntegerField(required=False, label=_('Gateways amount'))
- asset_perms_amount = serializers.IntegerField(required=False)
+ asset_perms_amount = serializers.IntegerField(required=False, label=_('Asset permissions amount'))
class OrgSerializer(ModelSerializer):
diff --git a/apps/perms/apps.py b/apps/perms/apps.py
index ee9e9c0e3..968f67e95 100644
--- a/apps/perms/apps.py
+++ b/apps/perms/apps.py
@@ -6,7 +6,7 @@ from django.utils.translation import gettext_lazy as _
class PermsConfig(AppConfig):
name = 'perms'
- verbose_name = _('App permissions')
+ verbose_name = _('App Permissions')
def ready(self):
from . import signal_handlers # noqa
diff --git a/apps/perms/serializers/permission.py b/apps/perms/serializers/permission.py
index 74a7fac26..a7e75d393 100644
--- a/apps/perms/serializers/permission.py
+++ b/apps/perms/serializers/permission.py
@@ -29,16 +29,20 @@ class ActionChoicesField(BitChoicesField):
class AssetPermissionSerializer(ResourceLabelsMixin, BulkOrgResourceModelSerializer):
- users = ObjectRelatedField(queryset=User.objects, many=True, required=False, label=_('User'))
+ users = ObjectRelatedField(queryset=User.objects, many=True, required=False, label=_('Users'))
user_groups = ObjectRelatedField(
- queryset=UserGroup.objects, many=True, required=False, label=_('User group')
+ queryset=UserGroup.objects, many=True, required=False, label=_('Groups')
)
- assets = ObjectRelatedField(queryset=Asset.objects, many=True, required=False, label=_('Asset'))
- nodes = ObjectRelatedField(queryset=Node.objects, many=True, required=False, label=_('Node'))
+ assets = ObjectRelatedField(queryset=Asset.objects, many=True, required=False, label=_('Assets'))
+ nodes = ObjectRelatedField(queryset=Node.objects, many=True, required=False, label=_('Nodes'))
+ users_amount = serializers.IntegerField(read_only=True, label=_("Users amount"))
+ user_groups_amount = serializers.IntegerField(read_only=True, label=_("Groups amount"))
+ assets_amount = serializers.IntegerField(read_only=True, label=_("Assets amount"))
+ nodes_amount = serializers.IntegerField(read_only=True, label=_("Nodes amount"))
actions = ActionChoicesField(required=False, allow_null=True, label=_("Actions"))
is_valid = serializers.BooleanField(read_only=True, label=_("Is valid"))
is_expired = serializers.BooleanField(read_only=True, label=_("Is expired"))
- accounts = serializers.ListField(label=_("Account"), required=False)
+ accounts = serializers.ListField(label=_("Accounts"), required=False)
protocols = serializers.ListField(label=_("Protocols"), required=False)
template_accounts = AccountTemplate.objects.none()
@@ -46,13 +50,14 @@ class AssetPermissionSerializer(ResourceLabelsMixin, BulkOrgResourceModelSeriali
class Meta:
model = AssetPermission
fields_mini = ["id", "name"]
+ amount_fields = ["users_amount", "user_groups_amount", "assets_amount", "nodes_amount"]
fields_generic = [
"accounts", "protocols", "actions", "created_by", "date_created",
"date_start", "date_expired", "is_active", "is_expired",
"is_valid", "comment", "from_ticket",
]
fields_small = fields_mini + fields_generic
- fields_m2m = ["users", "user_groups", "assets", "nodes", "labels"]
+ fields_m2m = ["users", "user_groups", "assets", "nodes", "labels"] + amount_fields
fields = fields_mini + fields_m2m + fields_generic
read_only_fields = ["created_by", "date_created", "from_ticket"]
extra_kwargs = {
@@ -183,11 +188,6 @@ class AssetPermissionSerializer(ResourceLabelsMixin, BulkOrgResourceModelSeriali
class AssetPermissionListSerializer(AssetPermissionSerializer):
- users_amount = serializers.IntegerField(read_only=True, label=_("Users amount"))
- user_groups_amount = serializers.IntegerField(read_only=True, label=_("User groups amount"))
- assets_amount = serializers.IntegerField(read_only=True, label=_("Assets amount"))
- nodes_amount = serializers.IntegerField(read_only=True, label=_("Nodes amount"))
-
class Meta(AssetPermissionSerializer.Meta):
amount_fields = ["users_amount", "user_groups_amount", "assets_amount", "nodes_amount"]
fields = [item for item in (AssetPermissionSerializer.Meta.fields + amount_fields) if
diff --git a/apps/rbac/apps.py b/apps/rbac/apps.py
index e233185d5..9da8744f3 100644
--- a/apps/rbac/apps.py
+++ b/apps/rbac/apps.py
@@ -4,7 +4,7 @@ from django.utils.translation import gettext_lazy as _
class RBACConfig(AppConfig):
name = 'rbac'
- verbose_name = _('RBAC')
+ verbose_name = _('App RBAC')
def ready(self):
from . import signal_handlers # noqa
diff --git a/apps/rbac/tree.py b/apps/rbac/tree.py
index 8e9a56831..9057f4908 100644
--- a/apps/rbac/tree.py
+++ b/apps/rbac/tree.py
@@ -52,7 +52,7 @@ extra_nodes_data = [
{"id": "push_account_node", "name": _("Push account"), "pId": "accounts"},
{"id": "asset_change_plan_node", "name": _("Asset change auth"), "pId": "accounts"},
{"id": "terminal_node", "name": _("Terminal setting"), "pId": "view_setting"},
- {'id': "task_center", "name": _("Task Center"), "pId": "view_console"},
+ {'id': "task_center", "name": _("Job center"), "pId": "view_console"},
{'id': "my_assets", "name": _("My assets"), "pId": "view_workbench"},
{'id': "operation_center", "name": _('App ops'), "pId": "view_workbench"},
{'id': "remote_application", "name": _("Applet"), "pId": "view_setting"},
diff --git a/apps/settings/api/__init__.py b/apps/settings/api/__init__.py
index b30c60c59..5bd482cdc 100644
--- a/apps/settings/api/__init__.py
+++ b/apps/settings/api/__init__.py
@@ -3,6 +3,7 @@ from .dingtalk import *
from .email import *
from .feishu import *
from .lark import *
+from .i18n import *
from .ldap import *
from .public import *
from .security import *
diff --git a/apps/settings/api/i18n.py b/apps/settings/api/i18n.py
new file mode 100644
index 000000000..fffa4bb56
--- /dev/null
+++ b/apps/settings/api/i18n.py
@@ -0,0 +1,37 @@
+import json
+import os
+
+from django.conf import settings
+from django.utils._os import safe_join
+from rest_framework.generics import RetrieveAPIView
+from rest_framework.permissions import AllowAny
+from rest_framework.response import Response
+
+
+class ComponentI18nApi(RetrieveAPIView):
+ base_path = 'locale'
+ permission_classes = [AllowAny]
+
+ def retrieve(self, request, *args, **kwargs):
+ name = kwargs.get('name')
+ component_dir = safe_join(settings.APPS_DIR, 'i18n', name)
+ lang = request.query_params.get('lang')
+
+ if os.path.exists(component_dir):
+ files = os.listdir(component_dir)
+ else:
+ files = []
+ data = {}
+ for file in files:
+ if not file.endswith('.json'):
+ continue
+ _lang = file.split('.')[0]
+ with open(safe_join(component_dir, file), 'r') as f:
+ data[_lang] = json.load(f)
+
+ if lang:
+ data = data.get(lang) or {}
+ flat = request.query_params.get('flat', '1')
+ if flat == '0':
+ data = {lang: data}
+ return Response(data)
diff --git a/apps/settings/apps.py b/apps/settings/apps.py
index e18608331..fc87dc9f0 100644
--- a/apps/settings/apps.py
+++ b/apps/settings/apps.py
@@ -4,7 +4,7 @@ from django.utils.translation import gettext_lazy as _
class SettingsConfig(AppConfig):
name = 'settings'
- verbose_name = _('Settings')
+ verbose_name = _('App Settings')
def ready(self):
from . import signal_handlers # noqa
diff --git a/apps/settings/models.py b/apps/settings/models.py
index d6cda11df..b39408098 100644
--- a/apps/settings/models.py
+++ b/apps/settings/models.py
@@ -10,6 +10,7 @@ from django.utils.translation import gettext_lazy as _
from common.db.models import JMSBaseModel
from common.utils import signer, get_logger
+from .signals import setting_changed
logger = get_logger(__name__)
@@ -84,6 +85,7 @@ class Setting(models.Model):
if not item:
return
item.refresh_setting()
+ setting_changed.send(sender=cls, name=name, item=item)
def refresh_setting(self):
setattr(settings, self.name, self.cleaned_value)
diff --git a/apps/settings/serializers/auth/base.py b/apps/settings/serializers/auth/base.py
index bde6e781d..034ce7474 100644
--- a/apps/settings/serializers/auth/base.py
+++ b/apps/settings/serializers/auth/base.py
@@ -24,8 +24,8 @@ class AuthSettingSerializer(serializers.Serializer):
AUTH_PASSKEY = serializers.BooleanField(default=False, label=_("Passkey Auth"))
FORGOT_PASSWORD_URL = serializers.CharField(
required=False, allow_blank=True, max_length=1024,
- label=_("Forgot password url")
+ label=_("Forgot Password URL")
)
LOGIN_REDIRECT_MSG_ENABLED = serializers.BooleanField(
- required=False, label=_("Enable login redirect msg")
+ required=False, label=_("Login redirection prompt")
)
diff --git a/apps/settings/serializers/auth/cas.py b/apps/settings/serializers/auth/cas.py
index c85497b00..d66dadd7d 100644
--- a/apps/settings/serializers/auth/cas.py
+++ b/apps/settings/serializers/auth/cas.py
@@ -9,11 +9,11 @@ __all__ = [
class CASSettingSerializer(serializers.Serializer):
PREFIX_TITLE = _('CAS')
- AUTH_CAS = serializers.BooleanField(required=False, label=_('Enable CAS Auth'))
- CAS_SERVER_URL = serializers.CharField(required=False, max_length=1024, label=_('Server url'))
+ AUTH_CAS = serializers.BooleanField(required=False, label=_('CAS'))
+ CAS_SERVER_URL = serializers.CharField(required=False, max_length=1024, label=_('Server'))
CAS_ROOT_PROXIED_AS = serializers.CharField(
required=False, allow_null=True, allow_blank=True,
- max_length=1024, label=_('Proxy server url')
+ max_length=1024, label=_('Proxy Server')
)
CAS_LOGOUT_COMPLETELY = serializers.BooleanField(required=False, label=_('Logout completely'))
CAS_VERSION = serializers.IntegerField(
@@ -25,5 +25,8 @@ class CASSettingSerializer(serializers.Serializer):
CAS_APPLY_ATTRIBUTES_TO_USER = serializers.BooleanField(
required=False, label=_('Enable attributes map')
)
- CAS_RENAME_ATTRIBUTES = serializers.JSONField(required=False, label=_('Rename attr'))
- CAS_CREATE_USER = serializers.BooleanField(required=False, label=_('Create user if not'))
+ CAS_RENAME_ATTRIBUTES = serializers.JSONField(required=False, label=_('User attribute'))
+ CAS_CREATE_USER = serializers.BooleanField(
+ required=False, label=_('Create user'),
+ help_text=_('Automatically create a new user if not found.')
+ )
diff --git a/apps/settings/serializers/auth/dingtalk.py b/apps/settings/serializers/auth/dingtalk.py
index 418693bb8..d4d4b34d7 100644
--- a/apps/settings/serializers/auth/dingtalk.py
+++ b/apps/settings/serializers/auth/dingtalk.py
@@ -9,7 +9,7 @@ __all__ = ['DingTalkSettingSerializer']
class DingTalkSettingSerializer(serializers.Serializer):
PREFIX_TITLE = _('DingTalk')
- DINGTALK_AGENTID = serializers.CharField(max_length=256, required=True, label='AgentId')
- DINGTALK_APPKEY = serializers.CharField(max_length=256, required=True, label='AppKey')
- DINGTALK_APPSECRET = EncryptedField(max_length=256, required=False, label='AppSecret')
- AUTH_DINGTALK = serializers.BooleanField(default=False, label=_('Enable DingTalk Auth'))
+ DINGTALK_AGENTID = serializers.CharField(max_length=256, required=True, label='Agent ID')
+ DINGTALK_APPKEY = serializers.CharField(max_length=256, required=True, label='App Key')
+ DINGTALK_APPSECRET = EncryptedField(max_length=256, required=False, label='App Secret')
+ AUTH_DINGTALK = serializers.BooleanField(default=False, label=_('Dingtalk'))
diff --git a/apps/settings/serializers/auth/ldap.py b/apps/settings/serializers/auth/ldap.py
index 4229e1251..16db90d3f 100644
--- a/apps/settings/serializers/auth/ldap.py
+++ b/apps/settings/serializers/auth/ldap.py
@@ -39,7 +39,7 @@ class LDAPSettingSerializer(serializers.Serializer):
PREFIX_TITLE = _('LDAP')
AUTH_LDAP_SERVER_URI = serializers.CharField(
- required=True, max_length=1024, label=_('LDAP server'),
+ required=True, max_length=1024, label=_('Server'),
help_text=_('eg: ldap://localhost:389')
)
AUTH_LDAP_BIND_DN = serializers.CharField(required=False, max_length=1024, label=_('Bind DN'))
@@ -55,7 +55,7 @@ class LDAPSettingSerializer(serializers.Serializer):
help_text=_('Choice may be (cn|uid|sAMAccountName)=%(user)s)')
)
AUTH_LDAP_USER_ATTR_MAP = serializers.JSONField(
- required=True, label=_('User attr map'),
+ required=True, label=_('User attribute'),
help_text=_('User attr map present how to map LDAP user attr to '
'jumpserver, username,name,email is jumpserver attr')
)
@@ -63,14 +63,14 @@ class LDAPSettingSerializer(serializers.Serializer):
required=False, label=_('Organization'), max_length=36
)
AUTH_LDAP_SYNC_IS_PERIODIC = serializers.BooleanField(
- required=False, label=_('Periodic perform')
+ required=False, label=_('Periodic run')
)
AUTH_LDAP_SYNC_CRONTAB = serializers.CharField(
required=False, max_length=128, allow_null=True, allow_blank=True,
- label=_('Regularly perform')
+ label=_('Crontab')
)
AUTH_LDAP_SYNC_INTERVAL = serializers.IntegerField(
- required=False, default=24, allow_null=True, label=_('Cycle perform')
+ required=False, default=24, allow_null=True, label=_('Interval')
)
AUTH_LDAP_CONNECT_TIMEOUT = serializers.IntegerField(
min_value=1, max_value=300,
@@ -90,7 +90,7 @@ class LDAPSettingSerializer(serializers.Serializer):
required=False, label=_('Recipient'), max_length=36
)
- AUTH_LDAP = serializers.BooleanField(required=False, label=_('Enable LDAP auth'))
+ AUTH_LDAP = serializers.BooleanField(required=False, label=_('LDAP'))
@staticmethod
def post_save():
diff --git a/apps/settings/serializers/auth/oauth2.py b/apps/settings/serializers/auth/oauth2.py
index b5a0dbb62..d554c03ad 100644
--- a/apps/settings/serializers/auth/oauth2.py
+++ b/apps/settings/serializers/auth/oauth2.py
@@ -18,7 +18,7 @@ class OAuth2SettingSerializer(serializers.Serializer):
PREFIX_TITLE = _('OAuth2')
AUTH_OAUTH2 = serializers.BooleanField(
- default=False, label=_('Enable OAuth2 Auth')
+ default=False, label=_('OAuth2')
)
AUTH_OAUTH2_LOGO_PATH = SettingImageField(
allow_null=True, required=False, label=_('Logo')
@@ -36,24 +36,24 @@ class OAuth2SettingSerializer(serializers.Serializer):
required=True, max_length=1024, label=_('Scope'), allow_blank=True
)
AUTH_OAUTH2_PROVIDER_AUTHORIZATION_ENDPOINT = serializers.CharField(
- required=True, max_length=1024, label=_('Provider auth endpoint')
+ required=True, max_length=1024, label=_('Authorization endpoint')
)
AUTH_OAUTH2_ACCESS_TOKEN_ENDPOINT = serializers.CharField(
- required=True, max_length=1024, label=_('Provider token endpoint')
+ required=True, max_length=1024, label=_('Token endpoint')
)
AUTH_OAUTH2_ACCESS_TOKEN_METHOD = serializers.ChoiceField(
- default='GET', label=_('Client authentication method'),
+ default='GET', label=_('Request method'),
choices=(('GET', 'GET'), ('POST', 'POST-DATA'), ('POST_JSON', 'POST-JSON'))
)
AUTH_OAUTH2_PROVIDER_USERINFO_ENDPOINT = serializers.CharField(
- required=True, max_length=1024, label=_('Provider userinfo endpoint')
+ required=True, max_length=1024, label=_('Userinfo endpoint')
)
AUTH_OAUTH2_PROVIDER_END_SESSION_ENDPOINT = serializers.CharField(
- required=False, allow_blank=True, max_length=1024, label=_('Provider end session endpoint')
+ required=False, allow_blank=True, max_length=1024, label=_('End session endpoint')
)
AUTH_OAUTH2_LOGOUT_COMPLETELY = serializers.BooleanField(required=False, label=_('Logout completely'))
AUTH_OAUTH2_USER_ATTR_MAP = serializers.JSONField(
- required=True, label=_('User attr map')
+ required=True, label=_('User attribute')
)
AUTH_OAUTH2_ALWAYS_UPDATE_USER = serializers.BooleanField(
default=True, label=_('Always update user')
diff --git a/apps/settings/serializers/auth/oidc.py b/apps/settings/serializers/auth/oidc.py
index 0738de49a..44cecfbd5 100644
--- a/apps/settings/serializers/auth/oidc.py
+++ b/apps/settings/serializers/auth/oidc.py
@@ -13,7 +13,7 @@ class CommonSettingSerializer(serializers.Serializer):
# OpenID 公有配置参数 (version <= 1.5.8 或 version >= 1.5.8)
BASE_SITE_URL = serializers.CharField(
required=False, allow_null=True, allow_blank=True,
- max_length=1024, label=_('Base site url')
+ max_length=1024, label=_('Base site URL')
)
AUTH_OPENID_CLIENT_ID = serializers.CharField(
required=False, max_length=1024, label=_('Client Id')
@@ -27,14 +27,14 @@ class CommonSettingSerializer(serializers.Serializer):
('client_secret_basic', 'Client Secret Basic'),
('client_secret_post', 'Client Secret Post')
),
- label=_('Client authentication method')
+ label=_('Request method')
)
AUTH_OPENID_SHARE_SESSION = serializers.BooleanField(required=False, label=_('Share session'))
AUTH_OPENID_IGNORE_SSL_VERIFICATION = serializers.BooleanField(
- required=False, label=_('Ignore ssl verification')
+ required=False, label=_('Ignore SSL verification')
)
AUTH_OPENID_USER_ATTR_MAP = serializers.JSONField(
- required=True, label=_('User attr map'),
+ required=True, label=_('User attribute'),
help_text=_('User attr map present how to map OpenID user attr to '
'jumpserver, username,name,email is jumpserver attr')
)
@@ -51,7 +51,7 @@ class KeycloakSettingSerializer(CommonSettingSerializer):
label=_("Use Keycloak"), required=False, default=False
)
AUTH_OPENID_SERVER_URL = serializers.CharField(
- required=False, max_length=1024, label=_('Server url')
+ required=False, max_length=1024, label=_('Server')
)
AUTH_OPENID_REALM_NAME = serializers.CharField(
required=False, max_length=1024, allow_null=True, label=_('Realm name')
@@ -60,37 +60,37 @@ class KeycloakSettingSerializer(CommonSettingSerializer):
class OIDCSettingSerializer(KeycloakSettingSerializer):
# OpenID 新配置参数 (version >= 1.5.9)
- AUTH_OPENID = serializers.BooleanField(required=False, label=_('Enable OPENID Auth'))
+ AUTH_OPENID = serializers.BooleanField(required=False, label=_('OIDC'))
AUTH_OPENID_PROVIDER_ENDPOINT = serializers.CharField(
required=False, max_length=1024, label=_('Provider endpoint')
)
AUTH_OPENID_PROVIDER_AUTHORIZATION_ENDPOINT = serializers.CharField(
- required=False, max_length=1024, label=_('Provider auth endpoint')
+ required=False, max_length=1024, label=_('Authorization endpoint')
)
AUTH_OPENID_PROVIDER_TOKEN_ENDPOINT = serializers.CharField(
- required=False, max_length=1024, label=_('Provider token endpoint')
+ required=False, max_length=1024, label=_('Token endpoint')
)
AUTH_OPENID_PROVIDER_JWKS_ENDPOINT = serializers.CharField(
- required=False, max_length=1024, label=_('Provider jwks endpoint')
+ required=False, max_length=1024, label=_('JWKS endpoint')
)
AUTH_OPENID_PROVIDER_USERINFO_ENDPOINT = serializers.CharField(
- required=False, max_length=1024, label=_('Provider userinfo endpoint')
+ required=False, max_length=1024, label=_('Userinfo endpoint')
)
AUTH_OPENID_PROVIDER_END_SESSION_ENDPOINT = serializers.CharField(
- required=False, max_length=1024, label=_('Provider end session endpoint')
+ required=False, max_length=1024, label=_('End session endpoint')
)
AUTH_OPENID_PROVIDER_SIGNATURE_ALG = serializers.CharField(
- required=False, max_length=1024, label=_('Provider sign alg')
+ required=False, max_length=1024, label=_('Signature algorithm')
)
AUTH_OPENID_PROVIDER_SIGNATURE_KEY = serializers.CharField(
- required=False, max_length=1024, allow_null=True, label=_('Provider sign key')
+ required=False, max_length=1024, allow_null=True, label=_('Signing key')
)
AUTH_OPENID_SCOPES = serializers.CharField(required=False, max_length=1024, label=_('Scopes'))
AUTH_OPENID_ID_TOKEN_MAX_AGE = serializers.IntegerField(
- required=False, label=_('Id token max age (s)')
+ required=False, label=_('ID Token max age (s)')
)
AUTH_OPENID_ID_TOKEN_INCLUDE_CLAIMS = serializers.BooleanField(
- required=False, label=_('Id token include claims')
+ required=False, label=_('ID Token include claims')
)
AUTH_OPENID_USE_STATE = serializers.BooleanField(required=False, label=_('Use state'))
AUTH_OPENID_USE_NONCE = serializers.BooleanField(required=False, label=_('Use nonce'))
diff --git a/apps/settings/serializers/auth/passkey.py b/apps/settings/serializers/auth/passkey.py
index 6d65da26b..fd2155e4c 100644
--- a/apps/settings/serializers/auth/passkey.py
+++ b/apps/settings/serializers/auth/passkey.py
@@ -8,15 +8,15 @@ class PasskeySettingSerializer(serializers.Serializer):
PREFIX_TITLE = _('Passkey')
AUTH_PASSKEY = serializers.BooleanField(
- default=False, label=_('Enable passkey Auth'),
+ default=False, label=_('Passkey'),
help_text=_('Only SSL domain can use passkey auth')
)
FIDO_SERVER_ID = serializers.CharField(
- max_length=255, label=_('FIDO server ID'), required=False, allow_blank=True,
+ max_length=255, label=_('FIDO Server ID'), required=False, allow_blank=True,
help_text=_(
'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'
)
)
- FIDO_SERVER_NAME = serializers.CharField(max_length=255, label=_('FIDO server name'))
+ FIDO_SERVER_NAME = serializers.CharField(max_length=255, label=_('FIDO Server name'))
diff --git a/apps/settings/serializers/auth/radius.py b/apps/settings/serializers/auth/radius.py
index b4085c352..859f577e4 100644
--- a/apps/settings/serializers/auth/radius.py
+++ b/apps/settings/serializers/auth/radius.py
@@ -12,7 +12,7 @@ __all__ = ['RadiusSettingSerializer']
class RadiusSettingSerializer(serializers.Serializer):
PREFIX_TITLE = _('Radius')
- AUTH_RADIUS = serializers.BooleanField(required=False, label=_('Enable Radius Auth'))
+ AUTH_RADIUS = serializers.BooleanField(required=False, label=_('Radius'))
RADIUS_SERVER = serializers.CharField(required=False, allow_blank=True, max_length=1024, label=_('Host'))
RADIUS_PORT = serializers.IntegerField(required=False, label=_('Port'))
RADIUS_SECRET = EncryptedField(
diff --git a/apps/settings/serializers/auth/saml2.py b/apps/settings/serializers/auth/saml2.py
index 35a4ef5d5..7e49a3895 100644
--- a/apps/settings/serializers/auth/saml2.py
+++ b/apps/settings/serializers/auth/saml2.py
@@ -10,13 +10,13 @@ class SAML2SettingSerializer(serializers.Serializer):
PREFIX_TITLE = _('SAML2')
AUTH_SAML2 = serializers.BooleanField(
- default=False, required=False, label=_('Enable SAML2 Auth')
+ default=False, required=False, label=_('SAML2')
)
SAML2_IDP_METADATA_URL = serializers.URLField(
- allow_blank=True, required=False, label=_('IDP metadata URL')
+ allow_blank=True, required=False, label=_('IDP Metadata URL')
)
SAML2_IDP_METADATA_XML = serializers.CharField(
- allow_blank=True, required=False, label=_('IDP metadata XML')
+ allow_blank=True, required=False, label=_('IDP Metadata XML')
)
SAML2_SP_ADVANCED_SETTINGS = serializers.JSONField(
required=False, label=_('SP advanced settings')
@@ -29,6 +29,6 @@ class SAML2SettingSerializer(serializers.Serializer):
allow_blank=True, required=False,
write_only=True, label=_('SP cert')
)
- SAML2_RENAME_ATTRIBUTES = serializers.JSONField(required=False, label=_('Rename attr'))
+ SAML2_RENAME_ATTRIBUTES = serializers.JSONField(required=False, label=_('User attribute'))
SAML2_LOGOUT_COMPLETELY = serializers.BooleanField(required=False, label=_('Logout completely'))
AUTH_SAML2_ALWAYS_UPDATE_USER = serializers.BooleanField(required=False, label=_('Always update user'))
diff --git a/apps/settings/serializers/auth/slack.py b/apps/settings/serializers/auth/slack.py
index 019137f4c..244fd2cbd 100644
--- a/apps/settings/serializers/auth/slack.py
+++ b/apps/settings/serializers/auth/slack.py
@@ -9,7 +9,7 @@ __all__ = ['SlackSettingSerializer']
class SlackSettingSerializer(serializers.Serializer):
PREFIX_TITLE = _('Slack')
- AUTH_SLACK = serializers.BooleanField(default=False, label=_('Enable Slack Auth'))
+ AUTH_SLACK = serializers.BooleanField(default=False, label=_('Slack'))
SLACK_CLIENT_ID = serializers.CharField(max_length=256, required=True, label='Client ID')
SLACK_CLIENT_SECRET = EncryptedField(max_length=256, required=False, label='Client Secret')
SLACK_BOT_TOKEN = EncryptedField(max_length=256, required=False, label='Client bot Token')
diff --git a/apps/settings/serializers/auth/sms.py b/apps/settings/serializers/auth/sms.py
index 1011c9aa6..5a2b8e319 100644
--- a/apps/settings/serializers/auth/sms.py
+++ b/apps/settings/serializers/auth/sms.py
@@ -14,7 +14,7 @@ __all__ = [
class SMSSettingSerializer(serializers.Serializer):
- SMS_ENABLED = serializers.BooleanField(default=False, label=_('Enable SMS'))
+ SMS_ENABLED = serializers.BooleanField(default=False, label=_('SMS'))
SMS_BACKEND = serializers.ChoiceField(
choices=BACKENDS.choices, default=BACKENDS.ALIBABA, label=_('SMS provider / Protocol')
)
@@ -70,10 +70,10 @@ class HuaweiSMSSettingSerializer(BaseSMSSettingSerializer):
class CMPP2SMSSettingSerializer(BaseSMSSettingSerializer):
CMPP2_HOST = serializers.CharField(max_length=256, required=True, label=_('Host'))
CMPP2_PORT = serializers.IntegerField(default=7890, label=_('Port'))
- CMPP2_SP_ID = serializers.CharField(max_length=128, required=True, label=_('Enterprise code(SP id)'))
- CMPP2_SP_SECRET = EncryptedField(max_length=256, required=False, label=_('Shared secret(Shared secret)'))
- CMPP2_SRC_ID = serializers.CharField(max_length=256, required=False, label=_('Original number(Src id)'))
- CMPP2_SERVICE_ID = serializers.CharField(max_length=256, required=True, label=_('Business type(Service id)'))
+ CMPP2_SP_ID = serializers.CharField(max_length=128, required=True, label=_('Enterprise code'))
+ CMPP2_SP_SECRET = EncryptedField(max_length=256, required=False, label=_('Shared secret'))
+ CMPP2_SRC_ID = serializers.CharField(max_length=256, required=False, label=_('Original number'))
+ CMPP2_SERVICE_ID = serializers.CharField(max_length=256, required=True, label=_('Business type'))
CMPP2_VERIFY_SIGN_NAME = serializers.CharField(max_length=256, required=True, label=_('Signature'))
CMPP2_VERIFY_TEMPLATE_CODE = serializers.CharField(
max_length=69, required=True, label=_('Template'),
diff --git a/apps/settings/serializers/auth/wecom.py b/apps/settings/serializers/auth/wecom.py
index b296eb691..72c315c24 100644
--- a/apps/settings/serializers/auth/wecom.py
+++ b/apps/settings/serializers/auth/wecom.py
@@ -9,7 +9,7 @@ __all__ = ['WeComSettingSerializer']
class WeComSettingSerializer(serializers.Serializer):
PREFIX_TITLE = _('WeCom')
- WECOM_CORPID = serializers.CharField(max_length=256, required=True, label='corpid')
- WECOM_AGENTID = serializers.CharField(max_length=256, required=True, label='agentid')
- WECOM_SECRET = EncryptedField(max_length=256, required=False, label='secret')
- AUTH_WECOM = serializers.BooleanField(default=False, label=_('Enable WeCom Auth'))
+ WECOM_CORPID = serializers.CharField(max_length=256, required=True, label='Corporation ID')
+ WECOM_AGENTID = serializers.CharField(max_length=256, required=True, label='App Agent ID')
+ WECOM_SECRET = EncryptedField(max_length=256, required=False, label='App Secret')
+ AUTH_WECOM = serializers.BooleanField(default=False, label=_('WeCom'))
diff --git a/apps/settings/serializers/basic.py b/apps/settings/serializers/basic.py
index 4e253c602..1cdd96f23 100644
--- a/apps/settings/serializers/basic.py
+++ b/apps/settings/serializers/basic.py
@@ -8,7 +8,7 @@ class BasicSettingSerializer(serializers.Serializer):
PREFIX_TITLE = _('Basic')
SITE_URL = serializers.URLField(
- required=True, label=_("Site url"),
+ required=True, label=_("Site URL"),
help_text=_(
'External URL, email links or other system callbacks are used to access it, '
'eg: http://dev.jumpserver.org:8080'
@@ -19,7 +19,7 @@ class BasicSettingSerializer(serializers.Serializer):
help_text=_('User first login update profile done redirect to it')
)
GLOBAL_ORG_DISPLAY_NAME = serializers.CharField(
- required=False, max_length=1024, allow_blank=True, allow_null=True, label=_("Global organization name"),
+ required=False, max_length=1024, allow_blank=True, allow_null=True, label=_("Global organization"),
help_text=_('The name of global organization to display')
)
HELP_DOCUMENT_URL = serializers.URLField(
diff --git a/apps/settings/serializers/cleaning.py b/apps/settings/serializers/cleaning.py
index 156c007d1..888559dce 100644
--- a/apps/settings/serializers/cleaning.py
+++ b/apps/settings/serializers/cleaning.py
@@ -12,15 +12,15 @@ class CleaningSerializer(serializers.Serializer):
LOGIN_LOG_KEEP_DAYS = serializers.IntegerField(
min_value=MIN_VALUE, max_value=9999,
- label=_("Login log keep days (day)"),
+ label=_("Login log retention days (day)"),
)
TASK_LOG_KEEP_DAYS = serializers.IntegerField(
min_value=MIN_VALUE, max_value=9999,
- label=_("Task log keep days (day)"),
+ label=_("Task log retention days (day)"),
)
OPERATE_LOG_KEEP_DAYS = serializers.IntegerField(
min_value=MIN_VALUE, max_value=9999,
- label=_("Operate log keep days (day)"),
+ label=_("Operate log retention days (day)"),
)
PASSWORD_CHANGE_LOG_KEEP_DAYS = serializers.IntegerField(
min_value=MIN_VALUE, max_value=9999,
@@ -28,22 +28,22 @@ class CleaningSerializer(serializers.Serializer):
)
FTP_LOG_KEEP_DAYS = serializers.IntegerField(
min_value=MIN_VALUE, max_value=9999,
- label=_("FTP log keep days (day)"),
+ label=_("FTP log retention days (day)"),
)
CLOUD_SYNC_TASK_EXECUTION_KEEP_DAYS = serializers.IntegerField(
min_value=MIN_VALUE, max_value=9999,
- label=_("Cloud sync record keep days (day)"),
+ label=_("Cloud sync task history retention days (day)"),
)
JOB_EXECUTION_KEEP_DAYS = serializers.IntegerField(
min_value=MIN_VALUE, max_value=9999,
- label=_("job execution keep days (day)"),
+ label=_("job execution retention days (day)"),
)
ACTIVITY_LOG_KEEP_DAYS = serializers.IntegerField(
min_value=MIN_VALUE, max_value=9999,
- label=_("Activity log keep days (day)"),
+ label=_("Activity log retention days (day)"),
)
TERMINAL_SESSION_KEEP_DURATION = serializers.IntegerField(
- min_value=MIN_VALUE, max_value=99999, required=True, label=_('Session keep duration (day)'),
+ min_value=MIN_VALUE, max_value=99999, required=True, label=_('Session log retention days (day)'),
help_text=_(
'Session, record, command will be delete if more than duration, only in database, OSS will not be affected.')
)
diff --git a/apps/settings/serializers/feature.py b/apps/settings/serializers/feature.py
index 708e8179c..a68365983 100644
--- a/apps/settings/serializers/feature.py
+++ b/apps/settings/serializers/feature.py
@@ -19,7 +19,7 @@ class AnnouncementSerializer(serializers.Serializer):
CONTENT = serializers.CharField(label=_("Content"))
LINK = serializers.URLField(
required=False, allow_null=True, allow_blank=True,
- label=_("More url"), default='',
+ label=_("More URL"), default='',
)
def to_representation(self, instance):
@@ -35,7 +35,7 @@ class AnnouncementSerializer(serializers.Serializer):
class AnnouncementSettingSerializer(serializers.Serializer):
PREFIX_TITLE = _('Announcement')
- ANNOUNCEMENT_ENABLED = serializers.BooleanField(label=_('Enable announcement'), default=True)
+ ANNOUNCEMENT_ENABLED = serializers.BooleanField(label=_('Announcement'), default=True)
ANNOUNCEMENT = AnnouncementSerializer(label=_("Announcement"))
@@ -43,7 +43,7 @@ class VaultSettingSerializer(serializers.Serializer):
PREFIX_TITLE = _('HCP Vault')
VAULT_ENABLED = serializers.BooleanField(
- required=False, label=_('Enable Vault'), read_only=True
+ required=False, label=_('Vault'), read_only=True
)
VAULT_HCP_HOST = serializers.CharField(
max_length=256, allow_blank=True, required=False, label=_('Host')
@@ -72,7 +72,7 @@ class ChatAISettingSerializer(serializers.Serializer):
GPT_MODEL_CHOICES = []
CHAT_AI_ENABLED = serializers.BooleanField(
- required=False, label=_('Enable Chat AI')
+ required=False, label=_('Chat AI')
)
GPT_BASE_URL = serializers.CharField(
allow_blank=True, required=False, label=_('Base Url')
@@ -112,11 +112,11 @@ class TicketSettingSerializer(serializers.Serializer):
TICKETS_DIRECT_APPROVE = serializers.BooleanField(required=False, default=False, label=_("No login approval"))
TICKET_AUTHORIZE_DEFAULT_TIME = serializers.IntegerField(
min_value=1, max_value=999999, required=False,
- label=_("Ticket authorize default time")
+ label=_("Default period")
)
TICKET_AUTHORIZE_DEFAULT_TIME_UNIT = serializers.ChoiceField(
choices=[('day', _("day")), ('hour', _("hour"))],
- label=_("Ticket authorize default time unit"), required=False,
+ label=_("Default unit"), required=False,
)
@@ -124,12 +124,12 @@ class OpsSettingSerializer(serializers.Serializer):
PREFIX_TITLE = _('Feature')
SECURITY_COMMAND_EXECUTION = serializers.BooleanField(
- required=False, label=_('Operation center'),
+ required=False, label=_('Job center'),
help_text=_('Allow user run batch command or not using ansible')
)
SECURITY_COMMAND_BLACKLIST = serializers.ListField(
child=serializers.CharField(max_length=1024, ),
- label=_('Operation center command blacklist'),
+ label=_('Command blacklist'),
help_text=_("Commands that are not allowed execute.")
)
@@ -138,5 +138,5 @@ class VirtualAppSerializer(serializers.Serializer):
PREFIX_TITLE = _('Virtual app')
VIRTUAL_APP_ENABLED = serializers.BooleanField(
- required=False, label=_('Enable virtual app'),
+ required=False, label=_('Virtual app'),
)
diff --git a/apps/settings/serializers/msg.py b/apps/settings/serializers/msg.py
index ace4ab42c..0a2a222e5 100644
--- a/apps/settings/serializers/msg.py
+++ b/apps/settings/serializers/msg.py
@@ -36,7 +36,7 @@ class EmailSettingSerializer(serializers.Serializer):
help_text=_("Tips: Some provider use token except password")
)
EMAIL_FROM = serializers.CharField(
- max_length=128, allow_blank=True, required=False, label=_('Send user'),
+ max_length=128, allow_blank=True, required=False, label=_('Sender'),
help_text=_('Tips: Send mail account, default SMTP account as the send account')
)
EMAIL_RECIPIENT = serializers.CharField(
@@ -65,17 +65,17 @@ class EmailContentSettingSerializer(serializers.Serializer):
EMAIL_CUSTOM_USER_CREATED_SUBJECT = serializers.CharField(
max_length=1024, allow_blank=True, required=False,
- label=_('Create user email subject'),
+ label=_('Subject'),
help_text=_('Tips: When creating a user, send the subject of the email (eg:Create account successfully)')
)
EMAIL_CUSTOM_USER_CREATED_HONORIFIC = serializers.CharField(
max_length=1024, allow_blank=True, required=False,
- label=_('Create user honorific'),
+ label=_('Honorific'),
help_text=_('Tips: When creating a user, send the honorific of the email (eg:Hello)')
)
EMAIL_CUSTOM_USER_CREATED_BODY = serializers.CharField(
max_length=4096, allow_blank=True, required=False,
- label=_('Create user email content'),
+ label=_('Content'),
help_text=_(
'Tips: When creating a user, send the content of the email, support {username} {name} {email} label')
)
diff --git a/apps/settings/serializers/security.py b/apps/settings/serializers/security.py
index d1c252a28..689786f96 100644
--- a/apps/settings/serializers/security.py
+++ b/apps/settings/serializers/security.py
@@ -23,7 +23,7 @@ class SecurityPasswordRuleSerializer(serializers.Serializer):
)
OLD_PASSWORD_HISTORY_LIMIT_COUNT = serializers.IntegerField(
min_value=0, max_value=99999, required=True,
- label=_('Number of repeated historical passwords'),
+ label=_('Recent password count'),
help_text=_(
'Tip: When the user resets the password, it cannot be '
'the previous n historical passwords of the user'
@@ -31,23 +31,23 @@ class SecurityPasswordRuleSerializer(serializers.Serializer):
)
SECURITY_PASSWORD_MIN_LENGTH = serializers.IntegerField(
min_value=6, max_value=30, required=True,
- label=_('Password minimum length')
+ label=_("Minimum length (User)")
)
SECURITY_ADMIN_USER_PASSWORD_MIN_LENGTH = serializers.IntegerField(
min_value=6, max_value=30, required=True,
- label=_('Admin user password minimum length')
+ label=_('Minimum length (Admin)')
)
SECURITY_PASSWORD_UPPER_CASE = serializers.BooleanField(
- required=False, label=_('Must contain capital')
+ required=False, label=_('Uppercase')
)
SECURITY_PASSWORD_LOWER_CASE = serializers.BooleanField(
- required=False, label=_('Must contain lowercase')
+ required=False, label=_('Lowercase')
)
SECURITY_PASSWORD_NUMBER = serializers.BooleanField(
- required=False, label=_('Must contain numeric')
+ required=False, label=_('Digits')
)
SECURITY_PASSWORD_SPECIAL_CHAR = serializers.BooleanField(
- required=False, label=_('Must contain special')
+ required=False, label=_('Special characters')
)
@@ -60,30 +60,30 @@ login_ip_limit_time_help_text = _(
class SecurityLoginLimitSerializer(serializers.Serializer):
SECURITY_LOGIN_LIMIT_COUNT = serializers.IntegerField(
min_value=3, max_value=99999,
- label=_('Limit the number of user login failures')
+ label=_('Login failures count')
)
SECURITY_LOGIN_LIMIT_TIME = serializers.IntegerField(
min_value=5, max_value=99999, required=True,
- label=_('Block user login interval (minute)'),
+ label=_('Login failure period (minute)'),
help_text=login_ip_limit_time_help_text
)
SECURITY_LOGIN_IP_LIMIT_COUNT = serializers.IntegerField(
min_value=3, max_value=99999,
- label=_('Limit the number of IP login failures')
+ label=_('Login failures count')
)
SECURITY_LOGIN_IP_LIMIT_TIME = serializers.IntegerField(
min_value=5, max_value=99999, required=True,
- label=_('Block IP login interval (minute)'),
+ label=_('Login failure period (minute)'),
help_text=login_ip_limit_time_help_text
)
SECURITY_LOGIN_IP_WHITE_LIST = serializers.ListField(
- default=[], label=_('Login IP White List'), allow_empty=True,
+ default=[], label=_('Login IP whitelist'), allow_empty=True,
child=serializers.CharField(max_length=1024, validators=[ip_group_child_validator]),
help_text=ip_group_help_text
)
SECURITY_LOGIN_IP_BLACK_LIST = serializers.ListField(
- default=[], label=_('Login IP Black List'), allow_empty=True,
+ default=[], label=_('Login IP blacklist'), allow_empty=True,
child=serializers.CharField(max_length=1024, validators=[ip_group_child_validator]),
help_text=ip_group_help_text
)
@@ -121,7 +121,7 @@ class SecurityAuthSerializer(serializers.Serializer):
)
SECURITY_MFA_AUTH_ENABLED_FOR_THIRD_PARTY = serializers.BooleanField(
required=False, default=True,
- label=_('Third-party login users perform MFA authentication'),
+ label=_('Third-party login MFA'),
help_text=_('The third-party login modes include OIDC, CAS, and SAML2'),
)
OTP_ISSUER_NAME = serializers.CharField(
@@ -150,16 +150,16 @@ class SecurityAuthSerializer(serializers.Serializer):
)
SECURITY_LOGIN_CHALLENGE_ENABLED = serializers.BooleanField(
required=False, default=False,
- label=_("Enable Login dynamic code"),
+ label=_("Login dynamic code"),
help_text=_("The password and additional code are sent to a third party "
"authentication system for verification")
)
SECURITY_LOGIN_CAPTCHA_ENABLED = serializers.BooleanField(
- required=False, default=False, label=_("Enable Login captcha"),
+ required=False, default=False, label=_("Login captcha"),
help_text=_("Enable captcha to prevent robot authentication")
)
SECURITY_CHECK_DIFFERENT_CITY_LOGIN = serializers.BooleanField(
- required=False, label=_('Remote Login Protection'),
+ required=False, label=_('Suspicious Login Verification'),
help_text=_(
'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'
@@ -167,7 +167,7 @@ class SecurityAuthSerializer(serializers.Serializer):
)
SECURITY_UNCOMMON_USERS_TTL = serializers.IntegerField(
min_value=30, max_value=99999, required=False,
- label=_('Unused user timeout (day)'),
+ label=_('Auto Disable Threshold (day)'),
help_text=_("Detect infrequent users daily and disable them if they exceed the predetermined time limit.")
)
@@ -188,12 +188,12 @@ class SecurityAuthSerializer(serializers.Serializer):
class SecuritySessionSerializer(serializers.Serializer):
SECURITY_WATERMARK_ENABLED = serializers.BooleanField(
- required=True, label=_('Enable watermark'),
+ 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,
- label=_('Connection max idle time (minute)'),
+ label=_('Max idle time (minute)'),
help_text=_('If idle time more than it, disconnect connection.')
)
SESSION_EXPIRE_AT_BROWSER_CLOSE = serializers.BooleanField(
@@ -202,7 +202,7 @@ class SecuritySessionSerializer(serializers.Serializer):
)
SECURITY_MAX_SESSION_TIME = serializers.IntegerField(
min_value=1, max_value=99999, required=False,
- label=_('Session max connection time (hour)'),
+ label=_('Max online time (hour)'),
help_text=_('If session connection time more than it, disconnect connection.')
)
SECURITY_LUNA_REMEMBER_AUTH = serializers.BooleanField(
diff --git a/apps/settings/serializers/terminal.py b/apps/settings/serializers/terminal.py
index 42e03eeb7..fe95a571c 100644
--- a/apps/settings/serializers/terminal.py
+++ b/apps/settings/serializers/terminal.py
@@ -6,8 +6,8 @@ class TerminalSettingSerializer(serializers.Serializer):
PREFIX_TITLE = _('Terminal')
SORT_BY_CHOICES = (
- ('name', _('Hostname')),
- ('ip', _('IP'))
+ ('name', _('Name')),
+ ('ip', _('Address'))
)
PAGE_SIZE_CHOICES = (
@@ -19,23 +19,23 @@ class TerminalSettingSerializer(serializers.Serializer):
('50', '50'),
)
SECURITY_SERVICE_ACCOUNT_REGISTRATION = serializers.BooleanField(
- required=True, label=_('Enable terminal register'),
+ required=True, label=_('Terminal registration'),
help_text=_(
"Allow terminal register, after all terminal setup, you should disable this for security"
)
)
- TERMINAL_PASSWORD_AUTH = serializers.BooleanField(required=False, label=_('Password auth'))
+ TERMINAL_PASSWORD_AUTH = serializers.BooleanField(required=False, label=_("Password auth"))
TERMINAL_PUBLIC_KEY_AUTH = serializers.BooleanField(
- required=False, label=_('Public key auth'),
- help_text=_('Tips: If use other auth method, like AD/LDAP, you should disable this to '
+ required=False, label=_("Public key auth"),
+ help_text=_('Information: If use other auth method, like AD/LDAP, you should disable this to '
'avoid being able to log in after deleting')
)
TERMINAL_ASSET_LIST_SORT_BY = serializers.ChoiceField(
- SORT_BY_CHOICES, required=False, label=_('List sort by')
+ SORT_BY_CHOICES, required=False, label=_('Asset list sorting')
)
TERMINAL_ASSET_LIST_PAGE_SIZE = serializers.ChoiceField(
- PAGE_SIZE_CHOICES, required=False, label=_('List page size')
+ PAGE_SIZE_CHOICES, required=False, label=_('Asset list page size')
)
- TERMINAL_MAGNUS_ENABLED = serializers.BooleanField(label=_("Enable database proxy"))
- TERMINAL_RAZOR_ENABLED = serializers.BooleanField(label=_("Enable Razor"))
- TERMINAL_KOKO_SSH_ENABLED = serializers.BooleanField(label=_("Enable SSH Client"))
+ TERMINAL_MAGNUS_ENABLED = serializers.BooleanField(label="Magnus")
+ TERMINAL_RAZOR_ENABLED = serializers.BooleanField(label="Razor")
+ TERMINAL_KOKO_SSH_ENABLED = serializers.BooleanField(label="Koko")
diff --git a/apps/settings/signals.py b/apps/settings/signals.py
index ccc9cd2d5..b15fa74e9 100644
--- a/apps/settings/signals.py
+++ b/apps/settings/signals.py
@@ -1,3 +1,4 @@
from django.dispatch import Signal
category_setting_updated = Signal()
+setting_changed = Signal()
diff --git a/apps/settings/urls/api_urls.py b/apps/settings/urls/api_urls.py
index 03f3a4390..a28906397 100644
--- a/apps/settings/urls/api_urls.py
+++ b/apps/settings/urls/api_urls.py
@@ -30,6 +30,7 @@ urlpatterns = [
path('public/', api.PublicSettingApi.as_view(), name='public-setting'),
path('public/open/', api.OpenPublicSettingApi.as_view(), name='open-public-setting'),
path('server-info/', api.ServerInfoApi.as_view(), name='server-info'),
+ path('i18n//', api.ComponentI18nApi.as_view(), name='i18n-data'),
]
urlpatterns += router.urls
diff --git a/apps/static/css/jumpserver.css b/apps/static/css/jumpserver.css
index 22cf5ff61..62c84ebe8 100644
--- a/apps/static/css/jumpserver.css
+++ b/apps/static/css/jumpserver.css
@@ -131,18 +131,20 @@ table.dataTable tbody td.selected td i.text-navy {
margin-right: 5px !important;
}
-.m-m-m{
+.m-m-m {
margin-left: 50px !important;
}
.m-10 {
margin: 10px !important;
}
-.f-i-l-e{
+
+.f-i-l-e {
/*float: left;*/
margin-left: 1000px !important;
/*padding-left: 1000px !important;*/
}
+
.m-t-10 {
margin-top: 10px !important;
}
@@ -304,7 +306,7 @@ table.dataTable tbody td.selected td i.text-navy {
div.dataTables_wrapper div.dataTables_filter,
.dataTables_length {
- // float: right !important;
+/ / float: right !important;
}
div.dataTables_wrapper div.dataTables_filter {
@@ -402,7 +404,7 @@ div.dataTables_wrapper div.dataTables_filter {
z-index: 1060;
display: none;
max-width: 276px;
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-family: "open sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 14px;
font-style: normal;
font-weight: 400;
@@ -447,8 +449,8 @@ div.dataTables_wrapper div.dataTables_filter {
}
.form-group .required .control-label:after {
- content:"*";
- color:red;
+ content: "*";
+ color: red;
}
#tree-refresh .fa-refresh {
@@ -476,51 +478,51 @@ span.select2-selection__placeholder {
}
.dropdown-submenu {
- position: relative;
+ position: relative;
}
-.dropdown-submenu>.dropdown-menu {
- top: 0;
- left: 100%;
- margin-top: -6px;
- margin-left: -1px;
- -webkit-border-radius: 0 6px 6px 6px;
- -moz-border-radius: 0 6px 6px;
- border-radius: 0 6px 6px 6px;
+.dropdown-submenu > .dropdown-menu {
+ top: 0;
+ left: 100%;
+ margin-top: -6px;
+ margin-left: -1px;
+ -webkit-border-radius: 0 6px 6px 6px;
+ -moz-border-radius: 0 6px 6px;
+ border-radius: 0 6px 6px 6px;
}
-.dropdown-submenu:hover>.dropdown-menu {
- display: block;
+.dropdown-submenu:hover > .dropdown-menu {
+ display: block;
}
-.dropdown-submenu>a:after {
- display: block;
- content: " ";
- float: right;
- width: 0;
- height: 0;
- border-color: transparent;
- border-style: solid;
- border-width: 5px 0 5px 5px;
- border-left-color: #ccc;
- margin-top: 5px;
- margin-right: -10px;
+.dropdown-submenu > a:after {
+ display: block;
+ content: " ";
+ float: right;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid;
+ border-width: 5px 0 5px 5px;
+ border-left-color: #ccc;
+ margin-top: 5px;
+ margin-right: -10px;
}
-.dropdown-submenu:hover>a:after {
- border-left-color: #fff;
+.dropdown-submenu:hover > a:after {
+ border-left-color: #fff;
}
.dropdown-submenu.pull-left {
- float: none;
+ float: none;
}
-.dropdown-submenu.pull-left>.dropdown-menu {
- left: -100px;
- margin-left: 10px;
- -webkit-border-radius: 6px 0 6px 6px;
- -moz-border-radius: 6px 0 6px 6px;
- border-radius: 6px 0 6px 6px;
+.dropdown-submenu.pull-left > .dropdown-menu {
+ left: -100px;
+ margin-left: 10px;
+ -webkit-border-radius: 6px 0 6px 6px;
+ -moz-border-radius: 6px 0 6px 6px;
+ border-radius: 6px 0 6px 6px;
}
diff --git a/apps/static/css/style.css b/apps/static/css/style.css
index 272a7ac49..254b06f21 100644
--- a/apps/static/css/style.css
+++ b/apps/static/css/style.css
@@ -1,5 +1,11 @@
/*@import url("https://fonts.css.network/css?family=Open+Sans:300,400,600,700");*/
-/*@import url("https://fonts.css.network/css?family=Roboto:400,300,500,700");*/
+@font-face {
+ font-family: 'Open Sans';
+ src: url('../fonts/OpenSans-Regular.ttf');
+ font-weight: 400;
+ font-style: normal;
+}
+
/*
*
* INSPINIA - Responsive Admin Theme
@@ -12,617 +18,769 @@ h3,
h4,
h5,
h6 {
- font-weight: 100;
+ font-weight: 100;
}
+
h1 {
- font-size: 30px;
+ font-size: 30px;
}
+
h2 {
- font-size: 24px;
+ font-size: 24px;
}
+
h3 {
- font-size: 16px;
+ font-size: 16px;
}
+
h4 {
- font-size: 14px;
+ font-size: 14px;
}
+
h5 {
- font-size: 12px;
+ font-size: 12px;
}
+
h6 {
- font-size: 10px;
+ font-size: 10px;
}
+
h3,
h4,
h5 {
- margin-top: 5px;
- font-weight: 600;
+ margin-top: 5px;
+ font-weight: 600;
}
+
.nav > li > a {
- color: #a7b1c2;
- font-weight: 600;
- padding: 14px 20px 14px 25px;
+ color: #a7b1c2;
+ font-weight: 600;
+ padding: 14px 20px 14px 25px;
}
+
.nav.navbar-right > li > a {
- color: #999c9e;
+ color: #999c9e;
}
+
.nav > li.active > a {
- color: #ffffff;
+ color: #ffffff;
}
+
.navbar-default .nav > li > a:hover,
.navbar-default .nav > li > a:focus {
- background-color: #293846;
- color: white;
+ background-color: #293846;
+ color: white;
}
+
.nav .open > a,
.nav .open > a:hover,
.nav .open > a:focus {
- background: #fff;
+ background: #fff;
}
+
.nav.navbar-top-links > li > a:hover,
.nav.navbar-top-links > li > a:focus {
- background-color: transparent;
+ background-color: transparent;
}
+
.nav > li > a i {
- margin-right: 6px;
+ margin-right: 6px;
}
+
.navbar {
- border: 0;
+ border: 0;
}
+
.navbar-default {
- background-color: transparent;
- border-color: #2f4050;
+ background-color: transparent;
+ border-color: #2f4050;
}
+
.navbar-top-links li {
- display: inline-block;
+ display: inline-block;
}
+
.navbar-top-links li:last-child {
- margin-right: 40px;
+ margin-right: 40px;
}
+
.body-small .navbar-top-links li:last-child {
- margin-right: 0;
+ margin-right: 0;
}
+
.navbar-top-links li a {
- padding: 20px 10px;
- min-height: 50px;
+ padding: 20px 10px;
+ min-height: 50px;
}
+
.dropdown-menu {
- border: medium none;
- border-radius: 3px;
- box-shadow: 0 0 3px rgba(86, 96, 117, 0.7);
- display: none;
- float: left;
- font-size: 12px;
- left: 0;
- list-style: none outside none;
- padding: 0;
- position: absolute;
- text-shadow: none;
- top: 100%;
- z-index: 1000;
+ border: medium none;
+ border-radius: 3px;
+ box-shadow: 0 0 3px rgba(86, 96, 117, 0.7);
+ display: none;
+ float: left;
+ font-size: 12px;
+ left: 0;
+ list-style: none outside none;
+ padding: 0;
+ position: absolute;
+ text-shadow: none;
+ top: 100%;
+ z-index: 1000;
}
+
.dropdown-menu > li > a {
- border-radius: 3px;
- color: inherit;
- line-height: 25px;
- margin: 4px;
- text-align: left;
- font-weight: normal;
+ border-radius: 3px;
+ color: inherit;
+ line-height: 25px;
+ margin: 4px;
+ text-align: left;
+ font-weight: normal;
}
+
.dropdown-menu > li > a.font-bold {
- font-weight: 600;
+ font-weight: 600;
}
+
.navbar-top-links .dropdown-menu li {
- display: block;
+ display: block;
}
+
.navbar-top-links .dropdown-menu li:last-child {
- margin-right: 0;
+ margin-right: 0;
}
+
.navbar-top-links .dropdown-menu li a {
- padding: 3px 20px;
- min-height: 0;
+ padding: 3px 20px;
+ min-height: 0;
}
+
.navbar-top-links .dropdown-menu li a div {
- white-space: normal;
+ white-space: normal;
}
+
.navbar-top-links .dropdown-messages,
.navbar-top-links .dropdown-tasks,
.navbar-top-links .dropdown-alerts {
- width: 310px;
- min-width: 0;
+ width: 310px;
+ min-width: 0;
}
+
.navbar-top-links .dropdown-messages {
- margin-left: 5px;
+ margin-left: 5px;
}
+
.navbar-top-links .dropdown-tasks {
- margin-left: -59px;
+ margin-left: -59px;
}
+
.navbar-top-links .dropdown-alerts {
- margin-left: -123px;
+ margin-left: -123px;
}
+
.navbar-top-links .dropdown-user {
- right: 0;
- left: auto;
+ right: 0;
+ left: auto;
}
+
.dropdown-messages,
.dropdown-alerts {
- padding: 10px 10px 10px 10px;
+ padding: 10px 10px 10px 10px;
}
+
.dropdown-messages li a,
.dropdown-alerts li a {
- font-size: 12px;
+ font-size: 12px;
}
+
.dropdown-messages li em,
.dropdown-alerts li em {
- font-size: 10px;
+ font-size: 10px;
}
+
.nav.navbar-top-links .dropdown-alerts a {
- font-size: 12px;
+ font-size: 12px;
}
+
.nav-header {
- padding: 33px 25px;
- background: url("patterns/header-profile.png") no-repeat;
+ padding: 33px 25px;
+ background: url("patterns/header-profile.png") no-repeat;
}
+
.pace-done .nav-header {
- transition: all 0.4s;
+ transition: all 0.4s;
}
+
.nav > li.active {
- border-left: 4px solid #19aa8d;
- background: #293846;
+ border-left: 4px solid #19aa8d;
+ background: #293846;
}
+
.nav.nav-second-level > li.active {
- border: none;
+ border: none;
}
+
.nav.nav-second-level.collapse[style] {
- height: auto !important;
+ height: auto !important;
}
+
.nav-header a {
- color: #DFE4ED;
+ color: #DFE4ED;
}
+
.nav-header .text-muted {
- color: #8095a8;
+ color: #8095a8;
}
+
.minimalize-styl-2 {
- padding: 4px 12px;
- margin: 14px 5px 5px 20px;
- font-size: 14px;
- float: left;
+ padding: 4px 12px;
+ margin: 14px 5px 5px 20px;
+ font-size: 14px;
+ float: left;
}
+
.navbar-form-custom {
- float: left;
- height: 50px;
- padding: 0;
- width: 200px;
- display: inline-table;
+ float: left;
+ height: 50px;
+ padding: 0;
+ width: 200px;
+ display: inline-table;
}
+
.navbar-form-custom .form-group {
- margin-bottom: 0;
+ margin-bottom: 0;
}
+
.nav.navbar-top-links a {
- font-size: 14px;
+ font-size: 14px;
}
+
.navbar-form-custom .form-control {
- background: none repeat scroll 0 0 rgba(0, 0, 0, 0);
- border: medium none;
- font-size: 14px;
- height: 60px;
- margin: 0;
- z-index: 2000;
+ background: none repeat scroll 0 0 rgba(0, 0, 0, 0);
+ border: medium none;
+ font-size: 14px;
+ height: 60px;
+ margin: 0;
+ z-index: 2000;
}
+
.count-info .label {
- line-height: 12px;
- padding: 2px 5px;
- position: absolute;
- right: 6px;
- top: 12px;
+ line-height: 12px;
+ padding: 2px 5px;
+ position: absolute;
+ right: 6px;
+ top: 12px;
}
+
.arrow {
- float: right;
+ float: right;
}
+
.fa.arrow:before {
- content: "\f104";
+ content: "\f104";
}
+
.active > a > .fa.arrow:before {
- content: "\f107";
+ content: "\f107";
}
+
.nav-second-level li,
.nav-third-level li {
- border-bottom: none !important;
+ border-bottom: none !important;
}
+
.nav-second-level li a {
- padding: 7px 10px 7px 10px;
- padding-left: 52px;
+ padding: 7px 10px 7px 10px;
+ padding-left: 52px;
}
+
.nav-third-level li a {
- padding-left: 62px;
+ padding-left: 62px;
}
+
.nav-second-level li:last-child {
- margin-bottom: 10px;
+ margin-bottom: 10px;
}
+
body:not(.fixed-sidebar):not(.canvas-menu).mini-navbar .nav li:hover > .nav-second-level,
.mini-navbar .nav li:focus > .nav-second-level {
- display: block;
- border-radius: 0 2px 2px 0;
- min-width: 140px;
- height: auto;
+ display: block;
+ border-radius: 0 2px 2px 0;
+ min-width: 140px;
+ height: auto;
}
+
body.mini-navbar .navbar-default .nav > li > .nav-second-level li a {
- font-size: 12px;
- border-radius: 3px;
+ font-size: 12px;
+ border-radius: 3px;
}
+
.fixed-nav .slimScrollDiv #side-menu {
- padding-bottom: 60px;
+ padding-bottom: 60px;
}
+
.mini-navbar .nav-second-level li a {
- padding: 10px 10px 10px 15px;
+ padding: 10px 10px 10px 15px;
}
+
.mini-navbar .nav-second-level {
- position: absolute;
- left: 70px;
- top: 0;
- background-color: #2f4050;
- padding: 10px 10px 10px 10px;
- font-size: 12px;
+ position: absolute;
+ left: 70px;
+ top: 0;
+ background-color: #2f4050;
+ padding: 10px 10px 10px 10px;
+ font-size: 12px;
}
+
.canvas-menu.mini-navbar .nav-second-level {
- background: #293846;
+ background: #293846;
}
+
.mini-navbar li.active .nav-second-level {
- left: 65px;
+ left: 65px;
}
+
.navbar-default .special_link a {
- background: var(--primary-color);
- color: white;
+ background: var(--primary-color);
+ color: white;
}
+
.navbar-default .special_link a:hover {
- background: #17987e !important;
- color: white;
+ background: #17987e !important;
+ color: white;
}
+
.navbar-default .special_link a span.label {
- background: #fff;
- color: var(--primary-color);
+ background: #fff;
+ color: var(--primary-color);
}
+
.navbar-default .landing_link a {
- background: #1cc09f;
- color: white;
+ background: #1cc09f;
+ color: white;
}
+
.navbar-default .landing_link a:hover {
- background: var(--primary-color) !important;
- color: white;
+ background: var(--primary-color) !important;
+ color: white;
}
+
.navbar-default .landing_link a span.label {
- background: #fff;
- color: #1cc09f;
+ background: #fff;
+ color: #1cc09f;
}
+
.logo-element {
- text-align: center;
- font-size: 18px;
- font-weight: 600;
- color: white;
- display: none;
- padding: 18px 0;
+ text-align: center;
+ font-size: 18px;
+ font-weight: 600;
+ color: white;
+ display: none;
+ padding: 18px 0;
}
+
.pace-done .navbar-static-side,
.pace-done .nav-header,
.pace-done li.active,
.pace-done #page-wrapper,
.pace-done .footer {
- -webkit-transition: all 0.4s;
- -moz-transition: all 0.4s;
- -o-transition: all 0.4s;
- transition: all 0.4s;
+ -webkit-transition: all 0.4s;
+ -moz-transition: all 0.4s;
+ -o-transition: all 0.4s;
+ transition: all 0.4s;
}
+
.navbar-fixed-top {
- background: #fff;
- transition-duration: 0.4s;
- border-bottom: 1px solid #e7eaec !important;
- z-index: 2030;
+ background: #fff;
+ transition-duration: 0.4s;
+ border-bottom: 1px solid #e7eaec !important;
+ z-index: 2030;
}
+
.navbar-fixed-top,
.navbar-static-top {
- background: #f3f3f4;
+ background: #f3f3f4;
}
+
.fixed-nav #wrapper {
- margin-top: 0;
+ margin-top: 0;
}
+
body.fixed-nav #wrapper .navbar-static-side,
body.fixed-nav #wrapper #page-wrapper {
- margin-top: 60px;
+ margin-top: 60px;
}
+
body.top-navigation.fixed-nav #wrapper #page-wrapper {
- margin-top: 0;
+ margin-top: 0;
}
+
body.fixed-nav.fixed-nav-basic .navbar-fixed-top {
- left: 220px;
+ left: 220px;
}
+
body.fixed-nav.fixed-nav-basic.mini-navbar .navbar-fixed-top {
- left: 70px;
+ left: 70px;
}
+
body.fixed-nav.fixed-nav-basic.fixed-sidebar.mini-navbar .navbar-fixed-top {
- left: 0;
+ left: 0;
}
+
body.fixed-nav.fixed-nav-basic #wrapper .navbar-static-side {
- margin-top: 0;
+ margin-top: 0;
}
+
body.fixed-nav.fixed-nav-basic.body-small .navbar-fixed-top {
- left: 0;
+ left: 0;
}
+
body.fixed-nav.fixed-nav-basic.fixed-sidebar.mini-navbar.body-small .navbar-fixed-top {
- left: 220px;
+ left: 220px;
}
+
.fixed-nav .minimalize-styl-2 {
- margin: 14px 5px 5px 15px;
+ margin: 14px 5px 5px 15px;
}
+
.body-small .navbar-fixed-top {
- margin-left: 0;
+ margin-left: 0;
}
+
body.mini-navbar .navbar-static-side {
- width: 70px;
+ width: 70px;
}
+
body.mini-navbar .profile-element,
body.mini-navbar .nav-label,
body.mini-navbar .navbar-default .nav li a span {
- display: none;
+ display: none;
}
+
body.canvas-menu .profile-element {
- display: block;
+ display: block;
}
+
body:not(.fixed-sidebar):not(.canvas-menu).mini-navbar .nav-second-level {
- display: none;
+ display: none;
}
+
body.mini-navbar .navbar-default .nav > li > a {
- font-size: 16px;
+ font-size: 16px;
}
+
body.mini-navbar .logo-element {
- display: block;
+ display: block;
}
+
body.canvas-menu .logo-element {
- display: none;
+ display: none;
}
+
body.mini-navbar .nav-header {
- padding: 0;
- background-color: var(--primary-color);
+ padding: 0;
+ background-color: var(--primary-color);
}
+
body.canvas-menu .nav-header {
- padding: 33px 25px;
+ padding: 33px 25px;
}
+
body.mini-navbar #page-wrapper {
- margin: 0 0 0 70px;
+ margin: 0 0 0 70px;
}
+
body.fixed-sidebar.mini-navbar .footer,
body.canvas-menu.mini-navbar .footer {
- margin: 0 0 0 0 !important;
+ margin: 0 0 0 0 !important;
}
+
body.canvas-menu.mini-navbar #page-wrapper,
body.canvas-menu.mini-navbar .footer {
- margin: 0 0 0 0;
+ margin: 0 0 0 0;
}
+
body.fixed-sidebar .navbar-static-side,
body.canvas-menu .navbar-static-side {
- position: fixed;
- width: 220px;
- z-index: 2001;
- height: 100%;
+ position: fixed;
+ width: 220px;
+ z-index: 2001;
+ height: 100%;
}
+
body.fixed-sidebar.mini-navbar .navbar-static-side {
- width: 0;
+ width: 0;
}
+
body.fixed-sidebar.mini-navbar #page-wrapper {
- margin: 0 0 0 0;
+ margin: 0 0 0 0;
}
+
body.body-small.fixed-sidebar.mini-navbar #page-wrapper {
- margin: 0 0 0 220px;
+ margin: 0 0 0 220px;
}
+
body.body-small.fixed-sidebar.mini-navbar .navbar-static-side {
- width: 220px;
+ width: 220px;
}
+
.fixed-sidebar.mini-navbar .nav li:focus > .nav-second-level,
.canvas-menu.mini-navbar .nav li:focus > .nav-second-level {
- display: block;
- height: auto;
+ display: block;
+ height: auto;
}
+
body.fixed-sidebar.mini-navbar .navbar-default .nav > li > .nav-second-level li a {
- font-size: 12px;
- border-radius: 3px;
+ font-size: 12px;
+ border-radius: 3px;
}
+
body.canvas-menu.mini-navbar .navbar-default .nav > li > .nav-second-level li a {
- font-size: 13px;
- border-radius: 3px;
+ font-size: 13px;
+ border-radius: 3px;
}
+
.fixed-sidebar.mini-navbar .nav-second-level li a,
.canvas-menu.mini-navbar .nav-second-level li a {
- padding: 10px 10px 10px 15px;
+ padding: 10px 10px 10px 15px;
}
+
.fixed-sidebar.mini-navbar .nav-second-level,
.canvas-menu.mini-navbar .nav-second-level {
- position: relative;
- padding: 0;
- font-size: 13px;
+ position: relative;
+ padding: 0;
+ font-size: 13px;
}
+
.fixed-sidebar.mini-navbar li.active .nav-second-level,
.canvas-menu.mini-navbar li.active .nav-second-level {
- left: 0;
+ left: 0;
}
+
body.fixed-sidebar.mini-navbar .navbar-default .nav > li > a,
body.canvas-menu.mini-navbar .navbar-default .nav > li > a {
- font-size: 13px;
+ font-size: 13px;
}
+
body.fixed-sidebar.mini-navbar .nav-label,
body.fixed-sidebar.mini-navbar .navbar-default .nav li a span,
body.canvas-menu.mini-navbar .nav-label,
body.canvas-menu.mini-navbar .navbar-default .nav li a span {
- display: inline;
+ display: inline;
}
+
body.canvas-menu.mini-navbar .navbar-default .nav li .profile-element a span {
- display: block;
+ display: block;
}
+
.canvas-menu.mini-navbar .nav-second-level li a,
.fixed-sidebar.mini-navbar .nav-second-level li a {
- padding: 7px 10px 7px 52px;
+ padding: 7px 10px 7px 52px;
}
+
.fixed-sidebar.mini-navbar .nav-second-level,
.canvas-menu.mini-navbar .nav-second-level {
- left: 0;
+ left: 0;
}
+
body.canvas-menu nav.navbar-static-side {
- z-index: 2001;
- background: #2f4050;
- height: 100%;
- position: fixed;
- display: none;
+ z-index: 2001;
+ background: #2f4050;
+ height: 100%;
+ position: fixed;
+ display: none;
}
+
body.canvas-menu.mini-navbar nav.navbar-static-side {
- display: block;
- width: 220px;
+ display: block;
+ width: 220px;
}
+
.top-navigation #page-wrapper {
- margin-left: 0;
+ margin-left: 0;
}
+
.top-navigation .navbar-nav .dropdown-menu > .active > a {
- background: white;
- color: var(--primary-color);
- font-weight: bold;
+ background: white;
+ color: var(--primary-color);
+ font-weight: bold;
}
+
.white-bg .navbar-fixed-top,
.white-bg .navbar-static-top {
- background: #fff;
+ background: #fff;
}
+
.top-navigation .navbar {
- margin-bottom: 0;
+ margin-bottom: 0;
}
+
.top-navigation .nav > li > a {
- padding: 15px 20px;
- color: #676a6c;
+ padding: 15px 20px;
+ color: #676a6c;
}
+
.top-navigation .nav > li a:hover,
.top-navigation .nav > li a:focus {
- background: #fff;
- color: var(--primary-color);
+ background: #fff;
+ color: var(--primary-color);
}
+
.top-navigation .nav > li.active {
- background: #fff;
- border: none;
+ background: #fff;
+ border: none;
}
+
.top-navigation .nav > li.active > a {
- color: var(--primary-color);
+ color: var(--primary-color);
}
+
.top-navigation .navbar-right {
- margin-right: 10px;
+ margin-right: 10px;
}
+
.top-navigation .navbar-nav .dropdown-menu {
- box-shadow: none;
- border: 1px solid #e7eaec;
+ box-shadow: none;
+ border: 1px solid #e7eaec;
}
+
.top-navigation .dropdown-menu > li > a {
- margin: 0;
- padding: 7px 20px;
+ margin: 0;
+ padding: 7px 20px;
}
+
.navbar .dropdown-menu {
- margin-top: 0;
+ margin-top: 0;
}
+
.top-navigation .navbar-brand {
- background: var(--primary-color);
- color: #fff;
- padding: 15px 25px;
+ background: var(--primary-color);
+ color: #fff;
+ padding: 15px 25px;
}
+
.top-navigation .navbar-top-links li:last-child {
- margin-right: 0;
+ margin-right: 0;
}
+
.top-navigation.mini-navbar #page-wrapper,
.top-navigation.body-small.fixed-sidebar.mini-navbar #page-wrapper,
.mini-navbar .top-navigation #page-wrapper,
.body-small.fixed-sidebar.mini-navbar .top-navigation #page-wrapper,
.canvas-menu #page-wrapper {
- margin: 0;
+ margin: 0;
}
+
.top-navigation.fixed-nav #wrapper,
.fixed-nav #wrapper.top-navigation {
- margin-top: 50px;
+ margin-top: 50px;
}
+
.top-navigation .footer.fixed {
- margin-left: 0 !important;
+ margin-left: 0 !important;
}
+
.top-navigation .wrapper.wrapper-content {
- padding: 40px;
+ padding: 40px;
}
+
.top-navigation.body-small .wrapper.wrapper-content,
.body-small .top-navigation .wrapper.wrapper-content {
- padding: 40px 0 40px 0;
+ padding: 40px 0 40px 0;
}
+
.navbar-toggle {
- background-color: var(--primary-color);
- color: #fff;
- padding: 6px 12px;
- font-size: 14px;
+ background-color: var(--primary-color);
+ color: #fff;
+ padding: 6px 12px;
+ font-size: 14px;
}
+
.top-navigation .navbar-nav .open .dropdown-menu > li > a,
.top-navigation .navbar-nav .open .dropdown-menu .dropdown-header {
- padding: 10px 15px 10px 20px;
+ padding: 10px 15px 10px 20px;
}
+
@media (max-width: 768px) {
- .top-navigation .navbar-header {
- display: block;
- float: none;
- }
+ .top-navigation .navbar-header {
+ display: block;
+ float: none;
+ }
}
+
.menu-visible-lg,
.menu-visible-md {
- display: none !important;
+ display: none !important;
}
+
@media (min-width: 1200px) {
- .menu-visible-lg {
- display: block !important;
- }
+ .menu-visible-lg {
+ display: block !important;
+ }
}
+
@media (min-width: 992px) {
- .menu-visible-md {
- display: block !important;
- }
+ .menu-visible-md {
+ display: block !important;
+ }
}
+
@media (max-width: 767px) {
- .menu-visible-md {
- display: block !important;
- }
- .menu-visible-lg {
- display: block !important;
- }
+ .menu-visible-md {
+ display: block !important;
+ }
+
+ .menu-visible-lg {
+ display: block !important;
+ }
}
+
.btn {
- border-radius: 3px;
+ border-radius: 3px;
}
+
.float-e-margins .btn {
- /*margin-bottom: 5px;*/
+ /*margin-bottom: 5px;*/
}
+
.btn-w-m {
- min-width: 120px;
+ min-width: 120px;
}
+
.btn-primary.btn-outline {
- color: var(--primary-color);
+ color: var(--primary-color);
}
+
.btn-success.btn-outline {
- color: #1c84c6;
+ color: #1c84c6;
}
+
.btn-info.btn-outline {
- color: #23c6c8;
+ color: #23c6c8;
}
+
.btn-warning.btn-outline {
- color: #f8ac59;
+ color: #f8ac59;
}
+
.btn-danger.btn-outline {
- color: #ed5565;
+ color: #ed5565;
}
+
.btn-primary.btn-outline:hover,
.btn-success.btn-outline:hover,
.btn-info.btn-outline:hover,
.btn-warning.btn-outline:hover,
.btn-danger.btn-outline:hover {
- color: #fff;
+ color: #fff;
}
+
.btn-primary {
- background-color: var(--primary-color);
- border-color: var(--primary-color);
- color: #FFFFFF;
+ background-color: var(--primary-color);
+ border-color: var(--primary-color);
+ color: #FFFFFF;
}
+
.btn-primary:hover,
.btn-primary:focus,
.btn-primary:active,
@@ -632,15 +790,17 @@ body.canvas-menu.mini-navbar nav.navbar-static-side {
.btn-primary:active:hover,
.btn-primary.active:hover,
.btn-primary.active:focus {
- background-color: var(--primary-color);
- border-color: var(--primary-color);
- color: #FFFFFF;
+ background-color: var(--primary-color);
+ border-color: var(--primary-color);
+ color: #FFFFFF;
}
+
.btn-primary:active,
.btn-primary.active,
.open .dropdown-toggle.btn-primary {
- background-image: none;
+ background-image: none;
}
+
.btn-primary.disabled,
.btn-primary.disabled:hover,
.btn-primary.disabled:focus,
@@ -656,14 +816,16 @@ fieldset[disabled] .btn-primary:hover,
fieldset[disabled] .btn-primary:focus,
fieldset[disabled] .btn-primary:active,
fieldset[disabled] .btn-primary.active {
- background-color: #1dc5a3;
- border-color: #1dc5a3;
+ background-color: #1dc5a3;
+ border-color: #1dc5a3;
}
+
.btn-success {
- background-color: #1c84c6;
- border-color: #1c84c6;
- color: #FFFFFF;
+ background-color: #1c84c6;
+ border-color: #1c84c6;
+ color: #FFFFFF;
}
+
.btn-success:hover,
.btn-success:focus,
.btn-success:active,
@@ -673,15 +835,17 @@ fieldset[disabled] .btn-primary.active {
.btn-success:active:hover,
.btn-success.active:hover,
.btn-success.active:focus {
- background-color: #1a7bb9;
- border-color: #1a7bb9;
- color: #FFFFFF;
+ background-color: #1a7bb9;
+ border-color: #1a7bb9;
+ color: #FFFFFF;
}
+
.btn-success:active,
.btn-success.active,
.open .dropdown-toggle.btn-success {
- background-image: none;
+ background-image: none;
}
+
.btn-success.disabled,
.btn-success.disabled:hover,
.btn-success.disabled:focus,
@@ -697,14 +861,16 @@ fieldset[disabled] .btn-success:hover,
fieldset[disabled] .btn-success:focus,
fieldset[disabled] .btn-success:active,
fieldset[disabled] .btn-success.active {
- background-color: #1f90d8;
- border-color: #1f90d8;
+ background-color: #1f90d8;
+ border-color: #1f90d8;
}
+
.btn-info {
- background-color: #23c6c8;
- border-color: #23c6c8;
- color: #FFFFFF;
+ background-color: #23c6c8;
+ border-color: #23c6c8;
+ color: #FFFFFF;
}
+
.btn-info:hover,
.btn-info:focus,
.btn-info:active,
@@ -714,15 +880,17 @@ fieldset[disabled] .btn-success.active {
.btn-info:active:hover,
.btn-info.active:hover,
.btn-info.active:focus {
- background-color: #21b9bb;
- border-color: #21b9bb;
- color: #FFFFFF;
+ background-color: #21b9bb;
+ border-color: #21b9bb;
+ color: #FFFFFF;
}
+
.btn-info:active,
.btn-info.active,
.open .dropdown-toggle.btn-info {
- background-image: none;
+ background-image: none;
}
+
.btn-info.disabled,
.btn-info.disabled:hover,
.btn-info.disabled:focus,
@@ -738,14 +906,16 @@ fieldset[disabled] .btn-info:hover,
fieldset[disabled] .btn-info:focus,
fieldset[disabled] .btn-info:active,
fieldset[disabled] .btn-info.active {
- background-color: #26d7d9;
- border-color: #26d7d9;
+ background-color: #26d7d9;
+ border-color: #26d7d9;
}
+
.btn-default {
- color: inherit;
- background: white;
- border: 1px solid #e7eaec;
+ color: inherit;
+ background: white;
+ border: 1px solid #e7eaec;
}
+
.btn-default:hover,
.btn-default:focus,
.btn-default:active,
@@ -755,14 +925,16 @@ fieldset[disabled] .btn-info.active {
.btn-default:active:hover,
.btn-default.active:hover,
.btn-default.active:focus {
- color: inherit;
- border: 1px solid #d2d2d2;
+ color: inherit;
+ border: 1px solid #d2d2d2;
}
+
.btn-default:active,
.btn-default.active,
.open .dropdown-toggle.btn-default {
- box-shadow: 0 2px 5px rgba(0, 0, 0, 0.15) inset;
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.15) inset;
}
+
.btn-default.disabled,
.btn-default.disabled:hover,
.btn-default.disabled:focus,
@@ -778,13 +950,15 @@ fieldset[disabled] .btn-default:hover,
fieldset[disabled] .btn-default:focus,
fieldset[disabled] .btn-default:active,
fieldset[disabled] .btn-default.active {
- color: #cacaca;
+ color: #cacaca;
}
+
.btn-warning {
- background-color: #f8ac59;
- border-color: #f8ac59;
- color: #FFFFFF;
+ background-color: #f8ac59;
+ border-color: #f8ac59;
+ color: #FFFFFF;
}
+
.btn-warning:hover,
.btn-warning:focus,
.btn-warning:active,
@@ -794,15 +968,17 @@ fieldset[disabled] .btn-default.active {
.btn-warning:active:hover,
.btn-warning.active:hover,
.btn-warning.active:focus {
- background-color: #f7a54a;
- border-color: #f7a54a;
- color: #FFFFFF;
+ background-color: #f7a54a;
+ border-color: #f7a54a;
+ color: #FFFFFF;
}
+
.btn-warning:active,
.btn-warning.active,
.open .dropdown-toggle.btn-warning {
- background-image: none;
+ background-image: none;
}
+
.btn-warning.disabled,
.btn-warning.disabled:hover,
.btn-warning.disabled:focus,
@@ -818,14 +994,16 @@ fieldset[disabled] .btn-warning:hover,
fieldset[disabled] .btn-warning:focus,
fieldset[disabled] .btn-warning:active,
fieldset[disabled] .btn-warning.active {
- background-color: #f9b66d;
- border-color: #f9b66d;
+ background-color: #f9b66d;
+ border-color: #f9b66d;
}
+
.btn-danger {
- background-color: #ed5565;
- border-color: #ed5565;
- color: #FFFFFF;
+ background-color: #ed5565;
+ border-color: #ed5565;
+ color: #FFFFFF;
}
+
.btn-danger:hover,
.btn-danger:focus,
.btn-danger:active,
@@ -835,15 +1013,17 @@ fieldset[disabled] .btn-warning.active {
.btn-danger:active:hover,
.btn-danger.active:hover,
.btn-danger.active:focus {
- background-color: #ec4758;
- border-color: #ec4758;
- color: #FFFFFF;
+ background-color: #ec4758;
+ border-color: #ec4758;
+ color: #FFFFFF;
}
+
.btn-danger:active,
.btn-danger.active,
.open .dropdown-toggle.btn-danger {
- background-image: none;
+ background-image: none;
}
+
.btn-danger.disabled,
.btn-danger.disabled:hover,
.btn-danger.disabled:focus,
@@ -859,25 +1039,29 @@ fieldset[disabled] .btn-danger:hover,
fieldset[disabled] .btn-danger:focus,
fieldset[disabled] .btn-danger:active,
fieldset[disabled] .btn-danger.active {
- background-color: #ef6776;
- border-color: #ef6776;
+ background-color: #ef6776;
+ border-color: #ef6776;
}
+
.btn-link {
- color: inherit;
+ color: inherit;
}
+
.btn-link:hover,
.btn-link:focus,
.btn-link:active,
.btn-link.active,
.open .dropdown-toggle.btn-link {
- color: var(--primary-color);
- text-decoration: none;
+ color: var(--primary-color);
+ text-decoration: none;
}
+
.btn-link:active,
.btn-link.active,
.open .dropdown-toggle.btn-link {
- background-image: none;
+ background-image: none;
}
+
.btn-link.disabled,
.btn-link.disabled:hover,
.btn-link.disabled:focus,
@@ -893,13 +1077,15 @@ fieldset[disabled] .btn-link:hover,
fieldset[disabled] .btn-link:focus,
fieldset[disabled] .btn-link:active,
fieldset[disabled] .btn-link.active {
- color: #cacaca;
+ color: #cacaca;
}
+
.btn-white {
- color: inherit;
- background: white;
- border: 1px solid #e7eaec;
+ color: inherit;
+ background: white;
+ border: 1px solid #e7eaec;
}
+
.btn-white:hover,
.btn-white:focus,
.btn-white:active,
@@ -909,18 +1095,21 @@ fieldset[disabled] .btn-link.active {
.btn-white:active:hover,
.btn-white.active:hover,
.btn-white.active:focus {
- color: inherit;
- border: 1px solid #d2d2d2;
+ color: inherit;
+ border: 1px solid #d2d2d2;
}
+
.btn-white:active,
.btn-white.active {
- box-shadow: 0 2px 5px rgba(0, 0, 0, 0.15) inset;
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.15) inset;
}
+
.btn-white:active,
.btn-white.active,
.open .dropdown-toggle.btn-white {
- background-image: none;
+ background-image: none;
}
+
.btn-white.disabled,
.btn-white.disabled:hover,
.btn-white.disabled:focus,
@@ -936,8 +1125,9 @@ fieldset[disabled] .btn-white:hover,
fieldset[disabled] .btn-white:focus,
fieldset[disabled] .btn-white:active,
fieldset[disabled] .btn-white.active {
- color: #cacaca;
+ color: #cacaca;
}
+
.form-control,
.form-control:focus,
.has-error .form-control:focus,
@@ -952,264 +1142,308 @@ fieldset[disabled] .btn-white.active {
.popover,
.progress,
.progress-bar {
- box-shadow: none;
+ box-shadow: none;
}
+
.btn-outline {
- color: inherit;
- background-color: transparent;
- transition: all .5s;
+ color: inherit;
+ background-color: transparent;
+ transition: all .5s;
}
+
.btn-rounded {
- border-radius: 50px;
+ border-radius: 50px;
}
+
.btn-large-dim {
- width: 90px;
- height: 90px;
- font-size: 42px;
+ width: 90px;
+ height: 90px;
+ font-size: 42px;
}
+
button.dim {
- display: inline-block;
- text-decoration: none;
- text-transform: uppercase;
- text-align: center;
- padding-top: 6px;
- margin-right: 10px;
- position: relative;
- cursor: pointer;
- border-radius: 5px;
- font-weight: 600;
- margin-bottom: 20px !important;
+ display: inline-block;
+ text-decoration: none;
+ text-transform: uppercase;
+ text-align: center;
+ padding-top: 6px;
+ margin-right: 10px;
+ position: relative;
+ cursor: pointer;
+ border-radius: 5px;
+ font-weight: 600;
+ margin-bottom: 20px !important;
}
+
button.dim:active {
- top: 3px;
+ top: 3px;
}
+
button.btn-primary.dim {
- box-shadow: inset 0 0 0 #16987e, 0 5px 0 0 #16987e, 0 10px 5px #999999;
+ box-shadow: inset 0 0 0 #16987e, 0 5px 0 0 #16987e, 0 10px 5px #999999;
}
+
button.btn-primary.dim:active {
- box-shadow: inset 0 0 0 #16987e, 0 2px 0 0 #16987e, 0 5px 3px #999999;
+ box-shadow: inset 0 0 0 #16987e, 0 2px 0 0 #16987e, 0 5px 3px #999999;
}
+
button.btn-default.dim {
- box-shadow: inset 0 0 0 #b3b3b3, 0 5px 0 0 #b3b3b3, 0 10px 5px #999999;
+ box-shadow: inset 0 0 0 #b3b3b3, 0 5px 0 0 #b3b3b3, 0 10px 5px #999999;
}
+
button.btn-default.dim:active {
- box-shadow: inset 0 0 0 #b3b3b3, 0 2px 0 0 #b3b3b3, 0 5px 3px #999999;
+ box-shadow: inset 0 0 0 #b3b3b3, 0 2px 0 0 #b3b3b3, 0 5px 3px #999999;
}
+
button.btn-warning.dim {
- box-shadow: inset 0 0 0 #f79d3c, 0 5px 0 0 #f79d3c, 0 10px 5px #999999;
+ box-shadow: inset 0 0 0 #f79d3c, 0 5px 0 0 #f79d3c, 0 10px 5px #999999;
}
+
button.btn-warning.dim:active {
- box-shadow: inset 0 0 0 #f79d3c, 0 2px 0 0 #f79d3c, 0 5px 3px #999999;
+ box-shadow: inset 0 0 0 #f79d3c, 0 2px 0 0 #f79d3c, 0 5px 3px #999999;
}
+
button.btn-info.dim {
- box-shadow: inset 0 0 0 #1eacae, 0 5px 0 0 #1eacae, 0 10px 5px #999999;
+ box-shadow: inset 0 0 0 #1eacae, 0 5px 0 0 #1eacae, 0 10px 5px #999999;
}
+
button.btn-info.dim:active {
- box-shadow: inset 0 0 0 #1eacae, 0 2px 0 0 #1eacae, 0 5px 3px #999999;
+ box-shadow: inset 0 0 0 #1eacae, 0 2px 0 0 #1eacae, 0 5px 3px #999999;
}
+
button.btn-success.dim {
- box-shadow: inset 0 0 0 #1872ab, 0 5px 0 0 #1872ab, 0 10px 5px #999999;
+ box-shadow: inset 0 0 0 #1872ab, 0 5px 0 0 #1872ab, 0 10px 5px #999999;
}
+
button.btn-success.dim:active {
- box-shadow: inset 0 0 0 #1872ab, 0 2px 0 0 #1872ab, 0 5px 3px #999999;
+ box-shadow: inset 0 0 0 #1872ab, 0 2px 0 0 #1872ab, 0 5px 3px #999999;
}
+
button.btn-danger.dim {
- box-shadow: inset 0 0 0 #ea394c, 0 5px 0 0 #ea394c, 0 10px 5px #999999;
+ box-shadow: inset 0 0 0 #ea394c, 0 5px 0 0 #ea394c, 0 10px 5px #999999;
}
+
button.btn-danger.dim:active {
- box-shadow: inset 0 0 0 #ea394c, 0 2px 0 0 #ea394c, 0 5px 3px #999999;
+ box-shadow: inset 0 0 0 #ea394c, 0 2px 0 0 #ea394c, 0 5px 3px #999999;
}
+
button.dim:before {
- font-size: 50px;
- line-height: 1em;
- font-weight: normal;
- color: #fff;
- display: block;
- padding-top: 10px;
+ font-size: 50px;
+ line-height: 1em;
+ font-weight: normal;
+ color: #fff;
+ display: block;
+ padding-top: 10px;
}
+
button.dim:active:before {
- top: 7px;
- font-size: 50px;
+ top: 7px;
+ font-size: 50px;
}
+
.btn:focus {
- outline: none !important;
+ outline: none !important;
}
+
.label {
- background-color: #d1dade;
- color: #5e5e5e;
- font-family: 'Open Sans';
- font-size: 10px;
- font-weight: 600;
- padding: 3px 8px;
- text-shadow: none;
+ background-color: #d1dade;
+ color: #5e5e5e;
+ font-family: 'Open Sans';
+ font-size: 10px;
+ font-weight: 600;
+ padding: 3px 8px;
+ text-shadow: none;
}
+
.badge {
- background-color: #d1dade;
- color: #5e5e5e;
- font-family: 'Open Sans';
- font-size: 11px;
- font-weight: 600;
- padding-bottom: 4px;
- padding-left: 6px;
- padding-right: 6px;
- text-shadow: none;
+ background-color: #d1dade;
+ color: #5e5e5e;
+ font-family: 'Open Sans';
+ font-size: 11px;
+ font-weight: 600;
+ padding-bottom: 4px;
+ padding-left: 6px;
+ padding-right: 6px;
+ text-shadow: none;
}
+
.label-primary,
.badge-primary {
- background-color: var(--primary-color);
- color: #FFFFFF;
+ background-color: var(--primary-color);
+ color: #FFFFFF;
}
+
.label-success,
.badge-success {
- background-color: #1c84c6;
- color: #FFFFFF;
+ background-color: #1c84c6;
+ color: #FFFFFF;
}
+
.label-warning,
.badge-warning {
- background-color: #f8ac59;
- color: #FFFFFF;
+ background-color: #f8ac59;
+ color: #FFFFFF;
}
+
.label-warning-light,
.badge-warning-light {
- background-color: #f8ac59;
- color: #ffffff;
+ background-color: #f8ac59;
+ color: #ffffff;
}
+
.label-danger,
.badge-danger {
- background-color: #ed5565;
- color: #FFFFFF;
+ background-color: #ed5565;
+ color: #FFFFFF;
}
+
.label-info,
.badge-info {
- background-color: #23c6c8;
- color: #FFFFFF;
+ background-color: #23c6c8;
+ color: #FFFFFF;
}
+
.label-inverse,
.badge-inverse {
- background-color: #262626;
- color: #FFFFFF;
+ background-color: #262626;
+ color: #FFFFFF;
}
+
.label-white,
.badge-white {
- background-color: #FFFFFF;
- color: #5E5E5E;
+ background-color: #FFFFFF;
+ color: #5E5E5E;
}
+
.label-white,
.badge-disable {
- background-color: #2A2E36;
- color: #8B91A0;
+ background-color: #2A2E36;
+ color: #8B91A0;
}
+
/* TOOGLE SWICH */
.onoffswitch {
- position: relative;
- width: 64px;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
+ position: relative;
+ width: 64px;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
}
+
.onoffswitch-checkbox {
- display: none;
+ display: none;
}
+
.onoffswitch-label {
- display: block;
- overflow: hidden;
- cursor: pointer;
- border: 2px solid var(--primary-color);
- border-radius: 2px;
+ display: block;
+ overflow: hidden;
+ cursor: pointer;
+ border: 2px solid var(--primary-color);
+ border-radius: 2px;
}
+
.onoffswitch-inner {
- width: 200%;
- margin-left: -100%;
- -moz-transition: margin 0.3s ease-in 0s;
- -webkit-transition: margin 0.3s ease-in 0s;
- -o-transition: margin 0.3s ease-in 0s;
- transition: margin 0.3s ease-in 0s;
+ width: 200%;
+ margin-left: -100%;
+ -moz-transition: margin 0.3s ease-in 0s;
+ -webkit-transition: margin 0.3s ease-in 0s;
+ -o-transition: margin 0.3s ease-in 0s;
+ transition: margin 0.3s ease-in 0s;
}
+
.onoffswitch-inner:before,
.onoffswitch-inner:after {
- float: left;
- width: 50%;
- height: 20px;
- padding: 0;
- line-height: 20px;
- font-size: 12px;
- color: white;
- font-family: Trebuchet, Arial, sans-serif;
- font-weight: bold;
- -moz-box-sizing: border-box;
- -webkit-box-sizing: border-box;
- box-sizing: border-box;
+ float: left;
+ width: 50%;
+ height: 20px;
+ padding: 0;
+ line-height: 20px;
+ font-size: 12px;
+ color: white;
+ font-family: Trebuchet, Arial, sans-serif;
+ font-weight: bold;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
}
+
.onoffswitch-inner:before {
- content: "ON";
- padding-left: 10px;
- background-color: var(--primary-color);
- color: #FFFFFF;
+ content: "ON";
+ padding-left: 10px;
+ background-color: var(--primary-color);
+ color: #FFFFFF;
}
+
.onoffswitch-inner:after {
- content: "OFF";
- padding-right: 10px;
- background-color: #FFFFFF;
- color: #999999;
- text-align: right;
+ content: "OFF";
+ padding-right: 10px;
+ background-color: #FFFFFF;
+ color: #999999;
+ text-align: right;
}
+
.onoffswitch-switch {
- width: 20px;
- margin: 0;
- background: #FFFFFF;
- border: 2px solid var(--primary-color);
- border-radius: 2px;
- position: absolute;
- top: 0;
- bottom: 0;
- right: 44px;
- -moz-transition: all 0.3s ease-in 0s;
- -webkit-transition: all 0.3s ease-in 0s;
- -o-transition: all 0.3s ease-in 0s;
- transition: all 0.3s ease-in 0s;
+ width: 20px;
+ margin: 0;
+ background: #FFFFFF;
+ border: 2px solid var(--primary-color);
+ border-radius: 2px;
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ right: 44px;
+ -moz-transition: all 0.3s ease-in 0s;
+ -webkit-transition: all 0.3s ease-in 0s;
+ -o-transition: all 0.3s ease-in 0s;
+ transition: all 0.3s ease-in 0s;
}
+
.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-inner {
- margin-left: 0;
+ margin-left: 0;
}
+
.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-switch {
- right: 0;
+ right: 0;
}
.onoffswitch-checkbox:disabled + .onoffswitch-label .onoffswitch-inner:before {
- background-color: #919191;
+ background-color: #919191;
}
.onoffswitch-checkbox:disabled + .onoffswitch-label, .onoffswitch-checkbox:disabled + .onoffswitch-label .onoffswitch-switch {
- border-color: #919191;
+ border-color: #919191;
}
+
/* CHOSEN PLUGIN */
.chosen-container-single .chosen-single {
- background: #ffffff;
- box-shadow: none;
- -moz-box-sizing: border-box;
- border: 1px solid #CBD5DD;
- border-radius: 2px;
- cursor: text;
- height: auto !important;
- margin: 0;
- min-height: 30px;
- overflow: hidden;
- padding: 4px 12px;
- position: relative;
- width: 100%;
+ background: #ffffff;
+ box-shadow: none;
+ -moz-box-sizing: border-box;
+ border: 1px solid #CBD5DD;
+ border-radius: 2px;
+ cursor: text;
+ height: auto !important;
+ margin: 0;
+ min-height: 30px;
+ overflow: hidden;
+ padding: 4px 12px;
+ position: relative;
+ width: 100%;
}
+
.chosen-container-multi .chosen-choices li.search-choice {
- background: #f1f1f1;
- border: 1px solid #ededed;
- border-radius: 2px;
- box-shadow: none;
- color: #333333;
- cursor: default;
- line-height: 13px;
- margin: 3px 0 3px 5px;
- padding: 3px 20px 3px 5px;
- position: relative;
+ background: #f1f1f1;
+ border: 1px solid #ededed;
+ border-radius: 2px;
+ box-shadow: none;
+ color: #333333;
+ cursor: default;
+ line-height: 13px;
+ margin: 3px 0 3px 5px;
+ padding: 3px 20px 3px 5px;
+ position: relative;
}
+
/* PAGINATIN */
.pagination > .active > a,
.pagination > .active > span,
@@ -1217,2257 +1451,2717 @@ button.dim:active:before {
.pagination > .active > span:hover,
.pagination > .active > a:focus,
.pagination > .active > span:focus {
- background-color: #f4f4f4;
- border-color: #DDDDDD;
- color: inherit;
- cursor: default;
- z-index: 2;
+ background-color: #f4f4f4;
+ border-color: #DDDDDD;
+ color: inherit;
+ cursor: default;
+ z-index: 2;
}
+
.pagination > li > a,
.pagination > li > span {
- background-color: #FFFFFF;
- border: 1px solid #DDDDDD;
- color: inherit;
- float: left;
- line-height: 1.42857;
- margin-left: -1px;
- padding: 4px 10px;
- position: relative;
- text-decoration: none;
+ background-color: #FFFFFF;
+ border: 1px solid #DDDDDD;
+ color: inherit;
+ float: left;
+ line-height: 1.42857;
+ margin-left: -1px;
+ padding: 4px 10px;
+ position: relative;
+ text-decoration: none;
}
+
/* TOOLTIPS */
.tooltip-inner {
- background-color: #2F4050;
+ background-color: #2F4050;
}
+
.tooltip.top .tooltip-arrow {
- border-top-color: #2F4050;
+ border-top-color: #2F4050;
}
+
.tooltip.right .tooltip-arrow {
- border-right-color: #2F4050;
+ border-right-color: #2F4050;
}
+
.tooltip.bottom .tooltip-arrow {
- border-bottom-color: #2F4050;
+ border-bottom-color: #2F4050;
}
+
.tooltip.left .tooltip-arrow {
- border-left-color: #2F4050;
+ border-left-color: #2F4050;
}
+
/* EASY PIE CHART*/
.easypiechart {
- position: relative;
- text-align: center;
+ position: relative;
+ text-align: center;
}
+
.easypiechart .h2 {
- margin-left: 10px;
- margin-top: 10px;
- display: inline-block;
+ margin-left: 10px;
+ margin-top: 10px;
+ display: inline-block;
}
+
.easypiechart canvas {
- top: 0;
- left: 0;
+ top: 0;
+ left: 0;
}
+
.easypiechart .easypie-text {
- line-height: 1;
- position: absolute;
- top: 33px;
- width: 100%;
- z-index: 1;
+ line-height: 1;
+ position: absolute;
+ top: 33px;
+ width: 100%;
+ z-index: 1;
}
+
.easypiechart img {
- margin-top: -4px;
+ margin-top: -4px;
}
+
.jqstooltip {
- -webkit-box-sizing: content-box;
- -moz-box-sizing: content-box;
- box-sizing: content-box;
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
}
+
/* FULLCALENDAR */
.fc-state-default {
- background-color: #ffffff;
- background-image: none;
- background-repeat: repeat-x;
- box-shadow: none;
- color: #333333;
- text-shadow: none;
+ background-color: #ffffff;
+ background-image: none;
+ background-repeat: repeat-x;
+ box-shadow: none;
+ color: #333333;
+ text-shadow: none;
}
+
.fc-state-default {
- border: 1px solid;
+ border: 1px solid;
}
+
.fc-button {
- color: inherit;
- border: 1px solid #e7eaec;
- cursor: pointer;
- display: inline-block;
- height: 1.9em;
- line-height: 1.9em;
- overflow: hidden;
- padding: 0 0.6em;
- position: relative;
- white-space: nowrap;
+ color: inherit;
+ border: 1px solid #e7eaec;
+ cursor: pointer;
+ display: inline-block;
+ height: 1.9em;
+ line-height: 1.9em;
+ overflow: hidden;
+ padding: 0 0.6em;
+ position: relative;
+ white-space: nowrap;
}
+
.fc-state-active {
- background-color: var(--primary-color);
- border-color: var(--primary-color);
- color: #ffffff;
+ background-color: var(--primary-color);
+ border-color: var(--primary-color);
+ color: #ffffff;
}
+
.fc-header-title h2 {
- font-size: 16px;
- font-weight: 600;
- color: inherit;
+ font-size: 16px;
+ font-weight: 600;
+ color: inherit;
}
+
.fc-content .fc-widget-header,
.fc-content .fc-widget-content {
- border-color: #e7eaec;
- font-weight: normal;
+ border-color: #e7eaec;
+ font-weight: normal;
}
+
.fc-border-separate tbody {
- background-color: #F8F8F8;
+ background-color: #F8F8F8;
}
+
.fc-state-highlight {
- background: none repeat scroll 0 0 #FCF8E3;
+ background: none repeat scroll 0 0 #FCF8E3;
}
+
.external-event {
- padding: 5px 10px;
- border-radius: 2px;
- cursor: pointer;
- margin-bottom: 5px;
+ padding: 5px 10px;
+ border-radius: 2px;
+ cursor: pointer;
+ margin-bottom: 5px;
}
+
.fc-ltr .fc-event-hori.fc-event-end,
.fc-rtl .fc-event-hori.fc-event-start {
- border-radius: 2px;
+ border-radius: 2px;
}
+
.fc-event,
.fc-agenda .fc-event-time,
.fc-event a {
- padding: 4px 6px;
- background-color: var(--primary-color);
- /* background color */
- border-color: var(--primary-color);
- /* border color */
+ padding: 4px 6px;
+ background-color: var(--primary-color);
+ /* background color */
+ border-color: var(--primary-color);
+ /* border color */
}
+
.fc-event-time,
.fc-event-title {
- color: #717171;
- padding: 0 1px;
+ color: #717171;
+ padding: 0 1px;
}
+
.ui-calendar .fc-event-time,
.ui-calendar .fc-event-title {
- color: #fff;
+ color: #fff;
}
+
/* Chat */
.chat-activity-list .chat-element {
- border-bottom: 1px solid #e7eaec;
+ border-bottom: 1px solid #e7eaec;
}
+
.chat-element:first-child {
- margin-top: 0;
+ margin-top: 0;
}
+
.chat-element {
- padding-bottom: 15px;
+ padding-bottom: 15px;
}
+
.chat-element,
.chat-element .media {
- margin-top: 15px;
+ margin-top: 15px;
}
+
.chat-element,
.media-body {
- overflow: hidden;
+ overflow: hidden;
}
+
.media-body {
- display: block;
- width: auto;
+ display: block;
+ width: auto;
}
+
.chat-element > .pull-left {
- margin-right: 10px;
+ margin-right: 10px;
}
+
.chat-element img.img-circle,
.dropdown-messages-box img.img-circle {
- width: 38px;
- height: 38px;
+ width: 38px;
+ height: 38px;
}
+
.chat-element .well {
- border: 1px solid #e7eaec;
- box-shadow: none;
- margin-top: 10px;
- margin-bottom: 5px;
- padding: 10px 20px;
- font-size: 11px;
- line-height: 16px;
+ border: 1px solid #e7eaec;
+ box-shadow: none;
+ margin-top: 10px;
+ margin-bottom: 5px;
+ padding: 10px 20px;
+ font-size: 11px;
+ line-height: 16px;
}
+
.chat-element .actions {
- margin-top: 10px;
+ margin-top: 10px;
}
+
.chat-element .photos {
- margin: 10px 0;
+ margin: 10px 0;
}
+
.right.chat-element > .pull-right {
- margin-left: 10px;
+ margin-left: 10px;
}
+
.chat-photo {
- max-height: 180px;
- border-radius: 4px;
- overflow: hidden;
- margin-right: 10px;
- margin-bottom: 10px;
+ max-height: 180px;
+ border-radius: 4px;
+ overflow: hidden;
+ margin-right: 10px;
+ margin-bottom: 10px;
}
+
.chat {
- margin: 0;
- padding: 0;
- list-style: none;
+ margin: 0;
+ padding: 0;
+ list-style: none;
}
+
.chat li {
- margin-bottom: 10px;
- padding-bottom: 5px;
- border-bottom: 1px dotted #B3A9A9;
+ margin-bottom: 10px;
+ padding-bottom: 5px;
+ border-bottom: 1px dotted #B3A9A9;
}
+
.chat li.left .chat-body {
- margin-left: 60px;
+ margin-left: 60px;
}
+
.chat li.right .chat-body {
- margin-right: 60px;
+ margin-right: 60px;
}
+
.chat li .chat-body p {
- margin: 0;
- color: #777777;
+ margin: 0;
+ color: #777777;
}
+
.panel .slidedown .glyphicon,
.chat .glyphicon {
- margin-right: 5px;
+ margin-right: 5px;
}
+
.chat-panel .panel-body {
- height: 350px;
- overflow-y: scroll;
+ height: 350px;
+ overflow-y: scroll;
}
+
/* LIST GROUP */
a.list-group-item.active,
a.list-group-item.active:hover,
a.list-group-item.active:focus {
- background-color: var(--primary-color);
- border-color: var(--primary-color);
- color: #FFFFFF;
- z-index: 2;
+ background-color: var(--primary-color);
+ border-color: var(--primary-color);
+ color: #FFFFFF;
+ z-index: 2;
}
+
.list-group-item-heading {
- margin-top: 10px;
+ margin-top: 10px;
}
+
.list-group-item-text {
- margin: 0 0 10px;
- color: inherit;
- font-size: 12px;
- line-height: inherit;
+ margin: 0 0 10px;
+ color: inherit;
+ font-size: 12px;
+ line-height: inherit;
}
+
.no-padding .list-group-item {
- border-left: none;
- border-right: none;
- border-bottom: none;
+ border-left: none;
+ border-right: none;
+ border-bottom: none;
}
+
.no-padding .list-group-item:first-child {
- border-left: none;
- border-right: none;
- border-bottom: none;
- border-top: none;
+ border-left: none;
+ border-right: none;
+ border-bottom: none;
+ border-top: none;
}
+
.no-padding .list-group {
- margin-bottom: 0;
+ margin-bottom: 0;
}
+
.list-group-item {
- background-color: inherit;
- border: 1px solid #e7eaec;
- display: block;
- margin-bottom: -1px;
- padding: 10px 15px;
- position: relative;
+ background-color: inherit;
+ border: 1px solid #e7eaec;
+ display: block;
+ margin-bottom: -1px;
+ padding: 10px 15px;
+ position: relative;
}
+
.elements-list .list-group-item {
- border-left: none;
- border-right: none;
- padding: 15px 25px;
+ border-left: none;
+ border-right: none;
+ padding: 15px 25px;
}
+
.elements-list .list-group-item:first-child {
- border-left: none;
- border-right: none;
- border-top: none !important;
+ border-left: none;
+ border-right: none;
+ border-top: none !important;
}
+
.elements-list .list-group {
- margin-bottom: 0;
+ margin-bottom: 0;
}
+
.elements-list a {
- color: inherit;
+ color: inherit;
}
+
.elements-list .list-group-item.active,
.elements-list .list-group-item:hover {
- background: #f3f3f4;
- color: inherit;
- border-color: #e7eaec;
- /*border-bottom: 1px solid #e7eaec;*/
- /*border-top: 1px solid #e7eaec;*/
- border-radius: 0;
+ background: #f3f3f4;
+ color: inherit;
+ border-color: #e7eaec;
+ /*border-bottom: 1px solid #e7eaec;*/
+ /*border-top: 1px solid #e7eaec;*/
+ border-radius: 0;
}
+
.elements-list li.active {
- transition: none;
+ transition: none;
}
+
.element-detail-box {
- padding: 25px;
+ padding: 25px;
}
+
/* FLOT CHART */
.flot-chart {
- display: block;
- height: 200px;
+ display: block;
+ height: 200px;
}
+
.widget .flot-chart.dashboard-chart {
- display: block;
- height: 120px;
- margin-top: 40px;
+ display: block;
+ height: 120px;
+ margin-top: 40px;
}
+
.flot-chart.dashboard-chart {
- display: block;
- height: 180px;
- margin-top: 40px;
+ display: block;
+ height: 180px;
+ margin-top: 40px;
}
+
.flot-chart-content {
- width: 100%;
- height: 100%;
+ width: 100%;
+ height: 100%;
}
+
.flot-chart-pie-content {
- width: 200px;
- height: 200px;
- margin: auto;
+ width: 200px;
+ height: 200px;
+ margin: auto;
}
+
.jqstooltip {
- position: absolute;
- display: block;
- left: 0;
- top: 0;
- visibility: hidden;
- background: #2b303a;
- background-color: rgba(43, 48, 58, 0.8);
- color: white;
- text-align: left;
- white-space: nowrap;
- z-index: 10000;
- padding: 5px 5px 5px 5px;
- min-height: 22px;
- border-radius: 3px;
+ position: absolute;
+ display: block;
+ left: 0;
+ top: 0;
+ visibility: hidden;
+ background: #2b303a;
+ background-color: rgba(43, 48, 58, 0.8);
+ color: white;
+ text-align: left;
+ white-space: nowrap;
+ z-index: 10000;
+ padding: 5px 5px 5px 5px;
+ min-height: 22px;
+ border-radius: 3px;
}
+
.jqsfield {
- color: white;
- text-align: left;
+ color: white;
+ text-align: left;
}
+
.fh-150 {
- height: 150px;
+ height: 150px;
}
+
.fh-200 {
- height: 200px;
+ height: 200px;
}
+
.h-150 {
- min-height: 150px;
+ min-height: 150px;
}
+
.h-200 {
- min-height: 200px;
+ min-height: 200px;
}
+
.legendLabel {
- padding-left: 5px;
+ padding-left: 5px;
}
+
.stat-list li:first-child {
- margin-top: 0;
+ margin-top: 0;
}
+
.stat-list {
- list-style: none;
- padding: 0;
- margin: 0;
+ list-style: none;
+ padding: 0;
+ margin: 0;
}
+
.stat-percent {
- float: right;
+ float: right;
}
+
.stat-list li {
- margin-top: 15px;
- position: relative;
+ margin-top: 15px;
+ position: relative;
}
+
/* DATATABLES */
table.dataTable thead .sorting,
table.dataTable thead .sorting_asc:after,
table.dataTable thead .sorting_desc,
table.dataTable thead .sorting_asc_disabled,
table.dataTable thead .sorting_desc_disabled {
- background: transparent;
+ background: transparent;
}
+
.dataTables_wrapper {
- padding-bottom: 30px;
+ padding-bottom: 30px;
}
+
/*.dataTables_length {*/
- /*float: left;*/
+/*float: left;*/
/*}*/
/*.dataTables_filter label {*/
/* margin-right: 5px;*/
/*}*/
.html5buttons {
- float: right;
+ float: right;
}
+
.html5buttons a {
- border: 1px solid #e7eaec;
- background: #fff;
- color: #676a6c;
- box-shadow: none;
- padding: 6px 8px;
- font-size: 12px;
+ border: 1px solid #e7eaec;
+ background: #fff;
+ color: #676a6c;
+ box-shadow: none;
+ padding: 6px 8px;
+ font-size: 12px;
}
+
.html5buttons a:hover,
.html5buttons a:focus:active {
- background-color: #eee;
- color: inherit;
- border-color: #d2d2d2;
+ background-color: #eee;
+ color: inherit;
+ border-color: #d2d2d2;
}
+
div.dt-button-info {
- z-index: 100;
+ z-index: 100;
}
+
@media (max-width: 768px) {
- .html5buttons {
- float: none;
- margin-top: 10px;
- }
- .dataTables_length {
- float: none;
- }
+ .html5buttons {
+ float: none;
+ margin-top: 10px;
+ }
+
+ .dataTables_length {
+ float: none;
+ }
}
+
/* CIRCLE */
.img-circle {
- border-radius: 50%;
+ border-radius: 50%;
}
+
.btn-circle {
- width: 30px;
- height: 30px;
- padding: 6px 0;
- border-radius: 15px;
- text-align: center;
- font-size: 12px;
- line-height: 1.428571429;
+ width: 30px;
+ height: 30px;
+ padding: 6px 0;
+ border-radius: 15px;
+ text-align: center;
+ font-size: 12px;
+ line-height: 1.428571429;
}
+
.btn-circle.btn-lg {
- width: 50px;
- height: 50px;
- padding: 10px 16px;
- border-radius: 25px;
- font-size: 18px;
- line-height: 1.33;
+ width: 50px;
+ height: 50px;
+ padding: 10px 16px;
+ border-radius: 25px;
+ font-size: 18px;
+ line-height: 1.33;
}
+
.btn-circle.btn-xl {
- width: 70px;
- height: 70px;
- padding: 10px 16px;
- border-radius: 35px;
- font-size: 24px;
- line-height: 1.33;
+ width: 70px;
+ height: 70px;
+ padding: 10px 16px;
+ border-radius: 35px;
+ font-size: 24px;
+ line-height: 1.33;
}
+
.show-grid [class^="col-"] {
- padding-top: 10px;
- padding-bottom: 10px;
- border: 1px solid #ddd;
- background-color: #eee !important;
+ padding-top: 10px;
+ padding-bottom: 10px;
+ border: 1px solid #ddd;
+ background-color: #eee !important;
}
+
.show-grid {
- margin: 15px 0;
+ margin: 15px 0;
}
+
/* ANIMATION */
.css-animation-box h1 {
- font-size: 44px;
+ font-size: 44px;
}
+
.animation-efect-links a {
- padding: 4px 6px;
- font-size: 12px;
+ padding: 4px 6px;
+ font-size: 12px;
}
+
#animation_box {
- background-color: #f9f8f8;
- border-radius: 16px;
- width: 80%;
- margin: 0 auto;
- padding-top: 80px;
+ background-color: #f9f8f8;
+ border-radius: 16px;
+ width: 80%;
+ margin: 0 auto;
+ padding-top: 80px;
}
+
.animation-text-box {
- position: absolute;
- margin-top: 40px;
- left: 50%;
- margin-left: -100px;
- width: 200px;
+ position: absolute;
+ margin-top: 40px;
+ left: 50%;
+ margin-left: -100px;
+ width: 200px;
}
+
.animation-text-info {
- position: absolute;
- margin-top: -60px;
- left: 50%;
- margin-left: -100px;
- width: 200px;
- font-size: 10px;
+ position: absolute;
+ margin-top: -60px;
+ left: 50%;
+ margin-left: -100px;
+ width: 200px;
+ font-size: 10px;
}
+
.animation-text-box h2 {
- font-size: 54px;
- font-weight: 600;
- margin-bottom: 5px;
+ font-size: 54px;
+ font-weight: 600;
+ margin-bottom: 5px;
}
+
.animation-text-box p {
- font-size: 12px;
- text-transform: uppercase;
+ font-size: 12px;
+ text-transform: uppercase;
}
+
/* PEACE */
.pace {
- -webkit-pointer-events: none;
- pointer-events: none;
- -webkit-user-select: none;
- -moz-user-select: none;
- user-select: none;
+ -webkit-pointer-events: none;
+ pointer-events: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
}
+
.pace-inactive {
- display: none;
+ display: none;
}
+
.pace .pace-progress {
- background: var(--primary-color);
- position: fixed;
- z-index: 2040;
- top: 0;
- right: 100%;
- width: 100%;
- height: 2px;
+ background: var(--primary-color);
+ position: fixed;
+ z-index: 2040;
+ top: 0;
+ right: 100%;
+ width: 100%;
+ height: 2px;
}
+
.pace-inactive {
- display: none;
+ display: none;
}
+
/* WIDGETS */
.widget {
- border-radius: 5px;
- padding: 15px 20px;
- margin-bottom: 10px;
- margin-top: 10px;
+ border-radius: 5px;
+ padding: 15px 20px;
+ margin-bottom: 10px;
+ margin-top: 10px;
}
+
.widget.style1 h2 {
- font-size: 30px;
+ font-size: 30px;
}
+
.widget h2,
.widget h3 {
- margin-top: 5px;
- margin-bottom: 0;
+ margin-top: 5px;
+ margin-bottom: 0;
}
+
.widget-text-box {
- padding: 20px;
- border: 1px solid #e7eaec;
- background: #ffffff;
+ padding: 20px;
+ border: 1px solid #e7eaec;
+ background: #ffffff;
}
+
.widget-head-color-box {
- border-radius: 5px 5px 0 0;
- margin-top: 10px;
+ border-radius: 5px 5px 0 0;
+ margin-top: 10px;
}
+
.widget .flot-chart {
- height: 100px;
+ height: 100px;
}
+
.vertical-align div {
- display: inline-block;
- vertical-align: middle;
+ display: inline-block;
+ vertical-align: middle;
}
+
.vertical-align h2,
.vertical-align h3 {
- margin: 0;
+ margin: 0;
}
+
.todo-list {
- list-style: none outside none;
- margin: 0;
- padding: 0;
- font-size: 14px;
+ list-style: none outside none;
+ margin: 0;
+ padding: 0;
+ font-size: 14px;
}
+
.todo-list.small-list {
- font-size: 12px;
+ font-size: 12px;
}
+
.todo-list.small-list > li {
- background: #f3f3f4;
- border-left: none;
- border-right: none;
- border-radius: 4px;
- color: inherit;
- margin-bottom: 2px;
- padding: 6px 6px 6px 12px;
+ background: #f3f3f4;
+ border-left: none;
+ border-right: none;
+ border-radius: 4px;
+ color: inherit;
+ margin-bottom: 2px;
+ padding: 6px 6px 6px 12px;
}
+
.todo-list.small-list .btn-xs,
.todo-list.small-list .btn-group-xs > .btn {
- border-radius: 5px;
- font-size: 10px;
- line-height: 1.5;
- padding: 1px 2px 1px 5px;
+ border-radius: 5px;
+ font-size: 10px;
+ line-height: 1.5;
+ padding: 1px 2px 1px 5px;
}
+
.todo-list > li {
- background: #f3f3f4;
- border-left: 6px solid #e7eaec;
- border-right: 6px solid #e7eaec;
- border-radius: 4px;
- color: inherit;
- margin-bottom: 2px;
- padding: 10px;
+ background: #f3f3f4;
+ border-left: 6px solid #e7eaec;
+ border-right: 6px solid #e7eaec;
+ border-radius: 4px;
+ color: inherit;
+ margin-bottom: 2px;
+ padding: 10px;
}
+
.todo-list .handle {
- cursor: move;
- display: inline-block;
- font-size: 16px;
- margin: 0 5px;
+ cursor: move;
+ display: inline-block;
+ font-size: 16px;
+ margin: 0 5px;
}
+
.todo-list > li .label {
- font-size: 9px;
- margin-left: 10px;
+ font-size: 9px;
+ margin-left: 10px;
}
+
.check-link {
- font-size: 16px;
+ font-size: 16px;
}
+
.todo-completed {
- text-decoration: line-through;
+ text-decoration: line-through;
}
+
.geo-statistic h1 {
- font-size: 36px;
- margin-bottom: 0;
+ font-size: 36px;
+ margin-bottom: 0;
}
+
.glyphicon.fa {
- font-family: "FontAwesome";
+ font-family: "FontAwesome";
}
+
/* INPUTS */
.inline {
- display: inline-block !important;
+ display: inline-block !important;
}
+
.input-s-sm {
- width: 120px;
+ width: 120px;
}
+
.input-s {
- width: 200px;
+ width: 200px;
}
+
.input-s-lg {
- width: 250px;
+ width: 250px;
}
+
.i-checks {
- padding-left: 0;
+ padding-left: 0;
}
+
.form-control,
.single-line {
- background-color: #FFFFFF;
- background-image: none;
- border: 1px solid #e5e6e7;
- border-radius: 1px;
- color: inherit;
- display: block;
- padding: 6px 12px;
- transition: border-color 0.15s ease-in-out 0s, box-shadow 0.15s ease-in-out 0s;
- width: 100%;
- font-size: 14px;
+ background-color: #FFFFFF;
+ background-image: none;
+ border: 1px solid #e5e6e7;
+ border-radius: 1px;
+ color: inherit;
+ display: block;
+ padding: 6px 12px;
+ transition: border-color 0.15s ease-in-out 0s, box-shadow 0.15s ease-in-out 0s;
+ width: 100%;
+ font-size: 14px;
}
+
.form-control:focus,
.single-line:focus {
- border-color: var(--primary-color) !important;
+ border-color: var(--primary-color) !important;
}
+
.has-success .form-control {
- border-color: var(--primary-color);
+ border-color: var(--primary-color);
}
+
.has-warning .form-control {
- border-color: #f8ac59;
+ border-color: #f8ac59;
}
+
.has-error .form-control {
- border-color: #ed5565;
+ border-color: #ed5565;
}
+
.has-success .control-label {
- color: var(--primary-color);
+ color: var(--primary-color);
}
+
.has-warning .control-label {
- color: #f8ac59;
+ color: #f8ac59;
}
+
.has-error .control-label {
- color: #ed5565;
+ color: #ed5565;
}
+
.input-group-addon {
- background-color: #fff;
- border: 1px solid #E5E6E7;
- border-radius: 1px;
- color: inherit;
- font-size: 14px;
- font-weight: 400;
- line-height: 1;
- padding: 6px 12px;
- text-align: center;
+ background-color: #fff;
+ border: 1px solid #E5E6E7;
+ border-radius: 1px;
+ color: inherit;
+ font-size: 14px;
+ font-weight: 400;
+ line-height: 1;
+ padding: 6px 12px;
+ text-align: center;
}
+
.spinner-buttons.input-group-btn .btn-xs {
- line-height: 1.13;
+ line-height: 1.13;
}
+
.spinner-buttons.input-group-btn {
- width: 20%;
+ width: 20%;
}
+
.noUi-connect {
- background: none repeat scroll 0 0 var(--primary-color);
- box-shadow: none;
+ background: none repeat scroll 0 0 var(--primary-color);
+ box-shadow: none;
}
+
.slider_red .noUi-connect {
- background: none repeat scroll 0 0 #ed5565;
- box-shadow: none;
+ background: none repeat scroll 0 0 #ed5565;
+ box-shadow: none;
}
+
/* UI Sortable */
.ui-sortable .ibox-title {
- cursor: move;
+ cursor: move;
}
+
.ui-sortable-placeholder {
- border: 1px dashed #cecece !important;
- visibility: visible !important;
- background: #e7eaec;
+ border: 1px dashed #cecece !important;
+ visibility: visible !important;
+ background: #e7eaec;
}
+
.ibox.ui-sortable-placeholder {
- margin: 0 0 23px !important;
+ margin: 0 0 23px !important;
}
+
/* SWITCHES */
.onoffswitch {
- position: relative;
- width: 54px;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
+ position: relative;
+ width: 54px;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
}
+
.onoffswitch-checkbox {
- display: none;
+ display: none;
}
+
.onoffswitch-label {
- display: block;
- overflow: hidden;
- cursor: pointer;
- border: 2px solid var(--primary-color);
- border-radius: 3px;
+ display: block;
+ overflow: hidden;
+ cursor: pointer;
+ border: 2px solid var(--primary-color);
+ border-radius: 3px;
}
+
.onoffswitch-inner {
- display: block;
- width: 200%;
- margin-left: -100%;
- -moz-transition: margin 0.3s ease-in 0s;
- -webkit-transition: margin 0.3s ease-in 0s;
- -o-transition: margin 0.3s ease-in 0s;
- transition: margin 0.3s ease-in 0s;
+ display: block;
+ width: 200%;
+ margin-left: -100%;
+ -moz-transition: margin 0.3s ease-in 0s;
+ -webkit-transition: margin 0.3s ease-in 0s;
+ -o-transition: margin 0.3s ease-in 0s;
+ transition: margin 0.3s ease-in 0s;
}
+
.onoffswitch-inner:before,
.onoffswitch-inner:after {
- display: block;
- float: left;
- width: 50%;
- height: 16px;
- padding: 0;
- line-height: 16px;
- font-size: 10px;
- color: white;
- font-family: Trebuchet, Arial, sans-serif;
- font-weight: bold;
- -moz-box-sizing: border-box;
- -webkit-box-sizing: border-box;
- box-sizing: border-box;
+ display: block;
+ float: left;
+ width: 50%;
+ height: 16px;
+ padding: 0;
+ line-height: 16px;
+ font-size: 10px;
+ color: white;
+ font-family: Trebuchet, Arial, sans-serif;
+ font-weight: bold;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
}
+
.onoffswitch-inner:before {
- content: "ON";
- padding-left: 7px;
- background-color: var(--primary-color);
- color: #FFFFFF;
+ content: "ON";
+ padding-left: 7px;
+ background-color: var(--primary-color);
+ color: #FFFFFF;
}
+
.onoffswitch-inner:after {
- content: "OFF";
- padding-right: 7px;
- background-color: #FFFFFF;
- color: #919191;
- text-align: right;
+ content: "OFF";
+ padding-right: 7px;
+ background-color: #FFFFFF;
+ color: #919191;
+ text-align: right;
}
+
.onoffswitch-switch {
- display: block;
- width: 18px;
- margin: 0;
- background: #FFFFFF;
- border: 2px solid var(--primary-color);
- border-radius: 3px;
- position: absolute;
- top: 0;
- bottom: 0;
- right: 36px;
- -moz-transition: all 0.3s ease-in 0s;
- -webkit-transition: all 0.3s ease-in 0s;
- -o-transition: all 0.3s ease-in 0s;
- transition: all 0.3s ease-in 0s;
+ display: block;
+ width: 18px;
+ margin: 0;
+ background: #FFFFFF;
+ border: 2px solid var(--primary-color);
+ border-radius: 3px;
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ right: 36px;
+ -moz-transition: all 0.3s ease-in 0s;
+ -webkit-transition: all 0.3s ease-in 0s;
+ -o-transition: all 0.3s ease-in 0s;
+ transition: all 0.3s ease-in 0s;
}
+
.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-inner {
- margin-left: 0;
+ margin-left: 0;
}
+
.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-switch {
- right: 0;
+ right: 0;
}
+
/* jqGrid */
.ui-jqgrid {
- -moz-box-sizing: content-box;
+ -moz-box-sizing: content-box;
}
+
.ui-jqgrid-btable {
- border-collapse: separate;
+ border-collapse: separate;
}
+
.ui-jqgrid-htable {
- border-collapse: separate;
+ border-collapse: separate;
}
+
.ui-jqgrid-titlebar {
- height: 40px;
- line-height: 15px;
- color: #676a6c;
- background-color: #F9F9F9;
- text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+ height: 40px;
+ line-height: 15px;
+ color: #676a6c;
+ background-color: #F9F9F9;
+ text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
}
+
.ui-jqgrid .ui-jqgrid-title {
- float: left;
- margin: 1.1em 1em 0.2em;
+ float: left;
+ margin: 1.1em 1em 0.2em;
}
+
.ui-jqgrid .ui-jqgrid-titlebar {
- position: relative;
- border-left: 0 solid;
- border-right: 0 solid;
- border-top: 0 solid;
+ position: relative;
+ border-left: 0 solid;
+ border-right: 0 solid;
+ border-top: 0 solid;
}
+
.ui-widget-header {
- background: none;
- background-image: none;
- background-color: #f5f5f6;
- text-transform: uppercase;
- border-top-left-radius: 0;
- border-top-right-radius: 0;
+ background: none;
+ background-image: none;
+ background-color: #f5f5f6;
+ text-transform: uppercase;
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
}
+
.ui-jqgrid tr.ui-row-ltr td {
- border-right-color: inherit;
- border-right-style: solid;
- border-right-width: 1px;
- text-align: left;
- border-color: #DDDDDD;
- background-color: inherit;
+ border-right-color: inherit;
+ border-right-style: solid;
+ border-right-width: 1px;
+ text-align: left;
+ border-color: #DDDDDD;
+ background-color: inherit;
}
+
.ui-search-toolbar input[type="text"] {
- font-size: 12px;
- height: 15px;
- border: 1px solid #CCCCCC;
- border-radius: 0;
+ font-size: 12px;
+ height: 15px;
+ border: 1px solid #CCCCCC;
+ border-radius: 0;
}
+
.ui-state-default,
.ui-widget-content .ui-state-default,
.ui-widget-header .ui-state-default {
- background: #F9F9F9;
- border: 1px solid #DDDDDD;
- line-height: 15px;
- font-weight: bold;
- color: #676a6c;
- text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+ background: #F9F9F9;
+ border: 1px solid #DDDDDD;
+ line-height: 15px;
+ font-weight: bold;
+ color: #676a6c;
+ text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
}
+
.ui-widget-content {
- box-sizing: content-box;
+ box-sizing: content-box;
}
+
.ui-icon-triangle-1-n {
- background-position: 1px -16px;
+ background-position: 1px -16px;
}
+
.ui-jqgrid tr.ui-search-toolbar th {
- border-top-width: 0 !important;
- border-top-color: inherit !important;
- border-top-style: ridge !important;
+ border-top-width: 0 !important;
+ border-top-color: inherit !important;
+ border-top-style: ridge !important;
}
+
.ui-state-hover,
.ui-widget-content .ui-state-hover,
.ui-state-focus,
.ui-widget-content .ui-state-focus,
.ui-widget-header .ui-state-focus {
- background: #f5f5f5;
- border-collapse: separate;
+ background: #f5f5f5;
+ border-collapse: separate;
}
+
.ui-state-highlight,
.ui-widget-content .ui-state-highlight,
.ui-widget-header .ui-state-highlight {
- background: #f2fbff;
+ background: #f2fbff;
}
+
.ui-state-active,
.ui-widget-content .ui-state-active,
.ui-widget-header .ui-state-active {
- border: 1px solid #dddddd;
- background: #ffffff;
- font-weight: normal;
- color: #212121;
+ border: 1px solid #dddddd;
+ background: #ffffff;
+ font-weight: normal;
+ color: #212121;
}
+
.ui-jqgrid .ui-pg-input {
- font-size: inherit;
- width: 50px;
- border: 1px solid #CCCCCC;
- height: 15px;
+ font-size: inherit;
+ width: 50px;
+ border: 1px solid #CCCCCC;
+ height: 15px;
}
+
.ui-jqgrid .ui-pg-selbox {
- display: block;
- font-size: 1em;
- height: 25px;
- line-height: 18px;
- margin: 0;
- width: auto;
+ display: block;
+ font-size: 1em;
+ height: 25px;
+ line-height: 18px;
+ margin: 0;
+ width: auto;
}
+
.ui-jqgrid .ui-pager-control {
- position: relative;
+ position: relative;
}
+
.ui-jqgrid .ui-jqgrid-pager {
- height: 32px;
- position: relative;
+ height: 32px;
+ position: relative;
}
+
.ui-pg-table .navtable .ui-corner-all {
- border-radius: 0;
+ border-radius: 0;
}
+
.ui-jqgrid .ui-pg-button:hover {
- padding: 1px;
- border: 0;
+ padding: 1px;
+ border: 0;
}
+
.ui-jqgrid .loading {
- position: absolute;
- top: 45%;
- left: 45%;
- width: auto;
- height: auto;
- z-index: 101;
- padding: 6px;
- margin: 5px;
- text-align: center;
- font-weight: bold;
- display: none;
- border-width: 2px !important;
- font-size: 11px;
+ position: absolute;
+ top: 45%;
+ left: 45%;
+ width: auto;
+ height: auto;
+ z-index: 101;
+ padding: 6px;
+ margin: 5px;
+ text-align: center;
+ font-weight: bold;
+ display: none;
+ border-width: 2px !important;
+ font-size: 11px;
}
+
.ui-jqgrid .form-control {
- height: 10px;
- width: auto;
- display: inline;
- padding: 10px 12px;
+ height: 10px;
+ width: auto;
+ display: inline;
+ padding: 10px 12px;
}
+
.ui-jqgrid-pager {
- height: 32px;
+ height: 32px;
}
+
.ui-corner-all,
.ui-corner-top,
.ui-corner-left,
.ui-corner-tl {
- border-top-left-radius: 0;
+ border-top-left-radius: 0;
}
+
.ui-corner-all,
.ui-corner-top,
.ui-corner-right,
.ui-corner-tr {
- border-top-right-radius: 0;
+ border-top-right-radius: 0;
}
+
.ui-corner-all,
.ui-corner-bottom,
.ui-corner-left,
.ui-corner-bl {
- border-bottom-left-radius: 0;
+ border-bottom-left-radius: 0;
}
+
.ui-corner-all,
.ui-corner-bottom,
.ui-corner-right,
.ui-corner-br {
- border-bottom-right-radius: 0;
+ border-bottom-right-radius: 0;
}
+
.ui-widget-content {
- border: 1px solid #ddd;
+ border: 1px solid #ddd;
}
+
.ui-jqgrid .ui-jqgrid-titlebar {
- padding: 0;
+ padding: 0;
}
+
.ui-jqgrid .ui-jqgrid-titlebar {
- border-bottom: 1px solid #ddd;
+ border-bottom: 1px solid #ddd;
}
+
.ui-jqgrid tr.jqgrow td {
- padding: 6px;
+ padding: 6px;
}
+
.ui-jqdialog .ui-jqdialog-titlebar {
- padding: 10px 10px;
+ padding: 10px 10px;
}
+
.ui-jqdialog .ui-jqdialog-title {
- float: none !important;
+ float: none !important;
}
+
.ui-jqdialog > .ui-resizable-se {
- position: absolute;
+ position: absolute;
}
+
/* Nestable list */
.dd {
- position: relative;
- display: block;
- margin: 0;
- padding: 0;
- list-style: none;
- font-size: 13px;
- line-height: 20px;
+ position: relative;
+ display: block;
+ margin: 0;
+ padding: 0;
+ list-style: none;
+ font-size: 13px;
+ line-height: 20px;
}
+
.dd-list {
- display: block;
- position: relative;
- margin: 0;
- padding: 0;
- list-style: none;
+ display: block;
+ position: relative;
+ margin: 0;
+ padding: 0;
+ list-style: none;
}
+
.dd-list .dd-list {
- padding-left: 30px;
+ padding-left: 30px;
}
+
.dd-collapsed .dd-list {
- display: none;
+ display: none;
}
+
.dd-item,
.dd-empty,
.dd-placeholder {
- display: block;
- position: relative;
- margin: 0;
- padding: 0;
- min-height: 20px;
- font-size: 13px;
- line-height: 20px;
+ display: block;
+ position: relative;
+ margin: 0;
+ padding: 0;
+ min-height: 20px;
+ font-size: 13px;
+ line-height: 20px;
}
+
.dd-handle {
- display: block;
- margin: 5px 0;
- padding: 5px 10px;
- color: #333;
- text-decoration: none;
- border: 1px solid #e7eaec;
- background: #f5f5f5;
- -webkit-border-radius: 3px;
- border-radius: 3px;
- box-sizing: border-box;
- -moz-box-sizing: border-box;
+ display: block;
+ margin: 5px 0;
+ padding: 5px 10px;
+ color: #333;
+ text-decoration: none;
+ border: 1px solid #e7eaec;
+ background: #f5f5f5;
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
}
+
.dd-handle span {
- font-weight: bold;
+ font-weight: bold;
}
+
.dd-handle:hover {
- background: #f0f0f0;
- cursor: pointer;
- font-weight: bold;
+ background: #f0f0f0;
+ cursor: pointer;
+ font-weight: bold;
}
+
.dd-item > button {
- display: block;
- position: relative;
- cursor: pointer;
- float: left;
- width: 25px;
- height: 20px;
- margin: 5px 0;
- padding: 0;
- text-indent: 100%;
- white-space: nowrap;
- overflow: hidden;
- border: 0;
- background: transparent;
- font-size: 12px;
- line-height: 1;
- text-align: center;
- font-weight: bold;
+ display: block;
+ position: relative;
+ cursor: pointer;
+ float: left;
+ width: 25px;
+ height: 20px;
+ margin: 5px 0;
+ padding: 0;
+ text-indent: 100%;
+ white-space: nowrap;
+ overflow: hidden;
+ border: 0;
+ background: transparent;
+ font-size: 12px;
+ line-height: 1;
+ text-align: center;
+ font-weight: bold;
}
+
.dd-item > button:before {
- content: '+';
- display: block;
- position: absolute;
- width: 100%;
- text-align: center;
- text-indent: 0;
+ content: '+';
+ display: block;
+ position: absolute;
+ width: 100%;
+ text-align: center;
+ text-indent: 0;
}
+
.dd-item > button[data-action="collapse"]:before {
- content: '-';
+ content: '-';
}
+
#nestable2 .dd-item > button {
- font-family: FontAwesome;
- height: 34px;
- width: 33px;
- color: #c1c1c1;
+ font-family: FontAwesome;
+ height: 34px;
+ width: 33px;
+ color: #c1c1c1;
}
+
#nestable2 .dd-item > button:before {
- content: "\f067";
+ content: "\f067";
}
+
#nestable2 .dd-item > button[data-action="collapse"]:before {
- content: "\f068";
+ content: "\f068";
}
+
.dd-placeholder,
.dd-empty {
- margin: 5px 0;
- padding: 0;
- min-height: 30px;
- background: #f2fbff;
- border: 1px dashed #b6bcbf;
- box-sizing: border-box;
- -moz-box-sizing: border-box;
+ margin: 5px 0;
+ padding: 0;
+ min-height: 30px;
+ background: #f2fbff;
+ border: 1px dashed #b6bcbf;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
}
+
.dd-empty {
- border: 1px dashed #bbb;
- min-height: 100px;
- background-color: #e5e5e5;
- background-image: -webkit-linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff), -webkit-linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff);
- background-image: -moz-linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff), -moz-linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff);
- background-image: linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff), linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff);
- background-size: 60px 60px;
- background-position: 0 0, 30px 30px;
+ border: 1px dashed #bbb;
+ min-height: 100px;
+ background-color: #e5e5e5;
+ background-image: -webkit-linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff), -webkit-linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff);
+ background-image: -moz-linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff), -moz-linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff);
+ background-image: linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff), linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff);
+ background-size: 60px 60px;
+ background-position: 0 0, 30px 30px;
}
+
.dd-dragel {
- position: absolute;
- z-index: 9999;
- pointer-events: none;
+ position: absolute;
+ z-index: 9999;
+ pointer-events: none;
}
+
.dd-dragel > .dd-item .dd-handle {
- margin-top: 0;
+ margin-top: 0;
}
+
.dd-dragel .dd-handle {
- -webkit-box-shadow: 2px 4px 6px 0 rgba(0, 0, 0, 0.1);
- box-shadow: 2px 4px 6px 0 rgba(0, 0, 0, 0.1);
+ -webkit-box-shadow: 2px 4px 6px 0 rgba(0, 0, 0, 0.1);
+ box-shadow: 2px 4px 6px 0 rgba(0, 0, 0, 0.1);
}
+
/**
* Nestable Extras
*/
.nestable-lists {
- display: block;
- clear: both;
- padding: 30px 0;
- width: 100%;
- border: 0;
- border-top: 2px solid #ddd;
- border-bottom: 2px solid #ddd;
+ display: block;
+ clear: both;
+ padding: 30px 0;
+ width: 100%;
+ border: 0;
+ border-top: 2px solid #ddd;
+ border-bottom: 2px solid #ddd;
}
+
#nestable-menu {
- padding: 0;
- margin: 10px 0 20px 0;
+ padding: 0;
+ margin: 10px 0 20px 0;
}
+
#nestable-output,
#nestable2-output {
- width: 100%;
- font-size: 0.75em;
- line-height: 1.333333em;
- font-family: open sans, lucida grande, lucida sans unicode, helvetica, arial, sans-serif;
- padding: 5px;
- box-sizing: border-box;
- -moz-box-sizing: border-box;
+ width: 100%;
+ font-size: 0.75em;
+ line-height: 1.333333em;
+ font-family: open sans, lucida grande, lucida sans unicode, helvetica, arial, sans-serif;
+ padding: 5px;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
}
+
#nestable2 .dd-handle {
- color: inherit;
- border: 1px dashed #e7eaec;
- background: #f3f3f4;
- padding: 10px;
+ color: inherit;
+ border: 1px dashed #e7eaec;
+ background: #f3f3f4;
+ padding: 10px;
}
+
#nestable2 .dd-handle:hover {
- /*background: #bbb;*/
+ /*background: #bbb;*/
}
+
#nestable2 span.label {
- margin-right: 10px;
+ margin-right: 10px;
}
+
#nestable-output,
#nestable2-output {
- font-size: 12px;
- padding: 25px;
- box-sizing: border-box;
- -moz-box-sizing: border-box;
+ font-size: 12px;
+ padding: 25px;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
}
+
/* CodeMirror */
.CodeMirror {
- border: 1px solid #eee;
- height: auto;
+ border: 1px solid #eee;
+ height: auto;
}
+
.CodeMirror-scroll {
- overflow-y: hidden;
- overflow-x: auto;
+ overflow-y: hidden;
+ overflow-x: auto;
}
+
/* Google Maps */
.google-map {
- height: 300px;
+ height: 300px;
}
+
/* Validation */
label.error {
- color: #cc5965;
- display: inline-block;
- margin-left: 5px;
+ color: #cc5965;
+ display: inline-block;
+ margin-left: 5px;
}
+
.form-control.error {
- border: 1px dotted #cc5965;
+ border: 1px dotted #cc5965;
}
+
/* ngGrid */
.gridStyle {
- border: 1px solid #d4d4d4;
- width: 100%;
- height: 400px;
+ border: 1px solid #d4d4d4;
+ width: 100%;
+ height: 400px;
}
+
.gridStyle2 {
- border: 1px solid #d4d4d4;
- width: 500px;
- height: 300px;
+ border: 1px solid #d4d4d4;
+ width: 500px;
+ height: 300px;
}
+
.ngH eaderCell {
- border-right: none;
- border-bottom: 1px solid #e7eaec;
+ border-right: none;
+ border-bottom: 1px solid #e7eaec;
}
+
.ngCell {
- border-right: none;
+ border-right: none;
}
+
.ngTopPanel {
- background: #F5F5F6;
+ background: #F5F5F6;
}
+
.ngRow.even {
- background: #f9f9f9;
+ background: #f9f9f9;
}
+
.ngRow.selected {
- background: #EBF2F1;
+ background: #EBF2F1;
}
+
.ngRow {
- border-bottom: 1px solid #e7eaec;
+ border-bottom: 1px solid #e7eaec;
}
+
.ngCell {
- background-color: transparent;
+ background-color: transparent;
}
+
.ngHeaderCell {
- border-right: none;
+ border-right: none;
}
+
/* Toastr custom style */
#toast-container > .toast {
- background-image: none !important;
+ background-image: none !important;
}
+
#toast-container > .toast:before {
- position: fixed;
- font-family: FontAwesome;
- font-size: 24px;
- line-height: 24px;
- float: left;
- color: #FFF;
- padding-right: 0.5em;
- margin: auto 0.5em auto -1.5em;
+ position: fixed;
+ font-family: FontAwesome;
+ font-size: 24px;
+ line-height: 24px;
+ float: left;
+ color: #FFF;
+ padding-right: 0.5em;
+ margin: auto 0.5em auto -1.5em;
}
+
#toast-container > .toast-warning:before {
- content: "\f0e7";
+ content: "\f0e7";
}
+
#toast-container > .toast-error:before {
- content: "\f071";
+ content: "\f071";
}
+
#toast-container > .toast-info:before {
- content: "\f005";
+ content: "\f005";
}
+
#toast-container > .toast-success:before {
- content: "\f00C";
+ content: "\f00C";
}
+
#toast-container > div {
- -moz-box-shadow: 0 0 3px #999;
- -webkit-box-shadow: 0 0 3px #999;
- box-shadow: 0 0 3px #999;
- opacity: .9;
- -ms-filter: alpha(opacity=90);
- filter: alpha(opacity=90);
+ -moz-box-shadow: 0 0 3px #999;
+ -webkit-box-shadow: 0 0 3px #999;
+ box-shadow: 0 0 3px #999;
+ opacity: .9;
+ -ms-filter: alpha(opacity=90);
+ filter: alpha(opacity=90);
}
+
#toast-container > :hover {
- -moz-box-shadow: 0 0 4px #999;
- -webkit-box-shadow: 0 0 4px #999;
- box-shadow: 0 0 4px #999;
- opacity: 1;
- -ms-filter: alpha(opacity=100);
- filter: alpha(opacity=100);
- cursor: pointer;
+ -moz-box-shadow: 0 0 4px #999;
+ -webkit-box-shadow: 0 0 4px #999;
+ box-shadow: 0 0 4px #999;
+ opacity: 1;
+ -ms-filter: alpha(opacity=100);
+ filter: alpha(opacity=100);
+ cursor: pointer;
}
+
.toast {
- background-color: var(--primary-color);
+ background-color: var(--primary-color);
}
+
.toast-success {
- background-color: var(--primary-color);
+ background-color: var(--primary-color);
}
+
.toast-error {
- background-color: #ed5565;
+ background-color: #ed5565;
}
+
.toast-info {
- background-color: #23c6c8;
+ background-color: #23c6c8;
}
+
.toast-warning {
- background-color: #f8ac59;
+ background-color: #f8ac59;
}
+
.toast-top-full-width {
- margin-top: 20px;
+ margin-top: 20px;
}
+
.toast-bottom-full-width {
- margin-bottom: 20px;
+ margin-bottom: 20px;
}
+
/* Notifie */
.cg-notify-message.inspinia-notify {
- background: #fff;
- padding: 0;
- box-shadow: 0 0 1px rgba(0, 0, 0, 0.1), 0 2px 4px rgba(0, 0, 0, 0.2);
- -webkit-box-shadow: 0 0 1px rgba(0, 0, 0, 0.1), 0 2px 4px rgba(0, 0, 0, 0.2);
- -moz-box-shadow: 0 0 1px rgba(0, 0, 0, 0.1), 0 2px 4px rgba(0, 0, 0, 0.2);
- border: none;
- margin-top: 30px;
- color: inherit;
+ background: #fff;
+ padding: 0;
+ box-shadow: 0 0 1px rgba(0, 0, 0, 0.1), 0 2px 4px rgba(0, 0, 0, 0.2);
+ -webkit-box-shadow: 0 0 1px rgba(0, 0, 0, 0.1), 0 2px 4px rgba(0, 0, 0, 0.2);
+ -moz-box-shadow: 0 0 1px rgba(0, 0, 0, 0.1), 0 2px 4px rgba(0, 0, 0, 0.2);
+ border: none;
+ margin-top: 30px;
+ color: inherit;
}
+
.inspinia-notify.alert-warning {
- border-left: 6px solid #f8ac59;
+ border-left: 6px solid #f8ac59;
}
+
.inspinia-notify.alert-success {
- border-left: 6px solid #1c84c6;
+ border-left: 6px solid #1c84c6;
}
+
.inspinia-notify.alert-danger {
- border-left: 6px solid #ed5565;
+ border-left: 6px solid #ed5565;
}
+
.inspinia-notify.alert-info {
- border-left: 6px solid var(--primary-color);
+ border-left: 6px solid var(--primary-color);
}
+
/* Image cropper style */
.img-container,
.img-preview {
- overflow: hidden;
- text-align: center;
- width: 100%;
+ overflow: hidden;
+ text-align: center;
+ width: 100%;
}
+
.img-preview-sm {
- height: 130px;
- width: 200px;
+ height: 130px;
+ width: 200px;
}
+
/* Forum styles */
.forum-post-container .media {
- margin: 10px 10px 10px 10px;
- padding: 20px 10px 20px 10px;
- border-bottom: 1px solid #f1f1f1;
+ margin: 10px 10px 10px 10px;
+ padding: 20px 10px 20px 10px;
+ border-bottom: 1px solid #f1f1f1;
}
+
.forum-avatar {
- float: left;
- margin-right: 20px;
- text-align: center;
- width: 110px;
+ float: left;
+ margin-right: 20px;
+ text-align: center;
+ width: 110px;
}
+
.forum-avatar .img-circle {
- height: 48px;
- width: 48px;
+ height: 48px;
+ width: 48px;
}
+
.author-info {
- color: #676a6c;
- font-size: 11px;
- margin-top: 5px;
- text-align: center;
+ color: #676a6c;
+ font-size: 11px;
+ margin-top: 5px;
+ text-align: center;
}
+
.forum-post-info {
- padding: 9px 12px 6px 12px;
- background: #f9f9f9;
- border: 1px solid #f1f1f1;
+ padding: 9px 12px 6px 12px;
+ background: #f9f9f9;
+ border: 1px solid #f1f1f1;
}
+
.media-body > .media {
- background: #f9f9f9;
- border-radius: 3px;
- border: 1px solid #f1f1f1;
+ background: #f9f9f9;
+ border-radius: 3px;
+ border: 1px solid #f1f1f1;
}
+
.forum-post-container .media-body .photos {
- margin: 10px 0;
+ margin: 10px 0;
}
+
.forum-photo {
- max-width: 140px;
- border-radius: 3px;
+ max-width: 140px;
+ border-radius: 3px;
}
+
.media-body > .media .forum-avatar {
- width: 70px;
- margin-right: 10px;
+ width: 70px;
+ margin-right: 10px;
}
+
.media-body > .media .forum-avatar .img-circle {
- height: 38px;
- width: 38px;
+ height: 38px;
+ width: 38px;
}
+
.mid-icon {
- font-size: 66px;
+ font-size: 66px;
}
+
.forum-item {
- margin: 10px 0;
- padding: 10px 0 20px;
- border-bottom: 1px solid #f1f1f1;
+ margin: 10px 0;
+ padding: 10px 0 20px;
+ border-bottom: 1px solid #f1f1f1;
}
+
.views-number {
- font-size: 24px;
- line-height: 18px;
- font-weight: 400;
+ font-size: 24px;
+ line-height: 18px;
+ font-weight: 400;
}
+
.forum-container,
.forum-post-container {
- padding: 30px !important;
+ padding: 30px !important;
}
+
.forum-item small {
- color: #999;
+ color: #999;
}
+
.forum-item .forum-sub-title {
- color: #999;
- margin-left: 50px;
+ color: #999;
+ margin-left: 50px;
}
+
.forum-title {
- margin: 15px 0 15px 0;
+ margin: 15px 0 15px 0;
}
+
.forum-info {
- text-align: center;
+ text-align: center;
}
+
.forum-desc {
- color: #999;
+ color: #999;
}
+
.forum-icon {
- float: left;
- width: 30px;
- margin-right: 20px;
- text-align: center;
+ float: left;
+ width: 30px;
+ margin-right: 20px;
+ text-align: center;
}
+
a.forum-item-title {
- color: inherit;
- display: block;
- font-size: 18px;
- font-weight: 600;
+ color: inherit;
+ display: block;
+ font-size: 18px;
+ font-weight: 600;
}
+
a.forum-item-title:hover {
- color: inherit;
+ color: inherit;
}
+
.forum-icon .fa {
- font-size: 30px;
- margin-top: 8px;
- color: #9b9b9b;
+ font-size: 30px;
+ margin-top: 8px;
+ color: #9b9b9b;
}
+
.forum-item.active .fa {
- color: var(--primary-color);
+ color: var(--primary-color);
}
+
.forum-item.active a.forum-item-title {
- color: var(--primary-color);
+ color: var(--primary-color);
}
+
@media (max-width: 992px) {
- .forum-info {
- margin: 15px 0 10px 0;
- /* Comment this is you want to show forum info in small devices */
- display: none;
- }
- .forum-desc {
- float: none !important;
- }
+ .forum-info {
+ margin: 15px 0 10px 0;
+ /* Comment this is you want to show forum info in small devices */
+ display: none;
+ }
+
+ .forum-desc {
+ float: none !important;
+ }
}
+
/* New Timeline style */
.vertical-container {
- /* this class is used to give a max-width to the element it is applied to, and center it horizontally when it reaches that max-width */
- width: 90%;
- max-width: 1170px;
- margin: 0 auto;
+ /* this class is used to give a max-width to the element it is applied to, and center it horizontally when it reaches that max-width */
+ width: 90%;
+ max-width: 1170px;
+ margin: 0 auto;
}
+
.vertical-container::after {
- /* clearfix */
- content: '';
- display: table;
- clear: both;
+ /* clearfix */
+ content: '';
+ display: table;
+ clear: both;
}
+
#vertical-timeline {
- position: relative;
- padding: 0;
- margin-top: 2em;
- margin-bottom: 2em;
+ position: relative;
+ padding: 0;
+ margin-top: 2em;
+ margin-bottom: 2em;
}
+
#vertical-timeline::before {
- content: '';
- position: absolute;
- top: 0;
- left: 18px;
- height: 100%;
- width: 4px;
- background: #f1f1f1;
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 18px;
+ height: 100%;
+ width: 4px;
+ background: #f1f1f1;
}
+
.vertical-timeline-content .btn {
- float: right;
+ float: right;
}
+
#vertical-timeline.light-timeline:before {
- background: #e7eaec;
+ background: #e7eaec;
}
+
.dark-timeline .vertical-timeline-content:before {
- border-color: transparent #f5f5f5 transparent transparent;
+ border-color: transparent #f5f5f5 transparent transparent;
}
+
.dark-timeline.center-orientation .vertical-timeline-content:before {
- border-color: transparent transparent transparent #f5f5f5;
+ border-color: transparent transparent transparent #f5f5f5;
}
+
.dark-timeline .vertical-timeline-block:nth-child(2n) .vertical-timeline-content:before,
.dark-timeline.center-orientation .vertical-timeline-block:nth-child(2n) .vertical-timeline-content:before {
- border-color: transparent #f5f5f5 transparent transparent;
+ border-color: transparent #f5f5f5 transparent transparent;
}
+
.dark-timeline .vertical-timeline-content,
.dark-timeline.center-orientation .vertical-timeline-content {
- background: #f5f5f5;
+ background: #f5f5f5;
}
+
@media only screen and (min-width: 1170px) {
- #vertical-timeline.center-orientation {
- margin-top: 3em;
- margin-bottom: 3em;
- }
- #vertical-timeline.center-orientation:before {
- left: 50%;
- margin-left: -2px;
- }
+ #vertical-timeline.center-orientation {
+ margin-top: 3em;
+ margin-bottom: 3em;
+ }
+
+ #vertical-timeline.center-orientation:before {
+ left: 50%;
+ margin-left: -2px;
+ }
}
+
@media only screen and (max-width: 1170px) {
- .center-orientation.dark-timeline .vertical-timeline-content:before {
- border-color: transparent #f5f5f5 transparent transparent;
- }
+ .center-orientation.dark-timeline .vertical-timeline-content:before {
+ border-color: transparent #f5f5f5 transparent transparent;
+ }
}
+
.vertical-timeline-block {
- position: relative;
- margin: 2em 0;
+ position: relative;
+ margin: 2em 0;
}
+
.vertical-timeline-block:after {
- content: "";
- display: table;
- clear: both;
+ content: "";
+ display: table;
+ clear: both;
}
+
.vertical-timeline-block:first-child {
- margin-top: 0;
-}
-.vertical-timeline-block:last-child {
- margin-bottom: 0;
-}
-@media only screen and (min-width: 1170px) {
- .center-orientation .vertical-timeline-block {
- margin: 4em 0;
- }
- .center-orientation .vertical-timeline-block:first-child {
margin-top: 0;
- }
- .center-orientation .vertical-timeline-block:last-child {
+}
+
+.vertical-timeline-block:last-child {
margin-bottom: 0;
- }
}
+
+@media only screen and (min-width: 1170px) {
+ .center-orientation .vertical-timeline-block {
+ margin: 4em 0;
+ }
+
+ .center-orientation .vertical-timeline-block:first-child {
+ margin-top: 0;
+ }
+
+ .center-orientation .vertical-timeline-block:last-child {
+ margin-bottom: 0;
+ }
+}
+
.vertical-timeline-icon {
- position: absolute;
- top: 0;
- left: 0;
- width: 40px;
- height: 40px;
- border-radius: 50%;
- font-size: 16px;
- border: 3px solid #f1f1f1;
- text-align: center;
-}
-.vertical-timeline-icon i {
- display: block;
- width: 24px;
- height: 24px;
- position: relative;
- left: 50%;
- top: 50%;
- margin-left: -12px;
- margin-top: -9px;
-}
-@media only screen and (min-width: 1170px) {
- .center-orientation .vertical-timeline-icon {
- width: 50px;
- height: 50px;
- left: 50%;
- margin-left: -25px;
- -webkit-transform: translateZ(0);
- -webkit-backface-visibility: hidden;
- font-size: 19px;
- }
- .center-orientation .vertical-timeline-icon i {
- margin-left: -12px;
- margin-top: -10px;
- }
- .center-orientation .cssanimations .vertical-timeline-icon.is-hidden {
- visibility: hidden;
- }
-}
-.vertical-timeline-content {
- position: relative;
- margin-left: 60px;
- background: white;
- border-radius: 0.25em;
- padding: 1em;
-}
-.vertical-timeline-content:after {
- content: "";
- display: table;
- clear: both;
-}
-.vertical-timeline-content h2 {
- font-weight: 400;
- margin-top: 4px;
-}
-.vertical-timeline-content p {
- margin: 1em 0;
- line-height: 1.6;
-}
-.vertical-timeline-content .vertical-date {
- float: left;
- font-weight: 500;
-}
-.vertical-date small {
- color: var(--primary-color);
- font-weight: 400;
-}
-.vertical-timeline-content::before {
- content: '';
- position: absolute;
- top: 16px;
- right: 100%;
- height: 0;
- width: 0;
- border: 7px solid transparent;
- border-right: 7px solid white;
-}
-@media only screen and (min-width: 768px) {
- .vertical-timeline-content h2 {
- font-size: 18px;
- }
- .vertical-timeline-content p {
- font-size: 13px;
- }
-}
-@media only screen and (min-width: 1170px) {
- .center-orientation .vertical-timeline-content {
- margin-left: 0;
- padding: 1.6em;
- width: 45%;
- }
- .center-orientation .vertical-timeline-content::before {
- top: 24px;
- left: 100%;
- border-color: transparent;
- border-left-color: white;
- }
- .center-orientation .vertical-timeline-content .btn {
- float: left;
- }
- .center-orientation .vertical-timeline-content .vertical-date {
position: absolute;
- width: 100%;
- left: 122%;
- top: 2px;
- font-size: 14px;
- }
- .center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content {
- float: right;
- }
- .center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content::before {
- top: 24px;
- left: auto;
- right: 100%;
- border-color: transparent;
- border-right-color: white;
- }
- .center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content .btn {
- float: right;
- }
- .center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content .vertical-date {
- left: auto;
- right: 122%;
- text-align: right;
- }
- .center-orientation .cssanimations .vertical-timeline-content.is-hidden {
- visibility: hidden;
- }
+ top: 0;
+ left: 0;
+ width: 40px;
+ height: 40px;
+ border-radius: 50%;
+ font-size: 16px;
+ border: 3px solid #f1f1f1;
+ text-align: center;
}
+
+.vertical-timeline-icon i {
+ display: block;
+ width: 24px;
+ height: 24px;
+ position: relative;
+ left: 50%;
+ top: 50%;
+ margin-left: -12px;
+ margin-top: -9px;
+}
+
+@media only screen and (min-width: 1170px) {
+ .center-orientation .vertical-timeline-icon {
+ width: 50px;
+ height: 50px;
+ left: 50%;
+ margin-left: -25px;
+ -webkit-transform: translateZ(0);
+ -webkit-backface-visibility: hidden;
+ font-size: 19px;
+ }
+
+ .center-orientation .vertical-timeline-icon i {
+ margin-left: -12px;
+ margin-top: -10px;
+ }
+
+ .center-orientation .cssanimations .vertical-timeline-icon.is-hidden {
+ visibility: hidden;
+ }
+}
+
+.vertical-timeline-content {
+ position: relative;
+ margin-left: 60px;
+ background: white;
+ border-radius: 0.25em;
+ padding: 1em;
+}
+
+.vertical-timeline-content:after {
+ content: "";
+ display: table;
+ clear: both;
+}
+
+.vertical-timeline-content h2 {
+ font-weight: 400;
+ margin-top: 4px;
+}
+
+.vertical-timeline-content p {
+ margin: 1em 0;
+ line-height: 1.6;
+}
+
+.vertical-timeline-content .vertical-date {
+ float: left;
+ font-weight: 500;
+}
+
+.vertical-date small {
+ color: var(--primary-color);
+ font-weight: 400;
+}
+
+.vertical-timeline-content::before {
+ content: '';
+ position: absolute;
+ top: 16px;
+ right: 100%;
+ height: 0;
+ width: 0;
+ border: 7px solid transparent;
+ border-right: 7px solid white;
+}
+
+@media only screen and (min-width: 768px) {
+ .vertical-timeline-content h2 {
+ font-size: 18px;
+ }
+
+ .vertical-timeline-content p {
+ font-size: 13px;
+ }
+}
+
+@media only screen and (min-width: 1170px) {
+ .center-orientation .vertical-timeline-content {
+ margin-left: 0;
+ padding: 1.6em;
+ width: 45%;
+ }
+
+ .center-orientation .vertical-timeline-content::before {
+ top: 24px;
+ left: 100%;
+ border-color: transparent;
+ border-left-color: white;
+ }
+
+ .center-orientation .vertical-timeline-content .btn {
+ float: left;
+ }
+
+ .center-orientation .vertical-timeline-content .vertical-date {
+ position: absolute;
+ width: 100%;
+ left: 122%;
+ top: 2px;
+ font-size: 14px;
+ }
+
+ .center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content {
+ float: right;
+ }
+
+ .center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content::before {
+ top: 24px;
+ left: auto;
+ right: 100%;
+ border-color: transparent;
+ border-right-color: white;
+ }
+
+ .center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content .btn {
+ float: right;
+ }
+
+ .center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content .vertical-date {
+ left: auto;
+ right: 122%;
+ text-align: right;
+ }
+
+ .center-orientation .cssanimations .vertical-timeline-content.is-hidden {
+ visibility: hidden;
+ }
+}
+
/* Tabs */
.tabs-container .panel-body {
- background: #fff;
- border: 1px solid #e7eaec;
- border-radius: 2px;
- padding: 20px;
- position: relative;
+ background: #fff;
+ border: 1px solid #e7eaec;
+ border-radius: 2px;
+ padding: 20px;
+ position: relative;
}
+
.tabs-container .nav-tabs > li.active > a,
.tabs-container .nav-tabs > li.active > a:hover,
.tabs-container .nav-tabs > li.active > a:focus {
- border: 1px solid #e7eaec;
- border-bottom-color: transparent;
- background-color: #fff;
+ border: 1px solid #e7eaec;
+ border-bottom-color: transparent;
+ background-color: #fff;
}
+
.tabs-container .nav-tabs > li {
- float: left;
- margin-bottom: -1px;
+ float: left;
+ margin-bottom: -1px;
}
+
.tabs-container .tab-pane .panel-body {
- border-top: none;
+ border-top: none;
}
+
.tabs-container .nav-tabs > li.active > a,
.tabs-container .nav-tabs > li.active > a:hover,
.tabs-container .nav-tabs > li.active > a:focus {
- border: 1px solid #e7eaec;
- border-bottom-color: transparent;
+ border: 1px solid #e7eaec;
+ border-bottom-color: transparent;
}
+
.tabs-container .nav-tabs {
- border-bottom: 1px solid #e7eaec;
+ border-bottom: 1px solid #e7eaec;
}
+
.tabs-container .tab-pane .panel-body {
- border-top: none;
+ border-top: none;
}
+
.tabs-container .tabs-left .tab-pane .panel-body,
.tabs-container .tabs-right .tab-pane .panel-body {
- border-top: 1px solid #e7eaec;
+ border-top: 1px solid #e7eaec;
}
+
.tabs-container .nav-tabs > li a:hover {
- background: transparent;
- border-color: transparent;
+ background: transparent;
+ border-color: transparent;
}
+
.tabs-container .tabs-below > .nav-tabs,
.tabs-container .tabs-right > .nav-tabs,
.tabs-container .tabs-left > .nav-tabs {
- border-bottom: 0;
+ border-bottom: 0;
}
+
.tabs-container .tabs-left .panel-body {
- position: static;
+ position: static;
}
+
.tabs-container .tabs-left > .nav-tabs,
.tabs-container .tabs-right > .nav-tabs {
- width: 20%;
+ width: 20%;
}
+
.tabs-container .tabs-left .panel-body {
- width: 80%;
- margin-left: 20%;
+ width: 80%;
+ margin-left: 20%;
}
+
.tabs-container .tabs-right .panel-body {
- width: 80%;
- margin-right: 20%;
+ width: 80%;
+ margin-right: 20%;
}
+
.tabs-container .tab-content > .tab-pane,
.tabs-container .pill-content > .pill-pane {
- display: none;
+ display: none;
}
+
.tabs-container .tab-content > .active,
.tabs-container .pill-content > .active {
- display: block;
+ display: block;
}
+
.tabs-container .tabs-below > .nav-tabs {
- border-top: 1px solid #e7eaec;
+ border-top: 1px solid #e7eaec;
}
+
.tabs-container .tabs-below > .nav-tabs > li {
- margin-top: -1px;
- margin-bottom: 0;
+ margin-top: -1px;
+ margin-bottom: 0;
}
+
.tabs-container .tabs-below > .nav-tabs > li > a {
- -webkit-border-radius: 0 0 4px 4px;
- -moz-border-radius: 0 0 4px 4px;
- border-radius: 0 0 4px 4px;
+ -webkit-border-radius: 0 0 4px 4px;
+ -moz-border-radius: 0 0 4px 4px;
+ border-radius: 0 0 4px 4px;
}
+
.tabs-container .tabs-below > .nav-tabs > li > a:hover,
.tabs-container .tabs-below > .nav-tabs > li > a:focus {
- border-top-color: #e7eaec;
- border-bottom-color: transparent;
+ border-top-color: #e7eaec;
+ border-bottom-color: transparent;
}
+
.tabs-container .tabs-left > .nav-tabs > li,
.tabs-container .tabs-right > .nav-tabs > li {
- float: none;
+ float: none;
}
+
.tabs-container .tabs-left > .nav-tabs > li > a,
.tabs-container .tabs-right > .nav-tabs > li > a {
- min-width: 74px;
- margin-right: 0;
- margin-bottom: 3px;
+ min-width: 74px;
+ margin-right: 0;
+ margin-bottom: 3px;
}
+
.tabs-container .tabs-left > .nav-tabs {
- float: left;
- margin-right: 19px;
+ float: left;
+ margin-right: 19px;
}
+
.tabs-container .tabs-left > .nav-tabs > li > a {
- margin-right: -1px;
- -webkit-border-radius: 4px 0 0 4px;
- -moz-border-radius: 4px 0 0 4px;
- border-radius: 4px 0 0 4px;
+ margin-right: -1px;
+ -webkit-border-radius: 4px 0 0 4px;
+ -moz-border-radius: 4px 0 0 4px;
+ border-radius: 4px 0 0 4px;
}
+
.tabs-container .tabs-left > .nav-tabs .active > a,
.tabs-container .tabs-left > .nav-tabs .active > a:hover,
.tabs-container .tabs-left > .nav-tabs .active > a:focus {
- border-color: #e7eaec transparent #e7eaec #e7eaec;
- *border-right-color: #ffffff;
+ border-color: #e7eaec transparent #e7eaec #e7eaec;
+ *border-right-color: #ffffff;
}
+
.tabs-container .tabs-right > .nav-tabs {
- float: right;
- margin-left: 19px;
+ float: right;
+ margin-left: 19px;
}
+
.tabs-container .tabs-right > .nav-tabs > li > a {
- margin-left: -1px;
- -webkit-border-radius: 0 4px 4px 0;
- -moz-border-radius: 0 4px 4px 0;
- border-radius: 0 4px 4px 0;
+ margin-left: -1px;
+ -webkit-border-radius: 0 4px 4px 0;
+ -moz-border-radius: 0 4px 4px 0;
+ border-radius: 0 4px 4px 0;
}
+
.tabs-container .tabs-right > .nav-tabs .active > a,
.tabs-container .tabs-right > .nav-tabs .active > a:hover,
.tabs-container .tabs-right > .nav-tabs .active > a:focus {
- border-color: #e7eaec #e7eaec #e7eaec transparent;
- *border-left-color: #ffffff;
- z-index: 1;
+ border-color: #e7eaec #e7eaec #e7eaec transparent;
+ *border-left-color: #ffffff;
+ z-index: 1;
}
+
@media (max-width: 767px) {
- .tabs-container .nav-tabs > li {
- float: none !important;
- }
- .tabs-container .nav-tabs > li.active > a {
- border-bottom: 1px solid #e7eaec !important;
- margin: 0;
- }
+ .tabs-container .nav-tabs > li {
+ float: none !important;
+ }
+
+ .tabs-container .nav-tabs > li.active > a {
+ border-bottom: 1px solid #e7eaec !important;
+ margin: 0;
+ }
}
+
/* jsvectormap */
.jvectormap-container {
- width: 100%;
- height: 100%;
- position: relative;
- overflow: hidden;
+ width: 100%;
+ height: 100%;
+ position: relative;
+ overflow: hidden;
}
+
.jvectormap-tip {
- position: absolute;
- display: none;
- border: solid 1px #CDCDCD;
- border-radius: 3px;
- background: #292929;
- color: white;
- font-family: sans-serif, Verdana;
- font-size: smaller;
- padding: 5px;
+ position: absolute;
+ display: none;
+ border: solid 1px #CDCDCD;
+ border-radius: 3px;
+ background: #292929;
+ color: white;
+ font-family: sans-serif, Verdana;
+ font-size: smaller;
+ padding: 5px;
}
+
.jvectormap-zoomin,
.jvectormap-zoomout,
.jvectormap-goback {
- position: absolute;
- left: 10px;
- border-radius: 3px;
- background: var(--primary-color);
- padding: 3px;
- color: white;
- cursor: pointer;
- line-height: 10px;
- text-align: center;
- box-sizing: content-box;
+ position: absolute;
+ left: 10px;
+ border-radius: 3px;
+ background: var(--primary-color);
+ padding: 3px;
+ color: white;
+ cursor: pointer;
+ line-height: 10px;
+ text-align: center;
+ box-sizing: content-box;
}
+
.jvectormap-zoomin,
.jvectormap-zoomout {
- width: 10px;
- height: 10px;
+ width: 10px;
+ height: 10px;
}
+
.jvectormap-zoomin {
- top: 10px;
+ top: 10px;
}
+
.jvectormap-zoomout {
- top: 30px;
+ top: 30px;
}
+
.jvectormap-goback {
- bottom: 10px;
- z-index: 1000;
- padding: 6px;
+ bottom: 10px;
+ z-index: 1000;
+ padding: 6px;
}
+
.jvectormap-spinner {
- position: absolute;
- left: 0;
- top: 0;
- right: 0;
- bottom: 0;
- background: center no-repeat url(data:image/gif;base64,R0lGODlhIAAgAPMAAP///wAAAMbGxoSEhLa2tpqamjY2NlZWVtjY2OTk5Ly8vB4eHgQEBAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ/V/nmOM82XiHRLYKhKP1oZmADdEAAAh+QQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY/CZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB+A4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6+Ho7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq+B6QDtuetcaBPnW6+O7wDHpIiK9SaVK5GgV543tzjgGcghAgAh+QQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK++G+w48edZPK+M6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE+G+cD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm+FNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk+aV+oJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0/VNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc+XiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq+E71SRQeyqUToLA7VxF0JDyIQh/MVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30/iI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE/jiuL04RGEBgwWhShRgQExHBAAh+QQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR+ipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq+E71SRQeyqUToLA7VxF0JDyIQh/MVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq+E71SRQeyqUToLA7VxF0JDyIQh/MVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY+Yip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd+MFCN6HAAIKgNggY0KtEBAAh+QQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1+vsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d+jYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg+ygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0+bm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h+Kr0SJ8MFihpNbx+4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX+BP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA==);
+ position: absolute;
+ left: 0;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ background: center no-repeat url(data:image/gif;base64,R0lGODlhIAAgAPMAAP///wAAAMbGxoSEhLa2tpqamjY2NlZWVtjY2OTk5Ly8vB4eHgQEBAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ/V/nmOM82XiHRLYKhKP1oZmADdEAAAh+QQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY/CZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB+A4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6+Ho7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq+B6QDtuetcaBPnW6+O7wDHpIiK9SaVK5GgV543tzjgGcghAgAh+QQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK++G+w48edZPK+M6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE+G+cD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm+FNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk+aV+oJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0/VNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc+XiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq+E71SRQeyqUToLA7VxF0JDyIQh/MVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30/iI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE/jiuL04RGEBgwWhShRgQExHBAAh+QQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR+ipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq+E71SRQeyqUToLA7VxF0JDyIQh/MVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq+E71SRQeyqUToLA7VxF0JDyIQh/MVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY+Yip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd+MFCN6HAAIKgNggY0KtEBAAh+QQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1+vsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d+jYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg+ygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0+bm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h+Kr0SJ8MFihpNbx+4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX+BP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA==);
}
+
.jvectormap-legend-title {
- font-weight: bold;
- font-size: 14px;
- text-align: center;
+ font-weight: bold;
+ font-size: 14px;
+ text-align: center;
}
+
.jvectormap-legend-cnt {
- position: absolute;
+ position: absolute;
}
+
.jvectormap-legend-cnt-h {
- bottom: 0;
- right: 0;
+ bottom: 0;
+ right: 0;
}
+
.jvectormap-legend-cnt-v {
- top: 0;
- right: 0;
+ top: 0;
+ right: 0;
}
+
.jvectormap-legend {
- background: black;
- color: white;
- border-radius: 3px;
+ background: black;
+ color: white;
+ border-radius: 3px;
}
+
.jvectormap-legend-cnt-h .jvectormap-legend {
- float: left;
- margin: 0 10px 10px 0;
- padding: 3px 3px 1px 3px;
+ float: left;
+ margin: 0 10px 10px 0;
+ padding: 3px 3px 1px 3px;
}
+
.jvectormap-legend-cnt-h .jvectormap-legend .jvectormap-legend-tick {
- float: left;
+ float: left;
}
+
.jvectormap-legend-cnt-v .jvectormap-legend {
- margin: 10px 10px 0 0;
- padding: 3px;
+ margin: 10px 10px 0 0;
+ padding: 3px;
}
+
.jvectormap-legend-cnt-h .jvectormap-legend-tick {
- width: 40px;
+ width: 40px;
}
+
.jvectormap-legend-cnt-h .jvectormap-legend-tick-sample {
- height: 15px;
+ height: 15px;
}
+
.jvectormap-legend-cnt-v .jvectormap-legend-tick-sample {
- height: 20px;
- width: 20px;
- display: inline-block;
- vertical-align: middle;
+ height: 20px;
+ width: 20px;
+ display: inline-block;
+ vertical-align: middle;
}
+
.jvectormap-legend-tick-text {
- font-size: 12px;
+ font-size: 12px;
}
+
.jvectormap-legend-cnt-h .jvectormap-legend-tick-text {
- text-align: center;
+ text-align: center;
}
+
.jvectormap-legend-cnt-v .jvectormap-legend-tick-text {
- display: inline-block;
- vertical-align: middle;
- line-height: 20px;
- padding-left: 3px;
+ display: inline-block;
+ vertical-align: middle;
+ line-height: 20px;
+ padding-left: 3px;
}
+
/*Slick Carousel */
.slick-prev:before,
.slick-next:before {
- color: var(--primary-color) !important;
+ color: var(--primary-color) !important;
}
+
/* Payments */
.payment-card {
- background: #ffffff;
- padding: 20px;
- margin-bottom: 25px;
- border: 1px solid #e7eaec;
+ background: #ffffff;
+ padding: 20px;
+ margin-bottom: 25px;
+ border: 1px solid #e7eaec;
}
+
.payment-icon-big {
- font-size: 60px;
- color: #d1dade;
+ font-size: 60px;
+ color: #d1dade;
}
+
.payments-method.panel-group .panel + .panel {
- margin-top: -1px;
+ margin-top: -1px;
}
+
.payments-method .panel-heading {
- padding: 15px;
+ padding: 15px;
}
+
.payments-method .panel {
- border-radius: 0;
+ border-radius: 0;
}
+
.payments-method .panel-heading h5 {
- margin-bottom: 5px;
+ margin-bottom: 5px;
}
+
.payments-method .panel-heading i {
- font-size: 26px;
+ font-size: 26px;
}
+
/* Select2 custom styles */
.select2-container--default .select2-selection--single,
.select2-container--default .select2-selection--multiple {
- border-color: #e7eaec;
+ border-color: #e7eaec;
}
+
/* Tour */
.tour-tour .btn.btn-default {
- background-color: #ffffff;
- border: 1px solid #d2d2d2;
- color: inherit;
+ background-color: #ffffff;
+ border: 1px solid #d2d2d2;
+ color: inherit;
}
+
.tour-step-backdrop {
- z-index: 2101;
+ z-index: 2101;
}
+
.tour-backdrop {
- z-index: 2100;
- opacity: .7;
+ z-index: 2100;
+ opacity: .7;
}
+
.popover[class*=tour-] {
- z-index: 2100;
+ z-index: 2100;
}
+
body.tour-open .animated {
- animation-fill-mode: initial;
+ animation-fill-mode: initial;
}
+
/* Resizable */
.resizable-panels .ibox {
- clear: none;
- margin: 10px;
- float: left;
- overflow: hidden;
- min-height: 150px;
- min-width: 150px;
+ clear: none;
+ margin: 10px;
+ float: left;
+ overflow: hidden;
+ min-height: 150px;
+ min-width: 150px;
}
+
.resizable-panels .ibox .ibox-content {
- height: calc(100% - 49px);
+ height: calc(100% - 49px);
}
+
.ui-resizable-helper {
- background: rgba(211, 211, 211, 0.4);
+ background: rgba(211, 211, 211, 0.4);
}
+
/* Wizard step fix */
.wizard > .content > .body {
- position: relative;
+ position: relative;
}
+
.sidebard-panel {
- width: 220px;
- background: #ebebed;
- padding: 10px 20px;
- position: absolute;
- right: 0;
+ width: 220px;
+ background: #ebebed;
+ padding: 10px 20px;
+ position: absolute;
+ right: 0;
}
+
.sidebard-panel .feed-element img.img-circle {
- width: 32px;
- height: 32px;
+ width: 32px;
+ height: 32px;
}
+
.sidebard-panel .feed-element,
.media-body,
.sidebard-panel p {
- font-size: 12px;
+ font-size: 12px;
}
+
.sidebard-panel .feed-element {
- margin-top: 20px;
- padding-bottom: 0;
+ margin-top: 20px;
+ padding-bottom: 0;
}
+
.sidebard-panel .list-group {
- margin-bottom: 10px;
+ margin-bottom: 10px;
}
+
.sidebard-panel .list-group .list-group-item {
- padding: 5px 0;
- font-size: 12px;
- border: 0;
+ padding: 5px 0;
+ font-size: 12px;
+ border: 0;
}
+
.sidebar-content .wrapper,
.wrapper.sidebar-content {
- padding-right: 230px !important;
+ padding-right: 230px !important;
}
+
.body-small .sidebar-content .wrapper,
.body-small .wrapper.sidebar-content {
- padding-right: 20px !important;
+ padding-right: 20px !important;
}
+
#right-sidebar {
- background-color: #fff;
- border-left: 1px solid #e7eaec;
- border-top: 1px solid #e7eaec;
- overflow: hidden;
- position: fixed;
- top: 60px;
- width: 260px !important;
- z-index: 1009;
- bottom: 0;
- right: -260px;
+ background-color: #fff;
+ border-left: 1px solid #e7eaec;
+ border-top: 1px solid #e7eaec;
+ overflow: hidden;
+ position: fixed;
+ top: 60px;
+ width: 260px !important;
+ z-index: 1009;
+ bottom: 0;
+ right: -260px;
}
+
#right-sidebar.sidebar-open {
- right: 0;
+ right: 0;
}
+
#right-sidebar.sidebar-open.sidebar-top {
- top: 0;
- border-top: none;
+ top: 0;
+ border-top: none;
}
+
.sidebar-container ul.nav-tabs {
- border: none;
+ border: none;
}
+
.sidebar-container ul.nav-tabs.navs-4 li {
- width: 25%;
+ width: 25%;
}
+
.sidebar-container ul.nav-tabs.navs-3 li {
- width: 33.3333%;
+ width: 33.3333%;
}
+
.sidebar-container ul.nav-tabs.navs-2 li {
- width: 50%;
+ width: 50%;
}
+
.sidebar-container ul.nav-tabs li {
- border: none;
+ border: none;
}
+
.sidebar-container ul.nav-tabs li a {
- border: none;
- padding: 12px 10px;
- margin: 0;
- border-radius: 0;
- background: #2f4050;
- color: #fff;
- text-align: center;
- border-right: 1px solid #334556;
+ border: none;
+ padding: 12px 10px;
+ margin: 0;
+ border-radius: 0;
+ background: #2f4050;
+ color: #fff;
+ text-align: center;
+ border-right: 1px solid #334556;
}
+
.sidebar-container ul.nav-tabs li.active a {
- border: none;
- background: #f9f9f9;
- color: #676a6c;
- font-weight: bold;
+ border: none;
+ background: #f9f9f9;
+ color: #676a6c;
+ font-weight: bold;
}
+
.sidebar-container .nav-tabs > li.active > a:hover,
.sidebar-container .nav-tabs > li.active > a:focus {
- border: none;
+ border: none;
}
+
.sidebar-container ul.sidebar-list {
- margin: 0;
- padding: 0;
+ margin: 0;
+ padding: 0;
}
+
.sidebar-container ul.sidebar-list li {
- border-bottom: 1px solid #e7eaec;
- padding: 15px 20px;
- list-style: none;
- font-size: 12px;
+ border-bottom: 1px solid #e7eaec;
+ padding: 15px 20px;
+ list-style: none;
+ font-size: 12px;
}
+
.sidebar-container .sidebar-message:nth-child(2n+2) {
- background: #f9f9f9;
+ background: #f9f9f9;
}
+
.sidebar-container ul.sidebar-list li a {
- text-decoration: none;
- color: inherit;
+ text-decoration: none;
+ color: inherit;
}
+
.sidebar-container .sidebar-content {
- padding: 15px 20px;
- font-size: 12px;
+ padding: 15px 20px;
+ font-size: 12px;
}
+
.sidebar-container .sidebar-title {
- background: #f9f9f9;
- padding: 20px;
- border-bottom: 1px solid #e7eaec;
+ background: #f9f9f9;
+ padding: 20px;
+ border-bottom: 1px solid #e7eaec;
}
+
.sidebar-container .sidebar-title h3 {
- margin-bottom: 3px;
- padding-left: 2px;
+ margin-bottom: 3px;
+ padding-left: 2px;
}
+
.sidebar-container .tab-content h4 {
- margin-bottom: 5px;
+ margin-bottom: 5px;
}
+
.sidebar-container .sidebar-message > a > .pull-left {
- margin-right: 10px;
+ margin-right: 10px;
}
+
.sidebar-container .sidebar-message > a {
- text-decoration: none;
- color: inherit;
+ text-decoration: none;
+ color: inherit;
}
+
.sidebar-container .sidebar-message {
- padding: 15px 20px;
+ padding: 15px 20px;
}
+
.sidebar-container .sidebar-message .message-avatar {
- height: 38px;
- width: 38px;
- border-radius: 50%;
+ height: 38px;
+ width: 38px;
+ border-radius: 50%;
}
+
.sidebar-container .setings-item {
- padding: 15px 20px;
- border-bottom: 1px solid #e7eaec;
+ padding: 15px 20px;
+ border-bottom: 1px solid #e7eaec;
}
+
body {
- font-family: "open sans", "Helvetica Neue", "微软雅黑", Helvetica, Arial, sans-serif;
- background-color: #2f4050;
- font-size: 13px;
- color: #676a6c;
- overflow-x: hidden;
+ font-family: "open sans", "Helvetica Neue", "微软雅黑", Helvetica, Arial, sans-serif;
+ background-color: #2f4050;
+ font-size: 13px;
+ color: #676a6c;
+ overflow-x: hidden;
}
+
html,
body {
- height: 100%;
+ height: 100%;
}
+
body.full-height-layout #wrapper,
body.full-height-layout #page-wrapper {
- height: 100%;
+ height: 100%;
}
+
#page-wrapper {
- min-height: auto;
+ min-height: auto;
}
+
body.boxed-layout {
- background: url('patterns/shattered.png');
+ background: url('patterns/shattered.png');
}
+
body.boxed-layout #wrapper {
- background-color: #2f4050;
- max-width: 1200px;
- margin: 0 auto;
- -webkit-box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.75);
- -moz-box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.75);
- box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.75);
+ background-color: #2f4050;
+ max-width: 1200px;
+ margin: 0 auto;
+ -webkit-box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.75);
+ -moz-box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.75);
+ box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.75);
}
+
.top-navigation.boxed-layout #wrapper,
.boxed-layout #wrapper.top-navigation {
- max-width: 1300px !important;
+ max-width: 1300px !important;
}
+
.block {
- display: block;
+ display: block;
}
+
.clear {
- display: block;
- overflow: hidden;
+ display: block;
+ overflow: hidden;
}
+
a {
- cursor: pointer;
+ cursor: pointer;
}
+
a:hover,
a:focus {
- text-decoration: none;
+ text-decoration: none;
}
+
.border-bottom {
- border-bottom: 1px solid #e7eaec !important;
+ border-bottom: 1px solid #e7eaec !important;
}
+
.font-bold {
- font-weight: 600;
+ font-weight: 600;
}
+
.font-noraml {
- font-weight: 400;
+ font-weight: 400;
}
+
.text-uppercase {
- text-transform: uppercase;
+ text-transform: uppercase;
}
+
.b-r {
- border-right: 1px solid #e7eaec;
+ border-right: 1px solid #e7eaec;
}
+
.hr-line-dashed {
- border-top: 1px dashed #e7eaec;
- color: #ffffff;
- background-color: #ffffff;
- height: 1px;
- margin: 20px 0;
+ border-top: 1px dashed #e7eaec;
+ color: #ffffff;
+ background-color: #ffffff;
+ height: 1px;
+ margin: 20px 0;
}
+
.hr-line-solid {
- border-bottom: 1px solid #e7eaec;
- background-color: rgba(0, 0, 0, 0);
- border-style: solid !important;
- margin-top: 15px;
- margin-bottom: 15px;
+ border-bottom: 1px solid #e7eaec;
+ background-color: rgba(0, 0, 0, 0);
+ border-style: solid !important;
+ margin-top: 15px;
+ margin-bottom: 15px;
}
+
video {
- width: 100% !important;
- height: auto !important;
+ width: 100% !important;
+ height: auto !important;
}
+
/* GALLERY */
.gallery > .row > div {
- margin-bottom: 15px;
+ margin-bottom: 15px;
}
+
.fancybox img {
- margin-bottom: 5px;
- /* Only for demo */
- width: 24%;
+ margin-bottom: 5px;
+ /* Only for demo */
+ width: 24%;
}
+
/* Summernote text editor */
.note-editor {
- height: auto !important;
- min-height: 300px;
+ height: auto !important;
+ min-height: 300px;
}
+
.note-editor.fullscreen {
- z-index: 2050;
+ z-index: 2050;
}
+
/* MODAL */
.modal-content {
- background-clip: padding-box;
- background-color: #FFFFFF;
- border: 1px solid rgba(0, 0, 0, 0);
- border-radius: 4px;
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
- outline: 0 none;
- position: relative;
+ background-clip: padding-box;
+ background-color: #FFFFFF;
+ border: 1px solid rgba(0, 0, 0, 0);
+ border-radius: 4px;
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
+ outline: 0 none;
+ position: relative;
}
+
.modal-dialog {
- z-index: 2200;
+ z-index: 2200;
}
+
.modal-body {
- padding: 20px 30px 30px 30px;
+ padding: 20px 30px 30px 30px;
}
+
.inmodal .modal-body {
- background: #f8fafb;
+ background: #f8fafb;
}
+
.inmodal .modal-header {
- padding: 30px 15px;
- text-align: center;
+ padding: 30px 15px;
+ text-align: center;
}
+
.animated.modal.fade .modal-dialog {
- -webkit-transform: none;
- -ms-transform: none;
- -o-transform: none;
- transform: none;
+ -webkit-transform: none;
+ -ms-transform: none;
+ -o-transform: none;
+ transform: none;
}
+
.inmodal .modal-title {
- font-size: 26px;
+ font-size: 26px;
}
+
.inmodal .modal-icon {
- font-size: 84px;
- color: #e2e3e3;
+ font-size: 84px;
+ color: #e2e3e3;
}
+
.modal-footer {
- margin-top: 0;
+ margin-top: 0;
}
+
/* WRAPPERS */
#wrapper {
- width: 100%;
- overflow-x: hidden;
+ width: 100%;
+ overflow-x: hidden;
}
+
.wrapper {
- padding: 0 10px;
+ padding: 0 10px;
}
+
.wrapper-content {
- padding: 10px 10px 10px;
+ padding: 10px 10px 10px;
}
+
#page-wrapper {
- padding: 0 10px;
- min-height: 568px;
- position: relative !important;
+ padding: 0 10px;
+ min-height: 568px;
+ position: relative !important;
}
+
@media (min-width: 768px) {
- #page-wrapper {
- position: inherit;
- margin: 0 0 0 240px;
- min-height: 2002px;
- }
+ #page-wrapper {
+ position: inherit;
+ margin: 0 0 0 240px;
+ min-height: 2002px;
+ }
}
+
.title-action {
- text-align: right;
- padding-top: 30px;
+ text-align: right;
+ padding-top: 30px;
}
+
.ibox-content h1,
.ibox-content h2,
.ibox-content h3,
@@ -3478,525 +4172,639 @@ video {
.ibox-title h3,
.ibox-title h4,
.ibox-title h5 {
- margin-top: 5px;
+ margin-top: 5px;
}
+
ul.unstyled,
ol.unstyled {
- list-style: none outside none;
- margin-left: 0;
+ list-style: none outside none;
+ margin-left: 0;
}
+
.big-icon {
- font-size: 160px !important;
- color: #e5e6e7;
+ font-size: 160px !important;
+ color: #e5e6e7;
}
+
/* FOOTER */
.footer {
- background: none repeat scroll 0 0 white;
- border-top: 1px solid #e7eaec;
- bottom: 0;
- left: 0;
- padding: 10px 20px;
- position: absolute;
- right: 0;
+ background: none repeat scroll 0 0 white;
+ border-top: 1px solid #e7eaec;
+ bottom: 0;
+ left: 0;
+ padding: 10px 20px;
+ position: absolute;
+ right: 0;
}
+
.footer.fixed_full {
- position: fixed;
- bottom: 0;
- left: 0;
- right: 0;
- z-index: 1000;
- padding: 10px 20px;
- background: white;
- border-top: 1px solid #e7eaec;
+ position: fixed;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ z-index: 1000;
+ padding: 10px 20px;
+ background: white;
+ border-top: 1px solid #e7eaec;
}
+
.footer.fixed {
- position: fixed;
- bottom: 0;
- left: 0;
- right: 0;
- z-index: 1000;
- padding: 10px 20px;
- background: white;
- border-top: 1px solid #e7eaec;
- margin-left: 220px;
+ position: fixed;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ z-index: 1000;
+ padding: 10px 20px;
+ background: white;
+ border-top: 1px solid #e7eaec;
+ margin-left: 220px;
}
+
body.mini-navbar .footer.fixed,
body.body-small.mini-navbar .footer.fixed {
- margin: 0 0 0 70px;
+ margin: 0 0 0 70px;
}
+
body.mini-navbar.canvas-menu .footer.fixed,
body.canvas-menu .footer.fixed {
- margin: 0 !important;
+ margin: 0 !important;
}
+
body.fixed-sidebar.body-small.mini-navbar .footer.fixed {
- margin: 0 0 0 220px;
+ margin: 0 0 0 220px;
}
+
body.body-small .footer.fixed {
- margin-left: 0;
+ margin-left: 0;
}
+
/* PANELS */
.page-heading {
- border-top: 0;
- padding: 0 10px 20px 10px;
+ border-top: 0;
+ padding: 0 10px 20px 10px;
}
+
.panel-heading h1,
.panel-heading h2 {
- margin-bottom: 5px;
+ margin-bottom: 5px;
}
+
/* TABLES */
.table-bordered {
- border: 1px solid #EBEBEB;
+ border: 1px solid #EBEBEB;
}
+
.table-bordered > thead > tr > th,
.table-bordered > thead > tr > td {
- /*background-color: #F5F5F6;*/
- border-bottom-width: 1px;
+ /*background-color: #F5F5F6;*/
+ border-bottom-width: 1px;
}
+
.table-bordered > thead > tr > th,
.table-bordered > tbody > tr > th,
.table-bordered > tfoot > tr > th,
.table-bordered > thead > tr > td,
.table-bordered > tbody > tr > td,
.table-bordered > tfoot > tr > td {
- border: 1px solid #e7e7e7;
+ border: 1px solid #e7e7e7;
}
+
.table > thead > tr > th {
- border-bottom: 1px solid #DDDDDD;
- vertical-align: bottom;
+ border-bottom: 1px solid #DDDDDD;
+ vertical-align: bottom;
}
+
.table > thead > tr > th,
.table > tbody > tr > th,
.table > tfoot > tr > th,
.table > thead > tr > td,
.table > tbody > tr > td,
.table > tfoot > tr > td {
- border-top: 1px solid #e7eaec;
- line-height: 1.42857;
- padding: 8px;
- vertical-align: top;
+ border-top: 1px solid #e7eaec;
+ line-height: 1.42857;
+ padding: 8px;
+ vertical-align: top;
}
+
/* PANELS */
.panel.blank-panel {
- background: none;
- margin: 0;
+ background: none;
+ margin: 0;
}
+
.blank-panel .panel-heading {
- padding-bottom: 0;
+ padding-bottom: 0;
}
+
.nav-tabs > li.active > a,
.nav-tabs > li.active > a:hover,
.nav-tabs > li.active > a:focus {
- -moz-border-bottom-colors: none;
- -moz-border-left-colors: none;
- -moz-border-right-colors: none;
- -moz-border-top-colors: none;
- background: none;
- border-color: #dddddd #dddddd rgba(0, 0, 0, 0);
- border-bottom: #f3f3f4;
- border-image: none;
- border-style: solid;
- border-width: 1px;
- color: #555555;
- cursor: default;
+ -moz-border-bottom-colors: none;
+ -moz-border-left-colors: none;
+ -moz-border-right-colors: none;
+ -moz-border-top-colors: none;
+ background: none;
+ border-color: #dddddd #dddddd rgba(0, 0, 0, 0);
+ border-bottom: #f3f3f4;
+ border-image: none;
+ border-style: solid;
+ border-width: 1px;
+ color: #555555;
+ cursor: default;
}
+
.nav.nav-tabs li {
- background: none;
- border: none;
+ background: none;
+ border: none;
}
+
.nav-tabs > li > a {
- color: #A7B1C2;
- font-weight: 600;
- padding: 10px 20px 10px 25px;
+ color: #A7B1C2;
+ font-weight: 600;
+ padding: 10px 20px 10px 25px;
}
+
.nav-tabs > li > a:hover,
.nav-tabs > li > a:focus {
- background-color: #e6e6e6;
- color: #676a6c;
+ background-color: #e6e6e6;
+ color: #676a6c;
}
+
.ui-tab .tab-content {
- padding: 20px 0;
+ padding: 20px 0;
}
+
/* GLOBAL */
.no-padding {
- padding: 0 !important;
+ padding: 0 !important;
}
+
.no-borders {
- border: none !important;
+ border: none !important;
}
+
.no-margins {
- margin: 0 !important;
+ margin: 0 !important;
}
+
.no-top-border {
- border-top: 0 !important;
+ border-top: 0 !important;
}
+
.ibox-content.text-box {
- padding-bottom: 0;
- padding-top: 15px;
+ padding-bottom: 0;
+ padding-top: 15px;
}
+
.border-left-right {
- border-left: 1px solid #e7eaec;
- border-right: 1px solid #e7eaec;
- border-top: none;
- border-bottom: none;
+ border-left: 1px solid #e7eaec;
+ border-right: 1px solid #e7eaec;
+ border-top: none;
+ border-bottom: none;
}
+
.border-left {
- border-left: 1px solid #e7eaec;
- border-right: none;
- border-top: none;
- border-bottom: none;
+ border-left: 1px solid #e7eaec;
+ border-right: none;
+ border-top: none;
+ border-bottom: none;
}
+
.border-right {
- border-left: none;
- border-right: 1px solid #e7eaec;
- border-top: none;
- border-bottom: none;
+ border-left: none;
+ border-right: 1px solid #e7eaec;
+ border-top: none;
+ border-bottom: none;
}
+
.full-width {
- width: 100% !important;
+ width: 100% !important;
}
+
.link-block {
- font-size: 12px;
- padding: 10px;
+ font-size: 12px;
+ padding: 10px;
}
+
.nav.navbar-top-links .link-block a {
- font-size: 12px;
+ font-size: 12px;
}
+
.link-block a {
- font-size: 10px;
- color: inherit;
+ font-size: 10px;
+ color: inherit;
}
+
body.mini-navbar .branding {
- display: none;
+ display: none;
}
+
img.circle-border {
- border: 6px solid #FFFFFF;
- border-radius: 50%;
+ border: 6px solid #FFFFFF;
+ border-radius: 50%;
}
+
.branding {
- float: left;
- color: #FFFFFF;
- font-size: 18px;
- font-weight: 600;
- padding: 17px 20px;
- text-align: center;
- background-color: var(--primary-color);
+ float: left;
+ color: #FFFFFF;
+ font-size: 18px;
+ font-weight: 600;
+ padding: 17px 20px;
+ text-align: center;
+ background-color: var(--primary-color);
}
+
.login-panel {
- margin-top: 25%;
+ margin-top: 25%;
}
+
.icons-box h3 {
- margin-top: 10px;
- margin-bottom: 10px;
+ margin-top: 10px;
+ margin-bottom: 10px;
}
+
.icons-box .infont a i {
- font-size: 25px;
- display: block;
- color: #676a6c;
+ font-size: 25px;
+ display: block;
+ color: #676a6c;
}
+
.icons-box .infont a {
- color: #a6a8a9;
+ color: #a6a8a9;
}
+
.icons-box .infont a {
- padding: 10px;
- margin: 1px;
- display: block;
+ padding: 10px;
+ margin: 1px;
+ display: block;
}
+
.ui-draggable .ibox-title {
- cursor: move;
+ cursor: move;
}
+
.breadcrumb {
- background-color: #ffffff;
- padding: 0;
- margin-bottom: 0;
+ background-color: #ffffff;
+ padding: 0;
+ margin-bottom: 0;
}
+
.breadcrumb > li a {
- color: inherit;
+ color: inherit;
}
+
.breadcrumb > .active {
- color: inherit;
+ color: inherit;
}
+
code {
- background-color: #F9F2F4;
- border-radius: 4px;
- color: #ca4440;
- font-size: 90%;
- padding: 2px 4px;
- white-space: nowrap;
+ background-color: #F9F2F4;
+ border-radius: 4px;
+ color: #ca4440;
+ font-size: 90%;
+ padding: 2px 4px;
+ white-space: nowrap;
}
+
.ibox {
- clear: both;
- margin-bottom: 25px;
- margin-top: 0;
- padding: 0;
+ clear: both;
+ margin-bottom: 25px;
+ margin-top: 0;
+ padding: 0;
}
+
.ibox.collapsed .ibox-content {
- display: none;
+ display: none;
}
+
.ibox.collapsed .fa.fa-chevron-up:before {
- content: "\f078";
+ content: "\f078";
}
+
.ibox.collapsed .fa.fa-chevron-down:before {
- content: "\f077";
+ content: "\f077";
}
+
.ibox:after,
.ibox:before {
- display: table;
+ display: table;
}
+
.ibox-title {
- -moz-border-bottom-colors: none;
- -moz-border-left-colors: none;
- -moz-border-right-colors: none;
- -moz-border-top-colors: none;
- background-color: #ffffff;
- border-color: #e7eaec;
- border-image: none;
- border-style: solid solid none;
- border-width: 3px 0 0;
- color: inherit;
- margin-bottom: 0;
- padding: 14px 15px 7px;
- min-height: 48px;
+ -moz-border-bottom-colors: none;
+ -moz-border-left-colors: none;
+ -moz-border-right-colors: none;
+ -moz-border-top-colors: none;
+ background-color: #ffffff;
+ border-color: #e7eaec;
+ border-image: none;
+ border-style: solid solid none;
+ border-width: 3px 0 0;
+ color: inherit;
+ margin-bottom: 0;
+ padding: 14px 15px 7px;
+ min-height: 48px;
}
+
.ibox-content {
- background-color: #ffffff;
- color: inherit;
- padding: 15px 20px 20px 20px;
- border-color: #e7eaec;
- border-image: none;
- border-style: solid solid none;
- border-width: 1px 0;
+ background-color: #ffffff;
+ color: inherit;
+ padding: 15px 20px 20px 20px;
+ border-color: #e7eaec;
+ border-image: none;
+ border-style: solid solid none;
+ border-width: 1px 0;
}
+
.ibox-footer {
- color: inherit;
- border-top: 1px solid #e7eaec;
- font-size: 90%;
- background: #ffffff;
- padding: 10px 15px;
+ color: inherit;
+ border-top: 1px solid #e7eaec;
+ font-size: 90%;
+ background: #ffffff;
+ padding: 10px 15px;
}
+
table.table-mail tr td {
- padding: 12px;
+ padding: 12px;
}
+
.table-mail .check-mail {
- padding-left: 20px;
+ padding-left: 20px;
}
+
.table-mail .mail-date {
- padding-right: 20px;
+ padding-right: 20px;
}
+
.star-mail,
.check-mail {
- width: 40px;
+ width: 40px;
}
+
.unread td a,
.unread td {
- font-weight: 600;
- color: inherit;
+ font-weight: 600;
+ color: inherit;
}
+
.read td a,
.read td {
- font-weight: normal;
- color: inherit;
+ font-weight: normal;
+ color: inherit;
}
+
.unread td {
- background-color: #f9f8f8;
+ background-color: #f9f8f8;
}
+
.ibox-content {
- clear: both;
+ clear: both;
}
+
.ibox-heading {
- background-color: #f3f6fb;
- border-bottom: none;
+ background-color: #f3f6fb;
+ border-bottom: none;
}
+
.ibox-heading h3 {
- font-weight: 200;
- font-size: 24px;
+ font-weight: 200;
+ font-size: 24px;
}
+
.ibox-title h5 {
- display: inline-block;
- font-size: 14px;
- margin: 0 0 7px;
- padding: 0;
- text-overflow: ellipsis;
- float: left;
+ display: inline-block;
+ font-size: 14px;
+ margin: 0 0 7px;
+ padding: 0;
+ text-overflow: ellipsis;
+ float: left;
}
+
.ibox-title .label {
- float: left;
- margin-left: 4px;
+ float: left;
+ margin-left: 4px;
}
+
.ibox-tools {
- display: block;
- float: none;
- margin-top: 0;
- position: relative;
- padding: 0;
- text-align: right;
+ display: block;
+ float: none;
+ margin-top: 0;
+ position: relative;
+ padding: 0;
+ text-align: right;
}
+
.ibox-tools a {
- cursor: pointer;
- margin-left: 5px;
- color: #c4c4c4;
+ cursor: pointer;
+ margin-left: 5px;
+ color: #c4c4c4;
}
+
.ibox-tools a.btn-primary {
- color: #fff;
+ color: #fff;
}
+
.ibox-tools .dropdown-menu > li > a {
- padding: 4px 10px;
- font-size: 12px;
+ padding: 4px 10px;
+ font-size: 12px;
}
+
.ibox .ibox-tools.open > .dropdown-menu {
- left: auto;
- right: 0;
+ left: auto;
+ right: 0;
}
+
/* BACKGROUNDS */
.gray-bg {
- background-color: #f3f3f4;
+ background-color: #f3f3f4;
}
+
.white-bg {
- background-color: #ffffff;
+ background-color: #ffffff;
}
+
.navy-bg {
- background-color: var(--primary-color);
- color: #ffffff;
+ background-color: var(--primary-color);
+ color: #ffffff;
}
+
.blue-bg {
- background-color: #1c84c6;
- color: #ffffff;
+ background-color: #1c84c6;
+ color: #ffffff;
}
+
.lazur-bg {
- background-color: #23c6c8;
- color: #ffffff;
+ background-color: #23c6c8;
+ color: #ffffff;
}
+
.yellow-bg {
- background-color: #f8ac59;
- color: #ffffff;
+ background-color: #f8ac59;
+ color: #ffffff;
}
+
.red-bg {
- background-color: #ed5565;
- color: #ffffff;
+ background-color: #ed5565;
+ color: #ffffff;
}
+
.black-bg {
- background-color: #262626;
+ background-color: #262626;
}
+
.panel-primary {
- border-color: var(--primary-color);
+ border-color: var(--primary-color);
}
+
.panel-primary > .panel-heading {
- background-color: var(--primary-color);
- border-color: var(--primary-color);
+ background-color: var(--primary-color);
+ border-color: var(--primary-color);
}
+
.panel-success {
- border-color: #1c84c6;
+ border-color: #1c84c6;
}
+
.panel-success > .panel-heading {
- background-color: #1c84c6;
- border-color: #1c84c6;
- color: #ffffff;
+ background-color: #1c84c6;
+ border-color: #1c84c6;
+ color: #ffffff;
}
+
.panel-info {
- border-color: #23c6c8;
+ border-color: #23c6c8;
}
+
.panel-info > .panel-heading {
- background-color: #23c6c8;
- border-color: #23c6c8;
- color: #ffffff;
+ background-color: #23c6c8;
+ border-color: #23c6c8;
+ color: #ffffff;
}
+
.panel-warning {
- border-color: #f8ac59;
+ border-color: #f8ac59;
}
+
.panel-warning > .panel-heading {
- background-color: #f8ac59;
- border-color: #f8ac59;
- color: #ffffff;
+ background-color: #f8ac59;
+ border-color: #f8ac59;
+ color: #ffffff;
}
+
.panel-danger {
- border-color: #ed5565;
+ border-color: #ed5565;
}
+
.panel-danger > .panel-heading {
- background-color: #ed5565;
- border-color: #ed5565;
- color: #ffffff;
+ background-color: #ed5565;
+ border-color: #ed5565;
+ color: #ffffff;
}
+
.progress-bar {
- background-color: var(--primary-color);
+ background-color: var(--primary-color);
}
+
.progress-small,
.progress-small .progress-bar {
- height: 10px;
+ height: 10px;
}
+
.progress-small,
.progress-mini {
- margin-top: 5px;
+ margin-top: 5px;
}
+
.progress-mini,
.progress-mini .progress-bar {
- height: 5px;
- margin-bottom: 0;
+ height: 5px;
+ margin-bottom: 0;
}
+
.progress-bar-navy-light {
- background-color: #3dc7ab;
+ background-color: #3dc7ab;
}
+
.progress-bar-success {
- background-color: #1c84c6;
+ background-color: #1c84c6;
}
+
.progress-bar-info {
- background-color: #23c6c8;
+ background-color: #23c6c8;
}
+
.progress-bar-warning {
- background-color: #f8ac59;
+ background-color: #f8ac59;
}
+
.progress-bar-danger {
- background-color: #ed5565;
+ background-color: #ed5565;
}
+
.panel-title {
- font-size: inherit;
+ font-size: inherit;
}
+
.jumbotron {
- border-radius: 6px;
- padding: 40px;
+ border-radius: 6px;
+ padding: 40px;
}
+
.jumbotron h1 {
- margin-top: 0;
+ margin-top: 0;
}
+
/* COLORS */
.text-navy {
- color: var(--primary-color);
+ color: var(--primary-color);
}
+
.text-primary {
- color: inherit;
+ color: inherit;
}
+
.text-success {
- color: #1c84c6;
+ color: #1c84c6;
}
+
.text-info {
- color: #23c6c8;
+ color: #23c6c8;
}
+
.text-warning {
- color: #f8ac59;
+ color: #f8ac59;
}
+
.text-danger {
- color: #ed5565;
+ color: #ed5565;
}
+
.text-muted {
- color: #888888;
+ color: #888888;
}
+
.text-white {
- color: #ffffff;
+ color: #ffffff;
}
+
.simple_tag {
- background-color: #f3f3f4;
- border: 1px solid #e7eaec;
- border-radius: 2px;
- color: inherit;
- font-size: 10px;
- margin-right: 5px;
- margin-top: 5px;
- padding: 5px 12px;
- display: inline-block;
+ background-color: #f3f3f4;
+ border: 1px solid #e7eaec;
+ border-radius: 2px;
+ color: inherit;
+ font-size: 10px;
+ margin-right: 5px;
+ margin-top: 5px;
+ padding: 5px 12px;
+ display: inline-block;
}
+
.img-shadow {
- -webkit-box-shadow: 0 0 3px 0 #919191;
- -moz-box-shadow: 0 0 3px 0 #919191;
- box-shadow: 0 0 3px 0 #919191;
+ -webkit-box-shadow: 0 0 3px 0 #919191;
+ -moz-box-shadow: 0 0 3px 0 #919191;
+ box-shadow: 0 0 3px 0 #919191;
}
+
/* For handle diferent bg color in AngularJS version */
.dashboards\.dashboard_2 nav.navbar,
.dashboards\.dashboard_3 nav.navbar,
@@ -4007,8 +4815,9 @@ table.table-mail tr td {
.metrics nav.navbar,
.metrics\.index nav.navbar,
.dashboards\.dashboard_5 nav.navbar {
- background: #fff;
+ background: #fff;
}
+
/* For handle diferent bg color in MVC version */
.Dashboard_2 .navbar.navbar-static-top,
.Dashboard_3 .navbar.navbar-static-top,
@@ -4018,1558 +4827,1932 @@ table.table-mail tr td {
.Inbox .navbar.navbar-static-top,
.Metrics .navbar.navbar-static-top,
.Dashboard_5 .navbar.navbar-static-top {
- background: #fff;
+ background: #fff;
}
+
a.close-canvas-menu {
- position: absolute;
- top: 10px;
- right: 15px;
- z-index: 1011;
- color: #a7b1c2;
+ position: absolute;
+ top: 10px;
+ right: 15px;
+ z-index: 1011;
+ color: #a7b1c2;
}
+
a.close-canvas-menu:hover {
- color: #fff;
+ color: #fff;
}
+
.close-canvas-menu {
- display: none;
+ display: none;
}
+
.canvas-menu .close-canvas-menu {
- display: block;
+ display: block;
}
+
.light-navbar .navbar.navbar-static-top {
- background-color: #ffffff;
+ background-color: #ffffff;
}
+
/* FULL HEIGHT */
.full-height {
- height: 100%;
+ height: 100%;
}
+
.fh-breadcrumb {
- height: calc(100% - 196px);
- margin: 0 -15px;
- position: relative;
+ height: calc(100% - 196px);
+ margin: 0 -15px;
+ position: relative;
}
+
.fh-no-breadcrumb {
- height: calc(100% - 99px);
- margin: 0 -15px;
- position: relative;
+ height: calc(100% - 99px);
+ margin: 0 -15px;
+ position: relative;
}
+
.fh-column {
- background: #fff;
- height: 100%;
- width: 240px;
- float: left;
+ background: #fff;
+ height: 100%;
+ width: 240px;
+ float: left;
}
+
.modal-backdrop {
- z-index: 2040 !important;
+ z-index: 2040 !important;
}
+
.modal {
- z-index: 2050 !important;
+ z-index: 2050 !important;
}
+
.spiner-example {
- height: 200px;
- padding-top: 70px;
+ height: 200px;
+ padding-top: 70px;
}
+
/* MARGINS & PADDINGS */
.p-xxs {
- padding: 5px;
+ padding: 5px;
}
+
.p-xs {
- padding: 10px;
+ padding: 10px;
}
+
.p-sm {
- padding: 15px;
+ padding: 15px;
}
+
.p-m {
- padding: 20px;
+ padding: 20px;
}
+
.p-md {
- padding: 25px;
+ padding: 25px;
}
+
.p-lg {
- padding: 30px;
+ padding: 30px;
}
+
.p-xl {
- padding: 40px;
+ padding: 40px;
}
+
.p-w-xs {
- padding: 0 10px;
+ padding: 0 10px;
}
+
.p-w-sm {
- padding: 0 15px;
+ padding: 0 15px;
}
+
.p-w-m {
- padding: 0 20px;
+ padding: 0 20px;
}
+
.p-w-md {
- padding: 0 25px;
+ padding: 0 25px;
}
+
.p-w-lg {
- padding: 0 30px;
+ padding: 0 30px;
}
+
.p-w-xl {
- padding: 0 40px;
+ padding: 0 40px;
}
+
.m-xxs {
- margin: 2px 4px;
+ margin: 2px 4px;
}
+
.m-xs {
- margin: 5px;
+ margin: 5px;
}
+
.m-sm {
- margin: 10px;
+ margin: 10px;
}
+
.m {
- margin: 15px;
+ margin: 15px;
}
+
.m-md {
- margin: 20px;
+ margin: 20px;
}
+
.m-lg {
- margin: 30px;
+ margin: 30px;
}
+
.m-xl {
- margin: 50px;
+ margin: 50px;
}
+
.m-n {
- margin: 0 !important;
+ margin: 0 !important;
}
+
.m-l-none {
- margin-left: 0;
+ margin-left: 0;
}
+
.m-l-xs {
- margin-left: 5px;
+ margin-left: 5px;
}
+
.m-l-sm {
- margin-left: 10px;
+ margin-left: 10px;
}
+
.m-l {
- margin-left: 15px;
+ margin-left: 15px;
}
+
.m-l-md {
- margin-left: 20px;
+ margin-left: 20px;
}
+
.m-l-lg {
- margin-left: 30px;
+ margin-left: 30px;
}
+
.m-l-xl {
- margin-left: 40px;
+ margin-left: 40px;
}
+
.m-l-n-xxs {
- margin-left: -1px;
+ margin-left: -1px;
}
+
.m-l-n-xs {
- margin-left: -5px;
+ margin-left: -5px;
}
+
.m-l-n-sm {
- margin-left: -10px;
+ margin-left: -10px;
}
+
.m-l-n {
- margin-left: -15px;
+ margin-left: -15px;
}
+
.m-l-n-md {
- margin-left: -20px;
+ margin-left: -20px;
}
+
.m-l-n-lg {
- margin-left: -30px;
+ margin-left: -30px;
}
+
.m-l-n-xl {
- margin-left: -40px;
+ margin-left: -40px;
}
+
.m-t-none {
- margin-top: 0;
+ margin-top: 0;
}
+
.m-t-xxs {
- margin-top: 1px;
+ margin-top: 1px;
}
+
.m-t-xs {
- margin-top: 5px;
+ margin-top: 5px;
}
+
.m-t-sm {
- margin-top: 10px;
+ margin-top: 10px;
}
+
.m-t {
- margin-top: 15px;
+ margin-top: 15px;
}
+
.m-t-md {
- margin-top: 20px;
+ margin-top: 20px;
}
+
.m-t-lg {
- margin-top: 30px;
+ margin-top: 30px;
}
+
.m-t-xl {
- margin-top: 40px;
+ margin-top: 40px;
}
+
.m-t-n-xxs {
- margin-top: -1px;
+ margin-top: -1px;
}
+
.m-t-n-xs {
- margin-top: -5px;
+ margin-top: -5px;
}
+
.m-t-n-sm {
- margin-top: -10px;
+ margin-top: -10px;
}
+
.m-t-n {
- margin-top: -15px;
+ margin-top: -15px;
}
+
.m-t-n-md {
- margin-top: -20px;
+ margin-top: -20px;
}
+
.m-t-n-lg {
- margin-top: -30px;
+ margin-top: -30px;
}
+
.m-t-n-xl {
- margin-top: -40px;
+ margin-top: -40px;
}
+
.m-r-none {
- margin-right: 0;
+ margin-right: 0;
}
+
.m-r-xxs {
- margin-right: 1px;
+ margin-right: 1px;
}
+
.m-r-xs {
- margin-right: 5px;
+ margin-right: 5px;
}
+
.m-r-sm {
- margin-right: 10px;
+ margin-right: 10px;
}
+
.m-r {
- margin-right: 15px;
+ margin-right: 15px;
}
+
.m-r-md {
- margin-right: 20px;
+ margin-right: 20px;
}
+
.m-r-lg {
- margin-right: 30px;
+ margin-right: 30px;
}
+
.m-r-xl {
- margin-right: 40px;
+ margin-right: 40px;
}
+
.m-r-n-xxs {
- margin-right: -1px;
+ margin-right: -1px;
}
+
.m-r-n-xs {
- margin-right: -5px;
+ margin-right: -5px;
}
+
.m-r-n-sm {
- margin-right: -10px;
+ margin-right: -10px;
}
+
.m-r-n {
- margin-right: -15px;
+ margin-right: -15px;
}
+
.m-r-n-md {
- margin-right: -20px;
+ margin-right: -20px;
}
+
.m-r-n-lg {
- margin-right: -30px;
+ margin-right: -30px;
}
+
.m-r-n-xl {
- margin-right: -40px;
+ margin-right: -40px;
}
+
.m-b-none {
- margin-bottom: 0;
+ margin-bottom: 0;
}
+
.m-b-xxs {
- margin-bottom: 1px;
+ margin-bottom: 1px;
}
+
.m-b-xs {
- margin-bottom: 5px;
+ margin-bottom: 5px;
}
+
.m-b-sm {
- margin-bottom: 10px;
+ margin-bottom: 10px;
}
+
.m-b {
- margin-bottom: 15px;
+ margin-bottom: 15px;
}
+
.m-b-md {
- margin-bottom: 20px;
+ margin-bottom: 20px;
}
+
.m-b-lg {
- margin-bottom: 30px;
+ margin-bottom: 30px;
}
+
.m-b-xl {
- margin-bottom: 40px;
+ margin-bottom: 40px;
}
+
.m-b-n-xxs {
- margin-bottom: -1px;
+ margin-bottom: -1px;
}
+
.m-b-n-xs {
- margin-bottom: -5px;
+ margin-bottom: -5px;
}
+
.m-b-n-sm {
- margin-bottom: -10px;
+ margin-bottom: -10px;
}
+
.m-b-n {
- margin-bottom: -15px;
+ margin-bottom: -15px;
}
+
.m-b-n-md {
- margin-bottom: -20px;
+ margin-bottom: -20px;
}
+
.m-b-n-lg {
- margin-bottom: -30px;
+ margin-bottom: -30px;
}
+
.m-b-n-xl {
- margin-bottom: -40px;
+ margin-bottom: -40px;
}
+
.space-15 {
- margin: 15px 0;
+ margin: 15px 0;
}
+
.space-20 {
- margin: 20px 0;
+ margin: 20px 0;
}
+
.space-25 {
- margin: 25px 0;
+ margin: 25px 0;
}
+
.space-30 {
- margin: 30px 0;
+ margin: 30px 0;
}
+
.fullscreen-ibox-mode .animated {
- animation: none;
+ animation: none;
}
+
body.fullscreen-ibox-mode {
- overflow-y: hidden;
+ overflow-y: hidden;
}
+
.ibox.fullscreen {
- z-index: 2030;
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- overflow: auto;
- margin-bottom: 0;
+ z-index: 2030;
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ overflow: auto;
+ margin-bottom: 0;
}
+
.ibox.fullscreen .collapse-link {
- display: none;
+ display: none;
}
+
.ibox.fullscreen .ibox-content {
- min-height: calc(100% - 48px);
+ min-height: calc(100% - 48px);
}
+
body.modal-open {
- padding-right: inherit !important;
+ padding-right: inherit !important;
}
+
body.modal-open .animated {
- animation-fill-mode: initial;
- z-index: inherit;
+ animation-fill-mode: initial;
+ z-index: inherit;
}
+
/* Show profile dropdown on fixed sidebar */
body.mini-navbar.fixed-sidebar .profile-element,
.block {
- display: block !important;
+ display: block !important;
}
+
body.mini-navbar.fixed-sidebar .nav-header {
- padding: 33px 25px;
+ padding: 33px 25px;
}
+
body.mini-navbar.fixed-sidebar .logo-element {
- display: none;
+ display: none;
}
+
.fullscreen-video .animated {
- animation: none;
+ animation: none;
}
+
/* SEARCH PAGE */
.search-form {
- margin-top: 10px;
+ margin-top: 10px;
}
+
.search-result h3 {
- margin-bottom: 0;
- color: #1E0FBE;
+ margin-bottom: 0;
+ color: #1E0FBE;
}
+
.search-result .search-link {
- color: #006621;
+ color: #006621;
}
+
.search-result p {
- font-size: 12px;
- margin-top: 5px;
+ font-size: 12px;
+ margin-top: 5px;
}
+
/* CONTACTS */
.contact-box {
- background-color: #ffffff;
- border: 1px solid #e7eaec;
- padding: 20px;
- margin-bottom: 20px;
+ background-color: #ffffff;
+ border: 1px solid #e7eaec;
+ padding: 20px;
+ margin-bottom: 20px;
}
+
.contact-box > a {
- color: inherit;
+ color: inherit;
}
+
.contact-box.center-version {
- border: 1px solid #e7eaec;
- padding: 0;
+ border: 1px solid #e7eaec;
+ padding: 0;
}
+
.contact-box.center-version > a {
- display: block;
- background-color: #ffffff;
- padding: 20px;
- text-align: center;
+ display: block;
+ background-color: #ffffff;
+ padding: 20px;
+ text-align: center;
}
+
.contact-box.center-version > a img {
- width: 80px;
- height: 80px;
- margin-top: 10px;
- margin-bottom: 10px;
+ width: 80px;
+ height: 80px;
+ margin-top: 10px;
+ margin-bottom: 10px;
}
+
.contact-box.center-version address {
- margin-bottom: 0;
+ margin-bottom: 0;
}
+
.contact-box .contact-box-footer {
- text-align: center;
- background-color: #ffffff;
- border-top: 1px solid #e7eaec;
- padding: 15px 20px;
+ text-align: center;
+ background-color: #ffffff;
+ border-top: 1px solid #e7eaec;
+ padding: 15px 20px;
}
+
/* INVOICE */
.invoice-table tbody > tr > td:last-child,
.invoice-table tbody > tr > td:nth-child(4),
.invoice-table tbody > tr > td:nth-child(3),
.invoice-table tbody > tr > td:nth-child(2) {
- text-align: right;
+ text-align: right;
}
+
.invoice-table thead > tr > th:last-child,
.invoice-table thead > tr > th:nth-child(4),
.invoice-table thead > tr > th:nth-child(3),
.invoice-table thead > tr > th:nth-child(2) {
- text-align: right;
+ text-align: right;
}
+
.invoice-total > tbody > tr > td:first-child {
- text-align: right;
+ text-align: right;
}
+
.invoice-total > tbody > tr > td {
- border: 0 none;
+ border: 0 none;
}
+
.invoice-total > tbody > tr > td:last-child {
- border-bottom: 1px solid #DDDDDD;
- text-align: right;
- width: 15%;
+ border-bottom: 1px solid #DDDDDD;
+ text-align: right;
+ width: 15%;
}
+
/* ERROR & LOGIN & LOCKSCREEN*/
.middle-box {
- max-width: 400px;
- z-index: 100;
- margin: 0 auto;
- padding-top: 40px;
+ max-width: 400px;
+ z-index: 100;
+ margin: 0 auto;
+ padding-top: 40px;
}
+
.lockscreen.middle-box {
- width: 200px;
- padding-top: 110px;
+ width: 200px;
+ padding-top: 110px;
}
+
.loginscreen.middle-box {
- width: 300px;
+ width: 300px;
}
+
.loginColumns {
- max-width: 800px;
- margin: 0 auto;
- padding: 100px 20px 20px 20px;
+ max-width: 800px;
+ margin: 0 auto;
+ padding: 100px 20px 20px 20px;
}
+
.passwordBox {
- max-width: 460px;
- margin: 0 auto;
- padding: 100px 20px 20px 20px;
+ max-width: 460px;
+ margin: 0 auto;
+ padding: 100px 20px 20px 20px;
}
+
.logo-name {
- color: #e6e6e6;
- font-size: 180px;
- font-weight: 800;
- letter-spacing: -10px;
- margin-bottom: 0;
+ color: #e6e6e6;
+ font-size: 180px;
+ font-weight: 800;
+ letter-spacing: -10px;
+ margin-bottom: 0;
}
+
.middle-box h1 {
- font-size: 170px;
+ font-size: 170px;
}
+
.wrapper .middle-box {
- margin-top: 140px;
+ margin-top: 140px;
}
+
.lock-word {
- z-index: 10;
- position: absolute;
- top: 110px;
- left: 50%;
- margin-left: -470px;
+ z-index: 10;
+ position: absolute;
+ top: 110px;
+ left: 50%;
+ margin-left: -470px;
}
+
.lock-word span {
- font-size: 100px;
- font-weight: 600;
- color: #e9e9e9;
- display: inline-block;
+ font-size: 100px;
+ font-weight: 600;
+ color: #e9e9e9;
+ display: inline-block;
}
+
.lock-word .first-word {
- margin-right: 160px;
+ margin-right: 160px;
}
+
/* DASBOARD */
.dashboard-header {
- border-top: 0;
- padding: 20px 20px 20px 20px;
+ border-top: 0;
+ padding: 20px 20px 20px 20px;
}
+
.dashboard-header h2 {
- margin-top: 10px;
- font-size: 26px;
+ margin-top: 10px;
+ font-size: 26px;
}
+
.fist-item {
- border-top: none !important;
+ border-top: none !important;
}
+
.statistic-box {
- margin-top: 40px;
+ margin-top: 40px;
}
+
.dashboard-header .list-group-item span.label {
- margin-right: 10px;
+ margin-right: 10px;
}
+
.list-group.clear-list .list-group-item {
- border-top: 1px solid #e7eaec;
- border-bottom: 0;
- border-right: 0;
- border-left: 0;
- padding: 10px 0;
+ border-top: 1px solid #e7eaec;
+ border-bottom: 0;
+ border-right: 0;
+ border-left: 0;
+ padding: 10px 0;
}
+
ul.clear-list:first-child {
- border-top: none !important;
+ border-top: none !important;
}
+
/* Intimeline */
.timeline-item .date i {
- position: absolute;
- top: 0;
- right: 0;
- padding: 5px;
- width: 30px;
- text-align: center;
- border-top: 1px solid #e7eaec;
- border-bottom: 1px solid #e7eaec;
- border-left: 1px solid #e7eaec;
- background: #f8f8f8;
+ position: absolute;
+ top: 0;
+ right: 0;
+ padding: 5px;
+ width: 30px;
+ text-align: center;
+ border-top: 1px solid #e7eaec;
+ border-bottom: 1px solid #e7eaec;
+ border-left: 1px solid #e7eaec;
+ background: #f8f8f8;
}
+
.timeline-item .date {
- text-align: right;
- width: 110px;
- position: relative;
- padding-top: 30px;
+ text-align: right;
+ width: 110px;
+ position: relative;
+ padding-top: 30px;
}
+
.timeline-item .content {
- border-left: 1px solid #e7eaec;
- border-top: 1px solid #e7eaec;
- padding-top: 10px;
- min-height: 100px;
+ border-left: 1px solid #e7eaec;
+ border-top: 1px solid #e7eaec;
+ padding-top: 10px;
+ min-height: 100px;
}
+
.timeline-item .content:hover {
- background: #f6f6f6;
+ background: #f6f6f6;
}
+
/* PIN BOARD */
ul.notes li,
ul.tag-list li {
- list-style: none;
+ list-style: none;
}
+
ul.notes li h4 {
- margin-top: 20px;
- font-size: 16px;
+ margin-top: 20px;
+ font-size: 16px;
}
+
ul.notes li div {
- text-decoration: none;
- color: #000;
- background: #ffc;
- display: block;
- height: 140px;
- width: 140px;
- padding: 1em;
- position: relative;
+ text-decoration: none;
+ color: #000;
+ background: #ffc;
+ display: block;
+ height: 140px;
+ width: 140px;
+ padding: 1em;
+ position: relative;
}
+
ul.notes li div small {
- position: absolute;
- top: 5px;
- right: 5px;
- font-size: 10px;
+ position: absolute;
+ top: 5px;
+ right: 5px;
+ font-size: 10px;
}
+
ul.notes li div a {
- position: absolute;
- right: 10px;
- bottom: 10px;
- color: inherit;
+ position: absolute;
+ right: 10px;
+ bottom: 10px;
+ color: inherit;
}
+
ul.notes li {
- margin: 10px 40px 50px 0;
- float: left;
+ margin: 10px 40px 50px 0;
+ float: left;
}
+
ul.notes li div p {
- font-size: 12px;
+ font-size: 12px;
}
+
ul.notes li div {
- text-decoration: none;
- color: #000;
- background: #ffc;
- display: block;
- height: 140px;
- width: 140px;
- padding: 1em;
- /* Firefox */
- -moz-box-shadow: 5px 5px 2px #212121;
- /* Safari+Chrome */
- -webkit-box-shadow: 5px 5px 2px rgba(33, 33, 33, 0.7);
- /* Opera */
- box-shadow: 5px 5px 2px rgba(33, 33, 33, 0.7);
+ text-decoration: none;
+ color: #000;
+ background: #ffc;
+ display: block;
+ height: 140px;
+ width: 140px;
+ padding: 1em;
+ /* Firefox */
+ -moz-box-shadow: 5px 5px 2px #212121;
+ /* Safari+Chrome */
+ -webkit-box-shadow: 5px 5px 2px rgba(33, 33, 33, 0.7);
+ /* Opera */
+ box-shadow: 5px 5px 2px rgba(33, 33, 33, 0.7);
}
+
ul.notes li div {
- -webkit-transform: rotate(-6deg);
- -o-transform: rotate(-6deg);
- -moz-transform: rotate(-6deg);
+ -webkit-transform: rotate(-6deg);
+ -o-transform: rotate(-6deg);
+ -moz-transform: rotate(-6deg);
}
+
ul.notes li:nth-child(even) div {
- -o-transform: rotate(4deg);
- -webkit-transform: rotate(4deg);
- -moz-transform: rotate(4deg);
- position: relative;
- top: 5px;
+ -o-transform: rotate(4deg);
+ -webkit-transform: rotate(4deg);
+ -moz-transform: rotate(4deg);
+ position: relative;
+ top: 5px;
}
+
ul.notes li:nth-child(3n) div {
- -o-transform: rotate(-3deg);
- -webkit-transform: rotate(-3deg);
- -moz-transform: rotate(-3deg);
- position: relative;
- top: -5px;
+ -o-transform: rotate(-3deg);
+ -webkit-transform: rotate(-3deg);
+ -moz-transform: rotate(-3deg);
+ position: relative;
+ top: -5px;
}
+
ul.notes li:nth-child(5n) div {
- -o-transform: rotate(5deg);
- -webkit-transform: rotate(5deg);
- -moz-transform: rotate(5deg);
- position: relative;
- top: -10px;
+ -o-transform: rotate(5deg);
+ -webkit-transform: rotate(5deg);
+ -moz-transform: rotate(5deg);
+ position: relative;
+ top: -10px;
}
+
ul.notes li div:hover,
ul.notes li div:focus {
- -webkit-transform: scale(1.1);
- -moz-transform: scale(1.1);
- -o-transform: scale(1.1);
- position: relative;
- z-index: 5;
+ -webkit-transform: scale(1.1);
+ -moz-transform: scale(1.1);
+ -o-transform: scale(1.1);
+ position: relative;
+ z-index: 5;
}
+
ul.notes li div {
- text-decoration: none;
- color: #000;
- background: #ffc;
- display: block;
- height: 210px;
- width: 210px;
- padding: 1em;
- -moz-box-shadow: 5px 5px 7px #212121;
- -webkit-box-shadow: 5px 5px 7px rgba(33, 33, 33, 0.7);
- box-shadow: 5px 5px 7px rgba(33, 33, 33, 0.7);
- -moz-transition: -moz-transform 0.15s linear;
- -o-transition: -o-transform 0.15s linear;
- -webkit-transition: -webkit-transform 0.15s linear;
+ text-decoration: none;
+ color: #000;
+ background: #ffc;
+ display: block;
+ height: 210px;
+ width: 210px;
+ padding: 1em;
+ -moz-box-shadow: 5px 5px 7px #212121;
+ -webkit-box-shadow: 5px 5px 7px rgba(33, 33, 33, 0.7);
+ box-shadow: 5px 5px 7px rgba(33, 33, 33, 0.7);
+ -moz-transition: -moz-transform 0.15s linear;
+ -o-transition: -o-transform 0.15s linear;
+ -webkit-transition: -webkit-transform 0.15s linear;
}
+
/* FILE MANAGER */
.file-box {
- float: left;
- width: 220px;
+ float: left;
+ width: 220px;
}
+
.file-manager h5 {
- text-transform: uppercase;
+ text-transform: uppercase;
}
+
.file-manager {
- list-style: none outside none;
- margin: 0;
- padding: 0;
+ list-style: none outside none;
+ margin: 0;
+ padding: 0;
}
+
.folder-list li a {
- color: #666666;
- display: block;
- padding: 5px 0;
+ color: #666666;
+ display: block;
+ padding: 5px 0;
}
+
.folder-list li {
- border-bottom: 1px solid #e7eaec;
- display: block;
+ border-bottom: 1px solid #e7eaec;
+ display: block;
}
+
.folder-list li i {
- margin-right: 8px;
- color: #3d4d5d;
+ margin-right: 8px;
+ color: #3d4d5d;
}
+
.category-list li a {
- color: #666666;
- display: block;
- padding: 5px 0;
+ color: #666666;
+ display: block;
+ padding: 5px 0;
}
+
.category-list li {
- display: block;
+ display: block;
}
+
.category-list li i {
- margin-right: 8px;
- color: #3d4d5d;
+ margin-right: 8px;
+ color: #3d4d5d;
}
+
.category-list li a .text-navy {
- color: var(--primary-color);
+ color: var(--primary-color);
}
+
.category-list li a .text-primary {
- color: #1c84c6;
+ color: #1c84c6;
}
+
.category-list li a .text-info {
- color: #23c6c8;
+ color: #23c6c8;
}
+
.category-list li a .text-danger {
- color: #EF5352;
+ color: #EF5352;
}
+
.category-list li a .text-warning {
- color: #F8AC59;
+ color: #F8AC59;
}
+
.file-manager h5.tag-title {
- margin-top: 20px;
+ margin-top: 20px;
}
+
.tag-list li {
- float: left;
+ float: left;
}
+
.tag-list li a {
- font-size: 10px;
- background-color: #f3f3f4;
- padding: 5px 12px;
- color: inherit;
- border-radius: 2px;
- border: 1px solid #e7eaec;
- margin-right: 5px;
- margin-top: 5px;
- display: block;
+ font-size: 10px;
+ background-color: #f3f3f4;
+ padding: 5px 12px;
+ color: inherit;
+ border-radius: 2px;
+ border: 1px solid #e7eaec;
+ margin-right: 5px;
+ margin-top: 5px;
+ display: block;
}
+
.file {
- border: 1px solid #e7eaec;
- padding: 0;
- background-color: #ffffff;
- position: relative;
- margin-bottom: 20px;
- margin-right: 20px;
+ border: 1px solid #e7eaec;
+ padding: 0;
+ background-color: #ffffff;
+ position: relative;
+ margin-bottom: 20px;
+ margin-right: 20px;
}
+
.file-manager .hr-line-dashed {
- margin: 15px 0;
+ margin: 15px 0;
}
+
.file .icon,
.file .image {
- height: 100px;
- overflow: hidden;
+ height: 100px;
+ overflow: hidden;
}
+
.file .icon {
- padding: 15px 10px;
- text-align: center;
+ padding: 15px 10px;
+ text-align: center;
}
+
.file-control {
- color: inherit;
- font-size: 11px;
- margin-right: 10px;
+ color: inherit;
+ font-size: 11px;
+ margin-right: 10px;
}
+
.file-control.active {
- text-decoration: underline;
+ text-decoration: underline;
}
+
.file .icon i {
- font-size: 70px;
- color: #dadada;
+ font-size: 70px;
+ color: #dadada;
}
+
.file .file-name {
- padding: 10px;
- background-color: #f8f8f8;
- border-top: 1px solid #e7eaec;
+ padding: 10px;
+ background-color: #f8f8f8;
+ border-top: 1px solid #e7eaec;
}
+
.file-name small {
- color: #676a6c;
+ color: #676a6c;
}
+
.corner {
- position: absolute;
- display: inline-block;
- width: 0;
- height: 0;
- line-height: 0;
- border: 0.6em solid transparent;
- border-right: 0.6em solid #f1f1f1;
- border-bottom: 0.6em solid #f1f1f1;
- right: 0em;
- bottom: 0em;
+ position: absolute;
+ display: inline-block;
+ width: 0;
+ height: 0;
+ line-height: 0;
+ border: 0.6em solid transparent;
+ border-right: 0.6em solid #f1f1f1;
+ border-bottom: 0.6em solid #f1f1f1;
+ right: 0em;
+ bottom: 0em;
}
+
a.compose-mail {
- padding: 8px 10px;
+ padding: 8px 10px;
}
+
.mail-search {
- max-width: 300px;
+ max-width: 300px;
}
+
/* PROFILE */
.profile-content {
- border-top: none !important;
+ border-top: none !important;
}
+
.profile-stats {
- margin-right: 10px;
+ margin-right: 10px;
}
+
.profile-image {
- width: 120px;
- float: left;
+ width: 120px;
+ float: left;
}
+
.profile-image img {
- width: 96px;
- height: 96px;
+ width: 96px;
+ height: 96px;
}
+
.profile-info {
- margin-left: 120px;
+ margin-left: 120px;
}
+
.feed-activity-list .feed-element {
- border-bottom: 1px solid #e7eaec;
+ border-bottom: 1px solid #e7eaec;
}
+
.feed-element:first-child {
- margin-top: 0;
+ margin-top: 0;
}
+
.feed-element {
- padding-bottom: 15px;
+ padding-bottom: 15px;
}
+
.feed-element,
.feed-element .media {
- margin-top: 15px;
+ margin-top: 15px;
}
+
.feed-element,
.media-body {
- overflow: hidden;
+ overflow: hidden;
}
+
.feed-element > .pull-left {
- margin-right: 10px;
+ margin-right: 10px;
}
+
.feed-element img.img-circle,
.dropdown-messages-box img.img-circle {
- width: 38px;
- height: 38px;
+ width: 38px;
+ height: 38px;
}
+
.feed-element .well {
- border: 1px solid #e7eaec;
- box-shadow: none;
- margin-top: 10px;
- margin-bottom: 5px;
- padding: 10px 20px;
- font-size: 11px;
- line-height: 16px;
+ border: 1px solid #e7eaec;
+ box-shadow: none;
+ margin-top: 10px;
+ margin-bottom: 5px;
+ padding: 10px 20px;
+ font-size: 11px;
+ line-height: 16px;
}
+
.feed-element .actions {
- margin-top: 10px;
+ margin-top: 10px;
}
+
.feed-element .photos {
- margin: 10px 0;
+ margin: 10px 0;
}
+
.feed-photo {
- max-height: 180px;
- border-radius: 4px;
- overflow: hidden;
- margin-right: 10px;
- margin-bottom: 10px;
+ max-height: 180px;
+ border-radius: 4px;
+ overflow: hidden;
+ margin-right: 10px;
+ margin-bottom: 10px;
}
+
.file-list li {
- padding: 5px 10px;
- font-size: 11px;
- border-radius: 2px;
- border: 1px solid #e7eaec;
- margin-bottom: 5px;
+ padding: 5px 10px;
+ font-size: 11px;
+ border-radius: 2px;
+ border: 1px solid #e7eaec;
+ margin-bottom: 5px;
}
+
.file-list li a {
- color: inherit;
+ color: inherit;
}
+
.file-list li a:hover {
- color: var(--primary-color);
+ color: var(--primary-color);
}
+
.user-friends img {
- width: 42px;
- height: 42px;
- margin-bottom: 5px;
- margin-right: 5px;
+ width: 42px;
+ height: 42px;
+ margin-bottom: 5px;
+ margin-right: 5px;
}
+
/* MAILBOX */
.mail-box {
- background-color: #ffffff;
- border: 1px solid #e7eaec;
- border-top: 0;
- padding: 0;
- margin-bottom: 20px;
+ background-color: #ffffff;
+ border: 1px solid #e7eaec;
+ border-top: 0;
+ padding: 0;
+ margin-bottom: 20px;
}
+
.mail-box-header {
- background-color: #ffffff;
- border: 1px solid #e7eaec;
- border-bottom: 0;
- padding: 30px 20px 20px 20px;
+ background-color: #ffffff;
+ border: 1px solid #e7eaec;
+ border-bottom: 0;
+ padding: 30px 20px 20px 20px;
}
+
.mail-box-header h2 {
- margin-top: 0;
+ margin-top: 0;
}
+
.mailbox-content .tag-list li a {
- background: #ffffff;
+ background: #ffffff;
}
+
.mail-body {
- border-top: 1px solid #e7eaec;
- padding: 20px;
+ border-top: 1px solid #e7eaec;
+ padding: 20px;
}
+
.mail-text {
- border-top: 1px solid #e7eaec;
+ border-top: 1px solid #e7eaec;
}
+
.mail-text .note-toolbar {
- padding: 10px 15px;
+ padding: 10px 15px;
}
+
.mail-body .form-group {
- margin-bottom: 5px;
+ margin-bottom: 5px;
}
+
.mail-text .note-editor .note-toolbar {
- background-color: #F9F8F8;
+ background-color: #F9F8F8;
}
+
.mail-attachment {
- border-top: 1px solid #e7eaec;
- padding: 20px;
- font-size: 12px;
+ border-top: 1px solid #e7eaec;
+ padding: 20px;
+ font-size: 12px;
}
+
.mailbox-content {
- background: none;
- border: none;
- padding: 10px;
+ background: none;
+ border: none;
+ padding: 10px;
}
+
.mail-ontact {
- width: 23%;
+ width: 23%;
}
+
/* PROJECTS */
.project-people,
.project-actions {
- text-align: right;
- vertical-align: middle;
+ text-align: right;
+ vertical-align: middle;
}
+
dd.project-people {
- text-align: left;
- margin-top: 5px;
+ text-align: left;
+ margin-top: 5px;
}
+
.project-people img {
- width: 32px;
- height: 32px;
+ width: 32px;
+ height: 32px;
}
+
.project-title a {
- font-size: 14px;
- color: #676a6c;
- font-weight: 600;
+ font-size: 14px;
+ color: #676a6c;
+ font-weight: 600;
}
+
.project-list table tr td {
- border-top: none;
- border-bottom: 1px solid #e7eaec;
- padding: 15px 10px;
- vertical-align: middle;
+ border-top: none;
+ border-bottom: 1px solid #e7eaec;
+ padding: 15px 10px;
+ vertical-align: middle;
}
+
.project-manager .tag-list li a {
- font-size: 10px;
- background-color: white;
- padding: 5px 12px;
- color: inherit;
- border-radius: 2px;
- border: 1px solid #e7eaec;
- margin-right: 5px;
- margin-top: 5px;
- display: block;
+ font-size: 10px;
+ background-color: white;
+ padding: 5px 12px;
+ color: inherit;
+ border-radius: 2px;
+ border: 1px solid #e7eaec;
+ margin-right: 5px;
+ margin-top: 5px;
+ display: block;
}
+
.project-files li a {
- font-size: 11px;
- color: #676a6c;
- margin-left: 10px;
- line-height: 22px;
+ font-size: 11px;
+ color: #676a6c;
+ margin-left: 10px;
+ line-height: 22px;
}
+
/* FAQ */
.faq-item {
- padding: 20px;
- margin-bottom: 2px;
- background: #fff;
+ padding: 20px;
+ margin-bottom: 2px;
+ background: #fff;
}
+
.faq-question {
- font-size: 18px;
- font-weight: 600;
- color: var(--primary-color);
- display: block;
+ font-size: 18px;
+ font-weight: 600;
+ color: var(--primary-color);
+ display: block;
}
+
.faq-question:hover {
- color: #179d82;
+ color: #179d82;
}
+
.faq-answer {
- margin-top: 10px;
- background: #f3f3f4;
- border: 1px solid #e7eaec;
- border-radius: 3px;
- padding: 15px;
+ margin-top: 10px;
+ background: #f3f3f4;
+ border: 1px solid #e7eaec;
+ border-radius: 3px;
+ padding: 15px;
}
+
.faq-item .tag-item {
- background: #f3f3f4;
- padding: 2px 6px;
- font-size: 10px;
- text-transform: uppercase;
+ background: #f3f3f4;
+ padding: 2px 6px;
+ font-size: 10px;
+ text-transform: uppercase;
}
+
/* Chat view */
.message-input {
- height: 90px !important;
+ height: 90px !important;
}
+
.chat-avatar {
- white: 36px;
- height: 36px;
- float: left;
- margin-right: 10px;
+ white: 36px;
+ height: 36px;
+ float: left;
+ margin-right: 10px;
}
+
.chat-user-name {
- padding: 10px;
+ padding: 10px;
}
+
.chat-user {
- padding: 8px 10px;
- border-bottom: 1px solid #e7eaec;
+ padding: 8px 10px;
+ border-bottom: 1px solid #e7eaec;
}
+
.chat-user a {
- color: inherit;
+ color: inherit;
}
+
.chat-view {
- z-index: 20012;
+ z-index: 20012;
}
+
.chat-users,
.chat-statistic {
- margin-left: -30px;
+ margin-left: -30px;
}
+
@media (max-width: 992px) {
- .chat-users,
- .chat-statistic {
- margin-left: 0;
- }
+ .chat-users,
+ .chat-statistic {
+ margin-left: 0;
+ }
}
+
.chat-view .ibox-content {
- padding: 0;
+ padding: 0;
}
+
.chat-message {
- padding: 10px 20px;
+ padding: 10px 20px;
}
+
.message-avatar {
- height: 48px;
- width: 48px;
- border: 1px solid #e7eaec;
- border-radius: 4px;
- margin-top: 1px;
+ height: 48px;
+ width: 48px;
+ border: 1px solid #e7eaec;
+ border-radius: 4px;
+ margin-top: 1px;
}
+
.chat-discussion .chat-message.left .message-avatar {
- float: left;
- margin-right: 10px;
+ float: left;
+ margin-right: 10px;
}
+
.chat-discussion .chat-message.right .message-avatar {
- float: right;
- margin-left: 10px;
+ float: right;
+ margin-left: 10px;
}
+
.message {
- background-color: #fff;
- border: 1px solid #e7eaec;
- text-align: left;
- display: block;
- padding: 10px 20px;
- position: relative;
- border-radius: 4px;
+ background-color: #fff;
+ border: 1px solid #e7eaec;
+ text-align: left;
+ display: block;
+ padding: 10px 20px;
+ position: relative;
+ border-radius: 4px;
}
+
.chat-discussion .chat-message.left .message-date {
- float: right;
+ float: right;
}
+
.chat-discussion .chat-message.right .message-date {
- float: left;
+ float: left;
}
+
.chat-discussion .chat-message.left .message {
- text-align: left;
- margin-left: 55px;
+ text-align: left;
+ margin-left: 55px;
}
+
.chat-discussion .chat-message.right .message {
- text-align: right;
- margin-right: 55px;
+ text-align: right;
+ margin-right: 55px;
}
+
.message-date {
- font-size: 10px;
- color: #888888;
+ font-size: 10px;
+ color: #888888;
}
+
.message-content {
- display: block;
+ display: block;
}
+
.chat-discussion {
- background: #eee;
- padding: 15px;
- height: 400px;
- overflow-y: auto;
+ background: #eee;
+ padding: 15px;
+ height: 400px;
+ overflow-y: auto;
}
+
.chat-users {
- overflow-y: auto;
- height: 400px;
+ overflow-y: auto;
+ height: 400px;
}
+
.chat-message-form .form-group {
- margin-bottom: 0;
+ margin-bottom: 0;
}
+
/* jsTree */
.jstree-open > .jstree-anchor > .fa-folder:before {
- content: "\f07c";
+ content: "\f07c";
}
+
.jstree-default .jstree-icon.none {
- width: 0;
+ width: 0;
}
+
/* CLIENTS */
.clients-list {
- margin-top: 20px;
+ margin-top: 20px;
}
+
.clients-list .tab-pane {
- position: relative;
- height: 600px;
+ position: relative;
+ height: 600px;
}
+
.client-detail {
- position: relative;
- height: 620px;
+ position: relative;
+ height: 620px;
}
+
.clients-list table tr td {
- height: 46px;
- vertical-align: middle;
- border: none;
+ height: 46px;
+ vertical-align: middle;
+ border: none;
}
+
.client-link {
- font-weight: 600;
- color: inherit;
+ font-weight: 600;
+ color: inherit;
}
+
.client-link:hover {
- color: inherit;
+ color: inherit;
}
+
.client-avatar {
- width: 42px;
+ width: 42px;
}
+
.client-avatar img {
- width: 28px;
- height: 28px;
- border-radius: 50%;
+ width: 28px;
+ height: 28px;
+ border-radius: 50%;
}
+
.contact-type {
- width: 20px;
- color: #c1c3c4;
+ width: 20px;
+ color: #c1c3c4;
}
+
.client-status {
- text-align: left;
+ text-align: left;
}
+
.client-detail .vertical-timeline-content p {
- margin: 0;
+ margin: 0;
}
+
.client-detail .vertical-timeline-icon.gray-bg {
- color: #a7aaab;
+ color: #a7aaab;
}
+
.clients-list .nav-tabs > li.active > a,
.clients-list .nav-tabs > li.active > a:hover,
.clients-list .nav-tabs > li.active > a:focus {
- border-bottom: 1px solid #fff;
+ border-bottom: 1px solid #fff;
}
+
/* BLOG ARTICLE */
.blog h2 {
- font-weight: 700;
+ font-weight: 700;
}
+
.blog h5 {
- margin: 0 0 5px 0;
+ margin: 0 0 5px 0;
}
+
.blog .btn {
- margin: 0 0 5px 0;
+ margin: 0 0 5px 0;
}
+
.article h1 {
- font-size: 48px;
- font-weight: 700;
- color: #2F4050;
+ font-size: 48px;
+ font-weight: 700;
+ color: #2F4050;
}
+
.article p {
- font-size: 15px;
- line-height: 26px;
+ font-size: 15px;
+ line-height: 26px;
}
+
.article-title {
- text-align: center;
- margin: 40px 0 100px 0;
+ text-align: center;
+ margin: 40px 0 100px 0;
}
+
.article .ibox-content {
- padding: 40px;
+ padding: 40px;
}
+
/* ISSUE TRACKER */
.issue-tracker .btn-link {
- color: var(--primary-color);
+ color: var(--primary-color);
}
+
table.issue-tracker tbody tr td {
- vertical-align: middle;
- height: 50px;
+ vertical-align: middle;
+ height: 50px;
}
+
.issue-info {
- width: 50%;
+ width: 50%;
}
+
.issue-info a {
- font-weight: 600;
- color: #676a6c;
+ font-weight: 600;
+ color: #676a6c;
}
+
.issue-info small {
- display: block;
+ display: block;
}
+
/* TEAMS */
.team-members {
- margin: 10px 0;
+ margin: 10px 0;
}
+
.team-members img.img-circle {
- width: 42px;
- height: 42px;
- margin-bottom: 5px;
+ width: 42px;
+ height: 42px;
+ margin-bottom: 5px;
}
+
/* AGILE BOARD */
.sortable-list {
- padding: 10px 0;
+ padding: 10px 0;
}
+
.agile-list {
- list-style: none;
- margin: 0;
+ list-style: none;
+ margin: 0;
}
+
.agile-list li {
- background: #FAFAFB;
- border: 1px solid #e7eaec;
- margin: 0 0 10px 0;
- padding: 10px;
- border-radius: 2px;
+ background: #FAFAFB;
+ border: 1px solid #e7eaec;
+ margin: 0 0 10px 0;
+ padding: 10px;
+ border-radius: 2px;
}
+
.agile-list li:hover {
- cursor: pointer;
- background: #fff;
+ cursor: pointer;
+ background: #fff;
}
+
.agile-list li.warning-element {
- border-left: 3px solid #f8ac59;
+ border-left: 3px solid #f8ac59;
}
+
.agile-list li.danger-element {
- border-left: 3px solid #ed5565;
+ border-left: 3px solid #ed5565;
}
+
.agile-list li.info-element {
- border-left: 3px solid #1c84c6;
+ border-left: 3px solid #1c84c6;
}
+
.agile-list li.success-element {
- border-left: 3px solid var(--primary-color);
+ border-left: 3px solid var(--primary-color);
}
+
.agile-detail {
- margin-top: 5px;
- font-size: 12px;
+ margin-top: 5px;
+ font-size: 12px;
}
+
/* DIFF */
ins {
- background-color: #c6ffc6;
- text-decoration: none;
+ background-color: #c6ffc6;
+ text-decoration: none;
}
+
del {
- background-color: #ffc6c6;
+ background-color: #ffc6c6;
}
+
/* E-commerce */
.product-box {
- padding: 0;
- border: 1px solid #e7eaec;
+ padding: 0;
+ border: 1px solid #e7eaec;
}
+
.product-box:hover,
.product-box.active {
- border: 1px solid transparent;
- -webkit-box-shadow: 0 3px 7px 0 #a8a8a8;
- -moz-box-shadow: 0 3px 7px 0 #a8a8a8;
- box-shadow: 0 3px 7px 0 #a8a8a8;
+ border: 1px solid transparent;
+ -webkit-box-shadow: 0 3px 7px 0 #a8a8a8;
+ -moz-box-shadow: 0 3px 7px 0 #a8a8a8;
+ box-shadow: 0 3px 7px 0 #a8a8a8;
}
+
.product-imitation {
- text-align: center;
- padding: 90px 0;
- background-color: #f8f8f9;
- color: #bebec3;
- font-weight: 600;
+ text-align: center;
+ padding: 90px 0;
+ background-color: #f8f8f9;
+ color: #bebec3;
+ font-weight: 600;
}
+
.cart-product-imitation {
- text-align: center;
- padding-top: 30px;
- height: 80px;
- width: 80px;
- background-color: #f8f8f9;
+ text-align: center;
+ padding-top: 30px;
+ height: 80px;
+ width: 80px;
+ background-color: #f8f8f9;
}
+
.product-imitation.xl {
- padding: 120px 0;
+ padding: 120px 0;
}
+
.product-desc {
- padding: 20px;
- position: relative;
+ padding: 20px;
+ position: relative;
}
+
.ecommerce .tag-list {
- padding: 0;
+ padding: 0;
}
+
.ecommerce .fa-star {
- color: #d1dade;
+ color: #d1dade;
}
+
.ecommerce .fa-star.active {
- color: #f8ac59;
+ color: #f8ac59;
}
+
.ecommerce .note-editor {
- border: 1px solid #e7eaec;
+ border: 1px solid #e7eaec;
}
+
table.shoping-cart-table {
- margin-bottom: 0;
+ margin-bottom: 0;
}
+
table.shoping-cart-table tr td {
- border: none;
- text-align: right;
+ border: none;
+ text-align: right;
}
+
table.shoping-cart-table tr td.desc,
table.shoping-cart-table tr td:first-child {
- text-align: left;
+ text-align: left;
}
+
table.shoping-cart-table tr td:last-child {
- width: 80px;
+ width: 80px;
}
+
.product-name {
- font-size: 16px;
- font-weight: 600;
- color: #676a6c;
- display: block;
- margin: 2px 0 5px 0;
+ font-size: 16px;
+ font-weight: 600;
+ color: #676a6c;
+ display: block;
+ margin: 2px 0 5px 0;
}
+
.product-name:hover,
.product-name:focus {
- color: var(--primary-color);
+ color: var(--primary-color);
}
+
.product-price {
- font-size: 14px;
- font-weight: 600;
- color: #ffffff;
- background-color: var(--primary-color);
- padding: 6px 12px;
- position: absolute;
- top: -32px;
- right: 0;
+ font-size: 14px;
+ font-weight: 600;
+ color: #ffffff;
+ background-color: var(--primary-color);
+ padding: 6px 12px;
+ position: absolute;
+ top: -32px;
+ right: 0;
}
+
.product-detail .ibox-content {
- padding: 30px 30px 50px 30px;
+ padding: 30px 30px 50px 30px;
}
+
.image-imitation {
- background-color: #f8f8f9;
- text-align: center;
- padding: 200px 0;
+ background-color: #f8f8f9;
+ text-align: center;
+ padding: 200px 0;
}
+
.product-main-price small {
- font-size: 10px;
+ font-size: 10px;
}
+
.product-images {
- margin: 0 20px;
+ margin: 0 20px;
}
+
/* Social feed */
.social-feed-separated .social-feed-box {
- margin-left: 62px;
+ margin-left: 62px;
}
+
.social-feed-separated .social-avatar {
- float: left;
- padding: 0;
+ float: left;
+ padding: 0;
}
+
.social-feed-separated .social-avatar img {
- width: 52px;
- height: 52px;
- border: 1px solid #e7eaec;
+ width: 52px;
+ height: 52px;
+ border: 1px solid #e7eaec;
}
+
.social-feed-separated .social-feed-box .social-avatar {
- padding: 15px 15px 0 15px;
- float: none;
+ padding: 15px 15px 0 15px;
+ float: none;
}
+
.social-feed-box {
- /*padding: 15px;*/
- border: 1px solid #e7eaec;
- background: #fff;
- margin-bottom: 15px;
+ /*padding: 15px;*/
+ border: 1px solid #e7eaec;
+ background: #fff;
+ margin-bottom: 15px;
}
+
.article .social-feed-box {
- margin-bottom: 0;
- border-bottom: none;
+ margin-bottom: 0;
+ border-bottom: none;
}
+
.article .social-feed-box:last-child {
- margin-bottom: 0;
- border-bottom: 1px solid #e7eaec;
+ margin-bottom: 0;
+ border-bottom: 1px solid #e7eaec;
}
+
.article .social-feed-box p {
- font-size: 13px;
- line-height: 18px;
+ font-size: 13px;
+ line-height: 18px;
}
+
.social-action {
- margin: 15px;
+ margin: 15px;
}
+
.social-avatar {
- padding: 15px 15px 0 15px;
+ padding: 15px 15px 0 15px;
}
+
.social-comment .social-comment {
- margin-left: 45px;
+ margin-left: 45px;
}
+
.social-avatar img {
- height: 40px;
- width: 40px;
- margin-right: 10px;
+ height: 40px;
+ width: 40px;
+ margin-right: 10px;
}
+
.social-avatar .media-body a {
- font-size: 14px;
- display: block;
+ font-size: 14px;
+ display: block;
}
+
.social-body {
- padding: 15px;
+ padding: 15px;
}
+
.social-body img {
- margin-bottom: 10px;
+ margin-bottom: 10px;
}
+
.social-footer {
- border-top: 1px solid #e7eaec;
- padding: 10px 15px;
- background: #f9f9f9;
+ border-top: 1px solid #e7eaec;
+ padding: 10px 15px;
+ background: #f9f9f9;
}
+
.social-footer .social-comment img {
- width: 32px;
- margin-right: 10px;
+ width: 32px;
+ margin-right: 10px;
}
+
.social-comment:first-child {
- margin-top: 0;
+ margin-top: 0;
}
+
.social-comment {
- margin-top: 15px;
+ margin-top: 15px;
}
+
.social-comment textarea {
- font-size: 12px;
+ font-size: 12px;
}
+
/* Vote list */
.vote-item {
- padding: 20px 25px;
- background: #ffffff;
- border-top: 1px solid #e7eaec;
+ padding: 20px 25px;
+ background: #ffffff;
+ border-top: 1px solid #e7eaec;
}
+
.vote-item:last-child {
- border-bottom: 1px solid #e7eaec;
+ border-bottom: 1px solid #e7eaec;
}
+
.vote-item:hover {
- background: #fbfbfb;
+ background: #fbfbfb;
}
+
.vote-actions {
- float: left;
- width: 30px;
- margin-right: 15px;
- text-align: center;
+ float: left;
+ width: 30px;
+ margin-right: 15px;
+ text-align: center;
}
+
.vote-actions a {
- color: var(--primary-color);
- font-weight: 600;
+ color: var(--primary-color);
+ font-weight: 600;
}
+
.vote-actions {
- font-weight: 600;
+ font-weight: 600;
}
+
.vote-title {
- display: block;
- color: inherit;
- font-size: 18px;
- font-weight: 600;
- margin-top: 5px;
- margin-bottom: 2px;
+ display: block;
+ color: inherit;
+ font-size: 18px;
+ font-weight: 600;
+ margin-top: 5px;
+ margin-bottom: 2px;
}
+
.vote-title:hover,
.vote-title:focus {
- color: inherit;
+ color: inherit;
}
+
.vote-info,
.vote-title {
- margin-left: 45px;
+ margin-left: 45px;
}
+
.vote-info,
.vote-info a {
- color: #b4b6b8;
- font-size: 12px;
+ color: #b4b6b8;
+ font-size: 12px;
}
+
.vote-info a {
- margin-right: 10px;
+ margin-right: 10px;
}
+
.vote-info a:hover {
- color: var(--primary-color);
+ color: var(--primary-color);
}
+
.vote-icon {
- text-align: right;
- font-size: 38px;
- display: block;
- color: #e8e9ea;
+ text-align: right;
+ font-size: 38px;
+ display: block;
+ color: #e8e9ea;
}
+
.vote-icon.active {
- color: var(--primary-color);
+ color: var(--primary-color);
}
+
body.body-small .vote-icon {
- display: none;
+ display: none;
}
+
.lightBoxGallery {
- text-align: center;
+ text-align: center;
}
+
.lightBoxGallery img {
- margin: 5px;
+ margin: 5px;
}
+
#small-chat {
- position: fixed;
- bottom: 20px;
- right: 20px;
- z-index: 100;
+ position: fixed;
+ bottom: 20px;
+ right: 20px;
+ z-index: 100;
}
+
#small-chat .badge {
- position: absolute;
- top: -3px;
- right: -4px;
+ position: absolute;
+ top: -3px;
+ right: -4px;
}
+
.open-small-chat {
- height: 38px;
- width: 38px;
- display: block;
- background: var(--primary-color);
- padding: 9px 8px;
- text-align: center;
- color: #fff;
- border-radius: 50%;
+ height: 38px;
+ width: 38px;
+ display: block;
+ background: var(--primary-color);
+ padding: 9px 8px;
+ text-align: center;
+ color: #fff;
+ border-radius: 50%;
}
+
.open-small-chat:hover {
- color: white;
- background: var(--primary-color);
+ color: white;
+ background: var(--primary-color);
}
+
.small-chat-box {
- display: none;
- position: fixed;
- bottom: 20px;
- right: 75px;
- background: #fff;
- border: 1px solid #e7eaec;
- width: 230px;
- height: 320px;
- border-radius: 4px;
+ display: none;
+ position: fixed;
+ bottom: 20px;
+ right: 75px;
+ background: #fff;
+ border: 1px solid #e7eaec;
+ width: 230px;
+ height: 320px;
+ border-radius: 4px;
}
+
.small-chat-box.ng-small-chat {
- display: block;
+ display: block;
}
+
.body-small .small-chat-box {
- bottom: 70px;
- right: 20px;
+ bottom: 70px;
+ right: 20px;
}
+
.small-chat-box.active {
- display: block;
+ display: block;
}
+
.small-chat-box .heading {
- background: #2f4050;
- padding: 8px 15px;
- font-weight: bold;
- color: #fff;
+ background: #2f4050;
+ padding: 8px 15px;
+ font-weight: bold;
+ color: #fff;
}
+
.small-chat-box .chat-date {
- opacity: 0.6;
- font-size: 10px;
- font-weight: normal;
+ opacity: 0.6;
+ font-size: 10px;
+ font-weight: normal;
}
+
.small-chat-box .content {
- padding: 15px 15px;
+ padding: 15px 15px;
}
+
.small-chat-box .content .author-name {
- font-weight: bold;
- margin-bottom: 3px;
- font-size: 11px;
+ font-weight: bold;
+ margin-bottom: 3px;
+ font-size: 11px;
}
+
.small-chat-box .content > div {
- padding-bottom: 20px;
+ padding-bottom: 20px;
}
+
.small-chat-box .content .chat-message {
- padding: 5px 10px;
- border-radius: 6px;
- font-size: 11px;
- line-height: 14px;
- max-width: 80%;
- background: #f3f3f4;
- margin-bottom: 10px;
+ padding: 5px 10px;
+ border-radius: 6px;
+ font-size: 11px;
+ line-height: 14px;
+ max-width: 80%;
+ background: #f3f3f4;
+ margin-bottom: 10px;
}
+
.small-chat-box .content .chat-message.active {
- background: var(--primary-color);
- color: #fff;
+ background: var(--primary-color);
+ color: #fff;
}
+
.small-chat-box .content .left {
- text-align: left;
- clear: both;
+ text-align: left;
+ clear: both;
}
+
.small-chat-box .content .left .chat-message {
- float: left;
+ float: left;
}
+
.small-chat-box .content .right {
- text-align: right;
- clear: both;
+ text-align: right;
+ clear: both;
}
+
.small-chat-box .content .right .chat-message {
- float: right;
+ float: right;
}
+
.small-chat-box .form-chat {
- padding: 10px 10px;
+ padding: 10px 10px;
}
+
/*
* metismenu - v2.0.2
* A jQuery menu plugin
@@ -5580,59 +6763,73 @@ body.body-small .vote-icon {
*/
.metismenu .plus-minus,
.metismenu .plus-times {
- float: right;
+ float: right;
}
+
.metismenu .arrow {
- float: right;
- line-height: 1.42857;
+ float: right;
+ line-height: 1.42857;
}
+
.metismenu .glyphicon.arrow:before {
- content: "\e079";
+ content: "\e079";
}
+
.metismenu .active > a > .glyphicon.arrow:before {
- content: "\e114";
+ content: "\e114";
}
+
.metismenu .fa.arrow:before {
- content: "\f104";
+ content: "\f104";
}
+
.metismenu .active > a > .fa.arrow:before {
- content: "\f107";
+ content: "\f107";
}
+
.metismenu .ion.arrow:before {
- content: "\f3d2";
+ content: "\f3d2";
}
+
.metismenu .active > a > .ion.arrow:before {
- content: "\f3d0";
+ content: "\f3d0";
}
+
.metismenu .fa.plus-minus:before,
.metismenu .fa.plus-times:before {
- content: "\f067";
+ content: "\f067";
}
+
.metismenu .active > a > .fa.plus-times {
- -webkit-transform: rotate(45deg);
- -ms-transform: rotate(45deg);
- transform: rotate(45deg);
+ -webkit-transform: rotate(45deg);
+ -ms-transform: rotate(45deg);
+ transform: rotate(45deg);
}
+
.metismenu .active > a > .fa.plus-minus:before {
- content: "\f068";
+ content: "\f068";
}
+
.metismenu .collapse {
- display: none;
+ display: none;
}
+
.metismenu .collapse.in {
- display: block;
+ display: block;
}
+
.metismenu .collapsing {
- position: relative;
- height: 0;
- overflow: hidden;
- -webkit-transition-timing-function: ease;
- transition-timing-function: ease;
- -webkit-transition-duration: .35s;
- transition-duration: .35s;
- -webkit-transition-property: height, visibility;
- transition-property: height, visibility;
+ position: relative;
+ height: 0;
+ overflow: hidden;
+ -webkit-transition-timing-function: ease;
+ transition-timing-function: ease;
+ -webkit-transition-duration: .35s;
+ transition-duration: .35s;
+ -webkit-transition-property: height, visibility;
+ transition-property: height, visibility;
}
+
/*
* Usage:
*
@@ -5640,41 +6837,44 @@ body.body-small .vote-icon {
*
*/
.sk-spinner-rotating-plane.sk-spinner {
- width: 30px;
- height: 30px;
- background-color: var(--primary-color);
- margin: 0 auto;
- -webkit-animation: sk-rotatePlane 1.2s infinite ease-in-out;
- animation: sk-rotatePlane 1.2s infinite ease-in-out;
+ width: 30px;
+ height: 30px;
+ background-color: var(--primary-color);
+ margin: 0 auto;
+ -webkit-animation: sk-rotatePlane 1.2s infinite ease-in-out;
+ animation: sk-rotatePlane 1.2s infinite ease-in-out;
}
+
@-webkit-keyframes sk-rotatePlane {
- 0% {
- -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg);
- transform: perspective(120px) rotateX(0deg) rotateY(0deg);
- }
- 50% {
- -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg);
- transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg);
- }
- 100% {
- -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg);
- transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg);
- }
+ 0% {
+ -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg);
+ transform: perspective(120px) rotateX(0deg) rotateY(0deg);
+ }
+ 50% {
+ -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg);
+ transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg);
+ }
+ 100% {
+ -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg);
+ transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg);
+ }
}
+
@keyframes sk-rotatePlane {
- 0% {
- -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg);
- transform: perspective(120px) rotateX(0deg) rotateY(0deg);
- }
- 50% {
- -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg);
- transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg);
- }
- 100% {
- -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg);
- transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg);
- }
+ 0% {
+ -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg);
+ transform: perspective(120px) rotateX(0deg) rotateY(0deg);
+ }
+ 50% {
+ -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg);
+ transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg);
+ }
+ 100% {
+ -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg);
+ transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg);
+ }
}
+
/*
* Usage:
*
@@ -5685,50 +6885,55 @@ body.body-small .vote-icon {
*
*/
.sk-spinner-double-bounce.sk-spinner {
- width: 40px;
- height: 40px;
- position: relative;
- margin: 0 auto;
+ width: 40px;
+ height: 40px;
+ position: relative;
+ margin: 0 auto;
}
+
.sk-spinner-double-bounce .sk-double-bounce1,
.sk-spinner-double-bounce .sk-double-bounce2 {
- width: 100%;
- height: 100%;
- border-radius: 50%;
- background-color: var(--primary-color);
- opacity: 0.6;
- position: absolute;
- top: 0;
- left: 0;
- -webkit-animation: sk-doubleBounce 2s infinite ease-in-out;
- animation: sk-doubleBounce 2s infinite ease-in-out;
+ width: 100%;
+ height: 100%;
+ border-radius: 50%;
+ background-color: var(--primary-color);
+ opacity: 0.6;
+ position: absolute;
+ top: 0;
+ left: 0;
+ -webkit-animation: sk-doubleBounce 2s infinite ease-in-out;
+ animation: sk-doubleBounce 2s infinite ease-in-out;
}
+
.sk-spinner-double-bounce .sk-double-bounce2 {
- -webkit-animation-delay: -1s;
- animation-delay: -1s;
+ -webkit-animation-delay: -1s;
+ animation-delay: -1s;
}
+
@-webkit-keyframes sk-doubleBounce {
- 0%,
- 100% {
- -webkit-transform: scale(0);
- transform: scale(0);
- }
- 50% {
- -webkit-transform: scale(1);
- transform: scale(1);
- }
+ 0%,
+ 100% {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+ 50% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
}
+
@keyframes sk-doubleBounce {
- 0%,
- 100% {
- -webkit-transform: scale(0);
- transform: scale(0);
- }
- 50% {
- -webkit-transform: scale(1);
- transform: scale(1);
- }
+ 0%,
+ 100% {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+ 50% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
}
+
/*
* Usage:
*
@@ -5742,60 +6947,68 @@ body.body-small .vote-icon {
*
*/
.sk-spinner-wave.sk-spinner {
- margin: 0 auto;
- width: 50px;
- height: 30px;
- text-align: center;
- font-size: 10px;
+ margin: 0 auto;
+ width: 50px;
+ height: 30px;
+ text-align: center;
+ font-size: 10px;
}
+
.sk-spinner-wave div {
- background-color: var(--primary-color);
- height: 100%;
- width: 6px;
- display: inline-block;
- -webkit-animation: sk-waveStretchDelay 1.2s infinite ease-in-out;
- animation: sk-waveStretchDelay 1.2s infinite ease-in-out;
+ background-color: var(--primary-color);
+ height: 100%;
+ width: 6px;
+ display: inline-block;
+ -webkit-animation: sk-waveStretchDelay 1.2s infinite ease-in-out;
+ animation: sk-waveStretchDelay 1.2s infinite ease-in-out;
}
+
.sk-spinner-wave .sk-rect2 {
- -webkit-animation-delay: -1.1s;
- animation-delay: -1.1s;
+ -webkit-animation-delay: -1.1s;
+ animation-delay: -1.1s;
}
+
.sk-spinner-wave .sk-rect3 {
- -webkit-animation-delay: -1s;
- animation-delay: -1s;
+ -webkit-animation-delay: -1s;
+ animation-delay: -1s;
}
+
.sk-spinner-wave .sk-rect4 {
- -webkit-animation-delay: -0.9s;
- animation-delay: -0.9s;
+ -webkit-animation-delay: -0.9s;
+ animation-delay: -0.9s;
}
+
.sk-spinner-wave .sk-rect5 {
- -webkit-animation-delay: -0.8s;
- animation-delay: -0.8s;
+ -webkit-animation-delay: -0.8s;
+ animation-delay: -0.8s;
}
+
@-webkit-keyframes sk-waveStretchDelay {
- 0%,
- 40%,
- 100% {
- -webkit-transform: scaleY(0.4);
- transform: scaleY(0.4);
- }
- 20% {
- -webkit-transform: scaleY(1);
- transform: scaleY(1);
- }
+ 0%,
+ 40%,
+ 100% {
+ -webkit-transform: scaleY(0.4);
+ transform: scaleY(0.4);
+ }
+ 20% {
+ -webkit-transform: scaleY(1);
+ transform: scaleY(1);
+ }
}
+
@keyframes sk-waveStretchDelay {
- 0%,
- 40%,
- 100% {
- -webkit-transform: scaleY(0.4);
- transform: scaleY(0.4);
- }
- 20% {
- -webkit-transform: scaleY(1);
- transform: scaleY(1);
- }
+ 0%,
+ 40%,
+ 100% {
+ -webkit-transform: scaleY(0.4);
+ transform: scaleY(0.4);
+ }
+ 20% {
+ -webkit-transform: scaleY(1);
+ transform: scaleY(1);
+ }
}
+
/*
* Usage:
*
@@ -5806,72 +7019,77 @@ body.body-small .vote-icon {
*
*/
.sk-spinner-wandering-cubes.sk-spinner {
- margin: 0 auto;
- width: 32px;
- height: 32px;
- position: relative;
+ margin: 0 auto;
+ width: 32px;
+ height: 32px;
+ position: relative;
}
+
.sk-spinner-wandering-cubes .sk-cube1,
.sk-spinner-wandering-cubes .sk-cube2 {
- background-color: var(--primary-color);
- width: 10px;
- height: 10px;
- position: absolute;
- top: 0;
- left: 0;
- -webkit-animation: sk-wanderingCubeMove 1.8s infinite ease-in-out;
- animation: sk-wanderingCubeMove 1.8s infinite ease-in-out;
+ background-color: var(--primary-color);
+ width: 10px;
+ height: 10px;
+ position: absolute;
+ top: 0;
+ left: 0;
+ -webkit-animation: sk-wanderingCubeMove 1.8s infinite ease-in-out;
+ animation: sk-wanderingCubeMove 1.8s infinite ease-in-out;
}
+
.sk-spinner-wandering-cubes .sk-cube2 {
- -webkit-animation-delay: -0.9s;
- animation-delay: -0.9s;
+ -webkit-animation-delay: -0.9s;
+ animation-delay: -0.9s;
}
+
@-webkit-keyframes sk-wanderingCubeMove {
- 25% {
- -webkit-transform: translateX(42px) rotate(-90deg) scale(0.5);
- transform: translateX(42px) rotate(-90deg) scale(0.5);
- }
- 50% {
- /* Hack to make FF rotate in the right direction */
- -webkit-transform: translateX(42px) translateY(42px) rotate(-179deg);
- transform: translateX(42px) translateY(42px) rotate(-179deg);
- }
- 50.1% {
- -webkit-transform: translateX(42px) translateY(42px) rotate(-180deg);
- transform: translateX(42px) translateY(42px) rotate(-180deg);
- }
- 75% {
- -webkit-transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5);
- transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5);
- }
- 100% {
- -webkit-transform: rotate(-360deg);
- transform: rotate(-360deg);
- }
+ 25% {
+ -webkit-transform: translateX(42px) rotate(-90deg) scale(0.5);
+ transform: translateX(42px) rotate(-90deg) scale(0.5);
+ }
+ 50% {
+ /* Hack to make FF rotate in the right direction */
+ -webkit-transform: translateX(42px) translateY(42px) rotate(-179deg);
+ transform: translateX(42px) translateY(42px) rotate(-179deg);
+ }
+ 50.1% {
+ -webkit-transform: translateX(42px) translateY(42px) rotate(-180deg);
+ transform: translateX(42px) translateY(42px) rotate(-180deg);
+ }
+ 75% {
+ -webkit-transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5);
+ transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5);
+ }
+ 100% {
+ -webkit-transform: rotate(-360deg);
+ transform: rotate(-360deg);
+ }
}
+
@keyframes sk-wanderingCubeMove {
- 25% {
- -webkit-transform: translateX(42px) rotate(-90deg) scale(0.5);
- transform: translateX(42px) rotate(-90deg) scale(0.5);
- }
- 50% {
- /* Hack to make FF rotate in the right direction */
- -webkit-transform: translateX(42px) translateY(42px) rotate(-179deg);
- transform: translateX(42px) translateY(42px) rotate(-179deg);
- }
- 50.1% {
- -webkit-transform: translateX(42px) translateY(42px) rotate(-180deg);
- transform: translateX(42px) translateY(42px) rotate(-180deg);
- }
- 75% {
- -webkit-transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5);
- transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5);
- }
- 100% {
- -webkit-transform: rotate(-360deg);
- transform: rotate(-360deg);
- }
+ 25% {
+ -webkit-transform: translateX(42px) rotate(-90deg) scale(0.5);
+ transform: translateX(42px) rotate(-90deg) scale(0.5);
+ }
+ 50% {
+ /* Hack to make FF rotate in the right direction */
+ -webkit-transform: translateX(42px) translateY(42px) rotate(-179deg);
+ transform: translateX(42px) translateY(42px) rotate(-179deg);
+ }
+ 50.1% {
+ -webkit-transform: translateX(42px) translateY(42px) rotate(-180deg);
+ transform: translateX(42px) translateY(42px) rotate(-180deg);
+ }
+ 75% {
+ -webkit-transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5);
+ transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5);
+ }
+ 100% {
+ -webkit-transform: rotate(-360deg);
+ transform: rotate(-360deg);
+ }
}
+
/*
* Usage:
*
@@ -5879,36 +7097,39 @@ body.body-small .vote-icon {
*
*/
.sk-spinner-pulse.sk-spinner {
- width: 40px;
- height: 40px;
- margin: 0 auto;
- background-color: var(--primary-color);
- border-radius: 100%;
- -webkit-animation: sk-pulseScaleOut 1s infinite ease-in-out;
- animation: sk-pulseScaleOut 1s infinite ease-in-out;
+ width: 40px;
+ height: 40px;
+ margin: 0 auto;
+ background-color: var(--primary-color);
+ border-radius: 100%;
+ -webkit-animation: sk-pulseScaleOut 1s infinite ease-in-out;
+ animation: sk-pulseScaleOut 1s infinite ease-in-out;
}
+
@-webkit-keyframes sk-pulseScaleOut {
- 0% {
- -webkit-transform: scale(0);
- transform: scale(0);
- }
- 100% {
- -webkit-transform: scale(1);
- transform: scale(1);
- opacity: 0;
- }
+ 0% {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+ 100% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ opacity: 0;
+ }
}
+
@keyframes sk-pulseScaleOut {
- 0% {
- -webkit-transform: scale(0);
- transform: scale(0);
- }
- 100% {
- -webkit-transform: scale(1);
- transform: scale(1);
- opacity: 0;
- }
+ 0% {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+ 100% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ opacity: 0;
+ }
}
+
/*
* Usage:
*
@@ -5919,66 +7140,73 @@ body.body-small .vote-icon {
*
*/
.sk-spinner-chasing-dots.sk-spinner {
- margin: 0 auto;
- width: 40px;
- height: 40px;
- position: relative;
- text-align: center;
- -webkit-animation: sk-chasingDotsRotate 2s infinite linear;
- animation: sk-chasingDotsRotate 2s infinite linear;
+ margin: 0 auto;
+ width: 40px;
+ height: 40px;
+ position: relative;
+ text-align: center;
+ -webkit-animation: sk-chasingDotsRotate 2s infinite linear;
+ animation: sk-chasingDotsRotate 2s infinite linear;
}
+
.sk-spinner-chasing-dots .sk-dot1,
.sk-spinner-chasing-dots .sk-dot2 {
- width: 60%;
- height: 60%;
- display: inline-block;
- position: absolute;
- top: 0;
- background-color: var(--primary-color);
- border-radius: 100%;
- -webkit-animation: sk-chasingDotsBounce 2s infinite ease-in-out;
- animation: sk-chasingDotsBounce 2s infinite ease-in-out;
+ width: 60%;
+ height: 60%;
+ display: inline-block;
+ position: absolute;
+ top: 0;
+ background-color: var(--primary-color);
+ border-radius: 100%;
+ -webkit-animation: sk-chasingDotsBounce 2s infinite ease-in-out;
+ animation: sk-chasingDotsBounce 2s infinite ease-in-out;
}
+
.sk-spinner-chasing-dots .sk-dot2 {
- top: auto;
- bottom: 0;
- -webkit-animation-delay: -1s;
- animation-delay: -1s;
+ top: auto;
+ bottom: 0;
+ -webkit-animation-delay: -1s;
+ animation-delay: -1s;
}
+
@-webkit-keyframes sk-chasingDotsRotate {
- 100% {
- -webkit-transform: rotate(360deg);
- transform: rotate(360deg);
- }
+ 100% {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg);
+ }
}
+
@keyframes sk-chasingDotsRotate {
- 100% {
- -webkit-transform: rotate(360deg);
- transform: rotate(360deg);
- }
+ 100% {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg);
+ }
}
+
@-webkit-keyframes sk-chasingDotsBounce {
- 0%,
- 100% {
- -webkit-transform: scale(0);
- transform: scale(0);
- }
- 50% {
- -webkit-transform: scale(1);
- transform: scale(1);
- }
+ 0%,
+ 100% {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+ 50% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
}
+
@keyframes sk-chasingDotsBounce {
- 0%,
- 100% {
- -webkit-transform: scale(0);
- transform: scale(0);
- }
- 50% {
- -webkit-transform: scale(1);
- transform: scale(1);
- }
+ 0%,
+ 100% {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+ 50% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
}
+
/*
* Usage:
*
@@ -5990,54 +7218,60 @@ body.body-small .vote-icon {
*
*/
.sk-spinner-three-bounce.sk-spinner {
- margin: 0 auto;
- width: 70px;
- text-align: center;
+ margin: 0 auto;
+ width: 70px;
+ text-align: center;
}
+
.sk-spinner-three-bounce div {
- width: 18px;
- height: 18px;
- background-color: var(--primary-color);
- border-radius: 100%;
- display: inline-block;
- -webkit-animation: sk-threeBounceDelay 1.4s infinite ease-in-out;
- animation: sk-threeBounceDelay 1.4s infinite ease-in-out;
- /* Prevent first frame from flickering when animation starts */
- -webkit-animation-fill-mode: both;
- animation-fill-mode: both;
+ width: 18px;
+ height: 18px;
+ background-color: var(--primary-color);
+ border-radius: 100%;
+ display: inline-block;
+ -webkit-animation: sk-threeBounceDelay 1.4s infinite ease-in-out;
+ animation: sk-threeBounceDelay 1.4s infinite ease-in-out;
+ /* Prevent first frame from flickering when animation starts */
+ -webkit-animation-fill-mode: both;
+ animation-fill-mode: both;
}
+
.sk-spinner-three-bounce .sk-bounce1 {
- -webkit-animation-delay: -0.32s;
- animation-delay: -0.32s;
+ -webkit-animation-delay: -0.32s;
+ animation-delay: -0.32s;
}
+
.sk-spinner-three-bounce .sk-bounce2 {
- -webkit-animation-delay: -0.16s;
- animation-delay: -0.16s;
+ -webkit-animation-delay: -0.16s;
+ animation-delay: -0.16s;
}
+
@-webkit-keyframes sk-threeBounceDelay {
- 0%,
- 80%,
- 100% {
- -webkit-transform: scale(0);
- transform: scale(0);
- }
- 40% {
- -webkit-transform: scale(1);
- transform: scale(1);
- }
+ 0%,
+ 80%,
+ 100% {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+ 40% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
}
+
@keyframes sk-threeBounceDelay {
- 0%,
- 80%,
- 100% {
- -webkit-transform: scale(0);
- transform: scale(0);
- }
- 40% {
- -webkit-transform: scale(1);
- transform: scale(1);
- }
+ 0%,
+ 80%,
+ 100% {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+ 40% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
}
+
/*
* Usage:
*
@@ -6058,155 +7292,182 @@ body.body-small .vote-icon {
*
*/
.sk-spinner-circle.sk-spinner {
- margin: 0 auto;
- width: 22px;
- height: 22px;
- position: relative;
+ margin: 0 auto;
+ width: 22px;
+ height: 22px;
+ position: relative;
}
+
.sk-spinner-circle .sk-circle {
- width: 100%;
- height: 100%;
- position: absolute;
- left: 0;
- top: 0;
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ left: 0;
+ top: 0;
}
+
.sk-spinner-circle .sk-circle:before {
- content: '';
- display: block;
- margin: 0 auto;
- width: 20%;
- height: 20%;
- background-color: var(--primary-color);
- border-radius: 100%;
- -webkit-animation: sk-circleBounceDelay 1.2s infinite ease-in-out;
- animation: sk-circleBounceDelay 1.2s infinite ease-in-out;
- /* Prevent first frame from flickering when animation starts */
- -webkit-animation-fill-mode: both;
- animation-fill-mode: both;
+ content: '';
+ display: block;
+ margin: 0 auto;
+ width: 20%;
+ height: 20%;
+ background-color: var(--primary-color);
+ border-radius: 100%;
+ -webkit-animation: sk-circleBounceDelay 1.2s infinite ease-in-out;
+ animation: sk-circleBounceDelay 1.2s infinite ease-in-out;
+ /* Prevent first frame from flickering when animation starts */
+ -webkit-animation-fill-mode: both;
+ animation-fill-mode: both;
}
+
.sk-spinner-circle .sk-circle2 {
- -webkit-transform: rotate(30deg);
- -ms-transform: rotate(30deg);
- transform: rotate(30deg);
+ -webkit-transform: rotate(30deg);
+ -ms-transform: rotate(30deg);
+ transform: rotate(30deg);
}
+
.sk-spinner-circle .sk-circle3 {
- -webkit-transform: rotate(60deg);
- -ms-transform: rotate(60deg);
- transform: rotate(60deg);
+ -webkit-transform: rotate(60deg);
+ -ms-transform: rotate(60deg);
+ transform: rotate(60deg);
}
+
.sk-spinner-circle .sk-circle4 {
- -webkit-transform: rotate(90deg);
- -ms-transform: rotate(90deg);
- transform: rotate(90deg);
+ -webkit-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ transform: rotate(90deg);
}
+
.sk-spinner-circle .sk-circle5 {
- -webkit-transform: rotate(120deg);
- -ms-transform: rotate(120deg);
- transform: rotate(120deg);
+ -webkit-transform: rotate(120deg);
+ -ms-transform: rotate(120deg);
+ transform: rotate(120deg);
}
+
.sk-spinner-circle .sk-circle6 {
- -webkit-transform: rotate(150deg);
- -ms-transform: rotate(150deg);
- transform: rotate(150deg);
+ -webkit-transform: rotate(150deg);
+ -ms-transform: rotate(150deg);
+ transform: rotate(150deg);
}
+
.sk-spinner-circle .sk-circle7 {
- -webkit-transform: rotate(180deg);
- -ms-transform: rotate(180deg);
- transform: rotate(180deg);
+ -webkit-transform: rotate(180deg);
+ -ms-transform: rotate(180deg);
+ transform: rotate(180deg);
}
+
.sk-spinner-circle .sk-circle8 {
- -webkit-transform: rotate(210deg);
- -ms-transform: rotate(210deg);
- transform: rotate(210deg);
+ -webkit-transform: rotate(210deg);
+ -ms-transform: rotate(210deg);
+ transform: rotate(210deg);
}
+
.sk-spinner-circle .sk-circle9 {
- -webkit-transform: rotate(240deg);
- -ms-transform: rotate(240deg);
- transform: rotate(240deg);
+ -webkit-transform: rotate(240deg);
+ -ms-transform: rotate(240deg);
+ transform: rotate(240deg);
}
+
.sk-spinner-circle .sk-circle10 {
- -webkit-transform: rotate(270deg);
- -ms-transform: rotate(270deg);
- transform: rotate(270deg);
+ -webkit-transform: rotate(270deg);
+ -ms-transform: rotate(270deg);
+ transform: rotate(270deg);
}
+
.sk-spinner-circle .sk-circle11 {
- -webkit-transform: rotate(300deg);
- -ms-transform: rotate(300deg);
- transform: rotate(300deg);
+ -webkit-transform: rotate(300deg);
+ -ms-transform: rotate(300deg);
+ transform: rotate(300deg);
}
+
.sk-spinner-circle .sk-circle12 {
- -webkit-transform: rotate(330deg);
- -ms-transform: rotate(330deg);
- transform: rotate(330deg);
+ -webkit-transform: rotate(330deg);
+ -ms-transform: rotate(330deg);
+ transform: rotate(330deg);
}
+
.sk-spinner-circle .sk-circle2:before {
- -webkit-animation-delay: -1.1s;
- animation-delay: -1.1s;
+ -webkit-animation-delay: -1.1s;
+ animation-delay: -1.1s;
}
+
.sk-spinner-circle .sk-circle3:before {
- -webkit-animation-delay: -1s;
- animation-delay: -1s;
+ -webkit-animation-delay: -1s;
+ animation-delay: -1s;
}
+
.sk-spinner-circle .sk-circle4:before {
- -webkit-animation-delay: -0.9s;
- animation-delay: -0.9s;
+ -webkit-animation-delay: -0.9s;
+ animation-delay: -0.9s;
}
+
.sk-spinner-circle .sk-circle5:before {
- -webkit-animation-delay: -0.8s;
- animation-delay: -0.8s;
+ -webkit-animation-delay: -0.8s;
+ animation-delay: -0.8s;
}
+
.sk-spinner-circle .sk-circle6:before {
- -webkit-animation-delay: -0.7s;
- animation-delay: -0.7s;
+ -webkit-animation-delay: -0.7s;
+ animation-delay: -0.7s;
}
+
.sk-spinner-circle .sk-circle7:before {
- -webkit-animation-delay: -0.6s;
- animation-delay: -0.6s;
+ -webkit-animation-delay: -0.6s;
+ animation-delay: -0.6s;
}
+
.sk-spinner-circle .sk-circle8:before {
- -webkit-animation-delay: -0.5s;
- animation-delay: -0.5s;
+ -webkit-animation-delay: -0.5s;
+ animation-delay: -0.5s;
}
+
.sk-spinner-circle .sk-circle9:before {
- -webkit-animation-delay: -0.4s;
- animation-delay: -0.4s;
+ -webkit-animation-delay: -0.4s;
+ animation-delay: -0.4s;
}
+
.sk-spinner-circle .sk-circle10:before {
- -webkit-animation-delay: -0.3s;
- animation-delay: -0.3s;
+ -webkit-animation-delay: -0.3s;
+ animation-delay: -0.3s;
}
+
.sk-spinner-circle .sk-circle11:before {
- -webkit-animation-delay: -0.2s;
- animation-delay: -0.2s;
+ -webkit-animation-delay: -0.2s;
+ animation-delay: -0.2s;
}
+
.sk-spinner-circle .sk-circle12:before {
- -webkit-animation-delay: -0.1s;
- animation-delay: -0.1s;
+ -webkit-animation-delay: -0.1s;
+ animation-delay: -0.1s;
}
+
@-webkit-keyframes sk-circleBounceDelay {
- 0%,
- 80%,
- 100% {
- -webkit-transform: scale(0);
- transform: scale(0);
- }
- 40% {
- -webkit-transform: scale(1);
- transform: scale(1);
- }
+ 0%,
+ 80%,
+ 100% {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+ 40% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
}
+
@keyframes sk-circleBounceDelay {
- 0%,
- 80%,
- 100% {
- -webkit-transform: scale(0);
- transform: scale(0);
- }
- 40% {
- -webkit-transform: scale(1);
- transform: scale(1);
- }
+ 0%,
+ 80%,
+ 100% {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+ 40% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
}
+
/*
* Usage:
*
@@ -6224,86 +7485,100 @@ body.body-small .vote-icon {
*
*/
.sk-spinner-cube-grid {
- /*
+ /*
* Spinner positions
* 1 2 3
* 4 5 6
* 7 8 9
*/
}
+
.sk-spinner-cube-grid.sk-spinner {
- width: 30px;
- height: 30px;
- margin: 0 auto;
+ width: 30px;
+ height: 30px;
+ margin: 0 auto;
}
+
.sk-spinner-cube-grid .sk-cube {
- width: 33%;
- height: 33%;
- background-color: var(--primary-color);
- float: left;
- -webkit-animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out;
- animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out;
+ width: 33%;
+ height: 33%;
+ background-color: var(--primary-color);
+ float: left;
+ -webkit-animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out;
+ animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out;
}
+
.sk-spinner-cube-grid .sk-cube:nth-child(1) {
- -webkit-animation-delay: 0.2s;
- animation-delay: 0.2s;
+ -webkit-animation-delay: 0.2s;
+ animation-delay: 0.2s;
}
+
.sk-spinner-cube-grid .sk-cube:nth-child(2) {
- -webkit-animation-delay: 0.3s;
- animation-delay: 0.3s;
+ -webkit-animation-delay: 0.3s;
+ animation-delay: 0.3s;
}
+
.sk-spinner-cube-grid .sk-cube:nth-child(3) {
- -webkit-animation-delay: 0.4s;
- animation-delay: 0.4s;
+ -webkit-animation-delay: 0.4s;
+ animation-delay: 0.4s;
}
+
.sk-spinner-cube-grid .sk-cube:nth-child(4) {
- -webkit-animation-delay: 0.1s;
- animation-delay: 0.1s;
+ -webkit-animation-delay: 0.1s;
+ animation-delay: 0.1s;
}
+
.sk-spinner-cube-grid .sk-cube:nth-child(5) {
- -webkit-animation-delay: 0.2s;
- animation-delay: 0.2s;
+ -webkit-animation-delay: 0.2s;
+ animation-delay: 0.2s;
}
+
.sk-spinner-cube-grid .sk-cube:nth-child(6) {
- -webkit-animation-delay: 0.3s;
- animation-delay: 0.3s;
+ -webkit-animation-delay: 0.3s;
+ animation-delay: 0.3s;
}
+
.sk-spinner-cube-grid .sk-cube:nth-child(7) {
- -webkit-animation-delay: 0s;
- animation-delay: 0s;
+ -webkit-animation-delay: 0s;
+ animation-delay: 0s;
}
+
.sk-spinner-cube-grid .sk-cube:nth-child(8) {
- -webkit-animation-delay: 0.1s;
- animation-delay: 0.1s;
+ -webkit-animation-delay: 0.1s;
+ animation-delay: 0.1s;
}
+
.sk-spinner-cube-grid .sk-cube:nth-child(9) {
- -webkit-animation-delay: 0.2s;
- animation-delay: 0.2s;
+ -webkit-animation-delay: 0.2s;
+ animation-delay: 0.2s;
}
+
@-webkit-keyframes sk-cubeGridScaleDelay {
- 0%,
- 70%,
- 100% {
- -webkit-transform: scale3D(1, 1, 1);
- transform: scale3D(1, 1, 1);
- }
- 35% {
- -webkit-transform: scale3D(0, 0, 1);
- transform: scale3D(0, 0, 1);
- }
+ 0%,
+ 70%,
+ 100% {
+ -webkit-transform: scale3D(1, 1, 1);
+ transform: scale3D(1, 1, 1);
+ }
+ 35% {
+ -webkit-transform: scale3D(0, 0, 1);
+ transform: scale3D(0, 0, 1);
+ }
}
+
@keyframes sk-cubeGridScaleDelay {
- 0%,
- 70%,
- 100% {
- -webkit-transform: scale3D(1, 1, 1);
- transform: scale3D(1, 1, 1);
- }
- 35% {
- -webkit-transform: scale3D(0, 0, 1);
- transform: scale3D(0, 0, 1);
- }
+ 0%,
+ 70%,
+ 100% {
+ -webkit-transform: scale3D(1, 1, 1);
+ transform: scale3D(1, 1, 1);
+ }
+ 35% {
+ -webkit-transform: scale3D(0, 0, 1);
+ transform: scale3D(0, 0, 1);
+ }
}
+
/*
* Usage:
*
@@ -6313,45 +7588,49 @@ body.body-small .vote-icon {
*
*/
.sk-spinner-wordpress.sk-spinner {
- background-color: var(--primary-color);
- width: 30px;
- height: 30px;
- border-radius: 30px;
- position: relative;
- margin: 0 auto;
- -webkit-animation: sk-innerCircle 1s linear infinite;
- animation: sk-innerCircle 1s linear infinite;
+ background-color: var(--primary-color);
+ width: 30px;
+ height: 30px;
+ border-radius: 30px;
+ position: relative;
+ margin: 0 auto;
+ -webkit-animation: sk-innerCircle 1s linear infinite;
+ animation: sk-innerCircle 1s linear infinite;
}
+
.sk-spinner-wordpress .sk-inner-circle {
- display: block;
- background-color: #fff;
- width: 8px;
- height: 8px;
- position: absolute;
- border-radius: 8px;
- top: 5px;
- left: 5px;
+ display: block;
+ background-color: #fff;
+ width: 8px;
+ height: 8px;
+ position: absolute;
+ border-radius: 8px;
+ top: 5px;
+ left: 5px;
}
+
@-webkit-keyframes sk-innerCircle {
- 0% {
- -webkit-transform: rotate(0);
- transform: rotate(0);
- }
- 100% {
- -webkit-transform: rotate(360deg);
- transform: rotate(360deg);
- }
+ 0% {
+ -webkit-transform: rotate(0);
+ transform: rotate(0);
+ }
+ 100% {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg);
+ }
}
+
@keyframes sk-innerCircle {
- 0% {
- -webkit-transform: rotate(0);
- transform: rotate(0);
- }
- 100% {
- -webkit-transform: rotate(360deg);
- transform: rotate(360deg);
- }
+ 0% {
+ -webkit-transform: rotate(0);
+ transform: rotate(0);
+ }
+ 100% {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg);
+ }
}
+
/*
* Usage:
*
@@ -6372,151 +7651,178 @@ body.body-small .vote-icon {
*
*/
.sk-spinner-fading-circle.sk-spinner {
- margin: 0 auto;
- width: 22px;
- height: 22px;
- position: relative;
+ margin: 0 auto;
+ width: 22px;
+ height: 22px;
+ position: relative;
}
+
.sk-spinner-fading-circle .sk-circle {
- width: 100%;
- height: 100%;
- position: absolute;
- left: 0;
- top: 0;
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ left: 0;
+ top: 0;
}
+
.sk-spinner-fading-circle .sk-circle:before {
- content: '';
- display: block;
- margin: 0 auto;
- width: 18%;
- height: 18%;
- background-color: var(--primary-color);
- border-radius: 100%;
- -webkit-animation: sk-circleFadeDelay 1.2s infinite ease-in-out;
- animation: sk-circleFadeDelay 1.2s infinite ease-in-out;
- /* Prevent first frame from flickering when animation starts */
- -webkit-animation-fill-mode: both;
- animation-fill-mode: both;
+ content: '';
+ display: block;
+ margin: 0 auto;
+ width: 18%;
+ height: 18%;
+ background-color: var(--primary-color);
+ border-radius: 100%;
+ -webkit-animation: sk-circleFadeDelay 1.2s infinite ease-in-out;
+ animation: sk-circleFadeDelay 1.2s infinite ease-in-out;
+ /* Prevent first frame from flickering when animation starts */
+ -webkit-animation-fill-mode: both;
+ animation-fill-mode: both;
}
+
.sk-spinner-fading-circle .sk-circle2 {
- -webkit-transform: rotate(30deg);
- -ms-transform: rotate(30deg);
- transform: rotate(30deg);
+ -webkit-transform: rotate(30deg);
+ -ms-transform: rotate(30deg);
+ transform: rotate(30deg);
}
+
.sk-spinner-fading-circle .sk-circle3 {
- -webkit-transform: rotate(60deg);
- -ms-transform: rotate(60deg);
- transform: rotate(60deg);
+ -webkit-transform: rotate(60deg);
+ -ms-transform: rotate(60deg);
+ transform: rotate(60deg);
}
+
.sk-spinner-fading-circle .sk-circle4 {
- -webkit-transform: rotate(90deg);
- -ms-transform: rotate(90deg);
- transform: rotate(90deg);
+ -webkit-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ transform: rotate(90deg);
}
+
.sk-spinner-fading-circle .sk-circle5 {
- -webkit-transform: rotate(120deg);
- -ms-transform: rotate(120deg);
- transform: rotate(120deg);
+ -webkit-transform: rotate(120deg);
+ -ms-transform: rotate(120deg);
+ transform: rotate(120deg);
}
+
.sk-spinner-fading-circle .sk-circle6 {
- -webkit-transform: rotate(150deg);
- -ms-transform: rotate(150deg);
- transform: rotate(150deg);
+ -webkit-transform: rotate(150deg);
+ -ms-transform: rotate(150deg);
+ transform: rotate(150deg);
}
+
.sk-spinner-fading-circle .sk-circle7 {
- -webkit-transform: rotate(180deg);
- -ms-transform: rotate(180deg);
- transform: rotate(180deg);
+ -webkit-transform: rotate(180deg);
+ -ms-transform: rotate(180deg);
+ transform: rotate(180deg);
}
+
.sk-spinner-fading-circle .sk-circle8 {
- -webkit-transform: rotate(210deg);
- -ms-transform: rotate(210deg);
- transform: rotate(210deg);
+ -webkit-transform: rotate(210deg);
+ -ms-transform: rotate(210deg);
+ transform: rotate(210deg);
}
+
.sk-spinner-fading-circle .sk-circle9 {
- -webkit-transform: rotate(240deg);
- -ms-transform: rotate(240deg);
- transform: rotate(240deg);
+ -webkit-transform: rotate(240deg);
+ -ms-transform: rotate(240deg);
+ transform: rotate(240deg);
}
+
.sk-spinner-fading-circle .sk-circle10 {
- -webkit-transform: rotate(270deg);
- -ms-transform: rotate(270deg);
- transform: rotate(270deg);
+ -webkit-transform: rotate(270deg);
+ -ms-transform: rotate(270deg);
+ transform: rotate(270deg);
}
+
.sk-spinner-fading-circle .sk-circle11 {
- -webkit-transform: rotate(300deg);
- -ms-transform: rotate(300deg);
- transform: rotate(300deg);
+ -webkit-transform: rotate(300deg);
+ -ms-transform: rotate(300deg);
+ transform: rotate(300deg);
}
+
.sk-spinner-fading-circle .sk-circle12 {
- -webkit-transform: rotate(330deg);
- -ms-transform: rotate(330deg);
- transform: rotate(330deg);
+ -webkit-transform: rotate(330deg);
+ -ms-transform: rotate(330deg);
+ transform: rotate(330deg);
}
+
.sk-spinner-fading-circle .sk-circle2:before {
- -webkit-animation-delay: -1.1s;
- animation-delay: -1.1s;
+ -webkit-animation-delay: -1.1s;
+ animation-delay: -1.1s;
}
+
.sk-spinner-fading-circle .sk-circle3:before {
- -webkit-animation-delay: -1s;
- animation-delay: -1s;
+ -webkit-animation-delay: -1s;
+ animation-delay: -1s;
}
+
.sk-spinner-fading-circle .sk-circle4:before {
- -webkit-animation-delay: -0.9s;
- animation-delay: -0.9s;
+ -webkit-animation-delay: -0.9s;
+ animation-delay: -0.9s;
}
+
.sk-spinner-fading-circle .sk-circle5:before {
- -webkit-animation-delay: -0.8s;
- animation-delay: -0.8s;
+ -webkit-animation-delay: -0.8s;
+ animation-delay: -0.8s;
}
+
.sk-spinner-fading-circle .sk-circle6:before {
- -webkit-animation-delay: -0.7s;
- animation-delay: -0.7s;
+ -webkit-animation-delay: -0.7s;
+ animation-delay: -0.7s;
}
+
.sk-spinner-fading-circle .sk-circle7:before {
- -webkit-animation-delay: -0.6s;
- animation-delay: -0.6s;
+ -webkit-animation-delay: -0.6s;
+ animation-delay: -0.6s;
}
+
.sk-spinner-fading-circle .sk-circle8:before {
- -webkit-animation-delay: -0.5s;
- animation-delay: -0.5s;
+ -webkit-animation-delay: -0.5s;
+ animation-delay: -0.5s;
}
+
.sk-spinner-fading-circle .sk-circle9:before {
- -webkit-animation-delay: -0.4s;
- animation-delay: -0.4s;
+ -webkit-animation-delay: -0.4s;
+ animation-delay: -0.4s;
}
+
.sk-spinner-fading-circle .sk-circle10:before {
- -webkit-animation-delay: -0.3s;
- animation-delay: -0.3s;
+ -webkit-animation-delay: -0.3s;
+ animation-delay: -0.3s;
}
+
.sk-spinner-fading-circle .sk-circle11:before {
- -webkit-animation-delay: -0.2s;
- animation-delay: -0.2s;
+ -webkit-animation-delay: -0.2s;
+ animation-delay: -0.2s;
}
+
.sk-spinner-fading-circle .sk-circle12:before {
- -webkit-animation-delay: -0.1s;
- animation-delay: -0.1s;
+ -webkit-animation-delay: -0.1s;
+ animation-delay: -0.1s;
}
+
@-webkit-keyframes sk-circleFadeDelay {
- 0%,
- 39%,
- 100% {
- opacity: 0;
- }
- 40% {
- opacity: 1;
- }
+ 0%,
+ 39%,
+ 100% {
+ opacity: 0;
+ }
+ 40% {
+ opacity: 1;
+ }
}
+
@keyframes sk-circleFadeDelay {
- 0%,
- 39%,
- 100% {
- opacity: 0;
- }
- 40% {
- opacity: 1;
- }
+ 0%,
+ 39%,
+ 100% {
+ opacity: 0;
+ }
+ 40% {
+ opacity: 1;
+ }
}
+
/*
*
* INSPINIA Landing Page - Responsive Admin Theme
@@ -6528,484 +7834,582 @@ body.body-small .vote-icon {
/* PACE PLUGIN
-------------------------------------------------- */
.landing-page.pace .pace-progress {
- background: #fff;
- position: fixed;
- z-index: 2000;
- top: 0;
- left: 0;
- height: 2px;
- -webkit-transition: width 1s;
- -moz-transition: width 1s;
- -o-transition: width 1s;
- transition: width 1s;
+ background: #fff;
+ position: fixed;
+ z-index: 2000;
+ top: 0;
+ left: 0;
+ height: 2px;
+ -webkit-transition: width 1s;
+ -moz-transition: width 1s;
+ -o-transition: width 1s;
+ transition: width 1s;
}
+
.pace-inactive {
- display: none;
+ display: none;
}
+
body.landing-page {
- color: #676a6c;
- font-family: 'Open Sans', helvetica, arial, sans-serif;
- background-color: #fff;
+ color: #676a6c;
+ font-family: 'Open Sans', helvetica, arial, sans-serif;
+ background-color: #fff;
}
+
.landing-page {
- /* CUSTOMIZE THE NAVBAR
+ /* CUSTOMIZE THE NAVBAR
-------------------------------------------------- */
- /* Flip around the padding for proper display in narrow viewports */
- /* BACKGROUNDS SLIDER
+ /* Flip around the padding for proper display in narrow viewports */
+ /* BACKGROUNDS SLIDER
-------------------------------------------------- */
- /* CUSTOMIZE THE CAROUSEL
+ /* CUSTOMIZE THE CAROUSEL
-------------------------------------------------- */
- /* Carousel base class */
- /* Since positioning the image, we need to help out the caption */
- /* Declare heights because of positioning of img element */
- /* Sections
+ /* Carousel base class */
+ /* Since positioning the image, we need to help out the caption */
+ /* Declare heights because of positioning of img element */
+ /* Sections
------------------------- */
- /* Buttons - only primary custom button
+ /* Buttons - only primary custom button
------------------------- */
- /* RESPONSIVE CSS
+ /* RESPONSIVE CSS
-------------------------------------------------- */
}
+
.landing-page span.navy {
- color: var(--primary-color);
+ color: var(--primary-color);
}
+
.landing-page p.text-color {
- color: #676a6c;
+ color: #676a6c;
}
+
.landing-page a.navy-link {
- color: var(--primary-color);
- text-decoration: none;
+ color: var(--primary-color);
+ text-decoration: none;
}
+
.landing-page a.navy-link:hover {
- color: #179d82;
+ color: #179d82;
}
+
.landing-page section p {
- color: #aeaeae;
- font-size: 13px;
+ color: #aeaeae;
+ font-size: 13px;
}
+
.landing-page address {
- font-size: 13px;
+ font-size: 13px;
}
+
.landing-page h1 {
- margin-top: 10px;
- font-size: 30px;
- font-weight: 200;
+ margin-top: 10px;
+ font-size: 30px;
+ font-weight: 200;
}
+
.landing-page .navy-line {
- width: 60px;
- height: 1px;
- margin: 60px auto 0;
- border-bottom: 2px solid var(--primary-color);
+ width: 60px;
+ height: 1px;
+ margin: 60px auto 0;
+ border-bottom: 2px solid var(--primary-color);
}
+
.landing-page .navbar-wrapper {
- position: fixed;
- top: 0;
- right: 0;
- left: 0;
- z-index: 200;
+ position: fixed;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: 200;
}
+
.landing-page .navbar-wrapper > .container {
- padding-right: 0;
- padding-left: 0;
+ padding-right: 0;
+ padding-left: 0;
}
+
.landing-page .navbar-wrapper .navbar {
- padding-right: 15px;
- padding-left: 15px;
+ padding-right: 15px;
+ padding-left: 15px;
}
+
.landing-page .navbar-default.navbar-scroll {
- background-color: #fff;
- border-color: #fff;
- padding: 15px 0;
+ background-color: #fff;
+ border-color: #fff;
+ padding: 15px 0;
}
+
.landing-page .navbar-default {
- background-color: transparent;
- border-color: transparent;
- transition: all 0.3s ease-in-out 0s;
+ background-color: transparent;
+ border-color: transparent;
+ transition: all 0.3s ease-in-out 0s;
}
+
.landing-page .navbar-default .nav li a {
- color: #fff;
- font-family: 'Open Sans', helvetica, arial, sans-serif;
- font-weight: 700;
- letter-spacing: 1px;
- text-transform: uppercase;
- font-size: 14px;
+ color: #fff;
+ font-family: 'Open Sans', helvetica, arial, sans-serif;
+ font-weight: 700;
+ letter-spacing: 1px;
+ text-transform: uppercase;
+ font-size: 14px;
}
+
.landing-page .navbar-nav > li > a {
- padding-top: 25px;
- border-top: 6px solid transparent;
+ padding-top: 25px;
+ border-top: 6px solid transparent;
}
+
.landing-page .navbar-default .navbar-nav > .active > a,
.landing-page .navbar-default .navbar-nav > .active > a:hover {
- background: transparent;
- color: #fff;
- border-top: 6px solid var(--primary-color);
+ background: transparent;
+ color: #fff;
+ border-top: 6px solid var(--primary-color);
}
+
.landing-page .navbar-default .navbar-nav > li > a:hover,
.landing-page .navbar-default .navbar-nav > li > a:focus {
- color: var(--primary-color);
- background: inherit;
+ color: var(--primary-color);
+ background: inherit;
}
+
.landing-page .navbar-default .navbar-nav > .active > a:focus {
- background: transparent;
- color: #fff;
+ background: transparent;
+ color: #fff;
}
+
.landing-page .navbar-default .navbar-nav > .active > a:focus {
- background: transparent;
- color: #ffffff;
+ background: transparent;
+ color: #ffffff;
}
+
.landing-page .navbar-default.navbar-scroll .navbar-nav > .active > a:focus {
- background: transparent;
- color: inherit;
+ background: transparent;
+ color: inherit;
}
+
.landing-page .navbar-default .navbar-brand:hover,
.landing-page .navbar-default .navbar-brand:focus {
- background: #179d82;
- color: #fff;
+ background: #179d82;
+ color: #fff;
}
+
.landing-page .navbar-default .navbar-brand {
- color: #fff;
- height: auto;
- display: block;
- font-size: 14px;
- background: var(--primary-color);
- padding: 15px 20px 15px 20px;
- border-radius: 0 0 5px 5px;
- font-weight: 700;
- transition: all 0.3s ease-in-out 0s;
+ color: #fff;
+ height: auto;
+ display: block;
+ font-size: 14px;
+ background: var(--primary-color);
+ padding: 15px 20px 15px 20px;
+ border-radius: 0 0 5px 5px;
+ font-weight: 700;
+ transition: all 0.3s ease-in-out 0s;
}
+
.landing-page .navbar-scroll.navbar-default .nav li a {
- color: #676a6c;
+ color: #676a6c;
}
+
.landing-page .navbar-scroll.navbar-default .nav li a:hover {
- color: var(--primary-color);
+ color: var(--primary-color);
}
+
.landing-page .navbar-wrapper .navbar.navbar-scroll {
- padding-top: 0;
- padding-bottom: 0;
- border-bottom: 1px solid #e7eaec;
- border-radius: 0;
+ padding-top: 0;
+ padding-bottom: 0;
+ border-bottom: 1px solid #e7eaec;
+ border-radius: 0;
}
+
.landing-page .nav > li.active {
- border: none;
- background: inherit;
+ border: none;
+ background: inherit;
}
+
.landing-page .nav > li > a {
- padding: 25px 10px 15px 10px;
+ padding: 25px 10px 15px 10px;
}
+
.landing-page .navbar-scroll .navbar-nav > li > a {
- padding: 20px 10px;
+ padding: 20px 10px;
}
+
.landing-page .navbar-default .navbar-nav > .active > a,
.landing-page .navbar-default .navbar-nav > .active > a:hover {
- border-top: 6px solid var(--primary-color);
+ border-top: 6px solid var(--primary-color);
}
+
.landing-page .navbar-fixed-top {
- border: none !important;
+ border: none !important;
}
+
.landing-page .navbar-fixed-top.navbar-scroll {
- border-bottom: 1px solid #e7eaec !important;
+ border-bottom: 1px solid #e7eaec !important;
}
+
.landing-page .navbar.navbar-scroll .navbar-brand {
- margin-top: 15px;
- border-radius: 5px;
- font-size: 12px;
- padding: 10px;
- height: auto;
+ margin-top: 15px;
+ border-radius: 5px;
+ font-size: 12px;
+ padding: 10px;
+ height: auto;
}
+
.landing-page .header-back {
- height: 470px;
- width: 100%;
+ height: 470px;
+ width: 100%;
}
+
.landing-page .header-back.one {
- background: url('../img/landing/header_one.jpg') 50% 0 no-repeat;
+ background: url('../img/landing/header_one.jpg') 50% 0 no-repeat;
}
+
.landing-page .header-back.two {
- background: url('../img/landing/header_two.jpg') 50% 0 no-repeat;
+ background: url('../img/landing/header_two.jpg') 50% 0 no-repeat;
}
+
.landing-page .carousel {
- height: 470px;
+ height: 470px;
}
+
.landing-page .carousel-caption {
- z-index: 10;
+ z-index: 10;
}
+
.landing-page .carousel .item {
- height: 470px;
- background-color: #777;
+ height: 470px;
+ background-color: #777;
}
+
.landing-page .carousel-inner > .item > img {
- position: absolute;
- top: 0;
- left: 0;
- min-width: 100%;
- height: 470px;
+ position: absolute;
+ top: 0;
+ left: 0;
+ min-width: 100%;
+ height: 470px;
}
+
.landing-page .carousel-fade .carousel-inner .item {
- opacity: 0;
- -webkit-transition-property: opacity;
- transition-property: opacity;
+ opacity: 0;
+ -webkit-transition-property: opacity;
+ transition-property: opacity;
}
+
.landing-page .carousel-fade .carousel-inner .active {
- opacity: 1;
+ opacity: 1;
}
+
.landing-page .carousel-fade .carousel-inner .active.left,
.landing-page .carousel-fade .carousel-inner .active.right {
- left: 0;
- opacity: 0;
- z-index: 1;
+ left: 0;
+ opacity: 0;
+ z-index: 1;
}
+
.landing-page .carousel-fade .carousel-inner .next.left,
.landing-page .carousel-fade .carousel-inner .prev.right {
- opacity: 1;
+ opacity: 1;
}
+
.landing-page .carousel-fade .carousel-control {
- z-index: 2;
+ z-index: 2;
}
+
.landing-page .carousel-control.left,
.landing-page .carousel-control.right {
- background: none;
+ background: none;
}
+
.landing-page .carousel-control {
- width: 6%;
+ width: 6%;
}
+
.landing-page .carousel-inner .container {
- position: relative;
+ position: relative;
}
+
.landing-page .carousel-inner {
- overflow: visible;
+ overflow: visible;
}
+
.landing-page .carousel-caption {
- position: absolute;
- top: 100px;
- left: 0;
- bottom: auto;
- right: auto;
- text-align: left;
+ position: absolute;
+ top: 100px;
+ left: 0;
+ bottom: auto;
+ right: auto;
+ text-align: left;
}
+
.landing-page .carousel-caption {
- position: absolute;
- top: 100px;
- left: 0;
- bottom: auto;
- right: auto;
- text-align: left;
+ position: absolute;
+ top: 100px;
+ left: 0;
+ bottom: auto;
+ right: auto;
+ text-align: left;
}
+
.landing-page .carousel-caption.blank {
- top: 140px;
+ top: 140px;
}
+
.landing-page .carousel-image {
- position: absolute;
- right: 10px;
- top: 150px;
+ position: absolute;
+ right: 10px;
+ top: 150px;
}
+
.landing-page .carousel-indicators {
- padding-right: 60px;
+ padding-right: 60px;
}
+
.landing-page .carousel-caption h1 {
- font-weight: 700;
- font-size: 38px;
- text-transform: uppercase;
- text-shadow: none;
- letter-spacing: -1.5px;
+ font-weight: 700;
+ font-size: 38px;
+ text-transform: uppercase;
+ text-shadow: none;
+ letter-spacing: -1.5px;
}
+
.landing-page .carousel-caption p {
- font-weight: 700;
- text-transform: uppercase;
- text-shadow: none;
+ font-weight: 700;
+ text-transform: uppercase;
+ text-shadow: none;
}
+
.landing-page .caption-link {
- color: #fff;
- margin-left: 10px;
- text-transform: capitalize;
- font-weight: 400;
+ color: #fff;
+ margin-left: 10px;
+ text-transform: capitalize;
+ font-weight: 400;
}
+
.landing-page .caption-link:hover {
- text-decoration: none;
- color: inherit;
+ text-decoration: none;
+ color: inherit;
}
+
.landing-page .services {
- padding-top: 60px;
+ padding-top: 60px;
}
+
.landing-page .services h2 {
- font-size: 20px;
- letter-spacing: -1px;
- font-weight: 600;
- text-transform: uppercase;
+ font-size: 20px;
+ letter-spacing: -1px;
+ font-weight: 600;
+ text-transform: uppercase;
}
+
.landing-page .features-block {
- margin-top: 40px;
+ margin-top: 40px;
}
+
.landing-page .features-text {
- margin-top: 40px;
+ margin-top: 40px;
}
+
.landing-page .features small {
- color: var(--primary-color);
+ color: var(--primary-color);
}
+
.landing-page .features h2 {
- font-size: 18px;
- margin-top: 5px;
+ font-size: 18px;
+ margin-top: 5px;
}
+
.landing-page .features-text-alone {
- margin: 40px 0;
+ margin: 40px 0;
}
+
.landing-page .features-text-alone h1 {
- font-weight: 200;
+ font-weight: 200;
}
+
.landing-page .features-icon {
- color: var(--primary-color);
- font-size: 40px;
+ color: var(--primary-color);
+ font-size: 40px;
}
+
.landing-page .navy-section {
- margin-top: 60px;
- background: var(--primary-color);
- color: #fff;
- padding: 20px 0;
+ margin-top: 60px;
+ background: var(--primary-color);
+ color: #fff;
+ padding: 20px 0;
}
+
.landing-page .gray-section {
- background: #f4f4f4;
- margin-top: 60px;
+ background: #f4f4f4;
+ margin-top: 60px;
}
+
.landing-page .team-member {
- text-align: center;
+ text-align: center;
}
+
.landing-page .team-member img {
- margin: auto;
+ margin: auto;
}
+
.landing-page .social-icon a {
- background: var(--primary-color);
- color: #fff;
- padding: 4px 8px;
- height: 28px;
- width: 28px;
- display: block;
- border-radius: 50px;
+ background: var(--primary-color);
+ color: #fff;
+ padding: 4px 8px;
+ height: 28px;
+ width: 28px;
+ display: block;
+ border-radius: 50px;
}
+
.landing-page .social-icon a:hover {
- background: #179d82;
+ background: #179d82;
}
+
.landing-page .img-small {
- height: 88px;
- width: 88px;
+ height: 88px;
+ width: 88px;
}
+
.landing-page .pricing-plan {
- margin: 20px 30px 0 30px;
- border-radius: 4px;
+ margin: 20px 30px 0 30px;
+ border-radius: 4px;
}
+
.landing-page .pricing-plan.selected {
- transform: scale(1.1);
- background: #f4f4f4;
+ transform: scale(1.1);
+ background: #f4f4f4;
}
+
.landing-page .pricing-plan li {
- padding: 10px 16px;
- border-top: 1px solid #e7eaec;
- text-align: center;
- color: #aeaeae;
+ padding: 10px 16px;
+ border-top: 1px solid #e7eaec;
+ text-align: center;
+ color: #aeaeae;
}
+
.landing-page .pricing-plan .pricing-price span {
- font-weight: 700;
- color: var(--primary-color);
+ font-weight: 700;
+ color: var(--primary-color);
}
+
.landing-page li.pricing-desc {
- font-size: 13px;
- border-top: none;
- padding: 20px 16px;
+ font-size: 13px;
+ border-top: none;
+ padding: 20px 16px;
}
+
.landing-page li.pricing-title {
- background: var(--primary-color);
- color: #fff;
- padding: 10px;
- border-radius: 4px 4px 0 0;
- font-size: 22px;
- font-weight: 600;
+ background: var(--primary-color);
+ color: #fff;
+ padding: 10px;
+ border-radius: 4px 4px 0 0;
+ font-size: 22px;
+ font-weight: 600;
}
+
.landing-page .testimonials {
- padding-top: 80px;
- padding-bottom: 90px;
- background-color: var(--primary-color);
- background-image: url('../img/landing/avatar_all.png');
+ padding-top: 80px;
+ padding-bottom: 90px;
+ background-color: var(--primary-color);
+ background-image: url('../img/landing/avatar_all.png');
}
+
.landing-page .big-icon {
- font-size: 56px !important;
+ font-size: 56px !important;
}
+
.landing-page .features .big-icon {
- color: var(--primary-color) !important;
+ color: var(--primary-color) !important;
}
+
.landing-page .contact {
- background-image: url('../img/landing/word_map.png');
- background-position: 50% 50%;
- background-repeat: no-repeat;
- margin-top: 60px;
+ background-image: url('../img/landing/word_map.png');
+ background-position: 50% 50%;
+ background-repeat: no-repeat;
+ margin-top: 60px;
}
+
.landing-page section.timeline {
- padding-bottom: 30px;
+ padding-bottom: 30px;
}
+
.landing-page section.comments {
- padding-bottom: 80px;
+ padding-bottom: 80px;
}
+
.landing-page .comments-avatar {
- margin-top: 25px;
- margin-left: 22px;
+ margin-top: 25px;
+ margin-left: 22px;
}
+
.landing-page .comments-avatar .commens-name {
- font-weight: 600;
- font-size: 14px;
+ font-weight: 600;
+ font-size: 14px;
}
+
.landing-page .comments-avatar img {
- width: 42px;
- height: 42px;
- border-radius: 50%;
- margin-right: 10px;
+ width: 42px;
+ height: 42px;
+ border-radius: 50%;
+ margin-right: 10px;
}
+
.landing-page .bubble {
- position: relative;
- height: 120px;
- padding: 20px;
- background: #FFFFFF;
- -webkit-border-radius: 10px;
- -moz-border-radius: 10px;
- border-radius: 10px;
- font-style: italic;
- font-size: 14px;
+ position: relative;
+ height: 120px;
+ padding: 20px;
+ background: #FFFFFF;
+ -webkit-border-radius: 10px;
+ -moz-border-radius: 10px;
+ border-radius: 10px;
+ font-style: italic;
+ font-size: 14px;
}
+
.landing-page .bubble:after {
- content: '';
- position: absolute;
- border-style: solid;
- border-width: 15px 14px 0;
- border-color: #FFFFFF transparent;
- display: block;
- width: 0;
- z-index: 1;
- bottom: -15px;
- left: 30px;
+ content: '';
+ position: absolute;
+ border-style: solid;
+ border-width: 15px 14px 0;
+ border-color: #FFFFFF transparent;
+ display: block;
+ width: 0;
+ z-index: 1;
+ bottom: -15px;
+ left: 30px;
}
+
.landing-page .btn-primary.btn-outline:hover,
.landing-page .btn-success.btn-outline:hover,
.landing-page .btn-info.btn-outline:hover,
.landing-page .btn-warning.btn-outline:hover,
.landing-page .btn-danger.btn-outline:hover {
- color: #fff;
+ color: #fff;
}
+
.landing-page .btn-primary {
- background-color: var(--primary-color);
- border-color: var(--primary-color);
- color: #FFFFFF;
- font-size: 14px;
- padding: 10px 20px;
- font-weight: 600;
+ background-color: var(--primary-color);
+ border-color: var(--primary-color);
+ color: #FFFFFF;
+ font-size: 14px;
+ padding: 10px 20px;
+ font-weight: 600;
}
+
.landing-page .btn-primary:hover,
.landing-page .btn-primary:focus,
.landing-page .btn-primary:active,
.landing-page .btn-primary.active,
.landing-page .open .dropdown-toggle.btn-primary {
- background-color: #179d82;
- border-color: #179d82;
- color: #FFFFFF;
+ background-color: #179d82;
+ border-color: #179d82;
+ color: #FFFFFF;
}
+
.landing-page .btn-primary:active,
.landing-page .btn-primary.active,
.landing-page .open .dropdown-toggle.btn-primary {
- background-image: none;
+ background-image: none;
}
+
.landing-page .btn-primary.disabled,
.landing-page .btn-primary.disabled:hover,
.landing-page .btn-primary.disabled:focus,
@@ -7021,339 +8425,425 @@ body.landing-page {
.landing-page fieldset[disabled] .btn-primary:focus,
.landing-page fieldset[disabled] .btn-primary:active,
.landing-page fieldset[disabled] .btn-primary.active {
- background-color: #1dc5a3;
- border-color: #1dc5a3;
+ background-color: #1dc5a3;
+ border-color: #1dc5a3;
}
+
@media (min-width: 768px) {
- .landing-page {
- /* Navbar positioning foo */
- /* The navbar becomes detached from the top, so we round the corners */
- /* Bump up size of carousel content */
- }
- .landing-page .navbar-wrapper {
- margin-top: 20px;
- }
- .landing-page .navbar-wrapper .container {
- padding-right: 15px;
- padding-left: 15px;
- }
- .landing-page .navbar-wrapper .navbar {
- padding-right: 0;
- padding-left: 0;
- }
- .landing-page .navbar-wrapper .navbar {
- border-radius: 4px;
- }
- .landing-page .carousel-caption p {
- margin-bottom: 20px;
- font-size: 14px;
- line-height: 1.4;
- }
- .landing-page .featurette-heading {
- font-size: 50px;
- }
+ .landing-page {
+ /* Navbar positioning foo */
+ /* The navbar becomes detached from the top, so we round the corners */
+ /* Bump up size of carousel content */
+ }
+
+ .landing-page .navbar-wrapper {
+ margin-top: 20px;
+ }
+
+ .landing-page .navbar-wrapper .container {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+
+ .landing-page .navbar-wrapper .navbar {
+ padding-right: 0;
+ padding-left: 0;
+ }
+
+ .landing-page .navbar-wrapper .navbar {
+ border-radius: 4px;
+ }
+
+ .landing-page .carousel-caption p {
+ margin-bottom: 20px;
+ font-size: 14px;
+ line-height: 1.4;
+ }
+
+ .landing-page .featurette-heading {
+ font-size: 50px;
+ }
}
+
@media (max-width: 992px) {
- .landing-page .carousel-image {
- display: none;
- }
+ .landing-page .carousel-image {
+ display: none;
+ }
}
+
@media (max-width: 768px) {
- .landing-page .carousel-caption,
- .landing-page .carousel-caption.blank {
- left: 5%;
- top: 80px;
- }
- .landing-page .carousel-caption h1 {
- font-size: 28px;
- }
- .landing-page .navbar.navbar-scroll .navbar-brand {
- margin-top: 6px;
- }
- .landing-page .navbar-default {
- background-color: #fff;
- border-color: #fff;
- padding: 15px 0;
- }
- .landing-page .navbar-default .navbar-nav > .active > a:focus {
- background: transparent;
- color: inherit;
- }
- .landing-page .navbar-default .nav li a {
- color: #676a6c;
- }
- .landing-page .navbar-default .nav li a:hover {
- color: var(--primary-color);
- }
- .landing-page .navbar-wrapper .navbar {
- padding-top: 0;
- padding-bottom: 5px;
- border-bottom: 1px solid #e7eaec;
- border-radius: 0;
- }
- .landing-page .nav > li > a {
- padding: 25px 10px 15px 10px;
- }
- .landing-page .navbar-nav > li > a {
- padding: 20px 10px;
- }
- .landing-page .navbar .navbar-brand {
- margin-top: 6px;
- border-radius: 5px;
- font-size: 12px;
- padding: 10px;
- height: auto;
- }
- .landing-page .navbar-wrapper .navbar {
- padding-left: 15px;
- padding-right: 5px;
- }
- .landing-page .navbar-default .navbar-nav > .active > a,
- .landing-page .navbar-default .navbar-nav > .active > a:hover {
- color: inherit;
- }
- .landing-page .carousel-control {
- display: none;
- }
+ .landing-page .carousel-caption,
+ .landing-page .carousel-caption.blank {
+ left: 5%;
+ top: 80px;
+ }
+
+ .landing-page .carousel-caption h1 {
+ font-size: 28px;
+ }
+
+ .landing-page .navbar.navbar-scroll .navbar-brand {
+ margin-top: 6px;
+ }
+
+ .landing-page .navbar-default {
+ background-color: #fff;
+ border-color: #fff;
+ padding: 15px 0;
+ }
+
+ .landing-page .navbar-default .navbar-nav > .active > a:focus {
+ background: transparent;
+ color: inherit;
+ }
+
+ .landing-page .navbar-default .nav li a {
+ color: #676a6c;
+ }
+
+ .landing-page .navbar-default .nav li a:hover {
+ color: var(--primary-color);
+ }
+
+ .landing-page .navbar-wrapper .navbar {
+ padding-top: 0;
+ padding-bottom: 5px;
+ border-bottom: 1px solid #e7eaec;
+ border-radius: 0;
+ }
+
+ .landing-page .nav > li > a {
+ padding: 25px 10px 15px 10px;
+ }
+
+ .landing-page .navbar-nav > li > a {
+ padding: 20px 10px;
+ }
+
+ .landing-page .navbar .navbar-brand {
+ margin-top: 6px;
+ border-radius: 5px;
+ font-size: 12px;
+ padding: 10px;
+ height: auto;
+ }
+
+ .landing-page .navbar-wrapper .navbar {
+ padding-left: 15px;
+ padding-right: 5px;
+ }
+
+ .landing-page .navbar-default .navbar-nav > .active > a,
+ .landing-page .navbar-default .navbar-nav > .active > a:hover {
+ color: inherit;
+ }
+
+ .landing-page .carousel-control {
+ display: none;
+ }
}
+
@media (min-width: 992px) {
- .landing-page .featurette-heading {
- margin-top: 120px;
- }
+ .landing-page .featurette-heading {
+ margin-top: 120px;
+ }
}
+
@media (max-width: 768px) {
- .landing-page .navbar .navbar-header {
- display: block;
- float: none;
- }
- .landing-page .navbar .navbar-header .navbar-toggle {
- background-color: #ffffff;
- padding: 9px 10px;
- border: none;
- }
+ .landing-page .navbar .navbar-header {
+ display: block;
+ float: none;
+ }
+
+ .landing-page .navbar .navbar-header .navbar-toggle {
+ background-color: #ffffff;
+ padding: 9px 10px;
+ border: none;
+ }
}
+
body.rtls {
- /* Theme config */
+ /* Theme config */
}
+
body.rtls #page-wrapper {
- margin: 0 220px 0 0;
+ margin: 0 220px 0 0;
}
+
body.rtls .nav-second-level li a {
- padding: 7px 35px 7px 10px;
+ padding: 7px 35px 7px 10px;
}
+
body.rtls .ibox-title h5 {
- float: right;
+ float: right;
}
+
body.rtls .pull-right {
- float: left !important;
+ float: left !important;
}
+
body.rtls .pull-left {
- float: right !important;
+ float: right !important;
}
+
body.rtls .ibox-tools {
- float: left;
+ float: left;
}
+
body.rtls .stat-percent {
- float: left;
+ float: left;
}
+
body.rtls .navbar-right {
- float: left !important;
+ float: left !important;
}
+
body.rtls .navbar-top-links li:last-child {
- margin-left: 40px;
- margin-right: 0;
+ margin-left: 40px;
+ margin-right: 0;
}
+
body.rtls .minimalize-styl-2 {
- float: right;
- margin: 14px 20px 5px 5px;
+ float: right;
+ margin: 14px 20px 5px 5px;
}
+
body.rtls .feed-element > .pull-left {
- margin-left: 10px;
- margin-right: 0;
+ margin-left: 10px;
+ margin-right: 0;
}
+
body.rtls .timeline-item .date {
- text-align: left;
+ text-align: left;
}
+
body.rtls .timeline-item .date i {
- left: 0;
- right: auto;
+ left: 0;
+ right: auto;
}
+
body.rtls .timeline-item .content {
- border-right: 1px solid #e7eaec;
- border-left: none;
+ border-right: 1px solid #e7eaec;
+ border-left: none;
}
+
body.rtls .theme-config {
- left: 0;
- right: auto;
+ left: 0;
+ right: auto;
}
+
body.rtls .spin-icon {
- border-radius: 0 20px 20px 0;
+ border-radius: 0 20px 20px 0;
}
+
body.rtls .toast-close-button {
- float: left;
+ float: left;
}
+
body.rtls #toast-container > .toast:before {
- margin: auto -1.5em auto 0.5em;
+ margin: auto -1.5em auto 0.5em;
}
+
body.rtls #toast-container > div {
- padding: 15px 50px 15px 15px;
+ padding: 15px 50px 15px 15px;
}
+
body.rtls .center-orientation .vertical-timeline-icon i {
- margin-left: 0;
- margin-right: -12px;
+ margin-left: 0;
+ margin-right: -12px;
}
+
body.rtls .vertical-timeline-icon i {
- right: 50%;
- left: auto;
- margin-left: auto;
- margin-right: -12px;
+ right: 50%;
+ left: auto;
+ margin-left: auto;
+ margin-right: -12px;
}
+
body.rtls .file-box {
- float: right;
+ float: right;
}
+
body.rtls ul.notes li {
- float: right;
+ float: right;
}
+
body.rtls .chat-users,
body.rtls .chat-statistic {
- margin-right: -30px;
- margin-left: auto;
+ margin-right: -30px;
+ margin-left: auto;
}
+
body.rtls .dropdown-menu > li > a {
- text-align: right;
+ text-align: right;
}
+
body.rtls .b-r {
- border-left: 1px solid #e7eaec;
- border-right: none;
+ border-left: 1px solid #e7eaec;
+ border-right: none;
}
+
body.rtls .dd-list .dd-list {
- padding-right: 30px;
- padding-left: 0;
+ padding-right: 30px;
+ padding-left: 0;
}
+
body.rtls .dd-item > button {
- float: right;
+ float: right;
}
+
body.rtls .theme-config-box {
- margin-left: -220px;
- margin-right: 0;
-}
-body.rtls .theme-config-box.show {
- margin-left: 0;
- margin-right: 0;
-}
-body.rtls .spin-icon {
- right: 0;
- left: auto;
-}
-body.rtls .skin-setttings {
- margin-right: 40px;
- margin-left: 0;
-}
-body.rtls .skin-setttings {
- direction: ltr;
-}
-body.rtls .footer.fixed {
- margin-right: 220px;
- margin-left: 0;
-}
-@media (max-width: 992px) {
- body.rtls .chat-users,
- body.rtls .chat-statistic {
+ margin-left: -220px;
margin-right: 0;
- }
}
+
+body.rtls .theme-config-box.show {
+ margin-left: 0;
+ margin-right: 0;
+}
+
+body.rtls .spin-icon {
+ right: 0;
+ left: auto;
+}
+
+body.rtls .skin-setttings {
+ margin-right: 40px;
+ margin-left: 0;
+}
+
+body.rtls .skin-setttings {
+ direction: ltr;
+}
+
+body.rtls .footer.fixed {
+ margin-right: 220px;
+ margin-left: 0;
+}
+
+@media (max-width: 992px) {
+ body.rtls .chat-users,
+ body.rtls .chat-statistic {
+ margin-right: 0;
+ }
+}
+
body.rtls.mini-navbar .footer.fixed,
body.body-small.mini-navbar .footer.fixed {
- margin: 0 70px 0 0;
+ margin: 0 70px 0 0;
}
+
body.rtls.mini-navbar.fixed-sidebar .footer.fixed,
body.body-small.mini-navbar .footer.fixed {
- margin: 0 0 0 0;
+ margin: 0 0 0 0;
}
+
body.rtls.top-navigation .navbar-toggle {
- float: right;
- margin-left: 15px;
- margin-right: 15px;
+ float: right;
+ margin-left: 15px;
+ margin-right: 15px;
}
+
.body-small.rtls.top-navigation .navbar-header {
- float: none;
+ float: none;
}
+
body.rtls.top-navigation #page-wrapper {
- margin: 0;
+ margin: 0;
}
+
body.rtls.mini-navbar #page-wrapper {
- margin: 0 70px 0 0;
+ margin: 0 70px 0 0;
}
+
body.rtls.mini-navbar.fixed-sidebar #page-wrapper {
- margin: 0 0 0 0;
+ margin: 0 0 0 0;
}
+
body.rtls.body-small.fixed-sidebar.mini-navbar #page-wrapper {
- margin: 0 220px 0 0;
+ margin: 0 220px 0 0;
}
+
body.rtls.body-small.fixed-sidebar.mini-navbar .navbar-static-side {
- width: 220px;
+ width: 220px;
}
+
.body-small.rtls .navbar-fixed-top {
- margin-right: 0;
+ margin-right: 0;
}
+
.body-small.rtls .navbar-header {
- float: right;
+ float: right;
}
+
body.rtls .navbar-top-links li:last-child {
- margin-left: 20px;
+ margin-left: 20px;
}
+
body.rtls .top-navigation #page-wrapper,
body.rtls.mini-navbar .top-navigation #page-wrapper,
body.rtls.mini-navbar.top-navigation #page-wrapper {
- margin: 0;
+ margin: 0;
}
+
body.rtls .top-navigation .footer.fixed,
body.rtls.top-navigation .footer.fixed {
- margin: 0;
+ margin: 0;
}
+
@media (max-width: 768px) {
- body.rtls .navbar-top-links li:last-child {
- margin-left: 20px;
- }
- .body-small.rtls #page-wrapper {
- position: inherit;
- margin: 0 0 0 0;
- min-height: 1000px;
- }
- .body-small.rtls .navbar-static-side {
- display: none;
- z-index: 2001;
- position: absolute;
- width: 70px;
- }
- .body-small.rtls.mini-navbar .navbar-static-side {
- display: block;
- }
- .rtls.fixed-sidebar.body-small .navbar-static-side {
- display: none;
- z-index: 2001;
- position: fixed;
- width: 220px;
- }
- .rtls.fixed-sidebar.body-small.mini-navbar .navbar-static-side {
- display: block;
- }
+ body.rtls .navbar-top-links li:last-child {
+ margin-left: 20px;
+ }
+
+ .body-small.rtls #page-wrapper {
+ position: inherit;
+ margin: 0 0 0 0;
+ min-height: 1000px;
+ }
+
+ .body-small.rtls .navbar-static-side {
+ display: none;
+ z-index: 2001;
+ position: absolute;
+ width: 70px;
+ }
+
+ .body-small.rtls.mini-navbar .navbar-static-side {
+ display: block;
+ }
+
+ .rtls.fixed-sidebar.body-small .navbar-static-side {
+ display: none;
+ z-index: 2001;
+ position: fixed;
+ width: 220px;
+ }
+
+ .rtls.fixed-sidebar.body-small.mini-navbar .navbar-static-side {
+ display: block;
+ }
}
+
.rtls .ltr-support {
- direction: ltr;
+ direction: ltr;
}
+
.rtls.mini-navbar .nav-second-level,
.rtls.mini-navbar li.active .nav-second-level {
- left: auto;
- right: 70px;
+ left: auto;
+ right: 70px;
}
+
.rtls #right-sidebar {
- left: -260px;
- right: auto;
+ left: -260px;
+ right: auto;
}
+
.rtls #right-sidebar.sidebar-open {
- left: 0;
+ left: 0;
}
+
/*
*
* This is style for skin config
@@ -7361,96 +8851,116 @@ body.rtls.top-navigation .footer.fixed {
*
*/
.theme-config {
- position: absolute;
- top: 90px;
- right: 0;
- overflow: hidden;
+ position: absolute;
+ top: 90px;
+ right: 0;
+ overflow: hidden;
}
+
.theme-config-box {
- margin-right: -220px;
- position: relative;
- z-index: 2000;
- transition-duration: 0.8s;
+ margin-right: -220px;
+ position: relative;
+ z-index: 2000;
+ transition-duration: 0.8s;
}
+
.theme-config-box.show {
- margin-right: 0;
+ margin-right: 0;
}
+
.spin-icon {
- background: var(--primary-color);
- position: absolute;
- padding: 7px 10px 7px 13px;
- border-radius: 20px 0 0 20px;
- font-size: 16px;
- top: 0;
- left: 0;
- width: 40px;
- color: #fff;
- cursor: pointer;
+ background: var(--primary-color);
+ position: absolute;
+ padding: 7px 10px 7px 13px;
+ border-radius: 20px 0 0 20px;
+ font-size: 16px;
+ top: 0;
+ left: 0;
+ width: 40px;
+ color: #fff;
+ cursor: pointer;
}
+
.skin-setttings {
- width: 220px;
- margin-left: 40px;
- background: #f3f3f4;
+ width: 220px;
+ margin-left: 40px;
+ background: #f3f3f4;
}
+
.skin-setttings .title {
- background: #efefef;
- text-align: center;
- text-transform: uppercase;
- font-weight: 600;
- display: block;
- padding: 10px 15px;
- font-size: 12px;
+ background: #efefef;
+ text-align: center;
+ text-transform: uppercase;
+ font-weight: 600;
+ display: block;
+ padding: 10px 15px;
+ font-size: 12px;
}
+
.setings-item {
- padding: 10px 30px;
+ padding: 10px 30px;
}
+
.setings-item.skin {
- text-align: center;
+ text-align: center;
}
+
.setings-item .switch {
- float: right;
+ float: right;
}
+
.skin-name a {
- text-transform: uppercase;
+ text-transform: uppercase;
}
+
.setings-item a {
- color: #fff;
+ color: #fff;
}
+
.default-skin,
.blue-skin,
.ultra-skin,
.yellow-skin {
- text-align: center;
+ text-align: center;
}
+
.default-skin {
- font-weight: 600;
- background: #283A49;
+ font-weight: 600;
+ background: #283A49;
}
+
.default-skin:hover {
- background: #1e2e3d;
+ background: #1e2e3d;
}
+
.blue-skin {
- font-weight: 600;
- background: url("patterns/header-profile-skin-1.png") repeat scroll 0 0;
+ font-weight: 600;
+ background: url("patterns/header-profile-skin-1.png") repeat scroll 0 0;
}
+
.blue-skin:hover {
- background: #0d8ddb;
+ background: #0d8ddb;
}
+
.yellow-skin {
- font-weight: 600;
- background: url("patterns/header-profile-skin-3.png") repeat scroll 0 100%;
+ font-weight: 600;
+ background: url("patterns/header-profile-skin-3.png") repeat scroll 0 100%;
}
+
.yellow-skin:hover {
- background: #ce8735;
+ background: #ce8735;
}
+
.ultra-skin {
- padding: 20px 10px;
- font-weight: 600;
- background: url("patterns/3.png") repeat scroll 0 0;
+ padding: 20px 10px;
+ font-weight: 600;
+ background: url("patterns/3.png") repeat scroll 0 0;
}
+
.ultra-skin:hover {
- background: url("patterns/4.png") repeat scroll 0 0;
+ background: url("patterns/4.png") repeat scroll 0 0;
}
+
/*
*
* SKIN 1 - INSPINIA - Responsive Admin Theme
@@ -7458,102 +8968,131 @@ body.rtls.top-navigation .footer.fixed {
*
*/
.skin-1 .minimalize-styl-2 {
- margin: 14px 5px 5px 30px;
+ margin: 14px 5px 5px 30px;
}
+
.skin-1 .navbar-top-links li:last-child {
- margin-right: 30px;
+ margin-right: 30px;
}
+
.skin-1.fixed-nav .minimalize-styl-2 {
- margin: 14px 5px 5px 15px;
+ margin: 14px 5px 5px 15px;
}
+
.skin-1 .spin-icon {
- background: #0e9aef !important;
+ background: #0e9aef !important;
}
+
.skin-1 .nav-header {
- background: #0e9aef;
- background: url('patterns/header-profile-skin-1.png');
+ background: #0e9aef;
+ background: url('patterns/header-profile-skin-1.png');
}
+
.skin-1.mini-navbar .nav-second-level {
- background: #3e495f;
+ background: #3e495f;
}
+
.skin-1 .breadcrumb {
- background: transparent;
+ background: transparent;
}
+
.skin-1 .page-heading {
- border: none;
+ border: none;
}
+
.skin-1 .nav > li.active {
- background: #3a4459;
+ background: #3a4459;
}
+
.skin-1 .nav > li > a {
- color: #9ea6b9;
+ color: #9ea6b9;
}
+
.skin-1 .nav > li.active > a {
- color: #fff;
+ color: #fff;
}
+
.skin-1 .navbar-minimalize {
- background: #0e9aef;
- border-color: #0e9aef;
+ background: #0e9aef;
+ border-color: #0e9aef;
}
+
body.skin-1 {
- background: #3e495f;
+ background: #3e495f;
}
+
.skin-1 .navbar-static-top {
- background: #ffffff;
+ background: #ffffff;
}
+
.skin-1 .dashboard-header {
- background: transparent;
- border-bottom: none !important;
- border-top: none;
- padding: 20px 30px 10px 30px;
+ background: transparent;
+ border-bottom: none !important;
+ border-top: none;
+ padding: 20px 30px 10px 30px;
}
+
.fixed-nav.skin-1 .navbar-fixed-top {
- background: #fff;
+ background: #fff;
}
+
.skin-1 .wrapper-content {
- padding: 30px 15px;
+ padding: 30px 15px;
}
+
.skin-1 #page-wrapper {
- background: #f4f6fa;
+ background: #f4f6fa;
}
+
.skin-1 .ibox-title,
.skin-1 .ibox-content {
- border-width: 1px;
+ border-width: 1px;
}
+
.skin-1 .ibox-content:last-child {
- border-style: solid solid solid solid;
+ border-style: solid solid solid solid;
}
+
.skin-1 .nav > li.active {
- border: none;
+ border: none;
}
+
.skin-1 .nav-header {
- padding: 35px 25px 25px 25px;
+ padding: 35px 25px 25px 25px;
}
+
.skin-1 .nav-header a.dropdown-toggle {
- color: #fff;
- margin-top: 10px;
+ color: #fff;
+ margin-top: 10px;
}
+
.skin-1 .nav-header a.dropdown-toggle .text-muted {
- color: #fff;
- opacity: 0.8;
+ color: #fff;
+ opacity: 0.8;
}
+
.skin-1 .profile-element {
- text-align: center;
+ text-align: center;
}
+
.skin-1 .img-circle {
- border-radius: 5px;
+ border-radius: 5px;
}
+
.skin-1 .navbar-default .nav > li > a:hover,
.skin-1 .navbar-default .nav > li > a:focus {
- background: #3a4459;
- color: #fff;
+ background: #3a4459;
+ color: #fff;
}
+
.skin-1 .nav.nav-tabs > li.active > a {
- color: #555;
+ color: #555;
}
+
.skin-1 .nav.nav-tabs > li.active {
- background: transparent;
+ background: transparent;
}
+
/*
*
* SKIN 2 - INSPINIA - Responsive Admin Theme
@@ -7561,146 +9100,185 @@ body.skin-1 {
*
*/
body.skin-2 {
- color: #565758 !important;
+ color: #565758 !important;
}
+
.skin-2 .minimalize-styl-2 {
- margin: 14px 5px 5px 25px;
+ margin: 14px 5px 5px 25px;
}
+
.skin-2 .navbar-top-links li:last-child {
- margin-right: 25px;
+ margin-right: 25px;
}
+
.skin-2 .spin-icon {
- background: #23c6c8 !important;
+ background: #23c6c8 !important;
}
+
.skin-2 .nav-header {
- background: #23c6c8;
- background: url('patterns/header-profile-skin-2.png');
+ background: #23c6c8;
+ background: url('patterns/header-profile-skin-2.png');
}
+
.skin-2.mini-navbar .nav-second-level {
- background: #ededed;
+ background: #ededed;
}
+
.skin-2 .breadcrumb {
- background: transparent;
+ background: transparent;
}
+
.skin-2.fixed-nav .minimalize-styl-2 {
- margin: 14px 5px 5px 15px;
+ margin: 14px 5px 5px 15px;
}
+
.skin-2 .page-heading {
- border: none;
- background: rgba(255, 255, 255, 0.7);
+ border: none;
+ background: rgba(255, 255, 255, 0.7);
}
+
.skin-2 .nav > li.active {
- background: #e0e0e0;
+ background: #e0e0e0;
}
+
.skin-2 .logo-element {
- padding: 17px 0;
+ padding: 17px 0;
}
+
.skin-2 .nav > li > a,
.skin-2 .welcome-message {
- color: #edf6ff;
+ color: #edf6ff;
}
+
.skin-2 #top-search::-moz-placeholder {
- color: #edf6ff;
- opacity: 0.5;
+ color: #edf6ff;
+ opacity: 0.5;
}
+
.skin-2 #side-menu > li > a,
.skin-2 .nav.nav-second-level > li > a {
- color: #586b7d;
+ color: #586b7d;
}
+
.skin-2 .nav > li.active > a {
- color: #213a53;
+ color: #213a53;
}
+
.skin-2.mini-navbar .nav-header {
- background: #213a53;
+ background: #213a53;
}
+
.skin-2 .navbar-minimalize {
- background: #23c6c8;
- border-color: #23c6c8;
+ background: #23c6c8;
+ border-color: #23c6c8;
}
+
.skin-2 .border-bottom {
- border-bottom: none !important;
+ border-bottom: none !important;
}
+
.skin-2 #top-search {
- color: #fff;
+ color: #fff;
}
+
body.skin-2 #wrapper {
- background-color: #ededed;
+ background-color: #ededed;
}
+
.skin-2 .navbar-static-top {
- background: #213a53;
+ background: #213a53;
}
+
.fixed-nav.skin-2 .navbar-fixed-top {
- background: #213a53;
- border-bottom: none !important;
+ background: #213a53;
+ border-bottom: none !important;
}
+
.skin-2 .nav-header {
- padding: 30px 25px 30px 25px;
+ padding: 30px 25px 30px 25px;
}
+
.skin-2 .dashboard-header {
- background: rgba(255, 255, 255, 0.4);
- border-bottom: none !important;
- border-top: none;
- padding: 20px 30px 20px 30px;
+ background: rgba(255, 255, 255, 0.4);
+ border-bottom: none !important;
+ border-top: none;
+ padding: 20px 30px 20px 30px;
}
+
.skin-2 .wrapper-content {
- padding: 30px 15px;
+ padding: 30px 15px;
}
+
.skin-2 .dashoard-1 .wrapper-content {
- padding: 0 30px 25px 30px;
+ padding: 0 30px 25px 30px;
}
+
.skin-2 .ibox-title {
- background: rgba(255, 255, 255, 0.7);
- border: none;
- margin-bottom: 1px;
+ background: rgba(255, 255, 255, 0.7);
+ border: none;
+ margin-bottom: 1px;
}
+
.skin-2 .ibox-content {
- background: rgba(255, 255, 255, 0.4);
- border: none !important;
+ background: rgba(255, 255, 255, 0.4);
+ border: none !important;
}
+
.skin-2 #page-wrapper {
- background: #f6f6f6;
- background: -webkit-radial-gradient(center, ellipse cover, #f6f6f6 20%, #d5d5d5 100%);
- background: -o-radial-gradient(center, ellipse cover, #f6f6f6 20%, #d5d5d5 100%);
- background: -ms-radial-gradient(center, ellipse cover, #f6f6f6 20%, #d5d5d5 100%);
- background: radial-gradient(ellipse at center, #f6f6f6 20%, #d5d5d5 100%);
- -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#f6f6f6, endColorstr=#d5d5d5)";
+ background: #f6f6f6;
+ background: -webkit-radial-gradient(center, ellipse cover, #f6f6f6 20%, #d5d5d5 100%);
+ background: -o-radial-gradient(center, ellipse cover, #f6f6f6 20%, #d5d5d5 100%);
+ background: -ms-radial-gradient(center, ellipse cover, #f6f6f6 20%, #d5d5d5 100%);
+ background: radial-gradient(ellipse at center, #f6f6f6 20%, #d5d5d5 100%);
+ -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#f6f6f6, endColorstr=#d5d5d5)";
}
+
.skin-2 .ibox-title,
.skin-2 .ibox-content {
- border-width: 1px;
+ border-width: 1px;
}
+
.skin-2 .ibox-content:last-child {
- border-style: solid solid solid solid;
+ border-style: solid solid solid solid;
}
+
.skin-2 .nav > li.active {
- border: none;
+ border: none;
}
+
.skin-2 .nav-header a.dropdown-toggle {
- color: #edf6ff;
- margin-top: 10px;
+ color: #edf6ff;
+ margin-top: 10px;
}
+
.skin-2 .nav-header a.dropdown-toggle .text-muted {
- color: #edf6ff;
- opacity: 0.8;
+ color: #edf6ff;
+ opacity: 0.8;
}
+
.skin-2 .img-circle {
- border-radius: 10px;
+ border-radius: 10px;
}
+
.skin-2 .nav.navbar-top-links > li > a:hover,
.skin-2 .nav.navbar-top-links > li > a:focus {
- background: #1a2d41;
+ background: #1a2d41;
}
+
.skin-2 .navbar-default .nav > li > a:hover,
.skin-2 .navbar-default .nav > li > a:focus {
- background: #e0e0e0;
- color: #213a53;
+ background: #e0e0e0;
+ color: #213a53;
}
+
.skin-2 .nav.nav-tabs > li.active > a {
- color: #555;
+ color: #555;
}
+
.skin-2 .nav.nav-tabs > li.active {
- background: transparent;
+ background: transparent;
}
+
/*
*
* SKIN 3 - INSPINIA - Responsive Admin Theme
@@ -7708,529 +9286,658 @@ body.skin-2 #wrapper {
*
*/
.skin-3 .minimalize-styl-2 {
- margin: 14px 5px 5px 30px;
+ margin: 14px 5px 5px 30px;
}
+
.skin-3 .navbar-top-links li:last-child {
- margin-right: 30px;
+ margin-right: 30px;
}
+
.skin-3.fixed-nav .minimalize-styl-2 {
- margin: 14px 5px 5px 15px;
+ margin: 14px 5px 5px 15px;
}
+
.skin-3 .spin-icon {
- background: #ecba52 !important;
+ background: #ecba52 !important;
}
+
body.boxed-layout.skin-3 #wrapper {
- background: #3e2c42;
+ background: #3e2c42;
}
+
.skin-3 .nav-header {
- background: #ecba52;
- background: url('patterns/header-profile-skin-3.png');
+ background: #ecba52;
+ background: url('patterns/header-profile-skin-3.png');
}
+
.skin-3.mini-navbar .nav-second-level {
- background: #3e2c42;
+ background: #3e2c42;
}
+
.skin-3 .breadcrumb {
- background: transparent;
+ background: transparent;
}
+
.skin-3 .page-heading {
- border: none;
+ border: none;
}
+
.skin-3 .nav > li.active {
- background: #38283c;
+ background: #38283c;
}
+
.fixed-nav.skin-3 .navbar-fixed-top {
- background: #fff;
+ background: #fff;
}
+
.skin-3 .nav > li > a {
- color: #948b96;
+ color: #948b96;
}
+
.skin-3 .nav > li.active > a {
- color: #fff;
+ color: #fff;
}
+
.skin-3 .navbar-minimalize {
- background: #ecba52;
- border-color: #ecba52;
+ background: #ecba52;
+ border-color: #ecba52;
}
+
body.skin-3 {
- background: #3e2c42;
+ background: #3e2c42;
}
+
.skin-3 .navbar-static-top {
- background: #ffffff;
+ background: #ffffff;
}
+
.skin-3 .dashboard-header {
- background: transparent;
- border-bottom: none !important;
- border-top: none;
- padding: 20px 30px 10px 30px;
+ background: transparent;
+ border-bottom: none !important;
+ border-top: none;
+ padding: 20px 30px 10px 30px;
}
+
.skin-3 .wrapper-content {
- padding: 30px 15px;
+ padding: 30px 15px;
}
+
.skin-3 #page-wrapper {
- background: #f4f6fa;
+ background: #f4f6fa;
}
+
.skin-3 .ibox-title,
.skin-3 .ibox-content {
- border-width: 1px;
+ border-width: 1px;
}
+
.skin-3 .ibox-content:last-child {
- border-style: solid solid solid solid;
+ border-style: solid solid solid solid;
}
+
.skin-3 .nav > li.active {
- border: none;
+ border: none;
}
+
.skin-3 .nav-header {
- padding: 35px 25px 25px 25px;
+ padding: 35px 25px 25px 25px;
}
+
.skin-3 .nav-header a.dropdown-toggle {
- color: #fff;
- margin-top: 10px;
+ color: #fff;
+ margin-top: 10px;
}
+
.skin-3 .nav-header a.dropdown-toggle .text-muted {
- color: #fff;
- opacity: 0.8;
+ color: #fff;
+ opacity: 0.8;
}
+
.skin-3 .profile-element {
- text-align: center;
+ text-align: center;
}
+
.skin-3 .img-circle {
- border-radius: 5px;
+ border-radius: 5px;
}
+
.skin-3 .navbar-default .nav > li > a:hover,
.skin-3 .navbar-default .nav > li > a:focus {
- background: #38283c;
- color: #fff;
+ background: #38283c;
+ color: #fff;
}
+
.skin-3 .nav.nav-tabs > li.active > a {
- color: #555;
+ color: #555;
}
+
.skin-3 .nav.nav-tabs > li.active {
- background: transparent;
+ background: transparent;
}
+
body.md-skin {
- font-family: "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif;
- background-color: #ffffff;
+ font-family: "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif;
+ background-color: #ffffff;
}
+
.md-skin .nav-header {
- background: url("patterns/4.png") no-repeat;
+ background: url("patterns/4.png") no-repeat;
}
+
.md-skin .label,
.md-skin .badge {
- font-family: 'Roboto';
+ font-family: 'Roboto';
}
+
.md-skin .font-bold {
- font-weight: 500;
+ font-weight: 500;
}
+
.md-skin .wrapper-content {
- padding: 30px 20px 40px;
+ padding: 30px 20px 40px;
}
+
@media (max-width: 768px) {
- .md-skin .wrapper-content {
- padding: 30px 0 40px;
- }
+ .md-skin .wrapper-content {
+ padding: 30px 0 40px;
+ }
}
+
.md-skin .page-heading {
- border-bottom: none !important;
- border-top: 0;
- padding: 0 10px 20px 10px;
- box-shadow: 0 1px 1px -1px rgba(0, 0, 0, 0.34), 0 0 6px 0 rgba(0, 0, 0, 0.14);
+ border-bottom: none !important;
+ border-top: 0;
+ padding: 0 10px 20px 10px;
+ box-shadow: 0 1px 1px -1px rgba(0, 0, 0, 0.34), 0 0 6px 0 rgba(0, 0, 0, 0.14);
}
+
.md-skin .full-height-layout .page-heading {
- border-bottom: 1px solid #e7eaec !important;
+ border-bottom: 1px solid #e7eaec !important;
}
+
.md-skin .ibox {
- clear: both;
- margin-bottom: 25px;
- margin-top: 0;
- padding: 0;
- box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
+ clear: both;
+ margin-bottom: 25px;
+ margin-top: 0;
+ padding: 0;
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
}
+
.md-skin .ibox.border-bottom {
- border-bottom: none !important;
+ border-bottom: none !important;
}
+
.md-skin .ibox-title,
.md-skin .ibox-content {
- border-style: none;
+ border-style: none;
}
+
.md-skin .ibox-title h5 {
- font-size: 16px;
- font-weight: 400;
+ font-size: 16px;
+ font-weight: 400;
}
+
.md-skin a.close-canvas-menu {
- color: #ffffff;
+ color: #ffffff;
}
+
.md-skin .welcome-message {
- color: #ffffff;
- font-weight: 300;
+ color: #ffffff;
+ font-weight: 300;
}
+
.md-skin #top-search::-moz-placeholder {
- color: #ffffff;
+ color: #ffffff;
}
+
.md-skin #top-search::-webkit-input-placeholder {
- color: #ffffff;
+ color: #ffffff;
}
+
.md-skin #nestable-output,
.md-skin #nestable2-output {
- font-family: 'Roboto', lucida grande, lucida sans unicode, helvetica, arial, sans-serif;
+ font-family: 'Roboto', lucida grande, lucida sans unicode, helvetica, arial, sans-serif;
}
+
.md-skin .landing-page {
- font-family: 'Roboto', helvetica, arial, sans-serif;
+ font-family: 'Roboto', helvetica, arial, sans-serif;
}
+
.md-skin .landing-page.navbar-default.navbar-scroll {
- background-color: #fff !important;
+ background-color: #fff !important;
}
+
.md-skin .landing-page.navbar-default {
- background-color: transparent !important;
- box-shadow: none;
+ background-color: transparent !important;
+ box-shadow: none;
}
+
.md-skin .landing-page.navbar-default .nav li a {
- font-family: 'Roboto', helvetica, arial, sans-serif;
+ font-family: 'Roboto', helvetica, arial, sans-serif;
}
+
.md-skin .nav > li > a {
- color: #676a6c;
- padding: 14px 20px 14px 25px;
+ color: #676a6c;
+ padding: 14px 20px 14px 25px;
}
+
.md-skin .nav.navbar-right > li > a {
- color: #ffffff;
+ color: #ffffff;
}
+
.md-skin .nav > li.active > a {
- color: #5b5d5f;
- font-weight: 700;
+ color: #5b5d5f;
+ font-weight: 700;
}
+
.md-skin .navbar-default .nav > li > a:hover,
.md-skin .navbar-default .nav > li > a:focus {
- font-weight: 700;
- color: #5b5d5f;
+ font-weight: 700;
+ color: #5b5d5f;
}
+
.md-skin .nav .open > a,
.md-skin .nav .open > a:hover,
.md-skin .nav .open > a:focus {
- background: var(--primary-color);
+ background: var(--primary-color);
}
+
.md-skin .navbar-top-links li {
- display: inline-table;
+ display: inline-table;
}
+
.md-skin .navbar-top-links .dropdown-menu li {
- display: block;
+ display: block;
}
+
.md-skin .pace-done .nav-header {
- transition: all 0.4s;
+ transition: all 0.4s;
}
+
.md-skin .nav > li.active {
- background: #f8f8f9;
+ background: #f8f8f9;
}
+
.md-skin .nav-second-level li a {
- padding: 7px 10px 7px 52px;
+ padding: 7px 10px 7px 52px;
}
+
.md-skin .navbar-top-links li a {
- padding: 20px 10px;
- min-height: 50px;
+ padding: 20px 10px;
+ min-height: 50px;
}
+
.md-skin .nav > li > a {
- font-weight: 400;
+ font-weight: 400;
}
+
.md-skin .navbar-static-side .nav > li > a:focus,
.md-skin .navbar-static-side .nav > li > a:hover {
- background-color: inherit;
+ background-color: inherit;
}
+
.md-skin .navbar-top-links .dropdown-menu li a {
- padding: 3px 20px;
- min-height: inherit;
+ padding: 3px 20px;
+ min-height: inherit;
}
+
.md-skin .nav-header .navbar-fixed-top a {
- color: #ffffff;
+ color: #ffffff;
}
+
.md-skin .nav-header .text-muted {
- color: #ffffff;
+ color: #ffffff;
}
+
.md-skin .navbar-form-custom .form-control {
- font-weight: 300;
+ font-weight: 300;
}
+
.md-skin .mini-navbar .nav-second-level {
- background-color: inherit;
+ background-color: inherit;
}
+
.md-skin .mini-navbar li.active .nav-second-level {
- left: 65px;
+ left: 65px;
}
+
.md-skin .canvas-menu.mini-navbar .nav-second-level {
- background: inherit;
+ background: inherit;
}
+
.md-skin .pace-done .navbar-static-side,
.md-skin .pace-done .nav-header,
.md-skin .pace-done li.active,
.md-skin .pace-done #page-wrapper,
.md-skin .pace-done .footer {
- -webkit-transition: all 0.4s;
- -moz-transition: all 0.4s;
- -o-transition: all 0.4s;
- transition: all 0.4s;
+ -webkit-transition: all 0.4s;
+ -moz-transition: all 0.4s;
+ -o-transition: all 0.4s;
+ transition: all 0.4s;
}
+
.md-skin .navbar-fixed-top {
- background: #fff;
- transition-duration: 0.4s;
- z-index: 2030;
- border-bottom: none !important;
+ background: #fff;
+ transition-duration: 0.4s;
+ z-index: 2030;
+ border-bottom: none !important;
}
+
.md-skin .navbar-fixed-top,
.md-skin .navbar-static-top {
- background-color: var(--primary-color) !important;
- box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
+ background-color: var(--primary-color) !important;
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
}
+
.md-skin .navbar-static-side {
- box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
}
+
.md-skin #right-sidebar {
- box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
- border: none;
- z-index: 900;
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
+ border: none;
+ z-index: 900;
}
+
.md-skin .white-bg .navbar-fixed-top,
.md-skin .white-bg .navbar-static-top {
- background: #fff !important;
+ background: #fff !important;
}
+
.md-skin .contact-box {
- box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
- border: none;
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
+ border: none;
}
+
.md-skin .dashboard-header {
- border-bottom: none !important;
- border-top: 0;
- padding: 20px 20px 20px 20px;
- margin: 30px 20px 0 20px;
- box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
+ border-bottom: none !important;
+ border-top: 0;
+ padding: 20px 20px 20px 20px;
+ margin: 30px 20px 0 20px;
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
}
+
@media (max-width: 768px) {
- .md-skin .dashboard-header {
- margin: 20px 0 0 0;
- }
+ .md-skin .dashboard-header {
+ margin: 20px 0 0 0;
+ }
}
+
.md-skin ul.notes li div {
- box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
}
+
.md-skin .file {
- border: none;
- box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
+ border: none;
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
}
+
.md-skin .mail-box {
- background-color: #ffffff;
- box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
- padding: 0;
- margin-bottom: 20px;
- border: none;
+ background-color: #ffffff;
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
+ padding: 0;
+ margin-bottom: 20px;
+ border: none;
}
+
.md-skin .mail-box-header {
- border: none;
- background-color: #ffffff;
- box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
- padding: 30px 20px 20px 20px;
+ border: none;
+ background-color: #ffffff;
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
+ padding: 30px 20px 20px 20px;
}
+
.md-skin .mailbox-content {
- border: none;
- padding: 20px;
- background: #ffffff;
+ border: none;
+ padding: 20px;
+ background: #ffffff;
}
+
.md-skin .social-feed-box {
- border: none;
- background: #fff;
- margin-bottom: 15px;
- box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
+ border: none;
+ background: #fff;
+ margin-bottom: 15px;
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
}
+
.md-skin.landing-page .navbar-default {
- background-color: transparent !important;
- border-color: transparent;
- transition: all 0.3s ease-in-out 0s;
- box-shadow: none;
+ background-color: transparent !important;
+ border-color: transparent;
+ transition: all 0.3s ease-in-out 0s;
+ box-shadow: none;
}
+
.md-skin.landing-page .navbar-default.navbar-scroll,
.md-skin.landing-page.body-small .navbar-default {
- background-color: #ffffff !important;
+ background-color: #ffffff !important;
}
+
.md-skin.landing-page .nav > li.active {
- background: inherit;
+ background: inherit;
}
+
.md-skin.landing-page .navbar-scroll .navbar-nav > li > a {
- padding: 20px 10px;
+ padding: 20px 10px;
}
+
.md-skin.landing-page .navbar-default .nav li a {
- font-family: 'Roboto', helvetica, arial, sans-serif;
+ font-family: 'Roboto', helvetica, arial, sans-serif;
}
+
.md-skin.landing-page .nav > li > a {
- padding: 25px 10px 15px 10px;
+ padding: 25px 10px 15px 10px;
}
+
.md-skin.landing-page .navbar-default .navbar-nav > li > a:hover,
.md-skin.landing-page .navbar-default .navbar-nav > li > a:focus {
- background: inherit;
- color: var(--primary-color);
+ background: inherit;
+ color: var(--primary-color);
}
+
.md-skin.landing-page.body-small .nav.navbar-right > li > a {
- color: #676a6c;
+ color: #676a6c;
}
+
.md-skin .landing_link a,
.md-skin .special_link a {
- color: #ffffff !important;
+ color: #ffffff !important;
}
+
.md-skin.canvas-menu.mini-navbar .nav-second-level {
- background: #f8f8f9;
+ background: #f8f8f9;
}
+
.md-skin.mini-navbar .nav-second-level {
- background-color: #ffffff;
- box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
+ background-color: #ffffff;
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
}
+
.md-skin.mini-navbar .nav-second-level li a {
- padding-left: 0;
+ padding-left: 0;
}
+
.md-skin.mini-navbar.fixed-sidebar .nav-second-level li a {
- padding-left: 52px;
+ padding-left: 52px;
}
+
.md-skin.top-navigation .nav.navbar-right > li > a {
- padding: 15px 20px;
- color: #676a6c;
+ padding: 15px 20px;
+ color: #676a6c;
}
+
.md-skin.top-navigation .nav > li a:hover,
.md-skin .top-navigation .nav > li a:focus,
.md-skin.top-navigation .nav .open > a,
.md-skin.top-navigation .nav .open > a:hover,
.md-skin.top-navigation .nav .open > a:focus {
- color: var(--primary-color);
- background: #ffffff;
+ color: var(--primary-color);
+ background: #ffffff;
}
+
.md-skin.top-navigation .nav > li.active a {
- color: var(--primary-color);
- background: #ffffff;
+ color: var(--primary-color);
+ background: #ffffff;
}
+
.md-skin.fixed-nav #wrapper.top-navigation #page-wrapper {
- margin-top: 0;
+ margin-top: 0;
}
+
.md-skin.fixed-sidebar.mini-navbar .navbar-static-side {
- width: 0;
+ width: 0;
}
+
.md-skin.fixed-sidebar.mini-navbar #page-wrapper {
- margin: 0 0 0 0;
-}
-.md-skin.body-small.fixed-sidebar.mini-navbar #page-wrapper {
- margin: 0 0 0 0;
-}
-.md-skin.body-small.fixed-sidebar.mini-navbar .navbar-static-side {
- width: 220px;
- background-color: #ffffff;
-}
-.md-skin.canvas-menu nav.navbar-static-side {
- z-index: 2001;
- background: #ffffff;
- height: 100%;
- position: fixed;
- display: none;
-}
-@media (min-width: 768px) {
- #page-wrapper {
- position: inherit;
- margin: 0 0 0 220px;
- /*min-height: 1200px;*/
- }
- .navbar-static-side {
- z-index: 2001;
- position: absolute;
- width: 220px;
- }
- .navbar-top-links .dropdown-messages,
- .navbar-top-links .dropdown-tasks,
- .navbar-top-links .dropdown-alerts {
- margin-left: auto;
- }
-}
-@media (max-width: 768px) {
- #page-wrapper {
- position: inherit;
margin: 0 0 0 0;
- min-height: 1000px;
- }
- .body-small .navbar-static-side {
- display: none;
- z-index: 2001;
- position: absolute;
- width: 70px;
- }
- .body-small.mini-navbar .navbar-static-side {
- display: block;
- }
- .lock-word {
- display: none;
- }
- .navbar-form-custom {
- display: none;
- }
- .navbar-header {
- display: inline;
- float: left;
- }
- .sidebard-panel {
- z-index: 2;
- position: relative;
- width: auto;
- min-height: 100% !important;
- }
- .sidebar-content .wrapper {
- padding-right: 0;
- z-index: 1;
- }
- .fixed-sidebar.body-small .navbar-static-side {
- display: none;
- z-index: 2001;
- position: fixed;
+}
+
+.md-skin.body-small.fixed-sidebar.mini-navbar #page-wrapper {
+ margin: 0 0 0 0;
+}
+
+.md-skin.body-small.fixed-sidebar.mini-navbar .navbar-static-side {
width: 220px;
- }
- .fixed-sidebar.body-small.mini-navbar .navbar-static-side {
- display: block;
- }
- .ibox-tools {
- float: none;
- text-align: right;
- display: block;
- }
+ background-color: #ffffff;
}
-@media (max-width: 350px) {
- .timeline-item .date {
- text-align: left;
- width: 110px;
- position: relative;
- padding-top: 30px;
- }
- .timeline-item .date i {
- position: absolute;
- top: 0;
- left: 15px;
- padding: 5px;
- width: 30px;
- text-align: center;
- border: 1px solid #e7eaec;
- background: #f8f8f8;
- }
- .timeline-item .content {
- border-left: none;
- border-top: 1px solid #e7eaec;
- padding-top: 10px;
- min-height: 100px;
- }
- .nav.navbar-top-links li.dropdown {
+
+.md-skin.canvas-menu nav.navbar-static-side {
+ z-index: 2001;
+ background: #ffffff;
+ height: 100%;
+ position: fixed;
display: none;
- }
- .ibox-tools {
- float: none;
- text-align: left;
- display: inline-block;
- }
}
+
+@media (min-width: 768px) {
+ #page-wrapper {
+ position: inherit;
+ margin: 0 0 0 220px;
+ /*min-height: 1200px;*/
+ }
+
+ .navbar-static-side {
+ z-index: 2001;
+ position: absolute;
+ width: 220px;
+ }
+
+ .navbar-top-links .dropdown-messages,
+ .navbar-top-links .dropdown-tasks,
+ .navbar-top-links .dropdown-alerts {
+ margin-left: auto;
+ }
+}
+
+@media (max-width: 768px) {
+ #page-wrapper {
+ position: inherit;
+ margin: 0 0 0 0;
+ min-height: 1000px;
+ }
+
+ .body-small .navbar-static-side {
+ display: none;
+ z-index: 2001;
+ position: absolute;
+ width: 70px;
+ }
+
+ .body-small.mini-navbar .navbar-static-side {
+ display: block;
+ }
+
+ .lock-word {
+ display: none;
+ }
+
+ .navbar-form-custom {
+ display: none;
+ }
+
+ .navbar-header {
+ display: inline;
+ float: left;
+ }
+
+ .sidebard-panel {
+ z-index: 2;
+ position: relative;
+ width: auto;
+ min-height: 100% !important;
+ }
+
+ .sidebar-content .wrapper {
+ padding-right: 0;
+ z-index: 1;
+ }
+
+ .fixed-sidebar.body-small .navbar-static-side {
+ display: none;
+ z-index: 2001;
+ position: fixed;
+ width: 220px;
+ }
+
+ .fixed-sidebar.body-small.mini-navbar .navbar-static-side {
+ display: block;
+ }
+
+ .ibox-tools {
+ float: none;
+ text-align: right;
+ display: block;
+ }
+}
+
+@media (max-width: 350px) {
+ .timeline-item .date {
+ text-align: left;
+ width: 110px;
+ position: relative;
+ padding-top: 30px;
+ }
+
+ .timeline-item .date i {
+ position: absolute;
+ top: 0;
+ left: 15px;
+ padding: 5px;
+ width: 30px;
+ text-align: center;
+ border: 1px solid #e7eaec;
+ background: #f8f8f8;
+ }
+
+ .timeline-item .content {
+ border-left: none;
+ border-top: 1px solid #e7eaec;
+ padding-top: 10px;
+ min-height: 100px;
+ }
+
+ .nav.navbar-top-links li.dropdown {
+ display: none;
+ }
+
+ .ibox-tools {
+ float: none;
+ text-align: left;
+ display: inline-block;
+ }
+}
+
/* Only demo */
@media (max-width: 1000px) {
- .welcome-message {
- display: none;
- }
+ .welcome-message {
+ display: none;
+ }
}
+
@media print {
- nav.navbar-static-side {
- display: none;
- }
- #page-wrapper {
- margin: 0;
- }
+ nav.navbar-static-side {
+ display: none;
+ }
+
+ #page-wrapper {
+ margin: 0;
+ }
}
diff --git a/apps/static/fonts/OpenSans-Regular.ttf b/apps/static/fonts/OpenSans-Regular.ttf
new file mode 100644
index 000000000..67803bb64
Binary files /dev/null and b/apps/static/fonts/OpenSans-Regular.ttf differ
diff --git a/apps/static/img/logo_text_white.png b/apps/static/img/logo_text_white.png
index b793b9e5b..6268a2b68 100644
Binary files a/apps/static/img/logo_text_white.png and b/apps/static/img/logo_text_white.png differ
diff --git a/apps/terminal/api/component/storage.py b/apps/terminal/api/component/storage.py
index b1b9b1af5..0121ac18a 100644
--- a/apps/terminal/api/component/storage.py
+++ b/apps/terminal/api/component/storage.py
@@ -2,8 +2,8 @@
#
from django.utils.translation import gettext_lazy as _
-from django_filters import utils
from django_filters import rest_framework as drf_filters
+from django_filters import utils
from rest_framework import viewsets, generics, status
from rest_framework.decorators import action
from rest_framework.request import Request
@@ -83,7 +83,7 @@ class CommandStorageViewSet(BaseStorageViewSetMixin, viewsets.ModelViewSet):
nodes = [
{
'id': storage.id,
- 'name': f'{storage.name}({storage.type})({command_count})',
+ 'name': f'{storage.name}({storage.type}) ({command_count})',
'title': f'{storage.name}({storage.type})',
'pId': 'root',
'isParent': False,
diff --git a/apps/terminal/apps.py b/apps/terminal/apps.py
index b1b9538d3..30e00cbf9 100644
--- a/apps/terminal/apps.py
+++ b/apps/terminal/apps.py
@@ -6,7 +6,7 @@ from django.utils.translation import gettext_lazy as _
class TerminalConfig(AppConfig):
name = 'terminal'
- verbose_name = _('Terminals')
+ verbose_name = _('App Terminals')
def ready(self):
from . import signal_handlers # noqa
diff --git a/apps/terminal/automations/deploy_applet_host/playbook.yml b/apps/terminal/automations/deploy_applet_host/playbook.yml
index c517c9f2c..33ed9bd5b 100644
--- a/apps/terminal/automations/deploy_applet_host/playbook.yml
+++ b/apps/terminal/automations/deploy_applet_host/playbook.yml
@@ -18,260 +18,258 @@
INSTALL_APPLETS: true
tasks:
- - name: Install RDS-RD-Server (RDS)
- ansible.windows.win_feature:
- name: RDS-RD-Server
- state: present
- include_management_tools: yes
- register: rds_install
+ - block:
+ - name: Install RDS-RD-Server (RDS)
+ ansible.windows.win_feature:
+ name: RDS-RD-Server
+ state: present
+ include_management_tools: yes
+ register: rds_install
- - name: Stop Tinker before install (jumpserver)
- ansible.windows.win_powershell:
- script: |
- if (Get-Process -Name 'tinker' -ErrorAction SilentlyContinue) {
- TASKKILL /F /IM tinker.exe /T
- }
- else {
- $Ansible.Changed = $false
- }
+ - name: Stop Tinker before install (jumpserver)
+ ansible.windows.win_powershell:
+ script: |
+ if (Get-Process -Name 'tinker' -ErrorAction SilentlyContinue) {
+ TASKKILL /F /IM tinker.exe /T
+ }
+ else {
+ $Ansible.Changed = $false
+ }
- - name: Stop Tinkerd before install (jumpserver)
- ansible.windows.win_powershell:
- script: |
- if (Get-Service -Name 'JumpServer Tinker' -ErrorAction SilentlyContinue) {
- Stop-Service -Name 'JumpServer Tinker' -Force
- }
- else {
- $Ansible.Changed = $false
- }
+ - name: Download JumpServer Tinker installer (jumpserver)
+ ansible.windows.win_get_url:
+ url: "{{ APPLET_DOWNLOAD_HOST }}/download/applets/{{ TinkerInstaller }}"
+ dest: "{{ ansible_env.TEMP }}\\{{ TinkerInstaller }}"
+ validate_certs: "{{ not IGNORE_VERIFY_CERTS }}"
- - name: Download JumpServer Tinker installer (jumpserver)
- ansible.windows.win_get_url:
- url: "{{ APPLET_DOWNLOAD_HOST }}/download/applets/{{ TinkerInstaller }}"
- dest: "{{ ansible_env.TEMP }}\\{{ TinkerInstaller }}"
- validate_certs: "{{ not IGNORE_VERIFY_CERTS }}"
+ - name: Install JumpServer Tinker (jumpserver)
+ ansible.windows.win_package:
+ path: "{{ ansible_env.TEMP }}\\{{ TinkerInstaller }}"
+ arguments:
+ - /VERYSILENT
+ - /SUPPRESSMSGBOXES
+ - /NORESTART
+ state: present
- - name: Install JumpServer Tinker (jumpserver)
- ansible.windows.win_package:
- path: "{{ ansible_env.TEMP }}\\{{ TinkerInstaller }}"
- arguments:
- - /VERYSILENT
- - /SUPPRESSMSGBOXES
- - /NORESTART
- state: present
+ - name: Set Tinkerd on the global system path (jumpserver)
+ ansible.windows.win_path:
+ elements:
+ - '%USERPROFILE%\AppData\Local\Programs\Tinker\'
+ scope: user
- - name: Set Tinkerd on the global system path (jumpserver)
- ansible.windows.win_path:
- elements:
- - '%USERPROFILE%\AppData\Local\Programs\Tinker\'
- scope: user
+ - name: Download python-3.11.6
+ ansible.windows.win_get_url:
+ url: "{{ APPLET_DOWNLOAD_HOST }}/download/applets/python-3.11.6-amd64.exe"
+ dest: "{{ ansible_env.TEMP }}\\python-3.11.6-amd64.exe"
+ validate_certs: "{{ not IGNORE_VERIFY_CERTS }}"
- - name: Download python-3.11.6
- ansible.windows.win_get_url:
- url: "{{ APPLET_DOWNLOAD_HOST }}/download/applets/python-3.11.6-amd64.exe"
- dest: "{{ ansible_env.TEMP }}\\python-3.11.6-amd64.exe"
- validate_certs: "{{ not IGNORE_VERIFY_CERTS }}"
+ - name: Install the python-3.11.6
+ ansible.windows.win_package:
+ path: "{{ ansible_env.TEMP }}\\python-3.11.6-amd64.exe"
+ arguments:
+ - /quiet
+ - InstallAllUsers=1
+ - PrependPath=1
+ - Include_test=0
+ - Include_launcher=0
+ state: present
+ register: win_install_python
- - name: Install the python-3.11.6
- ansible.windows.win_package:
- path: "{{ ansible_env.TEMP }}\\python-3.11.6-amd64.exe"
- arguments:
- - /quiet
- - InstallAllUsers=1
- - PrependPath=1
- - Include_test=0
- - Include_launcher=0
- state: present
- register: win_install_python
+ - name: Check pip command exists
+ ansible.windows.win_powershell:
+ script: |
+ if (Get-Command -Name 'pip' -ErrorAction SilentlyContinue) {
+ $Ansible.Changed = $false
+ }
+ else {
+ $Ansible.Changed = $true
+ }
+ ignore_errors: yes
+ register: check_pip_command
- - name: Check pip command exists
- ansible.windows.win_powershell:
- script: |
- if (Get-Command -Name 'pip' -ErrorAction SilentlyContinue) {
- $Ansible.Changed = $false
- }
- else {
- $Ansible.Changed = $true
- }
- register: check_pip_command
- ignore_errors: yes
+ - name: Reboot if installing requires it
+ ansible.windows.win_reboot:
+ post_reboot_delay: 10
+ test_command: whoami
+ when: check_pip_command.changed or rds_install.reboot_required or win_install_python.reboot_required
- - name: Reboot if installing requires it
- ansible.windows.win_reboot:
- post_reboot_delay: 10
- test_command: whoami
- when: check_pip_command.changed or rds_install.reboot_required or win_install_python.reboot_required
+ - name: Set RDS LicenseServer (regedit)
+ ansible.windows.win_regedit:
+ path: HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services
+ name: LicenseServers
+ data: "{{ RDS_LicenseServer }}"
+ type: string
+ when: RDS_Licensing
- - name: Set RDS LicenseServer (regedit)
- ansible.windows.win_regedit:
- path: HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services
- name: LicenseServers
- data: "{{ RDS_LicenseServer }}"
- type: string
- when: RDS_Licensing
+ - name: Set RDS LicensingMode (regedit)
+ ansible.windows.win_regedit:
+ path: HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services
+ name: LicensingMode
+ data: "{{ RDS_LicensingMode }}"
+ type: dword
+ when: RDS_Licensing
- - name: Set RDS LicensingMode (regedit)
- ansible.windows.win_regedit:
- path: HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services
- name: LicensingMode
- data: "{{ RDS_LicensingMode }}"
- type: dword
- when: RDS_Licensing
+ - name: Set RDS fSingleSessionPerUser (regedit)
+ ansible.windows.win_regedit:
+ path: HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services
+ name: fSingleSessionPerUser
+ data: "{{ RDS_fSingleSessionPerUser }}"
+ type: dword
+ when: RDS_Licensing
- - name: Set RDS fSingleSessionPerUser (regedit)
- ansible.windows.win_regedit:
- path: HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services
- name: fSingleSessionPerUser
- data: "{{ RDS_fSingleSessionPerUser }}"
- type: dword
- when: RDS_Licensing
+ - name: Set RDS MaxDisconnectionTime (regedit)
+ ansible.windows.win_regedit:
+ path: HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services
+ name: MaxDisconnectionTime
+ data: "{{ RDS_MaxDisconnectionTime }}"
+ type: dword
+ when: RDS_MaxDisconnectionTime >= 60000
- - name: Set RDS MaxDisconnectionTime (regedit)
- ansible.windows.win_regedit:
- path: HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services
- name: MaxDisconnectionTime
- data: "{{ RDS_MaxDisconnectionTime }}"
- type: dword
- when: RDS_MaxDisconnectionTime >= 60000
+ - name: Set RDS RemoteAppLogoffTimeLimit (regedit)
+ ansible.windows.win_regedit:
+ path: HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services
+ name: RemoteAppLogoffTimeLimit
+ data: "{{ RDS_RemoteAppLogoffTimeLimit }}"
+ type: dword
- - name: Set RDS RemoteAppLogoffTimeLimit (regedit)
- ansible.windows.win_regedit:
- path: HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services
- name: RemoteAppLogoffTimeLimit
- data: "{{ RDS_RemoteAppLogoffTimeLimit }}"
- type: dword
+ - name: Download pip packages
+ ansible.windows.win_get_url:
+ url: "{{ APPLET_DOWNLOAD_HOST }}/download/applets/pip_packages.zip"
+ dest: "{{ ansible_env.TEMP }}\\pip_packages.zip"
+ validate_certs: "{{ not IGNORE_VERIFY_CERTS }}"
- - name: Download pip packages
- ansible.windows.win_get_url:
- url: "{{ APPLET_DOWNLOAD_HOST }}/download/applets/pip_packages.zip"
- dest: "{{ ansible_env.TEMP }}\\pip_packages.zip"
- validate_certs: "{{ not IGNORE_VERIFY_CERTS }}"
+ - name: Unzip pip_packages
+ community.windows.win_unzip:
+ src: "{{ ansible_env.TEMP }}\\pip_packages.zip"
+ dest: "{{ ansible_env.TEMP }}\\pip_packages"
- - name: Unzip pip_packages
- community.windows.win_unzip:
- src: "{{ ansible_env.TEMP }}\\pip_packages.zip"
- dest: "{{ ansible_env.TEMP }}\\pip_packages"
+ - name: Install python requirements offline
+ ansible.windows.win_powershell:
+ script: |
+ pip install -r '{{ ansible_env.TEMP }}\pip_packages\pip_packages\requirements.txt' --no-index --find-links='{{ ansible_env.TEMP }}\pip_packages\pip_packages'
- - name: Install python requirements offline
- ansible.windows.win_powershell:
- script: |
- pip install -r '{{ ansible_env.TEMP }}\pip_packages\pip_packages\requirements.txt' --no-index --find-links='{{ ansible_env.TEMP }}\pip_packages\pip_packages'
+ - name: Stop chromedriver before install (jumpserver)
+ ansible.windows.win_powershell:
+ script: |
+ if (Get-Process -Name 'chromedriver' -ErrorAction SilentlyContinue) {
+ TASKKILL /F /IM chromedriver.exe /T
+ }
+ else {
+ $Ansible.Changed = $false
+ }
- - name: Stop chromedriver before install (jumpserver)
- ansible.windows.win_powershell:
- script: |
- if (Get-Process -Name 'chromedriver' -ErrorAction SilentlyContinue) {
- TASKKILL /F /IM chromedriver.exe /T
- }
- else {
- $Ansible.Changed = $false
- }
+ - name: Download chromedriver (Chrome)
+ ansible.windows.win_get_url:
+ url: "{{ APPLET_DOWNLOAD_HOST }}/download/applets/chromedriver-win64.zip"
+ dest: "{{ ansible_env.TEMP }}\\chromedriver-win64.zip"
+ validate_certs: "{{ not IGNORE_VERIFY_CERTS }}"
- - name: Download chromedriver (Chrome)
- ansible.windows.win_get_url:
- url: "{{ APPLET_DOWNLOAD_HOST }}/download/applets/chromedriver-win64.zip"
- dest: "{{ ansible_env.TEMP }}\\chromedriver-win64.zip"
- validate_certs: "{{ not IGNORE_VERIFY_CERTS }}"
+ - name: Remove old chromedriver (Chrome)
+ ansible.windows.win_file:
+ path: "{{ item }}"
+ state: absent
+ with_items:
+ - C:\Program Files\JumpServer\drivers\chromedriver-win32
+ - C:\Program Files\JumpServer\drivers\chromedriver_win32
+ - C:\Program Files\JumpServer\drivers\chromedriver-win64
+ - C:\Program Files\JumpServer\drivers\chromedriver_win64
- - name: Remove old chromedriver (Chrome)
- ansible.windows.win_file:
- path: "{{ item }}"
- state: absent
- with_items:
- - C:\Program Files\JumpServer\drivers\chromedriver-win32
- - C:\Program Files\JumpServer\drivers\chromedriver_win32
- - C:\Program Files\JumpServer\drivers\chromedriver-win64
- - C:\Program Files\JumpServer\drivers\chromedriver_win64
+ - name: Unzip chromedriver (Chrome)
+ community.windows.win_unzip:
+ src: "{{ ansible_env.TEMP }}\\chromedriver-win64.zip"
+ dest: C:\Program Files\JumpServer\drivers
- - name: Unzip chromedriver (Chrome)
- community.windows.win_unzip:
- src: "{{ ansible_env.TEMP }}\\chromedriver-win64.zip"
- dest: C:\Program Files\JumpServer\drivers
+ - name: Stop Chrome before install (jumpserver)
+ ansible.windows.win_powershell:
+ script: |
+ if (Get-Process -Name 'chrome' -ErrorAction SilentlyContinue) {
+ TASKKILL /F /IM chrome.exe /T
+ }
+ else {
+ $Ansible.Changed = $false
+ }
- - name: Stop Chrome before install (jumpserver)
- ansible.windows.win_powershell:
- script: |
- if (Get-Process -Name 'chrome' -ErrorAction SilentlyContinue) {
- TASKKILL /F /IM chrome.exe /T
- }
- else {
- $Ansible.Changed = $false
- }
+ - name: Download Chrome zip package (Chrome)
+ ansible.windows.win_get_url:
+ url: "{{ APPLET_DOWNLOAD_HOST }}/download/applets/chrome-win.zip"
+ dest: "{{ ansible_env.TEMP }}\\chrome-win.zip"
+ validate_certs: "{{ not IGNORE_VERIFY_CERTS }}"
- - name: Download Chrome zip package (Chrome)
- ansible.windows.win_get_url:
- url: "{{ APPLET_DOWNLOAD_HOST }}/download/applets/chrome-win.zip"
- dest: "{{ ansible_env.TEMP }}\\chrome-win.zip"
- validate_certs: "{{ not IGNORE_VERIFY_CERTS }}"
+ - name: Remove old Chrome (Chrome)
+ ansible.windows.win_file:
+ path: "{{ item }}"
+ state: absent
+ with_items:
+ - C:\Program Files\JumpServer\applications\Chrome
+ - C:\Program Files\Chrome\chrome-win32
+ - C:\Program Files\Chrome\chrome-win
+ - C:\Program Files\chrome-win
- - name: Remove old Chrome (Chrome)
- ansible.windows.win_file:
- path: "{{ item }}"
- state: absent
- with_items:
- - C:\Program Files\JumpServer\applications\Chrome
- - C:\Program Files\Chrome\chrome-win32
- - C:\Program Files\Chrome\chrome-win
- - C:\Program Files\chrome-win
+ - name: Unzip Chrome (Chrome)
+ community.windows.win_unzip:
+ src: "{{ ansible_env.TEMP }}\\chrome-win.zip"
+ dest: C:\Program Files\JumpServer\applications
- - name: Unzip Chrome (Chrome)
- community.windows.win_unzip:
- src: "{{ ansible_env.TEMP }}\\chrome-win.zip"
- dest: C:\Program Files\JumpServer\applications
+ - name: Check and Clean global system path (Chrome)
+ ansible.windows.win_path:
+ elements:
+ - 'C:\Program Files\Python310\Scripts\'
+ - 'C:\Program Files\Python310\'
+ - 'C:\Program Files\JumpServer\drivers\chromedriver-win32'
+ - 'C:\Program Files\JumpServer\drivers\chromedriver_win32'
+ - 'C:\Program Files\Chrome\chrome-win32'
+ - 'C:\Program Files\Chrome\chrome-win'
+ - 'C:\Program Files\chrome-win'
+ state: absent
- - name: Check and Clean global system path (Chrome)
- ansible.windows.win_path:
- elements:
- - 'C:\Program Files\Python310\Scripts\'
- - 'C:\Program Files\Python310\'
- - 'C:\Program Files\JumpServer\drivers\chromedriver-win32'
- - 'C:\Program Files\JumpServer\drivers\chromedriver_win32'
- - 'C:\Program Files\Chrome\chrome-win32'
- - 'C:\Program Files\Chrome\chrome-win'
- - 'C:\Program Files\chrome-win'
- state: absent
+ - name: Set Chrome and driver on the global system path (Chrome)
+ ansible.windows.win_path:
+ elements:
+ - 'C:\Program Files\JumpServer\applications\Chrome\Application'
+ - 'C:\Program Files\JumpServer\drivers\chromedriver-win64'
- - name: Set Chrome and driver on the global system path (Chrome)
- ansible.windows.win_path:
- elements:
- - 'C:\Program Files\JumpServer\applications\Chrome\Application'
- - 'C:\Program Files\JumpServer\drivers\chromedriver-win64'
+ - name: Set Chrome variables disable Google Api (Chrome)
+ ansible.windows.win_environment:
+ level: machine
+ variables:
+ GOOGLE_API_KEY: ''
+ GOOGLE_DEFAULT_CLIENT_ID: ''
+ GOOGLE_DEFAULT_CLIENT_SECRET: ''
- - name: Set Chrome variables disable Google Api (Chrome)
- ansible.windows.win_environment:
- level: machine
- variables:
- GOOGLE_API_KEY: ''
- GOOGLE_DEFAULT_CLIENT_ID: ''
- GOOGLE_DEFAULT_CLIENT_SECRET: ''
+ - name: Generate tinkerd component config
+ ansible.windows.win_powershell:
+ script: |
+ tinkerd config --hostname {{ HOST_NAME }} --core_host {{ CORE_HOST }} --token {{ BOOTSTRAP_TOKEN }} --host_id {{ HOST_ID }} --ignore-verify-certs {{ IGNORE_VERIFY_CERTS }}
- - name: Generate tinkerd component config
- ansible.windows.win_powershell:
- script: |
- tinkerd config --hostname {{ HOST_NAME }} --core_host {{ CORE_HOST }} --token {{ BOOTSTRAP_TOKEN }} --host_id {{ HOST_ID }} --ignore-verify-certs {{ IGNORE_VERIFY_CERTS }}
+ - name: Install tinkerd service
+ ansible.windows.win_powershell:
+ script: |
+ tinkerd service install
- - name: Install tinkerd service
- ansible.windows.win_powershell:
- script: |
- tinkerd service install
+ - name: Start tinkerd service
+ ansible.windows.win_powershell:
+ script: |
+ tinkerd service start
- - name: Start tinkerd service
- ansible.windows.win_powershell:
- script: |
- tinkerd service start
+ - name: Wait Tinker api health
+ ansible.windows.win_uri:
+ url: http://localhost:6068/api/health/
+ status_code: 200
+ method: GET
+ register: _result
+ until: _result.status_code == 200
+ retries: 30
+ delay: 5
- - name: Wait Tinker api health
- ansible.windows.win_uri:
- url: http://localhost:6068/api/health/
- status_code: 200
- method: GET
- register: _result
- until: _result.status_code == 200
- retries: 30
- delay: 5
+ - name: Sync all remote applets
+ ansible.windows.win_powershell:
+ script: |
+ tinkerd install all
+ register: sync_remote_applets
+ when: INSTALL_APPLETS
- - name: Sync all remote applets
- ansible.windows.win_powershell:
- script: |
- tinkerd install all
- when: INSTALL_APPLETS
+ rescue:
+ - debug:
+ var: ansible_failed_result
+ - fail:
+ msg: "Failed to deploy applet host"
diff --git a/apps/terminal/notifications.py b/apps/terminal/notifications.py
index 0d2501450..ca49f23f2 100644
--- a/apps/terminal/notifications.py
+++ b/apps/terminal/notifications.py
@@ -170,9 +170,9 @@ class CommandAlertMessage(CommandAlertMixin, SystemMessage):
class CommandExecutionAlert(CommandAlertMixin, SystemMessage):
- category = CATEGORY
- category_label = CATEGORY_LABEL
- message_type_label = _('Batch danger command alert')
+ category = 'Workbench'
+ category_label = _('Job')
+ message_type_label = _('Command reject')
def __init__(self, command):
self.command = command
@@ -222,7 +222,7 @@ class CommandExecutionAlert(CommandAlertMixin, SystemMessage):
class StorageConnectivityMessage(SystemMessage):
category = 'storage'
category_label = _('Command and replay storage')
- message_type_label = _('Connectivity alarm')
+ message_type_label = _('Connectivity')
def __init__(self, errors):
self.errors = errors
diff --git a/apps/terminal/serializers/command.py b/apps/terminal/serializers/command.py
index 1c1cb6f11..2372bc795 100644
--- a/apps/terminal/serializers/command.py
+++ b/apps/terminal/serializers/command.py
@@ -69,7 +69,7 @@ class SessionCommandSerializerMixin(serializers.Serializer):
"""使用这个类作为基础Command Log Serializer类, 用来序列化"""
id = serializers.UUIDField(read_only=True)
# 限制 64 字符,不能直接迁移成 128 字符,命令表数据量会比较大
- account = serializers.CharField(label=_("Account "))
+ account = serializers.CharField(label=_("Account"))
output = serializers.CharField(allow_blank=True, label=_("Output"))
timestamp = serializers.IntegerField(label=_('Timestamp'))
timestamp_display = serializers.DateTimeField(read_only=True, label=_('Datetime'))
diff --git a/apps/terminal/serializers/storage.py b/apps/terminal/serializers/storage.py
index 85f52c609..ed75c22ef 100644
--- a/apps/terminal/serializers/storage.py
+++ b/apps/terminal/serializers/storage.py
@@ -2,8 +2,8 @@
#
from urllib.parse import urlparse
-from django.db.models import TextChoices
from django.core.validators import MaxValueValidator, MinValueValidator, validate_ipv46_address
+from django.db.models import TextChoices
from django.utils.translation import gettext_lazy as _
from rest_framework import serializers
from rest_framework.validators import UniqueValidator
@@ -30,7 +30,7 @@ class ReplayStorageTypeBaseSerializer(serializers.Serializer):
)
ACCESS_KEY = serializers.CharField(
max_length=1024, required=False, allow_blank=True,
- label=_('Access key id'), allow_null=True,
+ label=_('Access key ID'), allow_null=True,
)
SECRET_KEY = EncryptedField(
max_length=1024, required=False, allow_blank=True,
@@ -146,7 +146,7 @@ class ReplayStorageTypeSFTPSerializer(serializers.Serializer):
write_only=True, label=_('Private key')
)
STP_PASSPHRASE = EncryptedField(
- allow_blank=True, allow_null=True, required=False, max_length=1024, label=_('Key password')
+ allow_blank=True, allow_null=True, required=False, max_length=1024, label=_('Passphrase')
)
SFTP_ROOT_PATH = serializers.CharField(
required=True, max_length=1024, label=_('SFTP Root')
diff --git a/apps/terminal/serializers/terminal.py b/apps/terminal/serializers/terminal.py
index a65249551..e47fcf93e 100644
--- a/apps/terminal/serializers/terminal.py
+++ b/apps/terminal/serializers/terminal.py
@@ -39,14 +39,14 @@ class TerminalSmallSerializer(serializers.ModelSerializer):
class TerminalSerializer(BulkModelSerializer):
- session_online = serializers.ReadOnlyField(source='get_online_session_count')
- is_alive = serializers.BooleanField(read_only=True)
+ session_online = serializers.ReadOnlyField(source='get_online_session_count', label=_('Online sessions'))
+ is_alive = serializers.BooleanField(read_only=True, label=_('Is alive'))
is_active = serializers.BooleanField(read_only=True, label='Is active')
load = LabeledChoiceField(
read_only=True, choices=const.ComponentLoad.choices,
label=_('Load status')
)
- stat = StatSerializer(read_only=True, source='last_stat')
+ stat = StatSerializer(read_only=True, source='last_stat', label=_('Stat'))
class Meta:
model = Terminal
diff --git a/apps/tickets/apps.py b/apps/tickets/apps.py
index 49f818b7e..02930e99b 100644
--- a/apps/tickets/apps.py
+++ b/apps/tickets/apps.py
@@ -4,7 +4,7 @@ from django.utils.translation import gettext_lazy as _
class TicketsConfig(AppConfig):
name = 'tickets'
- verbose_name = _('Tickets')
+ verbose_name = _('App Tickets')
def ready(self):
from . import signal_handlers # noqa
diff --git a/apps/tickets/migrations/0016_auto_20220609_1758.py b/apps/tickets/migrations/0016_auto_20220609_1758.py
index 19275f8f4..73d5b21c7 100644
--- a/apps/tickets/migrations/0016_auto_20220609_1758.py
+++ b/apps/tickets/migrations/0016_auto_20220609_1758.py
@@ -23,7 +23,7 @@ class Migration(migrations.Migration):
primary_key=True, serialize=False, to='tickets.ticket')),
('apply_login_ip', models.GenericIPAddressField(null=True, verbose_name='Login IP')),
('apply_login_city', models.CharField(max_length=64, null=True, verbose_name='Login city')),
- ('apply_login_datetime', models.DateTimeField(null=True, verbose_name='Login datetime')),
+ ('apply_login_datetime', models.DateTimeField(null=True, verbose_name='Login Date')),
],
options={
'abstract': False,
diff --git a/apps/tickets/models/ticket/login_confirm.py b/apps/tickets/models/ticket/login_confirm.py
index 7b17dd1f8..1f22bbca5 100644
--- a/apps/tickets/models/ticket/login_confirm.py
+++ b/apps/tickets/models/ticket/login_confirm.py
@@ -9,7 +9,7 @@ __all__ = ['ApplyLoginTicket']
class ApplyLoginTicket(Ticket):
apply_login_ip = models.GenericIPAddressField(verbose_name=_('Login IP'), null=True)
apply_login_city = models.CharField(max_length=64, verbose_name=_('Login city'), null=True)
- apply_login_datetime = models.DateTimeField(verbose_name=_('Login datetime'), null=True)
+ apply_login_datetime = models.DateTimeField(verbose_name=_('Login Date'), null=True)
class Meta:
verbose_name = _('Apply Login Ticket')
diff --git a/apps/users/api/group.py b/apps/users/api/group.py
index 88ea7dbf2..90cfba315 100644
--- a/apps/users/api/group.py
+++ b/apps/users/api/group.py
@@ -1,5 +1,6 @@
# -*- coding: utf-8 -*-
#
+
from rest_framework import status
from rest_framework.decorators import action
from rest_framework.response import Response
diff --git a/apps/users/apps.py b/apps/users/apps.py
index f5aa7e269..e616212c8 100644
--- a/apps/users/apps.py
+++ b/apps/users/apps.py
@@ -6,7 +6,7 @@ from django.utils.translation import gettext_lazy as _
class UsersConfig(AppConfig):
name = 'users'
- verbose_name = _('Users')
+ verbose_name = _('App Users')
def ready(self):
from . import signal_handlers # noqa
diff --git a/apps/users/migrations/0001_initial.py b/apps/users/migrations/0001_initial.py
index 5c0f28a38..b4205d231 100644
--- a/apps/users/migrations/0001_initial.py
+++ b/apps/users/migrations/0001_initial.py
@@ -100,7 +100,7 @@ class Migration(migrations.Migration):
('ip', models.GenericIPAddressField(verbose_name='Login IP')),
('city', models.CharField(blank=True, max_length=254, null=True, verbose_name='Login city')),
('user_agent', models.CharField(blank=True, max_length=254, null=True, verbose_name='User agent')),
- ('datetime', models.DateTimeField(auto_now_add=True, verbose_name='Date login')),
+ ('datetime', models.DateTimeField(auto_now_add=True, verbose_name='Login Date')),
],
options={
'ordering': ['-datetime', 'username'],
diff --git a/apps/users/models/user.py b/apps/users/models/user.py
index e01e2b65e..58c5f6755 100644
--- a/apps/users/models/user.py
+++ b/apps/users/models/user.py
@@ -33,7 +33,7 @@ from ..signals import (
post_user_change_password, post_user_leave_org, pre_user_leave_org
)
-__all__ = ['User', 'UserPasswordHistory']
+__all__ = ['User', 'UserPasswordHistory', ]
logger = get_logger(__file__)
@@ -69,7 +69,7 @@ class AuthMixin:
if self.username:
self.date_password_last_updated = timezone.now()
post_user_change_password.send(self.__class__, user=self)
- super().set_password(raw_password) # noqa
+ super().set_password(raw_password) # noqa
def set_public_key(self, public_key):
if self.can_update_ssh_key():
@@ -383,15 +383,15 @@ class RoleMixin:
@lazyproperty
def console_orgs(self):
- return self.cached_orgs['console_orgs']
+ return self.cached_orgs.get('console_orgs', [])
@lazyproperty
def audit_orgs(self):
- return self.cached_orgs['audit_orgs']
+ return self.cached_orgs.get('audit_orgs', [])
@lazyproperty
def workbench_orgs(self):
- return self.cached_orgs['workbench_orgs']
+ return self.cached_orgs.get('workbench_orgs', [])
@lazyproperty
def joined_orgs(self):
@@ -747,21 +747,26 @@ class JSONFilterMixin:
return models.Q(id__in=user_id)
-class User(AuthMixin, TokenMixin, RoleMixin, MFAMixin, LabeledMixin, JSONFilterMixin, AbstractUser):
- class Source(models.TextChoices):
- local = 'local', _('Local')
- ldap = 'ldap', 'LDAP/AD'
- openid = 'openid', 'OpenID'
- radius = 'radius', 'Radius'
- cas = 'cas', 'CAS'
- saml2 = 'saml2', 'SAML2'
- oauth2 = 'oauth2', 'OAuth2'
- wecom = 'wecom', _('WeCom')
- dingtalk = 'dingtalk', _('DingTalk')
- feishu = 'feishu', _('FeiShu')
- lark = 'lark', _('Lark')
- slack = 'slack', _('Slack')
- custom = 'custom', 'Custom'
+class Source(models.TextChoices):
+ local = 'local', _('Local')
+ ldap = 'ldap', 'LDAP/AD'
+ openid = 'openid', 'OpenID'
+ radius = 'radius', 'Radius'
+ cas = 'cas', 'CAS'
+ saml2 = 'saml2', 'SAML2'
+ oauth2 = 'oauth2', 'OAuth2'
+ wecom = 'wecom', _('WeCom')
+ dingtalk = 'dingtalk', _('DingTalk')
+ feishu = 'feishu', _('FeiShu')
+ lark = 'lark', _('Lark')
+ slack = 'slack', _('Slack')
+ custom = 'custom', 'Custom'
+
+
+class SourceMixin:
+ source: str
+ _source_choices = []
+ Source = Source
SOURCE_BACKEND_MAPPING = {
Source.local: [
@@ -807,6 +812,61 @@ class User(AuthMixin, TokenMixin, RoleMixin, MFAMixin, LabeledMixin, JSONFilterM
]
}
+ @classmethod
+ def get_sources_enabled(cls):
+ mapper = {
+ cls.Source.local: True,
+ cls.Source.ldap: settings.AUTH_LDAP,
+ cls.Source.openid: settings.AUTH_OPENID,
+ cls.Source.radius: settings.AUTH_RADIUS,
+ cls.Source.cas: settings.AUTH_CAS,
+ cls.Source.saml2: settings.AUTH_SAML2,
+ cls.Source.oauth2: settings.AUTH_OAUTH2,
+ cls.Source.wecom: settings.AUTH_WECOM,
+ cls.Source.feishu: settings.AUTH_FEISHU,
+ cls.Source.slack: settings.AUTH_SLACK,
+ cls.Source.dingtalk: settings.AUTH_DINGTALK,
+ cls.Source.custom: settings.AUTH_CUSTOM
+ }
+ return [str(k) for k, v in mapper.items() if v]
+
+ @property
+ def source_display(self):
+ return self.get_source_display()
+
+ @property
+ def is_local(self):
+ return self.source == self.Source.local.value
+
+ @classmethod
+ def get_source_choices(cls):
+ if cls._source_choices:
+ return cls._source_choices
+ used = cls.objects.values_list('source', flat=True).order_by('source').distinct()
+ enabled_sources = cls.get_sources_enabled()
+ _choices = []
+ for k, v in cls.Source.choices:
+ if k in enabled_sources or k in used:
+ _choices.append((k, v))
+ cls._source_choices = _choices
+ return cls._source_choices
+
+ @classmethod
+ def get_user_allowed_auth_backend_paths(cls, username):
+ if not settings.ONLY_ALLOW_AUTH_FROM_SOURCE or not username:
+ return None
+ user = cls.objects.filter(username=username).first()
+ if not user:
+ return None
+ return user.get_allowed_auth_backend_paths()
+
+ def get_allowed_auth_backend_paths(self):
+ if not settings.ONLY_ALLOW_AUTH_FROM_SOURCE:
+ return None
+ return self.SOURCE_BACKEND_MAPPING.get(self.source, [])
+
+
+class User(AuthMixin, SourceMixin, TokenMixin, RoleMixin, MFAMixin, LabeledMixin, JSONFilterMixin, AbstractUser):
id = models.UUIDField(default=uuid.uuid4, primary_key=True)
username = models.CharField(
max_length=128, unique=True, verbose_name=_('Username')
@@ -856,7 +916,6 @@ class User(AuthMixin, TokenMixin, RoleMixin, MFAMixin, LabeledMixin, JSONFilterM
)
created_by = models.CharField(max_length=30, default='', blank=True, verbose_name=_('Created by'))
updated_by = models.CharField(max_length=30, default='', blank=True, verbose_name=_('Updated by'))
- source = models.CharField(max_length=30, default=Source.local, choices=Source.choices, verbose_name=_('Source'))
date_password_last_updated = models.DateTimeField(
auto_now_add=True, blank=True, null=True,
verbose_name=_('Date password last updated')
@@ -864,14 +923,17 @@ class User(AuthMixin, TokenMixin, RoleMixin, MFAMixin, LabeledMixin, JSONFilterM
need_update_password = models.BooleanField(
default=False, verbose_name=_('Need update password')
)
- date_api_key_last_used = models.DateTimeField(null=True, blank=True, verbose_name=_('Date api key used'))
- date_updated = models.DateTimeField(auto_now=True, verbose_name=_('Date updated'))
+ source = models.CharField(
+ max_length=30, default=Source.local,
+ choices=Source.choices, verbose_name=_('Source')
+ )
wecom_id = models.CharField(null=True, default=None, max_length=128, verbose_name=_('WeCom'))
dingtalk_id = models.CharField(null=True, default=None, max_length=128, verbose_name=_('DingTalk'))
feishu_id = models.CharField(null=True, default=None, max_length=128, verbose_name=_('FeiShu'))
lark_id = models.CharField(null=True, default=None, max_length=128, verbose_name='Lark')
slack_id = models.CharField(null=True, default=None, max_length=128, verbose_name=_('Slack'))
-
+ date_api_key_last_used = models.DateTimeField(null=True, blank=True, verbose_name=_('Date api key used'))
+ date_updated = models.DateTimeField(auto_now=True, verbose_name=_('Date updated'))
DATE_EXPIRED_WARNING_DAYS = 5
def __str__(self):
@@ -903,10 +965,6 @@ class User(AuthMixin, TokenMixin, RoleMixin, MFAMixin, LabeledMixin, JSONFilterM
def get_absolute_url(self):
return reverse('users:user-detail', args=(self.id,))
- @property
- def source_display(self):
- return self.get_source_display()
-
@property
def is_expired(self):
if self.date_expired and self.date_expired < timezone.now():
@@ -914,6 +972,12 @@ class User(AuthMixin, TokenMixin, RoleMixin, MFAMixin, LabeledMixin, JSONFilterM
else:
return False
+ def is_password_authenticate(self):
+ cas = self.Source.cas
+ saml2 = self.Source.saml2
+ oauth2 = self.Source.oauth2
+ return self.source not in [cas, saml2, oauth2]
+
@property
def expired_remain_days(self):
date_remain = self.date_expired - timezone.now()
@@ -932,16 +996,6 @@ class User(AuthMixin, TokenMixin, RoleMixin, MFAMixin, LabeledMixin, JSONFilterM
return True
return False
- @property
- def is_local(self):
- return self.source == self.Source.local.value
-
- def is_password_authenticate(self):
- cas = self.Source.cas
- saml2 = self.Source.saml2
- oauth2 = self.Source.oauth2
- return self.source not in [cas, saml2, oauth2]
-
def set_required_attr_if_need(self):
if not self.name:
self.name = self.username
@@ -1000,20 +1054,6 @@ class User(AuthMixin, TokenMixin, RoleMixin, MFAMixin, LabeledMixin, JSONFilterM
raise PermissionDenied(_('Can not delete admin user'))
return super(User, self).delete(using=using, keep_parents=keep_parents)
- @classmethod
- def get_user_allowed_auth_backend_paths(cls, username):
- if not settings.ONLY_ALLOW_AUTH_FROM_SOURCE or not username:
- return None
- user = cls.objects.filter(username=username).first()
- if not user:
- return None
- return user.get_allowed_auth_backend_paths()
-
- def get_allowed_auth_backend_paths(self):
- if not settings.ONLY_ALLOW_AUTH_FROM_SOURCE:
- return None
- return self.SOURCE_BACKEND_MAPPING.get(self.source, [])
-
class Meta:
ordering = ['username']
verbose_name = _("User")
diff --git a/apps/users/serializers/group.py b/apps/users/serializers/group.py
index bbfc04918..6e422414c 100644
--- a/apps/users/serializers/group.py
+++ b/apps/users/serializers/group.py
@@ -18,7 +18,7 @@ __all__ = [
class UserGroupSerializer(ResourceLabelsMixin, BulkOrgResourceModelSerializer):
users = ObjectRelatedField(
required=False, many=True, queryset=User.objects,
- attrs=("id", "name", "is_service_account"), label=_('User'),
+ attrs=("id", "name", "is_service_account"), label=_('Users'),
)
class Meta:
@@ -57,5 +57,4 @@ class UserGroupListSerializer(UserGroupSerializer):
fields = list(set(UserGroupSerializer.Meta.fields + ['users_amount']) - {'users'})
extra_kwargs = {
**UserGroupSerializer.Meta.extra_kwargs,
- 'users_amount': {'label': _('Users amount')},
}
diff --git a/apps/users/serializers/profile.py b/apps/users/serializers/profile.py
index eacc0bff3..6b04671f8 100644
--- a/apps/users/serializers/profile.py
+++ b/apps/users/serializers/profile.py
@@ -118,6 +118,7 @@ class UserProfileSerializer(UserSerializer):
]
fields = UserSerializer.Meta.fields + [
'public_key_comment', 'public_key_hash_md5', 'guide_url',
+ "wecom_id", "dingtalk_id", "feishu_id", "slack_id",
] + read_only_fields
extra_kwargs = dict(UserSerializer.Meta.extra_kwargs)
diff --git a/apps/users/serializers/user.py b/apps/users/serializers/user.py
index beb69b57e..8d91175c3 100644
--- a/apps/users/serializers/user.py
+++ b/apps/users/serializers/user.py
@@ -7,7 +7,7 @@ from django.conf import settings
from django.utils.translation import gettext_lazy as _
from rest_framework import serializers
-from common.serializers import CommonBulkSerializerMixin, ResourceLabelsMixin
+from common.serializers import ResourceLabelsMixin, CommonBulkModelSerializer
from common.serializers.fields import (
EncryptedField, ObjectRelatedField, LabeledChoiceField, PhoneField
)
@@ -85,13 +85,13 @@ class RolesSerializerMixin(serializers.Serializer):
return fields
-class UserSerializer(RolesSerializerMixin, CommonBulkSerializerMixin, ResourceLabelsMixin, serializers.ModelSerializer):
+class UserSerializer(RolesSerializerMixin, ResourceLabelsMixin, CommonBulkModelSerializer):
password_strategy = LabeledChoiceField(
choices=PasswordStrategy.choices,
default=PasswordStrategy.email,
allow_null=True,
required=False,
- label=_("Password strategy"),
+ label=_("Password setting"),
)
mfa_enabled = serializers.BooleanField(read_only=True, label=_("MFA enabled"))
mfa_force_enabled = serializers.BooleanField(
@@ -169,6 +169,12 @@ class UserSerializer(RolesSerializerMixin, CommonBulkSerializerMixin, ResourceLa
"allow_null": True,
"allow_blank": True,
},
+ "groups": {
+ "label": _("Groups"),
+ },
+ "is_superuser": {
+ "label": _("Superuser")
+ },
"public_key": {"write_only": True},
"is_first_login": {"label": _("Is first login"), "read_only": True},
"is_active": {"label": _("Is active")},
@@ -302,8 +308,8 @@ class InviteSerializer(RolesSerializerMixin, serializers.Serializer):
users = serializers.PrimaryKeyRelatedField(
queryset=User.get_nature_users(),
many=True,
- label=_("Select users"),
- help_text=_("For security, only list several users"),
+ label=_("Users"),
+ help_text=_("For security, only a partial of users is displayed. You can search for more"),
)
system_roles = None
diff --git a/apps/users/signal_handlers.py b/apps/users/signal_handlers.py
index 61548b6af..b19292762 100644
--- a/apps/users/signal_handlers.py
+++ b/apps/users/signal_handlers.py
@@ -16,9 +16,11 @@ from authentication.backends.saml2.signals import saml2_create_or_update_user
from common.const.crontab import CRONTAB_AT_AM_TWO
from common.decorators import on_transaction_commit
from common.sessions.cache import user_session_manager
+from common.signals import django_ready
from common.utils import get_logger
from jumpserver.utils import get_current_request
from ops.celery.decorator import register_as_period_task
+from settings.signals import setting_changed
from .models import User, UserPasswordHistory
from .signals import post_user_create
@@ -175,3 +177,16 @@ def user_logged_out_callback(sender, request, user, **kwargs):
session_key = request.session.session_key
user_session_manager.remove(session_key)
UserSession.objects.filter(key=session_key).delete()
+
+
+@receiver(setting_changed)
+@on_transaction_commit
+def on_auth_setting_changed_clear_source_choice(sender, name='', **kwargs):
+ print("Receive setting changed signal: {}".format(name))
+ if name.startswith('AUTH_'):
+ User._source_choices = []
+
+
+@receiver(django_ready)
+def on_django_ready_refresh_source(sender, **kwargs):
+ User._source_choices = []
diff --git a/jms b/jms
index 0b2cf94d0..943e19e11 100755
--- a/jms
+++ b/jms
@@ -101,7 +101,7 @@ def collect_static():
def compile_i18n_file():
- django_mo_file = os.path.join(BASE_DIR, 'apps', 'locale', 'zh', 'LC_MESSAGES', 'django.mo')
+ django_mo_file = os.path.join(BASE_DIR, 'apps', 'core', 'locale', 'zh', 'LC_MESSAGES', 'django.mo')
if os.path.exists(django_mo_file):
return
os.chdir(os.path.join(BASE_DIR, 'apps'))
diff --git a/poetry.lock b/poetry.lock
index 1ba0c6f97..0130c01a3 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -17,11 +17,6 @@ PyJWT = ">=1.0.0,<3"
python-dateutil = ">=2.1.0,<3"
requests = ">=2.0.0,<3"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "aiofiles"
version = "23.1.0"
@@ -33,11 +28,6 @@ files = [
{file = "aiofiles-23.1.0.tar.gz", hash = "sha256:edd247df9a19e0db16534d4baaf536d6609a43e1de5401d7a4c1c148753a1635"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "aiohttp"
version = "3.8.6"
@@ -146,11 +136,6 @@ yarl = ">=1.0,<2.0"
[package.extras]
speedups = ["Brotli", "aiodns", "cchardet"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "aiosignal"
version = "1.3.1"
@@ -165,11 +150,6 @@ files = [
[package.dependencies]
frozenlist = ">=1.1.0"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "alibabacloud-credentials"
version = "0.3.2"
@@ -183,11 +163,6 @@ files = [
[package.dependencies]
alibabacloud-tea = "*"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "alibabacloud-dysmsapi20170525"
version = "2.0.24"
@@ -205,11 +180,6 @@ alibabacloud-openapi-util = ">=0.2.1,<1.0.0"
alibabacloud-tea-openapi = ">=0.3.6,<1.0.0"
alibabacloud-tea-util = ">=0.3.9,<1.0.0"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "alibabacloud-endpoint-util"
version = "0.0.3"
@@ -223,11 +193,6 @@ files = [
[package.dependencies]
alibabacloud-tea = ">=0.0.1"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "alibabacloud-gateway-spi"
version = "0.0.1"
@@ -241,11 +206,6 @@ files = [
[package.dependencies]
alibabacloud_credentials = ">=0.2.0,<1.0.0"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "alibabacloud-openapi-util"
version = "0.2.2"
@@ -260,19 +220,14 @@ files = [
alibabacloud_tea_util = ">=0.0.2"
cryptography = ">=3.0.0"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "alibabacloud-tea"
-version = "0.3.5"
+version = "0.3.6"
description = "The tea module of alibabaCloud Python SDK."
optional = false
python-versions = ">=3.6"
files = [
- {file = "alibabacloud-tea-0.3.5.tar.gz", hash = "sha256:25a5d14ed955301e381e966f66de961544356a04ba954fcf65f007f75a5c3c26"},
+ {file = "alibabacloud-tea-0.3.6.tar.gz", hash = "sha256:ea7180c80b41ccddad1d474285f0da6ba9aa6ba898bcbc84e88409312a67a52a"},
]
[package.dependencies]
@@ -280,11 +235,6 @@ aiohttp = ">=3.7.0,<3.9.0"
requests = ">=2.21.0,<3.0.0"
urllib3 = "<2.0.0"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "alibabacloud-tea-openapi"
version = "0.3.8"
@@ -302,11 +252,6 @@ alibabacloud_openapi_util = ">=0.2.1,<1.0.0"
alibabacloud_tea_util = ">=0.3.11,<1.0.0"
alibabacloud_tea_xml = ">=0.0.2,<1.0.0"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "alibabacloud-tea-util"
version = "0.3.11"
@@ -320,11 +265,6 @@ files = [
[package.dependencies]
alibabacloud-tea = ">=0.3.3"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "alibabacloud-tea-xml"
version = "0.0.2"
@@ -338,11 +278,6 @@ files = [
[package.dependencies]
alibabacloud-tea = ">=0.0.1"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "aliyun-python-sdk-core"
version = "2.15.0"
@@ -357,11 +292,6 @@ files = [
cryptography = ">=2.6.0"
jmespath = ">=0.9.3,<1.0.0"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "aliyun-python-sdk-core-v3"
version = "2.13.33"
@@ -376,11 +306,6 @@ files = [
cryptography = ">=2.6.0"
jmespath = ">=0.9.3,<1.0.0"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "aliyun-python-sdk-ecs"
version = "4.24.64"
@@ -395,11 +320,6 @@ files = [
[package.dependencies]
aliyun-python-sdk-core = ">=2.11.5"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "aliyun-python-sdk-kms"
version = "2.16.2"
@@ -414,11 +334,6 @@ files = [
[package.dependencies]
aliyun-python-sdk-core = ">=2.11.5"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "amqp"
version = "5.1.1"
@@ -433,11 +348,6 @@ files = [
[package.dependencies]
vine = ">=5.0.0"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "annotated-types"
version = "0.6.0"
@@ -449,11 +359,6 @@ files = [
{file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "ansible"
version = "7.1.0"
@@ -468,11 +373,6 @@ files = [
[package.dependencies]
ansible-core = ">=2.14.1,<2.15.0"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "ansible-core"
version = "2.14.1"
@@ -512,11 +412,6 @@ python-daemon = "*"
pyyaml = "*"
six = "*"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "anyio"
version = "4.3.0"
@@ -537,11 +432,6 @@ doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphin
test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"]
trio = ["trio (>=0.23)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "appnope"
version = "0.1.4"
@@ -553,30 +443,20 @@ files = [
{file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "asgiref"
-version = "3.7.2"
+version = "3.8.1"
description = "ASGI specs, helper code, and adapters"
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
files = [
- {file = "asgiref-3.7.2-py3-none-any.whl", hash = "sha256:89b2ef2247e3b562a16eef663bc0e2e703ec6468e2fa8a5cd61cd449786d4f6e"},
- {file = "asgiref-3.7.2.tar.gz", hash = "sha256:9e0ce3aa93a819ba5b45120216b23878cf6e8525eb3848653452b4192b92afed"},
+ {file = "asgiref-3.8.1-py3-none-any.whl", hash = "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47"},
+ {file = "asgiref-3.8.1.tar.gz", hash = "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590"},
]
[package.extras]
tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "asn1crypto"
version = "1.5.1"
@@ -588,11 +468,6 @@ files = [
{file = "asn1crypto-1.5.1.tar.gz", hash = "sha256:13ae38502be632115abf8a24cbe5f4da52e3b5231990aff31123c805306ccb9c"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "asttokens"
version = "2.4.1"
@@ -611,11 +486,6 @@ six = ">=1.12.0"
astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"]
test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "async-timeout"
version = "4.0.3"
@@ -627,11 +497,6 @@ files = [
{file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "attrs"
version = "23.2.0"
@@ -651,11 +516,6 @@ tests = ["attrs[tests-no-zope]", "zope-interface"]
tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"]
tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "autobahn"
version = "23.6.2"
@@ -684,11 +544,6 @@ twisted = ["attrs (>=20.3.0)", "twisted (>=20.3.0)", "zope.interface (>=5.2.0)"]
ui = ["PyGObject (>=3.40.0)"]
xbr = ["base58 (>=2.1.0)", "bitarray (>=2.7.5)", "cbor2 (>=5.2.0)", "click (>=8.1.2)", "ecdsa (>=0.16.1)", "eth-abi (>=4.0.0)", "hkdf (>=0.0.3)", "jinja2 (>=2.11.3)", "mnemonic (>=0.19)", "py-ecc (>=5.1.0)", "py-eth-sig-utils (>=0.4.0)", "py-multihash (>=2.0.1)", "rlp (>=2.0.1)", "spake2 (>=0.8)", "twisted (>=20.3.0)", "web3[ipfs] (>=6.0.0)", "xbr (>=21.2.1)", "yapf (==0.29.0)", "zlmdb (>=21.2.1)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "automat"
version = "22.10.0"
@@ -707,11 +562,6 @@ six = "*"
[package.extras]
visualize = ["Twisted (>=16.1.1)", "graphviz (>0.5.1)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "azure-common"
version = "1.1.28"
@@ -723,11 +573,6 @@ files = [
{file = "azure_common-1.1.28-py2.py3-none-any.whl", hash = "sha256:5c12d3dcf4ec20599ca6b0d3e09e86e146353d443e7fcc050c9a19c1f9df20ad"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "azure-core"
version = "1.30.1"
@@ -747,11 +592,6 @@ typing-extensions = ">=4.6.0"
[package.extras]
aio = ["aiohttp (>=3.0)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "azure-identity"
version = "1.13.0"
@@ -770,11 +610,6 @@ msal = ">=1.20.0,<2.0.0"
msal-extensions = ">=0.3.0,<2.0.0"
six = ">=1.12.0"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "azure-mgmt-compute"
version = "30.0.0"
@@ -791,11 +626,6 @@ azure-common = ">=1.1,<2.0"
azure-mgmt-core = ">=1.3.2,<2.0.0"
isodate = ">=0.6.1,<1.0.0"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "azure-mgmt-core"
version = "1.4.0"
@@ -810,11 +640,6 @@ files = [
[package.dependencies]
azure-core = ">=1.26.2,<2.0.0"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "azure-mgmt-network"
version = "23.1.0"
@@ -831,11 +656,6 @@ azure-common = ">=1.1,<2.0"
azure-mgmt-core = ">=1.3.2,<2.0.0"
isodate = ">=0.6.1,<1.0.0"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "azure-mgmt-subscription"
version = "3.1.1"
@@ -852,11 +672,6 @@ azure-common = ">=1.1,<2.0"
azure-mgmt-core = ">=1.3.2,<2.0.0"
msrest = ">=0.7.1"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "azure-storage-blob"
version = "12.17.0"
@@ -877,11 +692,6 @@ typing-extensions = ">=4.3.0"
[package.extras]
aio = ["azure-core[aio] (>=1.28.0,<2.0.0)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "backcall"
version = "0.2.0"
@@ -893,11 +703,6 @@ files = [
{file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "bce-python-sdk"
version = "0.8.87"
@@ -914,11 +719,6 @@ future = ">=0.6.0"
pycryptodome = ">=3.8.0"
six = ">=1.4.0"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "bcrypt"
version = "4.0.1"
@@ -953,11 +753,6 @@ files = [
tests = ["pytest (>=3.2.1,!=3.3.0)"]
typecheck = ["mypy"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "beautifulsoup4"
version = "4.12.3"
@@ -979,11 +774,6 @@ charset-normalizer = ["charset-normalizer"]
html5lib = ["html5lib"]
lxml = ["lxml"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "billiard"
version = "4.1.0"
@@ -995,11 +785,6 @@ files = [
{file = "billiard-4.1.0.tar.gz", hash = "sha256:1ad2eeae8e28053d729ba3373d34d9d6e210f6e4d8bf0a9c64f92bd053f1edf5"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "boto"
version = "2.49.0"
@@ -1011,11 +796,6 @@ files = [
{file = "boto-2.49.0.tar.gz", hash = "sha256:ea0d3b40a2d852767be77ca343b58a9e3a4b00d9db440efb8da74b4e58025e5a"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "boto3"
version = "1.28.9"
@@ -1035,11 +815,6 @@ s3transfer = ">=0.6.0,<0.7.0"
[package.extras]
crt = ["botocore[crt] (>=1.21.0,<2.0a0)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "botocore"
version = "1.31.9"
@@ -1059,11 +834,6 @@ urllib3 = ">=1.25.4,<1.27"
[package.extras]
crt = ["awscrt (==0.16.26)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "cached-property"
version = "1.5.2"
@@ -1075,11 +845,6 @@ files = [
{file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "cachetools"
version = "5.3.3"
@@ -1091,11 +856,6 @@ files = [
{file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "celery"
version = "5.3.1"
@@ -1151,11 +911,6 @@ yaml = ["PyYAML (>=3.10)"]
zookeeper = ["kazoo (>=1.3.1)"]
zstd = ["zstandard (==0.21.0)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "certifi"
version = "2023.7.22"
@@ -1167,11 +922,6 @@ files = [
{file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "cffi"
version = "1.15.1"
@@ -1248,11 +998,6 @@ files = [
[package.dependencies]
pycparser = "*"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "channels"
version = "4.0.0"
@@ -1272,11 +1017,6 @@ Django = ">=3.2"
daphne = ["daphne (>=4.0.0)"]
tests = ["async-timeout", "coverage (>=4.5,<5.0)", "pytest", "pytest-asyncio", "pytest-django"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "channels-redis"
version = "4.1.0"
@@ -1298,11 +1038,6 @@ redis = ">=4.5.3"
cryptography = ["cryptography (>=1.3.0)"]
tests = ["async-timeout", "cryptography (>=1.3.0)", "pytest", "pytest-asyncio", "pytest-timeout"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "chardet"
version = "5.1.0"
@@ -1314,11 +1049,6 @@ files = [
{file = "chardet-5.1.0.tar.gz", hash = "sha256:0d62712b956bc154f85fb0a266e2a3c5913c2967e00348701b32411d6def31e5"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "charset-normalizer"
version = "3.3.2"
@@ -1418,11 +1148,6 @@ files = [
{file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "click"
version = "8.1.7"
@@ -1437,30 +1162,20 @@ files = [
[package.dependencies]
colorama = {version = "*", markers = "platform_system == \"Windows\""}
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "click-didyoumean"
-version = "0.3.0"
+version = "0.3.1"
description = "Enables git-like *did-you-mean* feature in click"
optional = false
-python-versions = ">=3.6.2,<4.0.0"
+python-versions = ">=3.6.2"
files = [
- {file = "click-didyoumean-0.3.0.tar.gz", hash = "sha256:f184f0d851d96b6d29297354ed981b7dd71df7ff500d82fa6d11f0856bee8035"},
- {file = "click_didyoumean-0.3.0-py3-none-any.whl", hash = "sha256:a0713dc7a1de3f06bc0df5a9567ad19ead2d3d5689b434768a6145bff77c0667"},
+ {file = "click_didyoumean-0.3.1-py3-none-any.whl", hash = "sha256:5c4bb6007cfea5f2fd6583a2fb6701a22a41eb98957e63d0fac41c10e7c3117c"},
+ {file = "click_didyoumean-0.3.1.tar.gz", hash = "sha256:4f82fdff0dbe64ef8ab2279bd6aa3f6a99c3b28c05aa09cbfc07c9d7fbb5a463"},
]
[package.dependencies]
click = ">=7"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "click-plugins"
version = "1.1.1"
@@ -1478,11 +1193,6 @@ click = ">=4.0"
[package.extras]
dev = ["coveralls", "pytest (>=3.6)", "pytest-cov", "wheel"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "click-repl"
version = "0.3.0"
@@ -1501,11 +1211,6 @@ prompt-toolkit = ">=3.0.36"
[package.extras]
testing = ["pytest (>=7.2.1)", "pytest-cov (>=4.0.0)", "tox (>=4.4.3)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "colorama"
version = "0.4.6"
@@ -1517,11 +1222,6 @@ files = [
{file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "configparser"
version = "6.0.0"
@@ -1537,11 +1237,6 @@ files = [
docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff", "types-backports"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "constantly"
version = "23.10.4"
@@ -1553,11 +1248,6 @@ files = [
{file = "constantly-23.10.4.tar.gz", hash = "sha256:aa92b70a33e2ac0bb33cd745eb61776594dc48764b06c35e0efd050b7f1c7cbd"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "coreapi"
version = "2.3.3"
@@ -1575,11 +1265,6 @@ itypes = "*"
requests = "*"
uritemplate = "*"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "coreschema"
version = "0.0.4"
@@ -1594,11 +1279,6 @@ files = [
[package.dependencies]
jinja2 = "*"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "crcmod"
version = "1.7"
@@ -1609,11 +1289,6 @@ files = [
{file = "crcmod-1.7.tar.gz", hash = "sha256:dc7051a0db5f2bd48665a990d3ec1cc305a466a77358ca4492826f41f283601e"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "cron-descriptor"
version = "1.4.3"
@@ -1628,11 +1303,6 @@ files = [
[package.extras]
dev = ["polib"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "cryptography"
version = "41.0.2"
@@ -1678,11 +1348,6 @@ ssh = ["bcrypt (>=3.1.5)"]
test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"]
test-randomorder = ["pytest-randomly"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "cython"
version = "3.0.0"
@@ -1750,11 +1415,6 @@ files = [
{file = "Cython-3.0.0.tar.gz", hash = "sha256:350b18f9673e63101dbbfcf774ee2f57c20ac4636d255741d76ca79016b1bd82"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "daphne"
version = "4.0.0"
@@ -1774,11 +1434,6 @@ twisted = {version = ">=22.4", extras = ["tls"]}
[package.extras]
tests = ["django", "hypothesis", "pytest", "pytest-asyncio"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "data-tree"
version = "0.0.1"
@@ -1790,11 +1445,6 @@ files = [
{file = "data_tree-0.0.1.tar.gz", hash = "sha256:06f2a18b372cf2451166d426591f6e6fc73a7aabcad97255d50927aa3c3d5a0e"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "debtcollector"
version = "3.0.0"
@@ -1809,11 +1459,6 @@ files = [
[package.dependencies]
wrapt = ">=1.7.0"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "decorator"
version = "5.1.1"
@@ -1825,11 +1470,6 @@ files = [
{file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "defusedxml"
version = "0.7.1"
@@ -1841,11 +1481,6 @@ files = [
{file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "distro"
version = "1.9.0"
@@ -1857,11 +1492,6 @@ files = [
{file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "django"
version = "4.1.13"
@@ -1882,11 +1512,6 @@ tzdata = {version = "*", markers = "sys_platform == \"win32\""}
argon2 = ["argon2-cffi (>=19.1.0)"]
bcrypt = ["bcrypt"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "django-auth-ldap"
version = "4.4.0"
@@ -1902,11 +1527,6 @@ files = [
Django = ">=3.2"
python-ldap = ">=3.1"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "django-bootstrap3"
version = "23.4"
@@ -1922,11 +1542,6 @@ files = [
beautifulsoup4 = ">=4.8.0"
django = ">=3.2"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "django-cas-ng"
version = "4.3.0"
@@ -1963,11 +1578,6 @@ django-timezone-field = ">=5.0"
python-crontab = ">=2.3.4"
tzdata = "*"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "django-cors-headers"
version = "4.3.1"
@@ -1983,11 +1593,6 @@ files = [
asgiref = ">=3.6"
Django = ">=3.2"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "django-debug-toolbar"
version = "4.1.0"
@@ -2003,11 +1608,6 @@ files = [
django = ">=3.2.4"
sqlparse = ">=0.2"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "django-filter"
version = "23.2"
@@ -2022,11 +1622,6 @@ files = [
[package.dependencies]
Django = ">=3.2"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "django-formtools"
version = "2.4.1"
@@ -2041,11 +1636,6 @@ files = [
[package.dependencies]
Django = ">=3.2"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "django-private-storage"
version = "3.1"
@@ -2057,11 +1647,6 @@ files = [
{file = "django_private_storage-3.1-py3-none-any.whl", hash = "sha256:cd11fa3c40e15bf902b3566dde8082c86f1cbb2900115f15c63e4b5278d96fe7"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "django-proxy"
version = "1.2.2"
@@ -2075,11 +1660,6 @@ files = [
[package.dependencies]
requests = "*"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "django-radius"
version = "1.4.0"
@@ -2110,11 +1690,6 @@ files = [
[package.dependencies]
django = "*"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "django-redis"
version = "5.3.0"
@@ -2133,11 +1708,6 @@ redis = ">=3,<4.0.0 || >4.0.0,<4.0.1 || >4.0.1"
[package.extras]
hiredis = ["redis[hiredis] (>=3,!=4.0.0,!=4.0.1)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "django-rest-swagger"
version = "2.2.0"
@@ -2155,11 +1725,6 @@ djangorestframework = ">=3.5.4"
openapi-codec = ">=1.3.1"
simplejson = "*"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "django-simple-captcha"
version = "0.5.18"
@@ -2179,11 +1744,6 @@ Pillow = ">=6.2.0"
[package.extras]
test = ["testfixtures"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "django-simple-history"
version = "3.3.0"
@@ -2195,11 +1755,6 @@ files = [
{file = "django_simple_history-3.3.0-py3-none-any.whl", hash = "sha256:dc1f98e558a0a1e0b6371c3b8efb85f86e02a6db56e83d0ec198343b7408d00a"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "django-timezone-field"
version = "5.1"
@@ -2215,11 +1770,6 @@ files = [
Django = ">=2.2,<3.0.dev0 || >=3.2.dev0,<5.0"
pytz = "*"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "djangorestframework"
version = "3.14.0"
@@ -2235,11 +1785,6 @@ files = [
django = ">=3.0"
pytz = "*"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "djangorestframework-bulk"
version = "0.2.1"
@@ -2255,11 +1800,6 @@ django = "*"
djangorestframework = "*"
setuptools = "*"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "dnspython"
version = "2.6.1"
@@ -2280,11 +1820,6 @@ idna = ["idna (>=3.6)"]
trio = ["trio (>=0.23)"]
wmi = ["wmi (>=1.5.1)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "docutils"
version = "0.20.1"
@@ -2296,11 +1831,6 @@ files = [
{file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "drf-nested-routers"
version = "0.93.4"
@@ -2316,11 +1846,6 @@ files = [
Django = ">=1.11"
djangorestframework = ">=3.6.0"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "drf-writable-nested"
version = "0.7.0"
@@ -2331,11 +1856,6 @@ files = [
{file = "drf_writable_nested-0.7.0-py3-none-any.whl", hash = "sha256:154c0381e8a3a477e0fd539d5e1caf8ff4c1097a9c0c0fe741d4858b11b0455b"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "drf-yasg"
version = "1.21.7"
@@ -2360,11 +1880,6 @@ uritemplate = ">=3.0.0"
coreapi = ["coreapi (>=2.3.3)", "coreschema (>=0.0.4)"]
validation = ["swagger-spec-validator (>=2.1.0)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "ecdsa"
version = "0.18.0"
@@ -2383,11 +1898,6 @@ six = ">=1.9.0"
gmpy = ["gmpy"]
gmpy2 = ["gmpy2"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "elasticsearch"
version = "7.8.0"
@@ -2409,11 +1919,6 @@ develop = ["black", "coverage", "jinja2", "mock", "pytest", "pytest-cov", "pyyam
docs = ["sphinx (<1.7)", "sphinx-rtd-theme"]
requests = ["requests (>=2.4.0,<3.0.0)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "enum-compat"
version = "0.0.3"
@@ -2425,11 +1930,6 @@ files = [
{file = "enum_compat-0.0.3-py3-none-any.whl", hash = "sha256:88091b617c7fc3bbbceae50db5958023c48dc40b50520005aa3bf27f8f7ea157"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "ephem"
version = "4.1.4"
@@ -2459,6 +1959,17 @@ files = [
{file = "ephem-4.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8f9b27117e7a82f7f70db9cb23b5cc36d37b166a2f73c55e14d7225d0ab95afa"},
{file = "ephem-4.1.4-cp311-cp311-win32.whl", hash = "sha256:9bb21c0b117c9122c0141b0a71ee6fbbb087ed2aab4a7ab60f009e95e9f4a521"},
{file = "ephem-4.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:55d7fb5c34b2e453e01fa4ca7ee375b19b438c9401ae8c4099ae4a3a37656972"},
+ {file = "ephem-4.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f9e24aeea560dfcece3c2e313eb94e6be3e84888091455e541fa88f3a44da584"},
+ {file = "ephem-4.1.4-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:653d99386932e5f78bb9cfc4495030ad9f3345eb4c2b32dca55547da8f1f0332"},
+ {file = "ephem-4.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53786461a6d5799d5fffe76622ad51444b264d1c7263b92a6dfcac640c3da93a"},
+ {file = "ephem-4.1.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:268f57f8768ccb0abbdf4cefb4781c7db812950019868f687b407b428513ee53"},
+ {file = "ephem-4.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d630aa287255ea9fba6962f351e4e0729bb620570684d52fbfcc31b11527f09e"},
+ {file = "ephem-4.1.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b5f229bbf62ecb4cd6bb3374b15d0f8ff7b3d970c2936fccd89bdf9d693907a2"},
+ {file = "ephem-4.1.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:d60d56f182de54bd84fadd6ea2dd8e8ef6fdef6a698c7cafd404ecb6eeefa598"},
+ {file = "ephem-4.1.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:404500c8d0030d75ec15bb6b98eee78ad163fd5252102c962ae6fb39c9488198"},
+ {file = "ephem-4.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9fb020d6cc5ab1ad1cd9d3da4a6e2506beebb41d1b337d79cc20cc0a17f550f1"},
+ {file = "ephem-4.1.4-cp312-cp312-win32.whl", hash = "sha256:29e71636ee4719419d03184abc85085f76989c79a61844f5e60acbf2513d2b42"},
+ {file = "ephem-4.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:549654f63d88e0ab6248ae25ac2939131474ab9f3a91bee6b68ca6f214747c2a"},
{file = "ephem-4.1.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:40067fc050c946c8d4c2d779805b61f063471a091e6124cbabcf61ac538011b2"},
{file = "ephem-4.1.4-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e2abe97aa2b091090012768b4d94793213cc01f0bf040dcc311a380ab08df69"},
{file = "ephem-4.1.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b2677d3a5b42aedc578de10b0eecdba6a50731f159cb28f7ad38c5f62143494"},
@@ -2506,11 +2017,6 @@ files = [
{file = "ephem-4.1.4.tar.gz", hash = "sha256:73a59f0d2162d1624535c3c3b75f956556bdbb2055eaf554a7bef147d3f9c760"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "esdk-obs-python"
version = "3.21.4"
@@ -2521,11 +2027,6 @@ files = [
{file = "esdk-obs-python-3.21.4.tar.gz", hash = "sha256:a3b2a01b0a10768b5b02812abe239048feaae199256cbde67315870121d8ab1e"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "et-xmlfile"
version = "1.1.0"
@@ -2537,11 +2038,6 @@ files = [
{file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "eventlet"
version = "0.33.3"
@@ -2558,11 +2054,6 @@ dnspython = ">=1.15.0"
greenlet = ">=0.3"
six = ">=1.10.0"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "exchangelib"
version = "5.2.0"
@@ -2593,11 +2084,6 @@ complete = ["requests-gssapi", "requests-negotiate-sspi"]
kerberos = ["requests-gssapi"]
sspi = ["requests-negotiate-sspi"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "executing"
version = "2.0.1"
@@ -2612,33 +2098,23 @@ files = [
[package.extras]
tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "fido2"
-version = "1.1.2"
+version = "1.1.3"
description = "FIDO2/WebAuthn library for implementing clients and servers."
optional = false
-python-versions = ">=3.7,<4.0"
+python-versions = ">=3.8,<4.0"
files = [
- {file = "fido2-1.1.2-py3-none-any.whl", hash = "sha256:a3b7d7d233dec3a4fa0d6178fc34d1cce17b820005a824f6ab96917a1e3be8d8"},
- {file = "fido2-1.1.2.tar.gz", hash = "sha256:6110d913106f76199201b32d262b2857562cc46ba1d0b9c51fbce30dc936c573"},
+ {file = "fido2-1.1.3-py3-none-any.whl", hash = "sha256:6be34c0b9fe85e4911fd2d103cce7ae8ce2f064384a7a2a3bd970b3ef7702931"},
+ {file = "fido2-1.1.3.tar.gz", hash = "sha256:26100f226d12ced621ca6198528ce17edf67b78df4287aee1285fee3cd5aa9fc"},
]
[package.dependencies]
-cryptography = ">=2.6,<35 || >35,<44"
+cryptography = ">=2.6,<35 || >35,<45"
[package.extras]
pcsc = ["pyscard (>=1.9,<3)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "flower"
version = "2.0.1"
@@ -2657,11 +2133,6 @@ prometheus-client = ">=0.8.0"
pytz = "*"
tornado = ">=5.0.0,<7.0.0"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "forgerypy3"
version = "0.3.1"
@@ -2672,11 +2143,6 @@ files = [
{file = "ForgeryPy3-0.3.1.tar.gz", hash = "sha256:03db26b2129252dc8c8c91aa5661171725a64707773c03c3ca0251b1dd173c93"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "frozenlist"
version = "1.4.1"
@@ -2763,11 +2229,6 @@ files = [
{file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "future"
version = "0.18.3"
@@ -2778,11 +2239,6 @@ files = [
{file = "future-0.18.3.tar.gz", hash = "sha256:34a17436ed1e96697a86f9de3d15a3b0be01d8bc8de9c1dffd59fb8234ed5307"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "geoip2"
version = "4.7.0"
@@ -2799,11 +2255,6 @@ aiohttp = ">=3.6.2,<4.0.0"
maxminddb = ">=2.3.0,<3.0.0"
requests = ">=2.24.0,<3.0.0"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "gmssl"
version = "3.2.2"
@@ -2812,16 +2263,12 @@ optional = false
python-versions = "*"
files = [
{file = "gmssl-3.2.2-py3-none-any.whl", hash = "sha256:59f069a91eb19ef59b9e7be4d436ed01c92ce064d3d7d45a8778fc07fd2cd068"},
+ {file = "gmssl-3.2.2.linux-x86_64.tar.gz", hash = "sha256:f3d8c8c75dd34cd169f129c017f67fdd80cce2c67a13f9a0e3b1c58f8de6351e"},
]
[package.dependencies]
pycryptodomex = "*"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "google-api-core"
version = "2.17.1"
@@ -2846,11 +2293,6 @@ grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status
grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"]
grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "google-auth"
version = "2.28.2"
@@ -2874,11 +2316,6 @@ pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"]
reauth = ["pyu2f (>=0.1.5)"]
requests = ["requests (>=2.20.0,<3.0.0.dev0)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "google-cloud-compute"
version = "1.15.0"
@@ -2895,20 +2332,15 @@ google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extr
proto-plus = ">=1.22.3,<2.0.0dev"
protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "googleapis-common-protos"
-version = "1.62.0"
+version = "1.63.0"
description = "Common protobufs used in Google APIs"
optional = false
python-versions = ">=3.7"
files = [
- {file = "googleapis-common-protos-1.62.0.tar.gz", hash = "sha256:83f0ece9f94e5672cced82f592d2a5edf527a96ed1794f0bab36d5735c996277"},
- {file = "googleapis_common_protos-1.62.0-py2.py3-none-any.whl", hash = "sha256:4750113612205514f9f6aa4cb00d523a94f3e8c06c5ad2fee466387dc4875f07"},
+ {file = "googleapis-common-protos-1.63.0.tar.gz", hash = "sha256:17ad01b11d5f1d0171c06d3ba5c04c54474e883b66b949722b4938ee2694ef4e"},
+ {file = "googleapis_common_protos-1.63.0-py2.py3-none-any.whl", hash = "sha256:ae45f75702f7c08b541f750854a678bd8f534a1a6bace6afe975f1d0a82d6632"},
]
[package.dependencies]
@@ -2917,11 +2349,6 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4
[package.extras]
grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "greenlet"
version = "3.0.1"
@@ -2992,11 +2419,6 @@ files = [
docs = ["Sphinx"]
test = ["objgraph", "psutil"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "grpcio"
version = "1.62.1"
@@ -3084,11 +2506,6 @@ googleapis-common-protos = ">=1.5.5"
grpcio = ">=1.62.1"
protobuf = ">=4.21.6"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "gunicorn"
version = "21.2.0"
@@ -3109,11 +2526,6 @@ gevent = ["gevent (>=1.4.0)"]
setproctitle = ["setproctitle"]
tornado = ["tornado (>=0.2)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "h11"
version = "0.14.0"
@@ -3125,11 +2537,6 @@ files = [
{file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "html2text"
version = "2020.1.16"
@@ -3141,11 +2548,6 @@ files = [
{file = "html2text-2020.1.16.tar.gz", hash = "sha256:e296318e16b059ddb97f7a8a1d6a5c1d7af4544049a01e261731d2d5cc277bbb"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "httpcore"
version = "1.0.4"
@@ -3187,11 +2589,6 @@ files = [
pycryptodome = ">=3,<4"
six = "*"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "httpx"
version = "0.27.0"
@@ -3216,11 +2613,6 @@ cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"]
http2 = ["h2 (>=3,<5)"]
socks = ["socksio (==1.*)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "huaweicloudsdkcore"
version = "3.1.52"
@@ -3242,11 +2634,6 @@ typing-extensions = "*"
[package.extras]
python-version-2-7- = ["certifi (>=2022.12.7)", "configparser (>=4.0.2)", "futures (>=3.3.0)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "huaweicloudsdkecs"
version = "3.1.52"
@@ -3260,11 +2647,6 @@ files = [
[package.dependencies]
huaweicloudsdkcore = ">=3.1.52"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "humanize"
version = "4.9.0"
@@ -3279,11 +2661,6 @@ files = [
[package.extras]
tests = ["freezegun", "pytest", "pytest-cov"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "hvac"
version = "1.1.1"
@@ -3299,11 +2676,6 @@ files = [
pyhcl = ">=0.4.4,<0.5.0"
requests = ">=2.27.1,<3.0.0"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "hyperlink"
version = "21.0.0"
@@ -3318,11 +2690,6 @@ files = [
[package.dependencies]
idna = ">=2.5"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "idna"
version = "3.4"
@@ -3334,11 +2701,6 @@ files = [
{file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "incremental"
version = "22.10.0"
@@ -3354,11 +2716,6 @@ files = [
mypy = ["click (>=6.0)", "mypy (==0.812)", "twisted (>=16.4.0)"]
scripts = ["click (>=6.0)", "twisted (>=16.4.0)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "inflection"
version = "0.5.1"
@@ -3370,11 +2727,6 @@ files = [
{file = "inflection-0.5.1.tar.gz", hash = "sha256:1a29730d366e996aaacffb2f1f1cb9593dc38e2ddd30c91250c6dde09ea9b417"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "ipip-ipdb"
version = "1.6.1"
@@ -3385,11 +2737,6 @@ files = [
{file = "ipip-ipdb-1.6.1.tar.gz", hash = "sha256:4f396f8f8b1a2fc7fe3c41e1b05b479aac9aa1bc310b5b0182dbaa5376dc0bb9"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "ipy"
version = "1.01"
@@ -3400,11 +2747,6 @@ files = [
{file = "IPy-1.01.tar.gz", hash = "sha256:edeca741dea2d54aca568fa23740288c3fe86c0f3ea700344571e9ef14a7cc1a"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "ipython"
version = "8.14.0"
@@ -3443,11 +2785,6 @@ qtconsole = ["qtconsole"]
test = ["pytest (<7.1)", "pytest-asyncio", "testpath"]
test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "iso8601"
version = "2.1.0"
@@ -3459,11 +2796,6 @@ files = [
{file = "iso8601-2.1.0.tar.gz", hash = "sha256:6b1d3829ee8921c4301998c909f7829fa9ed3cbdac0d3b16af2d743aed1ba8df"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "isodate"
version = "0.6.1"
@@ -3478,11 +2810,6 @@ files = [
[package.dependencies]
six = "*"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "itsdangerous"
version = "1.1.0"
@@ -3494,11 +2821,6 @@ files = [
{file = "itsdangerous-1.1.0.tar.gz", hash = "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "itypes"
version = "1.2.0"
@@ -3510,11 +2832,6 @@ files = [
{file = "itypes-1.2.0.tar.gz", hash = "sha256:af886f129dea4a2a1e3d36595a2d139589e4dd287f5cab0b40e799ee81570ff1"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "jedi"
version = "0.19.1"
@@ -3534,11 +2851,6 @@ docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alab
qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"]
testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "jinja2"
version = "3.1.2"
@@ -3556,11 +2868,6 @@ MarkupSafe = ">=2.0"
[package.extras]
i18n = ["Babel (>=2.7)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "jmespath"
version = "0.10.0"
@@ -3572,11 +2879,6 @@ files = [
{file = "jmespath-0.10.0.tar.gz", hash = "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "jms-storage"
version = "0.0.57"
@@ -3607,11 +2909,6 @@ requests = "2.31.0"
s3transfer = "0.6.1"
six = "1.16.0"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "jsonfield2"
version = "4.0.0.post0"
@@ -3626,11 +2923,6 @@ files = [
[package.dependencies]
Django = ">=2.2"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "keystoneauth1"
version = "5.2.1"
@@ -3656,11 +2948,6 @@ oauth1 = ["oauthlib (>=0.6.2)"]
saml2 = ["lxml (>=4.2.0)"]
test = ["PyYAML (>=3.12)", "bandit (>=1.1.0,<1.6.0)", "betamax (>=0.7.0)", "coverage (>=4.0,!=4.4)", "fixtures (>=3.0.0)", "flake8-docstrings (>=1.6.0,<1.7.0)", "flake8-import-order (>=0.17.1)", "hacking (>=4.1.0,<4.2.0)", "lxml (>=4.2.0)", "oauthlib (>=0.6.2)", "oslo.config (>=5.2.0)", "oslo.utils (>=3.33.0)", "oslotest (>=3.2.0)", "reno (>=3.1.0)", "requests-kerberos (>=0.8.0)", "requests-mock (>=1.2.0)", "stestr (>=1.0.0)", "testresources (>=2.0.0)", "testtools (>=2.2.0)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "kombu"
version = "5.3.1"
@@ -3693,11 +2980,6 @@ sqs = ["boto3 (>=1.26.143)", "pycurl (>=7.43.0.5)", "urllib3 (>=1.26.16)"]
yaml = ["PyYAML (>=3.10)"]
zookeeper = ["kazoo (>=2.8.0)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "kubernetes"
version = "27.2.0"
@@ -3724,11 +3006,6 @@ websocket-client = ">=0.32.0,<0.40.0 || >0.40.0,<0.41.dev0 || >=0.43.dev0"
[package.extras]
adal = ["adal (>=1.0.2)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "ldap3"
version = "2.9.1"
@@ -3743,11 +3020,6 @@ files = [
[package.dependencies]
pyasn1 = ">=0.4.6"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "lml"
version = "0.1.0"
@@ -3759,11 +3031,6 @@ files = [
{file = "lml-0.1.0.tar.gz", hash = "sha256:57a085a29bb7991d70d41c6c3144c560a8e35b4c1030ffb36d85fa058773bcc5"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "lockfile"
version = "0.12.2"
@@ -3775,11 +3042,6 @@ files = [
{file = "lockfile-0.12.2.tar.gz", hash = "sha256:6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "lxml"
version = "4.9.3"
@@ -3883,6 +3145,7 @@ files = [
[package.extras]
cssselect = ["cssselect (>=0.7)"]
+html-clean = ["lxml-html-clean"]
html5 = ["html5lib"]
htmlsoup = ["BeautifulSoup4"]
source = ["Cython (>=0.29.35)"]
@@ -3919,6 +3182,16 @@ files = [
{file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"},
{file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"},
{file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"},
+ {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"},
+ {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"},
+ {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"},
+ {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"},
+ {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"},
+ {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"},
+ {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"},
+ {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"},
+ {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"},
+ {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"},
{file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"},
{file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"},
{file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"},
@@ -3951,11 +3224,6 @@ files = [
{file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "matplotlib-inline"
version = "0.1.6"
@@ -3970,76 +3238,63 @@ files = [
[package.dependencies]
traitlets = "*"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "maxminddb"
-version = "2.5.2"
+version = "2.6.0"
description = "Reader for the MaxMind DB format"
optional = false
python-versions = ">=3.8"
files = [
- {file = "maxminddb-2.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f5682963a5817066db50f219c33aaa7eb969888211a289a444c42b5dfa0c0f78"},
- {file = "maxminddb-2.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fe6bb1b5ea132fcd9fd7b16c80247f0ba667018d5f9f98cd645b297e3b02fbf"},
- {file = "maxminddb-2.5.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:955a3ec4b161e872cc615b7a09ae9770049e9794e7b3832e3d78905a65c5049d"},
- {file = "maxminddb-2.5.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:29d63e7711e5f95c7c190010e57dca9e262aee8ac300aaf75c3f7ede0b5a5863"},
- {file = "maxminddb-2.5.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:08a540ec3661f6ca40499c86028e96dca5780e9d471b485dc797859b0b22dd22"},
- {file = "maxminddb-2.5.2-cp310-cp310-win32.whl", hash = "sha256:17fdb691c389a0e956410d5baef9ad082a0aa67dd6aa231d193499e71a104c19"},
- {file = "maxminddb-2.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:d71b48d3dff9150a44e949b28fa5e7251a7a6895a3a77e200ce08410f096f12f"},
- {file = "maxminddb-2.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1409a045eb04cebb297221eab1020c4f05434d02c0961410f6996ef474482998"},
- {file = "maxminddb-2.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d839c480e4b93bb37bb1cc2777d77e6b2127c006e60b56f748f10571d8b0e471"},
- {file = "maxminddb-2.5.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bca70905515fe50684974a9afaa7db4a4e9fbfdebcb0c2cde9db8e048e0d8145"},
- {file = "maxminddb-2.5.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:67f97cd0c6aac39a51294b04a1e922532125285c24b18a58e2a9c92c7691fa9f"},
- {file = "maxminddb-2.5.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1a3fab6bea6cc59444e6bad2a4fbf91228f6f51dcb29d09ed091930a475bd8cb"},
- {file = "maxminddb-2.5.2-cp311-cp311-win32.whl", hash = "sha256:a99e3125528ea31e807f80e8c5b65118dc5cc122d0a435f1691a3cc1df55840c"},
- {file = "maxminddb-2.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:b6adf63695fa5e3d2549f7c2c9d82c6d252edd5c6ba67074637d2cb944143673"},
- {file = "maxminddb-2.5.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ed504ca9f3c42e8e71bdbe21f5b818139a1448ac15d7bb6ce12cf41e3b7e2067"},
- {file = "maxminddb-2.5.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a5053231228d7cbf57d98a741b3cbee9efa9e689348dbb56c414e5a4c7f6f1c"},
- {file = "maxminddb-2.5.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7e8688342bab592647313cd2054779bcd35ad85933424ceae9f07e3a9779986"},
- {file = "maxminddb-2.5.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:335ee3140b41d4e751c14f8fae297aa064c7d3f184c9fbb2790336123187c440"},
- {file = "maxminddb-2.5.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b0203fa2731da45e5461f6e8a0768e85bba8e02137a1598b3fcadf7cbfe8e6f2"},
- {file = "maxminddb-2.5.2-cp312-cp312-win32.whl", hash = "sha256:8b89129de70e1629f200df9dfda4e4f477c26b05c29e0836604a00209c9466d5"},
- {file = "maxminddb-2.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:099f4e27feec4bb9658034a3eb853e746721fc15709030bee4f2f889f4a34185"},
- {file = "maxminddb-2.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:19d8d1e9bbc5281fb4c8112d541d2bd350fd8b5ddfbb43a6951e46df7cd27b9d"},
- {file = "maxminddb-2.5.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94183a78628cad257183a88ce12a3bb9ffbfe0544bd0c1aafc1f9dc55629dd1b"},
- {file = "maxminddb-2.5.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:17de49660372dcccaa23958eccdd1c2464f92f594d027045ad76788db14a5da4"},
- {file = "maxminddb-2.5.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ae05c4f87b1dd9a21d430c52451eef5f3bd5af609d093408db91fe0dc4d8d7d1"},
- {file = "maxminddb-2.5.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2cb718908b9dffa10e02361094158ae68ded5a82c750de89737437999a81bafe"},
- {file = "maxminddb-2.5.2-cp38-cp38-win32.whl", hash = "sha256:e0faa0c4c458eb0eb2f267daa7b106baef72c3c7ebcbece00b9e974fc8321412"},
- {file = "maxminddb-2.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:bac5a29fdc5df9222f7baecbcc4a88b309a66a7d147b34160940c0850ee4b9c5"},
- {file = "maxminddb-2.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c204f53ef7c1d77e9fb0dba415dbb56419f2b08ccaca66cd772e29b3a793c3e7"},
- {file = "maxminddb-2.5.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae98508a200db6f7ae5985a53039aba8eef7ed71d34b0a0e9c9145c3e6139fc3"},
- {file = "maxminddb-2.5.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3e9198d25e252b27d4e9526d5fcd4b78341c23153363a94f1246de5afcd39f6d"},
- {file = "maxminddb-2.5.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b85b008f8e2cf3abfabdc24041549c51c97ea9a8bc46eeeadac8cec7acf9fbf0"},
- {file = "maxminddb-2.5.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6f50210506e9818162ef6706d3127efb0575dfe2cc98a7236ca2011f1cc3effe"},
- {file = "maxminddb-2.5.2-cp39-cp39-win32.whl", hash = "sha256:2bba43d370a57785f5ef61c10d0b4bf8de58d431da3c4c2ed78bb2ff3d07edbf"},
- {file = "maxminddb-2.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:2e01b09480b97d2ebe6765618fb12a0f52caa17368d6cf1f42481d6740428de7"},
- {file = "maxminddb-2.5.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:dd47d13376eaee2e8d1a1fb55d3d6ccdcc995bc931699967f7d5670ec6a454a3"},
- {file = "maxminddb-2.5.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abd626efaba4f0bc867462337f846796da0bb97b82125dbdbc63067947e353b0"},
- {file = "maxminddb-2.5.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ddbe547d83a2e28e81d9f59fd9708d3044ffb2398ee0f8df2e2a2e9cdea6646"},
- {file = "maxminddb-2.5.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:22184fa2514c15f5b39e4e2522f4f73d00afcf5eb7102c473f9376f3c3a03b81"},
- {file = "maxminddb-2.5.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5cb6702fbcc5b209ac3cffacd9cf0a5155feabbeb6fdcf497038be7cb6e52da6"},
- {file = "maxminddb-2.5.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0c3ebfc0af00445089629faffa4c5a1fcc42a1ca5d7dffc42bba314fde20c6d"},
- {file = "maxminddb-2.5.2-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:461dcf0a4f67aa1c9faea6d52c4060d39559bf68e99a514cf8c1e01af383f90b"},
- {file = "maxminddb-2.5.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e012e889639aab411f5483990188da51c968377f665dcb90584971dbf314d50a"},
- {file = "maxminddb-2.5.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:20596e452d03071db37a72c8ef9236126c04ed342864f68db0adf0d1bc9f642e"},
- {file = "maxminddb-2.5.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ec51b66774b102824c9a3dd4916356283f6a61db1868d4ebcb98bf26486718e"},
- {file = "maxminddb-2.5.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fda0dd512f345cc92492f96c61a0df47efc2e2064c15e8053ab2114b362d64d"},
- {file = "maxminddb-2.5.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:862fcfe226ebda29a537cdce678dc8dc71ca6540ad2483099f80c6a1ee4cdbdd"},
- {file = "maxminddb-2.5.2.tar.gz", hash = "sha256:b3c33e4fc7821ee6c9f40837116e16ab6175863d4a64eee024c5bec686690a87"},
+ {file = "maxminddb-2.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4ec0e12623b53b3548239f0082bc2417e71543e2e5b7b4f49c56545f52013f7f"},
+ {file = "maxminddb-2.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:568ad9f34ec4118e7e1b9b583c086576ac68add40232ae57a2b1d4bd4834705e"},
+ {file = "maxminddb-2.6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0626df312d92e8b34ab1bf12921ac44a05a82a70f611f3bb6ed5b55668344849"},
+ {file = "maxminddb-2.6.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f1b5149c8064e9d47d98d382ed54037f0ba25ca9c1e2b1d1cd9958c3808ced44"},
+ {file = "maxminddb-2.6.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:dfa11a83c615a7cfd407e47cc6b8576aad2322bc6ce4af2b6a916fb634a5556e"},
+ {file = "maxminddb-2.6.0-cp310-cp310-win32.whl", hash = "sha256:d1fcf83866b77faf501eba458cc59760d8945a310ba53a8d47d9bb04592cb1cb"},
+ {file = "maxminddb-2.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:2ba1c6cc68316dec14b1251741d5b5c7538ccebc6aadddc61fd870e090adfdff"},
+ {file = "maxminddb-2.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:695466fe8933430d53894f91ce3a468383a6c1a2f89eeddd05dad21377ea94d9"},
+ {file = "maxminddb-2.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e02868d8081e6cadfe0cd8e7dc577c172a7dd78b65bbafff89b8b2bec41e493"},
+ {file = "maxminddb-2.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31f6819ed566668e890937aadc79373cf9de20378ac76f323628863d8f3d1383"},
+ {file = "maxminddb-2.6.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:725b01b6cb4b744b846041168b02dcf05908ce02e544aa35d64dbcf2448efd05"},
+ {file = "maxminddb-2.6.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:af8c4792272f85b0f9da70f3c3670bc3163590d5c9964412ed47ab3f31138c21"},
+ {file = "maxminddb-2.6.0-cp311-cp311-win32.whl", hash = "sha256:50b0318222b99b27cb3abff3f85983e36a33fb785445402930b28d2c3fe320d0"},
+ {file = "maxminddb-2.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:db4919488de1215650316284fe079f07b463d4c5f96ce01b338adaac8f35936d"},
+ {file = "maxminddb-2.6.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cda00948032969affce349588ee8638eae97f47b8b10b4064e7e9bf6bda3410d"},
+ {file = "maxminddb-2.6.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16c2619779abe6baa722e6d65500393a6ea8fe5a3ce24bb02564defb020f51cd"},
+ {file = "maxminddb-2.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eee0250b6cfc30eca89f06fc4d455aad51f657da05612dfe6207aa9be870edb7"},
+ {file = "maxminddb-2.6.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:61f7f6b12264d52eba5235580edecd0bad0aac7c1c5ba0a0970373c5d19b81d7"},
+ {file = "maxminddb-2.6.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f223183a9e5c8e2044f6347c07b71deab4dac36d44de46163ff3358cb4f909c8"},
+ {file = "maxminddb-2.6.0-cp312-cp312-win32.whl", hash = "sha256:42c58ad0e5c70bbaedd3b681b172000256f4710c6c2180221c9f43f826381c00"},
+ {file = "maxminddb-2.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:c9168f0251bbb6806fd85dea7e145b53163f3e74626bf65b8b62b24121bbb038"},
+ {file = "maxminddb-2.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fa897a9ae335559d26d63656d4d34f4a9a0e63be3cb67624fdcd448b7d010536"},
+ {file = "maxminddb-2.6.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6508bd089be94174608c0d95f95983b891daa07181eef4aaae2ff55930a3022b"},
+ {file = "maxminddb-2.6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9ebcd1603ace5768934668e940bc3f7a23973b06c833031bb3ef1ff6d5193bf"},
+ {file = "maxminddb-2.6.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:541650f00ecaff32b486ca0a89fd74a2493e35e0cfe1142b4a66b852de6e00c4"},
+ {file = "maxminddb-2.6.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b15df0645f067c229cafdbc5160c3a0512b3ec16f3c77252dc83341312329fc9"},
+ {file = "maxminddb-2.6.0-cp38-cp38-win32.whl", hash = "sha256:0dfe9b4af5870a60b9abaaa898b458d2af2338cabe2f8fa6c7d74bf473f1d01a"},
+ {file = "maxminddb-2.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:fa1f45ca2b2b60bd3c88cea33bb8ca948f3dd44795049477248c804e2c02b726"},
+ {file = "maxminddb-2.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f50300386c030a1152c1c97a02f880bc80bc8ddff500b782fd41334382f0dbda"},
+ {file = "maxminddb-2.6.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e5647563d11f57df239988371db2eeed8246ad4673eb3d798892d1812e5d653"},
+ {file = "maxminddb-2.6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9df22644fe0b022f8dbdd56bc066ce02d29a67e5d7a543949f1bd43638234ce9"},
+ {file = "maxminddb-2.6.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:74eb211e4a755d6f8b9704239c42d06cdcb42beb2030a707d629e8db092faf72"},
+ {file = "maxminddb-2.6.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:313afcdaeda32e5249093a0672bd1276261511ddc93e52fb2dda87061f1ba154"},
+ {file = "maxminddb-2.6.0-cp39-cp39-win32.whl", hash = "sha256:6883311bdd673d27781cbb8e06cc623aef497aa970e5e532cb79a13460955d09"},
+ {file = "maxminddb-2.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:2e9c672952c5ed22bf7aae69830116a9d0747d9abd9ebcfe375d31432fdea2e8"},
+ {file = "maxminddb-2.6.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c79c1892e0b582660f1d821b0b68bb6100ca60dc13cfc2553e3c12939907fa75"},
+ {file = "maxminddb-2.6.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8a06f0f16bb502887fada29b2d9f3cec4c6e44e230fdf0cc67452fa0232f7c"},
+ {file = "maxminddb-2.6.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f036479418ed91ec019c7ef6e3e6757797a16891dbf8829d9c1b74e2a5feb5b"},
+ {file = "maxminddb-2.6.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:6ec791c115dbfa20d0a4d4f0a2c336886f6abb30025a6ac2eb42b94c581bdd67"},
+ {file = "maxminddb-2.6.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a6e028be4c38d9c11a408a2fbd89626d0bbf1eb89996bf0beaf1e11453937bd6"},
+ {file = "maxminddb-2.6.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:048e85e74828d1c7327df4ca452a4b859dd2ca2b9746c978fe613138cae65b97"},
+ {file = "maxminddb-2.6.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8d126f0d2784d53aa613c009b89677bbf88defb3bf7a66e9b8e60e0859f23aa4"},
+ {file = "maxminddb-2.6.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:fb8d69564a3b682d8f1dd79a97b52f6525a2a4939ef9a23c7b108ec2f973a42a"},
+ {file = "maxminddb-2.6.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a2864cb9093d89b5ccfcdd124da6b8feb3cc3ac7891ab5b43b7131a8a0050bd9"},
+ {file = "maxminddb-2.6.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e90b8be14ded4f01f71c23034600b088594417e42a7bbdd132e87d923246db0e"},
+ {file = "maxminddb-2.6.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e7a0735a04545386df64eb8bc9aea9971b172584066e0d88af8404ba6ccbbd9"},
+ {file = "maxminddb-2.6.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:5ee2e5138ef28b7cf920fedb313b0e605bc66bd2d46c9abcd9656d18ed4eb660"},
+ {file = "maxminddb-2.6.0.tar.gz", hash = "sha256:c5b91c62bc274d0a83ac88088a6db2dac1301acb8aa7bf80a901a07120361e1d"},
]
-[package.dependencies]
-setuptools = ">=68.2.2"
-
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "mistune"
version = "2.0.3"
@@ -4051,17 +3306,12 @@ files = [
{file = "mistune-2.0.3.tar.gz", hash = "sha256:d7605b46b6156b53b7d52a465202b29a6f00f4ea4130ad5d25e9d5547d6b7e50"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "msal"
version = "1.27.0"
description = "The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of users with Microsoft Azure Active Directory accounts (AAD) and Microsoft Accounts (MSA) using industry standard OAuth2 and OpenID Connect."
optional = false
-python-versions = ">=2.7"
+python-versions = ">=3.7"
files = [
{file = "msal-1.27.0-py2.py3-none-any.whl", hash = "sha256:572d07149b83e7343a85a3bcef8e581167b4ac76befcbbb6eef0c0e19643cdc0"},
{file = "msal-1.27.0.tar.gz", hash = "sha256:3109503c038ba6b307152b0e8d34f98113f2e7a78986e28d0baf5b5303afda52"},
@@ -4099,11 +3349,6 @@ portalocker = [
{version = ">=1.6,<3", markers = "platform_system == \"Windows\""},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "msgpack"
version = "1.0.8"
@@ -4170,11 +3415,6 @@ files = [
{file = "msgpack-1.0.8.tar.gz", hash = "sha256:95c02b0e27e706e48d0e5426d1710ca78e0f0628d6e89d5b5a5b91a5f12274f3"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "msrest"
version = "0.7.1"
@@ -4196,11 +3436,6 @@ requests-oauthlib = ">=0.5.0"
[package.extras]
async = ["aiodns", "aiohttp (>=3.0)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "msrestazure"
version = "0.6.4"
@@ -4217,11 +3452,6 @@ adal = ">=0.6.0,<2.0.0"
msrest = ">=0.6.0,<2.0.0"
six = "*"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "multidict"
version = "6.0.5"
@@ -4321,11 +3551,6 @@ files = [
{file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "mysqlclient"
version = "2.2.0"
@@ -4342,11 +3567,6 @@ files = [
{file = "mysqlclient-2.2.0.tar.gz", hash = "sha256:04368445f9c487d8abb7a878e3d23e923e6072c04a6c320f9e0dc8a82efba14e"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "netaddr"
version = "1.2.1"
@@ -4405,11 +3625,6 @@ files = [
{file = "netifaces-0.11.0.tar.gz", hash = "sha256:043a79146eb2907edf439899f262b3dfe41717d34124298ed281139a8b93ca32"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "oauthlib"
version = "3.2.2"
@@ -4426,11 +3641,6 @@ rsa = ["cryptography (>=3.0.0)"]
signals = ["blinker (>=1.4.0)"]
signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "olefile"
version = "0.46"
@@ -4441,11 +3651,6 @@ files = [
{file = "olefile-0.46.zip", hash = "sha256:133b031eaf8fd2c9399b78b8bc5b8fcbe4c31e85295749bb17a87cba8f3c3964"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "openai"
version = "1.13.3"
@@ -4469,11 +3674,6 @@ typing-extensions = ">=4.7,<5"
[package.extras]
datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "openapi-codec"
version = "1.3.2"
@@ -4487,11 +3687,6 @@ files = [
[package.dependencies]
coreapi = ">=2.2.0"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "openpyxl"
version = "3.0.10"
@@ -4506,11 +3701,6 @@ files = [
[package.dependencies]
et-xmlfile = "*"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "oracledb"
version = "1.4.0"
@@ -4551,11 +3741,6 @@ files = [
[package.dependencies]
cryptography = ">=3.2.1"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "os-service-types"
version = "1.7.0"
@@ -4570,11 +3755,6 @@ files = [
[package.dependencies]
pbr = ">=2.0.0,<2.1.0 || >2.1.0"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "oslo-config"
version = "9.4.0"
@@ -4618,11 +3798,6 @@ files = [
[package.dependencies]
pbr = ">=2.0.0,<2.1.0 || >2.1.0"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "oslo-serialization"
version = "5.4.0"
@@ -4690,11 +3865,6 @@ pycryptodome = ">=3.4.7"
requests = "!=2.9.0"
six = "*"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "packaging"
version = "24.0"
@@ -4706,11 +3876,6 @@ files = [
{file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "paramiko"
version = "3.2.0"
@@ -4732,11 +3897,6 @@ all = ["gssapi (>=1.4.1)", "invoke (>=2.0)", "pyasn1 (>=0.1.7)", "pywin32 (>=2.1
gssapi = ["gssapi (>=1.4.1)", "pyasn1 (>=0.1.7)", "pywin32 (>=2.1.8)"]
invoke = ["invoke (>=2.0)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "parso"
version = "0.8.3"
@@ -4752,11 +3912,6 @@ files = [
qa = ["flake8 (==3.8.3)", "mypy (==0.782)"]
testing = ["docopt", "pytest (<6.0.0)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "passlib"
version = "1.7.4"
@@ -4774,11 +3929,6 @@ bcrypt = ["bcrypt (>=3.1.0)"]
build-docs = ["cloud-sptheme (>=1.10.1)", "sphinx (>=1.6)", "sphinxcontrib-fulltoc (>=1.2.0)"]
totp = ["cryptography"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pbr"
version = "6.0.0"
@@ -4790,11 +3940,6 @@ files = [
{file = "pbr-6.0.0.tar.gz", hash = "sha256:d1377122a5a00e2f940ee482999518efe16d745d423a670c27773dfbc3c9a7d9"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pexpect"
version = "4.9.0"
@@ -4809,11 +3954,6 @@ files = [
[package.dependencies]
ptyprocess = ">=0.5"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "phonenumbers"
version = "8.13.17"
@@ -4825,11 +3965,6 @@ files = [
{file = "phonenumbers-8.13.17.tar.gz", hash = "sha256:89671217c706cbaa3ced101deefafa779836feac3e059434d886ac31f09f32c0"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pickleshare"
version = "0.7.5"
@@ -4841,11 +3976,6 @@ files = [
{file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pillow"
version = "10.0.1"
@@ -4913,10 +4043,16 @@ files = [
docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"]
tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
+[[package]]
+name = "polib"
+version = "1.2.0"
+description = "A library to manipulate gettext files (po and mo files)."
+optional = false
+python-versions = "*"
+files = [
+ {file = "polib-1.2.0-py2.py3-none-any.whl", hash = "sha256:1c77ee1b81feb31df9bca258cbc58db1bbb32d10214b173882452c73af06d62d"},
+ {file = "polib-1.2.0.tar.gz", hash = "sha256:f3ef94aefed6e183e342a8a269ae1fc4742ba193186ad76f175938621dbfc26b"},
+]
[[package]]
name = "portalocker"
@@ -4937,11 +4073,6 @@ docs = ["sphinx (>=1.7.1)"]
redis = ["redis"]
tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "pytest-timeout (>=2.1.0)", "redis", "sphinx (>=6.0.0)", "types-redis"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "prettytable"
version = "3.10.0"
@@ -4978,11 +4109,6 @@ files = [
[package.extras]
twisted = ["twisted"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "prompt-toolkit"
version = "3.0.43"
@@ -4997,11 +4123,6 @@ files = [
[package.dependencies]
wcwidth = "*"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "proto-plus"
version = "1.23.0"
@@ -5019,11 +4140,6 @@ protobuf = ">=3.19.0,<5.0.0dev"
[package.extras]
testing = ["google-api-core[grpc] (>=1.31.5)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "protobuf"
version = "4.25.3"
@@ -5044,11 +4160,6 @@ files = [
{file = "protobuf-4.25.3.tar.gz", hash = "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "psutil"
version = "5.9.5"
@@ -5075,38 +4186,6 @@ files = [
[package.extras]
test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
-[[package]]
-name = "psycopg2"
-version = "2.9.6"
-description = "psycopg2 - Python-PostgreSQL Database Adapter"
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "psycopg2-2.9.6-cp310-cp310-win32.whl", hash = "sha256:f7a7a5ee78ba7dc74265ba69e010ae89dae635eea0e97b055fb641a01a31d2b1"},
- {file = "psycopg2-2.9.6-cp310-cp310-win_amd64.whl", hash = "sha256:f75001a1cbbe523e00b0ef896a5a1ada2da93ccd752b7636db5a99bc57c44494"},
- {file = "psycopg2-2.9.6-cp311-cp311-win32.whl", hash = "sha256:53f4ad0a3988f983e9b49a5d9765d663bbe84f508ed655affdb810af9d0972ad"},
- {file = "psycopg2-2.9.6-cp311-cp311-win_amd64.whl", hash = "sha256:b81fcb9ecfc584f661b71c889edeae70bae30d3ef74fa0ca388ecda50b1222b7"},
- {file = "psycopg2-2.9.6-cp36-cp36m-win32.whl", hash = "sha256:11aca705ec888e4f4cea97289a0bf0f22a067a32614f6ef64fcf7b8bfbc53744"},
- {file = "psycopg2-2.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:36c941a767341d11549c0fbdbb2bf5be2eda4caf87f65dfcd7d146828bd27f39"},
- {file = "psycopg2-2.9.6-cp37-cp37m-win32.whl", hash = "sha256:869776630c04f335d4124f120b7fb377fe44b0a7645ab3c34b4ba42516951889"},
- {file = "psycopg2-2.9.6-cp37-cp37m-win_amd64.whl", hash = "sha256:a8ad4a47f42aa6aec8d061fdae21eaed8d864d4bb0f0cade5ad32ca16fcd6258"},
- {file = "psycopg2-2.9.6-cp38-cp38-win32.whl", hash = "sha256:2362ee4d07ac85ff0ad93e22c693d0f37ff63e28f0615a16b6635a645f4b9214"},
- {file = "psycopg2-2.9.6-cp38-cp38-win_amd64.whl", hash = "sha256:d24ead3716a7d093b90b27b3d73459fe8cd90fd7065cf43b3c40966221d8c394"},
- {file = "psycopg2-2.9.6-cp39-cp39-win32.whl", hash = "sha256:1861a53a6a0fd248e42ea37c957d36950da00266378746588eab4f4b5649e95f"},
- {file = "psycopg2-2.9.6-cp39-cp39-win_amd64.whl", hash = "sha256:ded2faa2e6dfb430af7713d87ab4abbfc764d8d7fb73eafe96a24155f906ebf5"},
- {file = "psycopg2-2.9.6.tar.gz", hash = "sha256:f15158418fd826831b28585e2ab48ed8df2d0d98f502a2b4fe619e7d5ca29011"},
-]
-
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "psycopg2-binary"
version = "2.9.6"
@@ -5178,11 +4257,6 @@ files = [
{file = "psycopg2_binary-2.9.6-cp39-cp39-win_amd64.whl", hash = "sha256:f6a88f384335bb27812293fdb11ac6aee2ca3f51d3c7820fe03de0a304ab6249"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "ptyprocess"
version = "0.7.0"
@@ -5194,11 +4268,6 @@ files = [
{file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pure-eval"
version = "0.2.2"
@@ -5213,11 +4282,6 @@ files = [
[package.extras]
tests = ["pytest"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pyasn1"
version = "0.5.0"
@@ -5229,29 +4293,19 @@ files = [
{file = "pyasn1-0.5.0.tar.gz", hash = "sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pyasn1-modules"
-version = "0.3.0"
+version = "0.4.0"
description = "A collection of ASN.1-based protocols modules"
optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7"
+python-versions = ">=3.8"
files = [
- {file = "pyasn1_modules-0.3.0-py2.py3-none-any.whl", hash = "sha256:d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d"},
- {file = "pyasn1_modules-0.3.0.tar.gz", hash = "sha256:5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c"},
+ {file = "pyasn1_modules-0.4.0-py3-none-any.whl", hash = "sha256:be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b"},
+ {file = "pyasn1_modules-0.4.0.tar.gz", hash = "sha256:831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6"},
]
[package.dependencies]
-pyasn1 = ">=0.4.6,<0.6.0"
-
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
+pyasn1 = ">=0.4.6,<0.7.0"
[[package]]
name = "pycparser"
@@ -5264,11 +4318,6 @@ files = [
{file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pycryptodome"
version = "3.18.0"
@@ -5310,11 +4359,6 @@ files = [
{file = "pycryptodome-3.18.0.tar.gz", hash = "sha256:c9adee653fc882d98956e33ca2c1fb582e23a8af7ac82fee75bd6113c55a0413"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pycryptodomex"
version = "3.18.0"
@@ -5356,11 +4400,6 @@ files = [
{file = "pycryptodomex-3.18.0.tar.gz", hash = "sha256:3e3ecb5fe979e7c1bb0027e518340acf7ee60415d79295e5251d13c68dde576e"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pydantic"
version = "2.6.3"
@@ -5380,11 +4419,6 @@ typing-extensions = ">=4.6.1"
[package.extras]
email = ["email-validator (>=2.0.0)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pydantic-core"
version = "2.16.3"
@@ -5476,11 +4510,6 @@ files = [
[package.dependencies]
typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pyexcel"
version = "0.7.0"
@@ -5503,11 +4532,6 @@ ods = ["pyexcel-ods3 (>=0.6.0)"]
xls = ["pyexcel-xls (>=0.6.0)"]
xlsx = ["pyexcel-xlsx (>=0.6.0)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pyexcel-io"
version = "0.6.6"
@@ -5527,11 +4551,6 @@ ods = ["pyexcel-ods3 (>=0.6.0)"]
xls = ["pyexcel-xls (>=0.6.0)"]
xlsx = ["pyexcel-xlsx (>=0.6.0)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pyexcel-xlsx"
version = "0.6.0"
@@ -5547,11 +4566,6 @@ files = [
openpyxl = ">=2.6.1"
pyexcel-io = ">=0.6.2"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pyfreerdp"
version = "0.0.2"
@@ -5597,11 +4611,6 @@ files = [
{file = "pyfreerdp-0.0.2.tar.gz", hash = "sha256:caf4b422eb32a327095b548bb1a22a22b926b6e15819c9a83b6461050b11870d"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pygments"
version = "2.17.2"
@@ -5617,11 +4626,6 @@ files = [
plugins = ["importlib-metadata"]
windows-terminal = ["colorama (>=0.4.6)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pyhcl"
version = "0.4.4"
@@ -5632,11 +4636,6 @@ files = [
{file = "pyhcl-0.4.4.tar.gz", hash = "sha256:2d9b9dcdf1023d812bfed561ba72c99104c5b3f52e558d595130a44ce081b003"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pyjwkest"
version = "1.4.2"
@@ -5653,11 +4652,6 @@ pycryptodomex = "*"
requests = "*"
six = "*"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pyjwt"
version = "2.8.0"
@@ -5678,11 +4672,6 @@ dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pyte
docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"]
tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pymongo"
version = "4.4.1"
@@ -5777,11 +4766,6 @@ ocsp = ["certifi", "pyopenssl (>=17.2.0)", "requests (<3.0.0)", "service-identit
snappy = ["python-snappy"]
zstd = ["zstandard"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pympler"
version = "1.0.1"
@@ -5793,11 +4777,6 @@ files = [
{file = "Pympler-1.0.1.tar.gz", hash = "sha256:993f1a3599ca3f4fcd7160c7545ad06310c9e12f70174ae7ae8d4e25f6c5d3fa"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pymssql"
version = "2.2.8"
@@ -5809,9 +4788,11 @@ files = [
{file = "pymssql-2.2.8-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:049f2e3de919e8e02504780a21ebbf235e21ca8ed5c7538c5b6e705aa6c43d8c"},
{file = "pymssql-2.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dd86d8e3e346e34f3f03d12e333747b53a1daa74374a727f4714d5b82ee0dd5"},
{file = "pymssql-2.2.8-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:508226a0df7cb6faeda9f8e84e85743690ca427d7b27af9a73d75fcf0c1eef6e"},
+ {file = "pymssql-2.2.8-cp310-cp310-win_amd64.whl", hash = "sha256:47859887adeaf184766b5e0bc845dd23611f3808f9521552063bb36eabc10092"},
{file = "pymssql-2.2.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d873e553374d5b1c57fe1c43bb75e3bcc2920678db1ef26f6bfed396c7d21b30"},
{file = "pymssql-2.2.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf31b8b76634c826a91f9999e15b7bfb0c051a0f53b319fd56481a67e5b903bb"},
{file = "pymssql-2.2.8-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:821945c2214fe666fd456c61e09a29a00e7719c9e136c801bffb3a254e9c579b"},
+ {file = "pymssql-2.2.8-cp311-cp311-win_amd64.whl", hash = "sha256:cc85b609b4e60eac25fa38bbac1ff854fd2c2a276e0ca4a3614c6f97efb644bb"},
{file = "pymssql-2.2.8-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:ebe7f64d5278d807f14bea08951e02512bfbc6219fd4d4f15bb45ded885cf3d4"},
{file = "pymssql-2.2.8-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:253af3d39fc0235627966817262d5c4c94ad09dcbea59664748063470048c29c"},
{file = "pymssql-2.2.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c9d109df536dc5f7dd851a88d285a4c9cb12a9314b621625f4f5ab1197eb312"},
@@ -5827,19 +4808,16 @@ files = [
{file = "pymssql-2.2.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3906993300650844ec140aa58772c0f5f3e9e9d5709c061334fd1551acdcf066"},
{file = "pymssql-2.2.8-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7309c7352e4a87c9995c3183ebfe0ff4135e955bb759109637673c61c9f0ca8d"},
{file = "pymssql-2.2.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9b8d603cc1ec7ae585c5a409a1d45e8da067970c79dd550d45c238ae0aa0f79f"},
+ {file = "pymssql-2.2.8-cp38-cp38-win_amd64.whl", hash = "sha256:293cb4d0339e221d877d6b19a1905082b658f0100a1e2ccc9dda10de58938901"},
{file = "pymssql-2.2.8-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:895041edd002a2e91d8a4faf0906b6fbfef29d9164bc6beb398421f5927fa40e"},
{file = "pymssql-2.2.8-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6b2d9c6d38a416c6f2db36ff1cd8e69f9a5387a46f9f4f612623192e0c9404b1"},
{file = "pymssql-2.2.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d63d6f25cf40fe6a03c49be2d4d337858362b8ab944d6684c268e4990807cf0c"},
{file = "pymssql-2.2.8-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:c83ad3ad20951f3a94894b354fa5fa9666dcd5ebb4a635dad507c7d1dd545833"},
{file = "pymssql-2.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3933f7f082be74698eea835df51798dab9bc727d94d3d280bffc75ab9265f890"},
+ {file = "pymssql-2.2.8-cp39-cp39-win_amd64.whl", hash = "sha256:de313375b90b0f554058992f35c4a4beb3f6ec2f5912d8cd6afb649f95b03a9f"},
{file = "pymssql-2.2.8.tar.gz", hash = "sha256:9baefbfbd07d0142756e2dfcaa804154361ac5806ab9381350aad4e780c3033e"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pymysql"
version = "1.1.0"
@@ -5855,11 +4833,6 @@ files = [
ed25519 = ["PyNaCl (>=1.4.0)"]
rsa = ["cryptography"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pynacl"
version = "1.5.0"
@@ -5886,11 +4859,6 @@ cffi = ">=1.4.1"
docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"]
tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pyopenssl"
version = "23.2.0"
@@ -5909,11 +4877,6 @@ cryptography = ">=38.0.0,<40.0.0 || >40.0.0,<40.0.1 || >40.0.1,<42"
docs = ["sphinx (!=5.2.0,!=5.2.0.post0)", "sphinx-rtd-theme"]
test = ["flaky", "pretend", "pytest (>=3.0.1)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pyotp"
version = "2.8.0"
@@ -5925,11 +4888,6 @@ files = [
{file = "pyotp-2.8.0.tar.gz", hash = "sha256:c2f5e17d9da92d8ec1f7de6331ab08116b9115adbabcba6e208d46fc49a98c5a"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pyparsing"
version = "3.1.2"
@@ -5944,11 +4902,6 @@ files = [
[package.extras]
diagrams = ["jinja2", "railroad-diagrams"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pyrad"
version = "2.4"
@@ -5964,11 +4917,6 @@ files = [
netaddr = "*"
six = "*"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pyspnego"
version = "0.10.2"
@@ -5988,11 +4936,6 @@ sspilib = {version = ">=0.1.0", markers = "sys_platform == \"win32\""}
kerberos = ["gssapi (>=1.6.0)", "krb5 (>=0.3.0)"]
yaml = ["ruamel.yaml"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "python-cas"
version = "1.6.0"
@@ -6009,11 +4952,6 @@ lxml = ">=3.4"
requests = ">=2.11.1"
six = ">=1.10.0"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "python-crontab"
version = "3.0.0"
@@ -6032,11 +4970,6 @@ python-dateutil = "*"
cron-description = ["cron-descriptor"]
cron-schedule = ["croniter"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "python-daemon"
version = "3.0.1"
@@ -6057,11 +4990,6 @@ setuptools = ">=62.4.0"
devel = ["coverage", "docutils", "isort", "testscenarios (>=0.4)", "testtools", "twine"]
test = ["coverage", "docutils", "testscenarios (>=0.4)", "testtools"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "python-dateutil"
version = "2.8.2"
@@ -6076,11 +5004,6 @@ files = [
[package.dependencies]
six = ">=1.5"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "python-keystoneclient"
version = "5.1.0"
@@ -6105,11 +5028,6 @@ requests = ">=2.14.2"
six = ">=1.10.0"
stevedore = ">=1.20.0"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "python-ldap"
version = "3.4.3"
@@ -6124,11 +5042,6 @@ files = [
pyasn1 = ">=0.3.7"
pyasn1_modules = ">=0.1.5"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "python-nmap"
version = "0.7.1"
@@ -6139,11 +5052,6 @@ files = [
{file = "python-nmap-0.7.1.tar.gz", hash = "sha256:f75af6b91dd8e3b0c31f869db32163f62ada686945e5b7c25f84bc0f7fad3b64"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "python-novaclient"
version = "18.3.0"
@@ -6165,11 +5073,6 @@ pbr = ">=2.0.0,<2.1.0 || >2.1.0"
PrettyTable = ">=0.7.2"
stevedore = ">=2.0.1"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "python-redis-lock"
version = "4.0.0"
@@ -6187,11 +5090,6 @@ redis = ">=2.10.0"
[package.extras]
django = ["django-redis (>=3.8.0)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "python3-saml"
version = "1.15.0"
@@ -6212,11 +5110,6 @@ xmlsec = ">=1.3.9"
[package.extras]
test = ["coverage (>=4.5.2)", "flake8 (>=3.6.0,<=5.0.0)", "freezegun (>=0.3.11,<=1.1.0)", "pytest (>=4.6)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pytz"
version = "2023.3"
@@ -6228,11 +5121,6 @@ files = [
{file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pyvmomi"
version = "8.0.1.0.2"
@@ -6249,11 +5137,6 @@ six = ">=1.7.3"
[package.extras]
sso = ["lxml", "pyOpenSSL", "pywin32"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pywin32"
version = "306"
@@ -6277,11 +5160,6 @@ files = [
{file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pywinrm"
version = "0.4.3"
@@ -6303,11 +5181,6 @@ xmltodict = "*"
credssp = ["requests-credssp (>=1.0.0)"]
kerberos = ["pykerberos (>=1.2.1,<2.0.0)", "winkerberos (>=0.5.0)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pyyaml"
version = "6.0.1"
@@ -6320,6 +5193,7 @@ files = [
{file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"},
{file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"},
{file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"},
+ {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"},
{file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"},
{file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"},
{file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"},
@@ -6327,8 +5201,16 @@ files = [
{file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"},
{file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"},
{file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"},
+ {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"},
{file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"},
{file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"},
+ {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"},
+ {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"},
+ {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"},
+ {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"},
+ {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"},
+ {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"},
+ {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"},
{file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"},
{file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"},
{file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"},
@@ -6345,6 +5227,7 @@ files = [
{file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"},
{file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"},
{file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"},
+ {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"},
{file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"},
{file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"},
{file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"},
@@ -6352,16 +5235,12 @@ files = [
{file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"},
{file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"},
{file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"},
+ {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"},
{file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"},
{file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"},
{file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "pyzipper"
version = "0.3.6"
@@ -6376,11 +5255,6 @@ files = [
[package.dependencies]
pycryptodomex = "*"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "qingcloud-sdk"
version = "1.2.15"
@@ -6395,11 +5269,6 @@ files = [
[package.dependencies]
future = "*"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "receptorctl"
version = "1.4.5"
@@ -6463,11 +5332,6 @@ urllib3 = ">=1.21.1,<3"
socks = ["PySocks (>=1.5.6,!=1.5.7)"]
use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "requests-ntlm"
version = "1.2.0"
@@ -6484,17 +5348,12 @@ cryptography = ">=1.3"
pyspnego = ">=0.1.6"
requests = ">=2.0.0"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "requests-oauthlib"
version = "1.4.0"
description = "OAuthlib authentication support for Requests."
optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+python-versions = ">=3.4"
files = [
{file = "requests-oauthlib-1.4.0.tar.gz", hash = "sha256:acee623221e4a39abcbb919312c8ff04bd44e7e417087fb4bd5e2a2f53d5e79a"},
{file = "requests_oauthlib-1.4.0-py2.py3-none-any.whl", hash = "sha256:7a3130d94a17520169e38db6c8d75f2c974643788465ecc2e4b36d288bf13033"},
@@ -6507,11 +5366,6 @@ requests = ">=2.0.0"
[package.extras]
rsa = ["oauthlib[signedtoken] (>=3.0.0)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "requests-toolbelt"
version = "1.0.0"
@@ -6526,11 +5380,6 @@ files = [
[package.dependencies]
requests = ">=2.0.1,<3.0.0"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "resolvelib"
version = "0.8.1"
@@ -6548,11 +5397,6 @@ lint = ["black", "flake8", "isort", "mypy", "types-requests"]
release = ["build", "towncrier", "twine"]
test = ["commentjson", "packaging", "pytest"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "rest-condition"
version = "1.0.3"
@@ -6567,11 +5411,6 @@ files = [
django = ">=1.3"
djangorestframework = "*"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "rfc3986"
version = "2.0.0"
@@ -6586,11 +5425,6 @@ files = [
[package.extras]
idna2008 = ["idna"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "rsa"
version = "4.9"
@@ -6605,11 +5439,6 @@ files = [
[package.dependencies]
pyasn1 = ">=0.1.3"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "s3transfer"
version = "0.6.1"
@@ -6627,11 +5456,6 @@ botocore = ">=1.12.36,<2.0a.0"
[package.extras]
crt = ["botocore[crt] (>=1.20.29,<2.0a.0)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "service-identity"
version = "24.1.0"
@@ -6656,11 +5480,6 @@ idna = ["idna"]
mypy = ["idna", "mypy", "types-pyopenssl"]
tests = ["coverage[toml] (>=5.0.2)", "pytest"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "setuptools"
version = "69.1.1"
@@ -6776,11 +5595,6 @@ files = [
{file = "simplejson-3.19.1.tar.gz", hash = "sha256:6277f60848a7d8319d27d2be767a7546bc965535b28070e310b3a9af90604a4c"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "six"
version = "1.16.0"
@@ -6792,11 +5606,6 @@ files = [
{file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "sniffio"
version = "1.3.1"
@@ -6808,11 +5617,6 @@ files = [
{file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "soupsieve"
version = "2.5"
@@ -6824,11 +5628,6 @@ files = [
{file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "sqlparse"
version = "0.4.4"
@@ -6845,11 +5644,6 @@ dev = ["build", "flake8"]
doc = ["sphinx"]
test = ["pytest", "pytest-cov"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "sshpubkeys"
version = "3.3.1"
@@ -6868,11 +5662,6 @@ ecdsa = ">=0.13"
[package.extras]
dev = ["twine", "wheel", "yapf"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "sshtunnel"
version = "0.4.0"
@@ -6892,11 +5681,6 @@ build-sphinx = ["sphinx", "sphinxcontrib-napoleon"]
dev = ["check-manifest"]
test = ["tox (>=1.8.1)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "sspilib"
version = "0.1.0"
@@ -6936,11 +5720,6 @@ files = [
{file = "sspilib-0.1.0.tar.gz", hash = "sha256:58b5291553cf6220549c0f855e0e6973f4977375d8236ce47bb581efb3e9b1cf"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "stack-data"
version = "0.6.3"
@@ -6960,11 +5739,6 @@ pure-eval = "*"
[package.extras]
tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "stevedore"
version = "5.2.0"
@@ -6979,11 +5753,6 @@ files = [
[package.dependencies]
pbr = ">=2.0.0,<2.1.0 || >2.1.0"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "tencentcloud-sdk-python"
version = "3.0.941"
@@ -6998,11 +5767,6 @@ files = [
[package.dependencies]
requests = ">=2.16.0"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "termcolor"
version = "2.3.0"
@@ -7017,11 +5781,6 @@ files = [
[package.extras]
tests = ["pytest", "pytest-cov"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "texttable"
version = "1.7.0"
@@ -7033,11 +5792,6 @@ files = [
{file = "texttable-1.7.0.tar.gz", hash = "sha256:2d2068fb55115807d3ac77a4ca68fa48803e84ebb0ee2340f858107a36522638"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "tornado"
version = "6.4"
@@ -7058,11 +5812,6 @@ files = [
{file = "tornado-6.4.tar.gz", hash = "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "tqdm"
version = "4.66.2"
@@ -7083,30 +5832,20 @@ notebook = ["ipywidgets (>=6)"]
slack = ["slack-sdk"]
telegram = ["requests"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "traitlets"
-version = "5.14.1"
+version = "5.14.2"
description = "Traitlets Python configuration system"
optional = false
python-versions = ">=3.8"
files = [
- {file = "traitlets-5.14.1-py3-none-any.whl", hash = "sha256:2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74"},
- {file = "traitlets-5.14.1.tar.gz", hash = "sha256:8585105b371a04b8316a43d5ce29c098575c2e477850b62b848b964f1444527e"},
+ {file = "traitlets-5.14.2-py3-none-any.whl", hash = "sha256:fcdf85684a772ddeba87db2f398ce00b40ff550d1528c03c14dbf6a02003cd80"},
+ {file = "traitlets-5.14.2.tar.gz", hash = "sha256:8cdd83c040dab7d1dee822678e5f5d100b514f7b72b01615b26fc5718916fdf9"},
]
[package.extras]
docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"]
-test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"]
-
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
+test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.1)", "pytest-mock", "pytest-mypy-testing"]
[[package]]
name = "treelib"
@@ -7122,11 +5861,6 @@ files = [
[package.dependencies]
six = "*"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "twisted"
version = "24.3.0"
@@ -7166,11 +5900,6 @@ test = ["cython-test-exception-raiser (>=1.0.2,<2)", "hypothesis (>=6.56)", "pyh
tls = ["idna (>=2.4)", "pyopenssl (>=21.0.0)", "service-identity (>=18.1.0)"]
windows-platform = ["pywin32 (!=226)", "pywin32 (!=226)", "twisted[all-non-platform]", "twisted[all-non-platform]"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "twisted-iocpsupport"
version = "1.0.4"
@@ -7199,11 +5928,6 @@ files = [
{file = "twisted_iocpsupport-1.0.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:300437af17396a945a58dcfffd77863303a8b6d9e65c6e81f1d2eed55b50d444"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "txaio"
version = "23.1.1"
@@ -7220,11 +5944,6 @@ all = ["twisted (>=20.3.0)", "zope.interface (>=5.2.0)"]
dev = ["pep8 (>=1.6.2)", "pyenchant (>=1.6.6)", "pytest (>=2.6.4)", "pytest-cov (>=1.8.1)", "sphinx (>=1.2.3)", "sphinx-rtd-theme (>=0.1.9)", "sphinxcontrib-spelling (>=2.1.2)", "tox (>=2.1.1)", "tox-gh-actions (>=2.2.0)", "twine (>=1.6.5)", "wheel"]
twisted = ["twisted (>=20.3.0)", "zope.interface (>=5.2.0)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "typing-extensions"
version = "4.10.0"
@@ -7236,11 +5955,6 @@ files = [
{file = "typing_extensions-4.10.0.tar.gz", hash = "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "tzdata"
version = "2024.1"
@@ -7252,11 +5966,6 @@ files = [
{file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "tzlocal"
version = "5.2"
@@ -7274,11 +5983,6 @@ tzdata = {version = "*", markers = "platform_system == \"Windows\""}
[package.extras]
devenv = ["check-manifest", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3)", "zest.releaser"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "ua-parser"
version = "0.18.0"
@@ -7290,11 +5994,6 @@ files = [
{file = "ua_parser-0.18.0-py2.py3-none-any.whl", hash = "sha256:9d94ac3a80bcb0166823956a779186c746b50ea4c9fd9bf30fdb758553c38950"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "ucloud-sdk-python3"
version = "0.11.50"
@@ -7315,11 +6014,6 @@ dev = ["black", "flake8 (>=3.6.0)", "pytest (>=4.6)", "pytest-cov", "requests",
doc = ["requests", "sphinx"]
test = ["flake8 (>=3.6.0)", "pytest (>=4.6)", "pytest-cov", "requests", "requests-mock"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "unicodecsv"
version = "0.14.1"
@@ -7330,11 +6024,6 @@ files = [
{file = "unicodecsv-0.14.1.tar.gz", hash = "sha256:018c08037d48649a0412063ff4eda26eaa81eff1546dbffa51fa5293276ff7fc"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "uritemplate"
version = "4.1.1"
@@ -7346,11 +6035,6 @@ files = [
{file = "uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "urllib3"
version = "1.26.16"
@@ -7367,11 +6051,6 @@ brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"]
secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"]
socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "user-agents"
version = "2.2.0"
@@ -7386,11 +6065,6 @@ files = [
[package.dependencies]
ua-parser = ">=0.10.0"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "uvicorn"
version = "0.22.0"
@@ -7409,11 +6083,6 @@ h11 = ">=0.8"
[package.extras]
standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "vine"
version = "5.0.0"
@@ -7425,11 +6094,6 @@ files = [
{file = "vine-5.0.0.tar.gz", hash = "sha256:7d3b1624a953da82ef63462013bbd271d3eb75751489f9807598e8f340bd637e"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "volcengine-python-sdk"
version = "1.0.71"
@@ -7462,11 +6126,6 @@ files = [
{file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "websocket-client"
version = "1.6.1"
@@ -7483,11 +6142,6 @@ docs = ["Sphinx (>=3.4)", "sphinx-rtd-theme (>=0.5)"]
optional = ["python-socks", "wsaccel"]
test = ["websockets"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "websockets"
version = "11.0.3"
@@ -7567,11 +6221,6 @@ files = [
{file = "websockets-11.0.3.tar.gz", hash = "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "werkzeug"
version = "2.3.6"
@@ -7589,11 +6238,6 @@ MarkupSafe = ">=2.1.1"
[package.extras]
watchdog = ["watchdog (>=2.3)"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "wrapt"
version = "1.16.0"
@@ -7673,11 +6317,6 @@ files = [
{file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "xlsxwriter"
version = "3.2.0"
@@ -7689,11 +6328,6 @@ files = [
{file = "XlsxWriter-3.2.0.tar.gz", hash = "sha256:9977d0c661a72866a61f9f7a809e25ebbb0fb7036baa3b9fe74afcfca6b3cb8c"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "xmlsec"
version = "1.3.13"
@@ -7719,11 +6353,6 @@ files = [
[package.dependencies]
lxml = ">=3.8"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "xmltodict"
version = "0.13.0"
@@ -7735,11 +6364,6 @@ files = [
{file = "xmltodict-0.13.0.tar.gz", hash = "sha256:341595a488e3e01a85a9d8911d8912fd922ede5fecc4dce437eb4b6c8d037e56"},
]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "yarl"
version = "1.9.4"
@@ -7843,11 +6467,6 @@ files = [
idna = ">=2.0"
multidict = ">=4.0"
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[[package]]
name = "zope-interface"
version = "6.2"
@@ -7897,15 +6516,10 @@ files = [
setuptools = "*"
[package.extras]
-docs = ["Sphinx", "repoze.sphinx.autointerface", "sphinx-rtd-theme"]
+docs = ["Sphinx", "repoze.sphinx.autointerface", "sphinx_rtd_theme"]
test = ["coverage (>=5.0.3)", "zope.event", "zope.testing"]
testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"]
-[package.source]
-type = "legacy"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
-reference = "tsinghua"
-
[metadata]
lock-version = "2.0"
python-versions = "^3.11"
diff --git a/pyproject.toml b/pyproject.toml
index 464bd7055..69d7883ef 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,11 +1,15 @@
[tool.poetry]
name = "jumpserver"
-version = "v3.9"
+version = "v4.0"
description = "广受欢迎的开源堡垒机"
authors = ["ibuler "]
license = "GPLv3"
readme = "README.md"
+# 说明
+# poetry install (社区版)
+# poetry install --with=xpack (企业版)
+
[tool.poetry.dependencies]
python = "^3.11"
cython = "3.0.0"
@@ -150,7 +154,11 @@ exchangelib = "^5.1.0"
xmlsec = "^1.3.13"
lxml = "4.9.3"
receptorctl = "^1.4.5"
+polib = "^1.2.0"
+tqdm = "^4.66.1"
+[tool.poetry.group.xpack]
+optional = true
[tool.poetry.group.xpack.dependencies]
qingcloud-sdk = "1.2.15"
@@ -170,17 +178,12 @@ keystoneauth1 = "5.2.1"
oracledb = "1.4.0"
psycopg2-binary = "2.9.6"
pymssql = "2.2.8"
-psycopg2 = "2.9.6"
+# psycopg2 = "2.9.6"
ucloud-sdk-python3 = "0.11.50"
huaweicloudsdkecs = "3.1.52"
huaweicloudsdkcore = "3.1.52"
volcengine-python-sdk = "1.0.71"
-[[tool.poetry.source]]
-name = "tsinghua"
-url = "https://pypi.tuna.tsinghua.edu.cn/simple/"
-priority = "primary"
-
[[tool.poetry.source]]
name = "PyPI"
priority = "primary"
diff --git a/utils/renew_poetry_lock.sh b/utils/renew_poetry_lock.sh
new file mode 100644
index 000000000..177b0f184
--- /dev/null
+++ b/utils/renew_poetry_lock.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+command -v poetry >/dev/null 2>&1 || {
+ echo "poetry not found. Aborting."
+ exit 1
+}
+
+if [ ! -f "pyproject.toml" ]; then
+ echo "pyproject.toml not found. Aborting."
+ exit 1
+fi
+
+poetry config virtualenvs.create false
+poetry lock --no-update
\ No newline at end of file