diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..1e4a9e3c3 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,10 @@ +version: 2 +updates: + - package-ecosystem: "pip" + directory: "/" + schedule: + interval: "weekly" + day: "monday" + time: "09:30" + timezone: "Asia/Shanghai" + target-branch: dev \ No newline at end of file diff --git a/.github/workflows/llm-code-review.yml b/.github/workflows/llm-code-review.yml.bak similarity index 100% rename from .github/workflows/llm-code-review.yml rename to .github/workflows/llm-code-review.yml.bak diff --git a/.github/workflows/translate-readme.yml b/.github/workflows/translate-readme.yml index 015952a79..0e1f3a02f 100644 --- a/.github/workflows/translate-readme.yml +++ b/.github/workflows/translate-readme.yml @@ -2,10 +2,14 @@ name: Translate README on: workflow_dispatch: inputs: + source_readme: + description: "Source README" + required: false + default: "./readmes/README.en.md" target_langs: description: "Target Languages" required: false - default: "zh-hans,zh-hant,ja,pt-br" + default: "zh-hans,zh-hant,ja,pt-br,es,ru" gen_dir_path: description: "Generate Dir Name" required: false @@ -34,6 +38,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.PRIVATE_TOKEN }} OPENAI_API_KEY: ${{ secrets.GPT_API_TOKEN }} GPT_MODE: ${{ github.event.inputs.gpt_mode }} + SOURCE_README: ${{ github.event.inputs.source_readme }} TARGET_LANGUAGES: ${{ github.event.inputs.target_langs }} PUSH_BRANCH: ${{ github.event.inputs.push_branch }} GEN_DIR_PATH: ${{ github.event.inputs.gen_dir_path }} diff --git a/Dockerfile b/Dockerfile index 07e9831a9..ff7a40e79 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM jumpserver/core-base:20250224_065619 AS stage-build +FROM jumpserver/core-base:20250415_032719 AS stage-build ARG VERSION diff --git a/README.md b/README.md index 038aa468e..7c659b2ae 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@
- JumpServer + JumpServer ## An open-source PAM tool (Bastion Host) @@ -10,7 +10,7 @@ [![][github-release-shield]][github-release-link] [![][github-stars-shield]][github-stars-link] -[English](/README.md) · [中文(简体)](/readmes/README.zh-hans.md) · [中文(繁體)](/readmes/README.zh-hant.md) · [日本語](/readmes/README.ja.md) · [Português (Brasil)](/readmes/README.pt-br.md) +[English](/README.md) · [中文(简体)](/readmes/README.zh-hans.md) · [中文(繁體)](/readmes/README.zh-hant.md) · [日本語](/readmes/README.ja.md) · [Português (Brasil)](/readmes/README.pt-br.md) · [Español](/readmes/README.es.md) · [Русский](/readmes/README.ru.md)

@@ -19,7 +19,13 @@ JumpServer is an open-source Privileged Access Management (PAM) tool that provides DevOps and IT teams with on-demand and secure access to SSH, RDP, Kubernetes, Database and RemoteApp endpoints through a web browser. -![JumpServer Overview](https://github.com/jumpserver/jumpserver/assets/32935519/35a371cb-8590-40ed-88ec-f351f8cf9045) + + + + + Theme-based Image + + ## Quickstart @@ -36,18 +42,19 @@ Access JumpServer in your browser at `http://your-jumpserver-ip/` [![JumpServer Quickstart](https://github.com/user-attachments/assets/0f32f52b-9935-485e-8534-336c63389612)](https://www.youtube.com/watch?v=UlGYRbKrpgY "JumpServer Quickstart") ## Screenshots - - +      - + + + +       - @@ -69,9 +76,9 @@ JumpServer consists of multiple key components, which collectively form the func | [KoKo](https://github.com/jumpserver/koko) | Koko release | JumpServer Character Protocol Connector | | [Lion](https://github.com/jumpserver/lion) | Lion release | JumpServer Graphical Protocol Connector | | [Chen](https://github.com/jumpserver/chen) | Chen release | JumpServer Web DB | -| [Razor](https://github.com/jumpserver/razor) | Chen | JumpServer EE RDP Proxy Connector | -| [Tinker](https://github.com/jumpserver/tinker) | Tinker | JumpServer EE Remote Application Connector (Windows) | +| [Tinker](https://github.com/jumpserver/tinker) | Tinker | JumpServer Remote Application Connector (Windows) | | [Panda](https://github.com/jumpserver/Panda) | Panda | JumpServer EE Remote Application Connector (Linux) | +| [Razor](https://github.com/jumpserver/razor) | Chen | JumpServer EE RDP Proxy Connector | | [Magnus](https://github.com/jumpserver/magnus) | Magnus | JumpServer EE Database Proxy Connector | | [Nec](https://github.com/jumpserver/nec) | Nec | JumpServer EE VNC Proxy Connector | | [Facelive](https://github.com/jumpserver/facelive) | Facelive | JumpServer EE Facial Recognition | @@ -81,12 +88,6 @@ JumpServer consists of multiple key components, which collectively form the func Welcome to submit PR to contribute. Please refer to [CONTRIBUTING.md][contributing-link] for guidelines. -## Security - -JumpServer is a mission critical product. Please refer to the Basic Security Recommendations for installation and deployment. If you encounter any security-related issues, please contact us directly: - -- Email: support@fit2cloud.com - ## License Copyright (c) 2014-2025 FIT2CLOUD, All rights reserved. @@ -115,5 +116,3 @@ Unless required by applicable law or agreed to in writing, software distributed [docker-shield]: https://img.shields.io/docker/pulls/jumpserver/jms_all.svg [license-shield]: https://img.shields.io/github/license/jumpserver/jumpserver [discord-shield]: https://img.shields.io/discord/1194233267294052363?style=flat&logo=discord&logoColor=%23f5f5f5&labelColor=%235462eb&color=%235462eb - - diff --git a/SECURITY.md b/SECURITY.md index 2f2ce1d50..5a119c625 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -5,8 +5,7 @@ JumpServer 是一款正在成长的安全产品, 请参考 [基本安全建议 如果你发现安全问题,请直接联系我们,我们携手让世界更好: - ibuler@fit2cloud.com -- support@fit2cloud.com -- 400-052-0755 +- support@lxware.hk # Security Policy @@ -16,6 +15,5 @@ JumpServer is a security product, The installation and development should follow All security bugs should be reported to the contact as below: - ibuler@fit2cloud.com -- support@fit2cloud.com -- 400-052-0755 +- support@lxware.hk diff --git a/apps/accounts/api/account/account.py b/apps/accounts/api/account/account.py index 4416f8f9c..8b39db771 100644 --- a/apps/accounts/api/account/account.py +++ b/apps/accounts/api/account/account.py @@ -46,6 +46,16 @@ class AccountViewSet(OrgBulkModelViewSet): } export_as_zip = True + def get_queryset(self): + queryset = super().get_queryset() + asset_id = self.request.query_params.get('asset') or self.request.query_params.get('asset_id') + if not asset_id: + return queryset + + asset = get_object_or_404(Asset, pk=asset_id) + queryset = asset.all_accounts.all() + return queryset + @action(methods=['get'], detail=False, url_path='su-from-accounts') def su_from_accounts(self, request, *args, **kwargs): account_id = request.query_params.get('account') @@ -117,7 +127,7 @@ class AccountViewSet(OrgBulkModelViewSet): self.model.objects.create(**account_data) success_count += 1 except Exception as e: - logger.debug(f'{ "Move" if move else "Copy" } to assets error: {e}') + logger.debug(f'{"Move" if move else "Copy"} to assets error: {e}') creation_results[asset] = {'error': _('Account already exists'), 'state': 'error'} results = [{'asset': str(asset), **res} for asset, res in creation_results.items()] diff --git a/apps/accounts/api/automations/base.py b/apps/accounts/api/automations/base.py index 34ad6c109..f1305fc1e 100644 --- a/apps/accounts/api/automations/base.py +++ b/apps/accounts/api/automations/base.py @@ -17,7 +17,7 @@ from orgs.mixins import generics __all__ = [ 'AutomationAssetsListApi', 'AutomationRemoveAssetApi', 'AutomationAddAssetApi', 'AutomationNodeAddRemoveApi', - 'AutomationExecutionViewSet', 'RecordListMixin' + 'AutomationExecutionViewSet' ] @@ -39,9 +39,10 @@ class AutomationAssetsListApi(generics.ListAPIView): return assets -class AutomationRemoveAssetApi(generics.RetrieveUpdateAPIView): +class AutomationRemoveAssetApi(generics.UpdateAPIView): model = BaseAutomation serializer_class = serializers.UpdateAssetSerializer + http_method_names = ['patch'] def update(self, request, *args, **kwargs): instance = self.get_object() @@ -56,9 +57,10 @@ class AutomationRemoveAssetApi(generics.RetrieveUpdateAPIView): return Response({'msg': 'ok'}) -class AutomationAddAssetApi(generics.RetrieveUpdateAPIView): +class AutomationAddAssetApi(generics.UpdateAPIView): model = BaseAutomation serializer_class = serializers.UpdateAssetSerializer + http_method_names = ['patch'] def update(self, request, *args, **kwargs): instance = self.get_object() @@ -72,9 +74,10 @@ class AutomationAddAssetApi(generics.RetrieveUpdateAPIView): return Response({"error": serializer.errors}) -class AutomationNodeAddRemoveApi(generics.RetrieveUpdateAPIView): +class AutomationNodeAddRemoveApi(generics.UpdateAPIView): model = BaseAutomation serializer_class = serializers.UpdateNodeSerializer + http_method_names = ['patch'] def update(self, request, *args, **kwargs): action_params = ['add', 'remove'] @@ -124,12 +127,3 @@ class AutomationExecutionViewSet( execution = self.get_object() report = execution.manager.gen_report() return HttpResponse(report) - - -class RecordListMixin: - def list(self, request, *args, **kwargs): - try: - response = super().list(request, *args, **kwargs) - except Exception as e: - response = Response({'detail': str(e)}, status=status.HTTP_400_BAD_REQUEST) - return response diff --git a/apps/accounts/api/automations/change_secret.py b/apps/accounts/api/automations/change_secret.py index 9cdce3013..5ea945b57 100644 --- a/apps/accounts/api/automations/change_secret.py +++ b/apps/accounts/api/automations/change_secret.py @@ -16,7 +16,7 @@ from orgs.mixins.api import OrgBulkModelViewSet, OrgGenericViewSet from rbac.permissions import RBACPermission from .base import ( AutomationAssetsListApi, AutomationRemoveAssetApi, AutomationAddAssetApi, - AutomationNodeAddRemoveApi, AutomationExecutionViewSet, RecordListMixin + AutomationNodeAddRemoveApi, AutomationExecutionViewSet ) __all__ = [ @@ -35,7 +35,7 @@ class ChangeSecretAutomationViewSet(OrgBulkModelViewSet): serializer_class = serializers.ChangeSecretAutomationSerializer -class ChangeSecretRecordViewSet(RecordListMixin, mixins.ListModelMixin, OrgGenericViewSet): +class ChangeSecretRecordViewSet(mixins.ListModelMixin, OrgGenericViewSet): filterset_class = ChangeSecretRecordFilterSet permission_classes = [RBACPermission, IsValidLicense] search_fields = ('asset__address', 'account__username') diff --git a/apps/accounts/api/automations/check_account.py b/apps/accounts/api/automations/check_account.py index 0663b5818..978be2615 100644 --- a/apps/accounts/api/automations/check_account.py +++ b/apps/accounts/api/automations/check_account.py @@ -147,6 +147,7 @@ class CheckAccountEngineViewSet(JMSModelViewSet): serializer_class = serializers.CheckAccountEngineSerializer permission_classes = [RBACPermission, IsValidLicense] perm_model = CheckAccountEngine + http_method_names = ['get', 'options'] def get_queryset(self): return CheckAccountEngine.get_default_engines() diff --git a/apps/accounts/api/automations/push_account.py b/apps/accounts/api/automations/push_account.py index 643f58d61..4b0004f3b 100644 --- a/apps/accounts/api/automations/push_account.py +++ b/apps/accounts/api/automations/push_account.py @@ -9,7 +9,7 @@ from accounts.models import PushAccountAutomation, PushSecretRecord from orgs.mixins.api import OrgBulkModelViewSet, OrgGenericViewSet from .base import ( AutomationAssetsListApi, AutomationRemoveAssetApi, AutomationAddAssetApi, - AutomationNodeAddRemoveApi, AutomationExecutionViewSet, RecordListMixin + AutomationNodeAddRemoveApi, AutomationExecutionViewSet ) __all__ = [ @@ -42,7 +42,7 @@ class PushAccountExecutionViewSet(AutomationExecutionViewSet): return queryset -class PushAccountRecordViewSet(RecordListMixin, mixins.ListModelMixin, OrgGenericViewSet): +class PushAccountRecordViewSet(mixins.ListModelMixin, OrgGenericViewSet): filterset_class = PushAccountRecordFilterSet search_fields = ('asset__address', 'account__username') ordering_fields = ('date_finished',) diff --git a/apps/accounts/automations/base/manager.py b/apps/accounts/automations/base/manager.py index 57f6fb5f8..bb94a2213 100644 --- a/apps/accounts/automations/base/manager.py +++ b/apps/accounts/automations/base/manager.py @@ -69,7 +69,7 @@ class BaseChangeSecretPushManager(AccountBasePlaybookManager): return asset = privilege_account.asset - accounts = asset.accounts.all() + accounts = asset.all_accounts.all() accounts = accounts.filter(id__in=self.account_ids, secret_reset=True) if self.secret_type: @@ -94,6 +94,7 @@ class BaseChangeSecretPushManager(AccountBasePlaybookManager): h['account'] = { 'name': account.name, 'username': account.username, + 'full_username': account.full_username, 'secret_type': secret_type, 'secret': account.escape_jinja2_syntax(new_secret), 'private_key_path': private_key_path, diff --git a/apps/accounts/automations/change_secret/host/aix/main.yml b/apps/accounts/automations/change_secret/host/aix/main.yml index 984b9de8e..d1bec4a4e 100644 --- a/apps/accounts/automations/change_secret/host/aix/main.yml +++ b/apps/accounts/automations/change_secret/host/aix/main.yml @@ -41,6 +41,7 @@ password: "{{ account.secret | password_hash('des') }}" update_password: always ignore_errors: true + register: change_secret_result when: account.secret_type == "password" - name: "Get home directory for {{ account.username }}" @@ -83,6 +84,7 @@ user: "{{ account.username }}" key: "{{ account.secret }}" exclusive: "{{ ssh_params.exclusive }}" + register: change_secret_result when: account.secret_type == "ssh_key" - name: Refresh connection @@ -101,7 +103,9 @@ become_password: "{{ account.become.ansible_password | default('') }}" become_private_key_path: "{{ account.become.ansible_ssh_private_key_file | default(None) }}" old_ssh_version: "{{ jms_asset.old_ssh_version | default(False) }}" - when: account.secret_type == "password" and check_conn_after_change + when: + - account.secret_type == "password" + - check_conn_after_change or change_secret_result.failed | default(false) delegate_to: localhost - name: "Verify {{ account.username }} SSH KEY (paramiko)" @@ -112,5 +116,7 @@ login_private_key_path: "{{ account.private_key_path }}" gateway_args: "{{ jms_asset.ansible_ssh_common_args | default(None) }}" old_ssh_version: "{{ jms_asset.old_ssh_version | default(False) }}" - when: account.secret_type == "ssh_key" and check_conn_after_change + when: + - account.secret_type == "ssh_key" + - check_conn_after_change or change_secret_result.failed | default(false) delegate_to: localhost diff --git a/apps/accounts/automations/change_secret/host/posix/main.yml b/apps/accounts/automations/change_secret/host/posix/main.yml index 8b991307b..1687e791f 100644 --- a/apps/accounts/automations/change_secret/host/posix/main.yml +++ b/apps/accounts/automations/change_secret/host/posix/main.yml @@ -41,6 +41,7 @@ password: "{{ account.secret | password_hash('sha512') }}" update_password: always ignore_errors: true + register: change_secret_result when: account.secret_type == "password" - name: "Get home directory for {{ account.username }}" @@ -83,6 +84,7 @@ user: "{{ account.username }}" key: "{{ account.secret }}" exclusive: "{{ ssh_params.exclusive }}" + register: change_secret_result when: account.secret_type == "ssh_key" - name: Refresh connection @@ -101,7 +103,9 @@ become_password: "{{ account.become.ansible_password | default('') }}" become_private_key_path: "{{ account.become.ansible_ssh_private_key_file | default(None) }}" old_ssh_version: "{{ jms_asset.old_ssh_version | default(False) }}" - when: account.secret_type == "password" and check_conn_after_change + when: + - account.secret_type == "password" + - check_conn_after_change or change_secret_result.failed | default(false) delegate_to: localhost - name: "Verify {{ account.username }} SSH KEY (paramiko)" @@ -112,5 +116,7 @@ login_private_key_path: "{{ account.private_key_path }}" gateway_args: "{{ jms_asset.ansible_ssh_common_args | default(None) }}" old_ssh_version: "{{ jms_asset.old_ssh_version | default(False) }}" - when: account.secret_type == "ssh_key" and check_conn_after_change + when: + - account.secret_type == "ssh_key" + - check_conn_after_change or change_secret_result.failed | default(false) delegate_to: localhost diff --git a/apps/accounts/automations/change_secret/host/windows_ad/main.yml b/apps/accounts/automations/change_secret/host/windows_ad/main.yml new file mode 100644 index 000000000..1b8634f38 --- /dev/null +++ b/apps/accounts/automations/change_secret/host/windows_ad/main.yml @@ -0,0 +1,27 @@ +- hosts: demo + gather_facts: no + tasks: + - name: Test privileged account + ansible.windows.win_ping: + + - name: Change password + community.windows.win_domain_user: + name: "{{ account.username }}" + password: "{{ account.secret }}" + update_password: always + password_never_expires: yes + state: present + groups: "{{ params.groups }}" + groups_action: add + ignore_errors: true + when: account.secret_type == "password" + + - name: Refresh connection + ansible.builtin.meta: reset_connection + + - name: Verify password + ansible.windows.win_ping: + vars: + ansible_user: "{{ account.full_username }}" + ansible_password: "{{ account.secret }}" + when: account.secret_type == "password" and check_conn_after_change diff --git a/apps/accounts/automations/change_secret/host/windows_ad/manifest.yml b/apps/accounts/automations/change_secret/host/windows_ad/manifest.yml new file mode 100644 index 000000000..4c4c66fb6 --- /dev/null +++ b/apps/accounts/automations/change_secret/host/windows_ad/manifest.yml @@ -0,0 +1,27 @@ +id: change_secret_ad_windows +name: "{{ 'Windows account change secret' | trans }}" +version: 1 +method: change_secret +category: + - ds +type: + - windows_ad +params: + - name: groups + type: str + label: '用户组' + default: 'Users,Remote Desktop Users' + help_text: "{{ 'Params groups help text' | trans }}" + + +i18n: + Windows account change secret: + zh: '使用 Ansible 模块 win_domain_user 执行 Windows 账号改密' + ja: 'Ansible win_domain_user モジュールを使用して Windows アカウントのパスワード変更' + en: 'Using Ansible module win_domain_user to change Windows account secret' + + Params groups help text: + zh: '请输入用户组,多个用户组使用逗号分隔(需填写已存在的用户组)' + ja: 'グループを入力してください。複数のグループはコンマで区切ってください(既存のグループを入力してください)' + en: 'Please enter the group. Multiple groups are separated by commas (please enter the existing group)' + diff --git a/apps/accounts/automations/gather_account/filter.py b/apps/accounts/automations/gather_account/filter.py index a12b78586..bc87a7511 100644 --- a/apps/accounts/automations/gather_account/filter.py +++ b/apps/accounts/automations/gather_account/filter.py @@ -13,6 +13,7 @@ def parse_date(date_str, default=None): formats = [ '%Y/%m/%d %H:%M:%S', '%Y-%m-%dT%H:%M:%S', + '%Y-%m-%d %H:%M:%S', '%d-%m-%Y %H:%M:%S', '%Y/%m/%d', '%d-%m-%Y', @@ -26,7 +27,6 @@ def parse_date(date_str, default=None): return default -# TODO 后期会挪到 playbook 中 class GatherAccountsFilter: def __init__(self, tp): self.tp = tp @@ -208,14 +208,35 @@ class GatherAccountsFilter: key, value = parts user_info[key.strip()] = value.strip() detail = {'groups': user_info.get('Global Group memberships', ''), } - user = { - 'username': user_info.get('User name', ''), - 'date_password_change': parse_date(user_info.get('Password last set', '')), - 'date_password_expired': parse_date(user_info.get('Password expires', '')), - 'date_last_login': parse_date(user_info.get('Last logon', '')), + + username = user_info.get('User name') + if not username: + continue + + result[username] = { + 'username': username, + 'date_password_change': parse_date(user_info.get('Password last set')), + 'date_password_expired': parse_date(user_info.get('Password expires')), + 'date_last_login': parse_date(user_info.get('Last logon')), + 'groups': detail, + } + return result + + @staticmethod + def windows_ad_filter(info): + result = {} + for user_info in info['user_details']: + detail = {'groups': user_info.get('GlobalGroupMemberships', ''), } + username = user_info.get('SamAccountName') + if not username: + continue + result[username] = { + 'username': username, + 'date_password_change': parse_date(user_info.get('PasswordLastSet')), + 'date_password_expired': parse_date(user_info.get('PasswordExpires')), + 'date_last_login': parse_date(user_info.get('LastLogonDate')), 'groups': detail, } - result[user['username']] = user return result @staticmethod diff --git a/apps/accounts/automations/gather_account/host/windows/main.yml b/apps/accounts/automations/gather_account/host/windows/main.yml index 6d545701a..453716046 100644 --- a/apps/accounts/automations/gather_account/host/windows/main.yml +++ b/apps/accounts/automations/gather_account/host/windows/main.yml @@ -4,6 +4,7 @@ - name: Run net user command to get all users win_shell: net user register: user_list_output + failed_when: false - name: Parse all users from net user command set_fact: diff --git a/apps/accounts/automations/gather_account/host/windows/manifest.yml b/apps/accounts/automations/gather_account/host/windows/manifest.yml index c98fb0b2b..6cfd67a33 100644 --- a/apps/accounts/automations/gather_account/host/windows/manifest.yml +++ b/apps/accounts/automations/gather_account/host/windows/manifest.yml @@ -2,10 +2,13 @@ id: gather_accounts_windows name: "{{ 'Windows account gather' | trans }}" version: 1 method: gather_accounts -category: host +category: + - host + type: - windows + i18n: Windows account gather: zh: 使用命令 net user 收集 Windows 账号 diff --git a/apps/accounts/automations/gather_account/host/windows_ad/main.yml b/apps/accounts/automations/gather_account/host/windows_ad/main.yml new file mode 100644 index 000000000..b1d57624e --- /dev/null +++ b/apps/accounts/automations/gather_account/host/windows_ad/main.yml @@ -0,0 +1,74 @@ +- hosts: demo + gather_facts: no + tasks: + - name: Import ActiveDirectory module + win_shell: Import-Module ActiveDirectory + args: + warn: false + + - name: Get the SamAccountName list of all AD users + win_shell: | + Import-Module ActiveDirectory + Get-ADUser -Filter * | Select-Object -ExpandProperty SamAccountName + register: ad_user_list + + - name: Set the all_users variable + set_fact: + all_users: "{{ ad_user_list.stdout_lines }}" + + - name: Get detailed information for each user + win_shell: | + Import-Module ActiveDirectory + + $user = Get-ADUser -Identity {{ item }} -Properties Name, SamAccountName, Enabled, LastLogonDate, PasswordLastSet, msDS-UserPasswordExpiryTimeComputed, MemberOf + + $globalGroups = @() + if ($user.MemberOf) { + $globalGroups = $user.MemberOf | ForEach-Object { + try { + $group = Get-ADGroup $_ -ErrorAction Stop + if ($group.GroupScope -eq 'Global') { $group.Name } + } catch { + } + } + } + + $passwordExpiry = $null + $expiryRaw = $user.'msDS-UserPasswordExpiryTimeComputed' + if ($expiryRaw) { + try { + $passwordExpiry = [datetime]::FromFileTime($expiryRaw) + } catch { + $passwordExpiry = $null + } + } + + $output = [PSCustomObject]@{ + Name = $user.Name + SamAccountName = $user.SamAccountName + Enabled = $user.Enabled + LastLogonDate = if ($user.LastLogonDate) { $user.LastLogonDate.ToString("yyyy-MM-dd HH:mm:ss") } else { $null } + PasswordLastSet = if ($user.PasswordLastSet) { $user.PasswordLastSet.ToString("yyyy-MM-dd HH:mm:ss") } else { $null } + PasswordExpires = if ($passwordExpiry) { $passwordExpiry.ToString("yyyy-MM-dd HH:mm:ss") } else { $null } + GlobalGroupMemberships = $globalGroups + } + + $output | ConvertTo-Json -Depth 3 + loop: "{{ all_users }}" + register: ad_user_details + ignore_errors: yes + + + - set_fact: + info: + user_details: >- + {{ + ad_user_details.results + | selectattr('rc', 'equalto', 0) + | map(attribute='stdout') + | select('truthy') + | map('from_json') + }} + + - debug: + var: info \ No newline at end of file diff --git a/apps/accounts/automations/gather_account/host/windows_ad/manifest.yml b/apps/accounts/automations/gather_account/host/windows_ad/manifest.yml new file mode 100644 index 000000000..2dbaddeb0 --- /dev/null +++ b/apps/accounts/automations/gather_account/host/windows_ad/manifest.yml @@ -0,0 +1,15 @@ +id: gather_accounts_windows_ad +name: "{{ 'Windows account gather' | trans }}" +version: 1 +method: gather_accounts +category: + - ds + +type: + - windows_ad + +i18n: + Windows account gather: + zh: 使用命令 Get-ADUser 收集 Windows 账号 + ja: コマンド Get-ADUser を使用して Windows アカウントを収集する + en: Using command Get-ADUser to gather accounts diff --git a/apps/accounts/automations/gather_account/manager.py b/apps/accounts/automations/gather_account/manager.py index 9cd6c1e4b..de677fa6d 100644 --- a/apps/accounts/automations/gather_account/manager.py +++ b/apps/accounts/automations/gather_account/manager.py @@ -1,6 +1,6 @@ +import time from collections import defaultdict -import time from django.utils import timezone from accounts.const import AutomationTypes @@ -222,6 +222,7 @@ class GatherAccountsManager(AccountBasePlaybookManager): def _collect_asset_account_info(self, asset, info): result = self._filter_success_result(asset.type, info) accounts = [] + for username, info in result.items(): self.asset_usernames_mapper[str(asset.id)].add(username) @@ -373,6 +374,7 @@ class GatherAccountsManager(AccountBasePlaybookManager): for asset, accounts_data in self.asset_account_info.items(): ori_users = self.ori_asset_usernames[str(asset.id)] + need_analyser_gather_account = [] with tmp_to_org(asset.org_id): for d in accounts_data: username = d["username"] @@ -385,10 +387,11 @@ class GatherAccountsManager(AccountBasePlaybookManager): ga = ori_account self.update_gathered_account(ori_account, d) ori_found = username in ori_users - risk_analyser.analyse_risk(asset, ga, d, ori_found) - + need_analyser_gather_account.append((asset, ga, d, ori_found)) self.create_gathered_account.finish() self.update_gathered_account.finish() + for analysis_data in need_analyser_gather_account: + risk_analyser.analyse_risk(*analysis_data) self.update_gather_accounts_status(asset) if not self.is_sync_account: continue diff --git a/apps/accounts/automations/push_account/host/aix/main.yml b/apps/accounts/automations/push_account/host/aix/main.yml index 92c8a5658..42e4d84d2 100644 --- a/apps/accounts/automations/push_account/host/aix/main.yml +++ b/apps/accounts/automations/push_account/host/aix/main.yml @@ -41,6 +41,7 @@ password: "{{ account.secret | password_hash('des') }}" update_password: always ignore_errors: true + register: change_secret_result when: account.secret_type == "password" - name: "Get home directory for {{ account.username }}" @@ -83,6 +84,7 @@ user: "{{ account.username }}" key: "{{ account.secret }}" exclusive: "{{ ssh_params.exclusive }}" + register: change_secret_result when: account.secret_type == "ssh_key" - name: Refresh connection @@ -101,7 +103,9 @@ become_password: "{{ account.become.ansible_password | default('') }}" become_private_key_path: "{{ account.become.ansible_ssh_private_key_file | default(None) }}" old_ssh_version: "{{ jms_asset.old_ssh_version | default(False) }}" - when: account.secret_type == "password" and check_conn_after_change + when: + - account.secret_type == "password" + - check_conn_after_change or change_secret_result.failed | default(false) delegate_to: localhost - name: "Verify {{ account.username }} SSH KEY (paramiko)" @@ -112,6 +116,8 @@ login_private_key_path: "{{ account.private_key_path }}" gateway_args: "{{ jms_asset.ansible_ssh_common_args | default(None) }}" old_ssh_version: "{{ jms_asset.old_ssh_version | default(False) }}" - when: account.secret_type == "ssh_key" and check_conn_after_change + when: + - account.secret_type == "ssh_key" + - check_conn_after_change or change_secret_result.failed | default(false) delegate_to: localhost diff --git a/apps/accounts/automations/push_account/host/posix/main.yml b/apps/accounts/automations/push_account/host/posix/main.yml index b47e6745e..ea4e86678 100644 --- a/apps/accounts/automations/push_account/host/posix/main.yml +++ b/apps/accounts/automations/push_account/host/posix/main.yml @@ -41,6 +41,7 @@ password: "{{ account.secret | password_hash('sha512') }}" update_password: always ignore_errors: true + register: change_secret_result when: account.secret_type == "password" - name: "Get home directory for {{ account.username }}" @@ -83,6 +84,7 @@ user: "{{ account.username }}" key: "{{ account.secret }}" exclusive: "{{ ssh_params.exclusive }}" + register: change_secret_result when: account.secret_type == "ssh_key" - name: Refresh connection @@ -101,7 +103,9 @@ become_password: "{{ account.become.ansible_password | default('') }}" become_private_key_path: "{{ account.become.ansible_ssh_private_key_file | default(None) }}" old_ssh_version: "{{ jms_asset.old_ssh_version | default(False) }}" - when: account.secret_type == "password" and check_conn_after_change + when: + - account.secret_type == "password" + - check_conn_after_change or change_secret_result.failed | default(false) delegate_to: localhost - name: "Verify {{ account.username }} SSH KEY (paramiko)" @@ -112,6 +116,8 @@ login_private_key_path: "{{ account.private_key_path }}" gateway_args: "{{ jms_asset.ansible_ssh_common_args | default(None) }}" old_ssh_version: "{{ jms_asset.old_ssh_version | default(False) }}" - when: account.secret_type == "ssh_key" and check_conn_after_change + when: + - account.secret_type == "ssh_key" + - check_conn_after_change or change_secret_result.failed | default(false) delegate_to: localhost diff --git a/apps/accounts/automations/push_account/host/windows_ad/main.yml b/apps/accounts/automations/push_account/host/windows_ad/main.yml new file mode 100644 index 000000000..fc8a41f4f --- /dev/null +++ b/apps/accounts/automations/push_account/host/windows_ad/main.yml @@ -0,0 +1,27 @@ +- hosts: demo + gather_facts: no + tasks: + - name: Test privileged account + ansible.windows.win_ping: + + - name: Push user password + community.windows.win_domain_user: + name: "{{ account.username }}" + password: "{{ account.secret }}" + update_password: always + password_never_expires: yes + state: present + groups: "{{ params.groups }}" + groups_action: add + ignore_errors: true + when: account.secret_type == "password" + + - name: Refresh connection + ansible.builtin.meta: reset_connection + + - name: Verify password + ansible.windows.win_ping: + vars: + ansible_user: "{{ account.full_username }}" + ansible_password: "{{ account.secret }}" + when: account.secret_type == "password" and check_conn_after_change diff --git a/apps/accounts/automations/push_account/host/windows_ad/manifest.yml b/apps/accounts/automations/push_account/host/windows_ad/manifest.yml new file mode 100644 index 000000000..60f603b5f --- /dev/null +++ b/apps/accounts/automations/push_account/host/windows_ad/manifest.yml @@ -0,0 +1,25 @@ +id: push_account_ad_windows +name: "{{ 'Windows account push' | trans }}" +version: 1 +method: push_account +category: + - ds +type: + - windows_ad +params: + - name: groups + type: str + label: '用户组' + default: 'Users,Remote Desktop Users' + help_text: "{{ 'Params groups help text' | trans }}" + +i18n: + Windows account push: + zh: '使用 Ansible 模块 win_domain_user 执行 Windows 账号推送' + ja: 'Ansible win_domain_user モジュールを使用して Windows アカウントをプッシュする' + en: 'Using Ansible module win_domain_user to push account' + + Params groups help text: + zh: '请输入用户组,多个用户组使用逗号分隔(需填写已存在的用户组)' + ja: 'グループを入力してください。複数のグループはコンマで区切ってください(既存のグループを入力してください)' + en: 'Please enter the group. Multiple groups are separated by commas (please enter the existing group)' diff --git a/apps/accounts/automations/remove_account/database/sqlserver/main.yml b/apps/accounts/automations/remove_account/database/sqlserver/main.yml index 001879395..de68021d2 100644 --- a/apps/accounts/automations/remove_account/database/sqlserver/main.yml +++ b/apps/accounts/automations/remove_account/database/sqlserver/main.yml @@ -11,4 +11,5 @@ login_host: "{{ jms_asset.address }}" login_port: "{{ jms_asset.port }}" name: "{{ jms_asset.spec_info.db_name }}" - script: "DROP USER {{ account.username }}" + script: "DROP LOGIN {{ account.username }}; select @@version" + diff --git a/apps/accounts/automations/remove_account/host/windows_ad/main.yml b/apps/accounts/automations/remove_account/host/windows_ad/main.yml new file mode 100644 index 000000000..6fd268b84 --- /dev/null +++ b/apps/accounts/automations/remove_account/host/windows_ad/main.yml @@ -0,0 +1,9 @@ +- hosts: windows + gather_facts: no + tasks: + - name: "Remove account" + ansible.windows.win_domain_user: + name: "{{ account.username }}" + state: absent + + diff --git a/apps/accounts/automations/remove_account/host/windows_ad/manifest.yml b/apps/accounts/automations/remove_account/host/windows_ad/manifest.yml new file mode 100644 index 000000000..d813836bf --- /dev/null +++ b/apps/accounts/automations/remove_account/host/windows_ad/manifest.yml @@ -0,0 +1,14 @@ +id: remove_account_ad_windows +name: "{{ 'Windows account remove' | trans }}" +version: 1 +method: remove_account +category: + - ds +type: + - windows_ad + +i18n: + Windows account remove: + zh: 使用 Ansible 模块 win_domain_user 删除账号 + ja: Ansible モジュール win_domain_user を使用してアカウントを削除する + en: Use the Ansible module win_domain_user to delete an account diff --git a/apps/accounts/automations/verify_account/custom/rdp/main.yml b/apps/accounts/automations/verify_account/custom/rdp/main.yml index 33ee8282b..94e895004 100644 --- a/apps/accounts/automations/verify_account/custom/rdp/main.yml +++ b/apps/accounts/automations/verify_account/custom/rdp/main.yml @@ -10,6 +10,6 @@ rdp_ping: login_host: "{{ jms_asset.address }}" login_port: "{{ jms_asset.port }}" - login_user: "{{ account.username }}" + login_user: "{{ account.full_username }}" login_password: "{{ account.secret }}" login_secret_type: "{{ account.secret_type }}" diff --git a/apps/accounts/automations/verify_account/custom/rdp/manifest.yml b/apps/accounts/automations/verify_account/custom/rdp/manifest.yml index 3cfaf1880..12d92c5d6 100644 --- a/apps/accounts/automations/verify_account/custom/rdp/manifest.yml +++ b/apps/accounts/automations/verify_account/custom/rdp/manifest.yml @@ -2,8 +2,10 @@ id: verify_account_by_rdp name: "{{ 'Windows rdp account verify' | trans }}" category: - host + - ds type: - windows + - windows_ad method: verify_account protocol: rdp priority: 1 diff --git a/apps/accounts/automations/verify_account/host/windows/main.yml b/apps/accounts/automations/verify_account/host/windows/main.yml index a0a722eba..a7b49545c 100644 --- a/apps/accounts/automations/verify_account/host/windows/main.yml +++ b/apps/accounts/automations/verify_account/host/windows/main.yml @@ -7,5 +7,5 @@ - name: Verify account ansible.windows.win_ping: vars: - ansible_user: "{{ account.username }}" + ansible_user: "{{ account.full_username }}" ansible_password: "{{ account.secret }}" diff --git a/apps/accounts/automations/verify_account/host/windows/manifest.yml b/apps/accounts/automations/verify_account/host/windows/manifest.yml index a277f8c62..39198bf58 100644 --- a/apps/accounts/automations/verify_account/host/windows/manifest.yml +++ b/apps/accounts/automations/verify_account/host/windows/manifest.yml @@ -2,9 +2,12 @@ id: verify_account_windows name: "{{ 'Windows account verify' | trans }}" version: 1 method: verify_account -category: host +category: + - host + - ds type: - windows + - windows_ad i18n: Windows account verify: diff --git a/apps/accounts/automations/verify_account/manager.py b/apps/accounts/automations/verify_account/manager.py index 235e5c601..4135d742a 100644 --- a/apps/accounts/automations/verify_account/manager.py +++ b/apps/accounts/automations/verify_account/manager.py @@ -42,7 +42,7 @@ class VerifyAccountManager(AccountBasePlaybookManager): if host.get('error'): return host - accounts = asset.accounts.all() + accounts = asset.all_accounts.all() accounts = self.get_accounts(account, accounts) inventory_hosts = [] @@ -64,6 +64,7 @@ class VerifyAccountManager(AccountBasePlaybookManager): h['account'] = { 'name': account.name, 'username': account.username, + 'full_username': account.full_username, 'secret_type': account.secret_type, 'secret': account.escape_jinja2_syntax(secret), 'private_key_path': private_key_path, diff --git a/apps/accounts/filters.py b/apps/accounts/filters.py index 0d92b9406..47d64b31d 100644 --- a/apps/accounts/filters.py +++ b/apps/accounts/filters.py @@ -5,7 +5,6 @@ import uuid import django_filters from django.db.models import Q from django.utils import timezone -from django.utils.translation import gettext_lazy as _ from django_filters import rest_framework as drf_filters from rest_framework import filters from rest_framework.compat import coreapi @@ -13,11 +12,26 @@ from rest_framework.compat import coreapi from assets.models import Node from assets.utils import get_node_from_request from common.drf.filters import BaseFilterSet +from common.utils import get_logger from common.utils.timezone import local_zero_hour, local_now from .const.automation import ChangeSecretRecordStatusChoice from .models import Account, GatheredAccount, ChangeSecretRecord, PushSecretRecord, IntegrationApplication, \ AutomationExecution +logger = get_logger(__file__) + + +class UUIDFilterMixin: + @staticmethod + def filter_uuid(queryset, name, value): + try: + uuid.UUID(value) + except ValueError: + logger.warning(f"Invalid UUID: {value}") + return queryset.none() + + return queryset.filter(**{name: value}) + class NodeFilterBackend(filters.BaseFilterBackend): fields = ['node_id'] @@ -43,14 +57,15 @@ class NodeFilterBackend(filters.BaseFilterBackend): return queryset -class AccountFilterSet(BaseFilterSet): +class AccountFilterSet(UUIDFilterMixin, BaseFilterSet): ip = drf_filters.CharFilter(field_name="address", lookup_expr="exact") + name = drf_filters.CharFilter(field_name="name", lookup_expr="exact") hostname = drf_filters.CharFilter(field_name="name", lookup_expr="exact") username = drf_filters.CharFilter(field_name="username", lookup_expr="exact") address = drf_filters.CharFilter(field_name="asset__address", lookup_expr="exact") - asset_id = drf_filters.CharFilter(field_name="asset", lookup_expr="exact") - asset = drf_filters.CharFilter(field_name="asset", lookup_expr="exact") - assets = drf_filters.CharFilter(field_name="asset_id", lookup_expr="exact") + asset_name = drf_filters.CharFilter(field_name="asset__name", lookup_expr="exact") + asset_id = drf_filters.CharFilter(field_name="asset", method="filter_uuid") + assets = drf_filters.CharFilter(field_name="asset_id", method="filter_uuid") has_secret = drf_filters.BooleanFilter(method="filter_has_secret") platform = drf_filters.CharFilter( field_name="asset__platform_id", lookup_expr="exact" @@ -135,8 +150,9 @@ class AccountFilterSet(BaseFilterSet): kwargs.update({"date_change_secret__gt": date}) if name == "latest_secret_change_failed": - queryset = queryset.filter(date_change_secret__gt=date).exclude( - change_secret_status=ChangeSecretRecordStatusChoice.success + queryset = ( + queryset.filter(date_change_secret__gt=date) + .exclude(change_secret_status=ChangeSecretRecordStatusChoice.success) ) if kwargs: @@ -146,8 +162,8 @@ class AccountFilterSet(BaseFilterSet): class Meta: model = Account fields = [ - "id", "asset", "source_id", "secret_type", "category", - "type", "privileged", "secret_reset", "connectivity", 'is_active' + "id", "source_id", "secret_type", "category", "type", + "privileged", "secret_reset", "connectivity", "is_active" ] @@ -185,16 +201,6 @@ class SecretRecordMixin(drf_filters.FilterSet): return queryset.filter(date_finished__gte=dt) -class UUIDExecutionFilterMixin: - @staticmethod - def filter_execution(queryset, name, value): - try: - uuid.UUID(value) - except ValueError: - raise ValueError(_('Enter a valid UUID.')) - return queryset.filter(**{name: value}) - - class DaysExecutionFilterMixin: days = drf_filters.NumberFilter(method="filter_days") field: str @@ -209,10 +215,10 @@ class DaysExecutionFilterMixin: class ChangeSecretRecordFilterSet( - SecretRecordMixin, UUIDExecutionFilterMixin, + SecretRecordMixin, UUIDFilterMixin, DaysExecutionFilterMixin, BaseFilterSet ): - execution_id = django_filters.CharFilter(method="filter_execution") + execution_id = django_filters.CharFilter(method="filter_uuid") days = drf_filters.NumberFilter(method="filter_days") field = 'date_finished' @@ -230,8 +236,8 @@ class AutomationExecutionFilterSet(DaysExecutionFilterMixin, BaseFilterSet): fields = ["days", 'trigger', 'automation_id', 'automation__name'] -class PushAccountRecordFilterSet(SecretRecordMixin, UUIDExecutionFilterMixin, BaseFilterSet): - execution_id = django_filters.CharFilter(method="filter_execution") +class PushAccountRecordFilterSet(SecretRecordMixin, UUIDFilterMixin, BaseFilterSet): + execution_id = django_filters.CharFilter(method="filter_uuid") class Meta: model = PushSecretRecord diff --git a/apps/accounts/mixins.py b/apps/accounts/mixins.py index f4bacc2ce..cf921dedc 100644 --- a/apps/accounts/mixins.py +++ b/apps/accounts/mixins.py @@ -1,65 +1,15 @@ from rest_framework.response import Response from rest_framework import status +from django.db.models import Model from django.utils import translation -from django.utils.translation import gettext_noop from audits.const import ActionChoices -from common.views.mixins import RecordViewLogMixin -from common.utils import i18n_fmt +from audits.handler import create_or_update_operate_log -class AccountRecordViewLogMixin(RecordViewLogMixin): +class AccountRecordViewLogMixin(object): get_object: callable - get_queryset: callable - - @staticmethod - def _filter_params(params): - new_params = {} - need_pop_params = ('format', 'order') - for key, value in params.items(): - if key in need_pop_params: - continue - if isinstance(value, list): - value = list(filter(None, value)) - if value: - new_params[key] = value - return new_params - - def get_resource_display(self, request): - query_params = dict(request.query_params) - params = self._filter_params(query_params) - - spm_filter = params.pop("spm", None) - - if not params and not spm_filter: - display_message = gettext_noop("Export all") - elif spm_filter: - display_message = gettext_noop("Export only selected items") - else: - query = ",".join( - ["%s=%s" % (key, value) for key, value in params.items()] - ) - display_message = i18n_fmt(gettext_noop("Export filtered: %s"), query) - return display_message - - @property - def detail_msg(self): - return i18n_fmt( - gettext_noop('User %s view/export secret'), self.request.user - ) - - def list(self, request, *args, **kwargs): - list_func = getattr(super(), 'list') - if not callable(list_func): - return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED) - response = list_func(request, *args, **kwargs) - with translation.override('en'): - resource_display = self.get_resource_display(request) - ids = [q.id for q in self.get_queryset()] - self.record_logs( - ids, ActionChoices.view, self.detail_msg, resource_display=resource_display - ) - return response + model: Model def retrieve(self, request, *args, **kwargs): retrieve_func = getattr(super(), 'retrieve') @@ -67,9 +17,9 @@ class AccountRecordViewLogMixin(RecordViewLogMixin): return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED) response = retrieve_func(request, *args, **kwargs) with translation.override('en'): - resource = self.get_object() - self.record_logs( - [resource.id], ActionChoices.view, self.detail_msg, resource=resource + create_or_update_operate_log( + ActionChoices.view, self.model._meta.verbose_name, + force=True, resource=self.get_object(), ) return response diff --git a/apps/accounts/models/account.py b/apps/accounts/models/account.py index 64b4e01a3..060948fe1 100644 --- a/apps/accounts/models/account.py +++ b/apps/accounts/models/account.py @@ -131,9 +131,46 @@ class Account(AbsConnectivity, LabeledMixin, BaseAccount, JSONFilterMixin): @lazyproperty def alias(self): + """ + 别称,因为有虚拟账号,@INPUT @MANUAL @USER, 否则为 id + """ if self.username.startswith('@'): return self.username - return self.name + return str(self.id) + + def is_virtual(self): + """ + 不要用 username 去判断,因为可能是构造的 account 对象,设置了同名账号的用户名, + """ + return self.alias.startswith('@') + + def is_ds_account(self): + if self.is_virtual(): + return '' + if not self.asset.is_directory_service: + return False + return True + + @lazyproperty + def ds(self): + if not self.is_ds_account(): + return None + return self.asset.ds + + @lazyproperty + def ds_domain(self): + """这个不能去掉,perm_account 会动态设置这个值,以更改 full_username""" + if self.is_virtual(): + return '' + if self.ds and self.ds.domain_name: + return self.ds.domain_name + return '' + + @property + def full_username(self): + if self.ds_domain: + return '{}@{}'.format(self.username, self.ds_domain) + return self.username @lazyproperty def has_secret(self): diff --git a/apps/accounts/models/virtual.py b/apps/accounts/models/virtual.py index 9b38d8d12..f5c2e3df7 100644 --- a/apps/accounts/models/virtual.py +++ b/apps/accounts/models/virtual.py @@ -92,8 +92,9 @@ class VirtualAccount(JMSOrgBaseModel): from .account import Account username = user.username + alias = AliasAccount.USER.value with tmp_to_org(asset.org): - same_account = cls.objects.filter(alias='@USER').first() + same_account = cls.objects.filter(alias=alias).first() secret = '' if same_account and same_account.secret_from_login: @@ -101,4 +102,6 @@ class VirtualAccount(JMSOrgBaseModel): if not secret and not from_permed: secret = input_secret - return Account(name=AliasAccount.USER.label, username=username, secret=secret) + account = Account(name=AliasAccount.USER.label, username=username, secret=secret) + account.alias = alias + return account diff --git a/apps/accounts/serializers/account/account.py b/apps/accounts/serializers/account/account.py index 11251f3a7..1d3bd788b 100644 --- a/apps/accounts/serializers/account/account.py +++ b/apps/accounts/serializers/account/account.py @@ -233,6 +233,7 @@ class AccountSerializer(AccountCreateUpdateSerializerMixin, BaseAccountSerialize required=False, queryset=Account.objects, allow_null=True, allow_empty=True, label=_('Su from'), attrs=('id', 'name', 'username') ) + ds = ObjectRelatedField(read_only=True, label=_('Directory service'), attrs=('id', 'name', 'domain_name')) class Meta(BaseAccountSerializer.Meta): model = Account @@ -241,7 +242,7 @@ class AccountSerializer(AccountCreateUpdateSerializerMixin, BaseAccountSerialize 'date_change_secret', 'change_secret_status' ] fields = BaseAccountSerializer.Meta.fields + [ - 'su_from', 'asset', 'version', + 'su_from', 'asset', 'version', 'ds', 'source', 'source_id', 'secret_reset', ] + AccountCreateUpdateSerializerMixin.Meta.fields + automation_fields read_only_fields = BaseAccountSerializer.Meta.read_only_fields + automation_fields @@ -258,7 +259,7 @@ class AccountSerializer(AccountCreateUpdateSerializerMixin, BaseAccountSerialize queryset = queryset.prefetch_related( 'asset', 'asset__platform', 'asset__platform__automation' - ).prefetch_related('labels', 'labels__label') + ) return queryset diff --git a/apps/accounts/serializers/account/service.py b/apps/accounts/serializers/account/service.py index eb0091b60..d94d2417e 100644 --- a/apps/accounts/serializers/account/service.py +++ b/apps/accounts/serializers/account/service.py @@ -1,3 +1,4 @@ +from django.templatetags.static import static from django.utils.translation import gettext_lazy as _ from rest_framework import serializers @@ -27,13 +28,14 @@ class IntegrationApplicationSerializer(BulkOrgResourceModelSerializer): 'name': {'label': _('Name')}, 'accounts_amount': {'label': _('Accounts amount')}, 'is_active': {'default': True}, + 'logo': {'required': False}, } - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - request_method = self.context.get('request').method - if request_method == 'PUT': - self.fields['logo'].required = False + def to_representation(self, instance): + data = super().to_representation(instance) + if not data.get('logo'): + data['logo'] = static('img/logo.png') + return data class IntegrationAccountSecretSerializer(serializers.Serializer): diff --git a/apps/accounts/templates/accounts/gather_account_report.html b/apps/accounts/templates/accounts/gather_account_report.html index 405719ab9..53c65e9be 100644 --- a/apps/accounts/templates/accounts/gather_account_report.html +++ b/apps/accounts/templates/accounts/gather_account_report.html @@ -129,7 +129,7 @@
JumpServer ConsoleJumpServer AuditsJumpServer PAM
JumpServer Audits JumpServer Workbench
JumpServer RBACJumpServer Settings
JumpServer SSH JumpServer RDP
{% else %} -

{% trans 'No new accounts found' %}

+

{% trans 'No lost accounts found' %}

{% endif %} diff --git a/apps/acls/const.py b/apps/acls/const.py index 486b0cae1..e9e1b5096 100644 --- a/apps/acls/const.py +++ b/apps/acls/const.py @@ -8,6 +8,6 @@ class ActionChoices(models.TextChoices): review = 'review', _('Review') warning = 'warning', _('Warn') notice = 'notice', _('Notify') - notify_and_warn = 'notify_and_warn', _('Notify and warn') + notify_and_warn = 'notify_and_warn', _('Prompt and warn') face_verify = 'face_verify', _('Face Verify') face_online = 'face_online', _('Face Online') diff --git a/apps/acls/serializers/login_acl.py b/apps/acls/serializers/login_acl.py index b31bbac9a..432306e4b 100644 --- a/apps/acls/serializers/login_acl.py +++ b/apps/acls/serializers/login_acl.py @@ -18,7 +18,12 @@ class LoginACLSerializer(BaseUserACLSerializer, BulkOrgResourceModelSerializer): class Meta(BaseUserACLSerializer.Meta): model = LoginACL fields = BaseUserACLSerializer.Meta.fields + ['rules', ] - action_choices_exclude = [ActionChoices.face_online, ActionChoices.face_verify] + action_choices_exclude = [ + ActionChoices.warning, + ActionChoices.notify_and_warn, + ActionChoices.face_online, + ActionChoices.face_verify + ] def get_rules_serializer(self): return RuleSerializer() diff --git a/apps/assets/api/asset/__init__.py b/apps/assets/api/asset/__init__.py index 75c314df7..4c1981ebd 100644 --- a/apps/assets/api/asset/__init__.py +++ b/apps/assets/api/asset/__init__.py @@ -3,6 +3,7 @@ from .cloud import * from .custom import * from .database import * from .device import * +from .ds import * from .gpt import * from .host import * from .permission import * diff --git a/apps/assets/api/asset/asset.py b/apps/assets/api/asset/asset.py index d31c16be5..0bc4df0f3 100644 --- a/apps/assets/api/asset/asset.py +++ b/apps/assets/api/asset/asset.py @@ -11,6 +11,7 @@ from rest_framework.decorators import action from rest_framework.response import Response from rest_framework.status import HTTP_200_OK +from accounts.serializers import AccountSerializer from accounts.tasks import push_accounts_to_assets_task, verify_accounts_connectivity_task from assets import serializers from assets.exceptions import NotSupportedTemporarilyError @@ -96,10 +97,10 @@ class AssetFilterSet(BaseFilterSet): return queryset.filter(protocols__name__in=value).distinct() -class AssetViewSet(SuggestionMixin, OrgBulkModelViewSet): - """ - API endpoint that allows Asset to be viewed or edited. +class BaseAssetViewSet(OrgBulkModelViewSet): """ + API endpoint that allows Asset to be viewed or edited. + """ model = Asset filterset_class = AssetFilterSet search_fields = ("name", "address", "comment") @@ -109,18 +110,19 @@ class AssetViewSet(SuggestionMixin, OrgBulkModelViewSet): ("platform", serializers.PlatformSerializer), ("suggestion", serializers.MiniAssetSerializer), ("gateways", serializers.GatewaySerializer), + ("accounts", AccountSerializer), ) rbac_perms = ( ("match", "assets.match_asset"), ("platform", "assets.view_platform"), ("gateways", "assets.view_gateway"), + ("accounts", "assets.view_account"), ("spec_info", "assets.view_asset"), ("gathered_info", "assets.view_asset"), ("sync_platform_protocols", "assets.change_asset"), ) extra_filter_backends = [ - IpInFilterBackend, - NodeFilterBackend, AttrRulesFilterBackend + IpInFilterBackend, NodeFilterBackend, AttrRulesFilterBackend ] def perform_destroy(self, instance): @@ -141,6 +143,25 @@ class AssetViewSet(SuggestionMixin, OrgBulkModelViewSet): return retrieve_cls return cls + def paginate_queryset(self, queryset): + page = super().paginate_queryset(queryset) + if page: + page = Asset.compute_all_accounts_amount(page) + return page + + def create(self, request, *args, **kwargs): + if request.path.find('/api/v1/assets/assets/') > -1: + error = _('Cannot create asset directly, you should create a host or other') + return Response({'error': error}, status=400) + + if not settings.XPACK_LICENSE_IS_VALID and self.model.objects.order_by().count() >= 5000: + error = _('The number of assets exceeds the limit of 5000') + return Response({'error': error}, status=400) + + return super().create(request, *args, **kwargs) + + +class AssetViewSet(SuggestionMixin, BaseAssetViewSet): @action(methods=["GET"], detail=True, url_path="platform") def platform(self, *args, **kwargs): asset = super().get_object() @@ -189,17 +210,6 @@ class AssetViewSet(SuggestionMixin, OrgBulkModelViewSet): Protocol.objects.bulk_create(objs) return Response(status=status.HTTP_200_OK) - def create(self, request, *args, **kwargs): - if request.path.find('/api/v1/assets/assets/') > -1: - error = _('Cannot create asset directly, you should create a host or other') - return Response({'error': error}, status=400) - - if not settings.XPACK_LICENSE_IS_VALID and self.model.objects.order_by().count() >= 5000: - error = _('The number of assets exceeds the limit of 5000') - return Response({'error': error}, status=400) - - return super().create(request, *args, **kwargs) - def filter_bulk_update_data(self): bulk_data = [] skip_assets = [] diff --git a/apps/assets/api/asset/cloud.py b/apps/assets/api/asset/cloud.py index 96211ab6e..6ba6dbb74 100644 --- a/apps/assets/api/asset/cloud.py +++ b/apps/assets/api/asset/cloud.py @@ -1,12 +1,12 @@ from assets.models import Cloud, Asset from assets.serializers import CloudSerializer -from .asset import AssetViewSet +from .asset import BaseAssetViewSet __all__ = ['CloudViewSet'] -class CloudViewSet(AssetViewSet): +class CloudViewSet(BaseAssetViewSet): model = Cloud perm_model = Asset diff --git a/apps/assets/api/asset/custom.py b/apps/assets/api/asset/custom.py index ca5058ed6..63410bbec 100644 --- a/apps/assets/api/asset/custom.py +++ b/apps/assets/api/asset/custom.py @@ -1,12 +1,12 @@ from assets.models import Custom, Asset from assets.serializers import CustomSerializer -from .asset import AssetViewSet +from .asset import BaseAssetViewSet __all__ = ['CustomViewSet'] -class CustomViewSet(AssetViewSet): +class CustomViewSet(BaseAssetViewSet): model = Custom perm_model = Asset diff --git a/apps/assets/api/asset/database.py b/apps/assets/api/asset/database.py index 136f82f54..559560e24 100644 --- a/apps/assets/api/asset/database.py +++ b/apps/assets/api/asset/database.py @@ -1,12 +1,12 @@ from assets.models import Database, Asset from assets.serializers import DatabaseSerializer -from .asset import AssetViewSet +from .asset import BaseAssetViewSet __all__ = ['DatabaseViewSet'] -class DatabaseViewSet(AssetViewSet): +class DatabaseViewSet(BaseAssetViewSet): model = Database perm_model = Asset diff --git a/apps/assets/api/asset/device.py b/apps/assets/api/asset/device.py index a2031ef1a..7a4a602a0 100644 --- a/apps/assets/api/asset/device.py +++ b/apps/assets/api/asset/device.py @@ -1,11 +1,11 @@ -from assets.serializers import DeviceSerializer from assets.models import Device, Asset -from .asset import AssetViewSet +from assets.serializers import DeviceSerializer +from .asset import BaseAssetViewSet __all__ = ['DeviceViewSet'] -class DeviceViewSet(AssetViewSet): +class DeviceViewSet(BaseAssetViewSet): model = Device perm_model = Asset diff --git a/apps/assets/api/asset/ds.py b/apps/assets/api/asset/ds.py new file mode 100644 index 000000000..9d748b160 --- /dev/null +++ b/apps/assets/api/asset/ds.py @@ -0,0 +1,16 @@ +from assets.models import DirectoryService, Asset +from assets.serializers import DSSerializer + +from .asset import BaseAssetViewSet + +__all__ = ['DSViewSet'] + + +class DSViewSet(BaseAssetViewSet): + model = DirectoryService + perm_model = Asset + + def get_serializer_classes(self): + serializer_classes = super().get_serializer_classes() + serializer_classes['default'] = DSSerializer + return serializer_classes diff --git a/apps/assets/api/asset/gpt.py b/apps/assets/api/asset/gpt.py index ef9953a41..25128d6df 100644 --- a/apps/assets/api/asset/gpt.py +++ b/apps/assets/api/asset/gpt.py @@ -1,12 +1,12 @@ from assets.models import GPT, Asset from assets.serializers import GPTSerializer -from .asset import AssetViewSet +from .asset import BaseAssetViewSet __all__ = ['GPTViewSet'] -class GPTViewSet(AssetViewSet): +class GPTViewSet(BaseAssetViewSet): model = GPT perm_model = Asset diff --git a/apps/assets/api/asset/host.py b/apps/assets/api/asset/host.py index d2ddc954d..9861d0b2a 100644 --- a/apps/assets/api/asset/host.py +++ b/apps/assets/api/asset/host.py @@ -1,11 +1,11 @@ from assets.models import Host, Asset from assets.serializers import HostSerializer -from .asset import AssetViewSet +from .asset import BaseAssetViewSet __all__ = ['HostViewSet'] -class HostViewSet(AssetViewSet): +class HostViewSet(BaseAssetViewSet): model = Host perm_model = Asset diff --git a/apps/assets/api/asset/web.py b/apps/assets/api/asset/web.py index 363fd5f49..9d9dd1f70 100644 --- a/apps/assets/api/asset/web.py +++ b/apps/assets/api/asset/web.py @@ -1,12 +1,12 @@ from assets.models import Web, Asset from assets.serializers import WebSerializer -from .asset import AssetViewSet +from .asset import BaseAssetViewSet __all__ = ['WebViewSet'] -class WebViewSet(AssetViewSet): +class WebViewSet(BaseAssetViewSet): model = Web perm_model = Asset diff --git a/apps/assets/api/platform.py b/apps/assets/api/platform.py index bb23abf2d..2bb9f84b2 100644 --- a/apps/assets/api/platform.py +++ b/apps/assets/api/platform.py @@ -52,7 +52,7 @@ class AssetPlatformViewSet(JMSModelViewSet): queryset = ( super().get_queryset() .annotate(assets_amount=Coalesce(Subquery(asset_count_subquery), Value(0))) - .prefetch_related('protocols', 'automation', 'labels', 'labels__label') + .prefetch_related('protocols', 'automation') ) queryset = queryset.filter(type__in=AllTypes.get_types_values()) return queryset diff --git a/apps/assets/automations/base/manager.py b/apps/assets/automations/base/manager.py index 1837ddfea..8446dbeb4 100644 --- a/apps/assets/automations/base/manager.py +++ b/apps/assets/automations/base/manager.py @@ -3,10 +3,10 @@ import json import logging import os import shutil +import time from collections import defaultdict from socket import gethostname -import time import yaml from django.conf import settings from django.template.loader import render_to_string @@ -334,7 +334,8 @@ class PlaybookPrepareMixin: return sub_playbook_path def check_automation_enabled(self, platform, assets): - if not platform.automation or not platform.automation.ansible_enabled: + automation = getattr(platform, 'automation', None) + if not (automation and getattr(automation, 'ansible_enabled', False)): print(_(" - Platform {} ansible disabled").format(platform.name)) self.on_assets_not_ansible_enabled(assets) return False diff --git a/apps/assets/automations/gather_facts/host/windows/manifest.yml b/apps/assets/automations/gather_facts/host/windows/manifest.yml index 7068f4d6e..2977dc84c 100644 --- a/apps/assets/automations/gather_facts/host/windows/manifest.yml +++ b/apps/assets/automations/gather_facts/host/windows/manifest.yml @@ -2,9 +2,12 @@ id: gather_facts_windows name: "{{ 'Gather facts windows' | trans }}" version: 1 method: gather_facts -category: host +category: + - host + - ds type: - windows + - windows_ad i18n: Gather facts windows: zh: '使用 Ansible 指令 gather_facts 从 Windows 获取设备信息' diff --git a/apps/assets/automations/ping/custom/rdp/manifest.yml b/apps/assets/automations/ping/custom/rdp/manifest.yml index ad499b90e..07dbbdc21 100644 --- a/apps/assets/automations/ping/custom/rdp/manifest.yml +++ b/apps/assets/automations/ping/custom/rdp/manifest.yml @@ -3,8 +3,10 @@ name: "{{ 'Ping by pyfreerdp' | trans }}" category: - device - host + - ds type: - windows + - windows_ad method: ping protocol: rdp priority: 1 diff --git a/apps/assets/automations/ping/custom/ssh/manifest.yml b/apps/assets/automations/ping/custom/ssh/manifest.yml index c6d08ca12..e50eb9fe6 100644 --- a/apps/assets/automations/ping/custom/ssh/manifest.yml +++ b/apps/assets/automations/ping/custom/ssh/manifest.yml @@ -3,6 +3,7 @@ name: "{{ 'Ping by paramiko' | trans }}" category: - device - host + - ds type: - all method: ping diff --git a/apps/assets/automations/ping/custom/telnet/manifest.yml b/apps/assets/automations/ping/custom/telnet/manifest.yml index fc3a0a40a..2a48c63d5 100644 --- a/apps/assets/automations/ping/custom/telnet/manifest.yml +++ b/apps/assets/automations/ping/custom/telnet/manifest.yml @@ -3,6 +3,7 @@ name: "{{ 'Ping by telnet' | trans }}" category: - device - host + - ds type: - all method: ping diff --git a/apps/assets/automations/ping/host/windows/manifest.yml b/apps/assets/automations/ping/host/windows/manifest.yml index 7c42e03ba..6e53f1e14 100644 --- a/apps/assets/automations/ping/host/windows/manifest.yml +++ b/apps/assets/automations/ping/host/windows/manifest.yml @@ -2,9 +2,12 @@ id: win_ping name: "{{ 'Windows ping' | trans }}" version: 1 method: ping -category: host +category: + - host + - ds type: - windows + - windows_ad i18n: Windows ping: zh: 使用 Ansible 模块 内置模块 win_ping 来测试可连接性 diff --git a/apps/assets/const/base.py b/apps/assets/const/base.py index 425e384f0..7df231eb5 100644 --- a/apps/assets/const/base.py +++ b/apps/assets/const/base.py @@ -112,8 +112,7 @@ class BaseType(TextChoices): @classmethod def get_choices(cls): - if not settings.XPACK_LICENSE_IS_VALID: + choices = cls.choices + if not settings.XPACK_LICENSE_IS_VALID and hasattr(cls, 'get_community_types'): choices = [(tp.value, tp.label) for tp in cls.get_community_types()] - else: - choices = cls.choices return choices diff --git a/apps/assets/const/category.py b/apps/assets/const/category.py index 8c4d387d8..bf109b8ff 100644 --- a/apps/assets/const/category.py +++ b/apps/assets/const/category.py @@ -12,6 +12,7 @@ class Category(ChoicesMixin, models.TextChoices): DATABASE = 'database', _("Database") CLOUD = 'cloud', _("Cloud service") WEB = 'web', _("Web") + DS = 'ds', _("Directory service") CUSTOM = 'custom', _("Custom type") @classmethod diff --git a/apps/assets/const/device.py b/apps/assets/const/device.py index 8860dc3fb..9336d129d 100644 --- a/apps/assets/const/device.py +++ b/apps/assets/const/device.py @@ -20,6 +20,7 @@ class DeviceTypes(BaseType): '*': { 'charset_enabled': False, 'domain_enabled': True, + 'ds_enabled': False, 'su_enabled': True, 'su_methods': ['enable', 'super', 'super_level'] } diff --git a/apps/assets/const/ds.py b/apps/assets/const/ds.py new file mode 100644 index 000000000..c99809646 --- /dev/null +++ b/apps/assets/const/ds.py @@ -0,0 +1,70 @@ +from django.utils.translation import gettext_lazy as _ + +from .base import BaseType + + +class DirectoryTypes(BaseType): + GENERAL = 'general', _('General') + # LDAP = 'ldap', _('LDAP') + # AD = 'ad', _('Active Directory') + WINDOWS_AD = 'windows_ad', _('Windows Active Directory') + + # AZURE_AD = 'azure_ad', _('Azure Active Directory') + + @classmethod + def _get_base_constrains(cls) -> dict: + return { + '*': { + 'charset_enabled': True, + 'domain_enabled': True, + 'ds_enabled': False, + 'su_enabled': True, + }, + cls.WINDOWS_AD: { + 'su_enabled': False, + } + } + + @classmethod + def _get_automation_constrains(cls) -> dict: + constrains = { + '*': { + 'ansible_enabled': False, + }, + cls.WINDOWS_AD: { + 'ansible_enabled': True, + 'ping_enabled': True, + 'gather_facts_enabled': True, + 'verify_account_enabled': True, + 'change_secret_enabled': True, + 'push_account_enabled': True, + 'gather_accounts_enabled': True, + 'remove_account_enabled': True, + } + } + return constrains + + @classmethod + def _get_protocol_constrains(cls) -> dict: + return { + cls.GENERAL: { + 'choices': ['ssh'] + }, + cls.WINDOWS_AD: { + 'choices': ['rdp', 'ssh', 'vnc', 'winrm'] + }, + } + + @classmethod + def internal_platforms(cls): + return { + cls.WINDOWS_AD: [ + {'name': 'Windows Active Directory'} + ], + } + + @classmethod + def get_community_types(cls): + return [ + cls.GENERAL, + ] diff --git a/apps/assets/const/host.py b/apps/assets/const/host.py index 8bd45f257..cd0103f8c 100644 --- a/apps/assets/const/host.py +++ b/apps/assets/const/host.py @@ -20,6 +20,7 @@ class HostTypes(BaseType): 'charset': 'utf-8', # default 'domain_enabled': True, 'su_enabled': True, + 'ds_enabled': True, 'su_methods': ['sudo', 'su', 'only_sudo', 'only_su'], }, cls.WINDOWS: { @@ -56,7 +57,6 @@ class HostTypes(BaseType): 'change_secret_enabled': True, 'push_account_enabled': True, 'remove_account_enabled': True, - }, cls.WINDOWS: { 'ansible_config': { @@ -69,7 +69,6 @@ class HostTypes(BaseType): 'ping_enabled': False, 'gather_facts_enabled': False, 'gather_accounts_enabled': False, - 'verify_account_enabled': False, 'change_secret_enabled': False, 'push_account_enabled': False }, @@ -126,5 +125,5 @@ class HostTypes(BaseType): @classmethod def get_community_types(cls) -> list: return [ - cls.LINUX, cls.UNIX, cls.WINDOWS, cls.OTHER_HOST + cls.LINUX, cls.WINDOWS, cls.UNIX, cls.OTHER_HOST ] diff --git a/apps/assets/const/types.py b/apps/assets/const/types.py index 1906231c6..dfa8ba399 100644 --- a/apps/assets/const/types.py +++ b/apps/assets/const/types.py @@ -13,6 +13,7 @@ from .cloud import CloudTypes from .custom import CustomTypes from .database import DatabaseTypes from .device import DeviceTypes +from .ds import DirectoryTypes from .gpt import GPTTypes from .host import HostTypes from .web import WebTypes @@ -22,7 +23,8 @@ class AllTypes(ChoicesMixin): choices: list includes = [ HostTypes, DeviceTypes, DatabaseTypes, - CloudTypes, WebTypes, CustomTypes, GPTTypes + CloudTypes, WebTypes, CustomTypes, + DirectoryTypes, GPTTypes ] _category_constrains = {} _automation_methods = None @@ -173,6 +175,7 @@ class AllTypes(ChoicesMixin): (Category.DATABASE, DatabaseTypes), (Category.WEB, WebTypes), (Category.CLOUD, CloudTypes), + (Category.DS, DirectoryTypes), (Category.CUSTOM, CustomTypes) ] return types diff --git a/apps/assets/migrations/0016_directory_service.py b/apps/assets/migrations/0016_directory_service.py new file mode 100644 index 000000000..39de22fff --- /dev/null +++ b/apps/assets/migrations/0016_directory_service.py @@ -0,0 +1,57 @@ +# Generated by Django 4.1.13 on 2025-04-03 09:51 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("assets", "0015_automationexecution_type"), + ] + + operations = [ + migrations.CreateModel( + name="DirectoryService", + fields=[ + ( + "asset_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="assets.asset", + ), + ), + ( + "domain_name", + models.CharField( + blank=True, + default="", + max_length=128, + verbose_name="Domain name", + ), + ), + ], + options={ + "verbose_name": "Directory service", + "default_related_name": "ds" + }, + bases=("assets.asset",), + ), + migrations.AddField( + model_name="platform", + name="ds_enabled", + field=models.BooleanField(default=False, verbose_name="DS enabled"), + ), + migrations.AddField( + model_name="asset", + name="directory_services", + field=models.ManyToManyField( + related_name="assets", + to="assets.directoryservice", + verbose_name="Directory services", + ), + ), + ] diff --git a/apps/assets/migrations/0017_auto_20250407_1124.py b/apps/assets/migrations/0017_auto_20250407_1124.py new file mode 100644 index 000000000..5da3c21d4 --- /dev/null +++ b/apps/assets/migrations/0017_auto_20250407_1124.py @@ -0,0 +1,165 @@ +# Generated by Django 4.1.13 on 2025-04-07 03:24 + +import json + +from django.db import migrations + +from assets.const import AllTypes + + +def add_ds_platforms(apps, schema_editor): + data = """ +[ + { + "created_by": "system", + "updated_by": "system", + "comment": "", + "name": "WindowsActiveDirectory", + "category": "ds", + "type": "windows_ad", + "meta": {}, + "internal": true, + "domain_enabled": true, + "su_enabled": false, + "su_method": null, + "custom_fields": [], + "automation": { + "ansible_enabled": true, + "ansible_config": { + "ansible_shell_type": "cmd", + "ansible_connection": "ssh" + }, + "ping_enabled": true, + "ping_method": "ping_by_rdp", + "ping_params": {}, + "gather_facts_enabled": true, + "gather_facts_method": "gather_facts_windows", + "gather_facts_params": {}, + "change_secret_enabled": true, + "change_secret_method": "change_secret_ad_windows", + "change_secret_params": { + }, + "push_account_enabled": true, + "push_account_method": "push_account_ad_windows", + "push_account_params": {}, + "verify_account_enabled": true, + "verify_account_method": "verify_account_by_rdp", + "verify_account_params": { + + }, + "gather_accounts_enabled": true, + "gather_accounts_method": "gather_accounts_windows_ad", + "gather_accounts_params": { + + }, + "remove_account_enabled": true, + "remove_account_method": "remove_account_ad_windows", + "remove_account_params": { + + } + }, + "protocols": [ + { + "name": "rdp", + "port": 3389, + "primary": true, + "required": false, + "default": false, + "public": true, + "setting": { + "console": false, + "security": "any" + } + }, + { + "name": "ssh", + "port": 22, + "primary": false, + "required": false, + "default": false, + "public": true, + "setting": { + "sftp_enabled": true, + "sftp_home": "/tmp" + } + }, + { + "name": "vnc", + "port": 5900, + "primary": false, + "required": false, + "default": false, + "public": true, + "setting": { + + } + }, + { + "name": "winrm", + "port": 5985, + "primary": false, + "required": false, + "default": false, + "public": false, + "setting": { + "use_ssl": false + } + } + ] + }, + { + "created_by": "system", + "updated_by": "system", + "comment": "", + "name": "General", + "category": "ds", + "type": "general", + "meta": { + }, + "internal": true, + "domain_enabled": false, + "su_enabled": false, + "su_method": null, + "custom_fields": [ + ], + "automation": { + "ansible_enabled": false, + "ansible_config": { + } + }, + "protocols": [ + { + "name": "ssh", + "port": 22, + "primary": true, + "required": false, + "default": false, + "public": true, + "setting": { + "sftp_enabled": true, + "sftp_home": "/tmp" + } + } + ] + } +] + """ + platform_model = apps.get_model('assets', 'Platform') + automation_cls = apps.get_model('assets', 'PlatformAutomation') + platform_datas = json.loads(data) + + for platform_data in platform_datas: + AllTypes.create_or_update_by_platform_data( + platform_data, platform_cls=platform_model, + automation_cls=automation_cls + ) + + +class Migration(migrations.Migration): + dependencies = [ + ("assets", "0016_directory_service"), + ] + + operations = [ + migrations.RunPython(add_ds_platforms) + ] diff --git a/apps/assets/models/asset/__init__.py b/apps/assets/models/asset/__init__.py index 7541f2f2e..ef92ed9b4 100644 --- a/apps/assets/models/asset/__init__.py +++ b/apps/assets/models/asset/__init__.py @@ -3,6 +3,7 @@ from .common import * from .custom import * from .database import * from .device import * +from .ds import * from .gpt import * from .host import * from .web import * diff --git a/apps/assets/models/asset/common.py b/apps/assets/models/asset/common.py index 16f9a8751..93e883045 100644 --- a/apps/assets/models/asset/common.py +++ b/apps/assets/models/asset/common.py @@ -6,7 +6,7 @@ import logging from collections import defaultdict from django.db import models -from django.db.models import Q +from django.db.models import Q, Count from django.forms import model_to_dict from django.utils.translation import gettext_lazy as _ @@ -175,6 +175,10 @@ class Asset(NodesRelationMixin, LabeledMixin, AbsConnectivity, JSONFilterMixin, nodes = models.ManyToManyField( 'assets.Node', default=default_node, related_name='assets', verbose_name=_("Nodes") ) + directory_services = models.ManyToManyField( + 'assets.DirectoryService', related_name='assets', + verbose_name=_("Directory service") + ) is_active = models.BooleanField(default=True, verbose_name=_('Active')) gathered_info = models.JSONField(verbose_name=_('Gathered info'), default=dict, blank=True) # 资产的一些信息,如 硬件信息 custom_info = models.JSONField(verbose_name=_('Custom info'), default=dict) @@ -201,6 +205,10 @@ class Asset(NodesRelationMixin, LabeledMixin, AbsConnectivity, JSONFilterMixin, info[i.name] = v return info + @lazyproperty + def is_directory_service(self): + return self.category == const.Category.DS and hasattr(self, 'ds') + @lazyproperty def spec_info(self): instance = getattr(self, self.category, None) @@ -245,9 +253,28 @@ class Asset(NodesRelationMixin, LabeledMixin, AbsConnectivity, JSONFilterMixin, auto_config.update(model_to_dict(automation)) return auto_config + @property + def all_accounts(self): + if not self.joined_dir_svcs: + queryset = self.accounts.all() + else: + queryset = self.accounts.model.objects.filter(asset__in=[self.id, *self.joined_dir_svcs]) + return queryset + + @property + def dc_accounts(self): + queryset = self.accounts.model.objects.filter(asset__in=[*self.joined_dir_svcs]) + return queryset + + @lazyproperty + def all_valid_accounts(self): + queryset = (self.all_accounts.filter(is_active=True) + .prefetch_related('asset', 'asset__platform')) + return queryset + @lazyproperty def accounts_amount(self): - return self.accounts.count() + return self.all_accounts.count() def get_target_ip(self): return self.address @@ -259,6 +286,41 @@ class Asset(NodesRelationMixin, LabeledMixin, AbsConnectivity, JSONFilterMixin, protocol = self.protocols.all().filter(name=protocol).first() return protocol.port if protocol else 0 + def is_dir_svc(self): + return self.category == const.Category.DS + + @property + def joined_dir_svcs(self): + return self.directory_services.all() + + @classmethod + def compute_all_accounts_amount(cls, assets): + from .ds import DirectoryService + asset_ids = [asset.id for asset in assets] + asset_id_dc_ids_mapper = defaultdict(list) + dc_ids = set() + + asset_dc_relations = ( + Asset.directory_services.through.objects + .filter(asset_id__in=asset_ids) + .values_list('asset_id', 'directoryservice_id') + ) + for asset_id, ds_id in asset_dc_relations: + dc_ids.add(ds_id) + asset_id_dc_ids_mapper[asset_id].append(ds_id) + + directory_services = ( + DirectoryService.objects.filter(id__in=dc_ids) + .annotate(accounts_amount=Count('accounts')) + ) + ds_accounts_amount_mapper = {ds.id: ds.accounts_amount for ds in directory_services} + for asset in assets: + asset_dc_ids = asset_id_dc_ids_mapper.get(asset.id, []) + for dc_id in asset_dc_ids: + ds_accounts = ds_accounts_amount_mapper.get(dc_id, 0) + asset.accounts_amount += ds_accounts + return assets + @property def is_valid(self): warning = '' diff --git a/apps/assets/models/asset/ds.py b/apps/assets/models/asset/ds.py new file mode 100644 index 000000000..44c7e841a --- /dev/null +++ b/apps/assets/models/asset/ds.py @@ -0,0 +1,14 @@ +from django.db import models +from django.utils.translation import gettext_lazy as _ + +from .common import Asset + +__all__ = ['DirectoryService'] + + +class DirectoryService(Asset): + domain_name = models.CharField(max_length=128, blank=True, default='', verbose_name=_("Domain name")) + + class Meta: + default_related_name = "ds" + verbose_name = _("Directory service") diff --git a/apps/assets/models/platform.py b/apps/assets/models/platform.py index 354914834..ed7816afa 100644 --- a/apps/assets/models/platform.py +++ b/apps/assets/models/platform.py @@ -102,6 +102,7 @@ class Platform(LabeledMixin, JMSBaseModel): max_length=8, verbose_name=_("Charset") ) domain_enabled = models.BooleanField(default=True, verbose_name=_("Gateway enabled")) + ds_enabled = models.BooleanField(default=False, verbose_name=_("DS enabled")) # 账号有关的 su_enabled = models.BooleanField(default=False, verbose_name=_("Su enabled")) su_method = models.CharField(max_length=32, blank=True, null=True, verbose_name=_("Su method")) @@ -115,6 +116,11 @@ class Platform(LabeledMixin, JMSBaseModel): def assets_amount(self): return self.assets.count() + def save(self, *args, **kwargs): + if not self.ds_enabled: + self.ds = None + super().save(*args, **kwargs) + @classmethod def default(cls): linux, created = cls.objects.get_or_create( diff --git a/apps/assets/serializers/asset/__init__.py b/apps/assets/serializers/asset/__init__.py index 481e90863..c07cee68f 100644 --- a/apps/assets/serializers/asset/__init__.py +++ b/apps/assets/serializers/asset/__init__.py @@ -4,6 +4,7 @@ from .common import * from .custom import * from .database import * from .device import * +from .ds import * from .gpt import * from .host import * from .web import * diff --git a/apps/assets/serializers/asset/common.py b/apps/assets/serializers/asset/common.py index 05a03fb0e..b61e2e286 100644 --- a/apps/assets/serializers/asset/common.py +++ b/apps/assets/serializers/asset/common.py @@ -147,7 +147,8 @@ class AssetSerializer(BulkOrgResourceModelSerializer, ResourceLabelsMixin, Writa 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 = NodeDisplaySerializer(read_only=False, required=False, label=_("Node path")) - platform = ObjectRelatedField(queryset=Platform.objects, required=True, label=_('Platform'), attrs=('id', 'name', 'type')) + platform = ObjectRelatedField(queryset=Platform.objects, required=True, label=_('Platform'), + attrs=('id', 'name', 'type')) accounts_amount = serializers.IntegerField(read_only=True, label=_('Accounts amount')) _accounts = None @@ -159,6 +160,7 @@ class AssetSerializer(BulkOrgResourceModelSerializer, ResourceLabelsMixin, Writa fields_m2m = [ 'nodes', 'labels', 'protocols', 'nodes_display', 'accounts', + 'directory_services', ] read_only_fields = [ 'accounts_amount', 'category', 'type', 'connectivity', 'auto_config', @@ -172,6 +174,11 @@ class AssetSerializer(BulkOrgResourceModelSerializer, ResourceLabelsMixin, Writa 'address': {'label': _('Address')}, 'nodes_display': {'label': _('Node path')}, 'nodes': {'allow_empty': True, 'label': _("Nodes")}, + 'directory_services': { + 'required': False, + 'allow_empty': True, + 'default': list, 'label': _("Directory service") + }, } def __init__(self, *args, **kwargs): @@ -226,15 +233,11 @@ class AssetSerializer(BulkOrgResourceModelSerializer, ResourceLabelsMixin, Writa @classmethod def setup_eager_loading(cls, queryset): """ Perform necessary eager loading of data. """ - queryset = queryset.prefetch_related('domain', 'nodes', 'protocols', ) \ + queryset = queryset.prefetch_related('domain', 'nodes', 'protocols', 'directory_services') \ .prefetch_related('platform', 'platform__automation') \ .annotate(category=F("platform__category")) \ .annotate(type=F("platform__type")) \ .annotate(accounts_amount=Count('accounts')) - if queryset.model is Asset: - queryset = queryset.prefetch_related('labels__label', 'labels') - else: - queryset = queryset.prefetch_related('asset_ptr__labels__label', 'asset_ptr__labels') return queryset @staticmethod diff --git a/apps/assets/serializers/asset/ds.py b/apps/assets/serializers/asset/ds.py new file mode 100644 index 000000000..dd9df377f --- /dev/null +++ b/apps/assets/serializers/asset/ds.py @@ -0,0 +1,22 @@ +from django.utils.translation import gettext_lazy as _ + +from assets.models import DirectoryService +from .common import AssetSerializer + +__all__ = ['DSSerializer'] + + +class DSSerializer(AssetSerializer): + class Meta(AssetSerializer.Meta): + model = DirectoryService + fields = AssetSerializer.Meta.fields + [ + 'domain_name', + ] + extra_kwargs = { + **AssetSerializer.Meta.extra_kwargs, + 'domain_name': { + 'help_text': _('The domain part used by the directory service (e.g., AD) and appended to ' + 'the username during login, such as example.com in user@example.com.'), + 'label': _('Domain name') + } + } diff --git a/apps/assets/serializers/asset/info/gathered.py b/apps/assets/serializers/asset/info/gathered.py index db0f22e65..71722c072 100644 --- a/apps/assets/serializers/asset/info/gathered.py +++ b/apps/assets/serializers/asset/info/gathered.py @@ -20,4 +20,5 @@ class HostGatheredInfoSerializer(serializers.Serializer): category_gathered_serializer_map = { 'host': HostGatheredInfoSerializer, + 'ds': HostGatheredInfoSerializer, } diff --git a/apps/assets/serializers/asset/info/spec.py b/apps/assets/serializers/asset/info/spec.py index a7aae17f4..f603fb7af 100644 --- a/apps/assets/serializers/asset/info/spec.py +++ b/apps/assets/serializers/asset/info/spec.py @@ -2,7 +2,7 @@ from django.utils.translation import gettext_lazy as _ from rest_framework import serializers from assets.const import FillType -from assets.models import Database, Web +from assets.models import Database, Web, DirectoryService from common.serializers.fields import LabeledChoiceField @@ -28,7 +28,7 @@ class WebSpecSerializer(serializers.ModelSerializer): # 查看 Web 资产详情时 self.pop_fields_if_need(fields) return fields - + def is_retrieve(self): try: self.context.get('request').method and self.parent.instance.web @@ -51,9 +51,14 @@ class WebSpecSerializer(serializers.ModelSerializer): return fields +class DsSpecSerializer(serializers.ModelSerializer): + class Meta: + model = DirectoryService + fields = ['domain_name'] category_spec_serializer_map = { 'database': DatabaseSpecSerializer, 'web': WebSpecSerializer, + 'ds': DsSpecSerializer, } diff --git a/apps/assets/serializers/domain.py b/apps/assets/serializers/domain.py index 5bbb1c8bc..9181db18c 100644 --- a/apps/assets/serializers/domain.py +++ b/apps/assets/serializers/domain.py @@ -4,12 +4,11 @@ from django.db.models import Count, Q from django.utils.translation import gettext_lazy as _ from rest_framework import serializers -from assets.models.gateway import Gateway from common.serializers import ResourceLabelsMixin from common.serializers.fields import ObjectRelatedField from orgs.mixins.serializers import BulkOrgResourceModelSerializer from .gateway import GatewayWithAccountSecretSerializer -from ..models import Domain +from ..models import Domain, Gateway __all__ = ['DomainSerializer', 'DomainWithGatewaySerializer', 'DomainListSerializer'] @@ -55,11 +54,6 @@ class DomainSerializer(ResourceLabelsMixin, BulkOrgResourceModelSerializer): validated_data['assets'] = assets + gateways return super().update(instance, validated_data) - @classmethod - def setup_eager_loading(cls, queryset): - queryset = queryset.prefetch_related('labels', 'labels__label') - return queryset - class DomainListSerializer(DomainSerializer): class Meta(DomainSerializer.Meta): diff --git a/apps/assets/serializers/platform.py b/apps/assets/serializers/platform.py index 2d25f2fe3..ebe28ca2a 100644 --- a/apps/assets/serializers/platform.py +++ b/apps/assets/serializers/platform.py @@ -195,7 +195,7 @@ class PlatformSerializer(ResourceLabelsMixin, CommonSerializerMixin, WritableNes fields_m2m = ['assets', 'assets_amount'] fields = fields_small + fields_m2m + [ "protocols", "domain_enabled", "su_enabled", "su_method", - "automation", "comment", "custom_fields", "labels" + "ds_enabled", "automation", "comment", "custom_fields", "labels" ] + read_only_fields extra_kwargs = { "su_enabled": { @@ -220,6 +220,11 @@ class PlatformSerializer(ResourceLabelsMixin, CommonSerializerMixin, WritableNes def set_initial_value(self): if not hasattr(self, 'initial_data'): return + + name = self.initial_data.get('name') + if ' ' in name: + self.initial_data['name'] = name.replace(' ', '-') + if self.instance: return if not self.initial_data.get('automation'): diff --git a/apps/assets/urls/api_urls.py b/apps/assets/urls/api_urls.py index d19d761b3..0ff108802 100644 --- a/apps/assets/urls/api_urls.py +++ b/apps/assets/urls/api_urls.py @@ -16,6 +16,7 @@ router.register(r'databases', api.DatabaseViewSet, 'database') router.register(r'webs', api.WebViewSet, 'web') router.register(r'clouds', api.CloudViewSet, 'cloud') router.register(r'gpts', api.GPTViewSet, 'gpt') +router.register(r'directories', api.DSViewSet, 'ds') router.register(r'customs', api.CustomViewSet, 'custom') router.register(r'platforms', api.AssetPlatformViewSet, 'platform') router.register(r'nodes', api.NodeViewSet, 'node') diff --git a/apps/audits/api.py b/apps/audits/api.py index 67836b635..82774f512 100644 --- a/apps/audits/api.py +++ b/apps/audits/api.py @@ -64,8 +64,8 @@ class JobLogAuditViewSet(OrgReadonlyModelViewSet): class JobsAuditViewSet(OrgModelViewSet): model = Job - search_fields = ['creator__name'] - filterset_fields = ['creator__name'] + search_fields = ['creator__name', 'args', 'name'] + filterset_fields = ['creator__name', 'args', 'name'] serializer_class = JobsAuditSerializer ordering = ['-is_periodic', '-date_updated'] http_method_names = ['get', 'options', 'patch'] @@ -257,10 +257,18 @@ class OperateLogViewSet(OrgReadonlyModelViewSet): return super().get_serializer_class() def get_queryset(self): - qs = OperateLog.objects.all() - if self.is_action_detail: - with tmp_to_root_org(): - qs |= OperateLog.objects.filter(org_id=Organization.SYSTEM_ID) + current_org_id = str(current_org.id) + + with tmp_to_root_org(): + qs = OperateLog.objects.all() + if current_org_id != Organization.ROOT_ID: + filtered_org_ids = {current_org_id} + if current_org_id == Organization.DEFAULT_ID: + filtered_org_ids.update(Organization.INTERNAL_IDS) + if self.is_action_detail: + filtered_org_ids.add(Organization.SYSTEM_ID) + qs = OperateLog.objects.filter(org_id__in=filtered_org_ids) + es_config = settings.OPERATE_LOG_ELASTICSEARCH_CONFIG if es_config: engine_mod = import_module(TYPE_ENGINE_MAPPING['es']) diff --git a/apps/audits/const.py b/apps/audits/const.py index 43396148f..65db58476 100644 --- a/apps/audits/const.py +++ b/apps/audits/const.py @@ -24,6 +24,7 @@ class ActionChoices(TextChoices): update = "update", _("Update") delete = "delete", _("Delete") create = "create", _("Create") + export = "export", _("Export") # Activities action download = "download", _("Download") connect = "connect", _("Connect") diff --git a/apps/audits/migrations/0001_initial.py b/apps/audits/migrations/0001_initial.py index 749a3a877..d2e3d20fd 100644 --- a/apps/audits/migrations/0001_initial.py +++ b/apps/audits/migrations/0001_initial.py @@ -9,7 +9,6 @@ import common.db.encoder class Migration(migrations.Migration): - initial = True dependencies = [ @@ -19,10 +18,14 @@ class Migration(migrations.Migration): migrations.CreateModel( name='ActivityLog', fields=[ - ('org_id', models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')), + ('org_id', + models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')), ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), - ('type', models.CharField(choices=[('O', 'Operate log'), ('S', 'Session log'), ('L', 'Login log'), ('T', 'Task')], default=None, max_length=2, null=True, verbose_name='Activity type')), - ('resource_id', models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Resource')), + ('type', models.CharField( + choices=[('O', 'Operate log'), ('S', 'Session log'), ('L', 'Login log'), ('T', 'Task')], + default=None, max_length=2, null=True, verbose_name='Activity type')), + ('resource_id', + models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Resource')), ('datetime', models.DateTimeField(auto_now=True, db_index=True, verbose_name='Datetime')), ('detail', models.TextField(blank=True, default='', verbose_name='Detail')), ('detail_id', models.CharField(default=None, max_length=36, null=True, verbose_name='Detail ID')), @@ -35,13 +38,17 @@ class Migration(migrations.Migration): migrations.CreateModel( name='FTPLog', fields=[ - ('org_id', models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')), + ('org_id', + models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')), ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), ('user', models.CharField(max_length=128, verbose_name='User')), ('remote_addr', models.CharField(blank=True, max_length=128, null=True, verbose_name='Remote addr')), ('asset', models.CharField(max_length=1024, verbose_name='Asset')), ('account', models.CharField(max_length=128, verbose_name='Account')), - ('operate', models.CharField(choices=[('mkdir', 'Mkdir'), ('rmdir', 'Rmdir'), ('delete', 'Delete'), ('upload', 'Upload'), ('rename', 'Rename'), ('symlink', 'Symlink'), ('download', 'Download'), ('rename_dir', 'Rename dir')], max_length=16, verbose_name='Operate')), + ('operate', models.CharField( + choices=[('mkdir', 'Mkdir'), ('rmdir', 'Rmdir'), ('delete', 'Delete'), ('upload', 'Upload'), + ('rename', 'Rename'), ('symlink', 'Symlink'), ('download', 'Download'), + ('rename_dir', 'Rename dir')], max_length=16, verbose_name='Operate')), ('filename', models.CharField(max_length=1024, verbose_name='Filename')), ('is_success', models.BooleanField(default=True, verbose_name='Success')), ('date_start', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='Date start')), @@ -55,13 +62,32 @@ class Migration(migrations.Migration): migrations.CreateModel( name='OperateLog', fields=[ - ('org_id', models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')), + ('org_id', + models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')), ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), ('user', models.CharField(max_length=128, verbose_name='User')), - ('action', models.CharField(choices=[('view', 'View'), ('update', 'Update'), ('delete', 'Delete'), ('create', 'Create'), ('download', 'Download'), ('connect', 'Connect'), ('login', 'Login'), ('change_password', 'Change password'), ('accept', 'Accept'), ('review', 'Review'), ('notice', 'Notifications'), ('reject', 'Reject'), ('approve', 'Approve'), ('close', 'Close'), ('finished', 'Finished')], max_length=16, verbose_name='Action')), + ('action', models.CharField(choices=[ + ("view", "View"), + ("update", "Update"), + ("delete", "Delete"), + ("create", "Create"), + ("export", "Export"), + ("download", "Download"), + ("connect", "Connect"), + ("login", "Login"), + ("change_password", "Change password"), + ("accept", "Accept"), + ("review", "Review"), + ("notice", "Notifications"), + ("reject", "Reject"), + ("approve", "Approve"), + ("close", "Close"), + ("finished", "Finished"), + ], max_length=16, verbose_name='Action')), ('resource_type', models.CharField(max_length=64, verbose_name='Resource Type')), ('resource', models.CharField(max_length=128, verbose_name='Resource')), - ('resource_id', models.CharField(blank=True, db_index=True, default='', max_length=128, verbose_name='Resource')), + ('resource_id', + models.CharField(blank=True, db_index=True, default='', max_length=128, verbose_name='Resource')), ('remote_addr', models.CharField(blank=True, max_length=128, null=True, verbose_name='Remote addr')), ('datetime', models.DateTimeField(auto_now=True, db_index=True, verbose_name='Datetime')), ('diff', models.JSONField(default=dict, encoder=common.db.encoder.ModelJSONFieldEncoder, null=True)), @@ -89,14 +115,18 @@ class Migration(migrations.Migration): fields=[ ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), ('username', models.CharField(max_length=128, verbose_name='Username')), - ('type', models.CharField(choices=[('W', 'Web'), ('T', 'Terminal'), ('U', 'Unknown')], max_length=2, verbose_name='Login type')), + ('type', models.CharField(choices=[('W', 'Web'), ('T', 'Terminal'), ('U', 'Unknown')], max_length=2, + verbose_name='Login type')), ('ip', models.GenericIPAddressField(verbose_name='Login IP')), ('city', models.CharField(blank=True, max_length=254, null=True, verbose_name='Login city')), ('user_agent', models.CharField(blank=True, max_length=254, null=True, verbose_name='User agent')), - ('mfa', models.SmallIntegerField(choices=[(0, 'Disabled'), (1, 'Enabled'), (2, '-')], default=2, verbose_name='MFA')), + ('mfa', models.SmallIntegerField(choices=[(0, 'Disabled'), (1, 'Enabled'), (2, '-')], default=2, + verbose_name='MFA')), ('reason', models.CharField(blank=True, default='', max_length=128, verbose_name='Reason')), - ('status', models.BooleanField(choices=[(1, 'Success'), (0, 'Failed')], default=1, verbose_name='Status')), - ('datetime', models.DateTimeField(db_index=True, default=django.utils.timezone.now, verbose_name='Login Date')), + ('status', + models.BooleanField(choices=[(1, 'Success'), (0, 'Failed')], default=1, verbose_name='Status')), + ('datetime', + models.DateTimeField(db_index=True, default=django.utils.timezone.now, verbose_name='Login Date')), ('backend', models.CharField(default='', max_length=32, verbose_name='Auth backend')), ], options={ @@ -112,7 +142,8 @@ class Migration(migrations.Migration): ('key', models.CharField(max_length=128, verbose_name='Session key')), ('city', models.CharField(blank=True, max_length=254, null=True, verbose_name='Login city')), ('user_agent', models.CharField(blank=True, max_length=254, null=True, verbose_name='User agent')), - ('type', models.CharField(choices=[('W', 'Web'), ('T', 'Terminal'), ('U', 'Unknown')], max_length=2, verbose_name='Login type')), + ('type', models.CharField(choices=[('W', 'Web'), ('T', 'Terminal'), ('U', 'Unknown')], max_length=2, + verbose_name='Login type')), ('backend', models.CharField(default='', max_length=32, verbose_name='Auth backend')), ('date_created', models.DateTimeField(blank=True, null=True, verbose_name='Login date')), ], diff --git a/apps/audits/serializers.py b/apps/audits/serializers.py index 631c54c3c..a0f42e9c0 100644 --- a/apps/audits/serializers.py +++ b/apps/audits/serializers.py @@ -35,14 +35,13 @@ class JobLogSerializer(JobExecutionSerializer): class JobsAuditSerializer(JobSerializer): - material = serializers.ReadOnlyField(label=_("Command")) summary = serializers.ReadOnlyField(label=_("Summary")) crontab = serializers.ReadOnlyField(label=_("Execution cycle")) is_periodic_display = serializers.BooleanField(read_only=True, source='is_periodic') class Meta(JobSerializer.Meta): read_only_fields = [ - "id", 'name', 'args', 'material', 'type', 'crontab', 'interval', 'date_last_run', 'summary', 'created_by', + "id", 'name', 'args', 'type', 'crontab', 'interval', 'date_last_run', 'summary', 'created_by', 'is_periodic_display' ] fields = read_only_fields + ['is_periodic'] @@ -189,6 +188,9 @@ class ActivityUnionLogSerializer(serializers.Serializer): class FileSerializer(serializers.Serializer): file = serializers.FileField(allow_empty_file=True) + class Meta: + ref_name = 'AuditFileSerializer' + class UserSessionSerializer(serializers.ModelSerializer): type = LabeledChoiceField(choices=LoginTypeChoices.choices, label=_("Type")) diff --git a/apps/audits/utils.py b/apps/audits/utils.py index 0e8361a0f..4d743da60 100644 --- a/apps/audits/utils.py +++ b/apps/audits/utils.py @@ -6,12 +6,16 @@ from django.core.exceptions import ObjectDoesNotExist from django.db import models from django.db.models import F, Value, CharField from django.db.models.functions import Concat +from django.utils import translation from itertools import chain from common.db.fields import RelatedManager from common.utils import validate_ip, get_ip_city, get_logger from common.utils.timezone import as_current_tz -from .const import DEFAULT_CITY +from .const import DEFAULT_CITY, ActivityChoices as LogChoice +from .handler import create_or_update_operate_log +from .models import ActivityLog + logger = get_logger(__name__) @@ -140,3 +144,15 @@ def construct_userlogin_usernames(user_queryset): ).values_list("usernames_combined_field", flat=True) usernames = list(chain(usernames_original, usernames_combined)) return usernames + + +def record_operate_log_and_activity_log(ids, action, detail, model, **kwargs): + from orgs.utils import current_org + + org_id = current_org.id + with translation.override('en'): + resource_type = model._meta.verbose_name + create_or_update_operate_log(action, resource_type, force=True, **kwargs) + base_data = {'type': LogChoice.operate_log, 'detail': detail, 'org_id': org_id} + activities = [ActivityLog(resource_id=r_id, **base_data) for r_id in ids] + ActivityLog.objects.bulk_create(activities) diff --git a/apps/authentication/api/connection_token.py b/apps/authentication/api/connection_token.py index 6203180f3..ee726c45d 100644 --- a/apps/authentication/api/connection_token.py +++ b/apps/authentication/api/connection_token.py @@ -35,7 +35,8 @@ from ..models import ConnectionToken, AdminConnectionToken, date_expired_default from ..serializers import ( ConnectionTokenSerializer, ConnectionTokenSecretSerializer, SuperConnectionTokenSerializer, ConnectTokenAppletOptionSerializer, - ConnectionTokenReusableSerializer, ConnectTokenVirtualAppOptionSerializer + ConnectionTokenReusableSerializer, ConnectTokenVirtualAppOptionSerializer, + AdminConnectionTokenSerializer, ) __all__ = ['ConnectionTokenViewSet', 'SuperConnectionTokenViewSet', 'AdminConnectionTokenViewSet'] @@ -407,22 +408,22 @@ class ConnectionTokenViewSet(AuthFaceMixin, ExtraActionApiMixin, RootOrgViewMixi def validate_exchange_token(self, token): user = token.user asset = token.asset - account_name = token.account - _data = self._validate(user, asset, account_name, token.protocol, token.connect_method) + account_alias = token.account + _data = self._validate(user, asset, account_alias, token.protocol, token.connect_method) for k, v in _data.items(): setattr(token, k, v) return token - def _validate(self, user, asset, account_name, protocol, connect_method): + def _validate(self, user, asset, account_alias, protocol, connect_method): data = dict() data['org_id'] = asset.org_id data['user'] = user data['value'] = random_string(16) - if account_name == AliasAccount.ANON and asset.category not in ['web', 'custom']: + if account_alias == AliasAccount.ANON and asset.category not in ['web', 'custom']: raise ValidationError(_('Anonymous account is not supported for this asset')) - account = self._validate_perm(user, asset, account_name, protocol) + account = self._validate_perm(user, asset, account_alias, protocol) if account.has_secret: data['input_secret'] = '' @@ -436,18 +437,16 @@ class ConnectionTokenViewSet(AuthFaceMixin, ExtraActionApiMixin, RootOrgViewMixi if ticket or self.need_face_verify: data['is_active'] = False if self.face_monitor_token: - FaceMonitorContext.get_or_create_context(self.face_monitor_token, - self.request.user.id) + FaceMonitorContext.get_or_create_context(self.face_monitor_token, self.request.user.id) data['face_monitor_token'] = self.face_monitor_token return data @staticmethod - def get_permed_account(user, asset, account_name, protocol): - from perms.utils.asset_perm import PermAssetDetailUtil - return PermAssetDetailUtil(user, asset).validate_permission(account_name, protocol) + def get_permed_account(user, asset, account_alias, protocol): + return ConnectionToken.get_user_permed_account(user, asset, account_alias, protocol) - def _validate_perm(self, user, asset, account_name, protocol): - account = self.get_permed_account(user, asset, account_name, protocol) + def _validate_perm(self, user, asset, account_alias, protocol): + account = self.get_permed_account(user, asset, account_alias, protocol) if not account or not account.actions: msg = _('Account not found') raise JMSException(code='perm_account_invalid', detail=msg) @@ -617,7 +616,7 @@ class SuperConnectionTokenViewSet(ConnectionTokenViewSet): raise PermissionDenied('Not allow to view secret') token_id = request.data.get('id') or '' - token = get_object_or_404(ConnectionToken, pk=token_id) + token = ConnectionToken.get_typed_connection_token(token_id) token.is_valid() serializer = self.get_serializer(instance=token) @@ -670,6 +669,9 @@ class SuperConnectionTokenViewSet(ConnectionTokenViewSet): class AdminConnectionTokenViewSet(ConnectionTokenViewSet): + serializer_classes = { + 'default': AdminConnectionTokenSerializer, + } def check_permissions(self, request): user = request.user @@ -677,11 +679,7 @@ class AdminConnectionTokenViewSet(ConnectionTokenViewSet): self.permission_denied(request) def get_queryset(self): - return AdminConnectionToken.objects.all() + return AdminConnectionToken.objects.all().filter(user=self.request.user) def get_permed_account(self, user, asset, account_name, protocol): - with tmp_to_org(asset.org): - account = asset.accounts.all().active().get(name=account_name) - account.actions = ActionChoices.all() - account.date_expired = timezone.now() + timezone.timedelta(days=365) - return account + return AdminConnectionToken.get_user_permed_account(user, asset, account_name, protocol) diff --git a/apps/authentication/backends/saml2/views.py b/apps/authentication/backends/saml2/views.py index 3cc2e3c0f..ffc5d4dbf 100644 --- a/apps/authentication/backends/saml2/views.py +++ b/apps/authentication/backends/saml2/views.py @@ -136,7 +136,7 @@ class PrepareRequestMixin: "en": { "name": "JumpServer", "displayname": "JumpServer", - "url": "https://jumpserver.org/" + "url": "https://jumpserver.com/" } }, } diff --git a/apps/authentication/backends/test/test_drf.py b/apps/authentication/backends/test/test_drf.py new file mode 100644 index 000000000..4e55b846d --- /dev/null +++ b/apps/authentication/backends/test/test_drf.py @@ -0,0 +1,30 @@ +import os +import requests +from httpsig.requests_auth import HTTPSignatureAuth +import datetime + + +def test_drf_ak(): + KEY_ID = os.environ.get('KEY_ID') or '' + SECRET = os.environ.get('KEY_SECRET') or '' + + signature_headers = ['(request-target)', 'date'] + now = datetime.datetime.now() + headers = { + 'Host': 'localhost:8000', + 'Accept': 'application/json', + 'Date': now.strftime('%a, %d %b %Y %H:%M:%S GMT'), + } + + # url = 'http://localhost:8080/api/v1/assets/assets/?limit=100' + url = 'http://localhost:8080/api/v1/users/users/?limit=100' + + auth = HTTPSignatureAuth(key_id=KEY_ID, secret=SECRET, + algorithm='hmac-sha256', + headers=signature_headers) + req = requests.get(url, auth=auth, headers=headers) + print(req.content) + + +if __name__ == '__main__': + test_drf_ak() diff --git a/apps/authentication/const.py b/apps/authentication/const.py index 22104cfdc..e95d97b11 100644 --- a/apps/authentication/const.py +++ b/apps/authentication/const.py @@ -31,6 +31,7 @@ class ConfirmType(TextChoices): class MFAType(TextChoices): OTP = 'otp', _('OTP') SMS = 'sms', _('SMS') + Email = 'email', _('Email') Face = 'face', _('Face Recognition') Radius = 'otp_radius', _('Radius') Custom = 'mfa_custom', _('Custom') @@ -48,6 +49,6 @@ class FaceMonitorActionChoices(TextChoices): class ConnectionTokenType(TextChoices): - ADMIN = 'admin', 'Admin' - SUPER = 'super', 'Super' - USER = 'user', 'User' + ADMIN = 'admin', 'Admin' # 管理员 Token, 可以访问所有资源 + SUPER = 'super', 'Super' # 超级 Token, 可以为不同用户生成的 Token, 遵守用户 Token 的限制 + USER = 'user', 'User' # 用户 Token, 只能访问指定资源 diff --git a/apps/authentication/mfa/__init__.py b/apps/authentication/mfa/__init__.py index 3aa3b34a1..57bf61e58 100644 --- a/apps/authentication/mfa/__init__.py +++ b/apps/authentication/mfa/__init__.py @@ -3,3 +3,4 @@ from .face import MFAFace from .otp import MFAOtp, otp_failed_msg from .radius import MFARadius from .sms import MFASms +from .email import MFAEmail diff --git a/apps/authentication/mfa/email.py b/apps/authentication/mfa/email.py new file mode 100644 index 000000000..dcd834267 --- /dev/null +++ b/apps/authentication/mfa/email.py @@ -0,0 +1,73 @@ +from django.conf import settings +from django.template.loader import render_to_string +from django.utils.translation import gettext_lazy as _ + +from common.utils import random_string +from common.utils.verify_code import SendAndVerifyCodeUtil +from settings.utils import get_login_title +from .base import BaseMFA +from ..const import MFAType + +email_failed_msg = _("Email verify code invalid") + + +class MFAEmail(BaseMFA): + name = MFAType.Email.value + display_name = MFAType.Email.name + placeholder = _('Email verification code') + + def _check_code(self, code): + assert self.is_authenticated() + sender_util = SendAndVerifyCodeUtil(self.user.email, backend=self.name) + ok = False + msg = '' + try: + ok = sender_util.verify(code) + except Exception as e: + msg = str(e) + return ok, msg + + def is_active(self): + if not self.is_authenticated(): + return True + return self.user.email + + @staticmethod + def challenge_required(): + return True + + def send_challenge(self): + code = random_string(settings.SMS_CODE_LENGTH, lower=False, upper=False) + subject = '%s: %s' % (get_login_title(), _('MFA code')) + context = { + 'user': self.user, 'title': subject, 'code': code, + } + message = render_to_string('authentication/_msg_mfa_email_code.html', context) + content = {'subject': subject, 'message': message} + sender_util = SendAndVerifyCodeUtil( + self.user.email, code=code, backend=self.name, timeout=60, **content + ) + sender_util.gen_and_send_async() + + @staticmethod + def global_enabled(): + return settings.SECURITY_MFA_BY_EMAIL + + def disable(self): + return '/ui/#/profile/index' + + def get_enable_url(self) -> str: + return '' + + def can_disable(self) -> bool: + return False + + def get_disable_url(self): + return '' + + @staticmethod + def help_text_of_enable(): + return '' + + def help_text_of_disable(self): + return '' diff --git a/apps/authentication/models/connection_token.py b/apps/authentication/models/connection_token.py index bbf4cf990..9c8fe5f6a 100644 --- a/apps/authentication/models/connection_token.py +++ b/apps/authentication/models/connection_token.py @@ -5,6 +5,7 @@ from datetime import timedelta from django.conf import settings from django.core.cache import cache from django.db import models +from django.shortcuts import get_object_or_404 from django.utils import timezone from django.utils.translation import gettext_lazy as _ from rest_framework.exceptions import PermissionDenied @@ -15,7 +16,7 @@ from assets.const.host import GATEWAY_NAME from authentication.const import ConnectionTokenType from common.db.fields import EncryptTextField from common.exceptions import JMSException -from common.utils import lazyproperty, pretty_string, bulk_get +from common.utils import lazyproperty, pretty_string, bulk_get, is_uuid from common.utils.timezone import as_current_tz from orgs.mixins.models import JMSOrgBaseModel from orgs.utils import tmp_to_org @@ -70,9 +71,15 @@ class ConnectionToken(JMSOrgBaseModel): ] verbose_name = _('Connection token') - def save(self, *args, **kwargs): - self.type = self._meta.model._type - return super().save(*args, **kwargs) + @classmethod + def get_typed_connection_token(cls, token_id): + token = get_object_or_404(cls, id=token_id) + + if token.type == ConnectionTokenType.ADMIN.value: + token = AdminConnectionToken.objects.get(id=token_id) + else: + token = ConnectionToken.objects.get(id=token_id) + return token @property def is_expired(self): @@ -87,6 +94,7 @@ class ConnectionToken(JMSOrgBaseModel): return int(seconds) def save(self, *args, **kwargs): + self.type = self._type self.asset_display = pretty_string(self.asset, max_length=128) self.user_display = pretty_string(self.user, max_length=128) return super().save(*args, **kwargs) @@ -112,12 +120,35 @@ class ConnectionToken(JMSOrgBaseModel): self.date_expired = date_expired_default() self.save() + @classmethod + def get_user_permed_account(cls, user, asset, account_alias, protocol): + from perms.utils import PermAssetDetailUtil + permed_account = PermAssetDetailUtil(user, asset) \ + .validate_permission(account_alias, protocol) + return permed_account + + @classmethod + def get_asset_accounts_by_alias(cls, asset, alias): + """ + 获取资产下的账号 + :param alias: 账号别名 + :return: 账号对象 + """ + if is_uuid(alias): + kwargs = {'id': alias} + else: + kwargs = {'name': alias} + + with tmp_to_org(asset.org_id): + account = asset.all_valid_accounts.filter(**kwargs).first() + return account + + def get_permed_account(self): + return self.get_user_permed_account(self.user, self.asset, self.account, self.protocol) + @lazyproperty def permed_account(self): - from perms.utils import PermAssetDetailUtil - permed_account = PermAssetDetailUtil(self.user, self.asset) \ - .validate_permission(self.account, self.protocol) - return permed_account + return self.get_permed_account() @lazyproperty def actions(self): @@ -148,7 +179,8 @@ class ConnectionToken(JMSOrgBaseModel): if timezone.now() - self.date_created < timedelta(seconds=60): return True, None - if not self.permed_account or not self.permed_account.actions: + permed_account = self.get_permed_account() + if not permed_account or not permed_account.actions: msg = 'user `{}` not has asset `{}` permission for login `{}`'.format( self.user, self.asset, self.account ) @@ -191,6 +223,8 @@ class ConnectionToken(JMSOrgBaseModel): 'alternate shell:s': app, 'remoteapplicationcmdline:s': cmdline_b64, 'disableconnectionsharing:i': '1', + 'bitmapcachepersistenable:i': '0', # 图缓存相关设置,便于录像审计 + 'bitmapcachesize:i': '1500', } return options @@ -237,6 +271,21 @@ class ConnectionToken(JMSOrgBaseModel): cache.delete(lock_key) return True + def set_ad_domain_if_need(self, account): + if not self.protocol == 'rdp': + return + if account.ds_domain: + return + + rdp = self.asset.platform.protocols.filter(name='rdp').first() + if not rdp or not rdp.setting: + return + + ad_domain = rdp.setting.get('ad_domain') + if ad_domain: + # serializer account username 用的是 full_username 所以这么设置 + account.ds_domain = ad_domain + @lazyproperty def account_object(self): if not self.asset: @@ -248,9 +297,11 @@ class ConnectionToken(JMSOrgBaseModel): input_secret=self.input_secret, from_permed=False ) else: - account = self.asset.accounts.filter(name=self.account).first() + account = self.get_asset_accounts_by_alias(self.asset, self.account) if not account.secret and self.input_secret: account.secret = self.input_secret + self.set_ad_domain_if_need(account) + return account @lazyproperty @@ -317,4 +368,17 @@ class AdminConnectionToken(ConnectionToken): return (timezone.now() + timezone.timedelta(days=365)).timestamp() def is_valid(self): - return True + return super().is_valid() + + @classmethod + def get_user_permed_account(cls, user, asset, account_alias, protocol): + """ + 管理员 token 可以访问所有资产的账号 + """ + account = cls.get_asset_accounts_by_alias(asset, account_alias) + if not account: + return None + + account.actions = ActionChoices.all() + account.date_expired = timezone.now() + timezone.timedelta(days=5) + return account diff --git a/apps/authentication/serializers/connect_token_secret.py b/apps/authentication/serializers/connect_token_secret.py index 40d6a0352..e38cbea18 100644 --- a/apps/authentication/serializers/connect_token_secret.py +++ b/apps/authentication/serializers/connect_token_secret.py @@ -40,6 +40,7 @@ class _ConnectionTokenAssetSerializer(serializers.ModelSerializer): class _SimpleAccountSerializer(serializers.ModelSerializer): secret_type = LabeledChoiceField(choices=SecretType.choices, required=False, label=_('Secret type')) + username = serializers.CharField(label=_('Username'), source='full_username', read_only=True) class Meta: model = Account @@ -49,6 +50,7 @@ class _SimpleAccountSerializer(serializers.ModelSerializer): class _ConnectionTokenAccountSerializer(serializers.ModelSerializer): su_from = serializers.SerializerMethodField(label=_('Su from')) secret_type = LabeledChoiceField(choices=SecretType.choices, required=False, label=_('Secret type')) + username = serializers.CharField(label=_('Username'), source='full_username', read_only=True) class Meta: model = Account diff --git a/apps/authentication/serializers/connection_token.py b/apps/authentication/serializers/connection_token.py index f519f739e..cb8759fef 100644 --- a/apps/authentication/serializers/connection_token.py +++ b/apps/authentication/serializers/connection_token.py @@ -4,11 +4,11 @@ from rest_framework import serializers from common.serializers import CommonModelSerializer from common.serializers.fields import EncryptedField from perms.serializers.permission import ActionChoicesField -from ..models import ConnectionToken +from ..models import ConnectionToken, AdminConnectionToken __all__ = [ 'ConnectionTokenSerializer', 'SuperConnectionTokenSerializer', - 'ConnectionTokenReusableSerializer', + 'ConnectionTokenReusableSerializer', 'AdminConnectionTokenSerializer', ] @@ -74,3 +74,7 @@ class SuperConnectionTokenSerializer(ConnectionTokenSerializer): def get_user(self, attrs): return attrs.get('user') + +class AdminConnectionTokenSerializer(ConnectionTokenSerializer): + class Meta(ConnectionTokenSerializer.Meta): + model = AdminConnectionToken diff --git a/apps/authentication/templates/authentication/_msg_mfa_email_code.html b/apps/authentication/templates/authentication/_msg_mfa_email_code.html new file mode 100644 index 000000000..18abd728d --- /dev/null +++ b/apps/authentication/templates/authentication/_msg_mfa_email_code.html @@ -0,0 +1,18 @@ +{% load i18n %} + +
+ + + + + + + + + + + + + +
{{ title }}
{% trans 'Hello' %} {{ user.name }},
{% trans 'MFA code' %}: {{ code }}
{% trans 'The validity period of the verification code is one minute' %}
+
diff --git a/apps/common/api/decorator.py b/apps/common/api/decorator.py new file mode 100644 index 000000000..76f1f79bc --- /dev/null +++ b/apps/common/api/decorator.py @@ -0,0 +1,30 @@ +from common.utils import get_logger + + +logger = get_logger(__file__) + + +def deprecated_api(replacement=None, sunset_date=None): + """类视图废弃装饰器""" + def decorator(cls): + original_dispatch = cls.dispatch + + def new_dispatch(self, request, *args, **kwargs): + logger.warning( + f'The client {request.get_host()} calls the deprecated interface: {request.path}' + ) + response = original_dispatch(self, request, *args, **kwargs) + response.headers["Deprecation"] = "true" + if replacement: + response.headers["Link"] = f'<{replacement}>; rel="deprecation"' + if sunset_date: + response.headers["Sunset"] = sunset_date + if hasattr(response, "data") and isinstance(response.data, dict): + response.data.update({ + 'warning': f'This interface has been deprecated. Please use {replacement} instead.' + }) + return response + + cls.dispatch = new_dispatch + return cls + return decorator diff --git a/apps/common/api/mixin.py b/apps/common/api/mixin.py index 830e7b571..0473bea0c 100644 --- a/apps/common/api/mixin.py +++ b/apps/common/api/mixin.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # from collections import defaultdict +from contextlib import nullcontext from itertools import chain from typing import Callable @@ -15,6 +16,7 @@ from common.drf.filters import ( IDNotFilterBackend, NotOrRelFilterBackend, LabelFilterBackend ) from common.utils import get_logger, lazyproperty +from orgs.utils import tmp_to_org, tmp_to_root_org from .action import RenderToJsonMixin from .serializer import SerializerMixin @@ -95,7 +97,10 @@ class QuerySetMixin: get_queryset: Callable def get_queryset(self): - queryset = super().get_queryset() + return super().get_queryset() + + def filter_queryset(self, queryset): + queryset = super().filter_queryset(queryset) if not hasattr(self, 'action'): return queryset if self.action == 'metadata': @@ -103,26 +108,58 @@ class QuerySetMixin: queryset = self.setup_eager_loading(queryset) return queryset - # Todo: 未来考虑自定义 pagination - def setup_eager_loading(self, queryset): - if self.request.query_params.get('format') not in ['csv', 'xlsx']: + def setup_eager_loading(self, queryset, is_paginated=False): + is_export_request = self.request.query_params.get('format') in ['csv', 'xlsx'] + no_request_page = self.request.query_params.get('limit') is None + # 不分页不走一般这个,是因为会消耗多余的 sql 查询, 不如分页的时候查询一次 + if not is_export_request and not is_paginated and not no_request_page: return queryset + serializer_class = self.get_serializer_class() - if not serializer_class or not hasattr(serializer_class, 'setup_eager_loading'): + if not serializer_class: return queryset - return serializer_class.setup_eager_loading(queryset) + + if hasattr(serializer_class, 'setup_eager_loading'): + queryset = serializer_class.setup_eager_loading(queryset) + + if hasattr(serializer_class, 'setup_eager_labels'): + queryset = serializer_class.setup_eager_labels(queryset) + return queryset def paginate_queryset(self, queryset): page = super().paginate_queryset(queryset) + model = getattr(queryset, 'model', None) + if not model or hasattr(queryset, 'custom'): + return page + serializer_class = self.get_serializer_class() - if page and serializer_class and hasattr(serializer_class, 'setup_eager_loading'): - ids = [str(obj.id) for obj in page] - page = self.get_queryset().filter(id__in=ids) - page = serializer_class.setup_eager_loading(page) + if page and serializer_class: + # 必须要返回 ids,用于排序 + queryset, ids = self._get_page_again(page, model) + page = self.setup_eager_loading(queryset, is_paginated=True) page_mapper = {str(obj.id): obj for obj in page} page = [page_mapper.get(_id) for _id in ids if _id in page_mapper] return page + def _get_page_again(self, page, model): + """ + 因为 setup_eager_loading 需要是 queryset 结构, 所以必须要重新构造 + """ + id_org_mapper = {str(obj.id): getattr(obj, 'org_id', None) for obj in page} + ids = list(id_org_mapper.keys()) + org_ids = list(set(id_org_mapper.values()) - {None}) + + if not org_ids: + context = nullcontext() + elif len(org_ids) == 1: + context = tmp_to_org(org_ids[0]) + else: + context = tmp_to_root_org() + + with context: + page = model.objects.filter(id__in=ids) + return page, ids + class ExtraFilterFieldsMixin: """ @@ -217,8 +254,8 @@ class OrderingFielderFieldsMixin: class CommonApiMixin( - SerializerMixin, ExtraFilterFieldsMixin, OrderingFielderFieldsMixin, - QuerySetMixin, RenderToJsonMixin, PaginatedResponseMixin + SerializerMixin, QuerySetMixin, ExtraFilterFieldsMixin, + OrderingFielderFieldsMixin, RenderToJsonMixin, PaginatedResponseMixin ): def is_swagger_request(self): return getattr(self, 'swagger_fake_view', False) or \ diff --git a/apps/common/drf/renders/base.py b/apps/common/drf/renders/base.py index db081c3d3..43de3cd91 100644 --- a/apps/common/drf/renders/base.py +++ b/apps/common/drf/renders/base.py @@ -13,11 +13,13 @@ from rest_framework.utils import encoders, json from common.serializers import fields as common_fields from common.utils import get_logger +from .mixins import LogMixin + logger = get_logger(__file__) -class BaseFileRenderer(BaseRenderer): +class BaseFileRenderer(LogMixin, BaseRenderer): # 渲染模板标识, 导入、导出、更新模板: ['import', 'update', 'export'] template = 'export' serializer = None @@ -256,6 +258,8 @@ class BaseFileRenderer(BaseRenderer): logger.debug(e, exc_info=True) value = 'Render error! ({})'.format(self.media_type).encode('utf-8') return value + + self.record_logs(request, view, data) return value def compress_into_zip_file(self, value, request, response): diff --git a/apps/common/drf/renders/mixins.py b/apps/common/drf/renders/mixins.py new file mode 100644 index 000000000..15586d03f --- /dev/null +++ b/apps/common/drf/renders/mixins.py @@ -0,0 +1,69 @@ +from django.utils.translation import gettext_noop + +from audits.const import ActionChoices +from audits.utils import record_operate_log_and_activity_log +from common.utils import get_logger + + +logger = get_logger(__file__) + + +class LogMixin(object): + @staticmethod + def _clean_params(query_params): + clean_params = {} + ignore_params = ('format', 'order') + for key, value in dict(query_params).items(): + if key in ignore_params: + continue + if isinstance(value, list): + value = list(filter(None, value)) + if value: + clean_params[key] = value + return clean_params + + @staticmethod + def _get_model(view): + model = getattr(view, 'model', None) + if not model: + serializer = view.get_serializer() + if serializer: + model = serializer.Meta.model + return model + + @staticmethod + def _build_after(params, data): + base = { + gettext_noop('Resource count'): {'value': len(data)} + } + extra = {key: {'value': value} for key, value in params.items()} + return {**extra, **base} + + @staticmethod + def get_resource_display(params): + spm_filter = params.pop("spm", None) + if not params and not spm_filter: + display_message = gettext_noop("Export all") + elif spm_filter: + display_message = gettext_noop("Export only selected items") + else: + display_message = gettext_noop("Export filtered") + return display_message + + def record_logs(self, request, view, data): + activity_ids, activity_detail = [], '' + model = self._get_model(view) + if not model: + logger.warning('Model is not defined in view: %s' % view) + return + + params = self._clean_params(request.query_params) + resource_display = self.get_resource_display(params) + after = self._build_after(params, data) + if hasattr(view, 'get_activity_detail_msg'): + activity_detail = view.get_activity_detail_msg() + activity_ids = [d['id'] for d in data if 'id' in d] + record_operate_log_and_activity_log( + activity_ids, ActionChoices.export, activity_detail, + model, resource_display=resource_display, after=after + ) diff --git a/apps/common/management/commands/services/utils.py b/apps/common/management/commands/services/utils.py index 7ad6ea7f9..a8e40df44 100644 --- a/apps/common/management/commands/services/utils.py +++ b/apps/common/management/commands/services/utils.py @@ -26,7 +26,7 @@ class ServicesUtil(object): def start_and_watch(self): logging.info(time.ctime()) - logging.info(f'JumpServer version {__version__}, more see https://www.jumpserver.org') + logging.info(f'JumpServer version {__version__}, more see https://www.jumpserver.com') self.start() if self.run_daemon: self.show_status() diff --git a/apps/common/permissions.py b/apps/common/permissions.py index fd3e984e3..d63b7780a 100644 --- a/apps/common/permissions.py +++ b/apps/common/permissions.py @@ -27,10 +27,23 @@ class IsServiceAccount(IsValidUser): class WithBootstrapToken(permissions.BasePermission): + def check_can_register(self): + enabled = settings.SECURITY_SERVICE_ACCOUNT_REGISTRATION + if enabled == 'auto': + return time.time() - settings.JUMPSERVER_UPTIME < 300 + elif enabled: + return True + else: + return False + def has_permission(self, request, view): authorization = request.META.get('HTTP_AUTHORIZATION', '') if not authorization: return False + + if not self.check_can_register(): + return False + request_bootstrap_token = authorization.split()[-1] return settings.BOOTSTRAP_TOKEN == request_bootstrap_token @@ -74,3 +87,12 @@ class IsValidLicense(permissions.BasePermission): def has_permission(self, request, view): return settings.XPACK_LICENSE_IS_VALID + + +class IsOwnerOrAdminWritable(IsValidUser): + def has_object_permission(self, request, view, obj): + if request.user.is_superuser: + return super().has_permission(request, view) + if request.method != 'GET' and obj.creator != request.user: + return False + return super().has_permission(request, view) diff --git a/apps/common/plugins/es.py b/apps/common/plugins/es.py index df53d3f46..866298e30 100644 --- a/apps/common/plugins/es.py +++ b/apps/common/plugins/es.py @@ -386,6 +386,7 @@ class ES(object): class QuerySet(DJQuerySet): + custom = True default_days_ago = 7 max_result_window = 10000 diff --git a/apps/common/serializers/mixin.py b/apps/common/serializers/mixin.py index c3abbcd3d..01eef8182 100644 --- a/apps/common/serializers/mixin.py +++ b/apps/common/serializers/mixin.py @@ -7,7 +7,7 @@ else: from collections import Iterable from django.conf import settings from django.core.exceptions import ObjectDoesNotExist -from django.db.models import NOT_PROVIDED +from django.db.models import NOT_PROVIDED, OneToOneField from django.utils.translation import gettext_lazy as _ from rest_framework import serializers from rest_framework.exceptions import ValidationError @@ -466,5 +466,14 @@ class ResourceLabelsMixin(serializers.Serializer): return instance @classmethod - def setup_eager_loading(cls, queryset): - return queryset.prefetch_related("labels") + def setup_eager_labels(cls, queryset): + if not hasattr(queryset, 'model'): + return queryset + + fields = ['labels', 'labels__label'] + model = queryset.model + pk_field = model._meta.pk + + if isinstance(pk_field, OneToOneField): + fields = ['{}__{}'.format(pk_field.name, f) for f in fields] + return queryset.prefetch_related(*fields) diff --git a/apps/common/views/mixins.py b/apps/common/views/mixins.py index 6f59ac21a..21c18515e 100644 --- a/apps/common/views/mixins.py +++ b/apps/common/views/mixins.py @@ -2,20 +2,14 @@ # from django.contrib.auth.mixins import UserPassesTestMixin from django.http.response import JsonResponse -from django.db.models import Model -from django.utils import translation from rest_framework import permissions from rest_framework.request import Request -from audits.const import ActivityChoices -from audits.handler import create_or_update_operate_log -from audits.models import ActivityLog from common.exceptions import UserConfirmRequired -from orgs.utils import current_org + __all__ = [ "PermissionsMixin", - "RecordViewLogMixin", "UserConfirmRequiredExceptionMixin", ] @@ -45,23 +39,3 @@ class PermissionsMixin(UserPassesTestMixin): if not permission_class().has_permission(self.request, self): return False return True - - -class RecordViewLogMixin: - model: Model - - def record_logs(self, ids, action, detail, model=None, **kwargs): - with translation.override('en'): - model = model or self.model - resource_type = model._meta.verbose_name - create_or_update_operate_log( - action, resource_type, force=True, **kwargs - ) - activities = [ - ActivityLog( - resource_id=resource_id, type=ActivityChoices.operate_log, - detail=detail, org_id=current_org.id, - ) - for resource_id in ids - ] - ActivityLog.objects.bulk_create(activities) diff --git a/apps/i18n/core/en/LC_MESSAGES/django.po b/apps/i18n/core/en/LC_MESSAGES/django.po index 73b03c062..c71fbbe2b 100644 --- a/apps/i18n/core/en/LC_MESSAGES/django.po +++ b/apps/i18n/core/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-20 11:52+0800\n" +"POT-Creation-Date: 2025-04-17 15:04+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,18 +18,18 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: accounts/api/account/account.py:121 +#: accounts/api/account/account.py:131 #: accounts/serializers/account/account.py:181 -#: accounts/serializers/account/account.py:342 +#: accounts/serializers/account/account.py:344 msgid "Account already exists" msgstr "" #: accounts/api/account/application.py:78 -#: authentication/api/connection_token.py:452 +#: authentication/api/connection_token.py:451 msgid "Account not found" msgstr "" -#: accounts/api/automations/base.py:83 tickets/api/ticket.py:132 +#: accounts/api/automations/base.py:86 tickets/api/ticket.py:132 msgid "The parameter 'action' must be [{}]" msgstr "" @@ -94,7 +94,7 @@ msgstr "" msgid "Plan execution end" msgstr "" -#: accounts/automations/base/manager.py:118 +#: accounts/automations/base/manager.py:119 msgid "No pending accounts found" msgstr "" @@ -127,8 +127,8 @@ msgstr "" #: authentication/templates/authentication/login.html:362 #: authentication/templates/authentication/login.html:408 #: settings/serializers/auth/ldap.py:27 settings/serializers/auth/ldap.py:53 -#: settings/serializers/auth/ldap_ha.py:36 settings/serializers/msg.py:37 -#: settings/serializers/terminal.py:28 terminal/serializers/storage.py:123 +#: settings/serializers/auth/ldap_ha.py:35 settings/serializers/msg.py:37 +#: settings/serializers/terminal.py:32 terminal/serializers/storage.py:123 #: terminal/serializers/storage.py:142 users/forms/profile.py:22 #: users/serializers/user.py:148 #: users/templates/users/_msg_user_created.html:13 @@ -200,7 +200,7 @@ msgid "Update" msgstr "" #: accounts/const/account.py:34 accounts/const/automation.py:115 -#: accounts/serializers/automations/change_secret.py:169 audits/const.py:65 +#: accounts/serializers/automations/change_secret.py:169 audits/const.py:66 #: audits/signal_handlers/activity_log.py:34 common/const/choices.py:67 #: ops/const.py:76 terminal/const.py:81 xpack/plugins/cloud/const.py:47 msgid "Failed" @@ -303,7 +303,7 @@ msgstr "" msgid "Only create" msgstr "" -#: accounts/const/automation.py:109 +#: accounts/const/automation.py:109 authentication/const.py:34 #: authentication/serializers/password_mfa.py:16 #: authentication/serializers/password_mfa.py:24 #: notifications/backends/__init__.py:10 settings/serializers/msg.py:21 @@ -319,7 +319,7 @@ msgid "SFTP" msgstr "" #: accounts/const/automation.py:116 -#: accounts/serializers/automations/change_secret.py:168 audits/const.py:64 +#: accounts/serializers/automations/change_secret.py:168 audits/const.py:65 #: audits/models.py:65 audits/signal_handlers/activity_log.py:34 #: common/const/choices.py:66 ops/const.py:74 ops/serializers/celery.py:48 #: terminal/const.py:80 terminal/models/session/sharing.py:121 @@ -410,33 +410,11 @@ msgid "" "Vault." msgstr "" -#: accounts/filters.py:194 -msgid "Enter a valid UUID." -msgstr "" - -#: accounts/mixins.py:35 -msgid "Export all" -msgstr "" - -#: accounts/mixins.py:37 -msgid "Export only selected items" -msgstr "" - -#: accounts/mixins.py:42 -#, python-format -msgid "Export filtered: %s" -msgstr "" - -#: accounts/mixins.py:48 -#, python-format -msgid "User %s view/export secret" -msgstr "" - #: accounts/models/account.py:85 #: accounts/models/automations/check_account.py:59 #: accounts/models/automations/gather_account.py:17 -#: accounts/serializers/account/account.py:226 -#: accounts/serializers/account/account.py:274 +#: accounts/serializers/account/account.py:227 +#: accounts/serializers/account/account.py:276 #: accounts/serializers/automations/change_secret.py:113 #: accounts/serializers/automations/change_secret.py:145 #: accounts/serializers/automations/check_account.py:33 @@ -450,9 +428,9 @@ msgstr "" #: accounts/templates/accounts/push_account_report.html:78 #: accounts/templates/accounts/push_account_report.html:118 #: acls/serializers/base.py:130 assets/models/asset/common.py:102 -#: assets/models/asset/common.py:366 assets/models/cmd_filter.py:36 -#: audits/models.py:59 audits/models.py:312 audits/serializers.py:228 -#: authentication/models/connection_token.py:40 +#: assets/models/asset/common.py:428 assets/models/cmd_filter.py:36 +#: audits/models.py:59 audits/models.py:312 audits/serializers.py:230 +#: authentication/models/connection_token.py:41 #: perms/models/asset_permission.py:69 terminal/backends/command/models.py:17 #: terminal/models/session/session.py:34 terminal/notifications.py:156 #: terminal/serializers/command.py:17 terminal/serializers/session.py:30 @@ -463,10 +441,10 @@ msgid "Asset" msgstr "" #: accounts/models/account.py:89 accounts/models/template.py:16 -#: accounts/serializers/account/account.py:233 -#: accounts/serializers/account/account.py:284 +#: accounts/serializers/account/account.py:234 +#: accounts/serializers/account/account.py:286 #: accounts/serializers/account/template.py:35 -#: authentication/serializers/connect_token_secret.py:50 +#: authentication/serializers/connect_token_secret.py:51 msgid "Su from" msgstr "Switch from" @@ -484,7 +462,7 @@ msgstr "" msgid "Secret reset" msgstr "" -#: accounts/models/account.py:97 accounts/serializers/account/account.py:228 +#: accounts/models/account.py:97 accounts/serializers/account/account.py:229 #: users/models/user/__init__.py:122 msgid "Source" msgstr "" @@ -511,14 +489,14 @@ msgstr "" #: accounts/models/account.py:107 #: accounts/models/automations/check_account.py:64 -#: accounts/serializers/account/service.py:11 +#: accounts/serializers/account/service.py:12 #: accounts/serializers/automations/change_secret.py:115 #: accounts/serializers/automations/change_secret.py:146 #: accounts/templates/accounts/change_secret_failed_info.html:12 #: acls/serializers/base.py:131 #: acls/templates/acls/asset_login_reminder.html:10 #: assets/serializers/gateway.py:33 audits/models.py:60 audits/models.py:313 -#: audits/serializers.py:229 authentication/api/connection_token.py:464 +#: audits/serializers.py:231 authentication/api/connection_token.py:463 #: ops/models/base.py:18 perms/models/asset_permission.py:75 #: settings/serializers/msg.py:33 terminal/backends/command/models.py:18 #: terminal/models/session/session.py:36 terminal/serializers/command.py:72 @@ -555,28 +533,28 @@ msgstr "" #: accounts/models/application.py:16 #: accounts/models/automations/check_account.py:116 accounts/models/base.py:63 -#: accounts/serializers/account/service.py:27 +#: accounts/serializers/account/service.py:28 #: accounts/serializers/account/virtual.py:20 acls/models/base.py:35 #: acls/models/base.py:96 acls/models/command_acl.py:21 #: acls/serializers/base.py:35 assets/models/asset/common.py:100 #: assets/models/asset/common.py:166 assets/models/cmd_filter.py:21 #: assets/models/domain.py:19 assets/models/label.py:18 #: assets/models/platform.py:15 assets/models/platform.py:94 -#: assets/serializers/asset/common.py:171 assets/serializers/platform.py:158 -#: assets/serializers/platform.py:278 +#: assets/serializers/asset/common.py:173 assets/serializers/platform.py:158 +#: assets/serializers/platform.py:283 #: authentication/backends/passkey/models.py:10 #: authentication/models/ssh_key.py:12 -#: authentication/serializers/connect_token_secret.py:113 -#: authentication/serializers/connect_token_secret.py:170 labels/models.py:11 +#: authentication/serializers/connect_token_secret.py:115 +#: authentication/serializers/connect_token_secret.py:172 labels/models.py:11 #: ops/mixin.py:32 ops/models/adhoc.py:19 ops/models/celery.py:15 -#: ops/models/celery.py:81 ops/models/job.py:145 ops/models/playbook.py:28 +#: ops/models/celery.py:81 ops/models/job.py:147 ops/models/playbook.py:28 #: ops/models/variable.py:9 ops/serializers/job.py:20 #: ops/serializers/variable.py:20 orgs/models.py:82 #: perms/models/asset_permission.py:61 rbac/models/role.py:29 #: rbac/serializers/role.py:28 settings/models.py:37 settings/models.py:186 #: settings/serializers/msg.py:89 settings/serializers/terminal.py:9 #: terminal/models/applet/applet.py:34 terminal/models/component/endpoint.py:13 -#: terminal/models/component/endpoint.py:112 +#: terminal/models/component/endpoint.py:106 #: terminal/models/component/storage.py:26 terminal/models/component/task.py:13 #: terminal/models/component/terminal.py:86 #: terminal/models/virtualapp/provider.py:10 @@ -603,13 +581,13 @@ msgstr "" #: accounts/models/application.py:21 acls/models/base.py:98 #: assets/models/automations/base.py:22 assets/models/cmd_filter.py:38 #: assets/serializers/asset/common.py:148 -#: assets/serializers/asset/common.py:420 perms/serializers/permission.py:66 -#: perms/serializers/user_permission.py:75 rbac/tree.py:35 +#: assets/serializers/asset/common.py:423 perms/serializers/permission.py:66 +#: perms/serializers/user_permission.py:76 rbac/tree.py:35 msgid "Accounts" msgstr "" #: accounts/models/application.py:22 authentication/models/access_key.py:20 -#: terminal/models/component/endpoint.py:113 +#: terminal/models/component/endpoint.py:107 msgid "IP group" msgstr "" @@ -621,12 +599,12 @@ msgid "Date last used" msgstr "" #: accounts/models/application.py:24 acls/models/base.py:43 -#: assets/models/asset/common.py:178 authentication/models/access_key.py:23 -#: authentication/models/connection_token.py:58 +#: assets/models/asset/common.py:182 authentication/models/access_key.py:23 +#: authentication/models/connection_token.py:59 #: authentication/models/ssh_key.py:13 authentication/serializers/ssh_key.py:23 #: authentication/templates/authentication/_access_key_modal.html:32 -#: perms/models/asset_permission.py:82 terminal/models/component/endpoint.py:28 -#: terminal/models/component/endpoint.py:123 +#: perms/models/asset_permission.py:82 terminal/models/component/endpoint.py:29 +#: terminal/models/component/endpoint.py:117 #: terminal/models/session/sharing.py:29 terminal/serializers/terminal.py:44 #: tickets/const.py:36 msgid "Active" @@ -727,8 +705,8 @@ msgstr "" #: accounts/models/automations/check_account.py:19 #: accounts/models/automations/gather_account.py:117 #: accounts/serializers/automations/change_secret.py:59 -#: settings/serializers/auth/ldap.py:101 -#: settings/serializers/auth/ldap_ha.py:84 settings/serializers/msg.py:45 +#: settings/serializers/auth/ldap.py:105 +#: settings/serializers/auth/ldap_ha.py:87 settings/serializers/msg.py:45 msgid "Recipient" msgstr "Recipients" @@ -738,7 +716,7 @@ msgstr "" #: accounts/models/automations/change_secret.py:47 #: assets/models/automations/base.py:145 ops/models/base.py:56 -#: ops/models/celery.py:90 ops/models/job.py:240 +#: ops/models/celery.py:90 ops/models/job.py:242 #: terminal/models/applet/host.py:142 msgid "Date finished" msgstr "" @@ -749,11 +727,11 @@ msgstr "" #: accounts/serializers/automations/check_account.py:39 #: assets/models/automations/base.py:137 #: assets/serializers/automations/base.py:45 audits/models.py:209 -#: audits/serializers.py:78 ops/models/base.py:49 ops/models/job.py:231 -#: terminal/models/applet/applet.py:331 terminal/models/applet/host.py:140 +#: audits/serializers.py:77 ops/models/base.py:49 ops/models/job.py:233 +#: terminal/models/applet/applet.py:372 terminal/models/applet/host.py:140 #: terminal/models/component/status.py:30 #: terminal/models/virtualapp/virtualapp.py:99 -#: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:148 +#: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:163 #: terminal/serializers/virtualapp.py:35 tickets/models/ticket/general.py:284 #: tickets/serializers/super_ticket.py:13 #: tickets/serializers/ticket/ticket.py:20 xpack/plugins/cloud/models.py:227 @@ -762,7 +740,7 @@ msgid "Status" msgstr "" #: accounts/models/automations/change_secret.py:51 -#: accounts/serializers/account/account.py:276 +#: accounts/serializers/account/account.py:278 #: accounts/templates/accounts/change_secret_failed_info.html:13 #: assets/const/automation.py:9 #: authentication/templates/authentication/passkey.html:173 @@ -864,6 +842,8 @@ msgstr "" #: acls/serializers/base.py:19 acls/serializers/base.py:50 audits/models.py:189 #: authentication/forms.py:21 authentication/forms.py:23 #: authentication/models/temp_token.py:9 +#: authentication/serializers/connect_token_secret.py:43 +#: authentication/serializers/connect_token_secret.py:53 #: authentication/templates/authentication/_msg_different_city.html:9 #: authentication/templates/authentication/_msg_oauth_bind.html:9 #: authentication/templates/authentication/login.html:408 @@ -981,11 +961,11 @@ msgid "Verify asset account" msgstr "" #: accounts/models/base.py:37 accounts/models/base.py:66 -#: accounts/serializers/account/account.py:470 +#: accounts/serializers/account/account.py:471 #: accounts/serializers/account/base.py:17 #: accounts/serializers/automations/change_secret.py:48 #: authentication/serializers/connect_token_secret.py:42 -#: authentication/serializers/connect_token_secret.py:51 +#: authentication/serializers/connect_token_secret.py:52 #: terminal/serializers/storage.py:140 msgid "Secret type" msgstr "" @@ -1002,7 +982,7 @@ msgstr "" #: accounts/models/base.py:69 assets/models/automations/base.py:28 #: assets/models/cmd_filter.py:39 assets/models/label.py:22 -#: authentication/serializers/connect_token_secret.py:117 +#: authentication/serializers/connect_token_secret.py:119 #: terminal/models/applet/applet.py:41 #: terminal/models/virtualapp/virtualapp.py:23 users/serializers/user.py:257 msgid "Is active" @@ -1108,7 +1088,7 @@ msgstr "" msgid "Reopen" msgstr "" -#: accounts/risk_handlers.py:19 audits/const.py:38 +#: accounts/risk_handlers.py:19 audits/const.py:39 #: authentication/templates/authentication/_access_key_modal.html:155 #: authentication/templates/authentication/_mfa_confirm_modal.html:53 #: templates/_modal.html:22 tickets/const.py:43 @@ -1136,7 +1116,7 @@ msgstr "" msgid "Change password and Add" msgstr "" -#: accounts/risk_handlers.py:26 audits/const.py:31 ops/const.py:9 +#: accounts/risk_handlers.py:26 audits/const.py:32 ops/const.py:9 msgid "Change password" msgstr "" @@ -1159,7 +1139,7 @@ msgstr "" #: accounts/serializers/account/account.py:206 assets/models/label.py:21 #: assets/models/platform.py:95 assets/serializers/asset/common.py:145 #: assets/serializers/cagegory.py:12 assets/serializers/platform.py:173 -#: assets/serializers/platform.py:279 perms/serializers/user_permission.py:26 +#: assets/serializers/platform.py:284 perms/serializers/user_permission.py:26 #: settings/models.py:39 tickets/models/ticket/apply_application.py:13 #: users/models/preference.py:12 msgid "Category" @@ -1170,9 +1150,9 @@ msgstr "" #: assets/models/automations/base.py:146 assets/models/cmd_filter.py:74 #: assets/models/platform.py:96 assets/serializers/asset/common.py:146 #: assets/serializers/platform.py:160 assets/serializers/platform.py:172 -#: audits/serializers.py:77 audits/serializers.py:194 -#: authentication/models/connection_token.py:62 -#: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:153 +#: audits/serializers.py:76 audits/serializers.py:196 +#: authentication/models/connection_token.py:63 +#: authentication/serializers/connect_token_secret.py:128 ops/models/job.py:155 #: perms/serializers/user_permission.py:27 terminal/models/applet/applet.py:40 #: terminal/models/component/storage.py:58 #: terminal/models/component/storage.py:152 terminal/serializers/applet.py:29 @@ -1184,66 +1164,72 @@ msgstr "" msgid "Type" msgstr "" -#: accounts/serializers/account/account.py:222 +#: accounts/serializers/account/account.py:223 msgid "Asset not found" msgstr "" -#: accounts/serializers/account/account.py:265 +#: accounts/serializers/account/account.py:236 assets/const/category.py:15 +#: assets/models/asset/common.py:180 assets/models/asset/ds.py:14 +#: assets/serializers/asset/common.py:180 +msgid "Directory service" +msgstr "" + +#: accounts/serializers/account/account.py:267 msgid "Has secret" msgstr "" -#: accounts/serializers/account/account.py:275 ops/models/celery.py:84 +#: accounts/serializers/account/account.py:277 ops/models/celery.py:84 #: tickets/models/comment.py:13 tickets/models/ticket/general.py:49 #: tickets/models/ticket/general.py:280 tickets/serializers/super_ticket.py:14 msgid "State" msgstr "" -#: accounts/serializers/account/account.py:277 +#: accounts/serializers/account/account.py:279 msgid "Changed" msgstr "" -#: accounts/serializers/account/account.py:287 acls/models/base.py:97 +#: accounts/serializers/account/account.py:289 acls/models/base.py:97 #: acls/templates/acls/asset_login_reminder.html:9 #: assets/models/automations/base.py:25 -#: assets/serializers/automations/base.py:20 assets/serializers/domain.py:34 +#: assets/serializers/automations/base.py:20 assets/serializers/domain.py:33 #: assets/serializers/platform.py:181 assets/serializers/platform.py:213 -#: authentication/api/connection_token.py:463 ops/models/base.py:17 -#: ops/models/job.py:155 ops/serializers/job.py:21 +#: authentication/api/connection_token.py:462 ops/models/base.py:17 +#: ops/models/job.py:157 ops/serializers/job.py:21 #: perms/serializers/permission.py:57 #: terminal/templates/terminal/_msg_command_execute_alert.html:16 #: xpack/plugins/cloud/manager.py:93 msgid "Assets" msgstr "" -#: accounts/serializers/account/account.py:392 +#: accounts/serializers/account/account.py:394 #, python-format msgid "Asset does not support this secret type: %s" msgstr "" -#: accounts/serializers/account/account.py:424 +#: accounts/serializers/account/account.py:426 msgid "Account has exist" msgstr "" -#: accounts/serializers/account/account.py:461 +#: accounts/serializers/account/account.py:463 #: accounts/serializers/account/base.py:86 #: accounts/serializers/account/template.py:66 -#: assets/serializers/asset/common.py:421 +#: assets/serializers/asset/common.py:424 msgid "Spec info" msgstr "" -#: accounts/serializers/account/account.py:471 -#: authentication/serializers/connect_token_secret.py:160 +#: accounts/serializers/account/account.py:472 +#: authentication/serializers/connect_token_secret.py:162 #: authentication/templates/authentication/_access_key_modal.html:30 #: perms/models/perm_node.py:21 users/serializers/group.py:33 msgid "ID" msgstr "" -#: accounts/serializers/account/account.py:481 acls/serializers/base.py:123 +#: accounts/serializers/account/account.py:482 acls/serializers/base.py:123 #: acls/templates/acls/asset_login_reminder.html:8 #: acls/templates/acls/user_login_reminder.html:8 #: assets/models/cmd_filter.py:24 assets/models/label.py:16 audits/models.py:55 #: audits/models.py:91 audits/models.py:173 audits/models.py:272 -#: audits/serializers.py:195 authentication/models/connection_token.py:36 +#: audits/serializers.py:197 authentication/models/connection_token.py:37 #: authentication/models/ssh_key.py:22 authentication/models/sso_token.py:16 #: notifications/models/notification.py:12 #: perms/api/user_permission/mixin.py:58 perms/models/asset_permission.py:63 @@ -1260,7 +1246,7 @@ msgstr "" msgid "User" msgstr "" -#: accounts/serializers/account/account.py:482 +#: accounts/serializers/account/account.py:483 #: authentication/templates/authentication/_access_key_modal.html:33 #: terminal/notifications.py:159 terminal/notifications.py:219 msgid "Date" @@ -1276,19 +1262,19 @@ msgid "" "accounts, use the format username@domain." msgstr "" -#: accounts/serializers/account/service.py:13 +#: accounts/serializers/account/service.py:14 #: authentication/serializers/token.py:22 msgid "Access IP" msgstr "" -#: accounts/serializers/account/service.py:26 +#: accounts/serializers/account/service.py:27 #: accounts/serializers/account/virtual.py:19 assets/models/cmd_filter.py:40 #: assets/models/cmd_filter.py:88 common/db/models.py:36 ops/models/adhoc.py:25 -#: ops/models/job.py:163 ops/models/playbook.py:31 rbac/models/role.py:37 +#: ops/models/job.py:165 ops/models/playbook.py:31 rbac/models/role.py:37 #: settings/models.py:42 terminal/models/applet/applet.py:46 -#: terminal/models/applet/applet.py:332 terminal/models/applet/host.py:143 -#: terminal/models/component/endpoint.py:27 -#: terminal/models/component/endpoint.py:122 +#: terminal/models/applet/applet.py:373 terminal/models/applet/host.py:143 +#: terminal/models/component/endpoint.py:28 +#: terminal/models/component/endpoint.py:116 #: terminal/models/session/session.py:49 #: terminal/models/virtualapp/virtualapp.py:28 tickets/models/comment.py:32 #: tickets/models/ticket/general.py:298 users/models/user/__init__.py:94 @@ -1296,9 +1282,9 @@ msgstr "" msgid "Comment" msgstr "Description" -#: accounts/serializers/account/service.py:28 +#: accounts/serializers/account/service.py:29 #: accounts/templates/accounts/backup_account_report.html:33 -#: assets/serializers/asset/common.py:151 +#: assets/serializers/asset/common.py:152 msgid "Accounts amount" msgstr "" @@ -1593,7 +1579,7 @@ msgstr "" #: accounts/templates/accounts/gather_account_report.html:21 #: accounts/templates/accounts/push_account_report.html:22 #: assets/models/automations/base.py:143 audits/models.py:66 -#: ops/models/base.py:55 ops/models/celery.py:89 ops/models/job.py:239 +#: ops/models/base.py:55 ops/models/celery.py:89 ops/models/job.py:241 #: ops/templates/ops/celery_task_log.html:101 #: perms/models/asset_permission.py:78 settings/serializers/feature.py:27 #: settings/templates/ldap/_msg_import_ldap_user.html:5 @@ -1643,7 +1629,7 @@ msgstr "" #: accounts/templates/accounts/change_secret_report.html:33 #: accounts/templates/accounts/gather_account_report.html:31 #: accounts/templates/accounts/push_account_report.html:32 -#: assets/serializers/domain.py:24 assets/serializers/platform.py:182 +#: assets/serializers/domain.py:23 assets/serializers/platform.py:182 #: orgs/serializers.py:13 perms/serializers/permission.py:61 msgid "Assets amount" msgstr "" @@ -1682,7 +1668,6 @@ msgstr "" #: accounts/templates/accounts/change_secret_report.html:94 #: accounts/templates/accounts/change_secret_report.html:134 #: accounts/templates/accounts/gather_account_report.html:92 -#: accounts/templates/accounts/gather_account_report.html:132 #: accounts/templates/accounts/push_account_report.html:93 #: accounts/templates/accounts/push_account_report.html:133 msgid "No new accounts found" @@ -1711,6 +1696,10 @@ msgstr "" msgid "Lost accounts" msgstr "" +#: accounts/templates/accounts/gather_account_report.html:132 +msgid "No lost accounts found" +msgstr "" + #: accounts/utils.py:54 msgid "" "If the password starts with {{` and ends with }} `, then the password is not " @@ -1725,16 +1714,16 @@ msgstr "" msgid "App Acls" msgstr "ACLs" -#: acls/const.py:6 audits/const.py:36 terminal/const.py:11 tickets/const.py:44 +#: acls/const.py:6 audits/const.py:37 terminal/const.py:11 tickets/const.py:44 #: tickets/templates/tickets/approve_check_password.html:47 msgid "Reject" msgstr "" -#: acls/const.py:7 audits/const.py:33 terminal/const.py:9 +#: acls/const.py:7 audits/const.py:34 terminal/const.py:9 msgid "Accept" msgstr "" -#: acls/const.py:8 audits/const.py:34 +#: acls/const.py:8 audits/const.py:35 msgid "Review" msgstr "" @@ -1747,7 +1736,7 @@ msgid "Notify" msgstr "" #: acls/const.py:11 -msgid "Notify and warn" +msgid "Prompt and warn" msgstr "" #: acls/const.py:12 @@ -1759,18 +1748,18 @@ msgid "Face Online" msgstr "" #: acls/models/base.py:37 assets/models/cmd_filter.py:76 -#: terminal/models/component/endpoint.py:115 xpack/plugins/cloud/models.py:316 +#: terminal/models/component/endpoint.py:109 xpack/plugins/cloud/models.py:316 msgid "Priority" msgstr "" #: acls/models/base.py:38 assets/models/cmd_filter.py:76 -#: terminal/models/component/endpoint.py:116 xpack/plugins/cloud/models.py:317 +#: terminal/models/component/endpoint.py:110 xpack/plugins/cloud/models.py:317 msgid "1-100, the lower the value will be match first" msgstr "" #: acls/models/base.py:41 acls/serializers/base.py:57 -#: assets/models/cmd_filter.py:81 audits/models.py:93 audits/serializers.py:108 -#: authentication/serializers/connect_token_secret.py:119 +#: assets/models/cmd_filter.py:81 audits/models.py:93 audits/serializers.py:107 +#: authentication/serializers/connect_token_secret.py:121 #: authentication/templates/authentication/_access_key_modal.html:34 #: perms/serializers/permission.py:63 perms/serializers/permission.py:85 #: tickets/serializers/ticket/ticket.py:21 @@ -1778,7 +1767,7 @@ msgid "Action" msgstr "" #: acls/models/base.py:42 assets/models/cmd_filter.py:86 -#: authentication/serializers/connect_token_secret.py:91 +#: authentication/serializers/connect_token_secret.py:93 msgid "Reviewers" msgstr "" @@ -1789,7 +1778,7 @@ msgid "Users" msgstr "" #: acls/models/command_acl.py:16 assets/models/cmd_filter.py:60 -#: audits/serializers.py:38 ops/serializers/job.py:92 terminal/const.py:88 +#: ops/serializers/job.py:92 terminal/const.py:88 #: terminal/models/session/session.py:45 terminal/serializers/command.py:18 #: terminal/templates/terminal/_msg_command_alert.html:12 #: terminal/templates/terminal/_msg_command_execute_alert.html:10 @@ -1818,7 +1807,7 @@ msgstr "" #: acls/models/command_acl.py:33 acls/models/command_acl.py:97 #: acls/serializers/command_acl.py:29 -#: authentication/serializers/connect_token_secret.py:88 +#: authentication/serializers/connect_token_secret.py:90 #: terminal/templates/terminal/_msg_command_warning.html:14 msgid "Command group" msgstr "" @@ -1915,7 +1904,7 @@ msgstr "" #: authentication/templates/authentication/_msg_oauth_bind.html:12 #: authentication/templates/authentication/_msg_rest_password_success.html:8 #: authentication/templates/authentication/_msg_rest_public_key_success.html:8 -#: common/drf/renders/base.py:150 xpack/plugins/cloud/models.py:393 +#: common/drf/renders/base.py:152 xpack/plugins/cloud/models.py:393 msgid "IP" msgstr "" @@ -1971,15 +1960,15 @@ msgid "Login city" msgstr "" #: acls/templates/acls/user_login_reminder.html:11 audits/models.py:198 -#: audits/models.py:267 audits/serializers.py:92 +#: audits/models.py:267 audits/serializers.py:91 msgid "User agent" msgstr "" -#: assets/api/asset/asset.py:194 +#: assets/api/asset/asset.py:153 msgid "Cannot create asset directly, you should create a host or other" msgstr "" -#: assets/api/asset/asset.py:198 +#: assets/api/asset/asset.py:157 msgid "The number of assets exceeds the limit of 5000" msgstr "" @@ -2011,34 +2000,34 @@ msgstr "Assets" msgid "Task: {} finished" msgstr "" -#: assets/automations/base/manager.py:338 +#: assets/automations/base/manager.py:339 msgid " - Platform {} ansible disabled" msgstr "" -#: assets/automations/base/manager.py:524 +#: assets/automations/base/manager.py:525 msgid ">>> Task preparation phase" msgstr "" -#: assets/automations/base/manager.py:528 +#: assets/automations/base/manager.py:529 #, python-brace-format msgid ">>> Executing tasks in batches, total {runner_count}" msgstr "" -#: assets/automations/base/manager.py:533 +#: assets/automations/base/manager.py:534 msgid ">>> Start executing tasks" msgstr "" -#: assets/automations/base/manager.py:535 +#: assets/automations/base/manager.py:536 msgid ">>> No tasks need to be executed" msgstr "" -#: assets/automations/base/manager.py:539 +#: assets/automations/base/manager.py:540 #, python-brace-format msgid ">>> Begin executing batch {index} of tasks" msgstr "" #: assets/automations/ping_gateway/manager.py:33 -#: authentication/models/connection_token.py:145 +#: authentication/models/connection_token.py:176 msgid "No account" msgstr "" @@ -2065,7 +2054,7 @@ msgstr "" msgid ">>> Start executing the task to test gateway connectivity" msgstr "" -#: assets/const/automation.py:6 audits/const.py:6 audits/const.py:47 +#: assets/const/automation.py:6 audits/const.py:6 audits/const.py:48 #: audits/signal_handlers/activity_log.py:63 common/utils/ip/geoip/utils.py:31 #: common/utils/ip/geoip/utils.py:37 common/utils/ip/utils.py:104 msgid "Unknown" @@ -2091,7 +2080,7 @@ msgstr "" msgid "Gather facts" msgstr "" -#: assets/const/base.py:32 audits/const.py:58 +#: assets/const/base.py:32 audits/const.py:59 #: terminal/serializers/applet_host.py:32 users/models/user/_auth.py:31 msgid "Disabled" msgstr "" @@ -2125,12 +2114,12 @@ msgid "Cloud service" msgstr "Cloud" #: assets/const/category.py:14 assets/models/asset/gpt.py:11 -#: assets/models/asset/web.py:16 audits/const.py:45 +#: assets/models/asset/web.py:16 audits/const.py:46 #: terminal/models/applet/applet.py:28 users/const.py:76 msgid "Web" msgstr "" -#: assets/const/category.py:15 common/sdk/sms/endpoint.py:20 +#: assets/const/category.py:16 common/sdk/sms/endpoint.py:20 msgid "Custom type" msgstr "" @@ -2166,8 +2155,8 @@ msgstr "" msgid "TP-Link" msgstr "" -#: assets/const/device.py:12 terminal/models/applet/applet.py:27 -#: tickets/const.py:9 +#: assets/const/device.py:12 assets/const/ds.py:7 +#: terminal/models/applet/applet.py:27 tickets/const.py:9 msgid "General" msgstr "" @@ -2183,6 +2172,10 @@ msgstr "" msgid "Firewall" msgstr "" +#: assets/const/ds.py:10 +msgid "Windows Active Directory" +msgstr "" + #: assets/const/gpt.py:7 msgid "ChatGPT" msgstr "" @@ -2233,7 +2226,7 @@ msgid "Any" msgstr "" #: assets/const/protocol.py:88 rbac/tree.py:62 -#: settings/serializers/security.py:241 +#: settings/serializers/security.py:245 msgid "Security" msgstr "" @@ -2302,7 +2295,7 @@ msgstr "" msgid "The database to authenticate against" msgstr "" -#: assets/const/protocol.py:232 authentication/models/connection_token.py:47 +#: assets/const/protocol.py:232 authentication/models/connection_token.py:48 msgid "Connect options" msgstr "" @@ -2345,7 +2338,7 @@ msgstr "" msgid "API mode" msgstr "" -#: assets/const/types.py:249 +#: assets/const/types.py:252 msgid "All types" msgstr "" @@ -2368,15 +2361,15 @@ msgstr "" msgid "Port" msgstr "" -#: assets/models/asset/common.py:167 assets/serializers/asset/common.py:172 +#: assets/models/asset/common.py:167 assets/serializers/asset/common.py:174 #: settings/serializers/terminal.py:10 msgid "Address" msgstr "" -#: assets/models/asset/common.py:169 assets/models/platform.py:149 +#: assets/models/asset/common.py:169 assets/models/platform.py:155 #: assets/serializers/asset/common.py:150 #: authentication/backends/passkey/models.py:12 -#: authentication/serializers/connect_token_secret.py:118 +#: authentication/serializers/connect_token_secret.py:120 #: perms/serializers/user_permission.py:25 xpack/plugins/cloud/models.py:387 msgid "Platform" msgstr "" @@ -2385,34 +2378,34 @@ msgstr "" msgid "Zone" msgstr "" -#: assets/models/asset/common.py:176 assets/serializers/asset/common.py:174 +#: assets/models/asset/common.py:176 assets/serializers/asset/common.py:176 #: assets/serializers/automations/base.py:21 ops/serializers/job.py:22 #: perms/serializers/permission.py:58 msgid "Nodes" msgstr "" -#: assets/models/asset/common.py:179 assets/serializers/asset/common.py:422 +#: assets/models/asset/common.py:183 assets/serializers/asset/common.py:425 #: assets/serializers/asset/host.py:11 msgid "Gathered info" msgstr "" -#: assets/models/asset/common.py:180 assets/serializers/asset/custom.py:14 +#: assets/models/asset/common.py:184 assets/serializers/asset/custom.py:14 msgid "Custom info" msgstr "" -#: assets/models/asset/common.py:369 +#: assets/models/asset/common.py:431 msgid "Can refresh asset hardware info" msgstr "" -#: assets/models/asset/common.py:370 +#: assets/models/asset/common.py:432 msgid "Can test asset connectivity" msgstr "" -#: assets/models/asset/common.py:371 +#: assets/models/asset/common.py:433 msgid "Can match asset" msgstr "" -#: assets/models/asset/common.py:372 +#: assets/models/asset/common.py:434 msgid "Can change asset nodes" msgstr "" @@ -2440,19 +2433,23 @@ msgstr "" msgid "Postgresql SSL mode" msgstr "" +#: assets/models/asset/ds.py:10 assets/serializers/asset/ds.py:20 +msgid "Domain name" +msgstr "" + #: assets/models/asset/gpt.py:8 settings/serializers/feature.py:139 #: settings/serializers/feature.py:154 msgid "Proxy" msgstr "" #: assets/models/automations/base.py:23 assets/models/cmd_filter.py:32 -#: assets/models/node.py:553 ops/models/job.py:156 +#: assets/models/node.py:553 ops/models/job.py:158 #: perms/models/asset_permission.py:72 tickets/models/ticket/apply_asset.py:15 #: xpack/plugins/cloud/models.py:388 msgid "Node" msgstr "" -#: assets/models/automations/base.py:29 ops/models/job.py:234 +#: assets/models/automations/base.py:29 ops/models/job.py:236 #: ops/serializers/job.py:24 settings/serializers/auth/sms.py:108 msgid "Parameters" msgstr "" @@ -2470,7 +2467,7 @@ msgid "Asset automation task" msgstr "" #: assets/models/automations/base.py:140 assets/models/cmd_filter.py:41 -#: common/db/models.py:34 ops/models/base.py:54 ops/models/job.py:238 +#: common/db/models.py:34 ops/models/base.py:54 ops/models/job.py:240 #: users/models/user/__init__.py:317 msgid "Date created" msgstr "" @@ -2481,14 +2478,14 @@ msgstr "" msgid "Trigger mode" msgstr "" -#: assets/models/automations/base.py:157 audits/serializers.py:39 -#: ops/models/base.py:52 ops/models/job.py:236 +#: assets/models/automations/base.py:157 audits/serializers.py:38 +#: ops/models/base.py:52 ops/models/job.py:238 #: xpack/plugins/cloud/manager.py:103 msgid "Summary" msgstr "" #: assets/models/automations/base.py:158 ops/models/base.py:51 -#: ops/models/job.py:235 xpack/plugins/cloud/models.py:225 +#: ops/models/job.py:237 xpack/plugins/cloud/models.py:225 msgid "Result" msgstr "" @@ -2552,7 +2549,7 @@ msgstr "" msgid "Favorite asset" msgstr "" -#: assets/models/gateway.py:34 assets/serializers/domain.py:19 +#: assets/models/gateway.py:34 assets/serializers/domain.py:18 msgid "Gateway" msgstr "" @@ -2563,8 +2560,8 @@ msgstr "" #: assets/models/label.py:19 assets/models/node.py:539 #: assets/serializers/cagegory.py:11 assets/serializers/cagegory.py:18 #: assets/serializers/cagegory.py:24 -#: authentication/models/connection_token.py:33 -#: authentication/serializers/connect_token_secret.py:125 +#: authentication/models/connection_token.py:34 +#: authentication/serializers/connect_token_secret.py:127 #: common/serializers/common.py:86 labels/models.py:12 settings/models.py:38 #: users/models/preference.py:13 msgid "Value" @@ -2573,7 +2570,7 @@ msgstr "" #: assets/models/label.py:40 assets/serializers/cagegory.py:10 #: assets/serializers/cagegory.py:17 assets/serializers/cagegory.py:23 #: assets/serializers/platform.py:159 -#: authentication/serializers/connect_token_secret.py:124 +#: authentication/serializers/connect_token_secret.py:126 #: common/serializers/common.py:85 labels/serializers.py:45 #: settings/serializers/msg.py:90 xpack/plugins/cloud/models.py:392 msgid "Label" @@ -2639,7 +2636,7 @@ msgstr "" msgid "Setting" msgstr "" -#: assets/models/platform.py:38 audits/const.py:59 +#: assets/models/platform.py:38 audits/const.py:60 #: authentication/backends/passkey/models.py:11 settings/models.py:41 #: terminal/serializers/applet_host.py:33 users/models/user/_auth.py:32 msgid "Enabled" @@ -2739,15 +2736,19 @@ msgstr "" msgid "Gateway enabled" msgstr "" -#: assets/models/platform.py:106 assets/serializers/platform.py:202 +#: assets/models/platform.py:105 +msgid "DS enabled" +msgstr "" + +#: assets/models/platform.py:107 assets/serializers/platform.py:202 msgid "Su enabled" msgstr "Switch account enabled" -#: assets/models/platform.py:107 assets/serializers/platform.py:177 +#: assets/models/platform.py:108 assets/serializers/platform.py:177 msgid "Su method" msgstr "Switch account method" -#: assets/models/platform.py:108 assets/serializers/platform.py:180 +#: assets/models/platform.py:109 assets/serializers/platform.py:180 msgid "Custom fields" msgstr "" @@ -2784,36 +2785,36 @@ msgstr "" #: assets/serializers/asset/common.py:147 assets/serializers/platform.py:174 #: authentication/serializers/connect_token_secret.py:30 -#: authentication/serializers/connect_token_secret.py:75 +#: authentication/serializers/connect_token_secret.py:77 #: perms/models/asset_permission.py:76 perms/serializers/permission.py:67 -#: perms/serializers/user_permission.py:74 xpack/plugins/cloud/models.py:390 +#: perms/serializers/user_permission.py:75 xpack/plugins/cloud/models.py:390 #: xpack/plugins/cloud/serializers/task.py:36 msgid "Protocols" msgstr "" #: assets/serializers/asset/common.py:149 -#: assets/serializers/asset/common.py:173 +#: assets/serializers/asset/common.py:175 msgid "Node path" msgstr "" -#: assets/serializers/asset/common.py:170 -#: assets/serializers/asset/common.py:423 +#: assets/serializers/asset/common.py:172 +#: assets/serializers/asset/common.py:426 msgid "Auto info" msgstr "" -#: assets/serializers/asset/common.py:268 +#: assets/serializers/asset/common.py:271 msgid "Platform not exist" msgstr "" -#: assets/serializers/asset/common.py:304 +#: assets/serializers/asset/common.py:307 msgid "port out of range (0-65535)" msgstr "" -#: assets/serializers/asset/common.py:311 +#: assets/serializers/asset/common.py:314 msgid "Protocol is required: {}" msgstr "" -#: assets/serializers/asset/common.py:350 +#: assets/serializers/asset/common.py:353 msgid "Invalid data" msgstr "" @@ -2829,6 +2830,12 @@ msgstr "" msgid "Postgresql ssl model help text" msgstr "" +#: assets/serializers/asset/ds.py:18 +msgid "" +"The domain part used by the directory service (e.g., AD) and appended to the " +"username during login, such as example.com in user@example.com." +msgstr "" + #: assets/serializers/asset/gpt.py:20 msgid "" "If the server cannot directly connect to the API address, you need set up an " @@ -2881,7 +2888,7 @@ msgid "Disk total" msgstr "" #: assets/serializers/asset/info/gathered.py:16 -#: authentication/serializers/connect_token_secret.py:115 +#: authentication/serializers/connect_token_secret.py:117 msgid "OS" msgstr "" @@ -2905,7 +2912,7 @@ msgstr "" msgid "Types" msgstr "" -#: assets/serializers/domain.py:21 +#: assets/serializers/domain.py:20 msgid "" "A gateway is a network proxy for a zone, and when connecting assets within " "the zone, the connection is routed through the gateway." @@ -3018,11 +3025,11 @@ msgstr "" msgid "Default Domain" msgstr "" -#: assets/serializers/platform.py:234 +#: assets/serializers/platform.py:239 msgid "type is required" msgstr "" -#: assets/serializers/platform.py:249 +#: assets/serializers/platform.py:254 msgid "Protocols is required" msgstr "" @@ -3177,7 +3184,7 @@ msgstr "" msgid "Symlink" msgstr "" -#: audits/const.py:18 audits/const.py:28 +#: audits/const.py:18 audits/const.py:29 #: ops/templates/ops/celery_task_log.html:86 #: terminal/api/session/session.py:154 msgid "Download" @@ -3200,56 +3207,60 @@ msgstr "" msgid "Create" msgstr "" -#: audits/const.py:29 +#: audits/const.py:27 templates/_csv_import_export.html:8 +msgid "Export" +msgstr "" + +#: audits/const.py:30 msgid "Connect" msgstr "" -#: audits/const.py:30 authentication/templates/authentication/login.html:329 +#: audits/const.py:31 authentication/templates/authentication/login.html:329 #: authentication/templates/authentication/login.html:401 #: templates/_header_bar.html:101 msgid "Login" msgstr "Sign in" -#: audits/const.py:35 rbac/tree.py:56 +#: audits/const.py:36 rbac/tree.py:56 msgid "Notifications" msgstr "" -#: audits/const.py:37 tickets/const.py:45 +#: audits/const.py:38 tickets/const.py:45 msgid "Approve" msgstr "" -#: audits/const.py:41 ops/models/celery.py:85 +#: audits/const.py:42 ops/models/celery.py:85 #: terminal/models/session/sharing.py:128 tickets/const.py:25 #: xpack/plugins/cloud/const.py:67 msgid "Finished" msgstr "" -#: audits/const.py:46 settings/serializers/terminal.py:6 +#: audits/const.py:47 settings/serializers/terminal.py:6 #: terminal/models/applet/host.py:26 terminal/models/component/terminal.py:185 #: terminal/models/virtualapp/provider.py:14 terminal/serializers/session.py:57 #: terminal/serializers/session.py:113 msgid "Terminal" msgstr "" -#: audits/const.py:51 audits/models.py:133 +#: audits/const.py:52 audits/models.py:133 msgid "Operate log" msgstr "" -#: audits/const.py:52 +#: audits/const.py:53 msgid "Session log" msgstr "" -#: audits/const.py:53 +#: audits/const.py:54 msgid "Login log" msgstr "" -#: audits/const.py:54 rbac/tree.py:64 terminal/models/applet/host.py:144 +#: audits/const.py:55 rbac/tree.py:64 terminal/models/applet/host.py:144 #: terminal/models/component/task.py:22 #: xpack/plugins/cloud/serializers/account.py:77 msgid "Task" msgstr "" -#: audits/const.py:60 +#: audits/const.py:61 msgid "-" msgstr "" @@ -3267,7 +3278,7 @@ msgstr "" msgid "Remote addr" msgstr "" -#: audits/models.py:62 audits/serializers.py:62 +#: audits/models.py:62 audits/serializers.py:61 msgid "Operate" msgstr "" @@ -3292,17 +3303,17 @@ msgstr "" msgid "File transfer log" msgstr "" -#: audits/models.py:95 audits/serializers.py:110 +#: audits/models.py:95 audits/serializers.py:109 msgid "Resource Type" msgstr "" #: audits/models.py:96 audits/models.py:99 audits/models.py:145 -#: audits/serializers.py:109 labels/serializers.py:46 +#: audits/serializers.py:108 labels/serializers.py:46 msgid "Resource" msgstr "" #: audits/models.py:102 audits/models.py:148 audits/models.py:178 -#: audits/models.py:314 audits/serializers.py:230 +#: audits/models.py:314 audits/serializers.py:232 #: terminal/serializers/command.py:75 msgid "Datetime" msgstr "" @@ -3336,7 +3347,7 @@ msgstr "" msgid "Login IP" msgstr "" -#: audits/models.py:201 audits/serializers.py:76 +#: audits/models.py:201 audits/serializers.py:75 #: authentication/templates/authentication/_mfa_confirm_modal.html:14 #: users/forms/profile.py:64 users/models/user/__init__.py:82 #: users/serializers/profile.py:71 @@ -3387,37 +3398,37 @@ msgid "Application ID" msgstr "" #: audits/serializers.py:33 ops/models/adhoc.py:24 ops/models/base.py:16 -#: ops/models/base.py:53 ops/models/celery.py:87 ops/models/job.py:154 -#: ops/models/job.py:237 ops/models/playbook.py:30 ops/models/variable.py:17 +#: ops/models/base.py:53 ops/models/celery.py:87 ops/models/job.py:156 +#: ops/models/job.py:239 ops/models/playbook.py:30 ops/models/variable.py:17 #: terminal/models/session/sharing.py:25 msgid "Creator" msgstr "" -#: audits/serializers.py:40 ops/serializers/celery.py:33 +#: audits/serializers.py:39 ops/serializers/celery.py:33 msgid "Execution cycle" msgstr "" -#: audits/serializers.py:93 +#: audits/serializers.py:92 msgid "Reason display" msgstr "" -#: audits/serializers.py:94 audits/serializers.py:208 +#: audits/serializers.py:93 audits/serializers.py:210 msgid "Auth backend display" msgstr "" -#: audits/serializers.py:158 +#: audits/serializers.py:157 #, python-format msgid "%s %s this resource" msgstr "" -#: audits/serializers.py:196 authentication/models/connection_token.py:51 +#: audits/serializers.py:198 authentication/models/connection_token.py:52 #: authentication/models/temp_token.py:13 perms/models/asset_permission.py:80 #: tickets/models/ticket/apply_application.py:31 #: tickets/models/ticket/apply_asset.py:21 users/models/user/__init__.py:101 msgid "Date expired" msgstr "" -#: audits/serializers.py:227 terminal/models/component/terminal.py:91 +#: audits/serializers.py:229 terminal/models/component/terminal.py:91 #: terminal/serializers/command.py:76 msgid "Remote Address" msgstr "" @@ -3528,39 +3539,39 @@ msgstr "" msgid "This action require verify your MFA" msgstr "" -#: authentication/api/connection_token.py:303 +#: authentication/api/connection_token.py:304 msgid "Reusable connection token is not allowed, global setting not enabled" msgstr "" -#: authentication/api/connection_token.py:423 +#: authentication/api/connection_token.py:424 msgid "Anonymous account is not supported for this asset" msgstr "" -#: authentication/api/connection_token.py:455 +#: authentication/api/connection_token.py:454 msgid "Permission expired" msgstr "" -#: authentication/api/connection_token.py:488 +#: authentication/api/connection_token.py:487 msgid "ACL action is reject: {}({})" msgstr "" -#: authentication/api/connection_token.py:492 +#: authentication/api/connection_token.py:491 msgid "ACL action is review" msgstr "" -#: authentication/api/connection_token.py:502 +#: authentication/api/connection_token.py:501 msgid "ACL action is face verify" msgstr "" -#: authentication/api/connection_token.py:507 +#: authentication/api/connection_token.py:506 msgid "ACL action not supported for this asset" msgstr "" -#: authentication/api/connection_token.py:514 +#: authentication/api/connection_token.py:513 msgid "ACL action is face online" msgstr "" -#: authentication/api/connection_token.py:533 +#: authentication/api/connection_token.py:532 msgid "No available face feature" msgstr "" @@ -3677,16 +3688,16 @@ msgstr "" msgid "SMS" msgstr "" -#: authentication/const.py:34 +#: authentication/const.py:35 msgid "Face Recognition" msgstr "" -#: authentication/const.py:35 settings/serializers/auth/radius.py:14 +#: authentication/const.py:36 settings/serializers/auth/radius.py:14 #: settings/serializers/auth/radius.py:16 msgid "Radius" msgstr "" -#: authentication/const.py:36 +#: authentication/const.py:37 msgid "Custom" msgstr "" @@ -3871,7 +3882,9 @@ msgstr "" msgid "Captcha" msgstr "" -#: authentication/forms.py:66 users/forms/profile.py:28 +#: authentication/forms.py:66 authentication/mfa/email.py:41 +#: authentication/templates/authentication/_msg_mfa_email_code.html:12 +#: users/forms/profile.py:28 msgid "MFA code" msgstr "" @@ -3901,6 +3914,14 @@ msgstr "" msgid "MFA custom global enabled, cannot disable" msgstr "" +#: authentication/mfa/email.py:11 +msgid "Email verify code invalid" +msgstr "" + +#: authentication/mfa/email.py:17 +msgid "Email verification code" +msgstr "" + #: authentication/mfa/face.py:55 msgid "Bind face to enable" msgstr "" @@ -3949,7 +3970,7 @@ msgstr "" msgid "Clear phone number to disable" msgstr "" -#: authentication/middleware.py:95 settings/utils/ldap.py:691 +#: authentication/middleware.py:95 settings/utils/ldap.py:711 msgid "Authentication failed (before login check failed): {}" msgstr "" @@ -3971,22 +3992,22 @@ msgstr "" msgid "Please change your password" msgstr "" -#: authentication/models/connection_token.py:42 +#: authentication/models/connection_token.py:43 #: terminal/serializers/storage.py:114 msgid "Account name" msgstr "" -#: authentication/models/connection_token.py:43 +#: authentication/models/connection_token.py:44 msgid "Input username" msgstr "" -#: authentication/models/connection_token.py:44 +#: authentication/models/connection_token.py:45 #: authentication/serializers/connection_token.py:18 msgid "Input secret" msgstr "" -#: authentication/models/connection_token.py:45 -#: authentication/serializers/connect_token_secret.py:114 +#: authentication/models/connection_token.py:46 +#: authentication/serializers/connect_token_secret.py:116 #: settings/serializers/msg.py:28 terminal/models/applet/applet.py:43 #: terminal/models/virtualapp/virtualapp.py:24 #: terminal/serializers/session.py:23 terminal/serializers/session.py:50 @@ -3994,69 +4015,69 @@ msgstr "" msgid "Protocol" msgstr "" -#: authentication/models/connection_token.py:46 +#: authentication/models/connection_token.py:47 msgid "Connect method" msgstr "" -#: authentication/models/connection_token.py:48 +#: authentication/models/connection_token.py:49 msgid "User display" msgstr "" -#: authentication/models/connection_token.py:49 +#: authentication/models/connection_token.py:50 msgid "Asset display" msgstr "" -#: authentication/models/connection_token.py:50 +#: authentication/models/connection_token.py:51 msgid "Reusable" msgstr "" -#: authentication/models/connection_token.py:55 +#: authentication/models/connection_token.py:56 #: perms/models/asset_permission.py:83 msgid "From ticket" msgstr "" -#: authentication/models/connection_token.py:57 +#: authentication/models/connection_token.py:58 msgid "Face monitor token" msgstr "" -#: authentication/models/connection_token.py:68 +#: authentication/models/connection_token.py:69 msgid "Can expire connection token" msgstr "" -#: authentication/models/connection_token.py:69 +#: authentication/models/connection_token.py:70 msgid "Can reuse connection token" msgstr "" -#: authentication/models/connection_token.py:71 +#: authentication/models/connection_token.py:72 msgid "Connection token" msgstr "" -#: authentication/models/connection_token.py:132 +#: authentication/models/connection_token.py:163 msgid "Connection token inactive" msgstr "" -#: authentication/models/connection_token.py:136 +#: authentication/models/connection_token.py:167 msgid "Connection token expired at: {}" msgstr "" -#: authentication/models/connection_token.py:139 +#: authentication/models/connection_token.py:170 #: terminal/serializers/session.py:95 msgid "No user or invalid user" msgstr "" -#: authentication/models/connection_token.py:142 +#: authentication/models/connection_token.py:173 msgid "No asset or inactive asset" msgstr "" -#: authentication/models/connection_token.py:290 +#: authentication/models/connection_token.py:341 msgid "Can view super connection token secret" msgstr "" -#: authentication/models/connection_token.py:292 +#: authentication/models/connection_token.py:343 msgid "Super connection token" msgstr "" -#: authentication/models/connection_token.py:309 +#: authentication/models/connection_token.py:360 msgid "Admin connection token" msgstr "" @@ -4070,7 +4091,7 @@ msgstr "" msgid "Private key" msgstr "" -#: authentication/models/ssh_key.py:18 settings/serializers/terminal.py:34 +#: authentication/models/ssh_key.py:18 settings/serializers/terminal.py:38 #: users/forms/profile.py:175 users/models/user/__init__.py:92 #: xpack/plugins/cloud/serializers/account_attrs.py:211 msgid "Public key" @@ -4096,39 +4117,39 @@ msgstr "" msgid "binding reminder" msgstr "" -#: authentication/serializers/connect_token_secret.py:116 +#: authentication/serializers/connect_token_secret.py:118 msgid "Is builtin" msgstr "Builtin" -#: authentication/serializers/connect_token_secret.py:120 +#: authentication/serializers/connect_token_secret.py:122 msgid "Options" msgstr "" -#: authentication/serializers/connect_token_secret.py:127 +#: authentication/serializers/connect_token_secret.py:129 #: ops/notifications.py:19 rbac/tree.py:60 msgid "Component" msgstr "" -#: authentication/serializers/connect_token_secret.py:136 +#: authentication/serializers/connect_token_secret.py:138 #: perms/serializers/user_permission.py:28 xpack/plugins/cloud/models.py:389 msgid "Domain" msgstr "" -#: authentication/serializers/connect_token_secret.py:138 +#: authentication/serializers/connect_token_secret.py:140 msgid "Expired now" msgstr "" -#: authentication/serializers/connect_token_secret.py:171 +#: authentication/serializers/connect_token_secret.py:173 #: terminal/models/virtualapp/virtualapp.py:25 msgid "Image name" msgstr "" -#: authentication/serializers/connect_token_secret.py:172 +#: authentication/serializers/connect_token_secret.py:174 #: terminal/models/virtualapp/virtualapp.py:27 msgid "Image port" msgstr "" -#: authentication/serializers/connect_token_secret.py:173 +#: authentication/serializers/connect_token_secret.py:175 #: terminal/models/virtualapp/virtualapp.py:26 msgid "Image protocol" msgstr "" @@ -4183,7 +4204,7 @@ msgid "" msgstr "" #: authentication/serializers/ssh_key.py:57 users/forms/profile.py:164 -#: users/serializers/profile.py:134 users/serializers/profile.py:161 +#: users/serializers/profile.py:142 users/serializers/profile.py:169 msgid "Not a valid ssh public key" msgstr "" @@ -4220,12 +4241,14 @@ msgid "Show" msgstr "" #: authentication/templates/authentication/_access_key_modal.html:66 -#: users/const.py:42 users/templates/users/user_verify_mfa.html:36 +#: settings/serializers/terminal.py:24 users/const.py:42 +#: users/templates/users/user_verify_mfa.html:36 msgid "Disable" msgstr "" #: authentication/templates/authentication/_access_key_modal.html:67 -#: users/const.py:43 users/templates/users/mfa_setting.html:120 +#: settings/serializers/terminal.py:24 users/const.py:43 +#: users/templates/users/mfa_setting.html:120 #: users/templates/users/mfa_setting.html:158 #: users/templates/users/mfa_setting.html:177 msgid "Enable" @@ -4259,10 +4282,11 @@ msgid "Code error" msgstr "" #: authentication/templates/authentication/_msg_different_city.html:3 +#: authentication/templates/authentication/_msg_mfa_email_code.html:9 #: authentication/templates/authentication/_msg_oauth_bind.html:3 #: authentication/templates/authentication/_msg_reset_password.html:3 #: authentication/templates/authentication/_msg_reset_password_code.html:9 -#: jumpserver/conf.py:539 +#: jumpserver/conf.py:540 #: perms/templates/perms/_msg_item_permissions_expire.html:3 #: tickets/templates/tickets/approve_check_password.html:32 #: users/templates/users/_msg_account_expire_reminder.html:4 @@ -4281,6 +4305,11 @@ msgid "" "account password in time." msgstr "" +#: authentication/templates/authentication/_msg_mfa_email_code.html:15 +#: authentication/templates/authentication/_msg_reset_password_code.html:18 +msgid "The validity period of the verification code is one minute" +msgstr "" + #: authentication/templates/authentication/_msg_oauth_bind.html:6 msgid "Your account has just been bound to" msgstr "" @@ -4327,10 +4356,6 @@ msgid "" "Copy the verification code to the Reset Password page to reset the password." msgstr "" -#: authentication/templates/authentication/_msg_reset_password_code.html:18 -msgid "The validity period of the verification code is one minute" -msgstr "" - #: authentication/templates/authentication/_msg_rest_password_success.html:5 msgid "Your password has just been successfully updated" msgstr "" @@ -4745,74 +4770,90 @@ msgstr "" msgid "Invalid excel file" msgstr "" -#: common/drf/renders/base.py:138 +#: common/drf/renders/base.py:140 msgid "Yes/No" msgstr "" -#: common/drf/renders/base.py:141 +#: common/drf/renders/base.py:143 msgid "Text, max length {}" msgstr "" -#: common/drf/renders/base.py:143 +#: common/drf/renders/base.py:145 msgid "Long text, no length limit" msgstr "" -#: common/drf/renders/base.py:145 +#: common/drf/renders/base.py:147 msgid "Number, min {} max {}" msgstr "" -#: common/drf/renders/base.py:148 +#: common/drf/renders/base.py:150 msgid "Datetime format {}" msgstr "" -#: common/drf/renders/base.py:154 +#: common/drf/renders/base.py:156 msgid "" "Choices, format name(value), name is optional for human read, value is " "requisite, options {}" msgstr "" -#: common/drf/renders/base.py:157 +#: common/drf/renders/base.py:159 msgid "Choices, options {}" msgstr "" -#: common/drf/renders/base.py:159 +#: common/drf/renders/base.py:161 msgid "Phone number, format +8612345678901" msgstr "" -#: common/drf/renders/base.py:161 +#: common/drf/renders/base.py:163 msgid "Label, format [\"key:value\"]" msgstr "" -#: common/drf/renders/base.py:163 +#: common/drf/renders/base.py:165 msgid "" "Object, format name(id), name is optional for human read, id is requisite" msgstr "" -#: common/drf/renders/base.py:165 +#: common/drf/renders/base.py:167 msgid "Object, format id" msgstr "" -#: common/drf/renders/base.py:169 +#: common/drf/renders/base.py:171 msgid "" "Objects, format [\"name(id)\", ...], name is optional for human read, id is " "requisite" msgstr "" -#: common/drf/renders/base.py:171 +#: common/drf/renders/base.py:173 msgid "" "Labels, format [\"key:value\", ...], if label not exists, will create it" msgstr "" -#: common/drf/renders/base.py:173 +#: common/drf/renders/base.py:175 msgid "Objects, format [\"id\", ...]" msgstr "" -#: common/drf/renders/base.py:271 +#: common/drf/renders/base.py:275 msgid "" "{} - The encryption password has not been set - please go to personal " "information -> file encryption password to set the encryption password" msgstr "" +#: common/drf/renders/mixins.py:37 labels/serializers.py:22 +msgid "Resource count" +msgstr "Resource count" + +#: common/drf/renders/mixins.py:46 +msgid "Export all" +msgstr "" + +#: common/drf/renders/mixins.py:48 +msgid "Export only selected items" +msgstr "" + +#: common/drf/renders/mixins.py:50 +msgid "Export filtered" +msgstr "" + #: common/exceptions.py:15 xpack/plugins/cloud/ws.py:37 #, python-format msgid "%s object does not exist." @@ -4842,15 +4883,15 @@ msgstr "" msgid "Unexpect error occur" msgstr "" -#: common/plugins/es.py:35 +#: common/plugins/es.py:36 msgid "Invalid elasticsearch config" msgstr "" -#: common/plugins/es.py:40 +#: common/plugins/es.py:41 msgid "Not Support Elasticsearch8" msgstr "" -#: common/plugins/es.py:46 +#: common/plugins/es.py:47 msgid "" "Connection failed: Self-signed certificate used. Please check server " "certificate configuration" @@ -5038,16 +5079,16 @@ msgstr "" msgid "The message code provided is invalid or has expired" msgstr "" -#: jumpserver/conf.py:533 +#: jumpserver/conf.py:534 #, python-brace-format msgid "The verification code is: {code}" msgstr "" -#: jumpserver/conf.py:538 +#: jumpserver/conf.py:539 msgid "Create account successfully" msgstr "" -#: jumpserver/conf.py:540 +#: jumpserver/conf.py:541 msgid "Your account has been created successfully" msgstr "" @@ -5097,10 +5138,6 @@ msgstr "" msgid "Tagged resource" msgstr "" -#: labels/serializers.py:22 -msgid "Resource count" -msgstr "Resource count" - #: labels/serializers.py:28 msgid "Cannot contain \":,\"" msgstr "" @@ -5144,22 +5181,19 @@ msgid "" " work orders, and other notifications" msgstr "" -#: ops/ansible/inventory.py:117 ops/models/job.py:68 +#: ops/ansible/inventory.py:126 ops/ansible/inventory.py:196 +#: ops/models/job.py:69 msgid "No account available" msgstr "" -#: ops/ansible/inventory.py:298 +#: ops/ansible/inventory.py:318 ops/ansible/inventory.py:360 msgid "Ansible disabled" msgstr "" -#: ops/ansible/inventory.py:314 +#: ops/ansible/inventory.py:376 msgid "Skip hosts below:" msgstr "" -#: ops/api/adhoc.py:32 -msgid "Deleting other people's script is not allowed" -msgstr "" - #: ops/api/celery.py:66 ops/api/celery.py:81 msgid "Waiting task start" msgstr "" @@ -5172,67 +5206,63 @@ msgstr "" msgid "Task {} args or kwargs error" msgstr "" -#: ops/api/job.py:68 +#: ops/api/job.py:70 #, python-brace-format msgid "" "Asset ({asset}) must have at least one of the following protocols added: " "SSH, SFTP, or WinRM" msgstr "" -#: ops/api/job.py:69 +#: ops/api/job.py:71 #, python-brace-format msgid "Asset ({asset}) authorization is missing SSH, SFTP, or WinRM protocol" msgstr "" -#: ops/api/job.py:70 +#: ops/api/job.py:72 #, python-brace-format msgid "Asset ({asset}) authorization lacks upload permissions" msgstr "" -#: ops/api/job.py:158 +#: ops/api/job.py:160 msgid "Duplicate file exists" msgstr "" -#: ops/api/job.py:163 +#: ops/api/job.py:165 #, python-brace-format msgid "" "File size exceeds maximum limit. Please select a file smaller than {limit}MB" msgstr "" -#: ops/api/job.py:236 +#: ops/api/job.py:238 msgid "" "The task is being created and cannot be interrupted. Please try again later." msgstr "" #: ops/api/playbook.py:49 -msgid "Deleting other people's playbook is not allowed" -msgstr "" - -#: ops/api/playbook.py:55 msgid "Currently playbook is being used in a job" msgstr "" -#: ops/api/playbook.py:128 +#: ops/api/playbook.py:122 msgid "Unsupported file content" msgstr "" -#: ops/api/playbook.py:130 ops/api/playbook.py:176 ops/api/playbook.py:224 +#: ops/api/playbook.py:124 ops/api/playbook.py:170 ops/api/playbook.py:218 msgid "Invalid file path" msgstr "" -#: ops/api/playbook.py:202 +#: ops/api/playbook.py:196 msgid "This file can not be rename" msgstr "" -#: ops/api/playbook.py:221 +#: ops/api/playbook.py:215 msgid "File already exists" msgstr "" -#: ops/api/playbook.py:239 +#: ops/api/playbook.py:233 msgid "File key is required" msgstr "" -#: ops/api/playbook.py:242 +#: ops/api/playbook.py:236 msgid "This file can not be delete" msgstr "" @@ -5281,7 +5311,7 @@ msgstr "" msgid "Adhoc" msgstr "" -#: ops/const.py:39 ops/models/job.py:152 ops/models/playbook.py:89 +#: ops/const.py:39 ops/models/job.py:154 ops/models/playbook.py:89 #: ops/models/variable.py:23 msgid "Playbook" msgstr "" @@ -5368,17 +5398,17 @@ msgid "no valid program entry found." msgstr "" #: ops/mixin.py:34 ops/mixin.py:166 settings/serializers/auth/ldap.py:74 -#: settings/serializers/auth/ldap_ha.py:57 +#: settings/serializers/auth/ldap_ha.py:56 msgid "Periodic run" msgstr "Periodic" #: ops/mixin.py:36 ops/mixin.py:113 ops/mixin.py:172 -#: settings/serializers/auth/ldap.py:81 settings/serializers/auth/ldap_ha.py:64 +#: settings/serializers/auth/ldap.py:81 settings/serializers/auth/ldap_ha.py:63 msgid "Interval" msgstr "" #: ops/mixin.py:39 ops/mixin.py:111 ops/mixin.py:169 -#: settings/serializers/auth/ldap.py:78 settings/serializers/auth/ldap_ha.py:61 +#: settings/serializers/auth/ldap.py:78 settings/serializers/auth/ldap_ha.py:60 msgid "Crontab" msgstr "" @@ -5402,7 +5432,11 @@ msgstr "Period" msgid "* Please enter a valid crontab expression" msgstr "" -#: ops/mixin.py:204 settings/serializers/auth/mixin.py:12 +#: ops/mixin.py:194 +msgid "Crontab minute must not contain '*'" +msgstr "" + +#: ops/mixin.py:208 settings/serializers/auth/mixin.py:12 msgid "Require interval or crontab setting" msgstr "" @@ -5410,11 +5444,11 @@ msgstr "" msgid "Pattern" msgstr "" -#: ops/models/adhoc.py:22 ops/models/job.py:149 +#: ops/models/adhoc.py:22 ops/models/job.py:151 msgid "Module" msgstr "" -#: ops/models/adhoc.py:23 ops/models/celery.py:82 ops/models/job.py:147 +#: ops/models/adhoc.py:23 ops/models/celery.py:82 ops/models/job.py:149 #: terminal/models/component/task.py:14 msgid "Args" msgstr "" @@ -5457,48 +5491,52 @@ msgstr "" msgid "Celery Task Execution" msgstr "" -#: ops/models/job.py:150 +#: ops/models/job.py:82 +msgid "Module {} is not suitable for this asset" +msgstr "" + +#: ops/models/job.py:152 msgid "Run dir" msgstr "" -#: ops/models/job.py:151 +#: ops/models/job.py:153 msgid "Timeout (Seconds)" msgstr "Timeout (Sec)" -#: ops/models/job.py:157 +#: ops/models/job.py:159 msgid "Use Parameter Define" msgstr "" -#: ops/models/job.py:158 +#: ops/models/job.py:160 msgid "Parameters define" msgstr "" -#: ops/models/job.py:159 +#: ops/models/job.py:161 msgid "Periodic variable" msgstr "" -#: ops/models/job.py:160 +#: ops/models/job.py:162 msgid "Run as" msgstr "" -#: ops/models/job.py:162 +#: ops/models/job.py:164 msgid "Run as policy" msgstr "" -#: ops/models/job.py:219 ops/models/variable.py:28 ops/serializers/job.py:111 +#: ops/models/job.py:221 ops/models/variable.py:28 ops/serializers/job.py:111 #: terminal/notifications.py:182 msgid "Job" msgstr "" -#: ops/models/job.py:242 +#: ops/models/job.py:244 msgid "Material" msgstr "" -#: ops/models/job.py:244 +#: ops/models/job.py:246 msgid "Material Type" msgstr "" -#: ops/models/job.py:556 +#: ops/models/job.py:558 msgid "Job Execution" msgstr "" @@ -5743,7 +5781,7 @@ msgstr "" #: orgs/mixins/models.py:48 orgs/mixins/models.py:73 msgid "Please save in a org" -msgstr "請選擇一個組織後再保存" +msgstr "" #: orgs/mixins/models.py:57 orgs/mixins/serializers.py:25 orgs/models.py:91 #: rbac/const.py:7 rbac/models/rolebinding.py:56 @@ -5784,7 +5822,7 @@ msgid "Can not delete virtual org" msgstr "" #: orgs/serializers.py:10 perms/serializers/permission.py:59 -#: rbac/serializers/role.py:27 users/serializers/group.py:54 +#: rbac/serializers/role.py:27 users/serializers/group.py:53 msgid "Users amount" msgstr "" @@ -6131,7 +6169,7 @@ msgid "Storage" msgstr "" #: rbac/tree.py:61 terminal/models/applet/applet.py:53 -#: terminal/models/applet/applet.py:328 terminal/models/applet/host.py:30 +#: terminal/models/applet/applet.py:369 terminal/models/applet/host.py:30 #: terminal/serializers/applet.py:15 msgid "Applet" msgstr "" @@ -6379,7 +6417,7 @@ msgid "CAS" msgstr "" #: settings/serializers/auth/cas.py:15 settings/serializers/auth/ldap.py:45 -#: settings/serializers/auth/ldap_ha.py:28 settings/serializers/auth/oidc.py:61 +#: settings/serializers/auth/ldap_ha.py:27 settings/serializers/auth/oidc.py:61 msgid "Server" msgstr "" @@ -6406,7 +6444,7 @@ msgstr "" #: settings/serializers/auth/cas.py:34 settings/serializers/auth/dingtalk.py:18 #: settings/serializers/auth/feishu.py:18 settings/serializers/auth/lark.py:17 -#: settings/serializers/auth/ldap.py:67 settings/serializers/auth/ldap_ha.py:50 +#: settings/serializers/auth/ldap.py:67 settings/serializers/auth/ldap_ha.py:49 #: settings/serializers/auth/oauth2.py:60 settings/serializers/auth/oidc.py:39 #: settings/serializers/auth/saml2.py:35 settings/serializers/auth/slack.py:18 #: settings/serializers/auth/wecom.py:18 @@ -6455,7 +6493,7 @@ msgid "" "name and the `value` is the Lark service user attribute name" msgstr "" -#: settings/serializers/auth/ldap.py:42 settings/serializers/auth/ldap.py:104 +#: settings/serializers/auth/ldap.py:42 settings/serializers/auth/ldap.py:108 msgid "LDAP" msgstr "" @@ -6463,52 +6501,62 @@ msgstr "" msgid "LDAP server URI" msgstr "" -#: settings/serializers/auth/ldap.py:49 settings/serializers/auth/ldap_ha.py:32 +#: settings/serializers/auth/ldap.py:49 settings/serializers/auth/ldap_ha.py:31 msgid "Bind DN" msgstr "" -#: settings/serializers/auth/ldap.py:50 settings/serializers/auth/ldap_ha.py:33 +#: settings/serializers/auth/ldap.py:50 settings/serializers/auth/ldap_ha.py:32 msgid "Binding Distinguished Name" msgstr "" -#: settings/serializers/auth/ldap.py:54 settings/serializers/auth/ldap_ha.py:37 +#: settings/serializers/auth/ldap.py:54 settings/serializers/auth/ldap_ha.py:36 msgid "Binding password" msgstr "" -#: settings/serializers/auth/ldap.py:57 settings/serializers/auth/ldap_ha.py:40 +#: settings/serializers/auth/ldap.py:57 settings/serializers/auth/ldap_ha.py:39 msgid "Search OU" msgstr "" -#: settings/serializers/auth/ldap.py:59 settings/serializers/auth/ldap_ha.py:42 +#: settings/serializers/auth/ldap.py:59 settings/serializers/auth/ldap_ha.py:41 msgid "" "User Search Base, if there are multiple OUs, you can separate them with the " "`|` symbol" msgstr "" -#: settings/serializers/auth/ldap.py:63 settings/serializers/auth/ldap_ha.py:46 +#: settings/serializers/auth/ldap.py:63 settings/serializers/auth/ldap_ha.py:45 msgid "Search filter" msgstr "" -#: settings/serializers/auth/ldap.py:64 settings/serializers/auth/ldap_ha.py:47 +#: settings/serializers/auth/ldap.py:64 settings/serializers/auth/ldap_ha.py:46 #, python-format msgid "Selection could include (cn|uid|sAMAccountName=%(user)s)" msgstr "" -#: settings/serializers/auth/ldap.py:69 settings/serializers/auth/ldap_ha.py:52 +#: settings/serializers/auth/ldap.py:69 settings/serializers/auth/ldap_ha.py:51 msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the LDAP service user attribute name" msgstr "" -#: settings/serializers/auth/ldap.py:85 settings/serializers/auth/ldap_ha.py:68 +#: settings/serializers/auth/ldap.py:85 settings/serializers/auth/ldap_ha.py:67 msgid "Connect timeout (s)" msgstr "" -#: settings/serializers/auth/ldap.py:90 settings/serializers/auth/ldap_ha.py:73 +#: settings/serializers/auth/ldap.py:88 settings/serializers/auth/ldap_ha.py:70 +msgid "Strict sync" +msgstr "" + +#: settings/serializers/auth/ldap.py:89 settings/serializers/auth/ldap_ha.py:71 +msgid "" +"In strict mode, users not found in LDAP will be disabled during full or " +"automatic sync" +msgstr "" + +#: settings/serializers/auth/ldap.py:94 settings/serializers/auth/ldap_ha.py:76 msgid "User DN cache timeout (s)" msgstr "" -#: settings/serializers/auth/ldap.py:92 +#: settings/serializers/auth/ldap.py:96 msgid "" "Caching the User DN obtained during user login authentication can " "effectively improve the speed of user authentication., 0 means no " @@ -6516,20 +6564,21 @@ msgid "" "the user DN cache" msgstr "" -#: settings/serializers/auth/ldap.py:98 settings/serializers/auth/ldap_ha.py:81 +#: settings/serializers/auth/ldap.py:102 +#: settings/serializers/auth/ldap_ha.py:84 msgid "Search paged size (piece)" msgstr "" -#: settings/serializers/auth/ldap_ha.py:25 -#: settings/serializers/auth/ldap_ha.py:87 +#: settings/serializers/auth/ldap_ha.py:24 +#: settings/serializers/auth/ldap_ha.py:90 msgid "LDAP HA" msgstr "" -#: settings/serializers/auth/ldap_ha.py:29 +#: settings/serializers/auth/ldap_ha.py:28 msgid "LDAP HA server URI" msgstr "" -#: settings/serializers/auth/ldap_ha.py:75 +#: settings/serializers/auth/ldap_ha.py:78 msgid "" "Caching the User DN obtained during user login authentication can " "effectivelyimprove the speed of user authentication., 0 means no cache
If " @@ -7306,143 +7355,147 @@ msgstr "" msgid "The third-party login modes include OIDC, CAS, and SAML2" msgstr "" -#: settings/serializers/security.py:128 +#: settings/serializers/security.py:129 +msgid "MFA via Email" +msgstr "" + +#: settings/serializers/security.py:130 +msgid "Email as a method for multi-factor authentication" +msgstr "" + +#: settings/serializers/security.py:133 msgid "OTP issuer name" msgstr "" -#: settings/serializers/security.py:132 +#: settings/serializers/security.py:137 msgid "OTP valid window" msgstr "" -#: settings/serializers/security.py:136 +#: settings/serializers/security.py:141 msgid "MFA verify TTL" msgstr "" -#: settings/serializers/security.py:138 +#: settings/serializers/security.py:143 msgid "" "Unit: second, The verification MFA takes effect only when you view the " "account password" msgstr "" -#: settings/serializers/security.py:143 +#: settings/serializers/security.py:148 msgid "MFA in login page" msgstr "" -#: settings/serializers/security.py:144 +#: settings/serializers/security.py:149 msgid "Eu security regulations(GDPR) require MFA to be on the login page" msgstr "" -#: settings/serializers/security.py:148 +#: settings/serializers/security.py:153 msgid "Verify code TTL (second)" msgstr "" -#: settings/serializers/security.py:149 +#: settings/serializers/security.py:154 msgid "Reset password and send SMS code expiration time" msgstr "" -#: settings/serializers/security.py:153 +#: settings/serializers/security.py:158 msgid "Login dynamic code" msgstr "" -#: settings/serializers/security.py:154 +#: settings/serializers/security.py:159 msgid "" "The password and additional code are sent to a third party authentication " "system for verification" msgstr "" -#: settings/serializers/security.py:158 +#: settings/serializers/security.py:163 msgid "Login captcha" msgstr "" -#: settings/serializers/security.py:159 +#: settings/serializers/security.py:164 msgid "Enable captcha to prevent robot authentication" msgstr "" -#: settings/serializers/security.py:162 +#: settings/serializers/security.py:167 msgid "Suspicious Login Verification" msgstr "" -#: settings/serializers/security.py:164 +#: settings/serializers/security.py:169 msgid "" "The system determines whether the login IP address belongs to a common login " "city. If the account is logged in from a common login city, the system sends " "a remote login reminder" msgstr "" -#: settings/serializers/security.py:170 +#: settings/serializers/security.py:175 msgid "Auto Disable Threshold (day)" msgstr "" -#: settings/serializers/security.py:171 +#: settings/serializers/security.py:176 msgid "" "Detect infrequent users daily and disable them if they exceed the " "predetermined time limit" msgstr "" -#: settings/serializers/security.py:191 +#: settings/serializers/security.py:196 msgid "Watermark" msgstr "" -#: settings/serializers/security.py:192 -msgid "Enabled, the web session and replay contains watermark information" -msgstr "" - -#: settings/serializers/security.py:196 +#: settings/serializers/security.py:200 msgid "Max idle time (minute)" msgstr "" -#: settings/serializers/security.py:197 +#: settings/serializers/security.py:201 msgid "If idle time more than it, disconnect connection." msgstr "" -#: settings/serializers/security.py:200 +#: settings/serializers/security.py:204 msgid "Session expire at browser closed" msgstr "" -#: settings/serializers/security.py:201 +#: settings/serializers/security.py:205 msgid "Whether to expire the session when the user closes their browser." msgstr "" -#: settings/serializers/security.py:206 +#: settings/serializers/security.py:210 msgid "Allow users to view asset session information" msgstr "" -#: settings/serializers/security.py:208 +#: settings/serializers/security.py:212 msgid "" "When a user connects to an asset, the account selection popup displays the " "number of active sessions for the current asset (RDP protocol only)." msgstr "" -#: settings/serializers/security.py:214 +#: settings/serializers/security.py:218 msgid "Max online time (hour)" msgstr "" -#: settings/serializers/security.py:215 +#: settings/serializers/security.py:219 msgid "If session connection time more than it, disconnect connection." msgstr "" -#: settings/serializers/security.py:218 +#: settings/serializers/security.py:222 msgid "Remember manual auth" msgstr "" -#: settings/serializers/security.py:221 +#: settings/serializers/security.py:225 #: terminal/templates/terminal/_msg_session_sharing.html:10 msgid "Session share" msgstr "" -#: settings/serializers/security.py:222 +#: settings/serializers/security.py:226 msgid "Enabled, Allows user active session to be shared with other users" msgstr "" -#: settings/serializers/security.py:228 +#: settings/serializers/security.py:232 msgid "Insecure command alert" msgstr "" -#: settings/serializers/security.py:231 +#: settings/serializers/security.py:235 msgid "Email recipient" msgstr "" -#: settings/serializers/security.py:232 +#: settings/serializers/security.py:236 msgid "Multiple user using , split" msgstr "" @@ -7455,22 +7508,26 @@ msgstr "" msgid "Auto" msgstr "" -#: settings/serializers/terminal.py:22 +#: settings/serializers/terminal.py:23 +msgid "Auto(Enabled for the first 5 minutes after startup, then disabled.)" +msgstr "" + +#: settings/serializers/terminal.py:26 msgid "Registration" msgstr "" -#: settings/serializers/terminal.py:24 +#: settings/serializers/terminal.py:28 msgid "" "Allow component register, after all component setup, you should disable this " "for security" msgstr "" -#: settings/serializers/terminal.py:30 +#: settings/serializers/terminal.py:34 msgid "" "* Allow users to log in to the KoKo component via password authentication" msgstr "" -#: settings/serializers/terminal.py:36 +#: settings/serializers/terminal.py:40 msgid "" "* Allow users to log in to the KoKo component via Public key " "authentication
If third-party authentication services, such as AD/LDAP, " @@ -7478,33 +7535,33 @@ msgid "" "after being deleted from the AD/LDAP server" msgstr "" -#: settings/serializers/terminal.py:43 +#: settings/serializers/terminal.py:47 msgid "Asset sorting" msgstr "" -#: settings/serializers/terminal.py:46 +#: settings/serializers/terminal.py:50 msgid "Asset page size" msgstr "" -#: settings/serializers/terminal.py:51 +#: settings/serializers/terminal.py:55 msgid "" "* You can individually configure the service address and port in the service " "endpoint
If enabled, the Luna page will display the DB client launch " "method when connecting to assets" msgstr "" -#: settings/serializers/terminal.py:59 +#: settings/serializers/terminal.py:63 msgid "" "* You can individually configure the service address and port in the service " "endpoint
If enabled, the Luna page will display the download rdp file " "button and RDP Client launch method when connecting to assets" msgstr "" -#: settings/serializers/terminal.py:66 +#: settings/serializers/terminal.py:70 msgid "Client connection" msgstr "" -#: settings/serializers/terminal.py:68 +#: settings/serializers/terminal.py:72 msgid "" "* Allow connecting to the KoKo component via SSH client
If enabled, the " "Luna page will display the SSH client launch method when connecting to assets" @@ -7524,36 +7581,36 @@ msgid "" "in the workbench" msgstr "" -#: settings/tasks/ldap.py:73 +#: settings/tasks/ldap.py:67 msgid "Periodic import ldap user" msgstr "" -#: settings/tasks/ldap.py:75 settings/tasks/ldap.py:85 +#: settings/tasks/ldap.py:69 settings/tasks/ldap.py:79 msgid "" "When LDAP auto-sync is configured, this task will be invoked to synchronize " "users" msgstr "" -#: settings/tasks/ldap.py:83 +#: settings/tasks/ldap.py:77 msgid "Periodic import ldap ha user" msgstr "" -#: settings/tasks/ldap.py:120 +#: settings/tasks/ldap.py:115 msgid "Registration periodic import ldap user task" msgstr "" -#: settings/tasks/ldap.py:122 +#: settings/tasks/ldap.py:117 msgid "" "When LDAP auto-sync parameters change, such as Crontab parameters, the LDAP " "sync task \n" " will be re-registered or updated, and this task will be invoked" msgstr "" -#: settings/tasks/ldap.py:136 +#: settings/tasks/ldap.py:131 msgid "Registration periodic import ldap ha user task" msgstr "" -#: settings/tasks/ldap.py:138 +#: settings/tasks/ldap.py:133 msgid "" "When LDAP HA auto-sync parameters change, such as Crontab parameters, the " "LDAP HA sync task \n" @@ -7576,113 +7633,113 @@ msgstr "" msgid "No user synchronization required" msgstr "" -#: settings/utils/ldap.py:509 +#: settings/utils/ldap.py:529 msgid "ldap:// or ldaps:// protocol is used." msgstr "" -#: settings/utils/ldap.py:520 +#: settings/utils/ldap.py:540 msgid "Host or port is disconnected: {}" msgstr "" -#: settings/utils/ldap.py:522 +#: settings/utils/ldap.py:542 msgid "The port is not the port of the LDAP service: {}" msgstr "" -#: settings/utils/ldap.py:524 +#: settings/utils/ldap.py:544 msgid "Please add certificate: {}" msgstr "" -#: settings/utils/ldap.py:528 settings/utils/ldap.py:555 -#: settings/utils/ldap.py:585 settings/utils/ldap.py:613 +#: settings/utils/ldap.py:548 settings/utils/ldap.py:575 +#: settings/utils/ldap.py:605 settings/utils/ldap.py:633 msgid "Unknown error: {}" msgstr "" -#: settings/utils/ldap.py:542 +#: settings/utils/ldap.py:562 msgid "Bind DN or Password incorrect" msgstr "" -#: settings/utils/ldap.py:549 +#: settings/utils/ldap.py:569 msgid "Please enter Bind DN: {}" msgstr "" -#: settings/utils/ldap.py:551 +#: settings/utils/ldap.py:571 msgid "Please enter Password: {}" msgstr "" -#: settings/utils/ldap.py:553 +#: settings/utils/ldap.py:573 msgid "Please enter correct Bind DN and Password: {}" msgstr "" -#: settings/utils/ldap.py:571 +#: settings/utils/ldap.py:591 msgid "Invalid User OU or User search filter: {}" msgstr "" -#: settings/utils/ldap.py:602 +#: settings/utils/ldap.py:622 msgid "LDAP User attr map not include: {}" msgstr "" -#: settings/utils/ldap.py:609 +#: settings/utils/ldap.py:629 msgid "LDAP User attr map is not dict" msgstr "" -#: settings/utils/ldap.py:628 +#: settings/utils/ldap.py:648 msgid "LDAP authentication is not enabled" msgstr "" -#: settings/utils/ldap.py:646 +#: settings/utils/ldap.py:666 msgid "Error (Invalid LDAP server): {}" msgstr "" -#: settings/utils/ldap.py:648 +#: settings/utils/ldap.py:668 msgid "Error (Invalid Bind DN): {}" msgstr "" -#: settings/utils/ldap.py:650 +#: settings/utils/ldap.py:670 msgid "Error (Invalid LDAP User attr map): {}" msgstr "" -#: settings/utils/ldap.py:652 +#: settings/utils/ldap.py:672 msgid "Error (Invalid User OU or User search filter): {}" msgstr "" -#: settings/utils/ldap.py:654 +#: settings/utils/ldap.py:674 msgid "Error (Not enabled LDAP authentication): {}" msgstr "" -#: settings/utils/ldap.py:656 +#: settings/utils/ldap.py:676 msgid "Error (Unknown): {}" msgstr "" -#: settings/utils/ldap.py:659 +#: settings/utils/ldap.py:679 msgid "Succeed: Match {} users" msgstr "" -#: settings/utils/ldap.py:689 +#: settings/utils/ldap.py:709 msgid "Authentication failed (configuration incorrect): {}" msgstr "" -#: settings/utils/ldap.py:693 +#: settings/utils/ldap.py:713 msgid "Authentication failed (username or password incorrect): {}" msgstr "" -#: settings/utils/ldap.py:695 +#: settings/utils/ldap.py:715 msgid "Authentication failed (Unknown): {}" msgstr "" -#: settings/utils/ldap.py:698 +#: settings/utils/ldap.py:718 msgid "Authentication success: {}" msgstr "" -#: settings/ws.py:222 +#: settings/ws.py:223 msgid "No LDAP user was found" msgstr "" -#: settings/ws.py:228 +#: settings/ws.py:232 msgid "Total {}, success {}, failure {}" msgstr "" -#: templates/_csv_import_export.html:8 -msgid "Export" +#: settings/ws.py:236 +msgid ", disabled {}" msgstr "" #: templates/_csv_import_export.html:13 templates/_csv_import_modal.html:5 @@ -7890,7 +7947,7 @@ msgstr "" msgid "Test failure: Please check configuration" msgstr "" -#: terminal/api/component/terminal.py:57 +#: terminal/api/component/terminal.py:56 msgid "Have online sessions" msgstr "" @@ -8070,7 +8127,7 @@ msgstr "" msgid "Can concurrent" msgstr "" -#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:179 +#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:194 #: terminal/serializers/storage.py:193 msgid "Hosts" msgstr "" @@ -8092,12 +8149,12 @@ msgstr "" msgid "Missing type in platform.yml" msgstr "" -#: terminal/models/applet/applet.py:330 terminal/models/applet/host.py:36 +#: terminal/models/applet/applet.py:371 terminal/models/applet/host.py:36 #: terminal/models/applet/host.py:138 msgid "Hosting" msgstr "" -#: terminal/models/applet/applet.py:336 +#: terminal/models/applet/applet.py:377 msgid "Applet Publication" msgstr "" @@ -8174,18 +8231,22 @@ msgid "SQLServer port" msgstr "" #: terminal/models/component/endpoint.py:25 +msgid "Oracle port" +msgstr "" + +#: terminal/models/component/endpoint.py:26 msgid "VNC port" msgstr "" -#: terminal/models/component/endpoint.py:33 -#: terminal/models/component/endpoint.py:120 -#: terminal/serializers/endpoint.py:80 terminal/serializers/storage.py:41 +#: terminal/models/component/endpoint.py:34 +#: terminal/models/component/endpoint.py:114 +#: terminal/serializers/endpoint.py:61 terminal/serializers/storage.py:41 #: terminal/serializers/storage.py:53 terminal/serializers/storage.py:83 #: terminal/serializers/storage.py:93 terminal/serializers/storage.py:101 msgid "Endpoint" msgstr "" -#: terminal/models/component/endpoint.py:126 +#: terminal/models/component/endpoint.py:120 msgid "Endpoint rule" msgstr "" @@ -8392,7 +8453,7 @@ msgid "Command and replay storage" msgstr "Storage" #: terminal/notifications.py:258 terminal/tasks.py:212 -#: xpack/plugins/cloud/api.py:160 +#: xpack/plugins/cloud/api.py:175 #: xpack/plugins/cloud/serializers/account.py:121 #: xpack/plugins/cloud/serializers/account.py:123 msgid "Test failure: Account invalid" @@ -8511,15 +8572,15 @@ msgid "" "restart the service to enable it." msgstr "" -#: terminal/serializers/applet_host.py:149 +#: terminal/serializers/applet_host.py:164 msgid "Install applets" msgstr "" -#: terminal/serializers/applet_host.py:179 +#: terminal/serializers/applet_host.py:194 msgid "Host ID" msgstr "" -#: terminal/serializers/applet_host.py:180 +#: terminal/serializers/applet_host.py:195 msgid "Applet ID" msgstr "" @@ -8547,39 +8608,25 @@ msgstr "" msgid "Timestamp" msgstr "" -#: terminal/serializers/endpoint.py:15 -msgid "Oracle port" -msgstr "" - -#: terminal/serializers/endpoint.py:18 -msgid "Oracle port range" -msgstr "" - -#: terminal/serializers/endpoint.py:20 -msgid "" -"Oracle proxy server listen port is dynamic, Each additional Oracle database " -"instance adds a port listener" -msgstr "" - -#: terminal/serializers/endpoint.py:38 +#: terminal/serializers/endpoint.py:26 msgid "" "The host address accessed when connecting to assets, if it is empty, the " "access address of the current browser will be used (the default endpoint " "does not allow modification of the host)" msgstr "" -#: terminal/serializers/endpoint.py:71 +#: terminal/serializers/endpoint.py:52 msgid "" "The assets within this IP range, the following endpoint will be used for the " "connection" msgstr "" -#: terminal/serializers/endpoint.py:72 +#: terminal/serializers/endpoint.py:53 msgid "" "If asset IP addresses under different endpoints conflict, use asset labels" msgstr "" -#: terminal/serializers/endpoint.py:76 +#: terminal/serializers/endpoint.py:57 msgid "Asset IP" msgstr "" @@ -8920,23 +8967,6 @@ msgstr "" msgid "view" msgstr "" -#: terminal/utils/db_port_mapper.py:88 -msgid "" -"No available port is matched. The number of databases may have exceeded the " -"number of ports open to the database agent service, Contact the " -"administrator to open more ports." -msgstr "" - -#: terminal/utils/db_port_mapper.py:116 -msgid "" -"No ports can be used, check and modify the limit on the number of ports that " -"Magnus listens on in the configuration file." -msgstr "" - -#: terminal/utils/db_port_mapper.py:118 -msgid "All available port count: {}, Already use port count: {}" -msgstr "" - #: tickets/api/ticket.py:88 tickets/models/ticket/general.py:289 msgid "Applicant" msgstr "" @@ -9591,7 +9621,7 @@ msgstr "" msgid "The old password is incorrect" msgstr "" -#: users/serializers/profile.py:37 users/serializers/profile.py:148 +#: users/serializers/profile.py:37 users/serializers/profile.py:156 msgid "Password does not match security rules" msgstr "" @@ -10052,15 +10082,15 @@ msgid "" "strategy will skipped." msgstr "" -#: xpack/plugins/cloud/api.py:72 +#: xpack/plugins/cloud/api.py:74 msgid "Test connection successful" msgstr "" -#: xpack/plugins/cloud/api.py:74 +#: xpack/plugins/cloud/api.py:76 msgid "Test connection failed: {}" msgstr "" -#: xpack/plugins/cloud/api.py:171 +#: xpack/plugins/cloud/api.py:196 msgid "User {} deleted the current resource and released the assets" msgstr "" diff --git a/apps/i18n/core/es/LC_MESSAGES/django.po b/apps/i18n/core/es/LC_MESSAGES/django.po index 8d02d6beb..00a4aa907 100644 --- a/apps/i18n/core/es/LC_MESSAGES/django.po +++ b/apps/i18n/core/es/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-20 11:52+0800\n" +"POT-Creation-Date: 2025-04-17 15:04+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,18 +18,18 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: accounts/api/account/account.py:121 +#: accounts/api/account/account.py:131 #: accounts/serializers/account/account.py:181 -#: accounts/serializers/account/account.py:342 +#: accounts/serializers/account/account.py:344 msgid "Account already exists" msgstr "La cuenta ya existe" #: accounts/api/account/application.py:78 -#: authentication/api/connection_token.py:452 +#: authentication/api/connection_token.py:451 msgid "Account not found" msgstr "Cuenta no encontrada" -#: accounts/api/automations/base.py:83 tickets/api/ticket.py:132 +#: accounts/api/automations/base.py:86 tickets/api/ticket.py:132 msgid "The parameter 'action' must be [{}]" msgstr "El parámetro 'action' debe ser [{}]" @@ -99,11 +99,9 @@ msgstr "" "Éxito: %s, Fallo: %s, Total: %s \n" "--- \n" "Resumen: \n" -"Normal: {}, Contraseñas débiles: {}, Contraseñas filtradas: {}, Contraseñas " -"duplicadas: {}, Sin contraseña: {}, Tiempo consumido: {} segundos. \n" +"Normal: {}, Contraseñas débiles: {}, Contraseñas filtradas: {}, Contraseñas duplicadas: {}, Sin contraseña: {}, Tiempo consumido: {} segundos. \n" "{} no puede estar vacío. \n" -">>>> Comienza la tarea de probar la conectividad de la cuenta del portal de " -"pruebas. \n" +">>>> Comienza la tarea de probar la conectividad de la cuenta del portal de pruebas. \n" "Contraseña \n" "Clave SSH \n" "Clave de acceso \n" @@ -114,7 +112,7 @@ msgstr "" "Cuentas con el mismo nombre \n" "Cuentas anónimas" -#: accounts/automations/base/manager.py:118 +#: accounts/automations/base/manager.py:119 msgid "No pending accounts found" msgstr "No se encontraron cuentas pendientes de procesar." @@ -127,14 +125,11 @@ msgstr "Éxitos: %s, Fracasos: %s, Total: %s" msgid "" "---\n" "Summary: \n" -"ok: {}, weak password: {}, leaked password: {}, repeated password: {}, no " -"secret: {}, using time: {}s" +"ok: {}, weak password: {}, leaked password: {}, repeated password: {}, no secret: {}, using time: {}s" msgstr "" "---\n" "Resumen: \n" -"Normales: {}, Contraseñas débiles: {}, Contraseñas filtradas: {}, " -"Contraseñas duplicadas: {}, Sin contraseña: {}, Tiempo transcurrido: {} " -"segundos" +"Normales: {}, Contraseñas débiles: {}, Contraseñas filtradas: {}, Contraseñas duplicadas: {}, Sin contraseña: {}, Tiempo transcurrido: {} segundos" #: accounts/automations/push_account/manager.py:33 msgid "Secret cannot be empty" @@ -150,14 +145,14 @@ msgstr "" #: accounts/const/account.py:6 #: accounts/serializers/automations/change_secret.py:34 -#: audits/signal_handlers/login_log.py:34 authentication/confirm/password.py:25 -#: authentication/confirm/password.py:27 authentication/const.py:10 -#: authentication/forms.py:28 +#: audits/signal_handlers/login_log.py:34 +#: authentication/confirm/password.py:25 authentication/confirm/password.py:27 +#: authentication/const.py:10 authentication/forms.py:28 #: authentication/templates/authentication/login.html:362 #: authentication/templates/authentication/login.html:408 #: settings/serializers/auth/ldap.py:27 settings/serializers/auth/ldap.py:53 -#: settings/serializers/auth/ldap_ha.py:36 settings/serializers/msg.py:37 -#: settings/serializers/terminal.py:28 terminal/serializers/storage.py:123 +#: settings/serializers/auth/ldap_ha.py:35 settings/serializers/msg.py:37 +#: settings/serializers/terminal.py:32 terminal/serializers/storage.py:123 #: terminal/serializers/storage.py:142 users/forms/profile.py:22 #: users/serializers/user.py:148 #: users/templates/users/_msg_user_created.html:13 @@ -219,7 +214,8 @@ msgstr "Descubrir" msgid "Template" msgstr "Plantilla" -#: accounts/const/account.py:32 ops/const.py:46 xpack/plugins/cloud/const.py:68 +#: accounts/const/account.py:32 ops/const.py:46 +#: xpack/plugins/cloud/const.py:68 msgid "Skip" msgstr "Omitir" @@ -229,7 +225,7 @@ msgid "Update" msgstr "Actualizar" #: accounts/const/account.py:34 accounts/const/automation.py:115 -#: accounts/serializers/automations/change_secret.py:169 audits/const.py:65 +#: accounts/serializers/automations/change_secret.py:169 audits/const.py:66 #: audits/signal_handlers/activity_log.py:34 common/const/choices.py:67 #: ops/const.py:76 terminal/const.py:81 xpack/plugins/cloud/const.py:47 msgid "Failed" @@ -332,7 +328,7 @@ msgstr "Crear y enviar" msgid "Only create" msgstr "Solo crear" -#: accounts/const/automation.py:109 +#: accounts/const/automation.py:109 authentication/const.py:34 #: authentication/serializers/password_mfa.py:16 #: authentication/serializers/password_mfa.py:24 #: notifications/backends/__init__.py:10 settings/serializers/msg.py:21 @@ -348,7 +344,7 @@ msgid "SFTP" msgstr "SFTP" #: accounts/const/automation.py:116 -#: accounts/serializers/automations/change_secret.py:168 audits/const.py:64 +#: accounts/serializers/automations/change_secret.py:168 audits/const.py:65 #: audits/models.py:65 audits/signal_handlers/activity_log.py:34 #: common/const/choices.py:66 ops/const.py:74 ops/serializers/celery.py:48 #: terminal/const.py:80 terminal/models/session/sharing.py:121 @@ -438,36 +434,14 @@ msgid "" "Vault operation failed. Please retry or check your account information on " "Vault." msgstr "" -"La operación de Vault ha fallado, por favor inténtalo de nuevo o verifica la " -"información de la cuenta en Vault." - -#: accounts/filters.py:194 -msgid "Enter a valid UUID." -msgstr "" - -#: accounts/mixins.py:35 -msgid "Export all" -msgstr "Exportar todo" - -#: accounts/mixins.py:37 -msgid "Export only selected items" -msgstr "Exportar solo selección" - -#: accounts/mixins.py:42 -#, python-format -msgid "Export filtered: %s" -msgstr "Exportar búsqueda: %s" - -#: accounts/mixins.py:48 -#, python-format -msgid "User %s view/export secret" -msgstr "El usuario %s ha visto/exportado la contraseña" +"La operación de Vault ha fallado, por favor inténtalo de nuevo o verifica la" +" información de la cuenta en Vault." #: accounts/models/account.py:85 #: accounts/models/automations/check_account.py:59 #: accounts/models/automations/gather_account.py:17 -#: accounts/serializers/account/account.py:226 -#: accounts/serializers/account/account.py:274 +#: accounts/serializers/account/account.py:227 +#: accounts/serializers/account/account.py:276 #: accounts/serializers/automations/change_secret.py:113 #: accounts/serializers/automations/change_secret.py:145 #: accounts/serializers/automations/check_account.py:33 @@ -481,9 +455,9 @@ msgstr "El usuario %s ha visto/exportado la contraseña" #: accounts/templates/accounts/push_account_report.html:78 #: accounts/templates/accounts/push_account_report.html:118 #: acls/serializers/base.py:130 assets/models/asset/common.py:102 -#: assets/models/asset/common.py:366 assets/models/cmd_filter.py:36 -#: audits/models.py:59 audits/models.py:312 audits/serializers.py:228 -#: authentication/models/connection_token.py:40 +#: assets/models/asset/common.py:428 assets/models/cmd_filter.py:36 +#: audits/models.py:59 audits/models.py:312 audits/serializers.py:230 +#: authentication/models/connection_token.py:41 #: perms/models/asset_permission.py:69 terminal/backends/command/models.py:17 #: terminal/models/session/session.py:34 terminal/notifications.py:156 #: terminal/serializers/command.py:17 terminal/serializers/session.py:30 @@ -494,10 +468,10 @@ msgid "Asset" msgstr "Activos" #: accounts/models/account.py:89 accounts/models/template.py:16 -#: accounts/serializers/account/account.py:233 -#: accounts/serializers/account/account.py:284 +#: accounts/serializers/account/account.py:234 +#: accounts/serializers/account/account.py:286 #: accounts/serializers/account/template.py:35 -#: authentication/serializers/connect_token_secret.py:50 +#: authentication/serializers/connect_token_secret.py:51 msgid "Su from" msgstr "Cambiar desde" @@ -515,7 +489,7 @@ msgstr "Cuenta histórica" msgid "Secret reset" msgstr "Se puede cambiar la contraseña" -#: accounts/models/account.py:97 accounts/serializers/account/account.py:228 +#: accounts/models/account.py:97 accounts/serializers/account/account.py:229 #: users/models/user/__init__.py:122 msgid "Source" msgstr "Origen" @@ -542,14 +516,14 @@ msgstr "Estado de cambio de contraseña" #: accounts/models/account.py:107 #: accounts/models/automations/check_account.py:64 -#: accounts/serializers/account/service.py:11 +#: accounts/serializers/account/service.py:12 #: accounts/serializers/automations/change_secret.py:115 #: accounts/serializers/automations/change_secret.py:146 #: accounts/templates/accounts/change_secret_failed_info.html:12 #: acls/serializers/base.py:131 #: acls/templates/acls/asset_login_reminder.html:10 #: assets/serializers/gateway.py:33 audits/models.py:60 audits/models.py:313 -#: audits/serializers.py:229 authentication/api/connection_token.py:464 +#: audits/serializers.py:231 authentication/api/connection_token.py:463 #: ops/models/base.py:18 perms/models/asset_permission.py:75 #: settings/serializers/msg.py:33 terminal/backends/command/models.py:18 #: terminal/models/session/session.py:36 terminal/serializers/command.py:72 @@ -586,29 +560,31 @@ msgstr "Puede eliminar la cuenta" #: accounts/models/application.py:16 #: accounts/models/automations/check_account.py:116 accounts/models/base.py:63 -#: accounts/serializers/account/service.py:27 +#: accounts/serializers/account/service.py:28 #: accounts/serializers/account/virtual.py:20 acls/models/base.py:35 #: acls/models/base.py:96 acls/models/command_acl.py:21 #: acls/serializers/base.py:35 assets/models/asset/common.py:100 #: assets/models/asset/common.py:166 assets/models/cmd_filter.py:21 #: assets/models/domain.py:19 assets/models/label.py:18 #: assets/models/platform.py:15 assets/models/platform.py:94 -#: assets/serializers/asset/common.py:171 assets/serializers/platform.py:158 -#: assets/serializers/platform.py:278 +#: assets/serializers/asset/common.py:173 assets/serializers/platform.py:158 +#: assets/serializers/platform.py:283 #: authentication/backends/passkey/models.py:10 #: authentication/models/ssh_key.py:12 -#: authentication/serializers/connect_token_secret.py:113 -#: authentication/serializers/connect_token_secret.py:170 labels/models.py:11 +#: authentication/serializers/connect_token_secret.py:115 +#: authentication/serializers/connect_token_secret.py:172 labels/models.py:11 #: ops/mixin.py:32 ops/models/adhoc.py:19 ops/models/celery.py:15 -#: ops/models/celery.py:81 ops/models/job.py:145 ops/models/playbook.py:28 +#: ops/models/celery.py:81 ops/models/job.py:147 ops/models/playbook.py:28 #: ops/models/variable.py:9 ops/serializers/job.py:20 #: ops/serializers/variable.py:20 orgs/models.py:82 #: perms/models/asset_permission.py:61 rbac/models/role.py:29 #: rbac/serializers/role.py:28 settings/models.py:37 settings/models.py:186 #: settings/serializers/msg.py:89 settings/serializers/terminal.py:9 -#: terminal/models/applet/applet.py:34 terminal/models/component/endpoint.py:13 -#: terminal/models/component/endpoint.py:112 -#: terminal/models/component/storage.py:26 terminal/models/component/task.py:13 +#: terminal/models/applet/applet.py:34 +#: terminal/models/component/endpoint.py:13 +#: terminal/models/component/endpoint.py:106 +#: terminal/models/component/storage.py:26 +#: terminal/models/component/task.py:13 #: terminal/models/component/terminal.py:86 #: terminal/models/virtualapp/provider.py:10 #: terminal/models/virtualapp/virtualapp.py:19 tickets/api/ticket.py:87 @@ -634,30 +610,33 @@ msgstr "Código secreto" #: accounts/models/application.py:21 acls/models/base.py:98 #: assets/models/automations/base.py:22 assets/models/cmd_filter.py:38 #: assets/serializers/asset/common.py:148 -#: assets/serializers/asset/common.py:420 perms/serializers/permission.py:66 -#: perms/serializers/user_permission.py:75 rbac/tree.py:35 +#: assets/serializers/asset/common.py:423 perms/serializers/permission.py:66 +#: perms/serializers/user_permission.py:76 rbac/tree.py:35 msgid "Accounts" msgstr "Cuenta" #: accounts/models/application.py:22 authentication/models/access_key.py:20 -#: terminal/models/component/endpoint.py:113 +#: terminal/models/component/endpoint.py:107 msgid "IP group" msgstr "Grupo IP" #: accounts/models/application.py:23 #: authentication/backends/passkey/models.py:14 #: authentication/models/access_key.py:24 -#: authentication/models/private_token.py:8 authentication/models/ssh_key.py:20 +#: authentication/models/private_token.py:8 +#: authentication/models/ssh_key.py:20 msgid "Date last used" msgstr "Fecha de último uso" #: accounts/models/application.py:24 acls/models/base.py:43 -#: assets/models/asset/common.py:178 authentication/models/access_key.py:23 -#: authentication/models/connection_token.py:58 -#: authentication/models/ssh_key.py:13 authentication/serializers/ssh_key.py:23 +#: assets/models/asset/common.py:182 authentication/models/access_key.py:23 +#: authentication/models/connection_token.py:59 +#: authentication/models/ssh_key.py:13 +#: authentication/serializers/ssh_key.py:23 #: authentication/templates/authentication/_access_key_modal.html:32 -#: perms/models/asset_permission.py:82 terminal/models/component/endpoint.py:28 -#: terminal/models/component/endpoint.py:123 +#: perms/models/asset_permission.py:82 +#: terminal/models/component/endpoint.py:29 +#: terminal/models/component/endpoint.py:117 #: terminal/models/session/sharing.py:29 terminal/serializers/terminal.py:44 #: tickets/const.py:36 msgid "Active" @@ -758,8 +737,8 @@ msgstr "Comprobar conexión tras el cambio" #: accounts/models/automations/check_account.py:19 #: accounts/models/automations/gather_account.py:117 #: accounts/serializers/automations/change_secret.py:59 -#: settings/serializers/auth/ldap.py:101 -#: settings/serializers/auth/ldap_ha.py:84 settings/serializers/msg.py:45 +#: settings/serializers/auth/ldap.py:105 +#: settings/serializers/auth/ldap_ha.py:87 settings/serializers/msg.py:45 msgid "Recipient" msgstr "Destinatario" @@ -769,7 +748,7 @@ msgstr "Automatización de cambio de clave" #: accounts/models/automations/change_secret.py:47 #: assets/models/automations/base.py:145 ops/models/base.py:56 -#: ops/models/celery.py:90 ops/models/job.py:240 +#: ops/models/celery.py:90 ops/models/job.py:242 #: terminal/models/applet/host.py:142 msgid "Date finished" msgstr "Fecha de finalización" @@ -780,11 +759,11 @@ msgstr "Fecha de finalización" #: accounts/serializers/automations/check_account.py:39 #: assets/models/automations/base.py:137 #: assets/serializers/automations/base.py:45 audits/models.py:209 -#: audits/serializers.py:78 ops/models/base.py:49 ops/models/job.py:231 -#: terminal/models/applet/applet.py:331 terminal/models/applet/host.py:140 +#: audits/serializers.py:77 ops/models/base.py:49 ops/models/job.py:233 +#: terminal/models/applet/applet.py:372 terminal/models/applet/host.py:140 #: terminal/models/component/status.py:30 #: terminal/models/virtualapp/virtualapp.py:99 -#: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:148 +#: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:163 #: terminal/serializers/virtualapp.py:35 tickets/models/ticket/general.py:284 #: tickets/serializers/super_ticket.py:13 #: tickets/serializers/ticket/ticket.py:20 xpack/plugins/cloud/models.py:227 @@ -793,7 +772,7 @@ msgid "Status" msgstr "Estado" #: accounts/models/automations/change_secret.py:51 -#: accounts/serializers/account/account.py:276 +#: accounts/serializers/account/account.py:278 #: accounts/templates/accounts/change_secret_failed_info.html:13 #: assets/const/automation.py:9 #: authentication/templates/authentication/passkey.html:173 @@ -844,10 +823,8 @@ msgid "New found" msgstr "Nuevos hallazgos" #: accounts/models/automations/check_account.py:45 -#, fuzzy -#| msgid "Account delete" msgid "Account deleted" -msgstr "Cuenta eliminada" +msgstr "La cuenta ha sido eliminada" #: accounts/models/automations/check_account.py:46 msgid "Groups change" @@ -894,9 +871,11 @@ msgstr "Contraseña duplicada" #: accounts/templates/accounts/gather_account_report.html:118 #: accounts/templates/accounts/push_account_report.html:79 #: accounts/templates/accounts/push_account_report.html:119 -#: acls/serializers/base.py:19 acls/serializers/base.py:50 audits/models.py:189 -#: authentication/forms.py:21 authentication/forms.py:23 +#: acls/serializers/base.py:19 acls/serializers/base.py:50 +#: audits/models.py:189 authentication/forms.py:21 authentication/forms.py:23 #: authentication/models/temp_token.py:9 +#: authentication/serializers/connect_token_secret.py:43 +#: authentication/serializers/connect_token_secret.py:53 #: authentication/templates/authentication/_msg_different_city.html:9 #: authentication/templates/authentication/_msg_oauth_bind.html:9 #: authentication/templates/authentication/login.html:408 @@ -947,8 +926,8 @@ msgid "" "Perform checks and analyses based on the security of account passwords, " "including password strength, leakage, etc." msgstr "" -"Análisis de seguridad de la contraseña, que incluye la fortaleza de la misma " -"y posibles filtraciones." +"Análisis de seguridad de la contraseña, que incluye la fortaleza de la misma" +" y posibles filtraciones." #: accounts/models/automations/check_account.py:146 msgid "Check if the account and password are repeated" @@ -1020,11 +999,11 @@ msgid "Verify asset account" msgstr "Verificación de cuentas" #: accounts/models/base.py:37 accounts/models/base.py:66 -#: accounts/serializers/account/account.py:470 +#: accounts/serializers/account/account.py:471 #: accounts/serializers/account/base.py:17 #: accounts/serializers/automations/change_secret.py:48 #: authentication/serializers/connect_token_secret.py:42 -#: authentication/serializers/connect_token_secret.py:51 +#: authentication/serializers/connect_token_secret.py:52 #: terminal/serializers/storage.py:140 msgid "Secret type" msgstr "Tipo de texto cifrado" @@ -1041,7 +1020,7 @@ msgstr "Reglas de contraseña" #: accounts/models/base.py:69 assets/models/automations/base.py:28 #: assets/models/cmd_filter.py:39 assets/models/label.py:22 -#: authentication/serializers/connect_token_secret.py:117 +#: authentication/serializers/connect_token_secret.py:119 #: terminal/models/applet/applet.py:41 #: terminal/models/virtualapp/virtualapp.py:23 users/serializers/user.py:257 msgid "Is active" @@ -1086,14 +1065,14 @@ msgstr "el nombre de usuario es el mismo que el del usuario" #: accounts/models/virtual.py:37 msgid "Non-asset account, Input username/password on connect" msgstr "" -"conectar la cuenta introduciendo manualmente el nombre de usuario/contraseña " -"al iniciar sesión" +"conectar la cuenta introduciendo manualmente el nombre de usuario/contraseña" +" al iniciar sesión" #: accounts/models/virtual.py:38 msgid "The account username name same with user on connect" msgstr "" -"al iniciar sesión en activos, la cuenta de nombre de usuario es la misma que " -"la del usuario" +"al iniciar sesión en activos, la cuenta de nombre de usuario es la misma que" +" la del usuario" #: accounts/models/virtual.py:39 msgid "" @@ -1122,8 +1101,8 @@ msgid "" "encryption password for preference settings" msgstr "" "{} - la tarea de respaldo de cuenta ha finalizado: no se ha establecido " -"contraseña de cifrado - por favor ve a información personal -> configuración " -"de preferencias para establecer la contraseña de cifrado de archivos" +"contraseña de cifrado - por favor ve a información personal -> configuración" +" de preferencias para establecer la contraseña de cifrado de archivos" #: accounts/notifications.py:56 msgid "Notification of implementation result of encryption change plan" @@ -1144,8 +1123,8 @@ msgid "" "password in preferences" msgstr "" "{} - la tarea de cambio de contraseña ha finalizado: no se ha establecido " -"contraseña de cifrado - por favor ve a información personal -> configuración " -"de preferencias para establecer la contraseña de cifrado" +"contraseña de cifrado - por favor ve a información personal -> configuración" +" de preferencias para establecer la contraseña de cifrado" #: accounts/notifications.py:83 msgid "Gather account change information" @@ -1164,7 +1143,7 @@ msgstr "Ignorar" msgid "Reopen" msgstr "Reabrir" -#: accounts/risk_handlers.py:19 audits/const.py:38 +#: accounts/risk_handlers.py:19 audits/const.py:39 #: authentication/templates/authentication/_access_key_modal.html:155 #: authentication/templates/authentication/_mfa_confirm_modal.html:53 #: templates/_modal.html:22 tickets/const.py:43 @@ -1180,8 +1159,6 @@ msgid "Delete remote" msgstr "Eliminar remoto" #: accounts/risk_handlers.py:22 -#, fuzzy -#| msgid "Deleted account" msgid "Delete account" msgstr "Eliminar cuenta" @@ -1194,15 +1171,13 @@ msgstr "Añadir cuenta" msgid "Change password and Add" msgstr "Modificar contraseña y añadir" -#: accounts/risk_handlers.py:26 audits/const.py:31 ops/const.py:9 +#: accounts/risk_handlers.py:26 audits/const.py:32 ops/const.py:9 msgid "Change password" msgstr "Modificar contraseña" #: accounts/risk_handlers.py:127 -#, fuzzy -#| msgid "Test connection failed: {}" msgid "Execution failed: {}" -msgstr "Error en la conexión de prueba: {}" +msgstr "Ejecutar fallido: {}" #: accounts/serializers/account/account.py:31 msgid "Push now" @@ -1219,7 +1194,7 @@ msgstr "La cuenta existe política" #: accounts/serializers/account/account.py:206 assets/models/label.py:21 #: assets/models/platform.py:95 assets/serializers/asset/common.py:145 #: assets/serializers/cagegory.py:12 assets/serializers/platform.py:173 -#: assets/serializers/platform.py:279 perms/serializers/user_permission.py:26 +#: assets/serializers/platform.py:284 perms/serializers/user_permission.py:26 #: settings/models.py:39 tickets/models/ticket/apply_application.py:13 #: users/models/preference.py:12 msgid "Category" @@ -1230,11 +1205,11 @@ msgstr "Categoría" #: assets/models/automations/base.py:146 assets/models/cmd_filter.py:74 #: assets/models/platform.py:96 assets/serializers/asset/common.py:146 #: assets/serializers/platform.py:160 assets/serializers/platform.py:172 -#: audits/serializers.py:77 audits/serializers.py:194 -#: authentication/models/connection_token.py:62 -#: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:153 -#: perms/serializers/user_permission.py:27 terminal/models/applet/applet.py:40 -#: terminal/models/component/storage.py:58 +#: audits/serializers.py:76 audits/serializers.py:196 +#: authentication/models/connection_token.py:63 +#: authentication/serializers/connect_token_secret.py:128 +#: ops/models/job.py:155 perms/serializers/user_permission.py:27 +#: terminal/models/applet/applet.py:40 terminal/models/component/storage.py:58 #: terminal/models/component/storage.py:152 terminal/serializers/applet.py:29 #: terminal/serializers/session.py:25 terminal/serializers/storage.py:281 #: terminal/serializers/storage.py:294 tickets/models/comment.py:26 @@ -1244,66 +1219,73 @@ msgstr "Categoría" msgid "Type" msgstr "Tipo" -#: accounts/serializers/account/account.py:222 +#: accounts/serializers/account/account.py:223 msgid "Asset not found" msgstr "El activo no existe" -#: accounts/serializers/account/account.py:265 +#: accounts/serializers/account/account.py:236 assets/const/category.py:15 +#: assets/models/asset/common.py:180 assets/models/asset/ds.py:14 +#: assets/serializers/asset/common.py:180 +msgid "Directory service" +msgstr "Servicio de directorio" + +#: accounts/serializers/account/account.py:267 msgid "Has secret" msgstr "Contraseña ya gestionada" -#: accounts/serializers/account/account.py:275 ops/models/celery.py:84 +#: accounts/serializers/account/account.py:277 ops/models/celery.py:84 #: tickets/models/comment.py:13 tickets/models/ticket/general.py:49 #: tickets/models/ticket/general.py:280 tickets/serializers/super_ticket.py:14 msgid "State" msgstr "Estado" -#: accounts/serializers/account/account.py:277 +#: accounts/serializers/account/account.py:279 msgid "Changed" msgstr "Modificado" -#: accounts/serializers/account/account.py:287 acls/models/base.py:97 +#: accounts/serializers/account/account.py:289 acls/models/base.py:97 #: acls/templates/acls/asset_login_reminder.html:9 #: assets/models/automations/base.py:25 -#: assets/serializers/automations/base.py:20 assets/serializers/domain.py:34 +#: assets/serializers/automations/base.py:20 assets/serializers/domain.py:33 #: assets/serializers/platform.py:181 assets/serializers/platform.py:213 -#: authentication/api/connection_token.py:463 ops/models/base.py:17 -#: ops/models/job.py:155 ops/serializers/job.py:21 +#: authentication/api/connection_token.py:462 ops/models/base.py:17 +#: ops/models/job.py:157 ops/serializers/job.py:21 #: perms/serializers/permission.py:57 #: terminal/templates/terminal/_msg_command_execute_alert.html:16 #: xpack/plugins/cloud/manager.py:93 msgid "Assets" msgstr "Activos" -#: accounts/serializers/account/account.py:392 +#: accounts/serializers/account/account.py:394 #, python-format msgid "Asset does not support this secret type: %s" msgstr "Tipo de cuenta de activos no soportado: %s" -#: accounts/serializers/account/account.py:424 +#: accounts/serializers/account/account.py:426 msgid "Account has exist" msgstr "La cuenta ya existe" -#: accounts/serializers/account/account.py:461 +#: accounts/serializers/account/account.py:463 #: accounts/serializers/account/base.py:86 #: accounts/serializers/account/template.py:66 -#: assets/serializers/asset/common.py:421 +#: assets/serializers/asset/common.py:424 msgid "Spec info" msgstr "Información especial" -#: accounts/serializers/account/account.py:471 -#: authentication/serializers/connect_token_secret.py:160 +#: accounts/serializers/account/account.py:472 +#: authentication/serializers/connect_token_secret.py:162 #: authentication/templates/authentication/_access_key_modal.html:30 #: perms/models/perm_node.py:21 users/serializers/group.py:33 msgid "ID" msgstr "ID" -#: accounts/serializers/account/account.py:481 acls/serializers/base.py:123 +#: accounts/serializers/account/account.py:482 acls/serializers/base.py:123 #: acls/templates/acls/asset_login_reminder.html:8 #: acls/templates/acls/user_login_reminder.html:8 -#: assets/models/cmd_filter.py:24 assets/models/label.py:16 audits/models.py:55 -#: audits/models.py:91 audits/models.py:173 audits/models.py:272 -#: audits/serializers.py:195 authentication/models/connection_token.py:36 +#: assets/models/cmd_filter.py:24 assets/models/label.py:16 +#: audits/models.py:55 audits/models.py:91 audits/models.py:173 +#: audits/models.py:272 audits/serializers.py:197 +#: authentication/models/connection_token.py:37 #: authentication/models/ssh_key.py:22 authentication/models/sso_token.py:16 #: notifications/models/notification.py:12 #: perms/api/user_permission/mixin.py:58 perms/models/asset_permission.py:63 @@ -1320,7 +1302,7 @@ msgstr "ID" msgid "User" msgstr "Usuario" -#: accounts/serializers/account/account.py:482 +#: accounts/serializers/account/account.py:483 #: authentication/templates/authentication/_access_key_modal.html:33 #: terminal/notifications.py:159 terminal/notifications.py:219 msgid "Date" @@ -1335,22 +1317,22 @@ msgid "" "* If no username is required for authentication, enter null. For AD " "accounts, use the format username@domain." msgstr "" -"Sugerencia: Si no se requiere nombre de usuario para la autenticación, puede " -"dejarse como null; si es una cuenta AD, el formato es username@domain" +"Sugerencia: Si no se requiere nombre de usuario para la autenticación, puede" +" dejarse como null; si es una cuenta AD, el formato es username@domain" -#: accounts/serializers/account/service.py:13 +#: accounts/serializers/account/service.py:14 #: authentication/serializers/token.py:22 msgid "Access IP" msgstr "Lista blanca de IP" -#: accounts/serializers/account/service.py:26 +#: accounts/serializers/account/service.py:27 #: accounts/serializers/account/virtual.py:19 assets/models/cmd_filter.py:40 -#: assets/models/cmd_filter.py:88 common/db/models.py:36 ops/models/adhoc.py:25 -#: ops/models/job.py:163 ops/models/playbook.py:31 rbac/models/role.py:37 -#: settings/models.py:42 terminal/models/applet/applet.py:46 -#: terminal/models/applet/applet.py:332 terminal/models/applet/host.py:143 -#: terminal/models/component/endpoint.py:27 -#: terminal/models/component/endpoint.py:122 +#: assets/models/cmd_filter.py:88 common/db/models.py:36 +#: ops/models/adhoc.py:25 ops/models/job.py:165 ops/models/playbook.py:31 +#: rbac/models/role.py:37 settings/models.py:42 +#: terminal/models/applet/applet.py:46 terminal/models/applet/applet.py:373 +#: terminal/models/applet/host.py:143 terminal/models/component/endpoint.py:28 +#: terminal/models/component/endpoint.py:116 #: terminal/models/session/session.py:49 #: terminal/models/virtualapp/virtualapp.py:28 tickets/models/comment.py:32 #: tickets/models/ticket/general.py:298 users/models/user/__init__.py:94 @@ -1358,9 +1340,9 @@ msgstr "Lista blanca de IP" msgid "Comment" msgstr "Comentarios" -#: accounts/serializers/account/service.py:28 +#: accounts/serializers/account/service.py:29 #: accounts/templates/accounts/backup_account_report.html:33 -#: assets/serializers/asset/common.py:151 +#: assets/serializers/asset/common.py:152 msgid "Accounts amount" msgstr "Cantidad de cuentas" @@ -1395,23 +1377,20 @@ msgid "" "length is the length of the password, and the range is 8 to 30.\n" "lowercase indicates whether the password contains lowercase letters, \n" "uppercase indicates whether it contains uppercase letters,\n" -"digit indicates whether it contains numbers, and symbol indicates whether it " -"contains special symbols.\n" -"exclude_symbols is used to exclude specific symbols. You can fill in the " -"symbol characters to be excluded (up to 16). \n" +"digit indicates whether it contains numbers, and symbol indicates whether it contains special symbols.\n" +"exclude_symbols is used to exclude specific symbols. You can fill in the symbol characters to be excluded (up to 16). \n" "If you do not need to exclude symbols, you can leave it blank.\n" -"default: {\"length\": 16, \"lowercase\": true, \"uppercase\": true, " -"\"digit\": true, \"symbol\": true, \"exclude_symbols\": \"\"}" +"default: {\"length\": 16, \"lowercase\": true, \"uppercase\": true, \"digit\": true, \"symbol\": true, \"exclude_symbols\": \"\"}" msgstr "" -"La longitud se refiere a la extensión de la contraseña, que debe estar entre " -"8 y 30. lowercase indica si la contraseña incluye letras minúsculas, " +"La longitud se refiere a la extensión de la contraseña, que debe estar entre" +" 8 y 30. lowercase indica si la contraseña incluye letras minúsculas, " "uppercase indica si contiene letras mayúsculas, digit señala si incluye " "números, y symbol indica la presencia de caracteres especiales. " -"exclude_symbols se utiliza para excluir símbolos específicos; puedes indicar " -"hasta 16 caracteres a excluir. Si no es necesario excluir ningún símbolo, " -"puedes dejarlo en blanco. Por defecto: {\"length\": 16, \"lowercase\": true, " -"\"uppercase\": true, \"digit\": true, \"symbol\": true, \"exclude_symbols\": " -"\"\"}" +"exclude_symbols se utiliza para excluir símbolos específicos; puedes indicar" +" hasta 16 caracteres a excluir. Si no es necesario excluir ningún símbolo, " +"puedes dejarlo en blanco. Por defecto: {\"length\": 16, \"lowercase\": true," +" \"uppercase\": true, \"digit\": true, \"symbol\": true, " +"\"exclude_symbols\": \"\"}" #: accounts/serializers/account/template.py:47 msgid "Secret generation strategy for account creation" @@ -1437,10 +1416,10 @@ msgid "" "asset secret > Login secret > Manual input.
For security, please set " "config CACHE_LOGIN_PASSWORD_ENABLED to true" msgstr "" -"Actualmente sólo se admite el inicio de sesión con AD/LDAP. Orden de validez " -"de las contraseñas para cuentas con el mismo nombre: contraseña de cuenta " -"existente en activos > contraseña de inicio de sesión > entrada manual
" -"Por motivos de seguridad, se recomienda establecer la opción de " +"Actualmente sólo se admite el inicio de sesión con AD/LDAP. Orden de validez" +" de las contraseñas para cuentas con el mismo nombre: contraseña de cuenta " +"existente en activos > contraseña de inicio de sesión > entrada manual
" +" Por motivos de seguridad, se recomienda establecer la opción de " "configuración CACHE_LOGIN_PASSWORD_ENABLED=true; es necesario reiniciar el " "servicio para activarla" @@ -1536,12 +1515,9 @@ msgstr "Ejecución automatizada de cuentas" #: accounts/tasks/automation.py:35 msgid "" -"Unified execution entry for account automation tasks: when the system " -"performs tasks \n" -" such as account push, password change, account verification, account " -"collection, \n" -" and gateway account verification, all tasks are executed through " -"this unified entry" +"Unified execution entry for account automation tasks: when the system performs tasks \n" +" such as account push, password change, account verification, account collection, \n" +" and gateway account verification, all tasks are executed through this unified entry" msgstr "" "Punto de entrada único para tareas automatizadas de cuentas, cuando el " "sistema ejecute el envío de cuentas, cambio de contraseña, verificación de " @@ -1561,29 +1537,22 @@ msgstr "" #: accounts/tasks/automation.py:96 msgid "Clean change secret and push record period" msgstr "" -"Limpiar periódicamente los registros de cambio de contraseña y los registros " -"de notificación" +"Limpiar periódicamente los registros de cambio de contraseña y los registros" +" de notificación" #: accounts/tasks/automation.py:98 msgid "" -"The system will periodically clean up unnecessary password change and push " -"records, \n" -" including their associated change tasks, execution logs, assets, and " -"accounts. When any \n" -" of these associated items are deleted, the corresponding password " -"change and push records \n" -" become invalid. Therefore, to maintain a clean and efficient " -"database, the system will \n" -" clean up expired records at 2 a.m daily, based on the interval " -"specified by \n" -" PERM_EXPIRED_CHECK_PERIODIC in the config.txt configuration file. " -"This periodic cleanup \n" -" mechanism helps free up storage space and enhances the security and " -"overall performance \n" +"The system will periodically clean up unnecessary password change and push records, \n" +" including their associated change tasks, execution logs, assets, and accounts. When any \n" +" of these associated items are deleted, the corresponding password change and push records \n" +" become invalid. Therefore, to maintain a clean and efficient database, the system will \n" +" clean up expired records at 2 a.m daily, based on the interval specified by \n" +" PERM_EXPIRED_CHECK_PERIODIC in the config.txt configuration file. This periodic cleanup \n" +" mechanism helps free up storage space and enhances the security and overall performance \n" " of data management" msgstr "" -"El sistema limpiará regularmente los registros de cambio de contraseña y los " -"registros de notificación que ya no se necesiten, incluyendo aquellos " +"El sistema limpiará regularmente los registros de cambio de contraseña y los" +" registros de notificación que ya no se necesiten, incluyendo aquellos " "relacionados con tareas de cambio de contraseña, registros de ejecución, " "activos y cuentas. Cuando se elimina cualquiera de estos elementos " "relacionados, los registros de cambio de contraseña y notificación " @@ -1610,8 +1579,7 @@ msgstr "" #: accounts/tasks/remove_account.py:28 msgid "" -"When clicking \"Sync deletion\" in 'Console - Gather Account - Gathered " -"accounts' this \n" +"When clicking \"Sync deletion\" in 'Console - Gather Account - Gathered accounts' this \n" " task will be executed" msgstr "" "En la consola - recopilar cuentas - al hacer clic en sincronizar " @@ -1623,19 +1591,16 @@ msgstr "Limpiar cuentas históricas" #: accounts/tasks/remove_account.py:52 msgid "" -"Each time an asset account is updated, a historical account is generated, so " -"it is \n" -" necessary to clean up the asset account history. The system will " -"clean up excess account \n" -" records at 2 a.m. daily based on the configuration in the \"System " -"settings - Features - \n" +"Each time an asset account is updated, a historical account is generated, so it is \n" +" necessary to clean up the asset account history. The system will clean up excess account \n" +" records at 2 a.m. daily based on the configuration in the \"System settings - Features - \n" " Account storage - Record limit" msgstr "" "Debido a que cada actualización de una cuenta de activo genera cuentas " "históricas, es necesario limpiar las cuentas históricas de activos. El " "sistema realizará la limpieza de los registros de cuentas que excedan los " -"límites establecidos en la configuración del almacenamiento de cuentas a las " -"2 de la mañana todos los días" +"límites establecidos en la configuración del almacenamiento de cuentas a las" +" 2 de la mañana todos los días" #: accounts/tasks/remove_account.py:89 msgid "Remove historical accounts that are out of range." @@ -1647,8 +1612,7 @@ msgstr "Sincronizar información con cuentas relacionadas" #: accounts/tasks/template.py:14 msgid "" -"When clicking 'Sync new secret to accounts' in 'Console - Account - " -"Templates - \n" +"When clicking 'Sync new secret to accounts' in 'Console - Account - Templates - \n" " Accounts' this task will be executed" msgstr "" "Cuando se clickea en sincronizar al actualizar información de cuentas en la " @@ -1663,8 +1627,8 @@ msgid "" "When clicking 'Sync' in 'System Settings - Features - Account Storage' this " "task will be executed" msgstr "" -"Cando se clickea en sincronizar en la configuración del sistema - ajustes de " -"funciones - almacenamiento de cuentas, se ejecuta esta tarea" +"Cando se clickea en sincronizar en la configuración del sistema - ajustes de" +" funciones - almacenamiento de cuentas, se ejecuta esta tarea" #: accounts/tasks/verify_account.py:49 msgid "Verify asset account availability" @@ -1675,15 +1639,9 @@ msgid "" "When clicking 'Test' in 'Console - Asset details - Accounts' this task will " "be executed" msgstr "" -"Al hacer clic en \"Prueba de ejecución de la tarea\" en la consola - " -"Detalles del activo - Cuenta, puedes probar la conectividad de la cuenta, " -"eliminar la cuenta, establecer la fecha de inicio, la fecha de finalización, " -"el nombre de la tarea, el tiempo de ejecución, el número de tipos y el ID de " -"ejecución de la tarea. \n" +"Al hacer clic en \"Prueba de ejecución de la tarea\" en la consola - Detalles del activo - Cuenta, puedes probar la conectividad de la cuenta, eliminar la cuenta, establecer la fecha de inicio, la fecha de finalización, el nombre de la tarea, el tiempo de ejecución, el número de tipos y el ID de ejecución de la tarea. \n" "\n" -"Estimado/a, ¡Hola! A continuación se presentan las situaciones en las que la " -"modificación de clave o el envío de la cuenta del activo han fallado. Por " -"favor, verifica y gestiona esto a la brevedad. \n" +"Estimado/a, ¡Hola! A continuación se presentan las situaciones en las que la modificación de clave o el envío de la cuenta del activo han fallado. Por favor, verifica y gestiona esto a la brevedad. \n" "\n" "Número de activos \n" "Número de activos exitosos \n" @@ -1722,7 +1680,7 @@ msgstr "Nombre de la tarea" #: accounts/templates/accounts/gather_account_report.html:21 #: accounts/templates/accounts/push_account_report.html:22 #: assets/models/automations/base.py:143 audits/models.py:66 -#: ops/models/base.py:55 ops/models/celery.py:89 ops/models/job.py:239 +#: ops/models/base.py:55 ops/models/celery.py:89 ops/models/job.py:241 #: ops/templates/ops/celery_task_log.html:101 #: perms/models/asset_permission.py:78 settings/serializers/feature.py:27 #: settings/templates/ldap/_msg_import_ldap_user.html:5 @@ -1775,7 +1733,7 @@ msgstr "" #: accounts/templates/accounts/change_secret_report.html:33 #: accounts/templates/accounts/gather_account_report.html:31 #: accounts/templates/accounts/push_account_report.html:32 -#: assets/serializers/domain.py:24 assets/serializers/platform.py:182 +#: assets/serializers/domain.py:23 assets/serializers/platform.py:182 #: orgs/serializers.py:13 perms/serializers/permission.py:61 msgid "Assets amount" msgstr "Número de activos" @@ -1814,7 +1772,6 @@ msgstr "No" #: accounts/templates/accounts/change_secret_report.html:94 #: accounts/templates/accounts/change_secret_report.html:134 #: accounts/templates/accounts/gather_account_report.html:92 -#: accounts/templates/accounts/gather_account_report.html:132 #: accounts/templates/accounts/push_account_report.html:93 #: accounts/templates/accounts/push_account_report.html:133 msgid "No new accounts found" @@ -1843,10 +1800,14 @@ msgstr "Cuentas recién descubiertas" msgid "Lost accounts" msgstr "Cuenta perdida" +#: accounts/templates/accounts/gather_account_report.html:132 +msgid "No lost accounts found" +msgstr "No se encontró la cuenta perdida" + #: accounts/utils.py:54 msgid "" -"If the password starts with {{` and ends with }} `, then the password is not " -"allowed." +"If the password starts with {{` and ends with }} `, then the password is not" +" allowed." msgstr "" "Si la contraseña comienza con `{{` y termina con `}}`, esa contraseña no " "está permitida." @@ -1859,16 +1820,16 @@ msgstr "Clave no válida o error en la contraseña de la clave" msgid "App Acls" msgstr "Control de acceso" -#: acls/const.py:6 audits/const.py:36 terminal/const.py:11 tickets/const.py:44 +#: acls/const.py:6 audits/const.py:37 terminal/const.py:11 tickets/const.py:44 #: tickets/templates/tickets/approve_check_password.html:47 msgid "Reject" msgstr "Denegado" -#: acls/const.py:7 audits/const.py:33 terminal/const.py:9 +#: acls/const.py:7 audits/const.py:34 terminal/const.py:9 msgid "Accept" msgstr "Aceptado" -#: acls/const.py:8 audits/const.py:34 +#: acls/const.py:8 audits/const.py:35 msgid "Review" msgstr "Aprobación" @@ -1881,7 +1842,7 @@ msgid "Notify" msgstr "Notificación" #: acls/const.py:11 -msgid "Notify and warn" +msgid "Prompt and warn" msgstr "Sugerencia y alarma" #: acls/const.py:12 @@ -1893,20 +1854,21 @@ msgid "Face Online" msgstr "Facial en línea" #: acls/models/base.py:37 assets/models/cmd_filter.py:76 -#: terminal/models/component/endpoint.py:115 xpack/plugins/cloud/models.py:316 +#: terminal/models/component/endpoint.py:109 xpack/plugins/cloud/models.py:316 msgid "Priority" msgstr "Prioridad" #: acls/models/base.py:38 assets/models/cmd_filter.py:76 -#: terminal/models/component/endpoint.py:116 xpack/plugins/cloud/models.py:317 +#: terminal/models/component/endpoint.py:110 xpack/plugins/cloud/models.py:317 msgid "1-100, the lower the value will be match first" msgstr "" "El rango de prioridad permitido es de 1 a 100 (un valor menor indica mayor " "prioridad)" #: acls/models/base.py:41 acls/serializers/base.py:57 -#: assets/models/cmd_filter.py:81 audits/models.py:93 audits/serializers.py:108 -#: authentication/serializers/connect_token_secret.py:119 +#: assets/models/cmd_filter.py:81 audits/models.py:93 +#: audits/serializers.py:107 +#: authentication/serializers/connect_token_secret.py:121 #: authentication/templates/authentication/_access_key_modal.html:34 #: perms/serializers/permission.py:63 perms/serializers/permission.py:85 #: tickets/serializers/ticket/ticket.py:21 @@ -1914,7 +1876,7 @@ msgid "Action" msgstr "Acción" #: acls/models/base.py:42 assets/models/cmd_filter.py:86 -#: authentication/serializers/connect_token_secret.py:91 +#: authentication/serializers/connect_token_secret.py:93 msgid "Reviewers" msgstr "Persona aprobadora" @@ -1925,7 +1887,7 @@ msgid "Users" msgstr "Usuario" #: acls/models/command_acl.py:16 assets/models/cmd_filter.py:60 -#: audits/serializers.py:38 ops/serializers/job.py:92 terminal/const.py:88 +#: ops/serializers/job.py:92 terminal/const.py:88 #: terminal/models/session/session.py:45 terminal/serializers/command.py:18 #: terminal/templates/terminal/_msg_command_alert.html:12 #: terminal/templates/terminal/_msg_command_execute_alert.html:10 @@ -1954,7 +1916,7 @@ msgstr "Ignorar mayúsculas y minúsculas" #: acls/models/command_acl.py:33 acls/models/command_acl.py:97 #: acls/serializers/command_acl.py:29 -#: authentication/serializers/connect_token_secret.py:88 +#: authentication/serializers/connect_token_secret.py:90 #: terminal/templates/terminal/_msg_command_warning.html:14 msgid "Command group" msgstr "Grupo de comandos" @@ -2020,8 +1982,8 @@ msgid "" "support)" msgstr "" "* El asterisco indica que se coincide con todos. Por ejemplo: 192.168.10.1, " -"192.168.1.0/24, 10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64 " -"(soporta dominio)" +"192.168.1.0/24, 10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64" +" (soporta dominio)" #: acls/serializers/base.py:41 assets/serializers/asset/host.py:19 msgid "IP/Host" @@ -2056,7 +2018,7 @@ msgstr "" #: authentication/templates/authentication/_msg_oauth_bind.html:12 #: authentication/templates/authentication/_msg_rest_password_success.html:8 #: authentication/templates/authentication/_msg_rest_public_key_success.html:8 -#: common/drf/renders/base.py:150 xpack/plugins/cloud/models.py:393 +#: common/drf/renders/base.py:152 xpack/plugins/cloud/models.py:393 msgid "IP" msgstr "IP" @@ -2092,8 +2054,8 @@ msgid "" "the asset. If you did not authorize this login or if you notice any " "suspicious activity, please take the necessary actions immediately." msgstr "" -"Le solicitamos que revise esta actividad de inicio de sesión para garantizar " -"la seguridad y el uso correcto de los activos. Si no ha autorizado este " +"Le solicitamos que revise esta actividad de inicio de sesión para garantizar" +" la seguridad y el uso correcto de los activos. Si no ha autorizado este " "inicio de sesión o ha detectado alguna actividad sospechosa, por favor tome " "las medidas necesarias de inmediato." @@ -2120,16 +2082,16 @@ msgid "Login city" msgstr "Ciudad de inicio de sesión" #: acls/templates/acls/user_login_reminder.html:11 audits/models.py:198 -#: audits/models.py:267 audits/serializers.py:92 +#: audits/models.py:267 audits/serializers.py:91 msgid "User agent" msgstr "Agente del usuario" -#: assets/api/asset/asset.py:194 +#: assets/api/asset/asset.py:153 msgid "Cannot create asset directly, you should create a host or other" msgstr "" "No se puede crear activos directamente, debes crear un host u otro activo" -#: assets/api/asset/asset.py:198 +#: assets/api/asset/asset.py:157 msgid "The number of assets exceeds the limit of 5000" msgstr "La cantidad de activos ha superado el límite de 5000" @@ -2159,37 +2121,37 @@ msgstr "Gestión de activos" #: assets/automations/base/manager.py:140 msgid "Task: {} finished" -msgstr "" +msgstr "Tarea: {} Completado" -#: assets/automations/base/manager.py:338 +#: assets/automations/base/manager.py:339 msgid " - Platform {} ansible disabled" msgstr "" "- Plataforma {} Ansible está deshabilitada, no se pueden ejecutar tareas" -#: assets/automations/base/manager.py:524 +#: assets/automations/base/manager.py:525 msgid ">>> Task preparation phase" msgstr ">>> Etapa de preparación de tareas" -#: assets/automations/base/manager.py:528 +#: assets/automations/base/manager.py:529 #, python-brace-format msgid ">>> Executing tasks in batches, total {runner_count}" msgstr ">>> Ejecución de tareas por fases, un total de {runner_count}" -#: assets/automations/base/manager.py:533 +#: assets/automations/base/manager.py:534 msgid ">>> Start executing tasks" msgstr ">>> Comenzando la ejecución de tareas" -#: assets/automations/base/manager.py:535 +#: assets/automations/base/manager.py:536 msgid ">>> No tasks need to be executed" msgstr ">>> No hay tareas que ejecutar" -#: assets/automations/base/manager.py:539 +#: assets/automations/base/manager.py:540 #, python-brace-format msgid ">>> Begin executing batch {index} of tasks" msgstr ">>> Comenzando a ejecutar el lote de tareas número {index}" #: assets/automations/ping_gateway/manager.py:33 -#: authentication/models/connection_token.py:145 +#: authentication/models/connection_token.py:176 msgid "No account" msgstr "No hay cuenta" @@ -2215,10 +2177,10 @@ msgstr "Conexión fallida" #: assets/automations/ping_gateway/manager.py:118 msgid ">>> Start executing the task to test gateway connectivity" msgstr "" -">>> Comenzando a ejecutar la tarea de conectividad de la puerta de enlace de " -"prueba" +">>> Comenzando a ejecutar la tarea de conectividad de la puerta de enlace de" +" prueba" -#: assets/const/automation.py:6 audits/const.py:6 audits/const.py:47 +#: assets/const/automation.py:6 audits/const.py:6 audits/const.py:48 #: audits/signal_handlers/activity_log.py:63 common/utils/ip/geoip/utils.py:31 #: common/utils/ip/geoip/utils.py:37 common/utils/ip/utils.py:104 msgid "Unknown" @@ -2244,7 +2206,7 @@ msgstr "Puerta de enlace de prueba" msgid "Gather facts" msgstr "Recopilando información de activos" -#: assets/const/base.py:32 audits/const.py:58 +#: assets/const/base.py:32 audits/const.py:59 #: terminal/serializers/applet_host.py:32 users/models/user/_auth.py:31 msgid "Disabled" msgstr "Deshabilitar" @@ -2278,12 +2240,12 @@ msgid "Cloud service" msgstr "Servicio en la nube" #: assets/const/category.py:14 assets/models/asset/gpt.py:11 -#: assets/models/asset/web.py:16 audits/const.py:45 +#: assets/models/asset/web.py:16 audits/const.py:46 #: terminal/models/applet/applet.py:28 users/const.py:76 msgid "Web" msgstr "Web" -#: assets/const/category.py:15 common/sdk/sms/endpoint.py:20 +#: assets/const/category.py:16 common/sdk/sms/endpoint.py:20 msgid "Custom type" msgstr "Tipo personalizado" @@ -2319,8 +2281,8 @@ msgstr "" msgid "TP-Link" msgstr "" -#: assets/const/device.py:12 terminal/models/applet/applet.py:27 -#: tickets/const.py:9 +#: assets/const/device.py:12 assets/const/ds.py:7 +#: terminal/models/applet/applet.py:27 tickets/const.py:9 msgid "General" msgstr "General" @@ -2336,6 +2298,10 @@ msgstr "Router" msgid "Firewall" msgstr "Firewall" +#: assets/const/ds.py:10 +msgid "Windows Active Directory" +msgstr "" + #: assets/const/gpt.py:7 msgid "ChatGPT" msgstr "ChatGPT" @@ -2372,8 +2338,8 @@ msgid "" "account username
- ${HOME} The home directory of the connected account " "
- ${USER} The username of the user" msgstr "" -"Directorio raíz de SFTP, admite variables:
- ${ACCOUNT} nombre de usuario " -"de la cuenta conectada
- ${HOME} directorio principal de la cuenta " +"Directorio raíz de SFTP, admite variables:
- ${ACCOUNT} nombre de usuario" +" de la cuenta conectada
- ${HOME} directorio principal de la cuenta " "conectada
- ${USER} nombre de usuario del usuario" #: assets/const/protocol.py:81 @@ -2389,14 +2355,14 @@ msgid "Any" msgstr "Cualquiera" #: assets/const/protocol.py:88 rbac/tree.py:62 -#: settings/serializers/security.py:241 +#: settings/serializers/security.py:245 msgid "Security" msgstr "Seguro" #: assets/const/protocol.py:89 msgid "" -"Security layer to use for the connection:
Any
Automatically select the " -"security mode based on the security protocols supported by both the client " +"Security layer to use for the connection:
Any
Automatically select the" +" security mode based on the security protocols supported by both the client " "and the server
RDP
Legacy RDP encryption. This mode is generally only " "used for older Windows servers or in cases where a standard Windows login " "screen is desired
TLS
RDP authentication and encryption implemented " @@ -2470,7 +2436,7 @@ msgstr "base de datos de autenticación" msgid "The database to authenticate against" msgstr "base de datos a autenticar" -#: assets/const/protocol.py:232 authentication/models/connection_token.py:47 +#: assets/const/protocol.py:232 authentication/models/connection_token.py:48 msgid "Connect options" msgstr "elementos de conexión" @@ -2516,7 +2482,7 @@ msgstr "Selector de botón de confirmación" msgid "API mode" msgstr "Modo API" -#: assets/const/types.py:249 +#: assets/const/types.py:252 msgid "All types" msgstr "Todos los tipos" @@ -2539,15 +2505,15 @@ msgstr "Servicios en la nube" msgid "Port" msgstr "Puerto" -#: assets/models/asset/common.py:167 assets/serializers/asset/common.py:172 +#: assets/models/asset/common.py:167 assets/serializers/asset/common.py:174 #: settings/serializers/terminal.py:10 msgid "Address" msgstr "Dirección" -#: assets/models/asset/common.py:169 assets/models/platform.py:149 +#: assets/models/asset/common.py:169 assets/models/platform.py:155 #: assets/serializers/asset/common.py:150 #: authentication/backends/passkey/models.py:12 -#: authentication/serializers/connect_token_secret.py:118 +#: authentication/serializers/connect_token_secret.py:120 #: perms/serializers/user_permission.py:25 xpack/plugins/cloud/models.py:387 msgid "Platform" msgstr "Plataforma" @@ -2556,34 +2522,34 @@ msgstr "Plataforma" msgid "Zone" msgstr "Dominio" -#: assets/models/asset/common.py:176 assets/serializers/asset/common.py:174 +#: assets/models/asset/common.py:176 assets/serializers/asset/common.py:176 #: assets/serializers/automations/base.py:21 ops/serializers/job.py:22 #: perms/serializers/permission.py:58 msgid "Nodes" msgstr "Nodo" -#: assets/models/asset/common.py:179 assets/serializers/asset/common.py:422 +#: assets/models/asset/common.py:183 assets/serializers/asset/common.py:425 #: assets/serializers/asset/host.py:11 msgid "Gathered info" msgstr "Recopilar información sobre hardware de activos" -#: assets/models/asset/common.py:180 assets/serializers/asset/custom.py:14 +#: assets/models/asset/common.py:184 assets/serializers/asset/custom.py:14 msgid "Custom info" msgstr "Atributos personalizados" -#: assets/models/asset/common.py:369 +#: assets/models/asset/common.py:431 msgid "Can refresh asset hardware info" msgstr "Se puede actualizar la información del hardware de activos" -#: assets/models/asset/common.py:370 +#: assets/models/asset/common.py:432 msgid "Can test asset connectivity" msgstr "Se puede probar la conectividad de los activos" -#: assets/models/asset/common.py:371 +#: assets/models/asset/common.py:433 msgid "Can match asset" msgstr "Se pueden emparejar activos" -#: assets/models/asset/common.py:372 +#: assets/models/asset/common.py:434 msgid "Can change asset nodes" msgstr "Se pueden modificar nodos de activos" @@ -2611,19 +2577,23 @@ msgstr "Ignorar verificación de certificado" msgid "Postgresql SSL mode" msgstr "Modo SSL de PostgreSQL" +#: assets/models/asset/ds.py:10 assets/serializers/asset/ds.py:20 +msgid "Domain name" +msgstr "Nombre de dominio" + #: assets/models/asset/gpt.py:8 settings/serializers/feature.py:139 #: settings/serializers/feature.py:154 msgid "Proxy" msgstr "Proxy" #: assets/models/automations/base.py:23 assets/models/cmd_filter.py:32 -#: assets/models/node.py:553 ops/models/job.py:156 +#: assets/models/node.py:553 ops/models/job.py:158 #: perms/models/asset_permission.py:72 tickets/models/ticket/apply_asset.py:15 #: xpack/plugins/cloud/models.py:388 msgid "Node" msgstr "Nodo" -#: assets/models/automations/base.py:29 ops/models/job.py:234 +#: assets/models/automations/base.py:29 ops/models/job.py:236 #: ops/serializers/job.py:24 settings/serializers/auth/sms.py:108 msgid "Parameters" msgstr "Parámetro" @@ -2641,7 +2611,7 @@ msgid "Asset automation task" msgstr "Tareas de automatización de activos" #: assets/models/automations/base.py:140 assets/models/cmd_filter.py:41 -#: common/db/models.py:34 ops/models/base.py:54 ops/models/job.py:238 +#: common/db/models.py:34 ops/models/base.py:54 ops/models/job.py:240 #: users/models/user/__init__.py:317 msgid "Date created" msgstr "Fecha de creación" @@ -2652,14 +2622,14 @@ msgstr "Fecha de creación" msgid "Trigger mode" msgstr "Modo de activación" -#: assets/models/automations/base.py:157 audits/serializers.py:39 -#: ops/models/base.py:52 ops/models/job.py:236 +#: assets/models/automations/base.py:157 audits/serializers.py:38 +#: ops/models/base.py:52 ops/models/job.py:238 #: xpack/plugins/cloud/manager.py:103 msgid "Summary" msgstr "Resumen" #: assets/models/automations/base.py:158 ops/models/base.py:51 -#: ops/models/job.py:235 xpack/plugins/cloud/models.py:225 +#: ops/models/job.py:237 xpack/plugins/cloud/models.py:225 msgid "Result" msgstr "Resultado" @@ -2723,7 +2693,7 @@ msgstr "Reglas de filtrado de comandos" msgid "Favorite asset" msgstr "Activos guardados" -#: assets/models/gateway.py:34 assets/serializers/domain.py:19 +#: assets/models/gateway.py:34 assets/serializers/domain.py:18 msgid "Gateway" msgstr "Puerta de enlace" @@ -2734,8 +2704,8 @@ msgstr "Sistema" #: assets/models/label.py:19 assets/models/node.py:539 #: assets/serializers/cagegory.py:11 assets/serializers/cagegory.py:18 #: assets/serializers/cagegory.py:24 -#: authentication/models/connection_token.py:33 -#: authentication/serializers/connect_token_secret.py:125 +#: authentication/models/connection_token.py:34 +#: authentication/serializers/connect_token_secret.py:127 #: common/serializers/common.py:86 labels/models.py:12 settings/models.py:38 #: users/models/preference.py:13 msgid "Value" @@ -2744,7 +2714,7 @@ msgstr "Valor" #: assets/models/label.py:40 assets/serializers/cagegory.py:10 #: assets/serializers/cagegory.py:17 assets/serializers/cagegory.py:23 #: assets/serializers/platform.py:159 -#: authentication/serializers/connect_token_secret.py:124 +#: authentication/serializers/connect_token_secret.py:126 #: common/serializers/common.py:85 labels/serializers.py:45 #: settings/serializers/msg.py:90 xpack/plugins/cloud/models.py:392 msgid "Label" @@ -2810,7 +2780,7 @@ msgstr "público" msgid "Setting" msgstr "configuración" -#: assets/models/platform.py:38 audits/const.py:59 +#: assets/models/platform.py:38 audits/const.py:60 #: authentication/backends/passkey/models.py:11 settings/models.py:41 #: terminal/serializers/applet_host.py:33 users/models/user/_auth.py:32 msgid "Enabled" @@ -2910,15 +2880,19 @@ msgstr "Código" msgid "Gateway enabled" msgstr "Activar dominio" -#: assets/models/platform.py:106 assets/serializers/platform.py:202 +#: assets/models/platform.py:105 +msgid "DS enabled" +msgstr "El servicio de directorio ha sido habilitado" + +#: assets/models/platform.py:107 assets/serializers/platform.py:202 msgid "Su enabled" msgstr "Activar cambio de cuenta" -#: assets/models/platform.py:107 assets/serializers/platform.py:177 +#: assets/models/platform.py:108 assets/serializers/platform.py:177 msgid "Su method" msgstr "Método de cambio de cuenta" -#: assets/models/platform.py:108 assets/serializers/platform.py:180 +#: assets/models/platform.py:109 assets/serializers/platform.py:180 msgid "Custom fields" msgstr "Atributos personalizados" @@ -2956,41 +2930,41 @@ msgid "" "Node path, format [\"/org_name/node_name\"], if node not exist, will create " "it" msgstr "" -"Ruta del nodo, formato de [\"/organización/nombre del nodo\"], si el nodo no " -"existe, se creará" +"Ruta del nodo, formato de [\"/organización/nombre del nodo\"], si el nodo no" +" existe, se creará" #: assets/serializers/asset/common.py:147 assets/serializers/platform.py:174 #: authentication/serializers/connect_token_secret.py:30 -#: authentication/serializers/connect_token_secret.py:75 +#: authentication/serializers/connect_token_secret.py:77 #: perms/models/asset_permission.py:76 perms/serializers/permission.py:67 -#: perms/serializers/user_permission.py:74 xpack/plugins/cloud/models.py:390 +#: perms/serializers/user_permission.py:75 xpack/plugins/cloud/models.py:390 #: xpack/plugins/cloud/serializers/task.py:36 msgid "Protocols" msgstr "Grupo de protocolos" #: assets/serializers/asset/common.py:149 -#: assets/serializers/asset/common.py:173 +#: assets/serializers/asset/common.py:175 msgid "Node path" msgstr "Ruta del nodo" -#: assets/serializers/asset/common.py:170 -#: assets/serializers/asset/common.py:423 +#: assets/serializers/asset/common.py:172 +#: assets/serializers/asset/common.py:426 msgid "Auto info" msgstr "Información de automatización" -#: assets/serializers/asset/common.py:268 +#: assets/serializers/asset/common.py:271 msgid "Platform not exist" msgstr "La plataforma no existe" -#: assets/serializers/asset/common.py:304 +#: assets/serializers/asset/common.py:307 msgid "port out of range (0-65535)" msgstr "El puerto está fuera de rango (0-65535)" -#: assets/serializers/asset/common.py:311 +#: assets/serializers/asset/common.py:314 msgid "Protocol is required: {}" msgstr "El acuerdo es obligatorio: {}" -#: assets/serializers/asset/common.py:350 +#: assets/serializers/asset/common.py:353 msgid "Invalid data" msgstr "Datos no válidos" @@ -3001,27 +2975,35 @@ msgstr "Base de datos predeterminada" #: assets/serializers/asset/database.py:23 msgid "CA cert help text" msgstr "" -"El campo Nombre Común (CN) ha sido descontinuado, por favor utiliza el campo " -"Nombre Alternativo de Sujeto (SAN) para la validación del nombre de dominio, " -"a fin de mejorar la seguridad." +"El campo Nombre Común (CN) ha sido descontinuado, por favor utiliza el campo" +" Nombre Alternativo de Sujeto (SAN) para la validación del nombre de " +"dominio, a fin de mejorar la seguridad." #: assets/serializers/asset/database.py:24 msgid "Postgresql ssl model help text" msgstr "" -"Preferir: No me importa la encriptación, pero si el servidor la soporta, " -"estoy dispuesto a aceptar el costo de la encriptación.\n" -"Requerir: Quiero que mis datos estén encriptados, acepto el costo. Confío en " -"que la red garantizará que siempre me conecte al servidor que deseo.\n" -"Verificar CA: Quiero que mis datos estén encriptados, acepto el costo. " -"Quiero asegurarme de que estoy conectado al servidor en el que confío.\n" -"Verificar completo: Quiero que mis datos estén encriptados, acepto el costo. " -"Quiero estar seguro de que estoy conectado al servidor en el que confío y " -"que es el servidor que he especificado." +"Preferir: No me importa la encriptación, pero si el servidor la soporta, estoy dispuesto a aceptar el costo de la encriptación.\n" +"Requerir: Quiero que mis datos estén encriptados, acepto el costo. Confío en que la red garantizará que siempre me conecte al servidor que deseo.\n" +"Verificar CA: Quiero que mis datos estén encriptados, acepto el costo. Quiero asegurarme de que estoy conectado al servidor en el que confío.\n" +"Verificar completo: Quiero que mis datos estén encriptados, acepto el costo. Quiero estar seguro de que estoy conectado al servidor en el que confío y que es el servidor que he especificado." + +#: assets/serializers/asset/ds.py:18 +msgid "" +"The domain part used by the directory service (e.g., AD) and appended to the" +" username during login, such as example.com in user@example.com." +msgstr "" +"El nombre de dominio se añade a la parte del nombre de usuario al iniciar sesión en servicios de directorio (como AD), por ejemplo, en user@example.com, la parte example.com. \n" +"\n" +"El módulo {} no es aplicable a este activo. \n" +"\n" +"Al ejecutar tareas de sincronización en la nube, ya sea manualmente o en un horario establecido, se debe realizar esta tarea. \n" +"\n" +"Diariamente, el sistema limpiará los registros generados durante la ejecución de la sincronización en la nube, de acuerdo con la configuración en \"Configuraciones del sistema - Tareas - Limpieza periódica - Días de retención del historial de tareas de sincronización en la nube\"." #: assets/serializers/asset/gpt.py:20 msgid "" -"If the server cannot directly connect to the API address, you need set up an " -"HTTP proxy. e.g. http(s)://host:port" +"If the server cannot directly connect to the API address, you need set up an" +" HTTP proxy. e.g. http(s)://host:port" msgstr "" "Si el servidor no puede acceder directamente a la dirección API, necesitas " "configurar un proxy HTTP. Por ejemplo http(s)://host:port" @@ -3072,7 +3054,7 @@ msgid "Disk total" msgstr "Tamaño del disco" #: assets/serializers/asset/info/gathered.py:16 -#: authentication/serializers/connect_token_secret.py:115 +#: authentication/serializers/connect_token_secret.py:117 msgid "OS" msgstr "Sistema operativo" @@ -3096,7 +3078,7 @@ msgstr "Restricciones" msgid "Types" msgstr "Tipo" -#: assets/serializers/domain.py:21 +#: assets/serializers/domain.py:20 msgid "" "A gateway is a network proxy for a zone, and when connecting assets within " "the zone, the connection is routed through the gateway." @@ -3220,11 +3202,11 @@ msgstr "Los activos pueden conectarse a través de una puerta de enlace local." msgid "Default Domain" msgstr "Dominio predeterminado." -#: assets/serializers/platform.py:234 +#: assets/serializers/platform.py:239 msgid "type is required" msgstr "Tipo Este campo es obligatorio." -#: assets/serializers/platform.py:249 +#: assets/serializers/platform.py:254 msgid "Protocols is required" msgstr "El protocolo es obligatorio." @@ -3250,8 +3232,7 @@ msgstr "Recoger información del activo." #: assets/tasks/gather_facts.py:25 msgid "" -"When clicking 'Refresh hardware info' in 'Console - Asset Details - Basic' " -"this task \n" +"When clicking 'Refresh hardware info' in 'Console - Asset Details - Basic' this task \n" " will be executed" msgstr "" "Al hacer clic en actualizar información de hardware en los detalles del " @@ -3271,10 +3252,8 @@ msgstr "Verificar la cantidad de activos bajo el nodo." #: assets/tasks/nodes_amount.py:18 msgid "" -"Manually verifying asset quantities updates the asset count for nodes under " -"the \n" -" current organization. This task will be called in the following two " -"cases: when updating \n" +"Manually verifying asset quantities updates the asset count for nodes under the \n" +" current organization. This task will be called in the following two cases: when updating \n" " nodes and when the number of nodes exceeds 100" msgstr "" "Actualización manual de la cantidad de activos en los nodos de la " @@ -3283,7 +3262,8 @@ msgstr "" #: assets/tasks/nodes_amount.py:34 msgid "" -"The task of self-checking is already running and cannot be started repeatedly" +"The task of self-checking is already running and cannot be started " +"repeatedly" msgstr "" "El programa de autocomprobación ya está en funcionamiento y no se puede " "iniciar de nuevo." @@ -3294,8 +3274,7 @@ msgstr "Comprobación periódica de la cantidad de activos en los nodos." #: assets/tasks/nodes_amount.py:42 msgid "" -"Schedule the check_node_assets_amount_task to periodically update the asset " -"count of \n" +"Schedule the check_node_assets_amount_task to periodically update the asset count of \n" " all nodes under all organizations" msgstr "" "Llamada programada a la tarea check_node_assets_amount_task para actualizar " @@ -3324,8 +3303,8 @@ msgstr "Pruebas de conectividad de la puerta de enlace." #: assets/tasks/ping_gateway.py:23 msgid "" -"When clicking 'Test Connection' in 'Domain Details - Gateway' this task will " -"be executed" +"When clicking 'Test Connection' in 'Domain Details - Gateway' this task will" +" be executed" msgstr "" "Esta tarea se ejecuta al probar la conexión en el detalle del dominio - " "puerta de enlace - prueba de conexión." @@ -3351,7 +3330,8 @@ msgid "App Audits" msgstr "Auditoría de registros." #: audits/backends/db.py:17 -msgid "The text content is too long. Use Elasticsearch to store operation logs" +msgid "" +"The text content is too long. Use Elasticsearch to store operation logs" msgstr "" "El contenido del texto es demasiado largo. Por favor, utilice Elasticsearch " "para almacenar los registros de operaciones." @@ -3394,7 +3374,7 @@ msgstr "Renombrar" msgid "Symlink" msgstr "Establecer enlace simbólico" -#: audits/const.py:18 audits/const.py:28 +#: audits/const.py:18 audits/const.py:29 #: ops/templates/ops/celery_task_log.html:86 #: terminal/api/session/session.py:154 msgid "Download" @@ -3417,56 +3397,60 @@ msgstr "Ver" msgid "Create" msgstr "Crear" -#: audits/const.py:29 +#: audits/const.py:27 templates/_csv_import_export.html:8 +msgid "Export" +msgstr "Exportar" + +#: audits/const.py:30 msgid "Connect" msgstr "Conectar" -#: audits/const.py:30 authentication/templates/authentication/login.html:329 +#: audits/const.py:31 authentication/templates/authentication/login.html:329 #: authentication/templates/authentication/login.html:401 #: templates/_header_bar.html:101 msgid "Login" msgstr "Iniciar sesión" -#: audits/const.py:35 rbac/tree.py:56 +#: audits/const.py:36 rbac/tree.py:56 msgid "Notifications" msgstr "Notificación" -#: audits/const.py:37 tickets/const.py:45 +#: audits/const.py:38 tickets/const.py:45 msgid "Approve" msgstr "Aceptar" -#: audits/const.py:41 ops/models/celery.py:85 +#: audits/const.py:42 ops/models/celery.py:85 #: terminal/models/session/sharing.py:128 tickets/const.py:25 #: xpack/plugins/cloud/const.py:67 msgid "Finished" msgstr "Terminar" -#: audits/const.py:46 settings/serializers/terminal.py:6 +#: audits/const.py:47 settings/serializers/terminal.py:6 #: terminal/models/applet/host.py:26 terminal/models/component/terminal.py:185 -#: terminal/models/virtualapp/provider.py:14 terminal/serializers/session.py:57 -#: terminal/serializers/session.py:113 +#: terminal/models/virtualapp/provider.py:14 +#: terminal/serializers/session.py:57 terminal/serializers/session.py:113 msgid "Terminal" msgstr "Terminal" -#: audits/const.py:51 audits/models.py:133 +#: audits/const.py:52 audits/models.py:133 msgid "Operate log" msgstr "Registro de operaciones" -#: audits/const.py:52 +#: audits/const.py:53 msgid "Session log" msgstr "Registro de sesiones" -#: audits/const.py:53 +#: audits/const.py:54 msgid "Login log" msgstr "Registro de inicio de sesión" -#: audits/const.py:54 rbac/tree.py:64 terminal/models/applet/host.py:144 +#: audits/const.py:55 rbac/tree.py:64 terminal/models/applet/host.py:144 #: terminal/models/component/task.py:22 #: xpack/plugins/cloud/serializers/account.py:77 msgid "Task" msgstr "Tarea" -#: audits/const.py:60 +#: audits/const.py:61 msgid "-" msgstr "-" @@ -3484,7 +3468,7 @@ msgstr "Registro de auditoría de trabajos" msgid "Remote addr" msgstr "Dirección remota" -#: audits/models.py:62 audits/serializers.py:62 +#: audits/models.py:62 audits/serializers.py:61 msgid "Operate" msgstr "Acción" @@ -3509,17 +3493,17 @@ msgstr "Conversación" msgid "File transfer log" msgstr "Transferencia de archivos" -#: audits/models.py:95 audits/serializers.py:110 +#: audits/models.py:95 audits/serializers.py:109 msgid "Resource Type" msgstr "Tipo de recurso" #: audits/models.py:96 audits/models.py:99 audits/models.py:145 -#: audits/serializers.py:109 labels/serializers.py:46 +#: audits/serializers.py:108 labels/serializers.py:46 msgid "Resource" msgstr "Recurso" #: audits/models.py:102 audits/models.py:148 audits/models.py:178 -#: audits/models.py:314 audits/serializers.py:230 +#: audits/models.py:314 audits/serializers.py:232 #: terminal/serializers/command.py:75 msgid "Datetime" msgstr "Fecha" @@ -3553,7 +3537,7 @@ msgstr "Método de inicio de sesión" msgid "Login IP" msgstr "IP de inicio de sesión" -#: audits/models.py:201 audits/serializers.py:76 +#: audits/models.py:201 audits/serializers.py:75 #: authentication/templates/authentication/_mfa_confirm_modal.html:14 #: users/forms/profile.py:64 users/models/user/__init__.py:82 #: users/serializers/profile.py:71 @@ -3604,37 +3588,37 @@ msgid "Application ID" msgstr "ID de aplicación" #: audits/serializers.py:33 ops/models/adhoc.py:24 ops/models/base.py:16 -#: ops/models/base.py:53 ops/models/celery.py:87 ops/models/job.py:154 -#: ops/models/job.py:237 ops/models/playbook.py:30 ops/models/variable.py:17 +#: ops/models/base.py:53 ops/models/celery.py:87 ops/models/job.py:156 +#: ops/models/job.py:239 ops/models/playbook.py:30 ops/models/variable.py:17 #: terminal/models/session/sharing.py:25 msgid "Creator" msgstr "Creador" -#: audits/serializers.py:40 ops/serializers/celery.py:33 +#: audits/serializers.py:39 ops/serializers/celery.py:33 msgid "Execution cycle" msgstr "Ejecutar periódicamente" -#: audits/serializers.py:93 +#: audits/serializers.py:92 msgid "Reason display" msgstr "Descripción del motivo" -#: audits/serializers.py:94 audits/serializers.py:208 +#: audits/serializers.py:93 audits/serializers.py:210 msgid "Auth backend display" msgstr "Método de autenticación" -#: audits/serializers.py:158 +#: audits/serializers.py:157 #, python-format msgid "%s %s this resource" msgstr "El usuario %s %s accedió al recurso actual" -#: audits/serializers.py:196 authentication/models/connection_token.py:51 +#: audits/serializers.py:198 authentication/models/connection_token.py:52 #: authentication/models/temp_token.py:13 perms/models/asset_permission.py:80 #: tickets/models/ticket/apply_application.py:31 #: tickets/models/ticket/apply_asset.py:21 users/models/user/__init__.py:101 msgid "Date expired" msgstr "Fecha de caducidad" -#: audits/serializers.py:227 terminal/models/component/terminal.py:91 +#: audits/serializers.py:229 terminal/models/component/terminal.py:91 #: terminal/serializers/command.py:76 msgid "Remote Address" msgstr "Dirección remota" @@ -3712,17 +3696,14 @@ msgstr "Limpiar el registro de tareas de auditoría de activos" #: audits/tasks.py:134 msgid "" -"Since the system generates login logs, operation logs, file upload logs, " -"activity \n" -" logs, Celery execution logs, session recordings, command records, " -"and password change \n" -" logs, it will perform cleanup of records that exceed the time limit " -"according to the \n" +"Since the system generates login logs, operation logs, file upload logs, activity \n" +" logs, Celery execution logs, session recordings, command records, and password change \n" +" logs, it will perform cleanup of records that exceed the time limit according to the \n" " 'Tasks - Regular clean-up' in the system settings at 2 a.m daily" msgstr "" "Debido a que el sistema genera registros de inicio de sesión, registros de " -"acción, registros de carga de archivos, registros de actividad, registros de " -"ejecución de celery, grabaciones de sesión y registros de comandos, además " +"acción, registros de carga de archivos, registros de actividad, registros de" +" ejecución de celery, grabaciones de sesión y registros de comandos, además " "de registros de cambio de contraseña, el sistema realizará una limpieza " "según la configuración del sistema en la lista de tareas, limpiando " "diariamente a las 2 de la madrugada los elementos que excedan el tiempo" @@ -3733,22 +3714,21 @@ msgstr "Subir archivos FTP al almacenamiento externo." #: audits/tasks.py:156 msgid "" -"If SERVER_REPLAY_STORAGE is configured, files uploaded through file " -"management will be \n" +"If SERVER_REPLAY_STORAGE is configured, files uploaded through file management will be \n" " synchronized to external storage" msgstr "" -"Si se ha configurado SERVER_REPLAY_STORAGE, los archivos subidos a través de " -"la gestión de archivos se sincronizarán con el almacenamiento externo. Se " -"pueden crear hasta 10 claves de acceso. El valor del parámetro debe contener " -"%s. Esta acción requiere la verificación de su MFA, por favor, habilite y " -"configure primero. No se permite el uso de tokens de conexión reutilizables, " -"ya que la configuración global no está activada. La cuenta anónima no admite " -"el activo actual. La autorización ha expirado. La acción de ACL es rechazar: " -"{}({}). La acción de ACL es revisión. La acción de ACL es verificación " -"facial. Las reglas de inicio de sesión del activo no son compatibles con el " -"activo actual. La acción de ACL es reconocimiento facial en línea. No hay " -"características faciales disponibles. La comparación facial ha fallado. El " -"usuario actual no admite el tipo de MFA: {}." +"Si se ha configurado SERVER_REPLAY_STORAGE, los archivos subidos a través de" +" la gestión de archivos se sincronizarán con el almacenamiento externo. Se " +"pueden crear hasta 10 claves de acceso. El valor del parámetro debe contener" +" %s. Esta acción requiere la verificación de su MFA, por favor, habilite y " +"configure primero. No se permite el uso de tokens de conexión reutilizables," +" ya que la configuración global no está activada. La cuenta anónima no " +"admite el activo actual. La autorización ha expirado. La acción de ACL es " +"rechazar: {}({}). La acción de ACL es revisión. La acción de ACL es " +"verificación facial. Las reglas de inicio de sesión del activo no son " +"compatibles con el activo actual. La acción de ACL es reconocimiento facial " +"en línea. No hay características faciales disponibles. La comparación facial" +" ha fallado. El usuario actual no admite el tipo de MFA: {}." #: authentication/api/access_key.py:39 msgid "Access keys can be created at most 10" @@ -3765,43 +3745,43 @@ msgstr "" "Esta operación requiere la verificación de su MFA, por favor, habilítelo y " "configúrelo primero." -#: authentication/api/connection_token.py:303 +#: authentication/api/connection_token.py:304 msgid "Reusable connection token is not allowed, global setting not enabled" msgstr "" "No se permite el uso de tokens de conexión reutilizables, no se han " "habilitado configuraciones globales." -#: authentication/api/connection_token.py:423 +#: authentication/api/connection_token.py:424 msgid "Anonymous account is not supported for this asset" msgstr "Las cuentas anónimas no son compatibles con los activos actuales." -#: authentication/api/connection_token.py:455 +#: authentication/api/connection_token.py:454 msgid "Permission expired" msgstr "La autorización ha expirado." -#: authentication/api/connection_token.py:488 +#: authentication/api/connection_token.py:487 msgid "ACL action is reject: {}({})" msgstr "La acción de ACL es rechazar: {}({})" -#: authentication/api/connection_token.py:492 +#: authentication/api/connection_token.py:491 msgid "ACL action is review" msgstr "La acción de ACL es revisar." -#: authentication/api/connection_token.py:502 +#: authentication/api/connection_token.py:501 msgid "ACL action is face verify" msgstr "La acción de ACL es verificación facial." -#: authentication/api/connection_token.py:507 +#: authentication/api/connection_token.py:506 msgid "ACL action not supported for this asset" msgstr "" "La regla de inicio de sesión del activo no es compatible con los activos " "actuales." -#: authentication/api/connection_token.py:514 +#: authentication/api/connection_token.py:513 msgid "ACL action is face online" msgstr "La acción de ACL es verificación facial en línea." -#: authentication/api/connection_token.py:533 +#: authentication/api/connection_token.py:532 msgid "No available face feature" msgstr "No hay características faciales disponibles." @@ -3861,7 +3841,8 @@ msgstr "Token inválido. La cadena de símbolos no debe contener espacios." msgid "" "Invalid token header. Sign string should not contain invalid characters." msgstr "" -"Token inválido. La cadena de símbolos no debe contener caracteres no válidos." +"Token inválido. La cadena de símbolos no debe contener caracteres no " +"válidos." #: authentication/backends/drf.py:82 msgid "Invalid token or cache refreshed." @@ -3875,8 +3856,8 @@ msgstr "Error de OpenID" #: authentication/backends/saml2/views.py:283 msgid "Please check if a user with the same username or email already exists" msgstr "" -"Por favor, verifica si ya existe un usuario con el mismo nombre de usuario o " -"correo electrónico" +"Por favor, verifica si ya existe un usuario con el mismo nombre de usuario o" +" correo electrónico" #: authentication/backends/passkey/api.py:37 msgid "Only register passkey for local user" @@ -3925,16 +3906,16 @@ msgstr "MFA virtual" msgid "SMS" msgstr "SMS" -#: authentication/const.py:34 +#: authentication/const.py:35 msgid "Face Recognition" msgstr "Reconocimiento facial" -#: authentication/const.py:35 settings/serializers/auth/radius.py:14 +#: authentication/const.py:36 settings/serializers/auth/radius.py:14 #: settings/serializers/auth/radius.py:16 msgid "Radius" msgstr "Radius" -#: authentication/const.py:36 +#: authentication/const.py:37 msgid "Custom" msgstr "Personalizado" @@ -4016,8 +3997,8 @@ msgstr "" #: authentication/errors/const.py:59 #, python-brace-format msgid "" -"{error}, You can also try {times_try} times (The account will be temporarily " -"locked for {block_time} minutes)" +"{error}, You can also try {times_try} times (The account will be temporarily" +" locked for {block_time} minutes)" msgstr "" "{error} también puede intentar {times_try} veces (la cuenta se bloqueará " "temporalmente por {block_time} minutos)" @@ -4129,7 +4110,9 @@ msgstr "Tipo de MFA." msgid "Captcha" msgstr "Código de verificación." -#: authentication/forms.py:66 users/forms/profile.py:28 +#: authentication/forms.py:66 authentication/mfa/email.py:41 +#: authentication/templates/authentication/_msg_mfa_email_code.html:12 +#: users/forms/profile.py:28 msgid "MFA code" msgstr "Código MFA." @@ -4143,9 +4126,12 @@ msgstr "Por favor, introduzca el código de seguridad dinámico." #: authentication/mfa/base.py:27 msgid "" -"The two-factor code you entered has either already been used or has expired. " -"Please request a new one." +"The two-factor code you entered has either already been used or has expired." +" Please request a new one." msgstr "" +"El código de verificación de doble autenticación que ingresó ha sido " +"utilizado o ha expirado. Por favor, solicite un nuevo código de verificación" +" de doble autenticación." #: authentication/mfa/custom.py:21 msgid "MFA Custom code invalid" @@ -4160,6 +4146,15 @@ msgid "MFA custom global enabled, cannot disable" msgstr "" "El MFA personalizado está habilitado globalmente y no se puede desactivar." +#: authentication/mfa/email.py:11 +msgid "Email verify code invalid" +msgstr "" +"La verificación del código de verificación del correo electrónico ha fallado" + +#: authentication/mfa/email.py:17 +msgid "Email verification code" +msgstr "Código de verificación del correo electrónico" + #: authentication/mfa/face.py:55 msgid "Bind face to enable" msgstr "Vincule las características faciales para habilitar." @@ -4211,10 +4206,11 @@ msgstr "Configurar el número de teléfono para habilitar" msgid "Clear phone number to disable" msgstr "Limpiar número de teléfono para desactivar" -#: authentication/middleware.py:95 settings/utils/ldap.py:691 +#: authentication/middleware.py:95 settings/utils/ldap.py:711 msgid "Authentication failed (before login check failed): {}" msgstr "" -"Error de autenticación (fallo en la verificación antes de iniciar sesión): {}" +"Error de autenticación (fallo en la verificación antes de iniciar sesión): " +"{}" #: authentication/mixins.py:83 msgid "User is invalid" @@ -4237,22 +4233,22 @@ msgstr "El método MFA ({}) no está habilitado" msgid "Please change your password" msgstr "Por favor, modifica la contraseña" -#: authentication/models/connection_token.py:42 +#: authentication/models/connection_token.py:43 #: terminal/serializers/storage.py:114 msgid "Account name" msgstr "Nombre de la cuenta" -#: authentication/models/connection_token.py:43 +#: authentication/models/connection_token.py:44 msgid "Input username" msgstr "Nombre de usuario personalizado" -#: authentication/models/connection_token.py:44 +#: authentication/models/connection_token.py:45 #: authentication/serializers/connection_token.py:18 msgid "Input secret" msgstr "Contraseña personalizada" -#: authentication/models/connection_token.py:45 -#: authentication/serializers/connect_token_secret.py:114 +#: authentication/models/connection_token.py:46 +#: authentication/serializers/connect_token_secret.py:116 #: settings/serializers/msg.py:28 terminal/models/applet/applet.py:43 #: terminal/models/virtualapp/virtualapp.py:24 #: terminal/serializers/session.py:23 terminal/serializers/session.py:50 @@ -4260,69 +4256,69 @@ msgstr "Contraseña personalizada" msgid "Protocol" msgstr "Protocolo" -#: authentication/models/connection_token.py:46 +#: authentication/models/connection_token.py:47 msgid "Connect method" msgstr "Método de conexión" -#: authentication/models/connection_token.py:48 +#: authentication/models/connection_token.py:49 msgid "User display" msgstr "Nombre de usuario" -#: authentication/models/connection_token.py:49 +#: authentication/models/connection_token.py:50 msgid "Asset display" msgstr "Nombre de activo" -#: authentication/models/connection_token.py:50 +#: authentication/models/connection_token.py:51 msgid "Reusable" msgstr "Puede reutilizarse" -#: authentication/models/connection_token.py:55 +#: authentication/models/connection_token.py:56 #: perms/models/asset_permission.py:83 msgid "From ticket" msgstr "Proveniente de la orden de trabajo" -#: authentication/models/connection_token.py:57 +#: authentication/models/connection_token.py:58 msgid "Face monitor token" msgstr "Token de monitoreo facial" -#: authentication/models/connection_token.py:68 +#: authentication/models/connection_token.py:69 msgid "Can expire connection token" msgstr "Token de conexión que puede expirar" -#: authentication/models/connection_token.py:69 +#: authentication/models/connection_token.py:70 msgid "Can reuse connection token" msgstr "Token de conexión reutilizable" -#: authentication/models/connection_token.py:71 +#: authentication/models/connection_token.py:72 msgid "Connection token" msgstr "Token de conexión" -#: authentication/models/connection_token.py:132 +#: authentication/models/connection_token.py:163 msgid "Connection token inactive" msgstr "Token de conexión no activado" -#: authentication/models/connection_token.py:136 +#: authentication/models/connection_token.py:167 msgid "Connection token expired at: {}" msgstr "Token de conexión expirado: {}" -#: authentication/models/connection_token.py:139 +#: authentication/models/connection_token.py:170 #: terminal/serializers/session.py:95 msgid "No user or invalid user" msgstr "No hay usuario o el usuario ha caducado" -#: authentication/models/connection_token.py:142 +#: authentication/models/connection_token.py:173 msgid "No asset or inactive asset" msgstr "No hay activos o activos no activados" -#: authentication/models/connection_token.py:290 +#: authentication/models/connection_token.py:341 msgid "Can view super connection token secret" msgstr "Se puede ver el cifrado del token de super conexión" -#: authentication/models/connection_token.py:292 +#: authentication/models/connection_token.py:343 msgid "Super connection token" msgstr "Token de super conexión" -#: authentication/models/connection_token.py:309 +#: authentication/models/connection_token.py:360 msgid "Admin connection token" msgstr "Token de conexión del administrador" @@ -4336,7 +4332,7 @@ msgstr "Token privado" msgid "Private key" msgstr "Clave privada SSH" -#: authentication/models/ssh_key.py:18 settings/serializers/terminal.py:34 +#: authentication/models/ssh_key.py:18 settings/serializers/terminal.py:38 #: users/forms/profile.py:175 users/models/user/__init__.py:92 #: xpack/plugins/cloud/serializers/account_attrs.py:211 msgid "Public key" @@ -4362,39 +4358,39 @@ msgstr "Recordatorio de inicio de sesión remoto" msgid "binding reminder" msgstr "Recordatorio de vinculación" -#: authentication/serializers/connect_token_secret.py:116 +#: authentication/serializers/connect_token_secret.py:118 msgid "Is builtin" msgstr "Incorporado" -#: authentication/serializers/connect_token_secret.py:120 +#: authentication/serializers/connect_token_secret.py:122 msgid "Options" msgstr "Opciones" -#: authentication/serializers/connect_token_secret.py:127 +#: authentication/serializers/connect_token_secret.py:129 #: ops/notifications.py:19 rbac/tree.py:60 msgid "Component" msgstr "Componentes" -#: authentication/serializers/connect_token_secret.py:136 +#: authentication/serializers/connect_token_secret.py:138 #: perms/serializers/user_permission.py:28 xpack/plugins/cloud/models.py:389 msgid "Domain" msgstr "Dominio" -#: authentication/serializers/connect_token_secret.py:138 +#: authentication/serializers/connect_token_secret.py:140 msgid "Expired now" msgstr "Expiración inmediata" -#: authentication/serializers/connect_token_secret.py:171 +#: authentication/serializers/connect_token_secret.py:173 #: terminal/models/virtualapp/virtualapp.py:25 msgid "Image name" msgstr "Nombre de imagen" -#: authentication/serializers/connect_token_secret.py:172 +#: authentication/serializers/connect_token_secret.py:174 #: terminal/models/virtualapp/virtualapp.py:27 msgid "Image port" msgstr "Puerto de imagen" -#: authentication/serializers/connect_token_secret.py:173 +#: authentication/serializers/connect_token_secret.py:175 #: terminal/models/virtualapp/virtualapp.py:26 msgid "Image protocol" msgstr "Protocolo de imagen" @@ -4444,14 +4440,14 @@ msgstr "Tipo de creación" #: authentication/serializers/ssh_key.py:33 msgid "" -"Please download the private key after creation. Each private key can only be " -"downloaded once" +"Please download the private key after creation. Each private key can only be" +" downloaded once" msgstr "" "Después de la creación, descargue la clave privada, cada clave privada solo " "tiene una oportunidad de descarga." #: authentication/serializers/ssh_key.py:57 users/forms/profile.py:164 -#: users/serializers/profile.py:134 users/serializers/profile.py:161 +#: users/serializers/profile.py:142 users/serializers/profile.py:169 msgid "Not a valid ssh public key" msgstr "Clave SSH no válida" @@ -4467,11 +4463,11 @@ msgstr "Eliminar sesiones expiradas" #: authentication/tasks.py:15 msgid "" -"Since user logins create sessions, the system will clean up expired sessions " -"every 24 hours" +"Since user logins create sessions, the system will clean up expired sessions" +" every 24 hours" msgstr "" -"Debido a que el usuario inicia sesión en el sistema, se generará una sesión, " -"y el sistema limpiará cada 24 horas las sesiones que ya hayan expirado." +"Debido a que el usuario inicia sesión en el sistema, se generará una sesión," +" y el sistema limpiará cada 24 horas las sesiones que ya hayan expirado." #: authentication/templates/authentication/_access_key_modal.html:6 msgid "API key list" @@ -4492,12 +4488,14 @@ msgid "Show" msgstr "Mostrar" #: authentication/templates/authentication/_access_key_modal.html:66 -#: users/const.py:42 users/templates/users/user_verify_mfa.html:36 +#: settings/serializers/terminal.py:24 users/const.py:42 +#: users/templates/users/user_verify_mfa.html:36 msgid "Disable" msgstr "Deshabilitar" #: authentication/templates/authentication/_access_key_modal.html:67 -#: users/const.py:43 users/templates/users/mfa_setting.html:120 +#: settings/serializers/terminal.py:24 users/const.py:43 +#: users/templates/users/mfa_setting.html:120 #: users/templates/users/mfa_setting.html:158 #: users/templates/users/mfa_setting.html:177 msgid "Enable" @@ -4531,10 +4529,11 @@ msgid "Code error" msgstr "Código de error" #: authentication/templates/authentication/_msg_different_city.html:3 +#: authentication/templates/authentication/_msg_mfa_email_code.html:9 #: authentication/templates/authentication/_msg_oauth_bind.html:3 #: authentication/templates/authentication/_msg_reset_password.html:3 #: authentication/templates/authentication/_msg_reset_password_code.html:9 -#: jumpserver/conf.py:539 +#: jumpserver/conf.py:540 #: perms/templates/perms/_msg_item_permissions_expire.html:3 #: tickets/templates/tickets/approve_check_password.html:32 #: users/templates/users/_msg_account_expire_reminder.html:4 @@ -4557,6 +4556,11 @@ msgstr "" "Si sospechas que este acceso es irregular, te recomendamos que cambies la " "contraseña de tu cuenta lo antes posible." +#: authentication/templates/authentication/_msg_mfa_email_code.html:15 +#: authentication/templates/authentication/_msg_reset_password_code.html:18 +msgid "The validity period of the verification code is one minute" +msgstr "El código de verificación tiene una validez de 1 minuto." + #: authentication/templates/authentication/_msg_oauth_bind.html:6 msgid "Your account has just been bound to" msgstr "Tu cuenta ha sido vinculada recientemente a" @@ -4609,10 +4613,6 @@ msgstr "" "Copiar el código de verificación en la página de restablecimiento de " "contraseña para cambiarla." -#: authentication/templates/authentication/_msg_reset_password_code.html:18 -msgid "The validity period of the verification code is one minute" -msgstr "El código de verificación tiene una validez de 1 minuto." - #: authentication/templates/authentication/_msg_rest_password_success.html:5 msgid "Your password has just been successfully updated" msgstr "Tu contraseña ha sido actualizada con éxito." @@ -4830,8 +4830,7 @@ msgid "" "Wait for {} confirm, You also can copy link to her/him
\n" " Don't close this page" msgstr "" -"Esperando la confirmación de {}, también puedes copiar el enlace y " -"enviárselo a él/ella
\n" +"Esperando la confirmación de {}, también puedes copiar el enlace y enviárselo a él/ella
\n" "No cierres esta página" #: authentication/views/login.py:375 @@ -4848,8 +4847,8 @@ msgstr "Cerrar sesión con éxito, regresando a la página de inicio de sesión" #: authentication/views/mixins.py:39 msgid "" -"For your safety, automatic redirection login is not supported on the client. " -"If you need to open it in the client, please log in again" +"For your safety, automatic redirection login is not supported on the client." +" If you need to open it in the client, please log in again" msgstr "" "Por su seguridad, la aplicación no soporta el inicio de sesión automático. " "Si necesita abrir la aplicación, por favor inicie sesión de nuevo" @@ -4890,7 +4889,8 @@ msgstr "" #: common/api/action.py:57 msgid "Request file format may be wrong" -msgstr "Formato de archivo subido incorrecto o archivo de otro tipo de recurso" +msgstr "" +"Formato de archivo subido incorrecto o archivo de otro tipo de recurso" #: common/const/choices.py:41 msgid "China" @@ -4984,8 +4984,8 @@ msgstr "Campo cifrado" #: common/db/fields.py:578 msgid "" -"Invalid JSON data for JSONManyToManyField, should be like {'type': 'all'} or " -"{'type': 'ids', 'ids': []} or {'type': 'attrs', 'attrs': [{'name': 'ip', " +"Invalid JSON data for JSONManyToManyField, should be like {'type': 'all'} or" +" {'type': 'ids', 'ids': []} or {'type': 'attrs', 'attrs': [{'name': 'ip', " "'match': 'exact', 'value': '1.1.1.1'}}" msgstr "" "El campo JSON de muchos a muchos es inválido, debería ser {'type': 'all'} o " @@ -5054,27 +5054,27 @@ msgstr "Error al analizar el archivo: {}" msgid "Invalid excel file" msgstr "Archivo de Excel no válido" -#: common/drf/renders/base.py:138 +#: common/drf/renders/base.py:140 msgid "Yes/No" msgstr "Sí/No" -#: common/drf/renders/base.py:141 +#: common/drf/renders/base.py:143 msgid "Text, max length {}" msgstr "Texto, longitud máxima {}" -#: common/drf/renders/base.py:143 +#: common/drf/renders/base.py:145 msgid "Long text, no length limit" msgstr "Texto largo, sin límite de longitud" -#: common/drf/renders/base.py:145 +#: common/drf/renders/base.py:147 msgid "Number, min {} max {}" msgstr "Número, mínimo {} máximo {}" -#: common/drf/renders/base.py:148 +#: common/drf/renders/base.py:150 msgid "Datetime format {}" msgstr "Formato de fecha y hora {}" -#: common/drf/renders/base.py:154 +#: common/drf/renders/base.py:156 msgid "" "Choices, format name(value), name is optional for human read, value is " "requisite, options {}" @@ -5082,30 +5082,30 @@ msgstr "" "Opciones, formato: Nombre(valor), el nombre es opcional para facilitar la " "lectura, el valor es obligatorio, las opciones son {}" -#: common/drf/renders/base.py:157 +#: common/drf/renders/base.py:159 msgid "Choices, options {}" msgstr "Opciones, las opciones son {}" -#: common/drf/renders/base.py:159 +#: common/drf/renders/base.py:161 msgid "Phone number, format +8612345678901" msgstr "Número de teléfono, formato +8612345678901" -#: common/drf/renders/base.py:161 +#: common/drf/renders/base.py:163 msgid "Label, format [\"key:value\"]" msgstr "Etiqueta, formato: [\"clave:valor\"]" -#: common/drf/renders/base.py:163 +#: common/drf/renders/base.py:165 msgid "" "Object, format name(id), name is optional for human read, id is requisite" msgstr "" "Elemento relacionado, formato: Nombre(id), el nombre es opcional para " "facilitar la lectura, el id es obligatorio" -#: common/drf/renders/base.py:165 +#: common/drf/renders/base.py:167 msgid "Object, format id" msgstr "Elemento relacionado, el formato es id" -#: common/drf/renders/base.py:169 +#: common/drf/renders/base.py:171 msgid "" "Objects, format [\"name(id)\", ...], name is optional for human read, id is " "requisite" @@ -5113,18 +5113,17 @@ msgstr "" "Múltiples elementos relacionados, formato: [\"Nombre(id)\", ...], el nombre " "es opcional para facilitar la lectura, el id es obligatorio." -#: common/drf/renders/base.py:171 -msgid "" -"Labels, format [\"key:value\", ...], if label not exists, will create it" +#: common/drf/renders/base.py:173 +msgid "Labels, format [\"key:value\", ...], if label not exists, will create it" msgstr "" "Etiquetas, formato: [\"clave:valor\", ...], si la etiqueta no existe, se " "creará." -#: common/drf/renders/base.py:173 +#: common/drf/renders/base.py:175 msgid "Objects, format [\"id\", ...]" msgstr "Múltiples elementos relacionados, el formato es [\"id\", ...]." -#: common/drf/renders/base.py:271 +#: common/drf/renders/base.py:275 msgid "" "{} - The encryption password has not been set - please go to personal " "information -> file encryption password to set the encryption password" @@ -5133,6 +5132,22 @@ msgstr "" "información personal -> Configuración de contraseña de archivos para " "establecerla." +#: common/drf/renders/mixins.py:37 labels/serializers.py:22 +msgid "Resource count" +msgstr "Cantidad de recursos" + +#: common/drf/renders/mixins.py:46 +msgid "Export all" +msgstr "Exportar todo" + +#: common/drf/renders/mixins.py:48 +msgid "Export only selected items" +msgstr "Exportar solo selección" + +#: common/drf/renders/mixins.py:50 +msgid "Export filtered" +msgstr "Exportar búsqueda" + #: common/exceptions.py:15 xpack/plugins/cloud/ws.py:37 #, python-format msgid "%s object does not exist." @@ -5163,15 +5178,15 @@ msgstr "Esta acción requiere la confirmación del usuario actual." msgid "Unexpect error occur" msgstr "Ocurrió un error inesperado." -#: common/plugins/es.py:35 +#: common/plugins/es.py:36 msgid "Invalid elasticsearch config" msgstr "Configuración de Elasticsearch no válida." -#: common/plugins/es.py:40 +#: common/plugins/es.py:41 msgid "Not Support Elasticsearch8" msgstr "No se soporta Elasticsearch8." -#: common/plugins/es.py:46 +#: common/plugins/es.py:47 msgid "" "Connection failed: Self-signed certificate used. Please check server " "certificate configuration" @@ -5302,10 +5317,8 @@ msgstr "Enviar archivo adjunto en el correo electrónico" #: common/tasks.py:68 msgid "" -"When an account password is changed or an account backup generates " -"attachments, \n" -" this task needs to be executed for sending emails and handling " -"attachments" +"When an account password is changed or an account backup generates attachments, \n" +" this task needs to be executed for sending emails and handling attachments" msgstr "" "Cuando la cuenta cambia de contraseña, los archivos adjuntos de respaldo de " "la cuenta necesitan que se ejecute esta tarea para el envío de correos y " @@ -5342,8 +5355,7 @@ msgstr "Enviar código de verificación por SMS" #: common/utils/verify_code.py:19 msgid "" -"When resetting a password, forgetting a password, or verifying MFA, this " -"task needs to \n" +"When resetting a password, forgetting a password, or verifying MFA, this task needs to \n" " be executed to send SMS messages" msgstr "" "Al restablecer la contraseña, olvidar la contraseña o validar mfa, se debe " @@ -5369,16 +5381,16 @@ msgstr "No se encontró el Código" msgid "The message code provided is invalid or has expired" msgstr "El código de mensaje proporcionado es inválido o ha expirado" -#: jumpserver/conf.py:533 +#: jumpserver/conf.py:534 #, python-brace-format msgid "The verification code is: {code}" msgstr "El código de verificación es: {code}" -#: jumpserver/conf.py:538 +#: jumpserver/conf.py:539 msgid "Create account successfully" msgstr "Creación de cuenta exitosa" -#: jumpserver/conf.py:540 +#: jumpserver/conf.py:541 msgid "Your account has been created successfully" msgstr "Tu cuenta ha sido creada con éxito" @@ -5391,17 +5403,11 @@ msgid "

Flower service unavailable, check it

" msgstr "" "El servicio de Flower no está disponible. Por favor, verifica. \n" "\n" -"Luna es un programa que se despliega de manera independiente; necesitas " -"implementar Luna y Koko. Si estás viendo esta página, significa que no estás " -"accediendo al puerto que escucha nginx. ¡Buena suerte!\n" +"Luna es un programa que se despliega de manera independiente; necesitas implementar Luna y Koko. Si estás viendo esta página, significa que no estás accediendo al puerto que escucha nginx. ¡Buena suerte!\n" "\n" -"El servicio Websocket se ejecuta en el puerto: {}, por favor verifica si " -"nginx está configurado correctamente para el proxy.\n" +"El servicio Websocket se ejecuta en el puerto: {}, por favor verifica si nginx está configurado correctamente para el proxy.\n" "\n" -"Koko es un programa que se despliega de manera independiente; necesitas " -"implementar Koko y asegurarte de que la configuración de nginx esté " -"encaminando. Si estás viendo esta página, significa que no estás accediendo " -"al puerto que escucha nginx. ¡Buena suerte!\n" +"Koko es un programa que se despliega de manera independiente; necesitas implementar Koko y asegurarte de que la configuración de nginx esté encaminando. Si estás viendo esta página, significa que no estás accediendo al puerto que escucha nginx. ¡Buena suerte!\n" "\n" "Gestión de etiquetas \n" "Color \n" @@ -5462,10 +5468,6 @@ msgstr "ID de recurso" msgid "Tagged resource" msgstr "Recursos asociados" -#: labels/serializers.py:22 -msgid "Resource count" -msgstr "Cantidad de recursos" - #: labels/serializers.py:28 msgid "Cannot contain \":,\"" msgstr "No puede contener \":,\"" @@ -5504,29 +5506,25 @@ msgstr "Publicar Mensaje Interno" #: notifications/notifications.py:48 msgid "" -"This task needs to be executed for sending internal messages for system " -"alerts, \n" +"This task needs to be executed for sending internal messages for system alerts, \n" " work orders, and other notifications" msgstr "" "Ejecutar esta tarea cuando el sistema requiera enviar mensajes internos, " "como alertas y órdenes de trabajo" -#: ops/ansible/inventory.py:117 ops/models/job.py:68 +#: ops/ansible/inventory.py:126 ops/ansible/inventory.py:196 +#: ops/models/job.py:69 msgid "No account available" msgstr "No hay cuentas disponibles" -#: ops/ansible/inventory.py:298 +#: ops/ansible/inventory.py:318 ops/ansible/inventory.py:360 msgid "Ansible disabled" msgstr "Ansible ha sido desactivado" -#: ops/ansible/inventory.py:314 +#: ops/ansible/inventory.py:376 msgid "Skip hosts below:" msgstr "Se omiten los siguientes hosts:" -#: ops/api/adhoc.py:32 -msgid "Deleting other people's script is not allowed" -msgstr "No se permite eliminar los scripts de otros" - #: ops/api/celery.py:66 ops/api/celery.py:81 msgid "Waiting task start" msgstr "Esperando el inicio de la tarea" @@ -5539,7 +5537,7 @@ msgstr "La tarea {} no existe" msgid "Task {} args or kwargs error" msgstr "Error en los parámetros de ejecución de la tarea {}" -#: ops/api/job.py:68 +#: ops/api/job.py:70 #, python-brace-format msgid "" "Asset ({asset}) must have at least one of the following protocols added: " @@ -5548,21 +5546,21 @@ msgstr "" "El activo ({asset}) debe tener al menos uno de los siguientes protocolos: " "ssh, sftp, winrm" -#: ops/api/job.py:69 +#: ops/api/job.py:71 #, python-brace-format msgid "Asset ({asset}) authorization is missing SSH, SFTP, or WinRM protocol" msgstr "Falta autorización de ssh, sftp o winrm para el activo ({asset})" -#: ops/api/job.py:70 +#: ops/api/job.py:72 #, python-brace-format msgid "Asset ({asset}) authorization lacks upload permissions" msgstr "Falta permiso de subida para el activo ({asset})" -#: ops/api/job.py:158 +#: ops/api/job.py:160 msgid "Duplicate file exists" msgstr "" -"Existen archivos con el mismo nombre. El tamaño del archivo excede el límite " -"máximo. Por favor, seleccione un archivo de menos de {limit}MB. Se está " +"Existen archivos con el mismo nombre. El tamaño del archivo excede el límite" +" máximo. Por favor, seleccione un archivo de menos de {limit}MB. Se está " "creando la tarea, no se puede interrumpir; por favor, inténtelo más tarde. " "No se permite eliminar el playbook de otros. El playbook actual está en uso " "por un trabajo. Contenido de archivo no soportado. Ruta de archivo no " @@ -5570,7 +5568,7 @@ msgstr "" "del archivo es un campo obligatorio. No se puede eliminar este archivo. " "Centro de trabajos. Empuje. Verificación. Recopilación." -#: ops/api/job.py:163 +#: ops/api/job.py:165 #, python-brace-format msgid "" "File size exceeds maximum limit. Please select a file smaller than {limit}MB" @@ -5578,7 +5576,7 @@ msgstr "" "El tamaño del archivo excede el límite máximo. Por favor, selecciona un " "archivo menor de {limit}MB." -#: ops/api/job.py:236 +#: ops/api/job.py:238 msgid "" "The task is being created and cannot be interrupted. Please try again later." msgstr "" @@ -5586,34 +5584,30 @@ msgstr "" "nuevo más tarde." #: ops/api/playbook.py:49 -msgid "Deleting other people's playbook is not allowed" -msgstr "No se permite eliminar el playbook de otros" - -#: ops/api/playbook.py:55 msgid "Currently playbook is being used in a job" msgstr "El playbook actual se está utilizando en un trabajo." -#: ops/api/playbook.py:128 +#: ops/api/playbook.py:122 msgid "Unsupported file content" msgstr "Contenido de archivo no soportado" -#: ops/api/playbook.py:130 ops/api/playbook.py:176 ops/api/playbook.py:224 +#: ops/api/playbook.py:124 ops/api/playbook.py:170 ops/api/playbook.py:218 msgid "Invalid file path" msgstr "Ruta de archivo inválida" -#: ops/api/playbook.py:202 +#: ops/api/playbook.py:196 msgid "This file can not be rename" msgstr "Este archivo no puede ser renombrado" -#: ops/api/playbook.py:221 +#: ops/api/playbook.py:215 msgid "File already exists" msgstr "El archivo ya existe" -#: ops/api/playbook.py:239 +#: ops/api/playbook.py:233 msgid "File key is required" msgstr "La clave del archivo es un campo requerido." -#: ops/api/playbook.py:242 +#: ops/api/playbook.py:236 msgid "This file can not be delete" msgstr "No se puede eliminar este archivo" @@ -5662,7 +5656,7 @@ msgstr "VCS" msgid "Adhoc" msgstr "Comando" -#: ops/const.py:39 ops/models/job.py:152 ops/models/playbook.py:89 +#: ops/const.py:39 ops/models/job.py:154 ops/models/playbook.py:89 #: ops/models/variable.py:23 msgid "Playbook" msgstr "Playbook" @@ -5749,17 +5743,19 @@ msgid "no valid program entry found." msgstr "No hay entrada de programa disponible" #: ops/mixin.py:34 ops/mixin.py:166 settings/serializers/auth/ldap.py:74 -#: settings/serializers/auth/ldap_ha.py:57 +#: settings/serializers/auth/ldap_ha.py:56 msgid "Periodic run" msgstr "Ejecutar periódicamente" #: ops/mixin.py:36 ops/mixin.py:113 ops/mixin.py:172 -#: settings/serializers/auth/ldap.py:81 settings/serializers/auth/ldap_ha.py:64 +#: settings/serializers/auth/ldap.py:81 +#: settings/serializers/auth/ldap_ha.py:63 msgid "Interval" msgstr "Intervalo" #: ops/mixin.py:39 ops/mixin.py:111 ops/mixin.py:169 -#: settings/serializers/auth/ldap.py:78 settings/serializers/auth/ldap_ha.py:61 +#: settings/serializers/auth/ldap.py:78 +#: settings/serializers/auth/ldap_ha.py:60 msgid "Crontab" msgstr "Crontab" @@ -5783,7 +5779,11 @@ msgstr "Ciclo de ejecución" msgid "* Please enter a valid crontab expression" msgstr "* Por favor, introduzca una expresión crontab válida" -#: ops/mixin.py:204 settings/serializers/auth/mixin.py:12 +#: ops/mixin.py:194 +msgid "Crontab minute must not contain '*'" +msgstr "" + +#: ops/mixin.py:208 settings/serializers/auth/mixin.py:12 msgid "Require interval or crontab setting" msgstr "Se requiere un ciclo o configuración periódica" @@ -5791,18 +5791,19 @@ msgstr "Se requiere un ciclo o configuración periódica" msgid "Pattern" msgstr "Modo" -#: ops/models/adhoc.py:22 ops/models/job.py:149 +#: ops/models/adhoc.py:22 ops/models/job.py:151 msgid "Module" msgstr "Módulo" -#: ops/models/adhoc.py:23 ops/models/celery.py:82 ops/models/job.py:147 +#: ops/models/adhoc.py:23 ops/models/celery.py:82 ops/models/job.py:149 #: terminal/models/component/task.py:14 msgid "Args" msgstr "Contenido" -#: ops/models/adhoc.py:26 ops/models/playbook.py:34 ops/serializers/mixin.py:10 -#: rbac/models/role.py:31 rbac/models/rolebinding.py:46 -#: rbac/serializers/role.py:12 settings/serializers/auth/oauth2.py:37 +#: ops/models/adhoc.py:26 ops/models/playbook.py:34 +#: ops/serializers/mixin.py:10 rbac/models/role.py:31 +#: rbac/models/rolebinding.py:46 rbac/serializers/role.py:12 +#: settings/serializers/auth/oauth2.py:37 msgid "Scope" msgstr "Rango" @@ -5838,48 +5839,54 @@ msgstr "Fecha de publicación" msgid "Celery Task Execution" msgstr "Ejecución de tareas de Celery" -#: ops/models/job.py:150 +#: ops/models/job.py:82 +#, fuzzy +#| msgid "Anonymous account is not supported for this asset" +msgid "Module {} is not suitable for this asset" +msgstr "Las cuentas anónimas no son compatibles con los activos actuales." + +#: ops/models/job.py:152 msgid "Run dir" msgstr "Directorio de ejecución" -#: ops/models/job.py:151 +#: ops/models/job.py:153 msgid "Timeout (Seconds)" msgstr "Tiempo de espera (segundos)" -#: ops/models/job.py:157 +#: ops/models/job.py:159 msgid "Use Parameter Define" msgstr "Definición de parámetros de uso" -#: ops/models/job.py:158 +#: ops/models/job.py:160 msgid "Parameters define" msgstr "Definición de parámetros" -#: ops/models/job.py:159 +#: ops/models/job.py:161 msgid "Periodic variable" msgstr "Variables de ejecución periódica" -#: ops/models/job.py:160 +#: ops/models/job.py:162 msgid "Run as" msgstr "Usuario de ejecución" -#: ops/models/job.py:162 +#: ops/models/job.py:164 msgid "Run as policy" msgstr "Política de usuario" -#: ops/models/job.py:219 ops/models/variable.py:28 ops/serializers/job.py:111 +#: ops/models/job.py:221 ops/models/variable.py:28 ops/serializers/job.py:111 #: terminal/notifications.py:182 msgid "Job" msgstr "Trabajo" -#: ops/models/job.py:242 +#: ops/models/job.py:244 msgid "Material" msgstr "Material" -#: ops/models/job.py:244 +#: ops/models/job.py:246 msgid "Material Type" msgstr "Tipo de material" -#: ops/models/job.py:556 +#: ops/models/job.py:558 msgid "Job Execution" msgstr "Ejecución de trabajos" @@ -5903,9 +5910,9 @@ msgid "" "referenced in the script using {{ jms_name }}" msgstr "" "Nombre de la variable utilizada en el script, con el prefijo fijo jms_ + el " -"nombre de la variable ingresada, por ejemplo, si el nombre de la variable es " -"name, la variable de entorno generada será jms_name. Al hacer referencia en " -"el script, se utiliza {{ jms_name }}" +"nombre de la variable ingresada, por ejemplo, si el nombre de la variable es" +" name, la variable de entorno generada será jms_name. Al hacer referencia en" +" el script, se utiliza {{ jms_name }}" #: ops/models/variable.py:16 ops/serializers/variable.py:32 msgid "Default Value" @@ -6026,10 +6033,8 @@ msgstr "Crear o actualizar tareas programadas" #: ops/tasks.py:134 msgid "" -"With version iterations, new tasks may be added, or task names and execution " -"times may \n" -" be modified. Therefore, upon system startup, tasks will be " -"registered or the parameters \n" +"With version iterations, new tasks may be added, or task names and execution times may \n" +" be modified. Therefore, upon system startup, tasks will be registered or the parameters \n" " of scheduled tasks will be updated" msgstr "" "Con cada iteración de versión, pueden añadirse nuevas tareas o modificarse " @@ -6042,26 +6047,14 @@ msgstr "Detección periódica del rendimiento del servicio." #: ops/tasks.py:149 msgid "" -"Check every hour whether each component is offline and whether the CPU, " -"memory, \n" -" and disk usage exceed the thresholds, and send an alert message to " -"the administrator" +"Check every hour whether each component is offline and whether the CPU, memory, \n" +" and disk usage exceed the thresholds, and send an alert message to the administrator" msgstr "" -"Cada hora, se verifica si los componentes están fuera de línea, así como si " -"el uso de CPU, memoria y disco duro supera el umbral, enviando un mensaje de " -"advertencia al administrador. \n" +"Cada hora, se verifica si los componentes están fuera de línea, así como si el uso de CPU, memoria y disco duro supera el umbral, enviando un mensaje de advertencia al administrador. \n" "Limpiar trabajos anormales. \n" -"Debido a que el centro de trabajos ejecuta comandos rápidos, el playbook " -"puede generar excepciones; el estado de las tareas no se actualiza como " -"completado. El sistema ejecutará cada hora la limpieza de trabajos anormales " -"que no se hayan completado en más de 3 horas, marcando las tareas como " -"fallidas. \n" +"Debido a que el centro de trabajos ejecuta comandos rápidos, el playbook puede generar excepciones; el estado de las tareas no se actualiza como completado. El sistema ejecutará cada hora la limpieza de trabajos anormales que no se hayan completado en más de 3 horas, marcando las tareas como fallidas. \n" "Limpiar el historial de ejecución del centro de trabajos. \n" -"Debido a que el centro de trabajos ejecuta comandos rápidos y playbooks, se " -"generan registros de ejecución. El sistema limpiará, según la configuración " -"en sistema-configuración-tareas-lista-limpieza regular-historial de " -"ejecución del centro de trabajos, los registros que superen el tiempo de " -"almacenamiento todos los días a las 2 a.m. \n" +"Debido a que el centro de trabajos ejecuta comandos rápidos y playbooks, se generan registros de ejecución. El sistema limpiará, según la configuración en sistema-configuración-tareas-lista-limpieza regular-historial de ejecución del centro de trabajos, los registros que superen el tiempo de almacenamiento todos los días a las 2 a.m. \n" "Lista de tareas. \n" "Nombre de usuario del usuario actual en JumpServer. \n" "ID del activo en JumpServer. \n" @@ -6079,12 +6072,9 @@ msgstr "Limpiar trabajos excepcionales" #: ops/tasks.py:161 msgid "" -"Due to exceptions caused by executing adhoc and playbooks in the Job " -"Center, \n" -" which result in the task status not being updated, the system will " -"clean up abnormal jobs \n" -" that have not been completed for more than 3 hours every hour and " -"mark these tasks as \n" +"Due to exceptions caused by executing adhoc and playbooks in the Job Center, \n" +" which result in the task status not being updated, the system will clean up abnormal jobs \n" +" that have not been completed for more than 3 hours every hour and mark these tasks as \n" " failed" msgstr "" "Debido a la ejecución de comandos rápidos en el centro de trabajos, el " @@ -6098,18 +6088,15 @@ msgstr "Limpiar historial de ejecución del centro de trabajos" #: ops/tasks.py:176 msgid "" -"Due to the execution of adhoc and playbooks in the Job Center, execution " -"records will \n" -" be generated. The system will clean up records that exceed the " -"retention period every day \n" -" at 2 a.m., based on the configuration of 'System Settings - Tasks - " -"Regular clean-up - \n" +"Due to the execution of adhoc and playbooks in the Job Center, execution records will \n" +" be generated. The system will clean up records that exceed the retention period every day \n" +" at 2 a.m., based on the configuration of 'System Settings - Tasks - Regular clean-up - \n" " Job execution retention days'" msgstr "" "Debido a la ejecución de comandos rápidos en el centro de trabajos, el " -"playbook generará registros de ejecución, el sistema limpiará cada día a las " -"2 de la mañana los registros que superen el tiempo de conservación según la " -"configuración del sistema - lista de tareas - limpieza programada - " +"playbook generará registros de ejecución, el sistema limpiará cada día a las" +" 2 de la mañana los registros que superen el tiempo de conservación según la" +" configuración del sistema - lista de tareas - limpieza programada - " "configuración del historial de ejecución del centro de trabajos" #: ops/templates/ops/celery_task_log.html:4 @@ -6162,8 +6149,8 @@ msgid "" "another organization before deleting" msgstr "" "La configuración de sincronización LDAP establece la organización como la " -"actual; por favor, cambie a otra organización antes de realizar la operación " -"de eliminación." +"actual; por favor, cambie a otra organización antes de realizar la operación" +" de eliminación." #: orgs/api.py:75 msgid "The organization have resource ({}) cannot be deleted" @@ -6182,7 +6169,8 @@ msgstr "Por favor, seleccione una organización antes de guardar." #: rbac/serializers/rolebinding.py:44 settings/serializers/auth/base.py:53 #: terminal/templates/terminal/_msg_command_warning.html:21 #: terminal/templates/terminal/_msg_session_sharing.html:14 -#: tickets/models/ticket/general.py:303 tickets/serializers/ticket/ticket.py:61 +#: tickets/models/ticket/general.py:303 +#: tickets/serializers/ticket/ticket.py:61 msgid "Organization" msgstr "Organización" @@ -6216,7 +6204,7 @@ msgid "Can not delete virtual org" msgstr "No se puede eliminar una organización virtual" #: orgs/serializers.py:10 perms/serializers/permission.py:59 -#: rbac/serializers/role.py:27 users/serializers/group.py:54 +#: rbac/serializers/role.py:27 users/serializers/group.py:53 msgid "Users amount" msgstr "Número de usuarios" @@ -6346,8 +6334,8 @@ msgid "" "Accounts, format [\"@virtual\", \"root\", \"%template_id\"], virtual " "choices: @ALL, @SPEC, @USER, @ANON, @INPUT" msgstr "" -"Cuenta, formato [\"@cuentaVirtual\", \"root\", \"%idDePlantilla\"], opciones " -"virtuales: @TODOS, @ESPECIFICO, @USUARIO, @ANON, @ENTRADA" +"Cuenta, formato [\"@cuentaVirtual\", \"root\", \"%idDePlantilla\"], opciones" +" virtuales: @TODOS, @ESPECIFICO, @USUARIO, @ANON, @ENTRADA" #: perms/serializers/permission.py:49 msgid "Protocols, format [\"ssh\", \"rdp\", \"vnc\"] or [\"all\"]" @@ -6363,18 +6351,14 @@ msgstr "La regla de autorización de activos de verificación ha caducado" #: perms/tasks.py:30 msgid "" -"The cache of organizational collections, which have completed user " -"authorization tree \n" -" construction, will expire. Therefore, expired collections need to be " -"cleared from the \n" -" cache, and this task will be executed periodically based on the time " -"interval specified \n" -" by PERM_EXPIRED_CHECK_PERIODIC in the system configuration file " -"config.txt" +"The cache of organizational collections, which have completed user authorization tree \n" +" construction, will expire. Therefore, expired collections need to be cleared from the \n" +" cache, and this task will be executed periodically based on the time interval specified \n" +" by PERM_EXPIRED_CHECK_PERIODIC in the system configuration file config.txt" msgstr "" -"El conjunto de organizaciones que ha completado la construcción del árbol de " -"autorización de usuarios está almacenado en caché y expirará, por lo que es " -"necesario limpiar los conjuntos caducados de la caché. Esta tarea debe " +"El conjunto de organizaciones que ha completado la construcción del árbol de" +" autorización de usuarios está almacenado en caché y expirará, por lo que es" +" necesario limpiar los conjuntos caducados de la caché. Esta tarea debe " "ejecutarse periódicamente según el intervalo de tiempo definido en el " "archivo de configuración config.txt bajo PERM_EXPIRED_CHECK_PERIODIC" @@ -6384,17 +6368,14 @@ msgstr "Enviar notificaciones de expiración de permisos de activos" #: perms/tasks.py:51 msgid "" -"Check every day at 10 a.m. and send a notification message to users " -"associated with \n" -" assets whose authorization is about to expire, as well as to the " -"organization's \n" -" administrators, 3 days in advance, to remind them that the asset " -"authorization will \n" +"Check every day at 10 a.m. and send a notification message to users associated with \n" +" assets whose authorization is about to expire, as well as to the organization's \n" +" administrators, 3 days in advance, to remind them that the asset authorization will \n" " expire in a few days" msgstr "" "Cada día a las 10 de la mañana, se verificará y se enviará un mensaje a los " -"usuarios asociados y a los administradores de la organización con respecto a " -"la autorización de activos que está a punto de expirar, avisando con tres " +"usuarios asociados y a los administradores de la organización con respecto a" +" la autorización de activos que está a punto de expirar, avisando con tres " "días de anticipación que el activo expirará en pocos días" #: perms/templates/perms/_msg_item_permissions_expire.html:7 @@ -6576,7 +6557,7 @@ msgid "Storage" msgstr "Almacenamiento" #: rbac/tree.py:61 terminal/models/applet/applet.py:53 -#: terminal/models/applet/applet.py:328 terminal/models/applet/host.py:30 +#: terminal/models/applet/applet.py:369 terminal/models/applet/host.py:30 #: terminal/serializers/applet.py:15 msgid "Applet" msgstr "Aplicación remota" @@ -6808,7 +6789,8 @@ msgstr "Enlace para recuperar la contraseña" #: settings/serializers/auth/base.py:38 msgid "The URL for Forgotten Password on the user login page" msgstr "" -"URL para recuperar la contraseña en la página de inicio de sesión de usuarios" +"URL para recuperar la contraseña en la página de inicio de sesión de " +"usuarios" #: settings/serializers/auth/base.py:41 msgid "Login redirection" @@ -6829,8 +6811,7 @@ msgid "" "When you create a user, you associate the user to the organization of your " "choice. Users always belong to the Default organization." msgstr "" -"Al crear un usuario, lo asociarás con la organización que elijas. Los " -"usuarios siempre pertenecen a la organización Default. \n" +"Al crear un usuario, lo asociarás con la organización que elijas. Los usuarios siempre pertenecen a la organización Default. \n" "CAS \n" "Dirección del servidor \n" "Dirección de callback \n" @@ -6839,26 +6820,20 @@ msgstr "" "Atributo de nombre de usuario \n" "Habilitar mapeo de atributos \n" "Mapear atributos \n" -"Mapeo de atributos de usuario, donde `key` es el nombre del atributo de " -"usuario del servicio CAS, y `value` es el nombre del atributo de usuario de " -"JumpServer. \n" +"Mapeo de atributos de usuario, donde `key` es el nombre del atributo de usuario del servicio CAS, y `value` es el nombre del atributo de usuario de JumpServer. \n" "Crear usuario (si no existe) \n" -"Después de una autenticación exitosa del usuario, si el usuario no existe, " -"se creará automáticamente. \n" +"Después de una autenticación exitosa del usuario, si el usuario no existe, se creará automáticamente. \n" "Habilitar autenticación de DingTalk \n" -"Mapeo de atributos de usuario, donde `key` es el nombre del atributo de " -"usuario de JumpServer, y `value` es el nombre del atributo de usuario del " -"servicio DingTalk. \n" -"Mapeo de atributos de usuario, donde `key` es el nombre del atributo de " -"usuario de JumpServer, y `value` es el nombre del atributo de usuario del " -"servicio FeiShu." +"Mapeo de atributos de usuario, donde `key` es el nombre del atributo de usuario de JumpServer, y `value` es el nombre del atributo de usuario del servicio DingTalk. \n" +"Mapeo de atributos de usuario, donde `key` es el nombre del atributo de usuario de JumpServer, y `value` es el nombre del atributo de usuario del servicio FeiShu." #: settings/serializers/auth/cas.py:12 settings/serializers/auth/cas.py:14 msgid "CAS" msgstr "CAS" #: settings/serializers/auth/cas.py:15 settings/serializers/auth/ldap.py:45 -#: settings/serializers/auth/ldap_ha.py:28 settings/serializers/auth/oidc.py:61 +#: settings/serializers/auth/ldap_ha.py:27 +#: settings/serializers/auth/oidc.py:61 msgid "Server" msgstr "Dirección del servidor" @@ -6883,9 +6858,11 @@ msgstr "Atributo de nombre de usuario" msgid "Enable attributes map" msgstr "Habilitar mapeo de atributos" -#: settings/serializers/auth/cas.py:34 settings/serializers/auth/dingtalk.py:18 +#: settings/serializers/auth/cas.py:34 +#: settings/serializers/auth/dingtalk.py:18 #: settings/serializers/auth/feishu.py:18 settings/serializers/auth/lark.py:17 -#: settings/serializers/auth/ldap.py:67 settings/serializers/auth/ldap_ha.py:50 +#: settings/serializers/auth/ldap.py:67 +#: settings/serializers/auth/ldap_ha.py:49 #: settings/serializers/auth/oauth2.py:60 settings/serializers/auth/oidc.py:39 #: settings/serializers/auth/saml2.py:35 settings/serializers/auth/slack.py:18 #: settings/serializers/auth/wecom.py:18 @@ -6910,8 +6887,8 @@ msgid "" "After successful user authentication, if the user does not exist, " "automatically create the user" msgstr "" -"Después de la autenticación exitosa del usuario, si el usuario no existe, se " -"crea automáticamente" +"Después de la autenticación exitosa del usuario, si el usuario no existe, se" +" crea automáticamente" #: settings/serializers/auth/dingtalk.py:16 msgid "Dingtalk" @@ -6944,32 +6921,24 @@ msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the Lark service user attribute name" msgstr "" -"Mapeo de atributos de usuario, donde `key` es el nombre del atributo de " -"usuario de JumpServer y `value` es el nombre del atributo de usuario del " -"servicio Lark. \n" +"Mapeo de atributos de usuario, donde `key` es el nombre del atributo de usuario de JumpServer y `value` es el nombre del atributo de usuario del servicio Lark. \n" "LDAP \n" "Dominio del servicio LDAP \n" "DN de vinculación \n" "Administrador del directorio vinculado \n" "Contraseña de vinculación \n" "OU de usuario \n" -"Base de búsqueda de usuario; si hay múltiples OU, se pueden separar con el " -"símbolo `|` \n" +"Base de búsqueda de usuario; si hay múltiples OU, se pueden separar con el símbolo `|` \n" "Filtro de usuario \n" "Las opciones posibles son (cn o uid o sAMAccountName=%(user)s) \n" -"Mapeo de atributos de usuario, donde `key` es el nombre del atributo de " -"usuario de JumpServer y `value` es el nombre del atributo de usuario del " -"servicio LDAP. \n" +"Mapeo de atributos de usuario, donde `key` es el nombre del atributo de usuario de JumpServer y `value` es el nombre del atributo de usuario del servicio LDAP. \n" "Tiempo de espera para la conexión (segundos) \n" "Tiempo de espera para el caché de User DN (segundos) \n" -"Se puede almacenar en caché el User DN obtenido durante la autenticación del " -"inicio de sesión del usuario, lo que puede mejorar considerablemente la " -"velocidad de autenticación del usuario. \n" -"Si la estructura del OU de usuario ha cambiado, haga clic en enviar para " -"limpiar el caché de User DN. \n" +"Se puede almacenar en caché el User DN obtenido durante la autenticación del inicio de sesión del usuario, lo que puede mejorar considerablemente la velocidad de autenticación del usuario. \n" +"Si la estructura del OU de usuario ha cambiado, haga clic en enviar para limpiar el caché de User DN. \n" "Cantidad de paginación de búsqueda (registros)" -#: settings/serializers/auth/ldap.py:42 settings/serializers/auth/ldap.py:104 +#: settings/serializers/auth/ldap.py:42 settings/serializers/auth/ldap.py:108 msgid "LDAP" msgstr "LDAP" @@ -6977,23 +6946,28 @@ msgstr "LDAP" msgid "LDAP server URI" msgstr "Nombre de dominio del servicio LDAP" -#: settings/serializers/auth/ldap.py:49 settings/serializers/auth/ldap_ha.py:32 +#: settings/serializers/auth/ldap.py:49 +#: settings/serializers/auth/ldap_ha.py:31 msgid "Bind DN" msgstr "DN de enlace" -#: settings/serializers/auth/ldap.py:50 settings/serializers/auth/ldap_ha.py:33 +#: settings/serializers/auth/ldap.py:50 +#: settings/serializers/auth/ldap_ha.py:32 msgid "Binding Distinguished Name" msgstr "Administrador del directorio de enlace" -#: settings/serializers/auth/ldap.py:54 settings/serializers/auth/ldap_ha.py:37 +#: settings/serializers/auth/ldap.py:54 +#: settings/serializers/auth/ldap_ha.py:36 msgid "Binding password" msgstr "Contraseña de enlace" -#: settings/serializers/auth/ldap.py:57 settings/serializers/auth/ldap_ha.py:40 +#: settings/serializers/auth/ldap.py:57 +#: settings/serializers/auth/ldap_ha.py:39 msgid "Search OU" msgstr "OU de usuario" -#: settings/serializers/auth/ldap.py:59 settings/serializers/auth/ldap_ha.py:42 +#: settings/serializers/auth/ldap.py:59 +#: settings/serializers/auth/ldap_ha.py:41 msgid "" "User Search Base, if there are multiple OUs, you can separate them with the " "`|` symbol" @@ -7001,67 +6975,87 @@ msgstr "" "Biblioteca de búsqueda de usuarios, si hay múltiples OUs, se pueden separar " "con el símbolo `|`" -#: settings/serializers/auth/ldap.py:63 settings/serializers/auth/ldap_ha.py:46 +#: settings/serializers/auth/ldap.py:63 +#: settings/serializers/auth/ldap_ha.py:45 msgid "Search filter" msgstr "Filtro de usuario" -#: settings/serializers/auth/ldap.py:64 settings/serializers/auth/ldap_ha.py:47 +#: settings/serializers/auth/ldap.py:64 +#: settings/serializers/auth/ldap_ha.py:46 #, python-format msgid "Selection could include (cn|uid|sAMAccountName=%(user)s)" msgstr "Las posibles opciones son (cn o uid o sAMAccountName=%(user)s)" -#: settings/serializers/auth/ldap.py:69 settings/serializers/auth/ldap_ha.py:52 +#: settings/serializers/auth/ldap.py:69 +#: settings/serializers/auth/ldap_ha.py:51 msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the LDAP service user attribute name" msgstr "" "Mapeo de atributos de usuario, donde `key` es el nombre del atributo del " -"usuario en JumpServer, y `value` es el nombre del atributo del usuario en el " -"servicio LDAP" +"usuario en JumpServer, y `value` es el nombre del atributo del usuario en el" +" servicio LDAP" -#: settings/serializers/auth/ldap.py:85 settings/serializers/auth/ldap_ha.py:68 +#: settings/serializers/auth/ldap.py:85 +#: settings/serializers/auth/ldap_ha.py:67 msgid "Connect timeout (s)" msgstr "Tiempo de espera de conexión (segundos)" -#: settings/serializers/auth/ldap.py:90 settings/serializers/auth/ldap_ha.py:73 +#: settings/serializers/auth/ldap.py:88 +#: settings/serializers/auth/ldap_ha.py:70 +msgid "Strict sync" +msgstr "Modo estricto" + +#: settings/serializers/auth/ldap.py:89 +#: settings/serializers/auth/ldap_ha.py:71 +msgid "" +"In strict mode, users not found in LDAP will be disabled during full or " +"automatic sync" +msgstr "" +"Después de activar el modo estricto, la sincronización completa o automática" +" desactivará a los usuarios no encontrados en el LDAP del sistema." + +#: settings/serializers/auth/ldap.py:94 +#: settings/serializers/auth/ldap_ha.py:76 msgid "User DN cache timeout (s)" msgstr "Tiempo de espera para la caché de User DN (segundos)" -#: settings/serializers/auth/ldap.py:92 +#: settings/serializers/auth/ldap.py:96 msgid "" "Caching the User DN obtained during user login authentication can " "effectively improve the speed of user authentication., 0 means no " "cache
If the user OU structure has been adjusted, click Submit to clear " "the user DN cache" msgstr "" -"Se puede almacenar en caché el User DN obtenido durante la autenticación del " -"usuario, lo que puede mejorar significativamente la velocidad de " +"Se puede almacenar en caché el User DN obtenido durante la autenticación del" +" usuario, lo que puede mejorar significativamente la velocidad de " "autenticación.
Si hay algún ajuste en la estructura del OU del usuario, " "simplemente haga clic en enviar para limpiar la caché de User DN" -#: settings/serializers/auth/ldap.py:98 settings/serializers/auth/ldap_ha.py:81 +#: settings/serializers/auth/ldap.py:102 +#: settings/serializers/auth/ldap_ha.py:84 msgid "Search paged size (piece)" msgstr "Cantidad de resultados por página en la búsqueda (registros)" -#: settings/serializers/auth/ldap_ha.py:25 -#: settings/serializers/auth/ldap_ha.py:87 +#: settings/serializers/auth/ldap_ha.py:24 +#: settings/serializers/auth/ldap_ha.py:90 msgid "LDAP HA" msgstr "Autenticación LDAP" -#: settings/serializers/auth/ldap_ha.py:29 +#: settings/serializers/auth/ldap_ha.py:28 msgid "LDAP HA server URI" msgstr "Nombre de dominio del servicio LDAP HA" -#: settings/serializers/auth/ldap_ha.py:75 +#: settings/serializers/auth/ldap_ha.py:78 msgid "" "Caching the User DN obtained during user login authentication can " -"effectivelyimprove the speed of user authentication., 0 means no cache
If " -"the user OU structure has been adjusted, click Submit to clear the user DN " +"effectivelyimprove the speed of user authentication., 0 means no cache
If" +" the user OU structure has been adjusted, click Submit to clear the user DN " "cache" msgstr "" "Se puede almacenar en caché el User DN consultado durante la autenticación " -"del inicio de sesión del usuario, lo que puede mejorar significativamente la " -"velocidad de autenticación del usuario.
Si la estructura de la OU del " +"del inicio de sesión del usuario, lo que puede mejorar significativamente la" +" velocidad de autenticación del usuario.
Si la estructura de la OU del " "usuario se modifica, simplemente haga clic en enviar para limpiar la caché " "del User DN." @@ -7107,9 +7101,11 @@ msgid "End session endpoint" msgstr "Dirección del punto final de cierre de sesión" #: settings/serializers/auth/oauth2.py:57 -msgid "When the user signs out, they also be logged out from the OAuth2 server" +msgid "" +"When the user signs out, they also be logged out from the OAuth2 server" msgstr "" -"Cuando el usuario cierra sesión, también se desconectará del servidor OAuth2." +"Cuando el usuario cierra sesión, también se desconectará del servidor " +"OAuth2." #: settings/serializers/auth/oauth2.py:62 msgid "" @@ -7120,8 +7116,8 @@ msgstr "" "usuario de JumpServer y `value` es el nombre del atributo de usuario del " "servicio OAuth2." -#: settings/serializers/auth/oauth2.py:67 settings/serializers/auth/oidc.py:113 -#: settings/serializers/auth/saml2.py:45 +#: settings/serializers/auth/oauth2.py:67 +#: settings/serializers/auth/oidc.py:113 settings/serializers/auth/saml2.py:45 msgid "Always update user" msgstr "Actualizar siempre la información del usuario." @@ -7250,7 +7246,8 @@ msgid "OTP in RADIUS" msgstr "Utilizar Radius OTP" #: settings/serializers/auth/radius.py:24 -msgid "* Using OTP in RADIUS means users can employ RADIUS as a method for MFA" +msgid "" +"* Using OTP in RADIUS means users can employ RADIUS as a method for MFA" msgstr "" "* Usar OTP en RADIUS significa que los usuarios pueden aprovechar RADIUS " "como método de MFA" @@ -7285,8 +7282,8 @@ msgid "" "name and the `value` is the JumpServer user attribute name" msgstr "" "Mapeo de atributos de usuario, donde `key` es el nombre del atributo de " -"usuario del servicio SAML2 y `value` es el nombre del atributo de usuario de " -"JumpServer" +"usuario del servicio SAML2 y `value` es el nombre del atributo de usuario de" +" JumpServer" #: settings/serializers/auth/saml2.py:43 msgid "When the user signs out, they also be logged out from the SAML2 server" @@ -7364,9 +7361,9 @@ msgstr "Tipo de negocio (Application id)" #: settings/serializers/auth/sms.py:85 #, python-brace-format msgid "" -"Template need contain {code} and Signature + template length does not exceed " -"67 words. For example, your verification code is {code}, which is valid for " -"5 minutes. Please do not disclose it to others." +"Template need contain {code} and Signature + template length does not exceed" +" 67 words. For example, your verification code is {code}, which is valid for" +" 5 minutes. Please do not disclose it to others." msgstr "" "La plantilla debe incluir {code} y la longitud de la plantilla más la firma " "no puede exceder 67 caracteres. Por ejemplo, su código de verificación es " @@ -7420,23 +7417,16 @@ msgstr "URL del sitio actual" #: settings/serializers/basic.py:13 msgid "" -"Site URL is the externally accessible address of the current product service " -"and is usually used in links in system emails" +"Site URL is the externally accessible address of the current product service" +" and is usually used in links in system emails" msgstr "" -"URL del sitio es la dirección externa accesible del servicio actual del " -"producto, que frecuentemente se utiliza en los enlaces de los correos del " -"sistema. \n" -"URL de la guía del usuario. Al iniciar sesión por primera vez, después de " -"modificar el perfil, se redirige a esta dirección, que puede ser un wiki u " -"otro documento explicativo. \n" -"Nombre de visualización de la organización global, por defecto es " -"\"Organización Global\". \n" +"URL del sitio es la dirección externa accesible del servicio actual del producto, que frecuentemente se utiliza en los enlaces de los correos del sistema. \n" +"URL de la guía del usuario. Al iniciar sesión por primera vez, después de modificar el perfil, se redirige a esta dirección, que puede ser un wiki u otro documento explicativo. \n" +"Nombre de visualización de la organización global, por defecto es \"Organización Global\". \n" "Enlace de documentos. \n" -"La URL del documento se refiere a la dirección en la barra de navegación " -"superior, Ayuda - Documentos. \n" +"La URL del documento se refiere a la dirección en la barra de navegación superior, Ayuda - Documentos. \n" "Enlace de soporte. \n" -"La URL de soporte se refiere a la dirección en la barra de navegación " -"superior, Ayuda - Soporte. \n" +"La URL de soporte se refiere a la dirección en la barra de navegación superior, Ayuda - Soporte. \n" "El nombre de la organización ya existe. \n" "Limpieza programada. \n" "Registro de inicio de sesión (días). \n" @@ -7673,8 +7663,8 @@ msgstr "Ciclo de ejecución" msgid "" "Allow users to execute batch commands in the Workbench - Job Center - Adhoc" msgstr "" -"Permite a los usuarios ejecutar comandos por lotes en el escritorio - Centro " -"de trabajo - Adhoc" +"Permite a los usuarios ejecutar comandos por lotes en el escritorio - Centro" +" de trabajo - Adhoc" #: settings/serializers/feature.py:191 msgid "Command blacklist" @@ -7715,8 +7705,8 @@ msgstr "Intercambio" #: settings/serializers/msg.py:34 msgid "The user to be used for email server authentication" msgstr "" -"Nombre de usuario para iniciar sesión en el servidor de correo. Generalmente " -"es tu dirección de correo electrónico" +"Nombre de usuario para iniciar sesión en el servidor de correo. Generalmente" +" es tu dirección de correo electrónico" #: settings/serializers/msg.py:38 msgid "" @@ -7773,8 +7763,8 @@ msgstr "" #: settings/serializers/msg.py:69 msgid "" -"Tips: When creating a user, send the subject of the email (eg:Create account " -"successfully)" +"Tips: When creating a user, send the subject of the email (eg:Create account" +" successfully)" msgstr "Saludo del correo" #: settings/serializers/msg.py:73 @@ -7822,8 +7812,8 @@ msgstr "Tiempo de expiración de la contraseña del usuario (días)" #: settings/serializers/security.py:17 msgid "User password expiration (day)" msgstr "" -"Si el usuario no actualiza la contraseña durante este periodo, la contraseña " -"del usuario expirará y perderá validez. Un correo recordatorio sobre la " +"Si el usuario no actualiza la contraseña durante este periodo, la contraseña" +" del usuario expirará y perderá validez. Un correo recordatorio sobre la " "expiración de la contraseña se enviará automáticamente al usuario por el " "sistema (diariamente) dentro de los 5 días previos a la expiración de la " "contraseña." @@ -7844,27 +7834,20 @@ msgid "" "Tip: When the user resets the password, it cannot be the previous n " "historical passwords of the user" msgstr "" -"Sugerencia: Al restablecer la contraseña, no se puede utilizar una " -"contraseña que el usuario haya usado en ocasiones anteriores. \n" +"Sugerencia: Al restablecer la contraseña, no se puede utilizar una contraseña que el usuario haya usado en ocasiones anteriores. \n" "Longitud mínima de la contraseña. \n" "Longitud mínima de la contraseña del administrador. \n" "Debe incluir números. \n" "Debe incluir caracteres especiales. \n" -"Cuando el número de intentos fallidos de inicio de sesión del usuario " -"alcance el límite, se prohibirá el inicio de sesión durante este " -"intervalo. \n" +"Cuando el número de intentos fallidos de inicio de sesión del usuario alcance el límite, se prohibirá el inicio de sesión durante este intervalo. \n" "Limitar el número de intentos fallidos de inicio de sesión del usuario. \n" "Prohibir el intervalo de inicio de sesión del usuario (minutos). \n" "Lista blanca de IP para inicio de sesión. \n" "Lista negra de IP para inicio de sesión. \n" "Solo un dispositivo puede iniciar sesión. \n" -"Cuando el usuario inicia sesión en un nuevo dispositivo, otros dispositivos " -"que ya están conectados se desconectarán automáticamente. \n" +"Cuando el usuario inicia sesión en un nuevo dispositivo, otros dispositivos que ya están conectados se desconectarán automáticamente. \n" "Solo usuarios existentes pueden iniciar sesión. \n" -"Si está habilitado, los usuarios que no existen no podrán iniciar sesión; si " -"está deshabilitado, se permitirá el inicio de sesión de otros métodos de " -"autenticación distintos del local y se creará automáticamente un usuario (si " -"el usuario no existe). \n" +"Si está habilitado, los usuarios que no existen no podrán iniciar sesión; si está deshabilitado, se permitirá el inicio de sesión de otros métodos de autenticación distintos del local y se creará automáticamente un usuario (si el usuario no existe). \n" "Inicio de sesión solo desde el origen del usuario." #: settings/serializers/security.py:34 @@ -7888,8 +7871,8 @@ msgid "" "If the user has failed to log in for a limited number of times, no login is " "allowed during this time interval." msgstr "" -"Cuando el número de intentos fallidos de inicio de sesión alcance el límite, " -"se prohibirá el inicio de sesión durante este intervalo" +"Cuando el número de intentos fallidos de inicio de sesión alcance el límite," +" se prohibirá el inicio de sesión durante este intervalo" #: settings/serializers/security.py:63 settings/serializers/security.py:73 msgid "Login failures count" @@ -7931,9 +7914,9 @@ msgid "" "exist)" msgstr "" "Si está habilitado, los usuarios inexistentes no podrán iniciar sesión; si " -"está deshabilitado, los usuarios de otros métodos de autenticación, salvo la " -"autenticación local, podrán iniciar sesión y se crearán automáticamente (si " -"el usuario no existe)" +"está deshabilitado, los usuarios de otros métodos de autenticación, salvo la" +" autenticación local, podrán iniciar sesión y se crearán automáticamente (si" +" el usuario no existe)" #: settings/serializers/security.py:103 msgid "Only from source login" @@ -7941,8 +7924,8 @@ msgstr "Solo se permite el inicio de sesión desde fuentes de usuarios" #: settings/serializers/security.py:105 msgid "" -"If it is enabled, the user will only authenticate to the source when logging " -"in; if it is disabled, the user will authenticate all the enabled " +"If it is enabled, the user will only authenticate to the source when logging" +" in; if it is disabled, the user will authenticate all the enabled " "authentication methods in a certain order when logging in, and as long as " "one of the authentication methods is successful, they can log in directly" msgstr "" @@ -7975,21 +7958,31 @@ msgstr "Terceros habilitan MFA" #: settings/serializers/security.py:125 msgid "The third-party login modes include OIDC, CAS, and SAML2" -msgstr "Los métodos de inicio de sesión de terceros incluyen: OIDC, CAS, SAML2" +msgstr "" +"Los métodos de inicio de sesión de terceros incluyen: OIDC, CAS, SAML2" -#: settings/serializers/security.py:128 +#: settings/serializers/security.py:129 +msgid "MFA via Email" +msgstr "Verificación de correo electrónico MFA" + +#: settings/serializers/security.py:130 +msgid "Email as a method for multi-factor authentication" +msgstr "" +"Utilizar el correo electrónico como un método de autenticación multifactor" + +#: settings/serializers/security.py:133 msgid "OTP issuer name" msgstr "Nombre tras escanear OTP" -#: settings/serializers/security.py:132 +#: settings/serializers/security.py:137 msgid "OTP valid window" msgstr "Conteo de validez tras un retraso de OTP" -#: settings/serializers/security.py:136 +#: settings/serializers/security.py:141 msgid "MFA verify TTL" msgstr "Validez de la verificación MFA" -#: settings/serializers/security.py:138 +#: settings/serializers/security.py:143 msgid "" "Unit: second, The verification MFA takes effect only when you view the " "account password" @@ -7997,32 +7990,32 @@ msgstr "" "Unidad: segundos, actualmente solo aplicable al revisar la verificación de " "contraseña de la cuenta en MFA" -#: settings/serializers/security.py:143 +#: settings/serializers/security.py:148 msgid "MFA in login page" msgstr "MFA para ingreso en la página de inicio de sesión" -#: settings/serializers/security.py:144 +#: settings/serializers/security.py:149 msgid "Eu security regulations(GDPR) require MFA to be on the login page" msgstr "" "La normativa de seguridad de datos de la Unión Europea (GDPR) exige que MFA " "esté en la página de inicio de sesión para garantizar la seguridad del " "acceso al sistema" -#: settings/serializers/security.py:148 +#: settings/serializers/security.py:153 msgid "Verify code TTL (second)" msgstr "Tiempo de validez del código de verificación (min)" -#: settings/serializers/security.py:149 +#: settings/serializers/security.py:154 msgid "Reset password and send SMS code expiration time" msgstr "" "Tiempo de caducidad del código de verificación para restablecer la " "contraseña y el código de verificación para el envío de SMS." -#: settings/serializers/security.py:153 +#: settings/serializers/security.py:158 msgid "Login dynamic code" msgstr "Activar código adicional para inicio de sesión" -#: settings/serializers/security.py:154 +#: settings/serializers/security.py:159 msgid "" "The password and additional code are sent to a third party authentication " "system for verification" @@ -8032,34 +8025,35 @@ msgstr "" "sistemas de autenticación de terceros requieren contraseña + 6 dígitos para " "completar la autenticación" -#: settings/serializers/security.py:158 +#: settings/serializers/security.py:163 msgid "Login captcha" msgstr "Activar código de verificación para inicio de sesión" -#: settings/serializers/security.py:159 +#: settings/serializers/security.py:164 msgid "Enable captcha to prevent robot authentication" msgstr "" -"Habilitar el código de verificación para prevenir el inicio de sesión de bots" +"Habilitar el código de verificación para prevenir el inicio de sesión de " +"bots" -#: settings/serializers/security.py:162 +#: settings/serializers/security.py:167 msgid "Suspicious Login Verification" msgstr "Notificación de inicio de sesión desde una ubicación diferente" -#: settings/serializers/security.py:164 +#: settings/serializers/security.py:169 msgid "" -"The system determines whether the login IP address belongs to a common login " -"city. If the account is logged in from a common login city, the system sends " -"a remote login reminder" +"The system determines whether the login IP address belongs to a common login" +" city. If the account is logged in from a common login city, the system " +"sends a remote login reminder" msgstr "" "Se evalúa si la dirección IP de inicio de sesión pertenece a una ciudad de " "inicio habitual; si la cuenta inicia sesión desde una ciudad poco familiar, " "se enviará una alerta de inicio de sesión desde una ubicación diferente" -#: settings/serializers/security.py:170 +#: settings/serializers/security.py:175 msgid "Auto Disable Threshold (day)" msgstr "Desactivación automática de usuarios inactivos (días)" -#: settings/serializers/security.py:171 +#: settings/serializers/security.py:176 msgid "" "Detect infrequent users daily and disable them if they exceed the " "predetermined time limit" @@ -8067,83 +8061,77 @@ msgstr "" "Se realiza una verificación diaria, los usuarios que superen el tiempo " "preestablecido serán desactivados automáticamente" -#: settings/serializers/security.py:191 +#: settings/serializers/security.py:196 msgid "Watermark" msgstr "Activar marca de agua" -#: settings/serializers/security.py:192 -msgid "Enabled, the web session and replay contains watermark information" -msgstr "" -"Una vez habilitado, la sesión web y las grabaciones incluirán información de " -"marca de agua" - -#: settings/serializers/security.py:196 +#: settings/serializers/security.py:200 msgid "Max idle time (minute)" msgstr "Tiempo máximo de inactividad de conexión (min)" -#: settings/serializers/security.py:197 +#: settings/serializers/security.py:201 msgid "If idle time more than it, disconnect connection." msgstr "" -"Sugerencia: si no se realizan operaciones durante más de esta configuración, " -"la conexión se desconectará" +"Sugerencia: si no se realizan operaciones durante más de esta configuración," +" la conexión se desconectará" -#: settings/serializers/security.py:200 +#: settings/serializers/security.py:204 msgid "Session expire at browser closed" msgstr "La sesión expira al cerrar el navegador" -#: settings/serializers/security.py:201 +#: settings/serializers/security.py:205 msgid "Whether to expire the session when the user closes their browser." msgstr "" "Determina si la sesión debe expirar cuando el usuario cierra el navegador." -#: settings/serializers/security.py:206 +#: settings/serializers/security.py:210 msgid "Allow users to view asset session information" msgstr "" "Permitir a los usuarios ver la información de sesión en línea de activos" -#: settings/serializers/security.py:208 +#: settings/serializers/security.py:212 msgid "" "When a user connects to an asset, the account selection popup displays the " "number of active sessions for the current asset (RDP protocol only)." msgstr "" "Cuando el usuario conecta un activo, se muestra la cantidad de sesiones en " -"línea del activo actual en la ventana de selección de cuenta (solo protocolo " -"RDP)" +"línea del activo actual en la ventana de selección de cuenta (solo protocolo" +" RDP)" -#: settings/serializers/security.py:214 +#: settings/serializers/security.py:218 msgid "Max online time (hour)" msgstr "Tiempo máximo de conexión a la sesión (horas)" -#: settings/serializers/security.py:215 +#: settings/serializers/security.py:219 msgid "If session connection time more than it, disconnect connection." msgstr "" "Nota: Si la conexión a la sesión supera esta configuración, la conexión se " "desconectará" -#: settings/serializers/security.py:218 +#: settings/serializers/security.py:222 msgid "Remember manual auth" msgstr "Guardar la contraseña ingresada manualmente" -#: settings/serializers/security.py:221 +#: settings/serializers/security.py:225 #: terminal/templates/terminal/_msg_session_sharing.html:10 msgid "Session share" msgstr "Compartir sesión" -#: settings/serializers/security.py:222 +#: settings/serializers/security.py:226 msgid "Enabled, Allows user active session to be shared with other users" msgstr "" "Al activarse, permite a los usuarios compartir la sesión de activos " "conectados con otros, para trabajar en colaboración" -#: settings/serializers/security.py:228 +#: settings/serializers/security.py:232 msgid "Insecure command alert" msgstr "Alerta de comandos peligrosos" -#: settings/serializers/security.py:231 +#: settings/serializers/security.py:235 msgid "Email recipient" msgstr "Destinatario del correo" -#: settings/serializers/security.py:232 +#: settings/serializers/security.py:236 msgid "Multiple user using , split" msgstr "Múltiples usuarios, separados por ," @@ -8156,31 +8144,37 @@ msgstr "[%s] %s" msgid "Auto" msgstr "Automático" -#: settings/serializers/terminal.py:22 +#: settings/serializers/terminal.py:23 +msgid "Auto(Enabled for the first 5 minutes after startup, then disabled.)" +msgstr "" +"Automático (habilitado durante los primeros 5 minutos después del inicio y " +"luego deshabilitado)." + +#: settings/serializers/terminal.py:26 msgid "Registration" msgstr "Registro de componentes" -#: settings/serializers/terminal.py:24 +#: settings/serializers/terminal.py:28 msgid "" -"Allow component register, after all component setup, you should disable this " -"for security" +"Allow component register, after all component setup, you should disable this" +" for security" msgstr "" "¿Se permite el registro de componentes? Después de que todos los terminales " "se inicien, por razones de seguridad, debería estar cerrado" -#: settings/serializers/terminal.py:30 +#: settings/serializers/terminal.py:34 msgid "" "* Allow users to log in to the KoKo component via password authentication" msgstr "" "* Permitir que los usuarios inicien sesión en el componente KoKo mediante " "autenticación con contraseña" -#: settings/serializers/terminal.py:36 +#: settings/serializers/terminal.py:40 msgid "" "* Allow users to log in to the KoKo component via Public key " "authentication
If third-party authentication services, such as AD/LDAP, " -"are enabled, you should disable this option to prevent users from logging in " -"after being deleted from the AD/LDAP server" +"are enabled, you should disable this option to prevent users from logging in" +" after being deleted from the AD/LDAP server" msgstr "" "* Permitir que los usuarios accedan al componente KoKo a través de " "autenticación con clave pública
Si el servicio de autenticación de " @@ -8188,43 +8182,44 @@ msgstr "" "evitar que los usuarios vuelvan a iniciar sesión tras ser eliminados del " "servidor AD/LDAP." -#: settings/serializers/terminal.py:43 +#: settings/serializers/terminal.py:47 msgid "Asset sorting" msgstr "Lista de activos ordenada" -#: settings/serializers/terminal.py:46 +#: settings/serializers/terminal.py:50 msgid "Asset page size" msgstr "Cantidad de activos por página" -#: settings/serializers/terminal.py:51 +#: settings/serializers/terminal.py:55 msgid "" -"* You can individually configure the service address and port in the service " -"endpoint
If enabled, the Luna page will display the DB client launch " +"* You can individually configure the service address and port in the service" +" endpoint
If enabled, the Luna page will display the DB client launch " "method when connecting to assets" msgstr "" -"* Puede configurar la dirección y el puerto del servicio de forma individual " -"en el punto de servicio
Si está habilitado, la página de Luna mostrará " +"* Puede configurar la dirección y el puerto del servicio de forma individual" +" en el punto de servicio
Si está habilitado, la página de Luna mostrará " "el método para iniciar el cliente de la base de datos al conectar activos" -#: settings/serializers/terminal.py:59 +#: settings/serializers/terminal.py:63 msgid "" -"* You can individually configure the service address and port in the service " -"endpoint
If enabled, the Luna page will display the download rdp file " +"* You can individually configure the service address and port in the service" +" endpoint
If enabled, the Luna page will display the download rdp file " "button and RDP Client launch method when connecting to assets" msgstr "" -"* Puede configurar la dirección y el puerto del servicio de forma individual " -"en el punto de servicio
Si está habilitado, la página de Luna mostrará " +"* Puede configurar la dirección y el puerto del servicio de forma individual" +" en el punto de servicio
Si está habilitado, la página de Luna mostrará " "un botón para descargar el archivo RDP y el método para iniciar el cliente " "RDP al conectar activos" -#: settings/serializers/terminal.py:66 +#: settings/serializers/terminal.py:70 msgid "Client connection" msgstr "Conexión del cliente" -#: settings/serializers/terminal.py:68 +#: settings/serializers/terminal.py:72 msgid "" "* Allow connecting to the KoKo component via SSH client
If enabled, the " -"Luna page will display the SSH client launch method when connecting to assets" +"Luna page will display the SSH client launch method when connecting to " +"assets" msgstr "" "* Permite la conexión a los componentes de KoKo a través de un cliente " "SSH
Si está habilitado, la página de Luna mostrará el método para " @@ -8240,17 +8235,17 @@ msgstr "Herramientas en la consola" #: settings/serializers/tool.py:15 msgid "" -"*! If enabled, users with RBAC permissions will be able to utilize all tools " -"in the workbench" +"*! If enabled, users with RBAC permissions will be able to utilize all tools" +" in the workbench" msgstr "" "*! Si está habilitado, los usuarios con permisos RBAC podrán utilizar todas " "las herramientas en la consola" -#: settings/tasks/ldap.py:73 +#: settings/tasks/ldap.py:67 msgid "Periodic import ldap user" msgstr "Importación cíclica de usuarios LDAP" -#: settings/tasks/ldap.py:75 settings/tasks/ldap.py:85 +#: settings/tasks/ldap.py:69 settings/tasks/ldap.py:79 msgid "" "When LDAP auto-sync is configured, this task will be invoked to synchronize " "users" @@ -8258,32 +8253,30 @@ msgstr "" "Cuando se establece la sincronización automática de LDAP, se invocará esta " "tarea para la sincronización de usuarios" -#: settings/tasks/ldap.py:83 +#: settings/tasks/ldap.py:77 msgid "Periodic import ldap ha user" msgstr "Importación cíclica de usuarios LDAP HA" -#: settings/tasks/ldap.py:120 +#: settings/tasks/ldap.py:115 msgid "Registration periodic import ldap user task" msgstr "Tarea de importación cíclica de usuarios LDAP registrada" -#: settings/tasks/ldap.py:122 +#: settings/tasks/ldap.py:117 msgid "" -"When LDAP auto-sync parameters change, such as Crontab parameters, the LDAP " -"sync task \n" +"When LDAP auto-sync parameters change, such as Crontab parameters, the LDAP sync task \n" " will be re-registered or updated, and this task will be invoked" msgstr "" -"Cuando se producen cambios en los parámetros de sincronización automática de " -"LDAP, como los parámetros de Crontab, se volverá a registrar o actualizará " +"Cuando se producen cambios en los parámetros de sincronización automática de" +" LDAP, como los parámetros de Crontab, se volverá a registrar o actualizará " "la tarea de sincronización ldap invocando esta tarea" -#: settings/tasks/ldap.py:136 +#: settings/tasks/ldap.py:131 msgid "Registration periodic import ldap ha user task" msgstr "Tarea de importación cíclica de usuarios LDAP HA registrada." -#: settings/tasks/ldap.py:138 +#: settings/tasks/ldap.py:133 msgid "" -"When LDAP HA auto-sync parameters change, such as Crontab parameters, the " -"LDAP HA sync task \n" +"When LDAP HA auto-sync parameters change, such as Crontab parameters, the LDAP HA sync task \n" " will be re-registered or updated, and this task will be invoked" msgstr "" "Cuando cambian los parámetros de sincronización automática de LDAP HA, como " @@ -8306,115 +8299,115 @@ msgstr "Usuario sincronizado" msgid "No user synchronization required" msgstr "No hay usuarios que necesiten sincronizar" -#: settings/utils/ldap.py:509 +#: settings/utils/ldap.py:529 msgid "ldap:// or ldaps:// protocol is used." msgstr "Utilizando protocolo ldap:// o ldaps://" -#: settings/utils/ldap.py:520 +#: settings/utils/ldap.py:540 msgid "Host or port is disconnected: {}" msgstr "Host o puerto no conectable: {}" -#: settings/utils/ldap.py:522 +#: settings/utils/ldap.py:542 msgid "The port is not the port of the LDAP service: {}" msgstr "Puerto no es un puerto de servicio LDAP: {}" -#: settings/utils/ldap.py:524 +#: settings/utils/ldap.py:544 msgid "Please add certificate: {}" msgstr "Por favor, añada el certificado" -#: settings/utils/ldap.py:528 settings/utils/ldap.py:555 -#: settings/utils/ldap.py:585 settings/utils/ldap.py:613 +#: settings/utils/ldap.py:548 settings/utils/ldap.py:575 +#: settings/utils/ldap.py:605 settings/utils/ldap.py:633 msgid "Unknown error: {}" msgstr "Error desconocido: {}" -#: settings/utils/ldap.py:542 +#: settings/utils/ldap.py:562 msgid "Bind DN or Password incorrect" msgstr "DN de enlace o contraseña incorrecta" -#: settings/utils/ldap.py:549 +#: settings/utils/ldap.py:569 msgid "Please enter Bind DN: {}" msgstr "Introduzca el DN de enlace: {}" -#: settings/utils/ldap.py:551 +#: settings/utils/ldap.py:571 msgid "Please enter Password: {}" msgstr "Introduzca la contraseña: {}" -#: settings/utils/ldap.py:553 +#: settings/utils/ldap.py:573 msgid "Please enter correct Bind DN and Password: {}" msgstr "Introduzca un DN de enlace y contraseña correctos: {}" -#: settings/utils/ldap.py:571 +#: settings/utils/ldap.py:591 msgid "Invalid User OU or User search filter: {}" msgstr "OU de usuario o filtro de usuario no válido: {}" -#: settings/utils/ldap.py:602 +#: settings/utils/ldap.py:622 msgid "LDAP User attr map not include: {}" msgstr "La asignación de atributos LDAP no incluye: {}" -#: settings/utils/ldap.py:609 +#: settings/utils/ldap.py:629 msgid "LDAP User attr map is not dict" msgstr "La asignación de atributos LDAP es inválida" -#: settings/utils/ldap.py:628 +#: settings/utils/ldap.py:648 msgid "LDAP authentication is not enabled" msgstr "La autenticación LDAP no está habilitada" -#: settings/utils/ldap.py:646 +#: settings/utils/ldap.py:666 msgid "Error (Invalid LDAP server): {}" msgstr "Error (dirección del servidor LDAP inválida): {}" -#: settings/utils/ldap.py:648 +#: settings/utils/ldap.py:668 msgid "Error (Invalid Bind DN): {}" msgstr "Error (DN de enlace inválido): {}" -#: settings/utils/ldap.py:650 +#: settings/utils/ldap.py:670 msgid "Error (Invalid LDAP User attr map): {}" msgstr "Error (asignación de atributos LDAP inválida): {}" -#: settings/utils/ldap.py:652 +#: settings/utils/ldap.py:672 msgid "Error (Invalid User OU or User search filter): {}" msgstr "Error (OU de usuario o filtro de usuario inválido): {}" -#: settings/utils/ldap.py:654 +#: settings/utils/ldap.py:674 msgid "Error (Not enabled LDAP authentication): {}" msgstr "Error (autenticación LDAP no habilitada): {}" -#: settings/utils/ldap.py:656 +#: settings/utils/ldap.py:676 msgid "Error (Unknown): {}" msgstr "Error (desconocido): {}" -#: settings/utils/ldap.py:659 +#: settings/utils/ldap.py:679 msgid "Succeed: Match {} users" msgstr "Se encontraron exitosamente {} usuarios" -#: settings/utils/ldap.py:689 +#: settings/utils/ldap.py:709 msgid "Authentication failed (configuration incorrect): {}" msgstr "Error de autenticación (error de configuración): {}" -#: settings/utils/ldap.py:693 +#: settings/utils/ldap.py:713 msgid "Authentication failed (username or password incorrect): {}" msgstr "" "Error de autenticación (nombre de usuario o contraseña incorrectos): {}" -#: settings/utils/ldap.py:695 +#: settings/utils/ldap.py:715 msgid "Authentication failed (Unknown): {}" msgstr "Error de autenticación: (desconocido): {}" -#: settings/utils/ldap.py:698 +#: settings/utils/ldap.py:718 msgid "Authentication success: {}" msgstr "Autenticación exitosa: {}" -#: settings/ws.py:222 +#: settings/ws.py:223 msgid "No LDAP user was found" msgstr "No se obtuvo ningún usuario LDAP" -#: settings/ws.py:228 +#: settings/ws.py:232 msgid "Total {}, success {}, failure {}" msgstr "Total: {}, Éxitos: {}, Fracasos: {}" -#: templates/_csv_import_export.html:8 -msgid "Export" -msgstr "Exportar" +#: settings/ws.py:236 +msgid ", disabled {}" +msgstr ", deshabilitar {}" #: templates/_csv_import_export.html:13 templates/_csv_import_modal.html:5 #: xpack/plugins/cloud/const.py:65 @@ -8500,8 +8493,8 @@ msgstr "" #: templates/_message.html:26 msgid "Your password will at" msgstr "" -"Por favor haga clic en
este enlace " -" para actualizarla" +"Por favor haga clic en este enlace" +" para actualizarla" #: templates/_message.html:27 #, python-format @@ -8509,8 +8502,8 @@ msgid "" "please click this link to " "update your password." msgstr "" -"Por favor, haz clic en el enlace para actualizar tu contraseña" +"Por favor, haz clic en el " +"enlace para actualizar tu contraseña" #: templates/_message.html:37 #, python-format @@ -8553,9 +8546,9 @@ msgstr "Cliente" #: users/const.py:77 msgid "Client" msgstr "" -"Cliente JumpServer, actualmente se utiliza para invocar programas de cliente " -"específicos para conectar activos, actualmente solo se admiten clientes RDP " -"y SSH, Telnet se admitirá en el futuro." +"Cliente JumpServer, actualmente se utiliza para invocar programas de cliente" +" específicos para conectar activos, actualmente solo se admiten clientes RDP" +" y SSH, Telnet se admitirá en el futuro." #: templates/resource_download.html:22 msgid "" @@ -8647,7 +8640,7 @@ msgstr "Prueba exitosa" msgid "Test failure: Please check configuration" msgstr "Prueba fallida: por favor, verifica la configuración" -#: terminal/api/component/terminal.py:57 +#: terminal/api/component/terminal.py:56 msgid "Have online sessions" msgstr "Hay una sesión en línea" @@ -8827,7 +8820,7 @@ msgstr "Versión" msgid "Can concurrent" msgstr "puede ejecutarse en paralelo" -#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:179 +#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:194 #: terminal/serializers/storage.py:193 msgid "Hosts" msgstr "host" @@ -8849,12 +8842,12 @@ msgstr "Solo se admite plataforma personalizada" msgid "Missing type in platform.yml" msgstr "Falta tipo en el platform.yml" -#: terminal/models/applet/applet.py:330 terminal/models/applet/host.py:36 +#: terminal/models/applet/applet.py:371 terminal/models/applet/host.py:36 #: terminal/models/applet/host.py:138 msgid "Hosting" msgstr "Máquina anfitriona" -#: terminal/models/applet/applet.py:336 +#: terminal/models/applet/applet.py:377 msgid "Applet Publication" msgstr "Lanzamiento de la aplicación" @@ -8885,8 +8878,7 @@ msgstr "Fecha de sincronización" #: terminal/models/applet/host.py:28 msgid "Using same account" msgstr "" -"Utiliza la misma cuenta para inicializar el despliegue de la aplicación en " -"los siguientes puertos: \n" +"Utiliza la misma cuenta para inicializar el despliegue de la aplicación en los siguientes puertos: \n" "Puerto HTTPS \n" "Puerto HTTP \n" "Puerto SSH \n" @@ -8945,18 +8937,22 @@ msgid "SQLServer port" msgstr "Puerto de SQLServer" #: terminal/models/component/endpoint.py:25 +msgid "Oracle port" +msgstr "Puerto de Oracle" + +#: terminal/models/component/endpoint.py:26 msgid "VNC port" msgstr "Puerto de VNC" -#: terminal/models/component/endpoint.py:33 -#: terminal/models/component/endpoint.py:120 -#: terminal/serializers/endpoint.py:80 terminal/serializers/storage.py:41 +#: terminal/models/component/endpoint.py:34 +#: terminal/models/component/endpoint.py:114 +#: terminal/serializers/endpoint.py:61 terminal/serializers/storage.py:41 #: terminal/serializers/storage.py:53 terminal/serializers/storage.py:83 #: terminal/serializers/storage.py:93 terminal/serializers/storage.py:101 msgid "Endpoint" msgstr "Punto" -#: terminal/models/component/endpoint.py:126 +#: terminal/models/component/endpoint.py:120 msgid "Endpoint rule" msgstr "Reglas de punto" @@ -9030,7 +9026,8 @@ msgstr "Se puede descargar la grabación de la conversación" msgid "Account ID" msgstr "Cuenta" -#: terminal/models/session/session.py:39 terminal/models/session/sharing.py:118 +#: terminal/models/session/session.py:39 +#: terminal/models/session/sharing.py:118 msgid "Login from" msgstr "Fuente de inicio de sesión" @@ -9079,8 +9076,8 @@ msgstr "Permiso de operación" msgid "Origin" msgstr "Procedencia" -#: terminal/models/session/sharing.py:42 terminal/models/session/sharing.py:100 -#: terminal/notifications.py:279 +#: terminal/models/session/sharing.py:42 +#: terminal/models/session/sharing.py:100 terminal/notifications.py:279 msgid "Session sharing" msgstr "Compartir conversación" @@ -9163,7 +9160,7 @@ msgid "Command and replay storage" msgstr "Almacenamiento de comandos y grabaciones" #: terminal/notifications.py:258 terminal/tasks.py:212 -#: xpack/plugins/cloud/api.py:160 +#: xpack/plugins/cloud/api.py:175 #: xpack/plugins/cloud/serializers/account.py:121 #: xpack/plugins/cloud/serializers/account.py:123 msgid "Test failure: Account invalid" @@ -9193,19 +9190,16 @@ msgstr "Dirección del servicio Core" #: terminal/serializers/applet_host.py:38 msgid "" " \n" -" Tips: The application release machine communicates with the Core " -"service. \n" -" If the release machine and the Core service are on the same network " -"segment, \n" -" it is recommended to fill in the intranet address, otherwise fill in " -"the current site URL \n" +" Tips: The application release machine communicates with the Core service. \n" +" If the release machine and the Core service are on the same network segment, \n" +" it is recommended to fill in the intranet address, otherwise fill in the current site URL \n" "
\n" " eg: https://172.16.10.110 or https://dev.jumpserver.com\n" " " msgstr "" "Nota: Se utiliza para la comunicación entre el publicador de aplicaciones y " -"el servicio Core. Si el publicador y el servicio Core están en la misma red, " -"se recomienda ingresar la dirección de la red interna, de lo contrario, " +"el servicio Core. Si el publicador y el servicio Core están en la misma red," +" se recomienda ingresar la dirección de la red interna, de lo contrario, " "ingrese la URL del sitio actual.
Por ejemplo: https://172.16.10.110 o " "https://dev.jumpserver.com" @@ -9220,12 +9214,13 @@ msgstr "Licencia RDS ya existente" #: terminal/serializers/applet_host.py:50 msgid "" "If not exist, the RDS will be in trial mode, and the trial period is 120 " -"days. Detail" +"days. Detail" msgstr "" "Si no existe, RDS estará en modo de prueba, con un período de prueba de 120 " -"días. Más detalles" +"días. Más " +"detalles" #: terminal/serializers/applet_host.py:55 msgid "RDS License Server" @@ -9245,8 +9240,8 @@ msgid "" "login connected, previous session will be disconnected." msgstr "" "Nota: Un usuario de RDS solo puede tener una sesión activa a la vez. Si se " -"establece esto, la sesión anterior se desconectará la próxima vez que inicie " -"sesión." +"establece esto, la sesión anterior se desconectará la próxima vez que inicie" +" sesión." #: terminal/serializers/applet_host.py:65 msgid "RDS Max Disconnection Time (ms)" @@ -9269,8 +9264,8 @@ msgstr "" #: terminal/serializers/applet_host.py:74 msgid "" -"Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp " -"programs (0 milliseconds, log off the session immediately)." +"Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp" +" programs (0 milliseconds, log off the session immediately)." msgstr "" "Nota: Establece el tiempo de cierre de sesión de las sesiones de RemoteAPP " "después de cerrar todas las aplicaciones RemoteApp (0 milisegundos, cerrar " @@ -9283,11 +9278,11 @@ msgstr "Estado de carga" #: terminal/serializers/applet_host.py:97 msgid "" -"These accounts are used to connect to the published application, the account " -"is now divided into two types, one is dedicated to each account, each user " +"These accounts are used to connect to the published application, the account" +" is now divided into two types, one is dedicated to each account, each user " "has a private account, the other is public, when the application does not " -"support multiple open and the special has been used, the public account will " -"be used to connect" +"support multiple open and the special has been used, the public account will" +" be used to connect" msgstr "" "Estas cuentas se utilizan para conectar aplicaciones publicadas, y " "actualmente se dividen en dos tipos:
Una es dedicada, donde cada " @@ -9313,15 +9308,15 @@ msgstr "" "archivo CACHE_LOGIN_PASSWORD_ENABLED=true, y reiniciar el servicio después " "de hacer cambios." -#: terminal/serializers/applet_host.py:149 +#: terminal/serializers/applet_host.py:164 msgid "Install applets" msgstr "Instalar aplicación" -#: terminal/serializers/applet_host.py:179 +#: terminal/serializers/applet_host.py:194 msgid "Host ID" msgstr "ID de host" -#: terminal/serializers/applet_host.py:180 +#: terminal/serializers/applet_host.py:195 msgid "Applet ID" msgstr "ID de aplicación remota" @@ -9349,23 +9344,7 @@ msgstr "ID de sesión no válido" msgid "Timestamp" msgstr "Marca de tiempo" -#: terminal/serializers/endpoint.py:15 -msgid "Oracle port" -msgstr "Puerto de Oracle" - -#: terminal/serializers/endpoint.py:18 -msgid "Oracle port range" -msgstr "Rango de puertos de Oracle" - -#: terminal/serializers/endpoint.py:20 -msgid "" -"Oracle proxy server listen port is dynamic, Each additional Oracle database " -"instance adds a port listener" -msgstr "" -"El puerto del servidor proxy de Oracle es dinámico; por cada instancia de " -"base de datos Oracle que se añade, se incrementa un puerto de escucha" - -#: terminal/serializers/endpoint.py:38 +#: terminal/serializers/endpoint.py:26 msgid "" "The host address accessed when connecting to assets, if it is empty, the " "access address of the current browser will be used (the default endpoint " @@ -9375,22 +9354,22 @@ msgstr "" "utilizará la dirección de acceso del navegador actual (el punto final por " "defecto no permite modificar el host)" -#: terminal/serializers/endpoint.py:71 +#: terminal/serializers/endpoint.py:52 msgid "" -"The assets within this IP range, the following endpoint will be used for the " -"connection" +"The assets within this IP range, the following endpoint will be used for the" +" connection" msgstr "" -"Los activos dentro de este rango de IP se conectarán utilizando el siguiente " -"punto final" +"Los activos dentro de este rango de IP se conectarán utilizando el siguiente" +" punto final" -#: terminal/serializers/endpoint.py:72 +#: terminal/serializers/endpoint.py:53 msgid "" "If asset IP addresses under different endpoints conflict, use asset labels" msgstr "" "Si hay conflictos de IP de activos bajo diferentes puntos finales, se " "resolverá utilizando etiquetas de activos" -#: terminal/serializers/endpoint.py:76 +#: terminal/serializers/endpoint.py:57 msgid "Asset IP" msgstr "IP del activo" @@ -9654,8 +9633,7 @@ msgstr "Eliminación de sesiones desconectadas." #: terminal/tasks.py:45 msgid "" -"Check every 10 minutes for asset connection sessions that have been inactive " -"for 3 \n" +"Check every 10 minutes for asset connection sessions that have been inactive for 3 \n" " minutes and mark these sessions as completed" msgstr "" "Cada 10 minutos, se revisan las sesiones de conexión de activos inactivos " @@ -9667,8 +9645,7 @@ msgstr "Subir la grabación de la sesión al almacenamiento externo." #: terminal/tasks.py:70 terminal/tasks.py:104 msgid "" -"If SERVER_REPLAY_STORAGE is configured in the config.txt, session commands " -"and \n" +"If SERVER_REPLAY_STORAGE is configured in the config.txt, session commands and \n" " recordings will be uploaded to external storage" msgstr "" "Si se ha configurado SERVER_REPLAY_STORAGE, los archivos subidos a través " @@ -9686,8 +9663,7 @@ msgstr "Despliegue de la aplicación" #: terminal/tasks.py:126 msgid "" -"When deploying from the remote application publisher details page, and the " -"'Deploy' \n" +"When deploying from the remote application publisher details page, and the 'Deploy' \n" " button is clicked, this task will be executed" msgstr "" "Despliegue del publicador, al hacer clic en desplegar, ejecutar esta acción" @@ -9698,8 +9674,7 @@ msgstr "Instalar aplicación" #: terminal/tasks.py:140 msgid "" -"When the 'Deploy' button is clicked in the 'Remote Application' section of " -"the remote \n" +"When the 'Deploy' button is clicked in the 'Remote Application' section of the remote \n" " application publisher details page, this task will be executed" msgstr "" "Al hacer clic en desplegar en los detalles del publicador de la aplicación " @@ -9711,12 +9686,11 @@ msgstr "Desinstalar aplicación" #: terminal/tasks.py:155 msgid "" -"When the 'Uninstall' button is clicked in the 'Remote Application' section " -"of the \n" +"When the 'Uninstall' button is clicked in the 'Remote Application' section of the \n" " remote application publisher details page, this task will be executed" msgstr "" -"Al hacer clic en desinstalar en los detalles del publicador de la aplicación " -"remota, ejecutar esta acción" +"Al hacer clic en desinstalar en los detalles del publicador de la aplicación" +" remota, ejecutar esta acción" #: terminal/tasks.py:167 msgid "Generate applet host accounts" @@ -9724,8 +9698,7 @@ msgstr "Recopilar cuentas en la aplicación remota" #: terminal/tasks.py:170 msgid "" -"When a remote publishing server is created and an account needs to be " -"created \n" +"When a remote publishing server is created and an account needs to be created \n" " automatically, this task will be executed" msgstr "" "Al crear un publicador remoto, ejecutar esta acción si se necesita crear " @@ -9738,46 +9711,20 @@ msgstr "" #: terminal/tasks.py:186 msgid "" -"Check every day at midnight whether the external storage for commands and " -"recordings \n" -" is accessible. If it is not accessible, send a notification to the " -"recipients specified \n" -" in 'System Settings - Notifications - Subscription - Storage - " -"Connectivity'" +"Check every day at midnight whether the external storage for commands and recordings \n" +" is accessible. If it is not accessible, send a notification to the recipients specified \n" +" in 'System Settings - Notifications - Subscription - Storage - Connectivity'" msgstr "" "Verificar diariamente a las 00:00 la conectividad de los comandos y el " "almacenamiento externo de grabaciones; si no es conectable, enviar a: " -"Configuración del sistema - Configuración de notificaciones - Suscripción de " -"mensajes - receptores de la configuración de almacenamiento de comandos y " +"Configuración del sistema - Configuración de notificaciones - Suscripción de" +" mensajes - receptores de la configuración de almacenamiento de comandos y " "grabaciones" #: terminal/templates/terminal/_msg_command_alert.html:10 msgid "view" msgstr "Ver" -#: terminal/utils/db_port_mapper.py:88 -msgid "" -"No available port is matched. The number of databases may have exceeded the " -"number of ports open to the database agent service, Contact the " -"administrator to open more ports." -msgstr "" -"No se encontraron puertos disponibles, la cantidad de bases de datos puede " -"haber excedido la cantidad de puertos abiertos por el servicio de proxy de " -"base de datos, por favor contacta al administrador para abrir más puertos." - -#: terminal/utils/db_port_mapper.py:116 -msgid "" -"No ports can be used, check and modify the limit on the number of ports that " -"Magnus listens on in the configuration file." -msgstr "" -"No hay puertos disponibles, revisar y modificar el límite de cantidad de " -"puertos escuchados por Magnus en el archivo de configuración." - -#: terminal/utils/db_port_mapper.py:118 -msgid "All available port count: {}, Already use port count: {}" -msgstr "" -"Cantidad total de puertos disponibles: {}, cantidad de puertos utilizados: {}" - #: tickets/api/ticket.py:88 tickets/models/ticket/general.py:289 msgid "Applicant" msgstr "Solicitante" @@ -9835,8 +9782,8 @@ msgid "" "Created by the ticket ticket title: {} ticket applicant: {} ticket " "processor: {} ticket ID: {}" msgstr "" -"Creado a través de un ticket, Título del ticket: {}, Solicitante del ticket: " -"{}, Persona encargada del ticket: {}, ID del ticket: {}" +"Creado a través de un ticket, Título del ticket: {}, Solicitante del ticket:" +" {}, Persona encargada del ticket: {}, ID del ticket: {}" #: tickets/handlers/base.py:84 msgid "Change field" @@ -10094,7 +10041,8 @@ msgstr "Este usuario no tiene autorización para aprobar esta orden de trabajo" #: users/api/user.py:63 msgid "Cannot delete the admin user. Please disable it instead." -msgstr "No se puede eliminar el usuario administrador. Por favor, desactívelo." +msgstr "" +"No se puede eliminar el usuario administrador. Por favor, desactívelo." #: users/api/user.py:161 msgid "Can not invite self" @@ -10206,8 +10154,8 @@ msgstr "" #: users/forms/profile.py:69 msgid "" -"In order to protect you and your company, please keep your account, password " -"and key sensitive information properly. (for example: setting complex " +"In order to protect you and your company, please keep your account, password" +" and key sensitive information properly. (for example: setting complex " "password, enabling MFA)" msgstr "" "Para proteger su seguridad y la de la empresa, asegúrese de resguardar " @@ -10372,8 +10320,8 @@ msgstr "Nombre del tema del terminal" #: users/serializers/preference/lina.py:12 msgid "" "*! The password for file encryption, used for decryption when the system " -"sends emails containing file attachments.
Such as: account backup files, " -"account password change results files" +"sends emails containing file attachments.
Such as: account backup files," +" account password change results files" msgstr "" "Contraseña de cifrado de archivos, utilice esta contraseña para descifrar " "cuando el correo enviado por el sistema contenga archivos adjuntos.
Ej: " @@ -10458,7 +10406,7 @@ msgstr "Línea de comandos" msgid "The old password is incorrect" msgstr "Contraseña antigua incorrecta" -#: users/serializers/profile.py:37 users/serializers/profile.py:148 +#: users/serializers/profile.py:37 users/serializers/profile.py:156 msgid "Password does not match security rules" msgstr "La contraseña no cumple con las normas de seguridad" @@ -10472,8 +10420,8 @@ msgstr "Rol del sistema" #: users/serializers/user.py:55 msgid "" -"System roles are roles at the system level, and they will take effect across " -"all organizations" +"System roles are roles at the system level, and they will take effect across" +" all organizations" msgstr "" "El rol del sistema es un rol a nivel de sistema que se aplicará en toda la " "organización" @@ -10552,8 +10500,8 @@ msgid "" "other sources.There are security settings that can restrict users to log in " "to the system only from the sources." msgstr "" -"Origen del usuario identifica el lugar de creación del usuario, puede ser AD " -"u otra fuente. Las configuraciones de seguridad pueden restringir a los " +"Origen del usuario identifica el lugar de creación del usuario, puede ser AD" +" u otra fuente. Las configuraciones de seguridad pueden restringir a los " "usuarios para que solo inicien sesión en el sistema desde fuentes " "específicas." @@ -10575,10 +10523,11 @@ msgstr "Autenticación" #: users/serializers/user.py:422 msgid "" -"* For security, only a partial of users is displayed. You can search for more" +"* For security, only a partial of users is displayed. You can search for " +"more" msgstr "" -"* Por razones de seguridad, solo se muestran algunos usuarios. Puedes buscar " -"más" +"* Por razones de seguridad, solo se muestran algunos usuarios. Puedes buscar" +" más" #: users/serializers/user.py:457 msgid "name not unique" @@ -10587,8 +10536,7 @@ msgstr "Nombres duplicados" #: users/signal_handlers.py:41 msgid "" "The administrator has enabled \"Only allow existing users to log in\", \n" -" and the current user is not in the user list. Please contact the " -"administrator." +" and the current user is not in the user list. Please contact the administrator." msgstr "" "El administrador ha habilitado 'solo permitir que los usuarios existentes " "inicien sesión', el usuario actual no está en la lista, por favor contacta " @@ -10600,13 +10548,12 @@ msgstr "Limpiar sesiones de usuario vencidas" #: users/signal_handlers.py:179 msgid "" -"After logging in via the web, a user session record is created. At 2 a.m. " -"every day, \n" +"After logging in via the web, a user session record is created. At 2 a.m. every day, \n" " the system cleans up inactive user devices" msgstr "" -"Después de iniciar sesión en la web, se generará un registro en línea de las " -"sesiones de usuario. A las 2 de la mañana, se limpiarán los dispositivos de " -"usuario que no están en línea." +"Después de iniciar sesión en la web, se generará un registro en línea de las" +" sesiones de usuario. A las 2 de la mañana, se limpiarán los dispositivos de" +" usuario que no están en línea." #: users/tasks.py:26 msgid "Check password expired" @@ -10614,8 +10561,7 @@ msgstr "Verificar si la contraseña ha vencido" #: users/tasks.py:28 msgid "" -"Check every day at 10 AM whether the passwords of users in the system are " -"expired, \n" +"Check every day at 10 AM whether the passwords of users in the system are expired, \n" " and send a notification 5 days in advance" msgstr "" "Cada día a las 10 de la mañana se verifica si las contraseñas de los " @@ -10628,10 +10574,8 @@ msgstr "Verificación periódica del vencimiento de contraseñas" #: users/tasks.py:48 msgid "" -"With version iterations, new tasks may be added, or task names and execution " -"times may \n" -" be modified. Therefore, upon system startup, it is necessary to " -"register or update the \n" +"With version iterations, new tasks may be added, or task names and execution times may \n" +" be modified. Therefore, upon system startup, it is necessary to register or update the \n" " parameters of the task that checks if passwords have expired" msgstr "" "Con cada iteración de la versión, pueden añadirse nuevas tareas o " @@ -10645,8 +10589,7 @@ msgstr "Verificar si el usuario ha vencido" #: users/tasks.py:69 msgid "" -"Check every day at 2 p.m whether the users in the system are expired, and " -"send a \n" +"Check every day at 2 p.m whether the users in the system are expired, and send a \n" " notification 5 days in advance" msgstr "" "Cada día a las 2 de la tarde se verifica si los usuarios en el sistema han " @@ -10658,10 +10601,8 @@ msgstr "Detección periódica de vencimiento de usuarios" #: users/tasks.py:92 msgid "" -"With version iterations, new tasks may be added, or task names and execution " -"times may \n" -" be modified. Therefore, upon system startup, it is necessary to " -"register or update the \n" +"With version iterations, new tasks may be added, or task names and execution times may \n" +" be modified. Therefore, upon system startup, it is necessary to register or update the \n" " parameters of the task that checks if users have expired" msgstr "" "Con cada iteración de la versión, pueden añadirse nuevas tareas o " @@ -10675,10 +10616,8 @@ msgstr "Verificación de usuarios no activos" #: users/tasks.py:113 msgid "" -"At 2 p.m. every day, according to the configuration in \"System Settings - " -"Security - \n" -" Auth security - Auto disable threshold\" users who have not logged " -"in or whose API keys \n" +"At 2 p.m. every day, according to the configuration in \"System Settings - Security - \n" +" Auth security - Auto disable threshold\" users who have not logged in or whose API keys \n" " have not been used for a long time will be disabled" msgstr "" "Todos los días a las 2 de la tarde, conforme a la configuración del sistema " @@ -10748,15 +10687,15 @@ msgstr "Haga clic aquí para establecer la contraseña." #: users/templates/users/forgot_password.html:46 msgid "Input your email account, that will send a email to your" msgstr "" -"Ingrese su correo electrónico, se enviará un correo de restablecimiento a su " -"bandeja de entrada." +"Ingrese su correo electrónico, se enviará un correo de restablecimiento a su" +" bandeja de entrada." #: users/templates/users/forgot_password.html:49 msgid "" "Enter your mobile number and a verification code will be sent to your phone" msgstr "" -"Introduce tu número de teléfono, el código de verificación será enviado a tu " -"móvil" +"Introduce tu número de teléfono, el código de verificación será enviado a tu" +" móvil" #: users/templates/users/forgot_password.html:71 msgid "Email account" @@ -10825,8 +10764,8 @@ msgstr "Vincular verificador MFA" #: users/templates/users/user_otp_enable_bind.html:13 msgid "" -"Use the MFA Authenticator application to scan the following qr code for a 6-" -"bit verification code" +"Use the MFA Authenticator application to scan the following qr code for a " +"6-bit verification code" msgstr "" "Utilice la aplicación de verificación MFA para escanear el siguiente código " "QR y obtener el código de 6 dígitos" @@ -10861,9 +10800,9 @@ msgid "" "After installation, click the next step to enter the binding page (if " "installed, go to the next step directly)." msgstr "" -"Una vez completada la instalación, haga clic en siguiente para ingresar a la " -"página de vinculación (si ya está instalada, vaya directamente al siguiente " -"paso)" +"Una vez completada la instalación, haga clic en siguiente para ingresar a la" +" página de vinculación (si ya está instalada, vaya directamente al siguiente" +" paso)" #: users/templates/users/user_password_verify.html:8 #: users/templates/users/user_password_verify.html:9 @@ -10919,7 +10858,8 @@ msgstr "MFA(OTP) habilitado con éxito" #: users/views/profile/otp.py:135 msgid "OTP enable success, return login page" -msgstr "MFA(OTP) habilitado con éxito, regrese a la página de inicio de sesión" +msgstr "" +"MFA(OTP) habilitado con éxito, regrese a la página de inicio de sesión" #: users/views/profile/otp.py:177 msgid "Disable OTP" @@ -10940,8 +10880,8 @@ msgstr "Nombre de usuario o contraseña inválidos" #: users/views/profile/reset.py:66 msgid "" -"Non-local users can log in only from third-party platforms and cannot change " -"their passwords: {}" +"Non-local users can log in only from third-party platforms and cannot change" +" their passwords: {}" msgstr "" "Usuarios no locales sólo pueden iniciar sesión desde plataformas de " "terceros, no se admite el cambio de contraseña: {}" @@ -10967,8 +10907,8 @@ msgstr "* La nueva contraseña no puede ser una de las últimas {} contraseñas" #: users/views/profile/reset.py:234 msgid "Reset password success, return to login page" msgstr "" -"La contraseña se ha restablecido con éxito, regrese a la página de inicio de " -"sesión." +"La contraseña se ha restablecido con éxito, regrese a la página de inicio de" +" sesión." #: xpack/apps.py:8 msgid "XPACK" @@ -10979,18 +10919,18 @@ msgid "" "Based on the current task configuration, assets that do not match the " "strategy will skipped." msgstr "" -"Según la configuración de la tarea actual, los activos que no cumplen con la " -"política serán omitidos." +"Según la configuración de la tarea actual, los activos que no cumplen con la" +" política serán omitidos." -#: xpack/plugins/cloud/api.py:72 +#: xpack/plugins/cloud/api.py:74 msgid "Test connection successful" msgstr "Prueba exitosa" -#: xpack/plugins/cloud/api.py:74 +#: xpack/plugins/cloud/api.py:76 msgid "Test connection failed: {}" msgstr "Error en la conexión de prueba: {}" -#: xpack/plugins/cloud/api.py:171 +#: xpack/plugins/cloud/api.py:196 msgid "User {} deleted the current resource and released the assets" msgstr "El usuario {} ha eliminado activos cuya recurso ha sido liberado." @@ -11328,7 +11268,8 @@ msgstr "Instancia" msgid "Sync instance detail" msgstr "Detalles de la instancia sincronizada" -#: xpack/plugins/cloud/models.py:313 xpack/plugins/cloud/serializers/task.py:79 +#: xpack/plugins/cloud/models.py:313 +#: xpack/plugins/cloud/serializers/task.py:79 msgid "Rule relation" msgstr "Relación de condiciones" @@ -11384,7 +11325,8 @@ msgstr "Coincidencia de regla" msgid "Rule value" msgstr "Valor de regla" -#: xpack/plugins/cloud/models.py:383 xpack/plugins/cloud/serializers/task.py:82 +#: xpack/plugins/cloud/models.py:383 +#: xpack/plugins/cloud/serializers/task.py:82 msgid "Strategy rule" msgstr "Condición" @@ -11400,7 +11342,8 @@ msgstr "Atributos de acción" msgid "Action value" msgstr "Valor de acción" -#: xpack/plugins/cloud/models.py:410 xpack/plugins/cloud/serializers/task.py:85 +#: xpack/plugins/cloud/models.py:410 +#: xpack/plugins/cloud/serializers/task.py:85 msgid "Strategy action" msgstr "Acción" @@ -11729,13 +11672,13 @@ msgstr "Número de instancias" #: xpack/plugins/cloud/tasks.py:33 #, fuzzy #| msgid "" -#| "Execute this task when manually or scheduled cloud synchronization tasks " -#| "are performed" +#| "Execute this task when manually or scheduled cloud synchronization tasks are" +#| " performed" msgid "" -"Execute this task when manually or scheduled cloud synchronization tasks are " -"performed" +"Execute this task when manually or scheduled cloud synchronization tasks are" +" performed" msgstr "" -"Ejecutar esta tarea manualmente o programando la sincronización en la nube" +"Ejecutar esta tarea durante la sincronización manual o programada en la nube" #: xpack/plugins/cloud/tasks.py:50 msgid "Period clean sync instance task execution" @@ -11746,22 +11689,18 @@ msgstr "" #: xpack/plugins/cloud/tasks.py:52 #, fuzzy #| msgid "" -#| "Every day, according to the configuration in \"System Settings - Tasks - " -#| "Regular \n" -#| " clean-up - Cloud sync task history retention days\" the system " -#| "will clean up the execution \n" +#| "Every day, according to the configuration in \"System Settings - Tasks - Regular \n" +#| " clean-up - Cloud sync task history retention days\" the system will clean up the execution \n" #| " records generated by cloud synchronization" msgid "" -"Every day, according to the configuration in \"System Settings - Tasks - " -"Regular \n" -" clean-up - Cloud sync task history retention days\" the system will " -"clean up the execution \n" +"Every day, according to the configuration in \"System Settings - Tasks - Regular \n" +" clean-up - Cloud sync task history retention days\" the system will clean up the execution \n" " records generated by cloud synchronization" msgstr "" -"Cada día, el sistema limpia periódicamente el historial de tareas de " -"sincronización en la nube según la configuración en “Ajustes del sistema - " -"Tareas -”, eliminando los registros de ejecución generados por la " -"sincronización en la nube." +"Diariamente, el sistema limpiará periódicamente los registros de ejecución " +"generados por la sincronización en la nube de acuerdo con la configuración " +"en “Configuración del sistema - Tareas -” y el número de días de retención " +"histórica." #: xpack/plugins/interface/api.py:52 msgid "Restore default successfully." @@ -11817,6 +11756,56 @@ msgstr "Importación de licencia exitosa" msgid "Invalid license" msgstr "Licencia no válida" +#~ msgid "Deleting other people's script is not allowed" +#~ msgstr "No se permite eliminar los scripts de otros" + +#~ msgid "Deleting other people's playbook is not allowed" +#~ msgstr "No se permite eliminar el playbook de otros" + +#, fuzzy +#~ msgid "Directory services" +#~ msgstr "Servicio de directorio" + +#, python-format +#~ msgid "User %s view/export secret" +#~ msgstr "El usuario %s ha visto/exportado la contraseña" + +#~ msgid "Enabled, the web session and replay contains watermark information" +#~ msgstr "" +#~ "Una vez habilitado, la sesión web y las grabaciones incluirán información de" +#~ " marca de agua" + +#~ msgid "Oracle port range" +#~ msgstr "Rango de puertos de Oracle" + +#~ msgid "" +#~ "Oracle proxy server listen port is dynamic, Each additional Oracle database " +#~ "instance adds a port listener" +#~ msgstr "" +#~ "El puerto del servidor proxy de Oracle es dinámico; por cada instancia de " +#~ "base de datos Oracle que se añade, se incrementa un puerto de escucha" + +#~ msgid "" +#~ "No available port is matched. The number of databases may have exceeded the " +#~ "number of ports open to the database agent service, Contact the " +#~ "administrator to open more ports." +#~ msgstr "" +#~ "No se encontraron puertos disponibles, la cantidad de bases de datos puede " +#~ "haber excedido la cantidad de puertos abiertos por el servicio de proxy de " +#~ "base de datos, por favor contacta al administrador para abrir más puertos." + +#~ msgid "" +#~ "No ports can be used, check and modify the limit on the number of ports that" +#~ " Magnus listens on in the configuration file." +#~ msgstr "" +#~ "No hay puertos disponibles, revisar y modificar el límite de cantidad de " +#~ "puertos escuchados por Magnus en el archivo de configuración." + +#~ msgid "All available port count: {}, Already use port count: {}" +#~ msgstr "" +#~ "Cantidad total de puertos disponibles: {}, cantidad de puertos utilizados: " +#~ "{}" + #~ msgid "Password error" #~ msgstr "Contraseña incorrecta" diff --git a/apps/i18n/core/ja/LC_MESSAGES/django.po b/apps/i18n/core/ja/LC_MESSAGES/django.po index 824f180d5..33d872be4 100644 --- a/apps/i18n/core/ja/LC_MESSAGES/django.po +++ b/apps/i18n/core/ja/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-20 11:52+0800\n" +"POT-Creation-Date: 2025-04-17 15:04+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,18 +18,18 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: accounts/api/account/account.py:121 +#: accounts/api/account/account.py:131 #: accounts/serializers/account/account.py:181 -#: accounts/serializers/account/account.py:342 +#: accounts/serializers/account/account.py:344 msgid "Account already exists" msgstr "アカウントはすでに存在しています" #: accounts/api/account/application.py:78 -#: authentication/api/connection_token.py:452 +#: authentication/api/connection_token.py:451 msgid "Account not found" msgstr "アカウントが見つかりません" -#: accounts/api/automations/base.py:83 tickets/api/ticket.py:132 +#: accounts/api/automations/base.py:86 tickets/api/ticket.py:132 msgid "The parameter 'action' must be [{}]" msgstr "パラメータ 'action' は [{}] でなければなりません。" @@ -94,7 +94,7 @@ msgstr "アカウントのバックアップ計画を実行中です" msgid "Plan execution end" msgstr "計画実行終了" -#: accounts/automations/base/manager.py:118 +#: accounts/automations/base/manager.py:119 msgid "No pending accounts found" msgstr "処理待ちのアカウントが見つかりません" @@ -107,13 +107,11 @@ msgstr "成功: %s、失敗: %s、合計: %s" msgid "" "---\n" "Summary: \n" -"ok: {}, weak password: {}, leaked password: {}, repeated password: {}, no " -"secret: {}, using time: {}s" +"ok: {}, weak password: {}, leaked password: {}, repeated password: {}, no secret: {}, using time: {}s" msgstr "" "---\n" "概要: \n" -"通常: {}, 弱いパスワード: {}, 漏洩したパスワード: {}, 繰り返しのパスワード: " -"{}, パスワードなし: {}, 時間: {}秒" +"通常: {}, 弱いパスワード: {}, 漏洩したパスワード: {}, 繰り返しのパスワード: {}, パスワードなし: {}, 時間: {}秒" #: accounts/automations/push_account/manager.py:33 msgid "Secret cannot be empty" @@ -125,14 +123,14 @@ msgstr ">>> ゲートウェイ接続のテストタスクを開始する" #: accounts/const/account.py:6 #: accounts/serializers/automations/change_secret.py:34 -#: audits/signal_handlers/login_log.py:34 authentication/confirm/password.py:25 -#: authentication/confirm/password.py:27 authentication/const.py:10 -#: authentication/forms.py:28 +#: audits/signal_handlers/login_log.py:34 +#: authentication/confirm/password.py:25 authentication/confirm/password.py:27 +#: authentication/const.py:10 authentication/forms.py:28 #: authentication/templates/authentication/login.html:362 #: authentication/templates/authentication/login.html:408 #: settings/serializers/auth/ldap.py:27 settings/serializers/auth/ldap.py:53 -#: settings/serializers/auth/ldap_ha.py:36 settings/serializers/msg.py:37 -#: settings/serializers/terminal.py:28 terminal/serializers/storage.py:123 +#: settings/serializers/auth/ldap_ha.py:35 settings/serializers/msg.py:37 +#: settings/serializers/terminal.py:32 terminal/serializers/storage.py:123 #: terminal/serializers/storage.py:142 users/forms/profile.py:22 #: users/serializers/user.py:148 #: users/templates/users/_msg_user_created.html:13 @@ -194,7 +192,8 @@ msgstr "発見" msgid "Template" msgstr "テンプレート" -#: accounts/const/account.py:32 ops/const.py:46 xpack/plugins/cloud/const.py:68 +#: accounts/const/account.py:32 ops/const.py:46 +#: xpack/plugins/cloud/const.py:68 msgid "Skip" msgstr "スキップ" @@ -204,7 +203,7 @@ msgid "Update" msgstr "更新" #: accounts/const/account.py:34 accounts/const/automation.py:115 -#: accounts/serializers/automations/change_secret.py:169 audits/const.py:65 +#: accounts/serializers/automations/change_secret.py:169 audits/const.py:66 #: audits/signal_handlers/activity_log.py:34 common/const/choices.py:67 #: ops/const.py:76 terminal/const.py:81 xpack/plugins/cloud/const.py:47 msgid "Failed" @@ -307,7 +306,7 @@ msgstr "作成してプッシュ" msgid "Only create" msgstr "作成のみ" -#: accounts/const/automation.py:109 +#: accounts/const/automation.py:109 authentication/const.py:34 #: authentication/serializers/password_mfa.py:16 #: authentication/serializers/password_mfa.py:24 #: notifications/backends/__init__.py:10 settings/serializers/msg.py:21 @@ -323,7 +322,7 @@ msgid "SFTP" msgstr "SFTP" #: accounts/const/automation.py:116 -#: accounts/serializers/automations/change_secret.py:168 audits/const.py:64 +#: accounts/serializers/automations/change_secret.py:168 audits/const.py:65 #: audits/models.py:65 audits/signal_handlers/activity_log.py:34 #: common/const/choices.py:66 ops/const.py:74 ops/serializers/celery.py:48 #: terminal/const.py:80 terminal/models/session/sharing.py:121 @@ -412,37 +411,13 @@ msgstr "Amazon Secrets Manager" msgid "" "Vault operation failed. Please retry or check your account information on " "Vault." -msgstr "" -"Vault 操作に失敗しました。再試行するか、Vault のアカウント情報を確認してくだ" -"さい。" - -#: accounts/filters.py:194 -msgid "Enter a valid UUID." -msgstr "" - -#: accounts/mixins.py:35 -msgid "Export all" -msgstr "すべてエクスポート" - -#: accounts/mixins.py:37 -msgid "Export only selected items" -msgstr "選択項目のみエクスポート" - -#: accounts/mixins.py:42 -#, python-format -msgid "Export filtered: %s" -msgstr "検索のエクスポート: %s" - -#: accounts/mixins.py:48 -#, python-format -msgid "User %s view/export secret" -msgstr "ユーザー %s がパスワードを閲覧/導き出しました" +msgstr "Vault 操作に失敗しました。再試行するか、Vault のアカウント情報を確認してください。" #: accounts/models/account.py:85 #: accounts/models/automations/check_account.py:59 #: accounts/models/automations/gather_account.py:17 -#: accounts/serializers/account/account.py:226 -#: accounts/serializers/account/account.py:274 +#: accounts/serializers/account/account.py:227 +#: accounts/serializers/account/account.py:276 #: accounts/serializers/automations/change_secret.py:113 #: accounts/serializers/automations/change_secret.py:145 #: accounts/serializers/automations/check_account.py:33 @@ -456,9 +431,9 @@ msgstr "ユーザー %s がパスワードを閲覧/導き出しました" #: accounts/templates/accounts/push_account_report.html:78 #: accounts/templates/accounts/push_account_report.html:118 #: acls/serializers/base.py:130 assets/models/asset/common.py:102 -#: assets/models/asset/common.py:366 assets/models/cmd_filter.py:36 -#: audits/models.py:59 audits/models.py:312 audits/serializers.py:228 -#: authentication/models/connection_token.py:40 +#: assets/models/asset/common.py:428 assets/models/cmd_filter.py:36 +#: audits/models.py:59 audits/models.py:312 audits/serializers.py:230 +#: authentication/models/connection_token.py:41 #: perms/models/asset_permission.py:69 terminal/backends/command/models.py:17 #: terminal/models/session/session.py:34 terminal/notifications.py:156 #: terminal/serializers/command.py:17 terminal/serializers/session.py:30 @@ -469,10 +444,10 @@ msgid "Asset" msgstr "資産" #: accounts/models/account.py:89 accounts/models/template.py:16 -#: accounts/serializers/account/account.py:233 -#: accounts/serializers/account/account.py:284 +#: accounts/serializers/account/account.py:234 +#: accounts/serializers/account/account.py:286 #: accounts/serializers/account/template.py:35 -#: authentication/serializers/connect_token_secret.py:50 +#: authentication/serializers/connect_token_secret.py:51 msgid "Su from" msgstr "から切り替え" @@ -505,7 +480,7 @@ msgstr "" "新发现 - 新たな発見 \n" "组变更 - グループ変更" -#: accounts/models/account.py:97 accounts/serializers/account/account.py:228 +#: accounts/models/account.py:97 accounts/serializers/account/account.py:229 #: users/models/user/__init__.py:122 msgid "Source" msgstr "ソース" @@ -532,14 +507,14 @@ msgstr "変更状態" #: accounts/models/account.py:107 #: accounts/models/automations/check_account.py:64 -#: accounts/serializers/account/service.py:11 +#: accounts/serializers/account/service.py:12 #: accounts/serializers/automations/change_secret.py:115 #: accounts/serializers/automations/change_secret.py:146 #: accounts/templates/accounts/change_secret_failed_info.html:12 #: acls/serializers/base.py:131 #: acls/templates/acls/asset_login_reminder.html:10 #: assets/serializers/gateway.py:33 audits/models.py:60 audits/models.py:313 -#: audits/serializers.py:229 authentication/api/connection_token.py:464 +#: audits/serializers.py:231 authentication/api/connection_token.py:463 #: ops/models/base.py:18 perms/models/asset_permission.py:75 #: settings/serializers/msg.py:33 terminal/backends/command/models.py:18 #: terminal/models/session/session.py:36 terminal/serializers/command.py:72 @@ -576,29 +551,31 @@ msgstr "アカウントを削除できます" #: accounts/models/application.py:16 #: accounts/models/automations/check_account.py:116 accounts/models/base.py:63 -#: accounts/serializers/account/service.py:27 +#: accounts/serializers/account/service.py:28 #: accounts/serializers/account/virtual.py:20 acls/models/base.py:35 #: acls/models/base.py:96 acls/models/command_acl.py:21 #: acls/serializers/base.py:35 assets/models/asset/common.py:100 #: assets/models/asset/common.py:166 assets/models/cmd_filter.py:21 #: assets/models/domain.py:19 assets/models/label.py:18 #: assets/models/platform.py:15 assets/models/platform.py:94 -#: assets/serializers/asset/common.py:171 assets/serializers/platform.py:158 -#: assets/serializers/platform.py:278 +#: assets/serializers/asset/common.py:173 assets/serializers/platform.py:158 +#: assets/serializers/platform.py:283 #: authentication/backends/passkey/models.py:10 #: authentication/models/ssh_key.py:12 -#: authentication/serializers/connect_token_secret.py:113 -#: authentication/serializers/connect_token_secret.py:170 labels/models.py:11 +#: authentication/serializers/connect_token_secret.py:115 +#: authentication/serializers/connect_token_secret.py:172 labels/models.py:11 #: ops/mixin.py:32 ops/models/adhoc.py:19 ops/models/celery.py:15 -#: ops/models/celery.py:81 ops/models/job.py:145 ops/models/playbook.py:28 +#: ops/models/celery.py:81 ops/models/job.py:147 ops/models/playbook.py:28 #: ops/models/variable.py:9 ops/serializers/job.py:20 #: ops/serializers/variable.py:20 orgs/models.py:82 #: perms/models/asset_permission.py:61 rbac/models/role.py:29 #: rbac/serializers/role.py:28 settings/models.py:37 settings/models.py:186 #: settings/serializers/msg.py:89 settings/serializers/terminal.py:9 -#: terminal/models/applet/applet.py:34 terminal/models/component/endpoint.py:13 -#: terminal/models/component/endpoint.py:112 -#: terminal/models/component/storage.py:26 terminal/models/component/task.py:13 +#: terminal/models/applet/applet.py:34 +#: terminal/models/component/endpoint.py:13 +#: terminal/models/component/endpoint.py:106 +#: terminal/models/component/storage.py:26 +#: terminal/models/component/task.py:13 #: terminal/models/component/terminal.py:86 #: terminal/models/virtualapp/provider.py:10 #: terminal/models/virtualapp/virtualapp.py:19 tickets/api/ticket.py:87 @@ -624,30 +601,33 @@ msgstr "ひみつ" #: accounts/models/application.py:21 acls/models/base.py:98 #: assets/models/automations/base.py:22 assets/models/cmd_filter.py:38 #: assets/serializers/asset/common.py:148 -#: assets/serializers/asset/common.py:420 perms/serializers/permission.py:66 -#: perms/serializers/user_permission.py:75 rbac/tree.py:35 +#: assets/serializers/asset/common.py:423 perms/serializers/permission.py:66 +#: perms/serializers/user_permission.py:76 rbac/tree.py:35 msgid "Accounts" msgstr "アカウント" #: accounts/models/application.py:22 authentication/models/access_key.py:20 -#: terminal/models/component/endpoint.py:113 +#: terminal/models/component/endpoint.py:107 msgid "IP group" msgstr "IP グループ" #: accounts/models/application.py:23 #: authentication/backends/passkey/models.py:14 #: authentication/models/access_key.py:24 -#: authentication/models/private_token.py:8 authentication/models/ssh_key.py:20 +#: authentication/models/private_token.py:8 +#: authentication/models/ssh_key.py:20 msgid "Date last used" msgstr "最後に使用した日付" #: accounts/models/application.py:24 acls/models/base.py:43 -#: assets/models/asset/common.py:178 authentication/models/access_key.py:23 -#: authentication/models/connection_token.py:58 -#: authentication/models/ssh_key.py:13 authentication/serializers/ssh_key.py:23 +#: assets/models/asset/common.py:182 authentication/models/access_key.py:23 +#: authentication/models/connection_token.py:59 +#: authentication/models/ssh_key.py:13 +#: authentication/serializers/ssh_key.py:23 #: authentication/templates/authentication/_access_key_modal.html:32 -#: perms/models/asset_permission.py:82 terminal/models/component/endpoint.py:28 -#: terminal/models/component/endpoint.py:123 +#: perms/models/asset_permission.py:82 +#: terminal/models/component/endpoint.py:29 +#: terminal/models/component/endpoint.py:117 #: terminal/models/session/sharing.py:29 terminal/serializers/terminal.py:44 #: tickets/const.py:36 msgid "Active" @@ -748,8 +728,8 @@ msgstr "変更後に接続を確認" #: accounts/models/automations/check_account.py:19 #: accounts/models/automations/gather_account.py:117 #: accounts/serializers/automations/change_secret.py:59 -#: settings/serializers/auth/ldap.py:101 -#: settings/serializers/auth/ldap_ha.py:84 settings/serializers/msg.py:45 +#: settings/serializers/auth/ldap.py:105 +#: settings/serializers/auth/ldap_ha.py:87 settings/serializers/msg.py:45 msgid "Recipient" msgstr "受信者" @@ -759,7 +739,7 @@ msgstr "自動暗号化" #: accounts/models/automations/change_secret.py:47 #: assets/models/automations/base.py:145 ops/models/base.py:56 -#: ops/models/celery.py:90 ops/models/job.py:240 +#: ops/models/celery.py:90 ops/models/job.py:242 #: terminal/models/applet/host.py:142 msgid "Date finished" msgstr "終了日" @@ -770,11 +750,11 @@ msgstr "終了日" #: accounts/serializers/automations/check_account.py:39 #: assets/models/automations/base.py:137 #: assets/serializers/automations/base.py:45 audits/models.py:209 -#: audits/serializers.py:78 ops/models/base.py:49 ops/models/job.py:231 -#: terminal/models/applet/applet.py:331 terminal/models/applet/host.py:140 +#: audits/serializers.py:77 ops/models/base.py:49 ops/models/job.py:233 +#: terminal/models/applet/applet.py:372 terminal/models/applet/host.py:140 #: terminal/models/component/status.py:30 #: terminal/models/virtualapp/virtualapp.py:99 -#: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:148 +#: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:163 #: terminal/serializers/virtualapp.py:35 tickets/models/ticket/general.py:284 #: tickets/serializers/super_ticket.py:13 #: tickets/serializers/ticket/ticket.py:20 xpack/plugins/cloud/models.py:227 @@ -783,7 +763,7 @@ msgid "Status" msgstr "ステータス" #: accounts/models/automations/change_secret.py:51 -#: accounts/serializers/account/account.py:276 +#: accounts/serializers/account/account.py:278 #: accounts/templates/accounts/change_secret_failed_info.html:13 #: assets/const/automation.py:9 #: authentication/templates/authentication/passkey.html:173 @@ -834,8 +814,6 @@ msgid "New found" msgstr "新しい発見" #: accounts/models/automations/check_account.py:45 -#, fuzzy -#| msgid "Account delete" msgid "Account deleted" msgstr "アカウントは削除されました" @@ -884,9 +862,11 @@ msgstr "パスワードの重複" #: accounts/templates/accounts/gather_account_report.html:118 #: accounts/templates/accounts/push_account_report.html:79 #: accounts/templates/accounts/push_account_report.html:119 -#: acls/serializers/base.py:19 acls/serializers/base.py:50 audits/models.py:189 -#: authentication/forms.py:21 authentication/forms.py:23 +#: acls/serializers/base.py:19 acls/serializers/base.py:50 +#: audits/models.py:189 authentication/forms.py:21 authentication/forms.py:23 #: authentication/models/temp_token.py:9 +#: authentication/serializers/connect_token_secret.py:43 +#: authentication/serializers/connect_token_secret.py:53 #: authentication/templates/authentication/_msg_different_city.html:9 #: authentication/templates/authentication/_msg_oauth_bind.html:9 #: authentication/templates/authentication/login.html:408 @@ -923,9 +903,7 @@ msgstr "確認されたアカウント" msgid "" "Perform checks and analyses based on automatically discovered account " "results, including user groups, public keys, sudoers, and other information" -msgstr "" -"自動発見されたアカウントの結果に基づいてチェック分析を行います。これには、" -"ユーザーグループ、公開鍵、sudoersなどの情報が含まれます。" +msgstr "自動発見されたアカウントの結果に基づいてチェック分析を行います。これには、ユーザーグループ、公開鍵、sudoersなどの情報が含まれます。" #: accounts/models/automations/check_account.py:137 msgid "Check the strength of your account and password" @@ -935,9 +913,7 @@ msgstr "あなたのアカウントとパスワードの強度をチェックし msgid "" "Perform checks and analyses based on the security of account passwords, " "including password strength, leakage, etc." -msgstr "" -"アカウントパスワードの安全性に対するチェック分析を行います。これには、パス" -"ワードの強度や漏洩状況などが含まれます。" +msgstr "アカウントパスワードの安全性に対するチェック分析を行います。これには、パスワードの強度や漏洩状況などが含まれます。" #: accounts/models/automations/check_account.py:146 msgid "Check if the account and password are repeated" @@ -953,8 +929,7 @@ msgstr "アカウントのパスワードが一般的なパスワードでない #: accounts/models/automations/check_account.py:153 msgid "Check whether the account password is a commonly leaked password" -msgstr "" -"アカウントのパスワードが広く知られている漏洩パスワードでないか確認します。" +msgstr "アカウントのパスワードが広く知られている漏洩パスワードでないか確認します。" #: accounts/models/automations/gather_account.py:19 msgid "Address login" @@ -1009,11 +984,11 @@ msgid "Verify asset account" msgstr "アカウントの確認" #: accounts/models/base.py:37 accounts/models/base.py:66 -#: accounts/serializers/account/account.py:470 +#: accounts/serializers/account/account.py:471 #: accounts/serializers/account/base.py:17 #: accounts/serializers/automations/change_secret.py:48 #: authentication/serializers/connect_token_secret.py:42 -#: authentication/serializers/connect_token_secret.py:51 +#: authentication/serializers/connect_token_secret.py:52 #: terminal/serializers/storage.py:140 msgid "Secret type" msgstr "鍵の種類" @@ -1030,7 +1005,7 @@ msgstr "パスワードルール" #: accounts/models/base.py:69 assets/models/automations/base.py:28 #: assets/models/cmd_filter.py:39 assets/models/label.py:22 -#: authentication/serializers/connect_token_secret.py:117 +#: authentication/serializers/connect_token_secret.py:119 #: terminal/models/applet/applet.py:41 #: terminal/models/virtualapp/virtualapp.py:23 users/serializers/user.py:257 msgid "Is active" @@ -1074,8 +1049,7 @@ msgstr "ユーザーと同じユーザー名" #: accounts/models/virtual.py:37 msgid "Non-asset account, Input username/password on connect" -msgstr "" -"アセットアカウントではない場合、接続時にユーザー名/パスワードを入力します" +msgstr "アセットアカウントではない場合、接続時にユーザー名/パスワードを入力します" #: accounts/models/virtual.py:38 msgid "The account username name same with user on connect" @@ -1085,9 +1059,7 @@ msgstr "接続時にユーザー名と同じユーザー名を使用します" msgid "" "Connect asset without using a username and password, and it only supports " "web-based and custom-type assets" -msgstr "" -"ユーザー名とパスワードを使用せずにアセットに接続します。Webベースとカスタムタ" -"イプのアセットのみをサポートします" +msgstr "ユーザー名とパスワードを使用せずにアセットに接続します。Webベースとカスタムタイプのアセットのみをサポートします" #: accounts/notifications.py:12 accounts/notifications.py:37 msgid "Notification of account backup route task results" @@ -1097,9 +1069,7 @@ msgstr "アカウントバックアップルートタスクの結果の通知" msgid "" "{} - The account backup passage task has been completed. See the attachment " "for details" -msgstr "" -"{} -アカウントバックアップの通過タスクが完了しました。詳細は添付ファイルをご" -"覧ください" +msgstr "{} -アカウントバックアップの通過タスクが完了しました。詳細は添付ファイルをご覧ください" #: accounts/notifications.py:25 msgid "" @@ -1107,9 +1077,8 @@ msgid "" "password has not been set - please go to personal information -> Basic file " "encryption password for preference settings" msgstr "" -"{} -アカウントのバックアップ通過タスクが完了しました: 暗号化パスワードが設定" -"されていません-個人情報にアクセスしてください-> プリファレンス設定の基本的な" -"ファイル暗号化パスワードの設定" +"{} -アカウントのバックアップ通過タスクが完了しました: 暗号化パスワードが設定されていません-個人情報にアクセスしてください-> " +"プリファレンス設定の基本的なファイル暗号化パスワードの設定" #: accounts/notifications.py:56 msgid "Notification of implementation result of encryption change plan" @@ -1127,8 +1096,7 @@ msgid "" "has not been set - please go to personal information -> set encryption " "password in preferences" msgstr "" -"{} -暗号化変更タスクが完了しました: 暗号化パスワードが設定されていません-個人" -"情報にアクセスしてください-> 環境設定で暗号化パスワードを設定する" +"{} -暗号化変更タスクが完了しました: 暗号化パスワードが設定されていません-個人情報にアクセスしてください-> 環境設定で暗号化パスワードを設定する" #: accounts/notifications.py:83 msgid "Gather account change information" @@ -1146,7 +1114,7 @@ msgstr "無視する" msgid "Reopen" msgstr "再オープン" -#: accounts/risk_handlers.py:19 audits/const.py:38 +#: accounts/risk_handlers.py:19 audits/const.py:39 #: authentication/templates/authentication/_access_key_modal.html:155 #: authentication/templates/authentication/_mfa_confirm_modal.html:53 #: templates/_modal.html:22 tickets/const.py:43 @@ -1174,15 +1142,13 @@ msgstr "アカウントを追加する" msgid "Change password and Add" msgstr "パスワードを変更して追加する" -#: accounts/risk_handlers.py:26 audits/const.py:31 ops/const.py:9 +#: accounts/risk_handlers.py:26 audits/const.py:32 ops/const.py:9 msgid "Change password" msgstr "パスワードを変更する" #: accounts/risk_handlers.py:127 -#, fuzzy -#| msgid "Test connection failed: {}" msgid "Execution failed: {}" -msgstr "テスト接続に失敗しました: {}" +msgstr "実行失敗:{}" #: accounts/serializers/account/account.py:31 msgid "Push now" @@ -1199,7 +1165,7 @@ msgstr "アカウントの存在ポリシー" #: accounts/serializers/account/account.py:206 assets/models/label.py:21 #: assets/models/platform.py:95 assets/serializers/asset/common.py:145 #: assets/serializers/cagegory.py:12 assets/serializers/platform.py:173 -#: assets/serializers/platform.py:279 perms/serializers/user_permission.py:26 +#: assets/serializers/platform.py:284 perms/serializers/user_permission.py:26 #: settings/models.py:39 tickets/models/ticket/apply_application.py:13 #: users/models/preference.py:12 msgid "Category" @@ -1210,11 +1176,11 @@ msgstr "カテゴリ" #: assets/models/automations/base.py:146 assets/models/cmd_filter.py:74 #: assets/models/platform.py:96 assets/serializers/asset/common.py:146 #: assets/serializers/platform.py:160 assets/serializers/platform.py:172 -#: audits/serializers.py:77 audits/serializers.py:194 -#: authentication/models/connection_token.py:62 -#: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:153 -#: perms/serializers/user_permission.py:27 terminal/models/applet/applet.py:40 -#: terminal/models/component/storage.py:58 +#: audits/serializers.py:76 audits/serializers.py:196 +#: authentication/models/connection_token.py:63 +#: authentication/serializers/connect_token_secret.py:128 +#: ops/models/job.py:155 perms/serializers/user_permission.py:27 +#: terminal/models/applet/applet.py:40 terminal/models/component/storage.py:58 #: terminal/models/component/storage.py:152 terminal/serializers/applet.py:29 #: terminal/serializers/session.py:25 terminal/serializers/storage.py:281 #: terminal/serializers/storage.py:294 tickets/models/comment.py:26 @@ -1224,66 +1190,73 @@ msgstr "カテゴリ" msgid "Type" msgstr "タイプ" -#: accounts/serializers/account/account.py:222 +#: accounts/serializers/account/account.py:223 msgid "Asset not found" msgstr "資産が存在しません" -#: accounts/serializers/account/account.py:265 +#: accounts/serializers/account/account.py:236 assets/const/category.py:15 +#: assets/models/asset/common.py:180 assets/models/asset/ds.py:14 +#: assets/serializers/asset/common.py:180 +msgid "Directory service" +msgstr "ディレクトリサービス" + +#: accounts/serializers/account/account.py:267 msgid "Has secret" msgstr "エスクローされたパスワード" -#: accounts/serializers/account/account.py:275 ops/models/celery.py:84 +#: accounts/serializers/account/account.py:277 ops/models/celery.py:84 #: tickets/models/comment.py:13 tickets/models/ticket/general.py:49 #: tickets/models/ticket/general.py:280 tickets/serializers/super_ticket.py:14 msgid "State" msgstr "状態" -#: accounts/serializers/account/account.py:277 +#: accounts/serializers/account/account.py:279 msgid "Changed" msgstr "編集済み" -#: accounts/serializers/account/account.py:287 acls/models/base.py:97 +#: accounts/serializers/account/account.py:289 acls/models/base.py:97 #: acls/templates/acls/asset_login_reminder.html:9 #: assets/models/automations/base.py:25 -#: assets/serializers/automations/base.py:20 assets/serializers/domain.py:34 +#: assets/serializers/automations/base.py:20 assets/serializers/domain.py:33 #: assets/serializers/platform.py:181 assets/serializers/platform.py:213 -#: authentication/api/connection_token.py:463 ops/models/base.py:17 -#: ops/models/job.py:155 ops/serializers/job.py:21 +#: authentication/api/connection_token.py:462 ops/models/base.py:17 +#: ops/models/job.py:157 ops/serializers/job.py:21 #: perms/serializers/permission.py:57 #: terminal/templates/terminal/_msg_command_execute_alert.html:16 #: xpack/plugins/cloud/manager.py:93 msgid "Assets" msgstr "資産" -#: accounts/serializers/account/account.py:392 +#: accounts/serializers/account/account.py:394 #, python-format msgid "Asset does not support this secret type: %s" msgstr "アセットはアカウント タイプをサポートしていません: %s" -#: accounts/serializers/account/account.py:424 +#: accounts/serializers/account/account.py:426 msgid "Account has exist" msgstr "アカウントはすでに存在しています" -#: accounts/serializers/account/account.py:461 +#: accounts/serializers/account/account.py:463 #: accounts/serializers/account/base.py:86 #: accounts/serializers/account/template.py:66 -#: assets/serializers/asset/common.py:421 +#: assets/serializers/asset/common.py:424 msgid "Spec info" msgstr "特別情報" -#: accounts/serializers/account/account.py:471 -#: authentication/serializers/connect_token_secret.py:160 +#: accounts/serializers/account/account.py:472 +#: authentication/serializers/connect_token_secret.py:162 #: authentication/templates/authentication/_access_key_modal.html:30 #: perms/models/perm_node.py:21 users/serializers/group.py:33 msgid "ID" msgstr "ID" -#: accounts/serializers/account/account.py:481 acls/serializers/base.py:123 +#: accounts/serializers/account/account.py:482 acls/serializers/base.py:123 #: acls/templates/acls/asset_login_reminder.html:8 #: acls/templates/acls/user_login_reminder.html:8 -#: assets/models/cmd_filter.py:24 assets/models/label.py:16 audits/models.py:55 -#: audits/models.py:91 audits/models.py:173 audits/models.py:272 -#: audits/serializers.py:195 authentication/models/connection_token.py:36 +#: assets/models/cmd_filter.py:24 assets/models/label.py:16 +#: audits/models.py:55 audits/models.py:91 audits/models.py:173 +#: audits/models.py:272 audits/serializers.py:197 +#: authentication/models/connection_token.py:37 #: authentication/models/ssh_key.py:22 authentication/models/sso_token.py:16 #: notifications/models/notification.py:12 #: perms/api/user_permission/mixin.py:58 perms/models/asset_permission.py:63 @@ -1300,7 +1273,7 @@ msgstr "ID" msgid "User" msgstr "ユーザー" -#: accounts/serializers/account/account.py:482 +#: accounts/serializers/account/account.py:483 #: authentication/templates/authentication/_access_key_modal.html:33 #: terminal/notifications.py:159 terminal/notifications.py:219 msgid "Date" @@ -1315,22 +1288,21 @@ msgid "" "* If no username is required for authentication, enter null. For AD " "accounts, use the format username@domain." msgstr "" -"ヒント: 認証にユーザー名が必要ない場合は、`null`を入力します。ADアカウントの" -"場合は、`username@domain`のようになります。" +"ヒント: 認証にユーザー名が必要ない場合は、`null`を入力します。ADアカウントの場合は、`username@domain`のようになります。" -#: accounts/serializers/account/service.py:13 +#: accounts/serializers/account/service.py:14 #: authentication/serializers/token.py:22 msgid "Access IP" msgstr "Access IP" -#: accounts/serializers/account/service.py:26 +#: accounts/serializers/account/service.py:27 #: accounts/serializers/account/virtual.py:19 assets/models/cmd_filter.py:40 -#: assets/models/cmd_filter.py:88 common/db/models.py:36 ops/models/adhoc.py:25 -#: ops/models/job.py:163 ops/models/playbook.py:31 rbac/models/role.py:37 -#: settings/models.py:42 terminal/models/applet/applet.py:46 -#: terminal/models/applet/applet.py:332 terminal/models/applet/host.py:143 -#: terminal/models/component/endpoint.py:27 -#: terminal/models/component/endpoint.py:122 +#: assets/models/cmd_filter.py:88 common/db/models.py:36 +#: ops/models/adhoc.py:25 ops/models/job.py:165 ops/models/playbook.py:31 +#: rbac/models/role.py:37 settings/models.py:42 +#: terminal/models/applet/applet.py:46 terminal/models/applet/applet.py:373 +#: terminal/models/applet/host.py:143 terminal/models/component/endpoint.py:28 +#: terminal/models/component/endpoint.py:116 #: terminal/models/session/session.py:49 #: terminal/models/virtualapp/virtualapp.py:28 tickets/models/comment.py:32 #: tickets/models/ticket/general.py:298 users/models/user/__init__.py:94 @@ -1338,9 +1310,9 @@ msgstr "Access IP" msgid "Comment" msgstr "コメント" -#: accounts/serializers/account/service.py:28 +#: accounts/serializers/account/service.py:29 #: accounts/templates/accounts/backup_account_report.html:33 -#: assets/serializers/asset/common.py:151 +#: assets/serializers/asset/common.py:152 msgid "Accounts amount" msgstr "アカウント数" @@ -1375,21 +1347,17 @@ msgid "" "length is the length of the password, and the range is 8 to 30.\n" "lowercase indicates whether the password contains lowercase letters, \n" "uppercase indicates whether it contains uppercase letters,\n" -"digit indicates whether it contains numbers, and symbol indicates whether it " -"contains special symbols.\n" -"exclude_symbols is used to exclude specific symbols. You can fill in the " -"symbol characters to be excluded (up to 16). \n" +"digit indicates whether it contains numbers, and symbol indicates whether it contains special symbols.\n" +"exclude_symbols is used to exclude specific symbols. You can fill in the symbol characters to be excluded (up to 16). \n" "If you do not need to exclude symbols, you can leave it blank.\n" -"default: {\"length\": 16, \"lowercase\": true, \"uppercase\": true, " -"\"digit\": true, \"symbol\": true, \"exclude_symbols\": \"\"}" +"default: {\"length\": 16, \"lowercase\": true, \"uppercase\": true, \"digit\": true, \"symbol\": true, \"exclude_symbols\": \"\"}" msgstr "" -"length はパスワードの長さで、範囲は 8 ~ 30 です。小文字はパスワードに小文字" -"が含まれるかどうかを示し、大文字はパスワードに大文字が含まれるかどうかを示し" -"ます。digit は数字が含まれているかどうかを示し、symbol は特殊記号が含まれてい" -"るかどうかを示します。exclude_symbols は、特定のシンボルを除外するために使用" -"します (最大 16 文字)。シンボルを除外する必要がない場合は、空白のままにするこ" -"とができます。デフォルト: {\"長さ\": 16、\"小文字\": true、\"大文字\": " -"true、\"数字\": true、\"シンボル\": true、\"exclude_symbols\": \"\"}" +"length はパスワードの長さで、範囲は 8 ~ 30 " +"です。小文字はパスワードに小文字が含まれるかどうかを示し、大文字はパスワードに大文字が含まれるかどうかを示します。digit " +"は数字が含まれているかどうかを示し、symbol は特殊記号が含まれているかどうかを示します。exclude_symbols " +"は、特定のシンボルを除外するために使用します (最大 16 文字)。シンボルを除外する必要がない場合は、空白のままにすることができます。デフォルト: " +"{\"長さ\": 16、\"小文字\": true、\"大文字\": true、\"数字\": true、\"シンボル\": " +"true、\"exclude_symbols\": \"\"}" #: accounts/serializers/account/template.py:47 msgid "Secret generation strategy for account creation" @@ -1411,10 +1379,8 @@ msgid "" "asset secret > Login secret > Manual input.
For security, please set " "config CACHE_LOGIN_PASSWORD_ENABLED to true" msgstr "" -"現在、AD/LDAPからのログインのみをサポートしています。シークレットの優先順位: " -"資産シークレット内の同じアカウント > ログインシークレット > 手動入力.
" -"セキュリティのために、「config CACHE_LOGIN_PASSWORD_ENABLED」をtrueに設定して" -"ください。 " +"現在、AD/LDAPからのログインのみをサポートしています。シークレットの優先順位: 資産シークレット内の同じアカウント > ログインシークレット > " +"手動入力.
セキュリティのために、「config CACHE_LOGIN_PASSWORD_ENABLED」をtrueに設定してください。 " #: accounts/serializers/automations/backup.py:18 msgid "Zip Encrypt Password" @@ -1456,8 +1422,7 @@ msgstr "実行前通知" msgid "" "Secret parameter settings, currently only effective for assets of the host " "type." -msgstr "" -"パラメータ設定は現在、AIX LINUX UNIX タイプの資産に対してのみ有効です。" +msgstr "パラメータ設定は現在、AIX LINUX UNIX タイプの資産に対してのみ有効です。" #: accounts/serializers/automations/change_secret.py:86 msgid "* Please enter the correct password length" @@ -1484,9 +1449,7 @@ msgstr "エンジンIDが無効です" #: accounts/serializers/automations/gather_account.py:31 msgid "Whether to check the risk of the gathered accounts." -msgstr "" -"集約されたアカウントに対してリスクチェックが行われるかどうか確認してくださ" -"い。" +msgstr "集約されたアカウントに対してリスクチェックが行われるかどうか確認してください。" #: accounts/signal_handlers.py:43 #, python-format @@ -1509,16 +1472,11 @@ msgstr "アカウント実行の自動化" #: accounts/tasks/automation.py:35 msgid "" -"Unified execution entry for account automation tasks: when the system " -"performs tasks \n" -" such as account push, password change, account verification, account " -"collection, \n" -" and gateway account verification, all tasks are executed through " -"this unified entry" +"Unified execution entry for account automation tasks: when the system performs tasks \n" +" such as account push, password change, account verification, account collection, \n" +" and gateway account verification, all tasks are executed through this unified entry" msgstr "" -"アカウント自動化タスクの一元的な実行入口で、システムがアカウントのプッシュ、" -"パスワードの変更、アカウントの確認、アカウントの収集、ゲートウェイアカウント" -"のバリデーションタスクを実行する際、統一して現行のタスクを実行します" +"アカウント自動化タスクの一元的な実行入口で、システムがアカウントのプッシュ、パスワードの変更、アカウントの確認、アカウントの収集、ゲートウェイアカウントのバリデーションタスクを実行する際、統一して現行のタスクを実行します" #: accounts/tasks/automation.py:64 accounts/tasks/automation.py:72 msgid "Execute automation record" @@ -1534,30 +1492,18 @@ msgstr "パスワード変更記録とプッシュ記録を定期的にクリア #: accounts/tasks/automation.py:98 msgid "" -"The system will periodically clean up unnecessary password change and push " -"records, \n" -" including their associated change tasks, execution logs, assets, and " -"accounts. When any \n" -" of these associated items are deleted, the corresponding password " -"change and push records \n" -" become invalid. Therefore, to maintain a clean and efficient " -"database, the system will \n" -" clean up expired records at 2 a.m daily, based on the interval " -"specified by \n" -" PERM_EXPIRED_CHECK_PERIODIC in the config.txt configuration file. " -"This periodic cleanup \n" -" mechanism helps free up storage space and enhances the security and " -"overall performance \n" +"The system will periodically clean up unnecessary password change and push records, \n" +" including their associated change tasks, execution logs, assets, and accounts. When any \n" +" of these associated items are deleted, the corresponding password change and push records \n" +" become invalid. Therefore, to maintain a clean and efficient database, the system will \n" +" clean up expired records at 2 a.m daily, based on the interval specified by \n" +" PERM_EXPIRED_CHECK_PERIODIC in the config.txt configuration file. This periodic cleanup \n" +" mechanism helps free up storage space and enhances the security and overall performance \n" " of data management" msgstr "" -"システムは定期的に不要なパスワード変更記録とプッシュ記録をクリーンアップしま" -"す。これには、関連するパスワード変更タスク、実行記録、資産、アカウントが含ま" -"れます。これらの関連項目のいずれかが削除されると、対応するパスワード変更記録" -"とプッシュ記録は無効となります。したがって、データベースの整理と高速運用のた" -"めに、システム設定ファイルの config.txt の PERM_EXPIRED_CHECK_PERIODIC の時間" -"間隔に従って毎日午前2時に時間を超えた記録をクリーニングします。この定期的なク" -"リーニングメカニズムは、ストレージスペースの解放とデータ管理のセキュリティと" -"パフォーマンスの向上の両方に役立ちます" +"システムは定期的に不要なパスワード変更記録とプッシュ記録をクリーンアップします。これには、関連するパスワード変更タスク、実行記録、資産、アカウントが含まれます。これらの関連項目のいずれかが削除されると、対応するパスワード変更記録とプッシュ記録は無効となります。したがって、データベースの整理と高速運用のために、システム設定ファイルの" +" config.txt の PERM_EXPIRED_CHECK_PERIODIC " +"の時間間隔に従って毎日午前2時に時間を超えた記録をクリーニングします。この定期的なクリーニングメカニズムは、ストレージスペースの解放とデータ管理のセキュリティとパフォーマンスの向上の両方に役立ちます" #: accounts/tasks/push_account.py:16 accounts/tasks/push_account.py:27 msgid "Push accounts to assets" @@ -1567,18 +1513,13 @@ msgstr "アカウントをアセットにプッシュ:" msgid "" "When creating or modifying an account requires account push, this task is " "executed" -msgstr "" -"アカウントの作成、アカウントの変更を行う際、アカウントプッシュが必要な場合は" -"このタスクを実行します" +msgstr "アカウントの作成、アカウントの変更を行う際、アカウントプッシュが必要な場合はこのタスクを実行します" #: accounts/tasks/remove_account.py:28 msgid "" -"When clicking \"Sync deletion\" in 'Console - Gather Account - Gathered " -"accounts' this \n" +"When clicking \"Sync deletion\" in 'Console - Gather Account - Gathered accounts' this \n" " task will be executed" -msgstr "" -"コントロールパネル-オートメーション-アカウント収集-収集したアカウント-同期削" -"除をクリックすると、このタスクが実行されます" +msgstr "コントロールパネル-オートメーション-アカウント収集-収集したアカウント-同期削除をクリックすると、このタスクが実行されます" #: accounts/tasks/remove_account.py:50 msgid "Clean historical accounts" @@ -1586,18 +1527,13 @@ msgstr "過去のアカウントをクリアする" #: accounts/tasks/remove_account.py:52 msgid "" -"Each time an asset account is updated, a historical account is generated, so " -"it is \n" -" necessary to clean up the asset account history. The system will " -"clean up excess account \n" -" records at 2 a.m. daily based on the configuration in the \"System " -"settings - Features - \n" +"Each time an asset account is updated, a historical account is generated, so it is \n" +" necessary to clean up the asset account history. The system will clean up excess account \n" +" records at 2 a.m. daily based on the configuration in the \"System settings - Features - \n" " Account storage - Record limit" msgstr "" -"資産アカウントを更新するたびに、歴史的なアカウントが生成されるため、資産アカ" -"ウントの履歴をクリーニングする必要があります。システムは、アカウントストレー" -"ジ-レコード制限の設定に基づき、毎日午前2時に超過した数量のアカウントレコード" -"をクリーニングします" +"資産アカウントを更新するたびに、歴史的なアカウントが生成されるため、資産アカウントの履歴をクリーニングする必要があります。システムは、アカウントストレージ-" +"レコード制限の設定に基づき、毎日午前2時に超過した数量のアカウントレコードをクリーニングします" #: accounts/tasks/remove_account.py:89 msgid "Remove historical accounts that are out of range." @@ -1609,12 +1545,9 @@ msgstr "関連するアカウントへの情報の同期" #: accounts/tasks/template.py:14 msgid "" -"When clicking 'Sync new secret to accounts' in 'Console - Account - " -"Templates - \n" +"When clicking 'Sync new secret to accounts' in 'Console - Account - Templates - \n" " Accounts' this task will be executed" -msgstr "" -"コントロールパネル-アカウントテンプレート-アカウント-同期アカウント情報更新を" -"クリックして同期すると、このタスクが実行されます" +msgstr "コントロールパネル-アカウントテンプレート-アカウント-同期アカウント情報更新をクリックして同期すると、このタスクが実行されます" #: accounts/tasks/vault.py:33 msgid "Sync secret to vault" @@ -1624,9 +1557,7 @@ msgstr "秘密をVaultに同期する" msgid "" "When clicking 'Sync' in 'System Settings - Features - Account Storage' this " "task will be executed" -msgstr "" -"システム設定-機能設定-アカウントストレージをクリックして同期すると、このタス" -"クが実行されます" +msgstr "システム設定-機能設定-アカウントストレージをクリックして同期すると、このタスクが実行されます" #: accounts/tasks/verify_account.py:49 msgid "Verify asset account availability" @@ -1636,9 +1567,7 @@ msgstr "アセット アカウントの可用性を確認する" msgid "" "When clicking 'Test' in 'Console - Asset details - Accounts' this task will " "be executed" -msgstr "" -"コントロールパネル-資産詳細-アカウントをクリックしてテストを実行すると、この" -"タスクが実行されます" +msgstr "コントロールパネル-資産詳細-アカウントをクリックしてテストを実行すると、このタスクが実行されます" #: accounts/tasks/verify_account.py:58 msgid "Verify accounts connectivity" @@ -1672,7 +1601,7 @@ msgstr "タスク名" #: accounts/templates/accounts/gather_account_report.html:21 #: accounts/templates/accounts/push_account_report.html:22 #: assets/models/automations/base.py:143 audits/models.py:66 -#: ops/models/base.py:55 ops/models/celery.py:89 ops/models/job.py:239 +#: ops/models/base.py:55 ops/models/celery.py:89 ops/models/job.py:241 #: ops/templates/ops/celery_task_log.html:101 #: perms/models/asset_permission.py:78 settings/serializers/feature.py:27 #: settings/templates/ldap/_msg_import_ldap_user.html:5 @@ -1717,14 +1646,12 @@ msgstr "尊敬する" msgid "" "Hello! The following is the failure of changing the password of your assets " "or pushing the account. Please check and handle it in time." -msgstr "" -"こんにちは! アセットの変更またはアカウントのプッシュが失敗する状況は次のとお" -"りです。 時間内に確認して対処してください。" +msgstr "こんにちは! アセットの変更またはアカウントのプッシュが失敗する状況は次のとおりです。 時間内に確認して対処してください。" #: accounts/templates/accounts/change_secret_report.html:33 #: accounts/templates/accounts/gather_account_report.html:31 #: accounts/templates/accounts/push_account_report.html:32 -#: assets/serializers/domain.py:24 assets/serializers/platform.py:182 +#: assets/serializers/domain.py:23 assets/serializers/platform.py:182 #: orgs/serializers.py:13 perms/serializers/permission.py:61 msgid "Assets amount" msgstr "資産数量" @@ -1763,7 +1690,6 @@ msgstr "否" #: accounts/templates/accounts/change_secret_report.html:94 #: accounts/templates/accounts/change_secret_report.html:134 #: accounts/templates/accounts/gather_account_report.html:92 -#: accounts/templates/accounts/gather_account_report.html:132 #: accounts/templates/accounts/push_account_report.html:93 #: accounts/templates/accounts/push_account_report.html:133 msgid "No new accounts found" @@ -1792,12 +1718,15 @@ msgstr "新たに発見されたアカウント" msgid "Lost accounts" msgstr "失われたアカウント" +#: accounts/templates/accounts/gather_account_report.html:132 +msgid "No lost accounts found" +msgstr "失われたアカウントが見つかりません" + #: accounts/utils.py:54 msgid "" -"If the password starts with {{` and ends with }} `, then the password is not " -"allowed." -msgstr "" -"パスワードが`{{`で始まり、`}}`で終わる場合、パスワードは許可されません。" +"If the password starts with {{` and ends with }} `, then the password is not" +" allowed." +msgstr "パスワードが`{{`で始まり、`}}`で終わる場合、パスワードは許可されません。" #: accounts/utils.py:62 msgid "private key invalid or passphrase error" @@ -1807,16 +1736,16 @@ msgstr "秘密鍵が無効またはpassphraseエラー" msgid "App Acls" msgstr "Acls" -#: acls/const.py:6 audits/const.py:36 terminal/const.py:11 tickets/const.py:44 +#: acls/const.py:6 audits/const.py:37 terminal/const.py:11 tickets/const.py:44 #: tickets/templates/tickets/approve_check_password.html:47 msgid "Reject" msgstr "拒否" -#: acls/const.py:7 audits/const.py:33 terminal/const.py:9 +#: acls/const.py:7 audits/const.py:34 terminal/const.py:9 msgid "Accept" msgstr "受け入れられる" -#: acls/const.py:8 audits/const.py:34 +#: acls/const.py:8 audits/const.py:35 msgid "Review" msgstr "レビュー担当者" @@ -1829,7 +1758,7 @@ msgid "Notify" msgstr "通知する" #: acls/const.py:11 -msgid "Notify and warn" +msgid "Prompt and warn" msgstr "プロンプトと警告" #: acls/const.py:12 @@ -1841,18 +1770,19 @@ msgid "Face Online" msgstr "顔オンライン" #: acls/models/base.py:37 assets/models/cmd_filter.py:76 -#: terminal/models/component/endpoint.py:115 xpack/plugins/cloud/models.py:316 +#: terminal/models/component/endpoint.py:109 xpack/plugins/cloud/models.py:316 msgid "Priority" msgstr "優先順位" #: acls/models/base.py:38 assets/models/cmd_filter.py:76 -#: terminal/models/component/endpoint.py:116 xpack/plugins/cloud/models.py:317 +#: terminal/models/component/endpoint.py:110 xpack/plugins/cloud/models.py:317 msgid "1-100, the lower the value will be match first" msgstr "1-100、低い値は最初に一致します" #: acls/models/base.py:41 acls/serializers/base.py:57 -#: assets/models/cmd_filter.py:81 audits/models.py:93 audits/serializers.py:108 -#: authentication/serializers/connect_token_secret.py:119 +#: assets/models/cmd_filter.py:81 audits/models.py:93 +#: audits/serializers.py:107 +#: authentication/serializers/connect_token_secret.py:121 #: authentication/templates/authentication/_access_key_modal.html:34 #: perms/serializers/permission.py:63 perms/serializers/permission.py:85 #: tickets/serializers/ticket/ticket.py:21 @@ -1860,7 +1790,7 @@ msgid "Action" msgstr "アクション" #: acls/models/base.py:42 assets/models/cmd_filter.py:86 -#: authentication/serializers/connect_token_secret.py:91 +#: authentication/serializers/connect_token_secret.py:93 msgid "Reviewers" msgstr "レビュー担当者" @@ -1871,7 +1801,7 @@ msgid "Users" msgstr "ユーザー" #: acls/models/command_acl.py:16 assets/models/cmd_filter.py:60 -#: audits/serializers.py:38 ops/serializers/job.py:92 terminal/const.py:88 +#: ops/serializers/job.py:92 terminal/const.py:88 #: terminal/models/session/session.py:45 terminal/serializers/command.py:18 #: terminal/templates/terminal/_msg_command_alert.html:12 #: terminal/templates/terminal/_msg_command_execute_alert.html:10 @@ -1900,7 +1830,7 @@ msgstr "家を無視する" #: acls/models/command_acl.py:33 acls/models/command_acl.py:97 #: acls/serializers/command_acl.py:29 -#: authentication/serializers/connect_token_secret.py:88 +#: authentication/serializers/connect_token_secret.py:90 #: terminal/templates/terminal/_msg_command_warning.html:14 msgid "Command group" msgstr "コマンドグループ" @@ -1965,9 +1895,9 @@ msgid "" "10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64 (Domain name " "support)" msgstr "" -"* はすべて一致することを示します。例: 192.168.10.1、192.168.1.0/24、" -"10.1.1.1-10.1.1.20、2001:db8:2de::e13、2001:db8:1a:1110:::/64 (ドメイン名サ" -"ポート)" +"* はすべて一致することを示します。例: " +"192.168.10.1、192.168.1.0/24、10.1.1.1-10.1.1.20、2001:db8:2de::e13、2001:db8:1a:1110:::/64" +" (ドメイン名サポート)" #: acls/serializers/base.py:41 assets/serializers/asset/host.py:19 msgid "IP/Host" @@ -1995,14 +1925,14 @@ msgid "" "With * indicating a match all. Such as: 192.168.10.1, 192.168.1.0/24, " "10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64 " msgstr "" -"* はすべて一致することを示します。例: 192.168.10.1、192.168.1.0/24、" -"10.1.1.1-10.1.1.20、2001:db8:2de::e13、2001:db8:1a:1110::/64" +"* はすべて一致することを示します。例: " +"192.168.10.1、192.168.1.0/24、10.1.1.1-10.1.1.20、2001:db8:2de::e13、2001:db8:1a:1110::/64" #: acls/serializers/rules/rules.py:33 #: authentication/templates/authentication/_msg_oauth_bind.html:12 #: authentication/templates/authentication/_msg_rest_password_success.html:8 #: authentication/templates/authentication/_msg_rest_public_key_success.html:8 -#: common/drf/renders/base.py:150 xpack/plugins/cloud/models.py:393 +#: common/drf/renders/base.py:152 xpack/plugins/cloud/models.py:393 msgid "IP" msgstr "IP" @@ -2036,9 +1966,7 @@ msgid "" "the asset. If you did not authorize this login or if you notice any " "suspicious activity, please take the necessary actions immediately." msgstr "" -"資産のセキュリティと適切な使用を確保するために、ログイン活動を確認してくださ" -"い。このログインを承認していない場合や、不審な活動に気付いた場合は、直ちに必" -"要な措置を講じてください。" +"資産のセキュリティと適切な使用を確保するために、ログイン活動を確認してください。このログインを承認していない場合や、不審な活動に気付いた場合は、直ちに必要な措置を講じてください。" #: acls/templates/acls/asset_login_reminder.html:16 #: acls/templates/acls/user_login_reminder.html:16 @@ -2061,17 +1989,15 @@ msgid "Login city" msgstr "ログイン都市" #: acls/templates/acls/user_login_reminder.html:11 audits/models.py:198 -#: audits/models.py:267 audits/serializers.py:92 +#: audits/models.py:267 audits/serializers.py:91 msgid "User agent" msgstr "ユーザーエージェント" -#: assets/api/asset/asset.py:194 +#: assets/api/asset/asset.py:153 msgid "Cannot create asset directly, you should create a host or other" -msgstr "" -"資産を直接作成することはできません。ホストまたはその他を作成する必要がありま" -"す" +msgstr "資産を直接作成することはできません。ホストまたはその他を作成する必要があります" -#: assets/api/asset/asset.py:198 +#: assets/api/asset/asset.py:157 msgid "The number of assets exceeds the limit of 5000" msgstr "資産の数が5000の制限を超えています" @@ -2103,34 +2029,34 @@ msgstr "アプリ資産" msgid "Task: {} finished" msgstr "タスク:{} 完了" -#: assets/automations/base/manager.py:338 +#: assets/automations/base/manager.py:339 msgid " - Platform {} ansible disabled" msgstr " - プラットフォーム {} ansible 無効" -#: assets/automations/base/manager.py:524 +#: assets/automations/base/manager.py:525 msgid ">>> Task preparation phase" msgstr "タスク準備段階" -#: assets/automations/base/manager.py:528 +#: assets/automations/base/manager.py:529 #, python-brace-format msgid ">>> Executing tasks in batches, total {runner_count}" msgstr ">>> バッチでタスクを実行、合計 {runner_count}" -#: assets/automations/base/manager.py:533 +#: assets/automations/base/manager.py:534 msgid ">>> Start executing tasks" msgstr ">>> タスクの実行を開始" -#: assets/automations/base/manager.py:535 +#: assets/automations/base/manager.py:536 msgid ">>> No tasks need to be executed" msgstr ">>> 実行する必要があるタスクはありません" -#: assets/automations/base/manager.py:539 +#: assets/automations/base/manager.py:540 #, python-brace-format msgid ">>> Begin executing batch {index} of tasks" msgstr ">>> 第 {index} バッチのタスクの実行を開始" #: assets/automations/ping_gateway/manager.py:33 -#: authentication/models/connection_token.py:145 +#: authentication/models/connection_token.py:176 msgid "No account" msgstr "アカウントなし" @@ -2157,7 +2083,7 @@ msgstr "接続に失敗しました" msgid ">>> Start executing the task to test gateway connectivity" msgstr ">>> テストゲートウェイ接続性タスクの実行を開始する" -#: assets/const/automation.py:6 audits/const.py:6 audits/const.py:47 +#: assets/const/automation.py:6 audits/const.py:6 audits/const.py:48 #: audits/signal_handlers/activity_log.py:63 common/utils/ip/geoip/utils.py:31 #: common/utils/ip/geoip/utils.py:37 common/utils/ip/utils.py:104 msgid "Unknown" @@ -2183,7 +2109,7 @@ msgstr "テストゲートウェイ" msgid "Gather facts" msgstr "資産情報の収集" -#: assets/const/base.py:32 audits/const.py:58 +#: assets/const/base.py:32 audits/const.py:59 #: terminal/serializers/applet_host.py:32 users/models/user/_auth.py:31 msgid "Disabled" msgstr "無効" @@ -2217,12 +2143,12 @@ msgid "Cloud service" msgstr "クラウド サービス" #: assets/const/category.py:14 assets/models/asset/gpt.py:11 -#: assets/models/asset/web.py:16 audits/const.py:45 +#: assets/models/asset/web.py:16 audits/const.py:46 #: terminal/models/applet/applet.py:28 users/const.py:76 msgid "Web" msgstr "Web" -#: assets/const/category.py:15 common/sdk/sms/endpoint.py:20 +#: assets/const/category.py:16 common/sdk/sms/endpoint.py:20 msgid "Custom type" msgstr "カスタムタイプ" @@ -2258,8 +2184,8 @@ msgstr "" msgid "TP-Link" msgstr "" -#: assets/const/device.py:12 terminal/models/applet/applet.py:27 -#: tickets/const.py:9 +#: assets/const/device.py:12 assets/const/ds.py:7 +#: terminal/models/applet/applet.py:27 tickets/const.py:9 msgid "General" msgstr "一般" @@ -2275,6 +2201,10 @@ msgstr "ルーター" msgid "Firewall" msgstr "ファイアウォール" +#: assets/const/ds.py:10 +msgid "Windows Active Directory" +msgstr "" + #: assets/const/gpt.py:7 msgid "ChatGPT" msgstr "ChatGPT" @@ -2295,9 +2225,8 @@ msgstr "openssh 5.x または 6.x などの古い SSH バージョン" #: assets/const/protocol.py:53 msgid "Netcat help text" msgstr "" -"netcat (nc) をプロキシ ツールとして使用し、プロキシ サーバーからターゲット ホ" -"ストに接続を転送します。 SSH ネイティブ エージェント オプション (-W) がサポー" -"トされていない環境、またはより柔軟なタイムアウト制御が必要な環境に最適です。" +"netcat (nc) をプロキシ ツールとして使用し、プロキシ サーバーからターゲット ホストに接続を転送します。 SSH ネイティブ エージェント " +"オプション (-W) がサポートされていない環境、またはより柔軟なタイムアウト制御が必要な環境に最適です。" #: assets/const/protocol.py:64 msgid "SFTP root" @@ -2310,9 +2239,7 @@ msgid "" "account username
- ${HOME} The home directory of the connected account " "
- ${USER} The username of the user" msgstr "" -"SFTPルートディレクトリ、サポート変数:
-${ACCOUNT}接続されたアカウントの" -"ユーザー名
-${HOME}接続されたアカウントのホームディレクトリ
-${USER}" -"ユーザーのユーザー名" +"SFTPルートディレクトリ、サポート変数:
-${ACCOUNT}接続されたアカウントのユーザー名
-${HOME}接続されたアカウントのホームディレクトリ
-${USER}ユーザーのユーザー名" #: assets/const/protocol.py:81 msgid "Console" @@ -2327,26 +2254,23 @@ msgid "Any" msgstr "任意" #: assets/const/protocol.py:88 rbac/tree.py:62 -#: settings/serializers/security.py:241 +#: settings/serializers/security.py:245 msgid "Security" msgstr "セキュリティ" #: assets/const/protocol.py:89 msgid "" -"Security layer to use for the connection:
Any
Automatically select the " -"security mode based on the security protocols supported by both the client " +"Security layer to use for the connection:
Any
Automatically select the" +" security mode based on the security protocols supported by both the client " "and the server
RDP
Legacy RDP encryption. This mode is generally only " "used for older Windows servers or in cases where a standard Windows login " "screen is desired
TLS
RDP authentication and encryption implemented " "via TLS.
NLA
This mode uses TLS encryption and requires the username " "and password to be given in advance" msgstr "" -"接続のセキュリティ層:
Any
クライアントとサーバーの両方でサポートされて" -"いるセキュリティプロトコルに基づいて、セキュリティモードを自動的に選択します" -"
RDP
レガシーRDP暗号化。このモードは、通常、古い Windowsサーバーや標準" -"のWindowsログイン画面が必要な場合に使用されます
TLS
TLSによって実装され" -"たRDP認証と暗号化
NLA
このモードはTLS暗号化を使用し、事前にユーザー名と" -"パスワードを提供する必要があります
" +"接続のセキュリティ層:
Any
クライアントとサーバーの両方でサポートされているセキュリティプロトコルに基づいて、セキュリティモードを自動的に選択します
RDP
レガシーRDP暗号化。このモードは、通常、古い" +" " +"Windowsサーバーや標準のWindowsログイン画面が必要な場合に使用されます
TLS
TLSによって実装されたRDP認証と暗号化
NLA
このモードはTLS暗号化を使用し、事前にユーザー名とパスワードを提供する必要があります
" #: assets/const/protocol.py:106 msgid "AD domain" @@ -2402,7 +2326,7 @@ msgstr "認証データベース" msgid "The database to authenticate against" msgstr "認証するデータベース" -#: assets/const/protocol.py:232 authentication/models/connection_token.py:47 +#: assets/const/protocol.py:232 authentication/models/connection_token.py:48 msgid "Connect options" msgstr "接続アイテム" @@ -2422,9 +2346,7 @@ msgstr "安全モード" msgid "" "When safe mode is enabled, some operations will be disabled, such as: New " "tab, right click, visit other website, etc." -msgstr "" -"安全モードが有効になっている場合、新しいタブ、右クリック、他のウェブサイトへ" -"のアクセスなど、一部の操作が無効になります" +msgstr "安全モードが有効になっている場合、新しいタブ、右クリック、他のウェブサイトへのアクセスなど、一部の操作が無効になります" #: assets/const/protocol.py:275 assets/models/asset/web.py:9 #: assets/serializers/asset/info/spec.py:16 @@ -2447,7 +2369,7 @@ msgstr "ボタンセレクターを確認する" msgid "API mode" msgstr "APIモード" -#: assets/const/types.py:249 +#: assets/const/types.py:252 msgid "All types" msgstr "いろんなタイプ" @@ -2470,15 +2392,15 @@ msgstr "クラウド サービス" msgid "Port" msgstr "ポート" -#: assets/models/asset/common.py:167 assets/serializers/asset/common.py:172 +#: assets/models/asset/common.py:167 assets/serializers/asset/common.py:174 #: settings/serializers/terminal.py:10 msgid "Address" msgstr "アドレス" -#: assets/models/asset/common.py:169 assets/models/platform.py:149 +#: assets/models/asset/common.py:169 assets/models/platform.py:155 #: assets/serializers/asset/common.py:150 #: authentication/backends/passkey/models.py:12 -#: authentication/serializers/connect_token_secret.py:118 +#: authentication/serializers/connect_token_secret.py:120 #: perms/serializers/user_permission.py:25 xpack/plugins/cloud/models.py:387 msgid "Platform" msgstr "プラットフォーム" @@ -2487,34 +2409,34 @@ msgstr "プラットフォーム" msgid "Zone" msgstr "ゾーン" -#: assets/models/asset/common.py:176 assets/serializers/asset/common.py:174 +#: assets/models/asset/common.py:176 assets/serializers/asset/common.py:176 #: assets/serializers/automations/base.py:21 ops/serializers/job.py:22 #: perms/serializers/permission.py:58 msgid "Nodes" msgstr "ノード" -#: assets/models/asset/common.py:179 assets/serializers/asset/common.py:422 +#: assets/models/asset/common.py:183 assets/serializers/asset/common.py:425 #: assets/serializers/asset/host.py:11 msgid "Gathered info" msgstr "資産ハードウェア情報の収集" -#: assets/models/asset/common.py:180 assets/serializers/asset/custom.py:14 +#: assets/models/asset/common.py:184 assets/serializers/asset/custom.py:14 msgid "Custom info" msgstr "カスタム属性" -#: assets/models/asset/common.py:369 +#: assets/models/asset/common.py:431 msgid "Can refresh asset hardware info" msgstr "資産ハードウェア情報を更新できます" -#: assets/models/asset/common.py:370 +#: assets/models/asset/common.py:432 msgid "Can test asset connectivity" msgstr "資産接続をテストできます" -#: assets/models/asset/common.py:371 +#: assets/models/asset/common.py:433 msgid "Can match asset" msgstr "アセットを一致させることができます" -#: assets/models/asset/common.py:372 +#: assets/models/asset/common.py:434 msgid "Can change asset nodes" msgstr "資産ノードを変更できます" @@ -2542,19 +2464,23 @@ msgstr "証明書チェックを無視" msgid "Postgresql SSL mode" msgstr "PostgreSQL SSL モード" +#: assets/models/asset/ds.py:10 assets/serializers/asset/ds.py:20 +msgid "Domain name" +msgstr "ドメイン名" + #: assets/models/asset/gpt.py:8 settings/serializers/feature.py:139 #: settings/serializers/feature.py:154 msgid "Proxy" msgstr "プロキシー" #: assets/models/automations/base.py:23 assets/models/cmd_filter.py:32 -#: assets/models/node.py:553 ops/models/job.py:156 +#: assets/models/node.py:553 ops/models/job.py:158 #: perms/models/asset_permission.py:72 tickets/models/ticket/apply_asset.py:15 #: xpack/plugins/cloud/models.py:388 msgid "Node" msgstr "ノード" -#: assets/models/automations/base.py:29 ops/models/job.py:234 +#: assets/models/automations/base.py:29 ops/models/job.py:236 #: ops/serializers/job.py:24 settings/serializers/auth/sms.py:108 msgid "Parameters" msgstr "パラメータ" @@ -2572,7 +2498,7 @@ msgid "Asset automation task" msgstr "アセットの自動化タスク" #: assets/models/automations/base.py:140 assets/models/cmd_filter.py:41 -#: common/db/models.py:34 ops/models/base.py:54 ops/models/job.py:238 +#: common/db/models.py:34 ops/models/base.py:54 ops/models/job.py:240 #: users/models/user/__init__.py:317 msgid "Date created" msgstr "作成された日付" @@ -2583,14 +2509,14 @@ msgstr "作成された日付" msgid "Trigger mode" msgstr "トリガーモード" -#: assets/models/automations/base.py:157 audits/serializers.py:39 -#: ops/models/base.py:52 ops/models/job.py:236 +#: assets/models/automations/base.py:157 audits/serializers.py:38 +#: ops/models/base.py:52 ops/models/job.py:238 #: xpack/plugins/cloud/manager.py:103 msgid "Summary" msgstr "Summary" #: assets/models/automations/base.py:158 ops/models/base.py:51 -#: ops/models/job.py:235 xpack/plugins/cloud/models.py:225 +#: ops/models/job.py:237 xpack/plugins/cloud/models.py:225 msgid "Result" msgstr "結果" @@ -2654,7 +2580,7 @@ msgstr "コマンドフィルタルール" msgid "Favorite asset" msgstr "お気に入りのアセット" -#: assets/models/gateway.py:34 assets/serializers/domain.py:19 +#: assets/models/gateway.py:34 assets/serializers/domain.py:18 msgid "Gateway" msgstr "ゲートウェイ" @@ -2665,8 +2591,8 @@ msgstr "システム" #: assets/models/label.py:19 assets/models/node.py:539 #: assets/serializers/cagegory.py:11 assets/serializers/cagegory.py:18 #: assets/serializers/cagegory.py:24 -#: authentication/models/connection_token.py:33 -#: authentication/serializers/connect_token_secret.py:125 +#: authentication/models/connection_token.py:34 +#: authentication/serializers/connect_token_secret.py:127 #: common/serializers/common.py:86 labels/models.py:12 settings/models.py:38 #: users/models/preference.py:13 msgid "Value" @@ -2675,7 +2601,7 @@ msgstr "値" #: assets/models/label.py:40 assets/serializers/cagegory.py:10 #: assets/serializers/cagegory.py:17 assets/serializers/cagegory.py:23 #: assets/serializers/platform.py:159 -#: authentication/serializers/connect_token_secret.py:124 +#: authentication/serializers/connect_token_secret.py:126 #: common/serializers/common.py:85 labels/serializers.py:45 #: settings/serializers/msg.py:90 xpack/plugins/cloud/models.py:392 msgid "Label" @@ -2741,7 +2667,7 @@ msgstr "開ける" msgid "Setting" msgstr "設定" -#: assets/models/platform.py:38 audits/const.py:59 +#: assets/models/platform.py:38 audits/const.py:60 #: authentication/backends/passkey/models.py:11 settings/models.py:41 #: terminal/serializers/applet_host.py:33 users/models/user/_auth.py:32 msgid "Enabled" @@ -2841,15 +2767,19 @@ msgstr "シャーセット" msgid "Gateway enabled" msgstr "ゲートウェイが有効になりました" -#: assets/models/platform.py:106 assets/serializers/platform.py:202 +#: assets/models/platform.py:105 +msgid "DS enabled" +msgstr "ディレクトリサービスが有効になりました" + +#: assets/models/platform.py:107 assets/serializers/platform.py:202 msgid "Su enabled" msgstr "アカウントの切り替えを有効にする" -#: assets/models/platform.py:107 assets/serializers/platform.py:177 +#: assets/models/platform.py:108 assets/serializers/platform.py:177 msgid "Su method" msgstr "アカウントの切り替え方法" -#: assets/models/platform.py:108 assets/serializers/platform.py:180 +#: assets/models/platform.py:109 assets/serializers/platform.py:180 msgid "Custom fields" msgstr "カスタムフィールド" @@ -2862,9 +2792,7 @@ msgstr "%(value)s は偶数ではありません" msgid "" "Batch update platform in assets, skipping assets that do not meet platform " "type" -msgstr "" -"プラットフォームタイプがスキップされた資産に合致しない、資産内の一括更新プ" -"ラットフォーム" +msgstr "プラットフォームタイプがスキップされた資産に合致しない、資産内の一括更新プラットフォーム" #: assets/serializers/asset/common.py:36 assets/serializers/platform.py:153 msgid "Protocols, format is [\"protocol/port\"]" @@ -2878,50 +2806,46 @@ msgstr "契約書、形式は 名前/ポート" msgid "" "Accounts, format [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", " "\"secret_type\": \"password\"}]" -msgstr "" -"アカウント、形式は [{\"name\": \"x\", \"username\": \"x\", \"secret\": " -"\"x\", \"secret_type\": \"パスワード\"}]" +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 "" -"ノードパス、形式は [\"/組織/ノード名\"]、もしノードが存在しない場合、それを作" -"成します" +msgstr "ノードパス、形式は [\"/組織/ノード名\"]、もしノードが存在しない場合、それを作成します" #: assets/serializers/asset/common.py:147 assets/serializers/platform.py:174 #: authentication/serializers/connect_token_secret.py:30 -#: authentication/serializers/connect_token_secret.py:75 +#: authentication/serializers/connect_token_secret.py:77 #: perms/models/asset_permission.py:76 perms/serializers/permission.py:67 -#: perms/serializers/user_permission.py:74 xpack/plugins/cloud/models.py:390 +#: perms/serializers/user_permission.py:75 xpack/plugins/cloud/models.py:390 #: xpack/plugins/cloud/serializers/task.py:36 msgid "Protocols" msgstr "プロトコル" #: assets/serializers/asset/common.py:149 -#: assets/serializers/asset/common.py:173 +#: assets/serializers/asset/common.py:175 msgid "Node path" msgstr "ノードパスです" -#: assets/serializers/asset/common.py:170 -#: assets/serializers/asset/common.py:423 +#: assets/serializers/asset/common.py:172 +#: assets/serializers/asset/common.py:426 msgid "Auto info" msgstr "自動情報" -#: assets/serializers/asset/common.py:268 +#: assets/serializers/asset/common.py:271 msgid "Platform not exist" msgstr "プラットフォームが存在しません" -#: assets/serializers/asset/common.py:304 +#: assets/serializers/asset/common.py:307 msgid "port out of range (0-65535)" msgstr "ポート番号が範囲外です (0-65535)" -#: assets/serializers/asset/common.py:311 +#: assets/serializers/asset/common.py:314 msgid "Protocol is required: {}" msgstr "プロトコルが必要です: {}" -#: assets/serializers/asset/common.py:350 +#: assets/serializers/asset/common.py:353 msgid "Invalid data" msgstr "無効なデータ" @@ -2932,31 +2856,33 @@ msgstr "デフォルト・データベース" #: assets/serializers/asset/database.py:23 msgid "CA cert help text" msgstr "" -" Common Name (CN) フィールドは廃止されました。RFC 5280に基づき、Subject " -"Alternative Name (SAN) フィールドを使用してドメイン名を確認し、セキュリティを" -"強化してください" +" Common Name (CN) フィールドは廃止されました。RFC 5280に基づき、Subject Alternative Name (SAN) " +"フィールドを使用してドメイン名を確認し、セキュリティを強化してください" #: assets/serializers/asset/database.py:24 msgid "Postgresql ssl model help text" msgstr "" -"Prefer:私は暗号化に関心はありませんが、サーバーが暗号化をサポートしているな" -"ら、私は暗号化のコストを支払うことを喜んでいます。\n" -"Require:私のデータを暗号化してほしい、そのコストを受け入れます。私はネット" -"ワークが私が接続したいサーバーに常に接続できるように保証してくれると信じてい" -"ます。\n" -"Verify CA:私はデータが暗号化され、コストを受け入れます。私が信頼するサーバー" -"に接続されていることを確認したい。\n" -"Verify Full:私はデータが暗号化され、コストを受け入れます。私が信頼するサー" -"バーに接続されていること、そしてそれが私が指定したサーバーであることを確認し" -"たい" +"Prefer:私は暗号化に関心はありませんが、サーバーが暗号化をサポートしているなら、私は暗号化のコストを支払うことを喜んでいます。\n" +"Require:私のデータを暗号化してほしい、そのコストを受け入れます。私はネットワークが私が接続したいサーバーに常に接続できるように保証してくれると信じています。\n" +"Verify CA:私はデータが暗号化され、コストを受け入れます。私が信頼するサーバーに接続されていることを確認したい。\n" +"Verify Full:私はデータが暗号化され、コストを受け入れます。私が信頼するサーバーに接続されていること、そしてそれが私が指定したサーバーであることを確認したい" + +#: assets/serializers/asset/ds.py:18 +msgid "" +"The domain part used by the directory service (e.g., AD) and appended to the" +" username during login, such as example.com in user@example.com." +msgstr "" +"ドメイン名(Domain Name)は、ディレクトリサービス(例えばAD)にログインする際に、ユーザー名の後に付加されるドメインの部分であり、例えば user@example.com の場合、example.com にあたります。 \n" +"モジュール {} は、この資産には適用されません。 \n" +"手動または定期的なクラウド同期タスクを実行する際には、このタスクを実行します。 \n" +"毎日、システムは「システム設定-タスク-定期清掃-クラウド同期タスク履歴保持日数」の設定に基づいて、クラウド同期中に生成された記録をクリーンアップします。" #: assets/serializers/asset/gpt.py:20 msgid "" -"If the server cannot directly connect to the API address, you need set up an " -"HTTP proxy. e.g. http(s)://host:port" +"If the server cannot directly connect to the API address, you need set up an" +" HTTP proxy. e.g. http(s)://host:port" msgstr "" -"サーバーが API アドレスに直接接続できない場合は、HTTP プロキシを設定する必要" -"があります。例: http(s)://host:port" +"サーバーが API アドレスに直接接続できない場合は、HTTP プロキシを設定する必要があります。例: http(s)://host:port" #: assets/serializers/asset/gpt.py:24 msgid "HTTP proxy" @@ -3004,7 +2930,7 @@ msgid "Disk total" msgstr "ディスクの合計" #: assets/serializers/asset/info/gathered.py:16 -#: authentication/serializers/connect_token_secret.py:115 +#: authentication/serializers/connect_token_secret.py:117 msgid "OS" msgstr "OS" @@ -3028,13 +2954,11 @@ msgstr "制約" msgid "Types" msgstr "タイプ" -#: assets/serializers/domain.py:21 +#: assets/serializers/domain.py:20 msgid "" "A gateway is a network proxy for a zone, and when connecting assets within " "the zone, the connection is routed through the gateway." -msgstr "" -"ゲートウェイはドメインのネットワーク代理であり、ドメイン内のリソースに接続す" -"る際には、接続はゲートウェイを通してルーティングされます。" +msgstr "ゲートウェイはドメインのネットワーク代理であり、ドメイン内のリソースに接続する際には、接続はゲートウェイを通してルーティングされます。" #: assets/serializers/gateway.py:19 msgid "The platform must start with Gateway" @@ -3100,9 +3024,7 @@ msgstr "アドレスからのポート" msgid "" "This protocol is primary, and it must be set when adding assets. " "Additionally, there can only be one primary protocol." -msgstr "" -"このプロトコルはプライマリであり、資産を追加するときに設定する必要がありま" -"す。また、プライマリプロトコルは1つしかありません" +msgstr "このプロトコルはプライマリであり、資産を追加するときに設定する必要があります。また、プライマリプロトコルは1つしかありません" #: assets/serializers/platform.py:103 msgid "This protocol is required, and it must be set when adding assets." @@ -3112,14 +3034,11 @@ msgstr "このプロトコルは必須であり、資産を追加するときに msgid "" "This protocol is default, when adding assets, it will be displayed by " "default." -msgstr "" -"このプロトコルはデフォルトです。資産を追加するときに、デフォルトで表示されま" -"す" +msgstr "このプロトコルはデフォルトです。資産を追加するときに、デフォルトで表示されます" #: assets/serializers/platform.py:109 msgid "This protocol is public, asset will show this protocol to user" -msgstr "" -"このプロトコルは公開されており、資産はこのプロトコルをユーザーに表示します" +msgstr "このプロトコルは公開されており、資産はこのプロトコルをユーザーに表示します" #: assets/serializers/platform.py:162 msgid "Help text" @@ -3139,9 +3058,8 @@ msgid "" "another, similar to logging in with a regular account and then switching to " "root" msgstr "" -"資産にアクセスする際にアカウントでログインし、その後自動的に別のアカウントに" -"切り替えます。これは、通常のアカウントでログインした後に root に切り替えるの" -"と似ています" +"資産にアクセスする際にアカウントでログインし、その後自動的に別のアカウントに切り替えます。これは、通常のアカウントでログインした後に root " +"に切り替えるのと似ています" #: assets/serializers/platform.py:210 msgid "Assets can be connected using a zone gateway" @@ -3151,11 +3069,11 @@ msgstr "資産はゾーンゲートウェイを使用して接続できます" msgid "Default Domain" msgstr "デフォルト ドメイン" -#: assets/serializers/platform.py:234 +#: assets/serializers/platform.py:239 msgid "type is required" msgstr "タイプ このフィールドは必須です." -#: assets/serializers/platform.py:249 +#: assets/serializers/platform.py:254 msgid "Protocols is required" msgstr "同意が必要です" @@ -3181,12 +3099,9 @@ msgstr "資産情報の収集" #: assets/tasks/gather_facts.py:25 msgid "" -"When clicking 'Refresh hardware info' in 'Console - Asset Details - Basic' " -"this task \n" +"When clicking 'Refresh hardware info' in 'Console - Asset Details - Basic' this task \n" " will be executed" -msgstr "" -"コントロールパネル資産詳細-基本設定をクリックしてハードウェア情報を更新する" -"と、このタスクが実行されます" +msgstr "コントロールパネル資産詳細-基本設定をクリックしてハードウェア情報を更新すると、このタスクが実行されます" #: assets/tasks/gather_facts.py:44 msgid "Update assets hardware info: " @@ -3202,21 +3117,16 @@ msgstr "ノード下のアセット数を確認する" #: assets/tasks/nodes_amount.py:18 msgid "" -"Manually verifying asset quantities updates the asset count for nodes under " -"the \n" -" current organization. This task will be called in the following two " -"cases: when updating \n" +"Manually verifying asset quantities updates the asset count for nodes under the \n" +" current organization. This task will be called in the following two cases: when updating \n" " nodes and when the number of nodes exceeds 100" -msgstr "" -"手動で資産数を校正して現在の組織のノード資産数を更新する;ノードを更新する、" -"ノード数が100を超えると、このタスクが呼び出されます" +msgstr "手動で資産数を校正して現在の組織のノード資産数を更新する;ノードを更新する、ノード数が100を超えると、このタスクが呼び出されます" #: assets/tasks/nodes_amount.py:34 msgid "" -"The task of self-checking is already running and cannot be started repeatedly" -msgstr "" -"セルフチェックのタスクはすでに実行されており、繰り返し開始することはできませ" -"ん" +"The task of self-checking is already running and cannot be started " +"repeatedly" +msgstr "セルフチェックのタスクはすでに実行されており、繰り返し開始することはできません" #: assets/tasks/nodes_amount.py:40 msgid "Periodic check the amount of assets under the node" @@ -3224,12 +3134,9 @@ msgstr "ノードの下にあるアセットの数を定期的に確認する" #: assets/tasks/nodes_amount.py:42 msgid "" -"Schedule the check_node_assets_amount_task to periodically update the asset " -"count of \n" +"Schedule the check_node_assets_amount_task to periodically update the asset count of \n" " all nodes under all organizations" -msgstr "" -"check_node_assets_amount_taskタスクを定期的に呼び出し、すべての組織のすべての" -"ノードの資産数を更新します" +msgstr "check_node_assets_amount_taskタスクを定期的に呼び出し、すべての組織のすべてのノードの資産数を更新します" #: assets/tasks/ping.py:20 assets/tasks/ping.py:30 msgid "Test assets connectivity" @@ -3239,9 +3146,7 @@ msgstr "アセット接続のテスト。" msgid "" "When clicking 'Test Asset Connectivity' in 'Asset Details - Basic Settings' " "this task will be executed" -msgstr "" -"資産詳細-基本設定をクリックして資産の接続性をテストすると、このタスクが実行さ" -"れます" +msgstr "資産詳細-基本設定をクリックして資産の接続性をテストすると、このタスクが実行されます" #: assets/tasks/ping.py:46 msgid "Test if the assets under the node are connectable " @@ -3254,11 +3159,9 @@ msgstr "ゲートウェイ接続のテスト。" #: assets/tasks/ping_gateway.py:23 msgid "" -"When clicking 'Test Connection' in 'Domain Details - Gateway' this task will " -"be executed" -msgstr "" -"ネットワーク詳細-ゲートウェイ-接続テストを実行する際に、このタスクを実行しま" -"す" +"When clicking 'Test Connection' in 'Domain Details - Gateway' this task will" +" be executed" +msgstr "ネットワーク詳細-ゲートウェイ-接続テストを実行する際に、このタスクを実行します" #: assets/tasks/utils.py:16 msgid "Asset has been disabled, skipped: {}" @@ -3281,7 +3184,8 @@ msgid "App Audits" msgstr "監査" #: audits/backends/db.py:17 -msgid "The text content is too long. Use Elasticsearch to store operation logs" +msgid "" +"The text content is too long. Use Elasticsearch to store operation logs" msgstr "文章の内容が長すぎる。Elasticsearchで操作履歴を保存する" #: audits/backends/db.py:78 @@ -3322,7 +3226,7 @@ msgstr "名前の変更" msgid "Symlink" msgstr "Symlink" -#: audits/const.py:18 audits/const.py:28 +#: audits/const.py:18 audits/const.py:29 #: ops/templates/ops/celery_task_log.html:86 #: terminal/api/session/session.py:154 msgid "Download" @@ -3345,56 +3249,60 @@ msgstr "表示" msgid "Create" msgstr "作成" -#: audits/const.py:29 +#: audits/const.py:27 templates/_csv_import_export.html:8 +msgid "Export" +msgstr "エクスポート" + +#: audits/const.py:30 msgid "Connect" msgstr "接続" -#: audits/const.py:30 authentication/templates/authentication/login.html:329 +#: audits/const.py:31 authentication/templates/authentication/login.html:329 #: authentication/templates/authentication/login.html:401 #: templates/_header_bar.html:101 msgid "Login" msgstr "ログイン" -#: audits/const.py:35 rbac/tree.py:56 +#: audits/const.py:36 rbac/tree.py:56 msgid "Notifications" msgstr "通知" -#: audits/const.py:37 tickets/const.py:45 +#: audits/const.py:38 tickets/const.py:45 msgid "Approve" msgstr "承認" -#: audits/const.py:41 ops/models/celery.py:85 +#: audits/const.py:42 ops/models/celery.py:85 #: terminal/models/session/sharing.py:128 tickets/const.py:25 #: xpack/plugins/cloud/const.py:67 msgid "Finished" msgstr "終了" -#: audits/const.py:46 settings/serializers/terminal.py:6 +#: audits/const.py:47 settings/serializers/terminal.py:6 #: terminal/models/applet/host.py:26 terminal/models/component/terminal.py:185 -#: terminal/models/virtualapp/provider.py:14 terminal/serializers/session.py:57 -#: terminal/serializers/session.py:113 +#: terminal/models/virtualapp/provider.py:14 +#: terminal/serializers/session.py:57 terminal/serializers/session.py:113 msgid "Terminal" msgstr "ターミナル" -#: audits/const.py:51 audits/models.py:133 +#: audits/const.py:52 audits/models.py:133 msgid "Operate log" msgstr "ログの操作" -#: audits/const.py:52 +#: audits/const.py:53 msgid "Session log" msgstr "セッションログ" -#: audits/const.py:53 +#: audits/const.py:54 msgid "Login log" msgstr "ログインログ" -#: audits/const.py:54 rbac/tree.py:64 terminal/models/applet/host.py:144 +#: audits/const.py:55 rbac/tree.py:64 terminal/models/applet/host.py:144 #: terminal/models/component/task.py:22 #: xpack/plugins/cloud/serializers/account.py:77 msgid "Task" msgstr "タスク" -#: audits/const.py:60 +#: audits/const.py:61 msgid "-" msgstr "-" @@ -3412,7 +3320,7 @@ msgstr "業務監査" msgid "Remote addr" msgstr "リモートaddr" -#: audits/models.py:62 audits/serializers.py:62 +#: audits/models.py:62 audits/serializers.py:61 msgid "Operate" msgstr "操作" @@ -3437,17 +3345,17 @@ msgstr "セッション" msgid "File transfer log" msgstr "ファイル転送ログ" -#: audits/models.py:95 audits/serializers.py:110 +#: audits/models.py:95 audits/serializers.py:109 msgid "Resource Type" msgstr "リソースタイプ" #: audits/models.py:96 audits/models.py:99 audits/models.py:145 -#: audits/serializers.py:109 labels/serializers.py:46 +#: audits/serializers.py:108 labels/serializers.py:46 msgid "Resource" msgstr "リソース" #: audits/models.py:102 audits/models.py:148 audits/models.py:178 -#: audits/models.py:314 audits/serializers.py:230 +#: audits/models.py:314 audits/serializers.py:232 #: terminal/serializers/command.py:75 msgid "Datetime" msgstr "時間" @@ -3481,7 +3389,7 @@ msgstr "ログインタイプ" msgid "Login IP" msgstr "ログインIP" -#: audits/models.py:201 audits/serializers.py:76 +#: audits/models.py:201 audits/serializers.py:75 #: authentication/templates/authentication/_mfa_confirm_modal.html:14 #: users/forms/profile.py:64 users/models/user/__init__.py:82 #: users/serializers/profile.py:71 @@ -3532,37 +3440,37 @@ msgid "Application ID" msgstr "アプリ ID" #: audits/serializers.py:33 ops/models/adhoc.py:24 ops/models/base.py:16 -#: ops/models/base.py:53 ops/models/celery.py:87 ops/models/job.py:154 -#: ops/models/job.py:237 ops/models/playbook.py:30 ops/models/variable.py:17 +#: ops/models/base.py:53 ops/models/celery.py:87 ops/models/job.py:156 +#: ops/models/job.py:239 ops/models/playbook.py:30 ops/models/variable.py:17 #: terminal/models/session/sharing.py:25 msgid "Creator" msgstr "作成者" -#: audits/serializers.py:40 ops/serializers/celery.py:33 +#: audits/serializers.py:39 ops/serializers/celery.py:33 msgid "Execution cycle" msgstr "ジョブ実行" -#: audits/serializers.py:93 +#: audits/serializers.py:92 msgid "Reason display" msgstr "理由表示" -#: audits/serializers.py:94 audits/serializers.py:208 +#: audits/serializers.py:93 audits/serializers.py:210 msgid "Auth backend display" msgstr "検証方法" -#: audits/serializers.py:158 +#: audits/serializers.py:157 #, python-format msgid "%s %s this resource" msgstr "ユーザー %s %s が現在のリソースをサブスクライブしました。" -#: audits/serializers.py:196 authentication/models/connection_token.py:51 +#: audits/serializers.py:198 authentication/models/connection_token.py:52 #: authentication/models/temp_token.py:13 perms/models/asset_permission.py:80 #: tickets/models/ticket/apply_application.py:31 #: tickets/models/ticket/apply_asset.py:21 users/models/user/__init__.py:101 msgid "Date expired" msgstr "期限切れの日付" -#: audits/serializers.py:227 terminal/models/component/terminal.py:91 +#: audits/serializers.py:229 terminal/models/component/terminal.py:91 #: terminal/serializers/command.py:76 msgid "Remote Address" msgstr "リモートアドレス" @@ -3640,18 +3548,13 @@ msgstr "資産監査セッションタスクログのクリーンアップ" #: audits/tasks.py:134 msgid "" -"Since the system generates login logs, operation logs, file upload logs, " -"activity \n" -" logs, Celery execution logs, session recordings, command records, " -"and password change \n" -" logs, it will perform cleanup of records that exceed the time limit " -"according to the \n" +"Since the system generates login logs, operation logs, file upload logs, activity \n" +" logs, Celery execution logs, session recordings, command records, and password change \n" +" logs, it will perform cleanup of records that exceed the time limit according to the \n" " 'Tasks - Regular clean-up' in the system settings at 2 a.m daily" msgstr "" -"システムはログインログ、操作ログ、ファイルアップロードログ、アクティビティロ" -"グ、セルリー実行ログ、セッション録画、コマンド記録、パスワード変更ログを生成" -"します。システムは、システム設定-タスクリスト-定期クリーニング設定に基づき、" -"毎日午前2時に時間を超えたものをクリーニングします" +"システムはログインログ、操作ログ、ファイルアップロードログ、アクティビティログ、セルリー実行ログ、セッション録画、コマンド記録、パスワード変更ログを生成します。システムは、システム設定-" +"タスクリスト-定期クリーニング設定に基づき、毎日午前2時に時間を超えたものをクリーニングします" #: audits/tasks.py:154 msgid "Upload FTP file to external storage" @@ -3659,12 +3562,10 @@ msgstr "外部ストレージへのFTPファイルのアップロード" #: audits/tasks.py:156 msgid "" -"If SERVER_REPLAY_STORAGE is configured, files uploaded through file " -"management will be \n" +"If SERVER_REPLAY_STORAGE is configured, files uploaded through file management will be \n" " synchronized to external storage" msgstr "" -"SERVER_REPLAY_STORAGEが設定されている場合は、ファイルマネージャーでアップロー" -"ドしたファイルを外部ストレージに同期します" +"SERVER_REPLAY_STORAGEが設定されている場合は、ファイルマネージャーでアップロードしたファイルを外部ストレージに同期します" #: authentication/api/access_key.py:39 msgid "Access keys can be created at most 10" @@ -3679,41 +3580,39 @@ msgstr "パラメータの値には必ず %s が含まれます" msgid "This action require verify your MFA" msgstr "この操作には、MFAを検証する必要があります" -#: authentication/api/connection_token.py:303 +#: authentication/api/connection_token.py:304 msgid "Reusable connection token is not allowed, global setting not enabled" -msgstr "" -"再使用可能な接続トークンの使用は許可されていません。グローバル設定は有効に" -"なっていません" +msgstr "再使用可能な接続トークンの使用は許可されていません。グローバル設定は有効になっていません" -#: authentication/api/connection_token.py:423 +#: authentication/api/connection_token.py:424 msgid "Anonymous account is not supported for this asset" msgstr "匿名アカウントはこのプロパティではサポートされていません" -#: authentication/api/connection_token.py:455 +#: authentication/api/connection_token.py:454 msgid "Permission expired" msgstr "承認の有効期限が切れています" -#: authentication/api/connection_token.py:488 +#: authentication/api/connection_token.py:487 msgid "ACL action is reject: {}({})" msgstr "ACL アクションは拒否です: {}({})" -#: authentication/api/connection_token.py:492 +#: authentication/api/connection_token.py:491 msgid "ACL action is review" msgstr "ACL アクションはレビューです" -#: authentication/api/connection_token.py:502 +#: authentication/api/connection_token.py:501 msgid "ACL action is face verify" msgstr "ACL Action は顔認証です" -#: authentication/api/connection_token.py:507 +#: authentication/api/connection_token.py:506 msgid "ACL action not supported for this asset" msgstr "資産ログインルールは現在の資産をサポートしていません" -#: authentication/api/connection_token.py:514 +#: authentication/api/connection_token.py:513 msgid "ACL action is face online" msgstr "ACL Action は顔オンラインです" -#: authentication/api/connection_token.py:533 +#: authentication/api/connection_token.py:532 msgid "No available face feature" msgstr "利用可能な顔の特徴はありません" @@ -3739,9 +3638,7 @@ msgstr "ユーザーにマッチしなかった" msgid "" "The user is from {}, please go to the corresponding system to change the " "password" -msgstr "" -"ユーザーは {}からです。対応するシステムにアクセスしてパスワードを変更してくだ" -"さい。" +msgstr "ユーザーは {}からです。対応するシステムにアクセスしてパスワードを変更してください。" #: authentication/api/password.py:69 #: authentication/templates/authentication/login.html:393 @@ -3772,8 +3669,7 @@ msgstr "無効なトークンヘッダー。記号文字列にはスペースを #: authentication/backends/drf.py:69 msgid "" "Invalid token header. Sign string should not contain invalid characters." -msgstr "" -"無効なトークンヘッダー。署名文字列に無効な文字を含めることはできません。" +msgstr "無効なトークンヘッダー。署名文字列に無効な文字を含めることはできません。" #: authentication/backends/drf.py:82 msgid "Invalid token or cache refreshed." @@ -3786,9 +3682,7 @@ msgstr "OpenID エラー" #: authentication/backends/oidc/views.py:176 #: authentication/backends/saml2/views.py:283 msgid "Please check if a user with the same username or email already exists" -msgstr "" -"同じユーザー名またはメールアドレスのユーザーが既に存在するかどうかを確認して" -"ください" +msgstr "同じユーザー名またはメールアドレスのユーザーが既に存在するかどうかを確認してください" #: authentication/backends/passkey/api.py:37 msgid "Only register passkey for local user" @@ -3835,16 +3729,16 @@ msgstr "OTP" msgid "SMS" msgstr "メッセージ" -#: authentication/const.py:34 +#: authentication/const.py:35 msgid "Face Recognition" msgstr "顔認証" -#: authentication/const.py:35 settings/serializers/auth/radius.py:14 +#: authentication/const.py:36 settings/serializers/auth/radius.py:14 #: settings/serializers/auth/radius.py:16 msgid "Radius" msgstr "Radius" -#: authentication/const.py:36 +#: authentication/const.py:37 msgid "Custom" msgstr "カスタマイズ" @@ -3903,34 +3797,27 @@ msgid "" "You can also try {times_try} times (The account will be temporarily locked " "for {block_time} minutes)" msgstr "" -"入力したユーザー名またはパスワードが正しくありません。再度入力してください。 " -"{times_try} 回試すこともできます (アカウントは {block_time} 分の間一時的に" -"ロックされます)" +"入力したユーザー名またはパスワードが正しくありません。再度入力してください。 {times_try} 回試すこともできます (アカウントは " +"{block_time} 分の間一時的にロックされます)" #: authentication/errors/const.py:47 authentication/errors/const.py:55 msgid "" "The account has been locked (please contact admin to unlock it or try again " "after {} minutes)" -msgstr "" -"アカウントがロックされています (管理者に連絡してロックを解除するか、 {} 分後" -"にもう一度お試しください)" +msgstr "アカウントがロックされています (管理者に連絡してロックを解除するか、 {} 分後にもう一度お試しください)" #: authentication/errors/const.py:51 msgid "" "The address has been locked (please contact admin to unlock it or try again " "after {} minutes)" -msgstr "" -"IP がロックされています (管理者に連絡してロックを解除するか、{} 分後に再試行" -"してください)" +msgstr "IP がロックされています (管理者に連絡してロックを解除するか、{} 分後に再試行してください)" #: authentication/errors/const.py:59 #, python-brace-format msgid "" -"{error}, You can also try {times_try} times (The account will be temporarily " -"locked for {block_time} minutes)" -msgstr "" -"{error} {times_try} 回も試すことができます (アカウントは {block_time} 分の間" -"一時的にロックされます)" +"{error}, You can also try {times_try} times (The account will be temporarily" +" locked for {block_time} minutes)" +msgstr "{error} {times_try} 回も試すことができます (アカウントは {block_time} 分の間一時的にロックされます)" #: authentication/errors/const.py:63 msgid "MFA required" @@ -4017,8 +3904,7 @@ msgstr "ログインする前にパスワードを変更する必要がありま #: authentication/errors/redirect.py:101 authentication/mixins.py:345 msgid "Your password has expired, please reset before logging in" -msgstr "" -"パスワードの有効期限が切れました。ログインする前にリセットしてください。" +msgstr "パスワードの有効期限が切れました。ログインする前にリセットしてください。" #: authentication/forms.py:34 msgid "Auto-login" @@ -4037,7 +3923,9 @@ msgstr "MFAタイプ" msgid "Captcha" msgstr "キャプチャ" -#: authentication/forms.py:66 users/forms/profile.py:28 +#: authentication/forms.py:66 authentication/mfa/email.py:41 +#: authentication/templates/authentication/_msg_mfa_email_code.html:12 +#: users/forms/profile.py:28 msgid "MFA code" msgstr "MFAコード" @@ -4051,9 +3939,9 @@ msgstr "セキュリティコードを入力してください" #: authentication/mfa/base.py:27 msgid "" -"The two-factor code you entered has either already been used or has expired. " -"Please request a new one." -msgstr "" +"The two-factor code you entered has either already been used or has expired." +" Please request a new one." +msgstr "入力された二重認証コードは既に使用されたか、期限切れです。新しい二重認証コードを申請してください。" #: authentication/mfa/custom.py:21 msgid "MFA Custom code invalid" @@ -4065,8 +3953,15 @@ msgstr "カスタム MFA 検証コード" #: authentication/mfa/custom.py:57 msgid "MFA custom global enabled, cannot disable" -msgstr "" -"カスタム MFA はグローバルに有効になっており、無効にすることはできません" +msgstr "カスタム MFA はグローバルに有効になっており、無効にすることはできません" + +#: authentication/mfa/email.py:11 +msgid "Email verify code invalid" +msgstr "メール認証コードの検証に失敗しました" + +#: authentication/mfa/email.py:17 +msgid "Email verification code" +msgstr "メール認証コード" #: authentication/mfa/face.py:55 msgid "Bind face to enable" @@ -4116,7 +4011,7 @@ msgstr "電話番号を設定して有効にする" msgid "Clear phone number to disable" msgstr "無効にする電話番号をクリアする" -#: authentication/middleware.py:95 settings/utils/ldap.py:691 +#: authentication/middleware.py:95 settings/utils/ldap.py:711 msgid "Authentication failed (before login check failed): {}" msgstr "認証に失敗しました (ログインチェックが失敗する前): {}" @@ -4128,9 +4023,7 @@ msgstr "無効なユーザーです" msgid "" "The administrator has enabled 'Only allow login from user source'. \n" " The current user source is {}. Please contact the administrator." -msgstr "" -"管理者は「ユーザーソースからのみログインを許可」をオンにしており、現在のユー" -"ザーソースは {} です。管理者に連絡してください。" +msgstr "管理者は「ユーザーソースからのみログインを許可」をオンにしており、現在のユーザーソースは {} です。管理者に連絡してください。" #: authentication/mixins.py:273 msgid "The MFA type ({}) is not enabled" @@ -4140,22 +4033,22 @@ msgstr "MFAタイプ ({}) が有効になっていない" msgid "Please change your password" msgstr "パスワードを変更してください" -#: authentication/models/connection_token.py:42 +#: authentication/models/connection_token.py:43 #: terminal/serializers/storage.py:114 msgid "Account name" msgstr "アカウント名" -#: authentication/models/connection_token.py:43 +#: authentication/models/connection_token.py:44 msgid "Input username" msgstr "カスタム ユーザー名" -#: authentication/models/connection_token.py:44 +#: authentication/models/connection_token.py:45 #: authentication/serializers/connection_token.py:18 msgid "Input secret" msgstr "カスタムパスワード" -#: authentication/models/connection_token.py:45 -#: authentication/serializers/connect_token_secret.py:114 +#: authentication/models/connection_token.py:46 +#: authentication/serializers/connect_token_secret.py:116 #: settings/serializers/msg.py:28 terminal/models/applet/applet.py:43 #: terminal/models/virtualapp/virtualapp.py:24 #: terminal/serializers/session.py:23 terminal/serializers/session.py:50 @@ -4163,69 +4056,69 @@ msgstr "カスタムパスワード" msgid "Protocol" msgstr "プロトコル" -#: authentication/models/connection_token.py:46 +#: authentication/models/connection_token.py:47 msgid "Connect method" msgstr "接続方法" -#: authentication/models/connection_token.py:48 +#: authentication/models/connection_token.py:49 msgid "User display" msgstr "ユーザー表示" -#: authentication/models/connection_token.py:49 +#: authentication/models/connection_token.py:50 msgid "Asset display" msgstr "アセット名" -#: authentication/models/connection_token.py:50 +#: authentication/models/connection_token.py:51 msgid "Reusable" msgstr "再利用可能" -#: authentication/models/connection_token.py:55 +#: authentication/models/connection_token.py:56 #: perms/models/asset_permission.py:83 msgid "From ticket" msgstr "チケットから" -#: authentication/models/connection_token.py:57 +#: authentication/models/connection_token.py:58 msgid "Face monitor token" msgstr "顔監視トークン" -#: authentication/models/connection_token.py:68 +#: authentication/models/connection_token.py:69 msgid "Can expire connection token" msgstr "接続トークンの有効期限を設定できます" -#: authentication/models/connection_token.py:69 +#: authentication/models/connection_token.py:70 msgid "Can reuse connection token" msgstr "接続トークンを再利用できます" -#: authentication/models/connection_token.py:71 +#: authentication/models/connection_token.py:72 msgid "Connection token" msgstr "接続トークン" -#: authentication/models/connection_token.py:132 +#: authentication/models/connection_token.py:163 msgid "Connection token inactive" msgstr "接続トークンがアクティブ化されていません" -#: authentication/models/connection_token.py:136 +#: authentication/models/connection_token.py:167 msgid "Connection token expired at: {}" msgstr "接続トークンの有効期限: {}" -#: authentication/models/connection_token.py:139 +#: authentication/models/connection_token.py:170 #: terminal/serializers/session.py:95 msgid "No user or invalid user" msgstr "ユーザーなしまたは期限切れのユーザー" -#: authentication/models/connection_token.py:142 +#: authentication/models/connection_token.py:173 msgid "No asset or inactive asset" msgstr "アセットがないか、有効化されていないアセット" -#: authentication/models/connection_token.py:290 +#: authentication/models/connection_token.py:341 msgid "Can view super connection token secret" msgstr "スーパー接続トークンのシークレットを表示できます" -#: authentication/models/connection_token.py:292 +#: authentication/models/connection_token.py:343 msgid "Super connection token" msgstr "スーパー接続トークン" -#: authentication/models/connection_token.py:309 +#: authentication/models/connection_token.py:360 msgid "Admin connection token" msgstr "管理者接続トークン" @@ -4239,7 +4132,7 @@ msgstr "プライベートトークン" msgid "Private key" msgstr "ssh秘密鍵" -#: authentication/models/ssh_key.py:18 settings/serializers/terminal.py:34 +#: authentication/models/ssh_key.py:18 settings/serializers/terminal.py:38 #: users/forms/profile.py:175 users/models/user/__init__.py:92 #: xpack/plugins/cloud/serializers/account_attrs.py:211 msgid "Public key" @@ -4265,39 +4158,39 @@ msgstr "異なる都市ログインのリマインダー" msgid "binding reminder" msgstr "バインディングリマインダー" -#: authentication/serializers/connect_token_secret.py:116 +#: authentication/serializers/connect_token_secret.py:118 msgid "Is builtin" msgstr "ビルトイン" -#: authentication/serializers/connect_token_secret.py:120 +#: authentication/serializers/connect_token_secret.py:122 msgid "Options" msgstr "オプション" -#: authentication/serializers/connect_token_secret.py:127 +#: authentication/serializers/connect_token_secret.py:129 #: ops/notifications.py:19 rbac/tree.py:60 msgid "Component" msgstr "コンポーネント" -#: authentication/serializers/connect_token_secret.py:136 +#: authentication/serializers/connect_token_secret.py:138 #: perms/serializers/user_permission.py:28 xpack/plugins/cloud/models.py:389 msgid "Domain" msgstr "ドメイン" -#: authentication/serializers/connect_token_secret.py:138 +#: authentication/serializers/connect_token_secret.py:140 msgid "Expired now" msgstr "すぐに期限切れ" -#: authentication/serializers/connect_token_secret.py:171 +#: authentication/serializers/connect_token_secret.py:173 #: terminal/models/virtualapp/virtualapp.py:25 msgid "Image name" msgstr "ミラー名" -#: authentication/serializers/connect_token_secret.py:172 +#: authentication/serializers/connect_token_secret.py:174 #: terminal/models/virtualapp/virtualapp.py:27 msgid "Image port" msgstr "ミラーポート" -#: authentication/serializers/connect_token_secret.py:173 +#: authentication/serializers/connect_token_secret.py:175 #: terminal/models/virtualapp/virtualapp.py:26 msgid "Image protocol" msgstr "ミラープロトコル" @@ -4347,14 +4240,12 @@ msgstr "タイプを作成" #: authentication/serializers/ssh_key.py:33 msgid "" -"Please download the private key after creation. Each private key can only be " -"downloaded once" -msgstr "" -"作成完了後、秘密鍵をダウンロードしてください。各秘密鍵のダウンロードは一度き" -"りです" +"Please download the private key after creation. Each private key can only be" +" downloaded once" +msgstr "作成完了後、秘密鍵をダウンロードしてください。各秘密鍵のダウンロードは一度きりです" #: authentication/serializers/ssh_key.py:57 users/forms/profile.py:164 -#: users/serializers/profile.py:134 users/serializers/profile.py:161 +#: users/serializers/profile.py:142 users/serializers/profile.py:169 msgid "Not a valid ssh public key" msgstr "有効なssh公開鍵ではありません" @@ -4370,11 +4261,9 @@ msgstr "期限切れのセッションをクリアする" #: authentication/tasks.py:15 msgid "" -"Since user logins create sessions, the system will clean up expired sessions " -"every 24 hours" -msgstr "" -"ユーザーがシステムにログインするとセッションが生成されます。システムは24時間" -"ごとに期限切れのセッションをクリーニングします" +"Since user logins create sessions, the system will clean up expired sessions" +" every 24 hours" +msgstr "ユーザーがシステムにログインするとセッションが生成されます。システムは24時間ごとに期限切れのセッションをクリーニングします" #: authentication/templates/authentication/_access_key_modal.html:6 msgid "API key list" @@ -4393,12 +4282,14 @@ msgid "Show" msgstr "表示" #: authentication/templates/authentication/_access_key_modal.html:66 -#: users/const.py:42 users/templates/users/user_verify_mfa.html:36 +#: settings/serializers/terminal.py:24 users/const.py:42 +#: users/templates/users/user_verify_mfa.html:36 msgid "Disable" msgstr "無効化" #: authentication/templates/authentication/_access_key_modal.html:67 -#: users/const.py:43 users/templates/users/mfa_setting.html:120 +#: settings/serializers/terminal.py:24 users/const.py:43 +#: users/templates/users/mfa_setting.html:120 #: users/templates/users/mfa_setting.html:158 #: users/templates/users/mfa_setting.html:177 msgid "Enable" @@ -4432,10 +4323,11 @@ msgid "Code error" msgstr "コードエラー" #: authentication/templates/authentication/_msg_different_city.html:3 +#: authentication/templates/authentication/_msg_mfa_email_code.html:9 #: authentication/templates/authentication/_msg_oauth_bind.html:3 #: authentication/templates/authentication/_msg_reset_password.html:3 #: authentication/templates/authentication/_msg_reset_password_code.html:9 -#: jumpserver/conf.py:539 +#: jumpserver/conf.py:540 #: perms/templates/perms/_msg_item_permissions_expire.html:3 #: tickets/templates/tickets/approve_check_password.html:32 #: users/templates/users/_msg_account_expire_reminder.html:4 @@ -4452,9 +4344,12 @@ msgstr "アカウントにリモートログイン動作があります。注意 msgid "" "If you suspect that the login behavior is abnormal, please modify the " "account password in time." -msgstr "" -"ログイン動作が異常であると疑われる場合は、時間内にアカウントのパスワードを変" -"更してください。" +msgstr "ログイン動作が異常であると疑われる場合は、時間内にアカウントのパスワードを変更してください。" + +#: authentication/templates/authentication/_msg_mfa_email_code.html:15 +#: authentication/templates/authentication/_msg_reset_password_code.html:18 +msgid "The validity period of the verification code is one minute" +msgstr "認証コードの有効時間は 1 分" #: authentication/templates/authentication/_msg_oauth_bind.html:6 msgid "Your account has just been bound to" @@ -4474,9 +4369,7 @@ msgstr "操作が独自のものでない場合は、パスワードをバイン msgid "" "Please click the link below to reset your password, if not your request, " "concern your account security" -msgstr "" -"下のリンクをクリックしてパスワードをリセットしてください。リクエストがない場" -"合は、アカウントのセキュリティに関係します。" +msgstr "下のリンクをクリックしてパスワードをリセットしてください。リクエストがない場合は、アカウントのセキュリティに関係します。" #: authentication/templates/authentication/_msg_reset_password.html:10 msgid "Click here reset password" @@ -4504,10 +4397,6 @@ msgid "" "Copy the verification code to the Reset Password page to reset the password." msgstr "パスワードリセットページにcaptchaをコピーし、パスワードをリセットする" -#: authentication/templates/authentication/_msg_reset_password_code.html:18 -msgid "The validity period of the verification code is one minute" -msgstr "認証コードの有効時間は 1 分" - #: authentication/templates/authentication/_msg_rest_password_success.html:5 msgid "Your password has just been successfully updated" msgstr "パスワードが正常に更新されました" @@ -4521,9 +4410,7 @@ msgstr "ブラウザ" msgid "" "If the password update was not initiated by you, your account may have " "security issues" -msgstr "" -"パスワードの更新が開始されなかった場合、アカウントにセキュリティ上の問題があ" -"る可能性があります" +msgstr "パスワードの更新が開始されなかった場合、アカウントにセキュリティ上の問題がある可能性があります" #: authentication/templates/authentication/_msg_rest_password_success.html:13 #: authentication/templates/authentication/_msg_rest_public_key_success.html:13 @@ -4538,9 +4425,7 @@ msgstr "公開鍵が正常に更新されました" msgid "" "If the public key update was not initiated by you, your account may have " "security issues" -msgstr "" -"公開鍵の更新が開始されなかった場合、アカウントにセキュリティ上の問題がある可" -"能性があります" +msgstr "公開鍵の更新が開始されなかった場合、アカウントにセキュリティ上の問題がある可能性があります" #: authentication/templates/authentication/auth_fail_flash_message_standalone.html:28 #: templates/flash_message_standalone.html:28 tickets/const.py:18 @@ -4555,9 +4440,7 @@ msgstr "再試行" msgid "" "Configuration file has problems and cannot be logged in. Please contact the " "administrator or view latest docs" -msgstr "" -"設定ファイルに問題があり、ログインできません。管理者に連絡するか、最新のド" -"キュメントを参照してください。" +msgstr "設定ファイルに問題があり、ログインできません。管理者に連絡するか、最新のドキュメントを参照してください。" #: authentication/templates/authentication/login.html:309 msgid "If you are administrator, you can update the config resolve it, set" @@ -4603,9 +4486,7 @@ msgstr "コピー成功" msgid "" "This page is not served over HTTPS. Please use HTTPS to ensure security of " "your credentials." -msgstr "" -"このページはHTTPSで提供されていません。HTTPSを使用して、資格情報のセキュリ" -"ティを確保してください。" +msgstr "このページはHTTPSで提供されていません。HTTPSを使用して、資格情報のセキュリティを確保してください。" #: authentication/templates/authentication/passkey.html:173 msgid "Do you want to retry ?" @@ -4734,11 +4615,9 @@ msgstr "ログアウト成功、ログインページを返す" #: authentication/views/mixins.py:39 msgid "" -"For your safety, automatic redirection login is not supported on the client. " -"If you need to open it in the client, please log in again" -msgstr "" -"安全のため、クライアントでの自動リダイレクトログインはサポートされていませ" -"ん。クライアントで開く必要がある場合は、再度ログインしてください" +"For your safety, automatic redirection login is not supported on the client." +" If you need to open it in the client, please log in again" +msgstr "安全のため、クライアントでの自動リダイレクトログインはサポートされていません。クライアントで開く必要がある場合は、再度ログインしてください" #: authentication/views/slack.py:35 authentication/views/slack.py:120 msgid "Slack Error" @@ -4868,13 +4747,12 @@ msgstr "Secret Keyを使用したフィールドの暗号化" #: common/db/fields.py:578 msgid "" -"Invalid JSON data for JSONManyToManyField, should be like {'type': 'all'} or " -"{'type': 'ids', 'ids': []} or {'type': 'attrs', 'attrs': [{'name': 'ip', " +"Invalid JSON data for JSONManyToManyField, should be like {'type': 'all'} or" +" {'type': 'ids', 'ids': []} or {'type': 'attrs', 'attrs': [{'name': 'ip', " "'match': 'exact', 'value': '1.1.1.1'}}" msgstr "" -"JSON言語多对多字段无效,应为 #「タイプ」:「すべて」#「すべて」或 " -"{'type':'ids','ids':[]}或 #タイプ:属性、属性:[#名前:ip、照合:正確、" -"値:1.1.1.1}" +"JSON言語多对多字段无效,应为 #「タイプ」:「すべて」#「すべて」或 {'type':'ids','ids':[]}或 " +"#タイプ:属性、属性:[#名前:ip、照合:正確、値:1.1.1.1}" #: common/db/fields.py:585 msgid "Invalid type, should be \"all\", \"ids\" or \"attrs\"" @@ -4937,82 +4815,88 @@ msgstr "解析ファイルエラー: {}" msgid "Invalid excel file" msgstr "無効 excel 書類" -#: common/drf/renders/base.py:138 +#: common/drf/renders/base.py:140 msgid "Yes/No" msgstr "はい/いいえ" -#: common/drf/renders/base.py:141 +#: common/drf/renders/base.py:143 msgid "Text, max length {}" msgstr "テキスト、最大長 {}" -#: common/drf/renders/base.py:143 +#: common/drf/renders/base.py:145 msgid "Long text, no length limit" msgstr "長文テキスト、長さ制限なし" -#: common/drf/renders/base.py:145 +#: common/drf/renders/base.py:147 msgid "Number, min {} max {}" msgstr "数字、最小 {} 最大 {}" -#: common/drf/renders/base.py:148 +#: common/drf/renders/base.py:150 msgid "Datetime format {}" msgstr "日付時刻形式 {}" -#: common/drf/renders/base.py:154 +#: common/drf/renders/base.py:156 msgid "" "Choices, format name(value), name is optional for human read, value is " "requisite, options {}" -msgstr "" -"選択、形式: 名前(値)、名前はオプショナルで、読みやすいように、値は必須です。" -"選択肢は {}" +msgstr "選択、形式: 名前(値)、名前はオプショナルで、読みやすいように、値は必須です。選択肢は {}" -#: common/drf/renders/base.py:157 +#: common/drf/renders/base.py:159 msgid "Choices, options {}" msgstr "オプション、可能なオプションは {}" -#: common/drf/renders/base.py:159 +#: common/drf/renders/base.py:161 msgid "Phone number, format +8612345678901" msgstr "電話番号、形式 +8612345678901" -#: common/drf/renders/base.py:161 +#: common/drf/renders/base.py:163 msgid "Label, format [\"key:value\"]" msgstr "タグ、形式: [\"キー:値\"]" -#: common/drf/renders/base.py:163 +#: common/drf/renders/base.py:165 msgid "" "Object, format name(id), name is optional for human read, id is requisite" -msgstr "" -"関連項目、形式: 名前(id)、名前はオプショナルで、読みやすいように、idは必須で" -"す" +msgstr "関連項目、形式: 名前(id)、名前はオプショナルで、読みやすいように、idは必須です" -#: common/drf/renders/base.py:165 +#: common/drf/renders/base.py:167 msgid "Object, format id" msgstr "関連項目、形式は id" -#: common/drf/renders/base.py:169 +#: common/drf/renders/base.py:171 msgid "" "Objects, format [\"name(id)\", ...], name is optional for human read, id is " "requisite" -msgstr "" -"多関連項目、形式: [\"名前(id)\", ...]、名前はオプショナルで、読みやすいよう" -"に、idは必須です" - -#: common/drf/renders/base.py:171 -msgid "" -"Labels, format [\"key:value\", ...], if label not exists, will create it" -msgstr "" -"タグ、形式: [\"キー:値\", ...]、もしタグが存在しない場合、それを作成します" +msgstr "多関連項目、形式: [\"名前(id)\", ...]、名前はオプショナルで、読みやすいように、idは必須です" #: common/drf/renders/base.py:173 +msgid "Labels, format [\"key:value\", ...], if label not exists, will create it" +msgstr "タグ、形式: [\"キー:値\", ...]、もしタグが存在しない場合、それを作成します" + +#: common/drf/renders/base.py:175 msgid "Objects, format [\"id\", ...]" msgstr "多関連項目、形式は [\"id\", ...]" -#: common/drf/renders/base.py:271 +#: common/drf/renders/base.py:275 msgid "" "{} - The encryption password has not been set - please go to personal " "information -> file encryption password to set the encryption password" -msgstr "" -"{} - 暗号化パスワードが設定されていません-個人情報->ファイル暗号化パスワード" -"に暗号化パスワードを設定してください" +msgstr "{} - 暗号化パスワードが設定されていません-個人情報->ファイル暗号化パスワードに暗号化パスワードを設定してください" + +#: common/drf/renders/mixins.py:37 labels/serializers.py:22 +msgid "Resource count" +msgstr "リソースタイプ" + +#: common/drf/renders/mixins.py:46 +msgid "Export all" +msgstr "すべてエクスポート" + +#: common/drf/renders/mixins.py:48 +msgid "Export only selected items" +msgstr "選択項目のみエクスポート" + +#: common/drf/renders/mixins.py:50 +msgid "Export filtered" +msgstr "エクスポート検索" #: common/exceptions.py:15 xpack/plugins/cloud/ws.py:37 #, python-format @@ -5043,21 +4927,19 @@ msgstr "このアクションでは、MFAの確認が必要です。" msgid "Unexpect error occur" msgstr "予期しないエラーが発生します" -#: common/plugins/es.py:35 +#: common/plugins/es.py:36 msgid "Invalid elasticsearch config" msgstr "無効なElasticsearch構成" -#: common/plugins/es.py:40 +#: common/plugins/es.py:41 msgid "Not Support Elasticsearch8" msgstr "サポートされていません Elasticsearch8" -#: common/plugins/es.py:46 +#: common/plugins/es.py:47 msgid "" "Connection failed: Self-signed certificate used. Please check server " "certificate configuration" -msgstr "" -"接続失敗:自己署名証明書が使用されています,サーバーの証明書設定を確認してく" -"ださい" +msgstr "接続失敗:自己署名証明書が使用されています,サーバーの証明書設定を確認してください" #: common/sdk/im/exceptions.py:23 msgid "Network error, please contact system administrator" @@ -5181,14 +5063,10 @@ msgstr "メールの添付ファイルを送信" #: common/tasks.py:68 msgid "" -"When an account password is changed or an account backup generates " -"attachments, \n" -" this task needs to be executed for sending emails and handling " -"attachments" +"When an account password is changed or an account backup generates attachments, \n" +" this task needs to be executed for sending emails and handling attachments" msgstr "" -"アカウントのパスワードを変更したり、アカウントのバックアップが添付ファイルを" -"生成したりすると、メールと添付ファイルを送信するためのタスクを実行する必要が" -"あります" +"アカウントのパスワードを変更したり、アカウントのバックアップが添付ファイルを生成したりすると、メールと添付ファイルを送信するためのタスクを実行する必要があります" #: common/tasks.py:94 msgid "Upload account backup to external storage" @@ -5198,9 +5076,7 @@ msgstr " セッション映像を外部ストレージにアップロードす msgid "" "When performing an account backup, this task needs to be executed to " "external storage (SFTP)" -msgstr "" -"アカウントのバックアップを実行するときに外部ストレージ(sftp)にアクセスする" -"ため、このタスクを実行します" +msgstr "アカウントのバックアップを実行するときに外部ストレージ(sftp)にアクセスするため、このタスクを実行します" #: common/utils/ip/geoip/utils.py:26 msgid "Invalid ip" @@ -5221,12 +5097,9 @@ msgstr "SMS 認証コードを送信する" #: common/utils/verify_code.py:19 msgid "" -"When resetting a password, forgetting a password, or verifying MFA, this " -"task needs to \n" +"When resetting a password, forgetting a password, or verifying MFA, this task needs to \n" " be executed to send SMS messages" -msgstr "" -"パスワードをリセットするか、パスワードを忘れるか、mfaを検証するときにSMSを送" -"信する必要がある場合、このタスクを実行します" +msgstr "パスワードをリセットするか、パスワードを忘れるか、mfaを検証するときにSMSを送信する必要がある場合、このタスクを実行します" #: common/validators.py:16 msgid "Special char not allowed" @@ -5248,16 +5121,16 @@ msgstr "コードが見つかりません" msgid "The message code provided is invalid or has expired" msgstr "提供されたメッセージコードは無効か期限切れです" -#: jumpserver/conf.py:533 +#: jumpserver/conf.py:534 #, python-brace-format msgid "The verification code is: {code}" msgstr "認証コードは: {code}" -#: jumpserver/conf.py:538 +#: jumpserver/conf.py:539 msgid "Create account successfully" msgstr "アカウントを正常に作成" -#: jumpserver/conf.py:540 +#: jumpserver/conf.py:541 msgid "Your account has been created successfully" msgstr "アカウントが正常に作成されました" @@ -5275,16 +5148,13 @@ msgid "" "configure nginx for url distribution, If you see this page, " "prove that you are not accessing the nginx listening port. Good luck." msgstr "" -"
Lunaは個別にデプロイされたプログラムです。Luna、kokoをデプロイする必要" -"があります。urlディストリビューションにnginxを設定します。
この" -"ページが表示されている場合は、nginxリスニングポートにアクセスしていないことを" -"証明してください。頑張ってください。" +"
" +"Lunaは個別にデプロイされたプログラムです。Luna、kokoをデプロイする必要があります。urlディストリビューションにnginxを設定します。
" +" このページが表示されている場合は、nginxリスニングポートにアクセスしていないことを証明してください。頑張ってください。" #: jumpserver/views/other.py:76 msgid "Websocket server run on port: {}, you should proxy it on nginx" -msgstr "" -"Websocket サーバーはport: {}で実行されます。nginxでプロキシする必要がありま" -"す。" +msgstr "Websocket サーバーはport: {}で実行されます。nginxでプロキシする必要があります。" #: jumpserver/views/other.py:90 msgid "" @@ -5292,10 +5162,8 @@ msgid "" "configure nginx for url distribution, If you see this page, " "prove that you are not accessing the nginx listening port. Good luck." msgstr "" -"
Kokoは個別にデプロイされているプログラムです。Kokoをデプロイする必要が" -"あります。URL配布用にnginxを設定します。
このページが表示されて" -"いる場合は、nginxリスニングポートにアクセスしていないことを証明してください。" -"頑張ってください。" +"
Kokoは個別にデプロイされているプログラムです。Kokoをデプロイする必要があります。URL配布用にnginxを設定します。
" +" このページが表示されている場合は、nginxリスニングポートにアクセスしていないことを証明してください。頑張ってください。" #: labels/apps.py:8 msgid "App Labels" @@ -5317,10 +5185,6 @@ msgstr "リソースID" msgid "Tagged resource" msgstr "関連リソース" -#: labels/serializers.py:22 -msgid "Resource count" -msgstr "リソースタイプ" - #: labels/serializers.py:28 msgid "Cannot contain \":,\"" msgstr "\":,\"を含めることはできません" @@ -5359,27 +5223,23 @@ msgstr "投稿サイトニュース" #: notifications/notifications.py:48 msgid "" -"This task needs to be executed for sending internal messages for system " -"alerts, \n" +"This task needs to be executed for sending internal messages for system alerts, \n" " work orders, and other notifications" msgstr "システムの警告やチケットなどを送信するためには、このタスクを実行します" -#: ops/ansible/inventory.py:117 ops/models/job.py:68 +#: ops/ansible/inventory.py:126 ops/ansible/inventory.py:196 +#: ops/models/job.py:69 msgid "No account available" msgstr "利用可能なアカウントがありません" -#: ops/ansible/inventory.py:298 +#: ops/ansible/inventory.py:318 ops/ansible/inventory.py:360 msgid "Ansible disabled" msgstr "Ansible 無効" -#: ops/ansible/inventory.py:314 +#: ops/ansible/inventory.py:376 msgid "Skip hosts below:" msgstr "次のホストをスキップします: " -#: ops/api/adhoc.py:32 -msgid "Deleting other people's script is not allowed" -msgstr "他人のスクリプトを削除することは許可されない" - #: ops/api/celery.py:66 ops/api/celery.py:81 msgid "Waiting task start" msgstr "タスク開始待ち" @@ -5392,72 +5252,63 @@ msgstr "タスクは存在しません" msgid "Task {} args or kwargs error" msgstr "タスク実行パラメータエラー" -#: ops/api/job.py:68 +#: ops/api/job.py:70 #, python-brace-format msgid "" "Asset ({asset}) must have at least one of the following protocols added: " "SSH, SFTP, or WinRM" -msgstr "" -"資産({asset})には、少なくともSSH、SFTP、WinRMのいずれか一つのプロトコルを追加" -"する必要があります" +msgstr "資産({asset})には、少なくともSSH、SFTP、WinRMのいずれか一つのプロトコルを追加する必要があります" -#: ops/api/job.py:69 +#: ops/api/job.py:71 #, python-brace-format msgid "Asset ({asset}) authorization is missing SSH, SFTP, or WinRM protocol" -msgstr "" -"資産({asset})の認証にはSSH、SFTP、またはWinRMプロトコルが不足しています" +msgstr "資産({asset})の認証にはSSH、SFTP、またはWinRMプロトコルが不足しています" -#: ops/api/job.py:70 +#: ops/api/job.py:72 #, python-brace-format msgid "Asset ({asset}) authorization lacks upload permissions" msgstr "資産({asset})の認証にはアップロード権限が不足しています" -#: ops/api/job.py:158 +#: ops/api/job.py:160 msgid "Duplicate file exists" msgstr "重複したファイルが存在する" -#: ops/api/job.py:163 +#: ops/api/job.py:165 #, python-brace-format msgid "" "File size exceeds maximum limit. Please select a file smaller than {limit}MB" -msgstr "" -"ファイルサイズが最大制限を超えています。{limit}MB より小さいファイルを選択し" -"てください。" +msgstr "ファイルサイズが最大制限を超えています。{limit}MB より小さいファイルを選択してください。" -#: ops/api/job.py:236 +#: ops/api/job.py:238 msgid "" "The task is being created and cannot be interrupted. Please try again later." msgstr "タスクを作成中で、中断できません。後でもう一度お試しください。" #: ops/api/playbook.py:49 -msgid "Deleting other people's playbook is not allowed" -msgstr "他人のplaybookを削除することは許可されない" - -#: ops/api/playbook.py:55 msgid "Currently playbook is being used in a job" msgstr "現在プレイブックは1つのジョブで使用されています" -#: ops/api/playbook.py:128 +#: ops/api/playbook.py:122 msgid "Unsupported file content" msgstr "サポートされていないファイルの内容" -#: ops/api/playbook.py:130 ops/api/playbook.py:176 ops/api/playbook.py:224 +#: ops/api/playbook.py:124 ops/api/playbook.py:170 ops/api/playbook.py:218 msgid "Invalid file path" msgstr "無効なファイルパス" -#: ops/api/playbook.py:202 +#: ops/api/playbook.py:196 msgid "This file can not be rename" msgstr "ファイル名を変更することはできません" -#: ops/api/playbook.py:221 +#: ops/api/playbook.py:215 msgid "File already exists" msgstr "ファイルは既に存在します。" -#: ops/api/playbook.py:239 +#: ops/api/playbook.py:233 msgid "File key is required" msgstr "ファイルキーこのフィールドは必須です" -#: ops/api/playbook.py:242 +#: ops/api/playbook.py:236 msgid "This file can not be delete" msgstr "このファイルを削除できません" @@ -5506,7 +5357,7 @@ msgstr "VCS" msgid "Adhoc" msgstr "コマンド" -#: ops/const.py:39 ops/models/job.py:152 ops/models/playbook.py:89 +#: ops/const.py:39 ops/models/job.py:154 ops/models/playbook.py:89 #: ops/models/variable.py:23 msgid "Playbook" msgstr "Playbook" @@ -5593,17 +5444,19 @@ msgid "no valid program entry found." msgstr "利用可能なプログラムポータルがありません" #: ops/mixin.py:34 ops/mixin.py:166 settings/serializers/auth/ldap.py:74 -#: settings/serializers/auth/ldap_ha.py:57 +#: settings/serializers/auth/ldap_ha.py:56 msgid "Periodic run" msgstr "定期的なパフォーマンス" #: ops/mixin.py:36 ops/mixin.py:113 ops/mixin.py:172 -#: settings/serializers/auth/ldap.py:81 settings/serializers/auth/ldap_ha.py:64 +#: settings/serializers/auth/ldap.py:81 +#: settings/serializers/auth/ldap_ha.py:63 msgid "Interval" msgstr "間隔" #: ops/mixin.py:39 ops/mixin.py:111 ops/mixin.py:169 -#: settings/serializers/auth/ldap.py:78 settings/serializers/auth/ldap_ha.py:61 +#: settings/serializers/auth/ldap.py:78 +#: settings/serializers/auth/ldap_ha.py:60 msgid "Crontab" msgstr "含む" @@ -5627,7 +5480,11 @@ msgstr "ユーザーの実行" msgid "* Please enter a valid crontab expression" msgstr "* 有効なcrontab式を入力してください" -#: ops/mixin.py:204 settings/serializers/auth/mixin.py:12 +#: ops/mixin.py:194 +msgid "Crontab minute must not contain '*'" +msgstr "" + +#: ops/mixin.py:208 settings/serializers/auth/mixin.py:12 msgid "Require interval or crontab setting" msgstr "定期的または定期的に設定を行う必要があります" @@ -5635,18 +5492,19 @@ msgstr "定期的または定期的に設定を行う必要があります" msgid "Pattern" msgstr "パターン" -#: ops/models/adhoc.py:22 ops/models/job.py:149 +#: ops/models/adhoc.py:22 ops/models/job.py:151 msgid "Module" msgstr "モジュール" -#: ops/models/adhoc.py:23 ops/models/celery.py:82 ops/models/job.py:147 +#: ops/models/adhoc.py:23 ops/models/celery.py:82 ops/models/job.py:149 #: terminal/models/component/task.py:14 msgid "Args" msgstr "アルグ" -#: ops/models/adhoc.py:26 ops/models/playbook.py:34 ops/serializers/mixin.py:10 -#: rbac/models/role.py:31 rbac/models/rolebinding.py:46 -#: rbac/serializers/role.py:12 settings/serializers/auth/oauth2.py:37 +#: ops/models/adhoc.py:26 ops/models/playbook.py:34 +#: ops/serializers/mixin.py:10 rbac/models/role.py:31 +#: rbac/models/rolebinding.py:46 rbac/serializers/role.py:12 +#: settings/serializers/auth/oauth2.py:37 msgid "Scope" msgstr "スコープ" @@ -5682,48 +5540,54 @@ msgstr "発売日" msgid "Celery Task Execution" msgstr "Celery タスク実行" -#: ops/models/job.py:150 +#: ops/models/job.py:82 +#, fuzzy +#| msgid "Anonymous account is not supported for this asset" +msgid "Module {} is not suitable for this asset" +msgstr "匿名アカウントはこのプロパティではサポートされていません" + +#: ops/models/job.py:152 msgid "Run dir" msgstr "実行ディレクトリ" -#: ops/models/job.py:151 +#: ops/models/job.py:153 msgid "Timeout (Seconds)" msgstr "タイムアウト(秒)" -#: ops/models/job.py:157 +#: ops/models/job.py:159 msgid "Use Parameter Define" msgstr "パラメータ定義を使用する" -#: ops/models/job.py:158 +#: ops/models/job.py:160 msgid "Parameters define" msgstr "パラメータ定義" -#: ops/models/job.py:159 +#: ops/models/job.py:161 msgid "Periodic variable" msgstr "定期的な実行変数" -#: ops/models/job.py:160 +#: ops/models/job.py:162 msgid "Run as" msgstr "実行アカウント (じっこうアカウント)" -#: ops/models/job.py:162 +#: ops/models/job.py:164 msgid "Run as policy" msgstr "アカウントポリシー " -#: ops/models/job.py:219 ops/models/variable.py:28 ops/serializers/job.py:111 +#: ops/models/job.py:221 ops/models/variable.py:28 ops/serializers/job.py:111 #: terminal/notifications.py:182 msgid "Job" msgstr "ジョブ#ジョブ#" -#: ops/models/job.py:242 +#: ops/models/job.py:244 msgid "Material" msgstr "Material" -#: ops/models/job.py:244 +#: ops/models/job.py:246 msgid "Material Type" msgstr "Material を選択してオプションを設定します。" -#: ops/models/job.py:556 +#: ops/models/job.py:558 msgid "Job Execution" msgstr "ジョブ実行" @@ -5746,9 +5610,8 @@ msgid "" "the resulting environment variable will be jms_name, and it can be " "referenced in the script using {{ jms_name }}" msgstr "" -"スクリプトで使用する変数名は、固定接頭辞 jms_ + 入力された変数名となります。" -"例えば、変数名が name の場合、最終的に生成される環境変数は jms_name となりま" -"す。スクリプト内で引用する際は {{ jms_name }} を使用します。" +"スクリプトで使用する変数名は、固定接頭辞 jms_ + 入力された変数名となります。例えば、変数名が name の場合、最終的に生成される環境変数は " +"jms_name となります。スクリプト内で引用する際は {{ jms_name }} を使用します。" #: ops/models/variable.py:16 ops/serializers/variable.py:32 msgid "Default Value" @@ -5828,8 +5691,7 @@ msgid "" "Each item is on a separate line, with each line separated by a colon. The " "part before the colon is the display content, and the part after the colon " "is the value." -msgstr "" -"各項目を一行ごとに、各行は英語のコロンで前の表示内容と後の値を分割できます" +msgstr "各項目を一行ごとに、各行は英語のコロンで前の表示内容と後の値を分割できます" #: ops/tasks.py:54 msgid "Run ansible task" @@ -5839,9 +5701,7 @@ msgstr "Ansible タスクを実行する" msgid "" "Execute scheduled adhoc and playbooks, periodically invoking the task for " "execution" -msgstr "" -"タイムスケジュールのショートカットコマンドやplaybookを実行するときは、このタ" -"スクを呼び出します" +msgstr "タイムスケジュールのショートカットコマンドやplaybookを実行するときは、このタスクを呼び出します" #: ops/tasks.py:88 msgid "Run ansible task execution" @@ -5849,9 +5709,7 @@ msgstr "Ansible タスクの実行を開始する" #: ops/tasks.py:91 msgid "Execute the task when manually adhoc or playbooks" -msgstr "" -"手動でショートカットコマンドやplaybookを実行するときは、このタスクを実行しま" -"す" +msgstr "手動でショートカットコマンドやplaybookを実行するときは、このタスクを実行します" #: ops/tasks.py:106 msgid "Clear celery periodic tasks" @@ -5867,15 +5725,11 @@ msgstr "定期的なタスクの作成または更新" #: ops/tasks.py:134 msgid "" -"With version iterations, new tasks may be added, or task names and execution " -"times may \n" -" be modified. Therefore, upon system startup, tasks will be " -"registered or the parameters \n" +"With version iterations, new tasks may be added, or task names and execution times may \n" +" be modified. Therefore, upon system startup, tasks will be registered or the parameters \n" " of scheduled tasks will be updated" msgstr "" -"バージョンがアップグレードされると、新しいタスクが追加され、タスクの名前や実" -"行時間が変更される可能性があるため、システムが起動すると、タスクを登録した" -"り、タスクのパラメータを更新したりします" +"バージョンがアップグレードされると、新しいタスクが追加され、タスクの名前や実行時間が変更される可能性があるため、システムが起動すると、タスクを登録したり、タスクのパラメータを更新したりします" #: ops/tasks.py:147 msgid "Periodic check service performance" @@ -5883,13 +5737,10 @@ msgstr "サービスのパフォーマンスを定期的に確認する" #: ops/tasks.py:149 msgid "" -"Check every hour whether each component is offline and whether the CPU, " -"memory, \n" -" and disk usage exceed the thresholds, and send an alert message to " -"the administrator" +"Check every hour whether each component is offline and whether the CPU, memory, \n" +" and disk usage exceed the thresholds, and send an alert message to the administrator" msgstr "" -"毎時、各コンポーネントがオフラインになっていないか、CPU、メモリ、ディスク使用" -"率が閾値を超えていないかをチェックし、管理者にメッセージで警告を送ります" +"毎時、各コンポーネントがオフラインになっていないか、CPU、メモリ、ディスク使用率が閾値を超えていないかをチェックし、管理者にメッセージで警告を送ります" #: ops/tasks.py:159 msgid "Clean up unexpected jobs" @@ -5897,17 +5748,12 @@ msgstr "例外ジョブのクリーンアップ" #: ops/tasks.py:161 msgid "" -"Due to exceptions caused by executing adhoc and playbooks in the Job " -"Center, \n" -" which result in the task status not being updated, the system will " -"clean up abnormal jobs \n" -" that have not been completed for more than 3 hours every hour and " -"mark these tasks as \n" +"Due to exceptions caused by executing adhoc and playbooks in the Job Center, \n" +" which result in the task status not being updated, the system will clean up abnormal jobs \n" +" that have not been completed for more than 3 hours every hour and mark these tasks as \n" " failed" msgstr "" -"ショートカットコマンドやplaybookを実行するジョブセンターでは異常が発生し、タ" -"スクの状態が更新されないことがあります。そのため、システムは毎時間、3時間以上" -"終了していない異常なジョブをクリーニングし、タスクを失敗とマークします" +"ショートカットコマンドやplaybookを実行するジョブセンターでは異常が発生し、タスクの状態が更新されないことがあります。そのため、システムは毎時間、3時間以上終了していない異常なジョブをクリーニングし、タスクを失敗とマークします" #: ops/tasks.py:174 msgid "Clean job_execution db record" @@ -5915,18 +5761,13 @@ msgstr "ジョブセンター実行履歴のクリーンアップ" #: ops/tasks.py:176 msgid "" -"Due to the execution of adhoc and playbooks in the Job Center, execution " -"records will \n" -" be generated. The system will clean up records that exceed the " -"retention period every day \n" -" at 2 a.m., based on the configuration of 'System Settings - Tasks - " -"Regular clean-up - \n" +"Due to the execution of adhoc and playbooks in the Job Center, execution records will \n" +" be generated. The system will clean up records that exceed the retention period every day \n" +" at 2 a.m., based on the configuration of 'System Settings - Tasks - Regular clean-up - \n" " Job execution retention days'" msgstr "" -"ショートカットコマンドやplaybookを実行するジョブセンターでは、実行レコードが" -"生成されます。システムは、システム設定-タスクリスト-定期的なクリーニング-ジョ" -"ブセンター実行履歴の設定に基づき、毎日午前2時に保存期間を超過したレコードをク" -"リーニングします。" +"ショートカットコマンドやplaybookを実行するジョブセンターでは、実行レコードが生成されます。システムは、システム設定-タスクリスト-" +"定期的なクリーニング-ジョブセンター実行履歴の設定に基づき、毎日午前2時に保存期間を超過したレコードをクリーニングします。" #: ops/templates/ops/celery_task_log.html:4 msgid "Task log" @@ -5976,8 +5817,7 @@ msgstr "現在の組織 ({}) は削除できません" msgid "" "LDAP synchronization is set to the current organization. Please switch to " "another organization before deleting" -msgstr "" -"LDAP 同期は現在の組織に設定されます。削除する前に別の組織に切り替えてください" +msgstr "LDAP 同期は現在の組織に設定されます。削除する前に別の組織に切り替えてください" #: orgs/api.py:75 msgid "The organization have resource ({}) cannot be deleted" @@ -5996,7 +5836,8 @@ msgstr "組織を選択してから保存してください" #: rbac/serializers/rolebinding.py:44 settings/serializers/auth/base.py:53 #: terminal/templates/terminal/_msg_command_warning.html:21 #: terminal/templates/terminal/_msg_session_sharing.html:14 -#: tickets/models/ticket/general.py:303 tickets/serializers/ticket/ticket.py:61 +#: tickets/models/ticket/general.py:303 +#: tickets/serializers/ticket/ticket.py:61 msgid "Organization" msgstr "組織" @@ -6030,7 +5871,7 @@ msgid "Can not delete virtual org" msgstr "仮想組織を削除できませんでした" #: orgs/serializers.py:10 perms/serializers/permission.py:59 -#: rbac/serializers/role.py:27 users/serializers/group.py:54 +#: rbac/serializers/role.py:27 users/serializers/group.py:53 msgid "Users amount" msgstr "ユーザー数" @@ -6160,8 +6001,8 @@ msgid "" "Accounts, format [\"@virtual\", \"root\", \"%template_id\"], virtual " "choices: @ALL, @SPEC, @USER, @ANON, @INPUT" msgstr "" -"アカウント、形式 [\"@バーチャルアカウント\", \"root\", \"%テンプレートid\"], " -"バーチャルオプション: @ALL, @SPEC, @USER, @ANON, @INPUT" +"アカウント、形式 [\"@バーチャルアカウント\", \"root\", \"%テンプレートid\"], バーチャルオプション: @ALL, " +"@SPEC, @USER, @ANON, @INPUT" #: perms/serializers/permission.py:49 msgid "Protocols, format [\"ssh\", \"rdp\", \"vnc\"] or [\"all\"]" @@ -6177,19 +6018,12 @@ msgstr "アセット認証ルールの有効期限が切れていることを確 #: perms/tasks.py:30 msgid "" -"The cache of organizational collections, which have completed user " -"authorization tree \n" -" construction, will expire. Therefore, expired collections need to be " -"cleared from the \n" -" cache, and this task will be executed periodically based on the time " -"interval specified \n" -" by PERM_EXPIRED_CHECK_PERIODIC in the system configuration file " -"config.txt" +"The cache of organizational collections, which have completed user authorization tree \n" +" construction, will expire. Therefore, expired collections need to be cleared from the \n" +" cache, and this task will be executed periodically based on the time interval specified \n" +" by PERM_EXPIRED_CHECK_PERIODIC in the system configuration file config.txt" msgstr "" -"利用者権限ツリーの組織集合キャッシュは期限切れになるため、期限切れの集合を" -"キャッシュからクリアする必要があります。このActionは、システム設定ファイル" -"config.txt中のPERM_EXPIRED_CHECK_PERIODICの時間間隔に基づいて定期的に実行され" -"ます" +"利用者権限ツリーの組織集合キャッシュは期限切れになるため、期限切れの集合をキャッシュからクリアする必要があります。このActionは、システム設定ファイルconfig.txt中のPERM_EXPIRED_CHECK_PERIODICの時間間隔に基づいて定期的に実行されます" #: perms/tasks.py:49 msgid "Send asset permission expired notification" @@ -6197,16 +6031,12 @@ msgstr "アセット許可の有効期限通知を送信する" #: perms/tasks.py:51 msgid "" -"Check every day at 10 a.m. and send a notification message to users " -"associated with \n" -" assets whose authorization is about to expire, as well as to the " -"organization's \n" -" administrators, 3 days in advance, to remind them that the asset " -"authorization will \n" +"Check every day at 10 a.m. and send a notification message to users associated with \n" +" assets whose authorization is about to expire, as well as to the organization's \n" +" administrators, 3 days in advance, to remind them that the asset authorization will \n" " expire in a few days" msgstr "" -"毎日午前10時にチェックを行い、資産の承認が近く期限切れになる利用者及びその組" -"織の管理者に、資産が何日で期限切れになるかを3日前に通知を送ります" +"毎日午前10時にチェックを行い、資産の承認が近く期限切れになる利用者及びその組織の管理者に、資産が何日で期限切れになるかを3日前に通知を送ります" #: perms/templates/perms/_msg_item_permissions_expire.html:7 #: perms/templates/perms/_msg_permed_items_expire.html:7 @@ -6314,8 +6144,7 @@ msgstr "全ての組織" msgid "" "User last role in org, can not be delete, you can remove user from org " "instead" -msgstr "" -"ユーザーの最後のロールは削除できません。ユーザーを組織から削除できます。" +msgstr "ユーザーの最後のロールは削除できません。ユーザーを組織から削除できます。" #: rbac/models/rolebinding.py:200 msgid "Organization role binding" @@ -6386,7 +6215,7 @@ msgid "Storage" msgstr "ストレージ" #: rbac/tree.py:61 terminal/models/applet/applet.py:53 -#: terminal/models/applet/applet.py:328 terminal/models/applet/host.py:30 +#: terminal/models/applet/applet.py:369 terminal/models/applet/host.py:30 #: terminal/serializers/applet.py:15 msgid "Applet" msgstr "リモートアプリケーション" @@ -6446,9 +6275,7 @@ msgstr "SMTP設定のテスト" #: settings/api/ldap.py:92 msgid "" "Users are not synchronized, please click the user synchronization button" -msgstr "" -"ユーザーは同期されていません。「ユーザーを同期」ボタンをクリックしてくださ" -"い。" +msgstr "ユーザーは同期されていません。「ユーザーを同期」ボタンをクリックしてください。" #: settings/api/sms.py:142 msgid "Invalid SMS platform" @@ -6605,9 +6432,7 @@ msgid "" "information, the system will automatically create the user using this email " "suffix" msgstr "" -"第三者ユーザーの認証が成功した後、第三者認証サービスプラットフォームがユー" -"ザーのメール情報を返さなかった場合、システムは自動的にこのメールのサフィック" -"スでユーザーを作成します" +"第三者ユーザーの認証が成功した後、第三者認証サービスプラットフォームがユーザーのメール情報を返さなかった場合、システムは自動的にこのメールのサフィックスでユーザーを作成します" #: settings/serializers/auth/base.py:37 msgid "Forgot Password URL" @@ -6626,24 +6451,21 @@ msgid "" "Should an flash page be displayed before the user is redirected to third-" "party authentication when the administrator enables third-party redirect " "authentication" -msgstr "" -"管理者が第三者へのリダイレクトの認証を有効にした場合、ユーザーが第三者の認証" -"にリダイレクトされる前に Flash ページを表示するかどうか" +msgstr "管理者が第三者へのリダイレクトの認証を有効にした場合、ユーザーが第三者の認証にリダイレクトされる前に Flash ページを表示するかどうか" #: settings/serializers/auth/base.py:55 msgid "" "When you create a user, you associate the user to the organization of your " "choice. Users always belong to the Default organization." -msgstr "" -"ユーザーを作成するときは、そのユーザーを選択した組織に関連付けます。ユーザー" -"は常にデフォルト組織に属します。" +msgstr "ユーザーを作成するときは、そのユーザーを選択した組織に関連付けます。ユーザーは常にデフォルト組織に属します。" #: settings/serializers/auth/cas.py:12 settings/serializers/auth/cas.py:14 msgid "CAS" msgstr "CAS" #: settings/serializers/auth/cas.py:15 settings/serializers/auth/ldap.py:45 -#: settings/serializers/auth/ldap_ha.py:28 settings/serializers/auth/oidc.py:61 +#: settings/serializers/auth/ldap_ha.py:27 +#: settings/serializers/auth/oidc.py:61 msgid "Server" msgstr "LDAPサーバー" @@ -6668,9 +6490,11 @@ msgstr "ユーザー名のプロパティ" msgid "Enable attributes map" msgstr "属性マップの有効化" -#: settings/serializers/auth/cas.py:34 settings/serializers/auth/dingtalk.py:18 +#: settings/serializers/auth/cas.py:34 +#: settings/serializers/auth/dingtalk.py:18 #: settings/serializers/auth/feishu.py:18 settings/serializers/auth/lark.py:17 -#: settings/serializers/auth/ldap.py:67 settings/serializers/auth/ldap_ha.py:50 +#: settings/serializers/auth/ldap.py:67 +#: settings/serializers/auth/ldap_ha.py:49 #: settings/serializers/auth/oauth2.py:60 settings/serializers/auth/oidc.py:39 #: settings/serializers/auth/saml2.py:35 settings/serializers/auth/slack.py:18 #: settings/serializers/auth/wecom.py:18 @@ -6682,8 +6506,7 @@ msgid "" "User attribute mapping, where the `key` is the CAS service user attribute " "name and the `value` is the JumpServer user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は CAS サービスのユーザー属性名で、" -"`value` は JumpServer のユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は CAS サービスのユーザー属性名で、`value` は JumpServer のユーザー属性名です" #: settings/serializers/auth/cas.py:41 msgid "Create user" @@ -6693,9 +6516,7 @@ msgstr "そうでない場合はユーザーを作成" msgid "" "After successful user authentication, if the user does not exist, " "automatically create the user" -msgstr "" -"ユーザー認証が成功した後、ユーザーが存在しない場合、自動的にユーザーが作成さ" -"れます" +msgstr "ユーザー認証が成功した後、ユーザーが存在しない場合、自動的にユーザーが作成されます" #: settings/serializers/auth/dingtalk.py:16 msgid "Dingtalk" @@ -6706,16 +6527,15 @@ msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the DingTalk service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" -"`value` は ディントーク サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は ディントーク " +"サービスのユーザー属性名です" #: settings/serializers/auth/feishu.py:20 msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the FeiShu service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" -"`value` は フェイシュ サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は フェイシュ サービスのユーザー属性名です" #: settings/serializers/auth/lark.py:13 users/models/user/_source.py:22 msgid "Lark" @@ -6726,10 +6546,9 @@ msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the Lark service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" -"`value` は Lark サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は Lark サービスのユーザー属性名です" -#: settings/serializers/auth/ldap.py:42 settings/serializers/auth/ldap.py:104 +#: settings/serializers/auth/ldap.py:42 settings/serializers/auth/ldap.py:108 msgid "LDAP" msgstr "LDAP" @@ -6737,88 +6556,107 @@ msgstr "LDAP" msgid "LDAP server URI" msgstr "FIDOサーバーID" -#: settings/serializers/auth/ldap.py:49 settings/serializers/auth/ldap_ha.py:32 +#: settings/serializers/auth/ldap.py:49 +#: settings/serializers/auth/ldap_ha.py:31 msgid "Bind DN" msgstr "DN のバインド" -#: settings/serializers/auth/ldap.py:50 settings/serializers/auth/ldap_ha.py:33 +#: settings/serializers/auth/ldap.py:50 +#: settings/serializers/auth/ldap_ha.py:32 msgid "Binding Distinguished Name" msgstr "バインドディレクトリ管理者" -#: settings/serializers/auth/ldap.py:54 settings/serializers/auth/ldap_ha.py:37 +#: settings/serializers/auth/ldap.py:54 +#: settings/serializers/auth/ldap_ha.py:36 msgid "Binding password" msgstr "古いパスワード" -#: settings/serializers/auth/ldap.py:57 settings/serializers/auth/ldap_ha.py:40 +#: settings/serializers/auth/ldap.py:57 +#: settings/serializers/auth/ldap_ha.py:39 msgid "Search OU" msgstr "システムアーキテクチャ" -#: settings/serializers/auth/ldap.py:59 settings/serializers/auth/ldap_ha.py:42 +#: settings/serializers/auth/ldap.py:59 +#: settings/serializers/auth/ldap_ha.py:41 msgid "" "User Search Base, if there are multiple OUs, you can separate them with the " "`|` symbol" -msgstr "" -"ユーザー検索ライブラリ、複数のOUがある場合は`|`の記号で分けることができます" +msgstr "ユーザー検索ライブラリ、複数のOUがある場合は`|`の記号で分けることができます" -#: settings/serializers/auth/ldap.py:63 settings/serializers/auth/ldap_ha.py:46 +#: settings/serializers/auth/ldap.py:63 +#: settings/serializers/auth/ldap_ha.py:45 msgid "Search filter" msgstr "ユーザー検索フィルター" -#: settings/serializers/auth/ldap.py:64 settings/serializers/auth/ldap_ha.py:47 +#: settings/serializers/auth/ldap.py:64 +#: settings/serializers/auth/ldap_ha.py:46 #, python-format msgid "Selection could include (cn|uid|sAMAccountName=%(user)s)" msgstr "選択は (cnまたはuidまたはsAMAccountName)=%(user)s)" -#: settings/serializers/auth/ldap.py:69 settings/serializers/auth/ldap_ha.py:52 +#: settings/serializers/auth/ldap.py:69 +#: settings/serializers/auth/ldap_ha.py:51 msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the LDAP service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" -"`value` は LDAP サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は LDAP サービスのユーザー属性名です" -#: settings/serializers/auth/ldap.py:85 settings/serializers/auth/ldap_ha.py:68 +#: settings/serializers/auth/ldap.py:85 +#: settings/serializers/auth/ldap_ha.py:67 msgid "Connect timeout (s)" msgstr "接続タイムアウト (秒)" -#: settings/serializers/auth/ldap.py:90 settings/serializers/auth/ldap_ha.py:73 +#: settings/serializers/auth/ldap.py:88 +#: settings/serializers/auth/ldap_ha.py:70 +msgid "Strict sync" +msgstr "厳格モード" + +#: settings/serializers/auth/ldap.py:89 +#: settings/serializers/auth/ldap_ha.py:71 +msgid "" +"In strict mode, users not found in LDAP will be disabled during full or " +"automatic sync" +msgstr "厳格モードを有効にすると、LDAPに見つからないユーザーの全権または自動同期が無効になります。" + +#: settings/serializers/auth/ldap.py:94 +#: settings/serializers/auth/ldap_ha.py:76 msgid "User DN cache timeout (s)" msgstr "User DN キャッシュの有効期限 (秒)" -#: settings/serializers/auth/ldap.py:92 +#: settings/serializers/auth/ldap.py:96 msgid "" "Caching the User DN obtained during user login authentication can " "effectively improve the speed of user authentication., 0 means no " "cache
If the user OU structure has been adjusted, click Submit to clear " "the user DN cache" msgstr "" -"ユーザーがログイン認証時にクエリした User DN をキャッシュすると、ユーザー認証" -"の速度を効果的に改善できます。
ユーザーの OU 構造が調整された場合は、提出" -"をクリックしてユーザーの DN キャッシュをクリアできます。" +"ユーザーがログイン認証時にクエリした User DN をキャッシュすると、ユーザー認証の速度を効果的に改善できます。
ユーザーの OU " +"構造が調整された場合は、提出をクリックしてユーザーの DN キャッシュをクリアできます。" -#: settings/serializers/auth/ldap.py:98 settings/serializers/auth/ldap_ha.py:81 +#: settings/serializers/auth/ldap.py:102 +#: settings/serializers/auth/ldap_ha.py:84 msgid "Search paged size (piece)" msgstr "ページサイズを検索 (じょう)" -#: settings/serializers/auth/ldap_ha.py:25 -#: settings/serializers/auth/ldap_ha.py:87 +#: settings/serializers/auth/ldap_ha.py:24 +#: settings/serializers/auth/ldap_ha.py:90 msgid "LDAP HA" msgstr "LDAP 認証" -#: settings/serializers/auth/ldap_ha.py:29 +#: settings/serializers/auth/ldap_ha.py:28 msgid "LDAP HA server URI" msgstr "LDAP HA サービスドメイン名" -#: settings/serializers/auth/ldap_ha.py:75 +#: settings/serializers/auth/ldap_ha.py:78 msgid "" "Caching the User DN obtained during user login authentication can " -"effectivelyimprove the speed of user authentication., 0 means no cache
If " -"the user OU structure has been adjusted, click Submit to clear the user DN " +"effectivelyimprove the speed of user authentication., 0 means no cache
If" +" the user OU structure has been adjusted, click Submit to clear the user DN " "cache" msgstr "" -"ユーザーがログイン認証時にクエリされた User DN をキャッシュすることで、ユー" -"ザー認証の速度を効果的に向上させることができます
ユーザーの OU 構造が調整" -"された場合は、送信をクリックして User DN のキャッシュをクリアできます" +"ユーザーがログイン認証時にクエリされた User DN をキャッシュすることで、ユーザー認証の速度を効果的に向上させることができます
ユーザーの " +"OU 構造が調整された場合は、送信をクリックして User DN のキャッシュをクリアできます" #: settings/serializers/auth/oauth2.py:19 #: settings/serializers/auth/oauth2.py:22 @@ -6862,7 +6700,8 @@ msgid "End session endpoint" msgstr "プロバイダーのセッション終了エンドポイント" #: settings/serializers/auth/oauth2.py:57 -msgid "When the user signs out, they also be logged out from the OAuth2 server" +msgid "" +"When the user signs out, they also be logged out from the OAuth2 server" msgstr "ユーザーがログアウトすると、OAuth2 サーバからもログアウトします" #: settings/serializers/auth/oauth2.py:62 @@ -6870,11 +6709,11 @@ msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the OAuth2 service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" -"`value` は OAuth2 サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は OAuth2 " +"サービスのユーザー属性名です" -#: settings/serializers/auth/oauth2.py:67 settings/serializers/auth/oidc.py:113 -#: settings/serializers/auth/saml2.py:45 +#: settings/serializers/auth/oauth2.py:67 +#: settings/serializers/auth/oidc.py:113 settings/serializers/auth/saml2.py:45 msgid "Always update user" msgstr "常にユーザーを更新" @@ -6907,8 +6746,7 @@ msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the OIDC service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" -"`value` は OIDC サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は OIDC サービスのユーザー属性名です" #: settings/serializers/auth/oidc.py:45 msgid "Enable PKCE" @@ -6926,9 +6764,7 @@ msgstr "Keycloakを使用する" msgid "" "Use Keycloak as the OpenID Connect server, or use standard OpenID Connect " "Protocol" -msgstr "" -"Keycloak を OpenID Connect サーバとして使用するか、標準的な OpenID Connect プ" -"ロトコルを使用する" +msgstr "Keycloak を OpenID Connect サーバとして使用するか、標準的な OpenID Connect プロトコルを使用する" #: settings/serializers/auth/oidc.py:64 msgid "Realm name" @@ -6987,9 +6823,7 @@ msgid "" "The hostname can using passkey auth, If not set, will use request host and " "the request host in DOMAINS, If multiple domains, use comma to separate" msgstr "" -"パスキー認証を使用できるホスト名、設定されていない場合は、リクエストホストと" -"DOMAINSのリクエストホストを使用します。複数のドメインの場合は、カンマで区切り" -"ます" +"パスキー認証を使用できるホスト名、設定されていない場合は、リクエストホストとDOMAINSのリクエストホストを使用します。複数のドメインの場合は、カンマで区切ります" #: settings/serializers/auth/passkey.py:22 msgid "FIDO Server name" @@ -7000,10 +6834,9 @@ msgid "OTP in RADIUS" msgstr "Radius のOTP" #: settings/serializers/auth/radius.py:24 -msgid "* Using OTP in RADIUS means users can employ RADIUS as a method for MFA" -msgstr "" -"* RADIUSでOTPを使用するということは、ユーザーはRADIUSをMFAの方法として使用す" -"ることができる" +msgid "" +"* Using OTP in RADIUS means users can employ RADIUS as a method for MFA" +msgstr "* RADIUSでOTPを使用するということは、ユーザーはRADIUSをMFAの方法として使用することができる" #: settings/serializers/auth/saml2.py:12 settings/serializers/auth/saml2.py:15 msgid "SAML2" @@ -7033,9 +6866,7 @@ msgstr "SP 証明書" msgid "" "User attribute mapping, where the `key` is the SAML2 service user attribute " "name and the `value` is the JumpServer user attribute name" -msgstr "" -"ユーザー属性マッピング(`key`はSAML2サービスのユーザー属性名、`value`は" -"JumpServerのユーザー属性名)" +msgstr "ユーザー属性マッピング(`key`はSAML2サービスのユーザー属性名、`value`はJumpServerのユーザー属性名)" #: settings/serializers/auth/saml2.py:43 msgid "When the user signs out, they also be logged out from the SAML2 server" @@ -7046,8 +6877,7 @@ msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the Slack service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" -"`value` は Slack サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は Slack サービスのユーザー属性名です" #: settings/serializers/auth/sms.py:18 msgid "Enable Short Message Service (SMS)" @@ -7112,13 +6942,11 @@ msgstr "ビジネス・タイプ(Application id)" #: settings/serializers/auth/sms.py:85 #, python-brace-format msgid "" -"Template need contain {code} and Signature + template length does not exceed " -"67 words. For example, your verification code is {code}, which is valid for " -"5 minutes. Please do not disclose it to others." +"Template need contain {code} and Signature + template length does not exceed" +" 67 words. For example, your verification code is {code}, which is valid for" +" 5 minutes. Please do not disclose it to others." msgstr "" -"テンプレートには{code}を含める必要があり、署名+テンプレートの長さは67ワード未" -"満です。たとえば、認証コードは{code}で、有効期間は5分です。他の人には言わない" -"でください。" +"テンプレートには{code}を含める必要があり、署名+テンプレートの長さは67ワード未満です。たとえば、認証コードは{code}で、有効期間は5分です。他の人には言わないでください。" #: settings/serializers/auth/sms.py:94 #, python-brace-format @@ -7139,8 +6967,7 @@ msgstr "SSO Token認証の有効化" #: settings/serializers/auth/sso.py:17 msgid "Other service can using SSO token login to JumpServer without password" -msgstr "" -"他のサービスはパスワードなしでJumpServerへのSSOトークンログインを使用できます" +msgstr "他のサービスはパスワードなしでJumpServerへのSSOトークンログインを使用できます" #: settings/serializers/auth/sso.py:20 msgid "SSO auth key TTL" @@ -7156,8 +6983,8 @@ msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the WeCom service user attribute name" msgstr "" -"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、" -"`value` は エンタープライズ WeChat サービスのユーザー属性名です" +"ユーザー属性のマッピング、ここで `key` は JumpServer のユーザー属性名で、`value` は エンタープライズ WeChat " +"サービスのユーザー属性名です" #: settings/serializers/basic.py:11 msgid "Site URL" @@ -7165,11 +6992,9 @@ msgstr "サイトURL" #: settings/serializers/basic.py:13 msgid "" -"Site URL is the externally accessible address of the current product service " -"and is usually used in links in system emails" -msgstr "" -"サイトURLは、現在の製品サービスの外部からアクセス可能なアドレスであり、通常は" -"システムメール内のリンクに使用されます" +"Site URL is the externally accessible address of the current product service" +" and is usually used in links in system emails" +msgstr "サイトURLは、現在の製品サービスの外部からアクセス可能なアドレスであり、通常はシステムメール内のリンクに使用されます" #: settings/serializers/basic.py:18 msgid "User guide url" @@ -7194,9 +7019,7 @@ msgstr "ドキュメントリンク" #: settings/serializers/basic.py:27 msgid "" "Document URL refers to the address in the top navigation bar Help - Document" -msgstr "" -"ドキュメントURLは、上部ナビゲーションバーのアドレスを指します。ヘルプ - ド" -"キュメント" +msgstr "ドキュメントURLは、上部ナビゲーションバーのアドレスを指します。ヘルプ - ドキュメント" #: settings/serializers/basic.py:30 msgid "Support URL" @@ -7205,8 +7028,7 @@ msgstr "サポートリンク" #: settings/serializers/basic.py:31 msgid "" "Support URL refers to the address in the top navigation bar Help - Support" -msgstr "" -"サポートURLは、上部ナビゲーションバーのアドレスを指します。ヘルプ - サポート" +msgstr "サポートURLは、上部ナビゲーションバーのアドレスを指します。ヘルプ - サポート" #: settings/serializers/basic.py:44 msgid "Organization name already exists" @@ -7257,8 +7079,7 @@ msgid "" "Session, record, command will be delete if more than duration, only in " "database, OSS will not be affected." msgstr "" -"この期間を超えるセッション、録音、およびコマンド レコードは削除されます (デー" -"タベースのバックアップに影響し、OSS などには影響しません)" +"この期間を超えるセッション、録音、およびコマンド レコードは削除されます (データベースのバックアップに影響し、OSS などには影響しません)" #: settings/serializers/cleaning.py:53 msgid "Change secret and push record retention days (day)" @@ -7296,9 +7117,8 @@ msgid "" "accounts that exceed the predetermined number. If the value reaches or " "exceeds 999 (default), no historical account deletion will be performed" msgstr "" -"特定の値が 999 未満の場合、システムは毎晩自動的にタスクを実行します。つまり、" -"所定の数を超える履歴アカウントを確認して削除します。 値が 999 以上の場合、履" -"歴アカウントの削除は実行されません。" +"特定の値が 999 未満の場合、システムは毎晩自動的にタスクを実行します。つまり、所定の数を超える履歴アカウントを確認して削除します。 値が 999 " +"以上の場合、履歴アカウントの削除は実行されません。" #: settings/serializers/feature.py:87 msgid "Mount Point" @@ -7386,9 +7206,7 @@ msgstr "ユーザーの実行" #: settings/serializers/feature.py:187 msgid "" "Allow users to execute batch commands in the Workbench - Job Center - Adhoc" -msgstr "" -"ユーザーがワークベンチ - ジョブセンター - Adhocでバッチコマンドを実行すること" -"を許可します" +msgstr "ユーザーがワークベンチ - ジョブセンター - Adhocでバッチコマンドを実行することを許可します" #: settings/serializers/feature.py:191 msgid "Command blacklist" @@ -7414,9 +7232,7 @@ msgstr "仮想アプリケーション" msgid "" "Virtual applications, you can use the Linux operating system as an " "application server in remote applications." -msgstr "" -"仮想アプリケーションで、リモートアプリケーションのサーバーとしてLinuxオペレー" -"ティングシステムを使用できます。" +msgstr "仮想アプリケーションで、リモートアプリケーションのサーバーとしてLinuxオペレーティングシステムを使用できます。" #: settings/serializers/msg.py:24 msgid "SMTP" @@ -7428,9 +7244,7 @@ msgstr "交換" #: settings/serializers/msg.py:34 msgid "The user to be used for email server authentication" -msgstr "" -"メールサーバーにログインするためのユーザー名。通常、これはあなたのメールアド" -"レスです" +msgstr "メールサーバーにログインするためのユーザー名。通常、これはあなたのメールアドレスです" #: settings/serializers/msg.py:38 msgid "" @@ -7456,9 +7270,7 @@ msgid "" "server. In most email documentation this type of TLS connection is referred " "to as SSL. It is generally used on port 465" msgstr "" -"SMTPサーバーとの通信時に、暗黙のTLS(安全)接続を使用するかどうか。ほとんどの" -"メール文書では、このタイプのTLS接続はSSLと呼ばれます。通常、ポート465を使用し" -"ます" +"SMTPサーバーとの通信時に、暗黙のTLS(安全)接続を使用するかどうか。ほとんどのメール文書では、このタイプのTLS接続はSSLと呼ばれます。通常、ポート465を使用します" #: settings/serializers/msg.py:54 msgid "Use TLS" @@ -7468,9 +7280,7 @@ msgstr "TLSの使用" msgid "" "Whether to use a TLS (secure) connection when talking to the SMTP server. " "This is used for explicit TLS connections, generally on port 587" -msgstr "" -"SMTPサーバーとの通信時に、TLS(安全)接続を使用するかどうか。これは明示的な" -"TLS接続を使用します、通常ポート587を使用します" +msgstr "SMTPサーバーとの通信時に、TLS(安全)接続を使用するかどうか。これは明示的なTLS接続を使用します、通常ポート587を使用します" #: settings/serializers/msg.py:64 msgid "Subject prefix" @@ -7478,11 +7288,9 @@ msgstr "件名プレフィックス" #: settings/serializers/msg.py:69 msgid "" -"Tips: When creating a user, send the subject of the email (eg:Create account " -"successfully)" -msgstr "" -"ヒント: ユーザーを作成するときに、メールの件名を送信します (例: アカウントを" -"正常に作成)" +"Tips: When creating a user, send the subject of the email (eg:Create account" +" successfully)" +msgstr "ヒント: ユーザーを作成するときに、メールの件名を送信します (例: アカウントを正常に作成)" #: settings/serializers/msg.py:73 msgid "Honorific" @@ -7490,17 +7298,14 @@ msgstr "ユーザー敬語の作成" #: settings/serializers/msg.py:74 msgid "Tips: When creating a user, send the honorific of the email (eg:Hello)" -msgstr "" -"ヒント: ユーザーを作成するときは、メールの敬語を送信します (例: こんにちは)" +msgstr "ヒント: ユーザーを作成するときは、メールの敬語を送信します (例: こんにちは)" #: settings/serializers/msg.py:80 #, python-brace-format msgid "" "Tips: When creating a user, send the content of the email, support " "{username} {name} {email} label" -msgstr "" -"ヒント:ユーザーの作成時にパスワード設定メールの内容を送信し、{username}{name}" -"{email}ラベルをサポートします。" +msgstr "ヒント:ユーザーの作成時にパスワード設定メールの内容を送信し、{username}{name}{email}ラベルをサポートします。" #: settings/serializers/msg.py:84 msgid "Tips: Email signature (eg:jumpserver)" @@ -7517,9 +7322,7 @@ msgstr "グループ化されていないノードを表示" #: settings/serializers/other.py:12 msgid "Perm single to ungroup node" msgstr "" -"グループ化されていないノードに個別に許可された資産を配置し、資産が存在する" -"ノードが表示されないようにしますが、そのノードが許可されていないという質問に" -"質問" +"グループ化されていないノードに個別に許可された資産を配置し、資産が存在するノードが表示されないようにしますが、そのノードが許可されていないという質問に質問" #: settings/serializers/security.py:17 msgid "User password expiration (day)" @@ -7531,10 +7334,8 @@ msgid "" "will expire failure;The password expiration reminder mail will be automatic " "sent to the user by system within 5 days (daily) before the password expires" msgstr "" -"ユーザーがその期間中にパスワードを更新しなかった場合、ユーザーパスワードの有" -"効期限が切れます。パスワードの有効期限が切れる前の5日 (毎日) 以内に、パスワー" -"ドの有効期限が切れるリマインダーメールがシステムからユーザーに自動的に送信さ" -"れます。" +"ユーザーがその期間中にパスワードを更新しなかった場合、ユーザーパスワードの有効期限が切れます。パスワードの有効期限が切れる前の5日 (毎日) " +"以内に、パスワードの有効期限が切れるリマインダーメールがシステムからユーザーに自動的に送信されます。" #: settings/serializers/security.py:26 msgid "Recent password count" @@ -7544,9 +7345,7 @@ msgstr "繰り返された履歴パスワードの数" msgid "" "Tip: When the user resets the password, it cannot be the previous n " "historical passwords of the user" -msgstr "" -"ヒント: ユーザーがパスワードをリセットすると、ユーザーの前のnの履歴パスワード" -"にすることはできません" +msgstr "ヒント: ユーザーがパスワードをリセットすると、ユーザーの前のnの履歴パスワードにすることはできません" #: settings/serializers/security.py:34 msgid "Minimum length (User)" @@ -7568,9 +7367,7 @@ msgstr "特別な" msgid "" "If the user has failed to log in for a limited number of times, no login is " "allowed during this time interval." -msgstr "" -"ユーザーが限られた回数だけログインできなかった場合、この時間間隔ではログイン" -"はできません。" +msgstr "ユーザーが限られた回数だけログインできなかった場合、この時間間隔ではログインはできません。" #: settings/serializers/security.py:63 settings/serializers/security.py:73 msgid "Login failures count" @@ -7596,9 +7393,7 @@ msgstr "単一デバイスログインのみ" msgid "" "After the user logs in on the new device, other logged-in devices will " "automatically log out" -msgstr "" -"ユーザーが新しいデバイスにログインすると、ログインしている他のデバイスは自動" -"的にログアウトします。" +msgstr "ユーザーが新しいデバイスにログインすると、ログインしている他のデバイスは自動的にログアウトします。" #: settings/serializers/security.py:95 msgid "Only exist user login" @@ -7611,9 +7406,8 @@ msgid "" "are allowed to log in and automatically create users (if the user does not " "exist)" msgstr "" -"有効にすると、存在しないユーザーはログインできなくなります。無効にすると、" -"ローカル認証方法を除く他の認証方法のユーザーはログインでき、ユーザーが自動的" -"に作成されます (ユーザーが存在しない場合)。" +"有効にすると、存在しないユーザーはログインできなくなります。無効にすると、ローカル認証方法を除く他の認証方法のユーザーはログインでき、ユーザーが自動的に作成されます" +" (ユーザーが存在しない場合)。" #: settings/serializers/security.py:103 msgid "Only from source login" @@ -7621,14 +7415,13 @@ msgstr "ソースログインからのみ" #: settings/serializers/security.py:105 msgid "" -"If it is enabled, the user will only authenticate to the source when logging " -"in; if it is disabled, the user will authenticate all the enabled " +"If it is enabled, the user will only authenticate to the source when logging" +" in; if it is disabled, the user will authenticate all the enabled " "authentication methods in a certain order when logging in, and as long as " "one of the authentication methods is successful, they can log in directly" msgstr "" -"これが有効な場合、ユーザーはログイン時にソースに対してのみ認証されます。無効" -"な場合、ユーザーはログイン時に、いずれかの認証方法が成功する限り、有効なすべ" -"ての認証方法を特定の順序で認証します。 、直接ログインできます" +"これが有効な場合、ユーザーはログイン時にソースに対してのみ認証されます。無効な場合、ユーザーはログイン時に、いずれかの認証方法が成功する限り、有効なすべての認証方法を特定の順序で認証します。" +" 、直接ログインできます" #: settings/serializers/security.py:116 #: users/templates/users/mfa_setting.html:160 @@ -7655,154 +7448,148 @@ msgstr "サードパーティのログインユーザーがMFA認証を実行" msgid "The third-party login modes include OIDC, CAS, and SAML2" msgstr "サードパーティのログインモードには、OIDC、CAS、SAML2" -#: settings/serializers/security.py:128 +#: settings/serializers/security.py:129 +msgid "MFA via Email" +msgstr "メール検証 MFA" + +#: settings/serializers/security.py:130 +msgid "Email as a method for multi-factor authentication" +msgstr "メールを多要素認証の一つの方法として使用します。" + +#: settings/serializers/security.py:133 msgid "OTP issuer name" msgstr "OTP発行者名" -#: settings/serializers/security.py:132 +#: settings/serializers/security.py:137 msgid "OTP valid window" msgstr "OTP有効なウィンドウ" -#: settings/serializers/security.py:136 +#: settings/serializers/security.py:141 msgid "MFA verify TTL" msgstr "MFAはTTLを確認します(秒)" -#: settings/serializers/security.py:138 +#: settings/serializers/security.py:143 msgid "" "Unit: second, The verification MFA takes effect only when you view the " "account password" msgstr "検証MFAはアカウントのパスワードを表示したときにのみ有効になります。" -#: settings/serializers/security.py:143 +#: settings/serializers/security.py:148 msgid "MFA in login page" msgstr "ログインページのMFA" -#: settings/serializers/security.py:144 +#: settings/serializers/security.py:149 msgid "Eu security regulations(GDPR) require MFA to be on the login page" -msgstr "" -"Euセキュリティ規制 (GDPR) では、MFAがログインページにある必要があります" +msgstr "Euセキュリティ規制 (GDPR) では、MFAがログインページにある必要があります" -#: settings/serializers/security.py:148 +#: settings/serializers/security.py:153 msgid "Verify code TTL (second)" msgstr "認証コード有効時間" -#: settings/serializers/security.py:149 +#: settings/serializers/security.py:154 msgid "Reset password and send SMS code expiration time" msgstr "パスワードをリセットしてSMSコードの有効期限を送信します" -#: settings/serializers/security.py:153 +#: settings/serializers/security.py:158 msgid "Login dynamic code" msgstr "ログイン動的コードの有効化" -#: settings/serializers/security.py:154 +#: settings/serializers/security.py:159 msgid "" "The password and additional code are sent to a third party authentication " "system for verification" -msgstr "" -"パスワードと追加コードは、検証のためにサードパーティの認証システムに送信され" -"ます" +msgstr "パスワードと追加コードは、検証のためにサードパーティの認証システムに送信されます" -#: settings/serializers/security.py:158 +#: settings/serializers/security.py:163 msgid "Login captcha" msgstr "ログインcaptchaの有効化" -#: settings/serializers/security.py:159 +#: settings/serializers/security.py:164 msgid "Enable captcha to prevent robot authentication" msgstr "Captchaを有効にしてロボット認証を防止する" -#: settings/serializers/security.py:162 +#: settings/serializers/security.py:167 msgid "Suspicious Login Verification" msgstr "リモートログイン保護" -#: settings/serializers/security.py:164 +#: settings/serializers/security.py:169 msgid "" -"The system determines whether the login IP address belongs to a common login " -"city. If the account is logged in from a common login city, the system sends " -"a remote login reminder" +"The system determines whether the login IP address belongs to a common login" +" city. If the account is logged in from a common login city, the system " +"sends a remote login reminder" msgstr "" -"システムは、ログインIPアドレスが共通のログイン都市に属しているかどうかを判断" -"します。アカウントが共通のログイン都市からログインしている場合、システムはリ" -"モートログインリマインダーを送信します" +"システムは、ログインIPアドレスが共通のログイン都市に属しているかどうかを判断します。アカウントが共通のログイン都市からログインしている場合、システムはリモートログインリマインダーを送信します" -#: settings/serializers/security.py:170 +#: settings/serializers/security.py:175 msgid "Auto Disable Threshold (day)" msgstr "未使用のユーザータイムアウト(日)" -#: settings/serializers/security.py:171 +#: settings/serializers/security.py:176 msgid "" "Detect infrequent users daily and disable them if they exceed the " "predetermined time limit" -msgstr "" -"毎日、頻度の低いユーザーを検出し、予め決められた時間制限を超えた場合は無効に" -"します" +msgstr "毎日、頻度の低いユーザーを検出し、予め決められた時間制限を超えた場合は無効にします" -#: settings/serializers/security.py:191 +#: settings/serializers/security.py:196 msgid "Watermark" msgstr "透かしの有効化" -#: settings/serializers/security.py:192 -msgid "Enabled, the web session and replay contains watermark information" -msgstr "Webセッションとリプレイには透かし情報が含まれています。" - -#: settings/serializers/security.py:196 +#: settings/serializers/security.py:200 msgid "Max idle time (minute)" msgstr "接続最大アイドル時間(分)" -#: settings/serializers/security.py:197 +#: settings/serializers/security.py:201 msgid "If idle time more than it, disconnect connection." msgstr "この設定以上の操作がない場合、接続は切断されます" -#: settings/serializers/security.py:200 +#: settings/serializers/security.py:204 msgid "Session expire at browser closed" msgstr "ブラウザを閉じるとセッションが期限切れになります" -#: settings/serializers/security.py:201 +#: settings/serializers/security.py:205 msgid "Whether to expire the session when the user closes their browser." msgstr "ユーザーがブラウザを閉じたときにセッションを期限切れにするかどうか。" -#: settings/serializers/security.py:206 +#: settings/serializers/security.py:210 msgid "Allow users to view asset session information" msgstr "ユーザーに資産のオンラインセッション情報の閲覧を許可する" -#: settings/serializers/security.py:208 +#: settings/serializers/security.py:212 msgid "" "When a user connects to an asset, the account selection popup displays the " "number of active sessions for the current asset (RDP protocol only)." -msgstr "" -"ユーザーが資産に接続するとき、アカウント選択のポップアップに現在の資産のオン" -"ラインセッション数を表示(rdpプロトコルのみ)" +msgstr "ユーザーが資産に接続するとき、アカウント選択のポップアップに現在の資産のオンラインセッション数を表示(rdpプロトコルのみ)" -#: settings/serializers/security.py:214 +#: settings/serializers/security.py:218 msgid "Max online time (hour)" msgstr "接続最大アイドル時間(分)" -#: settings/serializers/security.py:215 +#: settings/serializers/security.py:219 msgid "If session connection time more than it, disconnect connection." msgstr "セッション接続時間がこれを超えると、接続が切断されます" -#: settings/serializers/security.py:218 +#: settings/serializers/security.py:222 msgid "Remember manual auth" msgstr "手動入力パスワードの保存" -#: settings/serializers/security.py:221 +#: settings/serializers/security.py:225 #: terminal/templates/terminal/_msg_session_sharing.html:10 msgid "Session share" msgstr "セッション共有" -#: settings/serializers/security.py:222 +#: settings/serializers/security.py:226 msgid "Enabled, Allows user active session to be shared with other users" -msgstr "" -"ユーザーのアクティブなセッションを他のユーザーと共有できるようにします。" +msgstr "ユーザーのアクティブなセッションを他のユーザーと共有できるようにします。" -#: settings/serializers/security.py:228 +#: settings/serializers/security.py:232 msgid "Insecure command alert" msgstr "安全でないコマンドアラート" -#: settings/serializers/security.py:231 +#: settings/serializers/security.py:235 msgid "Email recipient" msgstr "メール受信者" -#: settings/serializers/security.py:232 +#: settings/serializers/security.py:236 msgid "Multiple user using , split" msgstr "複数のユーザーを使用して、分割" @@ -7815,77 +7602,73 @@ msgstr "[%s] %s" msgid "Auto" msgstr "自動" -#: settings/serializers/terminal.py:22 +#: settings/serializers/terminal.py:23 +msgid "Auto(Enabled for the first 5 minutes after startup, then disabled.)" +msgstr "自動(起動後5分間有効、その後無効にします。)" + +#: settings/serializers/terminal.py:26 msgid "Registration" msgstr "ターミナルレジスタの有効化" -#: settings/serializers/terminal.py:24 +#: settings/serializers/terminal.py:28 msgid "" -"Allow component register, after all component setup, you should disable this " -"for security" -msgstr "" -"ターミナルレジスタを許可し、すべてのターミナルセットアップの後、セキュリティ" -"のためにこれを無効にする必要があります" +"Allow component register, after all component setup, you should disable this" +" for security" +msgstr "ターミナルレジスタを許可し、すべてのターミナルセットアップの後、セキュリティのためにこれを無効にする必要があります" -#: settings/serializers/terminal.py:30 +#: settings/serializers/terminal.py:34 msgid "" "* Allow users to log in to the KoKo component via password authentication" -msgstr "" -"* パスワード認証を通じてユーザがKoKoコンポーネントにログインできるように許可" -"する" +msgstr "* パスワード認証を通じてユーザがKoKoコンポーネントにログインできるように許可する" -#: settings/serializers/terminal.py:36 +#: settings/serializers/terminal.py:40 msgid "" "* Allow users to log in to the KoKo component via Public key " "authentication
If third-party authentication services, such as AD/LDAP, " -"are enabled, you should disable this option to prevent users from logging in " -"after being deleted from the AD/LDAP server" +"are enabled, you should disable this option to prevent users from logging in" +" after being deleted from the AD/LDAP server" msgstr "" -"* 公開鍵認証でユーザがKoKoコンポーネントにログインできるように許可する
第" -"三者認証サービス(例:AD/LDAP)が有効化されている場合、ユーザがAD/LDAPサーバ" -"から削除された後に再度ログインするのを防ぐためにこのオプションを無効化するべ" -"きです。" +"* " +"公開鍵認証でユーザがKoKoコンポーネントにログインできるように許可する
第三者認証サービス(例:AD/LDAP)が有効化されている場合、ユーザがAD/LDAPサーバから削除された後に再度ログインするのを防ぐためにこのオプションを無効化するべきです。" -#: settings/serializers/terminal.py:43 +#: settings/serializers/terminal.py:47 msgid "Asset sorting" msgstr "リストの並べ替え" -#: settings/serializers/terminal.py:46 +#: settings/serializers/terminal.py:50 msgid "Asset page size" msgstr "ページサイズを一覧表示" -#: settings/serializers/terminal.py:51 +#: settings/serializers/terminal.py:55 msgid "" -"* You can individually configure the service address and port in the service " -"endpoint
If enabled, the Luna page will display the DB client launch " +"* You can individually configure the service address and port in the service" +" endpoint
If enabled, the Luna page will display the DB client launch " "method when connecting to assets" msgstr "" -"* サーバエンドポイントでは、サービスアドレスとポートを個別に設定できます。" -"
有効化した場合、Luna ページでは資産への接続時にDBクライアントの起動方法" -"を表示します。" +"* サーバエンドポイントでは、サービスアドレスとポートを個別に設定できます。
有効化した場合、Luna " +"ページでは資産への接続時にDBクライアントの起動方法を表示します。" -#: settings/serializers/terminal.py:59 +#: settings/serializers/terminal.py:63 msgid "" -"* You can individually configure the service address and port in the service " -"endpoint
If enabled, the Luna page will display the download rdp file " +"* You can individually configure the service address and port in the service" +" endpoint
If enabled, the Luna page will display the download rdp file " "button and RDP Client launch method when connecting to assets" msgstr "" -"* サーバエンドポイントでは、サービスアドレスとポートを個別に設定できます。" -"
有効化した場合、Luna ページでは資産への接続時にrdp ファイルのダウンロー" -"ドボタンとRDPクライアントの起動方法を表示します。" +"* サーバエンドポイントでは、サービスアドレスとポートを個別に設定できます。
有効化した場合、Luna ページでは資産への接続時にrdp " +"ファイルのダウンロードボタンとRDPクライアントの起動方法を表示します。" -#: settings/serializers/terminal.py:66 +#: settings/serializers/terminal.py:70 msgid "Client connection" msgstr "クライアント接続" -#: settings/serializers/terminal.py:68 +#: settings/serializers/terminal.py:72 msgid "" "* Allow connecting to the KoKo component via SSH client
If enabled, the " -"Luna page will display the SSH client launch method when connecting to assets" +"Luna page will display the SSH client launch method when connecting to " +"assets" msgstr "" -"* SSHクライアント経由でKoKo コンポーネントに接続できるように許可する
有効" -"化した場合、Luna ページでは資産への接続時にSSHクライアントの起動方法を表示し" -"ます。" +"* SSHクライアント経由でKoKo コンポーネントに接続できるように許可する
有効化した場合、Luna " +"ページでは資産への接続時にSSHクライアントの起動方法を表示します。" #: settings/serializers/tool.py:10 msgid "Tool" @@ -7897,54 +7680,46 @@ msgstr "ワークベンチのツール" #: settings/serializers/tool.py:15 msgid "" -"*! If enabled, users with RBAC permissions will be able to utilize all tools " -"in the workbench" -msgstr "" -"* RBAC権限を持つユーザは、ワークベンチのすべてのツールを使用できるようにしま" -"す" +"*! If enabled, users with RBAC permissions will be able to utilize all tools" +" in the workbench" +msgstr "* RBAC権限を持つユーザは、ワークベンチのすべてのツールを使用できるようにします" -#: settings/tasks/ldap.py:73 +#: settings/tasks/ldap.py:67 msgid "Periodic import ldap user" msgstr "LDAP ユーザーを定期的にインポートする" -#: settings/tasks/ldap.py:75 settings/tasks/ldap.py:85 +#: settings/tasks/ldap.py:69 settings/tasks/ldap.py:79 msgid "" "When LDAP auto-sync is configured, this task will be invoked to synchronize " "users" -msgstr "" -"LDAPの自動同期が設定されている場合、このActionを呼び出して利用者の同期を行い" -"ます" +msgstr "LDAPの自動同期が設定されている場合、このActionを呼び出して利用者の同期を行います" -#: settings/tasks/ldap.py:83 +#: settings/tasks/ldap.py:77 msgid "Periodic import ldap ha user" msgstr "LDAP HA ユーザーの定期インポート" -#: settings/tasks/ldap.py:120 +#: settings/tasks/ldap.py:115 msgid "Registration periodic import ldap user task" msgstr "登録サイクルLDAPユーザータスクのインポート" -#: settings/tasks/ldap.py:122 +#: settings/tasks/ldap.py:117 msgid "" -"When LDAP auto-sync parameters change, such as Crontab parameters, the LDAP " -"sync task \n" +"When LDAP auto-sync parameters change, such as Crontab parameters, the LDAP sync task \n" " will be re-registered or updated, and this task will be invoked" msgstr "" -"LDAPの自動同期パラメーターが変更された場合、たとえばCrontabパラメーターが変更" -"され、ldap同期Actionの再登録または更新が必要になった場合、そのActionはこの" -"Actionを呼び出します" +"LDAPの自動同期パラメーターが変更された場合、たとえばCrontabパラメーターが変更され、ldap同期Actionの再登録または更新が必要になった場合、そのActionはこのActionを呼び出します" -#: settings/tasks/ldap.py:136 +#: settings/tasks/ldap.py:131 msgid "Registration periodic import ldap ha user task" msgstr "LDAP HA ユーザーの定期インポートタスクの登録" -#: settings/tasks/ldap.py:138 +#: settings/tasks/ldap.py:133 msgid "" -"When LDAP HA auto-sync parameters change, such as Crontab parameters, the " -"LDAP HA sync task \n" +"When LDAP HA auto-sync parameters change, such as Crontab parameters, the LDAP HA sync task \n" " will be re-registered or updated, and this task will be invoked" msgstr "" -"LDAP HA自動同期パラメーターが変更された場合、Crontabパラメーターなど、ldap ha" -"同期Actionを再登録または更新する際にはこのActionを呼び出します" +"LDAP HA自動同期パラメーターが変更された場合、Crontabパラメーターなど、ldap " +"ha同期Actionを再登録または更新する際にはこのActionを呼び出します" #: settings/templates/ldap/_msg_import_ldap_user.html:2 msgid "Sync task finish" @@ -7962,114 +7737,114 @@ msgstr "同期されたユーザー" msgid "No user synchronization required" msgstr "ユーザーの同期は必要ありません" -#: settings/utils/ldap.py:509 +#: settings/utils/ldap.py:529 msgid "ldap:// or ldaps:// protocol is used." msgstr "ldap:// または ldaps:// プロトコルが使用されます。" -#: settings/utils/ldap.py:520 +#: settings/utils/ldap.py:540 msgid "Host or port is disconnected: {}" msgstr "ホストまたはポートが切断されました: {}" -#: settings/utils/ldap.py:522 +#: settings/utils/ldap.py:542 msgid "The port is not the port of the LDAP service: {}" msgstr "ポートはLDAPサービスのポートではありません: {}" -#: settings/utils/ldap.py:524 +#: settings/utils/ldap.py:544 msgid "Please add certificate: {}" msgstr "証明書を追加してください: {}" -#: settings/utils/ldap.py:528 settings/utils/ldap.py:555 -#: settings/utils/ldap.py:585 settings/utils/ldap.py:613 +#: settings/utils/ldap.py:548 settings/utils/ldap.py:575 +#: settings/utils/ldap.py:605 settings/utils/ldap.py:633 msgid "Unknown error: {}" msgstr "不明なエラー: {}" -#: settings/utils/ldap.py:542 +#: settings/utils/ldap.py:562 msgid "Bind DN or Password incorrect" msgstr "DNまたはパスワードのバインドが正しくありません" -#: settings/utils/ldap.py:549 +#: settings/utils/ldap.py:569 msgid "Please enter Bind DN: {}" msgstr "バインドDN: {} を入力してください" -#: settings/utils/ldap.py:551 +#: settings/utils/ldap.py:571 msgid "Please enter Password: {}" msgstr "パスワードを入力してください: {}" -#: settings/utils/ldap.py:553 +#: settings/utils/ldap.py:573 msgid "Please enter correct Bind DN and Password: {}" msgstr "正しいバインドDNとパスワードを入力してください: {}" -#: settings/utils/ldap.py:571 +#: settings/utils/ldap.py:591 msgid "Invalid User OU or User search filter: {}" msgstr "無効なユーザー OU またはユーザー検索フィルター: {}" -#: settings/utils/ldap.py:602 +#: settings/utils/ldap.py:622 msgid "LDAP User attr map not include: {}" msgstr "LDAP ユーザーattrマップは含まれません: {}" -#: settings/utils/ldap.py:609 +#: settings/utils/ldap.py:629 msgid "LDAP User attr map is not dict" msgstr "LDAPユーザーattrマップはdictではありません" -#: settings/utils/ldap.py:628 +#: settings/utils/ldap.py:648 msgid "LDAP authentication is not enabled" msgstr "LDAP 認証が有効になっていない" -#: settings/utils/ldap.py:646 +#: settings/utils/ldap.py:666 msgid "Error (Invalid LDAP server): {}" msgstr "エラー (LDAPサーバーが無効): {}" -#: settings/utils/ldap.py:648 +#: settings/utils/ldap.py:668 msgid "Error (Invalid Bind DN): {}" msgstr "エラー (DNのバインドが無効): {}" -#: settings/utils/ldap.py:650 +#: settings/utils/ldap.py:670 msgid "Error (Invalid LDAP User attr map): {}" msgstr "エラー (LDAPユーザーattrマップが無効): {}" -#: settings/utils/ldap.py:652 +#: settings/utils/ldap.py:672 msgid "Error (Invalid User OU or User search filter): {}" msgstr "エラー (ユーザーOUまたはユーザー検索フィルターが無効): {}" -#: settings/utils/ldap.py:654 +#: settings/utils/ldap.py:674 msgid "Error (Not enabled LDAP authentication): {}" msgstr "エラー (LDAP認証が有効化されていません): {}" -#: settings/utils/ldap.py:656 +#: settings/utils/ldap.py:676 msgid "Error (Unknown): {}" msgstr "エラー (不明): {}" -#: settings/utils/ldap.py:659 +#: settings/utils/ldap.py:679 msgid "Succeed: Match {} users" msgstr "成功: {} 人のユーザーに一致" -#: settings/utils/ldap.py:689 +#: settings/utils/ldap.py:709 msgid "Authentication failed (configuration incorrect): {}" msgstr "認証に失敗しました (設定が正しくありません): {}" -#: settings/utils/ldap.py:693 +#: settings/utils/ldap.py:713 msgid "Authentication failed (username or password incorrect): {}" msgstr "認証に失敗しました (ユーザー名またはパスワードが正しくありません): {}" -#: settings/utils/ldap.py:695 +#: settings/utils/ldap.py:715 msgid "Authentication failed (Unknown): {}" msgstr "認証に失敗しました (不明): {}" -#: settings/utils/ldap.py:698 +#: settings/utils/ldap.py:718 msgid "Authentication success: {}" msgstr "認証成功: {}" -#: settings/ws.py:222 +#: settings/ws.py:223 msgid "No LDAP user was found" msgstr "LDAPユーザーが取得されませんでした" -#: settings/ws.py:228 +#: settings/ws.py:232 msgid "Total {}, success {}, failure {}" msgstr "合計 {},成功 {},失敗 {}" -#: templates/_csv_import_export.html:8 -msgid "Export" -msgstr "エクスポート" +#: settings/ws.py:236 +msgid ", disabled {}" +msgstr "無効 {}" #: templates/_csv_import_export.html:13 templates/_csv_import_modal.html:5 #: xpack/plugins/cloud/const.py:65 @@ -8078,9 +7853,7 @@ msgstr "インポート" #: templates/_csv_import_modal.html:12 msgid "Download the imported template or use the exported CSV file format" -msgstr "" -"インポートしたテンプレートをダウンロードするか、エクスポートしたCSVファイル形" -"式を使用する" +msgstr "インポートしたテンプレートをダウンロードするか、エクスポートしたCSVファイル形式を使用する" #: templates/_csv_import_modal.html:13 msgid "Download the import template" @@ -8096,9 +7869,7 @@ msgstr "ファイルを選択してください" #: templates/_csv_update_modal.html:12 msgid "Download the update template or use the exported CSV file format" -msgstr "" -"更新テンプレートをダウンロードするか、エクスポートしたCSVファイル形式を使用す" -"る" +msgstr "更新テンプレートをダウンロードするか、エクスポートしたCSVファイル形式を使用する" #: templates/_csv_update_modal.html:13 msgid "Download the update template" @@ -8150,8 +7921,8 @@ msgid "" "Your password has expired, please click this link update password." msgstr "" -"あなたのパスワードは期限切れです。こ" -"ちらのリンクをクリックしてパスワードを更新してください。" +"あなたのパスワードは期限切れです。こちらのリンクをクリックしてパスワードを更新してください。" #: templates/_message.html:26 msgid "Your password will at" @@ -8163,8 +7934,8 @@ msgid "" "please click this link to " "update your password." msgstr "" -"パスワードを更新するには、こちらのリ" -"ンクをクリックしてください。" +"パスワードを更新するには、こちらのリンクをクリックしてください。" #: templates/_message.html:37 #, python-format @@ -8172,8 +7943,8 @@ msgid "" "Your information was incomplete. Please click this link to complete your information." msgstr "" -"あなたの情報が不完全です。こちらのリンク" -"をクリックして、情報を完全にしてください。" +"あなたの情報が不完全です。こちらのリンクをクリックして、情報を完全にしてください。" #: templates/_message.html:48 #, python-format @@ -8182,8 +7953,7 @@ msgid "" "href=\"%(user_pubkey_update)s\"> this link to update" msgstr "" "あなたのSSHキーは設定されていないか、無効です。こちらのリンクをクリックして更新してくだ" -"さい。" +"href=\"%(user_pubkey_update)s\">こちらのリンクをクリックして更新してください。" #: templates/_mfa_login_field.html:31 #: users/templates/users/forgot_password.html:101 @@ -8214,9 +7984,8 @@ msgid "" "JumpServer Client, currently used to launch the client, now only support " "launch RDP SSH client, The Telnet client will next" msgstr "" -"JumpServerクライアントは、現在特定のクライアントプログラムの接続資産を喚起す" -"るために使用されており、現在はRDP SSHクライアントのみをサポートしています。" -"「Telnetは将来的にサポートする" +"JumpServerクライアントは、現在特定のクライアントプログラムの接続資産を喚起するために使用されており、現在はRDP " +"SSHクライアントのみをサポートしています。「Telnetは将来的にサポートする" #: templates/resource_download.html:35 msgid "Microsoft" @@ -8230,9 +7999,7 @@ msgstr "公式" msgid "" "macOS needs to download the client to connect RDP asset, which comes with " "Windows" -msgstr "" -"MacOSは、Windowsに付属のRDPアセットを接続するためにクライアントをダウンロード" -"する必要があります" +msgstr "MacOSは、Windowsに付属のRDPアセットを接続するためにクライアントをダウンロードする必要があります" #: templates/resource_download.html:45 msgid "Windows Remote application publisher tools" @@ -8242,9 +8009,7 @@ msgstr "Windowsリモートアプリケーション発行者ツール" msgid "" "OpenSSH is a program used to connect remote applications in the Windows " "Remote Application Publisher" -msgstr "" -"OpenSSHはリモートアプリケーションをWindowsリモートアプリケーションで接続する" -"プログラムです" +msgstr "OpenSSHはリモートアプリケーションをWindowsリモートアプリケーションで接続するプログラムです" #: templates/resource_download.html:53 msgid "Offline video player" @@ -8296,7 +8061,7 @@ msgstr "テスト成功" msgid "Test failure: Please check configuration" msgstr "テストに失敗しました:構成を確認してください" -#: terminal/api/component/terminal.py:57 +#: terminal/api/component/terminal.py:56 msgid "Have online sessions" msgstr "オンラインセッションを持つ" @@ -8476,7 +8241,7 @@ msgstr "バージョン" msgid "Can concurrent" msgstr "同時実行可能" -#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:179 +#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:194 #: terminal/serializers/storage.py:193 msgid "Hosts" msgstr "ホスト" @@ -8498,12 +8263,12 @@ msgstr "カスタムプラットフォームのみをサポート" msgid "Missing type in platform.yml" msgstr "platform.ymlにタイプがありません" -#: terminal/models/applet/applet.py:330 terminal/models/applet/host.py:36 +#: terminal/models/applet/applet.py:371 terminal/models/applet/host.py:36 #: terminal/models/applet/host.py:138 msgid "Hosting" msgstr "ホスト マシン" -#: terminal/models/applet/applet.py:336 +#: terminal/models/applet/applet.py:377 msgid "Applet Publication" msgstr "アプリケーションのリリース" @@ -8580,18 +8345,22 @@ msgid "SQLServer port" msgstr "SQLServer ポート" #: terminal/models/component/endpoint.py:25 +msgid "Oracle port" +msgstr "Oracle ポート" + +#: terminal/models/component/endpoint.py:26 msgid "VNC port" msgstr "VNC ポート" -#: terminal/models/component/endpoint.py:33 -#: terminal/models/component/endpoint.py:120 -#: terminal/serializers/endpoint.py:80 terminal/serializers/storage.py:41 +#: terminal/models/component/endpoint.py:34 +#: terminal/models/component/endpoint.py:114 +#: terminal/serializers/endpoint.py:61 terminal/serializers/storage.py:41 #: terminal/serializers/storage.py:53 terminal/serializers/storage.py:83 #: terminal/serializers/storage.py:93 terminal/serializers/storage.py:101 msgid "Endpoint" msgstr "エンドポイント" -#: terminal/models/component/endpoint.py:126 +#: terminal/models/component/endpoint.py:120 msgid "Endpoint rule" msgstr "エンドポイントルール" @@ -8665,7 +8434,8 @@ msgstr "セッション再生をダウンロードできます" msgid "Account ID" msgstr "アカウント ID" -#: terminal/models/session/session.py:39 terminal/models/session/sharing.py:118 +#: terminal/models/session/session.py:39 +#: terminal/models/session/sharing.py:118 msgid "Login from" msgstr "ログイン元" @@ -8714,8 +8484,8 @@ msgstr "アクションパーミッション" msgid "Origin" msgstr "ソース" -#: terminal/models/session/sharing.py:42 terminal/models/session/sharing.py:100 -#: terminal/notifications.py:279 +#: terminal/models/session/sharing.py:42 +#: terminal/models/session/sharing.py:100 terminal/notifications.py:279 msgid "Session sharing" msgstr "セッション共有" @@ -8798,7 +8568,7 @@ msgid "Command and replay storage" msgstr "コマンド及び録画記憶" #: terminal/notifications.py:258 terminal/tasks.py:212 -#: xpack/plugins/cloud/api.py:160 +#: xpack/plugins/cloud/api.py:175 #: xpack/plugins/cloud/serializers/account.py:121 #: xpack/plugins/cloud/serializers/account.py:123 msgid "Test failure: Account invalid" @@ -8828,21 +8598,16 @@ msgstr "コア サービス アドレス" #: terminal/serializers/applet_host.py:38 msgid "" " \n" -" Tips: The application release machine communicates with the Core " -"service. \n" -" If the release machine and the Core service are on the same network " -"segment, \n" -" it is recommended to fill in the intranet address, otherwise fill in " -"the current site URL \n" +" Tips: The application release machine communicates with the Core service. \n" +" If the release machine and the Core service are on the same network segment, \n" +" it is recommended to fill in the intranet address, otherwise fill in the current site URL \n" "
\n" " eg: https://172.16.10.110 or https://dev.jumpserver.com\n" " " msgstr "" -"ヒント: アプリケーション リリース マシンは、コア サービスと通信します。リリー" -"ス マシンとコア サービスが同じネットワーク セグメント上にある場合は、イントラ" -"ネット アドレスを入力することをお勧めします。それ以外の場合は、現在のサイト " -"URL を入力します。
例: https://172.16.10.110 または https://dev." -"jumpserver.com" +"ヒント: アプリケーション リリース マシンは、コア サービスと通信します。リリース マシンとコア サービスが同じネットワーク " +"セグメント上にある場合は、イントラネット アドレスを入力することをお勧めします。それ以外の場合は、現在のサイト URL を入力します。
例: " +"https://172.16.10.110 または https://dev.jumpserver.com" #: terminal/serializers/applet_host.py:46 terminal/serializers/storage.py:207 msgid "Ignore Certificate Verification" @@ -8855,12 +8620,12 @@ msgstr "既存の RDS 証明書" #: terminal/serializers/applet_host.py:50 msgid "" "If not exist, the RDS will be in trial mode, and the trial period is 120 " -"days. Detail" +"days. Detail" msgstr "" -"存在しない場合、RDSは試用モードで、試用期間は120日間です。詳細" +"存在しない場合、RDSは試用モードで、試用期間は120日間です。詳細" #: terminal/serializers/applet_host.py:55 msgid "RDS License Server" @@ -8878,9 +8643,7 @@ msgstr "RDS シングル ユーザー シングル セッション" msgid "" "Tips: A RDS user can have only one session at a time. If set, when next " "login connected, previous session will be disconnected." -msgstr "" -"ヒント:RDSユーザーは一度に一つのセッションしか持てません。設定されている場" -"合、次回のログイン接続時に、前回のセッションが切断されます" +msgstr "ヒント:RDSユーザーは一度に一つのセッションしか持てません。設定されている場合、次回のログイン接続時に、前回のセッションが切断されます" #: terminal/serializers/applet_host.py:65 msgid "RDS Max Disconnection Time (ms)" @@ -8890,9 +8653,7 @@ msgstr "最大切断時間(ミリ秒)" msgid "" "Tips: Set the maximum duration for keeping a disconnected session active on " "the server (log off the session after 60000 milliseconds)." -msgstr "" -"ヒント:サーバー上で切断されたセッションがアクティブな状態で維持される最大時" -"間を設定します(60000ミリ秒後にセッションをログオフ)。" +msgstr "ヒント:サーバー上で切断されたセッションがアクティブな状態で維持される最大時間を設定します(60000ミリ秒後にセッションをログオフ)。" #: terminal/serializers/applet_host.py:72 msgid "RDS Remote App Logoff Time Limit (ms)" @@ -8900,11 +8661,10 @@ msgstr "RDSリモートアプリケーションのログアウト時間制限( #: terminal/serializers/applet_host.py:74 msgid "" -"Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp " -"programs (0 milliseconds, log off the session immediately)." +"Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp" +" programs (0 milliseconds, log off the session immediately)." msgstr "" -"ヒント:すべてのRemoteAppプログラムを閉じた後、RemoteAppセッションのログオフ" -"時間を設定します(0ミリ秒、セッションを即座にログオフ)。" +"ヒント:すべてのRemoteAppプログラムを閉じた後、RemoteAppセッションのログオフ時間を設定します(0ミリ秒、セッションを即座にログオフ)。" #: terminal/serializers/applet_host.py:83 terminal/serializers/terminal.py:47 #: terminal/serializers/virtualapp_provider.py:13 @@ -8913,17 +8673,13 @@ msgstr "ロードステータス" #: terminal/serializers/applet_host.py:97 msgid "" -"These accounts are used to connect to the published application, the account " -"is now divided into two types, one is dedicated to each account, each user " +"These accounts are used to connect to the published application, the account" +" is now divided into two types, one is dedicated to each account, each user " "has a private account, the other is public, when the application does not " -"support multiple open and the special has been used, the public account will " -"be used to connect" +"support multiple open and the special has been used, the public account will" +" be used to connect" msgstr "" -"これらのアカウントは、公開されたアプリケーションに接続するために使用されま" -"す。アカウントは現在、2つのタイプに分類されています。1つは、各アカウントに専" -"用のアカウントで、各ユーザーにはプライベートアカウントがあります。もう1つは公" -"開されています。アプリケーションが複数のオープンをサポートしていない場合、お" -"よび特別なものが使用されている場合、公開アカウントが使用されます。" +"これらのアカウントは、公開されたアプリケーションに接続するために使用されます。アカウントは現在、2つのタイプに分類されています。1つは、各アカウントに専用のアカウントで、各ユーザーにはプライベートアカウントがあります。もう1つは公開されています。アプリケーションが複数のオープンをサポートしていない場合、および特別なものが使用されている場合、公開アカウントが使用されます。" #: terminal/serializers/applet_host.py:104 msgid "The number of public accounts created automatically" @@ -8935,19 +8691,18 @@ msgid "" "please set the configuration item CACHE_LOGIN_PASSWORD_ENABLED=true and " "restart the service to enable it." msgstr "" -"同じアカウントを使用してホストに接続します。セキュリティ上の理由から、構成項" -"目 CACHE_LOGIN_PASSWORD_ENABLED=true を設定してサービスを再起動して有効にして" -"ください。" +"同じアカウントを使用してホストに接続します。セキュリティ上の理由から、構成項目 CACHE_LOGIN_PASSWORD_ENABLED=true " +"を設定してサービスを再起動して有効にしてください。" -#: terminal/serializers/applet_host.py:149 +#: terminal/serializers/applet_host.py:164 msgid "Install applets" msgstr "アプリをインストールする" -#: terminal/serializers/applet_host.py:179 +#: terminal/serializers/applet_host.py:194 msgid "Host ID" msgstr "ホスト ID" -#: terminal/serializers/applet_host.py:180 +#: terminal/serializers/applet_host.py:195 msgid "Applet ID" msgstr "リモートアプリケーション ID" @@ -8975,46 +8730,27 @@ msgstr "無効なセッションID" msgid "Timestamp" msgstr "タイムスタンプ" -#: terminal/serializers/endpoint.py:15 -msgid "Oracle port" -msgstr "Oracle ポート" - -#: terminal/serializers/endpoint.py:18 -msgid "Oracle port range" -msgstr "Oracle がリッスンするポート範囲" - -#: terminal/serializers/endpoint.py:20 -msgid "" -"Oracle proxy server listen port is dynamic, Each additional Oracle database " -"instance adds a port listener" -msgstr "" -"Oracle プロキシサーバーがリッスンするポートは動的です。追加の Oracle データ" -"ベースインスタンスはポートリスナーを追加します" - -#: terminal/serializers/endpoint.py:38 +#: terminal/serializers/endpoint.py:26 msgid "" "The host address accessed when connecting to assets, if it is empty, the " "access address of the current browser will be used (the default endpoint " "does not allow modification of the host)" msgstr "" -"アセットに接続するときにアクセスされるホスト アドレス。空の場合は、現在のブラ" -"ウザのアクセス アドレスが使用されます (デフォルトのエンドポイントではホストの" -"変更は許可されません)。" +"アセットに接続するときにアクセスされるホスト アドレス。空の場合は、現在のブラウザのアクセス アドレスが使用されます " +"(デフォルトのエンドポイントではホストの変更は許可されません)。" -#: terminal/serializers/endpoint.py:71 +#: terminal/serializers/endpoint.py:52 msgid "" -"The assets within this IP range, the following endpoint will be used for the " -"connection" +"The assets within this IP range, the following endpoint will be used for the" +" connection" msgstr "このIP範囲内のアセットは、以下のエンドポイントを使用して接続されます" -#: terminal/serializers/endpoint.py:72 +#: terminal/serializers/endpoint.py:53 msgid "" "If asset IP addresses under different endpoints conflict, use asset labels" -msgstr "" -"異なるエンドポイントの下に競合するアセットIPがある場合は、アセットタグを使用" -"して実装します" +msgstr "異なるエンドポイントの下に競合するアセットIPがある場合は、アセットタグを使用して実装します" -#: terminal/serializers/endpoint.py:76 +#: terminal/serializers/endpoint.py:57 msgid "Asset IP" msgstr "資産 IP" @@ -9099,8 +8835,8 @@ msgid "" "If there are multiple hosts, use a comma (,) to separate them.
(For " "example: http://www.jumpserver.a.com:9100, http://www.jumpserver.b.com:9100)" msgstr "" -"ホストが複数ある場合は、カンマ (,) で区切ってください。
(例: http://www." -"jumpserver.a.com:9100, http://www.jumpserver.b.com:9100)" +"ホストが複数ある場合は、カンマ (,) で区切ってください。
(例: http://www.jumpserver.a.com:9100, " +"http://www.jumpserver.b.com:9100)" #: terminal/serializers/storage.py:199 msgid "Index by date" @@ -9131,9 +8867,7 @@ msgid "" "set as the default storage, will make new Component use the current storage " "by default, without affecting existing Component" msgstr "" -"デフォルトのストレージとして設定すると、新しいコンポーネントが現在のストレー" -"ジをデフォルトで使用するようになりますが、既存のコンポーネントには影響しませ" -"ん" +"デフォルトのストレージとして設定すると、新しいコンポーネントが現在のストレージをデフォルトで使用するようになりますが、既存のコンポーネントには影響しません" #: terminal/serializers/task.py:9 msgid "Session id" @@ -9278,12 +9012,9 @@ msgstr "オフライン セッションをクリアする" #: terminal/tasks.py:45 msgid "" -"Check every 10 minutes for asset connection sessions that have been inactive " -"for 3 \n" +"Check every 10 minutes for asset connection sessions that have been inactive for 3 \n" " minutes and mark these sessions as completed" -msgstr "" -"毎10分ごとに、3分間非活動状態の資産接続セッションを確認し、これらのセッション" -"を完了とマークします" +msgstr "毎10分ごとに、3分間非活動状態の資産接続セッションを確認し、これらのセッションを完了とマークします" #: terminal/tasks.py:68 msgid "Upload session replay to external storage" @@ -9291,12 +9022,9 @@ msgstr "セッションの記録を外部ストレージにアップロードす #: terminal/tasks.py:70 terminal/tasks.py:104 msgid "" -"If SERVER_REPLAY_STORAGE is configured in the config.txt, session commands " -"and \n" +"If SERVER_REPLAY_STORAGE is configured in the config.txt, session commands and \n" " recordings will be uploaded to external storage" -msgstr "" -"SERVER_REPLAY_STORAGEが設定されている場合、ファイル管理を通じてアップロードさ" -"れたファイルを外部ストレージに同期します" +msgstr "SERVER_REPLAY_STORAGEが設定されている場合、ファイル管理を通じてアップロードされたファイルを外部ストレージに同期します" #: terminal/tasks.py:102 msgid "Upload session replay part file to external storage" @@ -9308,8 +9036,7 @@ msgstr "アプリケーション マシンの展開を実行する" #: terminal/tasks.py:126 msgid "" -"When deploying from the remote application publisher details page, and the " -"'Deploy' \n" +"When deploying from the remote application publisher details page, and the 'Deploy' \n" " button is clicked, this task will be executed" msgstr "デプロイメントシステムの展開時に、このActionが実行されます" @@ -9319,12 +9046,9 @@ msgstr "アプリをインストールする" #: terminal/tasks.py:140 msgid "" -"When the 'Deploy' button is clicked in the 'Remote Application' section of " -"the remote \n" +"When the 'Deploy' button is clicked in the 'Remote Application' section of the remote \n" " application publisher details page, this task will be executed" -msgstr "" -"リモートアプリケーションの詳細-リモートアプリケーションの展開時に、このAction" -"が実行されます" +msgstr "リモートアプリケーションの詳細-リモートアプリケーションの展開時に、このActionが実行されます" #: terminal/tasks.py:152 msgid "Uninstall applet" @@ -9332,12 +9056,9 @@ msgstr "アプリをアンインストールする" #: terminal/tasks.py:155 msgid "" -"When the 'Uninstall' button is clicked in the 'Remote Application' section " -"of the \n" +"When the 'Uninstall' button is clicked in the 'Remote Application' section of the \n" " remote application publisher details page, this task will be executed" -msgstr "" -"リモートアプリケーションの詳細-リモートアプリケーションのアンインストール時" -"に、このActionが実行されます" +msgstr "リモートアプリケーションの詳細-リモートアプリケーションのアンインストール時に、このActionが実行されます" #: terminal/tasks.py:167 msgid "Generate applet host accounts" @@ -9345,12 +9066,9 @@ msgstr "リモートアプリケーション上のアカウントを収集する #: terminal/tasks.py:170 msgid "" -"When a remote publishing server is created and an account needs to be " -"created \n" +"When a remote publishing server is created and an account needs to be created \n" " automatically, this task will be executed" -msgstr "" -"リモートパブリッシャーを作成した後、自動でアカウントを作成する必要がある場" -"合、このActionが実行されます" +msgstr "リモートパブリッシャーを作成した後、自動でアカウントを作成する必要がある場合、このActionが実行されます" #: terminal/tasks.py:184 msgid "Check command replay storage connectivity" @@ -9358,43 +9076,17 @@ msgstr "チェックコマンドと録画ストレージの接続性" #: terminal/tasks.py:186 msgid "" -"Check every day at midnight whether the external storage for commands and " -"recordings \n" -" is accessible. If it is not accessible, send a notification to the " -"recipients specified \n" -" in 'System Settings - Notifications - Subscription - Storage - " -"Connectivity'" +"Check every day at midnight whether the external storage for commands and recordings \n" +" is accessible. If it is not accessible, send a notification to the recipients specified \n" +" in 'System Settings - Notifications - Subscription - Storage - Connectivity'" msgstr "" -"毎日午前0時に、コマンドと映像の外部ストレージが接続可能かどうかを確認します。" -"接続できない場合は、システム設定-通知設定-メッセージ訂閱-コマンドと映像スト" -"レージ設定の受け取り人に送信します" +"毎日午前0時に、コマンドと映像の外部ストレージが接続可能かどうかを確認します。接続できない場合は、システム設定-通知設定-メッセージ訂閱-" +"コマンドと映像ストレージ設定の受け取り人に送信します" #: terminal/templates/terminal/_msg_command_alert.html:10 msgid "view" msgstr "表示" -#: terminal/utils/db_port_mapper.py:88 -msgid "" -"No available port is matched. The number of databases may have exceeded the " -"number of ports open to the database agent service, Contact the " -"administrator to open more ports." -msgstr "" -"利用可能なポートと一致しません。データベースの数が、データベース プロキシ " -"サービスによって開かれたポートの数を超えた可能性があります。さらにポートを開" -"くには、管理者に連絡してください。" - -#: terminal/utils/db_port_mapper.py:116 -msgid "" -"No ports can be used, check and modify the limit on the number of ports that " -"Magnus listens on in the configuration file." -msgstr "" -"使用できるポートがありません。設定ファイルで Magnus がリッスンするポート数の" -"制限を確認して変更してください. " - -#: terminal/utils/db_port_mapper.py:118 -msgid "All available port count: {}, Already use port count: {}" -msgstr "使用可能なすべてのポート数: {}、すでに使用しているポート数: {}" - #: tickets/api/ticket.py:88 tickets/models/ticket/general.py:289 msgid "Applicant" msgstr "応募者" @@ -9451,9 +9143,7 @@ msgstr "チケットはすでに閉じています" msgid "" "Created by the ticket ticket title: {} ticket applicant: {} ticket " "processor: {} ticket ID: {}" -msgstr "" -"チケットのタイトル: {} チケット申請者: {} チケットプロセッサ: {} チケットID: " -"{}" +msgstr "チケットのタイトル: {} チケット申請者: {} チケットプロセッサ: {} チケットID: {}" #: tickets/handlers/base.py:84 msgid "Change field" @@ -9687,9 +9377,7 @@ msgstr "承認" #: tickets/views/approve.py:44 msgid "" "This ticket does not exist, the process has ended, or this link has expired" -msgstr "" -"このワークシートが存在しないか、ワークシートが終了したか、このリンクが無効に" -"なっています" +msgstr "このワークシートが存在しないか、ワークシートが終了したか、このリンクが無効になっています" #: tickets/views/approve.py:72 msgid "Click the button below to approve or reject" @@ -9805,8 +9493,7 @@ msgid "" "in. you can also directly bind in \"personal information -> quick " "modification -> change MFA Settings\"!" msgstr "" -"有効にすると、次回のログイン時にマルチファクタ認証バインドプロセスに入りま" -"す。(個人情報->クイック修正->MFAマルチファクタ認証の設定)で直接バインド!" +"有効にすると、次回のログイン時にマルチファクタ認証バインドプロセスに入ります。(個人情報->クイック修正->MFAマルチファクタ認証の設定)で直接バインド!" #: users/forms/profile.py:60 msgid "* Enable MFA to make the account more secure." @@ -9814,12 +9501,11 @@ msgstr "* アカウントをより安全にするためにMFAを有効にしま #: users/forms/profile.py:69 msgid "" -"In order to protect you and your company, please keep your account, password " -"and key sensitive information properly. (for example: setting complex " +"In order to protect you and your company, please keep your account, password" +" and key sensitive information properly. (for example: setting complex " "password, enabling MFA)" msgstr "" -"あなたとあなたの会社を保護するために、アカウント、パスワード、キーの機密情報" -"を適切に保管してください。(例: 複雑なパスワードの設定、MFAの有効化)" +"あなたとあなたの会社を保護するために、アカウント、パスワード、キーの機密情報を適切に保管してください。(例: 複雑なパスワードの設定、MFAの有効化)" #: users/forms/profile.py:76 msgid "Finish" @@ -9980,12 +9666,10 @@ msgstr "ターミナルテーマ名" #: users/serializers/preference/lina.py:12 msgid "" "*! The password for file encryption, used for decryption when the system " -"sends emails containing file attachments.
Such as: account backup files, " -"account password change results files" +"sends emails containing file attachments.
Such as: account backup files," +" account password change results files" msgstr "" -"ファイル暗号化パスワードは、システムから送信されるメールにファイルの添付が含" -"まれている場合、このパスワードで解読します。
例:アカウントのバックアップ" -"ファイル、アカウントのパスワード変更結果ファイル" +"ファイル暗号化パスワードは、システムから送信されるメールにファイルの添付が含まれている場合、このパスワードで解読します。
例:アカウントのバックアップファイル、アカウントのパスワード変更結果ファイル" #: users/serializers/preference/lina.py:39 users/serializers/profile.py:49 msgid "The newly set password is inconsistent" @@ -10033,9 +9717,7 @@ msgid "" "remote computer to fit the window size of the client computer when the " "window is resized." msgstr "" -"ウィンドウサイズを調整したときに、クライアントコンピューターがリモートコン" -"ピューター上の内容をクライアントコンピューターのウィンドウサイズに合うように" -"拡大または縮小するかどうかを決定します。" +"ウィンドウサイズを調整したときに、クライアントコンピューターがリモートコンピューター上の内容をクライアントコンピューターのウィンドウサイズに合うように拡大または縮小するかどうかを決定します。" # msgid "" # "Determines whether the client computer should scale the content on the " @@ -10073,7 +9755,7 @@ msgstr "コマンドライン" msgid "The old password is incorrect" msgstr "古いパスワードが正しくありません" -#: users/serializers/profile.py:37 users/serializers/profile.py:148 +#: users/serializers/profile.py:37 users/serializers/profile.py:156 msgid "Password does not match security rules" msgstr "パスワードがセキュリティルールと一致しない" @@ -10087,10 +9769,9 @@ msgstr "システムの役割" #: users/serializers/user.py:55 msgid "" -"System roles are roles at the system level, and they will take effect across " -"all organizations" -msgstr "" -"システムロールはシステムレベルのロールであり、すべての組織で有効になります" +"System roles are roles at the system level, and they will take effect across" +" all organizations" +msgstr "システムロールはシステムレベルのロールであり、すべての組織で有効になります" #: users/serializers/user.py:61 msgid "Org roles" @@ -10164,9 +9845,7 @@ msgid "" "other sources.There are security settings that can restrict users to log in " "to the system only from the sources." msgstr "" -"ユーザソースはユーザの作成場所を表し、ADや他のソースになる可能性があります。" -"セキュリティ設定で特定のソースからしかシステムにログインできないようにユーザ" -"を制限することができます。" +"ユーザソースはユーザの作成場所を表し、ADや他のソースになる可能性があります。セキュリティ設定で特定のソースからしかシステムにログインできないようにユーザを制限することができます。" #: users/serializers/user.py:260 msgid "Is org admin" @@ -10186,10 +9865,9 @@ msgstr "認証" #: users/serializers/user.py:422 msgid "" -"* For security, only a partial of users is displayed. You can search for more" -msgstr "" -"* あなたの安全のために、一部のユーザーのみを表示します。より多くのユーザーを" -"検索することができます" +"* For security, only a partial of users is displayed. You can search for " +"more" +msgstr "* あなたの安全のために、一部のユーザーのみを表示します。より多くのユーザーを検索することができます" #: users/serializers/user.py:457 msgid "name not unique" @@ -10198,11 +9876,8 @@ msgstr "名前が一意ではない" #: users/signal_handlers.py:41 msgid "" "The administrator has enabled \"Only allow existing users to log in\", \n" -" and the current user is not in the user list. Please contact the " -"administrator." -msgstr "" -"管理者は「既存のユーザーのみログインを許可」をオンにしており、現在のユーザー" -"はユーザーリストにありません。管理者に連絡してください。" +" and the current user is not in the user list. Please contact the administrator." +msgstr "管理者は「既存のユーザーのみログインを許可」をオンにしており、現在のユーザーはユーザーリストにありません。管理者に連絡してください。" #: users/signal_handlers.py:177 msgid "Clean up expired user sessions" @@ -10210,12 +9885,9 @@ msgstr "期限切れのユーザー・セッションのパージ" #: users/signal_handlers.py:179 msgid "" -"After logging in via the web, a user session record is created. At 2 a.m. " -"every day, \n" +"After logging in via the web, a user session record is created. At 2 a.m. every day, \n" " the system cleans up inactive user devices" -msgstr "" -"webでログインすると、利用者のセッションのオンライン記録が生じます。毎日午前2" -"時に、オンラインではない利用者デバイスをクリアします" +msgstr "webでログインすると、利用者のセッションのオンライン記録が生じます。毎日午前2時に、オンラインではない利用者デバイスをクリアします" #: users/tasks.py:26 msgid "Check password expired" @@ -10223,12 +9895,9 @@ msgstr "パスワードの有効期限が切れていることを確認する" #: users/tasks.py:28 msgid "" -"Check every day at 10 AM whether the passwords of users in the system are " -"expired, \n" +"Check every day at 10 AM whether the passwords of users in the system are expired, \n" " and send a notification 5 days in advance" -msgstr "" -"毎日午前10時にチェックし、システム内の利用者のパスワードが期限切れになってい" -"るかどうかを確認し、5日前に通知を送ります" +msgstr "毎日午前10時にチェックし、システム内の利用者のパスワードが期限切れになっているかどうかを確認し、5日前に通知を送ります" #: users/tasks.py:46 msgid "Periodic check password expired" @@ -10236,15 +9905,11 @@ msgstr "定期認証パスワードの有効期限" #: users/tasks.py:48 msgid "" -"With version iterations, new tasks may be added, or task names and execution " -"times may \n" -" be modified. Therefore, upon system startup, it is necessary to " -"register or update the \n" +"With version iterations, new tasks may be added, or task names and execution times may \n" +" be modified. Therefore, upon system startup, it is necessary to register or update the \n" " parameters of the task that checks if passwords have expired" msgstr "" -"バージョンが進化するにつれて、新たなActionが追加されたり、Actionの名前、実行" -"時間が変更されたりする可能性があります。そのため、システムが起動するときに、" -"パスワードの期限切れを確認するActionのパラメータを登録または更新します" +"バージョンが進化するにつれて、新たなActionが追加されたり、Actionの名前、実行時間が変更されたりする可能性があります。そのため、システムが起動するときに、パスワードの期限切れを確認するActionのパラメータを登録または更新します" #: users/tasks.py:67 msgid "Check user expired" @@ -10252,12 +9917,9 @@ msgstr "ユーザーの有効期限が切れていることを確認する" #: users/tasks.py:69 msgid "" -"Check every day at 2 p.m whether the users in the system are expired, and " -"send a \n" +"Check every day at 2 p.m whether the users in the system are expired, and send a \n" " notification 5 days in advance" -msgstr "" -"毎日午前10時に確認し、システム内のユーザーが期限切れになっているか確認し、5日" -"前に通知を送信します" +msgstr "毎日午前10時に確認し、システム内のユーザーが期限切れになっているか確認し、5日前に通知を送信します" #: users/tasks.py:90 msgid "Periodic check user expired" @@ -10265,15 +9927,11 @@ msgstr "ユーザーの有効期限の定期的な検出" #: users/tasks.py:92 msgid "" -"With version iterations, new tasks may be added, or task names and execution " -"times may \n" -" be modified. Therefore, upon system startup, it is necessary to " -"register or update the \n" +"With version iterations, new tasks may be added, or task names and execution times may \n" +" be modified. Therefore, upon system startup, it is necessary to register or update the \n" " parameters of the task that checks if users have expired" msgstr "" -"バージョンのイテレーションに伴い、新たなタスクが追加されたり、タスクの名称、" -"実行時間が変更される可能性があるため、システム起動時に、登録または更新された" -"ユーザーが期限切れのタスクのパラメータをチェックします" +"バージョンのイテレーションに伴い、新たなタスクが追加されたり、タスクの名称、実行時間が変更される可能性があるため、システム起動時に、登録または更新されたユーザーが期限切れのタスクのパラメータをチェックします" #: users/tasks.py:111 msgid "Check unused users" @@ -10281,15 +9939,12 @@ msgstr "未使用のユーザーのチェック" #: users/tasks.py:113 msgid "" -"At 2 p.m. every day, according to the configuration in \"System Settings - " -"Security - \n" -" Auth security - Auto disable threshold\" users who have not logged " -"in or whose API keys \n" +"At 2 p.m. every day, according to the configuration in \"System Settings - Security - \n" +" Auth security - Auto disable threshold\" users who have not logged in or whose API keys \n" " have not been used for a long time will be disabled" msgstr "" -"毎日午前2時、システム設定-セキュリティ設定-非アクティブユーザー自動無効化設定" -"に基づき、長時間ログインしないユーザーやapi_keyを使用しないユーザーを無効にし" -"ます" +"毎日午前2時、システム設定-セキュリティ設定-" +"非アクティブユーザー自動無効化設定に基づき、長時間ログインしないユーザーやapi_keyを使用しないユーザーを無効にします" #: users/tasks.py:157 msgid "The user has not logged in recently and has been disabled." @@ -10303,8 +9958,7 @@ msgstr "アカウントの有効期限は" msgid "" "In order not to affect your normal work, please contact the administrator " "for confirmation." -msgstr "" -"通常の作業に影響を与えないように、確認のために管理者に連絡してください。" +msgstr "通常の作業に影響を与えないように、確認のために管理者に連絡してください。" #: users/templates/users/_msg_password_expire_reminder.html:7 msgid "Your password will expire in" @@ -10314,9 +9968,7 @@ msgstr "パスワードは" msgid "" "For your account security, please click on the link below to update your " "password in time" -msgstr "" -"アカウントのセキュリティについては、下のリンクをクリックしてパスワードを時間" -"内に更新してください" +msgstr "アカウントのセキュリティについては、下のリンクをクリックしてパスワードを時間内に更新してください" #: users/templates/users/_msg_password_expire_reminder.html:11 msgid "Click here update password" @@ -10324,8 +9976,7 @@ msgstr "ここをクリック更新パスワード" #: users/templates/users/_msg_password_expire_reminder.html:15 msgid "If your password has expired, please click the link below to" -msgstr "" -"パスワードの有効期限が切れている場合は、以下のリンクをクリックしてください" +msgstr "パスワードの有効期限が切れている場合は、以下のリンクをクリックしてください" #: users/templates/users/_msg_reset_mfa.html:7 msgid "Your MFA has been reset by site administrator" @@ -10425,11 +10076,9 @@ msgstr "ワンタイムパスワード認証子のバインド" #: users/templates/users/user_otp_enable_bind.html:13 msgid "" -"Use the MFA Authenticator application to scan the following qr code for a 6-" -"bit verification code" -msgstr "" -"MFA Authenticatorアプリケーションを使用して、次のqrコードを6ビット検証コード" -"でスキャンします。" +"Use the MFA Authenticator application to scan the following qr code for a " +"6-bit verification code" +msgstr "MFA Authenticatorアプリケーションを使用して、次のqrコードを6ビット検証コードでスキャンします。" #: users/templates/users/user_otp_enable_bind.html:22 #: users/templates/users/user_verify_mfa.html:27 @@ -10444,9 +10093,7 @@ msgstr "アプリのインストール" msgid "" "Download and install the MFA Authenticator application on your phone or " "applet of WeChat" -msgstr "" -"携帯電話またはWeChatのアプレットにMFA Authenticatorアプリケーションをダウン" -"ロードしてインストールします" +msgstr "携帯電話またはWeChatのアプレットにMFA Authenticatorアプリケーションをダウンロードしてインストールします" #: users/templates/users/user_otp_enable_install_app.html:18 msgid "Android downloads" @@ -10460,9 +10107,7 @@ msgstr "IPhoneのダウンロード" msgid "" "After installation, click the next step to enter the binding page (if " "installed, go to the next step directly)." -msgstr "" -"インストール後、次のステップをクリックしてバインディングページに入ります (イ" -"ンストールされている場合は、次のステップに直接進みます)。" +msgstr "インストール後、次のステップをクリックしてバインディングページに入ります (インストールされている場合は、次のステップに直接進みます)。" #: users/templates/users/user_password_verify.html:8 #: users/templates/users/user_password_verify.html:9 @@ -10477,8 +10122,7 @@ msgstr "認証" msgid "" "The account protection has been opened, please complete the following " "operations according to the prompts" -msgstr "" -"アカウント保護が開始されました。プロンプトに従って次の操作を完了してください" +msgstr "アカウント保護が開始されました。プロンプトに従って次の操作を完了してください" #: users/templates/users/user_verify_mfa.html:17 msgid "Open MFA Authenticator and enter the 6-bit dynamic code" @@ -10506,8 +10150,7 @@ msgstr "すでにバインド済み" #: users/views/profile/otp.py:107 msgid "MFA already bound, disable first, then bound" -msgstr "" -"MFAはすでにバインドされており、最初に無効にしてからバインドされています。" +msgstr "MFAはすでにバインドされており、最初に無効にしてからバインドされています。" #: users/views/profile/otp.py:134 msgid "OTP enable success" @@ -10535,11 +10178,9 @@ msgstr "パスワード無効" #: users/views/profile/reset.py:66 msgid "" -"Non-local users can log in only from third-party platforms and cannot change " -"their passwords: {}" -msgstr "" -"ローカル以外のユーザーは、サードパーティ プラットフォームからのログインのみが" -"許可され、パスワードの変更はサポートされていません: {}" +"Non-local users can log in only from third-party platforms and cannot change" +" their passwords: {}" +msgstr "ローカル以外のユーザーは、サードパーティ プラットフォームからのログインのみが許可され、パスワードの変更はサポートされていません: {}" #: users/views/profile/reset.py:188 users/views/profile/reset.py:199 msgid "Token invalid or expired" @@ -10571,15 +10212,15 @@ msgid "" "strategy will skipped." msgstr "現在のタスク構成に基づいて、未一致ポリシーの資産はスキップされます" -#: xpack/plugins/cloud/api.py:72 +#: xpack/plugins/cloud/api.py:74 msgid "Test connection successful" msgstr "テスト接続成功" -#: xpack/plugins/cloud/api.py:74 +#: xpack/plugins/cloud/api.py:76 msgid "Test connection failed: {}" msgstr "テスト接続に失敗しました: {}" -#: xpack/plugins/cloud/api.py:171 +#: xpack/plugins/cloud/api.py:196 msgid "User {} deleted the current resource and released the assets" msgstr "ユーザー {} が現在のリソースを削除し、アセットを解放しました" @@ -10775,9 +10416,7 @@ msgstr "インスタンス \"%s\" の同期に失敗しました" msgid "" "The updated platform of asset \"%s\" is inconsistent with the original " "platform type. Skip platform and protocol updates" -msgstr "" -"更新された資産 \"%s\" のプラットフォームタイプと元のタイプは一致しません。プ" -"ラットフォームとプロトコルの更新をスキップ" +msgstr "更新された資産 \"%s\" のプラットフォームタイプと元のタイプは一致しません。プラットフォームとプロトコルの更新をスキップ" #: xpack/plugins/cloud/manager.py:407 #, python-format @@ -10917,7 +10556,8 @@ msgstr "インスタンス" msgid "Sync instance detail" msgstr "同期インスタンスの詳細" -#: xpack/plugins/cloud/models.py:313 xpack/plugins/cloud/serializers/task.py:79 +#: xpack/plugins/cloud/models.py:313 +#: xpack/plugins/cloud/serializers/task.py:79 msgid "Rule relation" msgstr "条件関係" @@ -10973,7 +10613,8 @@ msgstr "ルール一致" msgid "Rule value" msgstr "ルール値" -#: xpack/plugins/cloud/models.py:383 xpack/plugins/cloud/serializers/task.py:82 +#: xpack/plugins/cloud/models.py:383 +#: xpack/plugins/cloud/serializers/task.py:82 msgid "Strategy rule" msgstr "戦略ルール" @@ -10989,7 +10630,8 @@ msgstr "アクション属性" msgid "Action value" msgstr "アクション値" -#: xpack/plugins/cloud/models.py:410 xpack/plugins/cloud/serializers/task.py:85 +#: xpack/plugins/cloud/models.py:410 +#: xpack/plugins/cloud/serializers/task.py:85 msgid "Strategy action" msgstr "戦略アクション" @@ -11267,9 +10909,8 @@ msgid "" "synchronization task is executed, only the valid IP address will be " "synchronized.
If the port is 0, all IP addresses are valid." msgstr "" -"このポートは、 IP アドレスの有効性を検出するために使用されます。同期タスクが" -"実行されると、有効な IP アドレスのみが同期されます。
ポートが0の場合、す" -"べてのIPアドレスが有効です。" +"このポートは、 IP アドレスの有効性を検出するために使用されます。同期タスクが実行されると、有効な IP アドレスのみが同期されます。 " +"
ポートが0の場合、すべてのIPアドレスが有効です。" #: xpack/plugins/cloud/serializers/account_attrs.py:191 msgid "Hostname prefix" @@ -11302,12 +10943,12 @@ msgstr "インスタンス数" #: xpack/plugins/cloud/tasks.py:33 #, fuzzy #| msgid "" -#| "Execute this task when manually or scheduled cloud synchronization tasks " -#| "are performed" +#| "Execute this task when manually or scheduled cloud synchronization tasks are" +#| " performed" msgid "" -"Execute this task when manually or scheduled cloud synchronization tasks are " -"performed" -msgstr "手動で、定時にクラウド同期タスクを実行する時にこのタスクを実行します" +"Execute this task when manually or scheduled cloud synchronization tasks are" +" performed" +msgstr "手動または定期的なクラウド同期タスクを実行する場合、このタスクを実行してください" #: xpack/plugins/cloud/tasks.py:50 msgid "Period clean sync instance task execution" @@ -11316,21 +10957,16 @@ msgstr "同期インスタンス タスクの実行記録を定期的にクリ #: xpack/plugins/cloud/tasks.py:52 #, fuzzy #| msgid "" -#| "Every day, according to the configuration in \"System Settings - Tasks - " -#| "Regular \n" -#| " clean-up - Cloud sync task history retention days\" the system " -#| "will clean up the execution \n" +#| "Every day, according to the configuration in \"System Settings - Tasks - Regular \n" +#| " clean-up - Cloud sync task history retention days\" the system will clean up the execution \n" #| " records generated by cloud synchronization" msgid "" -"Every day, according to the configuration in \"System Settings - Tasks - " -"Regular \n" -" clean-up - Cloud sync task history retention days\" the system will " -"clean up the execution \n" +"Every day, according to the configuration in \"System Settings - Tasks - Regular \n" +" clean-up - Cloud sync task history retention days\" the system will clean up the execution \n" " records generated by cloud synchronization" msgstr "" -"毎日、システム設定に基づき-タスクリスト-定期的な設定のクリーンアップ-クラウド" -"同期記録の設定に従って、クラウド同期によって生成された実行記録をクリーンアッ" -"プします。" +"毎日システムは「システム設定-" +"タスク-」の設定に基づいて、定期的にクラウド同期タスクの履歴保持日数をクリーンアップし、クラウド同期によって生成された実行記録を整理します。" #: xpack/plugins/interface/api.py:52 msgid "Restore default successfully." @@ -11386,6 +11022,47 @@ msgstr "ライセンスのインポートに成功" msgid "Invalid license" msgstr "ライセンスが無効です" +#~ msgid "Deleting other people's script is not allowed" +#~ msgstr "他人のスクリプトを削除することは許可されない" + +#~ msgid "Deleting other people's playbook is not allowed" +#~ msgstr "他人のplaybookを削除することは許可されない" + +#, fuzzy +#~ msgid "Directory services" +#~ msgstr "ディレクトリサービス" + +#, python-format +#~ msgid "User %s view/export secret" +#~ msgstr "ユーザー %s がパスワードを閲覧/導き出しました" + +#~ msgid "Enabled, the web session and replay contains watermark information" +#~ msgstr "Webセッションとリプレイには透かし情報が含まれています。" + +#~ msgid "Oracle port range" +#~ msgstr "Oracle がリッスンするポート範囲" + +#~ msgid "" +#~ "Oracle proxy server listen port is dynamic, Each additional Oracle database " +#~ "instance adds a port listener" +#~ msgstr "Oracle プロキシサーバーがリッスンするポートは動的です。追加の Oracle データベースインスタンスはポートリスナーを追加します" + +#~ msgid "" +#~ "No available port is matched. The number of databases may have exceeded the " +#~ "number of ports open to the database agent service, Contact the " +#~ "administrator to open more ports." +#~ msgstr "" +#~ "利用可能なポートと一致しません。データベースの数が、データベース プロキシ " +#~ "サービスによって開かれたポートの数を超えた可能性があります。さらにポートを開くには、管理者に連絡してください。" + +#~ msgid "" +#~ "No ports can be used, check and modify the limit on the number of ports that" +#~ " Magnus listens on in the configuration file." +#~ msgstr "使用できるポートがありません。設定ファイルで Magnus がリッスンするポート数の制限を確認して変更してください. " + +#~ msgid "All available port count: {}, Already use port count: {}" +#~ msgstr "使用可能なすべてのポート数: {}、すでに使用しているポート数: {}" + #~ msgid "Password error" #~ msgstr "パスワードが誤っています" @@ -11405,27 +11082,20 @@ msgstr "ライセンスが無効です" #~ msgstr "弱いパスワードなし" #~ msgid "" -#~ "The following is a summary of account backup tasks, please review and " -#~ "handle them" -#~ msgstr "" -#~ "以下はアカウントバックアップタスクの概要です。ご確認と処理をお願いします。" +#~ "The following is a summary of account backup tasks, please review and handle" +#~ " them" +#~ msgstr "以下はアカウントバックアップタスクの概要です。ご確認と処理をお願いします。" #~ msgid "" -#~ "The following is a summary of account change secret tasks, please read " -#~ "and process" -#~ msgstr "" -#~ "以下はアカウント変更の秘密の任務の概要です。お読みいただき、処理してくださ" -#~ "い。" +#~ "The following is a summary of account change secret tasks, please read and " +#~ "process" +#~ msgstr "以下はアカウント変更の秘密の任務の概要です。お読みいただき、処理してください。" #~ msgid "" #~ "The following is a summary of the account check tasks. Please review and " #~ "handle them" -#~ msgstr "" -#~ "以下はアカウントチェックタスクのまとめですので、ご確認の上、処理してくださ" -#~ "い" +#~ msgstr "以下はアカウントチェックタスクのまとめですので、ご確認の上、処理してください" #~ msgid "" #~ "The following is a summary of account push tasks, please read and process" -#~ msgstr "" -#~ "以下はアカウントプッシュの任務のまとめです。お読みいただき、処理してくださ" -#~ "い。" +#~ msgstr "以下はアカウントプッシュの任務のまとめです。お読みいただき、処理してください。" diff --git a/apps/i18n/core/pt_BR/LC_MESSAGES/django.po b/apps/i18n/core/pt_BR/LC_MESSAGES/django.po index 5aa6d3408..9d385cc3b 100644 --- a/apps/i18n/core/pt_BR/LC_MESSAGES/django.po +++ b/apps/i18n/core/pt_BR/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-20 11:52+0800\n" +"POT-Creation-Date: 2025-04-17 15:04+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,18 +18,18 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: accounts/api/account/account.py:121 +#: accounts/api/account/account.py:131 #: accounts/serializers/account/account.py:181 -#: accounts/serializers/account/account.py:342 +#: accounts/serializers/account/account.py:344 msgid "Account already exists" msgstr "Conta já existente" #: accounts/api/account/application.py:78 -#: authentication/api/connection_token.py:452 +#: authentication/api/connection_token.py:451 msgid "Account not found" msgstr "Conta não encontrada" -#: accounts/api/automations/base.py:83 tickets/api/ticket.py:132 +#: accounts/api/automations/base.py:86 tickets/api/ticket.py:132 msgid "The parameter 'action' must be [{}]" msgstr "O parâmetro 'action' deve ser [{}]" @@ -94,7 +94,7 @@ msgstr "Plano de backup de contas está em execução" msgid "Plan execution end" msgstr "Execução do plano concluída" -#: accounts/automations/base/manager.py:118 +#: accounts/automations/base/manager.py:119 msgid "No pending accounts found" msgstr "Conta pendente não encontrada" @@ -107,13 +107,11 @@ msgstr "Sucesso: %s, Falha: %s, Total: %s" msgid "" "---\n" "Summary: \n" -"ok: {}, weak password: {}, leaked password: {}, repeated password: {}, no " -"secret: {}, using time: {}s" +"ok: {}, weak password: {}, leaked password: {}, repeated password: {}, no secret: {}, using time: {}s" msgstr "" "---\n" "Resumo: \n" -"Normal: {}, Senha fraca: {}, Senha vazada: {}, Senha repetida: {}, Sem " -"senha: {}, Tempo gasto: {} segundos" +"Normal: {}, Senha fraca: {}, Senha vazada: {}, Senha repetida: {}, Sem senha: {}, Tempo gasto: {} segundos" #: accounts/automations/push_account/manager.py:33 msgid "Secret cannot be empty" @@ -125,14 +123,14 @@ msgstr ">>> Iniciando teste de conectividade da conta do gateway" #: accounts/const/account.py:6 #: accounts/serializers/automations/change_secret.py:34 -#: audits/signal_handlers/login_log.py:34 authentication/confirm/password.py:25 -#: authentication/confirm/password.py:27 authentication/const.py:10 -#: authentication/forms.py:28 +#: audits/signal_handlers/login_log.py:34 +#: authentication/confirm/password.py:25 authentication/confirm/password.py:27 +#: authentication/const.py:10 authentication/forms.py:28 #: authentication/templates/authentication/login.html:362 #: authentication/templates/authentication/login.html:408 #: settings/serializers/auth/ldap.py:27 settings/serializers/auth/ldap.py:53 -#: settings/serializers/auth/ldap_ha.py:36 settings/serializers/msg.py:37 -#: settings/serializers/terminal.py:28 terminal/serializers/storage.py:123 +#: settings/serializers/auth/ldap_ha.py:35 settings/serializers/msg.py:37 +#: settings/serializers/terminal.py:32 terminal/serializers/storage.py:123 #: terminal/serializers/storage.py:142 users/forms/profile.py:22 #: users/serializers/user.py:148 #: users/templates/users/_msg_user_created.html:13 @@ -194,7 +192,8 @@ msgstr "Descubra" msgid "Template" msgstr "Modelo" -#: accounts/const/account.py:32 ops/const.py:46 xpack/plugins/cloud/const.py:68 +#: accounts/const/account.py:32 ops/const.py:46 +#: xpack/plugins/cloud/const.py:68 msgid "Skip" msgstr "Pular" @@ -204,7 +203,7 @@ msgid "Update" msgstr "Atualizar" #: accounts/const/account.py:34 accounts/const/automation.py:115 -#: accounts/serializers/automations/change_secret.py:169 audits/const.py:65 +#: accounts/serializers/automations/change_secret.py:169 audits/const.py:66 #: audits/signal_handlers/activity_log.py:34 common/const/choices.py:67 #: ops/const.py:76 terminal/const.py:81 xpack/plugins/cloud/const.py:47 msgid "Failed" @@ -308,7 +307,7 @@ msgstr " Criar e impulsionar " msgid "Only create" msgstr " Apenas criar" -#: accounts/const/automation.py:109 +#: accounts/const/automation.py:109 authentication/const.py:34 #: authentication/serializers/password_mfa.py:16 #: authentication/serializers/password_mfa.py:24 #: notifications/backends/__init__.py:10 settings/serializers/msg.py:21 @@ -324,7 +323,7 @@ msgid "SFTP" msgstr "SFTP" #: accounts/const/automation.py:116 -#: accounts/serializers/automations/change_secret.py:168 audits/const.py:64 +#: accounts/serializers/automations/change_secret.py:168 audits/const.py:65 #: audits/models.py:65 audits/signal_handlers/activity_log.py:34 #: common/const/choices.py:66 ops/const.py:74 ops/serializers/celery.py:48 #: terminal/const.py:80 terminal/models/session/sharing.py:121 @@ -417,33 +416,11 @@ msgstr "" "Falha na Action Vault, tente novamente ou verifique as informações da conta " "no Vault." -#: accounts/filters.py:194 -msgid "Enter a valid UUID." -msgstr "" - -#: accounts/mixins.py:35 -msgid "Export all" -msgstr "Exportar Tudo" - -#: accounts/mixins.py:37 -msgid "Export only selected items" -msgstr "Exportar apenas itens selecionados" - -#: accounts/mixins.py:42 -#, python-format -msgid "Export filtered: %s" -msgstr "Exportar pesquisa: %s" - -#: accounts/mixins.py:48 -#, python-format -msgid "User %s view/export secret" -msgstr "Usuário %s visualizou/exportou a senha" - #: accounts/models/account.py:85 #: accounts/models/automations/check_account.py:59 #: accounts/models/automations/gather_account.py:17 -#: accounts/serializers/account/account.py:226 -#: accounts/serializers/account/account.py:274 +#: accounts/serializers/account/account.py:227 +#: accounts/serializers/account/account.py:276 #: accounts/serializers/automations/change_secret.py:113 #: accounts/serializers/automations/change_secret.py:145 #: accounts/serializers/automations/check_account.py:33 @@ -457,9 +434,9 @@ msgstr "Usuário %s visualizou/exportou a senha" #: accounts/templates/accounts/push_account_report.html:78 #: accounts/templates/accounts/push_account_report.html:118 #: acls/serializers/base.py:130 assets/models/asset/common.py:102 -#: assets/models/asset/common.py:366 assets/models/cmd_filter.py:36 -#: audits/models.py:59 audits/models.py:312 audits/serializers.py:228 -#: authentication/models/connection_token.py:40 +#: assets/models/asset/common.py:428 assets/models/cmd_filter.py:36 +#: audits/models.py:59 audits/models.py:312 audits/serializers.py:230 +#: authentication/models/connection_token.py:41 #: perms/models/asset_permission.py:69 terminal/backends/command/models.py:17 #: terminal/models/session/session.py:34 terminal/notifications.py:156 #: terminal/serializers/command.py:17 terminal/serializers/session.py:30 @@ -470,10 +447,10 @@ msgid "Asset" msgstr "Ativos" #: accounts/models/account.py:89 accounts/models/template.py:16 -#: accounts/serializers/account/account.py:233 -#: accounts/serializers/account/account.py:284 +#: accounts/serializers/account/account.py:234 +#: accounts/serializers/account/account.py:286 #: accounts/serializers/account/template.py:35 -#: authentication/serializers/connect_token_secret.py:50 +#: authentication/serializers/connect_token_secret.py:51 msgid "Su from" msgstr "Mudar de" @@ -491,7 +468,7 @@ msgstr "Histórico de Conta" msgid "Secret reset" msgstr "Senha Alterável" -#: accounts/models/account.py:97 accounts/serializers/account/account.py:228 +#: accounts/models/account.py:97 accounts/serializers/account/account.py:229 #: users/models/user/__init__.py:122 msgid "Source" msgstr "Origem" @@ -518,14 +495,14 @@ msgstr "Status da Alteração de Senha" #: accounts/models/account.py:107 #: accounts/models/automations/check_account.py:64 -#: accounts/serializers/account/service.py:11 +#: accounts/serializers/account/service.py:12 #: accounts/serializers/automations/change_secret.py:115 #: accounts/serializers/automations/change_secret.py:146 #: accounts/templates/accounts/change_secret_failed_info.html:12 #: acls/serializers/base.py:131 #: acls/templates/acls/asset_login_reminder.html:10 #: assets/serializers/gateway.py:33 audits/models.py:60 audits/models.py:313 -#: audits/serializers.py:229 authentication/api/connection_token.py:464 +#: audits/serializers.py:231 authentication/api/connection_token.py:463 #: ops/models/base.py:18 perms/models/asset_permission.py:75 #: settings/serializers/msg.py:33 terminal/backends/command/models.py:18 #: terminal/models/session/session.py:36 terminal/serializers/command.py:72 @@ -562,29 +539,31 @@ msgstr "É possível remover a conta" #: accounts/models/application.py:16 #: accounts/models/automations/check_account.py:116 accounts/models/base.py:63 -#: accounts/serializers/account/service.py:27 +#: accounts/serializers/account/service.py:28 #: accounts/serializers/account/virtual.py:20 acls/models/base.py:35 #: acls/models/base.py:96 acls/models/command_acl.py:21 #: acls/serializers/base.py:35 assets/models/asset/common.py:100 #: assets/models/asset/common.py:166 assets/models/cmd_filter.py:21 #: assets/models/domain.py:19 assets/models/label.py:18 #: assets/models/platform.py:15 assets/models/platform.py:94 -#: assets/serializers/asset/common.py:171 assets/serializers/platform.py:158 -#: assets/serializers/platform.py:278 +#: assets/serializers/asset/common.py:173 assets/serializers/platform.py:158 +#: assets/serializers/platform.py:283 #: authentication/backends/passkey/models.py:10 #: authentication/models/ssh_key.py:12 -#: authentication/serializers/connect_token_secret.py:113 -#: authentication/serializers/connect_token_secret.py:170 labels/models.py:11 +#: authentication/serializers/connect_token_secret.py:115 +#: authentication/serializers/connect_token_secret.py:172 labels/models.py:11 #: ops/mixin.py:32 ops/models/adhoc.py:19 ops/models/celery.py:15 -#: ops/models/celery.py:81 ops/models/job.py:145 ops/models/playbook.py:28 +#: ops/models/celery.py:81 ops/models/job.py:147 ops/models/playbook.py:28 #: ops/models/variable.py:9 ops/serializers/job.py:20 #: ops/serializers/variable.py:20 orgs/models.py:82 #: perms/models/asset_permission.py:61 rbac/models/role.py:29 #: rbac/serializers/role.py:28 settings/models.py:37 settings/models.py:186 #: settings/serializers/msg.py:89 settings/serializers/terminal.py:9 -#: terminal/models/applet/applet.py:34 terminal/models/component/endpoint.py:13 -#: terminal/models/component/endpoint.py:112 -#: terminal/models/component/storage.py:26 terminal/models/component/task.py:13 +#: terminal/models/applet/applet.py:34 +#: terminal/models/component/endpoint.py:13 +#: terminal/models/component/endpoint.py:106 +#: terminal/models/component/storage.py:26 +#: terminal/models/component/task.py:13 #: terminal/models/component/terminal.py:86 #: terminal/models/virtualapp/provider.py:10 #: terminal/models/virtualapp/virtualapp.py:19 tickets/api/ticket.py:87 @@ -610,30 +589,33 @@ msgstr "Texto cifrado" #: accounts/models/application.py:21 acls/models/base.py:98 #: assets/models/automations/base.py:22 assets/models/cmd_filter.py:38 #: assets/serializers/asset/common.py:148 -#: assets/serializers/asset/common.py:420 perms/serializers/permission.py:66 -#: perms/serializers/user_permission.py:75 rbac/tree.py:35 +#: assets/serializers/asset/common.py:423 perms/serializers/permission.py:66 +#: perms/serializers/user_permission.py:76 rbac/tree.py:35 msgid "Accounts" msgstr "Conta" #: accounts/models/application.py:22 authentication/models/access_key.py:20 -#: terminal/models/component/endpoint.py:113 +#: terminal/models/component/endpoint.py:107 msgid "IP group" msgstr "Grupo IP" #: accounts/models/application.py:23 #: authentication/backends/passkey/models.py:14 #: authentication/models/access_key.py:24 -#: authentication/models/private_token.py:8 authentication/models/ssh_key.py:20 +#: authentication/models/private_token.py:8 +#: authentication/models/ssh_key.py:20 msgid "Date last used" msgstr "Data do último uso" #: accounts/models/application.py:24 acls/models/base.py:43 -#: assets/models/asset/common.py:178 authentication/models/access_key.py:23 -#: authentication/models/connection_token.py:58 -#: authentication/models/ssh_key.py:13 authentication/serializers/ssh_key.py:23 +#: assets/models/asset/common.py:182 authentication/models/access_key.py:23 +#: authentication/models/connection_token.py:59 +#: authentication/models/ssh_key.py:13 +#: authentication/serializers/ssh_key.py:23 #: authentication/templates/authentication/_access_key_modal.html:32 -#: perms/models/asset_permission.py:82 terminal/models/component/endpoint.py:28 -#: terminal/models/component/endpoint.py:123 +#: perms/models/asset_permission.py:82 +#: terminal/models/component/endpoint.py:29 +#: terminal/models/component/endpoint.py:117 #: terminal/models/session/sharing.py:29 terminal/serializers/terminal.py:44 #: tickets/const.py:36 msgid "Active" @@ -734,8 +716,8 @@ msgstr "Verifique a conexão após a alteração" #: accounts/models/automations/check_account.py:19 #: accounts/models/automations/gather_account.py:117 #: accounts/serializers/automations/change_secret.py:59 -#: settings/serializers/auth/ldap.py:101 -#: settings/serializers/auth/ldap_ha.py:84 settings/serializers/msg.py:45 +#: settings/serializers/auth/ldap.py:105 +#: settings/serializers/auth/ldap_ha.py:87 settings/serializers/msg.py:45 msgid "Recipient" msgstr "Destinatário" @@ -745,7 +727,7 @@ msgstr "Automação da alteração de senha" #: accounts/models/automations/change_secret.py:47 #: assets/models/automations/base.py:145 ops/models/base.py:56 -#: ops/models/celery.py:90 ops/models/job.py:240 +#: ops/models/celery.py:90 ops/models/job.py:242 #: terminal/models/applet/host.py:142 msgid "Date finished" msgstr "Data de fim" @@ -756,11 +738,11 @@ msgstr "Data de fim" #: accounts/serializers/automations/check_account.py:39 #: assets/models/automations/base.py:137 #: assets/serializers/automations/base.py:45 audits/models.py:209 -#: audits/serializers.py:78 ops/models/base.py:49 ops/models/job.py:231 -#: terminal/models/applet/applet.py:331 terminal/models/applet/host.py:140 +#: audits/serializers.py:77 ops/models/base.py:49 ops/models/job.py:233 +#: terminal/models/applet/applet.py:372 terminal/models/applet/host.py:140 #: terminal/models/component/status.py:30 #: terminal/models/virtualapp/virtualapp.py:99 -#: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:148 +#: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:163 #: terminal/serializers/virtualapp.py:35 tickets/models/ticket/general.py:284 #: tickets/serializers/super_ticket.py:13 #: tickets/serializers/ticket/ticket.py:20 xpack/plugins/cloud/models.py:227 @@ -769,7 +751,7 @@ msgid "Status" msgstr "Status" #: accounts/models/automations/change_secret.py:51 -#: accounts/serializers/account/account.py:276 +#: accounts/serializers/account/account.py:278 #: accounts/templates/accounts/change_secret_failed_info.html:13 #: assets/const/automation.py:9 #: authentication/templates/authentication/passkey.html:173 @@ -820,10 +802,8 @@ msgid "New found" msgstr "Novas Descobertas" #: accounts/models/automations/check_account.py:45 -#, fuzzy -#| msgid "Account delete" msgid "Account deleted" -msgstr "Conta deletada" +msgstr "A conta foi excluída." #: accounts/models/automations/check_account.py:46 msgid "Groups change" @@ -885,9 +865,11 @@ msgstr "Senha repetida" #: accounts/templates/accounts/gather_account_report.html:118 #: accounts/templates/accounts/push_account_report.html:79 #: accounts/templates/accounts/push_account_report.html:119 -#: acls/serializers/base.py:19 acls/serializers/base.py:50 audits/models.py:189 -#: authentication/forms.py:21 authentication/forms.py:23 +#: acls/serializers/base.py:19 acls/serializers/base.py:50 +#: audits/models.py:189 authentication/forms.py:21 authentication/forms.py:23 #: authentication/models/temp_token.py:9 +#: authentication/serializers/connect_token_secret.py:43 +#: authentication/serializers/connect_token_secret.py:53 #: authentication/templates/authentication/_msg_different_city.html:9 #: authentication/templates/authentication/_msg_oauth_bind.html:9 #: authentication/templates/authentication/login.html:408 @@ -1010,11 +992,11 @@ msgid "Verify asset account" msgstr "Conta verificada" #: accounts/models/base.py:37 accounts/models/base.py:66 -#: accounts/serializers/account/account.py:470 +#: accounts/serializers/account/account.py:471 #: accounts/serializers/account/base.py:17 #: accounts/serializers/automations/change_secret.py:48 #: authentication/serializers/connect_token_secret.py:42 -#: authentication/serializers/connect_token_secret.py:51 +#: authentication/serializers/connect_token_secret.py:52 #: terminal/serializers/storage.py:140 msgid "Secret type" msgstr "Tipo de texto cifrado" @@ -1031,7 +1013,7 @@ msgstr "Regras de senha" #: accounts/models/base.py:69 assets/models/automations/base.py:28 #: assets/models/cmd_filter.py:39 assets/models/label.py:22 -#: authentication/serializers/connect_token_secret.py:117 +#: authentication/serializers/connect_token_secret.py:119 #: terminal/models/applet/applet.py:41 #: terminal/models/virtualapp/virtualapp.py:23 users/serializers/user.py:257 msgid "Is active" @@ -1076,8 +1058,8 @@ msgstr "Nome de usuário é o mesmo que o do usuário" #: accounts/models/virtual.py:37 msgid "Non-asset account, Input username/password on connect" msgstr "" -"Conta que se conecta com nome de usuário/senha inseridos manualmente durante " -"o login" +"Conta que se conecta com nome de usuário/senha inseridos manualmente durante" +" o login" #: accounts/models/virtual.py:38 msgid "The account username name same with user on connect" @@ -1151,7 +1133,7 @@ msgstr "Ignorar" msgid "Reopen" msgstr "Reabrir" -#: accounts/risk_handlers.py:19 audits/const.py:38 +#: accounts/risk_handlers.py:19 audits/const.py:39 #: authentication/templates/authentication/_access_key_modal.html:155 #: authentication/templates/authentication/_mfa_confirm_modal.html:53 #: templates/_modal.html:22 tickets/const.py:43 @@ -1179,15 +1161,13 @@ msgstr "Adicionar conta" msgid "Change password and Add" msgstr "Alterar senha e adicionar" -#: accounts/risk_handlers.py:26 audits/const.py:31 ops/const.py:9 +#: accounts/risk_handlers.py:26 audits/const.py:32 ops/const.py:9 msgid "Change password" msgstr "Alterar Senha" #: accounts/risk_handlers.py:127 -#, fuzzy -#| msgid "Test connection failed: {}" msgid "Execution failed: {}" -msgstr "Falha na conexão do teste: {}" +msgstr "Execução falhou: {}" #: accounts/serializers/account/account.py:31 msgid "Push now" @@ -1204,7 +1184,7 @@ msgstr "Estratégia de contas existentes" #: accounts/serializers/account/account.py:206 assets/models/label.py:21 #: assets/models/platform.py:95 assets/serializers/asset/common.py:145 #: assets/serializers/cagegory.py:12 assets/serializers/platform.py:173 -#: assets/serializers/platform.py:279 perms/serializers/user_permission.py:26 +#: assets/serializers/platform.py:284 perms/serializers/user_permission.py:26 #: settings/models.py:39 tickets/models/ticket/apply_application.py:13 #: users/models/preference.py:12 msgid "Category" @@ -1215,11 +1195,11 @@ msgstr "Categoria" #: assets/models/automations/base.py:146 assets/models/cmd_filter.py:74 #: assets/models/platform.py:96 assets/serializers/asset/common.py:146 #: assets/serializers/platform.py:160 assets/serializers/platform.py:172 -#: audits/serializers.py:77 audits/serializers.py:194 -#: authentication/models/connection_token.py:62 -#: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:153 -#: perms/serializers/user_permission.py:27 terminal/models/applet/applet.py:40 -#: terminal/models/component/storage.py:58 +#: audits/serializers.py:76 audits/serializers.py:196 +#: authentication/models/connection_token.py:63 +#: authentication/serializers/connect_token_secret.py:128 +#: ops/models/job.py:155 perms/serializers/user_permission.py:27 +#: terminal/models/applet/applet.py:40 terminal/models/component/storage.py:58 #: terminal/models/component/storage.py:152 terminal/serializers/applet.py:29 #: terminal/serializers/session.py:25 terminal/serializers/storage.py:281 #: terminal/serializers/storage.py:294 tickets/models/comment.py:26 @@ -1229,66 +1209,73 @@ msgstr "Categoria" msgid "Type" msgstr "Tipo" -#: accounts/serializers/account/account.py:222 +#: accounts/serializers/account/account.py:223 msgid "Asset not found" msgstr "Ativo não existe" -#: accounts/serializers/account/account.py:265 +#: accounts/serializers/account/account.py:236 assets/const/category.py:15 +#: assets/models/asset/common.py:180 assets/models/asset/ds.py:14 +#: assets/serializers/asset/common.py:180 +msgid "Directory service" +msgstr "Serviço de diretório" + +#: accounts/serializers/account/account.py:267 msgid "Has secret" msgstr "Senha já gerenciada" -#: accounts/serializers/account/account.py:275 ops/models/celery.py:84 +#: accounts/serializers/account/account.py:277 ops/models/celery.py:84 #: tickets/models/comment.py:13 tickets/models/ticket/general.py:49 #: tickets/models/ticket/general.py:280 tickets/serializers/super_ticket.py:14 msgid "State" msgstr "Estado" -#: accounts/serializers/account/account.py:277 +#: accounts/serializers/account/account.py:279 msgid "Changed" msgstr "Modificado" -#: accounts/serializers/account/account.py:287 acls/models/base.py:97 +#: accounts/serializers/account/account.py:289 acls/models/base.py:97 #: acls/templates/acls/asset_login_reminder.html:9 #: assets/models/automations/base.py:25 -#: assets/serializers/automations/base.py:20 assets/serializers/domain.py:34 +#: assets/serializers/automations/base.py:20 assets/serializers/domain.py:33 #: assets/serializers/platform.py:181 assets/serializers/platform.py:213 -#: authentication/api/connection_token.py:463 ops/models/base.py:17 -#: ops/models/job.py:155 ops/serializers/job.py:21 +#: authentication/api/connection_token.py:462 ops/models/base.py:17 +#: ops/models/job.py:157 ops/serializers/job.py:21 #: perms/serializers/permission.py:57 #: terminal/templates/terminal/_msg_command_execute_alert.html:16 #: xpack/plugins/cloud/manager.py:93 msgid "Assets" msgstr "Bens" -#: accounts/serializers/account/account.py:392 +#: accounts/serializers/account/account.py:394 #, python-format msgid "Asset does not support this secret type: %s" msgstr "Bens não suportam o tipo de conta: %s" -#: accounts/serializers/account/account.py:424 +#: accounts/serializers/account/account.py:426 msgid "Account has exist" msgstr "Conta já existente" -#: accounts/serializers/account/account.py:461 +#: accounts/serializers/account/account.py:463 #: accounts/serializers/account/base.py:86 #: accounts/serializers/account/template.py:66 -#: assets/serializers/asset/common.py:421 +#: assets/serializers/asset/common.py:424 msgid "Spec info" msgstr "Informações especiais" -#: accounts/serializers/account/account.py:471 -#: authentication/serializers/connect_token_secret.py:160 +#: accounts/serializers/account/account.py:472 +#: authentication/serializers/connect_token_secret.py:162 #: authentication/templates/authentication/_access_key_modal.html:30 #: perms/models/perm_node.py:21 users/serializers/group.py:33 msgid "ID" msgstr "ID" -#: accounts/serializers/account/account.py:481 acls/serializers/base.py:123 +#: accounts/serializers/account/account.py:482 acls/serializers/base.py:123 #: acls/templates/acls/asset_login_reminder.html:8 #: acls/templates/acls/user_login_reminder.html:8 -#: assets/models/cmd_filter.py:24 assets/models/label.py:16 audits/models.py:55 -#: audits/models.py:91 audits/models.py:173 audits/models.py:272 -#: audits/serializers.py:195 authentication/models/connection_token.py:36 +#: assets/models/cmd_filter.py:24 assets/models/label.py:16 +#: audits/models.py:55 audits/models.py:91 audits/models.py:173 +#: audits/models.py:272 audits/serializers.py:197 +#: authentication/models/connection_token.py:37 #: authentication/models/ssh_key.py:22 authentication/models/sso_token.py:16 #: notifications/models/notification.py:12 #: perms/api/user_permission/mixin.py:58 perms/models/asset_permission.py:63 @@ -1305,7 +1292,7 @@ msgstr "ID" msgid "User" msgstr "Usuário" -#: accounts/serializers/account/account.py:482 +#: accounts/serializers/account/account.py:483 #: authentication/templates/authentication/_access_key_modal.html:33 #: terminal/notifications.py:159 terminal/notifications.py:219 msgid "Date" @@ -1323,19 +1310,19 @@ msgstr "" "Aviso: Se a identificação não necessitar de um nome de usuário, insira " "'null'. Se for uma conta AD, o formato é username@domain." -#: accounts/serializers/account/service.py:13 +#: accounts/serializers/account/service.py:14 #: authentication/serializers/token.py:22 msgid "Access IP" msgstr "Lista branca de IP" -#: accounts/serializers/account/service.py:26 +#: accounts/serializers/account/service.py:27 #: accounts/serializers/account/virtual.py:19 assets/models/cmd_filter.py:40 -#: assets/models/cmd_filter.py:88 common/db/models.py:36 ops/models/adhoc.py:25 -#: ops/models/job.py:163 ops/models/playbook.py:31 rbac/models/role.py:37 -#: settings/models.py:42 terminal/models/applet/applet.py:46 -#: terminal/models/applet/applet.py:332 terminal/models/applet/host.py:143 -#: terminal/models/component/endpoint.py:27 -#: terminal/models/component/endpoint.py:122 +#: assets/models/cmd_filter.py:88 common/db/models.py:36 +#: ops/models/adhoc.py:25 ops/models/job.py:165 ops/models/playbook.py:31 +#: rbac/models/role.py:37 settings/models.py:42 +#: terminal/models/applet/applet.py:46 terminal/models/applet/applet.py:373 +#: terminal/models/applet/host.py:143 terminal/models/component/endpoint.py:28 +#: terminal/models/component/endpoint.py:116 #: terminal/models/session/session.py:49 #: terminal/models/virtualapp/virtualapp.py:28 tickets/models/comment.py:32 #: tickets/models/ticket/general.py:298 users/models/user/__init__.py:94 @@ -1343,9 +1330,9 @@ msgstr "Lista branca de IP" msgid "Comment" msgstr "Observação" -#: accounts/serializers/account/service.py:28 +#: accounts/serializers/account/service.py:29 #: accounts/templates/accounts/backup_account_report.html:33 -#: assets/serializers/asset/common.py:151 +#: assets/serializers/asset/common.py:152 msgid "Accounts amount" msgstr "Quantidade de contas" @@ -1380,23 +1367,20 @@ msgid "" "length is the length of the password, and the range is 8 to 30.\n" "lowercase indicates whether the password contains lowercase letters, \n" "uppercase indicates whether it contains uppercase letters,\n" -"digit indicates whether it contains numbers, and symbol indicates whether it " -"contains special symbols.\n" -"exclude_symbols is used to exclude specific symbols. You can fill in the " -"symbol characters to be excluded (up to 16). \n" +"digit indicates whether it contains numbers, and symbol indicates whether it contains special symbols.\n" +"exclude_symbols is used to exclude specific symbols. You can fill in the symbol characters to be excluded (up to 16). \n" "If you do not need to exclude symbols, you can leave it blank.\n" -"default: {\"length\": 16, \"lowercase\": true, \"uppercase\": true, " -"\"digit\": true, \"symbol\": true, \"exclude_symbols\": \"\"}" +"default: {\"length\": 16, \"lowercase\": true, \"uppercase\": true, \"digit\": true, \"symbol\": true, \"exclude_symbols\": \"\"}" msgstr "" "length é o comprimento da senha, a faixa de preenchimento é de 8 a 30. " -"lowercase indica se a senha deve incluir letras minúsculas, uppercase indica " -"se deve incluir letras maiúsculas, digit indica se deve incluir números, " +"lowercase indica se a senha deve incluir letras minúsculas, uppercase indica" +" se deve incluir letras maiúsculas, digit indica se deve incluir números, " "symbol indica se deve incluir símbolos especiais. exclude_symbols é usado " "para excluir símbolos específicos, você pode preencher os caracteres do " -"símbolo que deseja excluir (no máximo 16), se não precisar excluir símbolos, " -"pode deixar em branco. Padrão: {\"length\": 16, \"lowercase\": true, " -"\"uppercase\": true, \"digit\": true, \"symbol\": true, \"exclude_symbols\": " -"\"\"}" +"símbolo que deseja excluir (no máximo 16), se não precisar excluir símbolos," +" pode deixar em branco. Padrão: {\"length\": 16, \"lowercase\": true, " +"\"uppercase\": true, \"digit\": true, \"symbol\": true, \"exclude_symbols\":" +" \"\"}" #: accounts/serializers/account/template.py:47 msgid "Secret generation strategy for account creation" @@ -1520,12 +1504,9 @@ msgstr "Execução automática da conta" #: accounts/tasks/automation.py:35 msgid "" -"Unified execution entry for account automation tasks: when the system " -"performs tasks \n" -" such as account push, password change, account verification, account " -"collection, \n" -" and gateway account verification, all tasks are executed through " -"this unified entry" +"Unified execution entry for account automation tasks: when the system performs tasks \n" +" such as account push, password change, account verification, account collection, \n" +" and gateway account verification, all tasks are executed through this unified entry" msgstr "" "Entrada unificada para execução de tarefa automática de conta, quando o " "sistema executa o push de conta, troca de senha, verificação de conta, " @@ -1539,8 +1520,8 @@ msgstr "Registro de execução automática" #: accounts/tasks/automation.py:67 msgid "When manually executing password change records, this task is used" msgstr "" -"Quando o registro de alteração de senha é executado manualmente, é realizado " -"por meio desta tarefa" +"Quando o registro de alteração de senha é executado manualmente, é realizado" +" por meio desta tarefa" #: accounts/tasks/automation.py:96 msgid "Clean change secret and push record period" @@ -1549,33 +1530,26 @@ msgstr "" #: accounts/tasks/automation.py:98 msgid "" -"The system will periodically clean up unnecessary password change and push " -"records, \n" -" including their associated change tasks, execution logs, assets, and " -"accounts. When any \n" -" of these associated items are deleted, the corresponding password " -"change and push records \n" -" become invalid. Therefore, to maintain a clean and efficient " -"database, the system will \n" -" clean up expired records at 2 a.m daily, based on the interval " -"specified by \n" -" PERM_EXPIRED_CHECK_PERIODIC in the config.txt configuration file. " -"This periodic cleanup \n" -" mechanism helps free up storage space and enhances the security and " -"overall performance \n" +"The system will periodically clean up unnecessary password change and push records, \n" +" including their associated change tasks, execution logs, assets, and accounts. When any \n" +" of these associated items are deleted, the corresponding password change and push records \n" +" become invalid. Therefore, to maintain a clean and efficient database, the system will \n" +" clean up expired records at 2 a.m daily, based on the interval specified by \n" +" PERM_EXPIRED_CHECK_PERIODIC in the config.txt configuration file. This periodic cleanup \n" +" mechanism helps free up storage space and enhances the security and overall performance \n" " of data management" msgstr "" "O sistema irá limpar periodicamente os registros de alteração de senha e " -"registros de push que não são mais necessários, incluindo aquelas tarefas de " -"alteração de senha associadas, registros de execução, ativos e contas. " +"registros de push que não são mais necessários, incluindo aquelas tarefas de" +" alteração de senha associadas, registros de execução, ativos e contas. " "Quando qualquer um desses itens associados é excluído, o registro de " -"alteração de senha e push correspondente se tornará inválido. Portanto, para " -"manter a base de dados limpa e eficiente, a limpeza é realizada todos os " +"alteração de senha e push correspondente se tornará inválido. Portanto, para" +" manter a base de dados limpa e eficiente, a limpeza é realizada todos os " "dias às 2 da manhã para aqueles que excederam o intervalo de tempo no " "arquivo de configuração do sistema config.txt PERM_EXPIRED_CHECK_PERIODIC. " "Este mecanismo de limpeza regular não só ajuda a liberar espaço de " -"armazenamento, mas também melhora a segurança e o desempenho geral da gestão " -"de dados." +"armazenamento, mas também melhora a segurança e o desempenho geral da gestão" +" de dados." #: accounts/tasks/push_account.py:16 accounts/tasks/push_account.py:27 msgid "Push accounts to assets" @@ -1586,13 +1560,12 @@ msgid "" "When creating or modifying an account requires account push, this task is " "executed" msgstr "" -"Essa tarefa é realizada quando uma conta é criada ou modificada e o envio da " -"conta é necessário" +"Essa tarefa é realizada quando uma conta é criada ou modificada e o envio da" +" conta é necessário" #: accounts/tasks/remove_account.py:28 msgid "" -"When clicking \"Sync deletion\" in 'Console - Gather Account - Gathered " -"accounts' this \n" +"When clicking \"Sync deletion\" in 'Console - Gather Account - Gathered accounts' this \n" " task will be executed" msgstr "" "Esta tarefa é executada quando você clica para sincronizar e deletar em " @@ -1605,17 +1578,14 @@ msgstr "Limpar contas históricas" #: accounts/tasks/remove_account.py:52 msgid "" -"Each time an asset account is updated, a historical account is generated, so " -"it is \n" -" necessary to clean up the asset account history. The system will " -"clean up excess account \n" -" records at 2 a.m. daily based on the configuration in the \"System " -"settings - Features - \n" +"Each time an asset account is updated, a historical account is generated, so it is \n" +" necessary to clean up the asset account history. The system will clean up excess account \n" +" records at 2 a.m. daily based on the configuration in the \"System settings - Features - \n" " Account storage - Record limit" msgstr "" "Como uma conta histórica é gerada toda vez que uma conta de ativo é " -"atualizada, é necessário limpar o histórico da conta do ativo. O sistema irá " -"limpar os registros de conta excedentes às 2 da manhã de acordo com a " +"atualizada, é necessário limpar o histórico da conta do ativo. O sistema irá" +" limpar os registros de conta excedentes às 2 da manhã de acordo com a " "configuração de limite de registro em Armazenamento de Conta " #: accounts/tasks/remove_account.py:89 @@ -1628,8 +1598,7 @@ msgstr "Sincronizar informações com as contas associadas" #: accounts/tasks/template.py:14 msgid "" -"When clicking 'Sync new secret to accounts' in 'Console - Account - " -"Templates - \n" +"When clicking 'Sync new secret to accounts' in 'Console - Account - Templates - \n" " Accounts' this task will be executed" msgstr "" "Esta tarefa é realizada quando você clica em sincronizar na Console - " @@ -1691,7 +1660,7 @@ msgstr "Nome da tarefa" #: accounts/templates/accounts/gather_account_report.html:21 #: accounts/templates/accounts/push_account_report.html:22 #: assets/models/automations/base.py:143 audits/models.py:66 -#: ops/models/base.py:55 ops/models/celery.py:89 ops/models/job.py:239 +#: ops/models/base.py:55 ops/models/celery.py:89 ops/models/job.py:241 #: ops/templates/ops/celery_task_log.html:101 #: perms/models/asset_permission.py:78 settings/serializers/feature.py:27 #: settings/templates/ldap/_msg_import_ldap_user.html:5 @@ -1737,13 +1706,13 @@ msgid "" "Hello! The following is the failure of changing the password of your assets " "or pushing the account. Please check and handle it in time." msgstr "" -"Olá! Aqui estão os casos de falha ao alterar ou enviar a senha do ativo. Por " -"favor, verifique e corrija o mais rápido possível." +"Olá! Aqui estão os casos de falha ao alterar ou enviar a senha do ativo. Por" +" favor, verifique e corrija o mais rápido possível." #: accounts/templates/accounts/change_secret_report.html:33 #: accounts/templates/accounts/gather_account_report.html:31 #: accounts/templates/accounts/push_account_report.html:32 -#: assets/serializers/domain.py:24 assets/serializers/platform.py:182 +#: assets/serializers/domain.py:23 assets/serializers/platform.py:182 #: orgs/serializers.py:13 perms/serializers/permission.py:61 msgid "Assets amount" msgstr "Número de ativos" @@ -1782,7 +1751,6 @@ msgstr "Não" #: accounts/templates/accounts/change_secret_report.html:94 #: accounts/templates/accounts/change_secret_report.html:134 #: accounts/templates/accounts/gather_account_report.html:92 -#: accounts/templates/accounts/gather_account_report.html:132 #: accounts/templates/accounts/push_account_report.html:93 #: accounts/templates/accounts/push_account_report.html:133 msgid "No new accounts found" @@ -1811,10 +1779,14 @@ msgstr "ContaNovaDescoberta" msgid "Lost accounts" msgstr "ContaPerdida" +#: accounts/templates/accounts/gather_account_report.html:132 +msgid "No lost accounts found" +msgstr "Conta perdida não encontrada." + #: accounts/utils.py:54 msgid "" -"If the password starts with {{` and ends with }} `, then the password is not " -"allowed." +"If the password starts with {{` and ends with }} `, then the password is not" +" allowed." msgstr "" "Se a senha começar com `{{` e terminar com `}}`, essa senha não é permitida." @@ -1826,16 +1798,16 @@ msgstr "Chave inválida ou erro de senha da chave" msgid "App Acls" msgstr "Controle de acesso" -#: acls/const.py:6 audits/const.py:36 terminal/const.py:11 tickets/const.py:44 +#: acls/const.py:6 audits/const.py:37 terminal/const.py:11 tickets/const.py:44 #: tickets/templates/tickets/approve_check_password.html:47 msgid "Reject" msgstr "Negar" -#: acls/const.py:7 audits/const.py:33 terminal/const.py:9 +#: acls/const.py:7 audits/const.py:34 terminal/const.py:9 msgid "Accept" msgstr "Aceitar" -#: acls/const.py:8 audits/const.py:34 +#: acls/const.py:8 audits/const.py:35 msgid "Review" msgstr "Aprovação" @@ -1848,7 +1820,7 @@ msgid "Notify" msgstr "Notificação" #: acls/const.py:11 -msgid "Notify and warn" +msgid "Prompt and warn" msgstr "Dica e alerta" #: acls/const.py:12 @@ -1860,20 +1832,21 @@ msgid "Face Online" msgstr "Facial online" #: acls/models/base.py:37 assets/models/cmd_filter.py:76 -#: terminal/models/component/endpoint.py:115 xpack/plugins/cloud/models.py:316 +#: terminal/models/component/endpoint.py:109 xpack/plugins/cloud/models.py:316 msgid "Priority" msgstr "Prioridade" #: acls/models/base.py:38 assets/models/cmd_filter.py:76 -#: terminal/models/component/endpoint.py:116 xpack/plugins/cloud/models.py:317 +#: terminal/models/component/endpoint.py:110 xpack/plugins/cloud/models.py:317 msgid "1-100, the lower the value will be match first" msgstr "" -"O intervalo da prioridade pode ser de 1 a 100 (quanto menor o valor, maior a " -"prioridade)" +"O intervalo da prioridade pode ser de 1 a 100 (quanto menor o valor, maior a" +" prioridade)" #: acls/models/base.py:41 acls/serializers/base.py:57 -#: assets/models/cmd_filter.py:81 audits/models.py:93 audits/serializers.py:108 -#: authentication/serializers/connect_token_secret.py:119 +#: assets/models/cmd_filter.py:81 audits/models.py:93 +#: audits/serializers.py:107 +#: authentication/serializers/connect_token_secret.py:121 #: authentication/templates/authentication/_access_key_modal.html:34 #: perms/serializers/permission.py:63 perms/serializers/permission.py:85 #: tickets/serializers/ticket/ticket.py:21 @@ -1881,7 +1854,7 @@ msgid "Action" msgstr "Action" #: acls/models/base.py:42 assets/models/cmd_filter.py:86 -#: authentication/serializers/connect_token_secret.py:91 +#: authentication/serializers/connect_token_secret.py:93 msgid "Reviewers" msgstr "Aprovador" @@ -1892,7 +1865,7 @@ msgid "Users" msgstr "Usuário" #: acls/models/command_acl.py:16 assets/models/cmd_filter.py:60 -#: audits/serializers.py:38 ops/serializers/job.py:92 terminal/const.py:88 +#: ops/serializers/job.py:92 terminal/const.py:88 #: terminal/models/session/session.py:45 terminal/serializers/command.py:18 #: terminal/templates/terminal/_msg_command_alert.html:12 #: terminal/templates/terminal/_msg_command_execute_alert.html:10 @@ -1921,7 +1894,7 @@ msgstr "Ignorar Maiúsculas e Minúsculas" #: acls/models/command_acl.py:33 acls/models/command_acl.py:97 #: acls/serializers/command_acl.py:29 -#: authentication/serializers/connect_token_secret.py:88 +#: authentication/serializers/connect_token_secret.py:90 #: terminal/templates/terminal/_msg_command_warning.html:14 msgid "Command group" msgstr "Grupo de Comandos" @@ -1987,8 +1960,8 @@ msgid "" "support)" msgstr "" "* representa uma correspondência com tudo. Por exemplo: 192.168.10.1, " -"192.168.1.0/24, 10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64 " -"(suporte ao domínio) " +"192.168.1.0/24, 10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64" +" (suporte ao domínio) " #: acls/serializers/base.py:41 assets/serializers/asset/host.py:19 msgid "IP/Host" @@ -2023,7 +1996,7 @@ msgstr "" #: authentication/templates/authentication/_msg_oauth_bind.html:12 #: authentication/templates/authentication/_msg_rest_password_success.html:8 #: authentication/templates/authentication/_msg_rest_public_key_success.html:8 -#: common/drf/renders/base.py:150 xpack/plugins/cloud/models.py:393 +#: common/drf/renders/base.py:152 xpack/plugins/cloud/models.py:393 msgid "IP" msgstr "IP" @@ -2045,8 +2018,8 @@ msgid "" "We would like to inform you that a user has recently logged into the " "following asset:" msgstr "" -"Queremos informá-lo de que os seguintes ativos tiveram recentemente usuários " -"logados:" +"Queremos informá-lo de que os seguintes ativos tiveram recentemente usuários" +" logados:" #: acls/templates/acls/asset_login_reminder.html:6 msgid "Asset details" @@ -2084,17 +2057,17 @@ msgid "Login city" msgstr "Cidade do login" #: acls/templates/acls/user_login_reminder.html:11 audits/models.py:198 -#: audits/models.py:267 audits/serializers.py:92 +#: audits/models.py:267 audits/serializers.py:91 msgid "User agent" msgstr "Agente do usuário" -#: assets/api/asset/asset.py:194 +#: assets/api/asset/asset.py:153 msgid "Cannot create asset directly, you should create a host or other" msgstr "" "Não é possível criar ativos diretamente, você deve criar um host ou outros " "ativos." -#: assets/api/asset/asset.py:198 +#: assets/api/asset/asset.py:157 msgid "The number of assets exceeds the limit of 5000" msgstr "A quantidade de ativos excedeu o limite de 5000" @@ -2126,34 +2099,35 @@ msgstr "Gestão de ativos" msgid "Task: {} finished" msgstr "Tarefa: {} concluída" -#: assets/automations/base/manager.py:338 +#: assets/automations/base/manager.py:339 msgid " - Platform {} ansible disabled" -msgstr " - Plataforma {} Ansible foi desabilitada, impossível executar tarefas" +msgstr "" +" - Plataforma {} Ansible foi desabilitada, impossível executar tarefas" -#: assets/automations/base/manager.py:524 +#: assets/automations/base/manager.py:525 msgid ">>> Task preparation phase" msgstr ">>> Preparando para executar tarefas" -#: assets/automations/base/manager.py:528 +#: assets/automations/base/manager.py:529 #, python-brace-format msgid ">>> Executing tasks in batches, total {runner_count}" msgstr ">>> Executando tarefas em partes, total de {runner_count}" -#: assets/automations/base/manager.py:533 +#: assets/automations/base/manager.py:534 msgid ">>> Start executing tasks" msgstr ">>> Começando a executar tarefas" -#: assets/automations/base/manager.py:535 +#: assets/automations/base/manager.py:536 msgid ">>> No tasks need to be executed" msgstr ">>> Não há tarefas para executar" -#: assets/automations/base/manager.py:539 +#: assets/automations/base/manager.py:540 #, python-brace-format msgid ">>> Begin executing batch {index} of tasks" msgstr ">>> Começando a executar o lote {index} de tarefas" #: assets/automations/ping_gateway/manager.py:33 -#: authentication/models/connection_token.py:145 +#: authentication/models/connection_token.py:176 msgid "No account" msgstr "Sem conta" @@ -2180,7 +2154,7 @@ msgstr "Falha na conexão" msgid ">>> Start executing the task to test gateway connectivity" msgstr ">>> Iniciando a tarefa de teste de conectividade do gateway" -#: assets/const/automation.py:6 audits/const.py:6 audits/const.py:47 +#: assets/const/automation.py:6 audits/const.py:6 audits/const.py:48 #: audits/signal_handlers/activity_log.py:63 common/utils/ip/geoip/utils.py:31 #: common/utils/ip/geoip/utils.py:37 common/utils/ip/utils.py:104 msgid "Unknown" @@ -2206,7 +2180,7 @@ msgstr "Gateway de teste" msgid "Gather facts" msgstr "Coleta de informações dos ativos" -#: assets/const/base.py:32 audits/const.py:58 +#: assets/const/base.py:32 audits/const.py:59 #: terminal/serializers/applet_host.py:32 users/models/user/_auth.py:31 msgid "Disabled" msgstr "Desativado" @@ -2240,12 +2214,12 @@ msgid "Cloud service" msgstr "Serviço de nuvem" #: assets/const/category.py:14 assets/models/asset/gpt.py:11 -#: assets/models/asset/web.py:16 audits/const.py:45 +#: assets/models/asset/web.py:16 audits/const.py:46 #: terminal/models/applet/applet.py:28 users/const.py:76 msgid "Web" msgstr "Web" -#: assets/const/category.py:15 common/sdk/sms/endpoint.py:20 +#: assets/const/category.py:16 common/sdk/sms/endpoint.py:20 msgid "Custom type" msgstr "Personalizado" @@ -2281,8 +2255,8 @@ msgstr "" msgid "TP-Link" msgstr "" -#: assets/const/device.py:12 terminal/models/applet/applet.py:27 -#: tickets/const.py:9 +#: assets/const/device.py:12 assets/const/ds.py:7 +#: terminal/models/applet/applet.py:27 tickets/const.py:9 msgid "General" msgstr "Geral" @@ -2298,6 +2272,10 @@ msgstr "Roteador" msgid "Firewall" msgstr "Firewall" +#: assets/const/ds.py:10 +msgid "Windows Active Directory" +msgstr "" + #: assets/const/gpt.py:7 msgid "ChatGPT" msgstr "ChatGPT" @@ -2335,8 +2313,8 @@ msgid "" "
- ${USER} The username of the user" msgstr "" "Diretório raiz do SFTP, suporta variáveis:
-${ACCOUNT} nome de usuário " -"da conta conectada
-${HOME} diretório principal da conta conectada
-" -"${USER} nome de usuário do usuário" +"da conta conectada
-${HOME} diretório principal da conta conectada " +"
-${USER} nome de usuário do usuário" #: assets/const/protocol.py:81 msgid "Console" @@ -2351,14 +2329,14 @@ msgid "Any" msgstr "Qualquer" #: assets/const/protocol.py:88 rbac/tree.py:62 -#: settings/serializers/security.py:241 +#: settings/serializers/security.py:245 msgid "Security" msgstr "Segurança" #: assets/const/protocol.py:89 msgid "" -"Security layer to use for the connection:
Any
Automatically select the " -"security mode based on the security protocols supported by both the client " +"Security layer to use for the connection:
Any
Automatically select the" +" security mode based on the security protocols supported by both the client " "and the server
RDP
Legacy RDP encryption. This mode is generally only " "used for older Windows servers or in cases where a standard Windows login " "screen is desired
TLS
RDP authentication and encryption implemented " @@ -2367,11 +2345,11 @@ msgid "" msgstr "" "Camadas de segurança da conexão:
Qualquer
Escolhe automaticamente o " "modo seguro baseado nos protocolos de segurança suportados pelo cliente e " -"pelo servidor
RDP
Modo de criptografia tradicional do RDP. Normalmente " -"usado apenas para servidores Windows mais antigos ou quando é necessário uma " -"tela de login padrão do Windows
TLS
Autenticação e criptografia do RDP " -"implementada através do TLS
NLA
Este modo utiliza a criptografia TLS e " -"exige que o nome de usuário e a senha sejam fornecidos antecipadamente" +"pelo servidor
RDP
Modo de criptografia tradicional do RDP. Normalmente" +" usado apenas para servidores Windows mais antigos ou quando é necessário " +"uma tela de login padrão do Windows
TLS
Autenticação e criptografia do" +" RDP implementada através do TLS
NLA
Este modo utiliza a criptografia " +"TLS e exige que o nome de usuário e a senha sejam fornecidos antecipadamente" #: assets/const/protocol.py:106 msgid "AD domain" @@ -2428,13 +2406,14 @@ msgstr "Autenticação de banco de dados" msgid "The database to authenticate against" msgstr "Banco de dados que precisa ser autenticado" -#: assets/const/protocol.py:232 authentication/models/connection_token.py:47 +#: assets/const/protocol.py:232 authentication/models/connection_token.py:48 msgid "Connect options" msgstr "Opções de conexão" #: assets/const/protocol.py:233 msgid "The connection specific options eg. retryWrites=false&retryReads=false" -msgstr "Opções de conexão específicas, como retryWrites=false&retryReads=false" +msgstr "" +"Opções de conexão específicas, como retryWrites=false&retryReads=false" #: assets/const/protocol.py:245 msgid "Auth username" @@ -2449,8 +2428,9 @@ msgid "" "When safe mode is enabled, some operations will be disabled, such as: New " "tab, right click, visit other website, etc." msgstr "" -"Quando o modo de segurança estiver ativo, algumas ações serão desabilitadas, " -"como: abrir novas abas, clicar com o botão direito, acessar outros sites etc" +"Quando o modo de segurança estiver ativo, algumas ações serão desabilitadas," +" como: abrir novas abas, clicar com o botão direito, acessar outros sites " +"etc" #: assets/const/protocol.py:275 assets/models/asset/web.py:9 #: assets/serializers/asset/info/spec.py:16 @@ -2473,7 +2453,7 @@ msgstr "Seletor do botão de confirmação" msgid "API mode" msgstr "Modo API" -#: assets/const/types.py:249 +#: assets/const/types.py:252 msgid "All types" msgstr "Todos os tipos" @@ -2496,15 +2476,15 @@ msgstr "Serviço na nuvem" msgid "Port" msgstr "Porta" -#: assets/models/asset/common.py:167 assets/serializers/asset/common.py:172 +#: assets/models/asset/common.py:167 assets/serializers/asset/common.py:174 #: settings/serializers/terminal.py:10 msgid "Address" msgstr "Endereço" -#: assets/models/asset/common.py:169 assets/models/platform.py:149 +#: assets/models/asset/common.py:169 assets/models/platform.py:155 #: assets/serializers/asset/common.py:150 #: authentication/backends/passkey/models.py:12 -#: authentication/serializers/connect_token_secret.py:118 +#: authentication/serializers/connect_token_secret.py:120 #: perms/serializers/user_permission.py:25 xpack/plugins/cloud/models.py:387 msgid "Platform" msgstr "Plataforma" @@ -2513,34 +2493,34 @@ msgstr "Plataforma" msgid "Zone" msgstr "Domínio" -#: assets/models/asset/common.py:176 assets/serializers/asset/common.py:174 +#: assets/models/asset/common.py:176 assets/serializers/asset/common.py:176 #: assets/serializers/automations/base.py:21 ops/serializers/job.py:22 #: perms/serializers/permission.py:58 msgid "Nodes" msgstr "Node" -#: assets/models/asset/common.py:179 assets/serializers/asset/common.py:422 +#: assets/models/asset/common.py:183 assets/serializers/asset/common.py:425 #: assets/serializers/asset/host.py:11 msgid "Gathered info" msgstr "Coletar informações do hardware do ativo" -#: assets/models/asset/common.py:180 assets/serializers/asset/custom.py:14 +#: assets/models/asset/common.py:184 assets/serializers/asset/custom.py:14 msgid "Custom info" msgstr "Propriedades personalizadas" -#: assets/models/asset/common.py:369 +#: assets/models/asset/common.py:431 msgid "Can refresh asset hardware info" msgstr "Pode atualizar as informações do hardware do ativo" -#: assets/models/asset/common.py:370 +#: assets/models/asset/common.py:432 msgid "Can test asset connectivity" msgstr "Pode testar a conectividade do ativo" -#: assets/models/asset/common.py:371 +#: assets/models/asset/common.py:433 msgid "Can match asset" msgstr "Pode correspondências de ativos" -#: assets/models/asset/common.py:372 +#: assets/models/asset/common.py:434 msgid "Can change asset nodes" msgstr "Pode modificar o nó do ativo" @@ -2568,19 +2548,23 @@ msgstr "Ignorar a verificação do certificado" msgid "Postgresql SSL mode" msgstr "Modo SSL do PostgreSQL" +#: assets/models/asset/ds.py:10 assets/serializers/asset/ds.py:20 +msgid "Domain name" +msgstr "Nome do domínio" + #: assets/models/asset/gpt.py:8 settings/serializers/feature.py:139 #: settings/serializers/feature.py:154 msgid "Proxy" msgstr "Proxy" #: assets/models/automations/base.py:23 assets/models/cmd_filter.py:32 -#: assets/models/node.py:553 ops/models/job.py:156 +#: assets/models/node.py:553 ops/models/job.py:158 #: perms/models/asset_permission.py:72 tickets/models/ticket/apply_asset.py:15 #: xpack/plugins/cloud/models.py:388 msgid "Node" msgstr "Nó" -#: assets/models/automations/base.py:29 ops/models/job.py:234 +#: assets/models/automations/base.py:29 ops/models/job.py:236 #: ops/serializers/job.py:24 settings/serializers/auth/sms.py:108 msgid "Parameters" msgstr "Parâmetros" @@ -2598,7 +2582,7 @@ msgid "Asset automation task" msgstr "Tarefas de Automação de Ativos" #: assets/models/automations/base.py:140 assets/models/cmd_filter.py:41 -#: common/db/models.py:34 ops/models/base.py:54 ops/models/job.py:238 +#: common/db/models.py:34 ops/models/base.py:54 ops/models/job.py:240 #: users/models/user/__init__.py:317 msgid "Date created" msgstr "Data de criação" @@ -2609,14 +2593,14 @@ msgstr "Data de criação" msgid "Trigger mode" msgstr "Modo de Trigger" -#: assets/models/automations/base.py:157 audits/serializers.py:39 -#: ops/models/base.py:52 ops/models/job.py:236 +#: assets/models/automations/base.py:157 audits/serializers.py:38 +#: ops/models/base.py:52 ops/models/job.py:238 #: xpack/plugins/cloud/manager.py:103 msgid "Summary" msgstr "Resumo" #: assets/models/automations/base.py:158 ops/models/base.py:51 -#: ops/models/job.py:235 xpack/plugins/cloud/models.py:225 +#: ops/models/job.py:237 xpack/plugins/cloud/models.py:225 msgid "Result" msgstr "Resultado" @@ -2680,7 +2664,7 @@ msgstr "Regras de filtro de comando" msgid "Favorite asset" msgstr "Ativos favoritos" -#: assets/models/gateway.py:34 assets/serializers/domain.py:19 +#: assets/models/gateway.py:34 assets/serializers/domain.py:18 msgid "Gateway" msgstr "Gateway" @@ -2691,8 +2675,8 @@ msgstr "Sistema" #: assets/models/label.py:19 assets/models/node.py:539 #: assets/serializers/cagegory.py:11 assets/serializers/cagegory.py:18 #: assets/serializers/cagegory.py:24 -#: authentication/models/connection_token.py:33 -#: authentication/serializers/connect_token_secret.py:125 +#: authentication/models/connection_token.py:34 +#: authentication/serializers/connect_token_secret.py:127 #: common/serializers/common.py:86 labels/models.py:12 settings/models.py:38 #: users/models/preference.py:13 msgid "Value" @@ -2701,7 +2685,7 @@ msgstr "Valor" #: assets/models/label.py:40 assets/serializers/cagegory.py:10 #: assets/serializers/cagegory.py:17 assets/serializers/cagegory.py:23 #: assets/serializers/platform.py:159 -#: authentication/serializers/connect_token_secret.py:124 +#: authentication/serializers/connect_token_secret.py:126 #: common/serializers/common.py:85 labels/serializers.py:45 #: settings/serializers/msg.py:90 xpack/plugins/cloud/models.py:392 msgid "Label" @@ -2767,7 +2751,7 @@ msgstr "Público" msgid "Setting" msgstr "Configurações" -#: assets/models/platform.py:38 audits/const.py:59 +#: assets/models/platform.py:38 audits/const.py:60 #: authentication/backends/passkey/models.py:11 settings/models.py:41 #: terminal/serializers/applet_host.py:33 users/models/user/_auth.py:32 msgid "Enabled" @@ -2867,15 +2851,19 @@ msgstr "Codificação" msgid "Gateway enabled" msgstr "Habilitar domínio" -#: assets/models/platform.py:106 assets/serializers/platform.py:202 +#: assets/models/platform.py:105 +msgid "DS enabled" +msgstr "Serviço de diretório habilitado" + +#: assets/models/platform.py:107 assets/serializers/platform.py:202 msgid "Su enabled" msgstr "Habilitar mudança de conta" -#: assets/models/platform.py:107 assets/serializers/platform.py:177 +#: assets/models/platform.py:108 assets/serializers/platform.py:177 msgid "Su method" msgstr "Método de mudança de conta" -#: assets/models/platform.py:108 assets/serializers/platform.py:180 +#: assets/models/platform.py:109 assets/serializers/platform.py:180 msgid "Custom fields" msgstr "Atributos personalizados" @@ -2918,36 +2906,36 @@ msgstr "" #: assets/serializers/asset/common.py:147 assets/serializers/platform.py:174 #: authentication/serializers/connect_token_secret.py:30 -#: authentication/serializers/connect_token_secret.py:75 +#: authentication/serializers/connect_token_secret.py:77 #: perms/models/asset_permission.py:76 perms/serializers/permission.py:67 -#: perms/serializers/user_permission.py:74 xpack/plugins/cloud/models.py:390 +#: perms/serializers/user_permission.py:75 xpack/plugins/cloud/models.py:390 #: xpack/plugins/cloud/serializers/task.py:36 msgid "Protocols" msgstr "Grupo de Protocolo" #: assets/serializers/asset/common.py:149 -#: assets/serializers/asset/common.py:173 +#: assets/serializers/asset/common.py:175 msgid "Node path" msgstr "Caminho do nó" -#: assets/serializers/asset/common.py:170 -#: assets/serializers/asset/common.py:423 +#: assets/serializers/asset/common.py:172 +#: assets/serializers/asset/common.py:426 msgid "Auto info" msgstr "Informação de Automação" -#: assets/serializers/asset/common.py:268 +#: assets/serializers/asset/common.py:271 msgid "Platform not exist" msgstr " Plataforma não existe" -#: assets/serializers/asset/common.py:304 +#: assets/serializers/asset/common.py:307 msgid "port out of range (0-65535)" msgstr "Porta fora do alcance (0-65535)" -#: assets/serializers/asset/common.py:311 +#: assets/serializers/asset/common.py:314 msgid "Protocol is required: {}" msgstr "O protocolo é obrigatório: {}" -#: assets/serializers/asset/common.py:350 +#: assets/serializers/asset/common.py:353 msgid "Invalid data" msgstr "Dados inválidos" @@ -2965,21 +2953,24 @@ msgstr "" #: assets/serializers/asset/database.py:24 msgid "Postgresql ssl model help text" msgstr "" -"Preferir: eu não me importo com criptografia, mas se o servidor suportar, " -"estou disposto a pagar o custo.\n" -"Exigir: eu quero que meus dados sejam criptografados, aceito o custo. Eu " -"confio que a rede garantirá que estou sempre conectado ao servidor que " -"quero.\n" -"Verificar CA: Eu quero que meus dados sejam criptografados, eu assumo o " -"custo. Eu quero garantir que estou conectado a um servidor de confiança.\n" -"Verificar Completo: eu quero que meus dados sejam criptografados, estou " -"disposto a assumir o custo. Eu quero ter certeza de que estou conectado a um " -"servidor confiável, e que é o servidor que eu especifico." +"Preferir: eu não me importo com criptografia, mas se o servidor suportar, estou disposto a pagar o custo.\n" +"Exigir: eu quero que meus dados sejam criptografados, aceito o custo. Eu confio que a rede garantirá que estou sempre conectado ao servidor que quero.\n" +"Verificar CA: Eu quero que meus dados sejam criptografados, eu assumo o custo. Eu quero garantir que estou conectado a um servidor de confiança.\n" +"Verificar Completo: eu quero que meus dados sejam criptografados, estou disposto a assumir o custo. Eu quero ter certeza de que estou conectado a um servidor confiável, e que é o servidor que eu especifico." + +#: assets/serializers/asset/ds.py:18 +msgid "" +"The domain part used by the directory service (e.g., AD) and appended to the" +" username during login, such as example.com in user@example.com." +msgstr "" +"O nome de domínio (Domain Name) é a parte do domínio que é anexada ao nome " +"de usuário ao fazer login em serviços de diretório (como AD), por exemplo, " +"example.com em user@example.com." #: assets/serializers/asset/gpt.py:20 msgid "" -"If the server cannot directly connect to the API address, you need set up an " -"HTTP proxy. e.g. http(s)://host:port" +"If the server cannot directly connect to the API address, you need set up an" +" HTTP proxy. e.g. http(s)://host:port" msgstr "" "Se o servidor não pode acessar diretamente o endereço da API, você precisa " "configurar um proxy HTTP. por exemplo http(s)://host:port" @@ -3030,7 +3021,7 @@ msgid "Disk total" msgstr "Tamanho do disco rígido" #: assets/serializers/asset/info/gathered.py:16 -#: authentication/serializers/connect_token_secret.py:115 +#: authentication/serializers/connect_token_secret.py:117 msgid "OS" msgstr "Sistema operacional" @@ -3054,7 +3045,7 @@ msgstr "Restrições" msgid "Types" msgstr "Tipo" -#: assets/serializers/domain.py:21 +#: assets/serializers/domain.py:20 msgid "" "A gateway is a network proxy for a zone, and when connecting assets within " "the zone, the connection is routed through the gateway." @@ -3177,11 +3168,11 @@ msgstr "O ativo pode se conectar através do gateway regional" msgid "Default Domain" msgstr "Domínio padrão" -#: assets/serializers/platform.py:234 +#: assets/serializers/platform.py:239 msgid "type is required" msgstr "Tipo Esse campo é obrigatório." -#: assets/serializers/platform.py:249 +#: assets/serializers/platform.py:254 msgid "Protocols is required" msgstr "O acordo é obrigatório" @@ -3207,8 +3198,7 @@ msgstr "Coleta de informações de ativos" #: assets/tasks/gather_facts.py:25 msgid "" -"When clicking 'Refresh hardware info' in 'Console - Asset Details - Basic' " -"this task \n" +"When clicking 'Refresh hardware info' in 'Console - Asset Details - Basic' this task \n" " will be executed" msgstr "" "Quando clicar para atualizar as informações de hardware na página de " @@ -3228,10 +3218,8 @@ msgstr "Verificar a quantidade de ativos sob o nó" #: assets/tasks/nodes_amount.py:18 msgid "" -"Manually verifying asset quantities updates the asset count for nodes under " -"the \n" -" current organization. This task will be called in the following two " -"cases: when updating \n" +"Manually verifying asset quantities updates the asset count for nodes under the \n" +" current organization. This task will be called in the following two cases: when updating \n" " nodes and when the number of nodes exceeds 100" msgstr "" "Ajuste manual do número de ativos para atualizar o número de ativos do nó " @@ -3240,7 +3228,8 @@ msgstr "" #: assets/tasks/nodes_amount.py:34 msgid "" -"The task of self-checking is already running and cannot be started repeatedly" +"The task of self-checking is already running and cannot be started " +"repeatedly" msgstr "" "O programa de auto-inspeção já está rodando, não pode ser reinicializado" @@ -3250,8 +3239,7 @@ msgstr "Verificação periódica da quantidade de ativos sob o nó" #: assets/tasks/nodes_amount.py:42 msgid "" -"Schedule the check_node_assets_amount_task to periodically update the asset " -"count of \n" +"Schedule the check_node_assets_amount_task to periodically update the asset count of \n" " all nodes under all organizations" msgstr "" "Convocação regular do Action check_node_assets_amount_task, atualização da " @@ -3280,8 +3268,8 @@ msgstr "Testar a conectividade do gateway" #: assets/tasks/ping_gateway.py:23 msgid "" -"When clicking 'Test Connection' in 'Domain Details - Gateway' this task will " -"be executed" +"When clicking 'Test Connection' in 'Domain Details - Gateway' this task will" +" be executed" msgstr "" "Quando esta Action é executada no detalhe do domínio de rede - gateway - " "teste de conexão" @@ -3307,7 +3295,8 @@ msgid "App Audits" msgstr "Auditoria de Logs" #: audits/backends/db.py:17 -msgid "The text content is too long. Use Elasticsearch to store operation logs" +msgid "" +"The text content is too long. Use Elasticsearch to store operation logs" msgstr "" "O conteúdo do texto é muito longo. Por favor, use o Elasticsearch para " "armazenar logs de ação" @@ -3350,7 +3339,7 @@ msgstr "Renomear" msgid "Symlink" msgstr "Criar link simbólico" -#: audits/const.py:18 audits/const.py:28 +#: audits/const.py:18 audits/const.py:29 #: ops/templates/ops/celery_task_log.html:86 #: terminal/api/session/session.py:154 msgid "Download" @@ -3373,56 +3362,60 @@ msgstr "Visualizar" msgid "Create" msgstr "Criar" -#: audits/const.py:29 +#: audits/const.py:27 templates/_csv_import_export.html:8 +msgid "Export" +msgstr "Exportar" + +#: audits/const.py:30 msgid "Connect" msgstr "Conectar" -#: audits/const.py:30 authentication/templates/authentication/login.html:329 +#: audits/const.py:31 authentication/templates/authentication/login.html:329 #: authentication/templates/authentication/login.html:401 #: templates/_header_bar.html:101 msgid "Login" msgstr "Login" -#: audits/const.py:35 rbac/tree.py:56 +#: audits/const.py:36 rbac/tree.py:56 msgid "Notifications" msgstr "Notificações" -#: audits/const.py:37 tickets/const.py:45 +#: audits/const.py:38 tickets/const.py:45 msgid "Approve" msgstr "Concordar" -#: audits/const.py:41 ops/models/celery.py:85 +#: audits/const.py:42 ops/models/celery.py:85 #: terminal/models/session/sharing.py:128 tickets/const.py:25 #: xpack/plugins/cloud/const.py:67 msgid "Finished" msgstr "Terminar" -#: audits/const.py:46 settings/serializers/terminal.py:6 +#: audits/const.py:47 settings/serializers/terminal.py:6 #: terminal/models/applet/host.py:26 terminal/models/component/terminal.py:185 -#: terminal/models/virtualapp/provider.py:14 terminal/serializers/session.py:57 -#: terminal/serializers/session.py:113 +#: terminal/models/virtualapp/provider.py:14 +#: terminal/serializers/session.py:57 terminal/serializers/session.py:113 msgid "Terminal" msgstr "Terminal" -#: audits/const.py:51 audits/models.py:133 +#: audits/const.py:52 audits/models.py:133 msgid "Operate log" msgstr "Registro de Ações" -#: audits/const.py:52 +#: audits/const.py:53 msgid "Session log" msgstr "Registro de Sessões" -#: audits/const.py:53 +#: audits/const.py:54 msgid "Login log" msgstr "Registro de Login" -#: audits/const.py:54 rbac/tree.py:64 terminal/models/applet/host.py:144 +#: audits/const.py:55 rbac/tree.py:64 terminal/models/applet/host.py:144 #: terminal/models/component/task.py:22 #: xpack/plugins/cloud/serializers/account.py:77 msgid "Task" msgstr "Tarefas" -#: audits/const.py:60 +#: audits/const.py:61 msgid "-" msgstr "-" @@ -3440,7 +3433,7 @@ msgstr "Logs de auditoria de tarefas" msgid "Remote addr" msgstr "Endereço remoto" -#: audits/models.py:62 audits/serializers.py:62 +#: audits/models.py:62 audits/serializers.py:61 msgid "Operate" msgstr "Operação" @@ -3465,17 +3458,17 @@ msgstr "Sessão" msgid "File transfer log" msgstr "Transferência de arquivo" -#: audits/models.py:95 audits/serializers.py:110 +#: audits/models.py:95 audits/serializers.py:109 msgid "Resource Type" msgstr "Tipo de recurso" #: audits/models.py:96 audits/models.py:99 audits/models.py:145 -#: audits/serializers.py:109 labels/serializers.py:46 +#: audits/serializers.py:108 labels/serializers.py:46 msgid "Resource" msgstr "Recurso" #: audits/models.py:102 audits/models.py:148 audits/models.py:178 -#: audits/models.py:314 audits/serializers.py:230 +#: audits/models.py:314 audits/serializers.py:232 #: terminal/serializers/command.py:75 msgid "Datetime" msgstr "Data" @@ -3509,7 +3502,7 @@ msgstr "Método de Login" msgid "Login IP" msgstr "IP de Login" -#: audits/models.py:201 audits/serializers.py:76 +#: audits/models.py:201 audits/serializers.py:75 #: authentication/templates/authentication/_mfa_confirm_modal.html:14 #: users/forms/profile.py:64 users/models/user/__init__.py:82 #: users/serializers/profile.py:71 @@ -3560,37 +3553,37 @@ msgid "Application ID" msgstr "IDdoAplicativo" #: audits/serializers.py:33 ops/models/adhoc.py:24 ops/models/base.py:16 -#: ops/models/base.py:53 ops/models/celery.py:87 ops/models/job.py:154 -#: ops/models/job.py:237 ops/models/playbook.py:30 ops/models/variable.py:17 +#: ops/models/base.py:53 ops/models/celery.py:87 ops/models/job.py:156 +#: ops/models/job.py:239 ops/models/playbook.py:30 ops/models/variable.py:17 #: terminal/models/session/sharing.py:25 msgid "Creator" msgstr "Criador" -#: audits/serializers.py:40 ops/serializers/celery.py:33 +#: audits/serializers.py:39 ops/serializers/celery.py:33 msgid "Execution cycle" msgstr "Execução periódica" -#: audits/serializers.py:93 +#: audits/serializers.py:92 msgid "Reason display" msgstr "Descrição do motivo" -#: audits/serializers.py:94 audits/serializers.py:208 +#: audits/serializers.py:93 audits/serializers.py:210 msgid "Auth backend display" msgstr "Método de autenticação" -#: audits/serializers.py:158 +#: audits/serializers.py:157 #, python-format msgid "%s %s this resource" msgstr "Usuário %s %s o recurso atual" -#: audits/serializers.py:196 authentication/models/connection_token.py:51 +#: audits/serializers.py:198 authentication/models/connection_token.py:52 #: authentication/models/temp_token.py:13 perms/models/asset_permission.py:80 #: tickets/models/ticket/apply_application.py:31 #: tickets/models/ticket/apply_asset.py:21 users/models/user/__init__.py:101 msgid "Date expired" msgstr "Data de expiração" -#: audits/serializers.py:227 terminal/models/component/terminal.py:91 +#: audits/serializers.py:229 terminal/models/component/terminal.py:91 #: terminal/serializers/command.py:76 msgid "Remote Address" msgstr "Endereço remoto" @@ -3668,12 +3661,9 @@ msgstr "Limpar logs de tarefas de auditoria de ativos" #: audits/tasks.py:134 msgid "" -"Since the system generates login logs, operation logs, file upload logs, " -"activity \n" -" logs, Celery execution logs, session recordings, command records, " -"and password change \n" -" logs, it will perform cleanup of records that exceed the time limit " -"according to the \n" +"Since the system generates login logs, operation logs, file upload logs, activity \n" +" logs, Celery execution logs, session recordings, command records, and password change \n" +" logs, it will perform cleanup of records that exceed the time limit according to the \n" " 'Tasks - Regular clean-up' in the system settings at 2 a.m daily" msgstr "" "Devido ao sistema gerar logs de entrada, logs de operações, logs de upload " @@ -3689,12 +3679,12 @@ msgstr "Upload de arquivos FTP para armazenamento externo" #: audits/tasks.py:156 msgid "" -"If SERVER_REPLAY_STORAGE is configured, files uploaded through file " -"management will be \n" +"If SERVER_REPLAY_STORAGE is configured, files uploaded through file management will be \n" " synchronized to external storage" msgstr "" -"Se SERVER_REPLAY_STORAGE estiver configurado, os arquivos carregados através " -"do gerenciamento de arquivos serão sincronizados com o armazenamento externo" +"Se SERVER_REPLAY_STORAGE estiver configurado, os arquivos carregados através" +" do gerenciamento de arquivos serão sincronizados com o armazenamento " +"externo" #: authentication/api/access_key.py:39 msgid "Access keys can be created at most 10" @@ -3711,41 +3701,41 @@ msgstr "" "Esta operação requer a verificação do seu MFA, por favor ative e configure " "primeiro" -#: authentication/api/connection_token.py:303 +#: authentication/api/connection_token.py:304 msgid "Reusable connection token is not allowed, global setting not enabled" msgstr "" "Não é permitido o uso de tokens de conexão reutilizáveis, as configurações " "globais não estão ativadas" -#: authentication/api/connection_token.py:423 +#: authentication/api/connection_token.py:424 msgid "Anonymous account is not supported for this asset" msgstr "Contas anônimas não suportam o ativo atual" -#: authentication/api/connection_token.py:455 +#: authentication/api/connection_token.py:454 msgid "Permission expired" msgstr "A autorização expirou" -#: authentication/api/connection_token.py:488 +#: authentication/api/connection_token.py:487 msgid "ACL action is reject: {}({})" msgstr "Ação do ACL é rejeitar: {} ({})." -#: authentication/api/connection_token.py:492 +#: authentication/api/connection_token.py:491 msgid "ACL action is review" msgstr "Ação ACL é para revisão" -#: authentication/api/connection_token.py:502 +#: authentication/api/connection_token.py:501 msgid "ACL action is face verify" msgstr "Ação ACL é verificação facial" -#: authentication/api/connection_token.py:507 +#: authentication/api/connection_token.py:506 msgid "ACL action not supported for this asset" msgstr "As regras de login de ativos não suportam o ativo atual" -#: authentication/api/connection_token.py:514 +#: authentication/api/connection_token.py:513 msgid "ACL action is face online" msgstr "Ação ACL é facial online" -#: authentication/api/connection_token.py:533 +#: authentication/api/connection_token.py:532 msgid "No available face feature" msgstr "Não há características faciais disponíveis" @@ -3868,16 +3858,16 @@ msgstr "MFA Virtual" msgid "SMS" msgstr "SMS" -#: authentication/const.py:34 +#: authentication/const.py:35 msgid "Face Recognition" msgstr "Reconhecimento facial" -#: authentication/const.py:35 settings/serializers/auth/radius.py:14 +#: authentication/const.py:36 settings/serializers/auth/radius.py:14 #: settings/serializers/auth/radius.py:16 msgid "Radius" msgstr "Radius" -#: authentication/const.py:36 +#: authentication/const.py:37 msgid "Custom" msgstr "Personalizado." @@ -3959,8 +3949,8 @@ msgstr "" #: authentication/errors/const.py:59 #, python-brace-format msgid "" -"{error}, You can also try {times_try} times (The account will be temporarily " -"locked for {block_time} minutes)" +"{error}, You can also try {times_try} times (The account will be temporarily" +" locked for {block_time} minutes)" msgstr "" "{error} você ainda pode tentar {times_try} vezes (a conta será bloqueada " "temporariamente por {block_time} minutos) " @@ -4069,7 +4059,9 @@ msgstr "Tipo de MFA" msgid "Captcha" msgstr "Código de verificação" -#: authentication/forms.py:66 users/forms/profile.py:28 +#: authentication/forms.py:66 authentication/mfa/email.py:41 +#: authentication/templates/authentication/_msg_mfa_email_code.html:12 +#: users/forms/profile.py:28 msgid "MFA code" msgstr "Código de verificação MFA" @@ -4083,9 +4075,11 @@ msgstr "Por favor, digite o código de segurança Action" #: authentication/mfa/base.py:27 msgid "" -"The two-factor code you entered has either already been used or has expired. " -"Please request a new one." +"The two-factor code you entered has either already been used or has expired." +" Please request a new one." msgstr "" +"O código de verificação dupla que você inseriu já foi utilizado ou expirou. " +"Por favor, solicite um novo código de verificação dupla." #: authentication/mfa/custom.py:21 msgid "MFA Custom code invalid" @@ -4099,6 +4093,14 @@ msgstr "Código MFA personalizado" msgid "MFA custom global enabled, cannot disable" msgstr "MFA personalizado ativado globalmente, não pode ser desativado" +#: authentication/mfa/email.py:11 +msgid "Email verify code invalid" +msgstr "Validação do código de verificação por e-mail falhou" + +#: authentication/mfa/email.py:17 +msgid "Email verification code" +msgstr "Código de verificação por e-mail" + #: authentication/mfa/face.py:55 msgid "Bind face to enable" msgstr "Vincule características faciais para habilitar" @@ -4149,7 +4151,7 @@ msgstr "Ativar definição de número de telefone" msgid "Clear phone number to disable" msgstr "Desativar limpeza de número de telefone" -#: authentication/middleware.py:95 settings/utils/ldap.py:691 +#: authentication/middleware.py:95 settings/utils/ldap.py:711 msgid "Authentication failed (before login check failed): {}" msgstr "Falha de autenticação (verificação pré-login falhou): {}" @@ -4162,8 +4164,8 @@ msgid "" "The administrator has enabled 'Only allow login from user source'. \n" " The current user source is {}. Please contact the administrator." msgstr "" -"O administrador ativou 'Apenas login a partir da fonte do usuário', a origem " -"do usuário atual é {}, por favor, contate o administrador." +"O administrador ativou 'Apenas login a partir da fonte do usuário', a origem" +" do usuário atual é {}, por favor, contate o administrador." #: authentication/mixins.py:273 msgid "The MFA type ({}) is not enabled" @@ -4173,22 +4175,22 @@ msgstr "Este método MFA ({}) não está ativado" msgid "Please change your password" msgstr "Por favor, altere sua senha." -#: authentication/models/connection_token.py:42 +#: authentication/models/connection_token.py:43 #: terminal/serializers/storage.py:114 msgid "Account name" msgstr "Nome da conta" -#: authentication/models/connection_token.py:43 +#: authentication/models/connection_token.py:44 msgid "Input username" msgstr "Nome de usuário personalizado" -#: authentication/models/connection_token.py:44 +#: authentication/models/connection_token.py:45 #: authentication/serializers/connection_token.py:18 msgid "Input secret" msgstr "Senha personalizada" -#: authentication/models/connection_token.py:45 -#: authentication/serializers/connect_token_secret.py:114 +#: authentication/models/connection_token.py:46 +#: authentication/serializers/connect_token_secret.py:116 #: settings/serializers/msg.py:28 terminal/models/applet/applet.py:43 #: terminal/models/virtualapp/virtualapp.py:24 #: terminal/serializers/session.py:23 terminal/serializers/session.py:50 @@ -4196,69 +4198,69 @@ msgstr "Senha personalizada" msgid "Protocol" msgstr "Protocolo" -#: authentication/models/connection_token.py:46 +#: authentication/models/connection_token.py:47 msgid "Connect method" msgstr "Modo de conexão" -#: authentication/models/connection_token.py:48 +#: authentication/models/connection_token.py:49 msgid "User display" msgstr "Nome do usuário" -#: authentication/models/connection_token.py:49 +#: authentication/models/connection_token.py:50 msgid "Asset display" msgstr "Nome do ativo" -#: authentication/models/connection_token.py:50 +#: authentication/models/connection_token.py:51 msgid "Reusable" msgstr "Pode ser reutilizado" -#: authentication/models/connection_token.py:55 +#: authentication/models/connection_token.py:56 #: perms/models/asset_permission.py:83 msgid "From ticket" msgstr "De ordem de serviço" -#: authentication/models/connection_token.py:57 +#: authentication/models/connection_token.py:58 msgid "Face monitor token" msgstr "Token de monitoramento facial" -#: authentication/models/connection_token.py:68 +#: authentication/models/connection_token.py:69 msgid "Can expire connection token" msgstr "Pode expirar token de conexão" -#: authentication/models/connection_token.py:69 +#: authentication/models/connection_token.py:70 msgid "Can reuse connection token" msgstr "Pode reutilizar token de conexão" -#: authentication/models/connection_token.py:71 +#: authentication/models/connection_token.py:72 msgid "Connection token" msgstr "Token de conexão" -#: authentication/models/connection_token.py:132 +#: authentication/models/connection_token.py:163 msgid "Connection token inactive" msgstr "Token de conexão não ativado" -#: authentication/models/connection_token.py:136 +#: authentication/models/connection_token.py:167 msgid "Connection token expired at: {}" msgstr "Token de conexão expirado: {}" -#: authentication/models/connection_token.py:139 +#: authentication/models/connection_token.py:170 #: terminal/serializers/session.py:95 msgid "No user or invalid user" msgstr "Sem usuário ou usuário inválido" -#: authentication/models/connection_token.py:142 +#: authentication/models/connection_token.py:173 msgid "No asset or inactive asset" msgstr "Sem ativos ou ativos não ativados" -#: authentication/models/connection_token.py:290 +#: authentication/models/connection_token.py:341 msgid "Can view super connection token secret" msgstr "Pode ver o texto cifrado do token de link super" -#: authentication/models/connection_token.py:292 +#: authentication/models/connection_token.py:343 msgid "Super connection token" msgstr "Token de link super" -#: authentication/models/connection_token.py:309 +#: authentication/models/connection_token.py:360 msgid "Admin connection token" msgstr "TokenDeConexãoAdmin" @@ -4272,7 +4274,7 @@ msgstr "Token privado" msgid "Private key" msgstr "Chave privada ssh" -#: authentication/models/ssh_key.py:18 settings/serializers/terminal.py:34 +#: authentication/models/ssh_key.py:18 settings/serializers/terminal.py:38 #: users/forms/profile.py:175 users/models/user/__init__.py:92 #: xpack/plugins/cloud/serializers/account_attrs.py:211 msgid "Public key" @@ -4298,39 +4300,39 @@ msgstr "Alerta de login remoto" msgid "binding reminder" msgstr "Alerta de vinculação" -#: authentication/serializers/connect_token_secret.py:116 +#: authentication/serializers/connect_token_secret.py:118 msgid "Is builtin" msgstr "Incorporado" -#: authentication/serializers/connect_token_secret.py:120 +#: authentication/serializers/connect_token_secret.py:122 msgid "Options" msgstr "Opções" -#: authentication/serializers/connect_token_secret.py:127 +#: authentication/serializers/connect_token_secret.py:129 #: ops/notifications.py:19 rbac/tree.py:60 msgid "Component" msgstr "Componentes" -#: authentication/serializers/connect_token_secret.py:136 +#: authentication/serializers/connect_token_secret.py:138 #: perms/serializers/user_permission.py:28 xpack/plugins/cloud/models.py:389 msgid "Domain" msgstr "Domínio da Web" -#: authentication/serializers/connect_token_secret.py:138 +#: authentication/serializers/connect_token_secret.py:140 msgid "Expired now" msgstr "Expiração Imediata" -#: authentication/serializers/connect_token_secret.py:171 +#: authentication/serializers/connect_token_secret.py:173 #: terminal/models/virtualapp/virtualapp.py:25 msgid "Image name" msgstr "Nome da Imagem" -#: authentication/serializers/connect_token_secret.py:172 +#: authentication/serializers/connect_token_secret.py:174 #: terminal/models/virtualapp/virtualapp.py:27 msgid "Image port" msgstr "Porta da Imagem" -#: authentication/serializers/connect_token_secret.py:173 +#: authentication/serializers/connect_token_secret.py:175 #: terminal/models/virtualapp/virtualapp.py:26 msgid "Image protocol" msgstr "Protocolo da Imagem" @@ -4380,14 +4382,14 @@ msgstr "Tipo de Criação" #: authentication/serializers/ssh_key.py:33 msgid "" -"Please download the private key after creation. Each private key can only be " -"downloaded once" +"Please download the private key after creation. Each private key can only be" +" downloaded once" msgstr "" -"Após a criação, faça o download da chave privada, cada chave privada só pode " -"ser baixada uma vez" +"Após a criação, faça o download da chave privada, cada chave privada só pode" +" ser baixada uma vez" #: authentication/serializers/ssh_key.py:57 users/forms/profile.py:164 -#: users/serializers/profile.py:134 users/serializers/profile.py:161 +#: users/serializers/profile.py:142 users/serializers/profile.py:169 msgid "Not a valid ssh public key" msgstr "Chave SSH inválida" @@ -4403,8 +4405,8 @@ msgstr "Limpar sessões expiradas" #: authentication/tasks.py:15 msgid "" -"Since user logins create sessions, the system will clean up expired sessions " -"every 24 hours" +"Since user logins create sessions, the system will clean up expired sessions" +" every 24 hours" msgstr "" "Como as sessões são geradas quando os usuários acessam o sistema, ele limpa " "as sessões expiradas a cada 24 horas" @@ -4416,8 +4418,8 @@ msgstr "Lista de chaves API" #: authentication/templates/authentication/_access_key_modal.html:18 msgid "Using api key sign api header, every requests header difference" msgstr "" -"Use a chave API para assinar o cabeçalho do pedido, cada cabeçalho de pedido " -"é diferente" +"Use a chave API para assinar o cabeçalho do pedido, cada cabeçalho de pedido" +" é diferente" #: authentication/templates/authentication/_access_key_modal.html:19 msgid "docs" @@ -4428,12 +4430,14 @@ msgid "Show" msgstr "Mostrar" #: authentication/templates/authentication/_access_key_modal.html:66 -#: users/const.py:42 users/templates/users/user_verify_mfa.html:36 +#: settings/serializers/terminal.py:24 users/const.py:42 +#: users/templates/users/user_verify_mfa.html:36 msgid "Disable" msgstr "Desativar" #: authentication/templates/authentication/_access_key_modal.html:67 -#: users/const.py:43 users/templates/users/mfa_setting.html:120 +#: settings/serializers/terminal.py:24 users/const.py:43 +#: users/templates/users/mfa_setting.html:120 #: users/templates/users/mfa_setting.html:158 #: users/templates/users/mfa_setting.html:177 msgid "Enable" @@ -4467,10 +4471,11 @@ msgid "Code error" msgstr "Erro de código" #: authentication/templates/authentication/_msg_different_city.html:3 +#: authentication/templates/authentication/_msg_mfa_email_code.html:9 #: authentication/templates/authentication/_msg_oauth_bind.html:3 #: authentication/templates/authentication/_msg_reset_password.html:3 #: authentication/templates/authentication/_msg_reset_password_code.html:9 -#: jumpserver/conf.py:539 +#: jumpserver/conf.py:540 #: perms/templates/perms/_msg_item_permissions_expire.html:3 #: tickets/templates/tickets/approve_check_password.html:32 #: users/templates/users/_msg_account_expire_reminder.html:4 @@ -4491,6 +4496,11 @@ msgstr "" "Se você suspeita de atividades incomuns, por favor, altere sua senha " "imediatamente" +#: authentication/templates/authentication/_msg_mfa_email_code.html:15 +#: authentication/templates/authentication/_msg_reset_password_code.html:18 +msgid "The validity period of the verification code is one minute" +msgstr "O código de verificação é válido por 1 minuto" + #: authentication/templates/authentication/_msg_oauth_bind.html:6 msgid "Your account has just been bound to" msgstr "Sua conta acaba de ser conectada a" @@ -4543,10 +4553,6 @@ msgstr "" "Copie e cole o código de verificação na página de redefinição de senha para " "redefinir sua senha." -#: authentication/templates/authentication/_msg_reset_password_code.html:18 -msgid "The validity period of the verification code is one minute" -msgstr "O código de verificação é válido por 1 minuto" - #: authentication/templates/authentication/_msg_rest_password_success.html:5 msgid "Your password has just been successfully updated" msgstr "Sua senha foi atualizada com sucesso." @@ -4561,8 +4567,8 @@ msgid "" "If the password update was not initiated by you, your account may have " "security issues" msgstr "" -"Se essa atualização de senha não foi iniciada por você, sua conta pode estar " -"com problemas de segurança" +"Se essa atualização de senha não foi iniciada por você, sua conta pode estar" +" com problemas de segurança" #: authentication/templates/authentication/_msg_rest_password_success.html:13 #: authentication/templates/authentication/_msg_rest_public_key_success.html:13 @@ -4625,8 +4631,8 @@ msgstr "Próximo passo" #: authentication/templates/authentication/login_mfa.html:22 msgid "Can't provide security? Please contact the administrator!" msgstr "" -"Se você não puder fornecer o código de verificação MFA, entre em contato com " -"o administrador!" +"Se você não puder fornecer o código de verificação MFA, entre em contato com" +" o administrador!" #: authentication/templates/authentication/login_wait_confirm.html:45 msgid "Refresh" @@ -4649,8 +4655,8 @@ msgid "" "This page is not served over HTTPS. Please use HTTPS to ensure security of " "your credentials." msgstr "" -"Esta página não usa o protocolo HTTPS, por favor, use o protocolo HTTPS para " -"garantir a segurança de suas credenciais." +"Esta página não usa o protocolo HTTPS, por favor, use o protocolo HTTPS para" +" garantir a segurança de suas credenciais." #: authentication/templates/authentication/passkey.html:173 msgid "Do you want to retry ?" @@ -4765,8 +4771,7 @@ msgid "" "Wait for {} confirm, You also can copy link to her/him
\n" " Don't close this page" msgstr "" -"Esperando pela confirmação de {}, você também pode copiar e enviar o " -"link para ele/ela
\n" +"Esperando pela confirmação de {}, você também pode copiar e enviar o link para ele/ela
\n" "Não feche esta página" #: authentication/views/login.py:375 @@ -4783,8 +4788,8 @@ msgstr "Logout bem-sucedido, voltar para a página de login" #: authentication/views/mixins.py:39 msgid "" -"For your safety, automatic redirection login is not supported on the client. " -"If you need to open it in the client, please log in again" +"For your safety, automatic redirection login is not supported on the client." +" If you need to open it in the client, please log in again" msgstr "" "Para sua segurança, o cliente não suporta login automático. Se precisar " "abrir no cliente, faça login novamente" @@ -4918,8 +4923,8 @@ msgstr "Campos criptografados" #: common/db/fields.py:578 msgid "" -"Invalid JSON data for JSONManyToManyField, should be like {'type': 'all'} or " -"{'type': 'ids', 'ids': []} or {'type': 'attrs', 'attrs': [{'name': 'ip', " +"Invalid JSON data for JSONManyToManyField, should be like {'type': 'all'} or" +" {'type': 'ids', 'ids': []} or {'type': 'attrs', 'attrs': [{'name': 'ip', " "'match': 'exact', 'value': '1.1.1.1'}}" msgstr "" "JSON campos muitos para muitos inválidos, deve ser {'type': 'all'} ou " @@ -4987,77 +4992,76 @@ msgstr "Erro ao analisar o arquivo: {}" msgid "Invalid excel file" msgstr "Arquivo Excel inválido" -#: common/drf/renders/base.py:138 +#: common/drf/renders/base.py:140 msgid "Yes/No" msgstr "Sim/Não" -#: common/drf/renders/base.py:141 +#: common/drf/renders/base.py:143 msgid "Text, max length {}" msgstr "Texto, comprimento máximo {}" -#: common/drf/renders/base.py:143 +#: common/drf/renders/base.py:145 msgid "Long text, no length limit" msgstr "Texto longo, sem limite de comprimento" -#: common/drf/renders/base.py:145 +#: common/drf/renders/base.py:147 msgid "Number, min {} max {}" msgstr "Número, mínimo {} máximo {}" -#: common/drf/renders/base.py:148 +#: common/drf/renders/base.py:150 msgid "Datetime format {}" msgstr "Formato de data e hora {}" -#: common/drf/renders/base.py:154 +#: common/drf/renders/base.py:156 msgid "" "Choices, format name(value), name is optional for human read, value is " "requisite, options {}" msgstr "" -"Opções, formato: nome(valor), o nome é opcional, para facilidade de leitura, " -"o valor é obrigatório, as opções disponíveis são {}" +"Opções, formato: nome(valor), o nome é opcional, para facilidade de leitura," +" o valor é obrigatório, as opções disponíveis são {}" -#: common/drf/renders/base.py:157 +#: common/drf/renders/base.py:159 msgid "Choices, options {}" msgstr "Opções, as opções disponíveis são {}" -#: common/drf/renders/base.py:159 +#: common/drf/renders/base.py:161 msgid "Phone number, format +8612345678901" msgstr "Número de celular, formato +8612345678901" -#: common/drf/renders/base.py:161 +#: common/drf/renders/base.py:163 msgid "Label, format [\"key:value\"]" msgstr "Tags, formato: [\"chave:valor\"]" -#: common/drf/renders/base.py:163 +#: common/drf/renders/base.py:165 msgid "" "Object, format name(id), name is optional for human read, id is requisite" msgstr "" "Item associado, formato: nome(id), o nome é opcional, para facilidade de " "leitura, o id é obrigatório" -#: common/drf/renders/base.py:165 +#: common/drf/renders/base.py:167 msgid "Object, format id" msgstr "Item associado, o formato é id" -#: common/drf/renders/base.py:169 +#: common/drf/renders/base.py:171 msgid "" "Objects, format [\"name(id)\", ...], name is optional for human read, id is " "requisite" msgstr "" -"Múltiplos itens associados, formato: [\"nome(id)\", ...], o nome é opcional, " -"para facilidade de leitura, o id é obrigatório" +"Múltiplos itens associados, formato: [\"nome(id)\", ...], o nome é opcional," +" para facilidade de leitura, o id é obrigatório" -#: common/drf/renders/base.py:171 -msgid "" -"Labels, format [\"key:value\", ...], if label not exists, will create it" +#: common/drf/renders/base.py:173 +msgid "Labels, format [\"key:value\", ...], if label not exists, will create it" msgstr "" "Etiquetas, formato: [\"chave: valor\", ...], se a etiqueta não existir, ela " "será criada" -#: common/drf/renders/base.py:173 +#: common/drf/renders/base.py:175 msgid "Objects, format [\"id\", ...]" msgstr "Itens associados múltiplos, o formato é [\"id\", ...]" -#: common/drf/renders/base.py:271 +#: common/drf/renders/base.py:275 msgid "" "{} - The encryption password has not been set - please go to personal " "information -> file encryption password to set the encryption password" @@ -5065,6 +5069,22 @@ msgstr "" "{} - Senha de criptografia não definida - vá para Informações pessoais -> " "Senha de criptografia de arquivo para definir a senha de criptografia" +#: common/drf/renders/mixins.py:37 labels/serializers.py:22 +msgid "Resource count" +msgstr "Quantidade de recursos" + +#: common/drf/renders/mixins.py:46 +msgid "Export all" +msgstr "Exportar Tudo" + +#: common/drf/renders/mixins.py:48 +msgid "Export only selected items" +msgstr "Exportar apenas itens selecionados" + +#: common/drf/renders/mixins.py:50 +msgid "Export filtered" +msgstr "Exportar pesquisa" + #: common/exceptions.py:15 xpack/plugins/cloud/ws.py:37 #, python-format msgid "%s object does not exist." @@ -5094,15 +5114,15 @@ msgstr "Esta operação requer a confirmação do usuário atual" msgid "Unexpect error occur" msgstr "Ocorreu um erro inesperado" -#: common/plugins/es.py:35 +#: common/plugins/es.py:36 msgid "Invalid elasticsearch config" msgstr "Configuração inválida do Elasticsearch" -#: common/plugins/es.py:40 +#: common/plugins/es.py:41 msgid "Not Support Elasticsearch8" msgstr "Elasticsearch8 não é suportado" -#: common/plugins/es.py:46 +#: common/plugins/es.py:47 msgid "" "Connection failed: Self-signed certificate used. Please check server " "certificate configuration" @@ -5233,13 +5253,11 @@ msgstr "Anexo do email" #: common/tasks.py:68 msgid "" -"When an account password is changed or an account backup generates " -"attachments, \n" -" this task needs to be executed for sending emails and handling " -"attachments" +"When an account password is changed or an account backup generates attachments, \n" +" this task needs to be executed for sending emails and handling attachments" msgstr "" -"Ação a ser realizada ao enviar email e anexos, quando a senha é alterada e o " -"backup de conta gera anexos" +"Ação a ser realizada ao enviar email e anexos, quando a senha é alterada e o" +" backup de conta gera anexos" #: common/tasks.py:94 msgid "Upload account backup to external storage" @@ -5272,8 +5290,7 @@ msgstr "Enviar código de verificação por SMS" #: common/utils/verify_code.py:19 msgid "" -"When resetting a password, forgetting a password, or verifying MFA, this " -"task needs to \n" +"When resetting a password, forgetting a password, or verifying MFA, this task needs to \n" " be executed to send SMS messages" msgstr "" "Execute esta tarefa quando precisar enviar um SMS para redefinir a senha, " @@ -5299,16 +5316,16 @@ msgstr "Código não encontrado" msgid "The message code provided is invalid or has expired" msgstr "O código da mensagem fornecido é inválido ou expirou" -#: jumpserver/conf.py:533 +#: jumpserver/conf.py:534 #, python-brace-format msgid "The verification code is: {code}" msgstr "O código de verificação é: {code}" -#: jumpserver/conf.py:538 +#: jumpserver/conf.py:539 msgid "Create account successfully" msgstr "Criação de conta bem sucedida" -#: jumpserver/conf.py:540 +#: jumpserver/conf.py:541 msgid "Your account has been created successfully" msgstr "Sua conta foi criada com sucesso" @@ -5368,10 +5385,6 @@ msgstr "ID do recurso" msgid "Tagged resource" msgstr "Recurso associado" -#: labels/serializers.py:22 -msgid "Resource count" -msgstr "Quantidade de recursos" - #: labels/serializers.py:28 msgid "Cannot contain \":,\"" msgstr "Não pode conter \":,\"" @@ -5410,29 +5423,25 @@ msgstr "Publicar mensagem interna" #: notifications/notifications.py:48 msgid "" -"This task needs to be executed for sending internal messages for system " -"alerts, \n" +"This task needs to be executed for sending internal messages for system alerts, \n" " work orders, and other notifications" msgstr "" "Algumas alertas do sistema, ordens de serviço e outras necessidades são " "atendidas por esta tarefa" -#: ops/ansible/inventory.py:117 ops/models/job.py:68 +#: ops/ansible/inventory.py:126 ops/ansible/inventory.py:196 +#: ops/models/job.py:69 msgid "No account available" msgstr "Sem contas disponíveis" -#: ops/ansible/inventory.py:298 +#: ops/ansible/inventory.py:318 ops/ansible/inventory.py:360 msgid "Ansible disabled" msgstr "Ansible desativado" -#: ops/ansible/inventory.py:314 +#: ops/ansible/inventory.py:376 msgid "Skip hosts below:" msgstr "Pulando os seguintes hosts:" -#: ops/api/adhoc.py:32 -msgid "Deleting other people's script is not allowed" -msgstr "Não é permitido excluir scripts de outros" - #: ops/api/celery.py:66 ops/api/celery.py:81 msgid "Waiting task start" msgstr "Aguardando o início da tarefa" @@ -5445,7 +5454,7 @@ msgstr "A tarefa {} não existe" msgid "Task {} args or kwargs error" msgstr "Erro nos parâmetros da tarefa {}" -#: ops/api/job.py:68 +#: ops/api/job.py:70 #, python-brace-format msgid "" "Asset ({asset}) must have at least one of the following protocols added: " @@ -5454,21 +5463,21 @@ msgstr "" "O ativo ({asset}) deve adicionar pelo menos um dos seguintes protocolos: " "ssh, sftp, winrm" -#: ops/api/job.py:69 +#: ops/api/job.py:71 #, python-brace-format msgid "Asset ({asset}) authorization is missing SSH, SFTP, or WinRM protocol" msgstr "Falta autorização de protocolo ssh, sftp ou winrm no ativo ({asset})" -#: ops/api/job.py:70 +#: ops/api/job.py:72 #, python-brace-format msgid "Asset ({asset}) authorization lacks upload permissions" msgstr "Falta permissão de upload no ativo ({asset})" -#: ops/api/job.py:158 +#: ops/api/job.py:160 msgid "Duplicate file exists" msgstr "Existe um arquivo com o mesmo nome" -#: ops/api/job.py:163 +#: ops/api/job.py:165 #, python-brace-format msgid "" "File size exceeds maximum limit. Please select a file smaller than {limit}MB" @@ -5476,7 +5485,7 @@ msgstr "" "O tamanho do arquivo excede o limite máximo. Selecione um arquivo menor que " "{limit}MB." -#: ops/api/job.py:236 +#: ops/api/job.py:238 msgid "" "The task is being created and cannot be interrupted. Please try again later." msgstr "" @@ -5484,34 +5493,30 @@ msgstr "" "novamente mais tarde." #: ops/api/playbook.py:49 -msgid "Deleting other people's playbook is not allowed" -msgstr "Não é permitido excluir o playbook de outra pessoa" - -#: ops/api/playbook.py:55 msgid "Currently playbook is being used in a job" msgstr "O playbook atual está sendo usado no trabalho" -#: ops/api/playbook.py:128 +#: ops/api/playbook.py:122 msgid "Unsupported file content" msgstr "Conteúdo de arquivo não suportado" -#: ops/api/playbook.py:130 ops/api/playbook.py:176 ops/api/playbook.py:224 +#: ops/api/playbook.py:124 ops/api/playbook.py:170 ops/api/playbook.py:218 msgid "Invalid file path" msgstr "Caminho de arquivo inválido" -#: ops/api/playbook.py:202 +#: ops/api/playbook.py:196 msgid "This file can not be rename" msgstr "Este arquivo não pode ser renomeado" -#: ops/api/playbook.py:221 +#: ops/api/playbook.py:215 msgid "File already exists" msgstr "O arquivo já existe" -#: ops/api/playbook.py:239 +#: ops/api/playbook.py:233 msgid "File key is required" msgstr "Chave do arquivo - este campo é obrigatório." -#: ops/api/playbook.py:242 +#: ops/api/playbook.py:236 msgid "This file can not be delete" msgstr "Não é possível excluir este arquivo" @@ -5560,7 +5565,7 @@ msgstr "VCS" msgid "Adhoc" msgstr "Comando" -#: ops/const.py:39 ops/models/job.py:152 ops/models/playbook.py:89 +#: ops/const.py:39 ops/models/job.py:154 ops/models/playbook.py:89 #: ops/models/variable.py:23 msgid "Playbook" msgstr "Playbook" @@ -5647,17 +5652,19 @@ msgid "no valid program entry found." msgstr "Sem entrada de programa disponível" #: ops/mixin.py:34 ops/mixin.py:166 settings/serializers/auth/ldap.py:74 -#: settings/serializers/auth/ldap_ha.py:57 +#: settings/serializers/auth/ldap_ha.py:56 msgid "Periodic run" msgstr "Execução periódica" #: ops/mixin.py:36 ops/mixin.py:113 ops/mixin.py:172 -#: settings/serializers/auth/ldap.py:81 settings/serializers/auth/ldap_ha.py:64 +#: settings/serializers/auth/ldap.py:81 +#: settings/serializers/auth/ldap_ha.py:63 msgid "Interval" msgstr "Intervalo" #: ops/mixin.py:39 ops/mixin.py:111 ops/mixin.py:169 -#: settings/serializers/auth/ldap.py:78 settings/serializers/auth/ldap_ha.py:61 +#: settings/serializers/auth/ldap.py:78 +#: settings/serializers/auth/ldap_ha.py:60 msgid "Crontab" msgstr "Crontab" @@ -5682,7 +5689,11 @@ msgstr "Período de execução" msgid "* Please enter a valid crontab expression" msgstr "* Por favor, insira uma expressão crontab válida" -#: ops/mixin.py:204 settings/serializers/auth/mixin.py:12 +#: ops/mixin.py:194 +msgid "Crontab minute must not contain '*'" +msgstr "" + +#: ops/mixin.py:208 settings/serializers/auth/mixin.py:12 msgid "Require interval or crontab setting" msgstr "É necessário agendamento periódico ou regular" @@ -5690,18 +5701,19 @@ msgstr "É necessário agendamento periódico ou regular" msgid "Pattern" msgstr "Modo" -#: ops/models/adhoc.py:22 ops/models/job.py:149 +#: ops/models/adhoc.py:22 ops/models/job.py:151 msgid "Module" msgstr "Módulo" -#: ops/models/adhoc.py:23 ops/models/celery.py:82 ops/models/job.py:147 +#: ops/models/adhoc.py:23 ops/models/celery.py:82 ops/models/job.py:149 #: terminal/models/component/task.py:14 msgid "Args" msgstr "Conteúdo" -#: ops/models/adhoc.py:26 ops/models/playbook.py:34 ops/serializers/mixin.py:10 -#: rbac/models/role.py:31 rbac/models/rolebinding.py:46 -#: rbac/serializers/role.py:12 settings/serializers/auth/oauth2.py:37 +#: ops/models/adhoc.py:26 ops/models/playbook.py:34 +#: ops/serializers/mixin.py:10 rbac/models/role.py:31 +#: rbac/models/rolebinding.py:46 rbac/serializers/role.py:12 +#: settings/serializers/auth/oauth2.py:37 msgid "Scope" msgstr "Alcance" @@ -5737,48 +5749,52 @@ msgstr "Data de Publicação" msgid "Celery Task Execution" msgstr "Execução de Tarefa Celery" -#: ops/models/job.py:150 +#: ops/models/job.py:82 +msgid "Module {} is not suitable for this asset" +msgstr "O módulo {} não se aplica a este ativo." + +#: ops/models/job.py:152 msgid "Run dir" msgstr "Diretório de Execução" -#: ops/models/job.py:151 +#: ops/models/job.py:153 msgid "Timeout (Seconds)" msgstr "Tempo limite (segundos)" -#: ops/models/job.py:157 +#: ops/models/job.py:159 msgid "Use Parameter Define" msgstr "Definição de parâmetros" -#: ops/models/job.py:158 +#: ops/models/job.py:160 msgid "Parameters define" msgstr "Definição de parâmetros" -#: ops/models/job.py:159 +#: ops/models/job.py:161 msgid "Periodic variable" msgstr "Execução periódica de variáveis" -#: ops/models/job.py:160 +#: ops/models/job.py:162 msgid "Run as" msgstr "Usuário em execução" -#: ops/models/job.py:162 +#: ops/models/job.py:164 msgid "Run as policy" msgstr "Política de usuário" -#: ops/models/job.py:219 ops/models/variable.py:28 ops/serializers/job.py:111 +#: ops/models/job.py:221 ops/models/variable.py:28 ops/serializers/job.py:111 #: terminal/notifications.py:182 msgid "Job" msgstr "Trabalhos" -#: ops/models/job.py:242 +#: ops/models/job.py:244 msgid "Material" msgstr "Material" -#: ops/models/job.py:244 +#: ops/models/job.py:246 msgid "Material Type" msgstr "Tipo de Material" -#: ops/models/job.py:556 +#: ops/models/job.py:558 msgid "Job Execution" msgstr "Execução de trabalhos" @@ -5802,9 +5818,9 @@ msgid "" "referenced in the script using {{ jms_name }}" msgstr "" "No nome das variáveis usadas no script, fixe o prefixo jms_ + o nome da " -"variável de entrada. Por exemplo, se o nome da variável for name, a variável " -"de ambiente gerada será jms_name. Ao referenciar no script, utilize " -"{{ jms_name }}." +"variável de entrada. Por exemplo, se o nome da variável for name, a variável" +" de ambiente gerada será jms_name. Ao referenciar no script, utilize {{ " +"jms_name }}." #: ops/models/variable.py:16 ops/serializers/variable.py:32 msgid "Default Value" @@ -5925,14 +5941,12 @@ msgstr "Criar ou Atualizar Tarefas Periódicas" #: ops/tasks.py:134 msgid "" -"With version iterations, new tasks may be added, or task names and execution " -"times may \n" -" be modified. Therefore, upon system startup, tasks will be " -"registered or the parameters \n" +"With version iterations, new tasks may be added, or task names and execution times may \n" +" be modified. Therefore, upon system startup, tasks will be registered or the parameters \n" " of scheduled tasks will be updated" msgstr "" -"Com a progressão da versão, novas tarefas podem ser adicionadas ou o nome da " -"tarefa, o tempo de execução podem ser alterados, então quando o sistema é " +"Com a progressão da versão, novas tarefas podem ser adicionadas ou o nome da" +" tarefa, o tempo de execução podem ser alterados, então quando o sistema é " "iniciado, ele registra ou atualiza os parâmetros da tarefa cron" #: ops/tasks.py:147 @@ -5941,14 +5955,12 @@ msgstr "Verificação Periódica do Desempenho do Serviço" #: ops/tasks.py:149 msgid "" -"Check every hour whether each component is offline and whether the CPU, " -"memory, \n" -" and disk usage exceed the thresholds, and send an alert message to " -"the administrator" +"Check every hour whether each component is offline and whether the CPU, memory, \n" +" and disk usage exceed the thresholds, and send an alert message to the administrator" msgstr "" "Verifique se cada componente está offline a cada hora, cpu, memória, se a " -"taxa de uso do disco rígido ultrapassa o limite, e envie mensagens de alerta " -"para o administrador" +"taxa de uso do disco rígido ultrapassa o limite, e envie mensagens de alerta" +" para o administrador" #: ops/tasks.py:159 msgid "Clean up unexpected jobs" @@ -5956,18 +5968,15 @@ msgstr "Limpar Atividades Anômalas" #: ops/tasks.py:161 msgid "" -"Due to exceptions caused by executing adhoc and playbooks in the Job " -"Center, \n" -" which result in the task status not being updated, the system will " -"clean up abnormal jobs \n" -" that have not been completed for more than 3 hours every hour and " -"mark these tasks as \n" +"Due to exceptions caused by executing adhoc and playbooks in the Job Center, \n" +" which result in the task status not being updated, the system will clean up abnormal jobs \n" +" that have not been completed for more than 3 hours every hour and mark these tasks as \n" " failed" msgstr "" "Devido ao centro de Atividade executando comandos rápidos, a execução do " "playbook pode causar anomalias, o status da tarefa não foi atualizado, o " -"sistema limpa a cada hora as Atividades anômalas que não foram concluídas em " -"mais de 3 horas e marca a tarefa como falha." +"sistema limpa a cada hora as Atividades anômalas que não foram concluídas em" +" mais de 3 horas e marca a tarefa como falha." #: ops/tasks.py:174 msgid "Clean job_execution db record" @@ -5975,18 +5984,15 @@ msgstr "Limpeza do histórico de execução do Centro de Ação " #: ops/tasks.py:176 msgid "" -"Due to the execution of adhoc and playbooks in the Job Center, execution " -"records will \n" -" be generated. The system will clean up records that exceed the " -"retention period every day \n" -" at 2 a.m., based on the configuration of 'System Settings - Tasks - " -"Regular clean-up - \n" +"Due to the execution of adhoc and playbooks in the Job Center, execution records will \n" +" be generated. The system will clean up records that exceed the retention period every day \n" +" at 2 a.m., based on the configuration of 'System Settings - Tasks - Regular clean-up - \n" " Job execution retention days'" msgstr "" " Devido ao Centro de Ação executar comandos rápidos, playbook, registros de " "execução serão gerados, o sistema realizará a limpeza dos registros que " -"excedem o tempo de armazenamento todos os dias às 2h da manhã, de acordo com " -"a configuração do sistema - Lista de tarefas - Limpeza regular - " +"excedem o tempo de armazenamento todos os dias às 2h da manhã, de acordo com" +" a configuração do sistema - Lista de tarefas - Limpeza regular - " "Configuração do histórico de execução do Centro de Ação " #: ops/templates/ops/celery_task_log.html:4 @@ -6058,7 +6064,8 @@ msgstr "Por favor, selecione uma organização antes de salvar" #: rbac/serializers/rolebinding.py:44 settings/serializers/auth/base.py:53 #: terminal/templates/terminal/_msg_command_warning.html:21 #: terminal/templates/terminal/_msg_session_sharing.html:14 -#: tickets/models/ticket/general.py:303 tickets/serializers/ticket/ticket.py:61 +#: tickets/models/ticket/general.py:303 +#: tickets/serializers/ticket/ticket.py:61 msgid "Organization" msgstr "Organização" @@ -6092,7 +6099,7 @@ msgid "Can not delete virtual org" msgstr "Não é possível excluir organização virtual" #: orgs/serializers.py:10 perms/serializers/permission.py:59 -#: rbac/serializers/role.py:27 users/serializers/group.py:54 +#: rbac/serializers/role.py:27 users/serializers/group.py:53 msgid "Users amount" msgstr "Número de usuários" @@ -6239,19 +6246,15 @@ msgstr "A verificação da regra de autorização de ativos expirou" #: perms/tasks.py:30 msgid "" -"The cache of organizational collections, which have completed user " -"authorization tree \n" -" construction, will expire. Therefore, expired collections need to be " -"cleared from the \n" -" cache, and this task will be executed periodically based on the time " -"interval specified \n" -" by PERM_EXPIRED_CHECK_PERIODIC in the system configuration file " -"config.txt" +"The cache of organizational collections, which have completed user authorization tree \n" +" construction, will expire. Therefore, expired collections need to be cleared from the \n" +" cache, and this task will be executed periodically based on the time interval specified \n" +" by PERM_EXPIRED_CHECK_PERIODIC in the system configuration file config.txt" msgstr "" "O cache do conjunto de organizações já construído na árvore de autorização " -"do usuário expirará, então é necessário limpar o conjunto expirado do cache, " -"de acordo com o intervalo de tempo PERM_EXPIRED_CHECK_PERIODIC no arquivo de " -"configuração do sistema config.txt, execute esta tarefa regularmente" +"do usuário expirará, então é necessário limpar o conjunto expirado do cache," +" de acordo com o intervalo de tempo PERM_EXPIRED_CHECK_PERIODIC no arquivo " +"de configuração do sistema config.txt, execute esta tarefa regularmente" #: perms/tasks.py:49 msgid "Send asset permission expired notification" @@ -6259,17 +6262,14 @@ msgstr "Enviar notificações de expiração de permissões de ativos" #: perms/tasks.py:51 msgid "" -"Check every day at 10 a.m. and send a notification message to users " -"associated with \n" -" assets whose authorization is about to expire, as well as to the " -"organization's \n" -" administrators, 3 days in advance, to remind them that the asset " -"authorization will \n" +"Check every day at 10 a.m. and send a notification message to users associated with \n" +" assets whose authorization is about to expire, as well as to the organization's \n" +" administrators, 3 days in advance, to remind them that the asset authorization will \n" " expire in a few days" msgstr "" "Verifique às 10 horas da manhã todos os dias, envie uma mensagem para os " -"usuários e o administrador da organização associados à autorização de ativos " -"que está para expirar em três dias, informando quantos dias o ativo irá " +"usuários e o administrador da organização associados à autorização de ativos" +" que está para expirar em três dias, informando quantos dias o ativo irá " "expirar" #: perms/templates/perms/_msg_item_permissions_expire.html:7 @@ -6379,8 +6379,8 @@ msgid "" "User last role in org, can not be delete, you can remove user from org " "instead" msgstr "" -"O último papel do usuário não pode ser excluído, você pode remover o usuário " -"da organização" +"O último papel do usuário não pode ser excluído, você pode remover o usuário" +" da organização" #: rbac/models/rolebinding.py:200 msgid "Organization role binding" @@ -6451,7 +6451,7 @@ msgid "Storage" msgstr "Armazenamento" #: rbac/tree.py:61 terminal/models/applet/applet.py:53 -#: terminal/models/applet/applet.py:328 terminal/models/applet/host.py:30 +#: terminal/models/applet/applet.py:369 terminal/models/applet/host.py:30 #: terminal/serializers/applet.py:15 msgid "Applet" msgstr "Aplicativo Remoto" @@ -6669,9 +6669,9 @@ msgid "" "suffix" msgstr "" "Após a autenticação bem-sucedida do usuário por terceiros, se a plataforma " -"de serviço de autenticação de terceiros não retornar as informações de e-" -"mail do usuário, o sistema criará automaticamente o usuário com este sufixo " -"de e-mail" +"de serviço de autenticação de terceiros não retornar as informações de " +"e-mail do usuário, o sistema criará automaticamente o usuário com este " +"sufixo de e-mail" #: settings/serializers/auth/base.py:37 msgid "Forgot Password URL" @@ -6708,7 +6708,8 @@ msgid "CAS" msgstr "CAS" #: settings/serializers/auth/cas.py:15 settings/serializers/auth/ldap.py:45 -#: settings/serializers/auth/ldap_ha.py:28 settings/serializers/auth/oidc.py:61 +#: settings/serializers/auth/ldap_ha.py:27 +#: settings/serializers/auth/oidc.py:61 msgid "Server" msgstr "Endereço do servidor" @@ -6723,7 +6724,8 @@ msgstr "Sincronizar logout" #: settings/serializers/auth/cas.py:22 msgid "When the user signs out, they also be logged out from the CAS server" -msgstr "Quando o usuário se desconecta, eles são desconectados do servidor CAS" +msgstr "" +"Quando o usuário se desconecta, eles são desconectados do servidor CAS" #: settings/serializers/auth/cas.py:28 msgid "Username attr" @@ -6733,9 +6735,11 @@ msgstr "Atributo de nome de usuário" msgid "Enable attributes map" msgstr "Ativar mapeamento de atributos" -#: settings/serializers/auth/cas.py:34 settings/serializers/auth/dingtalk.py:18 +#: settings/serializers/auth/cas.py:34 +#: settings/serializers/auth/dingtalk.py:18 #: settings/serializers/auth/feishu.py:18 settings/serializers/auth/lark.py:17 -#: settings/serializers/auth/ldap.py:67 settings/serializers/auth/ldap_ha.py:50 +#: settings/serializers/auth/ldap.py:67 +#: settings/serializers/auth/ldap_ha.py:49 #: settings/serializers/auth/oauth2.py:60 settings/serializers/auth/oidc.py:39 #: settings/serializers/auth/saml2.py:35 settings/serializers/auth/slack.py:18 #: settings/serializers/auth/wecom.py:18 @@ -6796,7 +6800,7 @@ msgstr "" "Mapeamento de atributos do usuário, onde `key` é o nome do atributo do " "usuário JumpServer e `value` é o nome do atributo do usuário do serviço Lark" -#: settings/serializers/auth/ldap.py:42 settings/serializers/auth/ldap.py:104 +#: settings/serializers/auth/ldap.py:42 settings/serializers/auth/ldap.py:108 msgid "LDAP" msgstr "LDAP" @@ -6804,23 +6808,28 @@ msgstr "LDAP" msgid "LDAP server URI" msgstr "Domínio do serviço LDAP" -#: settings/serializers/auth/ldap.py:49 settings/serializers/auth/ldap_ha.py:32 +#: settings/serializers/auth/ldap.py:49 +#: settings/serializers/auth/ldap_ha.py:31 msgid "Bind DN" msgstr "DN vinculado" -#: settings/serializers/auth/ldap.py:50 settings/serializers/auth/ldap_ha.py:33 +#: settings/serializers/auth/ldap.py:50 +#: settings/serializers/auth/ldap_ha.py:32 msgid "Binding Distinguished Name" msgstr "Administrador de diretório vinculado" -#: settings/serializers/auth/ldap.py:54 settings/serializers/auth/ldap_ha.py:37 +#: settings/serializers/auth/ldap.py:54 +#: settings/serializers/auth/ldap_ha.py:36 msgid "Binding password" msgstr "Senha vinculada" -#: settings/serializers/auth/ldap.py:57 settings/serializers/auth/ldap_ha.py:40 +#: settings/serializers/auth/ldap.py:57 +#: settings/serializers/auth/ldap_ha.py:39 msgid "Search OU" msgstr "OU do usuário" -#: settings/serializers/auth/ldap.py:59 settings/serializers/auth/ldap_ha.py:42 +#: settings/serializers/auth/ldap.py:59 +#: settings/serializers/auth/ldap_ha.py:41 msgid "" "User Search Base, if there are multiple OUs, you can separate them with the " "`|` symbol" @@ -6828,16 +6837,19 @@ msgstr "" "Biblioteca de pesquisa do usuário, se houver várias OUs, você pode usar o " "símbolo `|` para separar" -#: settings/serializers/auth/ldap.py:63 settings/serializers/auth/ldap_ha.py:46 +#: settings/serializers/auth/ldap.py:63 +#: settings/serializers/auth/ldap_ha.py:45 msgid "Search filter" msgstr "Filtro de usuário" -#: settings/serializers/auth/ldap.py:64 settings/serializers/auth/ldap_ha.py:47 +#: settings/serializers/auth/ldap.py:64 +#: settings/serializers/auth/ldap_ha.py:46 #, python-format msgid "Selection could include (cn|uid|sAMAccountName=%(user)s)" msgstr "As opções possíveis são (cn ou uid ou sAMAccountName=%(user)s)" -#: settings/serializers/auth/ldap.py:69 settings/serializers/auth/ldap_ha.py:52 +#: settings/serializers/auth/ldap.py:69 +#: settings/serializers/auth/ldap_ha.py:51 msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the LDAP service user attribute name" @@ -6845,15 +6857,31 @@ msgstr "" "Mapeamento de atributos do usuário, onde `key` é o nome do atributo do " "usuário JumpServer e `value` é o nome do atributo do usuário do serviço LDAP" -#: settings/serializers/auth/ldap.py:85 settings/serializers/auth/ldap_ha.py:68 +#: settings/serializers/auth/ldap.py:85 +#: settings/serializers/auth/ldap_ha.py:67 msgid "Connect timeout (s)" msgstr "Tempo de conexão (segundos)" -#: settings/serializers/auth/ldap.py:90 settings/serializers/auth/ldap_ha.py:73 +#: settings/serializers/auth/ldap.py:88 +#: settings/serializers/auth/ldap_ha.py:70 +msgid "Strict sync" +msgstr "Modo rigoroso" + +#: settings/serializers/auth/ldap.py:89 +#: settings/serializers/auth/ldap_ha.py:71 +msgid "" +"In strict mode, users not found in LDAP will be disabled during full or " +"automatic sync" +msgstr "" +"Após ativar o modo rigoroso, a sincronização total ou automática desativará " +"usuários não encontrados no LDAP no sistema." + +#: settings/serializers/auth/ldap.py:94 +#: settings/serializers/auth/ldap_ha.py:76 msgid "User DN cache timeout (s)" msgstr "Tempo de cache do User DN (segundos)" -#: settings/serializers/auth/ldap.py:92 +#: settings/serializers/auth/ldap.py:96 msgid "" "Caching the User DN obtained during user login authentication can " "effectively improve the speed of user authentication., 0 means no " @@ -6861,28 +6889,29 @@ msgid "" "the user DN cache" msgstr "" "Cache do User DN consultado durante a autenticação de login do usuário, o " -"que pode melhorar efetivamente a velocidade de autenticação do usuário
Se " -"a arquitetura de OU do usuário for ajustada, clique em enviar para limpar o " -"cache do User DN" +"que pode melhorar efetivamente a velocidade de autenticação do usuário
Se" +" a arquitetura de OU do usuário for ajustada, clique em enviar para limpar o" +" cache do User DN" -#: settings/serializers/auth/ldap.py:98 settings/serializers/auth/ldap_ha.py:81 +#: settings/serializers/auth/ldap.py:102 +#: settings/serializers/auth/ldap_ha.py:84 msgid "Search paged size (piece)" msgstr "Número de páginas de pesquisa (linhas)" -#: settings/serializers/auth/ldap_ha.py:25 -#: settings/serializers/auth/ldap_ha.py:87 +#: settings/serializers/auth/ldap_ha.py:24 +#: settings/serializers/auth/ldap_ha.py:90 msgid "LDAP HA" msgstr "Autenticação LDAP" -#: settings/serializers/auth/ldap_ha.py:29 +#: settings/serializers/auth/ldap_ha.py:28 msgid "LDAP HA server URI" msgstr "Domínio do Serviço LDAP HA" -#: settings/serializers/auth/ldap_ha.py:75 +#: settings/serializers/auth/ldap_ha.py:78 msgid "" "Caching the User DN obtained during user login authentication can " -"effectivelyimprove the speed of user authentication., 0 means no cache
If " -"the user OU structure has been adjusted, click Submit to clear the user DN " +"effectivelyimprove the speed of user authentication., 0 means no cache
If" +" the user OU structure has been adjusted, click Submit to clear the user DN " "cache" msgstr "" "Ao fazer cache do User DN consultado durante a autenticação do login do " @@ -6932,7 +6961,8 @@ msgid "End session endpoint" msgstr "Endereço do ponto de encerramento da sessão" #: settings/serializers/auth/oauth2.py:57 -msgid "When the user signs out, they also be logged out from the OAuth2 server" +msgid "" +"When the user signs out, they also be logged out from the OAuth2 server" msgstr "Quando os usuários saem, eles também sairão do servidor OAuth2" #: settings/serializers/auth/oauth2.py:62 @@ -6944,8 +6974,8 @@ msgstr "" "usuário JumpServer, e `value` é o nome do atributo do usuário do serviço " "OAuth2." -#: settings/serializers/auth/oauth2.py:67 settings/serializers/auth/oidc.py:113 -#: settings/serializers/auth/saml2.py:45 +#: settings/serializers/auth/oauth2.py:67 +#: settings/serializers/auth/oidc.py:113 settings/serializers/auth/saml2.py:45 msgid "Always update user" msgstr "Sempre atualizar informações do usuário" @@ -7072,10 +7102,11 @@ msgid "OTP in RADIUS" msgstr "Use o Radius OTP" #: settings/serializers/auth/radius.py:24 -msgid "* Using OTP in RADIUS means users can employ RADIUS as a method for MFA" +msgid "" +"* Using OTP in RADIUS means users can employ RADIUS as a method for MFA" msgstr "" -"* Usar OTP no RADIUS significa que os usuários podem usar RADIUS como método " -"de MFA" +"* Usar OTP no RADIUS significa que os usuários podem usar RADIUS como método" +" de MFA" #: settings/serializers/auth/saml2.py:12 settings/serializers/auth/saml2.py:15 msgid "SAML2" @@ -7187,9 +7218,9 @@ msgstr "Tipo de serviço (Service id)" #: settings/serializers/auth/sms.py:85 #, python-brace-format msgid "" -"Template need contain {code} and Signature + template length does not exceed " -"67 words. For example, your verification code is {code}, which is valid for " -"5 minutes. Please do not disclose it to others." +"Template need contain {code} and Signature + template length does not exceed" +" 67 words. For example, your verification code is {code}, which is valid for" +" 5 minutes. Please do not disclose it to others." msgstr "" "O modelo precisa conter {code}, e a soma do comprimento da assinatura e do " "modelo não pode exceder 67 caracteres. Por exemplo, seu código de " @@ -7216,8 +7247,8 @@ msgstr "Ativar autenticação com token SSO" #: settings/serializers/auth/sso.py:17 msgid "Other service can using SSO token login to JumpServer without password" msgstr "" -"Outros sistemas podem se integrar ao JumpServer usando Token SSO, eliminando " -"o processo de login." +"Outros sistemas podem se integrar ao JumpServer usando Token SSO, eliminando" +" o processo de login." #: settings/serializers/auth/sso.py:20 msgid "SSO auth key TTL" @@ -7243,8 +7274,8 @@ msgstr "URL do site atual" #: settings/serializers/basic.py:13 msgid "" -"Site URL is the externally accessible address of the current product service " -"and is usually used in links in system emails" +"Site URL is the externally accessible address of the current product service" +" and is usually used in links in system emails" msgstr "" "URL do site é o endereço externo acessível do serviço do produto atual, " "geralmente usado em links em emails do sistema" @@ -7339,8 +7370,8 @@ msgid "" "Session, record, command will be delete if more than duration, only in " "database, OSS will not be affected." msgstr "" -"Sessões, gravações e registros de comandos acima desse prazo serão excluídos " -"(afeta o armazenamento do banco de dados, OSS, etc não são afetados)" +"Sessões, gravações e registros de comandos acima desse prazo serão excluídos" +" (afeta o armazenamento do banco de dados, OSS, etc não são afetados)" #: settings/serializers/cleaning.py:53 msgid "Change secret and push record retention days (day)" @@ -7427,7 +7458,8 @@ msgstr "Chave API" #: settings/serializers/feature.py:140 settings/serializers/feature.py:155 msgid "" "The proxy server address of the GPT service. For example: http://ip:port" -msgstr "Endereço do servidor proxy do serviço GPT. Por exemplo: http://ip:port" +msgstr "" +"Endereço do servidor proxy do serviço GPT. Por exemplo: http://ip:port" #: settings/serializers/feature.py:144 msgid "GPT Model" @@ -7565,8 +7597,8 @@ msgstr "Prefixo do assunto" #: settings/serializers/msg.py:69 msgid "" -"Tips: When creating a user, send the subject of the email (eg:Create account " -"successfully)" +"Tips: When creating a user, send the subject of the email (eg:Create account" +" successfully)" msgstr "" "Dica: ao criar um usuário, envie um e-mail de configuração da senha com o " "assunto (por exemplo: criação de usuário bem-sucedida)" @@ -7657,8 +7689,8 @@ msgid "" "If the user has failed to log in for a limited number of times, no login is " "allowed during this time interval." msgstr "" -"Quando o número de falhas de login do usuário atingir o limite, o login será " -"proibido durante esse intervalo" +"Quando o número de falhas de login do usuário atingir o limite, o login será" +" proibido durante esse intervalo" #: settings/serializers/security.py:63 settings/serializers/security.py:73 msgid "Login failures count" @@ -7710,13 +7742,13 @@ msgstr "Login apenas a partir de usuários originais" #: settings/serializers/security.py:105 msgid "" -"If it is enabled, the user will only authenticate to the source when logging " -"in; if it is disabled, the user will authenticate all the enabled " +"If it is enabled, the user will only authenticate to the source when logging" +" in; if it is disabled, the user will authenticate all the enabled " "authentication methods in a certain order when logging in, and as long as " "one of the authentication methods is successful, they can log in directly" msgstr "" -"Se ativada, a autenticação do usuário no login será feita apenas no ponto de " -"origem; Se desativada, a autenticação do usuário seguirá uma certa ordem " +"Se ativada, a autenticação do usuário no login será feita apenas no ponto de" +" origem; Se desativada, a autenticação do usuário seguirá uma certa ordem " "entre todos os métodos de autenticação ativados, com sucesso em um deles " "permitindo o login direto" @@ -7745,19 +7777,27 @@ msgstr "Autenticação de terceiros habilita MFA" msgid "The third-party login modes include OIDC, CAS, and SAML2" msgstr "Métodos de login de terceiros incluem: OIDC, CAS, SAML2" -#: settings/serializers/security.py:128 +#: settings/serializers/security.py:129 +msgid "MFA via Email" +msgstr "Validação de e-mail MFA" + +#: settings/serializers/security.py:130 +msgid "Email as a method for multi-factor authentication" +msgstr "Usar e-mail como uma forma de autenticação multifatorial" + +#: settings/serializers/security.py:133 msgid "OTP issuer name" msgstr "Nome após a varredura do OTP" -#: settings/serializers/security.py:132 +#: settings/serializers/security.py:137 msgid "OTP valid window" msgstr "Número de vezes válidas para atraso do OTP" -#: settings/serializers/security.py:136 +#: settings/serializers/security.py:141 msgid "MFA verify TTL" msgstr "Prazo de validade da verificação MFA" -#: settings/serializers/security.py:138 +#: settings/serializers/security.py:143 msgid "" "Unit: second, The verification MFA takes effect only when you view the " "account password" @@ -7765,31 +7805,31 @@ msgstr "" "Unidade: segundos, atualmente efetivo apenas ao verificar a senha de conta " "MFA " -#: settings/serializers/security.py:143 +#: settings/serializers/security.py:148 msgid "MFA in login page" msgstr "Inserir MFA na página de login" -#: settings/serializers/security.py:144 +#: settings/serializers/security.py:149 msgid "Eu security regulations(GDPR) require MFA to be on the login page" msgstr "" -"A regulamentação de segurança de dados da União Europeia (GDPR) exige MFA na " -"página de login para garantir a segurança do login do sistema" +"A regulamentação de segurança de dados da União Europeia (GDPR) exige MFA na" +" página de login para garantir a segurança do login do sistema" -#: settings/serializers/security.py:148 +#: settings/serializers/security.py:153 msgid "Verify code TTL (second)" msgstr "Tempo de validade do código de verificação (minutos)" -#: settings/serializers/security.py:149 +#: settings/serializers/security.py:154 msgid "Reset password and send SMS code expiration time" msgstr "" "Tempo de expiração do código de verificação para redefinição de senha e " "envio de mensagens de texto" -#: settings/serializers/security.py:153 +#: settings/serializers/security.py:158 msgid "Login dynamic code" msgstr "Ativar código adicional de login" -#: settings/serializers/security.py:154 +#: settings/serializers/security.py:159 msgid "" "The password and additional code are sent to a third party authentication " "system for verification" @@ -7798,73 +7838,68 @@ msgstr "" "de terceiros para verificação. Por exemplo, alguns sistemas de autenticação " "de terceiros exigem senha + 6 números para completar a autenticação" -#: settings/serializers/security.py:158 +#: settings/serializers/security.py:163 msgid "Login captcha" msgstr "Habilitar código de verificação de login" -#: settings/serializers/security.py:159 +#: settings/serializers/security.py:164 msgid "Enable captcha to prevent robot authentication" msgstr "Ligar o código de verificação para prevenir o login de robôs" -#: settings/serializers/security.py:162 +#: settings/serializers/security.py:167 msgid "Suspicious Login Verification" msgstr "Notificação de login de local diferente" -#: settings/serializers/security.py:164 +#: settings/serializers/security.py:169 msgid "" -"The system determines whether the login IP address belongs to a common login " -"city. If the account is logged in from a common login city, the system sends " -"a remote login reminder" +"The system determines whether the login IP address belongs to a common login" +" city. If the account is logged in from a common login city, the system " +"sends a remote login reminder" msgstr "" "Com base se o IP de login pertence à cidade de login usual, se a conta for " "acessada de uma cidade não usual, um lembrete de login de local diferente " "será enviado" -#: settings/serializers/security.py:170 +#: settings/serializers/security.py:175 msgid "Auto Disable Threshold (day)" msgstr "Desativação automática de usuários inativos (dias)" -#: settings/serializers/security.py:171 +#: settings/serializers/security.py:176 msgid "" "Detect infrequent users daily and disable them if they exceed the " "predetermined time limit" msgstr "" -"Um cheque é feito todos os dias, os usuários que excedem o tempo predefinido " -"são automaticamente desativados" +"Um cheque é feito todos os dias, os usuários que excedem o tempo predefinido" +" são automaticamente desativados" -#: settings/serializers/security.py:191 +#: settings/serializers/security.py:196 msgid "Watermark" msgstr "Ativar marca d'água" -#: settings/serializers/security.py:192 -msgid "Enabled, the web session and replay contains watermark information" -msgstr "" -"Após a ativação, as sessões Web e as gravações incluirão informações de " -"marca d'água" - -#: settings/serializers/security.py:196 +#: settings/serializers/security.py:200 msgid "Max idle time (minute)" msgstr "Tempo máximo ocioso da conexão (minutos)" -#: settings/serializers/security.py:197 +#: settings/serializers/security.py:201 msgid "If idle time more than it, disconnect connection." msgstr "" -"Observação: se essa configuração for excedida sem qualquer Action, a conexão " -"será desconectada" +"Observação: se essa configuração for excedida sem qualquer Action, a conexão" +" será desconectada" -#: settings/serializers/security.py:200 +#: settings/serializers/security.py:204 msgid "Session expire at browser closed" msgstr "A sessão expira quando o navegador é fechado" -#: settings/serializers/security.py:201 +#: settings/serializers/security.py:205 msgid "Whether to expire the session when the user closes their browser." msgstr "Quer que a sessão expire quando o usuário fecha o navegador?" -#: settings/serializers/security.py:206 +#: settings/serializers/security.py:210 msgid "Allow users to view asset session information" -msgstr "Permitir que os usuários vejam informações da sessão online dos ativos" +msgstr "" +"Permitir que os usuários vejam informações da sessão online dos ativos" -#: settings/serializers/security.py:208 +#: settings/serializers/security.py:212 msgid "" "When a user connects to an asset, the account selection popup displays the " "number of active sessions for the current asset (RDP protocol only)." @@ -7873,40 +7908,40 @@ msgstr "" "ativo atual aparecerá na janela de seleção de contas (apenas para o " "protocolo rdp)" -#: settings/serializers/security.py:214 +#: settings/serializers/security.py:218 msgid "Max online time (hour)" msgstr "Tempo máximo de conexão da sessão (horas)" -#: settings/serializers/security.py:215 +#: settings/serializers/security.py:219 msgid "If session connection time more than it, disconnect connection." msgstr "" "Dica: se a conexão da sessão exceder essa configuração, a conexão será " "desconectada" -#: settings/serializers/security.py:218 +#: settings/serializers/security.py:222 msgid "Remember manual auth" msgstr "Salvar passwords inseridos manualmente" -#: settings/serializers/security.py:221 +#: settings/serializers/security.py:225 #: terminal/templates/terminal/_msg_session_sharing.html:10 msgid "Session share" msgstr "Compartilhamento de sessão" -#: settings/serializers/security.py:222 +#: settings/serializers/security.py:226 msgid "Enabled, Allows user active session to be shared with other users" msgstr "" "Quando ativado, permite que os usuários compartilhem a sessão do ativo " "conectada com outros, para trabalho em colaboração" -#: settings/serializers/security.py:228 +#: settings/serializers/security.py:232 msgid "Insecure command alert" msgstr "Alerta de comando perigoso" -#: settings/serializers/security.py:231 +#: settings/serializers/security.py:235 msgid "Email recipient" msgstr "Destinatário do email" -#: settings/serializers/security.py:232 +#: settings/serializers/security.py:236 msgid "Multiple user using , split" msgstr "Vários usuários, separados por ," @@ -7919,60 +7954,66 @@ msgstr "[%s] %s" msgid "Auto" msgstr "Automático" -#: settings/serializers/terminal.py:22 +#: settings/serializers/terminal.py:23 +msgid "Auto(Enabled for the first 5 minutes after startup, then disabled.)" +msgstr "" +"Automático (habilitado nos primeiros 5 minutos após a inicialização, e então" +" desativado.)" + +#: settings/serializers/terminal.py:26 msgid "Registration" msgstr "Registro do componente" -#: settings/serializers/terminal.py:24 +#: settings/serializers/terminal.py:28 msgid "" -"Allow component register, after all component setup, you should disable this " -"for security" +"Allow component register, after all component setup, you should disable this" +" for security" msgstr "" -"Permitir o registro de componentes? Após todos os terminais serem iniciados, " -"deve-se desactivar por razões de segurança" +"Permitir o registro de componentes? Após todos os terminais serem iniciados," +" deve-se desactivar por razões de segurança" -#: settings/serializers/terminal.py:30 +#: settings/serializers/terminal.py:34 msgid "" "* Allow users to log in to the KoKo component via password authentication" msgstr "" "* Permite aos usuários fazer login no componente KoKo através da " "autenticação por senha" -#: settings/serializers/terminal.py:36 +#: settings/serializers/terminal.py:40 msgid "" "* Allow users to log in to the KoKo component via Public key " "authentication
If third-party authentication services, such as AD/LDAP, " -"are enabled, you should disable this option to prevent users from logging in " -"after being deleted from the AD/LDAP server" +"are enabled, you should disable this option to prevent users from logging in" +" after being deleted from the AD/LDAP server" msgstr "" "* Permite aos usuários fazer login no componente KoKo através da " "autenticação de chave pública
Se o serviço de autenticação de terceiros " "(como AD / LDAP) estiver habilitado, esta opção deve ser desabilitada, para " -"evitar que o usuário faça login novamente após ser excluído do servidor AD / " -"LDAP" +"evitar que o usuário faça login novamente após ser excluído do servidor AD /" +" LDAP" -#: settings/serializers/terminal.py:43 +#: settings/serializers/terminal.py:47 msgid "Asset sorting" msgstr "Classificar lista de ativos" -#: settings/serializers/terminal.py:46 +#: settings/serializers/terminal.py:50 msgid "Asset page size" msgstr "Quantidade por página da lista de ativos" -#: settings/serializers/terminal.py:51 +#: settings/serializers/terminal.py:55 msgid "" -"* You can individually configure the service address and port in the service " -"endpoint
If enabled, the Luna page will display the DB client launch " +"* You can individually configure the service address and port in the service" +" endpoint
If enabled, the Luna page will display the DB client launch " "method when connecting to assets" msgstr "" "* Você pode configurar o endereço e a porta do serviço separadamente nos " "pontos do serviço
Se habilitado, a página Luna mostrará o método de " "inicialização do Cliente DB ao se conectar aos ativos" -#: settings/serializers/terminal.py:59 +#: settings/serializers/terminal.py:63 msgid "" -"* You can individually configure the service address and port in the service " -"endpoint
If enabled, the Luna page will display the download rdp file " +"* You can individually configure the service address and port in the service" +" endpoint
If enabled, the Luna page will display the download rdp file " "button and RDP Client launch method when connecting to assets" msgstr "" "* Você pode configurar o endereço e a porta do serviço separadamente nos " @@ -7980,18 +8021,19 @@ msgstr "" "arquivo rdp e o método de inicialização do Cliente RDP ao se conectar aos " "ativos" -#: settings/serializers/terminal.py:66 +#: settings/serializers/terminal.py:70 msgid "Client connection" msgstr "Conexão do Cliente" -#: settings/serializers/terminal.py:68 +#: settings/serializers/terminal.py:72 msgid "" "* Allow connecting to the KoKo component via SSH client
If enabled, the " -"Luna page will display the SSH client launch method when connecting to assets" +"Luna page will display the SSH client launch method when connecting to " +"assets" msgstr "" -"* Permite ao Cliente SSH conectar-se ao componente KoKo
Se habilitado, a " -"página do Luna mostrará o método de inicialização do Cliente SSH ao conectar-" -"se aos ativos" +"* Permite ao Cliente SSH conectar-se ao componente KoKo
Se habilitado, a" +" página do Luna mostrará o método de inicialização do Cliente SSH ao " +"conectar-se aos ativos" #: settings/serializers/tool.py:10 msgid "Tool" @@ -8003,17 +8045,17 @@ msgstr "Ferramentas na bancada" #: settings/serializers/tool.py:15 msgid "" -"*! If enabled, users with RBAC permissions will be able to utilize all tools " -"in the workbench" +"*! If enabled, users with RBAC permissions will be able to utilize all tools" +" in the workbench" msgstr "" "*! Se habilitado, os usuários com permissões RBAC poderão utilizar todas as " "ferramentas disponíveis na bancada" -#: settings/tasks/ldap.py:73 +#: settings/tasks/ldap.py:67 msgid "Periodic import ldap user" msgstr "Importação periódica de usuários LDAP" -#: settings/tasks/ldap.py:75 settings/tasks/ldap.py:85 +#: settings/tasks/ldap.py:69 settings/tasks/ldap.py:79 msgid "" "When LDAP auto-sync is configured, this task will be invoked to synchronize " "users" @@ -8021,32 +8063,30 @@ msgstr "" "Quando a sincronização automática do LDAP é configurada, esta tarefa é " "chamada para sincronizar os usuários" -#: settings/tasks/ldap.py:83 +#: settings/tasks/ldap.py:77 msgid "Periodic import ldap ha user" msgstr "Importação periódica de usuários LDAP HA" -#: settings/tasks/ldap.py:120 +#: settings/tasks/ldap.py:115 msgid "Registration periodic import ldap user task" msgstr "Registre a tarefa do usuário LDAP de importação periódica" -#: settings/tasks/ldap.py:122 +#: settings/tasks/ldap.py:117 msgid "" -"When LDAP auto-sync parameters change, such as Crontab parameters, the LDAP " -"sync task \n" +"When LDAP auto-sync parameters change, such as Crontab parameters, the LDAP sync task \n" " will be re-registered or updated, and this task will be invoked" msgstr "" "Quando alterações são efetuadas nos parâmetros de sincronização automática " "LDAP, como parâmetros Crontab, essa tarefa será chamada ao re-registrar ou " "atualizar a tarefa de sincronização ldap" -#: settings/tasks/ldap.py:136 +#: settings/tasks/ldap.py:131 msgid "Registration periodic import ldap ha user task" msgstr "Registre a tarefa do usuário LDAP HA de importação periódica" -#: settings/tasks/ldap.py:138 +#: settings/tasks/ldap.py:133 msgid "" -"When LDAP HA auto-sync parameters change, such as Crontab parameters, the " -"LDAP HA sync task \n" +"When LDAP HA auto-sync parameters change, such as Crontab parameters, the LDAP HA sync task \n" " will be re-registered or updated, and this task will be invoked" msgstr "" "Quando alterações são efetuadas nos parâmetros de sincronização automática " @@ -8069,114 +8109,114 @@ msgstr "Usuário sincronizado" msgid "No user synchronization required" msgstr "Nenhum usuário para sincronizar" -#: settings/utils/ldap.py:509 +#: settings/utils/ldap.py:529 msgid "ldap:// or ldaps:// protocol is used." msgstr "Use o protocolo ldap:// ou ldaps://" -#: settings/utils/ldap.py:520 +#: settings/utils/ldap.py:540 msgid "Host or port is disconnected: {}" msgstr "Host ou porta não podem ser conectados: {}" -#: settings/utils/ldap.py:522 +#: settings/utils/ldap.py:542 msgid "The port is not the port of the LDAP service: {}" msgstr "Porta não é uma porta de serviço LDAP: {}" -#: settings/utils/ldap.py:524 +#: settings/utils/ldap.py:544 msgid "Please add certificate: {}" msgstr "Adicione um certificado" -#: settings/utils/ldap.py:528 settings/utils/ldap.py:555 -#: settings/utils/ldap.py:585 settings/utils/ldap.py:613 +#: settings/utils/ldap.py:548 settings/utils/ldap.py:575 +#: settings/utils/ldap.py:605 settings/utils/ldap.py:633 msgid "Unknown error: {}" msgstr "Erro desconhecido: {}" -#: settings/utils/ldap.py:542 +#: settings/utils/ldap.py:562 msgid "Bind DN or Password incorrect" msgstr "Erro de DN de vinculação ou senha" -#: settings/utils/ldap.py:549 +#: settings/utils/ldap.py:569 msgid "Please enter Bind DN: {}" msgstr "Insira o DN de vinculação: {}" -#: settings/utils/ldap.py:551 +#: settings/utils/ldap.py:571 msgid "Please enter Password: {}" msgstr "Por favor, insira a senha: {}" -#: settings/utils/ldap.py:553 +#: settings/utils/ldap.py:573 msgid "Please enter correct Bind DN and Password: {}" msgstr "Por favor, insira o DN de vinculação e a senha corretos: {}" -#: settings/utils/ldap.py:571 +#: settings/utils/ldap.py:591 msgid "Invalid User OU or User search filter: {}" msgstr "OU de usuário inválido ou filtro de usuário: {}" -#: settings/utils/ldap.py:602 +#: settings/utils/ldap.py:622 msgid "LDAP User attr map not include: {}" msgstr "O mapeamento de atributos LDAP não inclui: {}" -#: settings/utils/ldap.py:609 +#: settings/utils/ldap.py:629 msgid "LDAP User attr map is not dict" msgstr " O mapeamento de atributos LDAP é inválido" -#: settings/utils/ldap.py:628 +#: settings/utils/ldap.py:648 msgid "LDAP authentication is not enabled" msgstr "A autenticação LDAP não está ativada" -#: settings/utils/ldap.py:646 +#: settings/utils/ldap.py:666 msgid "Error (Invalid LDAP server): {}" msgstr "Erro (Endereço do servidor LDAP inválido): {}" -#: settings/utils/ldap.py:648 +#: settings/utils/ldap.py:668 msgid "Error (Invalid Bind DN): {}" msgstr "Erro (DN de vinculação inválido): {}" -#: settings/utils/ldap.py:650 +#: settings/utils/ldap.py:670 msgid "Error (Invalid LDAP User attr map): {}" msgstr "Erro (mapeamento de atributos LDAP inválido): {}" -#: settings/utils/ldap.py:652 +#: settings/utils/ldap.py:672 msgid "Error (Invalid User OU or User search filter): {}" msgstr "Erro (OU de usuário inválido ou filtro de usuário): {}" -#: settings/utils/ldap.py:654 +#: settings/utils/ldap.py:674 msgid "Error (Not enabled LDAP authentication): {}" msgstr "Erro (autenticação LDAP não ativada): {}" -#: settings/utils/ldap.py:656 +#: settings/utils/ldap.py:676 msgid "Error (Unknown): {}" msgstr "Erro (desconhecido): {}" -#: settings/utils/ldap.py:659 +#: settings/utils/ldap.py:679 msgid "Succeed: Match {} users" msgstr "Correspondência bem-sucedida para {} usuários" -#: settings/utils/ldap.py:689 +#: settings/utils/ldap.py:709 msgid "Authentication failed (configuration incorrect): {}" msgstr "Falha na autenticação (erro de configuração): {}" -#: settings/utils/ldap.py:693 +#: settings/utils/ldap.py:713 msgid "Authentication failed (username or password incorrect): {}" msgstr "Falha na autenticação (nome de usuário ou senha incorretos): {}" -#: settings/utils/ldap.py:695 +#: settings/utils/ldap.py:715 msgid "Authentication failed (Unknown): {}" msgstr "Falha na autenticação: (desconhecido): {}" -#: settings/utils/ldap.py:698 +#: settings/utils/ldap.py:718 msgid "Authentication success: {}" msgstr "Autenticação bem sucedida: {}" -#: settings/ws.py:222 +#: settings/ws.py:223 msgid "No LDAP user was found" msgstr "Não foi possível obter usuário LDAP" -#: settings/ws.py:228 +#: settings/ws.py:232 msgid "Total {}, success {}, failure {}" msgstr "Total de {}, sucesso {}, falha {}" -#: templates/_csv_import_export.html:8 -msgid "Export" -msgstr "Exportar" +#: settings/ws.py:236 +msgid ", disabled {}" +msgstr ", desativar {}" #: templates/_csv_import_export.html:13 templates/_csv_import_modal.html:5 #: xpack/plugins/cloud/const.py:65 @@ -8237,7 +8277,8 @@ msgstr "Logout" #: templates/_message.html:6 msgid "Your account has expired, please contact the administrator." -msgstr "Sua conta já expirou, por favor, entre em contato com o administrador." +msgstr "" +"Sua conta já expirou, por favor, entre em contato com o administrador." #: templates/_message.html:11 msgid "Your account will at" @@ -8346,8 +8387,8 @@ msgid "" "OpenSSH is a program used to connect remote applications in the Windows " "Remote Application Publisher" msgstr "" -"OpenSSH é um programa usado para conectar aplicativos remotos no servidor de " -"publicação de aplicativos remotos do Windows" +"OpenSSH é um programa usado para conectar aplicativos remotos no servidor de" +" publicação de aplicativos remotos do Windows" #: templates/resource_download.html:53 msgid "Offline video player" @@ -8401,7 +8442,7 @@ msgstr "Teste bem-sucedido" msgid "Test failure: Please check configuration" msgstr "Teste falhou: Por favor, verifique as configurações" -#: terminal/api/component/terminal.py:57 +#: terminal/api/component/terminal.py:56 msgid "Have online sessions" msgstr "Existem sessões online" @@ -8581,7 +8622,7 @@ msgstr "Versão" msgid "Can concurrent" msgstr "Pode ser Executado Simultaneamente" -#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:179 +#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:194 #: terminal/serializers/storage.py:193 msgid "Hosts" msgstr "Host" @@ -8603,12 +8644,12 @@ msgstr "Somente suporte para plataformas personalizadas" msgid "Missing type in platform.yml" msgstr "Tipo ausente em platform.yml" -#: terminal/models/applet/applet.py:330 terminal/models/applet/host.py:36 +#: terminal/models/applet/applet.py:371 terminal/models/applet/host.py:36 #: terminal/models/applet/host.py:138 msgid "Hosting" msgstr "Máquina Hospedeira" -#: terminal/models/applet/applet.py:336 +#: terminal/models/applet/applet.py:377 msgid "Applet Publication" msgstr "Publicação de Aplicativo" @@ -8685,18 +8726,22 @@ msgid "SQLServer port" msgstr "Porta SQLServer" #: terminal/models/component/endpoint.py:25 +msgid "Oracle port" +msgstr "Porta Oracle" + +#: terminal/models/component/endpoint.py:26 msgid "VNC port" msgstr "Porta VNC" -#: terminal/models/component/endpoint.py:33 -#: terminal/models/component/endpoint.py:120 -#: terminal/serializers/endpoint.py:80 terminal/serializers/storage.py:41 +#: terminal/models/component/endpoint.py:34 +#: terminal/models/component/endpoint.py:114 +#: terminal/serializers/endpoint.py:61 terminal/serializers/storage.py:41 #: terminal/serializers/storage.py:53 terminal/serializers/storage.py:83 #: terminal/serializers/storage.py:93 terminal/serializers/storage.py:101 msgid "Endpoint" msgstr "Ponto final" -#: terminal/models/component/endpoint.py:126 +#: terminal/models/component/endpoint.py:120 msgid "Endpoint rule" msgstr "Regras de ponto final" @@ -8770,7 +8815,8 @@ msgstr "É possível fazer download da gravação da sessão" msgid "Account ID" msgstr "Conta" -#: terminal/models/session/session.py:39 terminal/models/session/sharing.py:118 +#: terminal/models/session/session.py:39 +#: terminal/models/session/sharing.py:118 msgid "Login from" msgstr "Origem do login" @@ -8819,8 +8865,8 @@ msgstr "Permissões de ação" msgid "Origin" msgstr "Origem" -#: terminal/models/session/sharing.py:42 terminal/models/session/sharing.py:100 -#: terminal/notifications.py:279 +#: terminal/models/session/sharing.py:42 +#: terminal/models/session/sharing.py:100 terminal/notifications.py:279 msgid "Session sharing" msgstr "Compartilhamento de Sessão" @@ -8903,7 +8949,7 @@ msgid "Command and replay storage" msgstr "Armazenamento de comandos e gravações" #: terminal/notifications.py:258 terminal/tasks.py:212 -#: xpack/plugins/cloud/api.py:160 +#: xpack/plugins/cloud/api.py:175 #: xpack/plugins/cloud/serializers/account.py:121 #: xpack/plugins/cloud/serializers/account.py:123 msgid "Test failure: Account invalid" @@ -8933,21 +8979,15 @@ msgstr "Endereço de serviço Core" #: terminal/serializers/applet_host.py:38 msgid "" " \n" -" Tips: The application release machine communicates with the Core " -"service. \n" -" If the release machine and the Core service are on the same network " -"segment, \n" -" it is recommended to fill in the intranet address, otherwise fill in " -"the current site URL \n" +" Tips: The application release machine communicates with the Core service. \n" +" If the release machine and the Core service are on the same network segment, \n" +" it is recommended to fill in the intranet address, otherwise fill in the current site URL \n" "
\n" " eg: https://172.16.10.110 or https://dev.jumpserver.com\n" " " msgstr "" " \n" -"Dica: O publicador de aplicativos e o serviço Core usam comunicação. Se o " -"publicador e o serviço Core estiverem na mesma rede, é recomendado preencher " -"o endereço da intranet; caso contrário, preencha o URL do atual site. Por " -"exemplo: https://172.16.10.110 ou https://dev.jumpserver.com." +"Dica: O publicador de aplicativos e o serviço Core usam comunicação. Se o publicador e o serviço Core estiverem na mesma rede, é recomendado preencher o endereço da intranet; caso contrário, preencha o URL do atual site. Por exemplo: https://172.16.10.110 ou https://dev.jumpserver.com." #: terminal/serializers/applet_host.py:46 terminal/serializers/storage.py:207 msgid "Ignore Certificate Verification" @@ -8960,12 +9000,13 @@ msgstr "Já existem licenças RDS" #: terminal/serializers/applet_host.py:50 msgid "" "If not exist, the RDS will be in trial mode, and the trial period is 120 " -"days. Detail" +"days. Detail" msgstr "" "Se não existir, o RDS estará em modo de teste, com um período de teste de " -"120 dias. Detalhes" +"120 dias. Detalhes" #: terminal/serializers/applet_host.py:55 msgid "RDS License Server" @@ -9005,8 +9046,8 @@ msgstr "Tempo limite de logoff de aplicativo remoto do RDS (milissegundos)" #: terminal/serializers/applet_host.py:74 msgid "" -"Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp " -"programs (0 milliseconds, log off the session immediately)." +"Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp" +" programs (0 milliseconds, log off the session immediately)." msgstr "" "Nota: Define o tempo de logoff da sessão RemoteAPP após o fechamento de " "todos os programas RemoteApp (0 milissegundos, logoff imediato da sessão)" @@ -9018,15 +9059,15 @@ msgstr "Status de carga" #: terminal/serializers/applet_host.py:97 msgid "" -"These accounts are used to connect to the published application, the account " -"is now divided into two types, one is dedicated to each account, each user " +"These accounts are used to connect to the published application, the account" +" is now divided into two types, one is dedicated to each account, each user " "has a private account, the other is public, when the application does not " -"support multiple open and the special has been used, the public account will " -"be used to connect" +"support multiple open and the special has been used, the public account will" +" be used to connect" msgstr "" -"Estas contas são usadas para conectar-se aos aplicativos publicados, e agora " -"são divididas em dois tipos:
Uma é dedicada, cada usuário tem uma conta " -"dedicada. A outra é a pública, que será usada quando o aplicativo não " +"Estas contas são usadas para conectar-se aos aplicativos publicados, e agora" +" são divididas em dois tipos:
Uma é dedicada, cada usuário tem uma " +"conta dedicada. A outra é a pública, que será usada quando o aplicativo não " "suportar múltiplas execuções e as dedicadas já estiverem em uso;
Nota: " "Se a criação automática de conta não estiver ativada, a máquina publicada " "atual só poderá ser agendada para ativos com uma etiqueta especificada, por " @@ -9048,15 +9089,15 @@ msgstr "" "CACHE_LOGIN_PASSWORD_ENABLED=true no arquivo de configuração, e reiniciar o " "serviço após a alteração." -#: terminal/serializers/applet_host.py:149 +#: terminal/serializers/applet_host.py:164 msgid "Install applets" msgstr "Instalar aplicativo" -#: terminal/serializers/applet_host.py:179 +#: terminal/serializers/applet_host.py:194 msgid "Host ID" msgstr "ID do host" -#: terminal/serializers/applet_host.py:180 +#: terminal/serializers/applet_host.py:195 msgid "Applet ID" msgstr "ID da aplicação remota" @@ -9084,45 +9125,30 @@ msgstr "ID de sessão inválida" msgid "Timestamp" msgstr "Timestamp" -#: terminal/serializers/endpoint.py:15 -msgid "Oracle port" -msgstr "Porta Oracle" - -#: terminal/serializers/endpoint.py:18 -msgid "Oracle port range" -msgstr "Alcance de porta Oracle" - -#: terminal/serializers/endpoint.py:20 -msgid "" -"Oracle proxy server listen port is dynamic, Each additional Oracle database " -"instance adds a port listener" -msgstr "" -"A porta de escuta do servidor proxy Oracle é dinâmica, aumenta com cada " -"instância de banco de dados Oracle adicionada" - -#: terminal/serializers/endpoint.py:38 +#: terminal/serializers/endpoint.py:26 msgid "" "The host address accessed when connecting to assets, if it is empty, the " "access address of the current browser will be used (the default endpoint " "does not allow modification of the host)" msgstr "" "Endereço do host acessado ao conectar ao ativo, se estiver vazio, use o " -"endereço de acesso do navegador atual (o host padrão não permite modificação)" +"endereço de acesso do navegador atual (o host padrão não permite " +"modificação)" -#: terminal/serializers/endpoint.py:71 +#: terminal/serializers/endpoint.py:52 msgid "" -"The assets within this IP range, the following endpoint will be used for the " -"connection" +"The assets within this IP range, the following endpoint will be used for the" +" connection" msgstr "O ativo na faixa de IP usará o endpoint abaixo para conexão" -#: terminal/serializers/endpoint.py:72 +#: terminal/serializers/endpoint.py:53 msgid "" "If asset IP addresses under different endpoints conflict, use asset labels" msgstr "" -"Se houver conflitos de IP de ativos em diferentes pontos finais, use tags de " -"ativos para resolver." +"Se houver conflitos de IP de ativos em diferentes pontos finais, use tags de" +" ativos para resolver." -#: terminal/serializers/endpoint.py:76 +#: terminal/serializers/endpoint.py:57 msgid "Asset IP" msgstr "Ativo IP" @@ -9385,8 +9411,7 @@ msgstr "Limpar sessão offline" #: terminal/tasks.py:45 msgid "" -"Check every 10 minutes for asset connection sessions that have been inactive " -"for 3 \n" +"Check every 10 minutes for asset connection sessions that have been inactive for 3 \n" " minutes and mark these sessions as completed" msgstr "" "A cada 10 minutos, verifica sessões de conexão de ativos inativos por 3 " @@ -9398,8 +9423,7 @@ msgstr "Upload de gravação de sessão para armazenamento externo" #: terminal/tasks.py:70 terminal/tasks.py:104 msgid "" -"If SERVER_REPLAY_STORAGE is configured in the config.txt, session commands " -"and \n" +"If SERVER_REPLAY_STORAGE is configured in the config.txt, session commands and \n" " recordings will be uploaded to external storage" msgstr "" "Se SERVER_REPLAY_STORAGE estiver configurado, sincronize os arquivos " @@ -9415,8 +9439,7 @@ msgstr "Executar implantação da aplicação" #: terminal/tasks.py:126 msgid "" -"When deploying from the remote application publisher details page, and the " -"'Deploy' \n" +"When deploying from the remote application publisher details page, and the 'Deploy' \n" " button is clicked, this task will be executed" msgstr "" "Implantação da publicação, ao clicar na implantação, executar esta tarefa" @@ -9427,8 +9450,7 @@ msgstr "Instalar aplicação" #: terminal/tasks.py:140 msgid "" -"When the 'Deploy' button is clicked in the 'Remote Application' section of " -"the remote \n" +"When the 'Deploy' button is clicked in the 'Remote Application' section of the remote \n" " application publisher details page, this task will be executed" msgstr "" "Ao detalhar o aplicativo remoto - aplicativo remoto, ao clicar na " @@ -9440,8 +9462,7 @@ msgstr "Desinstalar aplicação" #: terminal/tasks.py:155 msgid "" -"When the 'Uninstall' button is clicked in the 'Remote Application' section " -"of the \n" +"When the 'Uninstall' button is clicked in the 'Remote Application' section of the \n" " remote application publisher details page, this task will be executed" msgstr "" "Ao detalhar o aplicativo remoto - aplicativo remoto, ao clicar na " @@ -9453,12 +9474,11 @@ msgstr "Coletar contas no aplicativo remoto" #: terminal/tasks.py:170 msgid "" -"When a remote publishing server is created and an account needs to be " -"created \n" +"When a remote publishing server is created and an account needs to be created \n" " automatically, this task will be executed" msgstr "" -"Após criar a máquina de publicação remota, se for necessário criar uma conta " -"automaticamente, execute a tarefa" +"Após criar a máquina de publicação remota, se for necessário criar uma conta" +" automaticamente, execute a tarefa" #: terminal/tasks.py:184 msgid "Check command replay storage connectivity" @@ -9466,15 +9486,12 @@ msgstr "Verificar a conectividade de armazenamento de comandos e gravações" #: terminal/tasks.py:186 msgid "" -"Check every day at midnight whether the external storage for commands and " -"recordings \n" -" is accessible. If it is not accessible, send a notification to the " -"recipients specified \n" -" in 'System Settings - Notifications - Subscription - Storage - " -"Connectivity'" +"Check every day at midnight whether the external storage for commands and recordings \n" +" is accessible. If it is not accessible, send a notification to the recipients specified \n" +" in 'System Settings - Notifications - Subscription - Storage - Connectivity'" msgstr "" -"Verifica todos os dias à meia-noite se o armazenamento externo de comandos e " -"gravações pode ser conectado, se não puder, envie para: Configurações do " +"Verifica todos os dias à meia-noite se o armazenamento externo de comandos e" +" gravações pode ser conectado, se não puder, envie para: Configurações do " "sistema - Configurações de notificação - Assinatura de mensagem - " "Destinatário definido para armazenamento de configurações de gravação e " "comando." @@ -9483,30 +9500,6 @@ msgstr "" msgid "view" msgstr "Visualizar" -#: terminal/utils/db_port_mapper.py:88 -msgid "" -"No available port is matched. The number of databases may have exceeded the " -"number of ports open to the database agent service, Contact the " -"administrator to open more ports." -msgstr "" -"Não foi possível encontrar uma porta disponível, o número de bancos de dados " -"pode ter excedido o número de portas abertas pelo serviço de proxy do banco " -"de dados, por favor, entre em contato com o administrador para abrir mais " -"portas." - -#: terminal/utils/db_port_mapper.py:116 -msgid "" -"No ports can be used, check and modify the limit on the number of ports that " -"Magnus listens on in the configuration file." -msgstr "" -"Não há portas disponíveis para uso, verifique e modifique o limite do número " -"de portas que o Magnus está ouvindo no arquivo de configuração." - -#: terminal/utils/db_port_mapper.py:118 -msgid "All available port count: {}, Already use port count: {}" -msgstr "" -"Número total de portas disponíveis: {}, Número de portas utilizadas: {}" - #: tickets/api/ticket.py:88 tickets/models/ticket/general.py:289 msgid "Applicant" msgstr "Solicitante" @@ -9858,7 +9851,8 @@ msgstr "Auditor da organização" #: users/const.py:18 msgid "Reset link will be generated and sent to the user" -msgstr "Gere um link de redefinição de senha e envie para o usuário por e-mail" +msgstr "" +"Gere um link de redefinição de senha e envie para o usuário por e-mail" #: users/const.py:19 msgid "Set password" @@ -9922,9 +9916,9 @@ msgid "" "in. you can also directly bind in \"personal information -> quick " "modification -> change MFA Settings\"!" msgstr "" -"Depois de ativado, você entrará no processo de vinculação de autenticação de " -"múltiplos fatores na próxima vez que fizer login; Você também pode vincular " -"diretamente em (Informações pessoais->Modificação rápida->Configuração de " +"Depois de ativado, você entrará no processo de vinculação de autenticação de" +" múltiplos fatores na próxima vez que fizer login; Você também pode vincular" +" diretamente em (Informações pessoais->Modificação rápida->Configuração de " "autenticação MFA de múltiplos fatores)!" #: users/forms/profile.py:60 @@ -9935,8 +9929,8 @@ msgstr "" #: users/forms/profile.py:69 msgid "" -"In order to protect you and your company, please keep your account, password " -"and key sensitive information properly. (for example: setting complex " +"In order to protect you and your company, please keep your account, password" +" and key sensitive information properly. (for example: setting complex " "password, enabling MFA)" msgstr "" "Para proteger sua segurança e a da sua empresa, por favor, cuide bem da sua " @@ -10100,11 +10094,11 @@ msgstr "Nome do tema do terminal" #: users/serializers/preference/lina.py:12 msgid "" "*! The password for file encryption, used for decryption when the system " -"sends emails containing file attachments.
Such as: account backup files, " -"account password change results files" +"sends emails containing file attachments.
Such as: account backup files," +" account password change results files" msgstr "" -"Senha de criptografia de arquivo, use esta senha para descriptografar quando " -"o email enviado pelo sistema contém um anexo de arquivo.
Por exemplo: " +"Senha de criptografia de arquivo, use esta senha para descriptografar quando" +" o email enviado pelo sistema contém um anexo de arquivo.
Por exemplo: " "arquivo de backup da conta, arquivo de resultado de alteração de senha da " "conta" @@ -10155,8 +10149,8 @@ msgid "" "window is resized." msgstr "" "Determinar se o computador cliente deve redimensionar o conteúdo no " -"computador remoto para se ajustar ao tamanho da janela do computador cliente " -"quando o tamanho da janela é alterado" +"computador remoto para se ajustar ao tamanho da janela do computador cliente" +" quando o tamanho da janela é alterado" #: users/serializers/preference/luna.py:59 msgid "Remote app connect method" @@ -10186,7 +10180,7 @@ msgstr "Linha de comando" msgid "The old password is incorrect" msgstr "Senha antiga errada" -#: users/serializers/profile.py:37 users/serializers/profile.py:148 +#: users/serializers/profile.py:37 users/serializers/profile.py:156 msgid "Password does not match security rules" msgstr "A senha não atende às regras de segurança" @@ -10200,8 +10194,8 @@ msgstr "Função de sistema" #: users/serializers/user.py:55 msgid "" -"System roles are roles at the system level, and they will take effect across " -"all organizations" +"System roles are roles at the system level, and they will take effect across" +" all organizations" msgstr "" "A função do sistema é um papel definido ao nível do sistema e será efetivo " "em todas as organizações" @@ -10215,8 +10209,8 @@ msgid "" "Org roles are roles at the organization level, and they will only take " "effect within current organization" msgstr "" -"Os papéis organizacionais são papéis no nível da organização, válidos apenas " -"dentro da organização atual " +"Os papéis organizacionais são papéis no nível da organização, válidos apenas" +" dentro da organização atual " #: users/serializers/user.py:70 msgid "Organizations and roles" @@ -10280,8 +10274,8 @@ msgid "" "other sources.There are security settings that can restrict users to log in " "to the system only from the sources." msgstr "" -" A identidade de origem do usuário indica o local de criação do usuário, que " -"pode ser AD ou outra fonte. As configurações de segurança podem limitar os " +" A identidade de origem do usuário indica o local de criação do usuário, que" +" pode ser AD ou outra fonte. As configurações de segurança podem limitar os " "usuários a fazer login somente a partir de uma fonte especificada." #: users/serializers/user.py:260 @@ -10302,7 +10296,8 @@ msgstr "Autenticação" #: users/serializers/user.py:422 msgid "" -"* For security, only a partial of users is displayed. You can search for more" +"* For security, only a partial of users is displayed. You can search for " +"more" msgstr "" "* Para sua segurança, apenas alguns usuários são mostrados. Você pode " "procurar por mais" @@ -10314,8 +10309,7 @@ msgstr "Nome duplicado" #: users/signal_handlers.py:41 msgid "" "The administrator has enabled \"Only allow existing users to log in\", \n" -" and the current user is not in the user list. Please contact the " -"administrator." +" and the current user is not in the user list. Please contact the administrator." msgstr "" "O administrador ativou a opção 'Permitir login apenas para usuários " "existentes', o usuário atual não está na lista de usuários, por favor, " @@ -10327,8 +10321,7 @@ msgstr "Limpar sessões de usuários expiradas" #: users/signal_handlers.py:179 msgid "" -"After logging in via the web, a user session record is created. At 2 a.m. " -"every day, \n" +"After logging in via the web, a user session record is created. At 2 a.m. every day, \n" " the system cleans up inactive user devices" msgstr "" "Após o login via web, será gerado um registro da sessão do usuário online, " @@ -10341,8 +10334,7 @@ msgstr "A verificação da senha expirou" #: users/tasks.py:28 msgid "" -"Check every day at 10 AM whether the passwords of users in the system are " -"expired, \n" +"Check every day at 10 AM whether the passwords of users in the system are expired, \n" " and send a notification 5 days in advance" msgstr "" "Verifica-se todos os dias às 10 da manhã se as senhas dos usuários no " @@ -10354,10 +10346,8 @@ msgstr "Verificação periódica de senhas expiradas" #: users/tasks.py:48 msgid "" -"With version iterations, new tasks may be added, or task names and execution " -"times may \n" -" be modified. Therefore, upon system startup, it is necessary to " -"register or update the \n" +"With version iterations, new tasks may be added, or task names and execution times may \n" +" be modified. Therefore, upon system startup, it is necessary to register or update the \n" " parameters of the task that checks if passwords have expired" msgstr "" "Com as iterações das versões, novas tarefas podem ser adicionadas ou o nome " @@ -10371,8 +10361,7 @@ msgstr "Verificação de usuário já expirado." #: users/tasks.py:69 msgid "" -"Check every day at 2 p.m whether the users in the system are expired, and " -"send a \n" +"Check every day at 2 p.m whether the users in the system are expired, and send a \n" " notification 5 days in advance" msgstr "" "Confira todos os dias às 14h se os usuários do sistema estão expirados e " @@ -10384,16 +10373,14 @@ msgstr "Verificação periódica do vencimento dos usuários" #: users/tasks.py:92 msgid "" -"With version iterations, new tasks may be added, or task names and execution " -"times may \n" -" be modified. Therefore, upon system startup, it is necessary to " -"register or update the \n" +"With version iterations, new tasks may be added, or task names and execution times may \n" +" be modified. Therefore, upon system startup, it is necessary to register or update the \n" " parameters of the task that checks if users have expired" msgstr "" "Com o avanço das versões, pode haver a adição de novas tarefas ou " "modificação dos nomes, horários de execução das tarefas, por isso, ao " -"iniciar o sistema, registre ou atualize os parâmetros da tarefa de verificar " -"se o usuário já expirou" +"iniciar o sistema, registre ou atualize os parâmetros da tarefa de verificar" +" se o usuário já expirou" #: users/tasks.py:111 msgid "Check unused users" @@ -10401,14 +10388,12 @@ msgstr "Verifique os usuários inativos" #: users/tasks.py:113 msgid "" -"At 2 p.m. every day, according to the configuration in \"System Settings - " -"Security - \n" -" Auth security - Auto disable threshold\" users who have not logged " -"in or whose API keys \n" +"At 2 p.m. every day, according to the configuration in \"System Settings - Security - \n" +" Auth security - Auto disable threshold\" users who have not logged in or whose API keys \n" " have not been used for a long time will be disabled" msgstr "" -"Todos os dias às 14h, com base na configuração do sistema - configurações de " -"segurança - configuração de desativação automática de usuários inativos, " +"Todos os dias às 14h, com base na configuração do sistema - configurações de" +" segurança - configuração de desativação automática de usuários inativos, " "desativar usuários que não fazem login ou não usam a chave API por muito " "tempo" @@ -10552,8 +10537,8 @@ msgstr "Vincular validador MFA" #: users/templates/users/user_otp_enable_bind.html:13 msgid "" -"Use the MFA Authenticator application to scan the following qr code for a 6-" -"bit verification code" +"Use the MFA Authenticator application to scan the following qr code for a " +"6-bit verification code" msgstr "" "Use o aplicativo do validador MFA para escanear o código QR abaixo e obter " "um código de verificação de 6 dígitos" @@ -10663,11 +10648,11 @@ msgstr "Nome de usuário ou senha inválidos" #: users/views/profile/reset.py:66 msgid "" -"Non-local users can log in only from third-party platforms and cannot change " -"their passwords: {}" +"Non-local users can log in only from third-party platforms and cannot change" +" their passwords: {}" msgstr "" -"Usuários não locais só podem entrar através de plataformas de terceiros, não " -"é suportada a alteração de senha: {}" +"Usuários não locais só podem entrar através de plataformas de terceiros, não" +" é suportada a alteração de senha: {}" #: users/views/profile/reset.py:188 users/views/profile/reset.py:199 msgid "Token invalid or expired" @@ -10703,15 +10688,15 @@ msgstr "" "Baseado na configuração da tarefa atual, os recursos que não estão conforme " "a política \"\" serão ignorados." -#: xpack/plugins/cloud/api.py:72 +#: xpack/plugins/cloud/api.py:74 msgid "Test connection successful" msgstr "Teste bem-sucedido" -#: xpack/plugins/cloud/api.py:74 +#: xpack/plugins/cloud/api.py:76 msgid "Test connection failed: {}" msgstr "Falha na conexão do teste: {}" -#: xpack/plugins/cloud/api.py:171 +#: xpack/plugins/cloud/api.py:196 msgid "User {} deleted the current resource and released the assets" msgstr "Usuário {} excluiu o recurso já liberado" @@ -11049,7 +11034,8 @@ msgstr "Instância" msgid "Sync instance detail" msgstr "Detalhes da Sincronização de Instância" -#: xpack/plugins/cloud/models.py:313 xpack/plugins/cloud/serializers/task.py:79 +#: xpack/plugins/cloud/models.py:313 +#: xpack/plugins/cloud/serializers/task.py:79 msgid "Rule relation" msgstr "Relação Condicional" @@ -11105,7 +11091,8 @@ msgstr "Correspondência de regra" msgid "Rule value" msgstr "Valor da regra" -#: xpack/plugins/cloud/models.py:383 xpack/plugins/cloud/serializers/task.py:82 +#: xpack/plugins/cloud/models.py:383 +#: xpack/plugins/cloud/serializers/task.py:82 msgid "Strategy rule" msgstr "Condição" @@ -11121,7 +11108,8 @@ msgstr "Atributos de ação" msgid "Action value" msgstr "Valor de ação" -#: xpack/plugins/cloud/models.py:410 xpack/plugins/cloud/serializers/task.py:85 +#: xpack/plugins/cloud/models.py:410 +#: xpack/plugins/cloud/serializers/task.py:85 msgid "Strategy action" msgstr "Action" @@ -11399,10 +11387,10 @@ msgid "" "synchronization task is executed, only the valid IP address will be " "synchronized.
If the port is 0, all IP addresses are valid." msgstr "" -"A porta é usada para verificar a validade do endereço IP, durante a execução " -"da tarefa de sincronização, apenas os endereços IP válidos serão " -"sincronizados.
Se a porta for 0, significa que todos os endereços IP são " -"válidos." +"A porta é usada para verificar a validade do endereço IP, durante a execução" +" da tarefa de sincronização, apenas os endereços IP válidos serão " +"sincronizados.
Se a porta for 0, significa que todos os endereços IP são" +" válidos." #: xpack/plugins/cloud/serializers/account_attrs.py:191 msgid "Hostname prefix" @@ -11433,16 +11421,12 @@ msgid "Instance count" msgstr "Número de instâncias" #: xpack/plugins/cloud/tasks.py:33 -#, fuzzy -#| msgid "" -#| "Execute this task when manually or scheduled cloud synchronization tasks " -#| "are performed" msgid "" -"Execute this task when manually or scheduled cloud synchronization tasks are " -"performed" +"Execute this task when manually or scheduled cloud synchronization tasks are" +" performed" msgstr "" -"Manual, executa esta tarefa ao executar a tarefa de sincronização em nuvem " -"programada" +"Execute esta tarefa ao realizar uma ação de sincronização em nuvem manual ou" +" agendada." #: xpack/plugins/cloud/tasks.py:50 msgid "Period clean sync instance task execution" @@ -11451,23 +11435,15 @@ msgstr "" "instâncias" #: xpack/plugins/cloud/tasks.py:52 -#, fuzzy -#| msgid "" -#| "Every day, according to the configuration in \"System Settings - Tasks - " -#| "Regular \n" -#| " clean-up - Cloud sync task history retention days\" the system " -#| "will clean up the execution \n" -#| " records generated by cloud synchronization" msgid "" -"Every day, according to the configuration in \"System Settings - Tasks - " -"Regular \n" -" clean-up - Cloud sync task history retention days\" the system will " -"clean up the execution \n" +"Every day, according to the configuration in \"System Settings - Tasks - Regular \n" +" clean-up - Cloud sync task history retention days\" the system will clean up the execution \n" " records generated by cloud synchronization" msgstr "" -"Diariamente, de acordo com as configurações do sistema - lista de tarefas - " -"limpeza regular de configurações - configuração de registro de sincronização " -"em nuvem, as execuções geradas pela sincronização em nuvem serão limpas." +"Diariamente, o sistema limpará os registros gerados durante o processo de " +"execução da sincronização em nuvem, de acordo com a configuração de " +"\"Configurações do sistema - Tarefas - Limpeza periódica - Dias de retenção " +"do histórico de tarefas de sincronização em nuvem\"." #: xpack/plugins/interface/api.py:52 msgid "Restore default successfully." @@ -11523,6 +11499,56 @@ msgstr "Importação de licença bem-sucedida" msgid "Invalid license" msgstr "Licença inválida" +#~ msgid "Deleting other people's script is not allowed" +#~ msgstr "Não é permitido excluir scripts de outros" + +#~ msgid "Deleting other people's playbook is not allowed" +#~ msgstr "Não é permitido excluir o playbook de outra pessoa" + +#, fuzzy +#~ msgid "Directory services" +#~ msgstr "Serviço de diretório" + +#, python-format +#~ msgid "User %s view/export secret" +#~ msgstr "Usuário %s visualizou/exportou a senha" + +#~ msgid "Enabled, the web session and replay contains watermark information" +#~ msgstr "" +#~ "Após a ativação, as sessões Web e as gravações incluirão informações de " +#~ "marca d'água" + +#~ msgid "Oracle port range" +#~ msgstr "Alcance de porta Oracle" + +#~ msgid "" +#~ "Oracle proxy server listen port is dynamic, Each additional Oracle database " +#~ "instance adds a port listener" +#~ msgstr "" +#~ "A porta de escuta do servidor proxy Oracle é dinâmica, aumenta com cada " +#~ "instância de banco de dados Oracle adicionada" + +#~ msgid "" +#~ "No available port is matched. The number of databases may have exceeded the " +#~ "number of ports open to the database agent service, Contact the " +#~ "administrator to open more ports." +#~ msgstr "" +#~ "Não foi possível encontrar uma porta disponível, o número de bancos de dados" +#~ " pode ter excedido o número de portas abertas pelo serviço de proxy do banco" +#~ " de dados, por favor, entre em contato com o administrador para abrir mais " +#~ "portas." + +#~ msgid "" +#~ "No ports can be used, check and modify the limit on the number of ports that" +#~ " Magnus listens on in the configuration file." +#~ msgstr "" +#~ "Não há portas disponíveis para uso, verifique e modifique o limite do número" +#~ " de portas que o Magnus está ouvindo no arquivo de configuração." + +#~ msgid "All available port count: {}, Already use port count: {}" +#~ msgstr "" +#~ "Número total de portas disponíveis: {}, Número de portas utilizadas: {}" + #~ msgid "Password error" #~ msgstr "Senha incorreta" @@ -11542,18 +11568,18 @@ msgstr "Licença inválida" #~ msgstr "SemSenhaFraca" #~ msgid "" -#~ "The following is a summary of account backup tasks, please review and " -#~ "handle them" +#~ "The following is a summary of account backup tasks, please review and handle" +#~ " them" #~ msgstr "" -#~ "Abaixo estão os resumos das tarefas de backup de contas, por favor, " -#~ "revise e trate." +#~ "Abaixo estão os resumos das tarefas de backup de contas, por favor, revise e" +#~ " trate." #~ msgid "" -#~ "The following is a summary of account change secret tasks, please read " -#~ "and process" +#~ "The following is a summary of account change secret tasks, please read and " +#~ "process" #~ msgstr "" -#~ "Aqui está um resumo da missão secreta de alteração de conta, por favor, " -#~ "leia e processe." +#~ "Aqui está um resumo da missão secreta de alteração de conta, por favor, leia" +#~ " e processe." #~ msgid "" #~ "The following is a summary of the account check tasks. Please review and " @@ -11565,5 +11591,5 @@ msgstr "Licença inválida" #~ msgid "" #~ "The following is a summary of account push tasks, please read and process" #~ msgstr "" -#~ "Abaixo está a compilação da tarefa de notificação de conta, por favor, " -#~ "leia e processe." +#~ "Abaixo está a compilação da tarefa de notificação de conta, por favor, leia " +#~ "e processe." diff --git a/apps/i18n/core/ru/LC_MESSAGES/django.po b/apps/i18n/core/ru/LC_MESSAGES/django.po index fbd00b165..9556426c2 100644 --- a/apps/i18n/core/ru/LC_MESSAGES/django.po +++ b/apps/i18n/core/ru/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-20 11:52+0800\n" +"POT-Creation-Date: 2025-04-17 15:04+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,22 +16,20 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || " -"(n%100>=11 && n%100<=14)? 2 : 3);\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" -#: accounts/api/account/account.py:121 +#: accounts/api/account/account.py:131 #: accounts/serializers/account/account.py:181 -#: accounts/serializers/account/account.py:342 +#: accounts/serializers/account/account.py:344 msgid "Account already exists" msgstr "Учетная запись уже существует" #: accounts/api/account/application.py:78 -#: authentication/api/connection_token.py:452 +#: authentication/api/connection_token.py:451 msgid "Account not found" msgstr "Учетная запись не найдена" -#: accounts/api/automations/base.py:83 tickets/api/ticket.py:132 +#: accounts/api/automations/base.py:86 tickets/api/ticket.py:132 msgid "The parameter 'action' must be [{}]" msgstr "Параметр 'Action' должен быть [{}]" @@ -96,7 +94,7 @@ msgstr "План резервного копирования учетной за msgid "Plan execution end" msgstr "План выполнения завершён" -#: accounts/automations/base/manager.py:118 +#: accounts/automations/base/manager.py:119 msgid "No pending accounts found" msgstr "Не найдено ожидающих обработки счетов" @@ -109,13 +107,11 @@ msgstr "Успех: %s, Провал: %s, Всего: %s" msgid "" "---\n" "Summary: \n" -"ok: {}, weak password: {}, leaked password: {}, repeated password: {}, no " -"secret: {}, using time: {}s" +"ok: {}, weak password: {}, leaked password: {}, repeated password: {}, no secret: {}, using time: {}s" msgstr "" "---\n" "Резюме: \n" -"Нормальные: {}, Слабые пароли: {}, Утечка паролей: {}, Повторяющиеся пароли: " -"{}, Без пароля: {}, Затраченное время: {}сек" +"Нормальные: {}, Слабые пароли: {}, Утечка паролей: {}, Повторяющиеся пароли: {}, Без пароля: {}, Затраченное время: {}сек" #: accounts/automations/push_account/manager.py:33 msgid "Secret cannot be empty" @@ -128,14 +124,14 @@ msgstr "" #: accounts/const/account.py:6 #: accounts/serializers/automations/change_secret.py:34 -#: audits/signal_handlers/login_log.py:34 authentication/confirm/password.py:25 -#: authentication/confirm/password.py:27 authentication/const.py:10 -#: authentication/forms.py:28 +#: audits/signal_handlers/login_log.py:34 +#: authentication/confirm/password.py:25 authentication/confirm/password.py:27 +#: authentication/const.py:10 authentication/forms.py:28 #: authentication/templates/authentication/login.html:362 #: authentication/templates/authentication/login.html:408 #: settings/serializers/auth/ldap.py:27 settings/serializers/auth/ldap.py:53 -#: settings/serializers/auth/ldap_ha.py:36 settings/serializers/msg.py:37 -#: settings/serializers/terminal.py:28 terminal/serializers/storage.py:123 +#: settings/serializers/auth/ldap_ha.py:35 settings/serializers/msg.py:37 +#: settings/serializers/terminal.py:32 terminal/serializers/storage.py:123 #: terminal/serializers/storage.py:142 users/forms/profile.py:22 #: users/serializers/user.py:148 #: users/templates/users/_msg_user_created.html:13 @@ -197,7 +193,8 @@ msgstr "Обнаружить" msgid "Template" msgstr "Шаблон" -#: accounts/const/account.py:32 ops/const.py:46 xpack/plugins/cloud/const.py:68 +#: accounts/const/account.py:32 ops/const.py:46 +#: xpack/plugins/cloud/const.py:68 msgid "Skip" msgstr "Пропустить" @@ -207,7 +204,7 @@ msgid "Update" msgstr "Обновить" #: accounts/const/account.py:34 accounts/const/automation.py:115 -#: accounts/serializers/automations/change_secret.py:169 audits/const.py:65 +#: accounts/serializers/automations/change_secret.py:169 audits/const.py:66 #: audits/signal_handlers/activity_log.py:34 common/const/choices.py:67 #: ops/const.py:76 terminal/const.py:81 xpack/plugins/cloud/const.py:47 msgid "Failed" @@ -310,7 +307,7 @@ msgstr "Создать и отправить" msgid "Only create" msgstr "Создать только" -#: accounts/const/automation.py:109 +#: accounts/const/automation.py:109 authentication/const.py:34 #: authentication/serializers/password_mfa.py:16 #: authentication/serializers/password_mfa.py:24 #: notifications/backends/__init__.py:10 settings/serializers/msg.py:21 @@ -326,7 +323,7 @@ msgid "SFTP" msgstr "SFTP" #: accounts/const/automation.py:116 -#: accounts/serializers/automations/change_secret.py:168 audits/const.py:64 +#: accounts/serializers/automations/change_secret.py:168 audits/const.py:65 #: audits/models.py:65 audits/signal_handlers/activity_log.py:34 #: common/const/choices.py:66 ops/const.py:74 ops/serializers/celery.py:48 #: terminal/const.py:80 terminal/models/session/sharing.py:121 @@ -419,33 +416,11 @@ msgstr "" "Операция Vault не удалась, пожалуйста, повторите попытку или проверьте " "информацию учетной записи на Vault." -#: accounts/filters.py:194 -msgid "Enter a valid UUID." -msgstr "" - -#: accounts/mixins.py:35 -msgid "Export all" -msgstr "Экспортировать все" - -#: accounts/mixins.py:37 -msgid "Export only selected items" -msgstr "Только экспортировать выбранные элементы" - -#: accounts/mixins.py:42 -#, python-format -msgid "Export filtered: %s" -msgstr "Экспорт поиска: %s" - -#: accounts/mixins.py:48 -#, python-format -msgid "User %s view/export secret" -msgstr "Пользователь %s просмотрел/экспортировал пароль" - #: accounts/models/account.py:85 #: accounts/models/automations/check_account.py:59 #: accounts/models/automations/gather_account.py:17 -#: accounts/serializers/account/account.py:226 -#: accounts/serializers/account/account.py:274 +#: accounts/serializers/account/account.py:227 +#: accounts/serializers/account/account.py:276 #: accounts/serializers/automations/change_secret.py:113 #: accounts/serializers/automations/change_secret.py:145 #: accounts/serializers/automations/check_account.py:33 @@ -459,9 +434,9 @@ msgstr "Пользователь %s просмотрел/экспортиров #: accounts/templates/accounts/push_account_report.html:78 #: accounts/templates/accounts/push_account_report.html:118 #: acls/serializers/base.py:130 assets/models/asset/common.py:102 -#: assets/models/asset/common.py:366 assets/models/cmd_filter.py:36 -#: audits/models.py:59 audits/models.py:312 audits/serializers.py:228 -#: authentication/models/connection_token.py:40 +#: assets/models/asset/common.py:428 assets/models/cmd_filter.py:36 +#: audits/models.py:59 audits/models.py:312 audits/serializers.py:230 +#: authentication/models/connection_token.py:41 #: perms/models/asset_permission.py:69 terminal/backends/command/models.py:17 #: terminal/models/session/session.py:34 terminal/notifications.py:156 #: terminal/serializers/command.py:17 terminal/serializers/session.py:30 @@ -472,10 +447,10 @@ msgid "Asset" msgstr "Активы" #: accounts/models/account.py:89 accounts/models/template.py:16 -#: accounts/serializers/account/account.py:233 -#: accounts/serializers/account/account.py:284 +#: accounts/serializers/account/account.py:234 +#: accounts/serializers/account/account.py:286 #: accounts/serializers/account/template.py:35 -#: authentication/serializers/connect_token_secret.py:50 +#: authentication/serializers/connect_token_secret.py:51 msgid "Su from" msgstr "Переключить с" @@ -493,7 +468,7 @@ msgstr "Исторический аккаунт" msgid "Secret reset" msgstr "Можно изменить пароль" -#: accounts/models/account.py:97 accounts/serializers/account/account.py:228 +#: accounts/models/account.py:97 accounts/serializers/account/account.py:229 #: users/models/user/__init__.py:122 msgid "Source" msgstr "Источник" @@ -520,14 +495,14 @@ msgstr "Статус изменения пароля" #: accounts/models/account.py:107 #: accounts/models/automations/check_account.py:64 -#: accounts/serializers/account/service.py:11 +#: accounts/serializers/account/service.py:12 #: accounts/serializers/automations/change_secret.py:115 #: accounts/serializers/automations/change_secret.py:146 #: accounts/templates/accounts/change_secret_failed_info.html:12 #: acls/serializers/base.py:131 #: acls/templates/acls/asset_login_reminder.html:10 #: assets/serializers/gateway.py:33 audits/models.py:60 audits/models.py:313 -#: audits/serializers.py:229 authentication/api/connection_token.py:464 +#: audits/serializers.py:231 authentication/api/connection_token.py:463 #: ops/models/base.py:18 perms/models/asset_permission.py:75 #: settings/serializers/msg.py:33 terminal/backends/command/models.py:18 #: terminal/models/session/session.py:36 terminal/serializers/command.py:72 @@ -564,29 +539,31 @@ msgstr "Можно удалить аккаунт" #: accounts/models/application.py:16 #: accounts/models/automations/check_account.py:116 accounts/models/base.py:63 -#: accounts/serializers/account/service.py:27 +#: accounts/serializers/account/service.py:28 #: accounts/serializers/account/virtual.py:20 acls/models/base.py:35 #: acls/models/base.py:96 acls/models/command_acl.py:21 #: acls/serializers/base.py:35 assets/models/asset/common.py:100 #: assets/models/asset/common.py:166 assets/models/cmd_filter.py:21 #: assets/models/domain.py:19 assets/models/label.py:18 #: assets/models/platform.py:15 assets/models/platform.py:94 -#: assets/serializers/asset/common.py:171 assets/serializers/platform.py:158 -#: assets/serializers/platform.py:278 +#: assets/serializers/asset/common.py:173 assets/serializers/platform.py:158 +#: assets/serializers/platform.py:283 #: authentication/backends/passkey/models.py:10 #: authentication/models/ssh_key.py:12 -#: authentication/serializers/connect_token_secret.py:113 -#: authentication/serializers/connect_token_secret.py:170 labels/models.py:11 +#: authentication/serializers/connect_token_secret.py:115 +#: authentication/serializers/connect_token_secret.py:172 labels/models.py:11 #: ops/mixin.py:32 ops/models/adhoc.py:19 ops/models/celery.py:15 -#: ops/models/celery.py:81 ops/models/job.py:145 ops/models/playbook.py:28 +#: ops/models/celery.py:81 ops/models/job.py:147 ops/models/playbook.py:28 #: ops/models/variable.py:9 ops/serializers/job.py:20 #: ops/serializers/variable.py:20 orgs/models.py:82 #: perms/models/asset_permission.py:61 rbac/models/role.py:29 #: rbac/serializers/role.py:28 settings/models.py:37 settings/models.py:186 #: settings/serializers/msg.py:89 settings/serializers/terminal.py:9 -#: terminal/models/applet/applet.py:34 terminal/models/component/endpoint.py:13 -#: terminal/models/component/endpoint.py:112 -#: terminal/models/component/storage.py:26 terminal/models/component/task.py:13 +#: terminal/models/applet/applet.py:34 +#: terminal/models/component/endpoint.py:13 +#: terminal/models/component/endpoint.py:106 +#: terminal/models/component/storage.py:26 +#: terminal/models/component/task.py:13 #: terminal/models/component/terminal.py:86 #: terminal/models/virtualapp/provider.py:10 #: terminal/models/virtualapp/virtualapp.py:19 tickets/api/ticket.py:87 @@ -612,30 +589,33 @@ msgstr "Шифр" #: accounts/models/application.py:21 acls/models/base.py:98 #: assets/models/automations/base.py:22 assets/models/cmd_filter.py:38 #: assets/serializers/asset/common.py:148 -#: assets/serializers/asset/common.py:420 perms/serializers/permission.py:66 -#: perms/serializers/user_permission.py:75 rbac/tree.py:35 +#: assets/serializers/asset/common.py:423 perms/serializers/permission.py:66 +#: perms/serializers/user_permission.py:76 rbac/tree.py:35 msgid "Accounts" msgstr "Аккаунт" #: accounts/models/application.py:22 authentication/models/access_key.py:20 -#: terminal/models/component/endpoint.py:113 +#: terminal/models/component/endpoint.py:107 msgid "IP group" msgstr "IP группа" #: accounts/models/application.py:23 #: authentication/backends/passkey/models.py:14 #: authentication/models/access_key.py:24 -#: authentication/models/private_token.py:8 authentication/models/ssh_key.py:20 +#: authentication/models/private_token.py:8 +#: authentication/models/ssh_key.py:20 msgid "Date last used" msgstr "Дата последнего использования" #: accounts/models/application.py:24 acls/models/base.py:43 -#: assets/models/asset/common.py:178 authentication/models/access_key.py:23 -#: authentication/models/connection_token.py:58 -#: authentication/models/ssh_key.py:13 authentication/serializers/ssh_key.py:23 +#: assets/models/asset/common.py:182 authentication/models/access_key.py:23 +#: authentication/models/connection_token.py:59 +#: authentication/models/ssh_key.py:13 +#: authentication/serializers/ssh_key.py:23 #: authentication/templates/authentication/_access_key_modal.html:32 -#: perms/models/asset_permission.py:82 terminal/models/component/endpoint.py:28 -#: terminal/models/component/endpoint.py:123 +#: perms/models/asset_permission.py:82 +#: terminal/models/component/endpoint.py:29 +#: terminal/models/component/endpoint.py:117 #: terminal/models/session/sharing.py:29 terminal/serializers/terminal.py:44 #: tickets/const.py:36 msgid "Active" @@ -736,8 +716,8 @@ msgstr "Проверка соединения после изменений" #: accounts/models/automations/check_account.py:19 #: accounts/models/automations/gather_account.py:117 #: accounts/serializers/automations/change_secret.py:59 -#: settings/serializers/auth/ldap.py:101 -#: settings/serializers/auth/ldap_ha.py:84 settings/serializers/msg.py:45 +#: settings/serializers/auth/ldap.py:105 +#: settings/serializers/auth/ldap_ha.py:87 settings/serializers/msg.py:45 msgid "Recipient" msgstr "Получатель" @@ -747,7 +727,7 @@ msgstr "Автоматизация изменения ключа" #: accounts/models/automations/change_secret.py:47 #: assets/models/automations/base.py:145 ops/models/base.py:56 -#: ops/models/celery.py:90 ops/models/job.py:240 +#: ops/models/celery.py:90 ops/models/job.py:242 #: terminal/models/applet/host.py:142 msgid "Date finished" msgstr "Дата окончания" @@ -758,11 +738,11 @@ msgstr "Дата окончания" #: accounts/serializers/automations/check_account.py:39 #: assets/models/automations/base.py:137 #: assets/serializers/automations/base.py:45 audits/models.py:209 -#: audits/serializers.py:78 ops/models/base.py:49 ops/models/job.py:231 -#: terminal/models/applet/applet.py:331 terminal/models/applet/host.py:140 +#: audits/serializers.py:77 ops/models/base.py:49 ops/models/job.py:233 +#: terminal/models/applet/applet.py:372 terminal/models/applet/host.py:140 #: terminal/models/component/status.py:30 #: terminal/models/virtualapp/virtualapp.py:99 -#: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:148 +#: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:163 #: terminal/serializers/virtualapp.py:35 tickets/models/ticket/general.py:284 #: tickets/serializers/super_ticket.py:13 #: tickets/serializers/ticket/ticket.py:20 xpack/plugins/cloud/models.py:227 @@ -771,7 +751,7 @@ msgid "Status" msgstr "Состояние" #: accounts/models/automations/change_secret.py:51 -#: accounts/serializers/account/account.py:276 +#: accounts/serializers/account/account.py:278 #: accounts/templates/accounts/change_secret_failed_info.html:13 #: assets/const/automation.py:9 #: authentication/templates/authentication/passkey.html:173 @@ -822,10 +802,8 @@ msgid "New found" msgstr "Новые находки" #: accounts/models/automations/check_account.py:45 -#, fuzzy -#| msgid "Account delete" msgid "Account deleted" -msgstr "Аккаунт удалён" +msgstr "Учётная запись удалена." #: accounts/models/automations/check_account.py:46 msgid "Groups change" @@ -872,9 +850,11 @@ msgstr "Повторяющийся пароль" #: accounts/templates/accounts/gather_account_report.html:118 #: accounts/templates/accounts/push_account_report.html:79 #: accounts/templates/accounts/push_account_report.html:119 -#: acls/serializers/base.py:19 acls/serializers/base.py:50 audits/models.py:189 -#: authentication/forms.py:21 authentication/forms.py:23 +#: acls/serializers/base.py:19 acls/serializers/base.py:50 +#: audits/models.py:189 authentication/forms.py:21 authentication/forms.py:23 #: authentication/models/temp_token.py:9 +#: authentication/serializers/connect_token_secret.py:43 +#: authentication/serializers/connect_token_secret.py:53 #: authentication/templates/authentication/_msg_different_city.html:9 #: authentication/templates/authentication/_msg_oauth_bind.html:9 #: authentication/templates/authentication/login.html:408 @@ -942,8 +922,8 @@ msgstr "Проверка, являются ли аккаунт и пароль #: accounts/models/automations/check_account.py:153 msgid "Check whether the account password is a commonly leaked password" msgstr "" -"Проверка, являются ли аккаунт и пароль частыми паролями, которые подверглись " -"утечке" +"Проверка, являются ли аккаунт и пароль частыми паролями, которые подверглись" +" утечке" #: accounts/models/automations/gather_account.py:19 msgid "Address login" @@ -998,11 +978,11 @@ msgid "Verify asset account" msgstr "Проверка аккаунта" #: accounts/models/base.py:37 accounts/models/base.py:66 -#: accounts/serializers/account/account.py:470 +#: accounts/serializers/account/account.py:471 #: accounts/serializers/account/base.py:17 #: accounts/serializers/automations/change_secret.py:48 #: authentication/serializers/connect_token_secret.py:42 -#: authentication/serializers/connect_token_secret.py:51 +#: authentication/serializers/connect_token_secret.py:52 #: terminal/serializers/storage.py:140 msgid "Secret type" msgstr "Тип зашифрованных данных" @@ -1019,7 +999,7 @@ msgstr "Правила паролей" #: accounts/models/base.py:69 assets/models/automations/base.py:28 #: assets/models/cmd_filter.py:39 assets/models/label.py:22 -#: authentication/serializers/connect_token_secret.py:117 +#: authentication/serializers/connect_token_secret.py:119 #: terminal/models/applet/applet.py:41 #: terminal/models/virtualapp/virtualapp.py:23 users/serializers/user.py:257 msgid "Is active" @@ -1099,8 +1079,8 @@ msgid "" "encryption password for preference settings" msgstr "" "{} - Задача резервного копирования аккаунта завершена: не установлен пароль " -"шифрования - пожалуйста, перейдите в Личную информацию -> Основные настройки " -"предпочтений и задайте пароль шифрования" +"шифрования - пожалуйста, перейдите в Личную информацию -> Основные настройки" +" предпочтений и задайте пароль шифрования" #: accounts/notifications.py:56 msgid "Notification of implementation result of encryption change plan" @@ -1119,8 +1099,8 @@ msgid "" "has not been set - please go to personal information -> set encryption " "password in preferences" msgstr "" -"{} - Задача по изменению пароля завершена: не установлен пароль шифрования - " -"пожалуйста, перейдите в Личную информацию -> Настройки предпочтений и " +"{} - Задача по изменению пароля завершена: не установлен пароль шифрования -" +" пожалуйста, перейдите в Личную информацию -> Настройки предпочтений и " "задайте пароль шифрования" #: accounts/notifications.py:83 @@ -1139,7 +1119,7 @@ msgstr "Игнорировать" msgid "Reopen" msgstr "Переоткрыть" -#: accounts/risk_handlers.py:19 audits/const.py:38 +#: accounts/risk_handlers.py:19 audits/const.py:39 #: authentication/templates/authentication/_access_key_modal.html:155 #: authentication/templates/authentication/_mfa_confirm_modal.html:53 #: templates/_modal.html:22 tickets/const.py:43 @@ -1167,15 +1147,13 @@ msgstr "Добавить аккаунт" msgid "Change password and Add" msgstr "Изменить пароль и добавить" -#: accounts/risk_handlers.py:26 audits/const.py:31 ops/const.py:9 +#: accounts/risk_handlers.py:26 audits/const.py:32 ops/const.py:9 msgid "Change password" msgstr "Изменить пароль" #: accounts/risk_handlers.py:127 -#, fuzzy -#| msgid "Test connection failed: {}" msgid "Execution failed: {}" -msgstr "Ошибка соединения: {}" +msgstr "Не удалось выполнить: {}" #: accounts/serializers/account/account.py:31 msgid "Push now" @@ -1192,7 +1170,7 @@ msgstr "Аккаунт уже существует в политике" #: accounts/serializers/account/account.py:206 assets/models/label.py:21 #: assets/models/platform.py:95 assets/serializers/asset/common.py:145 #: assets/serializers/cagegory.py:12 assets/serializers/platform.py:173 -#: assets/serializers/platform.py:279 perms/serializers/user_permission.py:26 +#: assets/serializers/platform.py:284 perms/serializers/user_permission.py:26 #: settings/models.py:39 tickets/models/ticket/apply_application.py:13 #: users/models/preference.py:12 msgid "Category" @@ -1203,11 +1181,11 @@ msgstr "Категория" #: assets/models/automations/base.py:146 assets/models/cmd_filter.py:74 #: assets/models/platform.py:96 assets/serializers/asset/common.py:146 #: assets/serializers/platform.py:160 assets/serializers/platform.py:172 -#: audits/serializers.py:77 audits/serializers.py:194 -#: authentication/models/connection_token.py:62 -#: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:153 -#: perms/serializers/user_permission.py:27 terminal/models/applet/applet.py:40 -#: terminal/models/component/storage.py:58 +#: audits/serializers.py:76 audits/serializers.py:196 +#: authentication/models/connection_token.py:63 +#: authentication/serializers/connect_token_secret.py:128 +#: ops/models/job.py:155 perms/serializers/user_permission.py:27 +#: terminal/models/applet/applet.py:40 terminal/models/component/storage.py:58 #: terminal/models/component/storage.py:152 terminal/serializers/applet.py:29 #: terminal/serializers/session.py:25 terminal/serializers/storage.py:281 #: terminal/serializers/storage.py:294 tickets/models/comment.py:26 @@ -1217,66 +1195,73 @@ msgstr "Категория" msgid "Type" msgstr "Тип" -#: accounts/serializers/account/account.py:222 +#: accounts/serializers/account/account.py:223 msgid "Asset not found" msgstr "Актив не существует" -#: accounts/serializers/account/account.py:265 +#: accounts/serializers/account/account.py:236 assets/const/category.py:15 +#: assets/models/asset/common.py:180 assets/models/asset/ds.py:14 +#: assets/serializers/asset/common.py:180 +msgid "Directory service" +msgstr "Служба каталогов" + +#: accounts/serializers/account/account.py:267 msgid "Has secret" msgstr "Пароль уже сохранен" -#: accounts/serializers/account/account.py:275 ops/models/celery.py:84 +#: accounts/serializers/account/account.py:277 ops/models/celery.py:84 #: tickets/models/comment.py:13 tickets/models/ticket/general.py:49 #: tickets/models/ticket/general.py:280 tickets/serializers/super_ticket.py:14 msgid "State" msgstr "Состояние" -#: accounts/serializers/account/account.py:277 +#: accounts/serializers/account/account.py:279 msgid "Changed" msgstr "Изменено" -#: accounts/serializers/account/account.py:287 acls/models/base.py:97 +#: accounts/serializers/account/account.py:289 acls/models/base.py:97 #: acls/templates/acls/asset_login_reminder.html:9 #: assets/models/automations/base.py:25 -#: assets/serializers/automations/base.py:20 assets/serializers/domain.py:34 +#: assets/serializers/automations/base.py:20 assets/serializers/domain.py:33 #: assets/serializers/platform.py:181 assets/serializers/platform.py:213 -#: authentication/api/connection_token.py:463 ops/models/base.py:17 -#: ops/models/job.py:155 ops/serializers/job.py:21 +#: authentication/api/connection_token.py:462 ops/models/base.py:17 +#: ops/models/job.py:157 ops/serializers/job.py:21 #: perms/serializers/permission.py:57 #: terminal/templates/terminal/_msg_command_execute_alert.html:16 #: xpack/plugins/cloud/manager.py:93 msgid "Assets" msgstr "Активы" -#: accounts/serializers/account/account.py:392 +#: accounts/serializers/account/account.py:394 #, python-format msgid "Asset does not support this secret type: %s" msgstr "Тип аккаунта не поддерживает активы: %s" -#: accounts/serializers/account/account.py:424 +#: accounts/serializers/account/account.py:426 msgid "Account has exist" msgstr "Аккаунт уже существует" -#: accounts/serializers/account/account.py:461 +#: accounts/serializers/account/account.py:463 #: accounts/serializers/account/base.py:86 #: accounts/serializers/account/template.py:66 -#: assets/serializers/asset/common.py:421 +#: assets/serializers/asset/common.py:424 msgid "Spec info" msgstr "Специальная информация" -#: accounts/serializers/account/account.py:471 -#: authentication/serializers/connect_token_secret.py:160 +#: accounts/serializers/account/account.py:472 +#: authentication/serializers/connect_token_secret.py:162 #: authentication/templates/authentication/_access_key_modal.html:30 #: perms/models/perm_node.py:21 users/serializers/group.py:33 msgid "ID" msgstr "ID" -#: accounts/serializers/account/account.py:481 acls/serializers/base.py:123 +#: accounts/serializers/account/account.py:482 acls/serializers/base.py:123 #: acls/templates/acls/asset_login_reminder.html:8 #: acls/templates/acls/user_login_reminder.html:8 -#: assets/models/cmd_filter.py:24 assets/models/label.py:16 audits/models.py:55 -#: audits/models.py:91 audits/models.py:173 audits/models.py:272 -#: audits/serializers.py:195 authentication/models/connection_token.py:36 +#: assets/models/cmd_filter.py:24 assets/models/label.py:16 +#: audits/models.py:55 audits/models.py:91 audits/models.py:173 +#: audits/models.py:272 audits/serializers.py:197 +#: authentication/models/connection_token.py:37 #: authentication/models/ssh_key.py:22 authentication/models/sso_token.py:16 #: notifications/models/notification.py:12 #: perms/api/user_permission/mixin.py:58 perms/models/asset_permission.py:63 @@ -1293,7 +1278,7 @@ msgstr "ID" msgid "User" msgstr "Пользователь" -#: accounts/serializers/account/account.py:482 +#: accounts/serializers/account/account.py:483 #: authentication/templates/authentication/_access_key_modal.html:33 #: terminal/notifications.py:159 terminal/notifications.py:219 msgid "Date" @@ -1311,19 +1296,19 @@ msgstr "" "Подсказка: если для проверки не требуется имя пользователя, укажите null, " "если это аккаунт AD, формат должен быть username@domain" -#: accounts/serializers/account/service.py:13 +#: accounts/serializers/account/service.py:14 #: authentication/serializers/token.py:22 msgid "Access IP" msgstr "IP белый список" -#: accounts/serializers/account/service.py:26 +#: accounts/serializers/account/service.py:27 #: accounts/serializers/account/virtual.py:19 assets/models/cmd_filter.py:40 -#: assets/models/cmd_filter.py:88 common/db/models.py:36 ops/models/adhoc.py:25 -#: ops/models/job.py:163 ops/models/playbook.py:31 rbac/models/role.py:37 -#: settings/models.py:42 terminal/models/applet/applet.py:46 -#: terminal/models/applet/applet.py:332 terminal/models/applet/host.py:143 -#: terminal/models/component/endpoint.py:27 -#: terminal/models/component/endpoint.py:122 +#: assets/models/cmd_filter.py:88 common/db/models.py:36 +#: ops/models/adhoc.py:25 ops/models/job.py:165 ops/models/playbook.py:31 +#: rbac/models/role.py:37 settings/models.py:42 +#: terminal/models/applet/applet.py:46 terminal/models/applet/applet.py:373 +#: terminal/models/applet/host.py:143 terminal/models/component/endpoint.py:28 +#: terminal/models/component/endpoint.py:116 #: terminal/models/session/session.py:49 #: terminal/models/virtualapp/virtualapp.py:28 tickets/models/comment.py:32 #: tickets/models/ticket/general.py:298 users/models/user/__init__.py:94 @@ -1331,9 +1316,9 @@ msgstr "IP белый список" msgid "Comment" msgstr "Комментарий" -#: accounts/serializers/account/service.py:28 +#: accounts/serializers/account/service.py:29 #: accounts/templates/accounts/backup_account_report.html:33 -#: assets/serializers/asset/common.py:151 +#: assets/serializers/asset/common.py:152 msgid "Accounts amount" msgstr "Количество аккаунтов" @@ -1368,21 +1353,18 @@ msgid "" "length is the length of the password, and the range is 8 to 30.\n" "lowercase indicates whether the password contains lowercase letters, \n" "uppercase indicates whether it contains uppercase letters,\n" -"digit indicates whether it contains numbers, and symbol indicates whether it " -"contains special symbols.\n" -"exclude_symbols is used to exclude specific symbols. You can fill in the " -"symbol characters to be excluded (up to 16). \n" +"digit indicates whether it contains numbers, and symbol indicates whether it contains special symbols.\n" +"exclude_symbols is used to exclude specific symbols. You can fill in the symbol characters to be excluded (up to 16). \n" "If you do not need to exclude symbols, you can leave it blank.\n" -"default: {\"length\": 16, \"lowercase\": true, \"uppercase\": true, " -"\"digit\": true, \"symbol\": true, \"exclude_symbols\": \"\"}" +"default: {\"length\": 16, \"lowercase\": true, \"uppercase\": true, \"digit\": true, \"symbol\": true, \"exclude_symbols\": \"\"}" msgstr "" "length - это длина пароля, укажите диапазон от 8 до 30. lowercase " "обозначает, присутствуют ли в пароле строчные буквы, uppercase указывает, " "содержатся ли заглавные буквы, digit показывает, есть ли цифры, symbol " "обозначает наличие специальных символов. exclude_symbols предназначен для " -"исключения определенных символов, вы можете указать символы, которые следует " -"исключить (не более 16), если исключать ничего не нужно, оставьте пустым. По " -"умолчанию: {\"length\": 16, \"lowercase\": true, \"uppercase\": true, " +"исключения определенных символов, вы можете указать символы, которые следует" +" исключить (не более 16), если исключать ничего не нужно, оставьте пустым. " +"По умолчанию: {\"length\": 16, \"lowercase\": true, \"uppercase\": true, " "\"digit\": true, \"symbol\": true, \"exclude_symbols\": \"\"}" #: accounts/serializers/account/template.py:47 @@ -1407,8 +1389,8 @@ msgid "" "asset secret > Login secret > Manual input.
For security, please set " "config CACHE_LOGIN_PASSWORD_ENABLED to true" msgstr "" -"В настоящее время поддерживается только вход через AD/LDAP. Порядок действия " -"для одинаковых аккаунтов с одинаковым названием: пароль аккаунта, " +"В настоящее время поддерживается только вход через AD/LDAP. Порядок действия" +" для одинаковых аккаунтов с одинаковым названием: пароль аккаунта, " "существующий в активах > пароль для входа > ручной ввод
Для " "безопасности, пожалуйста, установите параметр " "CACHE_LOGIN_PASSWORD_ENABLED=true, перезапустите службу для активации" @@ -1454,8 +1436,8 @@ msgid "" "Secret parameter settings, currently only effective for assets of the host " "type." msgstr "" -"Настройки параметров, в данный момент действуют только для активов типа AIX, " -"LINUX и UNIX." +"Настройки параметров, в данный момент действуют только для активов типа AIX," +" LINUX и UNIX." #: accounts/serializers/automations/change_secret.py:86 msgid "* Please enter the correct password length" @@ -1505,12 +1487,9 @@ msgstr "Выполнение автоматизации аккаунта" #: accounts/tasks/automation.py:35 msgid "" -"Unified execution entry for account automation tasks: when the system " -"performs tasks \n" -" such as account push, password change, account verification, account " -"collection, \n" -" and gateway account verification, all tasks are executed through " -"this unified entry" +"Unified execution entry for account automation tasks: when the system performs tasks \n" +" such as account push, password change, account verification, account collection, \n" +" and gateway account verification, all tasks are executed through this unified entry" msgstr "" "Единый вход для выполнения автоматизированных задач аккаунта, когда система " "выполняет задачи по загрузке аккаунтов, изменению пароля, проверке " @@ -1532,27 +1511,20 @@ msgstr "Периодическая очистка записей изменен #: accounts/tasks/automation.py:98 msgid "" -"The system will periodically clean up unnecessary password change and push " -"records, \n" -" including their associated change tasks, execution logs, assets, and " -"accounts. When any \n" -" of these associated items are deleted, the corresponding password " -"change and push records \n" -" become invalid. Therefore, to maintain a clean and efficient " -"database, the system will \n" -" clean up expired records at 2 a.m daily, based on the interval " -"specified by \n" -" PERM_EXPIRED_CHECK_PERIODIC in the config.txt configuration file. " -"This periodic cleanup \n" -" mechanism helps free up storage space and enhances the security and " -"overall performance \n" +"The system will periodically clean up unnecessary password change and push records, \n" +" including their associated change tasks, execution logs, assets, and accounts. When any \n" +" of these associated items are deleted, the corresponding password change and push records \n" +" become invalid. Therefore, to maintain a clean and efficient database, the system will \n" +" clean up expired records at 2 a.m daily, based on the interval specified by \n" +" PERM_EXPIRED_CHECK_PERIODIC in the config.txt configuration file. This periodic cleanup \n" +" mechanism helps free up storage space and enhances the security and overall performance \n" " of data management" msgstr "" "Система регулярно очищает ненужные записи изменений паролей и записи " -"отправки, включая те, которые связаны с задачами изменения паролей, записями " -"выполненных действий, активами и учетными записями. Когда один из этих " -"связанных элементов будет удален, соответствующие записи об изменении пароля " -"и отправке станут недействительными. Поэтому, для поддержания чистоты и " +"отправки, включая те, которые связаны с задачами изменения паролей, записями" +" выполненных действий, активами и учетными записями. Когда один из этих " +"связанных элементов будет удален, соответствующие записи об изменении пароля" +" и отправке станут недействительными. Поэтому, для поддержания чистоты и " "эффективного функционирования базы данных, в соответствии с временным " "интервалом PERM_EXPIRED_CHECK_PERIODIC в конфигурационном файле system " "config.txt, производится очистка неприменимых записей ежедневно в 2 часа " @@ -1574,8 +1546,7 @@ msgstr "" #: accounts/tasks/remove_account.py:28 msgid "" -"When clicking \"Sync deletion\" in 'Console - Gather Account - Gathered " -"accounts' this \n" +"When clicking \"Sync deletion\" in 'Console - Gather Account - Gathered accounts' this \n" " task will be executed" msgstr "" "В консоли - Сбор учетных записей - Щелкните «Синхронизировать удаление» для " @@ -1587,19 +1558,16 @@ msgstr "Очистка исторических учетных записей" #: accounts/tasks/remove_account.py:52 msgid "" -"Each time an asset account is updated, a historical account is generated, so " -"it is \n" -" necessary to clean up the asset account history. The system will " -"clean up excess account \n" -" records at 2 a.m. daily based on the configuration in the \"System " -"settings - Features - \n" +"Each time an asset account is updated, a historical account is generated, so it is \n" +" necessary to clean up the asset account history. The system will clean up excess account \n" +" records at 2 a.m. daily based on the configuration in the \"System settings - Features - \n" " Account storage - Record limit" msgstr "" -"Поскольку при каждом обновлении учетной записи актива создаются исторические " -"учетные записи, необходимо очистить историю учетных записей активов. Система " -"будет очищать записи учетных записей, превышающие установленный лимит, " -"ежедневно в 2 часа ночи в соответствии с конфигурацией хранения учетных " -"записей" +"Поскольку при каждом обновлении учетной записи актива создаются исторические" +" учетные записи, необходимо очистить историю учетных записей активов. " +"Система будет очищать записи учетных записей, превышающие установленный " +"лимит, ежедневно в 2 часа ночи в соответствии с конфигурацией хранения " +"учетных записей" #: accounts/tasks/remove_account.py:89 msgid "Remove historical accounts that are out of range." @@ -1611,8 +1579,7 @@ msgstr "Синхронизация информации с связанными #: accounts/tasks/template.py:14 msgid "" -"When clicking 'Sync new secret to accounts' in 'Console - Account - " -"Templates - \n" +"When clicking 'Sync new secret to accounts' in 'Console - Account - Templates - \n" " Accounts' this task will be executed" msgstr "" "Когда в консоли - Шаблоны учетных записей - Учетные записи - Щелкните " @@ -1675,7 +1642,7 @@ msgstr "Название задачи" #: accounts/templates/accounts/gather_account_report.html:21 #: accounts/templates/accounts/push_account_report.html:22 #: assets/models/automations/base.py:143 audits/models.py:66 -#: ops/models/base.py:55 ops/models/celery.py:89 ops/models/job.py:239 +#: ops/models/base.py:55 ops/models/celery.py:89 ops/models/job.py:241 #: ops/templates/ops/celery_task_log.html:101 #: perms/models/asset_permission.py:78 settings/serializers/feature.py:27 #: settings/templates/ldap/_msg_import_ldap_user.html:5 @@ -1728,7 +1695,7 @@ msgstr "" #: accounts/templates/accounts/change_secret_report.html:33 #: accounts/templates/accounts/gather_account_report.html:31 #: accounts/templates/accounts/push_account_report.html:32 -#: assets/serializers/domain.py:24 assets/serializers/platform.py:182 +#: assets/serializers/domain.py:23 assets/serializers/platform.py:182 #: orgs/serializers.py:13 perms/serializers/permission.py:61 msgid "Assets amount" msgstr "Количество активов" @@ -1767,7 +1734,6 @@ msgstr "Нет" #: accounts/templates/accounts/change_secret_report.html:94 #: accounts/templates/accounts/change_secret_report.html:134 #: accounts/templates/accounts/gather_account_report.html:92 -#: accounts/templates/accounts/gather_account_report.html:132 #: accounts/templates/accounts/push_account_report.html:93 #: accounts/templates/accounts/push_account_report.html:133 msgid "No new accounts found" @@ -1796,10 +1762,14 @@ msgstr "Новые обнаруженные аккаунты" msgid "Lost accounts" msgstr "Потерянные аккаунты" +#: accounts/templates/accounts/gather_account_report.html:132 +msgid "No lost accounts found" +msgstr "Не найдена потерянная учётная запись." + #: accounts/utils.py:54 msgid "" -"If the password starts with {{` and ends with }} `, then the password is not " -"allowed." +"If the password starts with {{` and ends with }} `, then the password is not" +" allowed." msgstr "" "Если пароль начинается с `{{` и заканчивается на `}}`, такой пароль не " "разрешен." @@ -1812,16 +1782,16 @@ msgstr "Ключ недействителен или неправильный п msgid "App Acls" msgstr "Контроль доступа" -#: acls/const.py:6 audits/const.py:36 terminal/const.py:11 tickets/const.py:44 +#: acls/const.py:6 audits/const.py:37 terminal/const.py:11 tickets/const.py:44 #: tickets/templates/tickets/approve_check_password.html:47 msgid "Reject" msgstr "Отказ" -#: acls/const.py:7 audits/const.py:33 terminal/const.py:9 +#: acls/const.py:7 audits/const.py:34 terminal/const.py:9 msgid "Accept" msgstr "Принято" -#: acls/const.py:8 audits/const.py:34 +#: acls/const.py:8 audits/const.py:35 msgid "Review" msgstr "Утверждение" @@ -1834,7 +1804,7 @@ msgid "Notify" msgstr "Уведомление" #: acls/const.py:11 -msgid "Notify and warn" +msgid "Prompt and warn" msgstr "Подсказка и тревога" #: acls/const.py:12 @@ -1846,18 +1816,19 @@ msgid "Face Online" msgstr "Лицо онлайн" #: acls/models/base.py:37 assets/models/cmd_filter.py:76 -#: terminal/models/component/endpoint.py:115 xpack/plugins/cloud/models.py:316 +#: terminal/models/component/endpoint.py:109 xpack/plugins/cloud/models.py:316 msgid "Priority" msgstr "Приоритет" #: acls/models/base.py:38 assets/models/cmd_filter.py:76 -#: terminal/models/component/endpoint.py:116 xpack/plugins/cloud/models.py:317 +#: terminal/models/component/endpoint.py:110 xpack/plugins/cloud/models.py:317 msgid "1-100, the lower the value will be match first" msgstr "Диапазон приоритетов: 1-100 (меньшее число - более высокий приоритет)" #: acls/models/base.py:41 acls/serializers/base.py:57 -#: assets/models/cmd_filter.py:81 audits/models.py:93 audits/serializers.py:108 -#: authentication/serializers/connect_token_secret.py:119 +#: assets/models/cmd_filter.py:81 audits/models.py:93 +#: audits/serializers.py:107 +#: authentication/serializers/connect_token_secret.py:121 #: authentication/templates/authentication/_access_key_modal.html:34 #: perms/serializers/permission.py:63 perms/serializers/permission.py:85 #: tickets/serializers/ticket/ticket.py:21 @@ -1865,7 +1836,7 @@ msgid "Action" msgstr "Action" #: acls/models/base.py:42 assets/models/cmd_filter.py:86 -#: authentication/serializers/connect_token_secret.py:91 +#: authentication/serializers/connect_token_secret.py:93 msgid "Reviewers" msgstr "Утвердитель" @@ -1876,7 +1847,7 @@ msgid "Users" msgstr "Пользователь" #: acls/models/command_acl.py:16 assets/models/cmd_filter.py:60 -#: audits/serializers.py:38 ops/serializers/job.py:92 terminal/const.py:88 +#: ops/serializers/job.py:92 terminal/const.py:88 #: terminal/models/session/session.py:45 terminal/serializers/command.py:18 #: terminal/templates/terminal/_msg_command_alert.html:12 #: terminal/templates/terminal/_msg_command_execute_alert.html:10 @@ -1905,7 +1876,7 @@ msgstr "Игнорировать регистр" #: acls/models/command_acl.py:33 acls/models/command_acl.py:97 #: acls/serializers/command_acl.py:29 -#: authentication/serializers/connect_token_secret.py:88 +#: authentication/serializers/connect_token_secret.py:90 #: terminal/templates/terminal/_msg_command_warning.html:14 msgid "Command group" msgstr "Группа команд" @@ -1970,9 +1941,9 @@ msgid "" "10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64 (Domain name " "support)" msgstr "" -"* Знак * означает соответствие всем. Например: 192.168.10.1, 192.168.1.0/24, " -"10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64 (поддерживается " -"домен)" +"* Знак * означает соответствие всем. Например: 192.168.10.1, 192.168.1.0/24," +" 10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64 " +"(поддерживается домен)" #: acls/serializers/base.py:41 assets/serializers/asset/host.py:19 msgid "IP/Host" @@ -2000,14 +1971,14 @@ msgid "" "With * indicating a match all. Such as: 192.168.10.1, 192.168.1.0/24, " "10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64 " msgstr "" -"* Знак * означает соответствие всем. Например: 192.168.10.1, 192.168.1.0/24, " -"10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64" +"* Знак * означает соответствие всем. Например: 192.168.10.1, 192.168.1.0/24," +" 10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64" #: acls/serializers/rules/rules.py:33 #: authentication/templates/authentication/_msg_oauth_bind.html:12 #: authentication/templates/authentication/_msg_rest_password_success.html:8 #: authentication/templates/authentication/_msg_rest_public_key_success.html:8 -#: common/drf/renders/base.py:150 xpack/plugins/cloud/models.py:393 +#: common/drf/renders/base.py:152 xpack/plugins/cloud/models.py:393 msgid "IP" msgstr "IP" @@ -2044,7 +2015,8 @@ msgid "" msgstr "" "Пожалуйста, проверьте это действие входа, чтобы обеспечить безопасность и " "правильное использование актива. Если вы не авторизовали этот вход или " -"заметили какие-либо подозрительные действия, срочно примите необходимые меры." +"заметили какие-либо подозрительные действия, срочно примите необходимые " +"меры." #: acls/templates/acls/asset_login_reminder.html:16 #: acls/templates/acls/user_login_reminder.html:16 @@ -2067,15 +2039,15 @@ msgid "Login city" msgstr "Город входа" #: acls/templates/acls/user_login_reminder.html:11 audits/models.py:198 -#: audits/models.py:267 audits/serializers.py:92 +#: audits/models.py:267 audits/serializers.py:91 msgid "User agent" msgstr "Пользовательский агент" -#: assets/api/asset/asset.py:194 +#: assets/api/asset/asset.py:153 msgid "Cannot create asset directly, you should create a host or other" msgstr "Нельзя напрямую создать актив, следует создать хост или другой актив" -#: assets/api/asset/asset.py:198 +#: assets/api/asset/asset.py:157 msgid "The number of assets exceeds the limit of 5000" msgstr "Количество активов превышает предел в 5000" @@ -2107,34 +2079,34 @@ msgstr "Управление активами" msgid "Task: {} finished" msgstr "Задача: {} Выполнено" -#: assets/automations/base/manager.py:338 +#: assets/automations/base/manager.py:339 msgid " - Platform {} ansible disabled" msgstr "- Платформа {} Ansible отключена, невозможно выполнить задачу" -#: assets/automations/base/manager.py:524 +#: assets/automations/base/manager.py:525 msgid ">>> Task preparation phase" msgstr ">>> Подготовительный этап задания" -#: assets/automations/base/manager.py:528 +#: assets/automations/base/manager.py:529 #, python-brace-format msgid ">>> Executing tasks in batches, total {runner_count}" msgstr ">>> Пошаговое выполнение задания, всего {runner_count}" -#: assets/automations/base/manager.py:533 +#: assets/automations/base/manager.py:534 msgid ">>> Start executing tasks" msgstr ">>> Начало выполнения задания" -#: assets/automations/base/manager.py:535 +#: assets/automations/base/manager.py:536 msgid ">>> No tasks need to be executed" msgstr ">>> Нет задач для выполнения" -#: assets/automations/base/manager.py:539 +#: assets/automations/base/manager.py:540 #, python-brace-format msgid ">>> Begin executing batch {index} of tasks" msgstr ">>> Начинаем выполнение первой партии задач {index}" #: assets/automations/ping_gateway/manager.py:33 -#: authentication/models/connection_token.py:145 +#: authentication/models/connection_token.py:176 msgid "No account" msgstr "Нет аккаунта" @@ -2161,7 +2133,7 @@ msgstr "Не удалось подключиться" msgid ">>> Start executing the task to test gateway connectivity" msgstr ">>> Начинаем выполнение задачи по тестированию доступности шлюза" -#: assets/const/automation.py:6 audits/const.py:6 audits/const.py:47 +#: assets/const/automation.py:6 audits/const.py:6 audits/const.py:48 #: audits/signal_handlers/activity_log.py:63 common/utils/ip/geoip/utils.py:31 #: common/utils/ip/geoip/utils.py:37 common/utils/ip/utils.py:104 msgid "Unknown" @@ -2187,7 +2159,7 @@ msgstr "Тестирование шлюза" msgid "Gather facts" msgstr "Сбор информации об активах" -#: assets/const/base.py:32 audits/const.py:58 +#: assets/const/base.py:32 audits/const.py:59 #: terminal/serializers/applet_host.py:32 users/models/user/_auth.py:31 msgid "Disabled" msgstr "Отключить" @@ -2221,12 +2193,12 @@ msgid "Cloud service" msgstr "Облачные услуги" #: assets/const/category.py:14 assets/models/asset/gpt.py:11 -#: assets/models/asset/web.py:16 audits/const.py:45 +#: assets/models/asset/web.py:16 audits/const.py:46 #: terminal/models/applet/applet.py:28 users/const.py:76 msgid "Web" msgstr "Веб" -#: assets/const/category.py:15 common/sdk/sms/endpoint.py:20 +#: assets/const/category.py:16 common/sdk/sms/endpoint.py:20 msgid "Custom type" msgstr "Пользовательский тип" @@ -2262,8 +2234,8 @@ msgstr "" msgid "TP-Link" msgstr "" -#: assets/const/device.py:12 terminal/models/applet/applet.py:27 -#: tickets/const.py:9 +#: assets/const/device.py:12 assets/const/ds.py:7 +#: terminal/models/applet/applet.py:27 tickets/const.py:9 msgid "General" msgstr "Обычный" @@ -2279,6 +2251,10 @@ msgstr "Маршрутизатор" msgid "Firewall" msgstr "Брандмауэр" +#: assets/const/ds.py:10 +msgid "Windows Active Directory" +msgstr "" + #: assets/const/gpt.py:7 msgid "ChatGPT" msgstr "ChatGPT" @@ -2332,14 +2308,14 @@ msgid "Any" msgstr "Любой" #: assets/const/protocol.py:88 rbac/tree.py:62 -#: settings/serializers/security.py:241 +#: settings/serializers/security.py:245 msgid "Security" msgstr "Безопасный" #: assets/const/protocol.py:89 msgid "" -"Security layer to use for the connection:
Any
Automatically select the " -"security mode based on the security protocols supported by both the client " +"Security layer to use for the connection:
Any
Automatically select the" +" security mode based on the security protocols supported by both the client " "and the server
RDP
Legacy RDP encryption. This mode is generally only " "used for older Windows servers or in cases where a standard Windows login " "screen is desired
TLS
RDP authentication and encryption implemented " @@ -2349,9 +2325,9 @@ msgstr "" "Уровень безопасности соединения:
Any
Автоматически выбирает режим " "безопасности в зависимости от поддерживаемых клиентом и сервером протоколов " "безопасности
RDP
Традиционный режим шифрования RDP. Обычно " -"используется только для старых серверов Windows или случаев, когда требуется " -"стандартный экран входа в Windows
TLS
Аутентификация и шифрование RDP " -"через TLS
NLA
Этот режим использует шифрование TLS и требует " +"используется только для старых серверов Windows или случаев, когда требуется" +" стандартный экран входа в Windows
TLS
Аутентификация и шифрование RDP" +" через TLS
NLA
Этот режим использует шифрование TLS и требует " "предварительного ввода имени пользователя и пароля" #: assets/const/protocol.py:106 @@ -2410,7 +2386,7 @@ msgstr "база данных для аутентификации" msgid "The database to authenticate against" msgstr "база данных, которую нужно аутентифицировать" -#: assets/const/protocol.py:232 authentication/models/connection_token.py:47 +#: assets/const/protocol.py:232 authentication/models/connection_token.py:48 msgid "Connect options" msgstr "параметры подключения" @@ -2458,7 +2434,7 @@ msgstr "Выбор кнопки подтверждения" msgid "API mode" msgstr "API режим" -#: assets/const/types.py:249 +#: assets/const/types.py:252 msgid "All types" msgstr "Все типы" @@ -2481,15 +2457,15 @@ msgstr "Облачные услуги" msgid "Port" msgstr "Порт" -#: assets/models/asset/common.py:167 assets/serializers/asset/common.py:172 +#: assets/models/asset/common.py:167 assets/serializers/asset/common.py:174 #: settings/serializers/terminal.py:10 msgid "Address" msgstr "Адрес" -#: assets/models/asset/common.py:169 assets/models/platform.py:149 +#: assets/models/asset/common.py:169 assets/models/platform.py:155 #: assets/serializers/asset/common.py:150 #: authentication/backends/passkey/models.py:12 -#: authentication/serializers/connect_token_secret.py:118 +#: authentication/serializers/connect_token_secret.py:120 #: perms/serializers/user_permission.py:25 xpack/plugins/cloud/models.py:387 msgid "Platform" msgstr "Платформа" @@ -2498,34 +2474,34 @@ msgstr "Платформа" msgid "Zone" msgstr "Домен" -#: assets/models/asset/common.py:176 assets/serializers/asset/common.py:174 +#: assets/models/asset/common.py:176 assets/serializers/asset/common.py:176 #: assets/serializers/automations/base.py:21 ops/serializers/job.py:22 #: perms/serializers/permission.py:58 msgid "Nodes" msgstr "Узел" -#: assets/models/asset/common.py:179 assets/serializers/asset/common.py:422 +#: assets/models/asset/common.py:183 assets/serializers/asset/common.py:425 #: assets/serializers/asset/host.py:11 msgid "Gathered info" msgstr "Сбор информации об аппаратных активах" -#: assets/models/asset/common.py:180 assets/serializers/asset/custom.py:14 +#: assets/models/asset/common.py:184 assets/serializers/asset/custom.py:14 msgid "Custom info" msgstr "Пользовательские атрибуты" -#: assets/models/asset/common.py:369 +#: assets/models/asset/common.py:431 msgid "Can refresh asset hardware info" msgstr "Можно обновить информацию об аппаратных активах" -#: assets/models/asset/common.py:370 +#: assets/models/asset/common.py:432 msgid "Can test asset connectivity" msgstr "Можно протестировать подключение к активам" -#: assets/models/asset/common.py:371 +#: assets/models/asset/common.py:433 msgid "Can match asset" msgstr "Можно сопоставить активы" -#: assets/models/asset/common.py:372 +#: assets/models/asset/common.py:434 msgid "Can change asset nodes" msgstr "Можно изменить узел актива" @@ -2553,19 +2529,23 @@ msgstr "Игнорировать проверку сертификата" msgid "Postgresql SSL mode" msgstr "Режим SSL PostgreSQL" +#: assets/models/asset/ds.py:10 assets/serializers/asset/ds.py:20 +msgid "Domain name" +msgstr "Имя домена" + #: assets/models/asset/gpt.py:8 settings/serializers/feature.py:139 #: settings/serializers/feature.py:154 msgid "Proxy" msgstr "Прокси" #: assets/models/automations/base.py:23 assets/models/cmd_filter.py:32 -#: assets/models/node.py:553 ops/models/job.py:156 +#: assets/models/node.py:553 ops/models/job.py:158 #: perms/models/asset_permission.py:72 tickets/models/ticket/apply_asset.py:15 #: xpack/plugins/cloud/models.py:388 msgid "Node" msgstr "Узел" -#: assets/models/automations/base.py:29 ops/models/job.py:234 +#: assets/models/automations/base.py:29 ops/models/job.py:236 #: ops/serializers/job.py:24 settings/serializers/auth/sms.py:108 msgid "Parameters" msgstr "Параметры" @@ -2583,7 +2563,7 @@ msgid "Asset automation task" msgstr "Автоматизация активов" #: assets/models/automations/base.py:140 assets/models/cmd_filter.py:41 -#: common/db/models.py:34 ops/models/base.py:54 ops/models/job.py:238 +#: common/db/models.py:34 ops/models/base.py:54 ops/models/job.py:240 #: users/models/user/__init__.py:317 msgid "Date created" msgstr "Дата создания" @@ -2594,14 +2574,14 @@ msgstr "Дата создания" msgid "Trigger mode" msgstr "Модель срабатывания" -#: assets/models/automations/base.py:157 audits/serializers.py:39 -#: ops/models/base.py:52 ops/models/job.py:236 +#: assets/models/automations/base.py:157 audits/serializers.py:38 +#: ops/models/base.py:52 ops/models/job.py:238 #: xpack/plugins/cloud/manager.py:103 msgid "Summary" msgstr "Сводка" #: assets/models/automations/base.py:158 ops/models/base.py:51 -#: ops/models/job.py:235 xpack/plugins/cloud/models.py:225 +#: ops/models/job.py:237 xpack/plugins/cloud/models.py:225 msgid "Result" msgstr "Результат" @@ -2665,7 +2645,7 @@ msgstr "Правила фильтрации команд" msgid "Favorite asset" msgstr "Избранные активы" -#: assets/models/gateway.py:34 assets/serializers/domain.py:19 +#: assets/models/gateway.py:34 assets/serializers/domain.py:18 msgid "Gateway" msgstr "Шлюз" @@ -2676,8 +2656,8 @@ msgstr "Система" #: assets/models/label.py:19 assets/models/node.py:539 #: assets/serializers/cagegory.py:11 assets/serializers/cagegory.py:18 #: assets/serializers/cagegory.py:24 -#: authentication/models/connection_token.py:33 -#: authentication/serializers/connect_token_secret.py:125 +#: authentication/models/connection_token.py:34 +#: authentication/serializers/connect_token_secret.py:127 #: common/serializers/common.py:86 labels/models.py:12 settings/models.py:38 #: users/models/preference.py:13 msgid "Value" @@ -2686,7 +2666,7 @@ msgstr "Значение" #: assets/models/label.py:40 assets/serializers/cagegory.py:10 #: assets/serializers/cagegory.py:17 assets/serializers/cagegory.py:23 #: assets/serializers/platform.py:159 -#: authentication/serializers/connect_token_secret.py:124 +#: authentication/serializers/connect_token_secret.py:126 #: common/serializers/common.py:85 labels/serializers.py:45 #: settings/serializers/msg.py:90 xpack/plugins/cloud/models.py:392 msgid "Label" @@ -2752,7 +2732,7 @@ msgstr "общий" msgid "Setting" msgstr "настройки" -#: assets/models/platform.py:38 audits/const.py:59 +#: assets/models/platform.py:38 audits/const.py:60 #: authentication/backends/passkey/models.py:11 settings/models.py:41 #: terminal/serializers/applet_host.py:33 users/models/user/_auth.py:32 msgid "Enabled" @@ -2852,15 +2832,19 @@ msgstr "Кодировка" msgid "Gateway enabled" msgstr "Включить домен" -#: assets/models/platform.py:106 assets/serializers/platform.py:202 +#: assets/models/platform.py:105 +msgid "DS enabled" +msgstr "Служба каталогов активирована" + +#: assets/models/platform.py:107 assets/serializers/platform.py:202 msgid "Su enabled" msgstr "Включить переключение аккаунтов" -#: assets/models/platform.py:107 assets/serializers/platform.py:177 +#: assets/models/platform.py:108 assets/serializers/platform.py:177 msgid "Su method" msgstr "Способ переключения аккаунтов" -#: assets/models/platform.py:108 assets/serializers/platform.py:180 +#: assets/models/platform.py:109 assets/serializers/platform.py:180 msgid "Custom fields" msgstr "Пользовательские атрибуты" @@ -2898,41 +2882,41 @@ 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:174 #: authentication/serializers/connect_token_secret.py:30 -#: authentication/serializers/connect_token_secret.py:75 +#: authentication/serializers/connect_token_secret.py:77 #: perms/models/asset_permission.py:76 perms/serializers/permission.py:67 -#: perms/serializers/user_permission.py:74 xpack/plugins/cloud/models.py:390 +#: perms/serializers/user_permission.py:75 xpack/plugins/cloud/models.py:390 #: xpack/plugins/cloud/serializers/task.py:36 msgid "Protocols" msgstr "Группа протоколов" #: assets/serializers/asset/common.py:149 -#: assets/serializers/asset/common.py:173 +#: assets/serializers/asset/common.py:175 msgid "Node path" msgstr "Путь к узлу" -#: assets/serializers/asset/common.py:170 -#: assets/serializers/asset/common.py:423 +#: assets/serializers/asset/common.py:172 +#: assets/serializers/asset/common.py:426 msgid "Auto info" msgstr "Информация об автоматизации" -#: assets/serializers/asset/common.py:268 +#: assets/serializers/asset/common.py:271 msgid "Platform not exist" msgstr "Платформа не существует" -#: assets/serializers/asset/common.py:304 +#: assets/serializers/asset/common.py:307 msgid "port out of range (0-65535)" msgstr "Порт вне диапазона (0-65535)" -#: assets/serializers/asset/common.py:311 +#: assets/serializers/asset/common.py:314 msgid "Protocol is required: {}" msgstr "Соглашение обязательно для заполнения: {}" -#: assets/serializers/asset/common.py:350 +#: assets/serializers/asset/common.py:353 msgid "Invalid data" msgstr "Неверные данные" @@ -2950,22 +2934,29 @@ msgstr "" #: assets/serializers/asset/database.py:24 msgid "Postgresql ssl model help text" msgstr "" -"Предпочитать: Мне не важна криптография, но если сервер поддерживает " -"шифрование, я готов оплачивать связанные с этим затраты. \n" -"Требовать: Я хочу, чтобы мои данные были защищены, и я согласен на " -"дополнительные расходы. Я верю, что сеть обеспечит постоянное соединение с " -"теми серверами, которым я доверяю. \n" -"Проверить CA: Я хочу, чтобы мои данные были защищены, и я согласен на " -"дополнительные расходы. Я хочу убедиться, что я подключен к серверу, " -"которому доверяю. \n" -"Проверить Полный: Я хочу, чтобы мои данные были защищены, и я согласен на " -"дополнительные расходы. Я хочу убедиться, что я подключен к серверу, " -"которому доверяю, и это именно тот сервер, который я указал." +"Предпочитать: Мне не важна криптография, но если сервер поддерживает шифрование, я готов оплачивать связанные с этим затраты. \n" +"Требовать: Я хочу, чтобы мои данные были защищены, и я согласен на дополнительные расходы. Я верю, что сеть обеспечит постоянное соединение с теми серверами, которым я доверяю. \n" +"Проверить CA: Я хочу, чтобы мои данные были защищены, и я согласен на дополнительные расходы. Я хочу убедиться, что я подключен к серверу, которому доверяю. \n" +"Проверить Полный: Я хочу, чтобы мои данные были защищены, и я согласен на дополнительные расходы. Я хочу убедиться, что я подключен к серверу, которому доверяю, и это именно тот сервер, который я указал." + +#: assets/serializers/asset/ds.py:18 +msgid "" +"The domain part used by the directory service (e.g., AD) and appended to the" +" username during login, such as example.com in user@example.com." +msgstr "" +"Доменное имя используется как часть домена, добавляемая после имени " +"пользователя при входе в каталог служб (например, AD), например в " +"user@example.com — это example.com. Модуль {} не применяется к этому активу." +" Выполните эту задачу при ручной или плановой синхронизации в облаке. Каждый" +" день система будет очищать записи, созданные в процессе выполнения облачной" +" синхронизации, в соответствии с конфигурацией в разделе \"Системные " +"настройки - Задачи - Регулярная очистка - Количество дней хранения истории " +"задач облачной синхронизации\"." #: assets/serializers/asset/gpt.py:20 msgid "" -"If the server cannot directly connect to the API address, you need set up an " -"HTTP proxy. e.g. http(s)://host:port" +"If the server cannot directly connect to the API address, you need set up an" +" HTTP proxy. e.g. http(s)://host:port" msgstr "" "Если сервер не может напрямую получить доступ к адресу api, вам необходимо " "настроить HTTP-прокси. Например, http(s)://host:port" @@ -3016,7 +3007,7 @@ msgid "Disk total" msgstr "Размер диска" #: assets/serializers/asset/info/gathered.py:16 -#: authentication/serializers/connect_token_secret.py:115 +#: authentication/serializers/connect_token_secret.py:117 msgid "OS" msgstr "Операционная система" @@ -3040,7 +3031,7 @@ msgstr "Ограничения" msgid "Types" msgstr "Тип" -#: assets/serializers/domain.py:21 +#: assets/serializers/domain.py:20 msgid "" "A gateway is a network proxy for a zone, and when connecting assets within " "the zone, the connection is routed through the gateway." @@ -3155,8 +3146,8 @@ msgid "" "root" msgstr "" "при доступе к активам используйте учетную запись для входа, затем " -"автоматически переключитесь на другую учетную запись, как если бы вы вошли с " -"обычной учетной записью и затем перешли на root" +"автоматически переключитесь на другую учетную запись, как если бы вы вошли с" +" обычной учетной записью и затем перешли на root" #: assets/serializers/platform.py:210 msgid "Assets can be connected using a zone gateway" @@ -3166,11 +3157,11 @@ msgstr "Активы могут подключаться через регион msgid "Default Domain" msgstr "Домашний домен по умолчанию" -#: assets/serializers/platform.py:234 +#: assets/serializers/platform.py:239 msgid "type is required" msgstr "Тип, это поле обязательно для заполнения." -#: assets/serializers/platform.py:249 +#: assets/serializers/platform.py:254 msgid "Protocols is required" msgstr "Протокол обязателен для заполнения" @@ -3196,8 +3187,7 @@ msgstr "Сбор информации об активах" #: assets/tasks/gather_facts.py:25 msgid "" -"When clicking 'Refresh hardware info' in 'Console - Asset Details - Basic' " -"this task \n" +"When clicking 'Refresh hardware info' in 'Console - Asset Details - Basic' this task \n" " will be executed" msgstr "" "При обновлении аппаратной информации активов в консоли на странице деталей " @@ -3217,10 +3207,8 @@ msgstr "Проверка количества активов под узлом" #: assets/tasks/nodes_amount.py:18 msgid "" -"Manually verifying asset quantities updates the asset count for nodes under " -"the \n" -" current organization. This task will be called in the following two " -"cases: when updating \n" +"Manually verifying asset quantities updates the asset count for nodes under the \n" +" current organization. This task will be called in the following two cases: when updating \n" " nodes and when the number of nodes exceeds 100" msgstr "" "Ручная проверка обновления количества активов под текущей организацией; " @@ -3229,7 +3217,8 @@ msgstr "" #: assets/tasks/nodes_amount.py:34 msgid "" -"The task of self-checking is already running and cannot be started repeatedly" +"The task of self-checking is already running and cannot be started " +"repeatedly" msgstr "Самопроверка уже запущена, нельзя перезапускать." #: assets/tasks/nodes_amount.py:40 @@ -3238,8 +3227,7 @@ msgstr "Периодическая проверка количества акт #: assets/tasks/nodes_amount.py:42 msgid "" -"Schedule the check_node_assets_amount_task to periodically update the asset " -"count of \n" +"Schedule the check_node_assets_amount_task to periodically update the asset count of \n" " all nodes under all organizations" msgstr "" "Регулярный вызов задания check_node_assets_amount_task для обновления " @@ -3254,8 +3242,8 @@ msgid "" "When clicking 'Test Asset Connectivity' in 'Asset Details - Basic Settings' " "this task will be executed" msgstr "" -"При нажатии на \"Проверить доступность активов\" в разделе \"Детали актива - " -"Основные настройки\" выполняется это задание." +"При нажатии на \"Проверить доступность активов\" в разделе \"Детали актива -" +" Основные настройки\" выполняется это задание." #: assets/tasks/ping.py:46 msgid "Test if the assets under the node are connectable " @@ -3268,8 +3256,8 @@ msgstr "Проверка доступности шлюза." #: assets/tasks/ping_gateway.py:23 msgid "" -"When clicking 'Test Connection' in 'Domain Details - Gateway' this task will " -"be executed" +"When clicking 'Test Connection' in 'Domain Details - Gateway' this task will" +" be executed" msgstr "" "При выполнении этого задания в \"Детали домена - Шлюз - Проверить " "соединение\"." @@ -3295,7 +3283,8 @@ msgid "App Audits" msgstr "Журнал аудита." #: audits/backends/db.py:17 -msgid "The text content is too long. Use Elasticsearch to store operation logs" +msgid "" +"The text content is too long. Use Elasticsearch to store operation logs" msgstr "" "Текст слишком длинный. Пожалуйста, используйте Elasticsearch для хранения " "операционных журналов." @@ -3338,7 +3327,7 @@ msgstr "Переименовать" msgid "Symlink" msgstr "Создать символическую ссылку" -#: audits/const.py:18 audits/const.py:28 +#: audits/const.py:18 audits/const.py:29 #: ops/templates/ops/celery_task_log.html:86 #: terminal/api/session/session.py:154 msgid "Download" @@ -3361,56 +3350,60 @@ msgstr "Посмотреть" msgid "Create" msgstr "Создать" -#: audits/const.py:29 +#: audits/const.py:27 templates/_csv_import_export.html:8 +msgid "Export" +msgstr "Экспорт" + +#: audits/const.py:30 msgid "Connect" msgstr "Подключить" -#: audits/const.py:30 authentication/templates/authentication/login.html:329 +#: audits/const.py:31 authentication/templates/authentication/login.html:329 #: authentication/templates/authentication/login.html:401 #: templates/_header_bar.html:101 msgid "Login" msgstr "Войти" -#: audits/const.py:35 rbac/tree.py:56 +#: audits/const.py:36 rbac/tree.py:56 msgid "Notifications" msgstr "Уведомление" -#: audits/const.py:37 tickets/const.py:45 +#: audits/const.py:38 tickets/const.py:45 msgid "Approve" msgstr "Согласие" -#: audits/const.py:41 ops/models/celery.py:85 +#: audits/const.py:42 ops/models/celery.py:85 #: terminal/models/session/sharing.py:128 tickets/const.py:25 #: xpack/plugins/cloud/const.py:67 msgid "Finished" msgstr "Завершить" -#: audits/const.py:46 settings/serializers/terminal.py:6 +#: audits/const.py:47 settings/serializers/terminal.py:6 #: terminal/models/applet/host.py:26 terminal/models/component/terminal.py:185 -#: terminal/models/virtualapp/provider.py:14 terminal/serializers/session.py:57 -#: terminal/serializers/session.py:113 +#: terminal/models/virtualapp/provider.py:14 +#: terminal/serializers/session.py:57 terminal/serializers/session.py:113 msgid "Terminal" msgstr "Терминал" -#: audits/const.py:51 audits/models.py:133 +#: audits/const.py:52 audits/models.py:133 msgid "Operate log" msgstr "Журнал операций" -#: audits/const.py:52 +#: audits/const.py:53 msgid "Session log" msgstr "Журнал сессий" -#: audits/const.py:53 +#: audits/const.py:54 msgid "Login log" msgstr "Журнал входа" -#: audits/const.py:54 rbac/tree.py:64 terminal/models/applet/host.py:144 +#: audits/const.py:55 rbac/tree.py:64 terminal/models/applet/host.py:144 #: terminal/models/component/task.py:22 #: xpack/plugins/cloud/serializers/account.py:77 msgid "Task" msgstr "Задача" -#: audits/const.py:60 +#: audits/const.py:61 msgid "-" msgstr "-" @@ -3428,7 +3421,7 @@ msgstr "Журнал аудита заданий" msgid "Remote addr" msgstr "Удалённый адрес" -#: audits/models.py:62 audits/serializers.py:62 +#: audits/models.py:62 audits/serializers.py:61 msgid "Operate" msgstr "Действие" @@ -3453,17 +3446,17 @@ msgstr "Беседа" msgid "File transfer log" msgstr "Передача файлов" -#: audits/models.py:95 audits/serializers.py:110 +#: audits/models.py:95 audits/serializers.py:109 msgid "Resource Type" msgstr "Тип ресурса" #: audits/models.py:96 audits/models.py:99 audits/models.py:145 -#: audits/serializers.py:109 labels/serializers.py:46 +#: audits/serializers.py:108 labels/serializers.py:46 msgid "Resource" msgstr "Ресурс" #: audits/models.py:102 audits/models.py:148 audits/models.py:178 -#: audits/models.py:314 audits/serializers.py:230 +#: audits/models.py:314 audits/serializers.py:232 #: terminal/serializers/command.py:75 msgid "Datetime" msgstr "Дата" @@ -3497,7 +3490,7 @@ msgstr "Способ входа" msgid "Login IP" msgstr "IP входа" -#: audits/models.py:201 audits/serializers.py:76 +#: audits/models.py:201 audits/serializers.py:75 #: authentication/templates/authentication/_mfa_confirm_modal.html:14 #: users/forms/profile.py:64 users/models/user/__init__.py:82 #: users/serializers/profile.py:71 @@ -3548,37 +3541,37 @@ msgid "Application ID" msgstr "ID приложения" #: audits/serializers.py:33 ops/models/adhoc.py:24 ops/models/base.py:16 -#: ops/models/base.py:53 ops/models/celery.py:87 ops/models/job.py:154 -#: ops/models/job.py:237 ops/models/playbook.py:30 ops/models/variable.py:17 +#: ops/models/base.py:53 ops/models/celery.py:87 ops/models/job.py:156 +#: ops/models/job.py:239 ops/models/playbook.py:30 ops/models/variable.py:17 #: terminal/models/session/sharing.py:25 msgid "Creator" msgstr "Создатель" -#: audits/serializers.py:40 ops/serializers/celery.py:33 +#: audits/serializers.py:39 ops/serializers/celery.py:33 msgid "Execution cycle" msgstr "Периодическое выполнение" -#: audits/serializers.py:93 +#: audits/serializers.py:92 msgid "Reason display" msgstr "Описание причины" -#: audits/serializers.py:94 audits/serializers.py:208 +#: audits/serializers.py:93 audits/serializers.py:210 msgid "Auth backend display" msgstr "Способ аутентификации" -#: audits/serializers.py:158 +#: audits/serializers.py:157 #, python-format msgid "%s %s this resource" msgstr "Пользователь %s %s текущий ресурс" -#: audits/serializers.py:196 authentication/models/connection_token.py:51 +#: audits/serializers.py:198 authentication/models/connection_token.py:52 #: authentication/models/temp_token.py:13 perms/models/asset_permission.py:80 #: tickets/models/ticket/apply_application.py:31 #: tickets/models/ticket/apply_asset.py:21 users/models/user/__init__.py:101 msgid "Date expired" msgstr "Дата истечения" -#: audits/serializers.py:227 terminal/models/component/terminal.py:91 +#: audits/serializers.py:229 terminal/models/component/terminal.py:91 #: terminal/serializers/command.py:76 msgid "Remote Address" msgstr "Удаленный адрес" @@ -3656,20 +3649,17 @@ msgstr "Очистка журнала задач аудита активов" #: audits/tasks.py:134 msgid "" -"Since the system generates login logs, operation logs, file upload logs, " -"activity \n" -" logs, Celery execution logs, session recordings, command records, " -"and password change \n" -" logs, it will perform cleanup of records that exceed the time limit " -"according to the \n" +"Since the system generates login logs, operation logs, file upload logs, activity \n" +" logs, Celery execution logs, session recordings, command records, and password change \n" +" logs, it will perform cleanup of records that exceed the time limit according to the \n" " 'Tasks - Regular clean-up' in the system settings at 2 a.m daily" msgstr "" "Поскольку система производит журналы входа, журналы действий, журналы " "загрузки файлов, журналы активности, журналы выполнения celery, записи " "сессий и записи команд, журналы изменения пароля, система будет регулярно " "очищать их в зависимости от настроек: список задач - для записей, " -"превышающих установленное время, очистка будет производиться каждый день в 2 " -"часа ночи" +"превышающих установленное время, очистка будет производиться каждый день в 2" +" часа ночи" #: audits/tasks.py:154 msgid "Upload FTP file to external storage" @@ -3677,8 +3667,7 @@ msgstr "Загрузка FTP-файлов на внешнее хранилище #: audits/tasks.py:156 msgid "" -"If SERVER_REPLAY_STORAGE is configured, files uploaded through file " -"management will be \n" +"If SERVER_REPLAY_STORAGE is configured, files uploaded through file management will be \n" " synchronized to external storage" msgstr "" "Если установлено SERVER_REPLAY_STORAGE, файлы, загруженные через управление " @@ -3699,41 +3688,41 @@ msgstr "" "Эта операция требует подтверждения вашего MFA, пожалуйста, сначала " "активируйте и настройте его." -#: authentication/api/connection_token.py:303 +#: authentication/api/connection_token.py:304 msgid "Reusable connection token is not allowed, global setting not enabled" msgstr "" "Использование повторно используемых токенов соединения не разрешено, " "глобальные настройки не активированы." -#: authentication/api/connection_token.py:423 +#: authentication/api/connection_token.py:424 msgid "Anonymous account is not supported for this asset" msgstr "Анонимные учетные записи не поддерживают текущие активы." -#: authentication/api/connection_token.py:455 +#: authentication/api/connection_token.py:454 msgid "Permission expired" msgstr "Авторизация истекла." -#: authentication/api/connection_token.py:488 +#: authentication/api/connection_token.py:487 msgid "ACL action is reject: {}({})" msgstr "Действие ACL отклонено: {}({})." -#: authentication/api/connection_token.py:492 +#: authentication/api/connection_token.py:491 msgid "ACL action is review" msgstr "Действие ACL на проверку." -#: authentication/api/connection_token.py:502 +#: authentication/api/connection_token.py:501 msgid "ACL action is face verify" msgstr "Действие ACL - идентификация по лицу." -#: authentication/api/connection_token.py:507 +#: authentication/api/connection_token.py:506 msgid "ACL action not supported for this asset" msgstr "Правила входа в актив не поддерживают текущий актив." -#: authentication/api/connection_token.py:514 +#: authentication/api/connection_token.py:513 msgid "ACL action is face online" msgstr "Действие ACL - онлайн-идентификация по лицу." -#: authentication/api/connection_token.py:533 +#: authentication/api/connection_token.py:532 msgid "No available face feature" msgstr "Нет доступных признаков лица." @@ -3857,16 +3846,16 @@ msgstr "Виртуальная MFA" msgid "SMS" msgstr "SMS" -#: authentication/const.py:34 +#: authentication/const.py:35 msgid "Face Recognition" msgstr "Распознавание лиц" -#: authentication/const.py:35 settings/serializers/auth/radius.py:14 +#: authentication/const.py:36 settings/serializers/auth/radius.py:14 #: settings/serializers/auth/radius.py:16 msgid "Radius" msgstr "Radius" -#: authentication/const.py:36 +#: authentication/const.py:37 msgid "Custom" msgstr "Пользовательский" @@ -3925,8 +3914,8 @@ msgid "" "You can also try {times_try} times (The account will be temporarily locked " "for {block_time} minutes)" msgstr "" -"Введённое имя пользователя или пароль неверны, пожалуйста, попробуйте снова. " -"У вас также есть возможность попробовать {times_try} раз (аккаунт будет " +"Введённое имя пользователя или пароль неверны, пожалуйста, попробуйте снова." +" У вас также есть возможность попробовать {times_try} раз (аккаунт будет " "временно заблокирован на {block_time} минут)" #: authentication/errors/const.py:47 authentication/errors/const.py:55 @@ -3948,8 +3937,8 @@ msgstr "" #: authentication/errors/const.py:59 #, python-brace-format msgid "" -"{error}, You can also try {times_try} times (The account will be temporarily " -"locked for {block_time} minutes)" +"{error}, You can also try {times_try} times (The account will be temporarily" +" locked for {block_time} minutes)" msgstr "" "{error} у вас есть возможность попробовать {times_try} раз (аккаунт будет " "временно заблокирован на {block_time} минут)" @@ -4058,7 +4047,9 @@ msgstr "Тип MFA" msgid "Captcha" msgstr "Код подтверждения" -#: authentication/forms.py:66 users/forms/profile.py:28 +#: authentication/forms.py:66 authentication/mfa/email.py:41 +#: authentication/templates/authentication/_msg_mfa_email_code.html:12 +#: users/forms/profile.py:28 msgid "MFA code" msgstr "MFA код подтверждения" @@ -4072,9 +4063,11 @@ msgstr "Пожалуйста, введите динамический код б #: authentication/mfa/base.py:27 msgid "" -"The two-factor code you entered has either already been used or has expired. " -"Please request a new one." +"The two-factor code you entered has either already been used or has expired." +" Please request a new one." msgstr "" +"Введённый вами двойной код подтверждения уже был использован или истёк. " +"Пожалуйста, запросите новый двойной код подтверждения." #: authentication/mfa/custom.py:21 msgid "MFA Custom code invalid" @@ -4088,6 +4081,14 @@ msgstr "Пользовательский MFA код подтверждения" msgid "MFA custom global enabled, cannot disable" msgstr "Пользовательский MFA включен глобально, его нельзя отключить" +#: authentication/mfa/email.py:11 +msgid "Email verify code invalid" +msgstr "Проверка кода подтверждения электронной почты не удалась" + +#: authentication/mfa/email.py:17 +msgid "Email verification code" +msgstr "Код подтверждения электронной почты" + #: authentication/mfa/face.py:55 msgid "Bind face to enable" msgstr "Привязать лицо для активации" @@ -4138,7 +4139,7 @@ msgstr "Установите номер телефона для активаци msgid "Clear phone number to disable" msgstr "Очистить номер телефона для отключения" -#: authentication/middleware.py:95 settings/utils/ldap.py:691 +#: authentication/middleware.py:95 settings/utils/ldap.py:711 msgid "Authentication failed (before login check failed): {}" msgstr "Ошибка аутентификации (проверка перед входом не удалась): {}" @@ -4162,22 +4163,22 @@ msgstr "Этот способ MFA ({}) не включен" msgid "Please change your password" msgstr "Пожалуйста, измените пароль" -#: authentication/models/connection_token.py:42 +#: authentication/models/connection_token.py:43 #: terminal/serializers/storage.py:114 msgid "Account name" msgstr "Имя аккаунта" -#: authentication/models/connection_token.py:43 +#: authentication/models/connection_token.py:44 msgid "Input username" msgstr "Пользовательское имя" -#: authentication/models/connection_token.py:44 +#: authentication/models/connection_token.py:45 #: authentication/serializers/connection_token.py:18 msgid "Input secret" msgstr "Пользовательский пароль" -#: authentication/models/connection_token.py:45 -#: authentication/serializers/connect_token_secret.py:114 +#: authentication/models/connection_token.py:46 +#: authentication/serializers/connect_token_secret.py:116 #: settings/serializers/msg.py:28 terminal/models/applet/applet.py:43 #: terminal/models/virtualapp/virtualapp.py:24 #: terminal/serializers/session.py:23 terminal/serializers/session.py:50 @@ -4185,69 +4186,69 @@ msgstr "Пользовательский пароль" msgid "Protocol" msgstr "Протокол" -#: authentication/models/connection_token.py:46 +#: authentication/models/connection_token.py:47 msgid "Connect method" msgstr "Способ подключения" -#: authentication/models/connection_token.py:48 +#: authentication/models/connection_token.py:49 msgid "User display" msgstr "Имя пользователя" -#: authentication/models/connection_token.py:49 +#: authentication/models/connection_token.py:50 msgid "Asset display" msgstr "Название актива" -#: authentication/models/connection_token.py:50 +#: authentication/models/connection_token.py:51 msgid "Reusable" msgstr "Можно повторно использовать" -#: authentication/models/connection_token.py:55 +#: authentication/models/connection_token.py:56 #: perms/models/asset_permission.py:83 msgid "From ticket" msgstr "Из заявки" -#: authentication/models/connection_token.py:57 +#: authentication/models/connection_token.py:58 msgid "Face monitor token" msgstr "Токен мониторинга по лицу" -#: authentication/models/connection_token.py:68 +#: authentication/models/connection_token.py:69 msgid "Can expire connection token" msgstr "Токен подключения может выйти из строя" -#: authentication/models/connection_token.py:69 +#: authentication/models/connection_token.py:70 msgid "Can reuse connection token" msgstr "Токен подключения можно повторно использовать" -#: authentication/models/connection_token.py:71 +#: authentication/models/connection_token.py:72 msgid "Connection token" msgstr "Токен подключения" -#: authentication/models/connection_token.py:132 +#: authentication/models/connection_token.py:163 msgid "Connection token inactive" msgstr "Токен подключения не активирован" -#: authentication/models/connection_token.py:136 +#: authentication/models/connection_token.py:167 msgid "Connection token expired at: {}" msgstr "Срок действия токена подключения истек: {}" -#: authentication/models/connection_token.py:139 +#: authentication/models/connection_token.py:170 #: terminal/serializers/session.py:95 msgid "No user or invalid user" msgstr "Нет пользователя или пользователь недействителен" -#: authentication/models/connection_token.py:142 +#: authentication/models/connection_token.py:173 msgid "No asset or inactive asset" msgstr "Нет активов или активы не активированы" -#: authentication/models/connection_token.py:290 +#: authentication/models/connection_token.py:341 msgid "Can view super connection token secret" msgstr "Можно просмотреть зашифрованный токен суперссылки" -#: authentication/models/connection_token.py:292 +#: authentication/models/connection_token.py:343 msgid "Super connection token" msgstr "Токен суперссылки" -#: authentication/models/connection_token.py:309 +#: authentication/models/connection_token.py:360 msgid "Admin connection token" msgstr "Токен административной связи" @@ -4261,7 +4262,7 @@ msgstr "Приватный токен" msgid "Private key" msgstr "SSH-ключ" -#: authentication/models/ssh_key.py:18 settings/serializers/terminal.py:34 +#: authentication/models/ssh_key.py:18 settings/serializers/terminal.py:38 #: users/forms/profile.py:175 users/models/user/__init__.py:92 #: xpack/plugins/cloud/serializers/account_attrs.py:211 msgid "Public key" @@ -4287,39 +4288,39 @@ msgstr "Напоминание о удаленном входе" msgid "binding reminder" msgstr "Напоминание о связывании" -#: authentication/serializers/connect_token_secret.py:116 +#: authentication/serializers/connect_token_secret.py:118 msgid "Is builtin" msgstr "Встроенный" -#: authentication/serializers/connect_token_secret.py:120 +#: authentication/serializers/connect_token_secret.py:122 msgid "Options" msgstr "Опции" -#: authentication/serializers/connect_token_secret.py:127 +#: authentication/serializers/connect_token_secret.py:129 #: ops/notifications.py:19 rbac/tree.py:60 msgid "Component" msgstr "Компоненты" -#: authentication/serializers/connect_token_secret.py:136 +#: authentication/serializers/connect_token_secret.py:138 #: perms/serializers/user_permission.py:28 xpack/plugins/cloud/models.py:389 msgid "Domain" msgstr "Домен" -#: authentication/serializers/connect_token_secret.py:138 +#: authentication/serializers/connect_token_secret.py:140 msgid "Expired now" msgstr "Сразу истекает" -#: authentication/serializers/connect_token_secret.py:171 +#: authentication/serializers/connect_token_secret.py:173 #: terminal/models/virtualapp/virtualapp.py:25 msgid "Image name" msgstr "Название образа" -#: authentication/serializers/connect_token_secret.py:172 +#: authentication/serializers/connect_token_secret.py:174 #: terminal/models/virtualapp/virtualapp.py:27 msgid "Image port" msgstr "Порт образа" -#: authentication/serializers/connect_token_secret.py:173 +#: authentication/serializers/connect_token_secret.py:175 #: terminal/models/virtualapp/virtualapp.py:26 msgid "Image protocol" msgstr "Протокол образа" @@ -4369,14 +4370,14 @@ msgstr "Тип создания" #: authentication/serializers/ssh_key.py:33 msgid "" -"Please download the private key after creation. Each private key can only be " -"downloaded once" +"Please download the private key after creation. Each private key can only be" +" downloaded once" msgstr "" "После завершения создания, пожалуйста, загрузите закрытый ключ, так как у " "вас будет только одна возможность его скачать." #: authentication/serializers/ssh_key.py:57 users/forms/profile.py:164 -#: users/serializers/profile.py:134 users/serializers/profile.py:161 +#: users/serializers/profile.py:142 users/serializers/profile.py:169 msgid "Not a valid ssh public key" msgstr "SSH-ключ недействителен" @@ -4392,8 +4393,8 @@ msgstr "Очистить просроченные сеансы" #: authentication/tasks.py:15 msgid "" -"Since user logins create sessions, the system will clean up expired sessions " -"every 24 hours" +"Since user logins create sessions, the system will clean up expired sessions" +" every 24 hours" msgstr "" "Поскольку вход пользователя в систему создает сеанс, система очищает " "просроченные сеансы каждые 24 часа" @@ -4405,8 +4406,8 @@ msgstr "Список API-ключей" #: authentication/templates/authentication/_access_key_modal.html:18 msgid "Using api key sign api header, every requests header difference" msgstr "" -"Используйте API-ключ для подписи заголовка запроса, каждый заголовок запроса " -"различен" +"Используйте API-ключ для подписи заголовка запроса, каждый заголовок запроса" +" различен" #: authentication/templates/authentication/_access_key_modal.html:19 msgid "docs" @@ -4417,12 +4418,14 @@ msgid "Show" msgstr "Показать" #: authentication/templates/authentication/_access_key_modal.html:66 -#: users/const.py:42 users/templates/users/user_verify_mfa.html:36 +#: settings/serializers/terminal.py:24 users/const.py:42 +#: users/templates/users/user_verify_mfa.html:36 msgid "Disable" msgstr "Отключить" #: authentication/templates/authentication/_access_key_modal.html:67 -#: users/const.py:43 users/templates/users/mfa_setting.html:120 +#: settings/serializers/terminal.py:24 users/const.py:43 +#: users/templates/users/mfa_setting.html:120 #: users/templates/users/mfa_setting.html:158 #: users/templates/users/mfa_setting.html:177 msgid "Enable" @@ -4457,10 +4460,11 @@ msgid "Code error" msgstr "Код ошибки" #: authentication/templates/authentication/_msg_different_city.html:3 +#: authentication/templates/authentication/_msg_mfa_email_code.html:9 #: authentication/templates/authentication/_msg_oauth_bind.html:3 #: authentication/templates/authentication/_msg_reset_password.html:3 #: authentication/templates/authentication/_msg_reset_password_code.html:9 -#: jumpserver/conf.py:539 +#: jumpserver/conf.py:540 #: perms/templates/perms/_msg_item_permissions_expire.html:3 #: tickets/templates/tickets/approve_check_password.html:32 #: users/templates/users/_msg_account_expire_reminder.html:4 @@ -4483,6 +4487,11 @@ msgstr "" "Если вы подозреваете, что этот вход был подозрительным, пожалуйста, срочно " "измените пароль от аккаунта." +#: authentication/templates/authentication/_msg_mfa_email_code.html:15 +#: authentication/templates/authentication/_msg_reset_password_code.html:18 +msgid "The validity period of the verification code is one minute" +msgstr "Код подтверждения действителен в течение 1 минуты." + #: authentication/templates/authentication/_msg_oauth_bind.html:6 msgid "Your account has just been bound to" msgstr "Ваш аккаунт только что был привязан к" @@ -4536,10 +4545,6 @@ msgstr "" "Скопируйте код подтверждения на страницу сброса пароля, чтобы изменить " "пароль." -#: authentication/templates/authentication/_msg_reset_password_code.html:18 -msgid "The validity period of the verification code is one minute" -msgstr "Код подтверждения действителен в течение 1 минуты." - #: authentication/templates/authentication/_msg_rest_password_success.html:5 msgid "Your password has just been successfully updated" msgstr "Ваш пароль только что успешно обновлён." @@ -4642,8 +4647,8 @@ msgid "" "This page is not served over HTTPS. Please use HTTPS to ensure security of " "your credentials." msgstr "" -"Эта страница не использует протокол HTTPS, пожалуйста, используйте HTTPS для " -"обеспечения безопасности ваших учетных данных." +"Эта страница не использует протокол HTTPS, пожалуйста, используйте HTTPS для" +" обеспечения безопасности ваших учетных данных." #: authentication/templates/authentication/passkey.html:173 msgid "Do you want to retry ?" @@ -4757,8 +4762,7 @@ msgid "" "Wait for {} confirm, You also can copy link to her/him
\n" " Don't close this page" msgstr "" -"Ожидание {} подтверждения, вы также можете скопировать ссылку и " -"отправить ему/ей
\n" +"Ожидание {} подтверждения, вы также можете скопировать ссылку и отправить ему/ей
\n" " Не закрывайте эту страницу" #: authentication/views/login.py:375 @@ -4775,8 +4779,8 @@ msgstr "Вы успешно вышли, вернитесь на страницу #: authentication/views/mixins.py:39 msgid "" -"For your safety, automatic redirection login is not supported on the client. " -"If you need to open it in the client, please log in again" +"For your safety, automatic redirection login is not supported on the client." +" If you need to open it in the client, please log in again" msgstr "" "В целях вашей безопасности клиент не поддерживает автоматический переход к " "входу. Если необходимо открыть в клиенте, пожалуйста, выполните вход снова." @@ -4911,8 +4915,8 @@ msgstr "Зашифрованное поле" #: common/db/fields.py:578 msgid "" -"Invalid JSON data for JSONManyToManyField, should be like {'type': 'all'} or " -"{'type': 'ids', 'ids': []} or {'type': 'attrs', 'attrs': [{'name': 'ip', " +"Invalid JSON data for JSONManyToManyField, should be like {'type': 'all'} or" +" {'type': 'ids', 'ids': []} or {'type': 'attrs', 'attrs': [{'name': 'ip', " "'match': 'exact', 'value': '1.1.1.1'}}" msgstr "" "JSON-операции многие ко многим недействительны, должно быть {'type': 'all'} " @@ -4980,27 +4984,27 @@ msgstr "Ошибка анализа файла: {}" msgid "Invalid excel file" msgstr "Недействительный excel файл" -#: common/drf/renders/base.py:138 +#: common/drf/renders/base.py:140 msgid "Yes/No" msgstr "Да/Нет" -#: common/drf/renders/base.py:141 +#: common/drf/renders/base.py:143 msgid "Text, max length {}" msgstr "Текст, максимальная длина {}" -#: common/drf/renders/base.py:143 +#: common/drf/renders/base.py:145 msgid "Long text, no length limit" msgstr "Длинный текст, без ограничения длины" -#: common/drf/renders/base.py:145 +#: common/drf/renders/base.py:147 msgid "Number, min {} max {}" msgstr "Число, минимум {} максимум {}" -#: common/drf/renders/base.py:148 +#: common/drf/renders/base.py:150 msgid "Datetime format {}" msgstr "Формат даты и времени {}" -#: common/drf/renders/base.py:154 +#: common/drf/renders/base.py:156 msgid "" "Choices, format name(value), name is optional for human read, value is " "requisite, options {}" @@ -5008,30 +5012,30 @@ msgstr "" "Опции, формат: имя(значение), имя опционально для удобства чтения, значение " "обязательно, доступные варианты: {}" -#: common/drf/renders/base.py:157 +#: common/drf/renders/base.py:159 msgid "Choices, options {}" msgstr "Опции, доступные варианты: {}" -#: common/drf/renders/base.py:159 +#: common/drf/renders/base.py:161 msgid "Phone number, format +8612345678901" msgstr "Мобильный номер, формат +8612345678901" -#: common/drf/renders/base.py:161 +#: common/drf/renders/base.py:163 msgid "Label, format [\"key:value\"]" msgstr "Теги, формат: [\"ключ:значение\"]" -#: common/drf/renders/base.py:163 +#: common/drf/renders/base.py:165 msgid "" "Object, format name(id), name is optional for human read, id is requisite" msgstr "" -"Связанные элементы, формат: имя(id), имя опционально для удобства чтения, id " -"обязательно" +"Связанные элементы, формат: имя(id), имя опционально для удобства чтения, id" +" обязательно" -#: common/drf/renders/base.py:165 +#: common/drf/renders/base.py:167 msgid "Object, format id" msgstr "Связанные элементы, формат: id" -#: common/drf/renders/base.py:169 +#: common/drf/renders/base.py:171 msgid "" "Objects, format [\"name(id)\", ...], name is optional for human read, id is " "requisite" @@ -5039,18 +5043,17 @@ msgstr "" "Много связанных элементов, формат: [\"Название(id)\", ...], Название " "является опциональным для удобства чтения, id является обязательным" -#: common/drf/renders/base.py:171 -msgid "" -"Labels, format [\"key:value\", ...], if label not exists, will create it" +#: common/drf/renders/base.py:173 +msgid "Labels, format [\"key:value\", ...], if label not exists, will create it" msgstr "" "Теги, формат: [\"Ключ:Значение\", ...], Если теги отсутствуют, они будут " "созданы" -#: common/drf/renders/base.py:173 +#: common/drf/renders/base.py:175 msgid "Objects, format [\"id\", ...]" msgstr "Много связанных элементов, формат: [\"id\", ...]" -#: common/drf/renders/base.py:271 +#: common/drf/renders/base.py:275 msgid "" "{} - The encryption password has not been set - please go to personal " "information -> file encryption password to set the encryption password" @@ -5058,6 +5061,22 @@ msgstr "" "{} - Не установлен шифровальный пароль - пожалуйста, перейдите в личные " "данные -> Установите шифровальный пароль" +#: common/drf/renders/mixins.py:37 labels/serializers.py:22 +msgid "Resource count" +msgstr "Не может содержать \":,\"" + +#: common/drf/renders/mixins.py:46 +msgid "Export all" +msgstr "Экспортировать все" + +#: common/drf/renders/mixins.py:48 +msgid "Export only selected items" +msgstr "Только экспортировать выбранные элементы" + +#: common/drf/renders/mixins.py:50 +msgid "Export filtered" +msgstr "Экспорт поиска" + #: common/exceptions.py:15 xpack/plugins/cloud/ws.py:37 #, python-format msgid "%s object does not exist." @@ -5088,15 +5107,15 @@ msgstr "Это действие требует подтверждения тек msgid "Unexpect error occur" msgstr "Произошла непредвиденная ошибка" -#: common/plugins/es.py:35 +#: common/plugins/es.py:36 msgid "Invalid elasticsearch config" msgstr "Неверная конфигурация Elasticsearch" -#: common/plugins/es.py:40 +#: common/plugins/es.py:41 msgid "Not Support Elasticsearch8" msgstr "Elasticsearch8 не поддерживается" -#: common/plugins/es.py:46 +#: common/plugins/es.py:47 msgid "" "Connection failed: Self-signed certificate used. Please check server " "certificate configuration" @@ -5228,14 +5247,12 @@ msgstr "Отправка вложения электронной почты" #: common/tasks.py:68 msgid "" -"When an account password is changed or an account backup generates " -"attachments, \n" -" this task needs to be executed for sending emails and handling " -"attachments" +"When an account password is changed or an account backup generates attachments, \n" +" this task needs to be executed for sending emails and handling attachments" msgstr "" "Когда учетная запись меняет пароль, для резервного копирования учетной " -"записи создаются вложения, необходимо выполнить данное действие для отправки " -"электронной почты и вложений" +"записи создаются вложения, необходимо выполнить данное действие для отправки" +" электронной почты и вложений" #: common/tasks.py:94 msgid "Upload account backup to external storage" @@ -5246,14 +5263,12 @@ msgid "" "When performing an account backup, this task needs to be executed to " "external storage (SFTP)" msgstr "" -"При выполнении резервного копирования учетной записи необходимо обратиться к " -"внешнему хранилищу (sftp) для выполнения этой задачи. \n" +"При выполнении резервного копирования учетной записи необходимо обратиться к внешнему хранилищу (sftp) для выполнения этой задачи. \n" "Неправильный IP \n" "Неправильный адрес \n" "Здравствуйте %s \n" "Отправить SMS-код подтверждения \n" -"При сбросе пароля, забытом пароле или проверке MFA необходимо выполнить эту " -"задачу отправки SMS. \n" +"При сбросе пароля, забытом пароле или проверке MFA необходимо выполнить эту задачу отправки SMS. \n" "Не должно содержать специальных символов \n" "Не должно содержать специальных символов \n" "Неправильный формат номера телефона \n" @@ -5283,8 +5298,7 @@ msgstr "Отправить SMS-код подтверждения" #: common/utils/verify_code.py:19 msgid "" -"When resetting a password, forgetting a password, or verifying MFA, this " -"task needs to \n" +"When resetting a password, forgetting a password, or verifying MFA, this task needs to \n" " be executed to send SMS messages" msgstr "" "Эта задача выполняется при сбросе пароля, при забывании пароля или при " @@ -5310,16 +5324,16 @@ msgstr "Код не найден" msgid "The message code provided is invalid or has expired" msgstr "Предоставленный код сообщения недействительный или истек" -#: jumpserver/conf.py:533 +#: jumpserver/conf.py:534 #, python-brace-format msgid "The verification code is: {code}" msgstr "Код подтверждения: {code}" -#: jumpserver/conf.py:538 +#: jumpserver/conf.py:539 msgid "Create account successfully" msgstr "Успешное создание аккаунта" -#: jumpserver/conf.py:540 +#: jumpserver/conf.py:541 msgid "Your account has been created successfully" msgstr "Ваш аккаунт успешно создан" @@ -5331,9 +5345,9 @@ msgstr "JumpServer открытая система управления дост msgid "

Flower service unavailable, check it

" msgstr "" "Сервис Flower недоступен, пожалуйста, проверьте.
Luna является " -"отдельной развертываемой программой, вам нужно развернуть Luna и Koko.
Если вы видите эту страницу, значит, вы обращаетесь не к порту, на " -"который настроен nginx, удачи вам.
" +"отдельной развертываемой программой, вам нужно развернуть Luna и " +"Koko.
Если вы видите эту страницу, значит, вы обращаетесь не к " +"порту, на который настроен nginx, удачи вам.
" #: jumpserver/views/other.py:28 msgid "" @@ -5341,16 +5355,16 @@ msgid "" "configure nginx for url distribution, If you see this page, " "prove that you are not accessing the nginx listening port. Good luck." msgstr "" -"Сервис Websocket работает на порту: {}, пожалуйста, проверьте, установлен ли " -"прокси в nginx." +"Сервис Websocket работает на порту: {}, пожалуйста, проверьте, установлен ли" +" прокси в nginx." #: jumpserver/views/other.py:76 msgid "Websocket server run on port: {}, you should proxy it on nginx" msgstr "" -"
Koko является отдельной развертываемой программой, вам нужно развернуть " -"Koko и убедиться, что конфигурация nginx настроена на пересылку.
Если вы видите эту страницу, значит, вы обращаетесь не к порту, на " -"который настроен nginx, удачи вам.
" +"
Koko является отдельной развертываемой программой, вам нужно развернуть" +" Koko и убедиться, что конфигурация nginx настроена на " +"пересылку.
Если вы видите эту страницу, значит, вы обращаетесь не " +"к порту, на который настроен nginx, удачи вам.
" #: jumpserver/views/other.py:90 msgid "" @@ -5379,10 +5393,6 @@ msgstr "Связанный ресурс" msgid "Tagged resource" msgstr "Количество ресурсов" -#: labels/serializers.py:22 -msgid "Resource count" -msgstr "Не может содержать \":,\"" - #: labels/serializers.py:28 msgid "Cannot contain \":,\"" msgstr "Тип ресурса" @@ -5421,29 +5431,25 @@ msgstr "Опубликовать сообщение внутри системы" #: notifications/notifications.py:48 msgid "" -"This task needs to be executed for sending internal messages for system " -"alerts, \n" +"This task needs to be executed for sending internal messages for system alerts, \n" " work orders, and other notifications" msgstr "" "Некоторые предупреждения системы, такие как уведомления о заявках, требуют " "выполнения этой задачи для отправки внутреннего сообщения" -#: ops/ansible/inventory.py:117 ops/models/job.py:68 +#: ops/ansible/inventory.py:126 ops/ansible/inventory.py:196 +#: ops/models/job.py:69 msgid "No account available" msgstr "Нет доступных аккаунтов" -#: ops/ansible/inventory.py:298 +#: ops/ansible/inventory.py:318 ops/ansible/inventory.py:360 msgid "Ansible disabled" msgstr "Ansible отключен" -#: ops/ansible/inventory.py:314 +#: ops/ansible/inventory.py:376 msgid "Skip hosts below:" msgstr "Пропустить следующие хосты:" -#: ops/api/adhoc.py:32 -msgid "Deleting other people's script is not allowed" -msgstr "Удаление чужих скриптов не разрешено" - #: ops/api/celery.py:66 ops/api/celery.py:81 msgid "Waiting task start" msgstr "Ожидание начала выполнения задачи" @@ -5456,7 +5462,7 @@ msgstr "Задача {} не существует" msgid "Task {} args or kwargs error" msgstr "Ошибка параметров выполнения задачи {}" -#: ops/api/job.py:68 +#: ops/api/job.py:70 #, python-brace-format msgid "" "Asset ({asset}) must have at least one of the following protocols added: " @@ -5465,22 +5471,22 @@ msgstr "" "Актив(ы)({asset}) необходимо добавить как минимум один из протоколов ssh, " "sftp или winrm" -#: ops/api/job.py:69 +#: ops/api/job.py:71 #, python-brace-format msgid "Asset ({asset}) authorization is missing SSH, SFTP, or WinRM protocol" msgstr "" "Авторизация для актива({asset}) не включает протоколы ssh, sftp или winrm" -#: ops/api/job.py:70 +#: ops/api/job.py:72 #, python-brace-format msgid "Asset ({asset}) authorization lacks upload permissions" msgstr "Авторизация для актива({asset}) не включает права на загрузку." -#: ops/api/job.py:158 +#: ops/api/job.py:160 msgid "Duplicate file exists" msgstr "" -"Существует файл с тем же именем. Размер файла превышает максимальный предел. " -"Пожалуйста, выберите файл размером менее {limit}MB. В данный момент " +"Существует файл с тем же именем. Размер файла превышает максимальный предел." +" Пожалуйста, выберите файл размером менее {limit}MB. В данный момент " "создается задача, ее нельзя прервать, пожалуйста, попробуйте снова позже. " "Удаление чужого playbook не разрешено. Текущий playbook используется в " "работе. Неподдерживаемое содержимое файла. Неверный путь к файлу. Этот файл " @@ -5488,7 +5494,7 @@ msgstr "" "является обязательным. Невозможно удалить этот файл. Центр заданий. " "Отправка. Проверка. Сбор." -#: ops/api/job.py:163 +#: ops/api/job.py:165 #, python-brace-format msgid "" "File size exceeds maximum limit. Please select a file smaller than {limit}MB" @@ -5496,40 +5502,36 @@ msgstr "" "Размер файла превышает максимальный лимит. Пожалуйста, выберите файл меньше " "{limit}MB." -#: ops/api/job.py:236 +#: ops/api/job.py:238 msgid "" "The task is being created and cannot be interrupted. Please try again later." msgstr "Задача создается, прервать нельзя, попробуйте позже." #: ops/api/playbook.py:49 -msgid "Deleting other people's playbook is not allowed" -msgstr "Удаление чужого playbook запрещено." - -#: ops/api/playbook.py:55 msgid "Currently playbook is being used in a job" msgstr "Текущий playbook используется в работе." -#: ops/api/playbook.py:128 +#: ops/api/playbook.py:122 msgid "Unsupported file content" msgstr "Неподдерживаемое содержимое файла." -#: ops/api/playbook.py:130 ops/api/playbook.py:176 ops/api/playbook.py:224 +#: ops/api/playbook.py:124 ops/api/playbook.py:170 ops/api/playbook.py:218 msgid "Invalid file path" msgstr "Недопустимый путь к файлу." -#: ops/api/playbook.py:202 +#: ops/api/playbook.py:196 msgid "This file can not be rename" msgstr "Этот файл нельзя переименовать." -#: ops/api/playbook.py:221 +#: ops/api/playbook.py:215 msgid "File already exists" msgstr "Файл уже существует." -#: ops/api/playbook.py:239 +#: ops/api/playbook.py:233 msgid "File key is required" msgstr "Поле \"ключ файла\" является обязательным." -#: ops/api/playbook.py:242 +#: ops/api/playbook.py:236 msgid "This file can not be delete" msgstr "Не удалось удалить этот файл." @@ -5578,7 +5580,7 @@ msgstr "VCS" msgid "Adhoc" msgstr "Команда" -#: ops/const.py:39 ops/models/job.py:152 ops/models/playbook.py:89 +#: ops/const.py:39 ops/models/job.py:154 ops/models/playbook.py:89 #: ops/models/variable.py:23 msgid "Playbook" msgstr "Playbook" @@ -5665,17 +5667,19 @@ msgid "no valid program entry found." msgstr "Нет доступных точек входа" #: ops/mixin.py:34 ops/mixin.py:166 settings/serializers/auth/ldap.py:74 -#: settings/serializers/auth/ldap_ha.py:57 +#: settings/serializers/auth/ldap_ha.py:56 msgid "Periodic run" msgstr "Циклическое выполнение" #: ops/mixin.py:36 ops/mixin.py:113 ops/mixin.py:172 -#: settings/serializers/auth/ldap.py:81 settings/serializers/auth/ldap_ha.py:64 +#: settings/serializers/auth/ldap.py:81 +#: settings/serializers/auth/ldap_ha.py:63 msgid "Interval" msgstr "Интервал" #: ops/mixin.py:39 ops/mixin.py:111 ops/mixin.py:169 -#: settings/serializers/auth/ldap.py:78 settings/serializers/auth/ldap_ha.py:61 +#: settings/serializers/auth/ldap.py:78 +#: settings/serializers/auth/ldap_ha.py:60 msgid "Crontab" msgstr "Crontab" @@ -5699,7 +5703,11 @@ msgstr "Период выполнения" msgid "* Please enter a valid crontab expression" msgstr "* Пожалуйста, введите корректное выражение crontab" -#: ops/mixin.py:204 settings/serializers/auth/mixin.py:12 +#: ops/mixin.py:194 +msgid "Crontab minute must not contain '*'" +msgstr "" + +#: ops/mixin.py:208 settings/serializers/auth/mixin.py:12 msgid "Require interval or crontab setting" msgstr "Требуется периодическая или регулярная настройка" @@ -5707,18 +5715,19 @@ msgstr "Требуется периодическая или регулярна msgid "Pattern" msgstr "Режим" -#: ops/models/adhoc.py:22 ops/models/job.py:149 +#: ops/models/adhoc.py:22 ops/models/job.py:151 msgid "Module" msgstr "Модуль" -#: ops/models/adhoc.py:23 ops/models/celery.py:82 ops/models/job.py:147 +#: ops/models/adhoc.py:23 ops/models/celery.py:82 ops/models/job.py:149 #: terminal/models/component/task.py:14 msgid "Args" msgstr "Содержание" -#: ops/models/adhoc.py:26 ops/models/playbook.py:34 ops/serializers/mixin.py:10 -#: rbac/models/role.py:31 rbac/models/rolebinding.py:46 -#: rbac/serializers/role.py:12 settings/serializers/auth/oauth2.py:37 +#: ops/models/adhoc.py:26 ops/models/playbook.py:34 +#: ops/serializers/mixin.py:10 rbac/models/role.py:31 +#: rbac/models/rolebinding.py:46 rbac/serializers/role.py:12 +#: settings/serializers/auth/oauth2.py:37 msgid "Scope" msgstr "Диапазон" @@ -5754,48 +5763,54 @@ msgstr "Дата выхода" msgid "Celery Task Execution" msgstr "Исполнение задачи Celery" -#: ops/models/job.py:150 +#: ops/models/job.py:82 +#, fuzzy +#| msgid "Anonymous account is not supported for this asset" +msgid "Module {} is not suitable for this asset" +msgstr "Анонимные учетные записи не поддерживают текущие активы." + +#: ops/models/job.py:152 msgid "Run dir" msgstr "Рабочая директория" -#: ops/models/job.py:151 +#: ops/models/job.py:153 msgid "Timeout (Seconds)" msgstr "Время ожидания (сек)" -#: ops/models/job.py:157 +#: ops/models/job.py:159 msgid "Use Parameter Define" msgstr "Используемые параметры определения" -#: ops/models/job.py:158 +#: ops/models/job.py:160 msgid "Parameters define" msgstr "Определение параметров" -#: ops/models/job.py:159 +#: ops/models/job.py:161 msgid "Periodic variable" msgstr "Переменные периодического выполнения" -#: ops/models/job.py:160 +#: ops/models/job.py:162 msgid "Run as" msgstr "Пользователь для запуска" -#: ops/models/job.py:162 +#: ops/models/job.py:164 msgid "Run as policy" msgstr "Политика пользователя" -#: ops/models/job.py:219 ops/models/variable.py:28 ops/serializers/job.py:111 +#: ops/models/job.py:221 ops/models/variable.py:28 ops/serializers/job.py:111 #: terminal/notifications.py:182 msgid "Job" msgstr "Задача" -#: ops/models/job.py:242 +#: ops/models/job.py:244 msgid "Material" msgstr "Материал" -#: ops/models/job.py:244 +#: ops/models/job.py:246 msgid "Material Type" msgstr "Тип материала" -#: ops/models/job.py:556 +#: ops/models/job.py:558 msgid "Job Execution" msgstr "Исполнение задания" @@ -5915,8 +5930,8 @@ msgid "" "Execute scheduled adhoc and playbooks, periodically invoking the task for " "execution" msgstr "" -"При выполнении регулярной команды быстрого доступа, плейбука, периодического " -"вызова этой задачи" +"При выполнении регулярной команды быстрого доступа, плейбука, периодического" +" вызова этой задачи" #: ops/tasks.py:88 msgid "Run ansible task execution" @@ -5941,15 +5956,13 @@ msgstr "Создание или обновление периодической #: ops/tasks.py:134 msgid "" -"With version iterations, new tasks may be added, or task names and execution " -"times may \n" -" be modified. Therefore, upon system startup, tasks will be " -"registered or the parameters \n" +"With version iterations, new tasks may be added, or task names and execution times may \n" +" be modified. Therefore, upon system startup, tasks will be registered or the parameters \n" " of scheduled tasks will be updated" msgstr "" "С развитием версии могут быть добавлены новые задачи или изменены названия " -"задач, время выполнения, поэтому при загрузке системы будут зарегистрированы " -"задачи или обновлены параметры периодических задач" +"задач, время выполнения, поэтому при загрузке системы будут зарегистрированы" +" задачи или обновлены параметры периодических задач" #: ops/tasks.py:147 msgid "Periodic check service performance" @@ -5957,10 +5970,8 @@ msgstr "Периодическая проверка производительн #: ops/tasks.py:149 msgid "" -"Check every hour whether each component is offline and whether the CPU, " -"memory, \n" -" and disk usage exceed the thresholds, and send an alert message to " -"the administrator" +"Check every hour whether each component is offline and whether the CPU, memory, \n" +" and disk usage exceed the thresholds, and send an alert message to the administrator" msgstr "" "Каждый час проверяется, отключены ли какие-либо компоненты, а также " "превышает ли использование CPU, памяти и диска заданные пороговые значения, " @@ -5972,12 +5983,9 @@ msgstr "Очистка аномальных действий." #: ops/tasks.py:161 msgid "" -"Due to exceptions caused by executing adhoc and playbooks in the Job " -"Center, \n" -" which result in the task status not being updated, the system will " -"clean up abnormal jobs \n" -" that have not been completed for more than 3 hours every hour and " -"mark these tasks as \n" +"Due to exceptions caused by executing adhoc and playbooks in the Job Center, \n" +" which result in the task status not being updated, the system will clean up abnormal jobs \n" +" that have not been completed for more than 3 hours every hour and mark these tasks as \n" " failed" msgstr "" "Из-за выполнения команд быстрого доступа в центре заданий, playbook может " @@ -5991,12 +5999,9 @@ msgstr "Очистка истории выполнения в центре за #: ops/tasks.py:176 msgid "" -"Due to the execution of adhoc and playbooks in the Job Center, execution " -"records will \n" -" be generated. The system will clean up records that exceed the " -"retention period every day \n" -" at 2 a.m., based on the configuration of 'System Settings - Tasks - " -"Regular clean-up - \n" +"Due to the execution of adhoc and playbooks in the Job Center, execution records will \n" +" be generated. The system will clean up records that exceed the retention period every day \n" +" at 2 a.m., based on the configuration of 'System Settings - Tasks - Regular clean-up - \n" " Job execution retention days'" msgstr "" "Из-за выполнения команд быстрого доступа в центре заданий, playbook создает " @@ -6075,7 +6080,8 @@ msgstr "Пожалуйста, выберите организацию перед #: rbac/serializers/rolebinding.py:44 settings/serializers/auth/base.py:53 #: terminal/templates/terminal/_msg_command_warning.html:21 #: terminal/templates/terminal/_msg_session_sharing.html:14 -#: tickets/models/ticket/general.py:303 tickets/serializers/ticket/ticket.py:61 +#: tickets/models/ticket/general.py:303 +#: tickets/serializers/ticket/ticket.py:61 msgid "Organization" msgstr "Организация" @@ -6109,7 +6115,7 @@ msgid "Can not delete virtual org" msgstr "Не удается удалить виртуальную организацию" #: orgs/serializers.py:10 perms/serializers/permission.py:59 -#: rbac/serializers/role.py:27 users/serializers/group.py:54 +#: rbac/serializers/role.py:27 users/serializers/group.py:53 msgid "Users amount" msgstr "Количество пользователей" @@ -6257,14 +6263,10 @@ msgstr "Правила проверки разрешений активов ис #: perms/tasks.py:30 msgid "" -"The cache of organizational collections, which have completed user " -"authorization tree \n" -" construction, will expire. Therefore, expired collections need to be " -"cleared from the \n" -" cache, and this task will be executed periodically based on the time " -"interval specified \n" -" by PERM_EXPIRED_CHECK_PERIODIC in the system configuration file " -"config.txt" +"The cache of organizational collections, which have completed user authorization tree \n" +" construction, will expire. Therefore, expired collections need to be cleared from the \n" +" cache, and this task will be executed periodically based on the time interval specified \n" +" by PERM_EXPIRED_CHECK_PERIODIC in the system configuration file config.txt" msgstr "" "Кэш организации, для которой уже построено дерево разрешений пользователей, " "будет истекать, поэтому необходимо очищать просроченные наборы из кэша, " @@ -6277,12 +6279,9 @@ msgstr "Отправка уведомления о истечении прав #: perms/tasks.py:51 msgid "" -"Check every day at 10 a.m. and send a notification message to users " -"associated with \n" -" assets whose authorization is about to expire, as well as to the " -"organization's \n" -" administrators, 3 days in advance, to remind them that the asset " -"authorization will \n" +"Check every day at 10 a.m. and send a notification message to users associated with \n" +" assets whose authorization is about to expire, as well as to the organization's \n" +" administrators, 3 days in advance, to remind them that the asset authorization will \n" " expire in a few days" msgstr "" "Каждый день в 10 утра проверяется, и за три дня до истечения прав на активы " @@ -6468,7 +6467,7 @@ msgid "Storage" msgstr "Хранение" #: rbac/tree.py:61 terminal/models/applet/applet.py:53 -#: terminal/models/applet/applet.py:328 terminal/models/applet/host.py:30 +#: terminal/models/applet/applet.py:369 terminal/models/applet/host.py:30 #: terminal/serializers/applet.py:15 msgid "Applet" msgstr "Удаленные приложения" @@ -6725,7 +6724,8 @@ msgid "CAS" msgstr "CAS" #: settings/serializers/auth/cas.py:15 settings/serializers/auth/ldap.py:45 -#: settings/serializers/auth/ldap_ha.py:28 settings/serializers/auth/oidc.py:61 +#: settings/serializers/auth/ldap_ha.py:27 +#: settings/serializers/auth/oidc.py:61 msgid "Server" msgstr "Адрес сервера" @@ -6750,9 +6750,11 @@ msgstr "Атрибут имени пользователя" msgid "Enable attributes map" msgstr "Включить сопоставление атрибутов" -#: settings/serializers/auth/cas.py:34 settings/serializers/auth/dingtalk.py:18 +#: settings/serializers/auth/cas.py:34 +#: settings/serializers/auth/dingtalk.py:18 #: settings/serializers/auth/feishu.py:18 settings/serializers/auth/lark.py:17 -#: settings/serializers/auth/ldap.py:67 settings/serializers/auth/ldap_ha.py:50 +#: settings/serializers/auth/ldap.py:67 +#: settings/serializers/auth/ldap_ha.py:49 #: settings/serializers/auth/oauth2.py:60 settings/serializers/auth/oidc.py:39 #: settings/serializers/auth/saml2.py:35 settings/serializers/auth/slack.py:18 #: settings/serializers/auth/wecom.py:18 @@ -6814,7 +6816,7 @@ msgstr "" "пользователя JumpServer, а `value` — это имя атрибута пользователя службы " "Lark" -#: settings/serializers/auth/ldap.py:42 settings/serializers/auth/ldap.py:104 +#: settings/serializers/auth/ldap.py:42 settings/serializers/auth/ldap.py:108 msgid "LDAP" msgstr "LDAP" @@ -6822,23 +6824,28 @@ msgstr "LDAP" msgid "LDAP server URI" msgstr "Домен службы LDAP" -#: settings/serializers/auth/ldap.py:49 settings/serializers/auth/ldap_ha.py:32 +#: settings/serializers/auth/ldap.py:49 +#: settings/serializers/auth/ldap_ha.py:31 msgid "Bind DN" msgstr "Связывание DN" -#: settings/serializers/auth/ldap.py:50 settings/serializers/auth/ldap_ha.py:33 +#: settings/serializers/auth/ldap.py:50 +#: settings/serializers/auth/ldap_ha.py:32 msgid "Binding Distinguished Name" msgstr "Администратор каталога" -#: settings/serializers/auth/ldap.py:54 settings/serializers/auth/ldap_ha.py:37 +#: settings/serializers/auth/ldap.py:54 +#: settings/serializers/auth/ldap_ha.py:36 msgid "Binding password" msgstr "Пароль связывания" -#: settings/serializers/auth/ldap.py:57 settings/serializers/auth/ldap_ha.py:40 +#: settings/serializers/auth/ldap.py:57 +#: settings/serializers/auth/ldap_ha.py:39 msgid "Search OU" msgstr "OU пользователя" -#: settings/serializers/auth/ldap.py:59 settings/serializers/auth/ldap_ha.py:42 +#: settings/serializers/auth/ldap.py:59 +#: settings/serializers/auth/ldap_ha.py:41 msgid "" "User Search Base, if there are multiple OUs, you can separate them with the " "`|` symbol" @@ -6846,16 +6853,19 @@ msgstr "" "Поисковая база данных пользователя. Если есть несколько OU, можно " "использовать символ `|` для разделения" -#: settings/serializers/auth/ldap.py:63 settings/serializers/auth/ldap_ha.py:46 +#: settings/serializers/auth/ldap.py:63 +#: settings/serializers/auth/ldap_ha.py:45 msgid "Search filter" msgstr "Фильтр пользователя" -#: settings/serializers/auth/ldap.py:64 settings/serializers/auth/ldap_ha.py:47 +#: settings/serializers/auth/ldap.py:64 +#: settings/serializers/auth/ldap_ha.py:46 #, python-format msgid "Selection could include (cn|uid|sAMAccountName=%(user)s)" msgstr "Возможные опции: (cn или uid или sAMAccountName=%(user)s)" -#: settings/serializers/auth/ldap.py:69 settings/serializers/auth/ldap_ha.py:52 +#: settings/serializers/auth/ldap.py:69 +#: settings/serializers/auth/ldap_ha.py:51 msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the LDAP service user attribute name" @@ -6864,15 +6874,31 @@ msgstr "" "пользователя JumpServer, а `value` — это имя атрибута пользователя службы " "LDAP" -#: settings/serializers/auth/ldap.py:85 settings/serializers/auth/ldap_ha.py:68 +#: settings/serializers/auth/ldap.py:85 +#: settings/serializers/auth/ldap_ha.py:67 msgid "Connect timeout (s)" msgstr "Время ожидания соединения (в секундах)" -#: settings/serializers/auth/ldap.py:90 settings/serializers/auth/ldap_ha.py:73 +#: settings/serializers/auth/ldap.py:88 +#: settings/serializers/auth/ldap_ha.py:70 +msgid "Strict sync" +msgstr "Строгий режим" + +#: settings/serializers/auth/ldap.py:89 +#: settings/serializers/auth/ldap_ha.py:71 +msgid "" +"In strict mode, users not found in LDAP will be disabled during full or " +"automatic sync" +msgstr "" +"После активации строгого режима, полная или автоматическая синхронизация " +"запретит пользователей, не найденных в LDAP, в системе." + +#: settings/serializers/auth/ldap.py:94 +#: settings/serializers/auth/ldap_ha.py:76 msgid "User DN cache timeout (s)" msgstr "Время кэширования User DN (в секундах)" -#: settings/serializers/auth/ldap.py:92 +#: settings/serializers/auth/ldap.py:96 msgid "" "Caching the User DN obtained during user login authentication can " "effectively improve the speed of user authentication., 0 means no " @@ -6883,28 +6909,29 @@ msgstr "" "значительно ускорить процесс аутентификации
Если структура OU " "пользователя изменена, нажмите \"Отправить\", чтобы очистить кэш User DN" -#: settings/serializers/auth/ldap.py:98 settings/serializers/auth/ldap_ha.py:81 +#: settings/serializers/auth/ldap.py:102 +#: settings/serializers/auth/ldap_ha.py:84 msgid "Search paged size (piece)" msgstr "Количество страниц поиска (штук)" -#: settings/serializers/auth/ldap_ha.py:25 -#: settings/serializers/auth/ldap_ha.py:87 +#: settings/serializers/auth/ldap_ha.py:24 +#: settings/serializers/auth/ldap_ha.py:90 msgid "LDAP HA" msgstr "LDAP аутентификация" -#: settings/serializers/auth/ldap_ha.py:29 +#: settings/serializers/auth/ldap_ha.py:28 msgid "LDAP HA server URI" msgstr "LDAP HA сервисное доменное имя" -#: settings/serializers/auth/ldap_ha.py:75 +#: settings/serializers/auth/ldap_ha.py:78 msgid "" "Caching the User DN obtained during user login authentication can " -"effectivelyimprove the speed of user authentication., 0 means no cache
If " -"the user OU structure has been adjusted, click Submit to clear the user DN " +"effectivelyimprove the speed of user authentication., 0 means no cache
If" +" the user OU structure has been adjusted, click Submit to clear the user DN " "cache" msgstr "" -"Кэширование User DN, полученного при аутентификации пользователя, эффективно " -"ускоряет процесс проверки подлинности
Если структура OU пользователя " +"Кэширование User DN, полученного при аутентификации пользователя, эффективно" +" ускоряет процесс проверки подлинности
Если структура OU пользователя " "изменится, нажмите отправить, чтобы очистить кэш пользовательских DN" #: settings/serializers/auth/oauth2.py:19 @@ -6949,7 +6976,8 @@ msgid "End session endpoint" msgstr "Адрес конечной точки завершения сессии" #: settings/serializers/auth/oauth2.py:57 -msgid "When the user signs out, they also be logged out from the OAuth2 server" +msgid "" +"When the user signs out, they also be logged out from the OAuth2 server" msgstr "Когда пользователь выходит, он также выходит из сервера OAuth2" #: settings/serializers/auth/oauth2.py:62 @@ -6961,8 +6989,8 @@ msgstr "" "пользователя JumpServer, а `value` - название атрибута пользователя сервиса " "OAuth2" -#: settings/serializers/auth/oauth2.py:67 settings/serializers/auth/oidc.py:113 -#: settings/serializers/auth/saml2.py:45 +#: settings/serializers/auth/oauth2.py:67 +#: settings/serializers/auth/oidc.py:113 settings/serializers/auth/saml2.py:45 msgid "Always update user" msgstr "Всегда обновляйте информацию о пользователе" @@ -7092,7 +7120,8 @@ msgid "OTP in RADIUS" msgstr "Использовать Radius OTP" #: settings/serializers/auth/radius.py:24 -msgid "* Using OTP in RADIUS means users can employ RADIUS as a method for MFA" +msgid "" +"* Using OTP in RADIUS means users can employ RADIUS as a method for MFA" msgstr "" "* Использование OTP в RADIUS означает, что пользователь может использовать " "RADIUS как метод MFA" @@ -7131,7 +7160,8 @@ msgstr "" #: settings/serializers/auth/saml2.py:43 msgid "When the user signs out, they also be logged out from the SAML2 server" -msgstr "Когда пользователь выходит, он также будет разлогинен на SAML2 сервере" +msgstr "" +"Когда пользователь выходит, он также будет разлогинен на SAML2 сервере" #: settings/serializers/auth/slack.py:20 msgid "" @@ -7204,9 +7234,9 @@ msgstr "Тип приложения (ID Application)" #: settings/serializers/auth/sms.py:85 #, python-brace-format msgid "" -"Template need contain {code} and Signature + template length does not exceed " -"67 words. For example, your verification code is {code}, which is valid for " -"5 minutes. Please do not disclose it to others." +"Template need contain {code} and Signature + template length does not exceed" +" 67 words. For example, your verification code is {code}, which is valid for" +" 5 minutes. Please do not disclose it to others." msgstr "" "Шаблон должен содержать {code}, и длина шаблона + подписи не должна " "превышать 67 символов. Например, ваш код подтверждения: {code}, действует 5 " @@ -7259,11 +7289,11 @@ msgstr "Текущий URL сайта" #: settings/serializers/basic.py:13 msgid "" -"Site URL is the externally accessible address of the current product service " -"and is usually used in links in system emails" +"Site URL is the externally accessible address of the current product service" +" and is usually used in links in system emails" msgstr "" -"Ссылка на сайт является внешним доступным адресом текущих продуктов и услуг, " -"обычно используется в ссылках системных писем" +"Ссылка на сайт является внешним доступным адресом текущих продуктов и услуг," +" обычно используется в ссылках системных писем" #: settings/serializers/basic.py:18 msgid "User guide url" @@ -7356,8 +7386,8 @@ msgid "" "Session, record, command will be delete if more than duration, only in " "database, OSS will not be affected." msgstr "" -"Сессии, видеозаписи и записи команд, превышающие этот временной лимит, будут " -"удалены (влияет на хранение базы данных, но на OSS не влияет)" +"Сессии, видеозаписи и записи команд, превышающие этот временной лимит, будут" +" удалены (влияет на хранение базы данных, но на OSS не влияет)" #: settings/serializers/cleaning.py:53 msgid "Change secret and push record retention days (day)" @@ -7487,8 +7517,8 @@ msgstr "Цикл выполнения" msgid "" "Allow users to execute batch commands in the Workbench - Job Center - Adhoc" msgstr "" -"Позволяет пользователям выполнять пакетные команды на рабочем столе - Центре " -"заданий - Adhoc" +"Позволяет пользователям выполнять пакетные команды на рабочем столе - Центре" +" заданий - Adhoc" #: settings/serializers/feature.py:191 msgid "Command blacklist" @@ -7580,8 +7610,8 @@ msgstr "Тема письма" #: settings/serializers/msg.py:69 msgid "" -"Tips: When creating a user, send the subject of the email (eg:Create account " -"successfully)" +"Tips: When creating a user, send the subject of the email (eg:Create account" +" successfully)" msgstr "" "Подсказка: при создании пользователя отправьте тему письма для настройки " "пароля (например: Успешное создание пользователя)" @@ -7672,8 +7702,8 @@ msgid "" "If the user has failed to log in for a limited number of times, no login is " "allowed during this time interval." msgstr "" -"Когда количество неудачных попыток входа пользователя достигнет лимита, вход " -"будет запрещен на установочный интервал." +"Когда количество неудачных попыток входа пользователя достигнет лимита, вход" +" будет запрещен на установочный интервал." #: settings/serializers/security.py:63 settings/serializers/security.py:73 msgid "Login failures count" @@ -7724,8 +7754,8 @@ msgstr "Вход только из источника пользователя." #: settings/serializers/security.py:105 msgid "" -"If it is enabled, the user will only authenticate to the source when logging " -"in; if it is disabled, the user will authenticate all the enabled " +"If it is enabled, the user will only authenticate to the source when logging" +" in; if it is disabled, the user will authenticate all the enabled " "authentication methods in a certain order when logging in, and as long as " "one of the authentication methods is successful, they can log in directly" msgstr "" @@ -7759,19 +7789,29 @@ msgstr "Третья сторона активирует MFA" msgid "The third-party login modes include OIDC, CAS, and SAML2" msgstr "Методы входа третьих сторон включают: OIDC, CAS, SAML2" -#: settings/serializers/security.py:128 +#: settings/serializers/security.py:129 +msgid "MFA via Email" +msgstr "Проверка электронной почты MFA" + +#: settings/serializers/security.py:130 +msgid "Email as a method for multi-factor authentication" +msgstr "" +"Использование электронной почты как одного из способов многофакторной " +"аутентификации" + +#: settings/serializers/security.py:133 msgid "OTP issuer name" msgstr "Название после сканирования OTP" -#: settings/serializers/security.py:132 +#: settings/serializers/security.py:137 msgid "OTP valid window" msgstr "Количество запаса времени OTP" -#: settings/serializers/security.py:136 +#: settings/serializers/security.py:141 msgid "MFA verify TTL" msgstr "Срок действия проверки MFA" -#: settings/serializers/security.py:138 +#: settings/serializers/security.py:143 msgid "" "Unit: second, The verification MFA takes effect only when you view the " "account password" @@ -7779,45 +7819,45 @@ msgstr "" "Единицы: секунды, в настоящее время действует только при просмотре проверки " "паролей аккаунта с использованием MFA" -#: settings/serializers/security.py:143 +#: settings/serializers/security.py:148 msgid "MFA in login page" msgstr "Вход MFA на странице логина" -#: settings/serializers/security.py:144 +#: settings/serializers/security.py:149 msgid "Eu security regulations(GDPR) require MFA to be on the login page" msgstr "" "Регламент безопасности данных ЕС (GDPR) требует, чтобы MFA была на странице " "входа для обеспечения безопасности входа в систему" -#: settings/serializers/security.py:148 +#: settings/serializers/security.py:153 msgid "Verify code TTL (second)" msgstr "Время действия кода подтверждения (мин)" -#: settings/serializers/security.py:149 +#: settings/serializers/security.py:154 msgid "Reset password and send SMS code expiration time" msgstr "" "Срок действия кода подтверждения для сброса пароля и срока действия кода " "подтверждения для отправки SMS." -#: settings/serializers/security.py:153 +#: settings/serializers/security.py:158 msgid "Login dynamic code" msgstr "" "Включить дополнительный код для входа. Пароль и код отправляются третьей " "стороне для проверки, например, некоторые системы аутентификации требуют " "пароль + 6-значный код для завершения аутентификации. Включить код " "безопасности для входа, чтобы предотвратить вход ботов. Уведомление о входе " -"из другого местоположения. Определяется по IP-адресу: если аккаунт входит из " -"незнакомого города, отправляется уведомление о входе из другого " +"из другого местоположения. Определяется по IP-адресу: если аккаунт входит из" +" незнакомого города, отправляется уведомление о входе из другого " "местоположения. Автоматическая блокировка неактивных пользователей (дни). " "Проверка осуществляется раз в день; пользователи, превышающие установленное " -"время, автоматически блокируются. Включить водяной знак. После активации веб-" -"сеансы и записи будут содержать водяные знаки. Максимальное время простоя " -"подключения (мин). Обратите внимание: если не будет действий в течение " -"установленного времени, соединение будет разорвано. Сессия истекает при " -"закрытии браузера. Означает ли закрытие браузера истечение сессии. Разрешить " -"пользователям просматривать информацию о сеансах активов онлайн." +"время, автоматически блокируются. Включить водяной знак. После активации " +"веб-сеансы и записи будут содержать водяные знаки. Максимальное время " +"простоя подключения (мин). Обратите внимание: если не будет действий в " +"течение установленного времени, соединение будет разорвано. Сессия истекает " +"при закрытии браузера. Означает ли закрытие браузера истечение сессии. " +"Разрешить пользователям просматривать информацию о сеансах активов онлайн." -#: settings/serializers/security.py:154 +#: settings/serializers/security.py:159 msgid "" "The password and additional code are sent to a third party authentication " "system for verification" @@ -7826,74 +7866,68 @@ msgstr "" "аутентификации, например, некоторые третьи системы требуют пароль + 6 цифр " "для завершения аутентификации." -#: settings/serializers/security.py:158 +#: settings/serializers/security.py:163 msgid "Login captcha" msgstr "Включить проверочный код при входе" -#: settings/serializers/security.py:159 +#: settings/serializers/security.py:164 msgid "Enable captcha to prevent robot authentication" msgstr "Активируйте код для предотвращения входа роботов" -#: settings/serializers/security.py:162 +#: settings/serializers/security.py:167 msgid "Suspicious Login Verification" msgstr "Уведомление о входе из другого места" -#: settings/serializers/security.py:164 +#: settings/serializers/security.py:169 msgid "" -"The system determines whether the login IP address belongs to a common login " -"city. If the account is logged in from a common login city, the system sends " -"a remote login reminder" +"The system determines whether the login IP address belongs to a common login" +" city. If the account is logged in from a common login city, the system " +"sends a remote login reminder" msgstr "" "Оно основано на проверке IP-адреса, чтобы определить, принадлежит ли он к " "обычному городу входа. Если аккаунт входил из необычного города, будет " "отправлено уведомление" -#: settings/serializers/security.py:170 +#: settings/serializers/security.py:175 msgid "Auto Disable Threshold (day)" msgstr "Автоматически отключать неактивных пользователей (дни)" -#: settings/serializers/security.py:171 +#: settings/serializers/security.py:176 msgid "" "Detect infrequent users daily and disable them if they exceed the " "predetermined time limit" msgstr "" -"Каждый день проходит проверка, пользователи, которые превышают установленное " -"время, автоматически отключаются" +"Каждый день проходит проверка, пользователи, которые превышают установленное" +" время, автоматически отключаются" -#: settings/serializers/security.py:191 +#: settings/serializers/security.py:196 msgid "Watermark" msgstr "Включить водяной знак" -#: settings/serializers/security.py:192 -msgid "Enabled, the web session and replay contains watermark information" -msgstr "" -"После активации веб-сессии и записи будут содержать информацию о водяном " -"знаке" - -#: settings/serializers/security.py:196 +#: settings/serializers/security.py:200 msgid "Max idle time (minute)" msgstr "Максимальное время простоя подключения (мин)" -#: settings/serializers/security.py:197 +#: settings/serializers/security.py:201 msgid "If idle time more than it, disconnect connection." msgstr "" "Совет: если по истечении этого времени не будет действий, подключение будет " "разорвано" -#: settings/serializers/security.py:200 +#: settings/serializers/security.py:204 msgid "Session expire at browser closed" msgstr "Сессия истекает при закрытии браузера" -#: settings/serializers/security.py:201 +#: settings/serializers/security.py:205 msgid "Whether to expire the session when the user closes their browser." msgstr "Должна ли сессия истекать, когда пользователь закрывает браузер?" -#: settings/serializers/security.py:206 +#: settings/serializers/security.py:210 msgid "Allow users to view asset session information" msgstr "" "Разрешить пользователю просматривать информацию о сессии активов онлайн" -#: settings/serializers/security.py:208 +#: settings/serializers/security.py:212 msgid "" "When a user connects to an asset, the account selection popup displays the " "number of active sessions for the current asset (RDP protocol only)." @@ -7902,40 +7936,40 @@ msgstr "" "отображается текущее количество онлайн-сессий для данного актива (только " "протокол rdp)." -#: settings/serializers/security.py:214 +#: settings/serializers/security.py:218 msgid "Max online time (hour)" msgstr "Максимальное время подключения к сессии (часы)" -#: settings/serializers/security.py:215 +#: settings/serializers/security.py:219 msgid "If session connection time more than it, disconnect connection." msgstr "" "Подсказка: если время подключения к сессии превышает указанную настройку, " "соединение будет разорвано." -#: settings/serializers/security.py:218 +#: settings/serializers/security.py:222 msgid "Remember manual auth" msgstr "Сохранить вручную введенный пароль" -#: settings/serializers/security.py:221 +#: settings/serializers/security.py:225 #: terminal/templates/terminal/_msg_session_sharing.html:10 msgid "Session share" msgstr "Поделитесь сессией" -#: settings/serializers/security.py:222 +#: settings/serializers/security.py:226 msgid "Enabled, Allows user active session to be shared with other users" msgstr "" "При включении пользователю разрешается делиться подключенной сессией актива " "с другими, для совместной работы." -#: settings/serializers/security.py:228 +#: settings/serializers/security.py:232 msgid "Insecure command alert" msgstr "Оповещение о опасных командах" -#: settings/serializers/security.py:231 +#: settings/serializers/security.py:235 msgid "Email recipient" msgstr "Получатель электронной почты" -#: settings/serializers/security.py:232 +#: settings/serializers/security.py:236 msgid "Multiple user using , split" msgstr "Несколько пользователей, разделите запятой." @@ -7948,74 +7982,81 @@ msgstr "[%s] %s" msgid "Auto" msgstr "Авто" -#: settings/serializers/terminal.py:22 +#: settings/serializers/terminal.py:23 +msgid "Auto(Enabled for the first 5 minutes after startup, then disabled.)" +msgstr "" +"Автоматически (включается в течение первых 5 минут после запуска, затем " +"отключается.)" + +#: settings/serializers/terminal.py:26 msgid "Registration" msgstr "Регистрация компонента" -#: settings/serializers/terminal.py:24 +#: settings/serializers/terminal.py:28 msgid "" -"Allow component register, after all component setup, you should disable this " -"for security" +"Allow component register, after all component setup, you should disable this" +" for security" msgstr "" "Разрешить ли регистрацию компонента? После запуска всех терминалов для " "безопасности это следует отключить." -#: settings/serializers/terminal.py:30 +#: settings/serializers/terminal.py:34 msgid "" "* Allow users to log in to the KoKo component via password authentication" msgstr "" "* Разрешить пользователям входить в компонент KoKo с использованием " "аутентификации по паролю." -#: settings/serializers/terminal.py:36 +#: settings/serializers/terminal.py:40 msgid "" "* Allow users to log in to the KoKo component via Public key " "authentication
If third-party authentication services, such as AD/LDAP, " -"are enabled, you should disable this option to prevent users from logging in " -"after being deleted from the AD/LDAP server" +"are enabled, you should disable this option to prevent users from logging in" +" after being deleted from the AD/LDAP server" msgstr "" "* Разрешить пользователям входить в компонент KoKo с использованием " "аутентификации по открытому ключу.
Если сторонний сервис " "аутентификации (например, AD/LDAP) включен, то эту опцию следует отключить, " -"чтобы избежать повторного входа пользователей после их удаления с сервера AD/" -"LDAP." +"чтобы избежать повторного входа пользователей после их удаления с сервера " +"AD/LDAP." -#: settings/serializers/terminal.py:43 +#: settings/serializers/terminal.py:47 msgid "Asset sorting" msgstr "Список активов сортировка" -#: settings/serializers/terminal.py:46 +#: settings/serializers/terminal.py:50 msgid "Asset page size" msgstr "Количество активов на странице" -#: settings/serializers/terminal.py:51 +#: settings/serializers/terminal.py:55 msgid "" -"* You can individually configure the service address and port in the service " -"endpoint
If enabled, the Luna page will display the DB client launch " +"* You can individually configure the service address and port in the service" +" endpoint
If enabled, the Luna page will display the DB client launch " "method when connecting to assets" msgstr "" -"* Вы можете отдельно настроить адрес и порт сервиса в конечной точке
Если включено, на странице Luna будет показан метод запуска DB клиента при " -"подключении к активам" +"* Вы можете отдельно настроить адрес и порт сервиса в конечной " +"точке
Если включено, на странице Luna будет показан метод запуска DB " +"клиента при подключении к активам" -#: settings/serializers/terminal.py:59 +#: settings/serializers/terminal.py:63 msgid "" -"* You can individually configure the service address and port in the service " -"endpoint
If enabled, the Luna page will display the download rdp file " +"* You can individually configure the service address and port in the service" +" endpoint
If enabled, the Luna page will display the download rdp file " "button and RDP Client launch method when connecting to assets" msgstr "" -"* Вы можете отдельно настроить адрес и порт сервиса в конечной точке
Если включено, на странице Luna будет показана кнопка для скачивания rdp " -"файла и метод запуска RDP клиента при подключении к активам" +"* Вы можете отдельно настроить адрес и порт сервиса в конечной " +"точке
Если включено, на странице Luna будет показана кнопка для " +"скачивания rdp файла и метод запуска RDP клиента при подключении к активам" -#: settings/serializers/terminal.py:66 +#: settings/serializers/terminal.py:70 msgid "Client connection" msgstr "Подключение клиента" -#: settings/serializers/terminal.py:68 +#: settings/serializers/terminal.py:72 msgid "" "* Allow connecting to the KoKo component via SSH client
If enabled, the " -"Luna page will display the SSH client launch method when connecting to assets" +"Luna page will display the SSH client launch method when connecting to " +"assets" msgstr "" "* Разрешить подключение к компонентам KoKo через SSH клиент
Если " "включено, на странице Luna будет показан метод запуска SSH клиента при " @@ -8031,17 +8072,17 @@ msgstr "Инструменты на рабочем столе" #: settings/serializers/tool.py:15 msgid "" -"*! If enabled, users with RBAC permissions will be able to utilize all tools " -"in the workbench" +"*! If enabled, users with RBAC permissions will be able to utilize all tools" +" in the workbench" msgstr "" "*! Если включено, пользователи с правами RBAC смогут использовать все " "инструменты на рабочем столе" -#: settings/tasks/ldap.py:73 +#: settings/tasks/ldap.py:67 msgid "Periodic import ldap user" msgstr "Периодический импорт пользователей LDAP" -#: settings/tasks/ldap.py:75 settings/tasks/ldap.py:85 +#: settings/tasks/ldap.py:69 settings/tasks/ldap.py:79 msgid "" "When LDAP auto-sync is configured, this task will be invoked to synchronize " "users" @@ -8049,32 +8090,30 @@ msgstr "" "Когда настроена автоматическая синхронизация LDAP, эта задача будет вызвана " "для синхронизации пользователей" -#: settings/tasks/ldap.py:83 +#: settings/tasks/ldap.py:77 msgid "Periodic import ldap ha user" msgstr "Периодический импорт пользователей LDAP HA" -#: settings/tasks/ldap.py:120 +#: settings/tasks/ldap.py:115 msgid "Registration periodic import ldap user task" msgstr "Регистрация задачи периодического импорта пользователей LDAP" -#: settings/tasks/ldap.py:122 +#: settings/tasks/ldap.py:117 msgid "" -"When LDAP auto-sync parameters change, such as Crontab parameters, the LDAP " -"sync task \n" +"When LDAP auto-sync parameters change, such as Crontab parameters, the LDAP sync task \n" " will be re-registered or updated, and this task will be invoked" msgstr "" "Когда изменяются параметры автоматической синхронизации LDAP, такие как " -"параметры Crontab, повторная регистрация или обновление задачи синхронизации " -"LDAP вызовет эту задачу" +"параметры Crontab, повторная регистрация или обновление задачи синхронизации" +" LDAP вызовет эту задачу" -#: settings/tasks/ldap.py:136 +#: settings/tasks/ldap.py:131 msgid "Registration periodic import ldap ha user task" msgstr "Регистрация задачи периодического импорта пользователей LDAP HA" -#: settings/tasks/ldap.py:138 +#: settings/tasks/ldap.py:133 msgid "" -"When LDAP HA auto-sync parameters change, such as Crontab parameters, the " -"LDAP HA sync task \n" +"When LDAP HA auto-sync parameters change, such as Crontab parameters, the LDAP HA sync task \n" " will be re-registered or updated, and this task will be invoked" msgstr "" "Когда параметры автоматической синхронизации LDAP HA изменяются, например " @@ -8097,114 +8136,114 @@ msgstr "Пользователь синхронизирован" msgid "No user synchronization required" msgstr "Нет пользователей для синхронизации" -#: settings/utils/ldap.py:509 +#: settings/utils/ldap.py:529 msgid "ldap:// or ldaps:// protocol is used." msgstr "Используйте протокол ldap:// или ldaps://" -#: settings/utils/ldap.py:520 +#: settings/utils/ldap.py:540 msgid "Host or port is disconnected: {}" msgstr "Хост или порт недоступны: {}" -#: settings/utils/ldap.py:522 +#: settings/utils/ldap.py:542 msgid "The port is not the port of the LDAP service: {}" msgstr "Порт не является портом LDAP-сервиса: {}" -#: settings/utils/ldap.py:524 +#: settings/utils/ldap.py:544 msgid "Please add certificate: {}" msgstr "Пожалуйста, добавьте сертификат" -#: settings/utils/ldap.py:528 settings/utils/ldap.py:555 -#: settings/utils/ldap.py:585 settings/utils/ldap.py:613 +#: settings/utils/ldap.py:548 settings/utils/ldap.py:575 +#: settings/utils/ldap.py:605 settings/utils/ldap.py:633 msgid "Unknown error: {}" msgstr "Неизвестная ошибка: {}" -#: settings/utils/ldap.py:542 +#: settings/utils/ldap.py:562 msgid "Bind DN or Password incorrect" msgstr "Ошибка DN привязки или пароля" -#: settings/utils/ldap.py:549 +#: settings/utils/ldap.py:569 msgid "Please enter Bind DN: {}" msgstr "Пожалуйста, введите DN привязки: {}" -#: settings/utils/ldap.py:551 +#: settings/utils/ldap.py:571 msgid "Please enter Password: {}" msgstr "Пожалуйста, введите пароль: {}" -#: settings/utils/ldap.py:553 +#: settings/utils/ldap.py:573 msgid "Please enter correct Bind DN and Password: {}" msgstr "Пожалуйста, введите правильный DN привязки и пароль: {}" -#: settings/utils/ldap.py:571 +#: settings/utils/ldap.py:591 msgid "Invalid User OU or User search filter: {}" msgstr "Недопустимый OU пользователя или фильтр пользователей: {}" -#: settings/utils/ldap.py:602 +#: settings/utils/ldap.py:622 msgid "LDAP User attr map not include: {}" msgstr "LDAP свойства сопоставления не включают: {}" -#: settings/utils/ldap.py:609 +#: settings/utils/ldap.py:629 msgid "LDAP User attr map is not dict" msgstr "LDAP свойства сопоставления недействительны" -#: settings/utils/ldap.py:628 +#: settings/utils/ldap.py:648 msgid "LDAP authentication is not enabled" msgstr "LDAP аутентификация не включена" -#: settings/utils/ldap.py:646 +#: settings/utils/ldap.py:666 msgid "Error (Invalid LDAP server): {}" msgstr "Ошибка (недопустимый адрес LDAP-сервера): {}" -#: settings/utils/ldap.py:648 +#: settings/utils/ldap.py:668 msgid "Error (Invalid Bind DN): {}" msgstr "Ошибка (недопустимый DN для связывания): {}" -#: settings/utils/ldap.py:650 +#: settings/utils/ldap.py:670 msgid "Error (Invalid LDAP User attr map): {}" msgstr "Ошибка (недопустимое сопоставление свойств LDAP): {}" -#: settings/utils/ldap.py:652 +#: settings/utils/ldap.py:672 msgid "Error (Invalid User OU or User search filter): {}" msgstr "Ошибка (недопустимый OU пользователя или фильтр пользователя): {}" -#: settings/utils/ldap.py:654 +#: settings/utils/ldap.py:674 msgid "Error (Not enabled LDAP authentication): {}" msgstr "Ошибка (LDAP аутентификация не включена): {}" -#: settings/utils/ldap.py:656 +#: settings/utils/ldap.py:676 msgid "Error (Unknown): {}" msgstr "Ошибка (неизвестная): {}" -#: settings/utils/ldap.py:659 +#: settings/utils/ldap.py:679 msgid "Succeed: Match {} users" msgstr "Успешно найдено {} пользователей" -#: settings/utils/ldap.py:689 +#: settings/utils/ldap.py:709 msgid "Authentication failed (configuration incorrect): {}" msgstr "Ошибка аутентификации (ошибка конфигурации): {}" -#: settings/utils/ldap.py:693 +#: settings/utils/ldap.py:713 msgid "Authentication failed (username or password incorrect): {}" msgstr "Ошибка аутентификации (неверное имя пользователя или пароль): {}" -#: settings/utils/ldap.py:695 +#: settings/utils/ldap.py:715 msgid "Authentication failed (Unknown): {}" msgstr "Ошибка аутентификации: (неизвестная): {}" -#: settings/utils/ldap.py:698 +#: settings/utils/ldap.py:718 msgid "Authentication success: {}" msgstr "Успешная аутентификация: {}" -#: settings/ws.py:222 +#: settings/ws.py:223 msgid "No LDAP user was found" msgstr "Не удалось получить LDAP пользователя" -#: settings/ws.py:228 +#: settings/ws.py:232 msgid "Total {}, success {}, failure {}" msgstr "Всего {} , успешно {} , неудачно {}" -#: templates/_csv_import_export.html:8 -msgid "Export" -msgstr "Экспорт" +#: settings/ws.py:236 +msgid ", disabled {}" +msgstr ", отключить {}" #: templates/_csv_import_export.html:13 templates/_csv_import_modal.html:5 #: xpack/plugins/cloud/const.py:65 @@ -8430,7 +8469,7 @@ msgstr "Тестирование прошло успешно" msgid "Test failure: Please check configuration" msgstr "Тестирование не удалось: пожалуйста, проверьте конфигурацию" -#: terminal/api/component/terminal.py:57 +#: terminal/api/component/terminal.py:56 msgid "Have online sessions" msgstr "Есть онлайн-сессия" @@ -8610,7 +8649,7 @@ msgstr "Версия" msgid "Can concurrent" msgstr "можно параллельно" -#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:179 +#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:194 #: terminal/serializers/storage.py:193 msgid "Hosts" msgstr "хост" @@ -8632,12 +8671,12 @@ msgstr "Поддерживается только пользовательска msgid "Missing type in platform.yml" msgstr "Отсутствует тип в platform.yml" -#: terminal/models/applet/applet.py:330 terminal/models/applet/host.py:36 +#: terminal/models/applet/applet.py:371 terminal/models/applet/host.py:36 #: terminal/models/applet/host.py:138 msgid "Hosting" msgstr "хост-машина" -#: terminal/models/applet/applet.py:336 +#: terminal/models/applet/applet.py:377 msgid "Applet Publication" msgstr "публикация приложения" @@ -8714,18 +8753,22 @@ msgid "SQLServer port" msgstr "SQLServer порт" #: terminal/models/component/endpoint.py:25 +msgid "Oracle port" +msgstr "Порт Oracle" + +#: terminal/models/component/endpoint.py:26 msgid "VNC port" msgstr "VNC порт" -#: terminal/models/component/endpoint.py:33 -#: terminal/models/component/endpoint.py:120 -#: terminal/serializers/endpoint.py:80 terminal/serializers/storage.py:41 +#: terminal/models/component/endpoint.py:34 +#: terminal/models/component/endpoint.py:114 +#: terminal/serializers/endpoint.py:61 terminal/serializers/storage.py:41 #: terminal/serializers/storage.py:53 terminal/serializers/storage.py:83 #: terminal/serializers/storage.py:93 terminal/serializers/storage.py:101 msgid "Endpoint" msgstr "конечная точка" -#: terminal/models/component/endpoint.py:126 +#: terminal/models/component/endpoint.py:120 msgid "Endpoint rule" msgstr "правила конечной точки" @@ -8799,7 +8842,8 @@ msgstr "Можно скачать запись сеанса" msgid "Account ID" msgstr "Аккаунт" -#: terminal/models/session/session.py:39 terminal/models/session/sharing.py:118 +#: terminal/models/session/session.py:39 +#: terminal/models/session/sharing.py:118 msgid "Login from" msgstr "Источник входа" @@ -8848,8 +8892,8 @@ msgstr "Права доступа" msgid "Origin" msgstr "Источник" -#: terminal/models/session/sharing.py:42 terminal/models/session/sharing.py:100 -#: terminal/notifications.py:279 +#: terminal/models/session/sharing.py:42 +#: terminal/models/session/sharing.py:100 terminal/notifications.py:279 msgid "Session sharing" msgstr "Обмен сеансом" @@ -8932,7 +8976,7 @@ msgid "Command and replay storage" msgstr "Команда и хранение записи" #: terminal/notifications.py:258 terminal/tasks.py:212 -#: xpack/plugins/cloud/api.py:160 +#: xpack/plugins/cloud/api.py:175 #: xpack/plugins/cloud/serializers/account.py:121 #: xpack/plugins/cloud/serializers/account.py:123 msgid "Test failure: Account invalid" @@ -8962,20 +9006,17 @@ msgstr "Адрес Core службы" #: terminal/serializers/applet_host.py:38 msgid "" " \n" -" Tips: The application release machine communicates with the Core " -"service. \n" -" If the release machine and the Core service are on the same network " -"segment, \n" -" it is recommended to fill in the intranet address, otherwise fill in " -"the current site URL \n" +" Tips: The application release machine communicates with the Core service. \n" +" If the release machine and the Core service are on the same network segment, \n" +" it is recommended to fill in the intranet address, otherwise fill in the current site URL \n" "
\n" " eg: https://172.16.10.110 or https://dev.jumpserver.com\n" " " msgstr "" "Подсказка: для связи между приложением и Core службой, если они находятся в " "одной подсети, рекомендуется указывать внутренний адрес, в противном случае " -"введите URL текущего сайта
Например: https://172.16.10.110 или https://" -"dev.jumpserver.com" +"введите URL текущего сайта
Например: https://172.16.10.110 или " +"https://dev.jumpserver.com" #: terminal/serializers/applet_host.py:46 terminal/serializers/storage.py:207 msgid "Ignore Certificate Verification" @@ -8988,13 +9029,13 @@ msgstr "Существующая лицензия RDS" #: terminal/serializers/applet_host.py:50 msgid "" "If not exist, the RDS will be in trial mode, and the trial period is 120 " -"days. Detail" +"days. Detail" msgstr "" "Если лицензия отсутствует, RDS будет находиться в режиме пробной " -"эксплуатации, который длится 120 дней. Подробнее" +"эксплуатации, который длится 120 дней. Подробнее" #: terminal/serializers/applet_host.py:55 msgid "RDS License Server" @@ -9014,7 +9055,8 @@ msgid "" "login connected, previous session will be disconnected." msgstr "" "Подсказка: RDS пользователь может иметь только одну сессию одновременно. " -"Если установлено, при следующем подключении предыдущая сессия будет разорвана" +"Если установлено, при следующем подключении предыдущая сессия будет " +"разорвана" #: terminal/serializers/applet_host.py:65 msgid "RDS Max Disconnection Time (ms)" @@ -9036,8 +9078,8 @@ msgstr "" #: terminal/serializers/applet_host.py:74 msgid "" -"Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp " -"programs (0 milliseconds, log off the session immediately)." +"Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp" +" programs (0 milliseconds, log off the session immediately)." msgstr "" "Подсказка: Установите время отключения сессии RemoteApp после закрытия всех " "программ RemoteApp (0 миллисекунд, немедленное завершение сессии)" @@ -9049,11 +9091,11 @@ msgstr "Статус нагрузки" #: terminal/serializers/applet_host.py:97 msgid "" -"These accounts are used to connect to the published application, the account " -"is now divided into two types, one is dedicated to each account, each user " +"These accounts are used to connect to the published application, the account" +" is now divided into two types, one is dedicated to each account, each user " "has a private account, the other is public, when the application does not " -"support multiple open and the special has been used, the public account will " -"be used to connect" +"support multiple open and the special has been used, the public account will" +" be used to connect" msgstr "" "Эти аккаунты используются для подключения к опубликованным приложениям. " "Существует два типа аккаунтов:
Один — это персональный, у каждого " @@ -9079,15 +9121,15 @@ msgstr "" "установить CACHE_LOGIN_PASSWORD_ENABLED=true, после изменения перезапустите " "службу" -#: terminal/serializers/applet_host.py:149 +#: terminal/serializers/applet_host.py:164 msgid "Install applets" msgstr "Установка приложения" -#: terminal/serializers/applet_host.py:179 +#: terminal/serializers/applet_host.py:194 msgid "Host ID" msgstr "ID хоста" -#: terminal/serializers/applet_host.py:180 +#: terminal/serializers/applet_host.py:195 msgid "Applet ID" msgstr "ID удаленного приложения" @@ -9115,23 +9157,7 @@ msgstr "Недействительный Session ID" msgid "Timestamp" msgstr "Метка времени" -#: terminal/serializers/endpoint.py:15 -msgid "Oracle port" -msgstr "Порт Oracle" - -#: terminal/serializers/endpoint.py:18 -msgid "Oracle port range" -msgstr "Диапазон портов Oracle" - -#: terminal/serializers/endpoint.py:20 -msgid "" -"Oracle proxy server listen port is dynamic, Each additional Oracle database " -"instance adds a port listener" -msgstr "" -"Порт прослушивания Oracle Proxy динамический, при добавлении каждого нового " -"экземпляра базы данных Oracle добавляется новый порт для прослушивания" - -#: terminal/serializers/endpoint.py:38 +#: terminal/serializers/endpoint.py:26 msgid "" "The host address accessed when connecting to assets, if it is empty, the " "access address of the current browser will be used (the default endpoint " @@ -9141,22 +9167,22 @@ msgstr "" "Если он пустой, используется адрес доступа текущего браузера (по умолчанию " "конечная точка не позволяет изменять хост)" -#: terminal/serializers/endpoint.py:71 +#: terminal/serializers/endpoint.py:52 msgid "" -"The assets within this IP range, the following endpoint will be used for the " -"connection" +"The assets within this IP range, the following endpoint will be used for the" +" connection" msgstr "" -"Активы в этом диапазоне IP будут подключаться с использованием нижеуказанных " -"конечных точек" +"Активы в этом диапазоне IP будут подключаться с использованием нижеуказанных" +" конечных точек" -#: terminal/serializers/endpoint.py:72 +#: terminal/serializers/endpoint.py:53 msgid "" "If asset IP addresses under different endpoints conflict, use asset labels" msgstr "" "Если есть конфликт IP активов под разными конечными точками, используйте " "метки активов" -#: terminal/serializers/endpoint.py:76 +#: terminal/serializers/endpoint.py:57 msgid "Asset IP" msgstr "IP актива" @@ -9241,8 +9267,8 @@ msgid "" "If there are multiple hosts, use a comma (,) to separate them.
(For " "example: http://www.jumpserver.a.com:9100, http://www.jumpserver.b.com:9100)" msgstr "" -"Если есть несколько хостов, разделите их запятыми (,)
(например: http://" -"www.jumpserver.a.com:9100, http://www.jumpserver.b.com:9100)" +"Если есть несколько хостов, разделите их запятыми (,)
(например: " +"http://www.jumpserver.a.com:9100, http://www.jumpserver.b.com:9100)" #: terminal/serializers/storage.py:199 msgid "Index by date" @@ -9419,8 +9445,7 @@ msgstr "Удаление оффлайн сессий." #: terminal/tasks.py:45 msgid "" -"Check every 10 minutes for asset connection sessions that have been inactive " -"for 3 \n" +"Check every 10 minutes for asset connection sessions that have been inactive for 3 \n" " minutes and mark these sessions as completed" msgstr "" "Каждые 10 минут проверяются подключения активов, неактивные в течение 3 " @@ -9432,8 +9457,7 @@ msgstr "Загружать записи сессий на внешнее хра #: terminal/tasks.py:70 terminal/tasks.py:104 msgid "" -"If SERVER_REPLAY_STORAGE is configured in the config.txt, session commands " -"and \n" +"If SERVER_REPLAY_STORAGE is configured in the config.txt, session commands and \n" " recordings will be uploaded to external storage" msgstr "" "Если установлено SERVER_REPLAY_STORAGE, файлы, загруженные через файловый " @@ -9449,8 +9473,7 @@ msgstr "Запустите развертывание приложения" #: terminal/tasks.py:126 msgid "" -"When deploying from the remote application publisher details page, and the " -"'Deploy' \n" +"When deploying from the remote application publisher details page, and the 'Deploy' \n" " button is clicked, this task will be executed" msgstr "" "Развертывание машин, при нажатии на развертывание выполнить это действие" @@ -9461,8 +9484,7 @@ msgstr "Установите приложение" #: terminal/tasks.py:140 msgid "" -"When the 'Deploy' button is clicked in the 'Remote Application' section of " -"the remote \n" +"When the 'Deploy' button is clicked in the 'Remote Application' section of the remote \n" " application publisher details page, this task will be executed" msgstr "" "Когда в деталях удаленной машины развертывания - удаленное приложение, при " @@ -9474,8 +9496,7 @@ msgstr "Удалите приложение" #: terminal/tasks.py:155 msgid "" -"When the 'Uninstall' button is clicked in the 'Remote Application' section " -"of the \n" +"When the 'Uninstall' button is clicked in the 'Remote Application' section of the \n" " remote application publisher details page, this task will be executed" msgstr "" "Когда в деталях удаленной машины развертывания - удаленное приложение, при " @@ -9487,8 +9508,7 @@ msgstr "Соберите аккаунты на удаленном приложе #: terminal/tasks.py:170 msgid "" -"When a remote publishing server is created and an account needs to be " -"created \n" +"When a remote publishing server is created and an account needs to be created \n" " automatically, this task will be executed" msgstr "" "Когда создается удаленная машина развертывания, необходимо автоматически " @@ -9500,12 +9520,9 @@ msgstr "Проверьте доступность команд и хранили #: terminal/tasks.py:186 msgid "" -"Check every day at midnight whether the external storage for commands and " -"recordings \n" -" is accessible. If it is not accessible, send a notification to the " -"recipients specified \n" -" in 'System Settings - Notifications - Subscription - Storage - " -"Connectivity'" +"Check every day at midnight whether the external storage for commands and recordings \n" +" is accessible. If it is not accessible, send a notification to the recipients specified \n" +" in 'System Settings - Notifications - Subscription - Storage - Connectivity'" msgstr "" "Каждую полночь проверяйте доступность соединения команд и записи с внешним " "хранилищем, при отсутствии соединения отправьте уведомление: Настройки " @@ -9516,29 +9533,6 @@ msgstr "" msgid "view" msgstr "Просмотр" -#: terminal/utils/db_port_mapper.py:88 -msgid "" -"No available port is matched. The number of databases may have exceeded the " -"number of ports open to the database agent service, Contact the " -"administrator to open more ports." -msgstr "" -"Не удалось найти доступные порты, количество баз данных может превышать " -"количество открытых портов службы прокси-базы данных; пожалуйста, свяжитесь " -"с администратором для открытия большего количества портов." - -#: terminal/utils/db_port_mapper.py:116 -msgid "" -"No ports can be used, check and modify the limit on the number of ports that " -"Magnus listens on in the configuration file." -msgstr "" -"Нет доступных портов, проверьте и измените ограничение на количество портов " -"в конфигурационном файле, прослушиваемых Magnus." - -#: terminal/utils/db_port_mapper.py:118 -msgid "All available port count: {}, Already use port count: {}" -msgstr "" -"Общее количество доступных портов: {} , количество использованных портов: {}" - #: tickets/api/ticket.py:88 tickets/models/ticket/general.py:289 msgid "Applicant" msgstr "Заявитель" @@ -9597,8 +9591,8 @@ msgid "" "processor: {} ticket ID: {}" msgstr "" "Создано через рабочее задание, Заголовок рабочего задания: {}, Заявитель " -"рабочего задания: {}, Исполнитель рабочего задания: {}, ID рабочего задания: " -"{}" +"рабочего задания: {}, Исполнитель рабочего задания: {}, ID рабочего задания:" +" {}" #: tickets/handlers/base.py:84 msgid "Change field" @@ -9890,8 +9884,8 @@ msgstr "Организационный аудитор" #: users/const.py:18 msgid "Reset link will be generated and sent to the user" msgstr "" -"Создайте ссылку для сброса пароля и отправьте ее пользователю по электронной " -"почте." +"Создайте ссылку для сброса пароля и отправьте ее пользователю по электронной" +" почте." #: users/const.py:19 msgid "Set password" @@ -9968,8 +9962,8 @@ msgstr "" #: users/forms/profile.py:69 msgid "" -"In order to protect you and your company, please keep your account, password " -"and key sensitive information properly. (for example: setting complex " +"In order to protect you and your company, please keep your account, password" +" and key sensitive information properly. (for example: setting complex " "password, enabling MFA)" msgstr "" "Для защиты вас и компании храните вашу учетную запись, пароль и ключи, а " @@ -10134,8 +10128,8 @@ msgstr "Название темы терминала" #: users/serializers/preference/lina.py:12 msgid "" "*! The password for file encryption, used for decryption when the system " -"sends emails containing file attachments.
Such as: account backup files, " -"account password change results files" +"sends emails containing file attachments.
Such as: account backup files," +" account password change results files" msgstr "" "Пароль шифрования файлов, используемый для расшифровки, когда электронное " "письмо от системы содержит вложение.
Например: файл резервной копии " @@ -10219,7 +10213,7 @@ msgstr "Командная строка" msgid "The old password is incorrect" msgstr "Неверный старый пароль" -#: users/serializers/profile.py:37 users/serializers/profile.py:148 +#: users/serializers/profile.py:37 users/serializers/profile.py:156 msgid "Password does not match security rules" msgstr "Пароль не соответствует требованиям безопасности" @@ -10233,8 +10227,8 @@ msgstr "Системная роль" #: users/serializers/user.py:55 msgid "" -"System roles are roles at the system level, and they will take effect across " -"all organizations" +"System roles are roles at the system level, and they will take effect across" +" all organizations" msgstr "" "Системная роль — это роль на уровне системы, которая будет действовать во " "всех организациях" @@ -10315,7 +10309,8 @@ msgid "" msgstr "" "Идентификатор источника пользователя - место создания пользователя, может " "быть AD или другой источник. Настройки безопасности могут ограничивать " -"пользователей возможностью входа в систему только из определенных источников." +"пользователей возможностью входа в систему только из определенных " +"источников." #: users/serializers/user.py:260 msgid "Is org admin" @@ -10335,10 +10330,11 @@ msgstr "Аутентификация" #: users/serializers/user.py:422 msgid "" -"* For security, only a partial of users is displayed. You can search for more" +"* For security, only a partial of users is displayed. You can search for " +"more" msgstr "" -"* В целях безопасности отображаются только некоторые пользователи. Вы можете " -"выполнить поиск по другим" +"* В целях безопасности отображаются только некоторые пользователи. Вы можете" +" выполнить поиск по другим" #: users/serializers/user.py:457 msgid "name not unique" @@ -10347,8 +10343,7 @@ msgstr "повторяющимся именам" #: users/signal_handlers.py:41 msgid "" "The administrator has enabled \"Only allow existing users to log in\", \n" -" and the current user is not in the user list. Please contact the " -"administrator." +" and the current user is not in the user list. Please contact the administrator." msgstr "" "Администратор включил опцию 'разрешить вход только существующим " "пользователям', текущий пользователь не входит в список пользователей, " @@ -10360,8 +10355,7 @@ msgstr "Очистить истекшие пользовательские се #: users/signal_handlers.py:179 msgid "" -"After logging in via the web, a user session record is created. At 2 a.m. " -"every day, \n" +"After logging in via the web, a user session record is created. At 2 a.m. every day, \n" " the system cleans up inactive user devices" msgstr "" "После входа через веб-версию создается запись о пользовательской сессии в " @@ -10374,8 +10368,7 @@ msgstr "Проверка срока действия пароля" #: users/tasks.py:28 msgid "" -"Check every day at 10 AM whether the passwords of users in the system are " -"expired, \n" +"Check every day at 10 AM whether the passwords of users in the system are expired, \n" " and send a notification 5 days in advance" msgstr "" "Каждое утро в 10 часов проверяется, истек ли срок действия пароля у " @@ -10387,15 +10380,13 @@ msgstr "Периодическая проверка срока действия #: users/tasks.py:48 msgid "" -"With version iterations, new tasks may be added, or task names and execution " -"times may \n" -" be modified. Therefore, upon system startup, it is necessary to " -"register or update the \n" +"With version iterations, new tasks may be added, or task names and execution times may \n" +" be modified. Therefore, upon system startup, it is necessary to register or update the \n" " parameters of the task that checks if passwords have expired" msgstr "" "С увеличением версий могут добавляться новые задачи или изменяться названия " -"задач и время выполнения, по этой причине при запуске системы регистрируются " -"или обновляются параметры задачи проверки срока действия пароля" +"задач и время выполнения, по этой причине при запуске системы регистрируются" +" или обновляются параметры задачи проверки срока действия пароля" #: users/tasks.py:67 msgid "Check user expired" @@ -10403,8 +10394,7 @@ msgstr "Проверка истечения срока действия поль #: users/tasks.py:69 msgid "" -"Check every day at 2 p.m whether the users in the system are expired, and " -"send a \n" +"Check every day at 2 p.m whether the users in the system are expired, and send a \n" " notification 5 days in advance" msgstr "" "Каждый день в 2 часа дня происходит проверка, истек ли срок действия " @@ -10416,15 +10406,13 @@ msgstr "Периодическая проверка истечения срок #: users/tasks.py:92 msgid "" -"With version iterations, new tasks may be added, or task names and execution " -"times may \n" -" be modified. Therefore, upon system startup, it is necessary to " -"register or update the \n" +"With version iterations, new tasks may be added, or task names and execution times may \n" +" be modified. Therefore, upon system startup, it is necessary to register or update the \n" " parameters of the task that checks if users have expired" msgstr "" "С увеличением версий могут добавляться новые задачи или изменяться названия " -"задач и время выполнения, по этой причине при запуске системы регистрируются " -"или обновляются параметры задачи проверки истечения срока действия " +"задач и время выполнения, по этой причине при запуске системы регистрируются" +" или обновляются параметры задачи проверки истечения срока действия " "пользователя." #: users/tasks.py:111 @@ -10433,10 +10421,8 @@ msgstr "Проверка неиспользуемых пользователей #: users/tasks.py:113 msgid "" -"At 2 p.m. every day, according to the configuration in \"System Settings - " -"Security - \n" -" Auth security - Auto disable threshold\" users who have not logged " -"in or whose API keys \n" +"At 2 p.m. every day, according to the configuration in \"System Settings - Security - \n" +" Auth security - Auto disable threshold\" users who have not logged in or whose API keys \n" " have not been used for a long time will be disabled" msgstr "" "Каждый день в 14:00, в соответствии с настройками системы - безопасности - " @@ -10510,7 +10496,8 @@ msgstr "Введите ваш email, мы отправим вам письмо msgid "" "Enter your mobile number and a verification code will be sent to your phone" msgstr "" -"Введите свой номер телефона, код подтверждения будет отправлен на ваш телефон" +"Введите свой номер телефона, код подтверждения будет отправлен на ваш " +"телефон" #: users/templates/users/forgot_password.html:71 msgid "Email account" @@ -10581,8 +10568,8 @@ msgstr "Привязать MFA-валидатор" #: users/templates/users/user_otp_enable_bind.html:13 msgid "" -"Use the MFA Authenticator application to scan the following qr code for a 6-" -"bit verification code" +"Use the MFA Authenticator application to scan the following qr code for a " +"6-bit verification code" msgstr "" "Используйте приложение для MFA-валидатора для сканирования следующего QR-" "кода и получения 6-значного кода" @@ -10601,8 +10588,8 @@ msgid "" "Download and install the MFA Authenticator application on your phone or " "applet of WeChat" msgstr "" -"Пожалуйста, скачайте и установите приложение для MFA-валидатора на мобильном " -"устройстве или через WeChat мини-программу" +"Пожалуйста, скачайте и установите приложение для MFA-валидатора на мобильном" +" устройстве или через WeChat мини-программу" #: users/templates/users/user_otp_enable_install_app.html:18 msgid "Android downloads" @@ -10666,7 +10653,8 @@ msgstr "Уже привязано" #: users/views/profile/otp.py:107 msgid "MFA already bound, disable first, then bound" msgstr "" -"MFA(OTP) уже привязано, пожалуйста, сначала отключите, затем привяжите заново" +"MFA(OTP) уже привязано, пожалуйста, сначала отключите, затем привяжите " +"заново" #: users/views/profile/otp.py:134 msgid "OTP enable success" @@ -10694,8 +10682,8 @@ msgstr "Неправильное имя пользователя или паро #: users/views/profile/reset.py:66 msgid "" -"Non-local users can log in only from third-party platforms and cannot change " -"their passwords: {}" +"Non-local users can log in only from third-party platforms and cannot change" +" their passwords: {}" msgstr "" "Несистемные пользователи могут входить только через сторонние платформы, " "изменение пароля не поддерживается: {}" @@ -10734,15 +10722,15 @@ msgstr "" "Активы, не соответствующие политике, будут пропущены в соответствии с " "текущей конфигурацией задачи." -#: xpack/plugins/cloud/api.py:72 +#: xpack/plugins/cloud/api.py:74 msgid "Test connection successful" msgstr "Тест успешен" -#: xpack/plugins/cloud/api.py:74 +#: xpack/plugins/cloud/api.py:76 msgid "Test connection failed: {}" msgstr "Ошибка соединения: {}" -#: xpack/plugins/cloud/api.py:171 +#: xpack/plugins/cloud/api.py:196 msgid "User {} deleted the current resource and released the assets" msgstr "" "Пользователь {} удалил активы, которые были освобождены в текущем ресурсе" @@ -11081,7 +11069,8 @@ msgstr "Экземпляр" msgid "Sync instance detail" msgstr "Детали синхронизации экземпляра" -#: xpack/plugins/cloud/models.py:313 xpack/plugins/cloud/serializers/task.py:79 +#: xpack/plugins/cloud/models.py:313 +#: xpack/plugins/cloud/serializers/task.py:79 msgid "Rule relation" msgstr "Условные отношения" @@ -11137,7 +11126,8 @@ msgstr "Сопоставление правил" msgid "Rule value" msgstr "Значение правил" -#: xpack/plugins/cloud/models.py:383 xpack/plugins/cloud/serializers/task.py:82 +#: xpack/plugins/cloud/models.py:383 +#: xpack/plugins/cloud/serializers/task.py:82 msgid "Strategy rule" msgstr "Условие" @@ -11153,7 +11143,8 @@ msgstr "Атрибуты действия" msgid "Action value" msgstr "Значение действия" -#: xpack/plugins/cloud/models.py:410 xpack/plugins/cloud/serializers/task.py:85 +#: xpack/plugins/cloud/models.py:410 +#: xpack/plugins/cloud/serializers/task.py:85 msgid "Strategy action" msgstr "Action" @@ -11466,13 +11457,14 @@ msgstr "Количество экземпляров" #: xpack/plugins/cloud/tasks.py:33 #, fuzzy #| msgid "" -#| "Execute this task when manually or scheduled cloud synchronization tasks " -#| "are performed" +#| "Execute this task when manually or scheduled cloud synchronization tasks are" +#| " performed" msgid "" -"Execute this task when manually or scheduled cloud synchronization tasks are " -"performed" +"Execute this task when manually or scheduled cloud synchronization tasks are" +" performed" msgstr "" -"В ручном или по расписанию выполняйте эту задачу облачной синхронизации" +"Выполняйте это действие при ручной или запланированной синхронизации в " +"облаке." #: xpack/plugins/cloud/tasks.py:50 msgid "Period clean sync instance task execution" @@ -11481,21 +11473,17 @@ msgstr "Регулярно очищать записи выполнения за #: xpack/plugins/cloud/tasks.py:52 #, fuzzy #| msgid "" -#| "Every day, according to the configuration in \"System Settings - Tasks - " -#| "Regular \n" -#| " clean-up - Cloud sync task history retention days\" the system " -#| "will clean up the execution \n" +#| "Every day, according to the configuration in \"System Settings - Tasks - Regular \n" +#| " clean-up - Cloud sync task history retention days\" the system will clean up the execution \n" #| " records generated by cloud synchronization" msgid "" -"Every day, according to the configuration in \"System Settings - Tasks - " -"Regular \n" -" clean-up - Cloud sync task history retention days\" the system will " -"clean up the execution \n" +"Every day, according to the configuration in \"System Settings - Tasks - Regular \n" +" clean-up - Cloud sync task history retention days\" the system will clean up the execution \n" " records generated by cloud synchronization" msgstr "" -"Каждый день система будет регулярно очищать историю заданий облачной " -"синхронизации в соответствии с конфигурацией в разделе «Настройки системы - " -"Задания» в соответствии с установленным количеством дней хранения." +"Каждый день система будет очищать историю выполнения задач облачной " +"синхронизации в соответствии с конфигурацией в «Системные настройки - Задачи" +" -», основываясь на количестве дней хранения." #: xpack/plugins/interface/api.py:52 msgid "Restore default successfully." @@ -11551,6 +11539,55 @@ msgstr "Лицензия успешно импортирована" msgid "Invalid license" msgstr "Лицензия недействительна" +#~ msgid "Deleting other people's script is not allowed" +#~ msgstr "Удаление чужих скриптов не разрешено" + +#~ msgid "Deleting other people's playbook is not allowed" +#~ msgstr "Удаление чужого playbook запрещено." + +#, fuzzy +#~ msgid "Directory services" +#~ msgstr "Служба каталогов" + +#, python-format +#~ msgid "User %s view/export secret" +#~ msgstr "Пользователь %s просмотрел/экспортировал пароль" + +#~ msgid "Enabled, the web session and replay contains watermark information" +#~ msgstr "" +#~ "После активации веб-сессии и записи будут содержать информацию о водяном " +#~ "знаке" + +#~ msgid "Oracle port range" +#~ msgstr "Диапазон портов Oracle" + +#~ msgid "" +#~ "Oracle proxy server listen port is dynamic, Each additional Oracle database " +#~ "instance adds a port listener" +#~ msgstr "" +#~ "Порт прослушивания Oracle Proxy динамический, при добавлении каждого нового " +#~ "экземпляра базы данных Oracle добавляется новый порт для прослушивания" + +#~ msgid "" +#~ "No available port is matched. The number of databases may have exceeded the " +#~ "number of ports open to the database agent service, Contact the " +#~ "administrator to open more ports." +#~ msgstr "" +#~ "Не удалось найти доступные порты, количество баз данных может превышать " +#~ "количество открытых портов службы прокси-базы данных; пожалуйста, свяжитесь " +#~ "с администратором для открытия большего количества портов." + +#~ msgid "" +#~ "No ports can be used, check and modify the limit on the number of ports that" +#~ " Magnus listens on in the configuration file." +#~ msgstr "" +#~ "Нет доступных портов, проверьте и измените ограничение на количество портов " +#~ "в конфигурационном файле, прослушиваемых Magnus." + +#~ msgid "All available port count: {}, Already use port count: {}" +#~ msgstr "" +#~ "Общее количество доступных портов: {} , количество использованных портов: {}" + #~ msgid "Password error" #~ msgstr "Неверный пароль" diff --git a/apps/i18n/core/zh/LC_MESSAGES/django.po b/apps/i18n/core/zh/LC_MESSAGES/django.po index d8a1cb931..a539fc3d2 100644 --- a/apps/i18n/core/zh/LC_MESSAGES/django.po +++ b/apps/i18n/core/zh/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-20 11:52+0800\n" +"POT-Creation-Date: 2025-04-17 15:04+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -17,18 +17,18 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.3\n" -#: accounts/api/account/account.py:121 +#: accounts/api/account/account.py:131 #: accounts/serializers/account/account.py:181 -#: accounts/serializers/account/account.py:342 +#: accounts/serializers/account/account.py:344 msgid "Account already exists" msgstr "账号已存在" #: accounts/api/account/application.py:78 -#: authentication/api/connection_token.py:452 +#: authentication/api/connection_token.py:451 msgid "Account not found" msgstr "账号未找到" -#: accounts/api/automations/base.py:83 tickets/api/ticket.py:132 +#: accounts/api/automations/base.py:86 tickets/api/ticket.py:132 msgid "The parameter 'action' must be [{}]" msgstr "参数 'action' 必须是 [{}]" @@ -93,7 +93,7 @@ msgstr "账号备份计划正在执行" msgid "Plan execution end" msgstr "计划执行结束" -#: accounts/automations/base/manager.py:118 +#: accounts/automations/base/manager.py:119 msgid "No pending accounts found" msgstr "未找到待处理帐户" @@ -129,8 +129,8 @@ msgstr ">>> 开始执行测试网关账号可连接性任务" #: authentication/templates/authentication/login.html:362 #: authentication/templates/authentication/login.html:408 #: settings/serializers/auth/ldap.py:27 settings/serializers/auth/ldap.py:53 -#: settings/serializers/auth/ldap_ha.py:36 settings/serializers/msg.py:37 -#: settings/serializers/terminal.py:28 terminal/serializers/storage.py:123 +#: settings/serializers/auth/ldap_ha.py:35 settings/serializers/msg.py:37 +#: settings/serializers/terminal.py:32 terminal/serializers/storage.py:123 #: terminal/serializers/storage.py:142 users/forms/profile.py:22 #: users/serializers/user.py:148 #: users/templates/users/_msg_user_created.html:13 @@ -202,7 +202,7 @@ msgid "Update" msgstr "更新" #: accounts/const/account.py:34 accounts/const/automation.py:115 -#: accounts/serializers/automations/change_secret.py:169 audits/const.py:65 +#: accounts/serializers/automations/change_secret.py:169 audits/const.py:66 #: audits/signal_handlers/activity_log.py:34 common/const/choices.py:67 #: ops/const.py:76 terminal/const.py:81 xpack/plugins/cloud/const.py:47 msgid "Failed" @@ -305,7 +305,7 @@ msgstr "创建并推送" msgid "Only create" msgstr "仅创建" -#: accounts/const/automation.py:109 +#: accounts/const/automation.py:109 authentication/const.py:34 #: authentication/serializers/password_mfa.py:16 #: authentication/serializers/password_mfa.py:24 #: notifications/backends/__init__.py:10 settings/serializers/msg.py:21 @@ -321,7 +321,7 @@ msgid "SFTP" msgstr "SFTP" #: accounts/const/automation.py:116 -#: accounts/serializers/automations/change_secret.py:168 audits/const.py:64 +#: accounts/serializers/automations/change_secret.py:168 audits/const.py:65 #: audits/models.py:65 audits/signal_handlers/activity_log.py:34 #: common/const/choices.py:66 ops/const.py:74 ops/serializers/celery.py:48 #: terminal/const.py:80 terminal/models/session/sharing.py:121 @@ -412,33 +412,11 @@ msgid "" "Vault." msgstr "Vault 操作失败,请重试,或者检查 Vault 上的账号信息。" -#: accounts/filters.py:194 -msgid "Enter a valid UUID." -msgstr "" - -#: accounts/mixins.py:35 -msgid "Export all" -msgstr "导出所有" - -#: accounts/mixins.py:37 -msgid "Export only selected items" -msgstr "仅导出选择项" - -#: accounts/mixins.py:42 -#, python-format -msgid "Export filtered: %s" -msgstr "导出搜素: %s" - -#: accounts/mixins.py:48 -#, python-format -msgid "User %s view/export secret" -msgstr "用户 %s 查看/导出 了密码" - #: accounts/models/account.py:85 #: accounts/models/automations/check_account.py:59 #: accounts/models/automations/gather_account.py:17 -#: accounts/serializers/account/account.py:226 -#: accounts/serializers/account/account.py:274 +#: accounts/serializers/account/account.py:227 +#: accounts/serializers/account/account.py:276 #: accounts/serializers/automations/change_secret.py:113 #: accounts/serializers/automations/change_secret.py:145 #: accounts/serializers/automations/check_account.py:33 @@ -452,9 +430,9 @@ msgstr "用户 %s 查看/导出 了密码" #: accounts/templates/accounts/push_account_report.html:78 #: accounts/templates/accounts/push_account_report.html:118 #: acls/serializers/base.py:130 assets/models/asset/common.py:102 -#: assets/models/asset/common.py:366 assets/models/cmd_filter.py:36 -#: audits/models.py:59 audits/models.py:312 audits/serializers.py:228 -#: authentication/models/connection_token.py:40 +#: assets/models/asset/common.py:428 assets/models/cmd_filter.py:36 +#: audits/models.py:59 audits/models.py:312 audits/serializers.py:230 +#: authentication/models/connection_token.py:41 #: perms/models/asset_permission.py:69 terminal/backends/command/models.py:17 #: terminal/models/session/session.py:34 terminal/notifications.py:156 #: terminal/serializers/command.py:17 terminal/serializers/session.py:30 @@ -465,10 +443,10 @@ msgid "Asset" msgstr "资产" #: accounts/models/account.py:89 accounts/models/template.py:16 -#: accounts/serializers/account/account.py:233 -#: accounts/serializers/account/account.py:284 +#: accounts/serializers/account/account.py:234 +#: accounts/serializers/account/account.py:286 #: accounts/serializers/account/template.py:35 -#: authentication/serializers/connect_token_secret.py:50 +#: authentication/serializers/connect_token_secret.py:51 msgid "Su from" msgstr "切换自" @@ -486,7 +464,7 @@ msgstr "历史账号" msgid "Secret reset" msgstr "可改密" -#: accounts/models/account.py:97 accounts/serializers/account/account.py:228 +#: accounts/models/account.py:97 accounts/serializers/account/account.py:229 #: users/models/user/__init__.py:122 msgid "Source" msgstr "来源" @@ -513,14 +491,14 @@ msgstr "改密状态" #: accounts/models/account.py:107 #: accounts/models/automations/check_account.py:64 -#: accounts/serializers/account/service.py:11 +#: accounts/serializers/account/service.py:12 #: accounts/serializers/automations/change_secret.py:115 #: accounts/serializers/automations/change_secret.py:146 #: accounts/templates/accounts/change_secret_failed_info.html:12 #: acls/serializers/base.py:131 #: acls/templates/acls/asset_login_reminder.html:10 #: assets/serializers/gateway.py:33 audits/models.py:60 audits/models.py:313 -#: audits/serializers.py:229 authentication/api/connection_token.py:464 +#: audits/serializers.py:231 authentication/api/connection_token.py:463 #: ops/models/base.py:18 perms/models/asset_permission.py:75 #: settings/serializers/msg.py:33 terminal/backends/command/models.py:18 #: terminal/models/session/session.py:36 terminal/serializers/command.py:72 @@ -557,28 +535,28 @@ msgstr "可以移除账号" #: accounts/models/application.py:16 #: accounts/models/automations/check_account.py:116 accounts/models/base.py:63 -#: accounts/serializers/account/service.py:27 +#: accounts/serializers/account/service.py:28 #: accounts/serializers/account/virtual.py:20 acls/models/base.py:35 #: acls/models/base.py:96 acls/models/command_acl.py:21 #: acls/serializers/base.py:35 assets/models/asset/common.py:100 #: assets/models/asset/common.py:166 assets/models/cmd_filter.py:21 #: assets/models/domain.py:19 assets/models/label.py:18 #: assets/models/platform.py:15 assets/models/platform.py:94 -#: assets/serializers/asset/common.py:171 assets/serializers/platform.py:158 -#: assets/serializers/platform.py:278 +#: assets/serializers/asset/common.py:173 assets/serializers/platform.py:158 +#: assets/serializers/platform.py:283 #: authentication/backends/passkey/models.py:10 #: authentication/models/ssh_key.py:12 -#: authentication/serializers/connect_token_secret.py:113 -#: authentication/serializers/connect_token_secret.py:170 labels/models.py:11 +#: authentication/serializers/connect_token_secret.py:115 +#: authentication/serializers/connect_token_secret.py:172 labels/models.py:11 #: ops/mixin.py:32 ops/models/adhoc.py:19 ops/models/celery.py:15 -#: ops/models/celery.py:81 ops/models/job.py:145 ops/models/playbook.py:28 +#: ops/models/celery.py:81 ops/models/job.py:147 ops/models/playbook.py:28 #: ops/models/variable.py:9 ops/serializers/job.py:20 #: ops/serializers/variable.py:20 orgs/models.py:82 #: perms/models/asset_permission.py:61 rbac/models/role.py:29 #: rbac/serializers/role.py:28 settings/models.py:37 settings/models.py:186 #: settings/serializers/msg.py:89 settings/serializers/terminal.py:9 #: terminal/models/applet/applet.py:34 terminal/models/component/endpoint.py:13 -#: terminal/models/component/endpoint.py:112 +#: terminal/models/component/endpoint.py:106 #: terminal/models/component/storage.py:26 terminal/models/component/task.py:13 #: terminal/models/component/terminal.py:86 #: terminal/models/virtualapp/provider.py:10 @@ -605,13 +583,13 @@ msgstr "密文" #: accounts/models/application.py:21 acls/models/base.py:98 #: assets/models/automations/base.py:22 assets/models/cmd_filter.py:38 #: assets/serializers/asset/common.py:148 -#: assets/serializers/asset/common.py:420 perms/serializers/permission.py:66 -#: perms/serializers/user_permission.py:75 rbac/tree.py:35 +#: assets/serializers/asset/common.py:423 perms/serializers/permission.py:66 +#: perms/serializers/user_permission.py:76 rbac/tree.py:35 msgid "Accounts" msgstr "账号" #: accounts/models/application.py:22 authentication/models/access_key.py:20 -#: terminal/models/component/endpoint.py:113 +#: terminal/models/component/endpoint.py:107 msgid "IP group" msgstr "IP 组" @@ -623,12 +601,12 @@ msgid "Date last used" msgstr "最后使用日期" #: accounts/models/application.py:24 acls/models/base.py:43 -#: assets/models/asset/common.py:178 authentication/models/access_key.py:23 -#: authentication/models/connection_token.py:58 +#: assets/models/asset/common.py:182 authentication/models/access_key.py:23 +#: authentication/models/connection_token.py:59 #: authentication/models/ssh_key.py:13 authentication/serializers/ssh_key.py:23 #: authentication/templates/authentication/_access_key_modal.html:32 -#: perms/models/asset_permission.py:82 terminal/models/component/endpoint.py:28 -#: terminal/models/component/endpoint.py:123 +#: perms/models/asset_permission.py:82 terminal/models/component/endpoint.py:29 +#: terminal/models/component/endpoint.py:117 #: terminal/models/session/sharing.py:29 terminal/serializers/terminal.py:44 #: tickets/const.py:36 msgid "Active" @@ -729,8 +707,8 @@ msgstr "更改后检查连接" #: accounts/models/automations/check_account.py:19 #: accounts/models/automations/gather_account.py:117 #: accounts/serializers/automations/change_secret.py:59 -#: settings/serializers/auth/ldap.py:101 -#: settings/serializers/auth/ldap_ha.py:84 settings/serializers/msg.py:45 +#: settings/serializers/auth/ldap.py:105 +#: settings/serializers/auth/ldap_ha.py:87 settings/serializers/msg.py:45 msgid "Recipient" msgstr "收件人" @@ -740,7 +718,7 @@ msgstr "自动化改密" #: accounts/models/automations/change_secret.py:47 #: assets/models/automations/base.py:145 ops/models/base.py:56 -#: ops/models/celery.py:90 ops/models/job.py:240 +#: ops/models/celery.py:90 ops/models/job.py:242 #: terminal/models/applet/host.py:142 msgid "Date finished" msgstr "结束日期" @@ -751,11 +729,11 @@ msgstr "结束日期" #: accounts/serializers/automations/check_account.py:39 #: assets/models/automations/base.py:137 #: assets/serializers/automations/base.py:45 audits/models.py:209 -#: audits/serializers.py:78 ops/models/base.py:49 ops/models/job.py:231 -#: terminal/models/applet/applet.py:331 terminal/models/applet/host.py:140 +#: audits/serializers.py:77 ops/models/base.py:49 ops/models/job.py:233 +#: terminal/models/applet/applet.py:372 terminal/models/applet/host.py:140 #: terminal/models/component/status.py:30 #: terminal/models/virtualapp/virtualapp.py:99 -#: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:148 +#: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:163 #: terminal/serializers/virtualapp.py:35 tickets/models/ticket/general.py:284 #: tickets/serializers/super_ticket.py:13 #: tickets/serializers/ticket/ticket.py:20 xpack/plugins/cloud/models.py:227 @@ -764,7 +742,7 @@ msgid "Status" msgstr "状态" #: accounts/models/automations/change_secret.py:51 -#: accounts/serializers/account/account.py:276 +#: accounts/serializers/account/account.py:278 #: accounts/templates/accounts/change_secret_failed_info.html:13 #: assets/const/automation.py:9 #: authentication/templates/authentication/passkey.html:173 @@ -866,6 +844,8 @@ msgstr "重复密码" #: acls/serializers/base.py:19 acls/serializers/base.py:50 audits/models.py:189 #: authentication/forms.py:21 authentication/forms.py:23 #: authentication/models/temp_token.py:9 +#: authentication/serializers/connect_token_secret.py:43 +#: authentication/serializers/connect_token_secret.py:53 #: authentication/templates/authentication/_msg_different_city.html:9 #: authentication/templates/authentication/_msg_oauth_bind.html:9 #: authentication/templates/authentication/login.html:408 @@ -983,11 +963,11 @@ msgid "Verify asset account" msgstr "账号验证" #: accounts/models/base.py:37 accounts/models/base.py:66 -#: accounts/serializers/account/account.py:470 +#: accounts/serializers/account/account.py:471 #: accounts/serializers/account/base.py:17 #: accounts/serializers/automations/change_secret.py:48 #: authentication/serializers/connect_token_secret.py:42 -#: authentication/serializers/connect_token_secret.py:51 +#: authentication/serializers/connect_token_secret.py:52 #: terminal/serializers/storage.py:140 msgid "Secret type" msgstr "密文类型" @@ -1004,7 +984,7 @@ msgstr "密码规则" #: accounts/models/base.py:69 assets/models/automations/base.py:28 #: assets/models/cmd_filter.py:39 assets/models/label.py:22 -#: authentication/serializers/connect_token_secret.py:117 +#: authentication/serializers/connect_token_secret.py:119 #: terminal/models/applet/applet.py:41 #: terminal/models/virtualapp/virtualapp.py:23 users/serializers/user.py:257 msgid "Is active" @@ -1119,7 +1099,7 @@ msgstr "忽略" msgid "Reopen" msgstr "重新打开" -#: accounts/risk_handlers.py:19 audits/const.py:38 +#: accounts/risk_handlers.py:19 audits/const.py:39 #: authentication/templates/authentication/_access_key_modal.html:155 #: authentication/templates/authentication/_mfa_confirm_modal.html:53 #: templates/_modal.html:22 tickets/const.py:43 @@ -1147,15 +1127,13 @@ msgstr "新增账号" msgid "Change password and Add" msgstr "改密并添加" -#: accounts/risk_handlers.py:26 audits/const.py:31 ops/const.py:9 +#: accounts/risk_handlers.py:26 audits/const.py:32 ops/const.py:9 msgid "Change password" msgstr "改密" #: accounts/risk_handlers.py:127 -#, fuzzy -#| msgid "Test connection failed: {}" msgid "Execution failed: {}" -msgstr "测试连接失败:{}" +msgstr "执行失败:{}" #: accounts/serializers/account/account.py:31 msgid "Push now" @@ -1172,7 +1150,7 @@ msgstr "账号存在策略" #: accounts/serializers/account/account.py:206 assets/models/label.py:21 #: assets/models/platform.py:95 assets/serializers/asset/common.py:145 #: assets/serializers/cagegory.py:12 assets/serializers/platform.py:173 -#: assets/serializers/platform.py:279 perms/serializers/user_permission.py:26 +#: assets/serializers/platform.py:284 perms/serializers/user_permission.py:26 #: settings/models.py:39 tickets/models/ticket/apply_application.py:13 #: users/models/preference.py:12 msgid "Category" @@ -1183,9 +1161,9 @@ msgstr "类别" #: assets/models/automations/base.py:146 assets/models/cmd_filter.py:74 #: assets/models/platform.py:96 assets/serializers/asset/common.py:146 #: assets/serializers/platform.py:160 assets/serializers/platform.py:172 -#: audits/serializers.py:77 audits/serializers.py:194 -#: authentication/models/connection_token.py:62 -#: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:153 +#: audits/serializers.py:76 audits/serializers.py:196 +#: authentication/models/connection_token.py:63 +#: authentication/serializers/connect_token_secret.py:128 ops/models/job.py:155 #: perms/serializers/user_permission.py:27 terminal/models/applet/applet.py:40 #: terminal/models/component/storage.py:58 #: terminal/models/component/storage.py:152 terminal/serializers/applet.py:29 @@ -1197,66 +1175,72 @@ msgstr "类别" msgid "Type" msgstr "类型" -#: accounts/serializers/account/account.py:222 +#: accounts/serializers/account/account.py:223 msgid "Asset not found" msgstr "资产不存在" -#: accounts/serializers/account/account.py:265 +#: accounts/serializers/account/account.py:236 assets/const/category.py:15 +#: assets/models/asset/common.py:180 assets/models/asset/ds.py:14 +#: assets/serializers/asset/common.py:180 +msgid "Directory service" +msgstr "目录服务" + +#: accounts/serializers/account/account.py:267 msgid "Has secret" msgstr "已托管密码" -#: accounts/serializers/account/account.py:275 ops/models/celery.py:84 +#: accounts/serializers/account/account.py:277 ops/models/celery.py:84 #: tickets/models/comment.py:13 tickets/models/ticket/general.py:49 #: tickets/models/ticket/general.py:280 tickets/serializers/super_ticket.py:14 msgid "State" msgstr "状态" -#: accounts/serializers/account/account.py:277 +#: accounts/serializers/account/account.py:279 msgid "Changed" msgstr "已修改" -#: accounts/serializers/account/account.py:287 acls/models/base.py:97 +#: accounts/serializers/account/account.py:289 acls/models/base.py:97 #: acls/templates/acls/asset_login_reminder.html:9 #: assets/models/automations/base.py:25 -#: assets/serializers/automations/base.py:20 assets/serializers/domain.py:34 +#: assets/serializers/automations/base.py:20 assets/serializers/domain.py:33 #: assets/serializers/platform.py:181 assets/serializers/platform.py:213 -#: authentication/api/connection_token.py:463 ops/models/base.py:17 -#: ops/models/job.py:155 ops/serializers/job.py:21 +#: authentication/api/connection_token.py:462 ops/models/base.py:17 +#: ops/models/job.py:157 ops/serializers/job.py:21 #: perms/serializers/permission.py:57 #: terminal/templates/terminal/_msg_command_execute_alert.html:16 #: xpack/plugins/cloud/manager.py:93 msgid "Assets" msgstr "资产" -#: accounts/serializers/account/account.py:392 +#: accounts/serializers/account/account.py:394 #, python-format msgid "Asset does not support this secret type: %s" msgstr "资产不支持账号类型: %s" -#: accounts/serializers/account/account.py:424 +#: accounts/serializers/account/account.py:426 msgid "Account has exist" msgstr "账号已存在" -#: accounts/serializers/account/account.py:461 +#: accounts/serializers/account/account.py:463 #: accounts/serializers/account/base.py:86 #: accounts/serializers/account/template.py:66 -#: assets/serializers/asset/common.py:421 +#: assets/serializers/asset/common.py:424 msgid "Spec info" msgstr "特殊信息" -#: accounts/serializers/account/account.py:471 -#: authentication/serializers/connect_token_secret.py:160 +#: accounts/serializers/account/account.py:472 +#: authentication/serializers/connect_token_secret.py:162 #: authentication/templates/authentication/_access_key_modal.html:30 #: perms/models/perm_node.py:21 users/serializers/group.py:33 msgid "ID" msgstr "ID" -#: accounts/serializers/account/account.py:481 acls/serializers/base.py:123 +#: accounts/serializers/account/account.py:482 acls/serializers/base.py:123 #: acls/templates/acls/asset_login_reminder.html:8 #: acls/templates/acls/user_login_reminder.html:8 #: assets/models/cmd_filter.py:24 assets/models/label.py:16 audits/models.py:55 #: audits/models.py:91 audits/models.py:173 audits/models.py:272 -#: audits/serializers.py:195 authentication/models/connection_token.py:36 +#: audits/serializers.py:197 authentication/models/connection_token.py:37 #: authentication/models/ssh_key.py:22 authentication/models/sso_token.py:16 #: notifications/models/notification.py:12 #: perms/api/user_permission/mixin.py:58 perms/models/asset_permission.py:63 @@ -1273,7 +1257,7 @@ msgstr "ID" msgid "User" msgstr "用户" -#: accounts/serializers/account/account.py:482 +#: accounts/serializers/account/account.py:483 #: authentication/templates/authentication/_access_key_modal.html:33 #: terminal/notifications.py:159 terminal/notifications.py:219 msgid "Date" @@ -1291,19 +1275,19 @@ msgstr "" "提示: 如果认证时不需要用户名,可填写为 null, 如果是 AD 账号,格式为 " "username@domain" -#: accounts/serializers/account/service.py:13 +#: accounts/serializers/account/service.py:14 #: authentication/serializers/token.py:22 msgid "Access IP" msgstr "IP 白名单" -#: accounts/serializers/account/service.py:26 +#: accounts/serializers/account/service.py:27 #: accounts/serializers/account/virtual.py:19 assets/models/cmd_filter.py:40 #: assets/models/cmd_filter.py:88 common/db/models.py:36 ops/models/adhoc.py:25 -#: ops/models/job.py:163 ops/models/playbook.py:31 rbac/models/role.py:37 +#: ops/models/job.py:165 ops/models/playbook.py:31 rbac/models/role.py:37 #: settings/models.py:42 terminal/models/applet/applet.py:46 -#: terminal/models/applet/applet.py:332 terminal/models/applet/host.py:143 -#: terminal/models/component/endpoint.py:27 -#: terminal/models/component/endpoint.py:122 +#: terminal/models/applet/applet.py:373 terminal/models/applet/host.py:143 +#: terminal/models/component/endpoint.py:28 +#: terminal/models/component/endpoint.py:116 #: terminal/models/session/session.py:49 #: terminal/models/virtualapp/virtualapp.py:28 tickets/models/comment.py:32 #: tickets/models/ticket/general.py:298 users/models/user/__init__.py:94 @@ -1311,9 +1295,9 @@ msgstr "IP 白名单" msgid "Comment" msgstr "备注" -#: accounts/serializers/account/service.py:28 +#: accounts/serializers/account/service.py:29 #: accounts/templates/accounts/backup_account_report.html:33 -#: assets/serializers/asset/common.py:151 +#: assets/serializers/asset/common.py:152 msgid "Accounts amount" msgstr "账号数量" @@ -1624,7 +1608,7 @@ msgstr "任务名称" #: accounts/templates/accounts/gather_account_report.html:21 #: accounts/templates/accounts/push_account_report.html:22 #: assets/models/automations/base.py:143 audits/models.py:66 -#: ops/models/base.py:55 ops/models/celery.py:89 ops/models/job.py:239 +#: ops/models/base.py:55 ops/models/celery.py:89 ops/models/job.py:241 #: ops/templates/ops/celery_task_log.html:101 #: perms/models/asset_permission.py:78 settings/serializers/feature.py:27 #: settings/templates/ldap/_msg_import_ldap_user.html:5 @@ -1674,7 +1658,7 @@ msgstr "你好! 以下是资产改密或推送账号失败的情况。 请及 #: accounts/templates/accounts/change_secret_report.html:33 #: accounts/templates/accounts/gather_account_report.html:31 #: accounts/templates/accounts/push_account_report.html:32 -#: assets/serializers/domain.py:24 assets/serializers/platform.py:182 +#: assets/serializers/domain.py:23 assets/serializers/platform.py:182 #: orgs/serializers.py:13 perms/serializers/permission.py:61 msgid "Assets amount" msgstr "资产数量" @@ -1713,7 +1697,6 @@ msgstr "否" #: accounts/templates/accounts/change_secret_report.html:94 #: accounts/templates/accounts/change_secret_report.html:134 #: accounts/templates/accounts/gather_account_report.html:92 -#: accounts/templates/accounts/gather_account_report.html:132 #: accounts/templates/accounts/push_account_report.html:93 #: accounts/templates/accounts/push_account_report.html:133 msgid "No new accounts found" @@ -1742,6 +1725,10 @@ msgstr "新发现的帐户" msgid "Lost accounts" msgstr "丢失的账号" +#: accounts/templates/accounts/gather_account_report.html:132 +msgid "No lost accounts found" +msgstr "未找到丢失的账号" + #: accounts/utils.py:54 msgid "" "If the password starts with {{` and ends with }} `, then the password is not " @@ -1756,16 +1743,16 @@ msgstr "密钥不合法或密钥密码错误" msgid "App Acls" msgstr "访问控制" -#: acls/const.py:6 audits/const.py:36 terminal/const.py:11 tickets/const.py:44 +#: acls/const.py:6 audits/const.py:37 terminal/const.py:11 tickets/const.py:44 #: tickets/templates/tickets/approve_check_password.html:47 msgid "Reject" msgstr "拒绝" -#: acls/const.py:7 audits/const.py:33 terminal/const.py:9 +#: acls/const.py:7 audits/const.py:34 terminal/const.py:9 msgid "Accept" msgstr "接受" -#: acls/const.py:8 audits/const.py:34 +#: acls/const.py:8 audits/const.py:35 msgid "Review" msgstr "审批" @@ -1778,7 +1765,7 @@ msgid "Notify" msgstr "通知" #: acls/const.py:11 -msgid "Notify and warn" +msgid "Prompt and warn" msgstr "提示并告警" #: acls/const.py:12 @@ -1790,18 +1777,18 @@ msgid "Face Online" msgstr "人脸在线" #: acls/models/base.py:37 assets/models/cmd_filter.py:76 -#: terminal/models/component/endpoint.py:115 xpack/plugins/cloud/models.py:316 +#: terminal/models/component/endpoint.py:109 xpack/plugins/cloud/models.py:316 msgid "Priority" msgstr "优先级" #: acls/models/base.py:38 assets/models/cmd_filter.py:76 -#: terminal/models/component/endpoint.py:116 xpack/plugins/cloud/models.py:317 +#: terminal/models/component/endpoint.py:110 xpack/plugins/cloud/models.py:317 msgid "1-100, the lower the value will be match first" msgstr "优先级可选范围为 1-100 (数值越小越优先)" #: acls/models/base.py:41 acls/serializers/base.py:57 -#: assets/models/cmd_filter.py:81 audits/models.py:93 audits/serializers.py:108 -#: authentication/serializers/connect_token_secret.py:119 +#: assets/models/cmd_filter.py:81 audits/models.py:93 audits/serializers.py:107 +#: authentication/serializers/connect_token_secret.py:121 #: authentication/templates/authentication/_access_key_modal.html:34 #: perms/serializers/permission.py:63 perms/serializers/permission.py:85 #: tickets/serializers/ticket/ticket.py:21 @@ -1809,7 +1796,7 @@ msgid "Action" msgstr "动作" #: acls/models/base.py:42 assets/models/cmd_filter.py:86 -#: authentication/serializers/connect_token_secret.py:91 +#: authentication/serializers/connect_token_secret.py:93 msgid "Reviewers" msgstr "审批人" @@ -1820,7 +1807,7 @@ msgid "Users" msgstr "用户" #: acls/models/command_acl.py:16 assets/models/cmd_filter.py:60 -#: audits/serializers.py:38 ops/serializers/job.py:92 terminal/const.py:88 +#: ops/serializers/job.py:92 terminal/const.py:88 #: terminal/models/session/session.py:45 terminal/serializers/command.py:18 #: terminal/templates/terminal/_msg_command_alert.html:12 #: terminal/templates/terminal/_msg_command_execute_alert.html:10 @@ -1849,7 +1836,7 @@ msgstr "忽略大小写" #: acls/models/command_acl.py:33 acls/models/command_acl.py:97 #: acls/serializers/command_acl.py:29 -#: authentication/serializers/connect_token_secret.py:88 +#: authentication/serializers/connect_token_secret.py:90 #: terminal/templates/terminal/_msg_command_warning.html:14 msgid "Command group" msgstr "命令组" @@ -1950,7 +1937,7 @@ msgstr "" #: authentication/templates/authentication/_msg_oauth_bind.html:12 #: authentication/templates/authentication/_msg_rest_password_success.html:8 #: authentication/templates/authentication/_msg_rest_public_key_success.html:8 -#: common/drf/renders/base.py:150 xpack/plugins/cloud/models.py:393 +#: common/drf/renders/base.py:152 xpack/plugins/cloud/models.py:393 msgid "IP" msgstr "IP" @@ -2008,15 +1995,15 @@ msgid "Login city" msgstr "登录城市" #: acls/templates/acls/user_login_reminder.html:11 audits/models.py:198 -#: audits/models.py:267 audits/serializers.py:92 +#: audits/models.py:267 audits/serializers.py:91 msgid "User agent" msgstr "用户代理" -#: assets/api/asset/asset.py:194 +#: assets/api/asset/asset.py:153 msgid "Cannot create asset directly, you should create a host or other" msgstr "不能直接创建资产, 你应该创建主机或其他资产" -#: assets/api/asset/asset.py:198 +#: assets/api/asset/asset.py:157 msgid "The number of assets exceeds the limit of 5000" msgstr "资产数量超过了 5000 的限制" @@ -2048,34 +2035,34 @@ msgstr "资产管理" msgid "Task: {} finished" msgstr "任务:{} 完成" -#: assets/automations/base/manager.py:338 +#: assets/automations/base/manager.py:339 msgid " - Platform {} ansible disabled" msgstr " - 平台 {} Ansible 已禁用, 无法执行任务" -#: assets/automations/base/manager.py:524 +#: assets/automations/base/manager.py:525 msgid ">>> Task preparation phase" msgstr ">>> 任务准备阶段" -#: assets/automations/base/manager.py:528 +#: assets/automations/base/manager.py:529 #, python-brace-format msgid ">>> Executing tasks in batches, total {runner_count}" msgstr ">>> 分次执行任务,总共 {runner_count}" -#: assets/automations/base/manager.py:533 +#: assets/automations/base/manager.py:534 msgid ">>> Start executing tasks" msgstr ">>> 开始执行任务" -#: assets/automations/base/manager.py:535 +#: assets/automations/base/manager.py:536 msgid ">>> No tasks need to be executed" msgstr ">>> 没有需要执行的任务" -#: assets/automations/base/manager.py:539 +#: assets/automations/base/manager.py:540 #, python-brace-format msgid ">>> Begin executing batch {index} of tasks" msgstr ">>> 开始执行第 {index} 批任务" #: assets/automations/ping_gateway/manager.py:33 -#: authentication/models/connection_token.py:145 +#: authentication/models/connection_token.py:176 msgid "No account" msgstr "没有账号" @@ -2102,7 +2089,7 @@ msgstr "连接失败" msgid ">>> Start executing the task to test gateway connectivity" msgstr ">>> 开始执行测试网关可连接性任务" -#: assets/const/automation.py:6 audits/const.py:6 audits/const.py:47 +#: assets/const/automation.py:6 audits/const.py:6 audits/const.py:48 #: audits/signal_handlers/activity_log.py:63 common/utils/ip/geoip/utils.py:31 #: common/utils/ip/geoip/utils.py:37 common/utils/ip/utils.py:104 msgid "Unknown" @@ -2128,7 +2115,7 @@ msgstr "测试网关" msgid "Gather facts" msgstr "收集资产信息" -#: assets/const/base.py:32 audits/const.py:58 +#: assets/const/base.py:32 audits/const.py:59 #: terminal/serializers/applet_host.py:32 users/models/user/_auth.py:31 msgid "Disabled" msgstr "禁用" @@ -2162,12 +2149,12 @@ msgid "Cloud service" msgstr "云服务" #: assets/const/category.py:14 assets/models/asset/gpt.py:11 -#: assets/models/asset/web.py:16 audits/const.py:45 +#: assets/models/asset/web.py:16 audits/const.py:46 #: terminal/models/applet/applet.py:28 users/const.py:76 msgid "Web" msgstr "Web" -#: assets/const/category.py:15 common/sdk/sms/endpoint.py:20 +#: assets/const/category.py:16 common/sdk/sms/endpoint.py:20 msgid "Custom type" msgstr "自定义类型" @@ -2203,8 +2190,8 @@ msgstr "" msgid "TP-Link" msgstr "" -#: assets/const/device.py:12 terminal/models/applet/applet.py:27 -#: tickets/const.py:9 +#: assets/const/device.py:12 assets/const/ds.py:7 +#: terminal/models/applet/applet.py:27 tickets/const.py:9 msgid "General" msgstr "一般" @@ -2220,6 +2207,10 @@ msgstr "路由器" msgid "Firewall" msgstr "防火墙" +#: assets/const/ds.py:10 +msgid "Windows Active Directory" +msgstr "" + #: assets/const/gpt.py:7 msgid "ChatGPT" msgstr "ChatGPT" @@ -2270,7 +2261,7 @@ msgid "Any" msgstr "任意" #: assets/const/protocol.py:88 rbac/tree.py:62 -#: settings/serializers/security.py:241 +#: settings/serializers/security.py:245 msgid "Security" msgstr "安全" @@ -2343,7 +2334,7 @@ msgstr "认证数据库" msgid "The database to authenticate against" msgstr "要进行身份验证的数据库" -#: assets/const/protocol.py:232 authentication/models/connection_token.py:47 +#: assets/const/protocol.py:232 authentication/models/connection_token.py:48 msgid "Connect options" msgstr "连接项" @@ -2387,7 +2378,7 @@ msgstr "确认按钮选择器" msgid "API mode" msgstr "API 模式" -#: assets/const/types.py:249 +#: assets/const/types.py:252 msgid "All types" msgstr "所有类型" @@ -2410,15 +2401,15 @@ msgstr "云服务" msgid "Port" msgstr "端口" -#: assets/models/asset/common.py:167 assets/serializers/asset/common.py:172 +#: assets/models/asset/common.py:167 assets/serializers/asset/common.py:174 #: settings/serializers/terminal.py:10 msgid "Address" msgstr "地址" -#: assets/models/asset/common.py:169 assets/models/platform.py:149 +#: assets/models/asset/common.py:169 assets/models/platform.py:155 #: assets/serializers/asset/common.py:150 #: authentication/backends/passkey/models.py:12 -#: authentication/serializers/connect_token_secret.py:118 +#: authentication/serializers/connect_token_secret.py:120 #: perms/serializers/user_permission.py:25 xpack/plugins/cloud/models.py:387 msgid "Platform" msgstr "平台" @@ -2427,34 +2418,34 @@ msgstr "平台" msgid "Zone" msgstr "网域" -#: assets/models/asset/common.py:176 assets/serializers/asset/common.py:174 +#: assets/models/asset/common.py:176 assets/serializers/asset/common.py:176 #: assets/serializers/automations/base.py:21 ops/serializers/job.py:22 #: perms/serializers/permission.py:58 msgid "Nodes" msgstr "节点" -#: assets/models/asset/common.py:179 assets/serializers/asset/common.py:422 +#: assets/models/asset/common.py:183 assets/serializers/asset/common.py:425 #: assets/serializers/asset/host.py:11 msgid "Gathered info" msgstr "收集资产硬件信息" -#: assets/models/asset/common.py:180 assets/serializers/asset/custom.py:14 +#: assets/models/asset/common.py:184 assets/serializers/asset/custom.py:14 msgid "Custom info" msgstr "自定义属性" -#: assets/models/asset/common.py:369 +#: assets/models/asset/common.py:431 msgid "Can refresh asset hardware info" msgstr "可以更新资产硬件信息" -#: assets/models/asset/common.py:370 +#: assets/models/asset/common.py:432 msgid "Can test asset connectivity" msgstr "可以测试资产连接性" -#: assets/models/asset/common.py:371 +#: assets/models/asset/common.py:433 msgid "Can match asset" msgstr "可以匹配资产" -#: assets/models/asset/common.py:372 +#: assets/models/asset/common.py:434 msgid "Can change asset nodes" msgstr "可以修改资产节点" @@ -2482,19 +2473,23 @@ msgstr "忽略证书校验" msgid "Postgresql SSL mode" msgstr "PostgreSQL SSL 模式" +#: assets/models/asset/ds.py:10 assets/serializers/asset/ds.py:20 +msgid "Domain name" +msgstr "域名称" + #: assets/models/asset/gpt.py:8 settings/serializers/feature.py:139 #: settings/serializers/feature.py:154 msgid "Proxy" msgstr "代理" #: assets/models/automations/base.py:23 assets/models/cmd_filter.py:32 -#: assets/models/node.py:553 ops/models/job.py:156 +#: assets/models/node.py:553 ops/models/job.py:158 #: perms/models/asset_permission.py:72 tickets/models/ticket/apply_asset.py:15 #: xpack/plugins/cloud/models.py:388 msgid "Node" msgstr "节点" -#: assets/models/automations/base.py:29 ops/models/job.py:234 +#: assets/models/automations/base.py:29 ops/models/job.py:236 #: ops/serializers/job.py:24 settings/serializers/auth/sms.py:108 msgid "Parameters" msgstr "参数" @@ -2514,7 +2509,7 @@ msgstr "资产自动化任务" # msgid "Comment" # msgstr "备注" #: assets/models/automations/base.py:140 assets/models/cmd_filter.py:41 -#: common/db/models.py:34 ops/models/base.py:54 ops/models/job.py:238 +#: common/db/models.py:34 ops/models/base.py:54 ops/models/job.py:240 #: users/models/user/__init__.py:317 msgid "Date created" msgstr "创建日期" @@ -2525,14 +2520,14 @@ msgstr "创建日期" msgid "Trigger mode" msgstr "触发模式" -#: assets/models/automations/base.py:157 audits/serializers.py:39 -#: ops/models/base.py:52 ops/models/job.py:236 +#: assets/models/automations/base.py:157 audits/serializers.py:38 +#: ops/models/base.py:52 ops/models/job.py:238 #: xpack/plugins/cloud/manager.py:103 msgid "Summary" msgstr "汇总" #: assets/models/automations/base.py:158 ops/models/base.py:51 -#: ops/models/job.py:235 xpack/plugins/cloud/models.py:225 +#: ops/models/job.py:237 xpack/plugins/cloud/models.py:225 msgid "Result" msgstr "结果" @@ -2596,7 +2591,7 @@ msgstr "命令过滤规则" msgid "Favorite asset" msgstr "收藏的资产" -#: assets/models/gateway.py:34 assets/serializers/domain.py:19 +#: assets/models/gateway.py:34 assets/serializers/domain.py:18 msgid "Gateway" msgstr "网关" @@ -2607,8 +2602,8 @@ msgstr "系统" #: assets/models/label.py:19 assets/models/node.py:539 #: assets/serializers/cagegory.py:11 assets/serializers/cagegory.py:18 #: assets/serializers/cagegory.py:24 -#: authentication/models/connection_token.py:33 -#: authentication/serializers/connect_token_secret.py:125 +#: authentication/models/connection_token.py:34 +#: authentication/serializers/connect_token_secret.py:127 #: common/serializers/common.py:86 labels/models.py:12 settings/models.py:38 #: users/models/preference.py:13 msgid "Value" @@ -2617,7 +2612,7 @@ msgstr "值" #: assets/models/label.py:40 assets/serializers/cagegory.py:10 #: assets/serializers/cagegory.py:17 assets/serializers/cagegory.py:23 #: assets/serializers/platform.py:159 -#: authentication/serializers/connect_token_secret.py:124 +#: authentication/serializers/connect_token_secret.py:126 #: common/serializers/common.py:85 labels/serializers.py:45 #: settings/serializers/msg.py:90 xpack/plugins/cloud/models.py:392 msgid "Label" @@ -2683,7 +2678,7 @@ msgstr "开放的" msgid "Setting" msgstr "设置" -#: assets/models/platform.py:38 audits/const.py:59 +#: assets/models/platform.py:38 audits/const.py:60 #: authentication/backends/passkey/models.py:11 settings/models.py:41 #: terminal/serializers/applet_host.py:33 users/models/user/_auth.py:32 msgid "Enabled" @@ -2783,15 +2778,19 @@ msgstr "编码" msgid "Gateway enabled" msgstr "启用网域" -#: assets/models/platform.py:106 assets/serializers/platform.py:202 +#: assets/models/platform.py:105 +msgid "DS enabled" +msgstr "目录服务已启用" + +#: assets/models/platform.py:107 assets/serializers/platform.py:202 msgid "Su enabled" msgstr "启用账号切换" -#: assets/models/platform.py:107 assets/serializers/platform.py:177 +#: assets/models/platform.py:108 assets/serializers/platform.py:177 msgid "Su method" msgstr "账号切换方式" -#: assets/models/platform.py:108 assets/serializers/platform.py:180 +#: assets/models/platform.py:109 assets/serializers/platform.py:180 msgid "Custom fields" msgstr "自定义属性" @@ -2830,36 +2829,36 @@ msgstr "节点路径,格式为 [\"/组织/节点名\"], 如果节点不存在 #: assets/serializers/asset/common.py:147 assets/serializers/platform.py:174 #: authentication/serializers/connect_token_secret.py:30 -#: authentication/serializers/connect_token_secret.py:75 +#: authentication/serializers/connect_token_secret.py:77 #: perms/models/asset_permission.py:76 perms/serializers/permission.py:67 -#: perms/serializers/user_permission.py:74 xpack/plugins/cloud/models.py:390 +#: perms/serializers/user_permission.py:75 xpack/plugins/cloud/models.py:390 #: xpack/plugins/cloud/serializers/task.py:36 msgid "Protocols" msgstr "协议组" #: assets/serializers/asset/common.py:149 -#: assets/serializers/asset/common.py:173 +#: assets/serializers/asset/common.py:175 msgid "Node path" msgstr "节点路径" -#: assets/serializers/asset/common.py:170 -#: assets/serializers/asset/common.py:423 +#: assets/serializers/asset/common.py:172 +#: assets/serializers/asset/common.py:426 msgid "Auto info" msgstr "自动化信息" -#: assets/serializers/asset/common.py:268 +#: assets/serializers/asset/common.py:271 msgid "Platform not exist" msgstr "平台不存在" -#: assets/serializers/asset/common.py:304 +#: assets/serializers/asset/common.py:307 msgid "port out of range (0-65535)" msgstr "端口超出范围 (0-65535)" -#: assets/serializers/asset/common.py:311 +#: assets/serializers/asset/common.py:314 msgid "Protocol is required: {}" msgstr "协议是必填的: {}" -#: assets/serializers/asset/common.py:350 +#: assets/serializers/asset/common.py:353 msgid "Invalid data" msgstr "无效的数据" @@ -2884,6 +2883,14 @@ msgstr "" "Verify Full:我希望我的数据被加密,我接受开销。我想确保我连接到我信任的服务" "器,并且它是我指定的服务器。" +#: assets/serializers/asset/ds.py:18 +msgid "" +"The domain part used by the directory service (e.g., AD) and appended to the " +"username during login, such as example.com in user@example.com." +msgstr "" +"域名(Domain Name) 用于目录服务(如 AD)登录时附加在用户名后的域名部分,例" +"如 user@example.com 中的 example.com" + #: assets/serializers/asset/gpt.py:20 msgid "" "If the server cannot directly connect to the API address, you need set up an " @@ -2938,7 +2945,7 @@ msgid "Disk total" msgstr "硬盘大小" #: assets/serializers/asset/info/gathered.py:16 -#: authentication/serializers/connect_token_secret.py:115 +#: authentication/serializers/connect_token_secret.py:117 msgid "OS" msgstr "操作系统" @@ -2962,7 +2969,7 @@ msgstr "约束" msgid "Types" msgstr "类型" -#: assets/serializers/domain.py:21 +#: assets/serializers/domain.py:20 msgid "" "A gateway is a network proxy for a zone, and when connecting assets within " "the zone, the connection is routed through the gateway." @@ -3077,11 +3084,11 @@ msgstr "资产可以使用区域网关进行连接" msgid "Default Domain" msgstr "默认网域" -#: assets/serializers/platform.py:234 +#: assets/serializers/platform.py:239 msgid "type is required" msgstr "类型 该字段是必填项。" -#: assets/serializers/platform.py:249 +#: assets/serializers/platform.py:254 msgid "Protocols is required" msgstr "协议是必填的" @@ -3239,7 +3246,7 @@ msgstr "重命名" msgid "Symlink" msgstr "建立软链接" -#: audits/const.py:18 audits/const.py:28 +#: audits/const.py:18 audits/const.py:29 #: ops/templates/ops/celery_task_log.html:86 #: terminal/api/session/session.py:154 msgid "Download" @@ -3262,56 +3269,60 @@ msgstr "查看" msgid "Create" msgstr "创建" -#: audits/const.py:29 +#: audits/const.py:27 templates/_csv_import_export.html:8 +msgid "Export" +msgstr "导出" + +#: audits/const.py:30 msgid "Connect" msgstr "连接" -#: audits/const.py:30 authentication/templates/authentication/login.html:329 +#: audits/const.py:31 authentication/templates/authentication/login.html:329 #: authentication/templates/authentication/login.html:401 #: templates/_header_bar.html:101 msgid "Login" msgstr "登录" -#: audits/const.py:35 rbac/tree.py:56 +#: audits/const.py:36 rbac/tree.py:56 msgid "Notifications" msgstr "通知" -#: audits/const.py:37 tickets/const.py:45 +#: audits/const.py:38 tickets/const.py:45 msgid "Approve" msgstr "同意" -#: audits/const.py:41 ops/models/celery.py:85 +#: audits/const.py:42 ops/models/celery.py:85 #: terminal/models/session/sharing.py:128 tickets/const.py:25 #: xpack/plugins/cloud/const.py:67 msgid "Finished" msgstr "结束" -#: audits/const.py:46 settings/serializers/terminal.py:6 +#: audits/const.py:47 settings/serializers/terminal.py:6 #: terminal/models/applet/host.py:26 terminal/models/component/terminal.py:185 #: terminal/models/virtualapp/provider.py:14 terminal/serializers/session.py:57 #: terminal/serializers/session.py:113 msgid "Terminal" msgstr "终端" -#: audits/const.py:51 audits/models.py:133 +#: audits/const.py:52 audits/models.py:133 msgid "Operate log" msgstr "操作日志" -#: audits/const.py:52 +#: audits/const.py:53 msgid "Session log" msgstr "会话日志" -#: audits/const.py:53 +#: audits/const.py:54 msgid "Login log" msgstr "登录日志" -#: audits/const.py:54 rbac/tree.py:64 terminal/models/applet/host.py:144 +#: audits/const.py:55 rbac/tree.py:64 terminal/models/applet/host.py:144 #: terminal/models/component/task.py:22 #: xpack/plugins/cloud/serializers/account.py:77 msgid "Task" msgstr "任务" -#: audits/const.py:60 +#: audits/const.py:61 msgid "-" msgstr "-" @@ -3329,7 +3340,7 @@ msgstr "作业审计日志" msgid "Remote addr" msgstr "远端地址" -#: audits/models.py:62 audits/serializers.py:62 +#: audits/models.py:62 audits/serializers.py:61 msgid "Operate" msgstr "操作" @@ -3354,17 +3365,17 @@ msgstr "会话" msgid "File transfer log" msgstr "文件传输" -#: audits/models.py:95 audits/serializers.py:110 +#: audits/models.py:95 audits/serializers.py:109 msgid "Resource Type" msgstr "资源类型" #: audits/models.py:96 audits/models.py:99 audits/models.py:145 -#: audits/serializers.py:109 labels/serializers.py:46 +#: audits/serializers.py:108 labels/serializers.py:46 msgid "Resource" msgstr "资源" #: audits/models.py:102 audits/models.py:148 audits/models.py:178 -#: audits/models.py:314 audits/serializers.py:230 +#: audits/models.py:314 audits/serializers.py:232 #: terminal/serializers/command.py:75 msgid "Datetime" msgstr "日期" @@ -3398,7 +3409,7 @@ msgstr "登录方式" msgid "Login IP" msgstr "登录 IP" -#: audits/models.py:201 audits/serializers.py:76 +#: audits/models.py:201 audits/serializers.py:75 #: authentication/templates/authentication/_mfa_confirm_modal.html:14 #: users/forms/profile.py:64 users/models/user/__init__.py:82 #: users/serializers/profile.py:71 @@ -3449,37 +3460,37 @@ msgid "Application ID" msgstr "应用 ID" #: audits/serializers.py:33 ops/models/adhoc.py:24 ops/models/base.py:16 -#: ops/models/base.py:53 ops/models/celery.py:87 ops/models/job.py:154 -#: ops/models/job.py:237 ops/models/playbook.py:30 ops/models/variable.py:17 +#: ops/models/base.py:53 ops/models/celery.py:87 ops/models/job.py:156 +#: ops/models/job.py:239 ops/models/playbook.py:30 ops/models/variable.py:17 #: terminal/models/session/sharing.py:25 msgid "Creator" msgstr "创建者" -#: audits/serializers.py:40 ops/serializers/celery.py:33 +#: audits/serializers.py:39 ops/serializers/celery.py:33 msgid "Execution cycle" msgstr "周期执行" -#: audits/serializers.py:93 +#: audits/serializers.py:92 msgid "Reason display" msgstr "原因描述" -#: audits/serializers.py:94 audits/serializers.py:208 +#: audits/serializers.py:93 audits/serializers.py:210 msgid "Auth backend display" msgstr "认证方式" -#: audits/serializers.py:158 +#: audits/serializers.py:157 #, python-format msgid "%s %s this resource" msgstr "用户 %s %s 了当前资源" -#: audits/serializers.py:196 authentication/models/connection_token.py:51 +#: audits/serializers.py:198 authentication/models/connection_token.py:52 #: authentication/models/temp_token.py:13 perms/models/asset_permission.py:80 #: tickets/models/ticket/apply_application.py:31 #: tickets/models/ticket/apply_asset.py:21 users/models/user/__init__.py:101 msgid "Date expired" msgstr "失效日期" -#: audits/serializers.py:227 terminal/models/component/terminal.py:91 +#: audits/serializers.py:229 terminal/models/component/terminal.py:91 #: terminal/serializers/command.py:76 msgid "Remote Address" msgstr "远端地址" @@ -3594,39 +3605,39 @@ msgstr "参数中的值必须包含 %s" msgid "This action require verify your MFA" msgstr "该操作需要验证您的 MFA, 请先开启并配置" -#: authentication/api/connection_token.py:303 +#: authentication/api/connection_token.py:304 msgid "Reusable connection token is not allowed, global setting not enabled" msgstr "不允许使用可重复使用的连接令牌,未启用全局设置" -#: authentication/api/connection_token.py:423 +#: authentication/api/connection_token.py:424 msgid "Anonymous account is not supported for this asset" msgstr "匿名账号不支持当前资产" -#: authentication/api/connection_token.py:455 +#: authentication/api/connection_token.py:454 msgid "Permission expired" msgstr "授权已过期" -#: authentication/api/connection_token.py:488 +#: authentication/api/connection_token.py:487 msgid "ACL action is reject: {}({})" msgstr "ACL 动作是拒绝: {}({})" -#: authentication/api/connection_token.py:492 +#: authentication/api/connection_token.py:491 msgid "ACL action is review" msgstr "ACL 动作是复核" -#: authentication/api/connection_token.py:502 +#: authentication/api/connection_token.py:501 msgid "ACL action is face verify" msgstr "ACL 动作是人脸验证" -#: authentication/api/connection_token.py:507 +#: authentication/api/connection_token.py:506 msgid "ACL action not supported for this asset" msgstr "资产登录规则不支持当前资产" -#: authentication/api/connection_token.py:514 +#: authentication/api/connection_token.py:513 msgid "ACL action is face online" msgstr "ACL 动作是人脸在线" -#: authentication/api/connection_token.py:533 +#: authentication/api/connection_token.py:532 msgid "No available face feature" msgstr "没有可用的人脸特征" @@ -3743,16 +3754,16 @@ msgstr "虚拟 MFA" msgid "SMS" msgstr "短信" -#: authentication/const.py:34 +#: authentication/const.py:35 msgid "Face Recognition" msgstr "人脸识别" -#: authentication/const.py:35 settings/serializers/auth/radius.py:14 +#: authentication/const.py:36 settings/serializers/auth/radius.py:14 #: settings/serializers/auth/radius.py:16 msgid "Radius" msgstr "Radius" -#: authentication/const.py:36 +#: authentication/const.py:37 msgid "Custom" msgstr "自定义" @@ -3938,7 +3949,9 @@ msgstr "MFA 类型" msgid "Captcha" msgstr "验证码" -#: authentication/forms.py:66 users/forms/profile.py:28 +#: authentication/forms.py:66 authentication/mfa/email.py:41 +#: authentication/templates/authentication/_msg_mfa_email_code.html:12 +#: users/forms/profile.py:28 msgid "MFA code" msgstr "MFA 验证码" @@ -3968,6 +3981,14 @@ msgstr "自定义 MFA 验证码" msgid "MFA custom global enabled, cannot disable" msgstr "自定义 MFA 全局开启,无法被禁用" +#: authentication/mfa/email.py:11 +msgid "Email verify code invalid" +msgstr "邮件验证码校验失败" + +#: authentication/mfa/email.py:17 +msgid "Email verification code" +msgstr "邮件验证码" + #: authentication/mfa/face.py:55 msgid "Bind face to enable" msgstr "绑定人脸特征以启用" @@ -4016,7 +4037,7 @@ msgstr "设置手机号码启用" msgid "Clear phone number to disable" msgstr "清空手机号码禁用" -#: authentication/middleware.py:95 settings/utils/ldap.py:691 +#: authentication/middleware.py:95 settings/utils/ldap.py:711 msgid "Authentication failed (before login check failed): {}" msgstr "认证失败 (登录前检查失败): {}" @@ -4038,22 +4059,22 @@ msgstr "该 MFA ({}) 方式没有启用" msgid "Please change your password" msgstr "请修改密码" -#: authentication/models/connection_token.py:42 +#: authentication/models/connection_token.py:43 #: terminal/serializers/storage.py:114 msgid "Account name" msgstr "账号名称" -#: authentication/models/connection_token.py:43 +#: authentication/models/connection_token.py:44 msgid "Input username" msgstr "自定义用户名" -#: authentication/models/connection_token.py:44 +#: authentication/models/connection_token.py:45 #: authentication/serializers/connection_token.py:18 msgid "Input secret" msgstr "自定义密码" -#: authentication/models/connection_token.py:45 -#: authentication/serializers/connect_token_secret.py:114 +#: authentication/models/connection_token.py:46 +#: authentication/serializers/connect_token_secret.py:116 #: settings/serializers/msg.py:28 terminal/models/applet/applet.py:43 #: terminal/models/virtualapp/virtualapp.py:24 #: terminal/serializers/session.py:23 terminal/serializers/session.py:50 @@ -4061,69 +4082,69 @@ msgstr "自定义密码" msgid "Protocol" msgstr "协议" -#: authentication/models/connection_token.py:46 +#: authentication/models/connection_token.py:47 msgid "Connect method" msgstr "连接方式" -#: authentication/models/connection_token.py:48 +#: authentication/models/connection_token.py:49 msgid "User display" msgstr "用户名称" -#: authentication/models/connection_token.py:49 +#: authentication/models/connection_token.py:50 msgid "Asset display" msgstr "资产名称" -#: authentication/models/connection_token.py:50 +#: authentication/models/connection_token.py:51 msgid "Reusable" msgstr "可以重复使用" -#: authentication/models/connection_token.py:55 +#: authentication/models/connection_token.py:56 #: perms/models/asset_permission.py:83 msgid "From ticket" msgstr "来自工单" -#: authentication/models/connection_token.py:57 +#: authentication/models/connection_token.py:58 msgid "Face monitor token" msgstr "人脸监控令牌" -#: authentication/models/connection_token.py:68 +#: authentication/models/connection_token.py:69 msgid "Can expire connection token" msgstr "可以失效连接令牌" -#: authentication/models/connection_token.py:69 +#: authentication/models/connection_token.py:70 msgid "Can reuse connection token" msgstr "可以复用连接令牌" -#: authentication/models/connection_token.py:71 +#: authentication/models/connection_token.py:72 msgid "Connection token" msgstr "连接令牌" -#: authentication/models/connection_token.py:132 +#: authentication/models/connection_token.py:163 msgid "Connection token inactive" msgstr "连接令牌未激活" -#: authentication/models/connection_token.py:136 +#: authentication/models/connection_token.py:167 msgid "Connection token expired at: {}" msgstr "连接令牌过期: {}" -#: authentication/models/connection_token.py:139 +#: authentication/models/connection_token.py:170 #: terminal/serializers/session.py:95 msgid "No user or invalid user" msgstr "没有用户或用户失效" -#: authentication/models/connection_token.py:142 +#: authentication/models/connection_token.py:173 msgid "No asset or inactive asset" msgstr "没有资产或资产未激活" -#: authentication/models/connection_token.py:290 +#: authentication/models/connection_token.py:341 msgid "Can view super connection token secret" msgstr "可以查看超级连接令牌密文" -#: authentication/models/connection_token.py:292 +#: authentication/models/connection_token.py:343 msgid "Super connection token" msgstr "超级连接令牌" -#: authentication/models/connection_token.py:309 +#: authentication/models/connection_token.py:360 msgid "Admin connection token" msgstr "管理员连接令牌" @@ -4137,7 +4158,7 @@ msgstr "私有令牌" msgid "Private key" msgstr "ssh私钥" -#: authentication/models/ssh_key.py:18 settings/serializers/terminal.py:34 +#: authentication/models/ssh_key.py:18 settings/serializers/terminal.py:38 #: users/forms/profile.py:175 users/models/user/__init__.py:92 #: xpack/plugins/cloud/serializers/account_attrs.py:211 msgid "Public key" @@ -4163,39 +4184,39 @@ msgstr "异地登录提醒" msgid "binding reminder" msgstr "绑定提醒" -#: authentication/serializers/connect_token_secret.py:116 +#: authentication/serializers/connect_token_secret.py:118 msgid "Is builtin" msgstr "内置的" -#: authentication/serializers/connect_token_secret.py:120 +#: authentication/serializers/connect_token_secret.py:122 msgid "Options" msgstr "选项" -#: authentication/serializers/connect_token_secret.py:127 +#: authentication/serializers/connect_token_secret.py:129 #: ops/notifications.py:19 rbac/tree.py:60 msgid "Component" msgstr "组件" -#: authentication/serializers/connect_token_secret.py:136 +#: authentication/serializers/connect_token_secret.py:138 #: perms/serializers/user_permission.py:28 xpack/plugins/cloud/models.py:389 msgid "Domain" msgstr "网域" -#: authentication/serializers/connect_token_secret.py:138 +#: authentication/serializers/connect_token_secret.py:140 msgid "Expired now" msgstr "立刻过期" -#: authentication/serializers/connect_token_secret.py:171 +#: authentication/serializers/connect_token_secret.py:173 #: terminal/models/virtualapp/virtualapp.py:25 msgid "Image name" msgstr "镜像名称" -#: authentication/serializers/connect_token_secret.py:172 +#: authentication/serializers/connect_token_secret.py:174 #: terminal/models/virtualapp/virtualapp.py:27 msgid "Image port" msgstr "镜像端口" -#: authentication/serializers/connect_token_secret.py:173 +#: authentication/serializers/connect_token_secret.py:175 #: terminal/models/virtualapp/virtualapp.py:26 msgid "Image protocol" msgstr "镜像协议" @@ -4250,7 +4271,7 @@ msgid "" msgstr "创建完成后请下载私钥,每个私钥只有一次下载机会" #: authentication/serializers/ssh_key.py:57 users/forms/profile.py:164 -#: users/serializers/profile.py:134 users/serializers/profile.py:161 +#: users/serializers/profile.py:142 users/serializers/profile.py:169 msgid "Not a valid ssh public key" msgstr "SSH密钥不合法" @@ -4287,12 +4308,14 @@ msgid "Show" msgstr "显示" #: authentication/templates/authentication/_access_key_modal.html:66 -#: users/const.py:42 users/templates/users/user_verify_mfa.html:36 +#: settings/serializers/terminal.py:24 users/const.py:42 +#: users/templates/users/user_verify_mfa.html:36 msgid "Disable" msgstr "禁用" #: authentication/templates/authentication/_access_key_modal.html:67 -#: users/const.py:43 users/templates/users/mfa_setting.html:120 +#: settings/serializers/terminal.py:24 users/const.py:43 +#: users/templates/users/mfa_setting.html:120 #: users/templates/users/mfa_setting.html:158 #: users/templates/users/mfa_setting.html:177 msgid "Enable" @@ -4326,10 +4349,11 @@ msgid "Code error" msgstr "代码错误" #: authentication/templates/authentication/_msg_different_city.html:3 +#: authentication/templates/authentication/_msg_mfa_email_code.html:9 #: authentication/templates/authentication/_msg_oauth_bind.html:3 #: authentication/templates/authentication/_msg_reset_password.html:3 #: authentication/templates/authentication/_msg_reset_password_code.html:9 -#: jumpserver/conf.py:539 +#: jumpserver/conf.py:540 #: perms/templates/perms/_msg_item_permissions_expire.html:3 #: tickets/templates/tickets/approve_check_password.html:32 #: users/templates/users/_msg_account_expire_reminder.html:4 @@ -4348,6 +4372,11 @@ msgid "" "account password in time." msgstr "若怀疑此次登录行为异常,请及时修改账号密码" +#: authentication/templates/authentication/_msg_mfa_email_code.html:15 +#: authentication/templates/authentication/_msg_reset_password_code.html:18 +msgid "The validity period of the verification code is one minute" +msgstr "验证码有效期为 1 分钟" + #: authentication/templates/authentication/_msg_oauth_bind.html:6 msgid "Your account has just been bound to" msgstr "您的帐户刚刚绑定到" @@ -4394,10 +4423,6 @@ msgid "" "Copy the verification code to the Reset Password page to reset the password." msgstr "将验证码复制到重置密码页面,重置密码。" -#: authentication/templates/authentication/_msg_reset_password_code.html:18 -msgid "The validity period of the verification code is one minute" -msgstr "验证码有效期为 1 分钟" - #: authentication/templates/authentication/_msg_rest_password_success.html:5 msgid "Your password has just been successfully updated" msgstr "你的密码刚刚成功更新" @@ -4818,75 +4843,91 @@ msgstr "解析文件错误: {}" msgid "Invalid excel file" msgstr "无效的 excel 文件" -#: common/drf/renders/base.py:138 +#: common/drf/renders/base.py:140 msgid "Yes/No" msgstr "是/否" -#: common/drf/renders/base.py:141 +#: common/drf/renders/base.py:143 msgid "Text, max length {}" msgstr "文本,最大长度 {}" -#: common/drf/renders/base.py:143 +#: common/drf/renders/base.py:145 msgid "Long text, no length limit" msgstr "长文本,无长度限制" -#: common/drf/renders/base.py:145 +#: common/drf/renders/base.py:147 msgid "Number, min {} max {}" msgstr "数字,最小 {} 最大 {}" -#: common/drf/renders/base.py:148 +#: common/drf/renders/base.py:150 msgid "Datetime format {}" msgstr "日期时间格式 {}" -#: common/drf/renders/base.py:154 +#: common/drf/renders/base.py:156 msgid "" "Choices, format name(value), name is optional for human read, value is " "requisite, options {}" msgstr "选项,格式: 名称(值),名称是可选的,方便阅读,值是必填的,可选项有 {}" -#: common/drf/renders/base.py:157 +#: common/drf/renders/base.py:159 msgid "Choices, options {}" msgstr "选项,可选项有 {}" -#: common/drf/renders/base.py:159 +#: common/drf/renders/base.py:161 msgid "Phone number, format +8612345678901" msgstr "手机号,格式 +8612345678901" -#: common/drf/renders/base.py:161 +#: common/drf/renders/base.py:163 msgid "Label, format [\"key:value\"]" msgstr "标签,格式: [\"键:值\"]" -#: common/drf/renders/base.py:163 +#: common/drf/renders/base.py:165 msgid "" "Object, format name(id), name is optional for human read, id is requisite" msgstr "关联项,格式: 名称(id), 名称是可选的,方便阅读,id 是必填的" -#: common/drf/renders/base.py:165 +#: common/drf/renders/base.py:167 msgid "Object, format id" msgstr "关联项,格式是 id" -#: common/drf/renders/base.py:169 +#: common/drf/renders/base.py:171 msgid "" "Objects, format [\"name(id)\", ...], name is optional for human read, id is " "requisite" msgstr "" "多关联项,格式: [\"名称(id)\", ...], 名称是可选的,方便阅读,id 是必填的" -#: common/drf/renders/base.py:171 +#: common/drf/renders/base.py:173 msgid "" "Labels, format [\"key:value\", ...], if label not exists, will create it" msgstr "标签,格式: [\"键:值\", ...], 如果标签不存在,将创建它" -#: common/drf/renders/base.py:173 +#: common/drf/renders/base.py:175 msgid "Objects, format [\"id\", ...]" msgstr "多关联项,格式是 [\"id\", ...]" -#: common/drf/renders/base.py:271 +#: common/drf/renders/base.py:275 msgid "" "{} - The encryption password has not been set - please go to personal " "information -> file encryption password to set the encryption password" msgstr "{} - 未设置加密密码 - 请前往个人信息 -> 文件加密密码中设置加密密码" +#: common/drf/renders/mixins.py:37 labels/serializers.py:22 +msgid "Resource count" +msgstr "资源数量" + +#: common/drf/renders/mixins.py:46 +msgid "Export all" +msgstr "导出所有" + +#: common/drf/renders/mixins.py:48 +msgid "Export only selected items" +msgstr "仅导出选择项" + +#: common/drf/renders/mixins.py:50 +msgid "Export filtered" +msgstr "导出搜素" + #: common/exceptions.py:15 xpack/plugins/cloud/ws.py:37 #, python-format msgid "%s object does not exist." @@ -4916,15 +4957,15 @@ msgstr "此操作需要确认当前用户" msgid "Unexpect error occur" msgstr "发生意外错误" -#: common/plugins/es.py:35 +#: common/plugins/es.py:36 msgid "Invalid elasticsearch config" msgstr "无效的 Elasticsearch 配置" -#: common/plugins/es.py:40 +#: common/plugins/es.py:41 msgid "Not Support Elasticsearch8" msgstr "不支持 Elasticsearch8" -#: common/plugins/es.py:46 +#: common/plugins/es.py:47 msgid "" "Connection failed: Self-signed certificate used. Please check server " "certificate configuration" @@ -5114,16 +5155,16 @@ msgstr "未找到 Code" msgid "The message code provided is invalid or has expired" msgstr "提供的消息代码无效或已过期" -#: jumpserver/conf.py:533 +#: jumpserver/conf.py:534 #, python-brace-format msgid "The verification code is: {code}" msgstr "验证码为: {code}" -#: jumpserver/conf.py:538 +#: jumpserver/conf.py:539 msgid "Create account successfully" msgstr "创建账号成功" -#: jumpserver/conf.py:540 +#: jumpserver/conf.py:541 msgid "Your account has been created successfully" msgstr "你的账号已创建成功" @@ -5178,10 +5219,6 @@ msgstr "资源 ID" msgid "Tagged resource" msgstr "关联的资源" -#: labels/serializers.py:22 -msgid "Resource count" -msgstr "资源数量" - #: labels/serializers.py:28 msgid "Cannot contain \":,\"" msgstr "不能包含\":,\"" @@ -5225,22 +5262,19 @@ msgid "" " work orders, and other notifications" msgstr "系统一些告警,工单等需要发送站内信时执行该任务" -#: ops/ansible/inventory.py:117 ops/models/job.py:68 +#: ops/ansible/inventory.py:126 ops/ansible/inventory.py:196 +#: ops/models/job.py:69 msgid "No account available" msgstr "无可用账号" -#: ops/ansible/inventory.py:298 +#: ops/ansible/inventory.py:318 ops/ansible/inventory.py:360 msgid "Ansible disabled" msgstr "Ansible 已禁用" -#: ops/ansible/inventory.py:314 +#: ops/ansible/inventory.py:376 msgid "Skip hosts below:" msgstr "跳过以下主机: " -#: ops/api/adhoc.py:32 -msgid "Deleting other people's script is not allowed" -msgstr "不允许删除别人的脚本" - #: ops/api/celery.py:66 ops/api/celery.py:81 msgid "Waiting task start" msgstr "等待任务开始" @@ -5253,67 +5287,63 @@ msgstr "任务 {} 不存在" msgid "Task {} args or kwargs error" msgstr "任务 {} 执行参数错误" -#: ops/api/job.py:68 +#: ops/api/job.py:70 #, python-brace-format msgid "" "Asset ({asset}) must have at least one of the following protocols added: " "SSH, SFTP, or WinRM" msgstr "资产({asset})至少要添加ssh,sftp,winrm其中一种协议" -#: ops/api/job.py:69 +#: ops/api/job.py:71 #, python-brace-format msgid "Asset ({asset}) authorization is missing SSH, SFTP, or WinRM protocol" msgstr "资产({asset})授权缺少ssh,sftp或winrm协议" -#: ops/api/job.py:70 +#: ops/api/job.py:72 #, python-brace-format msgid "Asset ({asset}) authorization lacks upload permissions" msgstr "资产({asset})授权缺少上传权限" -#: ops/api/job.py:158 +#: ops/api/job.py:160 msgid "Duplicate file exists" msgstr "存在同名文件" -#: ops/api/job.py:163 +#: ops/api/job.py:165 #, python-brace-format msgid "" "File size exceeds maximum limit. Please select a file smaller than {limit}MB" msgstr "文件大小超过最大限制。请选择小于 {limit}MB 的文件。" -#: ops/api/job.py:236 +#: ops/api/job.py:238 msgid "" "The task is being created and cannot be interrupted. Please try again later." msgstr "正在创建任务,无法中断,请稍后重试。" #: ops/api/playbook.py:49 -msgid "Deleting other people's playbook is not allowed" -msgstr "不允许删除别人的playbook" - -#: ops/api/playbook.py:55 msgid "Currently playbook is being used in a job" msgstr "当前 playbook 正在作业中使用" -#: ops/api/playbook.py:128 +#: ops/api/playbook.py:122 msgid "Unsupported file content" msgstr "不支持的文件内容" -#: ops/api/playbook.py:130 ops/api/playbook.py:176 ops/api/playbook.py:224 +#: ops/api/playbook.py:124 ops/api/playbook.py:170 ops/api/playbook.py:218 msgid "Invalid file path" msgstr "无效的文件路径" -#: ops/api/playbook.py:202 +#: ops/api/playbook.py:196 msgid "This file can not be rename" msgstr "该文件不能重命名" -#: ops/api/playbook.py:221 +#: ops/api/playbook.py:215 msgid "File already exists" msgstr "文件已存在" -#: ops/api/playbook.py:239 +#: ops/api/playbook.py:233 msgid "File key is required" msgstr "文件密钥该字段是必填项。" -#: ops/api/playbook.py:242 +#: ops/api/playbook.py:236 msgid "This file can not be delete" msgstr "无法删除此文件" @@ -5362,7 +5392,7 @@ msgstr "VCS" msgid "Adhoc" msgstr "命令" -#: ops/const.py:39 ops/models/job.py:152 ops/models/playbook.py:89 +#: ops/const.py:39 ops/models/job.py:154 ops/models/playbook.py:89 #: ops/models/variable.py:23 msgid "Playbook" msgstr "Playbook" @@ -5449,17 +5479,17 @@ msgid "no valid program entry found." msgstr "没有可用程序入口" #: ops/mixin.py:34 ops/mixin.py:166 settings/serializers/auth/ldap.py:74 -#: settings/serializers/auth/ldap_ha.py:57 +#: settings/serializers/auth/ldap_ha.py:56 msgid "Periodic run" msgstr "周期执行" #: ops/mixin.py:36 ops/mixin.py:113 ops/mixin.py:172 -#: settings/serializers/auth/ldap.py:81 settings/serializers/auth/ldap_ha.py:64 +#: settings/serializers/auth/ldap.py:81 settings/serializers/auth/ldap_ha.py:63 msgid "Interval" msgstr "间隔" #: ops/mixin.py:39 ops/mixin.py:111 ops/mixin.py:169 -#: settings/serializers/auth/ldap.py:78 settings/serializers/auth/ldap_ha.py:61 +#: settings/serializers/auth/ldap.py:78 settings/serializers/auth/ldap_ha.py:60 msgid "Crontab" msgstr "Crontab" @@ -5483,7 +5513,11 @@ msgstr "执行周期" msgid "* Please enter a valid crontab expression" msgstr "* 请输入有效的 crontab 表达式" -#: ops/mixin.py:204 settings/serializers/auth/mixin.py:12 +#: ops/mixin.py:194 +msgid "Crontab minute must not contain '*'" +msgstr "" + +#: ops/mixin.py:208 settings/serializers/auth/mixin.py:12 msgid "Require interval or crontab setting" msgstr "需要周期或定期设置" @@ -5491,11 +5525,11 @@ msgstr "需要周期或定期设置" msgid "Pattern" msgstr "模式" -#: ops/models/adhoc.py:22 ops/models/job.py:149 +#: ops/models/adhoc.py:22 ops/models/job.py:151 msgid "Module" msgstr "模块" -#: ops/models/adhoc.py:23 ops/models/celery.py:82 ops/models/job.py:147 +#: ops/models/adhoc.py:23 ops/models/celery.py:82 ops/models/job.py:149 #: terminal/models/component/task.py:14 msgid "Args" msgstr "内容" @@ -5538,48 +5572,52 @@ msgstr "发布日期" msgid "Celery Task Execution" msgstr "Celery 任务执行" -#: ops/models/job.py:150 +#: ops/models/job.py:82 +msgid "Module {} is not suitable for this asset" +msgstr "模块 {} 不适用于此资产" + +#: ops/models/job.py:152 msgid "Run dir" msgstr "运行目录" -#: ops/models/job.py:151 +#: ops/models/job.py:153 msgid "Timeout (Seconds)" msgstr "超时时间 (秒)" -#: ops/models/job.py:157 +#: ops/models/job.py:159 msgid "Use Parameter Define" msgstr "使用参数定义" -#: ops/models/job.py:158 +#: ops/models/job.py:160 msgid "Parameters define" msgstr "参数定义" -#: ops/models/job.py:159 +#: ops/models/job.py:161 msgid "Periodic variable" msgstr "周期执行变量" -#: ops/models/job.py:160 +#: ops/models/job.py:162 msgid "Run as" msgstr "运行用户" -#: ops/models/job.py:162 +#: ops/models/job.py:164 msgid "Run as policy" msgstr "用户策略" -#: ops/models/job.py:219 ops/models/variable.py:28 ops/serializers/job.py:111 +#: ops/models/job.py:221 ops/models/variable.py:28 ops/serializers/job.py:111 #: terminal/notifications.py:182 msgid "Job" msgstr "作业" -#: ops/models/job.py:242 +#: ops/models/job.py:244 msgid "Material" msgstr "Material" -#: ops/models/job.py:244 +#: ops/models/job.py:246 msgid "Material Type" msgstr "Material 类型" -#: ops/models/job.py:556 +#: ops/models/job.py:558 msgid "Job Execution" msgstr "作业执行" @@ -5875,7 +5913,7 @@ msgid "Can not delete virtual org" msgstr "无法删除虚拟组织" #: orgs/serializers.py:10 perms/serializers/permission.py:59 -#: rbac/serializers/role.py:27 users/serializers/group.py:54 +#: rbac/serializers/role.py:27 users/serializers/group.py:53 msgid "Users amount" msgstr "用户数量" @@ -6229,7 +6267,7 @@ msgid "Storage" msgstr "存储" #: rbac/tree.py:61 terminal/models/applet/applet.py:53 -#: terminal/models/applet/applet.py:328 terminal/models/applet/host.py:30 +#: terminal/models/applet/applet.py:369 terminal/models/applet/host.py:30 #: terminal/serializers/applet.py:15 msgid "Applet" msgstr "远程应用" @@ -6482,7 +6520,7 @@ msgid "CAS" msgstr "CAS" #: settings/serializers/auth/cas.py:15 settings/serializers/auth/ldap.py:45 -#: settings/serializers/auth/ldap_ha.py:28 settings/serializers/auth/oidc.py:61 +#: settings/serializers/auth/ldap_ha.py:27 settings/serializers/auth/oidc.py:61 msgid "Server" msgstr "服务端地址" @@ -6509,7 +6547,7 @@ msgstr "启用属性映射" #: settings/serializers/auth/cas.py:34 settings/serializers/auth/dingtalk.py:18 #: settings/serializers/auth/feishu.py:18 settings/serializers/auth/lark.py:17 -#: settings/serializers/auth/ldap.py:67 settings/serializers/auth/ldap_ha.py:50 +#: settings/serializers/auth/ldap.py:67 settings/serializers/auth/ldap_ha.py:49 #: settings/serializers/auth/oauth2.py:60 settings/serializers/auth/oidc.py:39 #: settings/serializers/auth/saml2.py:35 settings/serializers/auth/slack.py:18 #: settings/serializers/auth/wecom.py:18 @@ -6566,7 +6604,7 @@ msgstr "" "用户属性映射,其中 `key` 是 JumpServer 用户属性名称,`value` 是 Lark 服务用户" "属性名称" -#: settings/serializers/auth/ldap.py:42 settings/serializers/auth/ldap.py:104 +#: settings/serializers/auth/ldap.py:42 settings/serializers/auth/ldap.py:108 msgid "LDAP" msgstr "LDAP" @@ -6574,38 +6612,38 @@ msgstr "LDAP" msgid "LDAP server URI" msgstr "LDAP 服务域名" -#: settings/serializers/auth/ldap.py:49 settings/serializers/auth/ldap_ha.py:32 +#: settings/serializers/auth/ldap.py:49 settings/serializers/auth/ldap_ha.py:31 msgid "Bind DN" msgstr "绑定 DN" -#: settings/serializers/auth/ldap.py:50 settings/serializers/auth/ldap_ha.py:33 +#: settings/serializers/auth/ldap.py:50 settings/serializers/auth/ldap_ha.py:32 msgid "Binding Distinguished Name" msgstr "绑定目录管理员" -#: settings/serializers/auth/ldap.py:54 settings/serializers/auth/ldap_ha.py:37 +#: settings/serializers/auth/ldap.py:54 settings/serializers/auth/ldap_ha.py:36 msgid "Binding password" msgstr "绑定密码" -#: settings/serializers/auth/ldap.py:57 settings/serializers/auth/ldap_ha.py:40 +#: settings/serializers/auth/ldap.py:57 settings/serializers/auth/ldap_ha.py:39 msgid "Search OU" msgstr "用户 OU" -#: settings/serializers/auth/ldap.py:59 settings/serializers/auth/ldap_ha.py:42 +#: settings/serializers/auth/ldap.py:59 settings/serializers/auth/ldap_ha.py:41 msgid "" "User Search Base, if there are multiple OUs, you can separate them with the " "`|` symbol" msgstr "用户搜索库,如果有多个OU,可以用`|`符号分隔" -#: settings/serializers/auth/ldap.py:63 settings/serializers/auth/ldap_ha.py:46 +#: settings/serializers/auth/ldap.py:63 settings/serializers/auth/ldap_ha.py:45 msgid "Search filter" msgstr "用户过滤器" -#: settings/serializers/auth/ldap.py:64 settings/serializers/auth/ldap_ha.py:47 +#: settings/serializers/auth/ldap.py:64 settings/serializers/auth/ldap_ha.py:46 #, python-format msgid "Selection could include (cn|uid|sAMAccountName=%(user)s)" msgstr "可能的选项是(cn或uid或sAMAccountName=%(user)s)" -#: settings/serializers/auth/ldap.py:69 settings/serializers/auth/ldap_ha.py:52 +#: settings/serializers/auth/ldap.py:69 settings/serializers/auth/ldap_ha.py:51 msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the LDAP service user attribute name" @@ -6613,15 +6651,25 @@ msgstr "" "用户属性映射,其中 `key` 是 JumpServer 用户属性名称,`value` 是 LDAP 服务用户" "属性名称" -#: settings/serializers/auth/ldap.py:85 settings/serializers/auth/ldap_ha.py:68 +#: settings/serializers/auth/ldap.py:85 settings/serializers/auth/ldap_ha.py:67 msgid "Connect timeout (s)" msgstr "连接超时时间 (秒)" -#: settings/serializers/auth/ldap.py:90 settings/serializers/auth/ldap_ha.py:73 +#: settings/serializers/auth/ldap.py:88 settings/serializers/auth/ldap_ha.py:70 +msgid "Strict sync" +msgstr "严格模式" + +#: settings/serializers/auth/ldap.py:89 settings/serializers/auth/ldap_ha.py:71 +msgid "" +"In strict mode, users not found in LDAP will be disabled during full or " +"automatic sync" +msgstr "启用严格模式后,全量或自动同步将禁用系统中未在 LDAP 中发现的用户" + +#: settings/serializers/auth/ldap.py:94 settings/serializers/auth/ldap_ha.py:76 msgid "User DN cache timeout (s)" msgstr "User DN 缓存超时时间 (秒)" -#: settings/serializers/auth/ldap.py:92 +#: settings/serializers/auth/ldap.py:96 msgid "" "Caching the User DN obtained during user login authentication can " "effectively improve the speed of user authentication., 0 means no " @@ -6631,20 +6679,21 @@ msgstr "" "对用户登录认证时查询出的 User DN 进行缓存,可以有效提高用户认证的速度
如果" "用户 OU 架构有调整,点击提交即可清除用户 DN 缓存" -#: settings/serializers/auth/ldap.py:98 settings/serializers/auth/ldap_ha.py:81 +#: settings/serializers/auth/ldap.py:102 +#: settings/serializers/auth/ldap_ha.py:84 msgid "Search paged size (piece)" msgstr "搜索分页数量 (条)" -#: settings/serializers/auth/ldap_ha.py:25 -#: settings/serializers/auth/ldap_ha.py:87 +#: settings/serializers/auth/ldap_ha.py:24 +#: settings/serializers/auth/ldap_ha.py:90 msgid "LDAP HA" msgstr "LDAP 认证" -#: settings/serializers/auth/ldap_ha.py:29 +#: settings/serializers/auth/ldap_ha.py:28 msgid "LDAP HA server URI" msgstr "LDAP HA 服务域名" -#: settings/serializers/auth/ldap_ha.py:75 +#: settings/serializers/auth/ldap_ha.py:78 msgid "" "Caching the User DN obtained during user login authentication can " "effectivelyimprove the speed of user authentication., 0 means no cache
If " @@ -7454,45 +7503,53 @@ msgstr "第三方认证开启 MFA" msgid "The third-party login modes include OIDC, CAS, and SAML2" msgstr "第三方登录方式包括: OIDC、CAS、SAML2" -#: settings/serializers/security.py:128 +#: settings/serializers/security.py:129 +msgid "MFA via Email" +msgstr "邮件验证 MFA" + +#: settings/serializers/security.py:130 +msgid "Email as a method for multi-factor authentication" +msgstr "将电子邮件作为多因子认证的一种方式" + +#: settings/serializers/security.py:133 msgid "OTP issuer name" msgstr "OTP 扫描后的名称" -#: settings/serializers/security.py:132 +#: settings/serializers/security.py:137 msgid "OTP valid window" msgstr "OTP 延迟有效次数" -#: settings/serializers/security.py:136 +#: settings/serializers/security.py:141 msgid "MFA verify TTL" msgstr "MFA 校验有效期" -#: settings/serializers/security.py:138 +#: settings/serializers/security.py:143 msgid "" "Unit: second, The verification MFA takes effect only when you view the " "account password" msgstr "单位:秒,目前仅在查看账号密码校验 MFA 时生效" -#: settings/serializers/security.py:143 +#: settings/serializers/security.py:148 msgid "MFA in login page" msgstr "MFA 在登录页面输入" -#: settings/serializers/security.py:144 +#: settings/serializers/security.py:149 msgid "Eu security regulations(GDPR) require MFA to be on the login page" msgstr "欧盟数据安全法规(GDPR) 要求 MFA 在登录页面,来确保系统登录安全" -#: settings/serializers/security.py:148 +#: settings/serializers/security.py:153 msgid "Verify code TTL (second)" msgstr "验证码有效时间 (分)" -#: settings/serializers/security.py:149 +#: settings/serializers/security.py:154 msgid "Reset password and send SMS code expiration time" msgstr "重置密码的验证码及发送短信的验证码过期时间" -#: settings/serializers/security.py:153 +#: settings/serializers/security.py:158 msgid "Login dynamic code" msgstr "启用登录附加码" -#: settings/serializers/security.py:154 +#: settings/serializers/security.py:159 msgid "" "The password and additional code are sent to a third party authentication " "system for verification" @@ -7500,19 +7557,19 @@ msgstr "" "密码和附加码一并发送给第三方认证系统进行校验, 如:有的第三方认证系统,需要 密" "码+6位数字 完成认证" -#: settings/serializers/security.py:158 +#: settings/serializers/security.py:163 msgid "Login captcha" msgstr "启用登录验证码" -#: settings/serializers/security.py:159 +#: settings/serializers/security.py:164 msgid "Enable captcha to prevent robot authentication" msgstr "开启验证码,防止机器人登录" -#: settings/serializers/security.py:162 +#: settings/serializers/security.py:167 msgid "Suspicious Login Verification" msgstr "异地登录通知" -#: settings/serializers/security.py:164 +#: settings/serializers/security.py:169 msgid "" "The system determines whether the login IP address belongs to a common login " "city. If the account is logged in from a common login city, the system sends " @@ -7521,81 +7578,77 @@ msgstr "" "根据登录 IP 是否所属常用登录城市进行判断,若账号在非常用城市登录,会发送异地" "登录提醒" -#: settings/serializers/security.py:170 +#: settings/serializers/security.py:175 msgid "Auto Disable Threshold (day)" msgstr "不活跃用户自动禁用 (天)" -#: settings/serializers/security.py:171 +#: settings/serializers/security.py:176 msgid "" "Detect infrequent users daily and disable them if they exceed the " "predetermined time limit" msgstr "每天检测一次,超过预设时间的用户自动禁用" -#: settings/serializers/security.py:191 +#: settings/serializers/security.py:196 msgid "Watermark" msgstr "开启水印" -#: settings/serializers/security.py:192 -msgid "Enabled, the web session and replay contains watermark information" -msgstr "启用后,Web 会话和录像将包含水印信息" - -#: settings/serializers/security.py:196 +#: settings/serializers/security.py:200 msgid "Max idle time (minute)" msgstr "连接最大空闲时间 (分)" -#: settings/serializers/security.py:197 +#: settings/serializers/security.py:201 msgid "If idle time more than it, disconnect connection." msgstr "提示:如果超过该配置没有操作,连接会被断开" -#: settings/serializers/security.py:200 +#: settings/serializers/security.py:204 msgid "Session expire at browser closed" msgstr "会话在浏览器关闭时过期" -#: settings/serializers/security.py:201 +#: settings/serializers/security.py:205 msgid "Whether to expire the session when the user closes their browser." msgstr "当用户关闭浏览器时是否使会话过期。" -#: settings/serializers/security.py:206 +#: settings/serializers/security.py:210 msgid "Allow users to view asset session information" msgstr "允许用户查看资产在线会话信息" -#: settings/serializers/security.py:208 +#: settings/serializers/security.py:212 msgid "" "When a user connects to an asset, the account selection popup displays the " "number of active sessions for the current asset (RDP protocol only)." msgstr "" "当用户连接资产时,账号选择弹窗中显示当前资产的在线会话数量(仅 rdp 协议)" -#: settings/serializers/security.py:214 +#: settings/serializers/security.py:218 msgid "Max online time (hour)" msgstr "会话连接最大时间 (时)" -#: settings/serializers/security.py:215 +#: settings/serializers/security.py:219 msgid "If session connection time more than it, disconnect connection." msgstr "提示:如果会话连接超过该配置,连接会被断开" -#: settings/serializers/security.py:218 +#: settings/serializers/security.py:222 msgid "Remember manual auth" msgstr "保存手动输入密码" -#: settings/serializers/security.py:221 +#: settings/serializers/security.py:225 #: terminal/templates/terminal/_msg_session_sharing.html:10 msgid "Session share" msgstr "会话分享" -#: settings/serializers/security.py:222 +#: settings/serializers/security.py:226 msgid "Enabled, Allows user active session to be shared with other users" msgstr "开启后允许用户分享已连接的资产会话给他人,协同工作" -#: settings/serializers/security.py:228 +#: settings/serializers/security.py:232 msgid "Insecure command alert" msgstr "危险命令告警" -#: settings/serializers/security.py:231 +#: settings/serializers/security.py:235 msgid "Email recipient" msgstr "邮件收件人" -#: settings/serializers/security.py:232 +#: settings/serializers/security.py:236 msgid "Multiple user using , split" msgstr "多个用户,使用 , 分割" @@ -7608,22 +7661,26 @@ msgstr "[%s] %s" msgid "Auto" msgstr "自动" -#: settings/serializers/terminal.py:22 +#: settings/serializers/terminal.py:23 +msgid "Auto(Enabled for the first 5 minutes after startup, then disabled.)" +msgstr "自动(启动后前 5 分钟启用,然后禁用。)" + +#: settings/serializers/terminal.py:26 msgid "Registration" msgstr "组件注册" -#: settings/serializers/terminal.py:24 +#: settings/serializers/terminal.py:28 msgid "" "Allow component register, after all component setup, you should disable this " "for security" msgstr "是否允许组件注册,当所有终端启动后,为了安全应该关闭" -#: settings/serializers/terminal.py:30 +#: settings/serializers/terminal.py:34 msgid "" "* Allow users to log in to the KoKo component via password authentication" msgstr "* 允许用户通过密码验证登录KoKo组件" -#: settings/serializers/terminal.py:36 +#: settings/serializers/terminal.py:40 msgid "" "* Allow users to log in to the KoKo component via Public key " "authentication
If third-party authentication services, such as AD/LDAP, " @@ -7633,15 +7690,15 @@ msgstr "" "* 允许用户通过公钥认证方式登录 KoKo 组件
如果第三方认证服务(如 AD/LDAP)" "已启用,则应禁用此选项,以防止用户从 AD/LDAP 服务器中删除后再次登录" -#: settings/serializers/terminal.py:43 +#: settings/serializers/terminal.py:47 msgid "Asset sorting" msgstr "资产列表排序" -#: settings/serializers/terminal.py:46 +#: settings/serializers/terminal.py:50 msgid "Asset page size" msgstr "资产列表每页数量" -#: settings/serializers/terminal.py:51 +#: settings/serializers/terminal.py:55 msgid "" "* You can individually configure the service address and port in the service " "endpoint
If enabled, the Luna page will display the DB client launch " @@ -7650,7 +7707,7 @@ msgstr "" "* 您可以在服务端点中单独配置服务地址和端口
如果启用,Luna 页面将在连接资" "产时显示 DB 客户端启动方法" -#: settings/serializers/terminal.py:59 +#: settings/serializers/terminal.py:63 msgid "" "* You can individually configure the service address and port in the service " "endpoint
If enabled, the Luna page will display the download rdp file " @@ -7659,11 +7716,11 @@ msgstr "" "* 您可以在服务端点中单独配置服务地址和端口
如果启用,Luna 页面将在连接资" "产时显示下载 rdp 文件按钮和 RDP 客户端启动方法" -#: settings/serializers/terminal.py:66 +#: settings/serializers/terminal.py:70 msgid "Client connection" msgstr "客户端连接" -#: settings/serializers/terminal.py:68 +#: settings/serializers/terminal.py:72 msgid "" "* Allow connecting to the KoKo component via SSH client
If enabled, the " "Luna page will display the SSH client launch method when connecting to assets" @@ -7685,25 +7742,25 @@ msgid "" "in the workbench" msgstr "*! 如果启用,具有 RBAC 权限的用户将能够使用工作台中的所有工具" -#: settings/tasks/ldap.py:73 +#: settings/tasks/ldap.py:67 msgid "Periodic import ldap user" msgstr "周期导入 LDAP 用户" -#: settings/tasks/ldap.py:75 settings/tasks/ldap.py:85 +#: settings/tasks/ldap.py:69 settings/tasks/ldap.py:79 msgid "" "When LDAP auto-sync is configured, this task will be invoked to synchronize " "users" msgstr "当设置了LDAP自动同步,将调用该任务进行用户同步" -#: settings/tasks/ldap.py:83 +#: settings/tasks/ldap.py:77 msgid "Periodic import ldap ha user" msgstr "周期导入 LDAP HA 用户" -#: settings/tasks/ldap.py:120 +#: settings/tasks/ldap.py:115 msgid "Registration periodic import ldap user task" msgstr "注册周期导入 LDAP 用户 任务" -#: settings/tasks/ldap.py:122 +#: settings/tasks/ldap.py:117 msgid "" "When LDAP auto-sync parameters change, such as Crontab parameters, the LDAP " "sync task \n" @@ -7712,11 +7769,11 @@ msgstr "" "当设置了LDAP自动同步参数发生变化时,比如Crontab参数,重新注册或更新ldap同步任" "务将调用该任务" -#: settings/tasks/ldap.py:136 +#: settings/tasks/ldap.py:131 msgid "Registration periodic import ldap ha user task" msgstr "注册周期导入 LDAP HA 用户 任务" -#: settings/tasks/ldap.py:138 +#: settings/tasks/ldap.py:133 msgid "" "When LDAP HA auto-sync parameters change, such as Crontab parameters, the " "LDAP HA sync task \n" @@ -7741,114 +7798,114 @@ msgstr "已同步用户" msgid "No user synchronization required" msgstr "没有用户需要同步" -#: settings/utils/ldap.py:509 +#: settings/utils/ldap.py:529 msgid "ldap:// or ldaps:// protocol is used." msgstr "使用 ldap:// 或 ldaps:// 协议" -#: settings/utils/ldap.py:520 +#: settings/utils/ldap.py:540 msgid "Host or port is disconnected: {}" msgstr "主机或端口不可连接: {}" -#: settings/utils/ldap.py:522 +#: settings/utils/ldap.py:542 msgid "The port is not the port of the LDAP service: {}" msgstr "端口不是LDAP服务端口: {}" -#: settings/utils/ldap.py:524 +#: settings/utils/ldap.py:544 msgid "Please add certificate: {}" msgstr "请添加证书" -#: settings/utils/ldap.py:528 settings/utils/ldap.py:555 -#: settings/utils/ldap.py:585 settings/utils/ldap.py:613 +#: settings/utils/ldap.py:548 settings/utils/ldap.py:575 +#: settings/utils/ldap.py:605 settings/utils/ldap.py:633 msgid "Unknown error: {}" msgstr "未知错误: {}" -#: settings/utils/ldap.py:542 +#: settings/utils/ldap.py:562 msgid "Bind DN or Password incorrect" msgstr "绑定DN或密码错误" -#: settings/utils/ldap.py:549 +#: settings/utils/ldap.py:569 msgid "Please enter Bind DN: {}" msgstr "请输入绑定DN: {}" -#: settings/utils/ldap.py:551 +#: settings/utils/ldap.py:571 msgid "Please enter Password: {}" msgstr "请输入密码: {}" -#: settings/utils/ldap.py:553 +#: settings/utils/ldap.py:573 msgid "Please enter correct Bind DN and Password: {}" msgstr "请输入正确的绑定DN和密码: {}" -#: settings/utils/ldap.py:571 +#: settings/utils/ldap.py:591 msgid "Invalid User OU or User search filter: {}" msgstr "不合法的用户OU或用户过滤器: {}" -#: settings/utils/ldap.py:602 +#: settings/utils/ldap.py:622 msgid "LDAP User attr map not include: {}" msgstr "LDAP属性映射没有包含: {}" -#: settings/utils/ldap.py:609 +#: settings/utils/ldap.py:629 msgid "LDAP User attr map is not dict" msgstr "LDAP属性映射不合法" -#: settings/utils/ldap.py:628 +#: settings/utils/ldap.py:648 msgid "LDAP authentication is not enabled" msgstr "LDAP认证没有启用" -#: settings/utils/ldap.py:646 +#: settings/utils/ldap.py:666 msgid "Error (Invalid LDAP server): {}" msgstr "错误 (不合法的LDAP服务器地址): {}" -#: settings/utils/ldap.py:648 +#: settings/utils/ldap.py:668 msgid "Error (Invalid Bind DN): {}" msgstr "错误 (不合法的绑定DN): {}" -#: settings/utils/ldap.py:650 +#: settings/utils/ldap.py:670 msgid "Error (Invalid LDAP User attr map): {}" msgstr "错误 (不合法的LDAP属性映射): {}" -#: settings/utils/ldap.py:652 +#: settings/utils/ldap.py:672 msgid "Error (Invalid User OU or User search filter): {}" msgstr "错误 (不合法的用户OU或用户过滤器): {}" -#: settings/utils/ldap.py:654 +#: settings/utils/ldap.py:674 msgid "Error (Not enabled LDAP authentication): {}" msgstr "错误 (没有启用LDAP认证): {}" -#: settings/utils/ldap.py:656 +#: settings/utils/ldap.py:676 msgid "Error (Unknown): {}" msgstr "错误 (未知): {}" -#: settings/utils/ldap.py:659 +#: settings/utils/ldap.py:679 msgid "Succeed: Match {} users" msgstr "成功匹配 {} 个用户" -#: settings/utils/ldap.py:689 +#: settings/utils/ldap.py:709 msgid "Authentication failed (configuration incorrect): {}" msgstr "认证失败 (配置错误): {}" -#: settings/utils/ldap.py:693 +#: settings/utils/ldap.py:713 msgid "Authentication failed (username or password incorrect): {}" msgstr "认证失败 (用户名或密码不正确): {}" -#: settings/utils/ldap.py:695 +#: settings/utils/ldap.py:715 msgid "Authentication failed (Unknown): {}" msgstr "认证失败: (未知): {}" -#: settings/utils/ldap.py:698 +#: settings/utils/ldap.py:718 msgid "Authentication success: {}" msgstr "认证成功: {}" -#: settings/ws.py:222 +#: settings/ws.py:223 msgid "No LDAP user was found" msgstr "没有获取到 LDAP 用户" -#: settings/ws.py:228 +#: settings/ws.py:232 msgid "Total {}, success {}, failure {}" msgstr "总共 {},成功 {},失败 {}" -#: templates/_csv_import_export.html:8 -msgid "Export" -msgstr "导出" +#: settings/ws.py:236 +msgid ", disabled {}" +msgstr ", 禁用 {}" #: templates/_csv_import_export.html:13 templates/_csv_import_modal.html:5 #: xpack/plugins/cloud/const.py:65 @@ -8062,7 +8119,7 @@ msgstr "测试成功" msgid "Test failure: Please check configuration" msgstr "测试失败:请检查配置" -#: terminal/api/component/terminal.py:57 +#: terminal/api/component/terminal.py:56 msgid "Have online sessions" msgstr "有在线会话" @@ -8242,7 +8299,7 @@ msgstr "版本" msgid "Can concurrent" msgstr "可以并发" -#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:179 +#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:194 #: terminal/serializers/storage.py:193 msgid "Hosts" msgstr "主机" @@ -8264,12 +8321,12 @@ msgstr "只支持自定义平台" msgid "Missing type in platform.yml" msgstr "在 platform.yml 中缺少类型" -#: terminal/models/applet/applet.py:330 terminal/models/applet/host.py:36 +#: terminal/models/applet/applet.py:371 terminal/models/applet/host.py:36 #: terminal/models/applet/host.py:138 msgid "Hosting" msgstr "宿主机" -#: terminal/models/applet/applet.py:336 +#: terminal/models/applet/applet.py:377 msgid "Applet Publication" msgstr "应用发布" @@ -8346,18 +8403,22 @@ msgid "SQLServer port" msgstr "SQLServer 端口" #: terminal/models/component/endpoint.py:25 +msgid "Oracle port" +msgstr "Oracle 端口" + +#: terminal/models/component/endpoint.py:26 msgid "VNC port" msgstr "VNC 端口" -#: terminal/models/component/endpoint.py:33 -#: terminal/models/component/endpoint.py:120 -#: terminal/serializers/endpoint.py:80 terminal/serializers/storage.py:41 +#: terminal/models/component/endpoint.py:34 +#: terminal/models/component/endpoint.py:114 +#: terminal/serializers/endpoint.py:61 terminal/serializers/storage.py:41 #: terminal/serializers/storage.py:53 terminal/serializers/storage.py:83 #: terminal/serializers/storage.py:93 terminal/serializers/storage.py:101 msgid "Endpoint" msgstr "端点" -#: terminal/models/component/endpoint.py:126 +#: terminal/models/component/endpoint.py:120 msgid "Endpoint rule" msgstr "端点规则" @@ -8564,7 +8625,7 @@ msgid "Command and replay storage" msgstr "命令及录像存储" #: terminal/notifications.py:258 terminal/tasks.py:212 -#: xpack/plugins/cloud/api.py:160 +#: xpack/plugins/cloud/api.py:175 #: xpack/plugins/cloud/serializers/account.py:121 #: xpack/plugins/cloud/serializers/account.py:123 msgid "Test failure: Account invalid" @@ -8702,15 +8763,15 @@ msgstr "" "优先使用同名账号连接发布机。为了安全,需配置文件中开启配置 " "CACHE_LOGIN_PASSWORD_ENABLED=true, 修改后重启服务" -#: terminal/serializers/applet_host.py:149 +#: terminal/serializers/applet_host.py:164 msgid "Install applets" msgstr "安装应用" -#: terminal/serializers/applet_host.py:179 +#: terminal/serializers/applet_host.py:194 msgid "Host ID" msgstr "主机 ID" -#: terminal/serializers/applet_host.py:180 +#: terminal/serializers/applet_host.py:195 msgid "Applet ID" msgstr "远程应用 ID" @@ -8738,23 +8799,7 @@ msgstr "无效的 Session ID" msgid "Timestamp" msgstr "时间戳" -#: terminal/serializers/endpoint.py:15 -msgid "Oracle port" -msgstr "Oracle 端口" - -#: terminal/serializers/endpoint.py:18 -msgid "Oracle port range" -msgstr "Oracle 端口范围" - -#: terminal/serializers/endpoint.py:20 -msgid "" -"Oracle proxy server listen port is dynamic, Each additional Oracle database " -"instance adds a port listener" -msgstr "" -"Oracle 代理服务器监听端口是动态的,每增加一个 Oracle 数据库实例,就会增加一个" -"端口监听" - -#: terminal/serializers/endpoint.py:38 +#: terminal/serializers/endpoint.py:26 msgid "" "The host address accessed when connecting to assets, if it is empty, the " "access address of the current browser will be used (the default endpoint " @@ -8763,18 +8808,18 @@ msgstr "" "连接资产时访问的主机地址,如果为空则使用当前浏览器的访问地址 (默认端点不允许" "修改主机)" -#: terminal/serializers/endpoint.py:71 +#: terminal/serializers/endpoint.py:52 msgid "" "The assets within this IP range, the following endpoint will be used for the " "connection" msgstr "该 IP 范围内的资产,将使用下面的端点进行连接" -#: terminal/serializers/endpoint.py:72 +#: terminal/serializers/endpoint.py:53 msgid "" "If asset IP addresses under different endpoints conflict, use asset labels" msgstr "如果不同端点下的资产 IP 有冲突,使用资产标签实现" -#: terminal/serializers/endpoint.py:76 +#: terminal/serializers/endpoint.py:57 msgid "Asset IP" msgstr "资产 IP" @@ -9120,25 +9165,6 @@ msgstr "" msgid "view" msgstr "查看" -#: terminal/utils/db_port_mapper.py:88 -msgid "" -"No available port is matched. The number of databases may have exceeded the " -"number of ports open to the database agent service, Contact the " -"administrator to open more ports." -msgstr "" -"未匹配到可用端口,数据库的数量可能已经超过数据库代理服务开放的端口数量,请联" -"系管理员开放更多端口。" - -#: terminal/utils/db_port_mapper.py:116 -msgid "" -"No ports can be used, check and modify the limit on the number of ports that " -"Magnus listens on in the configuration file." -msgstr "没有端口可以使用,检查并修改配置文件中 Magnus 监听的端口数量限制。" - -#: terminal/utils/db_port_mapper.py:118 -msgid "All available port count: {}, Already use port count: {}" -msgstr "所有可用端口数量:{},已使用端口数量:{}" - #: tickets/api/ticket.py:88 tickets/models/ticket/general.py:289 msgid "Applicant" msgstr "申请人" @@ -9806,7 +9832,7 @@ msgstr "命令行" msgid "The old password is incorrect" msgstr "旧密码错误" -#: users/serializers/profile.py:37 users/serializers/profile.py:148 +#: users/serializers/profile.py:37 users/serializers/profile.py:156 msgid "Password does not match security rules" msgstr "密码不满足安全规则" @@ -10279,15 +10305,15 @@ msgid "" "strategy will skipped." msgstr "根据当前任务配置,不符合策略的资产将被跳过。" -#: xpack/plugins/cloud/api.py:72 +#: xpack/plugins/cloud/api.py:74 msgid "Test connection successful" msgstr "测试成功" -#: xpack/plugins/cloud/api.py:74 +#: xpack/plugins/cloud/api.py:76 msgid "Test connection failed: {}" msgstr "测试连接失败:{}" -#: xpack/plugins/cloud/api.py:171 +#: xpack/plugins/cloud/api.py:196 msgid "User {} deleted the current resource and released the assets" msgstr "用户 {} 删除了当前资源已释放的资产" @@ -11005,27 +11031,16 @@ msgid "Instance count" msgstr "实例个数" #: xpack/plugins/cloud/tasks.py:33 -#, fuzzy -#| msgid "" -#| "Execute this task when manually or scheduled cloud synchronization tasks " -#| "are performed" msgid "" "Execute this task when manually or scheduled cloud synchronization tasks are " "performed" -msgstr "手动,定时执行云同步任务时执行该任务" +msgstr "执行手动或定时云同步任务时执行此任务" #: xpack/plugins/cloud/tasks.py:50 msgid "Period clean sync instance task execution" msgstr "定期清除同步实例任务执行记录" #: xpack/plugins/cloud/tasks.py:52 -#, fuzzy -#| msgid "" -#| "Every day, according to the configuration in \"System Settings - Tasks - " -#| "Regular \n" -#| " clean-up - Cloud sync task history retention days\" the system " -#| "will clean up the execution \n" -#| " records generated by cloud synchronization" msgid "" "Every day, according to the configuration in \"System Settings - Tasks - " "Regular \n" @@ -11033,8 +11048,7 @@ msgid "" "clean up the execution \n" " records generated by cloud synchronization" msgstr "" -"每天,系统会根据“系统设置-任务-”中的配置定期清理云同步任务历史保留天数,对云" -"同步产生的执行记录进行清理" +"每天系统会根据“系统设置-任务-定期清理-云同步任务历史记录保留天数”中的配置,清理云同步执行过程中产生的记录。" #: xpack/plugins/interface/api.py:52 msgid "Restore default successfully." @@ -11089,45 +11103,3 @@ msgstr "许可证导入成功" #: xpack/plugins/license/api.py:53 msgid "Invalid license" msgstr "许可证无效" - -#, fuzzy -#~| msgid "Container name" -#~ msgid "domain_name" -#~ msgstr "容器名称" - -#~ msgid "Password error" -#~ msgstr "密码错误" - -#~ msgid "No admin account" -#~ msgstr "没有管理账号" - -#~ msgid "Others" -#~ msgstr "其它" - -#~ msgid "Ok count" -#~ msgstr "成功数" - -#~ msgid "No password count" -#~ msgstr "无密码数" - -#~ msgid "No weak password" -#~ msgstr "无弱密码" - -#~ msgid "" -#~ "The following is a summary of account backup tasks, please review and " -#~ "handle them" -#~ msgstr "以下是账户备份任务的概要,请查阅并处理" - -#~ msgid "" -#~ "The following is a summary of account change secret tasks, please read " -#~ "and process" -#~ msgstr "以下是账号更改秘密任务的摘要,请阅读并处理" - -#~ msgid "" -#~ "The following is a summary of the account check tasks. Please review and " -#~ "handle them" -#~ msgstr "以下是账号检查任务的汇总,请查阅并处理" - -#~ msgid "" -#~ "The following is a summary of account push tasks, please read and process" -#~ msgstr "以下是账号推送任务的汇总,请阅读并处理" diff --git a/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po b/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po index 7e3e6d5ca..c92823d79 100644 --- a/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po +++ b/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-20 11:52+0800\n" +"POT-Creation-Date: 2025-04-17 15:04+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -16,21 +16,20 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.3\n" -"X-ZhConverter: 繁化姬 dict-74c8d060-r1048 @ 2024/04/07 18:19:20 | https://" -"zhconvert.org\n" +"X-ZhConverter: 繁化姬 dict-74c8d060-r1048 @ 2024/04/07 18:19:20 | https://zhconvert.org\n" -#: accounts/api/account/account.py:121 +#: accounts/api/account/account.py:131 #: accounts/serializers/account/account.py:181 -#: accounts/serializers/account/account.py:342 +#: accounts/serializers/account/account.py:344 msgid "Account already exists" msgstr "帳號已存在" #: accounts/api/account/application.py:78 -#: authentication/api/connection_token.py:452 +#: authentication/api/connection_token.py:451 msgid "Account not found" msgstr "帳號未找到" -#: accounts/api/automations/base.py:83 tickets/api/ticket.py:132 +#: accounts/api/automations/base.py:86 tickets/api/ticket.py:132 msgid "The parameter 'action' must be [{}]" msgstr "參數 'action' 必須是 [{}]" @@ -95,7 +94,7 @@ msgstr "帳號備份計劃正在執行" msgid "Plan execution end" msgstr "計劃執行結束" -#: accounts/automations/base/manager.py:118 +#: accounts/automations/base/manager.py:119 msgid "No pending accounts found" msgstr "未找到待處理帳戶" @@ -108,8 +107,7 @@ msgstr "成功: %s, 失敗: %s, 總數: %s" msgid "" "---\n" "Summary: \n" -"ok: {}, weak password: {}, leaked password: {}, repeated password: {}, no " -"secret: {}, using time: {}s" +"ok: {}, weak password: {}, leaked password: {}, repeated password: {}, no secret: {}, using time: {}s" msgstr "" "---\n" "摘要: \n" @@ -125,14 +123,14 @@ msgstr ">>> 開始執行測試閘道器帳號可連結性的任務" #: accounts/const/account.py:6 #: accounts/serializers/automations/change_secret.py:34 -#: audits/signal_handlers/login_log.py:34 authentication/confirm/password.py:25 -#: authentication/confirm/password.py:27 authentication/const.py:10 -#: authentication/forms.py:28 +#: audits/signal_handlers/login_log.py:34 +#: authentication/confirm/password.py:25 authentication/confirm/password.py:27 +#: authentication/const.py:10 authentication/forms.py:28 #: authentication/templates/authentication/login.html:362 #: authentication/templates/authentication/login.html:408 #: settings/serializers/auth/ldap.py:27 settings/serializers/auth/ldap.py:53 -#: settings/serializers/auth/ldap_ha.py:36 settings/serializers/msg.py:37 -#: settings/serializers/terminal.py:28 terminal/serializers/storage.py:123 +#: settings/serializers/auth/ldap_ha.py:35 settings/serializers/msg.py:37 +#: settings/serializers/terminal.py:32 terminal/serializers/storage.py:123 #: terminal/serializers/storage.py:142 users/forms/profile.py:22 #: users/serializers/user.py:148 #: users/templates/users/_msg_user_created.html:13 @@ -194,7 +192,8 @@ msgstr "發現" msgid "Template" msgstr "模板" -#: accounts/const/account.py:32 ops/const.py:46 xpack/plugins/cloud/const.py:68 +#: accounts/const/account.py:32 ops/const.py:46 +#: xpack/plugins/cloud/const.py:68 msgid "Skip" msgstr "跳過" @@ -204,7 +203,7 @@ msgid "Update" msgstr "更新" #: accounts/const/account.py:34 accounts/const/automation.py:115 -#: accounts/serializers/automations/change_secret.py:169 audits/const.py:65 +#: accounts/serializers/automations/change_secret.py:169 audits/const.py:66 #: audits/signal_handlers/activity_log.py:34 common/const/choices.py:67 #: ops/const.py:76 terminal/const.py:81 xpack/plugins/cloud/const.py:47 msgid "Failed" @@ -307,7 +306,7 @@ msgstr "創建並推送" msgid "Only create" msgstr "僅創建" -#: accounts/const/automation.py:109 +#: accounts/const/automation.py:109 authentication/const.py:34 #: authentication/serializers/password_mfa.py:16 #: authentication/serializers/password_mfa.py:24 #: notifications/backends/__init__.py:10 settings/serializers/msg.py:21 @@ -323,7 +322,7 @@ msgid "SFTP" msgstr "SFTP" #: accounts/const/automation.py:116 -#: accounts/serializers/automations/change_secret.py:168 audits/const.py:64 +#: accounts/serializers/automations/change_secret.py:168 audits/const.py:65 #: audits/models.py:65 audits/signal_handlers/activity_log.py:34 #: common/const/choices.py:66 ops/const.py:74 ops/serializers/celery.py:48 #: terminal/const.py:80 terminal/models/session/sharing.py:121 @@ -414,33 +413,11 @@ msgid "" "Vault." msgstr "Vault 操作失敗,請重試,或檢查 Vault 上的帳號信息。" -#: accounts/filters.py:194 -msgid "Enter a valid UUID." -msgstr "" - -#: accounts/mixins.py:35 -msgid "Export all" -msgstr "匯出所有" - -#: accounts/mixins.py:37 -msgid "Export only selected items" -msgstr "僅匯出選擇項" - -#: accounts/mixins.py:42 -#, python-format -msgid "Export filtered: %s" -msgstr "匯出搜素: %s" - -#: accounts/mixins.py:48 -#, python-format -msgid "User %s view/export secret" -msgstr "用戶 %s 查看/匯出 了密碼" - #: accounts/models/account.py:85 #: accounts/models/automations/check_account.py:59 #: accounts/models/automations/gather_account.py:17 -#: accounts/serializers/account/account.py:226 -#: accounts/serializers/account/account.py:274 +#: accounts/serializers/account/account.py:227 +#: accounts/serializers/account/account.py:276 #: accounts/serializers/automations/change_secret.py:113 #: accounts/serializers/automations/change_secret.py:145 #: accounts/serializers/automations/check_account.py:33 @@ -454,9 +431,9 @@ msgstr "用戶 %s 查看/匯出 了密碼" #: accounts/templates/accounts/push_account_report.html:78 #: accounts/templates/accounts/push_account_report.html:118 #: acls/serializers/base.py:130 assets/models/asset/common.py:102 -#: assets/models/asset/common.py:366 assets/models/cmd_filter.py:36 -#: audits/models.py:59 audits/models.py:312 audits/serializers.py:228 -#: authentication/models/connection_token.py:40 +#: assets/models/asset/common.py:428 assets/models/cmd_filter.py:36 +#: audits/models.py:59 audits/models.py:312 audits/serializers.py:230 +#: authentication/models/connection_token.py:41 #: perms/models/asset_permission.py:69 terminal/backends/command/models.py:17 #: terminal/models/session/session.py:34 terminal/notifications.py:156 #: terminal/serializers/command.py:17 terminal/serializers/session.py:30 @@ -467,10 +444,10 @@ msgid "Asset" msgstr "資產" #: accounts/models/account.py:89 accounts/models/template.py:16 -#: accounts/serializers/account/account.py:233 -#: accounts/serializers/account/account.py:284 +#: accounts/serializers/account/account.py:234 +#: accounts/serializers/account/account.py:286 #: accounts/serializers/account/template.py:35 -#: authentication/serializers/connect_token_secret.py:50 +#: authentication/serializers/connect_token_secret.py:51 msgid "Su from" msgstr "切換自" @@ -488,7 +465,7 @@ msgstr "歷史帳號" msgid "Secret reset" msgstr "可改密" -#: accounts/models/account.py:97 accounts/serializers/account/account.py:228 +#: accounts/models/account.py:97 accounts/serializers/account/account.py:229 #: users/models/user/__init__.py:122 msgid "Source" msgstr "來源" @@ -515,14 +492,14 @@ msgstr "改密狀態" #: accounts/models/account.py:107 #: accounts/models/automations/check_account.py:64 -#: accounts/serializers/account/service.py:11 +#: accounts/serializers/account/service.py:12 #: accounts/serializers/automations/change_secret.py:115 #: accounts/serializers/automations/change_secret.py:146 #: accounts/templates/accounts/change_secret_failed_info.html:12 #: acls/serializers/base.py:131 #: acls/templates/acls/asset_login_reminder.html:10 #: assets/serializers/gateway.py:33 audits/models.py:60 audits/models.py:313 -#: audits/serializers.py:229 authentication/api/connection_token.py:464 +#: audits/serializers.py:231 authentication/api/connection_token.py:463 #: ops/models/base.py:18 perms/models/asset_permission.py:75 #: settings/serializers/msg.py:33 terminal/backends/command/models.py:18 #: terminal/models/session/session.py:36 terminal/serializers/command.py:72 @@ -559,29 +536,31 @@ msgstr "可以移除帳號" #: accounts/models/application.py:16 #: accounts/models/automations/check_account.py:116 accounts/models/base.py:63 -#: accounts/serializers/account/service.py:27 +#: accounts/serializers/account/service.py:28 #: accounts/serializers/account/virtual.py:20 acls/models/base.py:35 #: acls/models/base.py:96 acls/models/command_acl.py:21 #: acls/serializers/base.py:35 assets/models/asset/common.py:100 #: assets/models/asset/common.py:166 assets/models/cmd_filter.py:21 #: assets/models/domain.py:19 assets/models/label.py:18 #: assets/models/platform.py:15 assets/models/platform.py:94 -#: assets/serializers/asset/common.py:171 assets/serializers/platform.py:158 -#: assets/serializers/platform.py:278 +#: assets/serializers/asset/common.py:173 assets/serializers/platform.py:158 +#: assets/serializers/platform.py:283 #: authentication/backends/passkey/models.py:10 #: authentication/models/ssh_key.py:12 -#: authentication/serializers/connect_token_secret.py:113 -#: authentication/serializers/connect_token_secret.py:170 labels/models.py:11 +#: authentication/serializers/connect_token_secret.py:115 +#: authentication/serializers/connect_token_secret.py:172 labels/models.py:11 #: ops/mixin.py:32 ops/models/adhoc.py:19 ops/models/celery.py:15 -#: ops/models/celery.py:81 ops/models/job.py:145 ops/models/playbook.py:28 +#: ops/models/celery.py:81 ops/models/job.py:147 ops/models/playbook.py:28 #: ops/models/variable.py:9 ops/serializers/job.py:20 #: ops/serializers/variable.py:20 orgs/models.py:82 #: perms/models/asset_permission.py:61 rbac/models/role.py:29 #: rbac/serializers/role.py:28 settings/models.py:37 settings/models.py:186 #: settings/serializers/msg.py:89 settings/serializers/terminal.py:9 -#: terminal/models/applet/applet.py:34 terminal/models/component/endpoint.py:13 -#: terminal/models/component/endpoint.py:112 -#: terminal/models/component/storage.py:26 terminal/models/component/task.py:13 +#: terminal/models/applet/applet.py:34 +#: terminal/models/component/endpoint.py:13 +#: terminal/models/component/endpoint.py:106 +#: terminal/models/component/storage.py:26 +#: terminal/models/component/task.py:13 #: terminal/models/component/terminal.py:86 #: terminal/models/virtualapp/provider.py:10 #: terminal/models/virtualapp/virtualapp.py:19 tickets/api/ticket.py:87 @@ -607,30 +586,33 @@ msgstr "金鑰" #: accounts/models/application.py:21 acls/models/base.py:98 #: assets/models/automations/base.py:22 assets/models/cmd_filter.py:38 #: assets/serializers/asset/common.py:148 -#: assets/serializers/asset/common.py:420 perms/serializers/permission.py:66 -#: perms/serializers/user_permission.py:75 rbac/tree.py:35 +#: assets/serializers/asset/common.py:423 perms/serializers/permission.py:66 +#: perms/serializers/user_permission.py:76 rbac/tree.py:35 msgid "Accounts" msgstr "帳號管理" #: accounts/models/application.py:22 authentication/models/access_key.py:20 -#: terminal/models/component/endpoint.py:113 +#: terminal/models/component/endpoint.py:107 msgid "IP group" msgstr "IPグループ" #: accounts/models/application.py:23 #: authentication/backends/passkey/models.py:14 #: authentication/models/access_key.py:24 -#: authentication/models/private_token.py:8 authentication/models/ssh_key.py:20 +#: authentication/models/private_token.py:8 +#: authentication/models/ssh_key.py:20 msgid "Date last used" msgstr "最後使用日期" #: accounts/models/application.py:24 acls/models/base.py:43 -#: assets/models/asset/common.py:178 authentication/models/access_key.py:23 -#: authentication/models/connection_token.py:58 -#: authentication/models/ssh_key.py:13 authentication/serializers/ssh_key.py:23 +#: assets/models/asset/common.py:182 authentication/models/access_key.py:23 +#: authentication/models/connection_token.py:59 +#: authentication/models/ssh_key.py:13 +#: authentication/serializers/ssh_key.py:23 #: authentication/templates/authentication/_access_key_modal.html:32 -#: perms/models/asset_permission.py:82 terminal/models/component/endpoint.py:28 -#: terminal/models/component/endpoint.py:123 +#: perms/models/asset_permission.py:82 +#: terminal/models/component/endpoint.py:29 +#: terminal/models/component/endpoint.py:117 #: terminal/models/session/sharing.py:29 terminal/serializers/terminal.py:44 #: tickets/const.py:36 msgid "Active" @@ -731,8 +713,8 @@ msgstr "更改後檢查連接" #: accounts/models/automations/check_account.py:19 #: accounts/models/automations/gather_account.py:117 #: accounts/serializers/automations/change_secret.py:59 -#: settings/serializers/auth/ldap.py:101 -#: settings/serializers/auth/ldap_ha.py:84 settings/serializers/msg.py:45 +#: settings/serializers/auth/ldap.py:105 +#: settings/serializers/auth/ldap_ha.py:87 settings/serializers/msg.py:45 msgid "Recipient" msgstr "收件人" @@ -742,7 +724,7 @@ msgstr "自動化改密" #: accounts/models/automations/change_secret.py:47 #: assets/models/automations/base.py:145 ops/models/base.py:56 -#: ops/models/celery.py:90 ops/models/job.py:240 +#: ops/models/celery.py:90 ops/models/job.py:242 #: terminal/models/applet/host.py:142 msgid "Date finished" msgstr "結束日期" @@ -753,11 +735,11 @@ msgstr "結束日期" #: accounts/serializers/automations/check_account.py:39 #: assets/models/automations/base.py:137 #: assets/serializers/automations/base.py:45 audits/models.py:209 -#: audits/serializers.py:78 ops/models/base.py:49 ops/models/job.py:231 -#: terminal/models/applet/applet.py:331 terminal/models/applet/host.py:140 +#: audits/serializers.py:77 ops/models/base.py:49 ops/models/job.py:233 +#: terminal/models/applet/applet.py:372 terminal/models/applet/host.py:140 #: terminal/models/component/status.py:30 #: terminal/models/virtualapp/virtualapp.py:99 -#: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:148 +#: terminal/serializers/applet.py:18 terminal/serializers/applet_host.py:163 #: terminal/serializers/virtualapp.py:35 tickets/models/ticket/general.py:284 #: tickets/serializers/super_ticket.py:13 #: tickets/serializers/ticket/ticket.py:20 xpack/plugins/cloud/models.py:227 @@ -766,7 +748,7 @@ msgid "Status" msgstr "狀態" #: accounts/models/automations/change_secret.py:51 -#: accounts/serializers/account/account.py:276 +#: accounts/serializers/account/account.py:278 #: accounts/templates/accounts/change_secret_failed_info.html:13 #: assets/const/automation.py:9 #: authentication/templates/authentication/passkey.html:173 @@ -817,8 +799,6 @@ msgid "New found" msgstr "新發現" #: accounts/models/automations/check_account.py:45 -#, fuzzy -#| msgid "Account delete" msgid "Account deleted" msgstr "帳號已刪除" @@ -867,9 +847,11 @@ msgstr "重複密碼" #: accounts/templates/accounts/gather_account_report.html:118 #: accounts/templates/accounts/push_account_report.html:79 #: accounts/templates/accounts/push_account_report.html:119 -#: acls/serializers/base.py:19 acls/serializers/base.py:50 audits/models.py:189 -#: authentication/forms.py:21 authentication/forms.py:23 +#: acls/serializers/base.py:19 acls/serializers/base.py:50 +#: audits/models.py:189 authentication/forms.py:21 authentication/forms.py:23 #: authentication/models/temp_token.py:9 +#: authentication/serializers/connect_token_secret.py:43 +#: authentication/serializers/connect_token_secret.py:53 #: authentication/templates/authentication/_msg_different_city.html:9 #: authentication/templates/authentication/_msg_oauth_bind.html:9 #: authentication/templates/authentication/login.html:408 @@ -987,11 +969,11 @@ msgid "Verify asset account" msgstr "帳號驗證" #: accounts/models/base.py:37 accounts/models/base.py:66 -#: accounts/serializers/account/account.py:470 +#: accounts/serializers/account/account.py:471 #: accounts/serializers/account/base.py:17 #: accounts/serializers/automations/change_secret.py:48 #: authentication/serializers/connect_token_secret.py:42 -#: authentication/serializers/connect_token_secret.py:51 +#: authentication/serializers/connect_token_secret.py:52 #: terminal/serializers/storage.py:140 msgid "Secret type" msgstr "密文類型" @@ -1008,7 +990,7 @@ msgstr "密碼規則" #: accounts/models/base.py:69 assets/models/automations/base.py:28 #: assets/models/cmd_filter.py:39 assets/models/label.py:22 -#: authentication/serializers/connect_token_secret.py:117 +#: authentication/serializers/connect_token_secret.py:119 #: terminal/models/applet/applet.py:41 #: terminal/models/virtualapp/virtualapp.py:23 users/serializers/user.py:257 msgid "Is active" @@ -1066,8 +1048,7 @@ msgstr "登錄資產時,帳號使用者名稱與使用者使用者名稱相同 msgid "" "Connect asset without using a username and password, and it only supports " "web-based and custom-type assets" -msgstr "" -"連接資產時不使用使用者名稱和密碼的帳號,僅支持 web類型 和 自訂類型 的資產" +msgstr "連接資產時不使用使用者名稱和密碼的帳號,僅支持 web類型 和 自訂類型 的資產" #: accounts/notifications.py:12 accounts/notifications.py:37 msgid "Notification of account backup route task results" @@ -1084,9 +1065,7 @@ msgid "" "{} - The account backup passage task has been completed: the encryption " "password has not been set - please go to personal information -> Basic file " "encryption password for preference settings" -msgstr "" -"{} - 帳號備份任務已完成: 未設置加密密碼 - 請前往個人資訊 -> 偏好設置的基本中" -"設置文件加密密碼" +msgstr "{} - 帳號備份任務已完成: 未設置加密密碼 - 請前往個人資訊 -> 偏好設置的基本中設置文件加密密碼" #: accounts/notifications.py:56 msgid "Notification of implementation result of encryption change plan" @@ -1103,9 +1082,7 @@ msgid "" "{} - The encryption change task has been completed: the encryption password " "has not been set - please go to personal information -> set encryption " "password in preferences" -msgstr "" -"{} - 改密任務已完成: 未設置加密密碼 - 請前往個人資訊 -> 偏好設置中設置加密密" -"碼" +msgstr "{} - 改密任務已完成: 未設置加密密碼 - 請前往個人資訊 -> 偏好設置中設置加密密碼" #: accounts/notifications.py:83 msgid "Gather account change information" @@ -1123,7 +1100,7 @@ msgstr "忽略" msgid "Reopen" msgstr "重新打開" -#: accounts/risk_handlers.py:19 audits/const.py:38 +#: accounts/risk_handlers.py:19 audits/const.py:39 #: authentication/templates/authentication/_access_key_modal.html:155 #: authentication/templates/authentication/_mfa_confirm_modal.html:53 #: templates/_modal.html:22 tickets/const.py:43 @@ -1151,15 +1128,13 @@ msgstr "新增帳號" msgid "Change password and Add" msgstr "改密並添加" -#: accounts/risk_handlers.py:26 audits/const.py:31 ops/const.py:9 +#: accounts/risk_handlers.py:26 audits/const.py:32 ops/const.py:9 msgid "Change password" msgstr "改密" #: accounts/risk_handlers.py:127 -#, fuzzy -#| msgid "Test connection failed: {}" msgid "Execution failed: {}" -msgstr "測試連接失敗:{}" +msgstr "執行失敗:{}" #: accounts/serializers/account/account.py:31 msgid "Push now" @@ -1176,7 +1151,7 @@ msgstr "帳號存在策略" #: accounts/serializers/account/account.py:206 assets/models/label.py:21 #: assets/models/platform.py:95 assets/serializers/asset/common.py:145 #: assets/serializers/cagegory.py:12 assets/serializers/platform.py:173 -#: assets/serializers/platform.py:279 perms/serializers/user_permission.py:26 +#: assets/serializers/platform.py:284 perms/serializers/user_permission.py:26 #: settings/models.py:39 tickets/models/ticket/apply_application.py:13 #: users/models/preference.py:12 msgid "Category" @@ -1187,11 +1162,11 @@ msgstr "類別" #: assets/models/automations/base.py:146 assets/models/cmd_filter.py:74 #: assets/models/platform.py:96 assets/serializers/asset/common.py:146 #: assets/serializers/platform.py:160 assets/serializers/platform.py:172 -#: audits/serializers.py:77 audits/serializers.py:194 -#: authentication/models/connection_token.py:62 -#: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:153 -#: perms/serializers/user_permission.py:27 terminal/models/applet/applet.py:40 -#: terminal/models/component/storage.py:58 +#: audits/serializers.py:76 audits/serializers.py:196 +#: authentication/models/connection_token.py:63 +#: authentication/serializers/connect_token_secret.py:128 +#: ops/models/job.py:155 perms/serializers/user_permission.py:27 +#: terminal/models/applet/applet.py:40 terminal/models/component/storage.py:58 #: terminal/models/component/storage.py:152 terminal/serializers/applet.py:29 #: terminal/serializers/session.py:25 terminal/serializers/storage.py:281 #: terminal/serializers/storage.py:294 tickets/models/comment.py:26 @@ -1201,66 +1176,73 @@ msgstr "類別" msgid "Type" msgstr "類型" -#: accounts/serializers/account/account.py:222 +#: accounts/serializers/account/account.py:223 msgid "Asset not found" msgstr "資產不存在" -#: accounts/serializers/account/account.py:265 +#: accounts/serializers/account/account.py:236 assets/const/category.py:15 +#: assets/models/asset/common.py:180 assets/models/asset/ds.py:14 +#: assets/serializers/asset/common.py:180 +msgid "Directory service" +msgstr "目錄服務" + +#: accounts/serializers/account/account.py:267 msgid "Has secret" msgstr "已託管密碼" -#: accounts/serializers/account/account.py:275 ops/models/celery.py:84 +#: accounts/serializers/account/account.py:277 ops/models/celery.py:84 #: tickets/models/comment.py:13 tickets/models/ticket/general.py:49 #: tickets/models/ticket/general.py:280 tickets/serializers/super_ticket.py:14 msgid "State" msgstr "狀態" -#: accounts/serializers/account/account.py:277 +#: accounts/serializers/account/account.py:279 msgid "Changed" msgstr "已修改" -#: accounts/serializers/account/account.py:287 acls/models/base.py:97 +#: accounts/serializers/account/account.py:289 acls/models/base.py:97 #: acls/templates/acls/asset_login_reminder.html:9 #: assets/models/automations/base.py:25 -#: assets/serializers/automations/base.py:20 assets/serializers/domain.py:34 +#: assets/serializers/automations/base.py:20 assets/serializers/domain.py:33 #: assets/serializers/platform.py:181 assets/serializers/platform.py:213 -#: authentication/api/connection_token.py:463 ops/models/base.py:17 -#: ops/models/job.py:155 ops/serializers/job.py:21 +#: authentication/api/connection_token.py:462 ops/models/base.py:17 +#: ops/models/job.py:157 ops/serializers/job.py:21 #: perms/serializers/permission.py:57 #: terminal/templates/terminal/_msg_command_execute_alert.html:16 #: xpack/plugins/cloud/manager.py:93 msgid "Assets" msgstr "資產" -#: accounts/serializers/account/account.py:392 +#: accounts/serializers/account/account.py:394 #, python-format msgid "Asset does not support this secret type: %s" msgstr "資產不支持帳號類型: %s" -#: accounts/serializers/account/account.py:424 +#: accounts/serializers/account/account.py:426 msgid "Account has exist" msgstr "帳號已存在" -#: accounts/serializers/account/account.py:461 +#: accounts/serializers/account/account.py:463 #: accounts/serializers/account/base.py:86 #: accounts/serializers/account/template.py:66 -#: assets/serializers/asset/common.py:421 +#: assets/serializers/asset/common.py:424 msgid "Spec info" msgstr "特殊資訊" -#: accounts/serializers/account/account.py:471 -#: authentication/serializers/connect_token_secret.py:160 +#: accounts/serializers/account/account.py:472 +#: authentication/serializers/connect_token_secret.py:162 #: authentication/templates/authentication/_access_key_modal.html:30 #: perms/models/perm_node.py:21 users/serializers/group.py:33 msgid "ID" msgstr "ID" -#: accounts/serializers/account/account.py:481 acls/serializers/base.py:123 +#: accounts/serializers/account/account.py:482 acls/serializers/base.py:123 #: acls/templates/acls/asset_login_reminder.html:8 #: acls/templates/acls/user_login_reminder.html:8 -#: assets/models/cmd_filter.py:24 assets/models/label.py:16 audits/models.py:55 -#: audits/models.py:91 audits/models.py:173 audits/models.py:272 -#: audits/serializers.py:195 authentication/models/connection_token.py:36 +#: assets/models/cmd_filter.py:24 assets/models/label.py:16 +#: audits/models.py:55 audits/models.py:91 audits/models.py:173 +#: audits/models.py:272 audits/serializers.py:197 +#: authentication/models/connection_token.py:37 #: authentication/models/ssh_key.py:22 authentication/models/sso_token.py:16 #: notifications/models/notification.py:12 #: perms/api/user_permission/mixin.py:58 perms/models/asset_permission.py:63 @@ -1277,7 +1259,7 @@ msgstr "ID" msgid "User" msgstr "用戶" -#: accounts/serializers/account/account.py:482 +#: accounts/serializers/account/account.py:483 #: authentication/templates/authentication/_access_key_modal.html:33 #: terminal/notifications.py:159 terminal/notifications.py:219 msgid "Date" @@ -1291,23 +1273,21 @@ msgstr "密鑰密碼" msgid "" "* If no username is required for authentication, enter null. For AD " "accounts, use the format username@domain." -msgstr "" -"提示:如果認證時不需要使用者名稱,可填寫為 null,如果是 AD 帳號,格式為 " -"username@domain" +msgstr "提示:如果認證時不需要使用者名稱,可填寫為 null,如果是 AD 帳號,格式為 username@domain" -#: accounts/serializers/account/service.py:13 +#: accounts/serializers/account/service.py:14 #: authentication/serializers/token.py:22 msgid "Access IP" msgstr "IP 白名單" -#: accounts/serializers/account/service.py:26 +#: accounts/serializers/account/service.py:27 #: accounts/serializers/account/virtual.py:19 assets/models/cmd_filter.py:40 -#: assets/models/cmd_filter.py:88 common/db/models.py:36 ops/models/adhoc.py:25 -#: ops/models/job.py:163 ops/models/playbook.py:31 rbac/models/role.py:37 -#: settings/models.py:42 terminal/models/applet/applet.py:46 -#: terminal/models/applet/applet.py:332 terminal/models/applet/host.py:143 -#: terminal/models/component/endpoint.py:27 -#: terminal/models/component/endpoint.py:122 +#: assets/models/cmd_filter.py:88 common/db/models.py:36 +#: ops/models/adhoc.py:25 ops/models/job.py:165 ops/models/playbook.py:31 +#: rbac/models/role.py:37 settings/models.py:42 +#: terminal/models/applet/applet.py:46 terminal/models/applet/applet.py:373 +#: terminal/models/applet/host.py:143 terminal/models/component/endpoint.py:28 +#: terminal/models/component/endpoint.py:116 #: terminal/models/session/session.py:49 #: terminal/models/virtualapp/virtualapp.py:28 tickets/models/comment.py:32 #: tickets/models/ticket/general.py:298 users/models/user/__init__.py:94 @@ -1315,9 +1295,9 @@ msgstr "IP 白名單" msgid "Comment" msgstr "備註" -#: accounts/serializers/account/service.py:28 +#: accounts/serializers/account/service.py:29 #: accounts/templates/accounts/backup_account_report.html:33 -#: assets/serializers/asset/common.py:151 +#: assets/serializers/asset/common.py:152 msgid "Accounts amount" msgstr "帳號數量" @@ -1352,20 +1332,16 @@ msgid "" "length is the length of the password, and the range is 8 to 30.\n" "lowercase indicates whether the password contains lowercase letters, \n" "uppercase indicates whether it contains uppercase letters,\n" -"digit indicates whether it contains numbers, and symbol indicates whether it " -"contains special symbols.\n" -"exclude_symbols is used to exclude specific symbols. You can fill in the " -"symbol characters to be excluded (up to 16). \n" +"digit indicates whether it contains numbers, and symbol indicates whether it contains special symbols.\n" +"exclude_symbols is used to exclude specific symbols. You can fill in the symbol characters to be excluded (up to 16). \n" "If you do not need to exclude symbols, you can leave it blank.\n" -"default: {\"length\": 16, \"lowercase\": true, \"uppercase\": true, " -"\"digit\": true, \"symbol\": true, \"exclude_symbols\": \"\"}" +"default: {\"length\": 16, \"lowercase\": true, \"uppercase\": true, \"digit\": true, \"symbol\": true, \"exclude_symbols\": \"\"}" msgstr "" -"length 是密碼的長度,填入範圍為 8 到 30。lowercase 表示密碼中是否包含小寫字" -"母,uppercase 表示是否包含大寫字母,digit 表示是否包含數字,symbol 表示是否包" -"含特殊符號。exclude_symbols 用於排除特定符號,您可以填寫要排除的符號字元(最" -"多 16 個),如果無需排除符號,可以留空。預設: {\"length\": 16, " -"\"lowercase\": true, \"uppercase\": true, \"digit\": true, \"symbol\": true, " -"\"exclude_symbols\": \"\"}" +"length 是密碼的長度,填入範圍為 8 到 30。lowercase 表示密碼中是否包含小寫字母,uppercase " +"表示是否包含大寫字母,digit 表示是否包含數字,symbol 表示是否包含特殊符號。exclude_symbols " +"用於排除特定符號,您可以填寫要排除的符號字元(最多 16 個),如果無需排除符號,可以留空。預設: {\"length\": 16, " +"\"lowercase\": true, \"uppercase\": true, \"digit\": true, \"symbol\": true," +" \"exclude_symbols\": \"\"}" #: accounts/serializers/account/template.py:47 msgid "Secret generation strategy for account creation" @@ -1387,9 +1363,8 @@ msgid "" "asset secret > Login secret > Manual input.
For security, please set " "config CACHE_LOGIN_PASSWORD_ENABLED to true" msgstr "" -"當前僅支持 AD/LDAP 登錄方式用戶。 同名帳號密碼生效順序: 資產上存在的同名帳號" -"密碼 > 登錄密碼 > 手動輸入
為了安全起見,請設置配置項 " -"CACHE_LOGIN_PASSWORD_ENABLED=true,重啟服務才能開啟" +"當前僅支持 AD/LDAP 登錄方式用戶。 同名帳號密碼生效順序: 資產上存在的同名帳號密碼 > 登錄密碼 > 手動輸入
" +"為了安全起見,請設置配置項 CACHE_LOGIN_PASSWORD_ENABLED=true,重啟服務才能開啟" #: accounts/serializers/automations/backup.py:18 msgid "Zip Encrypt Password" @@ -1481,15 +1456,10 @@ msgstr "帳號執行自動化" #: accounts/tasks/automation.py:35 msgid "" -"Unified execution entry for account automation tasks: when the system " -"performs tasks \n" -" such as account push, password change, account verification, account " -"collection, \n" -" and gateway account verification, all tasks are executed through " -"this unified entry" -msgstr "" -"帳號自動化任務統一執行入口,當系統執行帳號推送、更改密碼、驗證帳號、收集帳號" -"以及驗證網關帳號任務時,統一通過當前任務執行" +"Unified execution entry for account automation tasks: when the system performs tasks \n" +" such as account push, password change, account verification, account collection, \n" +" and gateway account verification, all tasks are executed through this unified entry" +msgstr "帳號自動化任務統一執行入口,當系統執行帳號推送、更改密碼、驗證帳號、收集帳號以及驗證網關帳號任務時,統一通過當前任務執行" #: accounts/tasks/automation.py:64 accounts/tasks/automation.py:72 msgid "Execute automation record" @@ -1505,28 +1475,18 @@ msgstr "週期清理改密記錄和推送記錄" #: accounts/tasks/automation.py:98 msgid "" -"The system will periodically clean up unnecessary password change and push " -"records, \n" -" including their associated change tasks, execution logs, assets, and " -"accounts. When any \n" -" of these associated items are deleted, the corresponding password " -"change and push records \n" -" become invalid. Therefore, to maintain a clean and efficient " -"database, the system will \n" -" clean up expired records at 2 a.m daily, based on the interval " -"specified by \n" -" PERM_EXPIRED_CHECK_PERIODIC in the config.txt configuration file. " -"This periodic cleanup \n" -" mechanism helps free up storage space and enhances the security and " -"overall performance \n" +"The system will periodically clean up unnecessary password change and push records, \n" +" including their associated change tasks, execution logs, assets, and accounts. When any \n" +" of these associated items are deleted, the corresponding password change and push records \n" +" become invalid. Therefore, to maintain a clean and efficient database, the system will \n" +" clean up expired records at 2 a.m daily, based on the interval specified by \n" +" PERM_EXPIRED_CHECK_PERIODIC in the config.txt configuration file. This periodic cleanup \n" +" mechanism helps free up storage space and enhances the security and overall performance \n" " of data management" msgstr "" -"系統會定期清理不再需要的改密記錄和推送記錄,包括那些關聯的改密任務、執行記" -"錄、資產和帳號。當這些關聯項中的任意一個被刪除時,對應的改密和推送記錄將變為" -"無效。因此,為了保持資料庫的整潔和高效運行,根據系統配置文件 config.txt 中 " -"PERM_EXPIRED_CHECK_PERIODIC 的時間間隔,對於超出時間的記錄,於每天凌晨2點進行" -"清理。這種定期清理機制不僅有助於釋放儲存空間,還能提高資料管理的安全性和整體" -"性能" +"系統會定期清理不再需要的改密記錄和推送記錄,包括那些關聯的改密任務、執行記錄、資產和帳號。當這些關聯項中的任意一個被刪除時,對應的改密和推送記錄將變為無效。因此,為了保持資料庫的整潔和高效運行,根據系統配置文件" +" config.txt 中 PERM_EXPIRED_CHECK_PERIODIC " +"的時間間隔,對於超出時間的記錄,於每天凌晨2點進行清理。這種定期清理機制不僅有助於釋放儲存空間,還能提高資料管理的安全性和整體性能" #: accounts/tasks/push_account.py:16 accounts/tasks/push_account.py:27 msgid "Push accounts to assets" @@ -1540,8 +1500,7 @@ msgstr "當創建帳號或修改帳號時,需要帳號推送時執行該任務 #: accounts/tasks/remove_account.py:28 msgid "" -"When clicking \"Sync deletion\" in 'Console - Gather Account - Gathered " -"accounts' this \n" +"When clicking \"Sync deletion\" in 'Console - Gather Account - Gathered accounts' this \n" " task will be executed" msgstr "在控制台-收集帳號-收集的帳號中單擊同步刪除時,將執行此任務" @@ -1551,16 +1510,12 @@ msgstr "清理歷史帳號" #: accounts/tasks/remove_account.py:52 msgid "" -"Each time an asset account is updated, a historical account is generated, so " -"it is \n" -" necessary to clean up the asset account history. The system will " -"clean up excess account \n" -" records at 2 a.m. daily based on the configuration in the \"System " -"settings - Features - \n" +"Each time an asset account is updated, a historical account is generated, so it is \n" +" necessary to clean up the asset account history. The system will clean up excess account \n" +" records at 2 a.m. daily based on the configuration in the \"System settings - Features - \n" " Account storage - Record limit" msgstr "" -"由於每次更新資產帳號,均會生成歷史帳號,因此需要清理資產帳號的歷史。系統會根" -"據帳號存儲-記錄限制的配置,每天凌晨2點對於超出的數量的帳號記錄進行清理" +"由於每次更新資產帳號,均會生成歷史帳號,因此需要清理資產帳號的歷史。系統會根據帳號存儲-記錄限制的配置,每天凌晨2點對於超出的數量的帳號記錄進行清理" #: accounts/tasks/remove_account.py:89 msgid "Remove historical accounts that are out of range." @@ -1572,8 +1527,7 @@ msgstr "同步資訊到關聯的帳號" #: accounts/tasks/template.py:14 msgid "" -"When clicking 'Sync new secret to accounts' in 'Console - Account - " -"Templates - \n" +"When clicking 'Sync new secret to accounts' in 'Console - Account - Templates - \n" " Accounts' this task will be executed" msgstr "當在控制台-帳號模板-帳號-同步更新帳號信息點擊同步時,執行該任務" @@ -1629,7 +1583,7 @@ msgstr "任務名稱" #: accounts/templates/accounts/gather_account_report.html:21 #: accounts/templates/accounts/push_account_report.html:22 #: assets/models/automations/base.py:143 audits/models.py:66 -#: ops/models/base.py:55 ops/models/celery.py:89 ops/models/job.py:239 +#: ops/models/base.py:55 ops/models/celery.py:89 ops/models/job.py:241 #: ops/templates/ops/celery_task_log.html:101 #: perms/models/asset_permission.py:78 settings/serializers/feature.py:27 #: settings/templates/ldap/_msg_import_ldap_user.html:5 @@ -1679,7 +1633,7 @@ msgstr "你好! 以下是資產改密或推送帳戶失敗的情況。 請及 #: accounts/templates/accounts/change_secret_report.html:33 #: accounts/templates/accounts/gather_account_report.html:31 #: accounts/templates/accounts/push_account_report.html:32 -#: assets/serializers/domain.py:24 assets/serializers/platform.py:182 +#: assets/serializers/domain.py:23 assets/serializers/platform.py:182 #: orgs/serializers.py:13 perms/serializers/permission.py:61 msgid "Assets amount" msgstr "資產數量" @@ -1718,7 +1672,6 @@ msgstr "否" #: accounts/templates/accounts/change_secret_report.html:94 #: accounts/templates/accounts/change_secret_report.html:134 #: accounts/templates/accounts/gather_account_report.html:92 -#: accounts/templates/accounts/gather_account_report.html:132 #: accounts/templates/accounts/push_account_report.html:93 #: accounts/templates/accounts/push_account_report.html:133 msgid "No new accounts found" @@ -1747,10 +1700,14 @@ msgstr "新發現的帳戶" msgid "Lost accounts" msgstr "遺失的帳號" +#: accounts/templates/accounts/gather_account_report.html:132 +msgid "No lost accounts found" +msgstr "未找到丟失的帳號" + #: accounts/utils.py:54 msgid "" -"If the password starts with {{` and ends with }} `, then the password is not " -"allowed." +"If the password starts with {{` and ends with }} `, then the password is not" +" allowed." msgstr "如果密碼以 `{{` 開始,並且以 `}}` 結束,則該密碼是不允許的。" #: accounts/utils.py:62 @@ -1761,16 +1718,16 @@ msgstr "金鑰不合法或金鑰密碼錯誤" msgid "App Acls" msgstr "存取控制" -#: acls/const.py:6 audits/const.py:36 terminal/const.py:11 tickets/const.py:44 +#: acls/const.py:6 audits/const.py:37 terminal/const.py:11 tickets/const.py:44 #: tickets/templates/tickets/approve_check_password.html:47 msgid "Reject" msgstr "拒絕" -#: acls/const.py:7 audits/const.py:33 terminal/const.py:9 +#: acls/const.py:7 audits/const.py:34 terminal/const.py:9 msgid "Accept" msgstr "接受" -#: acls/const.py:8 audits/const.py:34 +#: acls/const.py:8 audits/const.py:35 msgid "Review" msgstr "審批" @@ -1783,7 +1740,7 @@ msgid "Notify" msgstr "通知" #: acls/const.py:11 -msgid "Notify and warn" +msgid "Prompt and warn" msgstr "提示並警告" #: acls/const.py:12 @@ -1795,18 +1752,19 @@ msgid "Face Online" msgstr "人臉在線" #: acls/models/base.py:37 assets/models/cmd_filter.py:76 -#: terminal/models/component/endpoint.py:115 xpack/plugins/cloud/models.py:316 +#: terminal/models/component/endpoint.py:109 xpack/plugins/cloud/models.py:316 msgid "Priority" msgstr "優先度" #: acls/models/base.py:38 assets/models/cmd_filter.py:76 -#: terminal/models/component/endpoint.py:116 xpack/plugins/cloud/models.py:317 +#: terminal/models/component/endpoint.py:110 xpack/plugins/cloud/models.py:317 msgid "1-100, the lower the value will be match first" msgstr "優先度可選範圍為 1-100 (數值越小越優先)" #: acls/models/base.py:41 acls/serializers/base.py:57 -#: assets/models/cmd_filter.py:81 audits/models.py:93 audits/serializers.py:108 -#: authentication/serializers/connect_token_secret.py:119 +#: assets/models/cmd_filter.py:81 audits/models.py:93 +#: audits/serializers.py:107 +#: authentication/serializers/connect_token_secret.py:121 #: authentication/templates/authentication/_access_key_modal.html:34 #: perms/serializers/permission.py:63 perms/serializers/permission.py:85 #: tickets/serializers/ticket/ticket.py:21 @@ -1814,7 +1772,7 @@ msgid "Action" msgstr "動作" #: acls/models/base.py:42 assets/models/cmd_filter.py:86 -#: authentication/serializers/connect_token_secret.py:91 +#: authentication/serializers/connect_token_secret.py:93 msgid "Reviewers" msgstr "審批人" @@ -1825,7 +1783,7 @@ msgid "Users" msgstr "用戶管理" #: acls/models/command_acl.py:16 assets/models/cmd_filter.py:60 -#: audits/serializers.py:38 ops/serializers/job.py:92 terminal/const.py:88 +#: ops/serializers/job.py:92 terminal/const.py:88 #: terminal/models/session/session.py:45 terminal/serializers/command.py:18 #: terminal/templates/terminal/_msg_command_alert.html:12 #: terminal/templates/terminal/_msg_command_execute_alert.html:10 @@ -1854,7 +1812,7 @@ msgstr "忽略大小寫" #: acls/models/command_acl.py:33 acls/models/command_acl.py:97 #: acls/serializers/command_acl.py:29 -#: authentication/serializers/connect_token_secret.py:88 +#: authentication/serializers/connect_token_secret.py:90 #: terminal/templates/terminal/_msg_command_warning.html:14 msgid "Command group" msgstr "命令組" @@ -1919,8 +1877,8 @@ msgid "" "10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64 (Domain name " "support)" msgstr "" -"* 表示匹配所有。例如: 192.168.10.1, 192.168.1.0/24, 10.1.1.1-10.1.1.20, 2001:" -"db8:2de::e13, 2001:db8:1a:1110::/64 (支持網域)" +"* 表示匹配所有。例如: 192.168.10.1, 192.168.1.0/24, 10.1.1.1-10.1.1.20, " +"2001:db8:2de::e13, 2001:db8:1a:1110::/64 (支持網域)" #: acls/serializers/base.py:41 assets/serializers/asset/host.py:19 msgid "IP/Host" @@ -1948,14 +1906,14 @@ msgid "" "With * indicating a match all. Such as: 192.168.10.1, 192.168.1.0/24, " "10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64 " msgstr "" -"* 表示匹配所有。例如: 192.168.10.1, 192.168.1.0/24, 10.1.1.1-10.1.1.20, 2001:" -"db8:2de::e13, 2001:db8:1a:1110::/64" +"* 表示匹配所有。例如: 192.168.10.1, 192.168.1.0/24, 10.1.1.1-10.1.1.20, " +"2001:db8:2de::e13, 2001:db8:1a:1110::/64" #: acls/serializers/rules/rules.py:33 #: authentication/templates/authentication/_msg_oauth_bind.html:12 #: authentication/templates/authentication/_msg_rest_password_success.html:8 #: authentication/templates/authentication/_msg_rest_public_key_success.html:8 -#: common/drf/renders/base.py:150 xpack/plugins/cloud/models.py:393 +#: common/drf/renders/base.py:152 xpack/plugins/cloud/models.py:393 msgid "IP" msgstr "IP" @@ -1988,9 +1946,7 @@ msgid "" "Please review the login activity to ensure the security and proper usage of " "the asset. If you did not authorize this login or if you notice any " "suspicious activity, please take the necessary actions immediately." -msgstr "" -"請您稽核此登入行為,以確保資產的安全和正確使用。如果您未授權此次登入或發現任" -"何可疑行為,請立即採取必要的行動。" +msgstr "請您稽核此登入行為,以確保資產的安全和正確使用。如果您未授權此次登入或發現任何可疑行為,請立即採取必要的行動。" #: acls/templates/acls/asset_login_reminder.html:16 #: acls/templates/acls/user_login_reminder.html:16 @@ -2013,15 +1969,15 @@ msgid "Login city" msgstr "登錄城市" #: acls/templates/acls/user_login_reminder.html:11 audits/models.py:198 -#: audits/models.py:267 audits/serializers.py:92 +#: audits/models.py:267 audits/serializers.py:91 msgid "User agent" msgstr "用戶代理" -#: assets/api/asset/asset.py:194 +#: assets/api/asset/asset.py:153 msgid "Cannot create asset directly, you should create a host or other" msgstr "不能直接創建資產, 你應該創建主機或其他資產" -#: assets/api/asset/asset.py:198 +#: assets/api/asset/asset.py:157 msgid "The number of assets exceeds the limit of 5000" msgstr "資產數量超過 5000 的限制" @@ -2053,34 +2009,34 @@ msgstr "資產管理" msgid "Task: {} finished" msgstr "任務:{} 完成" -#: assets/automations/base/manager.py:338 +#: assets/automations/base/manager.py:339 msgid " - Platform {} ansible disabled" msgstr " - 平台 {} Ansible 已禁用, 無法執行任務" -#: assets/automations/base/manager.py:524 +#: assets/automations/base/manager.py:525 msgid ">>> Task preparation phase" msgstr ">>> 任務準備階段" -#: assets/automations/base/manager.py:528 +#: assets/automations/base/manager.py:529 #, python-brace-format msgid ">>> Executing tasks in batches, total {runner_count}" msgstr ">>> 分次執行任務,總共 {runner_count}" -#: assets/automations/base/manager.py:533 +#: assets/automations/base/manager.py:534 msgid ">>> Start executing tasks" msgstr ">>> 開始執行任務" -#: assets/automations/base/manager.py:535 +#: assets/automations/base/manager.py:536 msgid ">>> No tasks need to be executed" msgstr ">>> 沒有需要執行的任務" -#: assets/automations/base/manager.py:539 +#: assets/automations/base/manager.py:540 #, python-brace-format msgid ">>> Begin executing batch {index} of tasks" msgstr ">>> 開始執行第 {index} 批任務" #: assets/automations/ping_gateway/manager.py:33 -#: authentication/models/connection_token.py:145 +#: authentication/models/connection_token.py:176 msgid "No account" msgstr "沒有帳號" @@ -2107,7 +2063,7 @@ msgstr "連接失敗" msgid ">>> Start executing the task to test gateway connectivity" msgstr ">>> 開始執行測試網關可連接性任務" -#: assets/const/automation.py:6 audits/const.py:6 audits/const.py:47 +#: assets/const/automation.py:6 audits/const.py:6 audits/const.py:48 #: audits/signal_handlers/activity_log.py:63 common/utils/ip/geoip/utils.py:31 #: common/utils/ip/geoip/utils.py:37 common/utils/ip/utils.py:104 msgid "Unknown" @@ -2133,7 +2089,7 @@ msgstr "測試網關" msgid "Gather facts" msgstr "收集資產資訊" -#: assets/const/base.py:32 audits/const.py:58 +#: assets/const/base.py:32 audits/const.py:59 #: terminal/serializers/applet_host.py:32 users/models/user/_auth.py:31 msgid "Disabled" msgstr "禁用" @@ -2167,12 +2123,12 @@ msgid "Cloud service" msgstr "雲服務" #: assets/const/category.py:14 assets/models/asset/gpt.py:11 -#: assets/models/asset/web.py:16 audits/const.py:45 +#: assets/models/asset/web.py:16 audits/const.py:46 #: terminal/models/applet/applet.py:28 users/const.py:76 msgid "Web" msgstr "Web" -#: assets/const/category.py:15 common/sdk/sms/endpoint.py:20 +#: assets/const/category.py:16 common/sdk/sms/endpoint.py:20 msgid "Custom type" msgstr "自訂" @@ -2208,8 +2164,8 @@ msgstr "" msgid "TP-Link" msgstr "" -#: assets/const/device.py:12 terminal/models/applet/applet.py:27 -#: tickets/const.py:9 +#: assets/const/device.py:12 assets/const/ds.py:7 +#: terminal/models/applet/applet.py:27 tickets/const.py:9 msgid "General" msgstr "一般" @@ -2225,6 +2181,10 @@ msgstr "路由器" msgid "Firewall" msgstr "防火牆" +#: assets/const/ds.py:10 +msgid "Windows Active Directory" +msgstr "" + #: assets/const/gpt.py:7 msgid "ChatGPT" msgstr "ChatGPT" @@ -2245,8 +2205,8 @@ msgstr "舊的 SSH 版本,例如 openssh 5.x 或 6.x" #: assets/const/protocol.py:53 msgid "Netcat help text" msgstr "" -"使用 netcat (nc) 作為代理工具,將連線從代理伺服器轉送到目標主機。適用於不支" -"援 SSH 原生代理選項 (-W) 的環境,或需要更多靈活性和逾時控制的場景。" +"使用 netcat (nc) 作為代理工具,將連線從代理伺服器轉送到目標主機。適用於不支援 SSH 原生代理選項 (-W) " +"的環境,或需要更多靈活性和逾時控制的場景。" #: assets/const/protocol.py:64 msgid "SFTP root" @@ -2259,8 +2219,7 @@ msgid "" "account username
- ${HOME} The home directory of the connected account " "
- ${USER} The username of the user" msgstr "" -"SFTP根目錄,支持變數:
-${ACCOUNT}已連接帳戶使用者名稱
-${HOME}連接帳戶" -"的主目錄
-${USER}用戶的使用者名稱" +"SFTP根目錄,支持變數:
-${ACCOUNT}已連接帳戶使用者名稱
-${HOME}連接帳戶的主目錄
-${USER}用戶的使用者名稱" #: assets/const/protocol.py:81 msgid "Console" @@ -2275,24 +2234,23 @@ msgid "Any" msgstr "任意" #: assets/const/protocol.py:88 rbac/tree.py:62 -#: settings/serializers/security.py:241 +#: settings/serializers/security.py:245 msgid "Security" msgstr "安全" #: assets/const/protocol.py:89 msgid "" -"Security layer to use for the connection:
Any
Automatically select the " -"security mode based on the security protocols supported by both the client " +"Security layer to use for the connection:
Any
Automatically select the" +" security mode based on the security protocols supported by both the client " "and the server
RDP
Legacy RDP encryption. This mode is generally only " "used for older Windows servers or in cases where a standard Windows login " "screen is desired
TLS
RDP authentication and encryption implemented " "via TLS.
NLA
This mode uses TLS encryption and requires the username " "and password to be given in advance" msgstr "" -"連接的安全層:
Any
根據客戶端和伺服器支援的安全協議自動選擇安全模式" -"
RDP
傳統的 RDP 加密模式。通常僅用於較舊的 Windows 伺服器或需要標準 " -"Windows 登入螢幕的情況
TLS
通過 TLS 實現的 RDP 認證和加密
NLA
此" -"模式使用 TLS 加密,並要求提前提供用戶名和密碼
" +"連接的安全層:
Any
根據客戶端和伺服器支援的安全協議自動選擇安全模式
RDP
傳統的 RDP 加密模式。通常僅用於較舊的 " +"Windows 伺服器或需要標準 Windows 登入螢幕的情況
TLS
通過 TLS 實現的 RDP " +"認證和加密
NLA
此模式使用 TLS 加密,並要求提前提供用戶名和密碼
" #: assets/const/protocol.py:106 msgid "AD domain" @@ -2348,7 +2306,7 @@ msgstr "認證資料庫" msgid "The database to authenticate against" msgstr "要進行身份驗證的資料庫" -#: assets/const/protocol.py:232 authentication/models/connection_token.py:47 +#: assets/const/protocol.py:232 authentication/models/connection_token.py:48 msgid "Connect options" msgstr "連接項" @@ -2368,8 +2326,7 @@ msgstr "安全模式" msgid "" "When safe mode is enabled, some operations will be disabled, such as: New " "tab, right click, visit other website, etc." -msgstr "" -"當安全模式啟用時,一些操作將被禁用,例如:新建標籤頁、右鍵、訪問其它網站 等" +msgstr "當安全模式啟用時,一些操作將被禁用,例如:新建標籤頁、右鍵、訪問其它網站 等" #: assets/const/protocol.py:275 assets/models/asset/web.py:9 #: assets/serializers/asset/info/spec.py:16 @@ -2392,7 +2349,7 @@ msgstr "確認按鈕選擇器" msgid "API mode" msgstr "API 模式" -#: assets/const/types.py:249 +#: assets/const/types.py:252 msgid "All types" msgstr "所有類型" @@ -2415,15 +2372,15 @@ msgstr "雲服務" msgid "Port" msgstr "埠" -#: assets/models/asset/common.py:167 assets/serializers/asset/common.py:172 +#: assets/models/asset/common.py:167 assets/serializers/asset/common.py:174 #: settings/serializers/terminal.py:10 msgid "Address" msgstr "地址" -#: assets/models/asset/common.py:169 assets/models/platform.py:149 +#: assets/models/asset/common.py:169 assets/models/platform.py:155 #: assets/serializers/asset/common.py:150 #: authentication/backends/passkey/models.py:12 -#: authentication/serializers/connect_token_secret.py:118 +#: authentication/serializers/connect_token_secret.py:120 #: perms/serializers/user_permission.py:25 xpack/plugins/cloud/models.py:387 msgid "Platform" msgstr "系統平台" @@ -2432,34 +2389,34 @@ msgstr "系統平台" msgid "Zone" msgstr "網域" -#: assets/models/asset/common.py:176 assets/serializers/asset/common.py:174 +#: assets/models/asset/common.py:176 assets/serializers/asset/common.py:176 #: assets/serializers/automations/base.py:21 ops/serializers/job.py:22 #: perms/serializers/permission.py:58 msgid "Nodes" msgstr "節點" -#: assets/models/asset/common.py:179 assets/serializers/asset/common.py:422 +#: assets/models/asset/common.py:183 assets/serializers/asset/common.py:425 #: assets/serializers/asset/host.py:11 msgid "Gathered info" msgstr "收集資產硬體資訊" -#: assets/models/asset/common.py:180 assets/serializers/asset/custom.py:14 +#: assets/models/asset/common.py:184 assets/serializers/asset/custom.py:14 msgid "Custom info" msgstr "自訂屬性" -#: assets/models/asset/common.py:369 +#: assets/models/asset/common.py:431 msgid "Can refresh asset hardware info" msgstr "可以更新資產硬體資訊" -#: assets/models/asset/common.py:370 +#: assets/models/asset/common.py:432 msgid "Can test asset connectivity" msgstr "可以測試資產連接性" -#: assets/models/asset/common.py:371 +#: assets/models/asset/common.py:433 msgid "Can match asset" msgstr "可以匹配資產" -#: assets/models/asset/common.py:372 +#: assets/models/asset/common.py:434 msgid "Can change asset nodes" msgstr "可以修改資產節點" @@ -2487,19 +2444,23 @@ msgstr "忽略證書校驗" msgid "Postgresql SSL mode" msgstr "PostgreSQL SSL 模式" +#: assets/models/asset/ds.py:10 assets/serializers/asset/ds.py:20 +msgid "Domain name" +msgstr "域名稱" + #: assets/models/asset/gpt.py:8 settings/serializers/feature.py:139 #: settings/serializers/feature.py:154 msgid "Proxy" msgstr "代理" #: assets/models/automations/base.py:23 assets/models/cmd_filter.py:32 -#: assets/models/node.py:553 ops/models/job.py:156 +#: assets/models/node.py:553 ops/models/job.py:158 #: perms/models/asset_permission.py:72 tickets/models/ticket/apply_asset.py:15 #: xpack/plugins/cloud/models.py:388 msgid "Node" msgstr "節點" -#: assets/models/automations/base.py:29 ops/models/job.py:234 +#: assets/models/automations/base.py:29 ops/models/job.py:236 #: ops/serializers/job.py:24 settings/serializers/auth/sms.py:108 msgid "Parameters" msgstr "參數" @@ -2519,7 +2480,7 @@ msgstr "資產自動化任務" # msgid "Comment" # msgstr "備註" #: assets/models/automations/base.py:140 assets/models/cmd_filter.py:41 -#: common/db/models.py:34 ops/models/base.py:54 ops/models/job.py:238 +#: common/db/models.py:34 ops/models/base.py:54 ops/models/job.py:240 #: users/models/user/__init__.py:317 msgid "Date created" msgstr "創建日期" @@ -2530,14 +2491,14 @@ msgstr "創建日期" msgid "Trigger mode" msgstr "觸發模式" -#: assets/models/automations/base.py:157 audits/serializers.py:39 -#: ops/models/base.py:52 ops/models/job.py:236 +#: assets/models/automations/base.py:157 audits/serializers.py:38 +#: ops/models/base.py:52 ops/models/job.py:238 #: xpack/plugins/cloud/manager.py:103 msgid "Summary" msgstr "匯總" #: assets/models/automations/base.py:158 ops/models/base.py:51 -#: ops/models/job.py:235 xpack/plugins/cloud/models.py:225 +#: ops/models/job.py:237 xpack/plugins/cloud/models.py:225 msgid "Result" msgstr "結果" @@ -2601,7 +2562,7 @@ msgstr "命令過濾規則" msgid "Favorite asset" msgstr "收藏的資產" -#: assets/models/gateway.py:34 assets/serializers/domain.py:19 +#: assets/models/gateway.py:34 assets/serializers/domain.py:18 msgid "Gateway" msgstr "網關" @@ -2612,8 +2573,8 @@ msgstr "系統" #: assets/models/label.py:19 assets/models/node.py:539 #: assets/serializers/cagegory.py:11 assets/serializers/cagegory.py:18 #: assets/serializers/cagegory.py:24 -#: authentication/models/connection_token.py:33 -#: authentication/serializers/connect_token_secret.py:125 +#: authentication/models/connection_token.py:34 +#: authentication/serializers/connect_token_secret.py:127 #: common/serializers/common.py:86 labels/models.py:12 settings/models.py:38 #: users/models/preference.py:13 msgid "Value" @@ -2622,7 +2583,7 @@ msgstr "值" #: assets/models/label.py:40 assets/serializers/cagegory.py:10 #: assets/serializers/cagegory.py:17 assets/serializers/cagegory.py:23 #: assets/serializers/platform.py:159 -#: authentication/serializers/connect_token_secret.py:124 +#: authentication/serializers/connect_token_secret.py:126 #: common/serializers/common.py:85 labels/serializers.py:45 #: settings/serializers/msg.py:90 xpack/plugins/cloud/models.py:392 msgid "Label" @@ -2688,7 +2649,7 @@ msgstr "開放的" msgid "Setting" msgstr "設置" -#: assets/models/platform.py:38 audits/const.py:59 +#: assets/models/platform.py:38 audits/const.py:60 #: authentication/backends/passkey/models.py:11 settings/models.py:41 #: terminal/serializers/applet_host.py:33 users/models/user/_auth.py:32 msgid "Enabled" @@ -2788,15 +2749,19 @@ msgstr "編碼" msgid "Gateway enabled" msgstr "啟用網域" -#: assets/models/platform.py:106 assets/serializers/platform.py:202 +#: assets/models/platform.py:105 +msgid "DS enabled" +msgstr "目錄服務已啟用" + +#: assets/models/platform.py:107 assets/serializers/platform.py:202 msgid "Su enabled" msgstr "啟用帳號切換" -#: assets/models/platform.py:107 assets/serializers/platform.py:177 +#: assets/models/platform.py:108 assets/serializers/platform.py:177 msgid "Su method" msgstr "帳號切換方式" -#: assets/models/platform.py:108 assets/serializers/platform.py:180 +#: assets/models/platform.py:109 assets/serializers/platform.py:180 msgid "Custom fields" msgstr "自訂屬性" @@ -2823,9 +2788,7 @@ msgstr "協定,格式為 名稱/連接埠" msgid "" "Accounts, format [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", " "\"secret_type\": \"password\"}]" -msgstr "" -"帳號,格式為 [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", " -"\"secret_type\": \"password\"}]" +msgstr "帳號,格式為 [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", \"secret_type\": \"password\"}]" #: assets/serializers/asset/common.py:135 msgid "" @@ -2835,36 +2798,36 @@ msgstr "節點路徑,格式為 [\"/組織/節點名稱\"], 如果節點不存 #: assets/serializers/asset/common.py:147 assets/serializers/platform.py:174 #: authentication/serializers/connect_token_secret.py:30 -#: authentication/serializers/connect_token_secret.py:75 +#: authentication/serializers/connect_token_secret.py:77 #: perms/models/asset_permission.py:76 perms/serializers/permission.py:67 -#: perms/serializers/user_permission.py:74 xpack/plugins/cloud/models.py:390 +#: perms/serializers/user_permission.py:75 xpack/plugins/cloud/models.py:390 #: xpack/plugins/cloud/serializers/task.py:36 msgid "Protocols" msgstr "協議組" #: assets/serializers/asset/common.py:149 -#: assets/serializers/asset/common.py:173 +#: assets/serializers/asset/common.py:175 msgid "Node path" msgstr "節點路徑" -#: assets/serializers/asset/common.py:170 -#: assets/serializers/asset/common.py:423 +#: assets/serializers/asset/common.py:172 +#: assets/serializers/asset/common.py:426 msgid "Auto info" msgstr "自動化資訊" -#: assets/serializers/asset/common.py:268 +#: assets/serializers/asset/common.py:271 msgid "Platform not exist" msgstr "平台不存在" -#: assets/serializers/asset/common.py:304 +#: assets/serializers/asset/common.py:307 msgid "port out of range (0-65535)" msgstr "埠超出範圍 (0-65535)" -#: assets/serializers/asset/common.py:311 +#: assets/serializers/asset/common.py:314 msgid "Protocol is required: {}" msgstr "協議是必填的: {}" -#: assets/serializers/asset/common.py:350 +#: assets/serializers/asset/common.py:353 msgid "Invalid data" msgstr "無效的數據" @@ -2875,27 +2838,32 @@ msgstr "默認資料庫" #: assets/serializers/asset/database.py:23 msgid "CA cert help text" msgstr "" -"Common Name (CN) 字段已被棄用,請根據 RFC 5280 使用 Subject Alternative Name " -"(SAN) 字段來驗證網域名,以提高安全性。" +"Common Name (CN) 字段已被棄用,請根據 RFC 5280 使用 Subject Alternative Name (SAN) " +"字段來驗證網域名,以提高安全性。" #: assets/serializers/asset/database.py:24 msgid "Postgresql ssl model help text" msgstr "" "Prefer:我不在乎是否加密,但如果伺服器支持加密,我願意支付加密的費用。\n" -"Require:我希望我的資料被加密,我可以承擔那個費用。我相信網路將確保我始終連接" -"到我想要的伺服器。\n" -"Verify CA:我希望我的資料被加密,我可以承擔那個費用。我想要確認我連接到我信任" -"的伺服器。\n" -"Verify Full:我希望我的資料被加密,我接受負擔。我想確保我連接到我信任的伺服" -"器,並且它是我指定的伺服器。" +"Require:我希望我的資料被加密,我可以承擔那個費用。我相信網路將確保我始終連接到我想要的伺服器。\n" +"Verify CA:我希望我的資料被加密,我可以承擔那個費用。我想要確認我連接到我信任的伺服器。\n" +"Verify Full:我希望我的資料被加密,我接受負擔。我想確保我連接到我信任的伺服器,並且它是我指定的伺服器。" + +#: assets/serializers/asset/ds.py:18 +msgid "" +"The domain part used by the directory service (e.g., AD) and appended to the" +" username during login, such as example.com in user@example.com." +msgstr "" +"域名(Domain Name)用於目錄服務(如 AD)登錄時附加在用戶名後的域名部分,例如 user@example.com 中的 example.com \n" +"模塊 {} 不適用於此資產 \n" +"執行手動或定時雲同步任務時執行此任務 \n" +"每天系統會根據「系統設定-任務-定期清理-雲同步任務歷史記錄保留天數」中的配置,清理雲同步執行過程中產生的記錄。" #: assets/serializers/asset/gpt.py:20 msgid "" -"If the server cannot directly connect to the API address, you need set up an " -"HTTP proxy. e.g. http(s)://host:port" -msgstr "" -"如果伺服器不能直接訪問 api 地址,你需要設置一個 HTTP 代理。例如 http(s)://" -"host:port" +"If the server cannot directly connect to the API address, you need set up an" +" HTTP proxy. e.g. http(s)://host:port" +msgstr "如果伺服器不能直接訪問 api 地址,你需要設置一個 HTTP 代理。例如 http(s)://host:port" #: assets/serializers/asset/gpt.py:24 msgid "HTTP proxy" @@ -2943,7 +2911,7 @@ msgid "Disk total" msgstr "硬碟大小" #: assets/serializers/asset/info/gathered.py:16 -#: authentication/serializers/connect_token_secret.py:115 +#: authentication/serializers/connect_token_secret.py:117 msgid "OS" msgstr "操作系統" @@ -2967,7 +2935,7 @@ msgstr "約束" msgid "Types" msgstr "類型" -#: assets/serializers/domain.py:21 +#: assets/serializers/domain.py:20 msgid "" "A gateway is a network proxy for a zone, and when connecting assets within " "the zone, the connection is routed through the gateway." @@ -3070,9 +3038,7 @@ msgid "" "Login with account when accessing assets, then automatically switch to " "another, similar to logging in with a regular account and then switching to " "root" -msgstr "" -"在訪問資產時使用帳戶登入,然後自動切換到另一個帳戶,就像用普通帳戶登入然後切" -"換到 root 一樣" +msgstr "在訪問資產時使用帳戶登入,然後自動切換到另一個帳戶,就像用普通帳戶登入然後切換到 root 一樣" #: assets/serializers/platform.py:210 msgid "Assets can be connected using a zone gateway" @@ -3082,11 +3048,11 @@ msgstr "資產可以使用區域網關進行連接" msgid "Default Domain" msgstr "默認網域" -#: assets/serializers/platform.py:234 +#: assets/serializers/platform.py:239 msgid "type is required" msgstr "類型 該欄位是必填項。" -#: assets/serializers/platform.py:249 +#: assets/serializers/platform.py:254 msgid "Protocols is required" msgstr "協議是必填的" @@ -3112,8 +3078,7 @@ msgstr "收集資產資訊" #: assets/tasks/gather_facts.py:25 msgid "" -"When clicking 'Refresh hardware info' in 'Console - Asset Details - Basic' " -"this task \n" +"When clicking 'Refresh hardware info' in 'Console - Asset Details - Basic' this task \n" " will be executed" msgstr "當在控制台資產詳情-基本設置點擊更新硬體信息執行該任務" @@ -3131,18 +3096,15 @@ msgstr "檢查節點下資產數量" #: assets/tasks/nodes_amount.py:18 msgid "" -"Manually verifying asset quantities updates the asset count for nodes under " -"the \n" -" current organization. This task will be called in the following two " -"cases: when updating \n" +"Manually verifying asset quantities updates the asset count for nodes under the \n" +" current organization. This task will be called in the following two cases: when updating \n" " nodes and when the number of nodes exceeds 100" -msgstr "" -"手動校對資產數量更新當前組織下的節點資產數量;更新節點時,當節點數量超過100" -"時,會調用該任務" +msgstr "手動校對資產數量更新當前組織下的節點資產數量;更新節點時,當節點數量超過100時,會調用該任務" #: assets/tasks/nodes_amount.py:34 msgid "" -"The task of self-checking is already running and cannot be started repeatedly" +"The task of self-checking is already running and cannot be started " +"repeatedly" msgstr "自檢程序已經在運行,不能重複啟動" #: assets/tasks/nodes_amount.py:40 @@ -3151,11 +3113,9 @@ msgstr "週期性檢查節點下資產數量" #: assets/tasks/nodes_amount.py:42 msgid "" -"Schedule the check_node_assets_amount_task to periodically update the asset " -"count of \n" +"Schedule the check_node_assets_amount_task to periodically update the asset count of \n" " all nodes under all organizations" -msgstr "" -"定時調用check_node_assets_amount_task任務,更新所有組織下所有節點的資產數量" +msgstr "定時調用check_node_assets_amount_task任務,更新所有組織下所有節點的資產數量" #: assets/tasks/ping.py:20 assets/tasks/ping.py:30 msgid "Test assets connectivity" @@ -3178,8 +3138,8 @@ msgstr "測試網關可連接性" #: assets/tasks/ping_gateway.py:23 msgid "" -"When clicking 'Test Connection' in 'Domain Details - Gateway' this task will " -"be executed" +"When clicking 'Test Connection' in 'Domain Details - Gateway' this task will" +" be executed" msgstr "當在網域詳情-網關-測試連接時,執行該任務" #: assets/tasks/utils.py:16 @@ -3203,7 +3163,8 @@ msgid "App Audits" msgstr "日志审计" #: audits/backends/db.py:17 -msgid "The text content is too long. Use Elasticsearch to store operation logs" +msgid "" +"The text content is too long. Use Elasticsearch to store operation logs" msgstr "文字內容太長。請使用 Elasticsearch 儲存操作日誌" #: audits/backends/db.py:78 @@ -3244,7 +3205,7 @@ msgstr "重命名" msgid "Symlink" msgstr "建立軟連結" -#: audits/const.py:18 audits/const.py:28 +#: audits/const.py:18 audits/const.py:29 #: ops/templates/ops/celery_task_log.html:86 #: terminal/api/session/session.py:154 msgid "Download" @@ -3267,56 +3228,60 @@ msgstr "查看" msgid "Create" msgstr "創建" -#: audits/const.py:29 +#: audits/const.py:27 templates/_csv_import_export.html:8 +msgid "Export" +msgstr "匯出" + +#: audits/const.py:30 msgid "Connect" msgstr "連接" -#: audits/const.py:30 authentication/templates/authentication/login.html:329 +#: audits/const.py:31 authentication/templates/authentication/login.html:329 #: authentication/templates/authentication/login.html:401 #: templates/_header_bar.html:101 msgid "Login" msgstr "登錄" -#: audits/const.py:35 rbac/tree.py:56 +#: audits/const.py:36 rbac/tree.py:56 msgid "Notifications" msgstr "通知" -#: audits/const.py:37 tickets/const.py:45 +#: audits/const.py:38 tickets/const.py:45 msgid "Approve" msgstr "同意" -#: audits/const.py:41 ops/models/celery.py:85 +#: audits/const.py:42 ops/models/celery.py:85 #: terminal/models/session/sharing.py:128 tickets/const.py:25 #: xpack/plugins/cloud/const.py:67 msgid "Finished" msgstr "結束" -#: audits/const.py:46 settings/serializers/terminal.py:6 +#: audits/const.py:47 settings/serializers/terminal.py:6 #: terminal/models/applet/host.py:26 terminal/models/component/terminal.py:185 -#: terminal/models/virtualapp/provider.py:14 terminal/serializers/session.py:57 -#: terminal/serializers/session.py:113 +#: terminal/models/virtualapp/provider.py:14 +#: terminal/serializers/session.py:57 terminal/serializers/session.py:113 msgid "Terminal" msgstr "終端" -#: audits/const.py:51 audits/models.py:133 +#: audits/const.py:52 audits/models.py:133 msgid "Operate log" msgstr "操作日誌" -#: audits/const.py:52 +#: audits/const.py:53 msgid "Session log" msgstr "會話日誌" -#: audits/const.py:53 +#: audits/const.py:54 msgid "Login log" msgstr "登錄日誌" -#: audits/const.py:54 rbac/tree.py:64 terminal/models/applet/host.py:144 +#: audits/const.py:55 rbac/tree.py:64 terminal/models/applet/host.py:144 #: terminal/models/component/task.py:22 #: xpack/plugins/cloud/serializers/account.py:77 msgid "Task" msgstr "任務" -#: audits/const.py:60 +#: audits/const.py:61 msgid "-" msgstr "-" @@ -3334,7 +3299,7 @@ msgstr "作業審計" msgid "Remote addr" msgstr "遠端地址" -#: audits/models.py:62 audits/serializers.py:62 +#: audits/models.py:62 audits/serializers.py:61 msgid "Operate" msgstr "操作" @@ -3359,17 +3324,17 @@ msgstr "會話" msgid "File transfer log" msgstr "文件管理" -#: audits/models.py:95 audits/serializers.py:110 +#: audits/models.py:95 audits/serializers.py:109 msgid "Resource Type" msgstr "資源類型" #: audits/models.py:96 audits/models.py:99 audits/models.py:145 -#: audits/serializers.py:109 labels/serializers.py:46 +#: audits/serializers.py:108 labels/serializers.py:46 msgid "Resource" msgstr "資源" #: audits/models.py:102 audits/models.py:148 audits/models.py:178 -#: audits/models.py:314 audits/serializers.py:230 +#: audits/models.py:314 audits/serializers.py:232 #: terminal/serializers/command.py:75 msgid "Datetime" msgstr "日期" @@ -3403,7 +3368,7 @@ msgstr "登錄方式" msgid "Login IP" msgstr "登錄 IP" -#: audits/models.py:201 audits/serializers.py:76 +#: audits/models.py:201 audits/serializers.py:75 #: authentication/templates/authentication/_mfa_confirm_modal.html:14 #: users/forms/profile.py:64 users/models/user/__init__.py:82 #: users/serializers/profile.py:71 @@ -3454,37 +3419,37 @@ msgid "Application ID" msgstr "應用 ID" #: audits/serializers.py:33 ops/models/adhoc.py:24 ops/models/base.py:16 -#: ops/models/base.py:53 ops/models/celery.py:87 ops/models/job.py:154 -#: ops/models/job.py:237 ops/models/playbook.py:30 ops/models/variable.py:17 +#: ops/models/base.py:53 ops/models/celery.py:87 ops/models/job.py:156 +#: ops/models/job.py:239 ops/models/playbook.py:30 ops/models/variable.py:17 #: terminal/models/session/sharing.py:25 msgid "Creator" msgstr "創建者" -#: audits/serializers.py:40 ops/serializers/celery.py:33 +#: audits/serializers.py:39 ops/serializers/celery.py:33 msgid "Execution cycle" msgstr "週期性Action" -#: audits/serializers.py:93 +#: audits/serializers.py:92 msgid "Reason display" msgstr "原因描述" -#: audits/serializers.py:94 audits/serializers.py:208 +#: audits/serializers.py:93 audits/serializers.py:210 msgid "Auth backend display" msgstr "认证代币描述" -#: audits/serializers.py:158 +#: audits/serializers.py:157 #, python-format msgid "%s %s this resource" msgstr "用户 %s %s 了当前资源" -#: audits/serializers.py:196 authentication/models/connection_token.py:51 +#: audits/serializers.py:198 authentication/models/connection_token.py:52 #: authentication/models/temp_token.py:13 perms/models/asset_permission.py:80 #: tickets/models/ticket/apply_application.py:31 #: tickets/models/ticket/apply_asset.py:21 users/models/user/__init__.py:101 msgid "Date expired" msgstr "失效日期" -#: audits/serializers.py:227 terminal/models/component/terminal.py:91 +#: audits/serializers.py:229 terminal/models/component/terminal.py:91 #: terminal/serializers/command.py:76 msgid "Remote Address" msgstr "遠端地址" @@ -3562,17 +3527,13 @@ msgstr "清理資產審計會話任務日誌" #: audits/tasks.py:134 msgid "" -"Since the system generates login logs, operation logs, file upload logs, " -"activity \n" -" logs, Celery execution logs, session recordings, command records, " -"and password change \n" -" logs, it will perform cleanup of records that exceed the time limit " -"according to the \n" +"Since the system generates login logs, operation logs, file upload logs, activity \n" +" logs, Celery execution logs, session recordings, command records, and password change \n" +" logs, it will perform cleanup of records that exceed the time limit according to the \n" " 'Tasks - Regular clean-up' in the system settings at 2 a.m daily" msgstr "" -"由於系統會產生登錄日誌、操作日誌、文件上傳日誌、活動日誌、celery執行日誌、會" -"話錄像和命令記錄、改密日誌,系統會根據系統設置-任務列表定期清理配置,對於超出" -"時間的,將於每天凌晨2點進行清理" +"由於系統會產生登錄日誌、操作日誌、文件上傳日誌、活動日誌、celery執行日誌、會話錄像和命令記錄、改密日誌,系統會根據系統設置-" +"任務列表定期清理配置,對於超出時間的,將於每天凌晨2點進行清理" #: audits/tasks.py:154 msgid "Upload FTP file to external storage" @@ -3580,11 +3541,9 @@ msgstr "上傳 FTP 文件到外部儲存" #: audits/tasks.py:156 msgid "" -"If SERVER_REPLAY_STORAGE is configured, files uploaded through file " -"management will be \n" +"If SERVER_REPLAY_STORAGE is configured, files uploaded through file management will be \n" " synchronized to external storage" -msgstr "" -"如果設定了SERVER_REPLAY_STORAGE,將通過文件管理上傳的文件同步到外部儲存" +msgstr "如果設定了SERVER_REPLAY_STORAGE,將通過文件管理上傳的文件同步到外部儲存" #: authentication/api/access_key.py:39 msgid "Access keys can be created at most 10" @@ -3599,39 +3558,39 @@ msgstr "參數中的值必須包含 %s" msgid "This action require verify your MFA" msgstr "該操作需要驗證您的 MFA, 請先開啟並配置" -#: authentication/api/connection_token.py:303 +#: authentication/api/connection_token.py:304 msgid "Reusable connection token is not allowed, global setting not enabled" msgstr "不允許使用可重複使用的連接令牌,未啟用全局設置" -#: authentication/api/connection_token.py:423 +#: authentication/api/connection_token.py:424 msgid "Anonymous account is not supported for this asset" msgstr "匿名帳號不支持當前資產" -#: authentication/api/connection_token.py:455 +#: authentication/api/connection_token.py:454 msgid "Permission expired" msgstr "授權已過期" -#: authentication/api/connection_token.py:488 +#: authentication/api/connection_token.py:487 msgid "ACL action is reject: {}({})" msgstr "ACL 動作是拒絕: {}({})" -#: authentication/api/connection_token.py:492 +#: authentication/api/connection_token.py:491 msgid "ACL action is review" msgstr "ACL 動作是覆核" -#: authentication/api/connection_token.py:502 +#: authentication/api/connection_token.py:501 msgid "ACL action is face verify" msgstr "ACL Action 係人臉驗證" -#: authentication/api/connection_token.py:507 +#: authentication/api/connection_token.py:506 msgid "ACL action not supported for this asset" msgstr "資產登錄規則不支持當前資產" -#: authentication/api/connection_token.py:514 +#: authentication/api/connection_token.py:513 msgid "ACL action is face online" msgstr "ACL Action 係人臉在線" -#: authentication/api/connection_token.py:533 +#: authentication/api/connection_token.py:532 msgid "No available face feature" msgstr "沒有可用的人臉特徵" @@ -3748,16 +3707,16 @@ msgstr "虛擬 MFA" msgid "SMS" msgstr "簡訊" -#: authentication/const.py:34 +#: authentication/const.py:35 msgid "Face Recognition" msgstr "臉部辨識" -#: authentication/const.py:35 settings/serializers/auth/radius.py:14 +#: authentication/const.py:36 settings/serializers/auth/radius.py:14 #: settings/serializers/auth/radius.py:16 msgid "Radius" msgstr "Radius" -#: authentication/const.py:36 +#: authentication/const.py:37 msgid "Custom" msgstr "自定義" @@ -3816,8 +3775,7 @@ msgid "" "You can also try {times_try} times (The account will be temporarily locked " "for {block_time} minutes)" msgstr "" -"您輸入的使用者名稱或密碼不正確,請重新輸入。 您還可以嘗試 {times_try} 次 (帳" -"號將被臨時 鎖定 {block_time} 分鐘)" +"您輸入的使用者名稱或密碼不正確,請重新輸入。 您還可以嘗試 {times_try} 次 (帳號將被臨時 鎖定 {block_time} 分鐘)" #: authentication/errors/const.py:47 authentication/errors/const.py:55 msgid "" @@ -3834,10 +3792,9 @@ msgstr "IP 已被鎖定 (請聯絡管理員解鎖或 {} 分鐘後重試)" #: authentication/errors/const.py:59 #, python-brace-format msgid "" -"{error}, You can also try {times_try} times (The account will be temporarily " -"locked for {block_time} minutes)" -msgstr "" -"{error} 您還可以嘗試 {times_try} 次 (帳號將被臨時鎖定 {block_time} 分鐘)" +"{error}, You can also try {times_try} times (The account will be temporarily" +" locked for {block_time} minutes)" +msgstr "{error} 您還可以嘗試 {times_try} 次 (帳號將被臨時鎖定 {block_time} 分鐘)" #: authentication/errors/const.py:63 msgid "MFA required" @@ -3943,7 +3900,9 @@ msgstr "MFA 類型" msgid "Captcha" msgstr "驗證碼" -#: authentication/forms.py:66 users/forms/profile.py:28 +#: authentication/forms.py:66 authentication/mfa/email.py:41 +#: authentication/templates/authentication/_msg_mfa_email_code.html:12 +#: users/forms/profile.py:28 msgid "MFA code" msgstr "MFA 驗證碼" @@ -3957,9 +3916,9 @@ msgstr "請輸入動態安全碼" #: authentication/mfa/base.py:27 msgid "" -"The two-factor code you entered has either already been used or has expired. " -"Please request a new one." -msgstr "" +"The two-factor code you entered has either already been used or has expired." +" Please request a new one." +msgstr "您輸入的雙重驗證碼已被使用或已過期。請申請新的雙重驗證碼。" #: authentication/mfa/custom.py:21 msgid "MFA Custom code invalid" @@ -3973,6 +3932,14 @@ msgstr "自訂 MFA 驗證碼" msgid "MFA custom global enabled, cannot disable" msgstr "自訂 MFA 全局開啟,無法被禁用" +#: authentication/mfa/email.py:11 +msgid "Email verify code invalid" +msgstr "郵件驗證碼校驗失敗" + +#: authentication/mfa/email.py:17 +msgid "Email verification code" +msgstr "郵件驗證碼" + #: authentication/mfa/face.py:55 msgid "Bind face to enable" msgstr "綁定人臉特徵以啟用" @@ -4021,7 +3988,7 @@ msgstr "設置手機號碼啟用" msgid "Clear phone number to disable" msgstr "清空手機號碼禁用" -#: authentication/middleware.py:95 settings/utils/ldap.py:691 +#: authentication/middleware.py:95 settings/utils/ldap.py:711 msgid "Authentication failed (before login check failed): {}" msgstr "認證失敗 (登錄前檢查失敗): {}" @@ -4043,22 +4010,22 @@ msgstr "該 MFA ({}) 方式沒有啟用" msgid "Please change your password" msgstr "請修改密碼" -#: authentication/models/connection_token.py:42 +#: authentication/models/connection_token.py:43 #: terminal/serializers/storage.py:114 msgid "Account name" msgstr "帳號名稱" -#: authentication/models/connection_token.py:43 +#: authentication/models/connection_token.py:44 msgid "Input username" msgstr "自訂使用者名稱" -#: authentication/models/connection_token.py:44 +#: authentication/models/connection_token.py:45 #: authentication/serializers/connection_token.py:18 msgid "Input secret" msgstr "自訂密碼" -#: authentication/models/connection_token.py:45 -#: authentication/serializers/connect_token_secret.py:114 +#: authentication/models/connection_token.py:46 +#: authentication/serializers/connect_token_secret.py:116 #: settings/serializers/msg.py:28 terminal/models/applet/applet.py:43 #: terminal/models/virtualapp/virtualapp.py:24 #: terminal/serializers/session.py:23 terminal/serializers/session.py:50 @@ -4066,69 +4033,69 @@ msgstr "自訂密碼" msgid "Protocol" msgstr "協議" -#: authentication/models/connection_token.py:46 +#: authentication/models/connection_token.py:47 msgid "Connect method" msgstr "連接方式" -#: authentication/models/connection_token.py:48 +#: authentication/models/connection_token.py:49 msgid "User display" msgstr "使用者名稱" -#: authentication/models/connection_token.py:49 +#: authentication/models/connection_token.py:50 msgid "Asset display" msgstr "資產名稱" -#: authentication/models/connection_token.py:50 +#: authentication/models/connection_token.py:51 msgid "Reusable" msgstr "可以重複使用" -#: authentication/models/connection_token.py:55 +#: authentication/models/connection_token.py:56 #: perms/models/asset_permission.py:83 msgid "From ticket" msgstr "來自工單" -#: authentication/models/connection_token.py:57 +#: authentication/models/connection_token.py:58 msgid "Face monitor token" msgstr "人臉監控令牌" -#: authentication/models/connection_token.py:68 +#: authentication/models/connection_token.py:69 msgid "Can expire connection token" msgstr "可以失效連接令牌" -#: authentication/models/connection_token.py:69 +#: authentication/models/connection_token.py:70 msgid "Can reuse connection token" msgstr "可以復用連接令牌" -#: authentication/models/connection_token.py:71 +#: authentication/models/connection_token.py:72 msgid "Connection token" msgstr "連接令牌" -#: authentication/models/connection_token.py:132 +#: authentication/models/connection_token.py:163 msgid "Connection token inactive" msgstr "連接令牌未啟用" -#: authentication/models/connection_token.py:136 +#: authentication/models/connection_token.py:167 msgid "Connection token expired at: {}" msgstr "連接令牌過期: {}" -#: authentication/models/connection_token.py:139 +#: authentication/models/connection_token.py:170 #: terminal/serializers/session.py:95 msgid "No user or invalid user" msgstr "沒有用戶或用戶失效" -#: authentication/models/connection_token.py:142 +#: authentication/models/connection_token.py:173 msgid "No asset or inactive asset" msgstr "沒有資產或資產未啟用" -#: authentication/models/connection_token.py:290 +#: authentication/models/connection_token.py:341 msgid "Can view super connection token secret" msgstr "可以查看超級連接令牌密文" -#: authentication/models/connection_token.py:292 +#: authentication/models/connection_token.py:343 msgid "Super connection token" msgstr "超級連接令牌" -#: authentication/models/connection_token.py:309 +#: authentication/models/connection_token.py:360 msgid "Admin connection token" msgstr "管理者連接令牌" @@ -4142,7 +4109,7 @@ msgstr "私有令牌" msgid "Private key" msgstr "ssh私鑰" -#: authentication/models/ssh_key.py:18 settings/serializers/terminal.py:34 +#: authentication/models/ssh_key.py:18 settings/serializers/terminal.py:38 #: users/forms/profile.py:175 users/models/user/__init__.py:92 #: xpack/plugins/cloud/serializers/account_attrs.py:211 msgid "Public key" @@ -4168,39 +4135,39 @@ msgstr "異地登錄提醒" msgid "binding reminder" msgstr "綁定提醒" -#: authentication/serializers/connect_token_secret.py:116 +#: authentication/serializers/connect_token_secret.py:118 msgid "Is builtin" msgstr "內建的" -#: authentication/serializers/connect_token_secret.py:120 +#: authentication/serializers/connect_token_secret.py:122 msgid "Options" msgstr "選項" -#: authentication/serializers/connect_token_secret.py:127 +#: authentication/serializers/connect_token_secret.py:129 #: ops/notifications.py:19 rbac/tree.py:60 msgid "Component" msgstr "組件" -#: authentication/serializers/connect_token_secret.py:136 +#: authentication/serializers/connect_token_secret.py:138 #: perms/serializers/user_permission.py:28 xpack/plugins/cloud/models.py:389 msgid "Domain" msgstr "網域" -#: authentication/serializers/connect_token_secret.py:138 +#: authentication/serializers/connect_token_secret.py:140 msgid "Expired now" msgstr "立刻過期" -#: authentication/serializers/connect_token_secret.py:171 +#: authentication/serializers/connect_token_secret.py:173 #: terminal/models/virtualapp/virtualapp.py:25 msgid "Image name" msgstr "鏡像名稱" -#: authentication/serializers/connect_token_secret.py:172 +#: authentication/serializers/connect_token_secret.py:174 #: terminal/models/virtualapp/virtualapp.py:27 msgid "Image port" msgstr "鏡像埠" -#: authentication/serializers/connect_token_secret.py:173 +#: authentication/serializers/connect_token_secret.py:175 #: terminal/models/virtualapp/virtualapp.py:26 msgid "Image protocol" msgstr "鏡像協議" @@ -4250,12 +4217,12 @@ msgstr "創建類型" #: authentication/serializers/ssh_key.py:33 msgid "" -"Please download the private key after creation. Each private key can only be " -"downloaded once" +"Please download the private key after creation. Each private key can only be" +" downloaded once" msgstr "創建完成後請下載私鑰,每個私鑰僅有一次下載機會" #: authentication/serializers/ssh_key.py:57 users/forms/profile.py:164 -#: users/serializers/profile.py:134 users/serializers/profile.py:161 +#: users/serializers/profile.py:142 users/serializers/profile.py:169 msgid "Not a valid ssh public key" msgstr "SSH金鑰不合法" @@ -4271,8 +4238,8 @@ msgstr "清除過期會話" #: authentication/tasks.py:15 msgid "" -"Since user logins create sessions, the system will clean up expired sessions " -"every 24 hours" +"Since user logins create sessions, the system will clean up expired sessions" +" every 24 hours" msgstr "由於用戶登錄系統會產生會話,系統每24小時清理已過期的會話" #: authentication/templates/authentication/_access_key_modal.html:6 @@ -4292,12 +4259,14 @@ msgid "Show" msgstr "顯示" #: authentication/templates/authentication/_access_key_modal.html:66 -#: users/const.py:42 users/templates/users/user_verify_mfa.html:36 +#: settings/serializers/terminal.py:24 users/const.py:42 +#: users/templates/users/user_verify_mfa.html:36 msgid "Disable" msgstr "禁用" #: authentication/templates/authentication/_access_key_modal.html:67 -#: users/const.py:43 users/templates/users/mfa_setting.html:120 +#: settings/serializers/terminal.py:24 users/const.py:43 +#: users/templates/users/mfa_setting.html:120 #: users/templates/users/mfa_setting.html:158 #: users/templates/users/mfa_setting.html:177 msgid "Enable" @@ -4331,10 +4300,11 @@ msgid "Code error" msgstr "代碼錯誤" #: authentication/templates/authentication/_msg_different_city.html:3 +#: authentication/templates/authentication/_msg_mfa_email_code.html:9 #: authentication/templates/authentication/_msg_oauth_bind.html:3 #: authentication/templates/authentication/_msg_reset_password.html:3 #: authentication/templates/authentication/_msg_reset_password_code.html:9 -#: jumpserver/conf.py:539 +#: jumpserver/conf.py:540 #: perms/templates/perms/_msg_item_permissions_expire.html:3 #: tickets/templates/tickets/approve_check_password.html:32 #: users/templates/users/_msg_account_expire_reminder.html:4 @@ -4353,6 +4323,11 @@ msgid "" "account password in time." msgstr "若懷疑此次登錄行為異常,請及時修改帳號密碼" +#: authentication/templates/authentication/_msg_mfa_email_code.html:15 +#: authentication/templates/authentication/_msg_reset_password_code.html:18 +msgid "The validity period of the verification code is one minute" +msgstr "驗證碼有效期為 1 分鐘" + #: authentication/templates/authentication/_msg_oauth_bind.html:6 msgid "Your account has just been bound to" msgstr "您的帳戶剛剛綁定到" @@ -4399,10 +4374,6 @@ msgid "" "Copy the verification code to the Reset Password page to reset the password." msgstr "將驗證碼複製到重設密碼頁面,重設密碼。" -#: authentication/templates/authentication/_msg_reset_password_code.html:18 -msgid "The validity period of the verification code is one minute" -msgstr "驗證碼有效期為 1 分鐘" - #: authentication/templates/authentication/_msg_rest_password_success.html:5 msgid "Your password has just been successfully updated" msgstr "你的密碼剛剛成功更新" @@ -4621,10 +4592,9 @@ msgstr "退出登錄成功,返回到登入頁面" #: authentication/views/mixins.py:39 msgid "" -"For your safety, automatic redirection login is not supported on the client. " -"If you need to open it in the client, please log in again" -msgstr "" -"為了您的安全,客戶端不支持自動跳轉登錄。如果需要在客戶端中打開,請重新登錄" +"For your safety, automatic redirection login is not supported on the client." +" If you need to open it in the client, please log in again" +msgstr "為了您的安全,客戶端不支持自動跳轉登錄。如果需要在客戶端中打開,請重新登錄" #: authentication/views/slack.py:35 authentication/views/slack.py:120 msgid "Slack Error" @@ -4754,13 +4724,12 @@ msgstr "加密的欄位" #: common/db/fields.py:578 msgid "" -"Invalid JSON data for JSONManyToManyField, should be like {'type': 'all'} or " -"{'type': 'ids', 'ids': []} or {'type': 'attrs', 'attrs': [{'name': 'ip', " +"Invalid JSON data for JSONManyToManyField, should be like {'type': 'all'} or" +" {'type': 'ids', 'ids': []} or {'type': 'attrs', 'attrs': [{'name': 'ip', " "'match': 'exact', 'value': '1.1.1.1'}}" msgstr "" -"JSON 多對多欄位無效,應為 {'type': 'all'} 或 {'type': 'ids', 'ids': []} 或 " -"{'type': 'attrs', 'attrs': [{'name': 'ip', 'match': 'exact', 'value': " -"'1.1.1.1'}}" +"JSON 多對多欄位無效,應為 {'type': 'all'} 或 {'type': 'ids', 'ids': []} 或 {'type': " +"'attrs', 'attrs': [{'name': 'ip', 'match': 'exact', 'value': '1.1.1.1'}}" #: common/db/fields.py:585 msgid "Invalid type, should be \"all\", \"ids\" or \"attrs\"" @@ -4823,75 +4792,89 @@ msgstr "解析文件錯誤: {}" msgid "Invalid excel file" msgstr "無效的 excel 文件" -#: common/drf/renders/base.py:138 +#: common/drf/renders/base.py:140 msgid "Yes/No" msgstr "是/否" -#: common/drf/renders/base.py:141 +#: common/drf/renders/base.py:143 msgid "Text, max length {}" msgstr "文字,最大長度 {}" -#: common/drf/renders/base.py:143 +#: common/drf/renders/base.py:145 msgid "Long text, no length limit" msgstr "長文字,無長度限制" -#: common/drf/renders/base.py:145 +#: common/drf/renders/base.py:147 msgid "Number, min {} max {}" msgstr "數字,最小 {} 最大 {}" -#: common/drf/renders/base.py:148 +#: common/drf/renders/base.py:150 msgid "Datetime format {}" msgstr "日期時間格式 {}" -#: common/drf/renders/base.py:154 +#: common/drf/renders/base.py:156 msgid "" "Choices, format name(value), name is optional for human read, value is " "requisite, options {}" msgstr "選項,格式: 名稱(值),名稱是可選的,方便閱讀,值是必填的,可選項有 {}" -#: common/drf/renders/base.py:157 +#: common/drf/renders/base.py:159 msgid "Choices, options {}" msgstr "選項,可選項有 {}" -#: common/drf/renders/base.py:159 +#: common/drf/renders/base.py:161 msgid "Phone number, format +8612345678901" msgstr "手機號碼,格式 +8612345678901" -#: common/drf/renders/base.py:161 +#: common/drf/renders/base.py:163 msgid "Label, format [\"key:value\"]" msgstr "標籤,格式: [\"鍵:值\"]" -#: common/drf/renders/base.py:163 +#: common/drf/renders/base.py:165 msgid "" "Object, format name(id), name is optional for human read, id is requisite" msgstr "關聯項,格式: 名稱(id), 名稱是可選的,方便閱讀,id 是必填的" -#: common/drf/renders/base.py:165 +#: common/drf/renders/base.py:167 msgid "Object, format id" msgstr "關聯項,格式是 id" -#: common/drf/renders/base.py:169 +#: common/drf/renders/base.py:171 msgid "" "Objects, format [\"name(id)\", ...], name is optional for human read, id is " "requisite" -msgstr "" -"多關聯項,格式: [\"名稱(id)\", ...], 名稱是可選的,方便閱讀,id 是必填的" - -#: common/drf/renders/base.py:171 -msgid "" -"Labels, format [\"key:value\", ...], if label not exists, will create it" -msgstr "標籤,格式: [\"鍵:值\", ...], 如果標籤不存在,將創建它" +msgstr "多關聯項,格式: [\"名稱(id)\", ...], 名稱是可選的,方便閱讀,id 是必填的" #: common/drf/renders/base.py:173 +msgid "Labels, format [\"key:value\", ...], if label not exists, will create it" +msgstr "標籤,格式: [\"鍵:值\", ...], 如果標籤不存在,將創建它" + +#: common/drf/renders/base.py:175 msgid "Objects, format [\"id\", ...]" msgstr "多關聯項,格式是 [\"id\", ...]" -#: common/drf/renders/base.py:271 +#: common/drf/renders/base.py:275 msgid "" "{} - The encryption password has not been set - please go to personal " "information -> file encryption password to set the encryption password" msgstr "{} - 未設置加密密碼 - 請前往個人資訊 -> 文件加密密碼中設置加密密碼" +#: common/drf/renders/mixins.py:37 labels/serializers.py:22 +msgid "Resource count" +msgstr "資源數量" + +#: common/drf/renders/mixins.py:46 +msgid "Export all" +msgstr "匯出所有" + +#: common/drf/renders/mixins.py:48 +msgid "Export only selected items" +msgstr "僅匯出選擇項" + +#: common/drf/renders/mixins.py:50 +msgid "Export filtered" +msgstr "導出搜索" + #: common/exceptions.py:15 xpack/plugins/cloud/ws.py:37 #, python-format msgid "%s object does not exist." @@ -4921,15 +4904,15 @@ msgstr "此操作需要確認當前用戶" msgid "Unexpect error occur" msgstr "發生意外錯誤" -#: common/plugins/es.py:35 +#: common/plugins/es.py:36 msgid "Invalid elasticsearch config" msgstr "無效的 Elasticsearch 配置" -#: common/plugins/es.py:40 +#: common/plugins/es.py:41 msgid "Not Support Elasticsearch8" msgstr "不支持 Elasticsearch8" -#: common/plugins/es.py:46 +#: common/plugins/es.py:47 msgid "" "Connection failed: Self-signed certificate used. Please check server " "certificate configuration" @@ -5059,10 +5042,8 @@ msgstr "發送郵件附件" #: common/tasks.py:68 msgid "" -"When an account password is changed or an account backup generates " -"attachments, \n" -" this task needs to be executed for sending emails and handling " -"attachments" +"When an account password is changed or an account backup generates attachments, \n" +" this task needs to be executed for sending emails and handling attachments" msgstr "當帳號改密,帳號備份產生附件時,需對發送郵件及附件執行該任務" #: common/tasks.py:94 @@ -5094,8 +5075,7 @@ msgstr "傳簡訊驗證碼" #: common/utils/verify_code.py:19 msgid "" -"When resetting a password, forgetting a password, or verifying MFA, this " -"task needs to \n" +"When resetting a password, forgetting a password, or verifying MFA, this task needs to \n" " be executed to send SMS messages" msgstr "當重置密碼、忘記密碼、驗證mfa時,需要發送短信,執行該任務" @@ -5119,16 +5099,16 @@ msgstr "未找到 Code" msgid "The message code provided is invalid or has expired" msgstr "提供的消息代碼無效或已過期" -#: jumpserver/conf.py:533 +#: jumpserver/conf.py:534 #, python-brace-format msgid "The verification code is: {code}" msgstr "驗證碼為: {code}" -#: jumpserver/conf.py:538 +#: jumpserver/conf.py:539 msgid "Create account successfully" msgstr "創建帳號成功" -#: jumpserver/conf.py:540 +#: jumpserver/conf.py:541 msgid "Your account has been created successfully" msgstr "你的帳號已創建成功" @@ -5146,8 +5126,8 @@ msgid "" "configure nginx for url distribution,
If you see this page, " "prove that you are not accessing the nginx listening port. Good luck." msgstr "" -"
Luna是單獨部署的一個程序,你需要部署luna,koko,
如果你看到了" -"這個頁面,證明你訪問的不是nginx監聽的埠,祝你好運
" +"
Luna是單獨部署的一個程序,你需要部署luna,koko, " +"
如果你看到了這個頁面,證明你訪問的不是nginx監聽的埠,祝你好運
" #: jumpserver/views/other.py:76 msgid "Websocket server run on port: {}, you should proxy it on nginx" @@ -5159,8 +5139,8 @@ msgid "" "configure nginx for url distribution, If you see this page, " "prove that you are not accessing the nginx listening port. Good luck." msgstr "" -"
Koko是單獨部署的一個程序,你需要部署Koko, 並確保nginx配置轉發,
如果你看到了這個頁面,證明你訪問的不是nginx監聽的埠,祝你好運
" +"
Koko是單獨部署的一個程序,你需要部署Koko, 並確保nginx配置轉發, " +"
如果你看到了這個頁面,證明你訪問的不是nginx監聽的埠,祝你好運
" #: labels/apps.py:8 msgid "App Labels" @@ -5182,10 +5162,6 @@ msgstr "資源 ID" msgid "Tagged resource" msgstr "相關的資源" -#: labels/serializers.py:22 -msgid "Resource count" -msgstr "資源數量" - #: labels/serializers.py:28 msgid "Cannot contain \":,\"" msgstr "不能包含\":,\"" @@ -5224,27 +5200,23 @@ msgstr "發布站內消息" #: notifications/notifications.py:48 msgid "" -"This task needs to be executed for sending internal messages for system " -"alerts, \n" +"This task needs to be executed for sending internal messages for system alerts, \n" " work orders, and other notifications" msgstr "系統某些告警、工單等需要發送站內信時執行該任務" -#: ops/ansible/inventory.py:117 ops/models/job.py:68 +#: ops/ansible/inventory.py:126 ops/ansible/inventory.py:196 +#: ops/models/job.py:69 msgid "No account available" msgstr "無可用帳號" -#: ops/ansible/inventory.py:298 +#: ops/ansible/inventory.py:318 ops/ansible/inventory.py:360 msgid "Ansible disabled" msgstr "Ansible 已禁用" -#: ops/ansible/inventory.py:314 +#: ops/ansible/inventory.py:376 msgid "Skip hosts below:" msgstr "跳過以下主機: " -#: ops/api/adhoc.py:32 -msgid "Deleting other people's script is not allowed" -msgstr "不允許刪除別人的腳本" - #: ops/api/celery.py:66 ops/api/celery.py:81 msgid "Waiting task start" msgstr "等待任務開始" @@ -5257,67 +5229,63 @@ msgstr "任務 {} 不存在" msgid "Task {} args or kwargs error" msgstr "任務 {} 執行參數錯誤" -#: ops/api/job.py:68 +#: ops/api/job.py:70 #, python-brace-format msgid "" "Asset ({asset}) must have at least one of the following protocols added: " "SSH, SFTP, or WinRM" msgstr "资产({asset})至少要添加ssh,sftp,winrm其中一种协议" -#: ops/api/job.py:69 +#: ops/api/job.py:71 #, python-brace-format msgid "Asset ({asset}) authorization is missing SSH, SFTP, or WinRM protocol" msgstr "资产({asset})授权缺少ssh,sftp或winrm协议" -#: ops/api/job.py:70 +#: ops/api/job.py:72 #, python-brace-format msgid "Asset ({asset}) authorization lacks upload permissions" msgstr "资产({asset})授权缺少上传权限" -#: ops/api/job.py:158 +#: ops/api/job.py:160 msgid "Duplicate file exists" msgstr "存在同名文件" -#: ops/api/job.py:163 +#: ops/api/job.py:165 #, python-brace-format msgid "" "File size exceeds maximum limit. Please select a file smaller than {limit}MB" msgstr "檔案大小超過最大限制。請選擇小於 {limit}MB 的文件。" -#: ops/api/job.py:236 +#: ops/api/job.py:238 msgid "" "The task is being created and cannot be interrupted. Please try again later." msgstr "正在創建任務,無法中斷,請稍後重試。" #: ops/api/playbook.py:49 -msgid "Deleting other people's playbook is not allowed" -msgstr "不允許刪除他人的 playbook" - -#: ops/api/playbook.py:55 msgid "Currently playbook is being used in a job" msgstr "當前 playbook 正在作業中使用" -#: ops/api/playbook.py:128 +#: ops/api/playbook.py:122 msgid "Unsupported file content" msgstr "不支持的文件內容" -#: ops/api/playbook.py:130 ops/api/playbook.py:176 ops/api/playbook.py:224 +#: ops/api/playbook.py:124 ops/api/playbook.py:170 ops/api/playbook.py:218 msgid "Invalid file path" msgstr "無效的文件路徑" -#: ops/api/playbook.py:202 +#: ops/api/playbook.py:196 msgid "This file can not be rename" msgstr "該文件不能重命名" -#: ops/api/playbook.py:221 +#: ops/api/playbook.py:215 msgid "File already exists" msgstr "文件已存在" -#: ops/api/playbook.py:239 +#: ops/api/playbook.py:233 msgid "File key is required" msgstr "文件金鑰該欄位是必填項。" -#: ops/api/playbook.py:242 +#: ops/api/playbook.py:236 msgid "This file can not be delete" msgstr "無法刪除此文件" @@ -5366,7 +5334,7 @@ msgstr "VCS" msgid "Adhoc" msgstr "命令" -#: ops/const.py:39 ops/models/job.py:152 ops/models/playbook.py:89 +#: ops/const.py:39 ops/models/job.py:154 ops/models/playbook.py:89 #: ops/models/variable.py:23 msgid "Playbook" msgstr "Playbook" @@ -5453,17 +5421,19 @@ msgid "no valid program entry found." msgstr "沒有可用程序入口" #: ops/mixin.py:34 ops/mixin.py:166 settings/serializers/auth/ldap.py:74 -#: settings/serializers/auth/ldap_ha.py:57 +#: settings/serializers/auth/ldap_ha.py:56 msgid "Periodic run" msgstr "週期性執行" #: ops/mixin.py:36 ops/mixin.py:113 ops/mixin.py:172 -#: settings/serializers/auth/ldap.py:81 settings/serializers/auth/ldap_ha.py:64 +#: settings/serializers/auth/ldap.py:81 +#: settings/serializers/auth/ldap_ha.py:63 msgid "Interval" msgstr "間隔" #: ops/mixin.py:39 ops/mixin.py:111 ops/mixin.py:169 -#: settings/serializers/auth/ldap.py:78 settings/serializers/auth/ldap_ha.py:61 +#: settings/serializers/auth/ldap.py:78 +#: settings/serializers/auth/ldap_ha.py:60 msgid "Crontab" msgstr "Crontab" @@ -5487,7 +5457,11 @@ msgstr "執行週期" msgid "* Please enter a valid crontab expression" msgstr "* 請輸入有效的 crontab 表達式" -#: ops/mixin.py:204 settings/serializers/auth/mixin.py:12 +#: ops/mixin.py:194 +msgid "Crontab minute must not contain '*'" +msgstr "" + +#: ops/mixin.py:208 settings/serializers/auth/mixin.py:12 msgid "Require interval or crontab setting" msgstr "需要週期或定期設定" @@ -5495,18 +5469,19 @@ msgstr "需要週期或定期設定" msgid "Pattern" msgstr "模式" -#: ops/models/adhoc.py:22 ops/models/job.py:149 +#: ops/models/adhoc.py:22 ops/models/job.py:151 msgid "Module" msgstr "模組" -#: ops/models/adhoc.py:23 ops/models/celery.py:82 ops/models/job.py:147 +#: ops/models/adhoc.py:23 ops/models/celery.py:82 ops/models/job.py:149 #: terminal/models/component/task.py:14 msgid "Args" msgstr "參數" -#: ops/models/adhoc.py:26 ops/models/playbook.py:34 ops/serializers/mixin.py:10 -#: rbac/models/role.py:31 rbac/models/rolebinding.py:46 -#: rbac/serializers/role.py:12 settings/serializers/auth/oauth2.py:37 +#: ops/models/adhoc.py:26 ops/models/playbook.py:34 +#: ops/serializers/mixin.py:10 rbac/models/role.py:31 +#: rbac/models/rolebinding.py:46 rbac/serializers/role.py:12 +#: settings/serializers/auth/oauth2.py:37 msgid "Scope" msgstr "範圍" @@ -5544,48 +5519,54 @@ msgstr "發布日期" msgid "Celery Task Execution" msgstr "Celery 任務執行" -#: ops/models/job.py:150 +#: ops/models/job.py:82 +#, fuzzy +#| msgid "Anonymous account is not supported for this asset" +msgid "Module {} is not suitable for this asset" +msgstr "匿名帳號不支持當前資產" + +#: ops/models/job.py:152 msgid "Run dir" msgstr "執行目錄" -#: ops/models/job.py:151 +#: ops/models/job.py:153 msgid "Timeout (Seconds)" msgstr "超時時間 (秒)" -#: ops/models/job.py:157 +#: ops/models/job.py:159 msgid "Use Parameter Define" msgstr "使用參數定義" -#: ops/models/job.py:158 +#: ops/models/job.py:160 msgid "Parameters define" msgstr "參數定義" -#: ops/models/job.py:159 +#: ops/models/job.py:161 msgid "Periodic variable" msgstr "週期執行變數" -#: ops/models/job.py:160 +#: ops/models/job.py:162 msgid "Run as" msgstr "執行使用者" -#: ops/models/job.py:162 +#: ops/models/job.py:164 msgid "Run as policy" msgstr "使用者策略" -#: ops/models/job.py:219 ops/models/variable.py:28 ops/serializers/job.py:111 +#: ops/models/job.py:221 ops/models/variable.py:28 ops/serializers/job.py:111 #: terminal/notifications.py:182 msgid "Job" msgstr "作業" -#: ops/models/job.py:242 +#: ops/models/job.py:244 msgid "Material" msgstr "Material" -#: ops/models/job.py:244 +#: ops/models/job.py:246 msgid "Material Type" msgstr "Material 類型" -#: ops/models/job.py:556 +#: ops/models/job.py:558 msgid "Job Execution" msgstr "作業執行" @@ -5608,8 +5589,8 @@ msgid "" "the resulting environment variable will be jms_name, and it can be " "referenced in the script using {{ jms_name }}" msgstr "" -"在腳本中使用的變量名稱,固定前綴為 jms_ + 輸入的變量名,例如變量名為 name,則" -"最終生成的環境變量為 jms_name。在腳本中引用時使用 {{ jms_name }}。" +"在腳本中使用的變量名稱,固定前綴為 jms_ + 輸入的變量名,例如變量名為 name,則最終生成的環境變量為 jms_name。在腳本中引用時使用 " +"{{ jms_name }}。" #: ops/models/variable.py:16 ops/serializers/variable.py:32 msgid "Default Value" @@ -5723,14 +5704,10 @@ msgstr "創建或更新週期任務" #: ops/tasks.py:134 msgid "" -"With version iterations, new tasks may be added, or task names and execution " -"times may \n" -" be modified. Therefore, upon system startup, tasks will be " -"registered or the parameters \n" +"With version iterations, new tasks may be added, or task names and execution times may \n" +" be modified. Therefore, upon system startup, tasks will be registered or the parameters \n" " of scheduled tasks will be updated" -msgstr "" -"隨著版本迭代,可能會新增任務或者修改任務的名稱,執行時間,所以在系統啟動時," -"將會註冊任務或者更新定時任務參數" +msgstr "隨著版本迭代,可能會新增任務或者修改任務的名稱,執行時間,所以在系統啟動時,將會註冊任務或者更新定時任務參數" #: ops/tasks.py:147 msgid "Periodic check service performance" @@ -5738,13 +5715,9 @@ msgstr "週期檢測服務性能" #: ops/tasks.py:149 msgid "" -"Check every hour whether each component is offline and whether the CPU, " -"memory, \n" -" and disk usage exceed the thresholds, and send an alert message to " -"the administrator" -msgstr "" -"每小時檢測各組件是否離線,cpu,內存,硬碟使用率是否超過閾值,向管理人員發送消" -"息預警" +"Check every hour whether each component is offline and whether the CPU, memory, \n" +" and disk usage exceed the thresholds, and send an alert message to the administrator" +msgstr "每小時檢測各組件是否離線,cpu,內存,硬碟使用率是否超過閾值,向管理人員發送消息預警" #: ops/tasks.py:159 msgid "Clean up unexpected jobs" @@ -5752,16 +5725,12 @@ msgstr "清理異常作業" #: ops/tasks.py:161 msgid "" -"Due to exceptions caused by executing adhoc and playbooks in the Job " -"Center, \n" -" which result in the task status not being updated, the system will " -"clean up abnormal jobs \n" -" that have not been completed for more than 3 hours every hour and " -"mark these tasks as \n" +"Due to exceptions caused by executing adhoc and playbooks in the Job Center, \n" +" which result in the task status not being updated, the system will clean up abnormal jobs \n" +" that have not been completed for more than 3 hours every hour and mark these tasks as \n" " failed" msgstr "" -"由於作業中心執行快捷命令,playbook會產生異常,任務狀態未更新完成,系統將每小" -"時執行清理超過3小時未完成的異常作業,並將任務標記為失敗" +"由於作業中心執行快捷命令,playbook會產生異常,任務狀態未更新完成,系統將每小時執行清理超過3小時未完成的異常作業,並將任務標記為失敗" #: ops/tasks.py:174 msgid "Clean job_execution db record" @@ -5769,17 +5738,13 @@ msgstr "清理作業中心執行歷史" #: ops/tasks.py:176 msgid "" -"Due to the execution of adhoc and playbooks in the Job Center, execution " -"records will \n" -" be generated. The system will clean up records that exceed the " -"retention period every day \n" -" at 2 a.m., based on the configuration of 'System Settings - Tasks - " -"Regular clean-up - \n" +"Due to the execution of adhoc and playbooks in the Job Center, execution records will \n" +" be generated. The system will clean up records that exceed the retention period every day \n" +" at 2 a.m., based on the configuration of 'System Settings - Tasks - Regular clean-up - \n" " Job execution retention days'" msgstr "" -"由於作業中心執行快捷命令,playbook,會產生執行記錄,系統會根據系統設置 - 任務" -"列表 - 定期清理 - 作業中心執行歷史配置,每天凌晨2點對超出保存時間的記錄進行清" -"理" +"由於作業中心執行快捷命令,playbook,會產生執行記錄,系統會根據系統設置 - 任務列表 - 定期清理 - " +"作業中心執行歷史配置,每天凌晨2點對超出保存時間的記錄進行清理" #: ops/templates/ops/celery_task_log.html:4 msgid "Task log" @@ -5848,7 +5813,8 @@ msgstr "請選擇一個組織後再保存" #: rbac/serializers/rolebinding.py:44 settings/serializers/auth/base.py:53 #: terminal/templates/terminal/_msg_command_warning.html:21 #: terminal/templates/terminal/_msg_session_sharing.html:14 -#: tickets/models/ticket/general.py:303 tickets/serializers/ticket/ticket.py:61 +#: tickets/models/ticket/general.py:303 +#: tickets/serializers/ticket/ticket.py:61 msgid "Organization" msgstr "組織" @@ -5882,7 +5848,7 @@ msgid "Can not delete virtual org" msgstr "無法刪除虛擬組織" #: orgs/serializers.py:10 perms/serializers/permission.py:59 -#: rbac/serializers/role.py:27 users/serializers/group.py:54 +#: rbac/serializers/role.py:27 users/serializers/group.py:53 msgid "Users amount" msgstr "用戶數量" @@ -6011,9 +5977,7 @@ msgstr "組織 ({}) 的資產授權" msgid "" "Accounts, format [\"@virtual\", \"root\", \"%template_id\"], virtual " "choices: @ALL, @SPEC, @USER, @ANON, @INPUT" -msgstr "" -"帳號,格式為 [\"@虛擬帳號\", \"root\", \"%模板id\"], 虛擬選項: @ALL, @SPEC, " -"@USER, @ANON, @INPUT" +msgstr "帳號,格式為 [\"@虛擬帳號\", \"root\", \"%模板id\"], 虛擬選項: @ALL, @SPEC, @USER, @ANON, @INPUT" #: perms/serializers/permission.py:49 msgid "Protocols, format [\"ssh\", \"rdp\", \"vnc\"] or [\"all\"]" @@ -6029,18 +5993,13 @@ msgstr "校驗資產授權規則已過期" #: perms/tasks.py:30 msgid "" -"The cache of organizational collections, which have completed user " -"authorization tree \n" -" construction, will expire. Therefore, expired collections need to be " -"cleared from the \n" -" cache, and this task will be executed periodically based on the time " -"interval specified \n" -" by PERM_EXPIRED_CHECK_PERIODIC in the system configuration file " -"config.txt" +"The cache of organizational collections, which have completed user authorization tree \n" +" construction, will expire. Therefore, expired collections need to be cleared from the \n" +" cache, and this task will be executed periodically based on the time interval specified \n" +" by PERM_EXPIRED_CHECK_PERIODIC in the system configuration file config.txt" msgstr "" -"用戶授權樹已經構建完成的組織集合緩存會過期,所以需要將過期的集合從緩存中清理" -"掉,根據系統配置文件 config.txt 中 PERM_EXPIRED_CHECK_PERIODIC 的時間間隔定時" -"執行該任務" +"用戶授權樹已經構建完成的組織集合緩存會過期,所以需要將過期的集合從緩存中清理掉,根據系統配置文件 config.txt 中 " +"PERM_EXPIRED_CHECK_PERIODIC 的時間間隔定時執行該任務" #: perms/tasks.py:49 msgid "Send asset permission expired notification" @@ -6048,16 +6007,11 @@ msgstr "發送資產權限過期通知" #: perms/tasks.py:51 msgid "" -"Check every day at 10 a.m. and send a notification message to users " -"associated with \n" -" assets whose authorization is about to expire, as well as to the " -"organization's \n" -" administrators, 3 days in advance, to remind them that the asset " -"authorization will \n" +"Check every day at 10 a.m. and send a notification message to users associated with \n" +" assets whose authorization is about to expire, as well as to the organization's \n" +" administrators, 3 days in advance, to remind them that the asset authorization will \n" " expire in a few days" -msgstr "" -"每天上午10點檢查,對資產授權即將過期的所關聯的用戶及該組織管理員提前三天發送" -"消息通知,提示資產還有幾天即將過期" +msgstr "每天上午10點檢查,對資產授權即將過期的所關聯的用戶及該組織管理員提前三天發送消息通知,提示資產還有幾天即將過期" #: perms/templates/perms/_msg_item_permissions_expire.html:7 #: perms/templates/perms/_msg_permed_items_expire.html:7 @@ -6236,7 +6190,7 @@ msgid "Storage" msgstr "儲存" #: rbac/tree.py:61 terminal/models/applet/applet.py:53 -#: terminal/models/applet/applet.py:328 terminal/models/applet/host.py:30 +#: terminal/models/applet/applet.py:369 terminal/models/applet/host.py:30 #: terminal/serializers/applet.py:15 msgid "Applet" msgstr "遠程應用" @@ -6452,9 +6406,7 @@ msgid "" "authentication service platform does not return the user's email " "information, the system will automatically create the user using this email " "suffix" -msgstr "" -"第三方使用者認證成功後,若第三方認證服務平台未回傳該使用者的電子信箱資訊,系" -"統將自動以此電子信箱後綴建立使用者" +msgstr "第三方使用者認證成功後,若第三方認證服務平台未回傳該使用者的電子信箱資訊,系統將自動以此電子信箱後綴建立使用者" #: settings/serializers/auth/base.py:37 msgid "Forgot Password URL" @@ -6473,23 +6425,21 @@ msgid "" "Should an flash page be displayed before the user is redirected to third-" "party authentication when the administrator enables third-party redirect " "authentication" -msgstr "" -"Action管理員啟用第三方重新定向身份驗證時,在使用者重定向到第三方身份驗證之前" -"是否顯示 Flash 頁面" +msgstr "Action管理員啟用第三方重新定向身份驗證時,在使用者重定向到第三方身份驗證之前是否顯示 Flash 頁面" #: settings/serializers/auth/base.py:55 msgid "" "When you create a user, you associate the user to the organization of your " "choice. Users always belong to the Default organization." -msgstr "" -"建立使用者時,您會將該使用者與您選擇的組織關聯。使用者始終屬於 Default 組織。" +msgstr "建立使用者時,您會將該使用者與您選擇的組織關聯。使用者始終屬於 Default 組織。" #: settings/serializers/auth/cas.py:12 settings/serializers/auth/cas.py:14 msgid "CAS" msgstr "CAS" #: settings/serializers/auth/cas.py:15 settings/serializers/auth/ldap.py:45 -#: settings/serializers/auth/ldap_ha.py:28 settings/serializers/auth/oidc.py:61 +#: settings/serializers/auth/ldap_ha.py:27 +#: settings/serializers/auth/oidc.py:61 msgid "Server" msgstr "服務端地址" @@ -6514,9 +6464,11 @@ msgstr "使用者名稱屬性" msgid "Enable attributes map" msgstr "啟用屬性映射" -#: settings/serializers/auth/cas.py:34 settings/serializers/auth/dingtalk.py:18 +#: settings/serializers/auth/cas.py:34 +#: settings/serializers/auth/dingtalk.py:18 #: settings/serializers/auth/feishu.py:18 settings/serializers/auth/lark.py:17 -#: settings/serializers/auth/ldap.py:67 settings/serializers/auth/ldap_ha.py:50 +#: settings/serializers/auth/ldap.py:67 +#: settings/serializers/auth/ldap_ha.py:49 #: settings/serializers/auth/oauth2.py:60 settings/serializers/auth/oidc.py:39 #: settings/serializers/auth/saml2.py:35 settings/serializers/auth/slack.py:18 #: settings/serializers/auth/wecom.py:18 @@ -6527,9 +6479,7 @@ msgstr "映射屬性" msgid "" "User attribute mapping, where the `key` is the CAS service user attribute " "name and the `value` is the JumpServer user attribute name" -msgstr "" -"使用者屬性對照,其中 `key` 是 CAS 服務使用者屬性名稱,`value` 是 JumpServer " -"使用者屬性名稱" +msgstr "使用者屬性對照,其中 `key` 是 CAS 服務使用者屬性名稱,`value` 是 JumpServer 使用者屬性名稱" #: settings/serializers/auth/cas.py:41 msgid "Create user" @@ -6549,17 +6499,13 @@ msgstr "啟用釘釘認證" msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the DingTalk service user attribute name" -msgstr "" -"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是釘釘服務使" -"用者屬性名稱" +msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是釘釘服務使用者屬性名稱" #: settings/serializers/auth/feishu.py:20 msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the FeiShu service user attribute name" -msgstr "" -"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是飛書服務使" -"用者屬性名稱" +msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是飛書服務使用者屬性名稱" #: settings/serializers/auth/lark.py:13 users/models/user/_source.py:22 msgid "Lark" @@ -6569,11 +6515,9 @@ msgstr "" msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the Lark service user attribute name" -msgstr "" -"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 Lark 服務" -"使用者屬性名稱" +msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 Lark 服務使用者屬性名稱" -#: settings/serializers/auth/ldap.py:42 settings/serializers/auth/ldap.py:104 +#: settings/serializers/auth/ldap.py:42 settings/serializers/auth/ldap.py:108 msgid "LDAP" msgstr "LDAP" @@ -6581,85 +6525,104 @@ msgstr "LDAP" msgid "LDAP server URI" msgstr "LDAP 服務域名" -#: settings/serializers/auth/ldap.py:49 settings/serializers/auth/ldap_ha.py:32 +#: settings/serializers/auth/ldap.py:49 +#: settings/serializers/auth/ldap_ha.py:31 msgid "Bind DN" msgstr "綁定 DN" -#: settings/serializers/auth/ldap.py:50 settings/serializers/auth/ldap_ha.py:33 +#: settings/serializers/auth/ldap.py:50 +#: settings/serializers/auth/ldap_ha.py:32 msgid "Binding Distinguished Name" msgstr "綁定的 DN" -#: settings/serializers/auth/ldap.py:54 settings/serializers/auth/ldap_ha.py:37 +#: settings/serializers/auth/ldap.py:54 +#: settings/serializers/auth/ldap_ha.py:36 msgid "Binding password" msgstr "原來的密碼" -#: settings/serializers/auth/ldap.py:57 settings/serializers/auth/ldap_ha.py:40 +#: settings/serializers/auth/ldap.py:57 +#: settings/serializers/auth/ldap_ha.py:39 msgid "Search OU" msgstr "系統架構" -#: settings/serializers/auth/ldap.py:59 settings/serializers/auth/ldap_ha.py:42 +#: settings/serializers/auth/ldap.py:59 +#: settings/serializers/auth/ldap_ha.py:41 msgid "" "User Search Base, if there are multiple OUs, you can separate them with the " "`|` symbol" msgstr "使用者搜尋庫,如果有多個OU,可以用`|`符號分隔" -#: settings/serializers/auth/ldap.py:63 settings/serializers/auth/ldap_ha.py:46 +#: settings/serializers/auth/ldap.py:63 +#: settings/serializers/auth/ldap_ha.py:45 msgid "Search filter" msgstr "用戶過濾器" -#: settings/serializers/auth/ldap.py:64 settings/serializers/auth/ldap_ha.py:47 +#: settings/serializers/auth/ldap.py:64 +#: settings/serializers/auth/ldap_ha.py:46 #, python-format msgid "Selection could include (cn|uid|sAMAccountName=%(user)s)" msgstr "可能的選項是(cn或uid或sAMAccountName=%(user)s)" -#: settings/serializers/auth/ldap.py:69 settings/serializers/auth/ldap_ha.py:52 +#: settings/serializers/auth/ldap.py:69 +#: settings/serializers/auth/ldap_ha.py:51 msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the LDAP service user attribute name" -msgstr "" -"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 LDAP 服務" -"使用者屬性名稱" +msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 LDAP 服務使用者屬性名稱" -#: settings/serializers/auth/ldap.py:85 settings/serializers/auth/ldap_ha.py:68 +#: settings/serializers/auth/ldap.py:85 +#: settings/serializers/auth/ldap_ha.py:67 msgid "Connect timeout (s)" msgstr "連接超時時間 (秒)" -#: settings/serializers/auth/ldap.py:90 settings/serializers/auth/ldap_ha.py:73 +#: settings/serializers/auth/ldap.py:88 +#: settings/serializers/auth/ldap_ha.py:70 +msgid "Strict sync" +msgstr "嚴格模式" + +#: settings/serializers/auth/ldap.py:89 +#: settings/serializers/auth/ldap_ha.py:71 +msgid "" +"In strict mode, users not found in LDAP will be disabled during full or " +"automatic sync" +msgstr "啟用嚴格模式後,全量或自動同步將禁用系統中未在 LDAP 中發現的用戶" + +#: settings/serializers/auth/ldap.py:94 +#: settings/serializers/auth/ldap_ha.py:76 msgid "User DN cache timeout (s)" msgstr "快取逾時時間 (秒)" -#: settings/serializers/auth/ldap.py:92 +#: settings/serializers/auth/ldap.py:96 msgid "" "Caching the User DN obtained during user login authentication can " "effectively improve the speed of user authentication., 0 means no " "cache
If the user OU structure has been adjusted, click Submit to clear " "the user DN cache" msgstr "" -"對用戶登入驗證時查詢出的 User DN 進行緩存,可以有效提升用戶認證的速度
如果" -"用戶 OU 架構有调整,點擊提交即可清除用戶 DN 緩存" +"對用戶登入驗證時查詢出的 User DN 進行緩存,可以有效提升用戶認證的速度
如果用戶 OU 架構有调整,點擊提交即可清除用戶 DN 緩存" -#: settings/serializers/auth/ldap.py:98 settings/serializers/auth/ldap_ha.py:81 +#: settings/serializers/auth/ldap.py:102 +#: settings/serializers/auth/ldap_ha.py:84 msgid "Search paged size (piece)" msgstr "搜索分頁數量 (條)" -#: settings/serializers/auth/ldap_ha.py:25 -#: settings/serializers/auth/ldap_ha.py:87 +#: settings/serializers/auth/ldap_ha.py:24 +#: settings/serializers/auth/ldap_ha.py:90 msgid "LDAP HA" msgstr "LDAP 認證" -#: settings/serializers/auth/ldap_ha.py:29 +#: settings/serializers/auth/ldap_ha.py:28 msgid "LDAP HA server URI" msgstr "LDAP HA 服務域名" -#: settings/serializers/auth/ldap_ha.py:75 +#: settings/serializers/auth/ldap_ha.py:78 msgid "" "Caching the User DN obtained during user login authentication can " -"effectivelyimprove the speed of user authentication., 0 means no cache
If " -"the user OU structure has been adjusted, click Submit to clear the user DN " +"effectivelyimprove the speed of user authentication., 0 means no cache
If" +" the user OU structure has been adjusted, click Submit to clear the user DN " "cache" msgstr "" -"對用戶登入認證時查詢出的 User DN 進行快取,可以有效提高用戶認證的速度
如果" -"用戶 OU 架構有調整,點擊提交即可清除用戶 DN 快取" +"對用戶登入認證時查詢出的 User DN 進行快取,可以有效提高用戶認證的速度
如果用戶 OU 架構有調整,點擊提交即可清除用戶 DN 快取" #: settings/serializers/auth/oauth2.py:19 #: settings/serializers/auth/oauth2.py:22 @@ -6703,19 +6666,18 @@ msgid "End session endpoint" msgstr "Logout session endpoint address" #: settings/serializers/auth/oauth2.py:57 -msgid "When the user signs out, they also be logged out from the OAuth2 server" +msgid "" +"When the user signs out, they also be logged out from the OAuth2 server" msgstr "當使用者退出時,他們也會從 OAuth2 伺服器退出" #: settings/serializers/auth/oauth2.py:62 msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the OAuth2 service user attribute name" -msgstr "" -"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 OAuth2 服" -"務使用者屬性名稱" +msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 OAuth2 服務使用者屬性名稱" -#: settings/serializers/auth/oauth2.py:67 settings/serializers/auth/oidc.py:113 -#: settings/serializers/auth/saml2.py:45 +#: settings/serializers/auth/oauth2.py:67 +#: settings/serializers/auth/oidc.py:113 settings/serializers/auth/saml2.py:45 msgid "Always update user" msgstr "總是更新用戶資訊" @@ -6747,9 +6709,7 @@ msgstr "Ignore SSL certificate verification" msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the OIDC service user attribute name" -msgstr "" -"使用者屬性映射,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 OIDC 服務" -"使用者屬性名稱" +msgstr "使用者屬性映射,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 OIDC 服務使用者屬性名稱" #: settings/serializers/auth/oidc.py:45 msgid "Enable PKCE" @@ -6767,8 +6727,7 @@ msgstr "使用 Keycloak" msgid "" "Use Keycloak as the OpenID Connect server, or use standard OpenID Connect " "Protocol" -msgstr "" -"使用 Keycloak 作為 OpenID Connect 伺服器,或者使用標準 OpenID Connect 協議" +msgstr "使用 Keycloak 作為 OpenID Connect 伺服器,或者使用標準 OpenID Connect 協議" #: settings/serializers/auth/oidc.py:64 msgid "Realm name" @@ -6827,8 +6786,7 @@ msgid "" "The hostname can using passkey auth, If not set, will use request host and " "the request host in DOMAINS, If multiple domains, use comma to separate" msgstr "" -"可以使用 Passkey 認證的域名,如果不設置,將使用請求主機(主機名在可信域 " -"DOMAINS中), 如果有多個域名,使用逗號分隔, 不需要埠號" +"可以使用 Passkey 認證的域名,如果不設置,將使用請求主機(主機名在可信域 DOMAINS中), 如果有多個域名,使用逗號分隔, 不需要埠號" #: settings/serializers/auth/passkey.py:22 msgid "FIDO Server name" @@ -6839,7 +6797,8 @@ msgid "OTP in RADIUS" msgstr "Use Radius OTP" #: settings/serializers/auth/radius.py:24 -msgid "* Using OTP in RADIUS means users can employ RADIUS as a method for MFA" +msgid "" +"* Using OTP in RADIUS means users can employ RADIUS as a method for MFA" msgstr "* 在 RADIUS 中使用 OTP 意味著使用者可以利用 RADIUS 作為 MFA 的方法 " #: settings/serializers/auth/saml2.py:12 settings/serializers/auth/saml2.py:15 @@ -6870,9 +6829,7 @@ msgstr "SP 證書" msgid "" "User attribute mapping, where the `key` is the SAML2 service user attribute " "name and the `value` is the JumpServer user attribute name" -msgstr "" -" 使用者屬性映射,其中 `key` 是 SAML2 服務使用者屬性名稱,`value` 是 " -"JumpServer 使用者屬性名稱" +msgstr " 使用者屬性映射,其中 `key` 是 SAML2 服務使用者屬性名稱,`value` 是 JumpServer 使用者屬性名稱" #: settings/serializers/auth/saml2.py:43 msgid "When the user signs out, they also be logged out from the SAML2 server" @@ -6882,9 +6839,7 @@ msgstr "當使用者登出時,他們也會從 SAML2 伺服器登出" msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the Slack service user attribute name" -msgstr "" -"使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 Slack 服" -"務使用者屬性名稱" +msgstr "使用者屬性對照,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是 Slack 服務使用者屬性名稱" #: settings/serializers/auth/sms.py:18 msgid "Enable Short Message Service (SMS)" @@ -6949,12 +6904,10 @@ msgstr "業務型態(Application id)" #: settings/serializers/auth/sms.py:85 #, python-brace-format msgid "" -"Template need contain {code} and Signature + template length does not exceed " -"67 words. For example, your verification code is {code}, which is valid for " -"5 minutes. Please do not disclose it to others." -msgstr "" -"模板需要包含 {code},並且模板+簽名長度不能超過67個字。例如, 您的驗證碼是 " -"{code}, 有效期為5分鐘。請不要洩露給其他人。" +"Template need contain {code} and Signature + template length does not exceed" +" 67 words. For example, your verification code is {code}, which is valid for" +" 5 minutes. Please do not disclose it to others." +msgstr "模板需要包含 {code},並且模板+簽名長度不能超過67個字。例如, 您的驗證碼是 {code}, 有效期為5分鐘。請不要洩露給其他人。" #: settings/serializers/auth/sms.py:94 #, python-brace-format @@ -6990,9 +6943,7 @@ msgstr "單位: 秒" msgid "" "User attribute mapping, where the `key` is the JumpServer user attribute " "name and the `value` is the WeCom service user attribute name" -msgstr "" -"使用者屬性映射,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是企業微信服" -"務使用者屬性名稱" +msgstr "使用者屬性映射,其中 `key` 是 JumpServer 使用者屬性名稱,`value` 是企業微信服務使用者屬性名稱" #: settings/serializers/basic.py:11 msgid "Site URL" @@ -7000,8 +6951,8 @@ msgstr "目前網站 URL" #: settings/serializers/basic.py:13 msgid "" -"Site URL is the externally accessible address of the current product service " -"and is usually used in links in system emails" +"Site URL is the externally accessible address of the current product service" +" and is usually used in links in system emails" msgstr "站點 URL 是目前產品服務的外部可訪問地址,通常在系統郵件的連結中使用" #: settings/serializers/basic.py:18 @@ -7086,8 +7037,7 @@ msgstr "會話日誌 (天)" msgid "" "Session, record, command will be delete if more than duration, only in " "database, OSS will not be affected." -msgstr "" -"會話、錄影,命令記錄超過該時長將會被清除 (影響資料庫儲存,OSS 等不受影響)" +msgstr "會話、錄影,命令記錄超過該時長將會被清除 (影響資料庫儲存,OSS 等不受影響)" #: settings/serializers/cleaning.py:53 msgid "Change secret and push record retention days (day)" @@ -7125,8 +7075,7 @@ msgid "" "accounts that exceed the predetermined number. If the value reaches or " "exceeds 999 (default), no historical account deletion will be performed" msgstr "" -"如果特定數值小於999,系統將在每日晚間自動執行任務:檢查並刪除超出預定數量的歷" -"史帳號。如果該數值達到或超過999,則不進行任何歷史帳號的刪除操作。" +"如果特定數值小於999,系統將在每日晚間自動執行任務:檢查並刪除超出預定數量的歷史帳號。如果該數值達到或超過999,則不進行任何歷史帳號的刪除操作。" #: settings/serializers/feature.py:87 msgid "Mount Point" @@ -7278,8 +7227,7 @@ msgid "" "server. In most email documentation this type of TLS connection is referred " "to as SSL. It is generally used on port 465" msgstr "" -"與 SMTP 伺服器通信時是否使用隱式 TLS(安全)連接。在大多數電子郵件文檔中,這" -"種類型的 TLS 連接稱為 SSL。它通常在埠 465 上使用" +"與 SMTP 伺服器通信時是否使用隱式 TLS(安全)連接。在大多數電子郵件文檔中,這種類型的 TLS 連接稱為 SSL。它通常在埠 465 上使用" #: settings/serializers/msg.py:54 msgid "Use TLS" @@ -7289,9 +7237,7 @@ msgstr "使用 TLS" msgid "" "Whether to use a TLS (secure) connection when talking to the SMTP server. " "This is used for explicit TLS connections, generally on port 587" -msgstr "" -"與 SMTP 伺服器通信時是否使用 TLS(安全)連接。這用於顯式 TLS 連接,通常在埠 " -"587 上" +msgstr "與 SMTP 伺服器通信時是否使用 TLS(安全)連接。這用於顯式 TLS 連接,通常在埠 587 上" #: settings/serializers/msg.py:64 msgid "Subject prefix" @@ -7299,8 +7245,8 @@ msgstr "主題前綴" #: settings/serializers/msg.py:69 msgid "" -"Tips: When creating a user, send the subject of the email (eg:Create account " -"successfully)" +"Tips: When creating a user, send the subject of the email (eg:Create account" +" successfully)" msgstr "提示: 創建用戶時,發送設置密碼郵件的主題 (例如: 創建用戶成功)" #: settings/serializers/msg.py:73 @@ -7316,8 +7262,7 @@ msgstr "提示: 創建用戶時,發送設置密碼郵件的敬語 (例如: 你 msgid "" "Tips: When creating a user, send the content of the email, support " "{username} {name} {email} label" -msgstr "" -"提示: 創建用戶時,發送設置密碼郵件的內容, 支持 {username} {name} {email} 標籤" +msgstr "提示: 創建用戶時,發送設置密碼郵件的內容, 支持 {username} {name} {email} 標籤" #: settings/serializers/msg.py:84 msgid "Tips: Email signature (eg:jumpserver)" @@ -7333,9 +7278,7 @@ msgstr "顯示未分組節點" #: settings/serializers/other.py:12 msgid "Perm single to ungroup node" -msgstr "" -"放置單獨授權的資產到未分組節點, 避免能看到資產所在節點,但該節點未被授權的問" -"題" +msgstr "放置單獨授權的資產到未分組節點, 避免能看到資產所在節點,但該節點未被授權的問題" #: settings/serializers/security.py:17 msgid "User password expiration (day)" @@ -7346,9 +7289,7 @@ msgid "" "If the user does not update the password during the time, the user password " "will expire failure;The password expiration reminder mail will be automatic " "sent to the user by system within 5 days (daily) before the password expires" -msgstr "" -"如果用戶在此期間沒有更新密碼,用戶密碼將過期失效; 密碼過期提醒郵件將在密碼過" -"期前5天內由系統 (每天)自動發送給用戶" +msgstr "如果用戶在此期間沒有更新密碼,用戶密碼將過期失效; 密碼過期提醒郵件將在密碼過期前5天內由系統 (每天)自動發送給用戶" #: settings/serializers/security.py:26 msgid "Recent password count" @@ -7418,9 +7359,7 @@ msgid "" "users of other authentication methods except local authentication methods " "are allowed to log in and automatically create users (if the user does not " "exist)" -msgstr "" -"如果開啟,不存在的用戶將不被允許登錄;如果關閉,除本地認證方式外,其他認證方" -"式的用戶都允許登錄並自動創建用戶 (如果用戶不存在)" +msgstr "如果開啟,不存在的用戶將不被允許登錄;如果關閉,除本地認證方式外,其他認證方式的用戶都允許登錄並自動創建用戶 (如果用戶不存在)" #: settings/serializers/security.py:103 msgid "Only from source login" @@ -7428,13 +7367,12 @@ msgstr "僅從用戶來源登錄" #: settings/serializers/security.py:105 msgid "" -"If it is enabled, the user will only authenticate to the source when logging " -"in; if it is disabled, the user will authenticate all the enabled " +"If it is enabled, the user will only authenticate to the source when logging" +" in; if it is disabled, the user will authenticate all the enabled " "authentication methods in a certain order when logging in, and as long as " "one of the authentication methods is successful, they can log in directly" msgstr "" -"如果開啟,用戶登錄時僅會向來源端進行認證;如果關閉,用戶登錄時會按照一定的順" -"序對所有已開啟的認證方式進行順序認證,只要有一個認證成功就可以直接登錄" +"如果開啟,用戶登錄時僅會向來源端進行認證;如果關閉,用戶登錄時會按照一定的順序對所有已開啟的認證方式進行順序認證,只要有一個認證成功就可以直接登錄" #: settings/serializers/security.py:116 #: users/templates/users/mfa_setting.html:160 @@ -7461,148 +7399,147 @@ msgstr "第三方認證開啟 MFA" msgid "The third-party login modes include OIDC, CAS, and SAML2" msgstr "第三方登錄方式包括: OIDC、CAS、SAML2" -#: settings/serializers/security.py:128 +#: settings/serializers/security.py:129 +msgid "MFA via Email" +msgstr "郵件驗證 MFA" + +#: settings/serializers/security.py:130 +msgid "Email as a method for multi-factor authentication" +msgstr "將電子郵件作為多因素認證的一種方式" + +#: settings/serializers/security.py:133 msgid "OTP issuer name" msgstr "OTP 掃描後的名稱" -#: settings/serializers/security.py:132 +#: settings/serializers/security.py:137 msgid "OTP valid window" msgstr "OTP 延遲有效次數" -#: settings/serializers/security.py:136 +#: settings/serializers/security.py:141 msgid "MFA verify TTL" msgstr "MFA 校驗有效期" -#: settings/serializers/security.py:138 +#: settings/serializers/security.py:143 msgid "" "Unit: second, The verification MFA takes effect only when you view the " "account password" msgstr "單位:秒,目前僅在查看帳號密碼校驗 MFA 時生效" -#: settings/serializers/security.py:143 +#: settings/serializers/security.py:148 msgid "MFA in login page" msgstr "MFA 在登入頁面輸入" -#: settings/serializers/security.py:144 +#: settings/serializers/security.py:149 msgid "Eu security regulations(GDPR) require MFA to be on the login page" msgstr "歐盟數據安全法規(GDPR) 要求 MFA 在登入頁面,來確保系統登錄安全" -#: settings/serializers/security.py:148 +#: settings/serializers/security.py:153 msgid "Verify code TTL (second)" msgstr "驗證碼有效時間 (分)" -#: settings/serializers/security.py:149 +#: settings/serializers/security.py:154 msgid "Reset password and send SMS code expiration time" msgstr "重設密碼的驗證碼及發送簡訊的驗證碼過期時間" -#: settings/serializers/security.py:153 +#: settings/serializers/security.py:158 msgid "Login dynamic code" msgstr "啟用登入附加碼" -#: settings/serializers/security.py:154 +#: settings/serializers/security.py:159 msgid "" "The password and additional code are sent to a third party authentication " "system for verification" -msgstr "" -"密碼和附加碼一併發送給第三方認證系統進行校驗, 如:有的第三方認證系統,需要 密" -"碼+6位數字 完成認證" +msgstr "密碼和附加碼一併發送給第三方認證系統進行校驗, 如:有的第三方認證系統,需要 密碼+6位數字 完成認證" -#: settings/serializers/security.py:158 +#: settings/serializers/security.py:163 msgid "Login captcha" msgstr "啟用登入驗證碼" -#: settings/serializers/security.py:159 +#: settings/serializers/security.py:164 msgid "Enable captcha to prevent robot authentication" msgstr "開啟驗證碼,防止機器人登錄" -#: settings/serializers/security.py:162 +#: settings/serializers/security.py:167 msgid "Suspicious Login Verification" msgstr "異地登入通知" -#: settings/serializers/security.py:164 +#: settings/serializers/security.py:169 msgid "" -"The system determines whether the login IP address belongs to a common login " -"city. If the account is logged in from a common login city, the system sends " -"a remote login reminder" -msgstr "" -"根據登錄 IP 是否所屬常用登錄城市進行判斷,若帳號在非常用城市登錄,會發送異地" -"登錄提醒" +"The system determines whether the login IP address belongs to a common login" +" city. If the account is logged in from a common login city, the system " +"sends a remote login reminder" +msgstr "根據登錄 IP 是否所屬常用登錄城市進行判斷,若帳號在非常用城市登錄,會發送異地登錄提醒" -#: settings/serializers/security.py:170 +#: settings/serializers/security.py:175 msgid "Auto Disable Threshold (day)" msgstr "不活躍用戶自動禁用 (天)" -#: settings/serializers/security.py:171 +#: settings/serializers/security.py:176 msgid "" "Detect infrequent users daily and disable them if they exceed the " "predetermined time limit" msgstr "每天檢測一次,超過預設時間的用戶自動禁用" -#: settings/serializers/security.py:191 +#: settings/serializers/security.py:196 msgid "Watermark" msgstr "開啟浮水印" -#: settings/serializers/security.py:192 -msgid "Enabled, the web session and replay contains watermark information" -msgstr "啟用後,Web 會話和錄影將包含浮水印資訊" - -#: settings/serializers/security.py:196 +#: settings/serializers/security.py:200 msgid "Max idle time (minute)" msgstr "連接最大空閒時間 (分)" -#: settings/serializers/security.py:197 +#: settings/serializers/security.py:201 msgid "If idle time more than it, disconnect connection." msgstr "提示:如果超過該配置沒有操作,連接會被斷開" -#: settings/serializers/security.py:200 +#: settings/serializers/security.py:204 msgid "Session expire at browser closed" msgstr "會話在瀏覽器關閉時過期" -#: settings/serializers/security.py:201 +#: settings/serializers/security.py:205 msgid "Whether to expire the session when the user closes their browser." msgstr "當用戶關閉瀏覽器時是否使會話過期。" -#: settings/serializers/security.py:206 +#: settings/serializers/security.py:210 msgid "Allow users to view asset session information" msgstr "允許用戶查看資產在線會話資訊" -#: settings/serializers/security.py:208 +#: settings/serializers/security.py:212 msgid "" "When a user connects to an asset, the account selection popup displays the " "number of active sessions for the current asset (RDP protocol only)." -msgstr "" -"當用戶連接資產時,帳號選擇彈窗中顯示當前資產的在線會話數量(僅 rdp 協議)" +msgstr "當用戶連接資產時,帳號選擇彈窗中顯示當前資產的在線會話數量(僅 rdp 協議)" -#: settings/serializers/security.py:214 +#: settings/serializers/security.py:218 msgid "Max online time (hour)" msgstr "會話連接最大時間 (時)" -#: settings/serializers/security.py:215 +#: settings/serializers/security.py:219 msgid "If session connection time more than it, disconnect connection." msgstr "提示:如果會話連接超過該配置,連接會被斷開" -#: settings/serializers/security.py:218 +#: settings/serializers/security.py:222 msgid "Remember manual auth" msgstr "保存手動輸入密碼" -#: settings/serializers/security.py:221 +#: settings/serializers/security.py:225 #: terminal/templates/terminal/_msg_session_sharing.html:10 msgid "Session share" msgstr "會話分享" -#: settings/serializers/security.py:222 +#: settings/serializers/security.py:226 msgid "Enabled, Allows user active session to be shared with other users" msgstr "開啟後允許用戶分享已連接的資產會話給他人,協同工作" -#: settings/serializers/security.py:228 +#: settings/serializers/security.py:232 msgid "Insecure command alert" msgstr "危險命令告警" -#: settings/serializers/security.py:231 +#: settings/serializers/security.py:235 msgid "Email recipient" msgstr "郵件收件人" -#: settings/serializers/security.py:232 +#: settings/serializers/security.py:236 msgid "Multiple user using , split" msgstr "多個用戶,使用 , 分割" @@ -7615,68 +7552,68 @@ msgstr "[%s] %s" msgid "Auto" msgstr "自動" -#: settings/serializers/terminal.py:22 +#: settings/serializers/terminal.py:23 +msgid "Auto(Enabled for the first 5 minutes after startup, then disabled.)" +msgstr "自動(啟動後前 5 分鐘啟用,然後禁用。)" + +#: settings/serializers/terminal.py:26 msgid "Registration" msgstr "元件註冊" -#: settings/serializers/terminal.py:24 +#: settings/serializers/terminal.py:28 msgid "" -"Allow component register, after all component setup, you should disable this " -"for security" +"Allow component register, after all component setup, you should disable this" +" for security" msgstr "是否允許元件註冊,當所有終端啟動後,為了安全應該關閉" -#: settings/serializers/terminal.py:30 +#: settings/serializers/terminal.py:34 msgid "" "* Allow users to log in to the KoKo component via password authentication" msgstr "* 允許用戶透過密碼驗證登入KoKo元件" -#: settings/serializers/terminal.py:36 +#: settings/serializers/terminal.py:40 msgid "" "* Allow users to log in to the KoKo component via Public key " "authentication
If third-party authentication services, such as AD/LDAP, " -"are enabled, you should disable this option to prevent users from logging in " -"after being deleted from the AD/LDAP server" +"are enabled, you should disable this option to prevent users from logging in" +" after being deleted from the AD/LDAP server" msgstr "" -"* 允許用戶透過公鑰驗證方式登入 KoKo 元件
如果第三方認證服務(如 AD/LDAP)" -"已啟用,則應禁用此選項,以防止用戶從 AD/LDAP 伺服器中刪除後再次登入" +"* 允許用戶透過公鑰驗證方式登入 KoKo 元件
如果第三方認證服務(如 AD/LDAP)已啟用,則應禁用此選項,以防止用戶從 AD/LDAP " +"伺服器中刪除後再次登入" -#: settings/serializers/terminal.py:43 +#: settings/serializers/terminal.py:47 msgid "Asset sorting" msgstr "資產列表排序" -#: settings/serializers/terminal.py:46 +#: settings/serializers/terminal.py:50 msgid "Asset page size" msgstr "資產列表每頁數量" -#: settings/serializers/terminal.py:51 +#: settings/serializers/terminal.py:55 msgid "" -"* You can individually configure the service address and port in the service " -"endpoint
If enabled, the Luna page will display the DB client launch " +"* You can individually configure the service address and port in the service" +" endpoint
If enabled, the Luna page will display the DB client launch " "method when connecting to assets" -msgstr "" -"* 您可以在服務端點中單獨配置服務地址和端口
如果啟用,Luna 界面將在連接資" -"產時顯示 DB 客戶端啟動方法" +msgstr "* 您可以在服務端點中單獨配置服務地址和端口
如果啟用,Luna 界面將在連接資產時顯示 DB 客戶端啟動方法" -#: settings/serializers/terminal.py:59 +#: settings/serializers/terminal.py:63 msgid "" -"* You can individually configure the service address and port in the service " -"endpoint
If enabled, the Luna page will display the download rdp file " +"* You can individually configure the service address and port in the service" +" endpoint
If enabled, the Luna page will display the download rdp file " "button and RDP Client launch method when connecting to assets" msgstr "" -"* 您可以在服務端點中單獨配置服務地址和端口
如果啟用,Luna 界面將在連接資" -"產時顯示下載 rdp 文件按鈕和 RDP 客戶端啟動方法" +"* 您可以在服務端點中單獨配置服務地址和端口
如果啟用,Luna 界面將在連接資產時顯示下載 rdp 文件按鈕和 RDP 客戶端啟動方法" -#: settings/serializers/terminal.py:66 +#: settings/serializers/terminal.py:70 msgid "Client connection" msgstr "客戶端連接" -#: settings/serializers/terminal.py:68 +#: settings/serializers/terminal.py:72 msgid "" "* Allow connecting to the KoKo component via SSH client
If enabled, the " -"Luna page will display the SSH client launch method when connecting to assets" -msgstr "" -"* 允許透過 SSH 客戶端連接到 KoKo 元件
如果啟用,則在連接到資產時,Luna 界" -"面將顯示 SSH 客戶端啟動方法" +"Luna page will display the SSH client launch method when connecting to " +"assets" +msgstr "* 允許透過 SSH 客戶端連接到 KoKo 元件
如果啟用,則在連接到資產時,Luna 界面將顯示 SSH 客戶端啟動方法" #: settings/serializers/tool.py:10 msgid "Tool" @@ -7688,49 +7625,43 @@ msgstr "工作台中的工具" #: settings/serializers/tool.py:15 msgid "" -"*! If enabled, users with RBAC permissions will be able to utilize all tools " -"in the workbench" +"*! If enabled, users with RBAC permissions will be able to utilize all tools" +" in the workbench" msgstr "*! 如果啟用,具有 RBAC 權限的用戶將能夠使用工作台中的所有工具" -#: settings/tasks/ldap.py:73 +#: settings/tasks/ldap.py:67 msgid "Periodic import ldap user" msgstr "週期匯入 LDAP 用戶" -#: settings/tasks/ldap.py:75 settings/tasks/ldap.py:85 +#: settings/tasks/ldap.py:69 settings/tasks/ldap.py:79 msgid "" "When LDAP auto-sync is configured, this task will be invoked to synchronize " "users" msgstr "當設置了LDAP自動同步,將調用該任務進行用戶同步" -#: settings/tasks/ldap.py:83 +#: settings/tasks/ldap.py:77 msgid "Periodic import ldap ha user" msgstr "定期導入 LDAP HA 用戶" -#: settings/tasks/ldap.py:120 +#: settings/tasks/ldap.py:115 msgid "Registration periodic import ldap user task" msgstr "註冊週期匯入 LDAP 用戶 任務" -#: settings/tasks/ldap.py:122 +#: settings/tasks/ldap.py:117 msgid "" -"When LDAP auto-sync parameters change, such as Crontab parameters, the LDAP " -"sync task \n" +"When LDAP auto-sync parameters change, such as Crontab parameters, the LDAP sync task \n" " will be re-registered or updated, and this task will be invoked" -msgstr "" -"當設置了LDAP自動同步參數發生變化時,比如Crontab參數,重新註冊或更新ldap同步任" -"務將調用該任務" +msgstr "當設置了LDAP自動同步參數發生變化時,比如Crontab參數,重新註冊或更新ldap同步任務將調用該任務" -#: settings/tasks/ldap.py:136 +#: settings/tasks/ldap.py:131 msgid "Registration periodic import ldap ha user task" msgstr "註冊定期導入 LDAP HA 用戶 任務" -#: settings/tasks/ldap.py:138 +#: settings/tasks/ldap.py:133 msgid "" -"When LDAP HA auto-sync parameters change, such as Crontab parameters, the " -"LDAP HA sync task \n" +"When LDAP HA auto-sync parameters change, such as Crontab parameters, the LDAP HA sync task \n" " will be re-registered or updated, and this task will be invoked" -msgstr "" -"當 LDAP HA 自動同步參數發生變化時,例如 Crontab 參數,將重新註冊或更新“LDAP " -"HA 同步任務,並調用此任務" +msgstr "當 LDAP HA 自動同步參數發生變化時,例如 Crontab 參數,將重新註冊或更新“LDAP HA 同步任務,並調用此任務" #: settings/templates/ldap/_msg_import_ldap_user.html:2 msgid "Sync task finish" @@ -7748,114 +7679,114 @@ msgstr "已同步用戶" msgid "No user synchronization required" msgstr "沒有用戶需要同步" -#: settings/utils/ldap.py:509 +#: settings/utils/ldap.py:529 msgid "ldap:// or ldaps:// protocol is used." msgstr "使用 ldap:// 或 ldaps:// 協議" -#: settings/utils/ldap.py:520 +#: settings/utils/ldap.py:540 msgid "Host or port is disconnected: {}" msgstr "主機或埠不可連接: {}" -#: settings/utils/ldap.py:522 +#: settings/utils/ldap.py:542 msgid "The port is not the port of the LDAP service: {}" msgstr "埠不是LDAP服務埠: {}" -#: settings/utils/ldap.py:524 +#: settings/utils/ldap.py:544 msgid "Please add certificate: {}" msgstr "請添加證書" -#: settings/utils/ldap.py:528 settings/utils/ldap.py:555 -#: settings/utils/ldap.py:585 settings/utils/ldap.py:613 +#: settings/utils/ldap.py:548 settings/utils/ldap.py:575 +#: settings/utils/ldap.py:605 settings/utils/ldap.py:633 msgid "Unknown error: {}" msgstr "未知錯誤: {}" -#: settings/utils/ldap.py:542 +#: settings/utils/ldap.py:562 msgid "Bind DN or Password incorrect" msgstr "綁定DN或密碼錯誤" -#: settings/utils/ldap.py:549 +#: settings/utils/ldap.py:569 msgid "Please enter Bind DN: {}" msgstr "請輸入綁定DN: {}" -#: settings/utils/ldap.py:551 +#: settings/utils/ldap.py:571 msgid "Please enter Password: {}" msgstr "請輸入密碼: {}" -#: settings/utils/ldap.py:553 +#: settings/utils/ldap.py:573 msgid "Please enter correct Bind DN and Password: {}" msgstr "請輸入正確的綁定DN和密碼: {}" -#: settings/utils/ldap.py:571 +#: settings/utils/ldap.py:591 msgid "Invalid User OU or User search filter: {}" msgstr "不合法的用戶OU或用戶過濾器: {}" -#: settings/utils/ldap.py:602 +#: settings/utils/ldap.py:622 msgid "LDAP User attr map not include: {}" msgstr "LDAP屬性映射沒有包含: {}" -#: settings/utils/ldap.py:609 +#: settings/utils/ldap.py:629 msgid "LDAP User attr map is not dict" msgstr "LDAP屬性映射不合法" -#: settings/utils/ldap.py:628 +#: settings/utils/ldap.py:648 msgid "LDAP authentication is not enabled" msgstr "LDAP認證沒有啟用" -#: settings/utils/ldap.py:646 +#: settings/utils/ldap.py:666 msgid "Error (Invalid LDAP server): {}" msgstr "錯誤 (不合法的LDAP伺服器地址): {}" -#: settings/utils/ldap.py:648 +#: settings/utils/ldap.py:668 msgid "Error (Invalid Bind DN): {}" msgstr "錯誤 (不合法的綁定DN): {}" -#: settings/utils/ldap.py:650 +#: settings/utils/ldap.py:670 msgid "Error (Invalid LDAP User attr map): {}" msgstr "錯誤 (不合法的LDAP屬性映射): {}" -#: settings/utils/ldap.py:652 +#: settings/utils/ldap.py:672 msgid "Error (Invalid User OU or User search filter): {}" msgstr "錯誤 (不合法的用戶OU或用戶過濾器): {}" -#: settings/utils/ldap.py:654 +#: settings/utils/ldap.py:674 msgid "Error (Not enabled LDAP authentication): {}" msgstr "錯誤 (沒有啟用LDAP認證): {}" -#: settings/utils/ldap.py:656 +#: settings/utils/ldap.py:676 msgid "Error (Unknown): {}" msgstr "錯誤 (未知): {}" -#: settings/utils/ldap.py:659 +#: settings/utils/ldap.py:679 msgid "Succeed: Match {} users" msgstr "成功配對 {} 個用戶" -#: settings/utils/ldap.py:689 +#: settings/utils/ldap.py:709 msgid "Authentication failed (configuration incorrect): {}" msgstr "認證失敗 (配置錯誤): {}" -#: settings/utils/ldap.py:693 +#: settings/utils/ldap.py:713 msgid "Authentication failed (username or password incorrect): {}" msgstr "認證失敗 (使用者名稱或密碼不正確): {}" -#: settings/utils/ldap.py:695 +#: settings/utils/ldap.py:715 msgid "Authentication failed (Unknown): {}" msgstr "認證失敗: (未知): {}" -#: settings/utils/ldap.py:698 +#: settings/utils/ldap.py:718 msgid "Authentication success: {}" msgstr "認證成功: {}" -#: settings/ws.py:222 +#: settings/ws.py:223 msgid "No LDAP user was found" msgstr "沒有取得到 LDAP 用戶" -#: settings/ws.py:228 +#: settings/ws.py:232 msgid "Total {}, success {}, failure {}" msgstr "總共 {},成功 {},失敗 {}" -#: templates/_csv_import_export.html:8 -msgid "Export" -msgstr "匯出" +#: settings/ws.py:236 +msgid ", disabled {}" +msgstr ",禁用 {}" #: templates/_csv_import_export.html:13 templates/_csv_import_modal.html:5 #: xpack/plugins/cloud/const.py:65 @@ -7931,9 +7862,7 @@ msgstr "過期。" msgid "" "Your password has expired, please click this link update password." -msgstr "" -"您的密碼已過期,請點擊 連結 更" -"新密碼" +msgstr "您的密碼已過期,請點擊 連結 更新密碼" #: templates/_message.html:26 msgid "Your password will at" @@ -7951,17 +7880,14 @@ msgstr "請點擊 連結 更新 msgid "" "Your information was incomplete. Please click this link to complete your information." -msgstr "" -"您的資訊不完整,請點擊 連結 補充完整" +msgstr "您的資訊不完整,請點擊 連結 補充完整" #: templates/_message.html:48 #, python-format msgid "" "Your ssh public key not set or expired. Please click this link to update" -msgstr "" -"您的SSH金鑰尚未設定或已失效,請點擊 連結 " -" 更新" +msgstr "您的SSH金鑰尚未設定或已失效,請點擊 連結 更新" #: templates/_mfa_login_field.html:31 #: users/templates/users/forgot_password.html:101 @@ -7991,9 +7917,7 @@ msgstr "用戶端" msgid "" "JumpServer Client, currently used to launch the client, now only support " "launch RDP SSH client, The Telnet client will next" -msgstr "" -"JumpServer 用戶端,目前用來喚起 特定用戶端程序 連接資產, 目前僅支持 RDP SSH " -"用戶端,Telnet 會在未來支持" +msgstr "JumpServer 用戶端,目前用來喚起 特定用戶端程序 連接資產, 目前僅支持 RDP SSH 用戶端,Telnet 會在未來支持" #: templates/resource_download.html:35 msgid "Microsoft" @@ -8069,7 +7993,7 @@ msgstr "測試成功" msgid "Test failure: Please check configuration" msgstr "測試失敗:請檢查配置" -#: terminal/api/component/terminal.py:57 +#: terminal/api/component/terminal.py:56 msgid "Have online sessions" msgstr "有在線會話" @@ -8249,7 +8173,7 @@ msgstr "版本" msgid "Can concurrent" msgstr "可以並發" -#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:179 +#: terminal/models/applet/applet.py:49 terminal/serializers/applet_host.py:194 #: terminal/serializers/storage.py:193 msgid "Hosts" msgstr "主機" @@ -8271,12 +8195,12 @@ msgstr "只支持自訂平台" msgid "Missing type in platform.yml" msgstr "在 platform.yml 中缺少類型" -#: terminal/models/applet/applet.py:330 terminal/models/applet/host.py:36 +#: terminal/models/applet/applet.py:371 terminal/models/applet/host.py:36 #: terminal/models/applet/host.py:138 msgid "Hosting" msgstr "宿主機" -#: terminal/models/applet/applet.py:336 +#: terminal/models/applet/applet.py:377 msgid "Applet Publication" msgstr "應用發布" @@ -8353,18 +8277,22 @@ msgid "SQLServer port" msgstr "SQLServer 埠" #: terminal/models/component/endpoint.py:25 +msgid "Oracle port" +msgstr "Oracle 埠" + +#: terminal/models/component/endpoint.py:26 msgid "VNC port" msgstr "VNC 端口" -#: terminal/models/component/endpoint.py:33 -#: terminal/models/component/endpoint.py:120 -#: terminal/serializers/endpoint.py:80 terminal/serializers/storage.py:41 +#: terminal/models/component/endpoint.py:34 +#: terminal/models/component/endpoint.py:114 +#: terminal/serializers/endpoint.py:61 terminal/serializers/storage.py:41 #: terminal/serializers/storage.py:53 terminal/serializers/storage.py:83 #: terminal/serializers/storage.py:93 terminal/serializers/storage.py:101 msgid "Endpoint" msgstr "端點" -#: terminal/models/component/endpoint.py:126 +#: terminal/models/component/endpoint.py:120 msgid "Endpoint rule" msgstr "端點規則" @@ -8438,7 +8366,8 @@ msgstr "可以下載會話錄影" msgid "Account ID" msgstr "帳號" -#: terminal/models/session/session.py:39 terminal/models/session/sharing.py:118 +#: terminal/models/session/session.py:39 +#: terminal/models/session/sharing.py:118 msgid "Login from" msgstr "登錄來源" @@ -8487,8 +8416,8 @@ msgstr "操作權限" msgid "Origin" msgstr "來源" -#: terminal/models/session/sharing.py:42 terminal/models/session/sharing.py:100 -#: terminal/notifications.py:279 +#: terminal/models/session/sharing.py:42 +#: terminal/models/session/sharing.py:100 terminal/notifications.py:279 msgid "Session sharing" msgstr "會話分享" @@ -8571,7 +8500,7 @@ msgid "Command and replay storage" msgstr "命令及錄影儲存" #: terminal/notifications.py:258 terminal/tasks.py:212 -#: xpack/plugins/cloud/api.py:160 +#: xpack/plugins/cloud/api.py:175 #: xpack/plugins/cloud/serializers/account.py:121 #: xpack/plugins/cloud/serializers/account.py:123 msgid "Test failure: Account invalid" @@ -8601,19 +8530,15 @@ msgstr "Core 服務地址" #: terminal/serializers/applet_host.py:38 msgid "" " \n" -" Tips: The application release machine communicates with the Core " -"service. \n" -" If the release machine and the Core service are on the same network " -"segment, \n" -" it is recommended to fill in the intranet address, otherwise fill in " -"the current site URL \n" +" Tips: The application release machine communicates with the Core service. \n" +" If the release machine and the Core service are on the same network segment, \n" +" it is recommended to fill in the intranet address, otherwise fill in the current site URL \n" "
\n" " eg: https://172.16.10.110 or https://dev.jumpserver.com\n" " " msgstr "" -"提示:應用發布機和 Core 服務進行通信使用,如果發布機和 Core 服務在同一網段," -"建議填寫內網地址,否則填寫當前站點 URL
例如:https://172.16.10.110 or " -"https://dev.jumpserver.com" +"提示:應用發布機和 Core 服務進行通信使用,如果發布機和 Core 服務在同一網段,建議填寫內網地址,否則填寫當前站點 " +"URL
例如:https://172.16.10.110 or https://dev.jumpserver.com" #: terminal/serializers/applet_host.py:46 terminal/serializers/storage.py:207 msgid "Ignore Certificate Verification" @@ -8626,12 +8551,12 @@ msgstr "已有 RDS 許可證" #: terminal/serializers/applet_host.py:50 msgid "" "If not exist, the RDS will be in trial mode, and the trial period is 120 " -"days. Detail" +"days. Detail" msgstr "" -"如果不存在,RDS將處於試用模式,試用期為 120 天。詳情" +"如果不存在,RDS將處於試用模式,試用期為 120 天。詳情" #: terminal/serializers/applet_host.py:55 msgid "RDS License Server" @@ -8649,9 +8574,7 @@ msgstr "RDS 單用戶單會話" msgid "" "Tips: A RDS user can have only one session at a time. If set, when next " "login connected, previous session will be disconnected." -msgstr "" -"提示:RDS 用戶一次只能有一個會話。如果設定了,當下一次登入連接時,之前的會話" -"將會被斷開" +msgstr "提示:RDS 用戶一次只能有一個會話。如果設定了,當下一次登入連接時,之前的會話將會被斷開" #: terminal/serializers/applet_host.py:65 msgid "RDS Max Disconnection Time (ms)" @@ -8661,9 +8584,7 @@ msgstr "RDS 最大斷開時間(毫秒)" msgid "" "Tips: Set the maximum duration for keeping a disconnected session active on " "the server (log off the session after 60000 milliseconds)." -msgstr "" -"提示:設置某個已斷開連接的會話在伺服器上能保持活動狀態的最長時間(60000 毫秒" -"後註銷會話)" +msgstr "提示:設置某個已斷開連接的會話在伺服器上能保持活動狀態的最長時間(60000 毫秒後註銷會話)" #: terminal/serializers/applet_host.py:72 msgid "RDS Remote App Logoff Time Limit (ms)" @@ -8671,11 +8592,9 @@ msgstr "RDS 遠程應用註銷時間限制(毫秒)" #: terminal/serializers/applet_host.py:74 msgid "" -"Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp " -"programs (0 milliseconds, log off the session immediately)." -msgstr "" -"提示:關閉所有 RemoteApp 程序之後設置 RemoteAPP 會話的註銷時間(0 毫秒,立即" -"註銷會話)" +"Tips: Set the logoff time for RemoteApp sessions after closing all RemoteApp" +" programs (0 milliseconds, log off the session immediately)." +msgstr "提示:關閉所有 RemoteApp 程序之後設置 RemoteAPP 會話的註銷時間(0 毫秒,立即註銷會話)" #: terminal/serializers/applet_host.py:83 terminal/serializers/terminal.py:47 #: terminal/serializers/virtualapp_provider.py:13 @@ -8684,16 +8603,15 @@ msgstr "負載狀態" #: terminal/serializers/applet_host.py:97 msgid "" -"These accounts are used to connect to the published application, the account " -"is now divided into two types, one is dedicated to each account, each user " +"These accounts are used to connect to the published application, the account" +" is now divided into two types, one is dedicated to each account, each user " "has a private account, the other is public, when the application does not " -"support multiple open and the special has been used, the public account will " -"be used to connect" +"support multiple open and the special has been used, the public account will" +" be used to connect" msgstr "" -"這些帳號用於連接髮布的應用,帳號現在分為兩種類型:
一種是專用的,每個用" -"戶都有一個專用帳號。 另一種是公共的,當應用不支持多開且專用的已經被使用時,會" -"使用公共帳號連接;
注意: 如果不開啟自動創建帳號, 當前發布機僅能被指定標" -"簽的資產調度到,默認不會放到調度池中,且需要手動維護帳號" +"這些帳號用於連接髮布的應用,帳號現在分為兩種類型:
一種是專用的,每個用戶都有一個專用帳號。 " +"另一種是公共的,當應用不支持多開且專用的已經被使用時,會使用公共帳號連接;
注意: 如果不開啟自動創建帳號, " +"當前發布機僅能被指定標簽的資產調度到,默認不會放到調度池中,且需要手動維護帳號" #: terminal/serializers/applet_host.py:104 msgid "The number of public accounts created automatically" @@ -8705,18 +8623,17 @@ msgid "" "please set the configuration item CACHE_LOGIN_PASSWORD_ENABLED=true and " "restart the service to enable it." msgstr "" -"優先使用同名帳號連接髮布機。為了安全,需配置文件中開啟配置 " -"CACHE_LOGIN_PASSWORD_ENABLED=true, 修改後重啟服務" +"優先使用同名帳號連接髮布機。為了安全,需配置文件中開啟配置 CACHE_LOGIN_PASSWORD_ENABLED=true, 修改後重啟服務" -#: terminal/serializers/applet_host.py:149 +#: terminal/serializers/applet_host.py:164 msgid "Install applets" msgstr "安裝應用" -#: terminal/serializers/applet_host.py:179 +#: terminal/serializers/applet_host.py:194 msgid "Host ID" msgstr "主機 ID" -#: terminal/serializers/applet_host.py:180 +#: terminal/serializers/applet_host.py:195 msgid "Applet ID" msgstr "遠程應用 ID" @@ -8744,43 +8661,25 @@ msgstr "無效的 Session ID" msgid "Timestamp" msgstr "時間戳" -#: terminal/serializers/endpoint.py:15 -msgid "Oracle port" -msgstr "Oracle 埠" - -#: terminal/serializers/endpoint.py:18 -msgid "Oracle port range" -msgstr "Oracle 埠範圍" - -#: terminal/serializers/endpoint.py:20 -msgid "" -"Oracle proxy server listen port is dynamic, Each additional Oracle database " -"instance adds a port listener" -msgstr "" -"Oracle 代理伺服器監聽埠是動態的,每增加一個 Oracle 資料庫實例,就會增加一個埠" -"監聽" - -#: terminal/serializers/endpoint.py:38 +#: terminal/serializers/endpoint.py:26 msgid "" "The host address accessed when connecting to assets, if it is empty, the " "access address of the current browser will be used (the default endpoint " "does not allow modification of the host)" -msgstr "" -"連接資產時訪問的主機地址,如果為空則使用當前瀏覽器的訪問地址 (默認端點不允許" -"修改主機)" +msgstr "連接資產時訪問的主機地址,如果為空則使用當前瀏覽器的訪問地址 (默認端點不允許修改主機)" -#: terminal/serializers/endpoint.py:71 +#: terminal/serializers/endpoint.py:52 msgid "" -"The assets within this IP range, the following endpoint will be used for the " -"connection" +"The assets within this IP range, the following endpoint will be used for the" +" connection" msgstr "該 IP 範圍內的資產,將使用下面的端點進行連接" -#: terminal/serializers/endpoint.py:72 +#: terminal/serializers/endpoint.py:53 msgid "" "If asset IP addresses under different endpoints conflict, use asset labels" msgstr "如果不同端點下的資產 IP 有衝突,使用資產標籤實現" -#: terminal/serializers/endpoint.py:76 +#: terminal/serializers/endpoint.py:57 msgid "Asset IP" msgstr "資產 IP" @@ -8865,8 +8764,8 @@ msgid "" "If there are multiple hosts, use a comma (,) to separate them.
(For " "example: http://www.jumpserver.a.com:9100, http://www.jumpserver.b.com:9100)" msgstr "" -"如果有多個主機,請用逗號 (,) 分隔它們。
(例如:http://www.jumpserver.a." -"com:9100,http://www.jumpserver.b.com:9100)" +"如果有多個主機,請用逗號 (,) " +"分隔它們。
(例如:http://www.jumpserver.a.com:9100,http://www.jumpserver.b.com:9100)" #: terminal/serializers/storage.py:199 msgid "Index by date" @@ -9041,8 +8940,7 @@ msgstr "清除離線會話" #: terminal/tasks.py:45 msgid "" -"Check every 10 minutes for asset connection sessions that have been inactive " -"for 3 \n" +"Check every 10 minutes for asset connection sessions that have been inactive for 3 \n" " minutes and mark these sessions as completed" msgstr "每10分鐘檢查3分鐘未活躍的資產連接會話,將這些會話標記為已完成" @@ -9052,11 +8950,9 @@ msgstr "上傳會話錄影到外部儲存" #: terminal/tasks.py:70 terminal/tasks.py:104 msgid "" -"If SERVER_REPLAY_STORAGE is configured in the config.txt, session commands " -"and \n" +"If SERVER_REPLAY_STORAGE is configured in the config.txt, session commands and \n" " recordings will be uploaded to external storage" -msgstr "" -"如果設置了SERVER_REPLAY_STORAGE,將通過文件管理上傳的文件同步到外部存儲" +msgstr "如果設置了SERVER_REPLAY_STORAGE,將通過文件管理上傳的文件同步到外部存儲" #: terminal/tasks.py:102 msgid "Upload session replay part file to external storage" @@ -9068,8 +8964,7 @@ msgstr "運行應用機部署" #: terminal/tasks.py:126 msgid "" -"When deploying from the remote application publisher details page, and the " -"'Deploy' \n" +"When deploying from the remote application publisher details page, and the 'Deploy' \n" " button is clicked, this task will be executed" msgstr "發布機部署,點擊部署時,執行該任務" @@ -9079,8 +8974,7 @@ msgstr "安裝應用" #: terminal/tasks.py:140 msgid "" -"When the 'Deploy' button is clicked in the 'Remote Application' section of " -"the remote \n" +"When the 'Deploy' button is clicked in the 'Remote Application' section of the remote \n" " application publisher details page, this task will be executed" msgstr "當遠程應用發布機詳情-遠程應用,點擊部署時,執行該任務" @@ -9090,8 +8984,7 @@ msgstr "卸載應用" #: terminal/tasks.py:155 msgid "" -"When the 'Uninstall' button is clicked in the 'Remote Application' section " -"of the \n" +"When the 'Uninstall' button is clicked in the 'Remote Application' section of the \n" " remote application publisher details page, this task will be executed" msgstr "當遠程應用發布機詳情-遠程應用,點擊卸載時,執行該任務" @@ -9101,8 +8994,7 @@ msgstr "收集遠程應用上的帳號" #: terminal/tasks.py:170 msgid "" -"When a remote publishing server is created and an account needs to be " -"created \n" +"When a remote publishing server is created and an account needs to be created \n" " automatically, this task will be executed" msgstr "當創建遠程發布機後,需要自動創建帳號時,執行該任務" @@ -9112,39 +9004,15 @@ msgstr "檢查命令及錄影儲存可連接性 " #: terminal/tasks.py:186 msgid "" -"Check every day at midnight whether the external storage for commands and " -"recordings \n" -" is accessible. If it is not accessible, send a notification to the " -"recipients specified \n" -" in 'System Settings - Notifications - Subscription - Storage - " -"Connectivity'" -msgstr "" -"每天淩晨0點檢查命令及錄像外部存儲是否可連接,如不可連接則發送給:系統設置-通" -"知設置-消息訂閱-命令及錄像存儲設置的接收人" +"Check every day at midnight whether the external storage for commands and recordings \n" +" is accessible. If it is not accessible, send a notification to the recipients specified \n" +" in 'System Settings - Notifications - Subscription - Storage - Connectivity'" +msgstr "每天淩晨0點檢查命令及錄像外部存儲是否可連接,如不可連接則發送給:系統設置-通知設置-消息訂閱-命令及錄像存儲設置的接收人" #: terminal/templates/terminal/_msg_command_alert.html:10 msgid "view" msgstr "查看" -#: terminal/utils/db_port_mapper.py:88 -msgid "" -"No available port is matched. The number of databases may have exceeded the " -"number of ports open to the database agent service, Contact the " -"administrator to open more ports." -msgstr "" -"未匹配到可用埠,資料庫的數量可能已經超過資料庫代理服務開放的埠數量,請聯系管" -"理員開放更多埠。" - -#: terminal/utils/db_port_mapper.py:116 -msgid "" -"No ports can be used, check and modify the limit on the number of ports that " -"Magnus listens on in the configuration file." -msgstr "沒有埠可以使用,檢查並修改配置文件中 Magnus 監聽的埠數量限制。" - -#: terminal/utils/db_port_mapper.py:118 -msgid "All available port count: {}, Already use port count: {}" -msgstr "所有可用埠數量:{},已使用埠數量:{}" - #: tickets/api/ticket.py:88 tickets/models/ticket/general.py:289 msgid "Applicant" msgstr "申請人" @@ -9201,8 +9069,7 @@ msgstr "工單已經關閉" msgid "" "Created by the ticket ticket title: {} ticket applicant: {} ticket " "processor: {} ticket ID: {}" -msgstr "" -"通過工單創建, 工單標題: {}, 工單申請人: {}, 工單處理人: {}, 工單 ID: {}" +msgstr "通過工單創建, 工單標題: {}, 工單申請人: {}, 工單處理人: {}, 工單 ID: {}" #: tickets/handlers/base.py:84 msgid "Change field" @@ -9551,9 +9418,7 @@ msgid "" "When enabled, you will enter the MFA binding process the next time you log " "in. you can also directly bind in \"personal information -> quick " "modification -> change MFA Settings\"!" -msgstr "" -"啟用之後您將會在下次登錄時進入多因子認證綁定流程;您也可以在 (個人資訊->快速" -"修改->設置 MFA 多因子認證)中直接綁定!" +msgstr "啟用之後您將會在下次登錄時進入多因子認證綁定流程;您也可以在 (個人資訊->快速修改->設置 MFA 多因子認證)中直接綁定!" #: users/forms/profile.py:60 msgid "* Enable MFA to make the account more secure." @@ -9561,12 +9426,10 @@ msgstr "* 啟用 MFA 多因子認證,使帳號更加安全。" #: users/forms/profile.py:69 msgid "" -"In order to protect you and your company, please keep your account, password " -"and key sensitive information properly. (for example: setting complex " +"In order to protect you and your company, please keep your account, password" +" and key sensitive information properly. (for example: setting complex " "password, enabling MFA)" -msgstr "" -"為了保護您和公司的安全,請妥善保管您的帳號、密碼和金鑰等重要敏感資訊; (如:" -"設置複雜密碼,並啟用 MFA 多因子認證)" +msgstr "為了保護您和公司的安全,請妥善保管您的帳號、密碼和金鑰等重要敏感資訊; (如:設置複雜密碼,並啟用 MFA 多因子認證)" #: users/forms/profile.py:76 msgid "Finish" @@ -9727,8 +9590,8 @@ msgstr "終端主題名稱" #: users/serializers/preference/lina.py:12 msgid "" "*! The password for file encryption, used for decryption when the system " -"sends emails containing file attachments.
Such as: account backup files, " -"account password change results files" +"sends emails containing file attachments.
Such as: account backup files," +" account password change results files" msgstr "" "File Encryption Password, when the system sends mails containing file " "attachments, use this password for decryption.
For example: Account " @@ -9781,9 +9644,7 @@ msgid "" "Determines whether the client computer should scale the content on the " "remote computer to fit the window size of the client computer when the " "window is resized." -msgstr "" -"確定調整窗口大小時用戶端計算機是否應縮放遠程計算機上的內容以適應用戶端計算機" -"的窗口大小" +msgstr "確定調整窗口大小時用戶端計算機是否應縮放遠程計算機上的內容以適應用戶端計算機的窗口大小" #: users/serializers/preference/luna.py:59 msgid "Remote app connect method" @@ -9813,7 +9674,7 @@ msgstr "命令行" msgid "The old password is incorrect" msgstr "舊密碼錯誤" -#: users/serializers/profile.py:37 users/serializers/profile.py:148 +#: users/serializers/profile.py:37 users/serializers/profile.py:156 msgid "Password does not match security rules" msgstr "密碼不滿足安全規則" @@ -9827,10 +9688,11 @@ msgstr "系統角色" #: users/serializers/user.py:55 msgid "" -"System roles are roles at the system level, and they will take effect across " -"all organizations" +"System roles are roles at the system level, and they will take effect across" +" all organizations" msgstr "" -"System role is a system-level role, it will be effective in all organizations" +"System role is a system-level role, it will be effective in all " +"organizations" #: users/serializers/user.py:61 msgid "Org roles" @@ -9841,8 +9703,8 @@ msgid "" "Org roles are roles at the organization level, and they will only take " "effect within current organization" msgstr "" -"Organization role is an organization-level role, it is only effective within " -"the current organization" +"Organization role is an organization-level role, it is only effective within" +" the current organization" #: users/serializers/user.py:70 msgid "Organizations and roles" @@ -9906,8 +9768,8 @@ msgid "" "other sources.There are security settings that can restrict users to log in " "to the system only from the sources." msgstr "" -"User origin identifies the location where the user was created. It can be AD " -"or other sources. Security settings can restrict users to log in to the " +"User origin identifies the location where the user was created. It can be AD" +" or other sources. Security settings can restrict users to log in to the " "system only from designated sources." #: users/serializers/user.py:260 @@ -9928,7 +9790,8 @@ msgstr "認證" #: users/serializers/user.py:422 msgid "" -"* For security, only a partial of users is displayed. You can search for more" +"* For security, only a partial of users is displayed. You can search for " +"more" msgstr "" "*For security reasons, only a portion of users is displayed. You can search " "for more" @@ -9940,10 +9803,8 @@ msgstr "名稱重複" #: users/signal_handlers.py:41 msgid "" "The administrator has enabled \"Only allow existing users to log in\", \n" -" and the current user is not in the user list. Please contact the " -"administrator." -msgstr "" -"管理員已開啟'僅允許已存在用戶登錄',當前用戶不在用戶列表中,請聯絡管理員。" +" and the current user is not in the user list. Please contact the administrator." +msgstr "管理員已開啟'僅允許已存在用戶登錄',當前用戶不在用戶列表中,請聯絡管理員。" #: users/signal_handlers.py:177 msgid "Clean up expired user sessions" @@ -9951,11 +9812,9 @@ msgstr "清除過期的用戶會話" #: users/signal_handlers.py:179 msgid "" -"After logging in via the web, a user session record is created. At 2 a.m. " -"every day, \n" +"After logging in via the web, a user session record is created. At 2 a.m. every day, \n" " the system cleans up inactive user devices" -msgstr "" -"使用網頁登錄後,將產生用戶會話在線記錄,每天淩晨2點,清理未在線的用戶設備" +msgstr "使用網頁登錄後,將產生用戶會話在線記錄,每天淩晨2點,清理未在線的用戶設備" #: users/tasks.py:26 msgid "Check password expired" @@ -9963,8 +9822,7 @@ msgstr "校驗密碼已過期" #: users/tasks.py:28 msgid "" -"Check every day at 10 AM whether the passwords of users in the system are " -"expired, \n" +"Check every day at 10 AM whether the passwords of users in the system are expired, \n" " and send a notification 5 days in advance" msgstr "每天上午10點檢查,系統中用戶的密碼是否過期,提前5天發送通知" @@ -9974,14 +9832,10 @@ msgstr "週期校驗密碼過期" #: users/tasks.py:48 msgid "" -"With version iterations, new tasks may be added, or task names and execution " -"times may \n" -" be modified. Therefore, upon system startup, it is necessary to " -"register or update the \n" +"With version iterations, new tasks may be added, or task names and execution times may \n" +" be modified. Therefore, upon system startup, it is necessary to register or update the \n" " parameters of the task that checks if passwords have expired" -msgstr "" -"隨著版本迭代,可能會新增任務或修改任務的名稱、執行時間,因此在系統啟動時,註" -"冊或更新校驗密碼已過期任務的參數" +msgstr "隨著版本迭代,可能會新增任務或修改任務的名稱、執行時間,因此在系統啟動時,註冊或更新校驗密碼已過期任務的參數" #: users/tasks.py:67 msgid "Check user expired" @@ -9989,8 +9843,7 @@ msgstr "校驗用戶已過期" #: users/tasks.py:69 msgid "" -"Check every day at 2 p.m whether the users in the system are expired, and " -"send a \n" +"Check every day at 2 p.m whether the users in the system are expired, and send a \n" " notification 5 days in advance" msgstr "每天下午2點檢查,系統中的用戶是否過期,提前5天發送通知" @@ -10000,14 +9853,10 @@ msgstr "週期檢測用戶過期" #: users/tasks.py:92 msgid "" -"With version iterations, new tasks may be added, or task names and execution " -"times may \n" -" be modified. Therefore, upon system startup, it is necessary to " -"register or update the \n" +"With version iterations, new tasks may be added, or task names and execution times may \n" +" be modified. Therefore, upon system startup, it is necessary to register or update the \n" " parameters of the task that checks if users have expired" -msgstr "" -"隨著版本迭代,可能會新增任務或修改任務的名稱、執行時間,因此在系統啟動時,註" -"冊或更新校驗用戶已過期任務的參數" +msgstr "隨著版本迭代,可能會新增任務或修改任務的名稱、執行時間,因此在系統啟動時,註冊或更新校驗用戶已過期任務的參數" #: users/tasks.py:111 msgid "Check unused users" @@ -10015,14 +9864,10 @@ msgstr "檢查未使用的用戶" #: users/tasks.py:113 msgid "" -"At 2 p.m. every day, according to the configuration in \"System Settings - " -"Security - \n" -" Auth security - Auto disable threshold\" users who have not logged " -"in or whose API keys \n" +"At 2 p.m. every day, according to the configuration in \"System Settings - Security - \n" +" Auth security - Auto disable threshold\" users who have not logged in or whose API keys \n" " have not been used for a long time will be disabled" -msgstr "" -"每天下午2點,根據系統配置-安全設置-不活躍用戶自動禁用配置,對長時間不登錄或" -"api_key不使用的用戶進行禁用" +msgstr "每天下午2點,根據系統配置-安全設置-不活躍用戶自動禁用配置,對長時間不登錄或api_key不使用的用戶進行禁用" #: users/tasks.py:157 msgid "The user has not logged in recently and has been disabled." @@ -10156,8 +10001,8 @@ msgstr "綁定MFA驗證器" #: users/templates/users/user_otp_enable_bind.html:13 msgid "" -"Use the MFA Authenticator application to scan the following qr code for a 6-" -"bit verification code" +"Use the MFA Authenticator application to scan the following qr code for a " +"6-bit verification code" msgstr "使用 MFA 驗證器應用掃描以下二維碼,獲取6位驗證碼" #: users/templates/users/user_otp_enable_bind.html:22 @@ -10258,8 +10103,8 @@ msgstr "使用者名稱或密碼無效" #: users/views/profile/reset.py:66 msgid "" -"Non-local users can log in only from third-party platforms and cannot change " -"their passwords: {}" +"Non-local users can log in only from third-party platforms and cannot change" +" their passwords: {}" msgstr "非本地用戶僅允許從第三方平台登錄,不支持修改密碼: {}" #: users/views/profile/reset.py:188 users/views/profile/reset.py:199 @@ -10294,15 +10139,15 @@ msgstr "" "According to the current task configuration, assets that do not conform to " "the \"\" policy will be skipped." -#: xpack/plugins/cloud/api.py:72 +#: xpack/plugins/cloud/api.py:74 msgid "Test connection successful" msgstr "測試成功" -#: xpack/plugins/cloud/api.py:74 +#: xpack/plugins/cloud/api.py:76 msgid "Test connection failed: {}" msgstr "測試連接失敗:{}" -#: xpack/plugins/cloud/api.py:171 +#: xpack/plugins/cloud/api.py:196 msgid "User {} deleted the current resource and released the assets" msgstr "" "User {} deleted the assets that have been released by the current resource" @@ -10487,8 +10332,7 @@ msgstr "同步地區" #: xpack/plugins/cloud/manager.py:133 #, python-format msgid "Get instances of region \"%s\" error, error: %s" -msgstr "" -"An error occurred while getting the instances of Region \"%s\", Error: %s" +msgstr "An error occurred while getting the instances of Region \"%s\", Error: %s" #: xpack/plugins/cloud/manager.py:179 #, python-format @@ -10642,7 +10486,8 @@ msgstr "實例" msgid "Sync instance detail" msgstr "同步實例詳情" -#: xpack/plugins/cloud/models.py:313 xpack/plugins/cloud/serializers/task.py:79 +#: xpack/plugins/cloud/models.py:313 +#: xpack/plugins/cloud/serializers/task.py:79 msgid "Rule relation" msgstr "條件關係" @@ -10698,7 +10543,8 @@ msgstr "規則匹配" msgid "Rule value" msgstr "規則值" -#: xpack/plugins/cloud/models.py:383 xpack/plugins/cloud/serializers/task.py:82 +#: xpack/plugins/cloud/models.py:383 +#: xpack/plugins/cloud/serializers/task.py:82 msgid "Strategy rule" msgstr "條件" @@ -10714,7 +10560,8 @@ msgstr "動作屬性" msgid "Action value" msgstr "動作值" -#: xpack/plugins/cloud/models.py:410 xpack/plugins/cloud/serializers/task.py:85 +#: xpack/plugins/cloud/models.py:410 +#: xpack/plugins/cloud/serializers/task.py:85 msgid "Strategy action" msgstr "動作" @@ -10991,9 +10838,7 @@ msgid "" "The port is used to detect the validity of the IP address. When the " "synchronization task is executed, only the valid IP address will be " "synchronized.
If the port is 0, all IP addresses are valid." -msgstr "" -"埠用來檢測 IP 地址的有效性,在同步任務執行時,只會同步有效的 IP 地址。
如" -"果埠為 0,則表示所有 IP 地址均有效。" +msgstr "埠用來檢測 IP 地址的有效性,在同步任務執行時,只會同步有效的 IP 地址。
如果埠為 0,則表示所有 IP 地址均有效。" #: xpack/plugins/cloud/serializers/account_attrs.py:191 msgid "Hostname prefix" @@ -11026,12 +10871,12 @@ msgstr "實例個數" #: xpack/plugins/cloud/tasks.py:33 #, fuzzy #| msgid "" -#| "Execute this task when manually or scheduled cloud synchronization tasks " -#| "are performed" +#| "Execute this task when manually or scheduled cloud synchronization tasks are" +#| " performed" msgid "" -"Execute this task when manually or scheduled cloud synchronization tasks are " -"performed" -msgstr "手動,定時執行雲同步任務時執行該任務" +"Execute this task when manually or scheduled cloud synchronization tasks are" +" performed" +msgstr "手動或定時雲同步任務執行時執行此任務" #: xpack/plugins/cloud/tasks.py:50 msgid "Period clean sync instance task execution" @@ -11040,20 +10885,14 @@ msgstr "定期清除同步實例任務執行記錄" #: xpack/plugins/cloud/tasks.py:52 #, fuzzy #| msgid "" -#| "Every day, according to the configuration in \"System Settings - Tasks - " -#| "Regular \n" -#| " clean-up - Cloud sync task history retention days\" the system " -#| "will clean up the execution \n" +#| "Every day, according to the configuration in \"System Settings - Tasks - Regular \n" +#| " clean-up - Cloud sync task history retention days\" the system will clean up the execution \n" #| " records generated by cloud synchronization" msgid "" -"Every day, according to the configuration in \"System Settings - Tasks - " -"Regular \n" -" clean-up - Cloud sync task history retention days\" the system will " -"clean up the execution \n" +"Every day, according to the configuration in \"System Settings - Tasks - Regular \n" +" clean-up - Cloud sync task history retention days\" the system will clean up the execution \n" " records generated by cloud synchronization" -msgstr "" -"每天根據系統設定-任務列表-定期清理配置-雲同步記錄配置,對雲同步產生的執行記錄" -"進行清理" +msgstr "每天系統會根據「系統設置-任務-」中的配置定期清理雲同步任務歷史保留天數,對雲同步產生的執行記錄進行清理。" #: xpack/plugins/interface/api.py:52 msgid "Restore default successfully." @@ -11109,6 +10948,45 @@ msgstr "許可證匯入成功" msgid "Invalid license" msgstr "許可證無效" +#~ msgid "Deleting other people's script is not allowed" +#~ msgstr "不允許刪除別人的腳本" + +#~ msgid "Deleting other people's playbook is not allowed" +#~ msgstr "不允許刪除他人的 playbook" + +#, fuzzy +#~ msgid "Directory services" +#~ msgstr "目錄服務" + +#, python-format +#~ msgid "User %s view/export secret" +#~ msgstr "用戶 %s 查看/匯出 了密碼" + +#~ msgid "Enabled, the web session and replay contains watermark information" +#~ msgstr "啟用後,Web 會話和錄影將包含浮水印資訊" + +#~ msgid "Oracle port range" +#~ msgstr "Oracle 埠範圍" + +#~ msgid "" +#~ "Oracle proxy server listen port is dynamic, Each additional Oracle database " +#~ "instance adds a port listener" +#~ msgstr "Oracle 代理伺服器監聽埠是動態的,每增加一個 Oracle 資料庫實例,就會增加一個埠監聽" + +#~ msgid "" +#~ "No available port is matched. The number of databases may have exceeded the " +#~ "number of ports open to the database agent service, Contact the " +#~ "administrator to open more ports." +#~ msgstr "未匹配到可用埠,資料庫的數量可能已經超過資料庫代理服務開放的埠數量,請聯系管理員開放更多埠。" + +#~ msgid "" +#~ "No ports can be used, check and modify the limit on the number of ports that" +#~ " Magnus listens on in the configuration file." +#~ msgstr "沒有埠可以使用,檢查並修改配置文件中 Magnus 監聽的埠數量限制。" + +#~ msgid "All available port count: {}, Already use port count: {}" +#~ msgstr "所有可用埠數量:{},已使用埠數量:{}" + #~ msgid "Password error" #~ msgstr "密碼錯誤" @@ -11128,13 +11006,13 @@ msgstr "許可證無效" #~ msgstr "無弱密碼" #~ msgid "" -#~ "The following is a summary of account backup tasks, please review and " -#~ "handle them" +#~ "The following is a summary of account backup tasks, please review and handle" +#~ " them" #~ msgstr "以下是帳戶備份任務的概要,請查閱並處理。" #~ msgid "" -#~ "The following is a summary of account change secret tasks, please read " -#~ "and process" +#~ "The following is a summary of account change secret tasks, please read and " +#~ "process" #~ msgstr "以下是帳號更改秘密任務的摘要,請閱讀並處理" #~ msgid "" diff --git a/apps/i18n/koko/en.json b/apps/i18n/koko/en.json index 74a5fc5c3..710359f15 100644 --- a/apps/i18n/koko/en.json +++ b/apps/i18n/koko/en.json @@ -1,41 +1,57 @@ { "ActionPerm": "Actions", "Cancel": "Cancel", + "CancelFileUpload": "Cancel file upload", "Clone Connect": "Clone Connect", "Close All Tabs": "Close All Tabs", "Close Current Tab": "Close Current Tab", "Confirm": "Confirm", "ConfirmBtn": "Confirm", + "ConfirmDelete": "Are you sure you want to delete this file?", "Connect": "Connect", "CopyLink": "Copy Link Address and Code", "CopyShareURLSuccess": "Copy Share URL Success", "CreateLink": "Create Share Link", "CreateSuccess": "Success", "Custom Setting": "Custom Setting", + "DangerWarning": "This is a dangerous action", + "Delete": "Delete", "DownArrow": "Down arrow", "Download": "Download", + "DownloadProgress": "Download progress", "DownloadSuccess": "Download success", + "Downloading": "Downloading", "EndFileTransfer": "File transfer end", "ExceedTransferSize": "exceed max transfer size", "Expand": "Expand", "ExpiredTime": "Expired", + "FileListError": "Failed to get file list", + "FileManagement": "File", + "FileManagementExpired": "The current file management session has expired.", + "FileUploadInterrupted": "File upload interrupted", "GetShareUser": "Enter username", "Hotkeys": "Hotkeys", "InputVerifyCode": "Input Verify Code", "JoinShare": "Join Session", "JoinedWithSuccess": "Successfully joined", "KubernetesManagement": "Kubernetes management", + "LastModified": "Last Modified", "LeaveShare": "Leave Session", "LeftArrow": "Left arrow", "LinkAddr": "Link", + "List": "List", "Minute": "Minute", "Minutes": "Minutes", "MustOneFile": "Only support to select one file", "MustSelectOneFile": "Must select one file", + "Name": "Name", + "NewFolder": "New Folder", "NoLink": "No Link", "OnlineUsers": "Online Users", + "OperationSuccessful": "Operation successful", "Paste": "Paste", "PauseSession": "Pause Session", + "PermissionDenied": "Permission denied", "PermissionExpired": "Permission expired", "PermissionValid": "Permission valid", "ReadOnly": "Read-Only", @@ -44,6 +60,7 @@ "Remove": "Remove", "RemoveShareUser": "You have been removed from the shared session.", "RemoveShareUserConfirm": "Are you sure to remove the user from the shared session?", + "Rename": "Rename", "ResumeSession": "Resume Session", "RightArrow": "Right arrow", "Search": "Search", @@ -54,15 +71,19 @@ "Share": "Share", "ShareUser": "ForUser", "ShareUserHelpText": "If left blank, everyone could join the session.", + "Size": "Size", "Sync": "Sync", "SyncUserPreferenceFailed": "Sync user preference failed", "SyncUserPreferenceSuccess": "Sync user preference success", "Theme": "Theme", "ThemeColors": "Theme Colors", "ThemeConfig": "Theme", + "TransferHistory": "Transfer history", + "Type": "Type", "UpArrow": "Up arrow", "Upload": "Upload", "UploadEnd": "Upload completed, please wait for further processing", + "UploadProgress": "Upload progress", "UploadStart": "Upload start", "UploadSuccess": "Upload success", "UploadTips": "Drag file here or click to upload", diff --git a/apps/i18n/koko/es.json b/apps/i18n/koko/es.json index c67d5ced2..2ff426f24 100644 --- a/apps/i18n/koko/es.json +++ b/apps/i18n/koko/es.json @@ -1,41 +1,57 @@ { "ActionPerm": "Permisos de operación", "Cancel": "Cancelar", + "CancelFileUpload": "Cancelar la subida del archivo", "Clone Connect": "Copiar ventana", "Close All Tabs": "Cerrar todo", "Close Current Tab": "Cerrar actual \nColor del tema \nSin dirección \nPegar \nTema \nCerrar todo \nMinuto \nUnirse a compartir \nHas sido removido de la sesión compartida \nIntroduce el nombre de usuario \nPor favor selecciona \nBuscar \nConfirmar \nCrear enlace de compartición \nSubir archivo", "Confirm": "Confirmar", "ConfirmBtn": "Confirmar", + "ConfirmDelete": "¿Está seguro de que desea eliminar este archivo?", "Connect": "Conectar", "CopyLink": "Copiar enlace y código de verificación", "CopyShareURLSuccess": "Dirección de compartición copiada con éxito", "CreateLink": "Crear enlace compartido", "CreateSuccess": "Creación exitosa", "Custom Setting": "Ajustes personalizados", + "DangerWarning": "Esta es una operación peligrosa", + "Delete": "Eliminar", "DownArrow": "Flecha hacia abajo", "Download": "Descargar", + "DownloadProgress": "Progreso de descarga", "DownloadSuccess": "Descarga exitosa", + "Downloading": "Descargando", "EndFileTransfer": "Transferencia de archivos finalizada", "ExceedTransferSize": "Superado el tamaño máximo de transferencia", "Expand": "Expandir", "ExpiredTime": "Fecha de caducidad", + "FileListError": "No se pudo obtener la información de la lista de archivos", + "FileManagement": "Gestión de archivos", + "FileManagementExpired": "La sesión actual de gestión de archivos ha expirado.", + "FileUploadInterrupted": "La subida del archivo se ha interrumpido", "GetShareUser": "Introducir nombre de usuario", "Hotkeys": "Atajos", "InputVerifyCode": "Por favor, ingrese el código de verificación", "JoinShare": "Unirse a la compartición", "JoinedWithSuccess": "Se ha unido con éxito", "KubernetesManagement": "Kubernetes gestión", + "LastModified": "Última fecha de modificación", "LeaveShare": "Salir de compartir", "LeftArrow": "Flecha hacia atrás", "LinkAddr": "Dirección del enlace", + "List": "Lista", "Minute": "Minutos", "Minutes": "Minutos", "MustOneFile": "Solo se puede seleccionar un archivo", "MustSelectOneFile": "Debe seleccionar un archivo", + "Name": "Nombre", + "NewFolder": "Nueva carpeta", "NoLink": "Sin dirección", "OnlineUsers": "Personas en línea", + "OperationSuccessful": "La acción se realizó con éxito", "Paste": "Pegar", "PauseSession": "Pausar esta sesión", + "PermissionDenied": "Sin permiso", "PermissionExpired": "Los permisos han expirado", "PermissionValid": "Permisos válidos", "ReadOnly": "Solo lectura", @@ -44,6 +60,7 @@ "Remove": "Eliminar", "RemoveShareUser": "Has sido eliminado de la sesión compartida", "RemoveShareUserConfirm": "¿Está seguro de que desea eliminar a este usuario?", + "Rename": "Renombrar", "ResumeSession": "Restaurar esta sesión", "RightArrow": "Flecha hacia adelante", "Search": "Buscar", @@ -54,15 +71,19 @@ "Share": "Compartir", "ShareUser": "Compartir usuario", "ShareUserHelpText": "No se ha seleccionado un usuario, lo que permite la entrada de todos", + "Size": "Tamaño", "Sync": "Sincronizar", "SyncUserPreferenceFailed": "Falló la sincronización de ajustes", "SyncUserPreferenceSuccess": "Sincronización de ajustes exitosa", "Theme": "Tema", "ThemeColors": "Color del tema", "ThemeConfig": "Tema", + "TransferHistory": "Transmisión de historial", + "Type": "Tipo", "UpArrow": "Flecha hacia arriba", "Upload": "Subir", "UploadEnd": "La subida ha finalizado, por favor espera el procesamiento posterior", + "UploadProgress": "Progreso de subida", "UploadStart": "Inicio de carga", "UploadSuccess": "Subida exitosa", "UploadTips": "Arrastra el archivo aquí, o haz clic para subir", diff --git a/apps/i18n/koko/ja.json b/apps/i18n/koko/ja.json index d0880fb12..124aaac18 100644 --- a/apps/i18n/koko/ja.json +++ b/apps/i18n/koko/ja.json @@ -1,41 +1,57 @@ { "ActionPerm": "アクション権限", "Cancel": "キャンセル", + "CancelFileUpload": "ファイルアップロードをキャンセルする", "Clone Connect": "ウィンドウをコピー", "Close All Tabs": "すべてを閉じる", "Close Current Tab": "現在を閉じる", "Confirm": "確認", "ConfirmBtn": "確定", + "ConfirmDelete": "このファイルを削除してもよろしいですか?", "Connect": "接続", "CopyLink": "リンクと認証コードのコピー", "CopyShareURLSuccess": "レプリケーション共有住所成功", "CreateLink": "シェアリンクの作成", "CreateSuccess": "作成に成功しました", "Custom Setting": "カスタム設定", + "DangerWarning": "これは危険な操作です", + "Delete": "削除", "DownArrow": "下向き矢印", "Download": "ダウンロード", + "DownloadProgress": "ダウンロード進捗", "DownloadSuccess": "ダウンロードに成功しました", + "Downloading": "ダウンロード中", "EndFileTransfer": "ファイル転送終了", "ExceedTransferSize": "最大転送サイズを超えています", "Expand": "展開", "ExpiredTime": "有効期限", + "FileListError": "ファイルリスト情報の取得に失敗しました", + "FileManagement": "ファイル管理", + "FileManagementExpired": "現在のファイル管理セッションは期限切れです。", + "FileUploadInterrupted": "ファイルアップロードが中断されました", "GetShareUser": "ユーザー名の入力", "Hotkeys": "ショートカットキー", "InputVerifyCode": "認証コードを入力してください", "JoinShare": "共有セッションに参加", "JoinedWithSuccess": "正常に参加しました", "KubernetesManagement": "Kubernetes 管理", + "LastModified": "最終修正時間", "LeaveShare": "共有セッションから退出", "LeftArrow": "戻る矢印", "LinkAddr": "リンク先", + "List": "リスト", "Minute": "分間", "Minutes": "分間", "MustOneFile": "ファイルを1つだけ選択できます", "MustSelectOneFile": "ファイルを選択する必要があります", + "Name": "名前", + "NewFolder": "新しいフォルダー", "NoLink": "住所なし", "OnlineUsers": "オンラインスタッフ", + "OperationSuccessful": "操作成功", "Paste": "貼り付け", "PauseSession": "セッションを一時停止", + "PermissionDenied": "権限がありません", "PermissionExpired": "許可が期限切れになりました", "PermissionValid": "権限は有効です", "ReadOnly": "読み取り専用", @@ -44,6 +60,7 @@ "Remove": "削除", "RemoveShareUser": "あなたはすでに共有セッションから削除されました」という意味です", "RemoveShareUserConfirm": "共有セッションから削除してもよろしいですか?", + "Rename": "再命名", "ResumeSession": "セッションを再開", "RightArrow": "進む矢印", "Search": "検索", @@ -54,15 +71,19 @@ "Share": "シェア", "ShareUser": "共有ユーザー", "ShareUserHelpText": "ユーザーが選択されていません。つまり、すべての人が参加できます。", + "Size": "サイズ", "Sync": "同期", "SyncUserPreferenceFailed": "ユーザー設定の同期に失敗しました", "SyncUserPreferenceSuccess": "ユーザー設定の同期に成功しました", "Theme": "テーマ", "ThemeColors": "テーマカラー", "ThemeConfig": "テーマ", + "TransferHistory": "転送履歴", + "Type": "タイプ", "UpArrow": "上向き矢印", "Upload": "アップロード", "UploadEnd": "アップロードが完了しました。後の処理をお待ちください", + "UploadProgress": "アップロード進捗", "UploadStart": "アップロード開始", "UploadSuccess": "アップロード成功", "UploadTips": "ファイルをここにドラッグするか、アップロードをクリックします", diff --git a/apps/i18n/koko/pt_br.json b/apps/i18n/koko/pt_br.json index 6114abe6b..c8af41f01 100644 --- a/apps/i18n/koko/pt_br.json +++ b/apps/i18n/koko/pt_br.json @@ -1,41 +1,57 @@ { "ActionPerm": "Permissões de ação", "Cancel": "Cancelar", + "CancelFileUpload": "Cancelar upload de arquivo", "Clone Connect": "Copiar janela", "Close All Tabs": "Fechar tudo", "Close Current Tab": "Fechar a atual", "Confirm": "Confirmar", "ConfirmBtn": "Confirmar", + "ConfirmDelete": "Você tem certeza de que deseja excluir este arquivo?", "Connect": "Conectar", "CopyLink": "Copiar link e código", "CopyShareURLSuccess": "Cópia de endereço compartilhado bem sucedida", "CreateLink": "Criar link para compartilhar", "CreateSuccess": "Criado com sucesso", "Custom Setting": "Configurações personalizadas", + "DangerWarning": "Essa é uma operação arriscada", + "Delete": "Excluir", "DownArrow": "Seta para baixo", "Download": "Baixar", + "DownloadProgress": "Progresso do download", "DownloadSuccess": "Download bem-sucedido", + "Downloading": "Baixando", "EndFileTransfer": "Transferência de arquivo concluída", "ExceedTransferSize": "Excede o tamanho máximo de transferência", "Expand": "Expandir", "ExpiredTime": "Período de validade", + "FileListError": "Falha ao obter informações da lista de arquivos", + "FileManagement": "Gerenciamento de Arquivos", + "FileManagementExpired": "A sessão atual de gerenciamento de arquivos expirou.", + "FileUploadInterrupted": "Upload de arquivo interrompido", "GetShareUser": "Digite o nome de usuário", "Hotkeys": "Atalhos", "InputVerifyCode": "Por favor, insira o código de verificação", "JoinShare": "Junte-se ao compartilhamento", "JoinedWithSuccess": "Adicionado com sucesso", "KubernetesManagement": "Kubernetes gerenciar", + "LastModified": "Última data de modificação", "LeaveShare": "Sair do compartilhamento", "LeftArrow": "Seta para trás", "LinkAddr": "Endereço do link", + "List": "Lista", "Minute": "Minutos", "Minutes": "Minutos", "MustOneFile": "Só pode escolher um arquivo", "MustSelectOneFile": "É necessário selecionar um arquivo", + "Name": "Nome", + "NewFolder": "Criar nova pasta", "NoLink": "Sem endereço", "OnlineUsers": "Pessoas online", + "OperationSuccessful": "Ação bem-sucedida", "Paste": "Colar", "PauseSession": "Pausar esta sessão", + "PermissionDenied": "Sem permissão", "PermissionExpired": "Permissão expirada", "PermissionValid": "Permissão válida", "ReadOnly": "Somente leitura", @@ -44,6 +60,7 @@ "Remove": "Remover", "RemoveShareUser": "Você foi removido da sessão compartilhada", "RemoveShareUserConfirm": "Tem certeza de que deseja remover este usuário?", + "Rename": "Renomear", "ResumeSession": "Restaurar esta sessão", "RightArrow": "Seta para frente", "Search": "Pesquisar", @@ -54,15 +71,19 @@ "Share": "Compartilhar", "ShareUser": "Compartilhar usuário", "ShareUserHelpText": "Sem usuário selecionado, permitindo que todos se juntem", + "Size": "Tamanho", "Sync": "Sincronizar", "SyncUserPreferenceFailed": "Falha na configuração de sincronização", "SyncUserPreferenceSuccess": "Configurações sincronizadas com sucesso", "Theme": "Tema", "ThemeColors": "Cor do tema", "ThemeConfig": "Tema", + "TransferHistory": "Histórico de Transferência", + "Type": "Tipo", "UpArrow": "Seta para cima", "Upload": "Upload", "UploadEnd": "O upload foi concluído, aguarde o processamento subsequente", + "UploadProgress": "Progresso do upload", "UploadStart": "Início do upload", "UploadSuccess": "Upload bem sucedido", "UploadTips": "Arraste o arquivo para cá ou clique para fazer o upload", diff --git a/apps/i18n/koko/ru.json b/apps/i18n/koko/ru.json index 9c619d3a2..3ba667c8c 100644 --- a/apps/i18n/koko/ru.json +++ b/apps/i18n/koko/ru.json @@ -1,41 +1,57 @@ { "ActionPerm": "Операционные права", "Cancel": "Отмена", + "CancelFileUpload": "Отменить передачу файла", "Clone Connect": "Скопировать окно", "Close All Tabs": "закрыть все", "Close Current Tab": "Закрыть текущий", "Confirm": "Подтвердить", "ConfirmBtn": "подтвердить", + "ConfirmDelete": "Вы уверены, что хотите удалить этот файл?", "Connect": "Соединение", "CopyLink": "Скопировать ссылку и код подтверждения", "CopyShareURLSuccess": "Успешно скопирован адрес для", "CreateLink": "создать ссылку для общего доступа", "CreateSuccess": "Успешно создано", "Custom Setting": "Настройка по индивидуальным параметрам", + "DangerWarning": "Это опасная операция", + "Delete": "Удалить", "DownArrow": "Стрелка вниз", "Download": "Скачать", + "DownloadProgress": "Прогресс загрузки", "DownloadSuccess": "Скачивание успешно", + "Downloading": "Ведётся загрузка", "EndFileTransfer": "Передача файла завершена", "ExceedTransferSize": "Превышен максимальный размер передачи", "Expand": "Развернуть", "ExpiredTime": "Срок действия", + "FileListError": "Не удалось получить информацию о списке файлов", + "FileManagement": "Управление файлами", + "FileManagementExpired": "Текущая сессия управления файлами истекла.", + "FileUploadInterrupted": "Передача файла прервана", "GetShareUser": "введите имя пользователя", "Hotkeys": "Горячие клавиши", "InputVerifyCode": "Пожалуйста, введите код подтверждения", "JoinShare": "присоединиться к общему доступу", "JoinedWithSuccess": "Успешно присоединился", "KubernetesManagement": "Kubernetes 管理", + "LastModified": "Последнее время изменения", "LeaveShare": "Выйти из общего доступа", "LeftArrow": "Стрелка назад", "LinkAddr": "Адрес ссылки", + "List": "Список", "Minute": "минуты", "Minutes": "минут", "MustOneFile": "Можно выбрать только один файл", "MustSelectOneFile": "Необходимо выбрать файл", + "Name": "Название", + "NewFolder": "Создать папку", "NoLink": "без адреса", "OnlineUsers": "Онлайн участники", + "OperationSuccessful": "Операция выполнена успешно", "Paste": "вставить", "PauseSession": "Приостановить эту сессию", + "PermissionDenied": "Нет разрешения", "PermissionExpired": "Срок действия прав истек", "PermissionValid": "Доступ разрешен", "ReadOnly": "Только для чтения", @@ -44,6 +60,7 @@ "Remove": "Удалить", "RemoveShareUser": "вас удалили из общего сеанса", "RemoveShareUserConfirm": "Вы уверены, что хотите удалить этого пользователя?", + "Rename": "Переименовать", "ResumeSession": "Восстановить эту сессию", "RightArrow": "Стрелка вперед", "Search": "поиск", @@ -54,15 +71,19 @@ "Share": "Поделиться", "ShareUser": "Поделиться с пользователем", "ShareUserHelpText": "Пользователь не выбран, разрешить вход всем", + "Size": "Размер", "Sync": "Синхронизировать", "SyncUserPreferenceFailed": "Ошибка синхронизации настроек", "SyncUserPreferenceSuccess": "Синхронизация настроек выполнена успешно", "Theme": "тему", "ThemeColors": "цвет темы", "ThemeConfig": "Тема", + "TransferHistory": "История передачи", + "Type": "Тип", "UpArrow": "Кнопка вверх", "Upload": "Загрузить", "UploadEnd": "Загрузка завершена, пожалуйста, подождите дальнейшей обработки", + "UploadProgress": "Прогресс передачи", "UploadStart": "Начало загрузки", "UploadSuccess": "Загрузка прошла успешно", "UploadTips": "Перетащите файл сюда или нажмите для загрузки", diff --git a/apps/i18n/koko/zh.json b/apps/i18n/koko/zh.json index d2c9ad124..a8b036801 100644 --- a/apps/i18n/koko/zh.json +++ b/apps/i18n/koko/zh.json @@ -1,41 +1,57 @@ { "ActionPerm": "操作权限", "Cancel": "取消", + "CancelFileUpload": "取消文件上传", "Clone Connect": "复制窗口", "Close All Tabs": "关闭所有", "Close Current Tab": "关闭当前", "Confirm": "确认", "ConfirmBtn": "确定", + "ConfirmDelete": "您确定要删除该文件吗?", "Connect": "连接", "CopyLink": "复制链接及验证码", "CopyShareURLSuccess": "复制分享地址成功", "CreateLink": "创建分享链接", "CreateSuccess": "创建成功", "Custom Setting": "自定义设置", + "DangerWarning": "这是一个危险的操作", + "Delete": "删除", "DownArrow": "向下箭头", "Download": "下载", + "DownloadProgress": "下载进度", "DownloadSuccess": "下载成功", + "Downloading": "正在下载", "EndFileTransfer": "文件传输结束", "ExceedTransferSize": "超过最大传输大小", "Expand": "展开", "ExpiredTime": "有效期限", + "FileListError": "获取文件列表信息失败", + "FileManagement": "文件管理", + "FileManagementExpired": "当前文件管理会话已过期。", + "FileUploadInterrupted": "文件上传中断", "GetShareUser": "输入用户名", "Hotkeys": "快捷键", "InputVerifyCode": "请输入验证码", "JoinShare": "加入共享", "JoinedWithSuccess": "已成功加入", "KubernetesManagement": "Kubernetes 管理", + "LastModified": "最后修改时间", "LeaveShare": "离开共享", "LeftArrow": "后退箭头", "LinkAddr": "链接地址", + "List": "列表", "Minute": "分钟", "Minutes": "分钟", "MustOneFile": "只能选择一个文件", "MustSelectOneFile": "必须选择一个文件", + "Name": "名称", + "NewFolder": "新建文件夹", "NoLink": "无地址", "OnlineUsers": "在线人员", + "OperationSuccessful": "操作成功", "Paste": "粘贴", "PauseSession": "暂停此会话", + "PermissionDenied": "没有权限", "PermissionExpired": "权限已过期", "PermissionValid": "权限有效", "ReadOnly": "只读", @@ -44,6 +60,7 @@ "Remove": "移除", "RemoveShareUser": "你已经被移除共享会话", "RemoveShareUserConfirm": "确定要移除该用户吗?", + "Rename": "重命名", "ResumeSession": "恢复此会话", "RightArrow": "前进箭头", "Search": "搜索", @@ -54,15 +71,19 @@ "Share": "分享", "ShareUser": "分享用户", "ShareUserHelpText": "未选择用户,即允许所有人加入", + "Size": "大小", "Sync": "同步", "SyncUserPreferenceFailed": "同步设置失败", "SyncUserPreferenceSuccess": "同步设置成功", "Theme": "主题", "ThemeColors": "主题颜色", "ThemeConfig": "主题", + "TransferHistory": "传输历史", + "Type": "类型", "UpArrow": "向上箭头", "Upload": "上传", "UploadEnd": "上传已完成,请等待后续处理", + "UploadProgress": "上传进度", "UploadStart": "上传开始", "UploadSuccess": "上传成功", "UploadTips": "将文件拖到此处,或点击上传", diff --git a/apps/i18n/koko/zh_hant.json b/apps/i18n/koko/zh_hant.json index 36985132b..de66e17b3 100644 --- a/apps/i18n/koko/zh_hant.json +++ b/apps/i18n/koko/zh_hant.json @@ -1,41 +1,57 @@ { "ActionPerm": "操作權限", "Cancel": "取消", + "CancelFileUpload": "取消文件上傳", "Clone Connect": "複製視窗", "Close All Tabs": "關閉全部", "Close Current Tab": "關閉當前", "Confirm": "確認", "ConfirmBtn": "確定", + "ConfirmDelete": "您確定要刪除該文件嗎?", "Connect": "連接", "CopyLink": "複製連結及驗證碼", "CopyShareURLSuccess": "複製分享地址成功", "CreateLink": "創建分享連結", "CreateSuccess": "創建成功", "Custom Setting": "自訂設定", + "DangerWarning": "這是一個危險的操作", + "Delete": "刪除", "DownArrow": "向下箭頭", "Download": "下載", + "DownloadProgress": "下載進度", "DownloadSuccess": "下載成功", + "Downloading": "正在下載", "EndFileTransfer": "文件傳輸結束", "ExceedTransferSize": "超過最大傳輸大小", "Expand": "展開", "ExpiredTime": "有效期限", + "FileListError": "獲取文件列表資訊失敗", + "FileManagement": "文件管理", + "FileManagementExpired": "當前文件管理會話已過期。", + "FileUploadInterrupted": "文件上傳中斷", "GetShareUser": "輸入使用者名稱", "Hotkeys": "快速鍵", "InputVerifyCode": "請輸入驗證碼", "JoinShare": "加入共享", "JoinedWithSuccess": "已成功加入", "KubernetesManagement": "Kubernetes 管理", + "LastModified": "最後修改時間", "LeaveShare": "離開共享", "LeftArrow": "後退箭頭", "LinkAddr": "連結地址", + "List": "列表", "Minute": "分鐘", "Minutes": "分鐘", "MustOneFile": "只能選擇一個文件", "MustSelectOneFile": "必須選擇一個文件", + "Name": "名稱", + "NewFolder": "新建文件夾", "NoLink": "無地址", "OnlineUsers": "在線人員", + "OperationSuccessful": "操作成功", "Paste": "貼上", "PauseSession": "暫停此會話", + "PermissionDenied": "沒有權限", "PermissionExpired": "權限已過期", "PermissionValid": "權限有效", "ReadOnly": "只讀", @@ -44,6 +60,7 @@ "Remove": "移除", "RemoveShareUser": "你已經被移除共享會話", "RemoveShareUserConfirm": "確定要移除該用戶嗎?", + "Rename": "重命名", "ResumeSession": "恢復此會話", "RightArrow": "前進箭頭", "Search": "搜尋", @@ -54,15 +71,19 @@ "Share": "分享", "ShareUser": "分享用戶", "ShareUserHelpText": "未選擇用戶,即允許所有人加入", + "Size": "大小", "Sync": "同步", "SyncUserPreferenceFailed": "同步設定失敗", "SyncUserPreferenceSuccess": "同步設定成功", "Theme": "主題", "ThemeColors": "主題顏色", "ThemeConfig": "主題", + "TransferHistory": "傳輸歷史", + "Type": "類型", "UpArrow": "向上箭頭", "Upload": "上傳", "UploadEnd": "上傳已完成,請等待後續處理", + "UploadProgress": "上傳進度", "UploadStart": "上傳開始", "UploadSuccess": "上傳成功", "UploadTips": "將文件拖到此處,或點擊上傳", diff --git a/apps/i18n/lina/en.json b/apps/i18n/lina/en.json index 6f6a7f485..cd3256532 100644 --- a/apps/i18n/lina/en.json +++ b/apps/i18n/lina/en.json @@ -168,6 +168,7 @@ "Assets": "Assets", "AssetsAmount": "Assets", "AssetsOfNumber": "Assets", + "AssetsSelected": " Assets Selected", "AssetsTotal": "Total assets", "AssignedInfo": "Approval information", "Assignee": "Handler", @@ -257,6 +258,7 @@ "CACertificate": "Ca certificate", "CAS": "CAS", "CMPP2": "Cmpp v2.0", + "CTYunPrivate": "eCloud Private Cloud", "CalculationResults": "Error in cron expression", "CallRecords": "Call Records", "CanDragSelect": "Select by dragging; Empty means all selected", @@ -349,6 +351,7 @@ "Configured": "Configured", "Confirm": "Confirm", "ConfirmPassword": "Confirm password", + "ConfirmRunningAssets": "Confirm running assets", "Connect": "Connect", "ConnectAssets": "Access assets", "ConnectMethod": "Connect method", @@ -358,6 +361,7 @@ "ConnectMethodACLHelpText": "Connect methods can be filtered to control whether users can use a certain connect method to login to the asset. according to your set rules, some connect methods can be allowed, while others can be prohibited.", "ConnectMethodACLUpdate": "Update the connect method control", "ConnectMethodACLs": "Connect method ACLs", + "ConnectMethodAclDetail": "Connect method acl detail", "ConnectWebSocketError": "Connection to websocket failed", "Connectable": "Connectable", "ConnectionDropped": "Connection disconnected", @@ -393,11 +397,10 @@ "CriticalLoad": "Serious", "CronExpression": "Complete crontab expression", "Crontab": "Crontab", - "CrontabDiffError": "Please ensure that the interval for scheduled execution is no less than ten minutes!", + "CrontabDiffError": "Please ensure that the interval for scheduled execution is no less than {minutes} minutes!", "CrontabHelpText": "If both interval and crontab are set, crontab is prioritized", "CrontabHelpTip": "For example: perform every sunday at 03:05 <5 3 * * 0>
use 5-digit linux crontab expressions (online tool)
", "CrontabOfCreateUpdatePage": "", - "CTYunPrivate": "eCloud Private Cloud", "CurrentConnectionUsers": "Online users", "CurrentConnections": "Current connections", "CurrentStatus": "Current Status", @@ -448,6 +451,8 @@ "DefaultValue": "Default value", "DefaultValueTip": "Save and execute using default values for scheduled tasks. Not filling in the default values may cause the task to fail", "Delete": "Delete", + "DeleteAccount": "Delete account", + "DeleteBoth": "Delete both", "DeleteConfirmMessage": "Deletion is irreversible, do you wish to continue?", "DeleteErrorMsg": "Delete failed", "DeleteGatherAccountTitle": "Delete gather account", @@ -475,6 +480,7 @@ "DingTalk": "Dingtalk", "DingTalkOAuth": "DingTalk OAuth", "DingTalkTest": "Test", + "DirectoryServiceHelpMessage": "Directory Service is a centralized system for storing, managing, and querying information about network resources. Common implementations include LDAP and Active Directory. In this system, once other assets are associated with a directory service, they will inherit user accounts from it.", "Disable": "Disable", "DisableSelected": "Disable selected", "DisableSuccessMsg": "Successfully disabled", @@ -649,6 +655,7 @@ "Id": "Id", "IdeaContent": "I want you to act as a linux terminal. i will input the commands, you will respond with what the terminal should display. i hope you to reply only in a unique code block, not others. no interpretations. when i need to tell you something, i'm gonna put the words in braces {note text}", "IdeaTitle": "🌱 linux terminal", + "IdentityDomain": "Identity domain", "IdpMetadataHelpText": "Either idp metadata url or idp metadata xml is acceptable, with idp metadata url having higher priority", "IdpMetadataUrlHelpText": "Load idp metadata from remote address", "IgnoreAlert": "Ignore alert", @@ -857,6 +864,7 @@ "NodeInformation": "Node information", "NodeOfNumber": "Number of node", "NodeSearchStrategy": "Node search strategy", + "NonRunnableAssets": "Non-runnable assets", "NormalLoad": "Normal", "NotEqual": "Not equal to", "NotSet": "Not set", @@ -1129,6 +1137,7 @@ "RunasHelpText": "Enter username for running script", "RunasPolicy": "Account policy", "RunasPolicyHelpText": "When there are no users currently running on the asset, what account selection strategy should be adopted. skip: do not execute. prioritize privileged accounts: if there are privileged accounts, select them first; if not, select regular accounts. only privileged accounts: select only from privileged accounts; if none exist, do not execute.", + "RunnableAssets": "Runnable assets", "Running": "Running", "RunningPath": "Running path", "RunningPathHelpText": "Enter the run path of the script, this setting only applies to shell scripts", @@ -1231,7 +1240,7 @@ "SignChannelNum": "Channel signature", "SiteMessage": "Notifications", "SiteMessageList": "Notifications", - "SiteURLTip": "For example: https://demo.jumpserver.org", + "SiteURLTip": "For example: https://demo.example.com", "Skip": "Skip this asset", "Skipped": "Skipped", "Slack": "Slack", @@ -1254,6 +1263,7 @@ "StatusYellow": "There have been recent failures", "Step": "Step", "Stop": "Stop", + "StopJob": "Stop job", "StopJobMsg": "Stop job successfully", "StopLogOutput": "Task Canceled: The current task (currentTaskId) has been manually stopped. Since the progress of each task varies, the following is the final execution result of the task. A failed execution indicates that the task has been successfully stopped.", "Storage": "Storage", @@ -1525,9 +1535,5 @@ "disallowSelfUpdateFields": "Not allowed to modify the current fields yourself", "forceEnableMFAHelpText": "If force enable, user can not disable by themselves", "removeWarningMsg": "Are you sure you want to remove", - "setVariable": "Set variable", - "StopJob": "Stop job", - "ConnectMethodAclDetail": "Connect method acl detail", - "DeleteAccount": "Delete account", - "DeleteBoth": "Delete both" -} + "setVariable": "Set variable" +} \ No newline at end of file diff --git a/apps/i18n/lina/es.json b/apps/i18n/lina/es.json index a1f75bd80..338de72bf 100644 --- a/apps/i18n/lina/es.json +++ b/apps/i18n/lina/es.json @@ -168,6 +168,7 @@ "Assets": "Gestión de activos", "AssetsAmount": "Cantidad de activos", "AssetsOfNumber": "Número de activos", + "AssetsSelected": "Se han seleccionado activos", "AssetsTotal": "Total de activos", "AssignedInfo": "Información de aprobación", "Assignee": "Responsable", @@ -257,6 +258,7 @@ "CACertificate": "Certificado CA", "CAS": "CAS", "CMPP2": "CMPP v2.0", + "CTYunPrivate": "eCloud Nube Privada", "CalculationResults": "Error en la expresión cron", "CallRecords": "Registro de llamadas", "CanDragSelect": "Se puede seleccionar el período de tiempo arrastrando el ratón; no seleccionar es igual a seleccionar todo", @@ -348,6 +350,7 @@ "Configured": "Configurado", "Confirm": "Confirmar", "ConfirmPassword": "Confirmar contraseña", + "ConfirmRunningAssets": "Confirmar activo operativo", "Connect": "Conexión", "ConnectAssets": "Conectar activos", "ConnectMethod": "Método de conexión", @@ -357,6 +360,7 @@ "ConnectMethodACLHelpText": "A través del método de conexión, usted puede controlar si los usuarios pueden acceder al activo usando un determinado método de conexión. Según las reglas que establezca, ciertos métodos de conexión pueden ser permitidos, mientras que otros pueden ser prohibidos.", "ConnectMethodACLUpdate": "Actualizar control de método de conexión", "ConnectMethodACLs": "Método de conexión", + "ConnectMethodAclDetail": "Detalles del método de conexión", "ConnectWebSocketError": "Conexión WebSocket fallida", "Connectable": "Conectar", "ConnectionDropped": "Conexión desconectada", @@ -392,11 +396,10 @@ "CriticalLoad": "Severo", "CronExpression": "Expresión completa de crontab", "Crontab": "Tareas programadas", - "CrontabDiffError": "¡Asegúrese de que el intervalo de tiempo para la ejecución regular no sea inferior a diez minutos!", + "CrontabDiffError": "¡Asegúrese de que el intervalo de tiempo para la ejecución regular no sea inferior a {minutes} minutos!", "CrontabHelpText": "Si se configuran simultáneamente interval y crontab, se prioriza crontab", "CrontabHelpTip": "Por ejemplo: ejecuta cada domingo a las 03:05 <5 3 * * 0>
utilizando una expresión de crontab de Linux de 5 posiciones (herramienta en línea)
", "CrontabOfCreateUpdatePage": "Por ejemplo: ejecuta cada domingo a las 03:05 <5 3 * * 0>
utilizando una expresión de crontab de Linux de 5 posiciones (herramienta en línea)
Si se establecen tanto la ejecución programada como la ejecución cíclica, se dará prioridad a la ejecución programada.", - "CTYunPrivate": "eCloud Nube Privada", "CurrentConnectionUsers": "Número actual de usuarios en la conversación", "CurrentConnections": "Número actual de conexiones", "CurrentStatus": "estado actual", @@ -447,6 +450,8 @@ "DefaultValue": "Valores predeterminados", "DefaultValueTip": "Guardar y ejecutar las tareas programadas con valores por defecto puede llevar a fallos en la ejecución si no se completan dichos valores.", "Delete": "Eliminar", + "DeleteAccount": "Eliminar cuenta", + "DeleteBoth": "Eliminar simultáneamente", "DeleteConfirmMessage": "Una vez eliminado no se puede recuperar, ¿continuar?", "DeleteErrorMsg": "Error al eliminar", "DeleteGatherAccountTitle": "Eliminar la cuenta descubierta", @@ -474,6 +479,7 @@ "DingTalk": "DingTalk", "DingTalkOAuth": "Autenticación DingTalk", "DingTalkTest": "Prueba", + "DirectoryServiceHelpMessage": "El Servicio de Directorio es un servicio utilizado para el almacenamiento centralizado, gestión y consulta de información sobre recursos de red, con implementaciones comunes que incluyen LDAP y Active Directory. Otros activos asociados al servicio de directorio heredarán las cuentas de éste.", "Disable": "Desactivar", "DisableSelected": "Deshabilitar seleccionado", "DisableSuccessMsg": "Desactivación exitosa", @@ -648,6 +654,7 @@ "Id": "ID", "IdeaContent": "Quiero que actúes como un terminal Linux. Introduciré comandos y tú responderás con el contenido que debería mostrar el terminal. Espero que solo respondas en un único bloque de código, sin agregar nada más. No escribas explicaciones. Cuando necesite decirte algo, colocaré el texto entre llaves {texto de nota}.", "IdeaTitle": "🌱 Terminal de Linux", + "IdentityDomain": "Dominio de identidad", "IdpMetadataHelpText": "URL de metadatos IDP y parámetro MetadataXML, sólo uno es necesario; la URL de metadatos IDP tiene mayor prioridad", "IdpMetadataUrlHelpText": "Cargar IDP Metadata desde una dirección remota", "IgnoreAlert": "Ignorar alerta", @@ -856,6 +863,7 @@ "NodeInformation": "Información del nodo", "NodeOfNumber": "Número de nodos", "NodeSearchStrategy": "Estrategia de búsqueda de nodos", + "NonRunnableAssets": "activo no operativo", "NormalLoad": "Normal", "NotEqual": "No igual a", "NotSet": "No configurado", @@ -1130,6 +1138,7 @@ "RunasHelpText": "Introduce el nombre de usuario para ejecutar el script", "RunasPolicy": "política de cuentas", "RunasPolicyHelpText": "Cuando no hay este usuario en la acción actual, se aplicará una estrategia de selección de cuenta. Omitir: no se ejecuta. Priorizar cuenta privilegiada: si hay una cuenta privilegiada, selecciona primero la cuenta privilegiada; si no, selecciona una cuenta normal. Solo cuentas privilegiadas: selecciona únicamente de las cuentas privilegiadas; si no hay, no se ejecuta.", + "RunnableAssets": "activos operativos.", "Running": "En ejecución", "RunningPath": "Ruta de ejecución", "RunningPathHelpText": "Introduzca la ruta de ejecución del script, este ajuste solo es válido para scripts de shell", @@ -1232,7 +1241,7 @@ "SignChannelNum": "Número de canal de firma", "SiteMessage": "Mensaje interno", "SiteMessageList": "Mensaje interno", - "SiteURLTip": "Por ejemplo: https://demo.jumpserver.org", + "SiteURLTip": "Por ejemplo: https://demo.example.com", "Skip": "Ignorar activo actual.", "Skipped": "Saltado", "Slack": "Slack", @@ -1255,6 +1264,7 @@ "StatusYellow": "Recientemente se han producido fallos en la ejecución", "Step": "Pasos", "Stop": "Detener", + "StopJob": "Detener trabajo", "StopJobMsg": "Detención exitosa", "StopLogOutput": "Tarea cancelada: la tarea actual (currentTaskId) ha sido detenida manualmente, dado que el progreso de ejecución de cada tarea es diferente, a continuación se presenta el resultado final de la ejecución, donde la ejecución fallida indica que se ha detenido con éxito la ejecución de la tarea.", "Storage": "Almacenamiento", @@ -1528,4 +1538,4 @@ "forceEnableMFAHelpText": "Si se habilita forzosamente, el usuario no podrá desactivarlo por sí mismo", "removeWarningMsg": "¿Está seguro de que desea eliminar?", "setVariable": "configurar parámetros" -} +} \ No newline at end of file diff --git a/apps/i18n/lina/ja.json b/apps/i18n/lina/ja.json index 0b35f4f53..3583a1b51 100644 --- a/apps/i18n/lina/ja.json +++ b/apps/i18n/lina/ja.json @@ -170,6 +170,7 @@ "Assets": "アセット", "AssetsAmount": "資産数", "AssetsOfNumber": "アセット数", + "AssetsSelected": "選択したアセット数", "AssetsTotal": "総資産数", "AssignedInfo": "承認情報", "Assignee": "処理者", @@ -261,6 +262,7 @@ "CACertificate": "CA 証明書", "CAS": "CAS", "CMPP2": "CMPP v2.0", + "CTYunPrivate": "イークラウド・プライベートクラウド", "CalculationResults": "cron 式のエラー", "CallRecords": "つうわきろく", "CanDragSelect": "マウスドラッグで時間帯を選択可能;未選択は全選択と同じです", @@ -352,6 +354,7 @@ "Configured": "設定済み", "Confirm": "確認", "ConfirmPassword": "パスワードの確認", + "ConfirmRunningAssets": "確認したアセット", "Connect": "接続", "ConnectAssets": "接続資産", "ConnectMethod": "接続方法", @@ -361,6 +364,7 @@ "ConnectMethodACLHelpText": "接続方法のフィルタリングにより、ユーザーが特定の接続方法を使用して資産にログインできるかどうかを制御できます。設定したルールにより、いくつかの接続方法は許可され、他の接続方法は禁止されます。", "ConnectMethodACLUpdate": "接続方法のコントロールを更新", "ConnectMethodACLs": "接続方法", + "ConnectMethodAclDetail": "接続方法の詳細", "ConnectWebSocketError": "WebSocketへの接続に失敗", "Connectable": " 接続可能", "ConnectionDropped": "接続が切断された", @@ -396,11 +400,10 @@ "CriticalLoad": "重大", "CronExpression": "crontab完全表現", "Crontab": "定時実行タスク", - "CrontabDiffError": "定期実行の間隔が10分以上であることをご確認ください!", + "CrontabDiffError": "定期実行の間隔が{minutes}分以上であることをご確認ください!", "CrontabHelpText": "同時にintervalとcrontabを設定した場合、crontabが優先されます", - "CrontabHelpTip": "例えば:日曜日の03:05に実行 <5 3 * * 0>
5桁のlinux crontab表現を使用 (オンラインツール)
", + "CrontabHelpTip": "例えば:日曜日の03:05に実行 <5 3 * * 0>
5桁のlinux crontab表現を使用 (オンラインツール)
", "CrontabOfCreateUpdatePage": "例:毎週日曜日の03:05に実行 <5 3 * * 0>
5桁のLinux crontab表現を使用してください <分 時 日 月 星期> (オンラインツール)
定期的な実行と周期的な実行が設定されている場合、定期的な実行が優先されます", - "CTYunPrivate": "イークラウド・プライベートクラウド", "CurrentConnectionUsers": "現在のセッションユーザー数", "CurrentConnections": "現在のコネクション数", "CurrentStatus": "現在の状態", @@ -452,6 +455,8 @@ "DefaultValue": "デフォルト値", "DefaultValueTip": "デフォルト値を使用して、保存、実行、定期的なタスクを実行します。デフォルト値を記入しないと、タスクの実行に失敗する可能性があります。", "Delete": "削除", + "DeleteAccount": "アカウントの削除", + "DeleteBoth": "同時に削除する", "DeleteConfirmMessage": "一度削除すると復元はできません、続けますか?", "DeleteErrorMsg": "削除に失敗", "DeleteGatherAccountTitle": "発見されたアカウントの削除", @@ -479,6 +484,7 @@ "DingTalk": "ディーングトーク", "DingTalkOAuth": "ディンディン認証", "DingTalkTest": "テスト", + "DirectoryServiceHelpMessage": "ディレクトリサービスは、ネットワークリソース情報を集中管理・保存・照会するためのサービスであり、一般的な実装にはLDAPやActive Directoryが含まれます。他のアセットがディレクトリサービスに関連付けられると、ディレクトリサービスからアカウントを継承します。", "Disable": "無効化", "DisableSelected": "選択を無効にする", "DisableSuccessMsg": "無効化成功", @@ -653,6 +659,7 @@ "Id": "ID", "IdeaContent": "あなたがLinuxターミナルとして機能することを望んでいます。私はコマンドを入力し、あなたはターミナルが表示すべき内容を回答します。ターミナルの出力はユニークなコードブロック内でだけ応答してほしい、その他ではない。説明を書かないでください。何かをあなたに伝える必要があるとき、私はテキストを大括弧{備考テキスト}の中に置きます。", "IdeaTitle": "🌱 Linux 端末", + "IdentityDomain": "アイデンティティ領域", "IdpMetadataHelpText": "IDP Metadata URLとIDP MetadataXMLのパラメータのうち、一つだけ選択すればよいです。 IDP Metadata URLは優先順位が高い", "IdpMetadataUrlHelpText": "IDP Metadataをリモートアドレスから読み込むのを拒否", "IgnoreAlert": "アラートを無視", @@ -861,6 +868,7 @@ "NodeInformation": "ノード情報", "NodeOfNumber": "ノード数", "NodeSearchStrategy": "ノード検索戦略", + "NonRunnableAssets": "稼働不可アセット", "NormalLoad": "正常", "NotEqual": "等しくない", "NotSet": "設定されていません", @@ -1135,6 +1143,7 @@ "RunasHelpText": "実行スクリプトのユーザー名を入力してください", "RunasPolicy": "アカウント戦略", "RunasPolicyHelpText": "現在の資産にはこの実行ユーザーがいない場合、どのアカウント選択戦略を採用するか。スキップ:実行しない。特権アカウントを優先:特権アカウントがあれば最初に特権アカウントを選び、なければ一般アカウントを選ぶ。特権アカウントのみ:特権アカウントからのみ選択し、なければ実行しない", + "RunnableAssets": "稼働可能アセット", "Running": "実行中", "RunningPath": "実行パス", "RunningPathHelpText": "スクリプトの実行パスを記入してください、この設定はシェルスクリプトのみ有効です", @@ -1237,7 +1246,7 @@ "SignChannelNum": "署名チャネル番号", "SiteMessage": "内部メール", "SiteMessageList": "内部メール", - "SiteURLTip": "例えば:https://demo.jumpserver.org", + "SiteURLTip": "例えば:https://demo.example.com", "Skip": "現在の資産を無視する", "Skipped": "スキップ済み", "Slack": "Slack", @@ -1260,6 +1269,7 @@ "StatusYellow": "最近、実行に失敗があり。", "Step": "ステップ", "Stop": "停止", + "StopJob": "作業の停止", "StopJobMsg": "成功を停止", "StopLogOutput": "ask Canceled:現在のタスク(currentTaskId)は手動で停止されました。各タスクの進行状況が異なるため、以下はタスクの最終実行結果です。実行が失敗した場合は、タスクが正常に停止されました。", "Storage": "ストレージ", @@ -1533,4 +1543,4 @@ "forceEnableMFAHelpText": "強制的に有効化すると、ユーザーは自分で無効化することができません。", "removeWarningMsg": "削除してもよろしいですか", "setVariable": "パラメータ設定" -} +} \ No newline at end of file diff --git a/apps/i18n/lina/pt_br.json b/apps/i18n/lina/pt_br.json index eaab7ce7d..2ef6bef41 100644 --- a/apps/i18n/lina/pt_br.json +++ b/apps/i18n/lina/pt_br.json @@ -168,6 +168,7 @@ "Assets": "Gestão de ativos", "AssetsAmount": "Número de ativos", "AssetsOfNumber": "Número de ativos", + "AssetsSelected": "Ativos selecionados", "AssetsTotal": "Total de ativos", "AssignedInfo": "Informações de Aprovação", "Assignee": "Handler", @@ -258,6 +259,7 @@ "CACertificate": " Certificado CA", "CAS": "CAS", "CMPP2": "CMPP v2.0", + "CTYunPrivate": " eCloud Nuvem Privada", "CalculationResults": "Erro de expressão cron", "CallRecords": "Registro de chamadas", "CanDragSelect": "Você pode selecionar o intervalo de tempo arrastando o mouse; não selecionar é equivalente a selecionar tudo", @@ -349,6 +351,7 @@ "Configured": "Configurado", "Confirm": "Confirmar", "ConfirmPassword": "Confirmar senha", + "ConfirmRunningAssets": "Confirmar ativos em funcionamento", "Connect": "Conectar", "ConnectAssets": "Conectar ativos", "ConnectMethod": "Método de Conexão", @@ -358,6 +361,7 @@ "ConnectMethodACLHelpText": "Através do filtro por método de conexão, você pode controlar se os usuários podem usar um determinado método para acessar os recursos. De acordo com as regras que você configura, alguns métodos de conexão podem ser permitidos, enquanto outros podem ser proibidos.", "ConnectMethodACLUpdate": "Atualizar controle de método de conexão", "ConnectMethodACLs": "Método de conexão", + "ConnectMethodAclDetail": "Detalhes da forma de conexão", "ConnectWebSocketError": "Falha ao conectar WebSocket", "Connectable": " Conexão disponível", "ConnectionDropped": "Conexão interrompida", @@ -393,11 +397,10 @@ "CriticalLoad": "Grave", "CronExpression": "Expressão Completa do Crontab", "Crontab": "Tarefas programadas", - "CrontabDiffError": "Por favor, certifique-se de que o intervalo de tempo para execução regular não seja menor que dez minutos!", + "CrontabDiffError": "Por favor, certifique-se de que o intervalo de tempo para execução regular não seja menor que {minutes} minutos!", "CrontabHelpText": "Se interval e crontab estiverem configurados ao mesmo tempo, crontab terá prioridade", - "CrontabHelpTip": "Por exemplo: execute todos os domingos às 03:05 <5 3 * * 0>
Use a expressão linux crontab de 5 posições (Ferramenta online)
", + "CrontabHelpTip": "Por exemplo: execute todos os domingos às 03:05 <5 3 * * 0>
Use a expressão linux crontab de 5 posições (Ferramenta online)
", "CrontabOfCreateUpdatePage": "Por exemplo: Execute todos os domingos às 03:05 <5 3 * * 0>
Use a expressão crontab Linux de 5 dígitos (Ferramenta online)
Se a execução periódica e a execução regular forem definidas ao mesmo tempo, a execução regular terá prioridade", - "CTYunPrivate": " eCloud Nuvem Privada", "CurrentConnectionUsers": "Número atual de usuários na sessão", "CurrentConnections": "Número atual de conexões", "CurrentStatus": "Estado atual", @@ -448,6 +451,8 @@ "DefaultValue": " Valor padrão", "DefaultValueTip": " Salvar e executar tarefas agendadas usando valores padrão. Não preencher os valores padrão pode levar à falha na execução da tarefa. ", "Delete": "Excluir", + "DeleteAccount": "Excluir conta", + "DeleteBoth": "Ao mesmo tempo, excluir os detalhes do método de conexão, interromper o trabalho e apagar a conta.", "DeleteConfirmMessage": "A exclusão não pode ser revertida, você quer continuar?", "DeleteErrorMsg": " Falha na exclusão ", "DeleteGatherAccountTitle": "Excluir conta encontrada", @@ -475,6 +480,7 @@ "DingTalk": "DingTalk", "DingTalkOAuth": "Autenticação DingDing", "DingTalkTest": "Teste", + "DirectoryServiceHelpMessage": "O serviço de Diretório (Directory Service) é uma ferramenta destinada ao armazenamento, gerenciamento e consulta centralizada das informações de recursos da rede. As implementações mais comuns incluem LDAP e Active Directory. Outros ativos que estão associados ao serviço de diretório herdarão as contas desse serviço.", "Disable": "Desativado", "DisableSelected": "Desativar selecionado", "DisableSuccessMsg": "Desativado com sucesso", @@ -649,6 +655,7 @@ "Id": "ID", "IdeaContent": "Quero que você atue como um terminal Linux. Vou digitar comandos, e você responderá o que o terminal deveria mostrar. Quero que você responda a saída do terminal apenas em um bloco de código único, e não em outro. Não faça interpretações. Quando eu precisar te contar algo, eu colocarei o texto entre chaves {Texto de observação}.", "IdeaTitle": "🌱 Linux terminal", + "IdentityDomain": "Domínio de identidade", "IdpMetadataHelpText": "URL de Metadados IDP e Parâmetro MetadataXML IDP, escolha um dos dois, a URL do Metadados IDP tem prioridade", "IdpMetadataUrlHelpText": "Carregar IDP Metadata a partir do endereço remoto", "IgnoreAlert": "Ignorar alerta", @@ -857,6 +864,7 @@ "NodeInformation": "Informações do nó", "NodeOfNumber": "Número de nós", "NodeSearchStrategy": "Estratégia de pesquisa de nó", + "NonRunnableAssets": "ativos não operacionais", "NormalLoad": "Normal", "NotEqual": "Não é igual a", "NotSet": "Não configurado", @@ -1131,6 +1139,7 @@ "RunasHelpText": "Preencha o nome de usuário para executar o script", "RunasPolicy": "Política de Conta", "RunasPolicyHelpText": "Qual estratégia de escolha de conta adotar quando o usuário atual não está executando neste recurso. Ignorar: não execute. Conta de privilégio prioritário: se houver uma conta de privilégios, escolha-a primeiro, se não, escolha uma conta comum. Apenas contas de privilégio: escolha apenas de contas de privilégio, se não houver, não execute", + "RunnableAssets": "ativos em funcionamento", "Running": "Em execução", "RunningPath": "Caminho de Execução", "RunningPathHelpText": "Informe o caminho de execução do script, essa configuração só é válida para scripts shell", @@ -1233,7 +1242,7 @@ "SignChannelNum": "Número do canal de assinatura", "SiteMessage": "Mensagem interna", "SiteMessageList": "Mensagem Interna", - "SiteURLTip": "Por exemplo: https://demo.jumpserver.org", + "SiteURLTip": "Por exemplo: https://demo.example.com", "Skip": "Ignorar ativo atual", "Skipped": "Ignorado", "Slack": "Slack", @@ -1256,6 +1265,7 @@ "StatusYellow": "Recentemente houve falhas na execução", "Step": "Passos", "Stop": "Parar", + "StopJob": "Parar trabalho", "StopJobMsg": "Parada bem-sucedida", "StopLogOutput": "Ação cancelada: a tarefa atual (currentTaskId) foi interrompida manualmente. Como cada tarefa tem um andamento diferente, abaixo estão os resultados finais, a falha na execução significa que a tarefa foi interrompida com sucesso.", "Storage": " Armazenamento ", @@ -1529,4 +1539,4 @@ "forceEnableMFAHelpText": "Se for habilitado forçosamente, o usuário não pode desativar por conta própria", "removeWarningMsg": "Tem certeza de que deseja remover", "setVariable": "Parâmetros de configuração" -} +} \ No newline at end of file diff --git a/apps/i18n/lina/ru.json b/apps/i18n/lina/ru.json index dedec1af6..337af1f4c 100644 --- a/apps/i18n/lina/ru.json +++ b/apps/i18n/lina/ru.json @@ -168,6 +168,7 @@ "Assets": "Управление активами", "AssetsAmount": "Количество активов", "AssetsOfNumber": "Активы", + "AssetsSelected": "Выбрано активов", "AssetsTotal": "Общее количество активов", "AssignedInfo": "Информация о审批", "Assignee": "Ответственное лицо", @@ -257,6 +258,7 @@ "CACertificate": "CA сертификат", "CAS": "CAS", "CMPP2": "CMPP v2.0", + "CTYunPrivate": "eCloud Частное Облако", "CalculationResults": "Ошибка выражения cron", "CallRecords": "Запись вызовов", "CanDragSelect": "Можно перетаскивать мышь для выбора временного диапазона; не выбрано – значит, выбрано всё", @@ -348,6 +350,7 @@ "Configured": "Настроено", "Confirm": "Подтверждение", "ConfirmPassword": "Подтвердите пароль", + "ConfirmRunningAssets": "Подтвердить активы в работе", "Connect": "Соединение", "ConnectAssets": "Подключить активы", "ConnectMethod": "Способ подключения", @@ -357,6 +360,7 @@ "ConnectMethodACLHelpText": "Фильтруя по способу подключения, вы можете контролировать, может ли пользователь заходить на актив с использованием определенного способа подключения. В зависимости от ваших установленных правил, некоторые способы подключения могут быть разрешены, в то время как другие будут запрещены.", "ConnectMethodACLUpdate": "Обновить управление способами подключения", "ConnectMethodACLs": "Способ подключения", + "ConnectMethodAclDetail": "детали способа подключения", "ConnectWebSocketError": "Ошибка подключения к WebSocket", "Connectable": "Можно подключиться", "ConnectionDropped": "Соединение разорвано", @@ -392,11 +396,10 @@ "CriticalLoad": "Серьезно", "CronExpression": "Полное выражение crontab", "Crontab": "Запланированные задачи", - "CrontabDiffError": "Пожалуйста, убедитесь, что интервал выполнения регулярно составляет не менее десяти минут!", + "CrontabDiffError": "Пожалуйста, убедитесь, что интервал выполнения регулярно составляет не менее {minutes} минут!", "CrontabHelpText": "Если одновременно установлены интервал и crontab, предпочтение отдается crontab", - "CrontabHelpTip": "например: выполнять каждое воскресенье в 03:05 <5 3 * * 0>
использовать 5-значное выражение crontab Linux <минуты часы день месяц день_недели> (онлайн инструмент)
", + "CrontabHelpTip": "например: выполнять каждое воскресенье в 03:05 <5 3 * * 0>
использовать 5-значное выражение crontab Linux <минуты часы день месяц день_недели> (онлайн инструмент)
", "CrontabOfCreateUpdatePage": "Например: выполнять каждое воскресенье в 03:05 <5 3 * * 0>
Использовать 5-значное выражение crontab Linux <минуты часы день месяц день_недели> (онлайн инструмент)
Если одновременно установлены периодическое выполнение и циклическое выполнение, приоритет отдается периодическому выполнению", - "CTYunPrivate": "eCloud Частное Облако", "CurrentConnectionUsers": "Текущее число пользователей в беседе", "CurrentConnections": "Текущее количество подключений", "CurrentStatus": "Текущий статус", @@ -447,6 +450,8 @@ "DefaultValue": "Значение по умолчанию", "DefaultValueTip": "Сохранить и выполнить, а также запланированные задачи использовать значения по умолчанию. Неполное заполнение значений по умолчанию может привести к сбою выполнения задачи.", "Delete": "Удалить", + "DeleteAccount": "удалить аккаунт.", + "DeleteBoth": "Одновременно удалить", "DeleteConfirmMessage": "После удаления восстановить невозможно, продолжить?", "DeleteErrorMsg": "Удаление не удалось", "DeleteGatherAccountTitle": "Удалить найденную учетную запись", @@ -474,6 +479,7 @@ "DingTalk": "钉钉", "DingTalkOAuth": "Аутентификация DingTalk", "DingTalkTest": "Тест", + "DirectoryServiceHelpMessage": "Служба каталогов (Directory Service) — это сервис для централизованного хранения, управления и запроса информации о ресурсах сети, к распространенным реализациям относятся LDAP и Active Directory. Другие активы, подключенные к службе каталогов, будут наследовать аккаунты от службы каталогов.", "Disable": "Запретить", "DisableSelected": "Отключить выбранное", "DisableSuccessMsg": "Успешно отключено", @@ -648,6 +654,7 @@ "Id": "ID", "IdeaContent": "Я хочу, чтобы ты выступил в роли терминала Linux. Я буду вводить команды, а ты будешь отвечать тем, что должен отображать терминал. Я прошу отвечать только в одном уникальном блоке кода, без дополнительных комментариев. Когда мне нужно будет что-то тебе сказать, я помещу текст в фигурные скобки{замечание текста}.", "IdeaTitle": "🌱 терминал Linux", + "IdentityDomain": "Область идентичности", "IdpMetadataHelpText": "IDP Metadata URL и параметр IDP Metadata XML могут быть выбраны по одному, при этом предпочтение отдается IDP Metadata URL", "IdpMetadataUrlHelpText": "Загрузить IDP Metadata с удаленного адреса", "IgnoreAlert": "Игнорировать оповещение", @@ -856,6 +863,7 @@ "NodeInformation": "Информация о узле", "NodeOfNumber": "Количество узлов", "NodeSearchStrategy": "Стратегия поиска узлов", + "NonRunnableAssets": "Неактивные активы", "NormalLoad": "Нормально", "NotEqual": "Не равно", "NotSet": "Не установлено", @@ -1130,6 +1138,7 @@ "RunasHelpText": "Введите имя пользователя для запуска скрипта", "RunasPolicy": "стратегия аккаунтов", "RunasPolicyHelpText": "Когда на текущем активе нет этого пользователя, используйте следующую стратегию выбора аккаунта. Пропустить: не выполнять. Приоритетный привилегированный аккаунт: если есть привилегированный аккаунт, выбирайте его в первую очередь, если нет – выбирайте обычный аккаунт. Только привилегированные аккаунты: выбирайте только из привилегированных аккаунтов, если их нет – не выполнять", + "RunnableAssets": "Активы в работе", "Running": "В процессе выполнения", "RunningPath": "Путь выполнения", "RunningPathHelpText": "Укажите путь выполнения скрипта, эта настройка действует только для shell-скриптов", @@ -1232,7 +1241,7 @@ "SignChannelNum": "Номер канала подписи", "SiteMessage": "Сообщение на сайте", "SiteMessageList": "Внутреннее сообщение", - "SiteURLTip": "Например: https://demo.jumpserver.org", + "SiteURLTip": "Например: https://demo.example.com", "Skip": "Игнорировать текущие активы", "Skipped": "Пропущено", "Slack": "Slack", @@ -1255,6 +1264,7 @@ "StatusYellow": "В последнее время были неудачные выполнения", "Step": "Шаги", "Stop": "Остановить", + "StopJob": "остановить действие", "StopJobMsg": "Остановка завершена успешно", "StopLogOutput": "Задача отменена: текущая задача (currentTaskId) была остановлена вручную. Поскольку выполнение каждой задачи идет с разной скоростью, ниже указаны окончательные результаты выполнения задачи. Ошибка выполнения означает, что задача была успешно остановлена.", "Storage": "Хранилище", @@ -1528,4 +1538,4 @@ "forceEnableMFAHelpText": "Если принудительно включено, пользователь не сможет отключить самостоятельно", "removeWarningMsg": "Вы уверены, что хотите удалить", "setVariable": "Настроить параметры" -} +} \ No newline at end of file diff --git a/apps/i18n/lina/zh.json b/apps/i18n/lina/zh.json index ba960dad3..f812b8804 100644 --- a/apps/i18n/lina/zh.json +++ b/apps/i18n/lina/zh.json @@ -26,7 +26,7 @@ "AccountDiscoverTaskCreate": "创建发现帐户任务", "AccountDiscoverTaskUpdate": "更新发现帐户任务", "AccountExportTips": "导出信息中包含账号密文涉及敏感信息,导出的格式为一个加密的zip文件(若没有设置加密密码,请前往个人信息中设置文件加密密码)。", - "AccountList": "账号", + "AccountList": "账号管理", "AccountPolicy": "账号策略", "AccountPolicyHelpText": "创建时对于不符合要求的账号,如:密钥类型不合规,唯一键约束,可选择以上策略。", "AccountPushCreate": "创建账号推送", @@ -168,6 +168,7 @@ "Assets": "资产管理", "AssetsAmount": "资产数量", "AssetsOfNumber": "资产数", + "AssetsSelected": " 个资产已选择", "AssetsTotal": "资产总数", "AssignedInfo": "审批信息", "Assignee": "处理人", @@ -257,6 +258,7 @@ "CACertificate": "CA 证书", "CAS": "CAS", "CMPP2": "CMPP v2.0", + "CTYunPrivate": "天翼私有云", "CalculationResults": "cron 表达式错误", "CallRecords": "调用记录", "CanDragSelect": "可拖动鼠标选择时间段;未选择等同全选", @@ -348,6 +350,7 @@ "Configured": "已配置", "Confirm": "确认", "ConfirmPassword": "确认密码", + "ConfirmRunningAssets": "确认运行资产", "Connect": "连接", "ConnectAssets": "连接资产", "ConnectMethod": "连接方式", @@ -357,6 +360,7 @@ "ConnectMethodACLHelpText": "通过连接方式过滤,您可以控制用户是否可以使用某种连接方式登录到资产上。根据您设定的规则,某些连接方式可以被放行,而另一些连接方式则被禁止。", "ConnectMethodACLUpdate": "更新连接方式控制", "ConnectMethodACLs": "连接方式", + "ConnectMethodAclDetail": "连接方式详情", "ConnectWebSocketError": "连接 WebSocket 失败", "Connectable": "可连接", "ConnectionDropped": "连接已断开", @@ -392,11 +396,10 @@ "CriticalLoad": "严重", "CronExpression": "crontab完整表达式", "Crontab": "定时任务", - "CrontabDiffError": "请确保定期执行的时间间隔不少于十分钟!", + "CrontabDiffError": "请确保定期执行的时间间隔不少于 {minutes} 分钟!", "CrontabHelpText": "如果同时设置了 interval 和 crontab,则优先考虑 crontab", - "CrontabHelpTip": "例如:每周日 03:05 执行 <5 3 * * 0>
使用 5 位 linux crontab 表达式 (在线工具)
", + "CrontabHelpTip": "例如:每周日 03:05 执行 <5 3 * * 0>
使用 5 位 linux crontab 表达式 (在线工具)
", "CrontabOfCreateUpdatePage": "例如:每周日 03:05 执行 <5 3 * * 0>
使用5位 Linux crontab 表达式 <分 时 日 月 星期> (在线工具
如果同时设置了定期执行和周期执行,优先使用定期执行", - "CTYunPrivate": "天翼私有云", "CurrentConnectionUsers": "当前会话用户数", "CurrentConnections": "当前连接数", "CurrentStatus": "当前状态", @@ -447,6 +450,8 @@ "DefaultValue": "默认值", "DefaultValueTip": "保存并执行和定时任务使用默认值执行,不填写默认值可能会导致任务执行失败", "Delete": "删除", + "DeleteAccount": "删除账号", + "DeleteBoth": "同时删除", "DeleteConfirmMessage": "删除后无法恢复,是否继续?", "DeleteErrorMsg": "删除失败", "DeleteGatherAccountTitle": "删除发现的账号", @@ -474,6 +479,7 @@ "DingTalk": "钉钉", "DingTalkOAuth": "钉钉认证", "DingTalkTest": "测试", + "DirectoryServiceHelpMessage": "目录服务(Directory Service) 是一种用于集中存储、管理和查询网络资源信息的服务,常见实现包括 LDAP 和 Active Directory。其它资产关联目录服务后,会继承来自目录服务的账号.", "Disable": "禁用", "DisableSelected": "禁用所选", "DisableSuccessMsg": "禁用成功", @@ -648,6 +654,7 @@ "Id": "ID", "IdeaContent": "我想让你充当一个 Linux 终端。我将输入命令,你将回答终端应该显示的内容。我希望你只在一个独特的代码块内回复终端输出,而不是其他。不要写解释。当我需要告诉你一些事情时,我会把文字放在大括号里{备注文本}。", "IdeaTitle": "🌱 Linux 终端", + "IdentityDomain": "身份域", "IdpMetadataHelpText": "IDP Metadata URL 和 IDP MetadataXML参数二选一即可,IDP MetadataURL的优先级高", "IdpMetadataUrlHelpText": "从远端地址中加载 IDP Metadata", "IgnoreAlert": "忽略警报", @@ -856,6 +863,7 @@ "NodeInformation": "节点信息", "NodeOfNumber": "节点数", "NodeSearchStrategy": "节点搜索策略", + "NonRunnableAssets": "不可运行资产", "NormalLoad": "正常", "NotEqual": "不等于", "NotSet": "未设置", @@ -1130,6 +1138,7 @@ "RunasHelpText": "填写运行脚本的用户名", "RunasPolicy": "账号策略", "RunasPolicyHelpText": "当前资产上没此运行用户时,采取什么账号选择策略。跳过:不执行。优先特权账号:如果有特权账号先选特权账号,如果没有就选普通账号。仅特权账号:只从特权账号中选择,如果没有则不执行", + "RunnableAssets": "可运行资产", "Running": "运行中", "RunningPath": "运行路径", "RunningPathHelpText": "填写脚本的运行路径,此设置仅 shell 脚本生效", @@ -1232,7 +1241,7 @@ "SignChannelNum": "签名通道号", "SiteMessage": "站内信", "SiteMessageList": "站内信", - "SiteURLTip": "例如:https://demo.jumpserver.org", + "SiteURLTip": "例如:https://demo.example.com", "Skip": "忽略当前资产", "Skipped": "已跳过", "Slack": "Slack", @@ -1255,6 +1264,7 @@ "StatusYellow": "近期存在在执行失败", "Step": "步骤", "Stop": "停止", + "StopJob": "停止作业", "StopJobMsg": "停止成功", "StopLogOutput": "Task Canceled:当前任务(currentTaskId)已手动停止,由于每个任务的执行进度不一样,下面是任务最终的执行结果,执行失败表示已成功停止任务执行。", "Storage": "存储", @@ -1527,9 +1537,5 @@ "disallowSelfUpdateFields": "不允许自己修改当前字段", "forceEnableMFAHelpText": "如果强制启用,用户无法自行禁用", "removeWarningMsg": "你确定要移除", - "setVariable": "设置参数", - "StopJob": "停止作业", - "ConnectMethodAclDetail": "连接方式详情", - "DeleteAccount": "删除账号", - "DeleteBoth": "同时删除" -} + "setVariable": "设置参数" +} \ No newline at end of file diff --git a/apps/i18n/lina/zh_hant.json b/apps/i18n/lina/zh_hant.json index e03dede5b..4dc5a787d 100644 --- a/apps/i18n/lina/zh_hant.json +++ b/apps/i18n/lina/zh_hant.json @@ -170,6 +170,7 @@ "Assets": "資產管理", "AssetsAmount": "資產數量", "AssetsOfNumber": "資產數", + "AssetsSelected": "個資產已選擇", "AssetsTotal": "資產總數", "AssignedInfo": "審批資訊", "Assignee": "處理人", @@ -261,6 +262,7 @@ "CACertificate": "CA 證書", "CAS": "CAS", "CMPP2": "CMPP v2.0", + "CTYunPrivate": "天翼私有雲", "CalculationResults": "呼叫記錄", "CallRecords": "調用記錄", "CanDragSelect": "可拖動滑鼠選擇時間段;未選擇等同全選", @@ -352,6 +354,7 @@ "Configured": "已配置", "Confirm": "確認", "ConfirmPassword": "確認密碼", + "ConfirmRunningAssets": "確認運行資產", "Connect": "連接", "ConnectAssets": "連接資產", "ConnectMethod": "連接方式", @@ -361,6 +364,7 @@ "ConnectMethodACLHelpText": "您可以透過篩選連接方式,控制使用者能否使用特定方式登入到資產上。根據您設定的規則,有些連接方式可被允許,而其他連接方式則被禁止。", "ConnectMethodACLUpdate": "更新連接方式控制", "ConnectMethodACLs": "連接方式", + "ConnectMethodAclDetail": "連接方式詳情", "ConnectWebSocketError": "連接 WebSocket 失敗", "Connectable": "可連接", "ConnectionDropped": "連接已斷開", @@ -396,11 +400,10 @@ "CriticalLoad": "嚴重", "CronExpression": "crontab完整表達式", "Crontab": "定時任務", - "CrontabDiffError": "請確保定期執行的時間間隔不少於十分鐘!", + "CrontabDiffError": "請確保定期執行的時間間隔不少於 {minutes} 分鐘!", "CrontabHelpText": "如果同時設定了 interval 和 crontab,則優先考慮 crontab", - "CrontabHelpTip": "例如:每週日 03:05 執行 <5 3 * * 0>
使用 5 位 linux crontab 表達式 (線上工具)
", + "CrontabHelpTip": "例如:每週日 03:05 執行 <5 3 * * 0>
使用 5 位 linux crontab 表達式 (線上工具)
", "CrontabOfCreateUpdatePage": "例如:每週日 03:05 執行 <5 3 * * 0>
使用5位 Linux crontab 表達式 <分 時 日 月 星期> (線上工具
如果同時設置了定期執行和週期執行,優先使用定期執行", - "CTYunPrivate": "天翼私有雲", "CurrentConnectionUsers": "當前會話用戶數", "CurrentConnections": "當前連接數", "CurrentStatus": "當前狀態", @@ -452,6 +455,8 @@ "DefaultValue": "預設值", "DefaultValueTip": "保存並執行及定時任務使用默認值執行,未填寫默認值可能會導致任務執行失敗", "Delete": "刪除", + "DeleteAccount": "刪除帳號", + "DeleteBoth": "同時刪除", "DeleteConfirmMessage": "刪除後無法恢復,是否繼續?", "DeleteErrorMsg": "刪除失敗", "DeleteGatherAccountTitle": "刪除發現的帳號", @@ -479,6 +484,7 @@ "DingTalk": "釘釘", "DingTalkOAuth": "釘釘認證", "DingTalkTest": "測試", + "DirectoryServiceHelpMessage": "目錄服務(Directory Service)是一種用於集中儲存、管理和查詢網絡資源信息的服務,常見的實現包括 LDAP 和 Active Directory。其他資產關聯目錄服務後,將繼承來自目錄服務的帳號。", "Disable": "禁用", "DisableSelected": "停用所選", "DisableSuccessMsg": "禁用成功", @@ -653,6 +659,7 @@ "Id": "ID", "IdeaContent": "我想讓你充當一個 Linux 終端。我將輸入命令,你將回答終端應該顯示的內容。我希望你只在一個獨特的代碼塊內回復終端輸出,而不是其他。不要寫解釋。當我需要告訴你一些事情時,我會把文字放在大括號裡{備註文本}。", "IdeaTitle": "🌱 Linux 終端", + "IdentityDomain": "身份範疇", "IdpMetadataHelpText": "IDP metadata URL 和 IDP metadata XML參數二選一即可,IDP metadata URL的優先度高", "IdpMetadataUrlHelpText": "從遠端地址中載入 IDP Metadata", "IgnoreAlert": "忽略警報", @@ -861,6 +868,7 @@ "NodeInformation": "節點資訊", "NodeOfNumber": "節點數", "NodeSearchStrategy": "節點搜索策略", + "NonRunnableAssets": "不可運行資產", "NormalLoad": "正常", "NotEqual": "不等於", "NotSet": "未設置", @@ -1135,6 +1143,7 @@ "RunasHelpText": "填寫運行腳本的使用者名稱", "RunasPolicy": "帳號策略", "RunasPolicyHelpText": "當前資產上沒此運行用戶時,採取什麼帳號選擇策略。跳過:不執行。優先特權帳號:如果有特權帳號先選特權帳號,如果沒有就選普通帳號。僅特權帳號:只從特權帳號中選擇,如果沒有則不執行", + "RunnableAssets": "可運行資產", "Running": "正在運行中的Vault 伺服器掛載點,預設為 jumpserver", "RunningPath": "運行路徑", "RunningPathHelpText": "填寫腳本的運行路徑,此設置僅 shell 腳本生效", @@ -1237,7 +1246,7 @@ "SignChannelNum": "簽名通道號", "SiteMessage": "站內信", "SiteMessageList": "站內信", - "SiteURLTip": "例如:https://demo.jumpserver.org", + "SiteURLTip": "例如:https://demo.example.com", "Skip": "跳過", "Skipped": "已跳過", "Slack": "Slack", @@ -1260,6 +1269,7 @@ "StatusYellow": "近期存在在執行失敗", "Step": "步驟", "Stop": "停止", + "StopJob": "停止作業", "StopJobMsg": "停止成功", "StopLogOutput": "任務已取消:當前任務(currentTaskId)已被手動停止。由於每個任務的執行進度不同,以下是任務的最終執行結果。執行失敗表示任務已成功停止。", "Storage": "儲存設置", @@ -1350,7 +1360,7 @@ "TerminalDetail": "組件詳情", "TerminalUpdate": "更新終端機", "TerminalUpdateStorage": "更新終端儲存", - "Terminate": "終端", + "Terminate": "終斷", "TerminateTaskSendSuccessMsg": "終斷任務已下發,請稍後刷新查看", "TermsAndConditions": "條款和條件", "Test": "測試", @@ -1533,4 +1543,4 @@ "forceEnableMFAHelpText": "如果強制啟用,用戶無法自行禁用", "removeWarningMsg": "你確定要移除", "setVariable": "設置參數" -} +} \ No newline at end of file diff --git a/apps/i18n/luna/en.json b/apps/i18n/luna/en.json index 754c3d635..79a519a38 100644 --- a/apps/i18n/luna/en.json +++ b/apps/i18n/luna/en.json @@ -46,6 +46,7 @@ "Connect checked": "Connect checked", "Connect command line": "Connect command line", "Connect method": "Connect method", + "ConnectionTime": "Connection time", "Copied": "Copied", "Copy link": "Copy link", "Current online": "Current online", @@ -171,6 +172,7 @@ "Select account": "Select account", "Send command": "Send command", "Send text to all ssh terminals": "Send text to all ssh terminals", + "Session": "Session", "SessionIsBeingMonitored": "session is being monitored", "Set reusable": "Set reusable", "Setting": "Setting", @@ -203,6 +205,7 @@ "Token expired": "Token has expired", "Tool download": "Tool download", "Turkey keyboard layout": "Turkish-Q (Qwerty)", + "TurnOffReminders": "Turn off reminders", "Type tree": "Type tree", "UK English keyboard layout": "UK English (Qwerty)", "US English keyboard layout": "US English (Qwerty)", diff --git a/apps/i18n/luna/es.json b/apps/i18n/luna/es.json index a65de8c43..3b5ec9c36 100644 --- a/apps/i18n/luna/es.json +++ b/apps/i18n/luna/es.json @@ -45,6 +45,7 @@ "Connect checked": "Conexión seleccionada", "Connect command line": "Conectar a la línea de comandos", "Connect method": "Modo de conexión", + "ConnectionTime": "Tiempo de conexión", "Copied": "Copiado", "Copy link": "Copiar enlace", "Current online": "Actualmente en línea", @@ -169,6 +170,7 @@ "Select account": "Seleccionar cuenta", "Send command": "Enviar comando", "Send text to all ssh terminals": "Enviar texto a todos los terminales SSH", + "Session": "Sesión", "SessionIsBeingMonitored": "La sesión está siendo monitoreada", "Set reusable": "Activar reutilización", "Setting": "Configuración", @@ -201,6 +203,7 @@ "Token expired": "Token ha expirado, por favor reconéctese", "Tool download": "Descarga de herramientas", "Turkey keyboard layout": "Turco-Q (Qwerty)", + "TurnOffReminders": "¿Está seguro de que desea cerrar la conexión actual?", "Type tree": "Tipo de árbol", "UK English keyboard layout": "Inglés del Reino Unido (Qwerty)", "US English keyboard layout": "Inglés estadounidense (Qwerty)", diff --git a/apps/i18n/luna/ja.json b/apps/i18n/luna/ja.json index 8da5e2d58..5b08a430e 100644 --- a/apps/i18n/luna/ja.json +++ b/apps/i18n/luna/ja.json @@ -45,6 +45,7 @@ "Connect checked": "接続済み", "Connect command line": "接続コマンドライン", "Connect method": "接続方法", + "ConnectionTime": "接続時間", "Copied": "複製済み", "Copy link": "リンクをコピーする", "Current online": "現在オンライン", @@ -169,6 +170,7 @@ "Select account": "システムユーザーの選択", "Send command": "コマンドを送信", "Send text to all ssh terminals": "すべてのssh端末にテキストを送信します", + "Session": "セッション", "SessionIsBeingMonitored": "会話が監視されています。", "Set reusable": "再利用可能な", "Setting": "設定", @@ -201,6 +203,7 @@ "Token expired": "トークンの有効期限が切れました", "Tool download": "ツールダウンロード", "Turkey keyboard layout": "Turkish-Q (Qwerty)", + "TurnOffReminders": "現在の接続を閉じますか?", "Type tree": "タイプツリー", "UK English keyboard layout": "UK English (Qwerty)", "US English keyboard layout": "US English (Qwerty)", diff --git a/apps/i18n/luna/pt_br.json b/apps/i18n/luna/pt_br.json index f3d48bb55..02b0c5ac4 100644 --- a/apps/i18n/luna/pt_br.json +++ b/apps/i18n/luna/pt_br.json @@ -45,6 +45,7 @@ "Connect checked": "Conecte selecionado", "Connect command line": "Conectar linha de comando", "Connect method": "Forma de conexão", + "ConnectionTime": "Tempo de conexão", "Copied": "Copiado", "Copy link": "Copiar link", "Current online": "Online Atual", @@ -169,6 +170,7 @@ "Select account": "Selecionar conta", "Send command": "Enviar comando", "Send text to all ssh terminals": "Enviar texto para todos os terminais ssh", + "Session": "Sessão", "SessionIsBeingMonitored": "A conversa está sendo monitorada.", "Set reusable": "Iniciar reutilização", "Setting": "Configurações", @@ -201,6 +203,7 @@ "Token expired": "Token Expirou, Por Favor Reconecte", "Tool download": "Download da ferramenta", "Turkey keyboard layout": "Turkish-Q (Qwerty)", + "TurnOffReminders": "Você tem certeza de que deseja fechar a conexão atual?", "Type tree": "Tipo de árvore", "UK English keyboard layout": "Ingles do Reino Unido (Qwerty)", "US English keyboard layout": "Inglês dos EUA (Qwerty)", diff --git a/apps/i18n/luna/ru.json b/apps/i18n/luna/ru.json index c8090f177..956c06559 100644 --- a/apps/i18n/luna/ru.json +++ b/apps/i18n/luna/ru.json @@ -45,6 +45,7 @@ "Connect checked": "Подключение выбрано", "Connect command line": "Подключение к командной строке", "Connect method": "Способ подключения", + "ConnectionTime": "Время соединения", "Copied": "Скопировано", "Copy link": "Копировать ссылку", "Current online": "Текущий онлайн", @@ -169,6 +170,7 @@ "Select account": "Выбрать аккаунт", "Send command": "Отправить команду", "Send text to all ssh terminals": "Отправить текст на все ssh терминалы", + "Session": "Сессия", "SessionIsBeingMonitored": "Сессия находится под наблюдением", "Set reusable": "Включить повторное использование", "Setting": "Настройки", @@ -201,6 +203,7 @@ "Token expired": "Токен истёк, пожалуйста, переподключитесь", "Tool download": "Скачать инструменты", "Turkey keyboard layout": "Турецкий-Q (Qwerty)", + "TurnOffReminders": "Вы уверены, что хотите закрыть текущее соединение?", "Type tree": "Типовая структура", "UK English keyboard layout": "Английский (Великобритания) (Qwerty)", "US English keyboard layout": "US English (Qwerty)", diff --git a/apps/i18n/luna/zh.json b/apps/i18n/luna/zh.json index 636649d40..bc9b7c724 100644 --- a/apps/i18n/luna/zh.json +++ b/apps/i18n/luna/zh.json @@ -45,6 +45,7 @@ "Connect checked": "连接选中", "Connect command line": "连接命令行", "Connect method": "连接方式", + "ConnectionTime": "连接时间", "Copied": "已复制", "Copy link": "复制链接", "Current online": "当前在线", @@ -169,6 +170,7 @@ "Select account": "选择账号", "Send command": "发送命令", "Send text to all ssh terminals": "发送文本到所有ssh终端", + "Session": "会话", "SessionIsBeingMonitored": "会话正在被监控", "Set reusable": "开启复用", "Setting": "设置", @@ -201,6 +203,7 @@ "Token expired": "Token 已过期, 请重新连接", "Tool download": "工具下载", "Turkey keyboard layout": "Turkish-Q (Qwerty)", + "TurnOffReminders": "确定要关闭当前连接吗", "Type tree": "类型树", "UK English keyboard layout": "UK English (Qwerty)", "US English keyboard layout": "US English (Qwerty)", diff --git a/apps/i18n/luna/zh_hant.json b/apps/i18n/luna/zh_hant.json index aa5c9cb1c..481863f08 100644 --- a/apps/i18n/luna/zh_hant.json +++ b/apps/i18n/luna/zh_hant.json @@ -45,6 +45,7 @@ "Connect checked": "連接選中", "Connect command line": "連接命令行", "Connect method": "連線方式", + "ConnectionTime": "連接時間", "Copied": "已複製", "Copy link": "複製連結", "Current online": "當前在線", @@ -169,6 +170,7 @@ "Select account": "選擇帳號", "Send command": "發送命令", "Send text to all ssh terminals": "發送文本到所有ssh終端", + "Session": "會話", "SessionIsBeingMonitored": "對話正在被監控。", "Set reusable": "開啟復用", "Setting": "設置", @@ -201,6 +203,7 @@ "Token expired": "Token 已過期, 請重新連接", "Tool download": "工具下載", "Turkey keyboard layout": "Turkish-Q (Qwerty)", + "TurnOffReminders": "確定要關閉當前連接嗎", "Type tree": "類型樹", "UK English keyboard layout": "UK English (Qwerty)", "US English keyboard layout": "US English (Qwerty)", diff --git a/apps/jumpserver/conf.py b/apps/jumpserver/conf.py index 0471bcd9d..597ca3872 100644 --- a/apps/jumpserver/conf.py +++ b/apps/jumpserver/conf.py @@ -9,7 +9,6 @@ """ import base64 import copy -import errno import json import logging import os @@ -290,6 +289,7 @@ class Config(dict): 'AUTH_LDAP_START_TLS': False, 'AUTH_LDAP_USER_ATTR_MAP': {"username": "cn", "name": "sn", "email": "mail"}, 'AUTH_LDAP_CONNECT_TIMEOUT': 10, + 'AUTH_LDAP_STRICT_SYNC': False, 'AUTH_LDAP_CACHE_TIMEOUT': 0, 'AUTH_LDAP_SEARCH_PAGED_SIZE': 1000, 'AUTH_LDAP_SYNC_IS_PERIODIC': False, @@ -310,6 +310,7 @@ class Config(dict): 'AUTH_LDAP_HA_START_TLS': False, 'AUTH_LDAP_HA_USER_ATTR_MAP': {"username": "cn", "name": "sn", "email": "mail"}, 'AUTH_LDAP_HA_CONNECT_TIMEOUT': 10, + 'AUTH_LDAP_HA_STRICT_SYNC': False, 'AUTH_LDAP_HA_CACHE_TIMEOUT': 0, 'AUTH_LDAP_HA_SEARCH_PAGED_SIZE': 1000, 'AUTH_LDAP_HA_SYNC_IS_PERIODIC': False, @@ -393,7 +394,7 @@ class Config(dict): "en": { "name": "JumpServer", "displayname": "JumpServer", - "url": "https://jumpserver.org/" + "url": "https://jumpserver.com/" } }, "strict": True, @@ -564,11 +565,12 @@ class Config(dict): # 安全配置 'SECURITY_MFA_AUTH': 0, # 0 不开启 1 全局开启 2 管理员开启 'SECURITY_MFA_AUTH_ENABLED_FOR_THIRD_PARTY': True, + 'SECURITY_MFA_BY_EMAIL': False, 'SECURITY_COMMAND_EXECUTION': False, 'SECURITY_COMMAND_BLACKLIST': [ 'reboot', 'shutdown', 'poweroff', 'halt', 'dd', 'half', 'top' ], - 'SECURITY_SERVICE_ACCOUNT_REGISTRATION': True, + 'SECURITY_SERVICE_ACCOUNT_REGISTRATION': 'auto', 'SECURITY_VIEW_AUTH_NEED_MFA': True, 'SECURITY_MAX_IDLE_TIME': 30, 'SECURITY_MAX_SESSION_TIME': 24, @@ -597,6 +599,7 @@ class Config(dict): 'USER_LOGIN_SINGLE_MACHINE_ENABLED': False, 'ONLY_ALLOW_EXIST_USER_AUTH': False, 'ONLY_ALLOW_AUTH_FROM_SOURCE': False, + 'PRIVACY_MODE': False, # 用户登录限制的规则 'SECURITY_LOGIN_LIMIT_COUNT': 7, 'SECURITY_LOGIN_LIMIT_TIME': 30, @@ -662,8 +665,8 @@ class Config(dict): 'TERMINAL_TELNET_REGEX': '', # 导航栏 帮助 - 'HELP_DOCUMENT_URL': 'https://docs.jumpserver.org/zh/v3/', - 'HELP_SUPPORT_URL': 'https://www.jumpserver.org/support/', + 'HELP_DOCUMENT_URL': 'https://jumpserver.com/docs', + 'HELP_SUPPORT_URL': 'https://www.lxware.hk/pages/about', 'FORGOT_PASSWORD_URL': '', 'HEALTH_CHECK_TOKEN': '', @@ -695,6 +698,7 @@ class Config(dict): 'FILE_UPLOAD_SIZE_LIMIT_MB': 200, 'TICKET_APPLY_ASSET_SCOPE': 'all', + 'LEAK_PASSWORD_DB_PATH': os.path.join(PROJECT_DIR, 'data', 'leak_password.db'), # Ansible Receptor 'RECEPTOR_ENABLED': False, diff --git a/apps/jumpserver/settings/auth.py b/apps/jumpserver/settings/auth.py index e69471dd4..20cd31b1a 100644 --- a/apps/jumpserver/settings/auth.py +++ b/apps/jumpserver/settings/auth.py @@ -42,6 +42,7 @@ AUTH_LDAP_CONNECTION_OPTIONS = { ldap.OPT_TIMEOUT: CONFIG.AUTH_LDAP_CONNECT_TIMEOUT, ldap.OPT_NETWORK_TIMEOUT: CONFIG.AUTH_LDAP_CONNECT_TIMEOUT } +AUTH_LDAP_STRICT_SYNC = CONFIG.AUTH_LDAP_STRICT_SYNC AUTH_LDAP_CACHE_TIMEOUT = CONFIG.AUTH_LDAP_CACHE_TIMEOUT AUTH_LDAP_ALWAYS_UPDATE_USER = True @@ -80,6 +81,7 @@ AUTH_LDAP_HA_CONNECTION_OPTIONS = { ldap.OPT_TIMEOUT: CONFIG.AUTH_LDAP_HA_CONNECT_TIMEOUT, ldap.OPT_NETWORK_TIMEOUT: CONFIG.AUTH_LDAP_HA_CONNECT_TIMEOUT } +AUTH_LDAP_HA_STRICT_SYNC = CONFIG.AUTH_LDAP_HA_STRICT_SYNC AUTH_LDAP_HA_CACHE_TIMEOUT = CONFIG.AUTH_LDAP_HA_CACHE_TIMEOUT AUTH_LDAP_HA_ALWAYS_UPDATE_USER = True @@ -325,9 +327,10 @@ MFA_BACKEND_OTP = 'authentication.mfa.otp.MFAOtp' MFA_BACKEND_FACE = 'authentication.mfa.face.MFAFace' MFA_BACKEND_RADIUS = 'authentication.mfa.radius.MFARadius' MFA_BACKEND_SMS = 'authentication.mfa.sms.MFASms' +MFA_BACKEND_EMAIL = 'authentication.mfa.email.MFAEmail' MFA_BACKEND_CUSTOM = 'authentication.mfa.custom.MFACustom' -MFA_BACKENDS = [MFA_BACKEND_OTP, MFA_BACKEND_RADIUS, MFA_BACKEND_SMS, MFA_BACKEND_FACE] +MFA_BACKENDS = [MFA_BACKEND_OTP, MFA_BACKEND_RADIUS, MFA_BACKEND_SMS, MFA_BACKEND_FACE, MFA_BACKEND_EMAIL] MFA_CUSTOM = CONFIG.MFA_CUSTOM MFA_CUSTOM_FILE_MD5 = CONFIG.MFA_CUSTOM_FILE_MD5 @@ -345,5 +348,6 @@ AUTHENTICATION_BACKENDS_THIRD_PARTY = [ ] ONLY_ALLOW_EXIST_USER_AUTH = CONFIG.ONLY_ALLOW_EXIST_USER_AUTH ONLY_ALLOW_AUTH_FROM_SOURCE = CONFIG.ONLY_ALLOW_AUTH_FROM_SOURCE +PRIVACY_MODE = CONFIG.PRIVACY_MODE SAML_FOLDER = os.path.join(BASE_DIR, 'authentication', 'backends', 'saml2') diff --git a/apps/jumpserver/settings/custom.py b/apps/jumpserver/settings/custom.py index f0ff095b1..49bdc7366 100644 --- a/apps/jumpserver/settings/custom.py +++ b/apps/jumpserver/settings/custom.py @@ -34,6 +34,7 @@ FTP_FILE_MAX_STORE = CONFIG.FTP_FILE_MAX_STORE # Security settings SECURITY_MFA_AUTH = CONFIG.SECURITY_MFA_AUTH SECURITY_MFA_AUTH_ENABLED_FOR_THIRD_PARTY = CONFIG.SECURITY_MFA_AUTH_ENABLED_FOR_THIRD_PARTY +SECURITY_MFA_BY_EMAIL = CONFIG.SECURITY_MFA_BY_EMAIL SECURITY_MAX_IDLE_TIME = CONFIG.SECURITY_MAX_IDLE_TIME # Unit: minute SECURITY_MAX_SESSION_TIME = CONFIG.SECURITY_MAX_SESSION_TIME # Unit: hour SECURITY_COMMAND_EXECUTION = CONFIG.SECURITY_COMMAND_EXECUTION diff --git a/apps/jumpserver/settings/libs.py b/apps/jumpserver/settings/libs.py index d705939e6..70eee17e6 100644 --- a/apps/jumpserver/settings/libs.py +++ b/apps/jumpserver/settings/libs.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # import os - +import time from .base import ( REDIS_SSL_CA, REDIS_SSL_CERT, REDIS_SSL_KEY, REDIS_SSL_REQUIRED, REDIS_USE_SSL, REDIS_PROTOCOL, REDIS_SENTINEL_SERVICE_NAME, REDIS_SENTINELS, REDIS_SENTINEL_PASSWORD, @@ -197,3 +197,5 @@ PIICO_DEVICE_ENABLE = CONFIG.PIICO_DEVICE_ENABLE PIICO_DRIVER_PATH = CONFIG.PIICO_DRIVER_PATH LEAK_PASSWORD_DB_PATH = CONFIG.LEAK_PASSWORD_DB_PATH + +JUMPSERVER_UPTIME = int(time.time()) diff --git a/apps/jumpserver/settings/logging.py b/apps/jumpserver/settings/logging.py index 23d15d970..289f4fa4f 100644 --- a/apps/jumpserver/settings/logging.py +++ b/apps/jumpserver/settings/logging.py @@ -121,8 +121,8 @@ LOGGING = { if CONFIG.DEBUG_DEV: LOGGING['loggers']['django.db'] = { - 'handlers': ['console', 'file'], - 'level': 'DEBUG' + 'handlers': ['console', 'file'], + 'level': 'DEBUG' } SYSLOG_ENABLE = CONFIG.SYSLOG_ENABLE @@ -138,4 +138,3 @@ if CONFIG.SYSLOG_ADDR != '' and len(CONFIG.SYSLOG_ADDR.split(':')) == 2: if not os.path.isdir(LOG_DIR): os.makedirs(LOG_DIR, mode=0o755) - diff --git a/apps/jumpserver/urls.py b/apps/jumpserver/urls.py index 881d5c57a..2cc8e02d1 100644 --- a/apps/jumpserver/urls.py +++ b/apps/jumpserver/urls.py @@ -2,6 +2,7 @@ from __future__ import unicode_literals import os +import uuid import private_storage.urls from django.conf import settings @@ -74,12 +75,19 @@ urlpatterns += [ path('core/jsi18n/', JavaScriptCatalog.as_view(), name='javascript-catalog'), ] +DOC_TTL = 60 * 60 +DOC_VERSION = uuid.uuid4().hex +cache_kwargs = { + 'cache_timeout': DOC_TTL, + 'cache_kwargs': { + 'key_prefix': 'swagger-cache-' + DOC_VERSION, + }, +} # docs 路由 urlpatterns += [ - re_path('^api/swagger(?P\.json|\.yaml)$', - views.get_swagger_view().without_ui(cache_timeout=1), name='schema-json'), - re_path('api/docs/?', views.get_swagger_view().with_ui('swagger', cache_timeout=1), name="docs"), - re_path('api/redoc/?', views.get_swagger_view().with_ui('redoc', cache_timeout=1), name='redoc'), + path('api/swagger.', views.get_swagger_view(False).without_ui(**cache_kwargs), name='schema-json'), + re_path('api/docs/?', views.get_swagger_view().with_ui('swagger', **cache_kwargs), name="docs"), + re_path('api/redoc/?', views.get_swagger_view().with_ui('redoc', **cache_kwargs), name='redoc'), ] if os.environ.get('DEBUG_TOOLBAR', False): diff --git a/apps/jumpserver/views/other.py b/apps/jumpserver/views/other.py index cd5da8a61..200d44802 100644 --- a/apps/jumpserver/views/other.py +++ b/apps/jumpserver/views/other.py @@ -102,7 +102,7 @@ class ResourceDownload(TemplateView): OPENSSH_VERSION=v9.4.0.0 TINKER_VERSION=v0.1.6 VIDEO_PLAYER_VERSION=0.2.0 - CLIENT_VERSION=v3.0.1 + CLIENT_VERSION=v3.0.3 """ def get_meta_json(self): diff --git a/apps/jumpserver/views/swagger.py b/apps/jumpserver/views/swagger.py index 5a18b30f1..5ca1dd330 100644 --- a/apps/jumpserver/views/swagger.py +++ b/apps/jumpserver/views/swagger.py @@ -1,8 +1,60 @@ -from drf_yasg.inspectors import SwaggerAutoSchema - -from rest_framework import permissions -from drf_yasg.views import get_schema_view from drf_yasg import openapi +from drf_yasg.generators import OpenAPISchemaGenerator +from drf_yasg.inspectors import SwaggerAutoSchema +from drf_yasg.views import get_schema_view +from rest_framework import permissions + + +class CustomSchemaGenerator(OpenAPISchemaGenerator): + from_mcp = False + + def get_schema(self, request=None, public=False): + self.from_mcp = request.query_params.get('mcp') or request.path.endswith('swagger.json') + return super().get_schema(request, public) + + @staticmethod + def exclude_some_paths(path): + # 这里可以对 paths 进行处理 + excludes = [ + '/report/', '/render-to-json/', '/suggestions/', + 'executions', 'automations', 'change-secret-records', + 'change-secret-dashboard', '/copy-to-assets/', + '/move-to-assets/', 'dashboard', + + ] + for p in excludes: + if path.find(p) >= 0: + return True + return False + + def exclude_some_app(self, path): + parts = path.split('/') + if len(parts) < 4: + return False + + apps = [] + if self.from_mcp: + apps = [ + 'ops', 'tickets', 'common', 'authentication', + 'settings', 'xpack', 'terminal', 'rbac' + ] + + app_name = parts[3] + if app_name in apps: + return True + return False + + def get_operation(self, view, path, prefix, method, components, request): + # 这里可以对 path 进行处理 + if self.exclude_some_paths(path): + return None + if self.exclude_some_app(path): + return None + operation = super().get_operation(view, path, prefix, method, components, request) + operation_id = operation.get('operationId') + if 'bulk' in operation_id: + return None + return operation class CustomSwaggerAutoSchema(SwaggerAutoSchema): @@ -53,23 +105,31 @@ api_info = openapi.Info( title="JumpServer API Docs", default_version='v1', description="JumpServer Restful api docs", - terms_of_service="https://www.jumpserver.org", - contact=openapi.Contact(email="support@fit2cloud.com"), + terms_of_service="https://www.jumpserver.com", + contact=openapi.Contact(email="support@lxware.hk"), license=openapi.License(name="GPLv3 License"), ) -def get_swagger_view(version='v1'): +def get_swagger_view(with_auth=True): from ..urls import api_v1 from django.urls import path, include - api_v1_patterns = [ + patterns = [ path('api/v1/', include(api_v1)) ] - patterns = api_v1_patterns + + if with_auth: + permission_classes = (permissions.IsAuthenticated,) + public = False + else: + permission_classes = [] + public = True + schema_view = get_schema_view( api_info, + public=public, patterns=patterns, - permission_classes=(permissions.IsAuthenticated,), + generator_class=CustomSchemaGenerator, + permission_classes=permission_classes ) return schema_view - diff --git a/apps/ops/ansible/inventory.py b/apps/ops/ansible/inventory.py index 2a5153c5a..164b44298 100644 --- a/apps/ops/ansible/inventory.py +++ b/apps/ops/ansible/inventory.py @@ -7,6 +7,8 @@ from collections import defaultdict from django.utils.translation import gettext as _ +from assets import const + __all__ = ['JMSInventory'] @@ -38,6 +40,12 @@ class JMSInventory: .prefetch_related('platform', 'domain', 'accounts') return assets + @staticmethod + def get_username(asset, account): + if asset.category == const.Category.DS: + return account.full_username + return account.username + @staticmethod def group_by_platform(assets): groups = defaultdict(list) @@ -76,10 +84,10 @@ class JMSInventory: proxy_command = f"-o ProxyCommand='{' '.join(proxy_command_list)}'" return {"ansible_ssh_common_args": proxy_command} - @staticmethod - def make_account_ansible_vars(account, path_dir): + def make_account_ansible_vars(self, asset, account, path_dir): + username = self.get_username(asset, account) var = { - 'ansible_user': account.username, + 'ansible_user': username, } if not account.secret: return var @@ -111,7 +119,8 @@ class JMSInventory: setting = getattr(p, 'setting') host['old_ssh_version'] = setting.get('old_ssh_version', False) - def make_account_vars(self, host, asset, account, automation, protocol, platform, gateway, path_dir): + def make_account_vars(self, host, asset, account, automation, protocol, platform, gateway, path_dir, + ansible_config): from accounts.const import AutomationTypes if not account: host['error'] = _("No account available") @@ -128,12 +137,13 @@ class JMSInventory: host.update(self.make_custom_become_ansible_vars(account, su_from_auth, path_dir)) elif platform.su_enabled and not su_from and \ self.task_type in (AutomationTypes.change_secret, AutomationTypes.push_account): - host.update(self.make_account_ansible_vars(account, path_dir)) - host['ansible_become'] = True + host.update(self.make_account_ansible_vars(asset, account, path_dir)) + if platform.type not in ["windows", "windows_ad"]: + host['ansible_become'] = True host['ansible_become_user'] = 'root' host['ansible_become_password'] = account.escape_jinja2_syntax(account.secret) else: - host.update(self.make_account_ansible_vars(account, path_dir)) + host.update(self.make_account_ansible_vars(asset, account, path_dir)) if platform.is_huawei(): host['ansible_connection'] = 'network_cli' @@ -180,6 +190,12 @@ class JMSInventory: return ansible_config def asset_to_host(self, asset, account, automation, protocols, platform, path_dir): + name = re.sub(r'[ \[\]/]', '_', asset.name) + host = {'name': name} + if account is None: + host['error'] = _('No account available') + return host + try: ansible_config = dict(automation.ansible_config) except (AttributeError, TypeError): @@ -188,10 +204,10 @@ class JMSInventory: protocol = self.get_primary_protocol(ansible_config, protocols) tp, category = asset.type, asset.category - name = re.sub(r'[ \[\]/]', '_', asset.name) + secret_info = {k: v for k, v in asset.secret_info.items() if v} - host = { - 'name': name, + username = self.get_username(asset, account) + host.update({ 'local_python_interpreter': sys.executable, 'jms_asset': { 'id': str(asset.id), 'name': asset.name, 'address': asset.address, @@ -202,11 +218,12 @@ class JMSInventory: 'origin_address': asset.address }, 'jms_account': { - 'id': str(account.id), 'username': account.username, + 'id': str(account.id), + 'username': username, 'secret': account.escape_jinja2_syntax(account.secret), 'secret_type': account.secret_type, 'private_key_path': account.get_private_key_path(path_dir) } if account else None - } + }) self.make_protocol_setting_vars(host, protocols) @@ -223,7 +240,7 @@ class JMSInventory: gateway = asset.domain.select_gateway() self.make_account_vars( - host, asset, account, automation, protocol, platform, gateway, path_dir + host, asset, account, automation, protocol, platform, gateway, path_dir, ansible_config ) return host @@ -235,7 +252,7 @@ class JMSInventory: return accounts_sorted def get_asset_sorted_accounts(self, asset): - accounts = list(asset.accounts.filter(is_active=True)) + accounts = list(asset.all_accounts.filter(is_active=True)) accounts_sorted = self.sorted_accounts(accounts) return accounts_sorted @@ -281,6 +298,51 @@ class JMSInventory: setattr(p, 'setting', platform_protocols.get(p.name, {})) return asset_protocols + def get_classified_hosts(self, path_dir): + hosts = [] + platform_assets = self.group_by_platform(self.assets) + runnable_hosts = [] + error_hosts = [] + + for platform, assets in platform_assets.items(): + automation = platform.automation + platform_protocols = { + p['name']: p['setting'] for p in platform.protocols.values('name', 'setting') + } + for asset in assets: + protocols = self.set_platform_protocol_setting_to_asset(asset, platform_protocols) + account = self.select_account(asset) + host = self.asset_to_host(asset, account, automation, protocols, platform, path_dir) + + if not automation.ansible_enabled: + host['error'] = _('Ansible disabled') + + if isinstance(host, list): + hosts.extend(host) + else: + hosts.append(host) + + # 分类主机 + for host in hosts: + if host.get('error'): + self.exclude_hosts[host['name']] = host['error'] + error_hosts.append({ + 'name': host['name'], + 'id': host.get('jms_asset', {}).get('id'), + 'error': host['error'] + }) + else: + runnable_hosts.append({ + 'name': host['name'], + 'ip': host.get('ansible_host', ''), + 'id': host.get('jms_asset', {}).get('id') + }) + result = { + 'runnable': runnable_hosts, + 'error': error_hosts, + } + return result + def generate(self, path_dir): hosts = [] platform_assets = self.group_by_platform(self.assets) diff --git a/apps/ops/api/adhoc.py b/apps/ops/api/adhoc.py index d9eb35a51..6a153b83a 100644 --- a/apps/ops/api/adhoc.py +++ b/apps/ops/api/adhoc.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- from django.db.models import Q -from django.utils.translation import gettext_lazy as _ from common.api.generic import JMSBulkModelViewSet +from common.permissions import IsOwnerOrAdminWritable from common.utils.http import is_true from rbac.permissions import RBACPermission from ..const import Scope @@ -17,7 +17,7 @@ __all__ = [ class AdHocViewSet(JMSBulkModelViewSet): queryset = AdHoc.objects.all() serializer_class = AdHocSerializer - permission_classes = (RBACPermission,) + permission_classes = (RBACPermission, IsOwnerOrAdminWritable) search_fields = ('name', 'comment') filterset_fields = ['scope', 'creator'] @@ -26,13 +26,6 @@ class AdHocViewSet(JMSBulkModelViewSet): self.check_object_permissions(self.request, obj) return True - def check_object_permissions(self, request, obj): - if request.method != 'GET' and obj.creator != request.user: - self.permission_denied( - request, message={"detail": _("Deleting other people's script is not allowed")} - ) - return super().check_object_permissions(request, obj) - def get_queryset(self): queryset = super().get_queryset() user = self.request.user diff --git a/apps/ops/api/job.py b/apps/ops/api/job.py index d257d2209..23add9baa 100644 --- a/apps/ops/api/job.py +++ b/apps/ops/api/job.py @@ -1,5 +1,6 @@ import json import os +import uuid from celery.result import AsyncResult from django.conf import settings @@ -18,14 +19,15 @@ from common.const.http import POST from common.permissions import IsValidUser from ops.celery import app from ops.const import Types -from ops.models import Job, JobExecution +from ops.models import Job, JobExecution, JMSPermedInventory from ops.serializers.job import ( JobSerializer, JobExecutionSerializer, FileSerializer, JobTaskStopSerializer ) from ops.utils import merge_nodes_and_assets __all__ = [ - 'JobViewSet', 'JobExecutionViewSet', 'JobRunVariableHelpAPIView', 'JobExecutionTaskDetail', 'UsernameHintsAPI' + 'JobViewSet', 'JobExecutionViewSet', 'JobRunVariableHelpAPIView', 'JobExecutionTaskDetail', 'UsernameHintsAPI', + 'ClassifiedHostsAPI' ] from ops.tasks import run_ops_job_execution @@ -309,3 +311,28 @@ class UsernameHintsAPI(APIView): .annotate(total=Count('username')) \ .order_by('-total', '-username')[:10] return Response(data=top_accounts) + + +class ClassifiedHostsAPI(APIView): + permission_classes = [IsValidUser] + + def post(self, request, **kwargs): + asset_ids = request.data.get('assets', []) + node_ids = request.data.get('nodes', []) + runas_policy = request.data.get('runas_policy', 'privileged_first') + account_prefer = request.data.get('runas', 'root,Administrator') + module = request.data.get('module', 'shell') + assets = list(Asset.objects.filter(id__in=asset_ids).all()) + tmp_dir = os.path.join(settings.PROJECT_DIR, 'inventory', str(uuid.uuid4())) + os.makedirs(tmp_dir, exist_ok=True) + inventory = JMSPermedInventory( + assets=assets, + nodes=node_ids, + module=module, + account_policy=runas_policy, + account_prefer=account_prefer, + user=self.request.user + ) + classified_hosts = inventory.get_classified_hosts(tmp_dir) + + return Response(data=classified_hosts) diff --git a/apps/ops/api/playbook.py b/apps/ops/api/playbook.py index 292f8bd87..cec43e593 100644 --- a/apps/ops/api/playbook.py +++ b/apps/ops/api/playbook.py @@ -11,6 +11,7 @@ from rest_framework import status from common.api.generic import JMSBulkModelViewSet from common.exceptions import JMSException +from common.permissions import IsOwnerOrAdminWritable from common.utils.http import is_true from rbac.permissions import RBACPermission from ..const import Scope @@ -33,7 +34,7 @@ def unzip_playbook(src, dist): class PlaybookViewSet(JMSBulkModelViewSet): serializer_class = PlaybookSerializer - permission_classes = (RBACPermission,) + permission_classes = (RBACPermission, IsOwnerOrAdminWritable) queryset = Playbook.objects.all() search_fields = ('name', 'comment') filterset_fields = ['scope', 'creator'] @@ -43,13 +44,6 @@ class PlaybookViewSet(JMSBulkModelViewSet): self.check_object_permissions(self.request, obj) return True - def check_object_permissions(self, request, obj): - if request.method != 'GET' and obj.creator != request.user: - self.permission_denied( - request, message={"detail": _("Deleting other people's playbook is not allowed")} - ) - return super().check_object_permissions(request, obj) - def perform_destroy(self, instance): if instance.job_set.exists(): raise JMSException(code='playbook_has_job', detail={"msg": _("Currently playbook is being used in a job")}) diff --git a/apps/ops/mixin.py b/apps/ops/mixin.py index 1c8d1cff6..ab9149abe 100644 --- a/apps/ops/mixin.py +++ b/apps/ops/mixin.py @@ -188,6 +188,10 @@ class PeriodTaskSerializerMixin(serializers.Serializer): if isinstance(crontab, str) and len(crontab.strip().split()) != 5: msg = _('* Please enter a valid crontab expression') raise serializers.ValidationError(msg) + + crontab = crontab.strip() + if crontab.startswith('*'): + raise serializers.ValidationError(_("Crontab minute must not contain '*'")) return crontab def validate_interval(self, interval): diff --git a/apps/ops/models/job.py b/apps/ops/models/job.py index 673548f75..748bdb9ad 100644 --- a/apps/ops/models/job.py +++ b/apps/ops/models/job.py @@ -1,11 +1,11 @@ import json import logging import os -import sys import uuid from collections import defaultdict from datetime import timedelta +import sys from celery import current_task from django.conf import settings from django.db import models @@ -63,7 +63,8 @@ class JMSPermedInventory(JMSInventory): self.module = module self.assets_accounts_mapper = self.get_assets_accounts_mapper() - def make_account_vars(self, host, asset, account, automation, protocol, platform, gateway, path_dir): + def make_account_vars(self, host, asset, account, automation, protocol, platform, gateway, path_dir, + ansible_config): if not account: host['error'] = _("No account available") return host @@ -78,7 +79,7 @@ class JMSPermedInventory(JMSInventory): } if self.module not in protocol_supported_modules_mapping.get(protocol.name, []): - host['error'] = "Module {} is not suitable for this asset".format(self.module) + host['error'] = _("Module {} is not suitable for this asset").format(self.module) return host if protocol.name in ('mariadb', 'mysql', 'postgresql', 'sqlserver'): @@ -96,7 +97,8 @@ class JMSPermedInventory(JMSInventory): } host['jms_asset']['port'] = protocol.port return host - return super().make_account_vars(host, asset, account, automation, protocol, platform, gateway, path_dir) + return super().make_account_vars(host, asset, account, automation, protocol, platform, gateway, path_dir, + ansible_config) def get_asset_sorted_accounts(self, asset): accounts = self.assets_accounts_mapper.get(asset.id, []) diff --git a/apps/ops/serializers/job.py b/apps/ops/serializers/job.py index 0864b62d9..a184d63eb 100644 --- a/apps/ops/serializers/job.py +++ b/apps/ops/serializers/job.py @@ -54,7 +54,7 @@ class JobSerializer(BulkOrgResourceModelSerializer, PeriodTaskSerializerMixin, W class Meta: model = Job read_only_fields = [ - "id", "date_last_run", "date_created", + "id", "date_last_run", "date_created", "periodic_display", "date_updated", "average_time_cost", "created_by", "material" ] fields_m2m = ['variable'] diff --git a/apps/ops/urls/api_urls.py b/apps/ops/urls/api_urls.py index 12801b1a3..4cd182f4e 100644 --- a/apps/ops/urls/api_urls.py +++ b/apps/ops/urls/api_urls.py @@ -28,6 +28,7 @@ urlpatterns = [ path('job-execution/task-detail//', api.JobExecutionTaskDetail.as_view(), name='task-detail'), path('username-hints/', api.UsernameHintsAPI.as_view(), name='username-hints'), path('ansible/job-execution//log/', api.AnsibleTaskLogApi.as_view(), name='job-execution-log'), + path('classified-hosts/', api.ClassifiedHostsAPI.as_view(), name='classified-hosts'), path('celery/task//task-execution//log/', api.CeleryTaskExecutionLogApi.as_view(), name='celery-task-execution-log'), diff --git a/apps/perms/api/asset_permission_relation.py b/apps/perms/api/asset_permission_relation.py index 5a97192e0..c00870a6c 100644 --- a/apps/perms/api/asset_permission_relation.py +++ b/apps/perms/api/asset_permission_relation.py @@ -2,17 +2,16 @@ # from functools import lru_cache -from rest_framework import generics from django.db.models import F from django.shortcuts import get_object_or_404 +from rest_framework import generics -from orgs.mixins.api import OrgRelationMixin -from orgs.mixins.api import OrgBulkModelViewSet -from orgs.utils import current_org -from perms import serializers -from perms import models -from perms.utils import AssetPermissionPermAssetUtil from accounts.serializers import AccountSerializer +from orgs.mixins.api import OrgRelationMixin, OrgBulkModelViewSet +from orgs.utils import current_org +from perms import models +from perms import serializers +from perms.utils import AssetPermissionPermAssetUtil __all__ = [ 'AssetPermissionUserRelationViewSet', 'AssetPermissionUserGroupRelationViewSet', @@ -24,6 +23,7 @@ __all__ = [ class RelationMixin(OrgRelationMixin, OrgBulkModelViewSet): perm_model = models.AssetPermission + http_method_names = ['get', 'post', 'delete'] def get_queryset(self): queryset = super().get_queryset() diff --git a/apps/perms/serializers/permission.py b/apps/perms/serializers/permission.py index 2cd16fbdb..82914b35d 100644 --- a/apps/perms/serializers/permission.py +++ b/apps/perms/serializers/permission.py @@ -132,6 +132,9 @@ class AssetPermissionSerializer(ResourceLabelsMixin, BulkOrgResourceModelSeriali def create_account_through_template(self, nodes, assets): if not self.template_accounts: return + if self.instance: + assets = assets or self.instance.assets.all() + nodes = nodes or self.instance.nodes.all() assets = self.get_all_assets(nodes, assets) self.create_accounts(assets) @@ -152,7 +155,7 @@ class AssetPermissionSerializer(ResourceLabelsMixin, BulkOrgResourceModelSeriali """Perform necessary eager loading of data.""" queryset = queryset.prefetch_related( "users", "user_groups", "assets", "nodes", - ).prefetch_related('labels', 'labels__label') + ) return queryset @staticmethod @@ -209,7 +212,6 @@ class AssetPermissionListSerializer(AssetPermissionSerializer): def setup_eager_loading(cls, queryset): """Perform necessary eager loading of data.""" queryset = queryset \ - .prefetch_related('labels', 'labels__label') \ .annotate(users_amount=Count("users", distinct=True), user_groups_amount=Count("user_groups", distinct=True), assets_amount=Count("assets", distinct=True), diff --git a/apps/perms/serializers/user_permission.py b/apps/perms/serializers/user_permission.py index 1d108bb92..c1a2ecaa4 100644 --- a/apps/perms/serializers/user_permission.py +++ b/apps/perms/serializers/user_permission.py @@ -40,7 +40,7 @@ class AssetPermedSerializer(OrgResourceModelSerializerMixin, ResourceLabelsMixin @classmethod def setup_eager_loading(cls, queryset): """ Perform necessary eager loading of data. """ - queryset = queryset.prefetch_related('domain', 'nodes', 'labels') \ + queryset = queryset.prefetch_related('domain', 'nodes') \ .prefetch_related('platform') \ .annotate(category=F("platform__category")) \ .annotate(type=F("platform__type")) @@ -59,6 +59,7 @@ class NodePermedSerializer(serializers.ModelSerializer): class AccountsPermedSerializer(serializers.ModelSerializer): actions = ActionChoicesField(read_only=True) + username = serializers.CharField(source='full_username', read_only=True) class Meta: model = Account diff --git a/apps/perms/signal_handlers/refresh_perms.py b/apps/perms/signal_handlers/refresh_perms.py index 7220bceba..3d4708c79 100644 --- a/apps/perms/signal_handlers/refresh_perms.py +++ b/apps/perms/signal_handlers/refresh_perms.py @@ -8,7 +8,7 @@ from common.const.signals import POST_ADD, POST_REMOVE, POST_CLEAR from common.exceptions import M2MReverseNotAllowed from common.utils import get_logger, get_object_or_none from perms.models import AssetPermission -from perms.utils import UserPermTreeExpireUtil +from perms.utils import UserPermTreeExpireUtil, UserPermAssetUtil from users.models import User, UserGroup logger = get_logger(__file__) @@ -42,6 +42,7 @@ def on_user_groups_change(sender, instance, action, reverse, pk_set, **kwargs): return UserPermTreeExpireUtil().expire_perm_tree_for_users_orgs(user_ids, [org_id]) + UserPermAssetUtil.refresh_type_nodes_tree_cache(user_ids) @receiver([pre_delete], sender=AssetPermission) @@ -96,6 +97,7 @@ def on_asset_permission_users_changed(sender, action, reverse, instance, pk_set, return user_ids = pk_set UserPermTreeExpireUtil().expire_perm_tree_for_users_orgs(user_ids, [instance.org.id]) + UserPermAssetUtil.refresh_type_nodes_tree_cache(user_ids) @receiver(m2m_changed, sender=AssetPermission.user_groups.through) diff --git a/apps/perms/utils/asset_perm.py b/apps/perms/utils/asset_perm.py index f6d4ab2ca..d72a107fd 100644 --- a/apps/perms/utils/asset_perm.py +++ b/apps/perms/utils/asset_perm.py @@ -38,14 +38,14 @@ class PermAssetDetailUtil: queryset = Asset.objects.filter(id=self.asset_id) return queryset.get() - def validate_permission(self, account_name, protocol): + def validate_permission(self, account_alias, protocol): with tmp_to_org(self.asset.org): protocols = self.get_permed_protocols_for_user(only_name=True) if 'all' not in protocols and protocol not in protocols: return None permed_accounts = self.get_permed_accounts_for_user() accounts_mapper = {account.alias: account for account in permed_accounts} - account = accounts_mapper.get(account_name) + account = accounts_mapper.get(account_alias) return account @lazyproperty @@ -88,7 +88,7 @@ class PermAssetDetailUtil: if not all_action_bit: return alias_action_bit_mapper, alias_date_expired_mapper - asset_account_usernames = asset.accounts.all().active().values_list('username', flat=True) + asset_account_usernames = asset.all_valid_accounts.values_list('username', flat=True) for username in asset_account_usernames: alias_action_bit_mapper[username] |= all_action_bit alias_date_expired_mapper[username].extend( @@ -100,7 +100,7 @@ class PermAssetDetailUtil: def map_alias_to_accounts(cls, alias_action_bit_mapper, alias_date_expired_mapper, asset, user): username_accounts_mapper = defaultdict(list) cleaned_accounts_expired = defaultdict(list) - asset_accounts = asset.accounts.all().active() + asset_accounts = asset.all_valid_accounts.all() # 用户名 -> 账号 for account in asset_accounts: @@ -135,11 +135,18 @@ class PermAssetDetailUtil: alias_action_bit_mapper, alias_date_expired_mapper, asset, user ) accounts = [] + virtual_accounts = [] for account, action_bit in cleaned_accounts_action_bit.items(): account.actions = action_bit account.date_expired = max(cleaned_accounts_expired[account]) - accounts.append(account) - return accounts + + if account.username.startswith('@'): + virtual_accounts.append(account) + else: + accounts.append(account) + accounts.sort(key=lambda x: x.username) + virtual_accounts.sort(key=lambda x: x.username) + return accounts + virtual_accounts def check_perm_protocols(self, protocols): """ diff --git a/apps/perms/utils/user_perm.py b/apps/perms/utils/user_perm.py index add9d8baf..80a3fa5b5 100644 --- a/apps/perms/utils/user_perm.py +++ b/apps/perms/utils/user_perm.py @@ -4,12 +4,13 @@ import re from django.conf import settings from django.core.cache import cache from django.db.models import Q +from django.utils.translation import get_language from rest_framework.utils.encoders import JSONEncoder from assets.const import AllTypes from assets.models import FavoriteAsset, Asset, Node from common.utils.common import timeit, get_logger -from orgs.utils import current_org +from orgs.utils import current_org, get_current_org_id from perms.models import PermNode, UserAssetGrantedTreeNodeRelation, AssetPermission from .permission import AssetPermissionUtil @@ -93,7 +94,8 @@ class UserPermAssetUtil(AssetPermissionPermAssetUtil): @classmethod def get_type_nodes_tree_or_cached(cls, user): - key = f'perms:type-nodes-tree:{user.id}:{current_org.id}' + lang = get_language() + key = f'perms:type-nodes-tree:{user.id}:{current_org.id}:{lang}' nodes = cache.get(key) if nodes is None: nodes = cls(user).get_type_nodes_tree() @@ -103,10 +105,18 @@ class UserPermAssetUtil(AssetPermissionPermAssetUtil): nodes = json.loads(nodes) return nodes - def refresh_type_nodes_tree_cache(self): + @classmethod + def refresh_type_nodes_tree_cache(cls, user_ids=None, org_id=None): + if user_ids is None: + user_ids = [] + + if org_id is None: + org_id = get_current_org_id() + logger.debug("Refresh type nodes tree cache") - key = f'perms:type-nodes-tree:{self.user.id}:{current_org.id}' - cache.delete(key) + for user_id in user_ids: + key = f'perms:type-nodes-tree:{user_id}:{org_id}*' + cache.delete_pattern(key) def refresh_favorite_assets(self): favor_ids = FavoriteAsset.objects.filter(user=self.user).values_list('asset_id', flat=True) diff --git a/apps/perms/utils/user_perm_tree.py b/apps/perms/utils/user_perm_tree.py index f89f5cd46..2740d3578 100644 --- a/apps/perms/utils/user_perm_tree.py +++ b/apps/perms/utils/user_perm_tree.py @@ -182,6 +182,7 @@ class UserPermTreeExpireUtil(_UserPermTreeCacheMixin): for org_id, perms_id in org_perms_mapper.items(): user_ids = AssetPermission.get_all_users_for_perms(perm_ids, flat=True) self.expire_perm_tree_for_users_orgs(user_ids, [org_id]) + UserPermAssetUtil.refresh_type_nodes_tree_cache(user_ids, org_id) def expire_perm_tree_for_user_group(self, user_group): group_ids = [user_group.id] @@ -193,6 +194,7 @@ class UserPermTreeExpireUtil(_UserPermTreeCacheMixin): .filter(usergroup_id__in=group_ids) \ .values_list('user_id', flat=True).distinct() self.expire_perm_tree_for_users_orgs(user_ids, org_ids) + UserPermAssetUtil.refresh_type_nodes_tree_cache(user_ids) @on_transaction_commit def expire_perm_tree_for_users_orgs(self, user_ids, org_ids): @@ -232,7 +234,7 @@ def refresh_user_favorite_assets(users=()): for user in users: util = UserPermAssetUtil(user) util.refresh_favorite_assets() - util.refresh_type_nodes_tree_cache() + util.refresh_type_nodes_tree_cache([user.id]) class UserPermTreeBuildUtil(object): diff --git a/apps/settings/api/settings.py b/apps/settings/api/settings.py index 00e6bd873..dbbf57938 100644 --- a/apps/settings/api/settings.py +++ b/apps/settings/api/settings.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- # -import re from django.conf import settings from django.core.cache import cache @@ -14,6 +13,7 @@ from rest_framework.views import APIView from common.utils import get_logger from jumpserver.conf import Config from rbac.permissions import RBACPermission +from users.models import User from .. import serializers from ..models import Setting from ..signals import category_setting_updated @@ -182,7 +182,7 @@ class SettingsApi(generics.RetrieveUpdateAPIView): if hasattr(serializer, 'post_save'): serializer.post_save() self.send_signal(serializer) - if self.request.query_params.get('category') == 'ldap': + if self.request.query_params.get('category') == User.Source.ldap.value: self.clean_ldap_user_dn_cache() @staticmethod diff --git a/apps/settings/serializers/auth/ldap.py b/apps/settings/serializers/auth/ldap.py index 767bbdeea..06a856c62 100644 --- a/apps/settings/serializers/auth/ldap.py +++ b/apps/settings/serializers/auth/ldap.py @@ -84,6 +84,10 @@ class LDAPSettingSerializer(LDAPSerializerMixin, serializers.Serializer): min_value=1, max_value=300, required=False, label=_('Connect timeout (s)'), ) + AUTH_LDAP_STRICT_SYNC = serializers.BooleanField( + required=False, label=_('Strict sync'), + help_text=_('In strict mode, users not found in LDAP will be disabled during full or automatic sync') + ) AUTH_LDAP_CACHE_TIMEOUT = serializers.IntegerField( min_value=0, max_value=3600 * 24 * 30 * 12, default=0, diff --git a/apps/settings/serializers/auth/ldap_ha.py b/apps/settings/serializers/auth/ldap_ha.py index 95cf3c5b9..3f3acd187 100644 --- a/apps/settings/serializers/auth/ldap_ha.py +++ b/apps/settings/serializers/auth/ldap_ha.py @@ -4,7 +4,6 @@ from rest_framework import serializers from common.serializers.fields import EncryptedField from .base import OrgListField from .mixin import LDAPSerializerMixin -from ops.mixin import PeriodTaskSerializerMixin __all__ = ['LDAPHATestConfigSerializer', 'LDAPHASettingSerializer'] @@ -67,6 +66,10 @@ class LDAPHASettingSerializer(LDAPSerializerMixin, serializers.Serializer): min_value=1, max_value=300, required=False, label=_('Connect timeout (s)'), ) + AUTH_LDAP_HA_STRICT_SYNC = serializers.BooleanField( + required=False, label=_('Strict sync'), + help_text=_('In strict mode, users not found in LDAP will be disabled during full or automatic sync') + ) AUTH_LDAP_HA_CACHE_TIMEOUT = serializers.IntegerField( min_value=0, max_value=3600 * 24 * 30 * 12, default=0, diff --git a/apps/settings/serializers/public.py b/apps/settings/serializers/public.py index d1f428b86..d3a1b1761 100644 --- a/apps/settings/serializers/public.py +++ b/apps/settings/serializers/public.py @@ -71,6 +71,7 @@ class PrivateSettingSerializer(PublicSettingSerializer): TOOL_USER_ENABLED = serializers.BooleanField() DEFAULT_EXPIRED_YEARS = serializers.IntegerField() + PRIVACY_MODE = serializers.BooleanField() class ServerInfoSerializer(serializers.Serializer): diff --git a/apps/settings/serializers/security.py b/apps/settings/serializers/security.py index 9cb972c0c..a6cc54000 100644 --- a/apps/settings/serializers/security.py +++ b/apps/settings/serializers/security.py @@ -124,6 +124,11 @@ class SecurityAuthSerializer(serializers.Serializer): label=_('Third-party login MFA'), help_text=_('The third-party login modes include OIDC, CAS, and SAML2'), ) + SECURITY_MFA_BY_EMAIL = serializers.BooleanField( + required=False, default=False, + label=_('MFA via Email'), + help_text=_('Email as a method for multi-factor authentication') + ) OTP_ISSUER_NAME = serializers.CharField( required=False, max_length=16, label=_('OTP issuer name'), ) @@ -189,7 +194,6 @@ class SecurityAuthSerializer(serializers.Serializer): class SecuritySessionSerializer(serializers.Serializer): SECURITY_WATERMARK_ENABLED = serializers.BooleanField( required=True, label=_('Watermark'), - help_text=_('Enabled, the web session and replay contains watermark information') ) SECURITY_MAX_IDLE_TIME = serializers.IntegerField( min_value=1, max_value=99999, required=False, diff --git a/apps/settings/serializers/terminal.py b/apps/settings/serializers/terminal.py index c9172b228..5d51425a4 100644 --- a/apps/settings/serializers/terminal.py +++ b/apps/settings/serializers/terminal.py @@ -18,14 +18,18 @@ class TerminalSettingSerializer(serializers.Serializer): ('25', '25'), ('50', '50'), ) - SECURITY_SERVICE_ACCOUNT_REGISTRATION = serializers.BooleanField( + SECURITY_SERVICE_ACCOUNT_REGISTRATION = serializers.ChoiceField( + choices=[ + ('auto', _('Auto(Enabled for the first 5 minutes after startup, then disabled.)')), + (True, _('Enable')), (False, _('Disable')) + ], required=True, label=_('Registration'), help_text=_( "Allow component register, after all component setup, you should disable this for security" ) ) TERMINAL_PASSWORD_AUTH = serializers.BooleanField( - required=False, label=_("Password"), + required=False, label=_("Password"), help_text=_( '* Allow users to log in to the KoKo component via password authentication' ) @@ -46,7 +50,7 @@ class TerminalSettingSerializer(serializers.Serializer): PAGE_SIZE_CHOICES, required=False, label=_('Asset page size') ) TERMINAL_MAGNUS_ENABLED = serializers.BooleanField( - label="Magnus", + label="Magnus", help_text=_( '* You can individually configure the service address and port in the service endpoint' '
' diff --git a/apps/settings/tasks/ldap.py b/apps/settings/tasks/ldap.py index b90394814..d779ab134 100644 --- a/apps/settings/tasks/ldap.py +++ b/apps/settings/tasks/ldap.py @@ -1,6 +1,5 @@ # coding: utf-8 import time - from celery import shared_task from django.conf import settings from django.utils.translation import gettext_lazy as _ @@ -24,7 +23,7 @@ __all__ = [ logger = get_logger(__file__) -def sync_ldap_user(category='ldap'): +def sync_ldap_user(category=User.Source.ldap.value): LDAPSyncUtil(category=category).perform_sync() @@ -33,7 +32,7 @@ def perform_import(category, util_server): time_start_display = local_now_display() logger.info(f"Start import {category} ldap user task") - util_import = LDAPImportUtil() + util_import = LDAPImportUtil(category) users = util_server.search() if settings.XPACK_ENABLED: @@ -44,12 +43,7 @@ def perform_import(category, util_server): default_org = Organization.default() orgs = list(set([Organization.get_instance(org_id, default=default_org) for org_id in org_ids])) - new_users, errors = util_import.perform_import(users, orgs) - - if errors: - logger.error(f"Imported {category} LDAP users errors: {errors}") - else: - logger.info(f"Imported {len(users)} {category} users successfully") + new_users, errors, disable_users = util_import.perform_import(users, orgs) receivers_setting = f"AUTH_{category.upper()}_SYNC_RECEIVERS" if getattr(settings, receivers_setting, None): @@ -76,7 +70,7 @@ def perform_import(category, util_server): ) ) def import_ldap_user(): - perform_import('ldap', LDAPServerUtil()) + perform_import(User.Source.ldap.value, LDAPServerUtil()) @shared_task( @@ -86,7 +80,8 @@ def import_ldap_user(): ) ) def import_ldap_ha_user(): - perform_import('ldap_ha', LDAPServerUtil(category='ldap_ha')) + category = User.Source.ldap_ha.value + perform_import(category, LDAPServerUtil(category=category)) def register_periodic_task(task_name, task_func, interval_key, enabled_key, crontab_key, **kwargs): diff --git a/apps/settings/utils/ldap.py b/apps/settings/utils/ldap.py index e896c190e..24311adab 100644 --- a/apps/settings/utils/ldap.py +++ b/apps/settings/utils/ldap.py @@ -47,7 +47,7 @@ LDAP_USE_CACHE_FLAGS = [1, '1', 'true', 'True', True] class LDAPConfig(object): - def __init__(self, config=None, category='ldap'): + def __init__(self, config=None, category=User.Source.ldap.value): self.server_uri = None self.bind_dn = None self.password = None @@ -73,7 +73,7 @@ class LDAPConfig(object): self.auth_ldap = config.get('auth_ldap') def load_from_settings(self): - prefix = 'AUTH_LDAP' if self.category == 'ldap' else 'AUTH_LDAP_HA' + prefix = 'AUTH_LDAP' if self.category == User.Source.ldap.value else 'AUTH_LDAP_HA' self.server_uri = getattr(settings, f"{prefix}_SERVER_URI") self.bind_dn = getattr(settings, f"{prefix}_BIND_DN") self.password = getattr(settings, f"{prefix}_BIND_PASSWORD") @@ -86,7 +86,7 @@ class LDAPConfig(object): class LDAPServerUtil(object): - def __init__(self, config=None, category='ldap'): + def __init__(self, config=None, category=User.Source.ldap.value): if isinstance(config, dict): self.config = LDAPConfig(config=config) elif isinstance(config, LDAPConfig): @@ -234,14 +234,11 @@ class LDAPServerUtil(object): class LDAPCacheUtil(object): - def __init__(self, category='ldap'): + def __init__(self, category=User.Source.ldap.value): self.search_users = None self.search_value = None self.category = category - if self.category == 'ldap': - self.cache_key_users = 'CACHE_KEY_LDAP_USERS' - else: - self.cache_key_users = 'CACHE_KEY_LDAP_HA_USERS' + self.cache_key_users = 'CACHE_KEY_{}_USERS'.format(self.category.upper()) def set_users(self, users): logger.info('Set ldap users to cache, count: {}'.format(len(users))) @@ -295,7 +292,7 @@ class LDAPSyncUtil(object): TASK_STATUS_IS_RUNNING = 'RUNNING' TASK_STATUS_IS_OVER = 'OVER' - def __init__(self, category='ldap'): + def __init__(self, category=User.Source.ldap.value): self.server_util = LDAPServerUtil(category=category) self.cache_util = LDAPCacheUtil(category=category) self.task_error_msg = None @@ -371,8 +368,9 @@ class LDAPSyncUtil(object): class LDAPImportUtil(object): user_group_name_prefix = 'AD ' - def __init__(self): - pass + def __init__(self, category=User.Source.ldap.value, is_sync_all=True): + self.category = category + self.is_sync_all = is_sync_all @staticmethod def get_user_email(user): @@ -384,7 +382,7 @@ class LDAPImportUtil(object): def update_or_create(self, user): user['email'] = self.get_user_email(user) if user['username'] not in ['admin']: - user['source'] = User.Source.ldap.value + user['source'] = self.category user.pop('status', None) obj, created = User.objects.update_or_create( username=user['username'], defaults=user @@ -435,7 +433,29 @@ class LDAPImportUtil(object): for org in orgs: self.bind_org(org, objs, group_users_mapper) logger.info('End perform import ldap users') - return new_users, errors + # 禁止ldap 不存在的用户的 + disable_usernames = [] + if self.strict_sync_enabled and self.is_sync_all: + disable_usernames = self.disable_not_exist_users(users) + + if errors: + logger.error(f"Imported {self.category.upper()} users errors: {errors}") + else: + logger.info(f"Imported {len(users)} {self.category.upper()} users successfully") + return new_users, errors, disable_usernames + + @property + def strict_sync_enabled(self): + return getattr(settings, 'AUTH_{}_STRICT_SYNC'.format(self.category.upper()), False) + + def disable_not_exist_users(self, users): + ldap_users = [user['username'] for user in users] + disable_users = User.objects.filter(source=self.category, is_active=True).exclude(username__in=ldap_users).all() + disable_usernames = disable_users.values_list('username', flat=True) + disable_usernames = list(map(str, disable_usernames)) + disable_users.update(is_active=False) + logger.info(f"Disable {len(disable_usernames)} {self.category.upper()} users successfully") + return disable_usernames def exit_user_group(self, user_groups_mapper): # 通过对比查询本次导入用户需要移除的用户组 @@ -485,10 +505,10 @@ class LDAPTestUtil(object): class LDAPBeforeLoginCheckError(LDAPExceptionError): pass - def __init__(self, config=None, category='ldap'): + def __init__(self, config=None, category=User.Source.ldap.value): self.config = LDAPConfig(config, category) self.user_entries = [] - if category == 'ldap': + if category == User.Source.ldap.value: self.backend = LDAPAuthorizationBackend() else: self.backend = LDAPHAAuthorizationBackend() @@ -665,7 +685,7 @@ class LDAPTestUtil(object): # test login def _test_before_login_check(self, username, password): - from settings.ws import CACHE_KEY_LDAP_TEST_CONFIG_TASK_STATUS, TASK_STATUS_IS_OVER + from settings.ws import CACHE_KEY_LDAP_TEST_CONFIG_TASK_STATUS if not cache.get(CACHE_KEY_LDAP_TEST_CONFIG_TASK_STATUS): self.test_config() diff --git a/apps/settings/ws.py b/apps/settings/ws.py index 5d119ceaa..e9d9ec8b3 100644 --- a/apps/settings/ws.py +++ b/apps/settings/ws.py @@ -1,30 +1,31 @@ # -*- coding: utf-8 -*- # -import json import asyncio +import json +from urllib.parse import parse_qs from asgiref.sync import sync_to_async from channels.generic.websocket import AsyncJsonWebsocketConsumer -from django.core.cache import cache from django.conf import settings -from django.utils.translation import gettext_lazy as _ +from django.core.cache import cache from django.utils import translation -from urllib.parse import parse_qs +from django.utils.translation import gettext_lazy as _ from common.db.utils import close_old_connections from common.utils import get_logger +from orgs.models import Organization +from orgs.utils import current_org from settings.serializers import ( LDAPHATestConfigSerializer, LDAPTestConfigSerializer, LDAPTestLoginSerializer ) -from orgs.models import Organization -from orgs.utils import current_org from settings.tasks import sync_ldap_user from settings.utils import ( LDAPServerUtil, LDAPCacheUtil, LDAPImportUtil, LDAPSyncUtil, LDAP_USE_CACHE_FLAGS, LDAPTestUtil ) +from users.models import User from .const import ImportStatus from .tools import ( verbose_ping, verbose_telnet, verbose_nmap, @@ -130,7 +131,7 @@ class LdapWebsocket(AsyncJsonWebsocketConsumer): async def connect(self): user = self.scope["user"] query = parse_qs(self.scope['query_string'].decode()) - self.category = query.get('category', ['ldap'])[0] + self.category = query.get('category', [User.Source.ldap.value])[0] if user.is_authenticated: await self.accept() else: @@ -157,7 +158,7 @@ class LdapWebsocket(AsyncJsonWebsocketConsumer): close_old_connections() def get_ldap_config(self, serializer): - prefix = 'AUTH_LDAP_' if self.category == 'ldap' else 'AUTH_LDAP_HA_' + prefix = 'AUTH_{}_'.format(self.category.upper()) config = { 'server_uri': serializer.validated_data.get(f"{prefix}SERVER_URI"), @@ -182,7 +183,7 @@ class LdapWebsocket(AsyncJsonWebsocketConsumer): cache.set(task_key, TASK_STATUS_IS_OVER, ttl) def run_testing_config(self, data): - if self.category == 'ldap': + if self.category == User.Source.ldap.value: serializer = LDAPTestConfigSerializer(data=data) else: serializer = LDAPHATestConfigSerializer(data=data) @@ -222,12 +223,17 @@ class LdapWebsocket(AsyncJsonWebsocketConsumer): msg = _('No LDAP user was found') else: orgs = self.get_orgs(org_ids) - new_users, error_msg = LDAPImportUtil().perform_import(users, orgs) + is_sync_all = '*' in username_list + new_users, error_msg, disable_users = LDAPImportUtil( + self.category, is_sync_all + ).perform_import(users, orgs) ok = True success_count = len(users) - len(error_msg) msg = _('Total {}, success {}, failure {}').format( len(users), success_count, len(error_msg) ) + if disable_users: + msg += _(', disabled {}').format(len(disable_users)) self.set_users_status(users, error_msg) except Exception as e: msg = str(e) diff --git a/apps/templates/_footer.html b/apps/templates/_footer.html index 3c05f9eb1..3935a5499 100644 --- a/apps/templates/_footer.html +++ b/apps/templates/_footer.html @@ -2,7 +2,6 @@