Merge branch 'dev' into pr@dev@translate

This commit is contained in:
feng626 2024-09-09 14:21:03 +08:00 committed by feng
commit a338613b5a
31 changed files with 1965 additions and 1204 deletions

View File

@ -1,4 +1,5 @@
from django.db.models import Count
from django_filters import rest_framework as filters
from rest_framework import generics
from rest_framework import serializers
from rest_framework.decorators import action
@ -14,6 +15,14 @@ from common.serializers import GroupedChoiceSerializer
__all__ = ['AssetPlatformViewSet', 'PlatformAutomationMethodsApi', 'PlatformProtocolViewSet']
class PlatformFilter(filters.FilterSet):
name__startswith = filters.CharFilter(field_name='name', lookup_expr='istartswith')
class Meta:
model = Platform
fields = ['name', 'category', 'type']
class AssetPlatformViewSet(JMSModelViewSet):
queryset = Platform.objects.all()
serializer_classes = {
@ -21,7 +30,7 @@ class AssetPlatformViewSet(JMSModelViewSet):
'list': PlatformListSerializer,
'categories': GroupedChoiceSerializer,
}
filterset_fields = ['name', 'category', 'type']
filterset_class = PlatformFilter
search_fields = ['name']
ordering = ['-internal', 'name']
rbac_perms = {

View File

@ -31,6 +31,12 @@ __all__ = [
class AssetProtocolsSerializer(serializers.ModelSerializer):
port = serializers.IntegerField(required=False, allow_null=True, max_value=65535, min_value=0)
def get_render_help_text(self):
if self.parent and self.parent.many:
return _('Protocols, format is ["protocol/port"]')
else:
return _('Protocol, format is name/port')
def to_file_representation(self, data):
return '{name}/{port}'.format(**data)
@ -97,6 +103,9 @@ class AssetAccountSerializer(AccountSerializer):
attrs = super().validate(attrs)
return self.set_secret(attrs)
def get_render_help_text(self):
return _('Accounts, format [{"name": "x", "username": "x", "secret": "x", "secret_type": "password"}]')
class Meta(AccountSerializer.Meta):
fields = [
f for f in AccountSerializer.Meta.fields
@ -121,12 +130,23 @@ class AccountSecretSerializer(SecretReadableMixin, CommonModelSerializer):
}
class NodeDisplaySerializer(serializers.ListField):
def get_render_help_text(self):
return _('Node path, format ["/org_name/node_name"], if node not exist, will create it')
def to_internal_value(self, data):
return data
def to_representation(self, data):
return data
class AssetSerializer(BulkOrgResourceModelSerializer, ResourceLabelsMixin, WritableNestedModelSerializer):
category = LabeledChoiceField(choices=Category.choices, read_only=True, label=_('Category'))
type = LabeledChoiceField(choices=AllTypes.choices(), read_only=True, label=_('Type'))
protocols = AssetProtocolsSerializer(many=True, required=False, label=_('Protocols'), default=())
accounts = AssetAccountSerializer(many=True, required=False, allow_null=True, write_only=True, label=_('Accounts'))
nodes_display = serializers.ListField(read_only=False, required=False, label=_("Node path"))
nodes_display = NodeDisplaySerializer(read_only=False, required=False, label=_("Node path"))
_accounts = None
class Meta:

View File

@ -14,6 +14,11 @@ class GatewaySerializer(HostSerializer):
class Meta(HostSerializer.Meta):
model = Gateway
def validate_platform(self, p):
if not p.name.startswith('Gateway'):
raise serializers.ValidationError(_('The platform must start with Gateway'))
return p
def validate_name(self, value):
queryset = Asset.objects.filter(name=value)
if self.instance:

View File

@ -38,9 +38,15 @@ class SuggestionMixin:
class RenderToJsonMixin:
@action(methods=[POST, PUT], detail=False, url_path='render-to-json')
def render_to_json(self, request: Request, *args, **kwargs):
rows = request.data
if rows and isinstance(rows[0], dict):
first = list(rows[0].values())[0]
if first.startswith('#Help'):
rows.pop(0)
data = {
'title': (),
'data': request.data,
'data': rows,
}
jms_context = getattr(request, 'jms_context', {})

View File

@ -119,8 +119,6 @@ class BaseFileParser(BaseParser):
value = field.to_file_internal_value(value)
elif isinstance(field, serializers.BooleanField):
value = value.lower() in ['true', '1', 'yes']
elif isinstance(field, serializers.ChoiceField):
value = value
elif isinstance(field, ObjectRelatedField):
if field.many:
value = [self.id_name_to_obj(v) for v in value]
@ -164,6 +162,15 @@ class BaseFileParser(BaseParser):
data.append(row_data)
return data
@staticmethod
def pop_help_text_if_need(rows):
rows = list(rows)
if not rows:
return rows
if rows[0][0] == '#Help':
rows.pop(0)
return rows
def parse(self, stream, media_type=None, parser_context=None):
assert parser_context is not None, '`parser_context` should not be `None`'
@ -192,6 +199,7 @@ class BaseFileParser(BaseParser):
request.jms_context = {}
request.jms_context['column_title_field_pairs'] = column_title_field_pairs
rows = self.pop_help_text_if_need(rows)
data = self.generate_data(field_names, rows)
return data
except Exception as e:

View File

@ -5,12 +5,13 @@ from datetime import datetime
import pyzipper
from django.conf import settings
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from rest_framework import serializers
from rest_framework.renderers import BaseRenderer
from rest_framework.utils import encoders, json
from common.serializers.fields import ObjectRelatedField, LabeledChoiceField
from common.serializers import fields as common_fields
from common.utils import get_logger
logger = get_logger(__file__)
@ -38,8 +39,10 @@ class BaseFileRenderer(BaseRenderer):
filename_prefix = serializer.Meta.model.__name__.lower()
else:
filename_prefix = 'download'
now = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
filename = "{}_{}.{}".format(filename_prefix, now, self.format)
suffix = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
if self.template == 'import':
suffix = 'template'
filename = "{}_{}.{}".format(filename_prefix, suffix, self.format)
disposition = 'attachment; filename="{}"'.format(filename)
response['Content-Disposition'] = disposition
@ -105,10 +108,10 @@ class BaseFileRenderer(BaseRenderer):
value = field.to_file_representation(value)
elif isinstance(value, bool):
value = 'Yes' if value else 'No'
elif isinstance(field, LabeledChoiceField):
elif isinstance(field, common_fields.LabeledChoiceField):
value = value or {}
value = '{}({})'.format(value.get('label'), value.get('value'))
elif isinstance(field, ObjectRelatedField):
elif isinstance(field, common_fields.ObjectRelatedField):
if field.many:
value = [self.to_id_name(v) for v in value]
else:
@ -126,6 +129,53 @@ class BaseFileRenderer(BaseRenderer):
value = json.dumps(value, cls=encoders.JSONEncoder, ensure_ascii=False)
return str(value)
def get_field_help_text(self, field):
text = ''
if hasattr(field, 'get_render_help_text'):
text = field.get_render_help_text()
elif isinstance(field, serializers.BooleanField):
text = _('Yes/No')
elif isinstance(field, serializers.CharField):
if field.max_length:
text = _('Text, max length {}').format(field.max_length)
else:
text = _("Long text, no length limit")
elif isinstance(field, serializers.IntegerField):
text = _('Number, min {} max {}').format(field.min_value, field.max_value)
text = text.replace('min None', '').replace('max None', '')
elif isinstance(field, serializers.DateTimeField):
text = _('Datetime format {}').format(timezone.now().strftime(settings.REST_FRAMEWORK['DATETIME_FORMAT']))
elif isinstance(field, serializers.IPAddressField):
text = _('IP')
elif isinstance(field, serializers.ChoiceField):
choices = [str(v) for v in field.choices.keys()]
if isinstance(field, common_fields.LabeledChoiceField):
text = _("Choices, format name(value), name is optional for human read,"
" value is requisite, options {}").format(','.join(choices))
else:
text = _("Choices, options {}").format(",".join(choices))
elif isinstance(field, common_fields.PhoneField):
text = _("Phone number, format +8612345678901")
elif isinstance(field, common_fields.LabeledChoiceField):
text = _('Label, format ["key:value"]')
elif isinstance(field, common_fields.ObjectRelatedField):
text = _("Object, format name(id), name is optional for human read, id is requisite")
elif isinstance(field, serializers.PrimaryKeyRelatedField):
text = _('Object, format id')
elif isinstance(field, serializers.ManyRelatedField):
child_relation_class_name = field.child_relation.__class__.__name__
if child_relation_class_name == "ObjectRelatedField":
text = _('Objects, format ["name(id)", ...], name is optional for human read, id is requisite')
elif child_relation_class_name == "LabelRelatedField":
text = _('Labels, format ["key:value", ...], if label not exists, will create it')
else:
text = _('Objects, format ["id", ...]')
elif isinstance(field, serializers.ListSerializer):
child = field.child
if hasattr(child, 'get_render_help_text'):
text = child.get_render_help_text()
return text
def generate_rows(self, data, render_fields):
for item in data:
row = []
@ -135,6 +185,17 @@ class BaseFileRenderer(BaseRenderer):
row.append(value)
yield row
def write_help_text_if_need(self):
if self.template == 'export':
return
fields = self.get_rendered_fields()
row = []
for f in fields:
text = self.get_field_help_text(f)
row.append(text)
row[0] = '#Help ' + str(row[0])
self.write_row(row)
@abc.abstractmethod
def initial_writer(self):
raise NotImplementedError
@ -184,6 +245,7 @@ class BaseFileRenderer(BaseRenderer):
rows = self.generate_rows(data, rendered_fields)
self.initial_writer()
self.write_column_titles(column_titles)
self.write_help_text_if_need()
self.write_rows(rows)
self.after_render()
value = self.get_rendered_value()

View File

@ -2,17 +2,17 @@
#
import codecs
import unicodecsv
from six import BytesIO
from .base import BaseFileRenderer
from ..const import CSV_FILE_ESCAPE_CHARS
class CSVFileRenderer(BaseFileRenderer):
class CSVFileRenderer(BaseFileRenderer):
media_type = 'text/csv'
format = 'csv'
writer = None
buffer = None

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-09-09 14:08+0800\n"
"POT-Creation-Date: 2024-09-09 14:22+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -387,7 +387,7 @@ msgstr ""
#: accounts/templates/accounts/change_secret_failed_info.html:12
#: acls/serializers/base.py:124
#: acls/templates/acls/asset_login_reminder.html:10
#: assets/serializers/gateway.py:28 audits/models.py:59
#: assets/serializers/gateway.py:33 audits/models.py:59
#: authentication/api/connection_token.py:411 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:34
@ -584,7 +584,7 @@ msgstr ""
#: terminal/models/applet/applet.py:331 terminal/models/applet/host.py:140
#: terminal/models/component/status.py:30
#: terminal/models/virtualapp/virtualapp.py:99
#: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:136
#: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:147
#: terminal/serializers/virtualapp.py:35 tickets/models/ticket/general.py:284
#: tickets/serializers/super_ticket.py:13
#: tickets/serializers/ticket/ticket.py:20 xpack/plugins/cloud/models.py:225
@ -655,7 +655,7 @@ msgstr ""
#: audits/models.py:92 audits/serializers.py:84
#: authentication/serializers/connect_token_secret.py:119
#: authentication/templates/authentication/_access_key_modal.html:34
#: perms/serializers/permission.py:41 perms/serializers/permission.py:63
#: perms/serializers/permission.py:52 perms/serializers/permission.py:74
#: tickets/serializers/ticket/ticket.py:21
msgid "Action"
msgstr ""
@ -702,7 +702,7 @@ msgstr ""
#: assets/models/asset/common.py:159 assets/models/cmd_filter.py:21
#: assets/models/domain.py:19 assets/models/label.py:18
#: assets/models/platform.py:15 assets/models/platform.py:94
#: assets/serializers/asset/common.py:149 assets/serializers/platform.py:153
#: assets/serializers/asset/common.py:169 assets/serializers/platform.py:153
#: assets/serializers/platform.py:273
#: authentication/backends/passkey/models.py:10
#: authentication/models/ssh_key.py:12
@ -844,7 +844,7 @@ msgid "Exist policy"
msgstr ""
#: accounts/serializers/account/account.py:206 assets/models/label.py:21
#: assets/models/platform.py:95 assets/serializers/asset/common.py:125
#: assets/models/platform.py:95 assets/serializers/asset/common.py:145
#: assets/serializers/cagegory.py:12 assets/serializers/platform.py:168
#: assets/serializers/platform.py:274 perms/serializers/user_permission.py:26
#: settings/models.py:37 tickets/models/ticket/apply_application.py:13
@ -856,7 +856,7 @@ msgstr ""
#: accounts/serializers/automations/base.py:55 acls/models/command_acl.py:24
#: acls/serializers/command_acl.py:19 assets/models/automations/base.py:20
#: assets/models/cmd_filter.py:74 assets/models/platform.py:96
#: assets/serializers/asset/common.py:126 assets/serializers/platform.py:155
#: assets/serializers/asset/common.py:146 assets/serializers/platform.py:155
#: assets/serializers/platform.py:167 audits/serializers.py:53
#: audits/serializers.py:170
#: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:150
@ -897,7 +897,7 @@ msgstr ""
#: assets/serializers/platform.py:176 assets/serializers/platform.py:208
#: authentication/api/connection_token.py:410 ops/models/base.py:17
#: ops/models/job.py:152 ops/serializers/job.py:19
#: perms/serializers/permission.py:35
#: perms/serializers/permission.py:46
#: terminal/templates/terminal/_msg_command_execute_alert.html:16
#: xpack/plugins/cloud/manager.py:83
msgid "Assets"
@ -919,7 +919,7 @@ msgstr ""
#: accounts/serializers/account/account.py:458
#: accounts/serializers/account/base.py:93
#: accounts/serializers/account/template.py:72
#: assets/serializers/asset/common.py:387
#: assets/serializers/asset/common.py:407
msgid "Spec info"
msgstr ""
@ -1048,8 +1048,8 @@ msgid ""
msgstr ""
#: accounts/serializers/automations/base.py:23
#: assets/models/asset/common.py:169 assets/serializers/asset/common.py:152
#: assets/serializers/automations/base.py:21 perms/serializers/permission.py:36
#: assets/models/asset/common.py:169 assets/serializers/asset/common.py:172
#: assets/serializers/automations/base.py:21 perms/serializers/permission.py:47
msgid "Nodes"
msgstr ""
@ -1264,15 +1264,15 @@ msgstr ""
msgid "Active"
msgstr "Active"
#: acls/models/base.py:81 perms/serializers/permission.py:31
#: acls/models/base.py:81 perms/serializers/permission.py:42
#: tickets/models/flow.py:23 users/models/preference.py:16
#: users/serializers/group.py:21 users/serializers/user.py:424
msgid "Users"
msgstr ""
#: acls/models/base.py:98 assets/models/automations/base.py:17
#: assets/models/cmd_filter.py:38 assets/serializers/asset/common.py:128
#: assets/serializers/asset/common.py:386 perms/serializers/permission.py:44
#: assets/models/cmd_filter.py:38 assets/serializers/asset/common.py:148
#: assets/serializers/asset/common.py:406 perms/serializers/permission.py:55
#: perms/serializers/user_permission.py:75 rbac/tree.py:35
msgid "Accounts"
msgstr ""
@ -1404,7 +1404,7 @@ msgstr ""
#: authentication/templates/authentication/_msg_oauth_bind.html:12
#: authentication/templates/authentication/_msg_rest_password_success.html:8
#: authentication/templates/authentication/_msg_rest_public_key_success.html:8
#: xpack/plugins/cloud/models.py:390
#: common/drf/renders/base.py:149 xpack/plugins/cloud/models.py:390
msgid "IP"
msgstr ""
@ -1573,7 +1573,7 @@ msgid "Gather facts"
msgstr ""
#: assets/const/base.py:32 audits/const.py:58
#: terminal/serializers/applet_host.py:32 users/models/user/_auth.py:32
#: terminal/serializers/applet_host.py:34 users/models/user/_auth.py:32
msgid "Disabled"
msgstr ""
@ -1821,7 +1821,7 @@ msgstr ""
msgid "Port"
msgstr ""
#: assets/models/asset/common.py:160 assets/serializers/asset/common.py:150
#: assets/models/asset/common.py:160 assets/serializers/asset/common.py:170
#: settings/serializers/terminal.py:10
msgid "Address"
msgstr ""
@ -1837,7 +1837,7 @@ msgstr ""
msgid "Zone"
msgstr ""
#: assets/models/asset/common.py:172 assets/serializers/asset/common.py:388
#: assets/models/asset/common.py:172 assets/serializers/asset/common.py:408
#: assets/serializers/asset/host.py:11
msgid "Gathered info"
msgstr ""
@ -2060,7 +2060,7 @@ msgstr ""
#: assets/models/platform.py:38 audits/const.py:59
#: authentication/backends/passkey/models.py:11 settings/models.py:39
#: terminal/serializers/applet_host.py:33 users/models/user/_auth.py:33
#: terminal/serializers/applet_host.py:35 users/models/user/_auth.py:33
msgid "Enabled"
msgstr ""
@ -2181,38 +2181,58 @@ msgid ""
"type"
msgstr ""
#: assets/serializers/asset/common.py:127 assets/serializers/platform.py:169
#: assets/serializers/asset/common.py:36
msgid "Protocols, format is [\"protocol/port\"]"
msgstr ""
#: assets/serializers/asset/common.py:38
msgid "Protocol, format is name/port"
msgstr ""
#: assets/serializers/asset/common.py:107
msgid ""
"Accounts, format [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", "
"\"secret_type\": \"password\"}]"
msgstr ""
#: assets/serializers/asset/common.py:135
msgid ""
"Node path, format [\"/org_name/node_name\"], if node not exist, will create "
"it"
msgstr ""
#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:169
#: authentication/serializers/connect_token_secret.py:30
#: authentication/serializers/connect_token_secret.py:75
#: perms/models/asset_permission.py:76 perms/serializers/permission.py:45
#: perms/models/asset_permission.py:76 perms/serializers/permission.py:56
#: perms/serializers/user_permission.py:74 xpack/plugins/cloud/models.py:388
#: xpack/plugins/cloud/serializers/task.py:35
msgid "Protocols"
msgstr ""
#: assets/serializers/asset/common.py:129
#: assets/serializers/asset/common.py:151
#: assets/serializers/asset/common.py:149
#: assets/serializers/asset/common.py:171
msgid "Node path"
msgstr ""
#: assets/serializers/asset/common.py:148
#: assets/serializers/asset/common.py:389
#: assets/serializers/asset/common.py:168
#: assets/serializers/asset/common.py:409
msgid "Auto info"
msgstr ""
#: assets/serializers/asset/common.py:245
#: assets/serializers/asset/common.py:265
msgid "Platform not exist"
msgstr ""
#: assets/serializers/asset/common.py:281
#: assets/serializers/asset/common.py:301
msgid "port out of range (0-65535)"
msgstr ""
#: assets/serializers/asset/common.py:288
#: assets/serializers/asset/common.py:308
msgid "Protocol is required: {}"
msgstr ""
#: assets/serializers/asset/common.py:316
#: assets/serializers/asset/common.py:336
msgid "Invalid data"
msgstr ""
@ -2299,11 +2319,15 @@ msgid ""
msgstr ""
#: assets/serializers/domain.py:24 assets/serializers/platform.py:177
#: orgs/serializers.py:13 perms/serializers/permission.py:39
#: orgs/serializers.py:13 perms/serializers/permission.py:50
msgid "Assets amount"
msgstr ""
#: assets/serializers/gateway.py:23 common/validators.py:34
#: assets/serializers/gateway.py:19
msgid "The platform must start with Gateway"
msgstr ""
#: assets/serializers/gateway.py:28 common/validators.py:34
msgid "This field must be unique."
msgstr ""
@ -2577,7 +2601,7 @@ msgid "Finished"
msgstr ""
#: audits/const.py:46 settings/serializers/terminal.py:6
#: terminal/models/applet/host.py:26 terminal/models/component/terminal.py:175
#: terminal/models/applet/host.py:26 terminal/models/component/terminal.py:174
#: terminal/models/virtualapp/provider.py:14 terminal/serializers/session.py:55
#: terminal/serializers/session.py:78
msgid "Terminal"
@ -3422,7 +3446,7 @@ msgid "Actions"
msgstr ""
#: authentication/serializers/connection_token.py:42
#: perms/serializers/permission.py:43 perms/serializers/permission.py:64
#: perms/serializers/permission.py:54 perms/serializers/permission.py:75
#: users/serializers/user.py:127 users/serializers/user.py:273
msgid "Is expired"
msgstr "Expired"
@ -3464,8 +3488,8 @@ msgstr ""
msgid "Access IP"
msgstr ""
#: authentication/serializers/token.py:92 perms/serializers/permission.py:42
#: perms/serializers/permission.py:65 users/serializers/user.py:128
#: authentication/serializers/token.py:92 perms/serializers/permission.py:53
#: perms/serializers/permission.py:76 users/serializers/user.py:128
#: users/serializers/user.py:270
msgid "Is valid"
msgstr "Is Valid"
@ -3844,7 +3868,7 @@ msgstr ""
msgid "Please login with a password and then bind the WeCom"
msgstr ""
#: common/api/action.py:51
#: common/api/action.py:57
msgid "Request file format may be wrong"
msgstr ""
@ -3872,7 +3896,7 @@ msgstr ""
msgid "Canceled"
msgstr ""
#: common/const/common.py:5 xpack/plugins/cloud/manager.py:412
#: common/const/common.py:5 xpack/plugins/cloud/manager.py:411
#, python-format
msgid "%(name)s was created successfully"
msgstr ""
@ -3973,7 +3997,7 @@ msgstr "Organization ID"
msgid "The file content overflowed (The maximum length `{}` bytes)"
msgstr ""
#: common/drf/parsers/base.py:199
#: common/drf/parsers/base.py:207
msgid "Parse file error: {}"
msgstr ""
@ -3981,7 +4005,69 @@ msgstr ""
msgid "Invalid excel file"
msgstr ""
#: common/drf/renders/base.py:208
#: common/drf/renders/base.py:137
msgid "Yes/No"
msgstr ""
#: common/drf/renders/base.py:140
msgid "Text, max length {}"
msgstr ""
#: common/drf/renders/base.py:142
msgid "Long text, no length limit"
msgstr ""
#: common/drf/renders/base.py:144
msgid "Number, min {} max {}"
msgstr ""
#: common/drf/renders/base.py:147
msgid "Datetime format {}"
msgstr ""
#: common/drf/renders/base.py:153
msgid ""
"Choices, format name(value), name is optional for human read, value is "
"requisite, options {}"
msgstr ""
#: common/drf/renders/base.py:156
msgid "Choices, options {}"
msgstr ""
#: common/drf/renders/base.py:158
msgid "Phone number, format +8612345678901"
msgstr ""
#: common/drf/renders/base.py:160
msgid "Label, format [\"key:value\"]"
msgstr ""
#: common/drf/renders/base.py:162
msgid ""
"Object, format name(id), name is optional for human read, id is requisite"
msgstr ""
#: common/drf/renders/base.py:164
msgid "Object, format id"
msgstr ""
#: common/drf/renders/base.py:168
msgid ""
"Objects, format [\"name(id)\", ...], name is optional for human read, id is "
"requisite"
msgstr ""
#: common/drf/renders/base.py:170
msgid ""
"Labels, format [\"key:value\", ...], if label not exists, will create it"
msgstr ""
#: common/drf/renders/base.py:172
msgid "Objects, format [\"id\", ...]"
msgstr ""
#: common/drf/renders/base.py:270
msgid ""
"{} - The encryption password has not been set - please go to personal "
"information -> file encryption password to set the encryption password"
@ -4796,7 +4882,7 @@ msgstr ""
msgid "Can not delete virtual org"
msgstr ""
#: orgs/serializers.py:10 perms/serializers/permission.py:37
#: orgs/serializers.py:10 perms/serializers/permission.py:48
#: rbac/serializers/role.py:27 users/serializers/group.py:54
msgid "Users amount"
msgstr ""
@ -4805,7 +4891,7 @@ msgstr ""
msgid "User groups amount"
msgstr ""
#: orgs/serializers.py:14 perms/serializers/permission.py:40
#: orgs/serializers.py:14 perms/serializers/permission.py:51
msgid "Nodes amount"
msgstr ""
@ -4922,11 +5008,21 @@ msgstr ""
msgid "asset permissions of organization {}"
msgstr ""
#: perms/serializers/permission.py:33 users/serializers/user.py:257
msgid "Groups"
#: perms/serializers/permission.py:32
msgid ""
"Accounts, format [\"@virtual\", \"root\", \"%template_id\"], virtual "
"choices: @ALL, @SPEC, @USER, @ANON, @INPUT"
msgstr ""
#: perms/serializers/permission.py:38
msgid "Protocols, format [\"ssh\", \"rdp\", \"vnc\"] or [\"all\"]"
msgstr ""
#: perms/serializers/permission.py:44 users/serializers/user.py:257
msgid "Groups"
msgstr ""
#: perms/serializers/permission.py:49
msgid "Groups amount"
msgstr ""
@ -5503,9 +5599,9 @@ msgstr ""
#: settings/serializers/auth/ldap.py:91
msgid ""
"Caching the User DN obtained during user login authentication can "
"effectivelyimprove the speed of user authentication., 0 means no cache<br>If "
"the user OU structure has been adjusted, click Submit to clear the user DN "
"cache"
"effectively improve the speed of user authentication., 0 means no "
"cache<br>If the user OU structure has been adjusted, click Submit to clear "
"the user DN cache"
msgstr ""
#: settings/serializers/auth/ldap.py:97
@ -6799,27 +6895,27 @@ msgstr ""
msgid "Deleting the default storage is not allowed"
msgstr ""
#: terminal/api/component/storage.py:34
msgid "Cannot delete storage that is being used"
#: terminal/api/component/storage.py:36
msgid "Cannot delete storage that is being used: {}"
msgstr ""
#: terminal/api/component/storage.py:75 terminal/api/component/storage.py:76
#: terminal/api/component/storage.py:77 terminal/api/component/storage.py:78
msgid "Command storages"
msgstr ""
#: terminal/api/component/storage.py:82
#: terminal/api/component/storage.py:84
msgid "Invalid"
msgstr ""
#: terminal/api/component/storage.py:130 terminal/tasks.py:149
#: terminal/api/component/storage.py:132 terminal/tasks.py:149
msgid "Test failure: {}"
msgstr ""
#: terminal/api/component/storage.py:133
#: terminal/api/component/storage.py:135
msgid "Test successful"
msgstr ""
#: terminal/api/component/storage.py:135
#: terminal/api/component/storage.py:137
msgid "Test failure: Please check configuration"
msgstr ""
@ -7004,7 +7100,7 @@ msgstr ""
msgid "Can concurrent"
msgstr ""
#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:167
#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:178
#: terminal/serializers/storage.py:193
msgid "Hosts"
msgstr ""
@ -7035,7 +7131,7 @@ msgstr ""
msgid "Applet Publication"
msgstr ""
#: terminal/models/applet/host.py:18 terminal/serializers/applet_host.py:69
#: terminal/models/applet/host.py:18 terminal/serializers/applet_host.py:80
msgid "Deploy options"
msgstr ""
@ -7169,7 +7265,7 @@ msgstr ""
msgid "Application User"
msgstr ""
#: terminal/models/component/terminal.py:177
#: terminal/models/component/terminal.py:176
msgid "Can view terminal config"
msgstr ""
@ -7341,19 +7437,19 @@ msgstr ""
msgid "Icon"
msgstr ""
#: terminal/serializers/applet_host.py:24
msgid "Per Session"
#: terminal/serializers/applet_host.py:26
msgid "Per Device (Device number limit)"
msgstr ""
#: terminal/serializers/applet_host.py:25
msgid "Per Device"
#: terminal/serializers/applet_host.py:27
msgid "Per User (User number limit)"
msgstr ""
#: terminal/serializers/applet_host.py:37
#: terminal/serializers/applet_host.py:39
msgid "Core API"
msgstr ""
#: terminal/serializers/applet_host.py:38
#: terminal/serializers/applet_host.py:40
msgid ""
" \n"
" Tips: The application release machine communicates with the Core "
@ -7367,52 +7463,64 @@ msgid ""
" "
msgstr ""
#: terminal/serializers/applet_host.py:46 terminal/serializers/storage.py:207
#: terminal/serializers/applet_host.py:48 terminal/serializers/storage.py:207
msgid "Ignore Certificate Verification"
msgstr ""
#: terminal/serializers/applet_host.py:47
#: terminal/serializers/applet_host.py:50
msgid "Existing RDS license"
msgstr ""
#: terminal/serializers/applet_host.py:48
#: terminal/serializers/applet_host.py:51
msgid ""
"If not exist, the RDS will be in trial mode, and the trial period is 120 "
"days. <a href={}>Detail</a>"
msgstr ""
#: terminal/serializers/applet_host.py:54
msgid "RDS License Server"
msgstr ""
#: terminal/serializers/applet_host.py:49
#: terminal/serializers/applet_host.py:56
msgid "RDS Licensing Mode"
msgstr ""
#: terminal/serializers/applet_host.py:51
#: terminal/serializers/applet_host.py:59
msgid "RDS Single Session Per User"
msgstr ""
#: terminal/serializers/applet_host.py:53
#: terminal/serializers/applet_host.py:60
msgid ""
"Tips: A RDS user can have only one session at a time. If set, when next "
"login connected, previous session will be disconnected."
msgstr ""
#: terminal/serializers/applet_host.py:64
msgid "RDS Max Disconnection Time (ms)"
msgstr ""
#: terminal/serializers/applet_host.py:55
#: terminal/serializers/applet_host.py:66
msgid ""
"Tips: Set the maximum duration for keeping a disconnected session active on "
"the server (log off the session after 60000 milliseconds)."
msgstr ""
#: terminal/serializers/applet_host.py:60
#: terminal/serializers/applet_host.py:71
msgid "RDS Remote App Logoff Time Limit (ms)"
msgstr ""
#: terminal/serializers/applet_host.py:62
#: terminal/serializers/applet_host.py:73
msgid ""
"Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp "
"programs (0 milliseconds, log off the session immediately)."
msgstr ""
#: terminal/serializers/applet_host.py:71 terminal/serializers/terminal.py:47
#: terminal/serializers/applet_host.py:82 terminal/serializers/terminal.py:47
#: terminal/serializers/virtualapp_provider.py:13
msgid "Load status"
msgstr ""
#: terminal/serializers/applet_host.py:85
#: terminal/serializers/applet_host.py:96
msgid ""
"These accounts are used to connect to the published application, the account "
"is now divided into two types, one is dedicated to each account, each user "
@ -7421,26 +7529,26 @@ msgid ""
"be used to connect"
msgstr ""
#: terminal/serializers/applet_host.py:92
#: terminal/serializers/applet_host.py:103
msgid "The number of public accounts created automatically"
msgstr ""
#: terminal/serializers/applet_host.py:95
#: terminal/serializers/applet_host.py:106
msgid ""
"Connect to the host using the same account first. For security reasons, "
"please set the configuration item CACHE_LOGIN_PASSWORD_ENABLED=true and "
"restart the service to enable it."
msgstr ""
#: terminal/serializers/applet_host.py:137
#: terminal/serializers/applet_host.py:148
msgid "Install applets"
msgstr ""
#: terminal/serializers/applet_host.py:167
#: terminal/serializers/applet_host.py:178
msgid "Host ID"
msgstr ""
#: terminal/serializers/applet_host.py:168
#: terminal/serializers/applet_host.py:179
msgid "Applet ID"
msgstr ""
@ -8116,11 +8224,15 @@ msgstr ""
msgid "This user is not authorized to approve this ticket"
msgstr ""
#: users/api/user.py:155
#: users/api/user.py:63
msgid "Cannot delete the admin user. Please disable it instead."
msgstr ""
#: users/api/user.py:161
msgid "Can not invite self"
msgstr ""
#: users/api/user.py:208
#: users/api/user.py:214
msgid "Could not reset self otp, use profile reset instead"
msgstr ""
@ -9042,49 +9154,49 @@ msgstr ""
msgid "Failed to synchronize the instance \"%s\""
msgstr ""
#: xpack/plugins/cloud/manager.py:337
#: xpack/plugins/cloud/manager.py:336
#, python-format
msgid ""
"The updated platform of asset \"%s\" is inconsistent with the original "
"platform type. Skip platform and protocol updates"
msgstr ""
#: xpack/plugins/cloud/manager.py:393
#: xpack/plugins/cloud/manager.py:392
#, python-format
msgid "The asset \"%s\" already exists"
msgstr ""
#: xpack/plugins/cloud/manager.py:395
#: xpack/plugins/cloud/manager.py:394
#, python-format
msgid "Update asset \"%s\""
msgstr ""
#: xpack/plugins/cloud/manager.py:398
#: xpack/plugins/cloud/manager.py:397
#, python-format
msgid "Asset \"%s\" has been updated"
msgstr ""
#: xpack/plugins/cloud/manager.py:408
#: xpack/plugins/cloud/manager.py:407
#, python-format
msgid "Prepare to create asset \"%s\""
msgstr ""
#: xpack/plugins/cloud/manager.py:429
#: xpack/plugins/cloud/manager.py:428
#, python-format
msgid "Set nodes \"%s\""
msgstr ""
#: xpack/plugins/cloud/manager.py:455
#: xpack/plugins/cloud/manager.py:454
#, python-format
msgid "Set accounts \"%s\""
msgstr ""
#: xpack/plugins/cloud/manager.py:471
#: xpack/plugins/cloud/manager.py:470
#, python-format
msgid "Set protocols \"%s\""
msgstr ""
#: xpack/plugins/cloud/manager.py:485 xpack/plugins/cloud/tasks.py:30
#: xpack/plugins/cloud/manager.py:484 xpack/plugins/cloud/tasks.py:30
msgid "Run sync instance task"
msgstr ""

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-09-09 14:08+0800\n"
"POT-Creation-Date: 2024-09-09 14:22+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -388,7 +388,7 @@ msgstr "ソース ID"
#: accounts/templates/accounts/change_secret_failed_info.html:12
#: acls/serializers/base.py:124
#: acls/templates/acls/asset_login_reminder.html:10
#: assets/serializers/gateway.py:28 audits/models.py:59
#: assets/serializers/gateway.py:33 audits/models.py:59
#: authentication/api/connection_token.py:411 ops/models/base.py:18
#: perms/models/asset_permission.py:75 settings/serializers/msg.py:33
#: terminal/backends/command/models.py:18
@ -585,7 +585,7 @@ msgstr "終了日"
#: terminal/models/applet/applet.py:331 terminal/models/applet/host.py:140
#: terminal/models/component/status.py:30
#: terminal/models/virtualapp/virtualapp.py:99
#: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:136
#: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:147
#: terminal/serializers/virtualapp.py:35 tickets/models/ticket/general.py:284
#: tickets/serializers/super_ticket.py:13
#: tickets/serializers/ticket/ticket.py:20 xpack/plugins/cloud/models.py:225
@ -656,7 +656,7 @@ msgstr "トリガー方式"
#: audits/models.py:92 audits/serializers.py:84
#: authentication/serializers/connect_token_secret.py:119
#: authentication/templates/authentication/_access_key_modal.html:34
#: perms/serializers/permission.py:41 perms/serializers/permission.py:63
#: perms/serializers/permission.py:52 perms/serializers/permission.py:74
#: tickets/serializers/ticket/ticket.py:21
msgid "Action"
msgstr "アクション"
@ -703,7 +703,7 @@ msgstr "パスワードルール"
#: assets/models/asset/common.py:159 assets/models/cmd_filter.py:21
#: assets/models/domain.py:19 assets/models/label.py:18
#: assets/models/platform.py:15 assets/models/platform.py:94
#: assets/serializers/asset/common.py:149 assets/serializers/platform.py:153
#: assets/serializers/asset/common.py:169 assets/serializers/platform.py:153
#: assets/serializers/platform.py:273
#: authentication/backends/passkey/models.py:10
#: authentication/models/ssh_key.py:12
@ -850,7 +850,7 @@ msgid "Exist policy"
msgstr "アカウントの存在ポリシー"
#: accounts/serializers/account/account.py:206 assets/models/label.py:21
#: assets/models/platform.py:95 assets/serializers/asset/common.py:125
#: assets/models/platform.py:95 assets/serializers/asset/common.py:145
#: assets/serializers/cagegory.py:12 assets/serializers/platform.py:168
#: assets/serializers/platform.py:274 perms/serializers/user_permission.py:26
#: settings/models.py:37 tickets/models/ticket/apply_application.py:13
@ -862,7 +862,7 @@ msgstr "カテゴリ"
#: accounts/serializers/automations/base.py:55 acls/models/command_acl.py:24
#: acls/serializers/command_acl.py:19 assets/models/automations/base.py:20
#: assets/models/cmd_filter.py:74 assets/models/platform.py:96
#: assets/serializers/asset/common.py:126 assets/serializers/platform.py:155
#: assets/serializers/asset/common.py:146 assets/serializers/platform.py:155
#: assets/serializers/platform.py:167 audits/serializers.py:53
#: audits/serializers.py:170
#: authentication/serializers/connect_token_secret.py:126
@ -903,7 +903,7 @@ msgstr "編集済み"
#: assets/serializers/platform.py:176 assets/serializers/platform.py:208
#: authentication/api/connection_token.py:410 ops/models/base.py:17
#: ops/models/job.py:152 ops/serializers/job.py:19
#: perms/serializers/permission.py:35
#: perms/serializers/permission.py:46
#: terminal/templates/terminal/_msg_command_execute_alert.html:16
#: xpack/plugins/cloud/manager.py:83
msgid "Assets"
@ -925,7 +925,7 @@ msgstr "アカウントはすでに存在しています"
#: accounts/serializers/account/account.py:458
#: accounts/serializers/account/base.py:93
#: accounts/serializers/account/template.py:72
#: assets/serializers/asset/common.py:387
#: assets/serializers/asset/common.py:407
msgid "Spec info"
msgstr "特別情報"
@ -1058,9 +1058,9 @@ msgstr ""
"手動入力. <br/> セキュリティのために、「config CACHE_LOGIN_PASSWORD_ENABLED」をtrueに設定してください。 "
#: accounts/serializers/automations/base.py:23
#: assets/models/asset/common.py:169 assets/serializers/asset/common.py:152
#: assets/models/asset/common.py:169 assets/serializers/asset/common.py:172
#: assets/serializers/automations/base.py:21
#: perms/serializers/permission.py:36
#: perms/serializers/permission.py:47
msgid "Nodes"
msgstr "ノード"
@ -1270,15 +1270,15 @@ msgstr "レビュー担当者"
msgid "Active"
msgstr "アクティブ"
#: acls/models/base.py:81 perms/serializers/permission.py:31
#: acls/models/base.py:81 perms/serializers/permission.py:42
#: tickets/models/flow.py:23 users/models/preference.py:16
#: users/serializers/group.py:21 users/serializers/user.py:424
msgid "Users"
msgstr "ユーザー"
#: acls/models/base.py:98 assets/models/automations/base.py:17
#: assets/models/cmd_filter.py:38 assets/serializers/asset/common.py:128
#: assets/serializers/asset/common.py:386 perms/serializers/permission.py:44
#: assets/models/cmd_filter.py:38 assets/serializers/asset/common.py:148
#: assets/serializers/asset/common.py:406 perms/serializers/permission.py:55
#: perms/serializers/user_permission.py:75 rbac/tree.py:35
msgid "Accounts"
msgstr "アカウント"
@ -1415,7 +1415,7 @@ msgstr ""
#: authentication/templates/authentication/_msg_oauth_bind.html:12
#: authentication/templates/authentication/_msg_rest_password_success.html:8
#: authentication/templates/authentication/_msg_rest_public_key_success.html:8
#: xpack/plugins/cloud/models.py:390
#: common/drf/renders/base.py:149 xpack/plugins/cloud/models.py:390
msgid "IP"
msgstr "IP"
@ -1585,7 +1585,7 @@ msgid "Gather facts"
msgstr "資産情報の収集"
#: assets/const/base.py:32 audits/const.py:58
#: terminal/serializers/applet_host.py:32 users/models/user/_auth.py:32
#: terminal/serializers/applet_host.py:34 users/models/user/_auth.py:32
msgid "Disabled"
msgstr "無効"
@ -1837,7 +1837,7 @@ msgstr "クラウド サービス"
msgid "Port"
msgstr "ポート"
#: assets/models/asset/common.py:160 assets/serializers/asset/common.py:150
#: assets/models/asset/common.py:160 assets/serializers/asset/common.py:170
#: settings/serializers/terminal.py:10
msgid "Address"
msgstr "アドレス"
@ -1853,7 +1853,7 @@ msgstr "プラットフォーム"
msgid "Zone"
msgstr "ゾーン"
#: assets/models/asset/common.py:172 assets/serializers/asset/common.py:388
#: assets/models/asset/common.py:172 assets/serializers/asset/common.py:408
#: assets/serializers/asset/host.py:11
msgid "Gathered info"
msgstr "資産ハードウェア情報の収集"
@ -2076,7 +2076,7 @@ msgstr "設定"
#: assets/models/platform.py:38 audits/const.py:59
#: authentication/backends/passkey/models.py:11 settings/models.py:39
#: terminal/serializers/applet_host.py:33 users/models/user/_auth.py:33
#: terminal/serializers/applet_host.py:35 users/models/user/_auth.py:33
msgid "Enabled"
msgstr "有効化"
@ -2197,38 +2197,58 @@ msgid ""
"type"
msgstr "プラットフォームタイプがスキップされた資産に合致しない、資産内の一括更新プラットフォーム"
#: assets/serializers/asset/common.py:127 assets/serializers/platform.py:169
#: assets/serializers/asset/common.py:36
msgid "Protocols, format is [\"protocol/port\"]"
msgstr "契約書、形式は[\"契約書/ポート\"]"
#: assets/serializers/asset/common.py:38
msgid "Protocol, format is name/port"
msgstr "契約書、形式は 名前/ポート"
#: assets/serializers/asset/common.py:107
msgid ""
"Accounts, format [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", "
"\"secret_type\": \"password\"}]"
msgstr "アカウント、形式は [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", \"secret_type\": \"パスワード\"}]"
#: assets/serializers/asset/common.py:135
msgid ""
"Node path, format [\"/org_name/node_name\"], if node not exist, will create "
"it"
msgstr "ノードパス、形式は [\"/組織/ノード名\"]、もしノードが存在しない場合、それを作成します"
#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:169
#: authentication/serializers/connect_token_secret.py:30
#: authentication/serializers/connect_token_secret.py:75
#: perms/models/asset_permission.py:76 perms/serializers/permission.py:45
#: perms/models/asset_permission.py:76 perms/serializers/permission.py:56
#: perms/serializers/user_permission.py:74 xpack/plugins/cloud/models.py:388
#: xpack/plugins/cloud/serializers/task.py:35
msgid "Protocols"
msgstr "プロトコル"
#: assets/serializers/asset/common.py:129
#: assets/serializers/asset/common.py:151
#: assets/serializers/asset/common.py:149
#: assets/serializers/asset/common.py:171
msgid "Node path"
msgstr "ノードパスです"
#: assets/serializers/asset/common.py:148
#: assets/serializers/asset/common.py:389
#: assets/serializers/asset/common.py:168
#: assets/serializers/asset/common.py:409
msgid "Auto info"
msgstr "自動情報"
#: assets/serializers/asset/common.py:245
#: assets/serializers/asset/common.py:265
msgid "Platform not exist"
msgstr "プラットフォームが存在しません"
#: assets/serializers/asset/common.py:281
#: assets/serializers/asset/common.py:301
msgid "port out of range (0-65535)"
msgstr "ポート番号が範囲外です (0-65535)"
#: assets/serializers/asset/common.py:288
#: assets/serializers/asset/common.py:308
msgid "Protocol is required: {}"
msgstr "プロトコルが必要です: {}"
#: assets/serializers/asset/common.py:316
#: assets/serializers/asset/common.py:336
msgid "Invalid data"
msgstr "無効なデータ"
@ -2316,11 +2336,15 @@ msgid ""
msgstr "ゲートウェイはドメインのネットワーク代理であり、ドメイン内のリソースに接続する際には、接続はゲートウェイを通してルーティングされます。"
#: assets/serializers/domain.py:24 assets/serializers/platform.py:177
#: orgs/serializers.py:13 perms/serializers/permission.py:39
#: orgs/serializers.py:13 perms/serializers/permission.py:50
msgid "Assets amount"
msgstr "資産数量"
#: assets/serializers/gateway.py:23 common/validators.py:34
#: assets/serializers/gateway.py:19
msgid "The platform must start with Gateway"
msgstr ""
#: assets/serializers/gateway.py:28 common/validators.py:34
msgid "This field must be unique."
msgstr "このフィールドは一意である必要があります。"
@ -2598,7 +2622,7 @@ msgid "Finished"
msgstr "終了"
#: audits/const.py:46 settings/serializers/terminal.py:6
#: terminal/models/applet/host.py:26 terminal/models/component/terminal.py:175
#: terminal/models/applet/host.py:26 terminal/models/component/terminal.py:174
#: terminal/models/virtualapp/provider.py:14
#: terminal/serializers/session.py:55 terminal/serializers/session.py:78
msgid "Terminal"
@ -3447,7 +3471,7 @@ msgid "Actions"
msgstr "アクション"
#: authentication/serializers/connection_token.py:42
#: perms/serializers/permission.py:43 perms/serializers/permission.py:64
#: perms/serializers/permission.py:54 perms/serializers/permission.py:75
#: users/serializers/user.py:127 users/serializers/user.py:273
msgid "Is expired"
msgstr "期限切れです"
@ -3489,8 +3513,8 @@ msgstr "有効なssh公開鍵ではありません"
msgid "Access IP"
msgstr "Access IP"
#: authentication/serializers/token.py:92 perms/serializers/permission.py:42
#: perms/serializers/permission.py:65 users/serializers/user.py:128
#: authentication/serializers/token.py:92 perms/serializers/permission.py:53
#: perms/serializers/permission.py:76 users/serializers/user.py:128
#: users/serializers/user.py:270
msgid "Is valid"
msgstr "有効です"
@ -3871,7 +3895,7 @@ msgstr "企業の微信からユーザーを取得できませんでした"
msgid "Please login with a password and then bind the WeCom"
msgstr "パスワードでログインしてからWeComをバインドしてください"
#: common/api/action.py:51
#: common/api/action.py:57
msgid "Request file format may be wrong"
msgstr "リクエストファイルの形式が間違っている可能性があります"
@ -3899,7 +3923,7 @@ msgstr "ランニング"
msgid "Canceled"
msgstr "キャンセル"
#: common/const/common.py:5 xpack/plugins/cloud/manager.py:412
#: common/const/common.py:5 xpack/plugins/cloud/manager.py:411
#, python-format
msgid "%(name)s was created successfully"
msgstr "%(name)s が正常に作成されました"
@ -4002,7 +4026,7 @@ msgstr "組織 ID"
msgid "The file content overflowed (The maximum length `{}` bytes)"
msgstr "ファイルの内容がオーバーフローしました (最大長 '{}' バイト)"
#: common/drf/parsers/base.py:199
#: common/drf/parsers/base.py:207
msgid "Parse file error: {}"
msgstr "解析ファイルエラー: {}"
@ -4010,7 +4034,68 @@ msgstr "解析ファイルエラー: {}"
msgid "Invalid excel file"
msgstr "無効 excel 書類"
#: common/drf/renders/base.py:208
#: common/drf/renders/base.py:137
msgid "Yes/No"
msgstr ""
#: common/drf/renders/base.py:140
msgid "Text, max length {}"
msgstr "テキスト、最大長 {}"
#: common/drf/renders/base.py:142
msgid "Long text, no length limit"
msgstr "長文テキスト、長さ制限なし"
#: common/drf/renders/base.py:144
msgid "Number, min {} max {}"
msgstr "数字、最小 {} 最大 {}"
#: common/drf/renders/base.py:147
msgid "Datetime format {}"
msgstr "日付時刻形式 {}"
#: common/drf/renders/base.py:153
msgid ""
"Choices, format name(value), name is optional for human read, value is "
"requisite, options {}"
msgstr "選択、形式: 名前(値)、名前はオプショナルで、読みやすいように、値は必須です。選択肢は {}"
#: common/drf/renders/base.py:156
msgid "Choices, options {}"
msgstr "オプション、可能なオプションは {}"
#: common/drf/renders/base.py:158
msgid "Phone number, format +8612345678901"
msgstr "電話番号、形式 +8612345678901"
#: common/drf/renders/base.py:160
msgid "Label, format [\"key:value\"]"
msgstr "タグ、形式: [\"キー:値\"]"
#: common/drf/renders/base.py:162
msgid ""
"Object, format name(id), name is optional for human read, id is requisite"
msgstr "関連項目、形式: 名前(id)、名前はオプショナルで、読みやすいように、idは必須です"
#: common/drf/renders/base.py:164
msgid "Object, format id"
msgstr "関連項目、形式は id"
#: common/drf/renders/base.py:168
msgid ""
"Objects, format [\"name(id)\", ...], name is optional for human read, id is "
"requisite"
msgstr "多関連項目、形式: [\"名前(id)\", ...]、名前はオプショナルで、読みやすいように、idは必須です"
#: common/drf/renders/base.py:170
msgid "Labels, format [\"key:value\", ...], if label not exists, will create it"
msgstr "タグ、形式: [\"キー:値\", ...]、もしタグが存在しない場合、それを作成します"
#: common/drf/renders/base.py:172
msgid "Objects, format [\"id\", ...]"
msgstr "多関連項目、形式は [\"id\", ...]"
#: common/drf/renders/base.py:270
msgid ""
"{} - The encryption password has not been set - please go to personal "
"information -> file encryption password to set the encryption password"
@ -4831,7 +4916,7 @@ msgstr "参加しているすべての組織を表示できます"
msgid "Can not delete virtual org"
msgstr "仮想組織を削除できませんでした"
#: orgs/serializers.py:10 perms/serializers/permission.py:37
#: orgs/serializers.py:10 perms/serializers/permission.py:48
#: rbac/serializers/role.py:27 users/serializers/group.py:54
msgid "Users amount"
msgstr "ユーザー数"
@ -4840,7 +4925,7 @@ msgstr "ユーザー数"
msgid "User groups amount"
msgstr "ユーザーグループの数"
#: orgs/serializers.py:14 perms/serializers/permission.py:40
#: orgs/serializers.py:14 perms/serializers/permission.py:51
msgid "Nodes amount"
msgstr "ノード数"
@ -4957,11 +5042,23 @@ msgstr "資産権限の有効期限が近づいています"
msgid "asset permissions of organization {}"
msgstr "組織 {} の資産権限"
#: perms/serializers/permission.py:33 users/serializers/user.py:257
#: perms/serializers/permission.py:32
msgid ""
"Accounts, format [\"@virtual\", \"root\", \"%template_id\"], virtual "
"choices: @ALL, @SPEC, @USER, @ANON, @INPUT"
msgstr ""
"アカウント、形式 [\"@バーチャルアカウント\", \"root\", \"%テンプレートid\"], バーチャルオプション: @ALL, "
"@SPEC, @USER, @ANON, @INPUT"
#: perms/serializers/permission.py:38
msgid "Protocols, format [\"ssh\", \"rdp\", \"vnc\"] or [\"all\"]"
msgstr "プロトコル、形式は [\"ssh\", \"rdp\", \"vnc\"] または [\"all\"]"
#: perms/serializers/permission.py:44 users/serializers/user.py:257
msgid "Groups"
msgstr "ユーザーグループ"
#: perms/serializers/permission.py:38
#: perms/serializers/permission.py:49
msgid "Groups amount"
msgstr "ユーザーグループの数"
@ -5549,12 +5646,12 @@ msgstr "User DN キャッシュの有効期限 (秒)"
#: settings/serializers/auth/ldap.py:91
msgid ""
"Caching the User DN obtained during user login authentication can "
"effectivelyimprove the speed of user authentication., 0 means no cache<br>If"
" the user OU structure has been adjusted, click Submit to clear the user DN "
"cache"
"effectively improve the speed of user authentication., 0 means no "
"cache<br>If the user OU structure has been adjusted, click Submit to clear "
"the user DN cache"
msgstr ""
"ユーザーログイン認証時に取得したユーザー DN をキャッシュすることで、ユーザー認証の速度を効果的に向上させることができます<br>ユーザー OU "
"構造が調整された場合、送信をクリックしてユーザー DN キャッシュをクリアします"
"ユーザーがログイン認証時にクエリした User DN をキャッシュすると、ユーザー認証の速度を効果的に改善できます。<br>ユーザーの OU "
"構造が調整された場合は、提出をクリックしてユーザーの DN キャッシュをクリアできます。"
#: settings/serializers/auth/ldap.py:97
msgid "Search paged size (piece)"
@ -6891,27 +6988,27 @@ msgstr "プロトコルクエリパラメータが見つかりません"
msgid "Deleting the default storage is not allowed"
msgstr "デフォルトのストレージの削除は許可されていません"
#: terminal/api/component/storage.py:34
msgid "Cannot delete storage that is being used"
msgstr "使用中のストレージを削除できません"
#: terminal/api/component/storage.py:36
msgid "Cannot delete storage that is being used: {}"
msgstr "使用中のストレージは削除できません: {}"
#: terminal/api/component/storage.py:75 terminal/api/component/storage.py:76
#: terminal/api/component/storage.py:77 terminal/api/component/storage.py:78
msgid "Command storages"
msgstr "コマンドストア"
#: terminal/api/component/storage.py:82
#: terminal/api/component/storage.py:84
msgid "Invalid"
msgstr "無効"
#: terminal/api/component/storage.py:130 terminal/tasks.py:149
#: terminal/api/component/storage.py:132 terminal/tasks.py:149
msgid "Test failure: {}"
msgstr "テスト失敗: {}"
#: terminal/api/component/storage.py:133
#: terminal/api/component/storage.py:135
msgid "Test successful"
msgstr "テスト成功"
#: terminal/api/component/storage.py:135
#: terminal/api/component/storage.py:137
msgid "Test failure: Please check configuration"
msgstr "テストに失敗しました:構成を確認してください"
@ -7096,7 +7193,7 @@ msgstr "バージョン"
msgid "Can concurrent"
msgstr "同時実行可能"
#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:167
#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:178
#: terminal/serializers/storage.py:193
msgid "Hosts"
msgstr "ホスト"
@ -7127,7 +7224,7 @@ msgstr "ホスト マシン"
msgid "Applet Publication"
msgstr "アプリケーションのリリース"
#: terminal/models/applet/host.py:18 terminal/serializers/applet_host.py:69
#: terminal/models/applet/host.py:18 terminal/serializers/applet_host.py:80
msgid "Deploy options"
msgstr "展開パラメーター"
@ -7261,7 +7358,7 @@ msgstr "リモートアドレス"
msgid "Application User"
msgstr "ユーザーの適用"
#: terminal/models/component/terminal.py:177
#: terminal/models/component/terminal.py:176
msgid "Can view terminal config"
msgstr "ターミナル構成を表示できます"
@ -7434,19 +7531,19 @@ msgstr "無効なストレージ"
msgid "Icon"
msgstr "アイコン"
#: terminal/serializers/applet_host.py:24
msgid "Per Session"
msgstr "セッションごと"
#: terminal/serializers/applet_host.py:26
msgid "Per Device (Device number limit)"
msgstr ""
#: terminal/serializers/applet_host.py:25
msgid "Per Device"
msgstr "デバイスごと"
#: terminal/serializers/applet_host.py:27
msgid "Per User (User number limit)"
msgstr ""
#: terminal/serializers/applet_host.py:37
#: terminal/serializers/applet_host.py:39
msgid "Core API"
msgstr "コア サービス アドレス"
#: terminal/serializers/applet_host.py:38
#: terminal/serializers/applet_host.py:40
msgid ""
" \n"
" Tips: The application release machine communicates with the Core service. \n"
@ -7460,53 +7557,65 @@ msgstr ""
"セグメント上にある場合は、イントラネット アドレスを入力することをお勧めします。それ以外の場合は、現在のサイト URL を入力します。<br>例: "
"https://172.16.10.110 または https://dev.jumpserver.com"
#: terminal/serializers/applet_host.py:46 terminal/serializers/storage.py:207
#: terminal/serializers/applet_host.py:48 terminal/serializers/storage.py:207
msgid "Ignore Certificate Verification"
msgstr "証明書の検証を無視する"
#: terminal/serializers/applet_host.py:47
#: terminal/serializers/applet_host.py:50
msgid "Existing RDS license"
msgstr "既存の RDS 証明書"
#: terminal/serializers/applet_host.py:48
#: terminal/serializers/applet_host.py:51
msgid ""
"If not exist, the RDS will be in trial mode, and the trial period is 120 "
"days. <a href={}>Detail</a>"
msgstr ""
#: terminal/serializers/applet_host.py:54
msgid "RDS License Server"
msgstr "RDS ライセンス サーバー"
#: terminal/serializers/applet_host.py:49
#: terminal/serializers/applet_host.py:56
msgid "RDS Licensing Mode"
msgstr "RDS 認可モード"
#: terminal/serializers/applet_host.py:51
#: terminal/serializers/applet_host.py:59
msgid "RDS Single Session Per User"
msgstr "RDS シングル ユーザー シングル セッション"
#: terminal/serializers/applet_host.py:53
#: terminal/serializers/applet_host.py:60
msgid ""
"Tips: A RDS user can have only one session at a time. If set, when next "
"login connected, previous session will be disconnected."
msgstr ""
#: terminal/serializers/applet_host.py:64
msgid "RDS Max Disconnection Time (ms)"
msgstr "最大切断時間(ミリ秒)"
#: terminal/serializers/applet_host.py:55
#: terminal/serializers/applet_host.py:66
msgid ""
"Tips: Set the maximum duration for keeping a disconnected session active on "
"the server (log off the session after 60000 milliseconds)."
msgstr "ヒントサーバー上で切断されたセッションがアクティブな状態で維持される最大時間を設定します60000ミリ秒後にセッションをログオフ。"
#: terminal/serializers/applet_host.py:60
#: terminal/serializers/applet_host.py:71
msgid "RDS Remote App Logoff Time Limit (ms)"
msgstr "RDSリモートアプリケーションのログアウト時間制限ミリ秒"
#: terminal/serializers/applet_host.py:62
#: terminal/serializers/applet_host.py:73
msgid ""
"Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp"
" programs (0 milliseconds, log off the session immediately)."
msgstr ""
"ヒントすべてのRemoteAppプログラムを閉じた後、RemoteAppセッションのログオフ時間を設定します0ミリ秒、セッションを即座にログオフ。"
#: terminal/serializers/applet_host.py:71 terminal/serializers/terminal.py:47
#: terminal/serializers/applet_host.py:82 terminal/serializers/terminal.py:47
#: terminal/serializers/virtualapp_provider.py:13
msgid "Load status"
msgstr "ロードステータス"
#: terminal/serializers/applet_host.py:85
#: terminal/serializers/applet_host.py:96
msgid ""
"These accounts are used to connect to the published application, the account"
" is now divided into two types, one is dedicated to each account, each user "
@ -7516,11 +7625,11 @@ msgid ""
msgstr ""
"これらのアカウントは、公開されたアプリケーションに接続するために使用されます。アカウントは現在、2つのタイプに分類されています。1つは、各アカウントに専用のアカウントで、各ユーザーにはプライベートアカウントがあります。もう1つは公開されています。アプリケーションが複数のオープンをサポートしていない場合、および特別なものが使用されている場合、公開アカウントが使用されます。"
#: terminal/serializers/applet_host.py:92
#: terminal/serializers/applet_host.py:103
msgid "The number of public accounts created automatically"
msgstr "自動的に作成される公開アカウントの数"
#: terminal/serializers/applet_host.py:95
#: terminal/serializers/applet_host.py:106
msgid ""
"Connect to the host using the same account first. For security reasons, "
"please set the configuration item CACHE_LOGIN_PASSWORD_ENABLED=true and "
@ -7529,15 +7638,15 @@ msgstr ""
"同じアカウントを使用してホストに接続します。セキュリティ上の理由から、構成項目 CACHE_LOGIN_PASSWORD_ENABLED=true "
"を設定してサービスを再起動して有効にしてください。"
#: terminal/serializers/applet_host.py:137
#: terminal/serializers/applet_host.py:148
msgid "Install applets"
msgstr "アプリをインストールする"
#: terminal/serializers/applet_host.py:167
#: terminal/serializers/applet_host.py:178
msgid "Host ID"
msgstr "ホスト ID"
#: terminal/serializers/applet_host.py:168
#: terminal/serializers/applet_host.py:179
msgid "Applet ID"
msgstr "リモートアプリケーション ID"
@ -8220,11 +8329,15 @@ msgstr "無効な承認アクション"
msgid "This user is not authorized to approve this ticket"
msgstr "このユーザーはこの作業指示を承認する権限がありません"
#: users/api/user.py:155
#: users/api/user.py:63
msgid "Cannot delete the admin user. Please disable it instead."
msgstr "管理ユーザーを削除することはできません。それを無効にしてください。"
#: users/api/user.py:161
msgid "Can not invite self"
msgstr "自分自身を招待することはできません"
#: users/api/user.py:208
#: users/api/user.py:214
msgid "Could not reset self otp, use profile reset instead"
msgstr "自己otpをリセットできませんでした、代わりにプロファイルリセットを使用"
@ -9161,49 +9274,49 @@ msgstr "地域 \"%s\" のインスタンスを取得できませんでした、
msgid "Failed to synchronize the instance \"%s\""
msgstr "インスタンス \"%s\" の同期に失敗しました"
#: xpack/plugins/cloud/manager.py:337
#: xpack/plugins/cloud/manager.py:336
#, python-format
msgid ""
"The updated platform of asset \"%s\" is inconsistent with the original "
"platform type. Skip platform and protocol updates"
msgstr "更新された資産 \"%s\" のプラットフォームタイプと元のタイプは一致しません。プラットフォームとプロトコルの更新をスキップ"
#: xpack/plugins/cloud/manager.py:393
#: xpack/plugins/cloud/manager.py:392
#, python-format
msgid "The asset \"%s\" already exists"
msgstr "資産 \"%s\" はすでに存在します"
#: xpack/plugins/cloud/manager.py:395
#: xpack/plugins/cloud/manager.py:394
#, python-format
msgid "Update asset \"%s\""
msgstr "資産の更新 \"%s\""
#: xpack/plugins/cloud/manager.py:398
#: xpack/plugins/cloud/manager.py:397
#, python-format
msgid "Asset \"%s\" has been updated"
msgstr "資産 \"%s\" が更新されました"
#: xpack/plugins/cloud/manager.py:408
#: xpack/plugins/cloud/manager.py:407
#, python-format
msgid "Prepare to create asset \"%s\""
msgstr "資産 \"%s\" の作成準備"
#: xpack/plugins/cloud/manager.py:429
#: xpack/plugins/cloud/manager.py:428
#, python-format
msgid "Set nodes \"%s\""
msgstr "ノード \"%s\" の設定"
#: xpack/plugins/cloud/manager.py:455
#: xpack/plugins/cloud/manager.py:454
#, python-format
msgid "Set accounts \"%s\""
msgstr "アカウント \"%s\" の設定"
#: xpack/plugins/cloud/manager.py:471
#: xpack/plugins/cloud/manager.py:470
#, python-format
msgid "Set protocols \"%s\""
msgstr "プロトコル \"%s\" の設定"
#: xpack/plugins/cloud/manager.py:485 xpack/plugins/cloud/tasks.py:30
#: xpack/plugins/cloud/manager.py:484 xpack/plugins/cloud/tasks.py:30
msgid "Run sync instance task"
msgstr "同期インスタンス タスクを実行する"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: JumpServer 0.3.3\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-09-09 14:08+0800\n"
"POT-Creation-Date: 2024-09-09 14:22+0800\n"
"PO-Revision-Date: 2021-05-20 10:54+0800\n"
"Last-Translator: ibuler <ibuler@qq.com>\n"
"Language-Team: JumpServer team<ibuler@qq.com>\n"
@ -386,7 +386,7 @@ msgstr "来源 ID"
#: accounts/templates/accounts/change_secret_failed_info.html:12
#: acls/serializers/base.py:124
#: acls/templates/acls/asset_login_reminder.html:10
#: assets/serializers/gateway.py:28 audits/models.py:59
#: assets/serializers/gateway.py:33 audits/models.py:59
#: authentication/api/connection_token.py:411 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:34
@ -583,7 +583,7 @@ msgstr "结束日期"
#: terminal/models/applet/applet.py:331 terminal/models/applet/host.py:140
#: terminal/models/component/status.py:30
#: terminal/models/virtualapp/virtualapp.py:99
#: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:136
#: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:147
#: terminal/serializers/virtualapp.py:35 tickets/models/ticket/general.py:284
#: tickets/serializers/super_ticket.py:13
#: tickets/serializers/ticket/ticket.py:20 xpack/plugins/cloud/models.py:225
@ -654,7 +654,7 @@ msgstr "触发方式"
#: audits/models.py:92 audits/serializers.py:84
#: authentication/serializers/connect_token_secret.py:119
#: authentication/templates/authentication/_access_key_modal.html:34
#: perms/serializers/permission.py:41 perms/serializers/permission.py:63
#: perms/serializers/permission.py:52 perms/serializers/permission.py:74
#: tickets/serializers/ticket/ticket.py:21
msgid "Action"
msgstr "动作"
@ -701,7 +701,7 @@ msgstr "密码规则"
#: assets/models/asset/common.py:159 assets/models/cmd_filter.py:21
#: assets/models/domain.py:19 assets/models/label.py:18
#: assets/models/platform.py:15 assets/models/platform.py:94
#: assets/serializers/asset/common.py:149 assets/serializers/platform.py:153
#: assets/serializers/asset/common.py:169 assets/serializers/platform.py:153
#: assets/serializers/platform.py:273
#: authentication/backends/passkey/models.py:10
#: authentication/models/ssh_key.py:12
@ -852,7 +852,7 @@ msgid "Exist policy"
msgstr "账号存在策略"
#: accounts/serializers/account/account.py:206 assets/models/label.py:21
#: assets/models/platform.py:95 assets/serializers/asset/common.py:125
#: assets/models/platform.py:95 assets/serializers/asset/common.py:145
#: assets/serializers/cagegory.py:12 assets/serializers/platform.py:168
#: assets/serializers/platform.py:274 perms/serializers/user_permission.py:26
#: settings/models.py:37 tickets/models/ticket/apply_application.py:13
@ -864,7 +864,7 @@ msgstr "类别"
#: accounts/serializers/automations/base.py:55 acls/models/command_acl.py:24
#: acls/serializers/command_acl.py:19 assets/models/automations/base.py:20
#: assets/models/cmd_filter.py:74 assets/models/platform.py:96
#: assets/serializers/asset/common.py:126 assets/serializers/platform.py:155
#: assets/serializers/asset/common.py:146 assets/serializers/platform.py:155
#: assets/serializers/platform.py:167 audits/serializers.py:53
#: audits/serializers.py:170
#: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:150
@ -905,7 +905,7 @@ msgstr "已修改"
#: assets/serializers/platform.py:176 assets/serializers/platform.py:208
#: authentication/api/connection_token.py:410 ops/models/base.py:17
#: ops/models/job.py:152 ops/serializers/job.py:19
#: perms/serializers/permission.py:35
#: perms/serializers/permission.py:46
#: terminal/templates/terminal/_msg_command_execute_alert.html:16
#: xpack/plugins/cloud/manager.py:83
msgid "Assets"
@ -927,7 +927,7 @@ msgstr "账号已存在"
#: accounts/serializers/account/account.py:458
#: accounts/serializers/account/base.py:93
#: accounts/serializers/account/template.py:72
#: assets/serializers/asset/common.py:387
#: assets/serializers/asset/common.py:407
msgid "Spec info"
msgstr "特殊信息"
@ -1061,8 +1061,8 @@ msgstr ""
"CACHE_LOGIN_PASSWORD_ENABLED=true重启服务才能开启"
#: accounts/serializers/automations/base.py:23
#: assets/models/asset/common.py:169 assets/serializers/asset/common.py:152
#: assets/serializers/automations/base.py:21 perms/serializers/permission.py:36
#: assets/models/asset/common.py:169 assets/serializers/asset/common.py:172
#: assets/serializers/automations/base.py:21 perms/serializers/permission.py:47
msgid "Nodes"
msgstr "节点"
@ -1272,15 +1272,15 @@ msgstr "审批人"
msgid "Active"
msgstr "激活中"
#: acls/models/base.py:81 perms/serializers/permission.py:31
#: acls/models/base.py:81 perms/serializers/permission.py:42
#: tickets/models/flow.py:23 users/models/preference.py:16
#: users/serializers/group.py:21 users/serializers/user.py:424
msgid "Users"
msgstr "用户"
#: acls/models/base.py:98 assets/models/automations/base.py:17
#: assets/models/cmd_filter.py:38 assets/serializers/asset/common.py:128
#: assets/serializers/asset/common.py:386 perms/serializers/permission.py:44
#: assets/models/cmd_filter.py:38 assets/serializers/asset/common.py:148
#: assets/serializers/asset/common.py:406 perms/serializers/permission.py:55
#: perms/serializers/user_permission.py:75 rbac/tree.py:35
msgid "Accounts"
msgstr "账号"
@ -1416,7 +1416,7 @@ msgstr ""
#: authentication/templates/authentication/_msg_oauth_bind.html:12
#: authentication/templates/authentication/_msg_rest_password_success.html:8
#: authentication/templates/authentication/_msg_rest_public_key_success.html:8
#: xpack/plugins/cloud/models.py:390
#: common/drf/renders/base.py:149 xpack/plugins/cloud/models.py:390
msgid "IP"
msgstr "IP"
@ -1587,7 +1587,7 @@ msgid "Gather facts"
msgstr "收集资产信息"
#: assets/const/base.py:32 audits/const.py:58
#: terminal/serializers/applet_host.py:32 users/models/user/_auth.py:32
#: terminal/serializers/applet_host.py:34 users/models/user/_auth.py:32
msgid "Disabled"
msgstr "禁用"
@ -1842,7 +1842,7 @@ msgstr "云服务"
msgid "Port"
msgstr "端口"
#: assets/models/asset/common.py:160 assets/serializers/asset/common.py:150
#: assets/models/asset/common.py:160 assets/serializers/asset/common.py:170
#: settings/serializers/terminal.py:10
msgid "Address"
msgstr "地址"
@ -1858,7 +1858,7 @@ msgstr "平台"
msgid "Zone"
msgstr "网域"
#: assets/models/asset/common.py:172 assets/serializers/asset/common.py:388
#: assets/models/asset/common.py:172 assets/serializers/asset/common.py:408
#: assets/serializers/asset/host.py:11
msgid "Gathered info"
msgstr "收集资产硬件信息"
@ -2083,7 +2083,7 @@ msgstr "设置"
#: assets/models/platform.py:38 audits/const.py:59
#: authentication/backends/passkey/models.py:11 settings/models.py:39
#: terminal/serializers/applet_host.py:33 users/models/user/_auth.py:33
#: terminal/serializers/applet_host.py:35 users/models/user/_auth.py:33
msgid "Enabled"
msgstr "启用"
@ -2204,38 +2204,60 @@ msgid ""
"type"
msgstr "资产中批量更新平台,不符合平台类型跳过的资产"
#: assets/serializers/asset/common.py:127 assets/serializers/platform.py:169
#: assets/serializers/asset/common.py:36
msgid "Protocols, format is [\"protocol/port\"]"
msgstr "协议,格式为 [\"协议/端口\"]"
#: assets/serializers/asset/common.py:38
msgid "Protocol, format is name/port"
msgstr "协议,格式为 名称/端口"
#: assets/serializers/asset/common.py:107
msgid ""
"Accounts, format [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", "
"\"secret_type\": \"password\"}]"
msgstr ""
"账号,格式为 [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", "
"\"secret_type\": \"password\"}]"
#: assets/serializers/asset/common.py:135
msgid ""
"Node path, format [\"/org_name/node_name\"], if node not exist, will create "
"it"
msgstr "节点路径,格式为 [\"/组织/节点名\"], 如果节点不存在,将创建它"
#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:169
#: authentication/serializers/connect_token_secret.py:30
#: authentication/serializers/connect_token_secret.py:75
#: perms/models/asset_permission.py:76 perms/serializers/permission.py:45
#: perms/models/asset_permission.py:76 perms/serializers/permission.py:56
#: perms/serializers/user_permission.py:74 xpack/plugins/cloud/models.py:388
#: xpack/plugins/cloud/serializers/task.py:35
msgid "Protocols"
msgstr "协议组"
#: assets/serializers/asset/common.py:129
#: assets/serializers/asset/common.py:151
#: assets/serializers/asset/common.py:149
#: assets/serializers/asset/common.py:171
msgid "Node path"
msgstr "节点路径"
#: assets/serializers/asset/common.py:148
#: assets/serializers/asset/common.py:389
#: assets/serializers/asset/common.py:168
#: assets/serializers/asset/common.py:409
msgid "Auto info"
msgstr "自动化信息"
#: assets/serializers/asset/common.py:245
#: assets/serializers/asset/common.py:265
msgid "Platform not exist"
msgstr "平台不存在"
#: assets/serializers/asset/common.py:281
#: assets/serializers/asset/common.py:301
msgid "port out of range (0-65535)"
msgstr "端口超出范围 (0-65535)"
#: assets/serializers/asset/common.py:288
#: assets/serializers/asset/common.py:308
msgid "Protocol is required: {}"
msgstr "协议是必填的: {}"
#: assets/serializers/asset/common.py:316
#: assets/serializers/asset/common.py:336
msgid "Invalid data"
msgstr "无效的数据"
@ -2324,11 +2346,15 @@ msgid ""
msgstr "网关是网域的网络代理,当连接网域内的资产时,连接将通过网关进行路由。"
#: assets/serializers/domain.py:24 assets/serializers/platform.py:177
#: orgs/serializers.py:13 perms/serializers/permission.py:39
#: orgs/serializers.py:13 perms/serializers/permission.py:50
msgid "Assets amount"
msgstr "资产数量"
#: assets/serializers/gateway.py:23 common/validators.py:34
#: assets/serializers/gateway.py:19
msgid "The platform must start with Gateway"
msgstr ""
#: assets/serializers/gateway.py:28 common/validators.py:34
msgid "This field must be unique."
msgstr "字段必须唯一"
@ -2604,7 +2630,7 @@ msgid "Finished"
msgstr "结束"
#: audits/const.py:46 settings/serializers/terminal.py:6
#: terminal/models/applet/host.py:26 terminal/models/component/terminal.py:175
#: terminal/models/applet/host.py:26 terminal/models/component/terminal.py:174
#: terminal/models/virtualapp/provider.py:14 terminal/serializers/session.py:55
#: terminal/serializers/session.py:78
msgid "Terminal"
@ -3452,7 +3478,7 @@ msgid "Actions"
msgstr "动作"
#: authentication/serializers/connection_token.py:42
#: perms/serializers/permission.py:43 perms/serializers/permission.py:64
#: perms/serializers/permission.py:54 perms/serializers/permission.py:75
#: users/serializers/user.py:127 users/serializers/user.py:273
msgid "Is expired"
msgstr "已过期"
@ -3494,8 +3520,8 @@ msgstr "SSH密钥不合法"
msgid "Access IP"
msgstr "IP 白名单"
#: authentication/serializers/token.py:92 perms/serializers/permission.py:42
#: perms/serializers/permission.py:65 users/serializers/user.py:128
#: authentication/serializers/token.py:92 perms/serializers/permission.py:53
#: perms/serializers/permission.py:76 users/serializers/user.py:128
#: users/serializers/user.py:270
msgid "Is valid"
msgstr "是否有效"
@ -3877,7 +3903,7 @@ msgstr "从企业微信获取用户失败"
msgid "Please login with a password and then bind the WeCom"
msgstr "请使用密码登录,然后绑定企业微信"
#: common/api/action.py:51
#: common/api/action.py:57
msgid "Request file format may be wrong"
msgstr "上传的文件格式错误 或 其它类型资源的文件"
@ -3905,7 +3931,7 @@ msgstr "运行中"
msgid "Canceled"
msgstr "取消"
#: common/const/common.py:5 xpack/plugins/cloud/manager.py:412
#: common/const/common.py:5 xpack/plugins/cloud/manager.py:411
#, python-format
msgid "%(name)s was created successfully"
msgstr "%(name)s 创建成功"
@ -4009,7 +4035,7 @@ msgstr "组织 ID"
msgid "The file content overflowed (The maximum length `{}` bytes)"
msgstr "文件内容太大 (最大长度 `{}` 字节)"
#: common/drf/parsers/base.py:199
#: common/drf/parsers/base.py:207
msgid "Parse file error: {}"
msgstr "解析文件错误: {}"
@ -4017,7 +4043,70 @@ msgstr "解析文件错误: {}"
msgid "Invalid excel file"
msgstr "无效的 excel 文件"
#: common/drf/renders/base.py:208
#: common/drf/renders/base.py:137
msgid "Yes/No"
msgstr ""
#: common/drf/renders/base.py:140
msgid "Text, max length {}"
msgstr "文本,最大长度 {}"
#: common/drf/renders/base.py:142
msgid "Long text, no length limit"
msgstr "长文本,无长度限制"
#: common/drf/renders/base.py:144
msgid "Number, min {} max {}"
msgstr "数字,最小 {} 最大 {}"
#: common/drf/renders/base.py:147
msgid "Datetime format {}"
msgstr "日期时间格式 {}"
#: common/drf/renders/base.py:153
msgid ""
"Choices, format name(value), name is optional for human read, value is "
"requisite, options {}"
msgstr "选项,格式: 名称(值),名称是可选的,方便阅读,值是必填的,可选项有 {}"
#: common/drf/renders/base.py:156
msgid "Choices, options {}"
msgstr "选项,可选项有 {}"
#: common/drf/renders/base.py:158
msgid "Phone number, format +8612345678901"
msgstr "手机号,格式 +8612345678901"
#: common/drf/renders/base.py:160
msgid "Label, format [\"key:value\"]"
msgstr "标签,格式: [\"键:值\"]"
#: common/drf/renders/base.py:162
msgid ""
"Object, format name(id), name is optional for human read, id is requisite"
msgstr "关联项,格式: 名称(id), 名称是可选的方便阅读id 是必填的"
#: common/drf/renders/base.py:164
msgid "Object, format id"
msgstr "关联项,格式是 id"
#: common/drf/renders/base.py:168
msgid ""
"Objects, format [\"name(id)\", ...], name is optional for human read, id is "
"requisite"
msgstr ""
"多关联项,格式: [\"名称(id)\", ...], 名称是可选的方便阅读id 是必填的"
#: common/drf/renders/base.py:170
msgid ""
"Labels, format [\"key:value\", ...], if label not exists, will create it"
msgstr "标签,格式: [\"键:值\", ...], 如果标签不存在,将创建它"
#: common/drf/renders/base.py:172
msgid "Objects, format [\"id\", ...]"
msgstr "多关联项,格式是 [\"id\", ...]"
#: common/drf/renders/base.py:270
msgid ""
"{} - The encryption password has not been set - please go to personal "
"information -> file encryption password to set the encryption password"
@ -4839,7 +4928,7 @@ msgstr "可以查看所有加入的组织"
msgid "Can not delete virtual org"
msgstr "无法删除虚拟组织"
#: orgs/serializers.py:10 perms/serializers/permission.py:37
#: orgs/serializers.py:10 perms/serializers/permission.py:48
#: rbac/serializers/role.py:27 users/serializers/group.py:54
msgid "Users amount"
msgstr "用户数量"
@ -4848,7 +4937,7 @@ msgstr "用户数量"
msgid "User groups amount"
msgstr "用户组数量"
#: orgs/serializers.py:14 perms/serializers/permission.py:40
#: orgs/serializers.py:14 perms/serializers/permission.py:51
msgid "Nodes amount"
msgstr "节点数量"
@ -4965,11 +5054,23 @@ msgstr "资产授权规则将要过期"
msgid "asset permissions of organization {}"
msgstr "组织 ({}) 的资产授权"
#: perms/serializers/permission.py:33 users/serializers/user.py:257
#: perms/serializers/permission.py:32
msgid ""
"Accounts, format [\"@virtual\", \"root\", \"%template_id\"], virtual "
"choices: @ALL, @SPEC, @USER, @ANON, @INPUT"
msgstr ""
"账号,格式 [\"@虚拟账号\", \"root\", \"%模版id\"], 虚拟选项: @ALL, @SPEC, "
"@USER, @ANON, @INPUT"
#: perms/serializers/permission.py:38
msgid "Protocols, format [\"ssh\", \"rdp\", \"vnc\"] or [\"all\"]"
msgstr "协议,格式为 [\"ssh\", \"rdp\", \"vnc\"] 或 [\"all\"]"
#: perms/serializers/permission.py:44 users/serializers/user.py:257
msgid "Groups"
msgstr "用户组"
#: perms/serializers/permission.py:38
#: perms/serializers/permission.py:49
msgid "Groups amount"
msgstr "用户组数量"
@ -5564,9 +5665,9 @@ msgstr "User DN 缓存超时时间 (秒)"
#: settings/serializers/auth/ldap.py:91
msgid ""
"Caching the User DN obtained during user login authentication can "
"effectivelyimprove the speed of user authentication., 0 means no cache<br>If "
"the user OU structure has been adjusted, click Submit to clear the user DN "
"cache"
"effectively improve the speed of user authentication., 0 means no "
"cache<br>If the user OU structure has been adjusted, click Submit to clear "
"the user DN cache"
msgstr ""
"对用户登录认证时查询出的 User DN 进行缓存,可以有效提高用户认证的速度<br>如果"
"用户 OU 架构有调整,点击提交即可清除用户 DN 缓存"
@ -6925,27 +7026,27 @@ msgstr "未发现 protocol 查询参数"
msgid "Deleting the default storage is not allowed"
msgstr "不允许删除默认存储配置"
#: terminal/api/component/storage.py:34
msgid "Cannot delete storage that is being used"
msgstr "不允许删除正在使用的存储配置"
#: terminal/api/component/storage.py:36
msgid "Cannot delete storage that is being used: {}"
msgstr "无法删除正在使用的存储: {}"
#: terminal/api/component/storage.py:75 terminal/api/component/storage.py:76
#: terminal/api/component/storage.py:77 terminal/api/component/storage.py:78
msgid "Command storages"
msgstr "命令存储"
#: terminal/api/component/storage.py:82
#: terminal/api/component/storage.py:84
msgid "Invalid"
msgstr "无效"
#: terminal/api/component/storage.py:130 terminal/tasks.py:149
#: terminal/api/component/storage.py:132 terminal/tasks.py:149
msgid "Test failure: {}"
msgstr "测试失败: {}"
#: terminal/api/component/storage.py:133
#: terminal/api/component/storage.py:135
msgid "Test successful"
msgstr "测试成功"
#: terminal/api/component/storage.py:135
#: terminal/api/component/storage.py:137
msgid "Test failure: Please check configuration"
msgstr "测试失败:请检查配置"
@ -7130,7 +7231,7 @@ msgstr "版本"
msgid "Can concurrent"
msgstr "可以并发"
#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:167
#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:178
#: terminal/serializers/storage.py:193
msgid "Hosts"
msgstr "主机"
@ -7161,7 +7262,7 @@ msgstr "宿主机"
msgid "Applet Publication"
msgstr "应用发布"
#: terminal/models/applet/host.py:18 terminal/serializers/applet_host.py:69
#: terminal/models/applet/host.py:18 terminal/serializers/applet_host.py:80
msgid "Deploy options"
msgstr "部署参数"
@ -7295,7 +7396,7 @@ msgstr "远端地址"
msgid "Application User"
msgstr "应用用户"
#: terminal/models/component/terminal.py:177
#: terminal/models/component/terminal.py:176
msgid "Can view terminal config"
msgstr "可以查看终端配置"
@ -7467,19 +7568,19 @@ msgstr "无效的存储"
msgid "Icon"
msgstr "图标"
#: terminal/serializers/applet_host.py:24
msgid "Per Session"
msgstr "每用户"
#: terminal/serializers/applet_host.py:26
msgid "Per Device (Device number limit)"
msgstr ""
#: terminal/serializers/applet_host.py:25
msgid "Per Device"
msgstr "每设备"
#: terminal/serializers/applet_host.py:27
msgid "Per User (User number limit)"
msgstr ""
#: terminal/serializers/applet_host.py:37
#: terminal/serializers/applet_host.py:39
msgid "Core API"
msgstr "Core 服务地址"
#: terminal/serializers/applet_host.py:38
#: terminal/serializers/applet_host.py:40
msgid ""
" \n"
" Tips: The application release machine communicates with the Core "
@ -7496,31 +7597,43 @@ msgstr ""
"建议填写内网地址,否则填写当前站点 URL<br>例如https://172.16.10.110 or "
"https://dev.jumpserver.com"
#: terminal/serializers/applet_host.py:46 terminal/serializers/storage.py:207
#: terminal/serializers/applet_host.py:48 terminal/serializers/storage.py:207
msgid "Ignore Certificate Verification"
msgstr "忽略证书认证"
#: terminal/serializers/applet_host.py:47
#: terminal/serializers/applet_host.py:50
msgid "Existing RDS license"
msgstr "已有 RDS 许可证"
#: terminal/serializers/applet_host.py:48
#: terminal/serializers/applet_host.py:51
msgid ""
"If not exist, the RDS will be in trial mode, and the trial period is 120 "
"days. <a href={}>Detail</a>"
msgstr ""
#: terminal/serializers/applet_host.py:54
msgid "RDS License Server"
msgstr "RDS 许可服务器"
#: terminal/serializers/applet_host.py:49
#: terminal/serializers/applet_host.py:56
msgid "RDS Licensing Mode"
msgstr "RDS 授权模式"
#: terminal/serializers/applet_host.py:51
#: terminal/serializers/applet_host.py:59
msgid "RDS Single Session Per User"
msgstr "RDS 单用户单会话"
#: terminal/serializers/applet_host.py:53
#: terminal/serializers/applet_host.py:60
msgid ""
"Tips: A RDS user can have only one session at a time. If set, when next "
"login connected, previous session will be disconnected."
msgstr ""
#: terminal/serializers/applet_host.py:64
msgid "RDS Max Disconnection Time (ms)"
msgstr "RDS 最大断开时间(毫秒)"
#: terminal/serializers/applet_host.py:55
#: terminal/serializers/applet_host.py:66
msgid ""
"Tips: Set the maximum duration for keeping a disconnected session active on "
"the server (log off the session after 60000 milliseconds)."
@ -7528,11 +7641,11 @@ msgstr ""
"提示设置某个已断开连接的会话在服务器上能保持活动状态的最长时间60000 毫秒"
"后注销会话)"
#: terminal/serializers/applet_host.py:60
#: terminal/serializers/applet_host.py:71
msgid "RDS Remote App Logoff Time Limit (ms)"
msgstr "RDS 远程应用注销时间限制(毫秒)"
#: terminal/serializers/applet_host.py:62
#: terminal/serializers/applet_host.py:73
msgid ""
"Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp "
"programs (0 milliseconds, log off the session immediately)."
@ -7540,12 +7653,12 @@ msgstr ""
"提示:关闭所有 RemoteApp 程序之后设置 RemoteAPP 会话的注销时间0 毫秒,立即"
"注销会话)"
#: terminal/serializers/applet_host.py:71 terminal/serializers/terminal.py:47
#: terminal/serializers/applet_host.py:82 terminal/serializers/terminal.py:47
#: terminal/serializers/virtualapp_provider.py:13
msgid "Load status"
msgstr "负载状态"
#: terminal/serializers/applet_host.py:85
#: terminal/serializers/applet_host.py:96
msgid ""
"These accounts are used to connect to the published application, the account "
"is now divided into two types, one is dedicated to each account, each user "
@ -7558,11 +7671,11 @@ msgstr ""
"使用公共账号连接; <br />注意: 如果不开启自动创建账号, 当前发布机仅能被指定标"
"签的资产调度到,默认不会放到调度池中,且需要手动维护账号"
#: terminal/serializers/applet_host.py:92
#: terminal/serializers/applet_host.py:103
msgid "The number of public accounts created automatically"
msgstr "公用账号自动创建的数量"
#: terminal/serializers/applet_host.py:95
#: terminal/serializers/applet_host.py:106
msgid ""
"Connect to the host using the same account first. For security reasons, "
"please set the configuration item CACHE_LOGIN_PASSWORD_ENABLED=true and "
@ -7571,15 +7684,15 @@ msgstr ""
"优先使用同名账号连接发布机。为了安全,需配置文件中开启配置 "
"CACHE_LOGIN_PASSWORD_ENABLED=true 修改后重启服务"
#: terminal/serializers/applet_host.py:137
#: terminal/serializers/applet_host.py:148
msgid "Install applets"
msgstr "安装应用"
#: terminal/serializers/applet_host.py:167
#: terminal/serializers/applet_host.py:178
msgid "Host ID"
msgstr "主机 ID"
#: terminal/serializers/applet_host.py:168
#: terminal/serializers/applet_host.py:179
msgid "Applet ID"
msgstr "远程应用 ID"
@ -8264,11 +8377,15 @@ msgstr "无效的审批动作"
msgid "This user is not authorized to approve this ticket"
msgstr "此用户无权审批此工单"
#: users/api/user.py:155
#: users/api/user.py:63
msgid "Cannot delete the admin user. Please disable it instead."
msgstr "无法删除管理员用户。请将其禁用。"
#: users/api/user.py:161
msgid "Can not invite self"
msgstr "不能邀请自己"
#: users/api/user.py:208
#: users/api/user.py:214
msgid "Could not reset self otp, use profile reset instead"
msgstr "不能在该页面重置 MFA 多因子认证, 请去个人信息页面重置"
@ -9207,49 +9324,49 @@ msgstr "获取区域 \"%s\" 的实例错误,错误:%s"
msgid "Failed to synchronize the instance \"%s\""
msgstr "无法同步实例 %s"
#: xpack/plugins/cloud/manager.py:337
#: xpack/plugins/cloud/manager.py:336
#, python-format
msgid ""
"The updated platform of asset \"%s\" is inconsistent with the original "
"platform type. Skip platform and protocol updates"
msgstr "资产“%s”的更新平台与原平台类型不一致。跳过平台和协议更新"
#: xpack/plugins/cloud/manager.py:393
#: xpack/plugins/cloud/manager.py:392
#, python-format
msgid "The asset \"%s\" already exists"
msgstr "资产 \"%s\" 已存在"
#: xpack/plugins/cloud/manager.py:395
#: xpack/plugins/cloud/manager.py:394
#, python-format
msgid "Update asset \"%s\""
msgstr "更新资产 \"%s\""
#: xpack/plugins/cloud/manager.py:398
#: xpack/plugins/cloud/manager.py:397
#, python-format
msgid "Asset \"%s\" has been updated"
msgstr "资产 \"%s\" 已更新"
#: xpack/plugins/cloud/manager.py:408
#: xpack/plugins/cloud/manager.py:407
#, python-format
msgid "Prepare to create asset \"%s\""
msgstr "准备创建资产 %s"
#: xpack/plugins/cloud/manager.py:429
#: xpack/plugins/cloud/manager.py:428
#, python-format
msgid "Set nodes \"%s\""
msgstr "删除节点: \"%s\""
#: xpack/plugins/cloud/manager.py:455
#: xpack/plugins/cloud/manager.py:454
#, python-format
msgid "Set accounts \"%s\""
msgstr "删除账号: %s"
#: xpack/plugins/cloud/manager.py:471
#: xpack/plugins/cloud/manager.py:470
#, python-format
msgid "Set protocols \"%s\""
msgstr "设置协议 \"%s\""
#: xpack/plugins/cloud/manager.py:485 xpack/plugins/cloud/tasks.py:30
#: xpack/plugins/cloud/manager.py:484 xpack/plugins/cloud/tasks.py:30
msgid "Run sync instance task"
msgstr "执行同步实例任务"
@ -9797,3 +9914,15 @@ msgstr "企业专业版"
#: xpack/plugins/license/models.py:86
msgid "Ultimate edition"
msgstr "企业旗舰版"
#~ msgid "Per Session"
#~ msgstr "每用户"
#~ msgid "Per Device"
#~ msgstr "每设备"
#~ msgid "None"
#~ msgstr "无"
#~ msgid "Yes,No"
#~ msgstr "YesNo"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: JumpServer 0.3.3\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-09-09 14:08+0800\n"
"POT-Creation-Date: 2024-09-09 14:22+0800\n"
"PO-Revision-Date: 2021-05-20 10:54+0800\n"
"Last-Translator: ibuler <ibuler@qq.com>\n"
"Language-Team: JumpServer team<ibuler@qq.com>\n"
@ -388,7 +388,7 @@ msgstr "來源 ID"
#: accounts/templates/accounts/change_secret_failed_info.html:12
#: acls/serializers/base.py:124
#: acls/templates/acls/asset_login_reminder.html:10
#: assets/serializers/gateway.py:28 audits/models.py:59
#: assets/serializers/gateway.py:33 audits/models.py:59
#: authentication/api/connection_token.py:411 ops/models/base.py:18
#: perms/models/asset_permission.py:75 settings/serializers/msg.py:33
#: terminal/backends/command/models.py:18
@ -585,7 +585,7 @@ msgstr "結束日期"
#: terminal/models/applet/applet.py:331 terminal/models/applet/host.py:140
#: terminal/models/component/status.py:30
#: terminal/models/virtualapp/virtualapp.py:99
#: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:136
#: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:147
#: terminal/serializers/virtualapp.py:35 tickets/models/ticket/general.py:284
#: tickets/serializers/super_ticket.py:13
#: tickets/serializers/ticket/ticket.py:20 xpack/plugins/cloud/models.py:225
@ -656,7 +656,7 @@ msgstr "觸發方式"
#: audits/models.py:92 audits/serializers.py:84
#: authentication/serializers/connect_token_secret.py:119
#: authentication/templates/authentication/_access_key_modal.html:34
#: perms/serializers/permission.py:41 perms/serializers/permission.py:63
#: perms/serializers/permission.py:52 perms/serializers/permission.py:74
#: tickets/serializers/ticket/ticket.py:21
msgid "Action"
msgstr "動作"
@ -703,7 +703,7 @@ msgstr "密碼規則"
#: assets/models/asset/common.py:159 assets/models/cmd_filter.py:21
#: assets/models/domain.py:19 assets/models/label.py:18
#: assets/models/platform.py:15 assets/models/platform.py:94
#: assets/serializers/asset/common.py:149 assets/serializers/platform.py:153
#: assets/serializers/asset/common.py:169 assets/serializers/platform.py:153
#: assets/serializers/platform.py:273
#: authentication/backends/passkey/models.py:10
#: authentication/models/ssh_key.py:12
@ -851,7 +851,7 @@ msgid "Exist policy"
msgstr "帳號存在策略"
#: accounts/serializers/account/account.py:206 assets/models/label.py:21
#: assets/models/platform.py:95 assets/serializers/asset/common.py:125
#: assets/models/platform.py:95 assets/serializers/asset/common.py:145
#: assets/serializers/cagegory.py:12 assets/serializers/platform.py:168
#: assets/serializers/platform.py:274 perms/serializers/user_permission.py:26
#: settings/models.py:37 tickets/models/ticket/apply_application.py:13
@ -863,7 +863,7 @@ msgstr "類別"
#: accounts/serializers/automations/base.py:55 acls/models/command_acl.py:24
#: acls/serializers/command_acl.py:19 assets/models/automations/base.py:20
#: assets/models/cmd_filter.py:74 assets/models/platform.py:96
#: assets/serializers/asset/common.py:126 assets/serializers/platform.py:155
#: assets/serializers/asset/common.py:146 assets/serializers/platform.py:155
#: assets/serializers/platform.py:167 audits/serializers.py:53
#: audits/serializers.py:170
#: authentication/serializers/connect_token_secret.py:126
@ -904,7 +904,7 @@ msgstr "已修改"
#: assets/serializers/platform.py:176 assets/serializers/platform.py:208
#: authentication/api/connection_token.py:410 ops/models/base.py:17
#: ops/models/job.py:152 ops/serializers/job.py:19
#: perms/serializers/permission.py:35
#: perms/serializers/permission.py:46
#: terminal/templates/terminal/_msg_command_execute_alert.html:16
#: xpack/plugins/cloud/manager.py:83
msgid "Assets"
@ -926,7 +926,7 @@ msgstr "帳號已存在"
#: accounts/serializers/account/account.py:458
#: accounts/serializers/account/base.py:93
#: accounts/serializers/account/template.py:72
#: assets/serializers/asset/common.py:387
#: assets/serializers/asset/common.py:407
msgid "Spec info"
msgstr "特殊資訊"
@ -1058,9 +1058,9 @@ msgstr ""
"為了安全起見,請設置配置項 CACHE_LOGIN_PASSWORD_ENABLED=true重啟服務才能開啟"
#: accounts/serializers/automations/base.py:23
#: assets/models/asset/common.py:169 assets/serializers/asset/common.py:152
#: assets/models/asset/common.py:169 assets/serializers/asset/common.py:172
#: assets/serializers/automations/base.py:21
#: perms/serializers/permission.py:36
#: perms/serializers/permission.py:47
msgid "Nodes"
msgstr "節點"
@ -1266,15 +1266,15 @@ msgstr "審批人"
msgid "Active"
msgstr "啟用中"
#: acls/models/base.py:81 perms/serializers/permission.py:31
#: acls/models/base.py:81 perms/serializers/permission.py:42
#: tickets/models/flow.py:23 users/models/preference.py:16
#: users/serializers/group.py:21 users/serializers/user.py:424
msgid "Users"
msgstr "用戶管理"
#: acls/models/base.py:98 assets/models/automations/base.py:17
#: assets/models/cmd_filter.py:38 assets/serializers/asset/common.py:128
#: assets/serializers/asset/common.py:386 perms/serializers/permission.py:44
#: assets/models/cmd_filter.py:38 assets/serializers/asset/common.py:148
#: assets/serializers/asset/common.py:406 perms/serializers/permission.py:55
#: perms/serializers/user_permission.py:75 rbac/tree.py:35
msgid "Accounts"
msgstr "帳號管理"
@ -1410,7 +1410,7 @@ msgstr ""
#: authentication/templates/authentication/_msg_oauth_bind.html:12
#: authentication/templates/authentication/_msg_rest_password_success.html:8
#: authentication/templates/authentication/_msg_rest_public_key_success.html:8
#: xpack/plugins/cloud/models.py:390
#: common/drf/renders/base.py:149 xpack/plugins/cloud/models.py:390
msgid "IP"
msgstr "IP"
@ -1579,7 +1579,7 @@ msgid "Gather facts"
msgstr "收集資產資訊"
#: assets/const/base.py:32 audits/const.py:58
#: terminal/serializers/applet_host.py:32 users/models/user/_auth.py:32
#: terminal/serializers/applet_host.py:34 users/models/user/_auth.py:32
msgid "Disabled"
msgstr "禁用"
@ -1831,7 +1831,7 @@ msgstr "雲服務"
msgid "Port"
msgstr "埠"
#: assets/models/asset/common.py:160 assets/serializers/asset/common.py:150
#: assets/models/asset/common.py:160 assets/serializers/asset/common.py:170
#: settings/serializers/terminal.py:10
msgid "Address"
msgstr "地址"
@ -1847,7 +1847,7 @@ msgstr "系統平台"
msgid "Zone"
msgstr "網域"
#: assets/models/asset/common.py:172 assets/serializers/asset/common.py:388
#: assets/models/asset/common.py:172 assets/serializers/asset/common.py:408
#: assets/serializers/asset/host.py:11
msgid "Gathered info"
msgstr "收集資產硬體資訊"
@ -2072,7 +2072,7 @@ msgstr "設置"
#: assets/models/platform.py:38 audits/const.py:59
#: authentication/backends/passkey/models.py:11 settings/models.py:39
#: terminal/serializers/applet_host.py:33 users/models/user/_auth.py:33
#: terminal/serializers/applet_host.py:35 users/models/user/_auth.py:33
msgid "Enabled"
msgstr "啟用"
@ -2193,38 +2193,58 @@ msgid ""
"type"
msgstr "資產中批次更新平台,不符合平台類型跳過的資產"
#: assets/serializers/asset/common.py:127 assets/serializers/platform.py:169
#: assets/serializers/asset/common.py:36
msgid "Protocols, format is [\"protocol/port\"]"
msgstr "協定,格式為 [\"協定/連接埠\"]"
#: assets/serializers/asset/common.py:38
msgid "Protocol, format is name/port"
msgstr "協定,格式為 名稱/連接埠"
#: assets/serializers/asset/common.py:107
msgid ""
"Accounts, format [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", "
"\"secret_type\": \"password\"}]"
msgstr "帳號,格式為 [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", \"secret_type\": \"password\"}]"
#: assets/serializers/asset/common.py:135
msgid ""
"Node path, format [\"/org_name/node_name\"], if node not exist, will create "
"it"
msgstr "節點路徑,格式為 [\"/組織/節點名稱\"], 如果節點不存在,將創建它"
#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:169
#: authentication/serializers/connect_token_secret.py:30
#: authentication/serializers/connect_token_secret.py:75
#: perms/models/asset_permission.py:76 perms/serializers/permission.py:45
#: perms/models/asset_permission.py:76 perms/serializers/permission.py:56
#: perms/serializers/user_permission.py:74 xpack/plugins/cloud/models.py:388
#: xpack/plugins/cloud/serializers/task.py:35
msgid "Protocols"
msgstr "協議組"
#: assets/serializers/asset/common.py:129
#: assets/serializers/asset/common.py:151
#: assets/serializers/asset/common.py:149
#: assets/serializers/asset/common.py:171
msgid "Node path"
msgstr "節點路徑"
#: assets/serializers/asset/common.py:148
#: assets/serializers/asset/common.py:389
#: assets/serializers/asset/common.py:168
#: assets/serializers/asset/common.py:409
msgid "Auto info"
msgstr "自動化資訊"
#: assets/serializers/asset/common.py:245
#: assets/serializers/asset/common.py:265
msgid "Platform not exist"
msgstr "平台不存在"
#: assets/serializers/asset/common.py:281
#: assets/serializers/asset/common.py:301
msgid "port out of range (0-65535)"
msgstr "埠超出範圍 (0-65535)"
#: assets/serializers/asset/common.py:288
#: assets/serializers/asset/common.py:308
msgid "Protocol is required: {}"
msgstr "協議是必填的: {}"
#: assets/serializers/asset/common.py:316
#: assets/serializers/asset/common.py:336
msgid "Invalid data"
msgstr "無效的數據"
@ -2311,11 +2331,15 @@ msgid ""
msgstr "網關是網域的網路代理,當連接網域內的資產時,連接將由網關進行路由。"
#: assets/serializers/domain.py:24 assets/serializers/platform.py:177
#: orgs/serializers.py:13 perms/serializers/permission.py:39
#: orgs/serializers.py:13 perms/serializers/permission.py:50
msgid "Assets amount"
msgstr "資產數量"
#: assets/serializers/gateway.py:23 common/validators.py:34
#: assets/serializers/gateway.py:19
msgid "The platform must start with Gateway"
msgstr ""
#: assets/serializers/gateway.py:28 common/validators.py:34
msgid "This field must be unique."
msgstr "欄位必須唯一"
@ -2591,7 +2615,7 @@ msgid "Finished"
msgstr "結束"
#: audits/const.py:46 settings/serializers/terminal.py:6
#: terminal/models/applet/host.py:26 terminal/models/component/terminal.py:175
#: terminal/models/applet/host.py:26 terminal/models/component/terminal.py:174
#: terminal/models/virtualapp/provider.py:14
#: terminal/serializers/session.py:55 terminal/serializers/session.py:78
msgid "Terminal"
@ -3439,7 +3463,7 @@ msgid "Actions"
msgstr "動作"
#: authentication/serializers/connection_token.py:42
#: perms/serializers/permission.py:43 perms/serializers/permission.py:64
#: perms/serializers/permission.py:54 perms/serializers/permission.py:75
#: users/serializers/user.py:127 users/serializers/user.py:273
msgid "Is expired"
msgstr "已過期"
@ -3481,8 +3505,8 @@ msgstr "SSH金鑰不合法"
msgid "Access IP"
msgstr "IP 白名單"
#: authentication/serializers/token.py:92 perms/serializers/permission.py:42
#: perms/serializers/permission.py:65 users/serializers/user.py:128
#: authentication/serializers/token.py:92 perms/serializers/permission.py:53
#: perms/serializers/permission.py:76 users/serializers/user.py:128
#: users/serializers/user.py:270
msgid "Is valid"
msgstr "是否有效"
@ -3863,7 +3887,7 @@ msgstr "從企業微信獲取用戶失敗"
msgid "Please login with a password and then bind the WeCom"
msgstr "請使用密碼登錄,然後綁定企業微信"
#: common/api/action.py:51
#: common/api/action.py:57
msgid "Request file format may be wrong"
msgstr "上傳的檔案格式錯誤 或 其它類型資源的文件"
@ -3891,7 +3915,7 @@ msgstr "運行中"
msgid "Canceled"
msgstr "取消"
#: common/const/common.py:5 xpack/plugins/cloud/manager.py:412
#: common/const/common.py:5 xpack/plugins/cloud/manager.py:411
#, python-format
msgid "%(name)s was created successfully"
msgstr "%(name)s 創建成功"
@ -3994,7 +4018,7 @@ msgstr "組織 ID"
msgid "The file content overflowed (The maximum length `{}` bytes)"
msgstr "文件內容太大 (最大長度 `{}` 位元組)"
#: common/drf/parsers/base.py:199
#: common/drf/parsers/base.py:207
msgid "Parse file error: {}"
msgstr "解析文件錯誤: {}"
@ -4002,7 +4026,68 @@ msgstr "解析文件錯誤: {}"
msgid "Invalid excel file"
msgstr "無效的 excel 文件"
#: common/drf/renders/base.py:208
#: common/drf/renders/base.py:137
msgid "Yes/No"
msgstr ""
#: common/drf/renders/base.py:140
msgid "Text, max length {}"
msgstr "文字,最大長度 {}"
#: common/drf/renders/base.py:142
msgid "Long text, no length limit"
msgstr "長文字,無長度限制"
#: common/drf/renders/base.py:144
msgid "Number, min {} max {}"
msgstr "數字,最小 {} 最大 {}"
#: common/drf/renders/base.py:147
msgid "Datetime format {}"
msgstr "日期時間格式 {}"
#: common/drf/renders/base.py:153
msgid ""
"Choices, format name(value), name is optional for human read, value is "
"requisite, options {}"
msgstr "選項,格式: 名稱(值),名稱是可選的,方便閱讀,值是必填的,可選項有 {}"
#: common/drf/renders/base.py:156
msgid "Choices, options {}"
msgstr "選項,可選項有 {}"
#: common/drf/renders/base.py:158
msgid "Phone number, format +8612345678901"
msgstr "手機號碼,格式 +8612345678901"
#: common/drf/renders/base.py:160
msgid "Label, format [\"key:value\"]"
msgstr "標籤,格式: [\"鍵:值\"]"
#: common/drf/renders/base.py:162
msgid ""
"Object, format name(id), name is optional for human read, id is requisite"
msgstr "關聯項,格式: 名稱(id), 名稱是可選的方便閱讀id 是必填的"
#: common/drf/renders/base.py:164
msgid "Object, format id"
msgstr "關聯項,格式是 id"
#: common/drf/renders/base.py:168
msgid ""
"Objects, format [\"name(id)\", ...], name is optional for human read, id is "
"requisite"
msgstr "多關聯項,格式: [\"名稱(id)\", ...], 名稱是可選的方便閱讀id 是必填的"
#: common/drf/renders/base.py:170
msgid "Labels, format [\"key:value\", ...], if label not exists, will create it"
msgstr "標籤,格式: [\"鍵:值\", ...], 如果標籤不存在,將創建它"
#: common/drf/renders/base.py:172
msgid "Objects, format [\"id\", ...]"
msgstr "多關聯項,格式是 [\"id\", ...]"
#: common/drf/renders/base.py:270
msgid ""
"{} - The encryption password has not been set - please go to personal "
"information -> file encryption password to set the encryption password"
@ -4826,7 +4911,7 @@ msgstr "可以查看所有加入的組織"
msgid "Can not delete virtual org"
msgstr "無法刪除虛擬組織"
#: orgs/serializers.py:10 perms/serializers/permission.py:37
#: orgs/serializers.py:10 perms/serializers/permission.py:48
#: rbac/serializers/role.py:27 users/serializers/group.py:54
msgid "Users amount"
msgstr "用戶數量"
@ -4835,7 +4920,7 @@ msgstr "用戶數量"
msgid "User groups amount"
msgstr "用戶組數量"
#: orgs/serializers.py:14 perms/serializers/permission.py:40
#: orgs/serializers.py:14 perms/serializers/permission.py:51
msgid "Nodes amount"
msgstr "節點數量"
@ -4952,11 +5037,21 @@ msgstr "資產授權規則將要過期"
msgid "asset permissions of organization {}"
msgstr "組織 ({}) 的資產授權"
#: perms/serializers/permission.py:33 users/serializers/user.py:257
#: perms/serializers/permission.py:32
msgid ""
"Accounts, format [\"@virtual\", \"root\", \"%template_id\"], virtual "
"choices: @ALL, @SPEC, @USER, @ANON, @INPUT"
msgstr "帳號,格式為 [\"@虛擬帳號\", \"root\", \"%模板id\"], 虛擬選項: @ALL, @SPEC, @USER, @ANON, @INPUT"
#: perms/serializers/permission.py:38
msgid "Protocols, format [\"ssh\", \"rdp\", \"vnc\"] or [\"all\"]"
msgstr "協定,格式為 [\"ssh\", \"rdp\", \"vnc\"] 或 [\"all\"]"
#: perms/serializers/permission.py:44 users/serializers/user.py:257
msgid "Groups"
msgstr "使用者群組"
#: perms/serializers/permission.py:38
#: perms/serializers/permission.py:49
msgid "Groups amount"
msgstr "使用者組數量"
@ -5537,11 +5632,11 @@ msgstr "快取逾時時間 (秒)"
#: settings/serializers/auth/ldap.py:91
msgid ""
"Caching the User DN obtained during user login authentication can "
"effectivelyimprove the speed of user authentication., 0 means no cache<br>If"
" the user OU structure has been adjusted, click Submit to clear the user DN "
"cache"
"effectively improve the speed of user authentication., 0 means no "
"cache<br>If the user OU structure has been adjusted, click Submit to clear "
"the user DN cache"
msgstr ""
"對於使用者登錄認證時查詢的使用者 DN 進行快取,可以有效提高使用者認證的速度<br>如果使用者 OU 架構已調整,請點擊提交以清除使用者 DN 快取"
"對用戶登入驗證時查詢出的 User DN 進行緩存,可以有效提升用戶認證的速度<br>如果用戶 OU 架構有调整,點擊提交即可清除用戶 DN 緩存"
#: settings/serializers/auth/ldap.py:97
msgid "Search paged size (piece)"
@ -6855,27 +6950,27 @@ msgstr "未發現 protocol 查詢參數"
msgid "Deleting the default storage is not allowed"
msgstr "不允許刪除默認儲存配置"
#: terminal/api/component/storage.py:34
msgid "Cannot delete storage that is being used"
msgstr "不允許刪除正在使用的儲存配置"
#: terminal/api/component/storage.py:36
msgid "Cannot delete storage that is being used: {}"
msgstr "無法刪除正在使用的儲存: {}"
#: terminal/api/component/storage.py:75 terminal/api/component/storage.py:76
#: terminal/api/component/storage.py:77 terminal/api/component/storage.py:78
msgid "Command storages"
msgstr "命令儲存"
#: terminal/api/component/storage.py:82
#: terminal/api/component/storage.py:84
msgid "Invalid"
msgstr "無效"
#: terminal/api/component/storage.py:130 terminal/tasks.py:149
#: terminal/api/component/storage.py:132 terminal/tasks.py:149
msgid "Test failure: {}"
msgstr "測試失敗: {}"
#: terminal/api/component/storage.py:133
#: terminal/api/component/storage.py:135
msgid "Test successful"
msgstr "測試成功"
#: terminal/api/component/storage.py:135
#: terminal/api/component/storage.py:137
msgid "Test failure: Please check configuration"
msgstr "測試失敗:請檢查配置"
@ -7060,7 +7155,7 @@ msgstr "版本"
msgid "Can concurrent"
msgstr "可以並發"
#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:167
#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:178
#: terminal/serializers/storage.py:193
msgid "Hosts"
msgstr "主機"
@ -7091,7 +7186,7 @@ msgstr "宿主機"
msgid "Applet Publication"
msgstr "應用發布"
#: terminal/models/applet/host.py:18 terminal/serializers/applet_host.py:69
#: terminal/models/applet/host.py:18 terminal/serializers/applet_host.py:80
msgid "Deploy options"
msgstr "部署參數"
@ -7225,7 +7320,7 @@ msgstr "遠端地址"
msgid "Application User"
msgstr "應用用戶"
#: terminal/models/component/terminal.py:177
#: terminal/models/component/terminal.py:176
msgid "Can view terminal config"
msgstr "可以查看終端配置"
@ -7398,19 +7493,19 @@ msgstr "無效的儲存"
msgid "Icon"
msgstr "圖示"
#: terminal/serializers/applet_host.py:24
msgid "Per Session"
msgstr "每用戶"
#: terminal/serializers/applet_host.py:26
msgid "Per Device (Device number limit)"
msgstr ""
#: terminal/serializers/applet_host.py:25
msgid "Per Device"
msgstr "每設備"
#: terminal/serializers/applet_host.py:27
msgid "Per User (User number limit)"
msgstr ""
#: terminal/serializers/applet_host.py:37
#: terminal/serializers/applet_host.py:39
msgid "Core API"
msgstr "Core 服務地址"
#: terminal/serializers/applet_host.py:38
#: terminal/serializers/applet_host.py:40
msgid ""
" \n"
" Tips: The application release machine communicates with the Core service. \n"
@ -7423,52 +7518,64 @@ msgstr ""
"提示:應用發布機和 Core 服務進行通信使用,如果發布機和 Core 服務在同一網段,建議填寫內網地址,否則填寫當前站點 "
"URL<br>例如https://172.16.10.110 or https://dev.jumpserver.com"
#: terminal/serializers/applet_host.py:46 terminal/serializers/storage.py:207
#: terminal/serializers/applet_host.py:48 terminal/serializers/storage.py:207
msgid "Ignore Certificate Verification"
msgstr "忽略證書認證"
#: terminal/serializers/applet_host.py:47
#: terminal/serializers/applet_host.py:50
msgid "Existing RDS license"
msgstr "已有 RDS 許可證"
#: terminal/serializers/applet_host.py:48
#: terminal/serializers/applet_host.py:51
msgid ""
"If not exist, the RDS will be in trial mode, and the trial period is 120 "
"days. <a href={}>Detail</a>"
msgstr ""
#: terminal/serializers/applet_host.py:54
msgid "RDS License Server"
msgstr "RDS 許可伺服器"
#: terminal/serializers/applet_host.py:49
#: terminal/serializers/applet_host.py:56
msgid "RDS Licensing Mode"
msgstr "RDS 授權模式"
#: terminal/serializers/applet_host.py:51
#: terminal/serializers/applet_host.py:59
msgid "RDS Single Session Per User"
msgstr "RDS 單用戶單會話"
#: terminal/serializers/applet_host.py:53
#: terminal/serializers/applet_host.py:60
msgid ""
"Tips: A RDS user can have only one session at a time. If set, when next "
"login connected, previous session will be disconnected."
msgstr ""
#: terminal/serializers/applet_host.py:64
msgid "RDS Max Disconnection Time (ms)"
msgstr "RDS 最大斷開時間(毫秒)"
#: terminal/serializers/applet_host.py:55
#: terminal/serializers/applet_host.py:66
msgid ""
"Tips: Set the maximum duration for keeping a disconnected session active on "
"the server (log off the session after 60000 milliseconds)."
msgstr "提示設置某個已斷開連接的會話在伺服器上能保持活動狀態的最長時間60000 毫秒後註銷會話)"
#: terminal/serializers/applet_host.py:60
#: terminal/serializers/applet_host.py:71
msgid "RDS Remote App Logoff Time Limit (ms)"
msgstr "RDS 遠程應用註銷時間限制(毫秒)"
#: terminal/serializers/applet_host.py:62
#: terminal/serializers/applet_host.py:73
msgid ""
"Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp"
" programs (0 milliseconds, log off the session immediately)."
msgstr "提示:關閉所有 RemoteApp 程序之後設置 RemoteAPP 會話的註銷時間0 毫秒,立即註銷會話)"
#: terminal/serializers/applet_host.py:71 terminal/serializers/terminal.py:47
#: terminal/serializers/applet_host.py:82 terminal/serializers/terminal.py:47
#: terminal/serializers/virtualapp_provider.py:13
msgid "Load status"
msgstr "負載狀態"
#: terminal/serializers/applet_host.py:85
#: terminal/serializers/applet_host.py:96
msgid ""
"These accounts are used to connect to the published application, the account"
" is now divided into two types, one is dedicated to each account, each user "
@ -7480,11 +7587,11 @@ msgstr ""
"另一種是公共的,當應用不支持多開且專用的已經被使用時,會使用公共帳號連接; <br />注意: 如果不開啟自動創建帳號, "
"當前發布機僅能被指定標簽的資產調度到,默認不會放到調度池中,且需要手動維護帳號"
#: terminal/serializers/applet_host.py:92
#: terminal/serializers/applet_host.py:103
msgid "The number of public accounts created automatically"
msgstr "公用帳號自動創建的數量"
#: terminal/serializers/applet_host.py:95
#: terminal/serializers/applet_host.py:106
msgid ""
"Connect to the host using the same account first. For security reasons, "
"please set the configuration item CACHE_LOGIN_PASSWORD_ENABLED=true and "
@ -7492,15 +7599,15 @@ msgid ""
msgstr ""
"優先使用同名帳號連接髮布機。為了安全,需配置文件中開啟配置 CACHE_LOGIN_PASSWORD_ENABLED=true 修改後重啟服務"
#: terminal/serializers/applet_host.py:137
#: terminal/serializers/applet_host.py:148
msgid "Install applets"
msgstr "安裝應用"
#: terminal/serializers/applet_host.py:167
#: terminal/serializers/applet_host.py:178
msgid "Host ID"
msgstr "主機 ID"
#: terminal/serializers/applet_host.py:168
#: terminal/serializers/applet_host.py:179
msgid "Applet ID"
msgstr "遠程應用 ID"
@ -8178,11 +8285,15 @@ msgstr "無效的審批動作"
msgid "This user is not authorized to approve this ticket"
msgstr "此用戶無權審批此工單"
#: users/api/user.py:155
#: users/api/user.py:63
msgid "Cannot delete the admin user. Please disable it instead."
msgstr "無法刪除管理員用戶。請將其禁用。"
#: users/api/user.py:161
msgid "Can not invite self"
msgstr "不能邀請自己"
#: users/api/user.py:208
#: users/api/user.py:214
msgid "Could not reset self otp, use profile reset instead"
msgstr "不能在該頁面重設 MFA 多因子認證, 請去個人資訊頁面重設"
@ -9125,7 +9236,7 @@ msgstr "An error occurred while getting the instances of Region \"%s\", Error: %
msgid "Failed to synchronize the instance \"%s\""
msgstr "Unable to synchronize instance %s"
#: xpack/plugins/cloud/manager.py:337
#: xpack/plugins/cloud/manager.py:336
#, python-format
msgid ""
"The updated platform of asset \"%s\" is inconsistent with the original "
@ -9134,42 +9245,42 @@ msgstr ""
"The update platform of asset \"%s\" is not consistent with the original "
"platform type. Skip platform and protocol updates"
#: xpack/plugins/cloud/manager.py:393
#: xpack/plugins/cloud/manager.py:392
#, python-format
msgid "The asset \"%s\" already exists"
msgstr "\"資產 \"%s\" 已存在"
#: xpack/plugins/cloud/manager.py:395
#: xpack/plugins/cloud/manager.py:394
#, python-format
msgid "Update asset \"%s\""
msgstr "更新資產 \"%s\""
#: xpack/plugins/cloud/manager.py:398
#: xpack/plugins/cloud/manager.py:397
#, python-format
msgid "Asset \"%s\" has been updated"
msgstr "資產 \"%s\" 已更新"
#: xpack/plugins/cloud/manager.py:408
#: xpack/plugins/cloud/manager.py:407
#, python-format
msgid "Prepare to create asset \"%s\""
msgstr "Preparing to create asset %s"
#: xpack/plugins/cloud/manager.py:429
#: xpack/plugins/cloud/manager.py:428
#, python-format
msgid "Set nodes \"%s\""
msgstr "Delete Node: \"%s\""
#: xpack/plugins/cloud/manager.py:455
#: xpack/plugins/cloud/manager.py:454
#, python-format
msgid "Set accounts \"%s\""
msgstr "刪除帳號: %s"
#: xpack/plugins/cloud/manager.py:471
#: xpack/plugins/cloud/manager.py:470
#, python-format
msgid "Set protocols \"%s\""
msgstr "設定協議 \"%s\""
#: xpack/plugins/cloud/manager.py:485 xpack/plugins/cloud/tasks.py:30
#: xpack/plugins/cloud/manager.py:484 xpack/plugins/cloud/tasks.py:30
msgid "Run sync instance task"
msgstr "執行同步實例任務"

View File

@ -1,20 +1,28 @@
{
"ActionPerm": "Actions",
"Cancel": "Cancel",
"Confirm": "Confirm",
"ConfirmBtn": "Confirm",
"Connect": "Connect",
"CopyLink": "Copy Link Address and Code",
"CopyShareURLSuccess": "Copy Share URL Success",
"CreateLink": "Create Share Link",
"CreateSuccess": "Success",
"DownArrow": "Down arrow",
"Download": "Download",
"DownloadSuccess": "Download success",
"EndFileTransfer": "File transfer end",
"ExceedTransferSize": "exceed max transfer size",
"Expand": "Expand",
"ExpiredTime": "Expired",
"GetShareUser": "Enter username",
"Hotkeys": "Hotkeys",
"InputVerifyCode": "Input Verify Code",
"JoinShare": "Join Session",
"JoinedWithSuccess": "Successfully joined",
"KubernetesManagement": "Kubernetes management",
"LeaveShare": "Leave Session",
"LeftArrow": "Left arrow",
"LinkAddr": "Link",
"Minute": "Minute",
"Minutes": "Minutes",
@ -22,13 +30,16 @@
"MustSelectOneFile": "Must select one file",
"NoLink": "No Link",
"OnlineUsers": "Online Users",
"Paste": "Paste",
"PauseSession": "Pause Session",
"ReadOnly": "Read-Only",
"Refresh": "Refresh",
"Remove": "Remove",
"Confirm": "Confirm",
"RemoveShareUser": "You have been removed from the shared session.",
"RemoveShareUserConfirm": "Are you sure to remove the user from the shared session?",
"ResumeSession": "Resume Session",
"RightArrow": "Right arrow",
"Search": "Search",
"SelectAction": "Select",
"SelectTheme": "Select Theme",
"Self": "Self",
@ -42,6 +53,7 @@
"Theme": "Theme",
"ThemeColors": "Theme Colors",
"ThemeConfig": "Theme",
"UpArrow": "Up arrow",
"Upload": "Upload",
"UploadSuccess": "Upload success",
"UploadTips": "Drag file here or click to upload",
@ -49,18 +61,6 @@
"User": "User",
"VerifyCode": "Verify Code",
"WaitFileTransfer": "Wait file transfer to finish",
"Writable": "Writable",
"JoinedWithSuccess": "Successfully joined",
"KubernetesManagement": "Kubernetes management",
"WebSocketClosed": "WebSocket closed",
"Connect": "Connect",
"Search": "Search",
"Refresh": "Refresh",
"Hotkeys": "Hotkeys",
"Paste": "Paste",
"DownArrow": "Down arrow",
"LeftArrow": "Left arrow",
"RightArrow": "Right arrow",
"UpArrow": "Up arrow",
"Expand": "Expand"
}
"Writable": "Writable"
}

View File

@ -1,21 +1,28 @@
{
"ActionPerm": "操作权限",
"Cancel": "取消",
"Confirm": "确认",
"ConfirmBtn": "确定",
"Connect": "连接",
"CopyLink": "复制链接及验证码",
"CopyShareURLSuccess": "复制分享地址成功",
"CreateLink": "创建分享链接",
"CreateSuccess": "创建成功",
"Confirm": "确认",
"DownArrow": "向下箭头",
"Download": "下载",
"DownloadSuccess": "下载成功",
"EndFileTransfer": "文件传输结束",
"ExceedTransferSize": "超过最大传输大小",
"Expand": "展开",
"ExpiredTime": "有效期限",
"GetShareUser": "输入用户名",
"Hotkeys": "快捷键",
"InputVerifyCode": "请输入验证码",
"JoinShare": "加入共享",
"JoinedWithSuccess": "已成功加入",
"KubernetesManagement": "Kubernetes 管理",
"LeaveShare": "离开共享",
"LeftArrow": "后退箭头",
"LinkAddr": "链接地址",
"Minute": "分钟",
"Minutes": "分钟",
@ -23,12 +30,16 @@
"MustSelectOneFile": "必须选择一个文件",
"NoLink": "无地址",
"OnlineUsers": "在线人员",
"Paste": "粘贴",
"PauseSession": "暂停此会话",
"ReadOnly": "只读",
"Refresh": "刷新",
"Remove": "移除",
"RemoveShareUser": "你已经被移除共享会话",
"RemoveShareUserConfirm": "确定要移除该用户吗?",
"ResumeSession": "恢复此会话",
"RightArrow": "前进箭头",
"Search": "搜索",
"SelectAction": "请选择",
"SelectTheme": "请选择主题",
"Self": "我",
@ -42,6 +53,7 @@
"Theme": "主题",
"ThemeColors": "主题颜色",
"ThemeConfig": "主题",
"UpArrow": "向上箭头",
"Upload": "上传",
"UploadSuccess": "上传成功",
"UploadTips": "将文件拖到此处,或点击上传",
@ -49,18 +61,6 @@
"User": "用户",
"VerifyCode": "验证码",
"WaitFileTransfer": "等待文件传输结束",
"Writable": "读写",
"JoinedWithSuccess": "已成功加入",
"KubernetesManagement": "Kubernetes 管理",
"WebSocketClosed": "WebSocket 已关闭",
"Connect": "连接",
"Search": "搜索",
"Refresh": "刷新",
"Hotkeys": "快捷键",
"Paste": "粘贴",
"DownArrow": "向下箭头",
"LeftArrow": "后退箭头",
"RightArrow": "前进箭头",
"UpArrow": "向上箭头",
"Expand": "展开"
}
"Writable": "读写"
}

View File

@ -67,6 +67,7 @@
"AddUserGroupToThisPermission": "Add user groups",
"AddUserToThisPermission": "Add users",
"Address": "Address",
"AdhocCreate": "Create the command",
"AdhocDetail": "Command details",
"AdhocManage": "Command",
"AdhocUpdate": "Update the command",
@ -116,6 +117,7 @@
"ApprovaLevel": "Approval information",
"ApprovalLevel": "Approval level",
"ApprovalProcess": "Approval process",
"ApprovalSelected": "Batch approval",
"Approved": "Agreed",
"ApproverNumbers": "Approvers",
"ApsaraStack": "Alibaba private cloud",
@ -542,6 +544,7 @@
"Gateway": "Gateway",
"GatewayCreate": "Create gateway",
"GatewayList": "Gateways",
"GatewayPlatformHelpText": "Only platforms with names starting with Gateway can be used as gateways.",
"GatewayUpdate": "Update the gateway",
"GatherAccounts": "Gather accounts",
"GatherAccountsHelpText": "Collect account information on assets. the collected account information can be imported into the system for centralized management.",
@ -993,6 +996,7 @@
"Resume": "Recovery",
"ResumeTaskSendSuccessMsg": "Recovery task issued, please refresh later",
"Retry": "Retry",
"RetrySelected": "Retry selected",
"Reviewer": "Approvers",
"Role": "Role",
"RoleCreate": "Create role",
@ -1019,6 +1023,7 @@
"RunasHelpText": "Enter username for running script",
"RunasPolicy": "Account policy",
"RunasPolicyHelpText": "When there are no users currently running on the asset, what account selection strategy should be adopted. skip: do not execute. prioritize privileged accounts: if there are privileged accounts, select them first; if not, select regular accounts. only privileged accounts: select only from privileged accounts; if none exist, do not execute.",
"Running": "Running",
"RunningPath": "Running path",
"RunningPathHelpText": "Enter the run path of the script, this setting only applies to shell scripts",
"RunningTimes": "Last 5 run times",
@ -1035,7 +1040,6 @@
"SameAccount": "Same account",
"SameAccountTip": "Account with the same username as authorized users",
"SameTypeAccountTip": "An account with the same username and key type already exists",
"Share": "Share",
"Saturday": "Sat",
"Save": "Save",
"SaveAdhoc": "Save command",
@ -1085,6 +1089,7 @@
"SessionData": "Session data",
"SessionDetail": "Session details",
"SessionID": "Session id",
"SessionJoinRecords": "collaboration records",
"SessionList": "Asset sessions",
"SessionMonitor": "Monitor",
"SessionOffline": "Historical sessions",
@ -1106,6 +1111,7 @@
"Setting": "Setting",
"SettingInEndpointHelpText": "Configure service address and port in system settings / component settings / server endpoints",
"Settings": "System settings",
"Share": "Share",
"Show": "Display",
"ShowAssetAllChildrenNode": "Show all sub-nodes assets",
"ShowAssetOnlyCurrentNode": "Only show current node assets",
@ -1302,6 +1308,7 @@
"UploadCsvLth10MHelpText": "Only csv/xlsx can be uploaded, and no more than 10m",
"UploadDir": "Upload path",
"UploadFileLthHelpText": "Less than {limit}m supported",
"UploadHelpText": "Please upload a .zip file containing the following sample directory structure",
"UploadPlaybook": "Upload playbook",
"UploadSucceed": "Upload succeeded",
"UploadZipTips": "Please upload a file in zip format",
@ -1387,13 +1394,7 @@
"ZoneHelpMessage": "The zone is the location where assets are located, which can be a data center, public cloud, or VPC. Gateways can be set up within the region. When the network cannot be directly accessed, users can utilize gateways to login to the assets.",
"ZoneList": "Zones",
"ZoneUpdate": "Update the zone",
"disallowSelfUpdateFields": "Not allowed to modify the current fields yourself",
"forceEnableMFAHelpText": "If force enable, user can not disable by themselves",
"removeWarningMsg": "Are you sure you want to remove",
"RetrySelected": "Retry selected",
"Running": "Running",
"AdhocCreate": "Create the command",
"UploadHelpText": "Please upload a .zip file containing the following sample directory structure",
"SessionJoinRecords": "collaboration records",
"ApprovalSelected": "Batch approval",
"disallowSelfUpdateFields": "Not allowed to modify the current fields yourself"
}
"removeWarningMsg": "Are you sure you want to remove"
}

View File

@ -559,6 +559,7 @@
"Gateway": "ゲートウェイ",
"GatewayCreate": "ゲートウェイの作成",
"GatewayList": "ゲートウェイリスト",
"GatewayPlatformHelpText": "ゲートウェイプラットフォームは、Gatewayで始まるプラットフォームのみ選択可能です。",
"GatewayUpdate": "ゲートウェイの更新",
"GatherAccounts": "アカウント収集",
"GatherAccountsHelpText": "資産上のアカウント情報を収集します。収集したアカウント情報は、システムにインポートして一元管理が可能です",

View File

@ -67,6 +67,7 @@
"AddUserGroupToThisPermission": "添加用户组",
"AddUserToThisPermission": "添加用户",
"Address": "地址",
"AdhocCreate": "创建命令",
"AdhocDetail": "命令详情",
"AdhocManage": "命令管理",
"AdhocUpdate": "更新命令",
@ -116,6 +117,7 @@
"ApprovaLevel": "审批信息",
"ApprovalLevel": "审批级别",
"ApprovalProcess": "审批流程",
"ApprovalSelected": "批量审批",
"Approved": "已同意",
"ApproverNumbers": "审批人数量",
"ApsaraStack": "阿里云专有云",
@ -542,6 +544,7 @@
"Gateway": "网关",
"GatewayCreate": "创建网关",
"GatewayList": "网关列表",
"GatewayPlatformHelpText": "网关平台只能选择以 Gateway 开头的平台",
"GatewayUpdate": "更新网关",
"GatherAccounts": "账号收集",
"GatherAccountsHelpText": "收集资产上的账号信息。收集后的账号信息可以导入到系统中,方便统一管理",
@ -996,6 +999,7 @@
"Resume": "恢复",
"ResumeTaskSendSuccessMsg": "恢复任务已下发,请稍后刷新查看",
"Retry": "重试",
"RetrySelected": "重试所选",
"Reviewer": "审批人",
"Role": "角色",
"RoleCreate": "创建角色",
@ -1022,6 +1026,7 @@
"RunasHelpText": "填写运行脚本的用户名",
"RunasPolicy": "账号策略",
"RunasPolicyHelpText": "当前资产上没此运行用户时,采取什么账号选择策略。跳过:不执行。优先特权账号:如果有特权账号先选特权账号,如果没有就选普通账号。仅特权账号:只从特权账号中选择,如果没有则不执行",
"Running": "运行中",
"RunningPath": "运行路径",
"RunningPathHelpText": "填写脚本的运行路径,此设置仅 shell 脚本生效",
"RunningTimes": "最近5次运行时间",
@ -1038,7 +1043,6 @@
"SameAccount": "同名账号",
"SameAccountTip": "与被授权人用户名相同的账号",
"SameTypeAccountTip": "相同用户名、密钥类型的账号已存在",
"Share": "分享",
"Saturday": "周六",
"Save": "保存",
"SaveAdhoc": "保存命令",
@ -1088,6 +1092,7 @@
"SessionData": "会话数据",
"SessionDetail": "会话详情",
"SessionID": "会话ID",
"SessionJoinRecords": "协作记录",
"SessionList": "会话记录",
"SessionMonitor": "监控",
"SessionOffline": "历史会话",
@ -1109,6 +1114,7 @@
"Setting": "设置",
"SettingInEndpointHelpText": "在 系统设置 / 组件设置 / 服务端点 中配置服务地址和端口",
"Settings": "系统设置",
"Share": "分享",
"Show": "显示",
"ShowAssetAllChildrenNode": "显示所有子节点资产",
"ShowAssetOnlyCurrentNode": "仅显示当前节点资产",
@ -1305,6 +1311,7 @@
"UploadCsvLth10MHelpText": "只能上传 csv/xlsx, 且不超过 10M",
"UploadDir": "上传目录",
"UploadFileLthHelpText": "只能上传小于{limit}MB文件",
"UploadHelpText": "请上传包含以下示例结构目录的 .zip 压缩文件",
"UploadPlaybook": "上传 Playbook",
"UploadSucceed": "上传成功",
"UploadZipTips": "请上传 zip 格式的文件",
@ -1345,6 +1352,7 @@
"Valid": "有效",
"Variable": "变量",
"VariableHelpText": "您可以在命令中使用 {{ key }} 读取内置变量",
"VaultHCPMountPoint": "Vault 服务器的挂载点,默认为 jumpserver",
"VaultHelpText": "1. 由于安全原因,需要配置文件中开启 Vault 存储。<br>2. 开启后,填写其他配置,进行测试。<br>3. 进行数据同步,同步是单向的,只会从本地数据库同步到远端 Vault同步完成本地数据库不再存储密码请备份好数据。<br>4. 二次修改 Vault 配置后需重启服务。",
"VerificationCodeSent": "验证码已发送",
"VerifySignTmpl": "验证码短信模板",
@ -1389,14 +1397,7 @@
"ZoneHelpMessage": "网域是资产所在的位置,可以是机房,公有云 或者 VPC。网域中可以设置网关当网络不能直达的时候可以使用网关跳转登录到资产",
"ZoneList": "网域列表",
"ZoneUpdate": "更新网域",
"disallowSelfUpdateFields": "不允许自己修改当前字段",
"forceEnableMFAHelpText": "如果强制启用,用户无法自行禁用",
"removeWarningMsg": "你确定要移除",
"VaultHCPMountPoint": "Vault 服务器的挂载点,默认为 jumpserver",
"RetrySelected": "重试所选",
"Running": "运行中",
"AdhocCreate": "创建命令",
"UploadHelpText": "请上传包含以下示例结构目录的 .zip 压缩文件",
"SessionJoinRecords": "协作记录",
"ApprovalSelected": "批量审批",
"disallowSelfUpdateFields": "不允许自己修改当前字段"
}
"removeWarningMsg": "你确定要移除"
}

View File

@ -714,6 +714,7 @@
"Gateway": "網關",
"GatewayCreate": "創建網關",
"GatewayList": "網關列表",
"GatewayPlatformHelpText": "網關平台只能選擇以 Gateway 開頭的平台",
"GatewayProtocolHelpText": "SSH網關支持代理SSH,RDP和VNC",
"GatewayUpdate": "更新網關",
"GatherAccounts": "帳號收集",
@ -1329,6 +1330,7 @@
"Resume": "恢復",
"ResumeTaskSendSuccessMsg": "恢復任務已下發,請稍後刷新查看",
"Retry": "重試",
"RetrySelected": "重新嘗試所選",
"Reviewer": "審批人",
"Revise": "修改",
"Role": "角色",

View File

@ -123,6 +123,7 @@
"NoTabs": "No tabs",
"Not quick command": "Not quick command",
"Open in new window": "Open in new window",
"Operator": "Operator",
"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",
@ -200,6 +201,7 @@
"Users": "",
"Using token": "Using token",
"View": "View",
"Viewer": "Viewer",
"VirtualApp": "Virtual App",
"Web Terminal": "Web Terminal",
"Website": "Website",
@ -209,16 +211,14 @@
"asset": "asset",
"cols": "cols",
"confirm": "confirm",
"connect info": "connect info",
"connectDisabledTipsMethodDisabled": "Tips: No valid remote application deployment machine found, current resource cannot be connected. Please contact the administrator for assistance",
"connectDisabledTipsNoAccount": "Tips: No valid authorization account found, current resource cannot be connected. Please contact the administrator for assistance",
"connectDisabledTipsNoConnectMethod": "Tips: No valid connection method found, current resource cannot be connected. Please contact the administrator for assistance",
"connectDisabledTipsMethodDisabled": "Tips: No valid remote application deployment machine found, current resource cannot be connected. Please contact the administrator for assistance",
"connect info": "connect info",
"download": "download",
"rows": "rows",
"start time": "start time",
"success": "success",
"system user": "system user",
"user": "user",
"Viewer": "Viewer",
"Operator": "Operator"
}
"user": "user"
}

View File

@ -124,6 +124,7 @@
"Normal accounts": "通常のログインアカウント",
"Not quick command": "非高速コマンド",
"Open in new window": "新しいウィンドウが開きます",
"Operator": "オペレーター",
"Password": "パスワード",
"Password is token password on the table": "パスワードは、テーブルのトークンパスワードです",
"Password is your password login to system": "パスワードは、システムにログインするためのパスワードです",
@ -205,6 +206,7 @@
"Users": "ユーザー",
"Using token": "トークンを使用する",
"View": "ビュー",
"Viewer": "ビューア",
"VirtualApp": "仮想アプリ",
"Web Terminal": "Web端末",
"Website": "公式サイト",
@ -222,7 +224,5 @@
"start time": "開始時間",
"success": "成功",
"system user": "システムユーザー",
"user": "ユーザー",
"Viewer": "ビューア",
"Operator": "オペレーター"
}
"user": "ユーザー"
}

View File

@ -122,6 +122,7 @@
"NoTabs": "没有窗口",
"Not quick command": "暂无快捷命令",
"Open in new window": "新窗口打开",
"Operator": "操作人",
"Password": "密码",
"Password is token password on the table": "密码是表格中的 Token 密码",
"Password is your password login to system": "密码是你登录系统的密码",
@ -199,6 +200,7 @@
"Users": "用户",
"Using token": "使用 Token",
"View": "视图",
"Viewer": "查看人",
"VirtualApp": "虚拟应用",
"Web Terminal": "Web终端",
"Website": "官网",
@ -207,16 +209,14 @@
"asset": "资产",
"cols": "列数",
"confirm": "确认",
"connect info": "连接信息",
"connectDisabledTipsMethodDisabled": "提示:未找到有效的远程应用发布机,当前资源无法连接,请联系管理员进行处理",
"connectDisabledTipsNoAccount": "提示:未找到有效的授权账号,当前资源无法连接,请联系管理员进行处理",
"connectDisabledTipsNoConnectMethod": "提示:未找到有效的连接方式,当前资源无法连接,请联系管理员进行处理",
"connectDisabledTipsMethodDisabled": "提示:未找到有效的远程应用发布机,当前资源无法连接,请联系管理员进行处理",
"connect info": "连接信息",
"download": "下载",
"rows": "行数",
"start time": "开始时间",
"success": "成功",
"system user": "系统用户",
"user": "用户",
"Viewer": "查看人",
"Operator": "操作人"
}
"user": "用户"
}

View File

@ -123,6 +123,7 @@
"NoTabs": "沒有視窗",
"Not quick command": "暫無快捷命令",
"Open in new window": "新窗口打開",
"Operator": "操作人",
"Password": "密碼",
"Password is token password on the table": "密碼是表格中的 Token 密碼",
"Password is your password login to system": "密碼是你登入系統的密碼",
@ -203,6 +204,7 @@
"Users": "用戶",
"Using token": "使用 Token",
"View": "視圖",
"Viewer": "查看人",
"VirtualApp": "虛擬應用",
"Web Terminal": "Web終端",
"Website": "官網",
@ -220,7 +222,5 @@
"start time": "開始時間",
"success": "成功",
"system user": "系統用戶",
"user": "用戶",
"Viewer": "查看人",
"Operator": "操作人"
}
"user": "用戶"
}

View File

@ -23,7 +23,7 @@ class OrgResourceSerializerMixin(serializers.Serializer):
但是coco需要资产的org_id字段所以修改为CharField类型
"""
org_id = serializers.ReadOnlyField(default=get_current_org_id_for_serializer, label=_("Organization"))
org_name = serializers.ReadOnlyField(label=_("Org name"))
org_name = serializers.CharField(label=_("Org name"), read_only=True)
add_org_fields = True
def get_validators(self):

View File

@ -27,6 +27,17 @@ class ActionChoicesField(BitChoicesField):
return data
class PermAccountsSerializer(serializers.ListField):
def get_render_help_text(self):
return _('Accounts, format ["@virtual", "root", "%template_id"], '
'virtual choices: @ALL, @SPEC, @USER, @ANON, @INPUT')
class PermProtocolsSerializer(serializers.ListField):
def get_render_help_text(self):
return _('Protocols, format ["ssh", "rdp", "vnc"] or ["all"]')
class AssetPermissionSerializer(ResourceLabelsMixin, BulkOrgResourceModelSerializer):
users = ObjectRelatedField(queryset=User.objects, many=True, required=False, label=_('Users'))
user_groups = ObjectRelatedField(
@ -41,8 +52,8 @@ class AssetPermissionSerializer(ResourceLabelsMixin, BulkOrgResourceModelSeriali
actions = ActionChoicesField(required=False, allow_null=True, label=_("Action"))
is_valid = serializers.BooleanField(read_only=True, label=_("Is valid"))
is_expired = serializers.BooleanField(read_only=True, label=_("Is expired"))
accounts = serializers.ListField(label=_("Accounts"), required=False)
protocols = serializers.ListField(label=_("Protocols"), required=False)
accounts = PermAccountsSerializer(label=_("Accounts"), required=False)
protocols = PermProtocolsSerializer(label=_("Protocols"), required=False)
template_accounts = AccountTemplate.objects.none()

View File

@ -88,7 +88,7 @@ class LDAPSettingSerializer(serializers.Serializer):
default=3600 * 24 * 30,
required=False, label=_('User DN cache timeout (s)'),
help_text=_(
'Caching the User DN obtained during user login authentication can effectively'
'Caching the User DN obtained during user login authentication can effectively '
'improve the speed of user authentication., 0 means no cache<br>'
'If the user OU structure has been adjusted, click Submit to clear the user DN cache'
)

View File

@ -9,9 +9,9 @@ from rest_framework.decorators import action
from rest_framework.request import Request
from rest_framework.response import Response
from common.api.mixin import CommonApiMixin
from common.const.http import GET
from common.drf.filters import BaseFilterSet
from common.api.mixin import CommonApiMixin
from terminal import const
from terminal.filters import CommandStorageFilter, CommandFilter, CommandFilterForStorageTree
from terminal.models import CommandStorage, ReplayStorage
@ -30,8 +30,10 @@ class BaseStorageViewSetMixin(CommonApiMixin):
if instance.type_null_or_server or instance.is_default:
data = {'msg': _('Deleting the default storage is not allowed')}
return Response(data=data, status=status.HTTP_400_BAD_REQUEST)
if instance.is_use():
data = {'msg': _('Cannot delete storage that is being used')}
used_by = instance.used_by()
if used_by:
names = ', '.join(list(used_by.values_list('name', flat=True)))
data = {'msg': _('Cannot delete storage that is being used: {}').format(names)}
return Response(data=data, status=status.HTTP_400_BAD_REQUEST)
return super().destroy(request, *args, **kwargs)

View File

@ -105,10 +105,10 @@ class CommandStorage(CommonStorageModelMixin, JMSBaseModel):
store = engine_mod.CommandStore(self.config)
return store.ping(timeout=3)
def is_use(self):
def used_by(self):
return Terminal.objects.filter(
command_storage=self.name, is_deleted=False
).exists()
)
def get_command_queryset(self):
if self.type_null:

View File

@ -158,7 +158,6 @@ class Terminal(StorageMixin, TerminalStatusMixin, JMSBaseModel):
self.user = None
self.is_deleted = True
self.save()
return
def __str__(self):
status = "Active"

View File

@ -18,11 +18,13 @@ __all__ = [
'AppletHostStartupSerializer', 'AppletSetupSerializer'
]
RDS_LICENSE_DOC_URL = 'https://learn.microsoft.com/en-us/windows-server/remote/remote-desktop-services/rds-client-access-license'
class DeployOptionsSerializer(serializers.Serializer):
LICENSE_MODE_CHOICES = (
(4, _('Per Session')),
(2, _('Per Device')),
(2, _('Per Device (Device number limit)')),
(4, _('Per User (User number limit)')),
)
# 单用户单会话,
@ -44,11 +46,20 @@ class DeployOptionsSerializer(serializers.Serializer):
""")
)
IGNORE_VERIFY_CERTS = serializers.BooleanField(default=True, label=_("Ignore Certificate Verification"))
RDS_Licensing = serializers.BooleanField(default=False, label=_("Existing RDS license"))
RDS_Licensing = serializers.BooleanField(
default=False, label=_("Existing RDS license"),
help_text=_('If not exist, the RDS will be in trial mode, and the trial period is 120 days. '
'<a href={}>Detail</a>').format(RDS_LICENSE_DOC_URL)
)
RDS_LicenseServer = serializers.CharField(default='127.0.0.1', label=_('RDS License Server'), max_length=1024)
RDS_LicensingMode = serializers.ChoiceField(choices=LICENSE_MODE_CHOICES, default=2, label=_('RDS Licensing Mode'))
RDS_fSingleSessionPerUser = serializers.ChoiceField(choices=SESSION_PER_USER, default=1,
label=_("RDS Single Session Per User"))
RDS_LicensingMode = serializers.ChoiceField(
choices=LICENSE_MODE_CHOICES, default=2, label=_('RDS Licensing Mode'),
)
RDS_fSingleSessionPerUser = serializers.ChoiceField(
choices=SESSION_PER_USER, default=1, label=_("RDS Single Session Per User"),
help_text=_('Tips: A RDS user can have only one session at a time. If set, when next login connected, '
'previous session will be disconnected.')
)
RDS_MaxDisconnectionTime = serializers.IntegerField(
default=60000, label=_("RDS Max Disconnection Time (ms)"),
help_text=_(

View File

@ -4,6 +4,7 @@ from collections import defaultdict
from django.utils.translation import gettext as _
from rest_framework import generics
from rest_framework.decorators import action
from rest_framework.exceptions import PermissionDenied
from rest_framework.response import Response
from rest_framework_bulk import BulkModelViewSet
@ -57,6 +58,11 @@ class UserViewSet(CommonApiMixin, UserQuerysetMixin, SuggestionMixin, BulkModelV
raise UnableToDeleteAllUsers()
return True
def perform_destroy(self, instance):
if instance.username == 'admin':
raise PermissionDenied(_("Cannot delete the admin user. Please disable it instead."))
super().perform_destroy(instance)
@action(methods=['get'], detail=False, url_path='suggestions')
def match(self, request, *args, **kwargs):
with tmp_to_root_org():

1620
poetry.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -25,6 +25,8 @@ ansible-runner = { url = "https://github.com/jumpserver-dev/ansible-runner/archi
asn1crypto = "1.5.1"
bcrypt = "4.0.1"
billiard = "4.1.0"
aiohttp = "3.10.5"
aiohappyeyeballs = "2.4.0"
# certifi = "2023.7.22"
# cffi = "1.15.1"
chardet = "5.1.0"
@ -33,7 +35,7 @@ decorator = "5.1.1"
docutils = "0.20.1"
ecdsa = "0.18.0"
enum-compat = "0.0.3"
ephem = "4.1.4"
ephem = "4.1.5"
future = "0.18.3"
# idna = "3.4"
itypes = "1.2.0"
@ -127,7 +129,7 @@ boto3 = "1.28.9"
botocore = "1.31.9"
s3transfer = "0.6.1"
mysqlclient = "2.2.4"
pymssql = "2.2.8"
pymssql = "2.3.1"
django-redis = "5.3.0"
python-redis-lock = "4.0.0"
pyopenssl = "23.2.0"