Compare commits

...

61 Commits
master ... dev

Author SHA1 Message Date
wangruidong be0f04862a fix: Correctly pass runas value in ACL check for job execution 2025-11-19 19:08:29 +08:00
feng 1a3fb2f0db perf: Account bulk error prompt 2025-11-19 17:42:39 +08:00
Eric 4cd70efe66 perf: fix mp4 type replay 2025-11-19 17:10:26 +08:00
wangruidong 28700c01c8 perf: The login log records the locked login log 2025-11-19 17:08:55 +08:00
wangruidong 4524822245 fix: Solve this version of Mysql doesn't yet support 'LIMIT & IN/ALL/ANY/S0ME subquery' error 2025-11-19 09:52:05 +08:00
Eric 9d04fda018 perf: add match perm to user for suggestions api 2025-11-19 09:48:31 +08:00
老广 01c277cd1e Add Client to JumpServer components list 2025-11-19 09:19:52 +08:00
wangruidong c4b3531d72 fix: correct handling of changed field values in operate log 2025-11-18 10:32:49 +08:00
feng 8870d1ef9e perf: Translate 2025-11-17 18:25:40 +08:00
wangruidong 6c5086a083 perf: implement login asset ACL checks in Job and JobExecution viewsets 2025-11-17 10:53:22 +08:00
wrd e9f762a982 Revert "perf: Reduce the number of pub sub processing threads (#16072)"
This reverts commit 70068c9253.
2025-11-17 10:52:16 +08:00
wangruidong d4d4cadbcd fix: OAuth2 Only allow existing users to log in operate log error 2025-11-13 18:42:28 +08:00
fit2bot 5e56590405
perf: change base img (#16279)
* perf: change base img

* perf: add gcc

* perf: change base image

* perf: Update Dockerfile with new base image tag

---------

Co-authored-by: ibuler <ibuler@qq.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-11-13 17:32:51 +08:00
wangruidong ad8c0f6664 fix: SAML2 Only allow existing users to log in operate log error 2025-11-13 16:36:58 +08:00
wangruidong 47dd6babfc perf: add id verbose_name 2025-11-13 15:17:14 +08:00
ibuler 691d1c4dba perf: remove client key 2025-11-13 14:36:40 +08:00
ibuler ac485804d5 perf: postgresql support ssl 2025-11-13 14:36:40 +08:00
ibuler 51e5fdb301 perf: change i18n 2025-11-13 10:05:37 +08:00
feng 69c4d613f7 perf: Add client support version 2025-11-11 16:37:12 +08:00
github-actions[bot] 1ad825bf0d perf: Update Dockerfile with new base image tag 2025-11-11 15:11:51 +08:00
ibuler a286cb9343 deps: upgrade playwright 2025-11-11 15:11:51 +08:00
ibuler 1eb489bb2d perf: upgrade pg client 2025-11-11 14:24:53 +08:00
fit2bot 4334ae9e5e
perf: update apt source config (#16265)
* perf: upgrade os to trixie

* perf: update apt source config

* perf: Update Dockerfile with new base image tag

---------

Co-authored-by: ibuler <ibuler@qq.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-11-11 14:17:35 +08:00
fit2bot f2e346a0c3
perf: upgrade os to trixie (#16263)
* perf: upgrade os to trixie

* perf: Update Dockerfile with new base image tag

---------

Co-authored-by: ibuler <ibuler@qq.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-11-11 11:52:17 +08:00
wangruidong dc20b06431 fix: i18n error 2025-11-10 18:14:18 +08:00
fit2bot 387a9248fc
perf: Add a key to cover all protocols and ports (#16227)
Co-authored-by: wangruidong <940853815@qq.com>
2025-11-10 18:04:00 +08:00
wangruidong 705fd6385f fix: i18n error 2025-11-10 18:03:51 +08:00
fit2bot 0ccf36621f
perf: Translate select files (#16212)
Co-authored-by: wangruidong <940853815@qq.com>
2025-11-06 18:26:54 +08:00
fit2bot a9ae12fc2c
perf: Implement data masking rules ACL check before job execution (#16216)
* perf: Implement data masking rules ACL check before job execution

* perf: Add login asset ACL check during job creation

* perf: Remove unused code.

---------

Co-authored-by: wangruidong <940853815@qq.com>
2025-11-06 18:25:34 +08:00
老广 7b1a25adde Add issue spam configuration file 2025-11-06 18:13:42 +08:00
feng a1b5eb1cd8 perf: Translate 2025-11-06 15:50:15 +08:00
wangruidong 24ac642c5e fix: Escape percentage signs in gateway password for sshpass command 2025-11-06 14:10:24 +08:00
wangruidong e4f5e21219 perf: Support batch import of leak passwords 2025-11-06 14:09:09 +08:00
feng a2aae9db47 perf: Translate 2025-11-05 19:07:48 +08:00
feng 206c43cf75 fix: Fixed the issue of inaccurate calculation of the number of dashboard commands. 2025-11-04 18:14:02 +08:00
feng 019a657ec3 perf: Ssotoken login create operator choose org_id 2025-11-03 17:36:04 +08:00
feng fad60ee40f perf: Translate 2025-11-03 10:51:22 +08:00
feng 1728412793 perf: Bulk account support node 2025-10-31 17:19:48 +08:00
feng 3e93034fbc perf: Update remote_client 2025-10-30 10:12:40 +08:00
feng f4b3a7d73a perf: Sync feishu info 2025-10-29 14:53:45 +08:00
wrd 3781c40179 Revert "perf: update fields serialization and bump django and djangorestframe…"
This reverts commit dd0cacb4bc.
2025-10-29 11:19:50 +08:00
ibuler fab6219cea perf: branches auto cleanup 2025-10-29 10:10:21 +08:00
fit2bot dd0cacb4bc
perf: update fields serialization and bump django and djangorestframework versions (#16209)
Co-authored-by: wangruidong <940853815@qq.com>
2025-10-28 16:42:06 +08:00
ibuler b8639601a1 perf: branches auto cleanup 2025-10-27 15:33:06 +08:00
老广 ab9882c9c1
perf: check api summary 2025-10-27 15:28:21 +08:00
ibuler 77a7b74b15 perf: print summary in the end 2025-10-27 15:26:04 +08:00
dependabot[bot] 4bc05865f1 chore(deps): bump python-ldap from 3.4.3 to 3.4.5
Bumps [python-ldap](https://github.com/python-ldap/python-ldap) from 3.4.3 to 3.4.5.
- [Release notes](https://github.com/python-ldap/python-ldap/releases)
- [Changelog](https://github.com/python-ldap/python-ldap/blob/python-ldap-3.4.5/CHANGES)
- [Commits](https://github.com/python-ldap/python-ldap/compare/python-ldap-3.4.3...python-ldap-3.4.5)

---
updated-dependencies:
- dependency-name: python-ldap
  dependency-version: 3.4.5
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-27 15:24:06 +08:00
fit2bot bec9e4f3a7
perf: update deps kombu (#16133)
* perf: update deps kombu

* perf: Update Dockerfile with new base image tag

---------

Co-authored-by: Ewall555 <a03216@foxmail.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: wrd <940853815@qq.com>
2025-10-27 15:18:16 +08:00
fit2bot 359adf3dbb
perf: add check api for common user 2025-10-27 14:54:02 +08:00
feng ac54bb672c fix: Bulk account invalid secret_reset 2025-10-24 18:18:16 +08:00
ibuler 9e3ba00bc4 perf: search support keyword q=str to search 2025-10-24 10:22:49 +08:00
wangruidong 2ec9a43317 fix: Any change to the LDAP server URI should require re-authentication and explicit re-entry of
the bind password, not reuse stored credentials
2025-10-23 15:29:47 +08:00
wangruidong 06be56ef06 fix: Enhance state check to include query parameter for session validation 2025-10-23 14:41:50 +08:00
ibuler b2a618b206 perf: user sugguestion limit and serializer 2025-10-23 14:40:37 +08:00
wangruidong 1039c2e320 perf: ws/ldap perms check 2025-10-23 14:26:24 +08:00
fit2bot 8d7267400d
fix: OpenID Only allow existing users to log in operate log error (#16013)
Co-authored-by: wangruidong <940853815@qq.com>
2025-10-22 14:53:12 +08:00
ibuler d67e473884 perf: add auto cleanup branches 2025-10-22 11:46:09 +08:00
fit2bot 70068c9253
perf: Reduce the number of pub sub processing threads (#16072)
* perf: Reduce the number of pub sub processing threads

* perf: Using thread pool to process messages

---------

Co-authored-by: wangruidong <940853815@qq.com>
2025-10-21 17:41:14 +08:00
wangruidong d68babb2e1 fix: Using winrm protocol to transfer files did not create a directory problem 2025-10-21 17:31:41 +08:00
wangruidong afb6f466d5 perf: AppletHost translate 2025-10-21 17:31:03 +08:00
ibuler 453ad331ee perf: token retrieve 2025-10-21 10:48:08 +08:00
80 changed files with 2539 additions and 1636 deletions

26
.github/.github/issue-spam-config.json vendored Normal file
View File

@ -0,0 +1,26 @@
{
"dry_run": false,
"min_account_age_days": 3,
"max_urls_for_spam": 1,
"min_body_len_for_links": 40,
"spam_words": [
"call now",
"zadzwoń",
"zadzwoń teraz",
"kontakt",
"telefon",
"telefone",
"contato",
"suporte",
"infolinii",
"click here",
"buy now",
"subscribe",
"visit"
],
"bracket_max": 6,
"special_char_density_threshold": 0.12,
"phone_regex": "\\+?\\d[\\d\\-\\s\\(\\)\\.]{6,}\\d",
"labels_for_spam": ["spam"],
"labels_for_review": ["needs-triage"]
}

View File

@ -1,74 +1,72 @@
name: Build and Push Base Image
on:
pull_request:
branches:
- 'dev'
- 'v*'
paths:
- poetry.lock
- pyproject.toml
- Dockerfile-base
- package.json
- go.mod
- yarn.lock
- pom.xml
- install_deps.sh
- utils/clean_site_packages.sh
types:
- opened
- synchronize
- reopened
pull_request:
branches:
- 'dev'
- 'v*'
paths:
- poetry.lock
- pyproject.toml
- Dockerfile-base
- package.json
- go.mod
- yarn.lock
- pom.xml
- install_deps.sh
- utils/clean_site_packages.sh
types:
- opened
- synchronize
- reopened
jobs:
build-and-push:
runs-on: ubuntu-22.04
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.ref }}
build-and-push:
runs-on: ubuntu-22.04
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.ref }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
with:
image: tonistiigi/binfmt:qemu-v7.0.0-28
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to DockerHub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to DockerHub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Extract date
id: vars
run: echo "IMAGE_TAG=$(date +'%Y%m%d_%H%M%S')" >> $GITHUB_ENV
- name: Extract date
id: vars
run: echo "IMAGE_TAG=$(date +'%Y%m%d_%H%M%S')" >> $GITHUB_ENV
- name: Extract repository name
id: repo
run: echo "REPO=$(basename ${{ github.repository }})" >> $GITHUB_ENV
- name: Extract repository name
id: repo
run: echo "REPO=$(basename ${{ github.repository }})" >> $GITHUB_ENV
- name: Build and push multi-arch image
uses: docker/build-push-action@v6
with:
platforms: linux/amd64,linux/arm64
push: true
file: Dockerfile-base
tags: jumpserver/core-base:${{ env.IMAGE_TAG }}
- name: Build and push multi-arch image
uses: docker/build-push-action@v6
with:
platforms: linux/amd64,linux/arm64
push: true
file: Dockerfile-base
tags: jumpserver/core-base:${{ env.IMAGE_TAG }}
- name: Update Dockerfile
run: |
sed -i 's|-base:.* AS stage-build|-base:${{ env.IMAGE_TAG }} AS stage-build|' Dockerfile
- name: Update Dockerfile
run: |
sed -i 's|-base:.* AS stage-build|-base:${{ env.IMAGE_TAG }} AS stage-build|' Dockerfile
- name: Commit changes
run: |
git config --global user.name 'github-actions[bot]'
git config --global user.email 'github-actions[bot]@users.noreply.github.com'
git add Dockerfile
git commit -m "perf: Update Dockerfile with new base image tag"
git push origin ${{ github.event.pull_request.head.ref }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Commit changes
run: |
git config --global user.name 'github-actions[bot]'
git config --global user.email 'github-actions[bot]@users.noreply.github.com'
git add Dockerfile
git commit -m "perf: Update Dockerfile with new base image tag"
git push origin ${{ github.event.pull_request.head.ref }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

123
.github/workflows/cleanup-branches.yml vendored Normal file
View File

@ -0,0 +1,123 @@
name: Cleanup PR Branches
on:
schedule:
# 每天凌晨2点运行
- cron: '0 2 * * *'
workflow_dispatch:
# 允许手动触发
inputs:
dry_run:
description: 'Dry run mode (default: true)'
required: false
default: 'true'
type: boolean
jobs:
cleanup-branches:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0 # 获取所有分支和提交历史
- name: Setup Git
run: |
git config --global user.name "GitHub Actions"
git config --global user.email "actions@github.com"
- name: Get dry run setting
id: dry-run
run: |
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
echo "dry_run=${{ github.event.inputs.dry_run }}" >> $GITHUB_OUTPUT
else
echo "dry_run=false" >> $GITHUB_OUTPUT
fi
- name: Cleanup branches
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
DRY_RUN: ${{ steps.dry-run.outputs.dry_run }}
run: |
echo "Starting branch cleanup..."
echo "Dry run mode: $DRY_RUN"
# 获取所有本地分支
git fetch --all --prune
# 获取以 pr 或 repr 开头的分支
branches=$(git branch -r | grep -E 'origin/(pr|repr)' | sed 's/origin\///' | grep -v 'HEAD')
echo "Found branches matching pattern:"
echo "$branches"
deleted_count=0
skipped_count=0
for branch in $branches; do
echo ""
echo "Processing branch: $branch"
# 检查分支是否有未合并的PR
pr_info=$(gh pr list --head "$branch" --state open --json number,title,state 2>/dev/null)
if [ $? -eq 0 ] && [ "$pr_info" != "[]" ]; then
echo " ⚠️ Branch has open PR(s), skipping deletion"
echo " PR info: $pr_info"
skipped_count=$((skipped_count + 1))
continue
fi
# 检查分支是否有已合并的PR可选如果PR已合并也可以删除
merged_pr_info=$(gh pr list --head "$branch" --state merged --json number,title,state 2>/dev/null)
if [ $? -eq 0 ] && [ "$merged_pr_info" != "[]" ]; then
echo " ✅ Branch has merged PR(s), safe to delete"
echo " Merged PR info: $merged_pr_info"
else
echo " No PRs found for this branch"
fi
# 执行删除操作
if [ "$DRY_RUN" = "true" ]; then
echo " 🔍 [DRY RUN] Would delete branch: $branch"
deleted_count=$((deleted_count + 1))
else
echo " 🗑️ Deleting branch: $branch"
# 删除远程分支
if git push origin --delete "$branch" 2>/dev/null; then
echo " ✅ Successfully deleted remote branch: $branch"
deleted_count=$((deleted_count + 1))
else
echo " ❌ Failed to delete remote branch: $branch"
fi
fi
done
echo ""
echo "=== Cleanup Summary ==="
echo "Branches processed: $(echo "$branches" | wc -l)"
echo "Branches deleted: $deleted_count"
echo "Branches skipped: $skipped_count"
if [ "$DRY_RUN" = "true" ]; then
echo ""
echo "🔍 This was a DRY RUN - no branches were actually deleted"
echo "To perform actual deletion, run this workflow manually with dry_run=false"
fi
- name: Create summary
if: always()
run: |
echo "## Branch Cleanup Summary" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**Workflow:** ${{ github.workflow }}" >> $GITHUB_STEP_SUMMARY
echo "**Run ID:** ${{ github.run_id }}" >> $GITHUB_STEP_SUMMARY
echo "**Dry Run:** ${{ steps.dry-run.outputs.dry_run }}" >> $GITHUB_STEP_SUMMARY
echo "**Triggered by:** ${{ github.event_name }}" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "Check the logs above for detailed information about processed branches." >> $GITHUB_STEP_SUMMARY

View File

@ -1,11 +1,9 @@
name: 🔀 Sync mirror to Gitee
on:
push:
branches:
- master
- dev
create:
schedule:
# 每天凌晨3点运行
- cron: '0 3 * * *'
jobs:
mirror:
@ -14,7 +12,6 @@ jobs:
steps:
- name: mirror
continue-on-error: true
if: github.event_name == 'push' || (github.event_name == 'create' && github.event.ref_type == 'tag')
uses: wearerequired/git-mirror-action@v1
env:
SSH_PRIVATE_KEY: ${{ secrets.GITEE_SSH_PRIVATE_KEY }}

View File

@ -1,4 +1,4 @@
FROM jumpserver/core-base:20251014_095903 AS stage-build
FROM jumpserver/core-base:20251113_092612 AS stage-build
ARG VERSION
@ -19,7 +19,7 @@ RUN set -ex \
&& python manage.py compilemessages
FROM jumpserver/core-base:python-3.11-slim-bullseye-v1
FROM python:3.11-slim-trixie
ENV LANG=en_US.UTF-8 \
PATH=/opt/py3/bin:$PATH
@ -39,7 +39,7 @@ ARG TOOLS=" \
ARG APT_MIRROR=http://deb.debian.org
RUN set -ex \
&& sed -i "s@http://.*.debian.org@${APT_MIRROR}@g" /etc/apt/sources.list \
&& sed -i "s@http://.*.debian.org@${APT_MIRROR}@g" /etc/apt/sources.list.d/debian.sources \
&& ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& apt-get update > /dev/null \
&& apt-get -y install --no-install-recommends ${DEPENDENCIES} \

View File

@ -1,6 +1,5 @@
FROM jumpserver/core-base:python-3.11-slim-bullseye-v1
FROM python:3.11.14-slim-trixie
ARG TARGETARCH
COPY --from=ghcr.io/astral-sh/uv:0.6.14 /uv /uvx /usr/local/bin/
# Install APT dependencies
ARG DEPENDENCIES=" \
ca-certificates \
@ -22,7 +21,7 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked,id=core \
set -ex \
&& rm -f /etc/apt/apt.conf.d/docker-clean \
&& echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache \
&& sed -i "s@http://.*.debian.org@${APT_MIRROR}@g" /etc/apt/sources.list \
&& sed -i "s@http://.*.debian.org@${APT_MIRROR}@g" /etc/apt/sources.list.d/debian.sources \
&& apt-get update > /dev/null \
&& apt-get -y install --no-install-recommends ${DEPENDENCIES} \
&& echo "no" | dpkg-reconfigure dash
@ -41,12 +40,10 @@ RUN set -ex \
WORKDIR /opt/jumpserver
ARG PIP_MIRROR=https://pypi.org/simple
ENV POETRY_PYPI_MIRROR_URL=${PIP_MIRROR}
ENV ANSIBLE_COLLECTIONS_PATHS=/opt/py3/lib/python3.11/site-packages/ansible_collections
ENV LANG=en_US.UTF-8 \
PATH=/opt/py3/bin:$PATH
ENV UV_LINK_MODE=copy
ENV SETUPTOOLS_SCM_PRETEND_VERSION=3.4.5
RUN --mount=type=cache,target=/root/.cache \
--mount=type=bind,source=pyproject.toml,target=pyproject.toml \
@ -54,6 +51,7 @@ RUN --mount=type=cache,target=/root/.cache \
--mount=type=bind,source=requirements/collections.yml,target=collections.yml \
--mount=type=bind,source=requirements/static_files.sh,target=utils/static_files.sh \
set -ex \
&& pip install uv -i${PIP_MIRROR} \
&& uv venv \
&& uv pip install -i${PIP_MIRROR} -r pyproject.toml \
&& ln -sf $(pwd)/.venv /opt/py3 \

View File

@ -13,7 +13,7 @@ ARG TOOLS=" \
nmap \
telnet \
vim \
postgresql-client-13 \
postgresql-client \
wget \
poppler-utils"

View File

@ -1,11 +0,0 @@
FROM python:3.11-slim-bullseye
ARG TARGETARCH
# Install APT dependencies
ENV DEBIAN_FRONTEND=noninteractive
RUN set -eux; \
apt-get update; \
apt-get -y --no-install-recommends upgrade; \
rm -rf /var/lib/apt/lists/*
# upgrade pip and setuptools
RUN pip install --no-cache-dir --upgrade pip setuptools wheel

View File

@ -77,7 +77,8 @@ JumpServer consists of multiple key components, which collectively form the func
| [Luna](https://github.com/jumpserver/luna) | <a href="https://github.com/jumpserver/luna/releases"><img alt="Luna release" src="https://img.shields.io/github/release/jumpserver/luna.svg" /></a> | JumpServer Web Terminal |
| [KoKo](https://github.com/jumpserver/koko) | <a href="https://github.com/jumpserver/koko/releases"><img alt="Koko release" src="https://img.shields.io/github/release/jumpserver/koko.svg" /></a> | JumpServer Character Protocol Connector |
| [Lion](https://github.com/jumpserver/lion) | <a href="https://github.com/jumpserver/lion/releases"><img alt="Lion release" src="https://img.shields.io/github/release/jumpserver/lion.svg" /></a> | JumpServer Graphical Protocol Connector |
| [Chen](https://github.com/jumpserver/chen) | <a href="https://github.com/jumpserver/chen/releases"><img alt="Chen release" src="https://img.shields.io/github/release/jumpserver/chen.svg" /> | JumpServer Web DB |
| [Chen](https://github.com/jumpserver/chen) | <a href="https://github.com/jumpserver/chen/releases"><img alt="Chen release" src="https://img.shields.io/github/release/jumpserver/chen.svg" /> | JumpServer Web DB
| [Client](https://github.com/jumpserver/clients) | <a href="https://github.com/jumpserver/clients/releases"><img alt="Clients release" src="https://img.shields.io/github/release/jumpserver/clients.svg" /> | JumpServer Client |
| [Tinker](https://github.com/jumpserver/tinker) | <img alt="Tinker" src="https://img.shields.io/badge/release-private-red" /> | JumpServer Remote Application Connector (Windows) |
| [Panda](https://github.com/jumpserver/Panda) | <img alt="Panda" src="https://img.shields.io/badge/release-private-red" /> | JumpServer EE Remote Application Connector (Linux) |
| [Razor](https://github.com/jumpserver/razor) | <img alt="Chen" src="https://img.shields.io/badge/release-private-red" /> | JumpServer EE RDP Proxy Connector |

View File

@ -1,10 +1,11 @@
from django.db import transaction
from django.shortcuts import get_object_or_404
from django.utils.translation import gettext_lazy as _
from rest_framework import serializers as drf_serializers
from rest_framework.decorators import action
from rest_framework.generics import ListAPIView, CreateAPIView
from rest_framework.response import Response
from rest_framework.status import HTTP_200_OK
from rest_framework.status import HTTP_200_OK, HTTP_400_BAD_REQUEST
from accounts import serializers
from accounts.const import ChangeSecretRecordStatusChoice
@ -184,12 +185,66 @@ class AssetAccountBulkCreateApi(CreateAPIView):
'POST': 'accounts.add_account',
}
@staticmethod
def get_all_assets(base_payload: dict):
nodes = base_payload.pop('nodes', [])
asset_ids = base_payload.pop('assets', [])
nodes = Node.objects.filter(id__in=nodes).only('id', 'key')
node_asset_ids = Node.get_nodes_all_assets(*nodes).values_list('id', flat=True)
asset_ids = set(asset_ids + list(node_asset_ids))
return Asset.objects.filter(id__in=asset_ids)
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
data = serializer.create(serializer.validated_data)
serializer = serializers.AssetAccountBulkSerializerResultSerializer(data, many=True)
return Response(data=serializer.data, status=HTTP_200_OK)
if hasattr(request.data, "copy"):
base_payload = request.data.copy()
else:
base_payload = dict(request.data)
templates = base_payload.pop("template", None)
assets = self.get_all_assets(base_payload)
if not assets.exists():
error = _("No valid assets found for account creation.")
return Response(
data={
"detail": error,
"code": "no_valid_assets"
},
status=HTTP_400_BAD_REQUEST
)
result = []
errors = []
def handle_one(_payload):
try:
ser = self.get_serializer(data=_payload)
ser.is_valid(raise_exception=True)
data = ser.bulk_create(ser.validated_data, assets)
if isinstance(data, (list, tuple)):
result.extend(data)
else:
result.append(data)
except drf_serializers.ValidationError as e:
errors.extend(list(e.detail))
except Exception as e:
errors.extend([str(e)])
if not templates:
handle_one(base_payload)
else:
if not isinstance(templates, (list, tuple)):
templates = [templates]
for tpl in templates:
payload = dict(base_payload)
payload["template"] = tpl
handle_one(payload)
if errors:
raise drf_serializers.ValidationError(errors)
out_ser = serializers.AssetAccountBulkSerializerResultSerializer(result, many=True)
return Response(data=out_ser.data, status=HTTP_200_OK)
class AccountHistoriesSecretAPI(ExtraFilterFieldsMixin, AccountRecordViewLogMixin, ListAPIView):

View File

@ -25,7 +25,8 @@ class IntegrationApplicationViewSet(OrgBulkModelViewSet):
}
rbac_perms = {
'get_once_secret': 'accounts.change_integrationapplication',
'get_account_secret': 'accounts.view_integrationapplication'
'get_account_secret': 'accounts.view_integrationapplication',
'get_sdks_info': 'accounts.view_integrationapplication'
}
def read_file(self, path):
@ -36,7 +37,6 @@ class IntegrationApplicationViewSet(OrgBulkModelViewSet):
@action(
['GET'], detail=False, url_path='sdks',
permission_classes=[IsValidUser]
)
def get_sdks_info(self, request, *args, **kwargs):
code_suffix_mapper = {

View File

@ -14,7 +14,7 @@ from accounts.models import Account, AccountTemplate, GatheredAccount
from accounts.tasks import push_accounts_to_assets_task
from assets.const import Category, AllTypes
from assets.models import Asset
from common.serializers import SecretReadableMixin
from common.serializers import SecretReadableMixin, CommonBulkModelSerializer
from common.serializers.fields import ObjectRelatedField, LabeledChoiceField
from common.utils import get_logger
from .base import BaseAccountSerializer, AuthValidateMixin
@ -292,26 +292,26 @@ class AccountDetailSerializer(AccountSerializer):
class AssetAccountBulkSerializerResultSerializer(serializers.Serializer):
asset = serializers.CharField(read_only=True, label=_('Asset'))
account = serializers.CharField(read_only=True, label=_('Account'))
state = serializers.CharField(read_only=True, label=_('State'))
error = serializers.CharField(read_only=True, label=_('Error'))
changed = serializers.BooleanField(read_only=True, label=_('Changed'))
class AssetAccountBulkSerializer(
AccountCreateUpdateSerializerMixin, AuthValidateMixin, serializers.ModelSerializer
AccountCreateUpdateSerializerMixin, AuthValidateMixin, CommonBulkModelSerializer
):
su_from_username = serializers.CharField(
max_length=128, required=False, write_only=True, allow_null=True, label=_("Su from"),
allow_blank=True,
)
assets = serializers.PrimaryKeyRelatedField(queryset=Asset.objects, many=True, label=_('Assets'))
class Meta:
model = Account
fields = [
'name', 'username', 'secret', 'secret_type', 'passphrase',
'privileged', 'is_active', 'comment', 'template',
'on_invalid', 'push_now', 'params', 'assets',
'name', 'username', 'secret', 'secret_type', 'secret_reset',
'passphrase', 'privileged', 'is_active', 'comment', 'template',
'on_invalid', 'push_now', 'params',
'su_from_username', 'source', 'source_id',
]
extra_kwargs = {
@ -393,8 +393,7 @@ class AssetAccountBulkSerializer(
handler = self._handle_err_create
return handler
def perform_bulk_create(self, vd):
assets = vd.pop('assets')
def perform_bulk_create(self, vd, assets):
on_invalid = vd.pop('on_invalid', 'skip')
secret_type = vd.get('secret_type', 'password')
@ -402,8 +401,7 @@ class AssetAccountBulkSerializer(
vd['name'] = vd.get('username')
create_handler = self.get_create_handler(on_invalid)
asset_ids = [asset.id for asset in assets]
secret_type_supports = Asset.get_secret_type_assets(asset_ids, secret_type)
secret_type_supports = Asset.get_secret_type_assets(assets, secret_type)
_results = {}
for asset in assets:
@ -411,6 +409,7 @@ class AssetAccountBulkSerializer(
_results[asset] = {
'error': _('Asset does not support this secret type: %s') % secret_type,
'state': 'error',
'account': vd['name'],
}
continue
@ -420,13 +419,13 @@ class AssetAccountBulkSerializer(
self.clean_auth_fields(vd)
instance, changed, state = self.perform_create(vd, create_handler)
_results[asset] = {
'changed': changed, 'instance': instance.id, 'state': state
'changed': changed, 'instance': instance.id, 'state': state, 'account': vd['name']
}
except serializers.ValidationError as e:
_results[asset] = {'error': e.detail[0], 'state': 'error'}
_results[asset] = {'error': e.detail[0], 'state': 'error', 'account': vd['name']}
except Exception as e:
logger.exception(e)
_results[asset] = {'error': str(e), 'state': 'error'}
_results[asset] = {'error': str(e), 'state': 'error', 'account': vd['name']}
results = [{'asset': asset, **result} for asset, result in _results.items()]
state_score = {'created': 3, 'updated': 2, 'skipped': 1, 'error': 0}
@ -443,7 +442,8 @@ class AssetAccountBulkSerializer(
errors.append({
'error': _('Account has exist'),
'state': 'error',
'asset': str(result['asset'])
'asset': str(result['asset']),
'account': result.get('account'),
})
if errors:
raise serializers.ValidationError(errors)
@ -462,10 +462,16 @@ class AssetAccountBulkSerializer(
account_ids = [str(_id) for _id in accounts.values_list('id', flat=True)]
push_accounts_to_assets_task.delay(account_ids, params)
def create(self, validated_data):
def bulk_create(self, validated_data, assets):
if not assets:
raise serializers.ValidationError(
{'assets': _('At least one asset or node must be specified')},
{'nodes': _('At least one asset or node must be specified')}
)
params = validated_data.pop('params', None)
push_now = validated_data.pop('push_now', False)
results = self.perform_bulk_create(validated_data)
results = self.perform_bulk_create(validated_data, assets)
self.push_accounts_if_need(results, push_now, params)
for res in results:
res['asset'] = str(res['asset'])

View File

@ -1,8 +1,7 @@
# -*- coding: utf-8 -*-
#
from collections import defaultdict
from django.conf import settings
from django.db import transaction
from django.shortcuts import get_object_or_404
from django.utils.translation import gettext as _
from django_filters import rest_framework as drf_filters
@ -113,7 +112,7 @@ class BaseAssetViewSet(OrgBulkModelViewSet):
("accounts", AccountSerializer),
)
rbac_perms = (
("match", "assets.match_asset"),
("match", "assets.view_asset"),
("platform", "assets.view_platform"),
("gateways", "assets.view_gateway"),
("accounts", "assets.view_account"),
@ -181,33 +180,18 @@ class AssetViewSet(SuggestionMixin, BaseAssetViewSet):
def sync_platform_protocols(self, request, *args, **kwargs):
platform_id = request.data.get('platform_id')
platform = get_object_or_404(Platform, pk=platform_id)
assets = platform.assets.all()
asset_ids = list(platform.assets.values_list('id', flat=True))
platform_protocols = list(platform.protocols.values('name', 'port'))
platform_protocols = {
p['name']: p['port']
for p in platform.protocols.values('name', 'port')
}
asset_protocols_map = defaultdict(set)
protocols = assets.prefetch_related('protocols').values_list(
'id', 'protocols__name'
)
for asset_id, protocol in protocols:
asset_id = str(asset_id)
asset_protocols_map[asset_id].add(protocol)
objs = []
for asset_id, protocols in asset_protocols_map.items():
protocol_names = set(platform_protocols) - protocols
if not protocol_names:
continue
for name in protocol_names:
objs.append(
Protocol(
name=name,
port=platform_protocols[name],
asset_id=asset_id,
)
)
Protocol.objects.bulk_create(objs)
with transaction.atomic():
if asset_ids:
Protocol.objects.filter(asset_id__in=asset_ids).delete()
if asset_ids and platform_protocols:
objs = []
for aid in asset_ids:
for p in platform_protocols:
objs.append(Protocol(name=p['name'], port=p['port'], asset_id=aid))
Protocol.objects.bulk_create(objs)
return Response(status=status.HTTP_200_OK)
def filter_bulk_update_data(self):

View File

@ -43,7 +43,7 @@ class NodeViewSet(SuggestionMixin, OrgBulkModelViewSet):
search_fields = ('full_value',)
serializer_class = serializers.NodeSerializer
rbac_perms = {
'match': 'assets.match_node',
'match': 'assets.view_node',
'check_assets_amount_task': 'assets.change_node'
}

View File

@ -112,8 +112,10 @@ class PlatformProtocolViewSet(JMSModelViewSet):
class PlatformAutomationMethodsApi(generics.ListAPIView):
permission_classes = (IsValidUser,)
queryset = PlatformAutomation.objects.none()
rbac_perms = {
'list': 'assets.view_platform'
}
@staticmethod
def automation_methods():

View File

@ -408,8 +408,7 @@ class Asset(NodesRelationMixin, LabeledMixin, AbsConnectivity, JSONFilterMixin,
return tree_node
@staticmethod
def get_secret_type_assets(asset_ids, secret_type):
assets = Asset.objects.filter(id__in=asset_ids)
def get_secret_type_assets(assets, secret_type):
asset_protocol = assets.prefetch_related('protocols').values_list('id', 'protocols__name')
protocol_secret_types_map = const.Protocol.protocol_secret_types()
asset_secret_types_mapp = defaultdict(set)

View File

@ -28,7 +28,8 @@ class MyAsset(JMSBaseModel):
@staticmethod
def set_asset_custom_value(assets, user):
my_assets = MyAsset.objects.filter(asset__in=assets, user=user).all()
asset_ids = [asset.id for asset in assets]
my_assets = MyAsset.objects.filter(asset_id__in=asset_ids, user=user).all()
customs = {my_asset.asset.id: my_asset.custom_to_dict() for my_asset in my_assets}
for asset in assets:
custom = customs.get(asset.id)

View File

@ -84,6 +84,7 @@ class PlatformAutomationSerializer(serializers.ModelSerializer):
class PlatformProtocolSerializer(serializers.ModelSerializer):
setting = MethodSerializer(required=False, label=_("Setting"))
port_from_addr = serializers.BooleanField(label=_("Port from addr"), read_only=True)
port = serializers.IntegerField(label=_("Port"), required=False, min_value=0, max_value=65535)
class Meta:
model = PlatformProtocol

View File

@ -23,6 +23,8 @@ logger = get_logger(__name__)
class OperatorLogHandler(metaclass=Singleton):
CACHE_KEY = 'OPERATOR_LOG_CACHE_KEY'
SYSTEM_OBJECTS = frozenset({"Role"})
PREFER_CURRENT_ELSE_USER = frozenset({"SSOToken"})
def __init__(self):
self.log_client = self.get_storage_client()
@ -142,13 +144,21 @@ class OperatorLogHandler(metaclass=Singleton):
after = self.__data_processing(after)
return before, after
@staticmethod
def get_org_id(object_name):
system_obj = ('Role',)
org_id = get_current_org_id()
if object_name in system_obj:
org_id = Organization.SYSTEM_ID
return org_id
def get_org_id(self, user, object_name):
if object_name in self.SYSTEM_OBJECTS:
return Organization.SYSTEM_ID
current = get_current_org_id()
current_id = str(current) if current else None
if object_name in self.PREFER_CURRENT_ELSE_USER:
if current_id and current_id != Organization.DEFAULT_ID:
return current_id
org = user.orgs.distinct().first()
return str(org.id) if org else Organization.DEFAULT_ID
return current_id or Organization.DEFAULT_ID
def create_or_update_operate_log(
self, action, resource_type, resource=None, resource_display=None,
@ -168,7 +178,7 @@ class OperatorLogHandler(metaclass=Singleton):
# 前后都没变化,没必要生成日志,除非手动强制保存
return
org_id = self.get_org_id(object_name)
org_id = self.get_org_id(user, object_name)
data = {
'id': log_id, "user": str(user), 'action': action,
'resource_type': str(resource_type), 'org_id': org_id,

View File

@ -47,20 +47,21 @@ def on_m2m_changed(sender, action, instance, reverse, model, pk_set, **kwargs):
objs = model.objects.filter(pk__in=pk_set)
objs_display = [str(o) for o in objs]
action = M2M_ACTION[action]
changed_field = current_instance.get(field_name, [])
changed_field = current_instance.get(field_name, {})
changed_value = changed_field.get('value', [])
after, before, before_value = None, None, None
if action == ActionChoices.create:
before_value = list(set(changed_field) - set(objs_display))
before_value = list(set(changed_value) - set(objs_display))
elif action == ActionChoices.delete:
before_value = list(
set(changed_field).symmetric_difference(set(objs_display))
)
before_value = list(set(changed_value).symmetric_difference(set(objs_display)))
if changed_field:
after = {field_name: changed_field}
if before_value:
before = {field_name: before_value}
before_change_field = changed_field.copy()
before_change_field['value'] = before_value
before = {field_name: before_change_field}
if sorted(str(before)) == sorted(str(after)):
return

View File

@ -362,6 +362,7 @@ class ConnectionTokenViewSet(AuthFaceMixin, ExtraActionApiMixin, RootOrgViewMixi
self.validate_serializer(serializer)
return super().perform_create(serializer)
def _insert_connect_options(self, data, user):
connect_options = data.pop('connect_options', {})
default_name_opts = {
@ -564,7 +565,9 @@ class SuperConnectionTokenViewSet(ConnectionTokenViewSet):
rbac_perms = {
'create': 'authentication.add_superconnectiontoken',
'renewal': 'authentication.add_superconnectiontoken',
'list': 'authentication.view_superconnectiontoken',
'check': 'authentication.view_superconnectiontoken',
'retrieve': 'authentication.view_superconnectiontoken',
'get_secret_detail': 'authentication.view_superconnectiontokensecret',
'get_applet_info': 'authentication.view_superconnectiontoken',
'release_applet_account': 'authentication.view_superconnectiontoken',
@ -572,7 +575,12 @@ class SuperConnectionTokenViewSet(ConnectionTokenViewSet):
}
def get_queryset(self):
return ConnectionToken.objects.all()
return ConnectionToken.objects.none()
def get_object(self):
pk = self.kwargs.get(self.lookup_field)
token = get_object_or_404(ConnectionToken, pk=pk)
return token
def get_user(self, serializer):
return serializer.validated_data.get('user')

View File

@ -3,6 +3,7 @@ from django.contrib import auth
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.utils.http import urlencode
from django.utils.translation import gettext_lazy as _
from django.views import View
from authentication.backends.base import BaseAuthCallbackClientView
@ -61,6 +62,10 @@ class OAuth2AuthCallbackView(View, FlashMessageMixin):
return HttpResponseRedirect(
settings.AUTH_OAUTH2_AUTHENTICATION_REDIRECT_URI
)
else:
if getattr(request, 'error_message', ''):
response = self.get_failed_response('/', title=_('OAuth2 Error'), msg=request.error_message)
return response
logger.debug(log_prompt.format('Redirect'))
redirect_url = settings.AUTH_OAUTH2_PROVIDER_END_SESSION_ENDPOINT or '/'

View File

@ -134,6 +134,7 @@ class OIDCAuthCallbackView(View, FlashMessageMixin):
log_prompt = "Process GET requests [OIDCAuthCallbackView]: {}"
logger.debug(log_prompt.format('Start'))
callback_params = request.GET
error_title = _("OpenID Error")
# Retrieve the state value that was previously generated. No state means that we cannot
# authenticate the user (so a failure should be returned).
@ -172,10 +173,9 @@ class OIDCAuthCallbackView(View, FlashMessageMixin):
try:
user = auth.authenticate(nonce=nonce, request=request, code_verifier=code_verifier)
except IntegrityError as e:
title = _("OpenID Error")
msg = _('Please check if a user with the same username or email already exists')
logger.error(e, exc_info=True)
response = self.get_failed_response('/', title, msg)
response = self.get_failed_response('/', error_title, msg)
return response
if user:
logger.debug(log_prompt.format('Login: {}'.format(user)))
@ -194,7 +194,6 @@ class OIDCAuthCallbackView(View, FlashMessageMixin):
return HttpResponseRedirect(
next_url or settings.AUTH_OPENID_AUTHENTICATION_REDIRECT_URI
)
if 'error' in callback_params:
logger.debug(
log_prompt.format('Error in callback params: {}'.format(callback_params['error']))
@ -205,9 +204,12 @@ class OIDCAuthCallbackView(View, FlashMessageMixin):
# OpenID Connect Provider authenticate endpoint.
logger.debug(log_prompt.format('Logout'))
auth.logout(request)
redirect_url = settings.AUTH_OPENID_AUTHENTICATION_FAILURE_REDIRECT_URI
if not user and getattr(request, 'error_message', ''):
response = self.get_failed_response(redirect_url, title=error_title, msg=request.error_message)
return response
logger.debug(log_prompt.format('Redirect'))
return HttpResponseRedirect(settings.AUTH_OPENID_AUTHENTICATION_FAILURE_REDIRECT_URI)
return HttpResponseRedirect(redirect_url)
class OIDCAuthCallbackClientView(BaseAuthCallbackClientView):

View File

@ -252,6 +252,7 @@ class Saml2AuthCallbackView(View, PrepareRequestMixin, FlashMessageMixin):
def post(self, request):
log_prompt = "Process SAML2 POST requests: {}"
post_data = request.POST
error_title = _("SAML2 Error")
try:
saml_instance = self.init_saml_auth(request)
@ -279,15 +280,18 @@ class Saml2AuthCallbackView(View, PrepareRequestMixin, FlashMessageMixin):
try:
user = auth.authenticate(request=request, saml_user_data=saml_user_data)
except IntegrityError as e:
title = _("SAML2 Error")
msg = _('Please check if a user with the same username or email already exists')
logger.error(e, exc_info=True)
response = self.get_failed_response('/', title, msg)
response = self.get_failed_response('/', error_title, msg)
return response
if user and user.is_valid:
logger.debug(log_prompt.format('Login: {}'.format(user)))
auth.login(self.request, user)
if not user and getattr(request, 'error_message', ''):
response = self.get_failed_response('/', title=error_title, msg=request.error_message)
return response
logger.debug(log_prompt.format('Redirect'))
redir = post_data.get('RelayState')
if not redir or len(redir) == 0:

View File

@ -114,12 +114,12 @@ class BlockMFAError(AuthFailedNeedLogMixin, AuthFailedError):
super().__init__(username=username, request=request, ip=ip)
class BlockLoginError(AuthFailedNeedBlockMixin, AuthFailedError):
class BlockLoginError(AuthFailedNeedLogMixin, AuthFailedNeedBlockMixin, AuthFailedError):
error = 'block_login'
def __init__(self, username, ip):
def __init__(self, username, ip, request):
self.msg = const.block_user_login_msg.format(settings.SECURITY_LOGIN_LIMIT_TIME)
super().__init__(username=username, ip=ip)
super().__init__(username=username, ip=ip, request=request)
class SessionEmptyError(AuthFailedError):

View File

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
#
import inspect
import threading
import time
import uuid
from functools import partial
@ -12,6 +13,7 @@ from django.contrib.auth import (
BACKEND_SESSION_KEY, load_backend,
PermissionDenied, user_login_failed, _clean_credentials,
)
from django.contrib.auth import get_user_model
from django.core.cache import cache
from django.core.exceptions import ImproperlyConfigured
from django.shortcuts import reverse, redirect, get_object_or_404
@ -46,6 +48,10 @@ def _get_backends(return_tuples=False):
return backends
class OnlyAllowExistUserAuthError(Exception):
pass
auth._get_backends = _get_backends
@ -54,6 +60,24 @@ def authenticate(request=None, **credentials):
If the given credentials are valid, return a User object.
之所以 hack 这个 authenticate
"""
UserModel = get_user_model()
original_get_or_create = UserModel.objects.get_or_create
thread_local = threading.local()
thread_local.thread_id = threading.get_ident()
def custom_get_or_create(self, *args, **kwargs):
logger.debug(f"get_or_create: thread_id={threading.get_ident()}, username={username}")
if threading.get_ident() != thread_local.thread_id or not settings.ONLY_ALLOW_EXIST_USER_AUTH:
return original_get_or_create(*args, **kwargs)
create_username = kwargs.get('username')
try:
UserModel.objects.get(username=create_username)
except UserModel.DoesNotExist:
raise OnlyAllowExistUserAuthError
return original_get_or_create(*args, **kwargs)
username = credentials.get('username')
temp_user = None
@ -71,10 +95,19 @@ def authenticate(request=None, **credentials):
# This backend doesn't accept these credentials as arguments. Try the next one.
continue
try:
UserModel.objects.get_or_create = custom_get_or_create.__get__(UserModel.objects)
user = backend.authenticate(request, **credentials)
except PermissionDenied:
# This backend says to stop in our tracks - this user should not be allowed in at all.
break
except OnlyAllowExistUserAuthError:
request.error_message = _(
'''The administrator has enabled "Only allow existing users to log in",
and the current user is not in the user list. Please contact the administrator.'''
)
continue
finally:
UserModel.objects.get_or_create = original_get_or_create
if user is None:
continue
@ -176,9 +209,9 @@ class AuthPreCheckMixin:
if not is_block:
return
logger.warning('Ip was blocked' + ': ' + username + ':' + ip)
exception = errors.BlockLoginError(username=username, ip=ip)
exception = errors.BlockLoginError(username=username, ip=ip, request=self.request)
if raise_exception:
raise errors.BlockLoginError(username=username, ip=ip)
raise errors.BlockLoginError(username=username, ip=ip, request=self.request)
else:
return exception

View File

@ -15,7 +15,7 @@ from common.utils import get_logger
from common.utils.common import get_request_ip
from common.utils.django import reverse, get_object_or_none
from users.models import User
from users.signal_handlers import check_only_allow_exist_user_auth, bind_user_to_org_role
from users.signal_handlers import bind_user_to_org_role, check_only_allow_exist_user_auth
from .mixins import FlashMessageMixin
logger = get_logger(__file__)
@ -55,7 +55,6 @@ class BaseLoginCallbackView(AuthMixin, FlashMessageMixin, IMClientMixin, View):
)
if not check_only_allow_exist_user_auth(create):
user.delete()
return user, (self.msg_client_err, self.request.error_message)
setattr(user, f'{self.user_type}_id', user_id)

View File

@ -1,9 +1,11 @@
# -*- coding: utf-8 -*-
#
from django.conf import settings
from typing import Callable
from django.utils.translation import gettext as _
from rest_framework.decorators import action
from rest_framework.throttling import UserRateThrottle
from rest_framework.request import Request
from rest_framework.response import Response
@ -14,8 +16,12 @@ from orgs.utils import current_org
__all__ = ['SuggestionMixin', 'RenderToJsonMixin']
class CustomUserRateThrottle(UserRateThrottle):
rate = '60/m'
class SuggestionMixin:
suggestion_limit = 10
suggestion_limit = settings.SUGGESTION_LIMIT
filter_queryset: Callable
get_queryset: Callable
@ -35,6 +41,7 @@ class SuggestionMixin:
queryset = queryset.none()
queryset = self.filter_queryset(queryset)
queryset = queryset[:self.suggestion_limit]
page = self.paginate_queryset(queryset)
@ -45,6 +52,11 @@ class SuggestionMixin:
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
def get_throttles(self):
if self.action == 'match':
return [CustomUserRateThrottle()]
return super().get_throttles()
class RenderToJsonMixin:
@action(methods=[POST, PUT], detail=False, url_path='render-to-json')

View File

@ -1,5 +1,6 @@
# -*- coding: utf-8 -*-
#
from rest_framework.filters import SearchFilter as SearchFilterBase
import base64
import json
import logging
@ -35,6 +36,14 @@ __all__ = [
]
class SearchFilter(SearchFilterBase):
def get_search_terms(self, request):
params = request.query_params.get(self.search_param, '') or request.query_params.get('search', '')
params = params.replace('\x00', '') # strip null characters
params = params.replace(',', ' ')
return params.split()
class BaseFilterSet(drf_filters.FilterSet):
days = drf_filters.NumberFilter(method="filter_days")
days__lt = drf_filters.NumberFilter(method="filter_days")

View File

@ -1,9 +1,13 @@
import re
import uuid
import time
from django.conf import settings
from django.core.management.base import BaseCommand
from django.test import Client
from django.urls import URLPattern, URLResolver
from django.contrib.auth import get_user_model
from django.contrib.auth.models import AnonymousUser
from jumpserver.urls import api_v1
@ -85,50 +89,262 @@ known_error_urls = [
'/api/v1/terminal/sessions/00000000-0000-0000-0000-000000000000/replay/download/',
]
# API 白名单 - 普通用户可以访问的 API
user_accessible_urls = known_unauth_urls + [
# 添加更多普通用户可以访问的 API
"/api/v1/settings/public/",
"/api/v1/users/profile/",
"/api/v1/users/change-password/",
"/api/v1/users/logout/",
"/api/v1/settings/chatai-prompts/",
"/api/v1/authentication/confirm/",
"/api/v1/users/connection-token/",
"/api/v1/authentication/temp-tokens/",
"/api/v1/notifications/backends/",
"/api/v1/authentication/passkeys/",
"/api/v1/orgs/orgs/current/",
"/api/v1/tickets/apply-asset-tickets/",
"/api/v1/ops/celery/task/00000000-0000-0000-0000-000000000000/task-execution/00000000-0000-0000-0000-000000000000/log/",
"/api/v1/assets/favorite-assets/",
"/api/v1/authentication/connection-token/",
"/api/v1/ops/jobs/",
"/api/v1/assets/categories/",
"/api/v1/tickets/tickets/",
"/api/v1/authentication/ssh-key/",
"/api/v1/terminal/my-sessions/",
"/api/v1/authentication/access-keys/",
"/api/v1/users/profile/permissions/",
"/api/v1/tickets/apply-login-asset-tickets/",
"/api/v1/resources/",
"/api/v1/ops/celery/task/00000000-0000-0000-0000-000000000000/task-execution/00000000-0000-0000-0000-000000000000/result/",
"/api/v1/notifications/site-messages/",
"/api/v1/notifications/site-messages/unread-total/",
"/api/v1/assets/assets/suggestions/",
"/api/v1/search/",
"/api/v1/notifications/user-msg-subscription/",
"/api/v1/ops/ansible/job-execution/00000000-0000-0000-0000-000000000000/log/",
"/api/v1/tickets/apply-login-tickets/",
"/api/v1/ops/variables/form-data/",
"/api/v1/ops/variables/help/",
"/api/v1/users/profile/password/",
"/api/v1/tickets/apply-command-tickets/",
"/api/v1/ops/job-executions/",
"/api/v1/audits/my-login-logs/",
"/api/v1/terminal/components/connect-methods/"
"/api/v1/ops/task-executions/",
"/api/v1/terminal/sessions/online-info/",
"/api/v1/ops/adhocs/",
"/api/v1/tickets/apply-nodes/suggestions/",
"/api/v1/tickets/apply-assets/suggestions/",
"/api/v1/settings/server-info/",
"/api/v1/ops/playbooks/",
"/api/v1/assets/categories/types/",
"/api/v1/assets/protocols/",
"/api/v1/common/countries/",
"/api/v1/audits/jobs/",
"/api/v1/terminal/components/connect-methods/",
"/api/v1/ops/task-executions/",
]
errors = {}
class Command(BaseCommand):
help = 'Check api if unauthorized'
"""
Check API authorization and user access permissions.
def handle(self, *args, **options):
settings.LOG_LEVEL = 'ERROR'
urls = get_api_urls()
This command performs two types of checks:
1. Anonymous access check - finds APIs that can be accessed without authentication
2. User access check - finds APIs that can be accessed by a normal user
The functionality is split into two methods:
- check_anonymous_access(): Checks for APIs accessible without authentication
- check_user_access(): Checks for APIs accessible by a normal user
Usage examples:
# Check both anonymous and user access (default behavior)
python manage.py check_api
# Check only anonymous access
python manage.py check_api --skip-user-check
# Check only user access
python manage.py check_api --skip-anonymous-check
# Check user access and update whitelist
python manage.py check_api --update-whitelist
"""
help = 'Check API authorization and user access permissions'
password = uuid.uuid4().hex
unauth_urls = []
error_urls = []
unformat_urls = []
# 用户可以访问的 API但不在白名单中的 API
unexpected_access = []
def add_arguments(self, parser):
parser.add_argument(
'--skip-anonymous-check',
action='store_true',
help='Skip anonymous access check (only check user access)',
)
parser.add_argument(
'--skip-user-check',
action='store_true',
help='Skip user access check (only check anonymous access)',
)
parser.add_argument(
'--update-whitelist',
action='store_true',
help='Update the user accessible URLs whitelist based on current scan results',
)
def create_test_user(self):
"""创建测试用户"""
User = get_user_model()
username = 'test_user_api_check'
email = 'test@example.com'
# 删除可能存在的测试用户
User.objects.filter(username=username).delete()
# 创建新的测试用户
user = User.objects.create_user(
username=username,
email=email,
password=self.password,
is_active=True
)
return user
def check_user_api_access(self, urls):
"""检查普通用户可以访问的 API"""
user = self.create_test_user()
client = Client()
client.defaults['HTTP_HOST'] = 'localhost'
unauth_urls = []
# 登录用户
login_success = client.login(username=user.username, password=self.password)
if not login_success:
self.stdout.write(
self.style.ERROR('Failed to login test user')
)
return [], []
accessible_urls = []
error_urls = []
unformat_urls = []
self.stdout.write('Checking user API access...')
for url, ourl in urls:
if '(' in url or '<' in url:
unformat_urls.append([url, ourl])
continue
try:
response = client.get(url, follow=True)
time.sleep(0.1)
# 如果状态码是 200 或 201说明用户可以访问
if response.status_code in [200, 201]:
accessible_urls.append((url, ourl, response.status_code))
elif response.status_code == 403:
# 403 表示权限不足,这是正常的
pass
else:
# 其他状态码可能是错误
error_urls.append((url, ourl, response.status_code))
except Exception as e:
error_urls.append((url, ourl, str(e)))
# 清理测试用户
user.delete()
return accessible_urls, error_urls
def check_anonymous_access(self, urls):
"""检查匿名访问权限"""
client = Client()
client.defaults['HTTP_HOST'] = 'localhost'
for url, ourl in urls:
if '(' in url or '<' in url:
self.unformat_urls.append([url, ourl])
continue
try:
response = client.get(url, follow=True)
if response.status_code != 401:
errors[url] = str(response.status_code) + ' ' + str(ourl)
unauth_urls.append(url)
self.unauth_urls.append(url)
except Exception as e:
errors[url] = str(e)
error_urls.append(url)
self.error_urls.append(url)
unauth_urls = set(unauth_urls) - set(known_unauth_urls)
print("\nUnauthorized urls:")
if not unauth_urls:
self.unauth_urls = set(self.unauth_urls) - set(known_unauth_urls)
self.error_urls = set(self.error_urls)
self.unformat_urls = set(self.unformat_urls)
def print_anonymous_access_result(self):
print("\n=== Anonymous Access Check ===")
print("Unauthorized urls:")
if not self.unauth_urls:
print(" Empty, very good!")
for url in unauth_urls:
for url in self.unauth_urls:
print('"{}", {}'.format(url, errors.get(url, '')))
print("\nError urls:")
if not error_urls:
if not self.error_urls:
print(" Empty, very good!")
for url in set(error_urls):
for url in set(self.error_urls):
print(url, ': ' + errors.get(url))
print("\nUnformat urls:")
if not unformat_urls:
if not self.unformat_urls:
print(" Empty, very good!")
for url in unformat_urls:
for url in self.unformat_urls:
print(url)
def check_user_access(self, urls, update_whitelist=False):
"""检查用户访问权限"""
print("\n=== User Access Check ===")
accessible_urls, user_error_urls = self.check_user_api_access(urls)
# 检查是否有不在白名单中的可访问 API
accessible_url_list = [url for url, _, _ in accessible_urls]
unexpected_access = set(accessible_url_list) - set(user_accessible_urls)
self.unexpected_access = unexpected_access
# 如果启用了更新白名单选项
if update_whitelist:
print("\n=== Updating Whitelist ===")
new_whitelist = sorted(set(user_accessible_urls + accessible_url_list))
print("Updated whitelist would include:")
for url in new_whitelist:
print(f' "{url}",')
print(f"\nTotal URLs in whitelist: {len(new_whitelist)}")
def print_user_access_result(self):
print("\n=== User Access Check ===")
print("User unexpected urls:")
if self.unexpected_access:
print(f" Error: Found {len(self.unexpected_access)} URLs accessible by user but not in whitelist:")
for url in self.unexpected_access:
print(f' "{url}"')
else:
print(" Empty, very good!")
def handle(self, *args, **options):
settings.LOG_LEVEL = 'ERROR'
urls = get_api_urls()
# 检查匿名访问权限(默认执行)
if not options['skip_anonymous_check']:
self.check_anonymous_access(urls)
# 检查用户访问权限(默认执行)
if not options['skip_user_check']:
self.check_user_access(urls, options['update_whitelist'])
print("\nCheck total urls: ", len(urls))
self.print_anonymous_access_result()
self.print_user_access_result()

View File

@ -162,6 +162,7 @@ class FeiShu(RequestMixin):
except Exception as e:
logger.error(f'Get user detail error: {e} data={data}')
data.update(kwargs['other_info'] if 'other_info' in kwargs else {})
info = flatten_dict(data)
default_detail = self.default_user_detail(data, user_id)
detail = map_attributes(default_detail, info, self.attributes)

View File

@ -207,7 +207,8 @@ class WeComTool(object):
def check_state(self, state, request=None):
return cache.get(state) == self.WECOM_STATE_VALUE or \
request.session[self.WECOM_STATE_SESSION_KEY] == state
request.session.get(self.WECOM_STATE_SESSION_KEY) == state or \
request.GET.get('state') == state # 在企业微信桌面端打开的话,重新创建了个 session会导致 session 校验失败
def wrap_redirect_url(self, next_url):
params = {

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-16 14:10+0800\n"
"POT-Creation-Date: 2025-11-17 17:53+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -18,14 +18,18 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: accounts/api/account/account.py:141
#: accounts/api/account/account.py:142
#: accounts/serializers/account/account.py:181
#: accounts/serializers/account/account.py:362
msgid "Account already exists"
msgstr ""
#: accounts/api/account/account.py:207
msgid "No valid assets found for account creation."
msgstr ""
#: accounts/api/account/application.py:77
#: authentication/api/connection_token.py:452
#: authentication/api/connection_token.py:453
msgid "Account not found"
msgstr ""
@ -456,7 +460,7 @@ msgstr ""
#: accounts/templates/accounts/push_account_report.html:78
#: accounts/templates/accounts/push_account_report.html:118
#: acls/notifications.py:70 acls/serializers/base.py:111
#: assets/models/asset/common.py:102 assets/models/asset/common.py:428
#: assets/models/asset/common.py:102 assets/models/asset/common.py:427
#: assets/models/cmd_filter.py:36 audits/models.py:59 audits/models.py:336
#: audits/serializers.py:230 authentication/models/connection_token.py:42
#: perms/models/asset_permission.py:69 terminal/backends/command/models.py:17
@ -471,7 +475,7 @@ msgstr ""
#: accounts/models/account.py:89 accounts/models/template.py:16
#: accounts/serializers/account/account.py:234
#: accounts/serializers/account/account.py:304
#: accounts/serializers/account/account.py:305
#: accounts/serializers/account/template.py:35
#: authentication/serializers/connect_token_secret.py:51
msgid "Su from"
@ -518,13 +522,14 @@ msgstr ""
#: accounts/models/account.py:107
#: accounts/models/automations/check_account.py:64
#: accounts/serializers/account/account.py:295
#: accounts/serializers/account/service.py:13
#: accounts/serializers/automations/change_secret.py:117
#: accounts/serializers/automations/change_secret.py:148
#: acls/serializers/base.py:112
#: acls/templates/acls/asset_login_reminder.html:11
#: assets/serializers/gateway.py:33 audits/models.py:60 audits/models.py:337
#: audits/serializers.py:231 authentication/api/connection_token.py:464
#: audits/serializers.py:231 authentication/api/connection_token.py:465
#: 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:31 terminal/notifications.py:291
@ -578,8 +583,8 @@ msgstr ""
#: assets/models/asset/common.py:166 assets/models/cmd_filter.py:21
#: assets/models/label.py:18 assets/models/platform.py:15
#: assets/models/platform.py:94 assets/models/zone.py:19
#: assets/serializers/asset/common.py:174 assets/serializers/platform.py:158
#: assets/serializers/platform.py:283
#: assets/serializers/asset/common.py:174 assets/serializers/platform.py:159
#: assets/serializers/platform.py:284
#: authentication/backends/passkey/models.py:10
#: authentication/models/ssh_key.py:12 authentication/notifications.py:17
#: authentication/notifications.py:56
@ -614,7 +619,7 @@ msgstr ""
#: accounts/models/application.py:20 accounts/models/base.py:39
#: accounts/models/mixins/vault.py:49
#: accounts/serializers/account/account.py:492
#: accounts/serializers/account/account.py:498
#: accounts/serializers/account/base.py:20
#: authentication/models/temp_token.py:11
#: authentication/templates/authentication/_access_key_modal.html:31
@ -784,7 +789,7 @@ msgid "Status"
msgstr ""
#: accounts/models/automations/change_secret.py:51
#: accounts/serializers/account/account.py:296 assets/const/automation.py:9
#: accounts/serializers/account/account.py:297 assets/const/automation.py:9
#: authentication/templates/authentication/passkey.html:177
#: authentication/views/base.py:42 authentication/views/base.py:43
#: authentication/views/base.py:44 common/const/choices.py:67
@ -1008,7 +1013,7 @@ msgid "Verify asset account"
msgstr ""
#: accounts/models/base.py:37 accounts/models/base.py:66
#: accounts/serializers/account/account.py:491
#: accounts/serializers/account/account.py:497
#: accounts/serializers/account/base.py:17
#: accounts/serializers/automations/change_secret.py:50
#: authentication/serializers/connect_token_secret.py:42
@ -1181,8 +1186,8 @@ 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:284 perms/serializers/user_permission.py:27
#: assets/serializers/cagegory.py:12 assets/serializers/platform.py:174
#: assets/serializers/platform.py:285 perms/serializers/user_permission.py:27
#: settings/models.py:41 tickets/models/ticket/apply_application.py:13
#: users/models/preference.py:12 xpack/plugins/cloud/models.py:41
#: xpack/plugins/cloud/models.py:327
@ -1194,7 +1199,7 @@ msgstr ""
#: acls/serializers/command_acl.py:19 assets/models/automations/base.py:27
#: 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
#: assets/serializers/platform.py:161 assets/serializers/platform.py:173
#: audits/serializers.py:76 audits/serializers.py:196
#: authentication/models/connection_token.py:67
#: authentication/serializers/connect_token_secret.py:138 ops/models/job.py:155
@ -1228,54 +1233,47 @@ msgstr ""
msgid "Has secret"
msgstr ""
#: accounts/serializers/account/account.py:295 ops/models/celery.py:84
#: accounts/serializers/account/account.py:296 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:297
#: accounts/serializers/account/account.py:298
msgid "Changed"
msgstr ""
#: accounts/serializers/account/account.py:307 acls/models/base.py:97
#: acls/templates/acls/asset_login_reminder.html:10
#: assets/models/automations/base.py:25
#: 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: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:101
msgid "Assets"
msgstr ""
#: accounts/serializers/account/account.py:412
#: accounts/serializers/account/account.py:410
#, python-format
msgid "Asset does not support this secret type: %s"
msgstr ""
#: accounts/serializers/account/account.py:444
#: accounts/serializers/account/account.py:443
msgid "Account has exist"
msgstr ""
#: accounts/serializers/account/account.py:476
#: accounts/serializers/account/account.py:483
#: accounts/serializers/account/account.py:468
#: accounts/serializers/account/account.py:469
msgid "At least one asset or node must be specified"
msgstr ""
#: accounts/serializers/account/account.py:482
#: accounts/serializers/account/account.py:489
#: accounts/serializers/account/base.py:73
#: accounts/serializers/account/base.py:88
#: assets/serializers/asset/common.py:425
msgid "Spec info"
msgstr ""
#: accounts/serializers/account/account.py:493
#: accounts/serializers/account/account.py:499
#: authentication/serializers/connect_token_secret.py:173
#: authentication/templates/authentication/_access_key_modal.html:30
#: perms/models/perm_node.py:21 users/serializers/group.py:33
#: perms/models/perm_node.py:21 settings/models.py:245
#: users/serializers/group.py:33
msgid "ID"
msgstr ""
#: accounts/serializers/account/account.py:503 acls/notifications.py:18
#: accounts/serializers/account/account.py:509 acls/notifications.py:18
#: acls/notifications.py:68 acls/serializers/base.py:104
#: acls/templates/acls/asset_login_reminder.html:8
#: acls/templates/acls/user_login_reminder.html:8
@ -1299,7 +1297,7 @@ msgstr ""
msgid "User"
msgstr ""
#: accounts/serializers/account/account.py:504
#: accounts/serializers/account/account.py:510
#: authentication/templates/authentication/_access_key_modal.html:33
#: terminal/notifications.py:165 terminal/notifications.py:225
msgid "Date"
@ -1686,7 +1684,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:23 assets/serializers/platform.py:182
#: assets/serializers/domain.py:23 assets/serializers/platform.py:183
#: orgs/serializers.py:13 perms/serializers/permission.py:61
msgid "Assets amount"
msgstr ""
@ -1718,7 +1716,7 @@ msgstr ""
#: accounts/templates/accounts/change_secret_report.html:118
#: accounts/templates/accounts/push_account_report.html:77
#: accounts/templates/accounts/push_account_report.html:117
#: audits/handler.py:128
#: audits/handler.py:130
msgid "No"
msgstr ""
@ -1839,6 +1837,18 @@ msgstr ""
msgid "Users"
msgstr ""
#: acls/models/base.py:97 acls/templates/acls/asset_login_reminder.html:10
#: assets/models/automations/base.py:25
#: assets/serializers/automations/base.py:20 assets/serializers/domain.py:33
#: assets/serializers/platform.py:182 assets/serializers/platform.py:214
#: authentication/api/connection_token.py:464 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:101
msgid "Assets"
msgstr ""
#: acls/models/command_acl.py:16 assets/models/cmd_filter.py:60
#: ops/serializers/job.py:92 terminal/const.py:88
#: terminal/models/session/session.py:40 terminal/serializers/command.py:18
@ -2109,11 +2119,11 @@ msgstr ""
msgid "User details"
msgstr ""
#: assets/api/asset/asset.py:154
#: assets/api/asset/asset.py:153
msgid "Cannot create asset directly, you should create a host or other"
msgstr ""
#: assets/api/asset/asset.py:158
#: assets/api/asset/asset.py:157
msgid "The number of assets exceeds the limit of 5000"
msgstr ""
@ -2542,8 +2552,9 @@ msgid "Cloud"
msgstr ""
#: assets/models/asset/common.py:101 assets/models/platform.py:16
#: settings/serializers/auth/radius.py:18 settings/serializers/auth/sms.py:77
#: settings/serializers/msg.py:31 terminal/serializers/storage.py:133
#: assets/serializers/platform.py:87 settings/serializers/auth/radius.py:18
#: settings/serializers/auth/sms.py:77 settings/serializers/msg.py:31
#: terminal/serializers/storage.py:133
#: xpack/plugins/cloud/serializers/account_attrs.py:88
msgid "Port"
msgstr ""
@ -2581,19 +2592,19 @@ msgstr ""
msgid "Custom info"
msgstr ""
#: assets/models/asset/common.py:431
#: assets/models/asset/common.py:430
msgid "Can refresh asset hardware info"
msgstr ""
#: assets/models/asset/common.py:432
#: assets/models/asset/common.py:431
msgid "Can test asset connectivity"
msgstr ""
#: assets/models/asset/common.py:433
#: assets/models/asset/common.py:432
msgid "Can match asset"
msgstr ""
#: assets/models/asset/common.py:434
#: assets/models/asset/common.py:433
msgid "Can change asset nodes"
msgstr ""
@ -2757,7 +2768,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
#: assets/serializers/platform.py:160
#: authentication/serializers/connect_token_secret.py:136
#: common/serializers/common.py:85 labels/serializers.py:45
#: settings/serializers/msg.py:91 xpack/plugins/cloud/models.py:404
@ -2808,7 +2819,7 @@ msgstr ""
msgid "Required"
msgstr ""
#: assets/models/platform.py:19 assets/serializers/platform.py:161
#: assets/models/platform.py:19 assets/serializers/platform.py:162
#: terminal/models/component/storage.py:28 users/const.py:42
#: xpack/plugins/cloud/providers/nutanix.py:30
msgid "Default"
@ -2911,11 +2922,11 @@ msgstr ""
msgid "Internal"
msgstr "Builtin"
#: assets/models/platform.py:102 assets/serializers/platform.py:171
#: assets/models/platform.py:102 assets/serializers/platform.py:172
msgid "Charset"
msgstr ""
#: assets/models/platform.py:104 assets/serializers/platform.py:209
#: assets/models/platform.py:104 assets/serializers/platform.py:210
msgid "Gateway enabled"
msgstr ""
@ -2923,15 +2934,15 @@ msgstr ""
msgid "DS enabled"
msgstr ""
#: assets/models/platform.py:107 assets/serializers/platform.py:202
#: assets/models/platform.py:107 assets/serializers/platform.py:203
msgid "Su enabled"
msgstr "Switch account enabled"
#: assets/models/platform.py:108 assets/serializers/platform.py:177
#: assets/models/platform.py:108 assets/serializers/platform.py:178
msgid "Su method"
msgstr "Switch account method"
#: assets/models/platform.py:109 assets/serializers/platform.py:180
#: assets/models/platform.py:109 assets/serializers/platform.py:181
msgid "Custom fields"
msgstr ""
@ -2946,7 +2957,7 @@ msgid ""
"type"
msgstr ""
#: assets/serializers/asset/common.py:36 assets/serializers/platform.py:153
#: assets/serializers/asset/common.py:36 assets/serializers/platform.py:154
msgid "Protocols, format is [\"protocol/port\"]"
msgstr ""
@ -2966,7 +2977,7 @@ msgid ""
"it"
msgstr ""
#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:174
#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:175
#: authentication/serializers/connect_token_secret.py:30
#: authentication/serializers/connect_token_secret.py:77
#: perms/models/asset_permission.py:76 perms/serializers/permission.py:67
@ -3171,58 +3182,58 @@ msgstr ""
msgid "Port from addr"
msgstr ""
#: assets/serializers/platform.py:98
#: assets/serializers/platform.py:99
msgid ""
"This protocol is primary, and it must be set when adding assets. "
"Additionally, there can only be one primary protocol."
msgstr ""
#: assets/serializers/platform.py:103
#: assets/serializers/platform.py:104
msgid "This protocol is required, and it must be set when adding assets."
msgstr ""
#: assets/serializers/platform.py:106
#: assets/serializers/platform.py:107
msgid ""
"This protocol is default, when adding assets, it will be displayed by "
"default."
msgstr ""
#: assets/serializers/platform.py:109
#: assets/serializers/platform.py:110
msgid "This protocol is public, asset will show this protocol to user"
msgstr ""
#: assets/serializers/platform.py:162
#: assets/serializers/platform.py:163
msgid "Help text"
msgstr ""
#: assets/serializers/platform.py:163
#: assets/serializers/platform.py:164
msgid "Choices"
msgstr ""
#: assets/serializers/platform.py:175
#: assets/serializers/platform.py:176
msgid "Automation"
msgstr ""
#: assets/serializers/platform.py:204
#: assets/serializers/platform.py:205
msgid ""
"Login with account when accessing assets, then automatically switch to "
"another, similar to logging in with a regular account and then switching to "
"root"
msgstr ""
#: assets/serializers/platform.py:210
#: assets/serializers/platform.py:211
msgid "Assets can be connected using a zone gateway"
msgstr ""
#: assets/serializers/platform.py:212
#: assets/serializers/platform.py:213
msgid "Default zone"
msgstr ""
#: assets/serializers/platform.py:239
#: assets/serializers/platform.py:240
msgid "type is required"
msgstr ""
#: assets/serializers/platform.py:254
#: assets/serializers/platform.py:255
msgid "Protocols is required"
msgstr ""
@ -3456,7 +3467,7 @@ msgstr ""
msgid "-"
msgstr ""
#: audits/handler.py:128
#: audits/handler.py:130
msgid "Yes"
msgstr ""
@ -3735,35 +3746,35 @@ msgstr ""
msgid "Reusable connection token is not allowed, global setting not enabled"
msgstr ""
#: authentication/api/connection_token.py:425
#: authentication/api/connection_token.py:426
msgid "Anonymous account is not supported for this asset"
msgstr ""
#: authentication/api/connection_token.py:455
#: authentication/api/connection_token.py:456
msgid "Permission expired"
msgstr ""
#: authentication/api/connection_token.py:488
#: authentication/api/connection_token.py:489
msgid "ACL action is reject: {}({})"
msgstr ""
#: authentication/api/connection_token.py:492
#: authentication/api/connection_token.py:493
msgid "ACL action is review"
msgstr ""
#: authentication/api/connection_token.py:502
#: authentication/api/connection_token.py:503
msgid "ACL action is face verify"
msgstr ""
#: authentication/api/connection_token.py:507
#: authentication/api/connection_token.py:508
msgid "ACL action not supported for this asset"
msgstr ""
#: authentication/api/connection_token.py:514
#: authentication/api/connection_token.py:515
msgid "ACL action is face online"
msgstr ""
#: authentication/api/connection_token.py:539
#: authentication/api/connection_token.py:540
msgid "No available face feature"
msgstr ""
@ -3837,7 +3848,11 @@ msgstr ""
msgid "Invalid token or cache refreshed."
msgstr ""
#: authentication/backends/oidc/views.py:175
#: authentication/backends/oauth2/views.py:67
msgid "OAuth2 Error"
msgstr ""
#: authentication/backends/oidc/views.py:137
msgid "OpenID Error"
msgstr ""
@ -3866,7 +3881,7 @@ msgstr ""
msgid "Credential ID"
msgstr ""
#: authentication/backends/saml2/views.py:282
#: authentication/backends/saml2/views.py:255
msgid "SAML2 Error"
msgstr ""
@ -4056,16 +4071,16 @@ msgstr ""
msgid "Please wait for %s seconds before retry"
msgstr ""
#: authentication/errors/redirect.py:85 authentication/mixins.py:332
#: authentication/errors/redirect.py:85 authentication/mixins.py:365
#: users/views/profile/reset.py:224
msgid "Your password is too simple, please change it for security"
msgstr ""
#: authentication/errors/redirect.py:93 authentication/mixins.py:341
#: authentication/errors/redirect.py:93 authentication/mixins.py:374
msgid "You should to change your password before login"
msgstr ""
#: authentication/errors/redirect.py:101 authentication/mixins.py:350
#: authentication/errors/redirect.py:101 authentication/mixins.py:383
msgid "Your password has expired, please reset before logging in"
msgstr ""
@ -4182,21 +4197,28 @@ msgstr ""
msgid "Authentication failed (before login check failed): {}"
msgstr ""
#: authentication/mixins.py:84
#: authentication/mixins.py:105
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 ""
#: authentication/mixins.py:117
msgid "User is invalid"
msgstr ""
#: authentication/mixins.py:99
#: authentication/mixins.py:132
msgid ""
"The administrator has enabled 'Only allow login from user source'. \n"
" The current user source is {}. Please contact the administrator."
msgstr ""
#: authentication/mixins.py:278
#: authentication/mixins.py:311
msgid "The MFA type ({}) is not enabled"
msgstr ""
#: authentication/mixins.py:320
#: authentication/mixins.py:353
msgid "Please change your password"
msgstr ""
@ -4678,22 +4700,22 @@ msgstr ""
msgid "LAN"
msgstr ""
#: authentication/views/base.py:71
#: authentication/views/base.py:70
#: perms/templates/perms/_msg_permed_items_expire.html:18
msgid "If you have any question, please contact the administrator"
msgstr ""
#: authentication/views/base.py:144
#: authentication/views/base.py:143
#, python-format
msgid "%s query user failed"
msgstr ""
#: authentication/views/base.py:152
#: authentication/views/base.py:151
#, python-format
msgid "The %s is already bound to another user"
msgstr ""
#: authentication/views/base.py:159
#: authentication/views/base.py:158
#, python-format
msgid "Binding %s successfully"
msgstr ""
@ -4830,7 +4852,7 @@ msgstr ""
msgid "Please login with a password and then bind the WeCom"
msgstr ""
#: common/api/action.py:68
#: common/api/action.py:80
msgid "Request file format may be wrong"
msgstr ""
@ -5343,7 +5365,7 @@ msgstr ""
msgid "App Labels"
msgstr "Labels"
#: labels/models.py:15 settings/serializers/security.py:211
#: labels/models.py:15
msgid "Color"
msgstr ""
@ -5402,16 +5424,16 @@ msgid ""
" work orders, and other notifications"
msgstr ""
#: ops/ansible/inventory.py:135 ops/ansible/inventory.py:205
#: ops/ansible/inventory.py:136 ops/ansible/inventory.py:206
#: ops/models/job.py:69
msgid "No account available"
msgstr ""
#: ops/ansible/inventory.py:326 ops/ansible/inventory.py:368
#: ops/ansible/inventory.py:327 ops/ansible/inventory.py:369
msgid "Ansible disabled"
msgstr ""
#: ops/ansible/inventory.py:384
#: ops/ansible/inventory.py:385
msgid "Skip hosts below:"
msgstr ""
@ -5427,34 +5449,38 @@ msgstr ""
msgid "Task {} args or kwargs error"
msgstr ""
#: ops/api/job.py:70
#: ops/api/job.py:65
msgid "Login to asset {}({}) is rejected by login asset ACL ({})"
msgstr ""
#: ops/api/job.py:88
#, 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:71
#: ops/api/job.py:89
#, python-brace-format
msgid "Asset ({asset}) authorization is missing SSH, SFTP, or WinRM protocol"
msgstr ""
#: ops/api/job.py:72
#: ops/api/job.py:90
#, python-brace-format
msgid "Asset ({asset}) authorization lacks upload permissions"
msgstr ""
#: ops/api/job.py:160
#: ops/api/job.py:185
msgid "Duplicate file exists"
msgstr ""
#: ops/api/job.py:165
#: ops/api/job.py:190
#, python-brace-format
msgid ""
"File size exceeds maximum limit. Please select a file smaller than {limit}MB"
msgstr ""
#: ops/api/job.py:238
#: ops/api/job.py:273
msgid ""
"The task is being created and cannot be interrupted. Please try again later."
msgstr ""
@ -5756,7 +5782,7 @@ msgstr ""
msgid "Material Type"
msgstr ""
#: ops/models/job.py:561
#: ops/models/job.py:581
msgid "Job Execution"
msgstr ""
@ -7268,39 +7294,39 @@ msgid "Period clean"
msgstr ""
#: settings/serializers/cleaning.py:15
msgid "Login log retention days (day)"
msgid "Login log retention days"
msgstr ""
#: settings/serializers/cleaning.py:19
msgid "Task log retention days (day)"
msgid "Task log retention days"
msgstr ""
#: settings/serializers/cleaning.py:23
msgid "Operate log retention days (day)"
msgid "Operate log retention days"
msgstr ""
#: settings/serializers/cleaning.py:27
msgid "password change log keep days (day)"
msgid "Password change log retention days"
msgstr ""
#: settings/serializers/cleaning.py:31
msgid "FTP log retention days (day)"
msgid "FTP log retention days"
msgstr ""
#: settings/serializers/cleaning.py:35
msgid "Cloud sync task history retention days (day)"
msgid "Cloud sync task history retention days"
msgstr ""
#: settings/serializers/cleaning.py:39
msgid "job execution retention days (day)"
msgid "job execution retention days"
msgstr ""
#: settings/serializers/cleaning.py:43
msgid "Activity log retention days (day)"
msgid "Activity log retention days"
msgstr ""
#: settings/serializers/cleaning.py:46
msgid "Session log retention days (day)"
msgid "Session log retention days"
msgstr ""
#: settings/serializers/cleaning.py:48
@ -7310,7 +7336,7 @@ msgid ""
msgstr ""
#: settings/serializers/cleaning.py:53
msgid "Change secret and push record retention days (day)"
msgid "Change secret and push record retention days"
msgstr ""
#: settings/serializers/feature.py:23 settings/serializers/msg.py:69
@ -7771,28 +7797,32 @@ msgid "Watermark"
msgstr ""
#: settings/serializers/security.py:205
msgid "Watermark session content"
msgstr ""
msgid "Session content"
msgstr "Custom content for session"
#: settings/serializers/security.py:208
msgid "Watermark console content"
msgstr ""
msgid "Console content"
msgstr "Custom content on the management page"
#: settings/serializers/security.py:211
msgid "Font color"
msgstr "Font color"
#: settings/serializers/security.py:214
msgid "Watermark font size"
msgstr ""
msgid "Font size"
msgstr "Font size (px)"
#: settings/serializers/security.py:217
msgid "Watermark height"
msgstr ""
msgid "Height"
msgstr "Height (px)"
#: settings/serializers/security.py:220
msgid "Watermark width"
msgstr ""
msgid "Width"
msgstr "Height (px)"
#: settings/serializers/security.py:223
msgid "Watermark rotate"
msgstr ""
msgid "Rotate"
msgstr "Rotate (degree)"
#: settings/serializers/security.py:227
msgid "Max idle time (minute)"
@ -8084,15 +8114,15 @@ msgstr ""
msgid "Authentication success: {}"
msgstr ""
#: settings/ws.py:226
#: settings/ws.py:228
msgid "No LDAP user was found"
msgstr ""
#: settings/ws.py:235
#: settings/ws.py:237
msgid "Total {}, success {}, failure {}"
msgstr ""
#: settings/ws.py:239
#: settings/ws.py:241
msgid ", disabled {}"
msgstr ""
@ -11161,6 +11191,10 @@ msgstr ""
msgid "Port \"%(port)s\" of instance IP \"%(ip)s\" is not reachable"
msgstr ""
#: xpack/plugins/cloud/providers/scp.py:108
msgid "Empty"
msgstr ""
#: xpack/plugins/cloud/serializers/account.py:104
msgid "Validity display"
msgstr ""

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-16 14:10+0800\n"
"POT-Creation-Date: 2025-11-17 17:53+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -18,14 +18,18 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: accounts/api/account/account.py:141
#: accounts/api/account/account.py:142
#: accounts/serializers/account/account.py:181
#: accounts/serializers/account/account.py:362
msgid "Account already exists"
msgstr "La cuenta ya existe"
#: accounts/api/account/account.py:207
msgid "No valid assets found for account creation."
msgstr "No se encontraron activos válidos disponibles para crear una cuenta."
#: accounts/api/account/application.py:77
#: authentication/api/connection_token.py:452
#: authentication/api/connection_token.py:453
msgid "Account not found"
msgstr "Cuenta no encontrada"
@ -484,7 +488,7 @@ msgstr ""
#: accounts/templates/accounts/push_account_report.html:78
#: accounts/templates/accounts/push_account_report.html:118
#: acls/notifications.py:70 acls/serializers/base.py:111
#: assets/models/asset/common.py:102 assets/models/asset/common.py:428
#: assets/models/asset/common.py:102 assets/models/asset/common.py:427
#: assets/models/cmd_filter.py:36 audits/models.py:59 audits/models.py:336
#: audits/serializers.py:230 authentication/models/connection_token.py:42
#: perms/models/asset_permission.py:69 terminal/backends/command/models.py:17
@ -499,7 +503,7 @@ msgstr "Activos"
#: accounts/models/account.py:89 accounts/models/template.py:16
#: accounts/serializers/account/account.py:234
#: accounts/serializers/account/account.py:304
#: accounts/serializers/account/account.py:305
#: accounts/serializers/account/template.py:35
#: authentication/serializers/connect_token_secret.py:51
msgid "Su from"
@ -546,13 +550,14 @@ msgstr "Estado de cambio de contraseña"
#: accounts/models/account.py:107
#: accounts/models/automations/check_account.py:64
#: accounts/serializers/account/account.py:295
#: accounts/serializers/account/service.py:13
#: accounts/serializers/automations/change_secret.py:117
#: accounts/serializers/automations/change_secret.py:148
#: acls/serializers/base.py:112
#: acls/templates/acls/asset_login_reminder.html:11
#: assets/serializers/gateway.py:33 audits/models.py:60 audits/models.py:337
#: audits/serializers.py:231 authentication/api/connection_token.py:464
#: audits/serializers.py:231 authentication/api/connection_token.py:465
#: 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:31 terminal/notifications.py:291
@ -606,8 +611,8 @@ msgstr "Actividad de cuenta"
#: assets/models/asset/common.py:166 assets/models/cmd_filter.py:21
#: assets/models/label.py:18 assets/models/platform.py:15
#: assets/models/platform.py:94 assets/models/zone.py:19
#: assets/serializers/asset/common.py:174 assets/serializers/platform.py:158
#: assets/serializers/platform.py:283
#: assets/serializers/asset/common.py:174 assets/serializers/platform.py:159
#: assets/serializers/platform.py:284
#: authentication/backends/passkey/models.py:10
#: authentication/models/ssh_key.py:12 authentication/notifications.py:17
#: authentication/notifications.py:56
@ -645,7 +650,7 @@ msgstr "Ícono"
#: accounts/models/application.py:20 accounts/models/base.py:39
#: accounts/models/mixins/vault.py:49
#: accounts/serializers/account/account.py:492
#: accounts/serializers/account/account.py:498
#: accounts/serializers/account/base.py:20
#: authentication/models/temp_token.py:11
#: authentication/templates/authentication/_access_key_modal.html:31
@ -818,7 +823,7 @@ msgid "Status"
msgstr "Estado"
#: accounts/models/automations/change_secret.py:51
#: accounts/serializers/account/account.py:296 assets/const/automation.py:9
#: accounts/serializers/account/account.py:297 assets/const/automation.py:9
#: authentication/templates/authentication/passkey.html:177
#: authentication/views/base.py:42 authentication/views/base.py:43
#: authentication/views/base.py:44 common/const/choices.py:67
@ -1049,7 +1054,7 @@ msgid "Verify asset account"
msgstr "Verificación de cuentas"
#: accounts/models/base.py:37 accounts/models/base.py:66
#: accounts/serializers/account/account.py:491
#: accounts/serializers/account/account.py:497
#: accounts/serializers/account/base.py:17
#: accounts/serializers/automations/change_secret.py:50
#: authentication/serializers/connect_token_secret.py:42
@ -1239,8 +1244,8 @@ 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:284 perms/serializers/user_permission.py:27
#: assets/serializers/cagegory.py:12 assets/serializers/platform.py:174
#: assets/serializers/platform.py:285 perms/serializers/user_permission.py:27
#: settings/models.py:41 tickets/models/ticket/apply_application.py:13
#: users/models/preference.py:12 xpack/plugins/cloud/models.py:41
#: xpack/plugins/cloud/models.py:327
@ -1252,7 +1257,7 @@ msgstr "Categoría"
#: acls/serializers/command_acl.py:19 assets/models/automations/base.py:27
#: 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
#: assets/serializers/platform.py:161 assets/serializers/platform.py:173
#: audits/serializers.py:76 audits/serializers.py:196
#: authentication/models/connection_token.py:67
#: authentication/serializers/connect_token_secret.py:138
@ -1286,54 +1291,47 @@ msgstr "La cuenta ya existe. El campo: {fields} debe ser único."
msgid "Has secret"
msgstr "Contraseña ya gestionada"
#: accounts/serializers/account/account.py:295 ops/models/celery.py:84
#: accounts/serializers/account/account.py:296 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:297
#: accounts/serializers/account/account.py:298
msgid "Changed"
msgstr "Modificado"
#: accounts/serializers/account/account.py:307 acls/models/base.py:97
#: acls/templates/acls/asset_login_reminder.html:10
#: assets/models/automations/base.py:25
#: 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: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:101
msgid "Assets"
msgstr "Activos"
#: accounts/serializers/account/account.py:412
#: accounts/serializers/account/account.py:410
#, 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:444
#: accounts/serializers/account/account.py:443
msgid "Account has exist"
msgstr "La cuenta ya existe"
#: accounts/serializers/account/account.py:476
#: accounts/serializers/account/account.py:483
#: accounts/serializers/account/account.py:468
#: accounts/serializers/account/account.py:469
msgid "At least one asset or node must be specified"
msgstr "Seleccionar al menos un activo o nodo"
#: accounts/serializers/account/account.py:482
#: accounts/serializers/account/account.py:489
#: accounts/serializers/account/base.py:73
#: accounts/serializers/account/base.py:88
#: assets/serializers/asset/common.py:425
msgid "Spec info"
msgstr "Información especial"
#: accounts/serializers/account/account.py:493
#: accounts/serializers/account/account.py:499
#: authentication/serializers/connect_token_secret.py:173
#: authentication/templates/authentication/_access_key_modal.html:30
#: perms/models/perm_node.py:21 users/serializers/group.py:33
#: perms/models/perm_node.py:21 settings/models.py:245
#: users/serializers/group.py:33
msgid "ID"
msgstr "ID"
#: accounts/serializers/account/account.py:503 acls/notifications.py:18
#: accounts/serializers/account/account.py:509 acls/notifications.py:18
#: acls/notifications.py:68 acls/serializers/base.py:104
#: acls/templates/acls/asset_login_reminder.html:8
#: acls/templates/acls/user_login_reminder.html:8
@ -1358,7 +1356,7 @@ msgstr "ID"
msgid "User"
msgstr "Usuario"
#: accounts/serializers/account/account.py:504
#: accounts/serializers/account/account.py:510
#: authentication/templates/authentication/_access_key_modal.html:33
#: terminal/notifications.py:165 terminal/notifications.py:225
msgid "Date"
@ -1792,7 +1790,7 @@ msgstr "Número de tipos"
#: 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:23 assets/serializers/platform.py:182
#: assets/serializers/domain.py:23 assets/serializers/platform.py:183
#: orgs/serializers.py:13 perms/serializers/permission.py:61
msgid "Assets amount"
msgstr "Número de activos"
@ -1824,7 +1822,7 @@ msgstr "Cuenta exitosa"
#: accounts/templates/accounts/change_secret_report.html:118
#: accounts/templates/accounts/push_account_report.html:77
#: accounts/templates/accounts/push_account_report.html:117
#: audits/handler.py:128
#: audits/handler.py:130
msgid "No"
msgstr "No"
@ -1950,6 +1948,18 @@ msgstr "Persona aprobadora"
msgid "Users"
msgstr "Usuario"
#: acls/models/base.py:97 acls/templates/acls/asset_login_reminder.html:10
#: assets/models/automations/base.py:25
#: assets/serializers/automations/base.py:20 assets/serializers/domain.py:33
#: assets/serializers/platform.py:182 assets/serializers/platform.py:214
#: authentication/api/connection_token.py:464 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:101
msgid "Assets"
msgstr "Activos"
#: acls/models/command_acl.py:16 assets/models/cmd_filter.py:60
#: ops/serializers/job.py:92 terminal/const.py:88
#: terminal/models/session/session.py:40 terminal/serializers/command.py:18
@ -2234,12 +2244,12 @@ msgstr ""
msgid "User details"
msgstr "Detalles del usuario"
#: assets/api/asset/asset.py:154
#: 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:158
#: 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"
@ -2691,8 +2701,9 @@ msgid "Cloud"
msgstr "Servicios en la nube"
#: assets/models/asset/common.py:101 assets/models/platform.py:16
#: settings/serializers/auth/radius.py:18 settings/serializers/auth/sms.py:77
#: settings/serializers/msg.py:31 terminal/serializers/storage.py:133
#: assets/serializers/platform.py:87 settings/serializers/auth/radius.py:18
#: settings/serializers/auth/sms.py:77 settings/serializers/msg.py:31
#: terminal/serializers/storage.py:133
#: xpack/plugins/cloud/serializers/account_attrs.py:88
msgid "Port"
msgstr "Puerto"
@ -2730,19 +2741,19 @@ msgstr "Recopilar información sobre hardware de activos"
msgid "Custom info"
msgstr "Atributos personalizados"
#: assets/models/asset/common.py:431
#: assets/models/asset/common.py:430
msgid "Can refresh asset hardware info"
msgstr "Se puede actualizar la información del hardware de activos"
#: assets/models/asset/common.py:432
#: assets/models/asset/common.py:431
msgid "Can test asset connectivity"
msgstr "Se puede probar la conectividad de los activos"
#: assets/models/asset/common.py:433
#: assets/models/asset/common.py:432
msgid "Can match asset"
msgstr "Se pueden emparejar activos"
#: assets/models/asset/common.py:434
#: assets/models/asset/common.py:433
msgid "Can change asset nodes"
msgstr "Se pueden modificar nodos de activos"
@ -2906,7 +2917,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
#: assets/serializers/platform.py:160
#: authentication/serializers/connect_token_secret.py:136
#: common/serializers/common.py:85 labels/serializers.py:45
#: settings/serializers/msg.py:91 xpack/plugins/cloud/models.py:404
@ -2957,7 +2968,7 @@ msgstr "principal"
msgid "Required"
msgstr "necesario"
#: assets/models/platform.py:19 assets/serializers/platform.py:161
#: assets/models/platform.py:19 assets/serializers/platform.py:162
#: terminal/models/component/storage.py:28 users/const.py:42
#: xpack/plugins/cloud/providers/nutanix.py:30
msgid "Default"
@ -3060,11 +3071,11 @@ msgstr "Parámetros de eliminación de cuenta"
msgid "Internal"
msgstr "Incorporado"
#: assets/models/platform.py:102 assets/serializers/platform.py:171
#: assets/models/platform.py:102 assets/serializers/platform.py:172
msgid "Charset"
msgstr "Código"
#: assets/models/platform.py:104 assets/serializers/platform.py:209
#: assets/models/platform.py:104 assets/serializers/platform.py:210
msgid "Gateway enabled"
msgstr "Activar gateway de zona"
@ -3072,15 +3083,15 @@ msgstr "Activar gateway de zona"
msgid "DS enabled"
msgstr "El servicio de directorio ha sido habilitado"
#: assets/models/platform.py:107 assets/serializers/platform.py:202
#: assets/models/platform.py:107 assets/serializers/platform.py:203
msgid "Su enabled"
msgstr "Activar cambio de cuenta"
#: assets/models/platform.py:108 assets/serializers/platform.py:177
#: assets/models/platform.py:108 assets/serializers/platform.py:178
msgid "Su method"
msgstr "Método de cambio de cuenta"
#: assets/models/platform.py:109 assets/serializers/platform.py:180
#: assets/models/platform.py:109 assets/serializers/platform.py:181
msgid "Custom fields"
msgstr "Atributos personalizados"
@ -3097,7 +3108,7 @@ msgstr ""
"Actualización masiva de activos en la plataforma, se omite el activo que no "
"cumple con el tipo de plataforma"
#: assets/serializers/asset/common.py:36 assets/serializers/platform.py:153
#: assets/serializers/asset/common.py:36 assets/serializers/platform.py:154
msgid "Protocols, format is [\"protocol/port\"]"
msgstr "Protocolo, formato de [\"protocolo/p Puerto\"]"
@ -3121,7 +3132,7 @@ msgstr ""
"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
#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:175
#: authentication/serializers/connect_token_secret.py:30
#: authentication/serializers/connect_token_secret.py:77
#: perms/models/asset_permission.py:76 perms/serializers/permission.py:67
@ -3344,7 +3355,7 @@ msgstr "Iniciar eliminación de cuentas"
msgid "Port from addr"
msgstr "Puerto de la dirección"
#: assets/serializers/platform.py:98
#: assets/serializers/platform.py:99
msgid ""
"This protocol is primary, and it must be set when adding assets. "
"Additionally, there can only be one primary protocol."
@ -3352,11 +3363,11 @@ msgstr ""
"Este protocolo es principal, debe configurarse al agregar activos, y solo "
"puede haber un protocolo principal"
#: assets/serializers/platform.py:103
#: assets/serializers/platform.py:104
msgid "This protocol is required, and it must be set when adding assets."
msgstr "Este protocolo es obligatorio, debe configurarse al agregar activos"
#: assets/serializers/platform.py:106
#: assets/serializers/platform.py:107
msgid ""
"This protocol is default, when adding assets, it will be displayed by "
"default."
@ -3364,25 +3375,25 @@ msgstr ""
"Este protocolo es el predeterminado, se mostrará por defecto al agregar "
"activos"
#: assets/serializers/platform.py:109
#: assets/serializers/platform.py:110
msgid "This protocol is public, asset will show this protocol to user"
msgstr ""
"Este protocolo es público, los activos mostrarán este protocolo a los "
"usuarios y se podrán conectar para su uso"
#: assets/serializers/platform.py:162
#: assets/serializers/platform.py:163
msgid "Help text"
msgstr "Ayuda"
#: assets/serializers/platform.py:163
#: assets/serializers/platform.py:164
msgid "Choices"
msgstr "Elegir"
#: assets/serializers/platform.py:175
#: assets/serializers/platform.py:176
msgid "Automation"
msgstr "Automatización"
#: assets/serializers/platform.py:204
#: assets/serializers/platform.py:205
msgid ""
"Login with account when accessing assets, then automatically switch to "
"another, similar to logging in with a regular account and then switching to "
@ -3392,19 +3403,19 @@ msgstr ""
"se cambia automáticamente a otra cuenta, como si se iniciara sesión con una "
"cuenta normal y luego se cambiara a root."
#: assets/serializers/platform.py:210
#: assets/serializers/platform.py:211
msgid "Assets can be connected using a zone gateway"
msgstr "Los activos pueden conectarse a través de una puerta de enlace local."
#: assets/serializers/platform.py:212
#: assets/serializers/platform.py:213
msgid "Default zone"
msgstr "Dominio predeterminado"
#: assets/serializers/platform.py:239
#: assets/serializers/platform.py:240
msgid "type is required"
msgstr "Tipo Este campo es obligatorio."
#: assets/serializers/platform.py:254
#: assets/serializers/platform.py:255
msgid "Protocols is required"
msgstr "El protocolo es obligatorio."
@ -3651,7 +3662,7 @@ msgstr "Tarea"
msgid "-"
msgstr "-"
#: audits/handler.py:128
#: audits/handler.py:130
msgid "Yes"
msgstr "Es"
@ -3949,37 +3960,37 @@ msgstr ""
"No se permite el uso de tokens de conexión reutilizables, no se han "
"habilitado configuraciones globales."
#: authentication/api/connection_token.py:425
#: authentication/api/connection_token.py:426
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:456
msgid "Permission expired"
msgstr "La autorización ha expirado."
#: authentication/api/connection_token.py:488
#: authentication/api/connection_token.py:489
msgid "ACL action is reject: {}({})"
msgstr "La acción de ACL es rechazar: {}({})"
#: authentication/api/connection_token.py:492
#: authentication/api/connection_token.py:493
msgid "ACL action is review"
msgstr "La acción de ACL es revisar."
#: authentication/api/connection_token.py:502
#: authentication/api/connection_token.py:503
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:508
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:515
msgid "ACL action is face online"
msgstr "La acción de ACL es verificación facial en línea."
#: authentication/api/connection_token.py:539
#: authentication/api/connection_token.py:540
msgid "No available face feature"
msgstr "No hay características faciales disponibles."
@ -4061,7 +4072,11 @@ msgstr ""
msgid "Invalid token or cache refreshed."
msgstr "El token de actualización o la caché son inválidos."
#: authentication/backends/oidc/views.py:175
#: authentication/backends/oauth2/views.py:67
msgid "OAuth2 Error"
msgstr "Error OAuth2"
#: authentication/backends/oidc/views.py:137
msgid "OpenID Error"
msgstr "Error de OpenID"
@ -4092,7 +4107,7 @@ msgstr "Adjunto"
msgid "Credential ID"
msgstr "ID de comprobante"
#: authentication/backends/saml2/views.py:282
#: authentication/backends/saml2/views.py:255
msgid "SAML2 Error"
msgstr "Error SAML2"
@ -4292,18 +4307,18 @@ msgstr "Tu contraseña es inválida"
msgid "Please wait for %s seconds before retry"
msgstr "Por favor, inténtalo de nuevo en %s segundos"
#: authentication/errors/redirect.py:85 authentication/mixins.py:332
#: authentication/errors/redirect.py:85 authentication/mixins.py:365
#: users/views/profile/reset.py:224
msgid "Your password is too simple, please change it for security"
msgstr ""
"Tu contraseña es demasiado simple, por razones de seguridad, modifícala"
#: authentication/errors/redirect.py:93 authentication/mixins.py:341
#: authentication/errors/redirect.py:93 authentication/mixins.py:374
msgid "You should to change your password before login"
msgstr ""
"Antes de completar el inicio de sesión, por favor, modifique su contraseña."
#: authentication/errors/redirect.py:101 authentication/mixins.py:350
#: authentication/errors/redirect.py:101 authentication/mixins.py:383
msgid "Your password has expired, please reset before logging in"
msgstr "Su contraseña ha expirado; modifíquela antes de iniciar sesión."
@ -4430,11 +4445,20 @@ msgstr ""
"Error de autenticación (fallo en la verificación antes de iniciar sesión): "
"{}"
#: authentication/mixins.py:84
#: authentication/mixins.py:105
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 ""
"El administrador ha habilitado 'solo permitir que los usuarios existentes "
"inicien sesión', el usuario actual no está en la lista, por favor contacta "
"al administrador."
#: authentication/mixins.py:117
msgid "User is invalid"
msgstr "Usuario no válido"
#: authentication/mixins.py:99
#: authentication/mixins.py:132
msgid ""
"The administrator has enabled 'Only allow login from user source'. \n"
" The current user source is {}. Please contact the administrator."
@ -4443,11 +4467,11 @@ msgstr ""
"usuario'; la fuente actual del usuario es {}, por favor contacte al "
"administrador."
#: authentication/mixins.py:278
#: authentication/mixins.py:311
msgid "The MFA type ({}) is not enabled"
msgstr "El método MFA ({}) no está habilitado"
#: authentication/mixins.py:320
#: authentication/mixins.py:353
msgid "Please change your password"
msgstr "Por favor, modifica la contraseña"
@ -4966,24 +4990,24 @@ msgstr "¿Reintentar?"
msgid "LAN"
msgstr "Red local"
#: authentication/views/base.py:71
#: authentication/views/base.py:70
#: perms/templates/perms/_msg_permed_items_expire.html:18
msgid "If you have any question, please contact the administrator"
msgstr ""
"Si tienes alguna duda o necesidad, por favor contacta al administrador del "
"sistema"
#: authentication/views/base.py:144
#: authentication/views/base.py:143
#, python-format
msgid "%s query user failed"
msgstr "Error al consultar el usuario %s"
#: authentication/views/base.py:152
#: authentication/views/base.py:151
#, python-format
msgid "The %s is already bound to another user"
msgstr "%s ya está vinculado a otro usuario"
#: authentication/views/base.py:159
#: authentication/views/base.py:158
#, python-format
msgid "Binding %s successfully"
msgstr "Vinculación de %s exitosa"
@ -5126,7 +5150,7 @@ msgid "Please login with a password and then bind the WeCom"
msgstr ""
"Por favor inicie sesión con su contraseña y luego vincule WeChat empresarial"
#: common/api/action.py:68
#: common/api/action.py:80
msgid "Request file format may be wrong"
msgstr ""
"Formato de archivo subido incorrecto o archivo de otro tipo de recurso"
@ -5690,7 +5714,7 @@ msgstr ""
msgid "App Labels"
msgstr "Gestión de etiquetas"
#: labels/models.py:15 settings/serializers/security.py:211
#: labels/models.py:15
msgid "Color"
msgstr "Color"
@ -5750,16 +5774,16 @@ msgstr ""
"Ejecutar esta tarea cuando el sistema requiera enviar mensajes internos, "
"como alertas y órdenes de trabajo"
#: ops/ansible/inventory.py:135 ops/ansible/inventory.py:205
#: ops/ansible/inventory.py:136 ops/ansible/inventory.py:206
#: ops/models/job.py:69
msgid "No account available"
msgstr "No hay cuentas disponibles"
#: ops/ansible/inventory.py:326 ops/ansible/inventory.py:368
#: ops/ansible/inventory.py:327 ops/ansible/inventory.py:369
msgid "Ansible disabled"
msgstr "Ansible ha sido desactivado"
#: ops/ansible/inventory.py:384
#: ops/ansible/inventory.py:385
msgid "Skip hosts below:"
msgstr "Se omiten los siguientes hosts:"
@ -5775,7 +5799,11 @@ 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:70
#: ops/api/job.py:65
msgid "Login to asset {}({}) is rejected by login asset ACL ({})"
msgstr ""
#: ops/api/job.py:88
#, python-brace-format
msgid ""
"Asset ({asset}) must have at least one of the following protocols added: "
@ -5784,17 +5812,17 @@ msgstr ""
"El activo ({asset}) debe tener al menos uno de los siguientes protocolos: "
"ssh, sftp, winrm"
#: ops/api/job.py:71
#: ops/api/job.py:89
#, 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:72
#: ops/api/job.py:90
#, python-brace-format
msgid "Asset ({asset}) authorization lacks upload permissions"
msgstr "Falta permiso de subida para el activo ({asset})"
#: ops/api/job.py:160
#: ops/api/job.py:185
msgid "Duplicate file exists"
msgstr ""
"Existen archivos con el mismo nombre. El tamaño del archivo excede el límite"
@ -5806,7 +5834,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:165
#: ops/api/job.py:190
#, python-brace-format
msgid ""
"File size exceeds maximum limit. Please select a file smaller than {limit}MB"
@ -5814,7 +5842,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:238
#: ops/api/job.py:273
msgid ""
"The task is being created and cannot be interrupted. Please try again later."
msgstr ""
@ -6121,7 +6149,7 @@ msgstr "Material"
msgid "Material Type"
msgstr "Tipo de material"
#: ops/models/job.py:561
#: ops/models/job.py:581
msgid "Job Execution"
msgstr "Ejecución de trabajos"
@ -7816,40 +7844,40 @@ msgid "Period clean"
msgstr "Limpieza programada"
#: settings/serializers/cleaning.py:15
msgid "Login log retention days (day)"
msgstr "Registro de inicio de sesión (días)"
msgid "Login log retention days"
msgstr "Días de retención de los registros de inicio de sesión"
#: settings/serializers/cleaning.py:19
msgid "Task log retention days (day)"
msgstr "Registro de tareas (días)"
msgid "Task log retention days"
msgstr "Días de retención de los registros de tareas"
#: settings/serializers/cleaning.py:23
msgid "Operate log retention days (day)"
msgstr "Registro de acciones (días)"
msgid "Operate log retention days"
msgstr "Días de retención de los registros de acción"
#: settings/serializers/cleaning.py:27
msgid "password change log keep days (day)"
msgstr "Registro de cambios de contraseña"
msgid "Password change log retention days"
msgstr "Días de retención de los registros de cambio de contraseña de usuario"
#: settings/serializers/cleaning.py:31
msgid "FTP log retention days (day)"
msgstr "Subidas y descargas (días)"
msgid "FTP log retention days"
msgstr "Días de retención de los registros de subida y descarga"
#: settings/serializers/cleaning.py:35
msgid "Cloud sync task history retention days (day)"
msgstr "Sincronización de registros en la nube (días)"
msgid "Cloud sync task history retention days"
msgstr "Días de retención de los registros de sincronización en la nube"
#: settings/serializers/cleaning.py:39
msgid "job execution retention days (day)"
msgstr "Historial de ejecución del centro de tareas (días)"
msgid "job execution retention days"
msgstr "Días de retención del historial de ejecución de trabajos"
#: settings/serializers/cleaning.py:43
msgid "Activity log retention days (day)"
msgstr "Registro de actividades (días)"
msgid "Activity log retention days"
msgstr "Días de retención de los registros de actividades"
#: settings/serializers/cleaning.py:46
msgid "Session log retention days (day)"
msgstr "Registro de sesiones (días)"
msgid "Session log retention days"
msgstr "Días de retención de los registros de sesiones"
#: settings/serializers/cleaning.py:48
msgid ""
@ -7861,8 +7889,10 @@ msgstr ""
"etc.)"
#: settings/serializers/cleaning.py:53
msgid "Change secret and push record retention days (day)"
msgstr "Días de conservación de los registros de cambio de contraseña (días)"
msgid "Change secret and push record retention days"
msgstr ""
"Días de retención de los registros de notificaciones de cambio de contraseña"
" de cuenta"
#: settings/serializers/feature.py:23 settings/serializers/msg.py:69
msgid "Subject"
@ -8418,29 +8448,32 @@ msgid "Watermark"
msgstr "Activar marca de agua"
#: settings/serializers/security.py:205
msgid "Watermark session content"
msgstr "Contenido de personalización de la marca de agua de la sesión"
msgid "Session content"
msgstr "Contenido personalizado de marca de agua de sesión"
#: settings/serializers/security.py:208
msgid "Watermark console content"
msgstr ""
"Contenido de personalización de la marca de agua en la página de gestión"
msgid "Console content"
msgstr "Contenido personalizado de marca de agua de página de gestión"
#: settings/serializers/security.py:211
msgid "Font color"
msgstr "Color de fuente"
#: settings/serializers/security.py:214
msgid "Watermark font size"
msgstr "Tamaño y tipo de fuente"
msgid "Font size"
msgstr "Tamaño de fuente (px)"
#: settings/serializers/security.py:217
msgid "Watermark height"
msgstr "Altura de la marca de agua individual"
msgid "Height"
msgstr "Altura (px)"
#: settings/serializers/security.py:220
msgid "Watermark width"
msgstr "Ancho de la marca de agua individual"
msgid "Width"
msgstr "Ancho (px)"
#: settings/serializers/security.py:223
msgid "Watermark rotate"
msgstr "Ángulo de rotación de la marca de agua"
msgid "Rotate"
msgstr "Rotación (grados)"
#: settings/serializers/security.py:227
msgid "Max idle time (minute)"
@ -8774,15 +8807,15 @@ msgstr "Error de autenticación: (desconocido): {}"
msgid "Authentication success: {}"
msgstr "Autenticación exitosa: {}"
#: settings/ws.py:226
#: settings/ws.py:228
msgid "No LDAP user was found"
msgstr "No se obtuvo ningún usuario LDAP"
#: settings/ws.py:235
#: settings/ws.py:237
msgid "Total {}, success {}, failure {}"
msgstr "Total: {}, Éxitos: {}, Fracasos: {}"
#: settings/ws.py:239
#: settings/ws.py:241
msgid ", disabled {}"
msgstr ", deshabilitar {}"
@ -12051,6 +12084,10 @@ msgstr "Este de China - Suqian"
msgid "Port \"%(port)s\" of instance IP \"%(ip)s\" is not reachable"
msgstr "No se puede acceder al puerto %(port)s de la instancia IP %(ip)s"
#: xpack/plugins/cloud/providers/scp.py:108
msgid "Empty"
msgstr "Vacío "
#: xpack/plugins/cloud/serializers/account.py:104
msgid "Validity display"
msgstr "Mostrar validez"
@ -12231,28 +12268,3 @@ msgstr "Importación de licencia exitosa"
#: xpack/plugins/license/api.py:53
msgid "Invalid license"
msgstr "Licencia no válida"
#, fuzzy
#~ msgid "Themes"
#~ msgstr "Tema"
#, fuzzy
#~ msgid "domain_name"
#~ msgstr "Nombre de dominio"
#~ msgid "Task execution id"
#~ msgstr "ID de ejecución de tareas"
#~ msgid "Respectful"
#~ msgstr "Estimado"
#~ 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 ""
#~ "¡Hola! A continuación se presentan las situaciones en las que ha fallado el "
#~ "cambio o envío de la cuenta de activos. Por favor, revise y procese a la "
#~ "brevedad."
#~ msgid "EXCHANGE"
#~ msgstr "Intercambio"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-16 14:10+0800\n"
"POT-Creation-Date: 2025-11-17 17:53+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -18,14 +18,18 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: accounts/api/account/account.py:141
#: accounts/api/account/account.py:142
#: accounts/serializers/account/account.py:181
#: accounts/serializers/account/account.py:362
msgid "Account already exists"
msgstr "アカウントはすでに存在しています"
#: accounts/api/account/account.py:207
msgid "No valid assets found for account creation."
msgstr "アカウント作成に使用できる有効な資産が見つかりませんでした。"
#: accounts/api/account/application.py:77
#: authentication/api/connection_token.py:452
#: authentication/api/connection_token.py:453
msgid "Account not found"
msgstr "アカウントが見つかりません"
@ -459,7 +463,7 @@ msgstr "Vault 操作に失敗しました。再試行するか、Vault のアカ
#: accounts/templates/accounts/push_account_report.html:78
#: accounts/templates/accounts/push_account_report.html:118
#: acls/notifications.py:70 acls/serializers/base.py:111
#: assets/models/asset/common.py:102 assets/models/asset/common.py:428
#: assets/models/asset/common.py:102 assets/models/asset/common.py:427
#: assets/models/cmd_filter.py:36 audits/models.py:59 audits/models.py:336
#: audits/serializers.py:230 authentication/models/connection_token.py:42
#: perms/models/asset_permission.py:69 terminal/backends/command/models.py:17
@ -474,7 +478,7 @@ msgstr "資産"
#: accounts/models/account.py:89 accounts/models/template.py:16
#: accounts/serializers/account/account.py:234
#: accounts/serializers/account/account.py:304
#: accounts/serializers/account/account.py:305
#: accounts/serializers/account/template.py:35
#: authentication/serializers/connect_token_secret.py:51
msgid "Su from"
@ -536,13 +540,14 @@ msgstr "変更状態"
#: accounts/models/account.py:107
#: accounts/models/automations/check_account.py:64
#: accounts/serializers/account/account.py:295
#: accounts/serializers/account/service.py:13
#: accounts/serializers/automations/change_secret.py:117
#: accounts/serializers/automations/change_secret.py:148
#: acls/serializers/base.py:112
#: acls/templates/acls/asset_login_reminder.html:11
#: assets/serializers/gateway.py:33 audits/models.py:60 audits/models.py:337
#: audits/serializers.py:231 authentication/api/connection_token.py:464
#: audits/serializers.py:231 authentication/api/connection_token.py:465
#: 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:31 terminal/notifications.py:291
@ -596,8 +601,8 @@ msgstr "アカウントの活動"
#: assets/models/asset/common.py:166 assets/models/cmd_filter.py:21
#: assets/models/label.py:18 assets/models/platform.py:15
#: assets/models/platform.py:94 assets/models/zone.py:19
#: assets/serializers/asset/common.py:174 assets/serializers/platform.py:158
#: assets/serializers/platform.py:283
#: assets/serializers/asset/common.py:174 assets/serializers/platform.py:159
#: assets/serializers/platform.py:284
#: authentication/backends/passkey/models.py:10
#: authentication/models/ssh_key.py:12 authentication/notifications.py:17
#: authentication/notifications.py:56
@ -635,7 +640,7 @@ msgstr "アイコン"
#: accounts/models/application.py:20 accounts/models/base.py:39
#: accounts/models/mixins/vault.py:49
#: accounts/serializers/account/account.py:492
#: accounts/serializers/account/account.py:498
#: accounts/serializers/account/base.py:20
#: authentication/models/temp_token.py:11
#: authentication/templates/authentication/_access_key_modal.html:31
@ -808,7 +813,7 @@ msgid "Status"
msgstr "ステータス"
#: accounts/models/automations/change_secret.py:51
#: accounts/serializers/account/account.py:296 assets/const/automation.py:9
#: accounts/serializers/account/account.py:297 assets/const/automation.py:9
#: authentication/templates/authentication/passkey.html:177
#: authentication/views/base.py:42 authentication/views/base.py:43
#: authentication/views/base.py:44 common/const/choices.py:67
@ -1032,7 +1037,7 @@ msgid "Verify asset account"
msgstr "アカウントの確認"
#: accounts/models/base.py:37 accounts/models/base.py:66
#: accounts/serializers/account/account.py:491
#: accounts/serializers/account/account.py:497
#: accounts/serializers/account/base.py:17
#: accounts/serializers/automations/change_secret.py:50
#: authentication/serializers/connect_token_secret.py:42
@ -1208,8 +1213,8 @@ 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:284 perms/serializers/user_permission.py:27
#: assets/serializers/cagegory.py:12 assets/serializers/platform.py:174
#: assets/serializers/platform.py:285 perms/serializers/user_permission.py:27
#: settings/models.py:41 tickets/models/ticket/apply_application.py:13
#: users/models/preference.py:12 xpack/plugins/cloud/models.py:41
#: xpack/plugins/cloud/models.py:327
@ -1221,7 +1226,7 @@ msgstr "カテゴリ"
#: acls/serializers/command_acl.py:19 assets/models/automations/base.py:27
#: 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
#: assets/serializers/platform.py:161 assets/serializers/platform.py:173
#: audits/serializers.py:76 audits/serializers.py:196
#: authentication/models/connection_token.py:67
#: authentication/serializers/connect_token_secret.py:138
@ -1255,54 +1260,47 @@ msgstr "アカウントは既に存在します。フィールド:{fields}は
msgid "Has secret"
msgstr "エスクローされたパスワード"
#: accounts/serializers/account/account.py:295 ops/models/celery.py:84
#: accounts/serializers/account/account.py:296 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:297
#: accounts/serializers/account/account.py:298
msgid "Changed"
msgstr "編集済み"
#: accounts/serializers/account/account.py:307 acls/models/base.py:97
#: acls/templates/acls/asset_login_reminder.html:10
#: assets/models/automations/base.py:25
#: 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: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:101
msgid "Assets"
msgstr "資産"
#: accounts/serializers/account/account.py:412
#: accounts/serializers/account/account.py:410
#, python-format
msgid "Asset does not support this secret type: %s"
msgstr "アセットはアカウント タイプをサポートしていません: %s"
#: accounts/serializers/account/account.py:444
#: accounts/serializers/account/account.py:443
msgid "Account has exist"
msgstr "アカウントはすでに存在しています"
#: accounts/serializers/account/account.py:476
#: accounts/serializers/account/account.py:483
#: accounts/serializers/account/account.py:468
#: accounts/serializers/account/account.py:469
msgid "At least one asset or node must be specified"
msgstr "少なくとも1つのアセットまたはードを選択します。"
#: accounts/serializers/account/account.py:482
#: accounts/serializers/account/account.py:489
#: accounts/serializers/account/base.py:73
#: accounts/serializers/account/base.py:88
#: assets/serializers/asset/common.py:425
msgid "Spec info"
msgstr "特別情報"
#: accounts/serializers/account/account.py:493
#: accounts/serializers/account/account.py:499
#: authentication/serializers/connect_token_secret.py:173
#: authentication/templates/authentication/_access_key_modal.html:30
#: perms/models/perm_node.py:21 users/serializers/group.py:33
#: perms/models/perm_node.py:21 settings/models.py:245
#: users/serializers/group.py:33
msgid "ID"
msgstr "ID"
#: accounts/serializers/account/account.py:503 acls/notifications.py:18
#: accounts/serializers/account/account.py:509 acls/notifications.py:18
#: acls/notifications.py:68 acls/serializers/base.py:104
#: acls/templates/acls/asset_login_reminder.html:8
#: acls/templates/acls/user_login_reminder.html:8
@ -1327,7 +1325,7 @@ msgstr "ID"
msgid "User"
msgstr "ユーザー"
#: accounts/serializers/account/account.py:504
#: accounts/serializers/account/account.py:510
#: authentication/templates/authentication/_access_key_modal.html:33
#: terminal/notifications.py:165 terminal/notifications.py:225
msgid "Date"
@ -1709,7 +1707,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:23 assets/serializers/platform.py:182
#: assets/serializers/domain.py:23 assets/serializers/platform.py:183
#: orgs/serializers.py:13 perms/serializers/permission.py:61
msgid "Assets amount"
msgstr "資産数量"
@ -1741,7 +1739,7 @@ msgstr "成功したアカウント"
#: accounts/templates/accounts/change_secret_report.html:118
#: accounts/templates/accounts/push_account_report.html:77
#: accounts/templates/accounts/push_account_report.html:117
#: audits/handler.py:128
#: audits/handler.py:130
msgid "No"
msgstr "否"
@ -1863,6 +1861,18 @@ msgstr "レビュー担当者"
msgid "Users"
msgstr "ユーザー"
#: acls/models/base.py:97 acls/templates/acls/asset_login_reminder.html:10
#: assets/models/automations/base.py:25
#: assets/serializers/automations/base.py:20 assets/serializers/domain.py:33
#: assets/serializers/platform.py:182 assets/serializers/platform.py:214
#: authentication/api/connection_token.py:464 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:101
msgid "Assets"
msgstr "資産"
#: acls/models/command_acl.py:16 assets/models/cmd_filter.py:60
#: ops/serializers/job.py:92 terminal/const.py:88
#: terminal/models/session/session.py:40 terminal/serializers/command.py:18
@ -2140,11 +2150,11 @@ msgstr "ユーザーが最近ログインしたことをお知らせいたしま
msgid "User details"
msgstr "ユーザー詳細"
#: assets/api/asset/asset.py:154
#: assets/api/asset/asset.py:153
msgid "Cannot create asset directly, you should create a host or other"
msgstr "資産を直接作成することはできません。ホストまたはその他を作成する必要があります"
#: assets/api/asset/asset.py:158
#: assets/api/asset/asset.py:157
msgid "The number of assets exceeds the limit of 5000"
msgstr "資産の数が5000の制限を超えています"
@ -2575,8 +2585,9 @@ msgid "Cloud"
msgstr "クラウド サービス"
#: assets/models/asset/common.py:101 assets/models/platform.py:16
#: settings/serializers/auth/radius.py:18 settings/serializers/auth/sms.py:77
#: settings/serializers/msg.py:31 terminal/serializers/storage.py:133
#: assets/serializers/platform.py:87 settings/serializers/auth/radius.py:18
#: settings/serializers/auth/sms.py:77 settings/serializers/msg.py:31
#: terminal/serializers/storage.py:133
#: xpack/plugins/cloud/serializers/account_attrs.py:88
msgid "Port"
msgstr "ポート"
@ -2614,19 +2625,19 @@ msgstr "資産ハードウェア情報の収集"
msgid "Custom info"
msgstr "カスタム属性"
#: assets/models/asset/common.py:431
#: assets/models/asset/common.py:430
msgid "Can refresh asset hardware info"
msgstr "資産ハードウェア情報を更新できます"
#: assets/models/asset/common.py:432
#: assets/models/asset/common.py:431
msgid "Can test asset connectivity"
msgstr "資産接続をテストできます"
#: assets/models/asset/common.py:433
#: assets/models/asset/common.py:432
msgid "Can match asset"
msgstr "アセットを一致させることができます"
#: assets/models/asset/common.py:434
#: assets/models/asset/common.py:433
msgid "Can change asset nodes"
msgstr "資産ノードを変更できます"
@ -2790,7 +2801,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
#: assets/serializers/platform.py:160
#: authentication/serializers/connect_token_secret.py:136
#: common/serializers/common.py:85 labels/serializers.py:45
#: settings/serializers/msg.py:91 xpack/plugins/cloud/models.py:404
@ -2841,7 +2852,7 @@ msgstr "主要"
msgid "Required"
msgstr "必要"
#: assets/models/platform.py:19 assets/serializers/platform.py:161
#: assets/models/platform.py:19 assets/serializers/platform.py:162
#: terminal/models/component/storage.py:28 users/const.py:42
#: xpack/plugins/cloud/providers/nutanix.py:30
msgid "Default"
@ -2944,11 +2955,11 @@ msgstr "アカウント削除パラメータ"
msgid "Internal"
msgstr "ビルトイン"
#: assets/models/platform.py:102 assets/serializers/platform.py:171
#: assets/models/platform.py:102 assets/serializers/platform.py:172
msgid "Charset"
msgstr "シャーセット"
#: assets/models/platform.py:104 assets/serializers/platform.py:209
#: assets/models/platform.py:104 assets/serializers/platform.py:210
msgid "Gateway enabled"
msgstr "ゾーンゲートウェイを有効化"
@ -2956,15 +2967,15 @@ msgstr "ゾーンゲートウェイを有効化"
msgid "DS enabled"
msgstr "ディレクトリサービスが有効になりました"
#: assets/models/platform.py:107 assets/serializers/platform.py:202
#: assets/models/platform.py:107 assets/serializers/platform.py:203
msgid "Su enabled"
msgstr "アカウントの切り替えを有効にする"
#: assets/models/platform.py:108 assets/serializers/platform.py:177
#: assets/models/platform.py:108 assets/serializers/platform.py:178
msgid "Su method"
msgstr "アカウントの切り替え方法"
#: assets/models/platform.py:109 assets/serializers/platform.py:180
#: assets/models/platform.py:109 assets/serializers/platform.py:181
msgid "Custom fields"
msgstr "カスタムフィールド"
@ -2979,7 +2990,7 @@ msgid ""
"type"
msgstr "プラットフォームタイプがスキップされた資産に合致しない、資産内の一括更新プラットフォーム"
#: assets/serializers/asset/common.py:36 assets/serializers/platform.py:153
#: assets/serializers/asset/common.py:36 assets/serializers/platform.py:154
msgid "Protocols, format is [\"protocol/port\"]"
msgstr "契約書、形式は[\"契約書/ポート\"]"
@ -2999,7 +3010,7 @@ msgid ""
"it"
msgstr "ノードパス、形式は [\"/組織/ノード名\"]、もしノードが存在しない場合、それを作成します"
#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:174
#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:175
#: authentication/serializers/connect_token_secret.py:30
#: authentication/serializers/connect_token_secret.py:77
#: perms/models/asset_permission.py:76 perms/serializers/permission.py:67
@ -3215,39 +3226,39 @@ msgstr "アカウントの削除が有効になりました"
msgid "Port from addr"
msgstr "アドレスからのポート"
#: assets/serializers/platform.py:98
#: assets/serializers/platform.py:99
msgid ""
"This protocol is primary, and it must be set when adding assets. "
"Additionally, there can only be one primary protocol."
msgstr "このプロトコルはプライマリであり、資産を追加するときに設定する必要があります。また、プライマリプロトコルは1つしかありません"
#: assets/serializers/platform.py:103
#: assets/serializers/platform.py:104
msgid "This protocol is required, and it must be set when adding assets."
msgstr "このプロトコルは必須であり、資産を追加するときに設定する必要があります"
#: assets/serializers/platform.py:106
#: assets/serializers/platform.py:107
msgid ""
"This protocol is default, when adding assets, it will be displayed by "
"default."
msgstr "このプロトコルはデフォルトです。資産を追加するときに、デフォルトで表示されます"
#: assets/serializers/platform.py:109
#: assets/serializers/platform.py:110
msgid "This protocol is public, asset will show this protocol to user"
msgstr "このプロトコルは公開されており、資産はこのプロトコルをユーザーに表示します"
#: assets/serializers/platform.py:162
#: assets/serializers/platform.py:163
msgid "Help text"
msgstr "ヘルプ"
#: assets/serializers/platform.py:163
#: assets/serializers/platform.py:164
msgid "Choices"
msgstr "せんたく"
#: assets/serializers/platform.py:175
#: assets/serializers/platform.py:176
msgid "Automation"
msgstr "オートメーション"
#: assets/serializers/platform.py:204
#: assets/serializers/platform.py:205
msgid ""
"Login with account when accessing assets, then automatically switch to "
"another, similar to logging in with a regular account and then switching to "
@ -3256,19 +3267,19 @@ msgstr ""
"資産にアクセスする際にアカウントでログインし、その後自動的に別のアカウントに切り替えます。これは、通常のアカウントでログインした後に root "
"に切り替えるのと似ています"
#: assets/serializers/platform.py:210
#: assets/serializers/platform.py:211
msgid "Assets can be connected using a zone gateway"
msgstr "資産はゾーンゲートウェイを使用して接続できます"
#: assets/serializers/platform.py:212
#: assets/serializers/platform.py:213
msgid "Default zone"
msgstr "デフォルトドメイン"
#: assets/serializers/platform.py:239
#: assets/serializers/platform.py:240
msgid "type is required"
msgstr "タイプ このフィールドは必須です."
#: assets/serializers/platform.py:254
#: assets/serializers/platform.py:255
msgid "Protocols is required"
msgstr "同意が必要です"
@ -3500,7 +3511,7 @@ msgstr "タスク"
msgid "-"
msgstr "-"
#: audits/handler.py:128
#: audits/handler.py:130
msgid "Yes"
msgstr "是"
@ -3779,35 +3790,35 @@ msgstr "この操作には、MFAを検証する必要があります"
msgid "Reusable connection token is not allowed, global setting not enabled"
msgstr "再使用可能な接続トークンの使用は許可されていません。グローバル設定は有効になっていません"
#: authentication/api/connection_token.py:425
#: authentication/api/connection_token.py:426
msgid "Anonymous account is not supported for this asset"
msgstr "匿名アカウントはこのプロパティではサポートされていません"
#: authentication/api/connection_token.py:455
#: authentication/api/connection_token.py:456
msgid "Permission expired"
msgstr "承認の有効期限が切れています"
#: authentication/api/connection_token.py:488
#: authentication/api/connection_token.py:489
msgid "ACL action is reject: {}({})"
msgstr "ACL アクションは拒否です: {}({})"
#: authentication/api/connection_token.py:492
#: authentication/api/connection_token.py:493
msgid "ACL action is review"
msgstr "ACL アクションはレビューです"
#: authentication/api/connection_token.py:502
#: authentication/api/connection_token.py:503
msgid "ACL action is face verify"
msgstr "ACL Action は顔認証です"
#: authentication/api/connection_token.py:507
#: authentication/api/connection_token.py:508
msgid "ACL action not supported for this asset"
msgstr "資産ログインルールは現在の資産をサポートしていません"
#: authentication/api/connection_token.py:514
#: authentication/api/connection_token.py:515
msgid "ACL action is face online"
msgstr "ACL Action は顔オンラインです"
#: authentication/api/connection_token.py:539
#: authentication/api/connection_token.py:540
msgid "No available face feature"
msgstr "利用可能な顔の特徴はありません"
@ -3882,7 +3893,11 @@ msgstr "無効なトークンヘッダー。署名文字列に無効な文字を
msgid "Invalid token or cache refreshed."
msgstr "無効なトークンまたはキャッシュの更新。"
#: authentication/backends/oidc/views.py:175
#: authentication/backends/oauth2/views.py:67
msgid "OAuth2 Error"
msgstr "OAuth2 エラー"
#: authentication/backends/oidc/views.py:137
msgid "OpenID Error"
msgstr "OpenID エラー"
@ -3911,7 +3926,7 @@ msgstr "に追加"
msgid "Credential ID"
msgstr "資格情報ID"
#: authentication/backends/saml2/views.py:282
#: authentication/backends/saml2/views.py:255
msgid "SAML2 Error"
msgstr "SAML2 エラー"
@ -4101,16 +4116,16 @@ msgstr "パスワードが無効です"
msgid "Please wait for %s seconds before retry"
msgstr "%s 秒後に再試行してください"
#: authentication/errors/redirect.py:85 authentication/mixins.py:332
#: authentication/errors/redirect.py:85 authentication/mixins.py:365
#: users/views/profile/reset.py:224
msgid "Your password is too simple, please change it for security"
msgstr "パスワードがシンプルすぎるので、セキュリティのために変更してください"
#: authentication/errors/redirect.py:93 authentication/mixins.py:341
#: authentication/errors/redirect.py:93 authentication/mixins.py:374
msgid "You should to change your password before login"
msgstr "ログインする前にパスワードを変更する必要があります"
#: authentication/errors/redirect.py:101 authentication/mixins.py:350
#: authentication/errors/redirect.py:101 authentication/mixins.py:383
msgid "Your password has expired, please reset before logging in"
msgstr "パスワードの有効期限が切れました。ログインする前にリセットしてください。"
@ -4227,21 +4242,27 @@ msgstr "無効にする電話番号をクリアする"
msgid "Authentication failed (before login check failed): {}"
msgstr "認証に失敗しました (ログインチェックが失敗する前): {}"
#: authentication/mixins.py:84
#: authentication/mixins.py:105
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 "管理者は「既存のユーザーのみログインを許可」をオンにしており、現在のユーザーはユーザーリストにありません。管理者に連絡してください。"
#: authentication/mixins.py:117
msgid "User is invalid"
msgstr "無効なユーザーです"
#: authentication/mixins.py:99
#: authentication/mixins.py:132
msgid ""
"The administrator has enabled 'Only allow login from user source'. \n"
" The current user source is {}. Please contact the administrator."
msgstr "管理者は「ユーザーソースからのみログインを許可」をオンにしており、現在のユーザーソースは {} です。管理者に連絡してください。"
#: authentication/mixins.py:278
#: authentication/mixins.py:311
msgid "The MFA type ({}) is not enabled"
msgstr "MFAタイプ ({}) が有効になっていない"
#: authentication/mixins.py:320
#: authentication/mixins.py:353
msgid "Please change your password"
msgstr "パスワードを変更してください"
@ -4725,22 +4746,22 @@ msgstr "再試行しますか?"
msgid "LAN"
msgstr "ローカルエリアネットワーク"
#: authentication/views/base.py:71
#: authentication/views/base.py:70
#: perms/templates/perms/_msg_permed_items_expire.html:18
msgid "If you have any question, please contact the administrator"
msgstr "質問があったら、管理者に連絡して下さい"
#: authentication/views/base.py:144
#: authentication/views/base.py:143
#, python-format
msgid "%s query user failed"
msgstr "%sユーザーのクエリに失敗しました"
#: authentication/views/base.py:152
#: authentication/views/base.py:151
#, python-format
msgid "The %s is already bound to another user"
msgstr "%sが別のユーザーにバインドされています。"
#: authentication/views/base.py:159
#: authentication/views/base.py:158
#, python-format
msgid "Binding %s successfully"
msgstr "バインド%s成功"
@ -4879,7 +4900,7 @@ msgstr "企業の微信からユーザーを取得できませんでした"
msgid "Please login with a password and then bind the WeCom"
msgstr "パスワードでログインしてからWeComをバインドしてください"
#: common/api/action.py:68
#: common/api/action.py:80
msgid "Request file format may be wrong"
msgstr "リクエストファイルの形式が間違っている可能性があります"
@ -5396,7 +5417,7 @@ msgstr ""
msgid "App Labels"
msgstr "ラベル"
#: labels/models.py:15 settings/serializers/security.py:211
#: labels/models.py:15
msgid "Color"
msgstr "色"
@ -5454,16 +5475,16 @@ msgid ""
" work orders, and other notifications"
msgstr "システムの警告やチケットなどを送信するためには、このタスクを実行します"
#: ops/ansible/inventory.py:135 ops/ansible/inventory.py:205
#: ops/ansible/inventory.py:136 ops/ansible/inventory.py:206
#: ops/models/job.py:69
msgid "No account available"
msgstr "利用可能なアカウントがありません"
#: ops/ansible/inventory.py:326 ops/ansible/inventory.py:368
#: ops/ansible/inventory.py:327 ops/ansible/inventory.py:369
msgid "Ansible disabled"
msgstr "Ansible 無効"
#: ops/ansible/inventory.py:384
#: ops/ansible/inventory.py:385
msgid "Skip hosts below:"
msgstr "次のホストをスキップします: "
@ -5479,34 +5500,38 @@ msgstr "タスクは存在しません"
msgid "Task {} args or kwargs error"
msgstr "タスク実行パラメータエラー"
#: ops/api/job.py:70
#: ops/api/job.py:65
msgid "Login to asset {}({}) is rejected by login asset ACL ({})"
msgstr ""
#: ops/api/job.py:88
#, 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:71
#: ops/api/job.py:89
#, python-brace-format
msgid "Asset ({asset}) authorization is missing SSH, SFTP, or WinRM protocol"
msgstr "資産({asset})の認証にはSSH、SFTP、またはWinRMプロトコルが不足しています"
#: ops/api/job.py:72
#: ops/api/job.py:90
#, python-brace-format
msgid "Asset ({asset}) authorization lacks upload permissions"
msgstr "資産({asset})の認証にはアップロード権限が不足しています"
#: ops/api/job.py:160
#: ops/api/job.py:185
msgid "Duplicate file exists"
msgstr "重複したファイルが存在する"
#: ops/api/job.py:165
#: ops/api/job.py:190
#, python-brace-format
msgid ""
"File size exceeds maximum limit. Please select a file smaller than {limit}MB"
msgstr "ファイルサイズが最大制限を超えています。{limit}MB より小さいファイルを選択してください。"
#: ops/api/job.py:238
#: ops/api/job.py:273
msgid ""
"The task is being created and cannot be interrupted. Please try again later."
msgstr "タスクを作成中で、中断できません。後でもう一度お試しください。"
@ -5811,7 +5836,7 @@ msgstr "Material"
msgid "Material Type"
msgstr "Material を選択してオプションを設定します。"
#: ops/models/job.py:561
#: ops/models/job.py:581
msgid "Job Execution"
msgstr "ジョブ実行"
@ -7356,40 +7381,40 @@ msgid "Period clean"
msgstr "定時清掃"
#: settings/serializers/cleaning.py:15
msgid "Login log retention days (day)"
msgstr "ログインログは日数を保持します(天)"
msgid "Login log retention days"
msgstr "ログインログ保持日数"
#: settings/serializers/cleaning.py:19
msgid "Task log retention days (day)"
msgstr "タスクログは日数を保持します(天)"
msgid "Task log retention days"
msgstr "タスクログ保持日数"
#: settings/serializers/cleaning.py:23
msgid "Operate log retention days (day)"
msgstr "ログ管理日を操作する(天)"
msgid "Operate log retention days"
msgstr "アクションログ保持日数"
#: settings/serializers/cleaning.py:27
msgid "password change log keep days (day)"
msgstr "パスワード変更ログ(天)"
msgid "Password change log retention days"
msgstr "ユーザー変更パスワードログ保持日数"
#: settings/serializers/cleaning.py:31
msgid "FTP log retention days (day)"
msgstr "タスクログは日数を保持します(天)"
msgid "FTP log retention days"
msgstr "アップロードダウンロード記録保持日数"
#: settings/serializers/cleaning.py:35
msgid "Cloud sync task history retention days (day)"
msgstr "タスクログは日数を保持します(天)"
msgid "Cloud sync task history retention days"
msgstr "クラウド同期記録保持日数"
#: settings/serializers/cleaning.py:39
msgid "job execution retention days (day)"
msgstr "ジョブセンターの実行履歴 (天) "
msgid "job execution retention days"
msgstr "作業実行履歴保持日数"
#: settings/serializers/cleaning.py:43
msgid "Activity log retention days (day)"
msgstr "活動ログは日数を保持します(天)"
msgid "Activity log retention days"
msgstr "活動記録保持日数"
#: settings/serializers/cleaning.py:46
msgid "Session log retention days (day)"
msgstr "ログインログは日数を保持します(天)"
msgid "Session log retention days"
msgstr "セッションログ保持日数"
#: settings/serializers/cleaning.py:48
msgid ""
@ -7399,8 +7424,8 @@ msgstr ""
"この期間を超えるセッション、録音、およびコマンド レコードは削除されます (データベースのバックアップに影響し、OSS などには影響しません)"
#: settings/serializers/cleaning.py:53
msgid "Change secret and push record retention days (day)"
msgstr "パスワード変更プッシュ記録保持する日数 (日)"
msgid "Change secret and push record retention days"
msgstr "アカウント変更パスワードプッシュ記録保持日数"
#: settings/serializers/feature.py:23 settings/serializers/msg.py:69
msgid "Subject"
@ -7872,28 +7897,32 @@ msgid "Watermark"
msgstr "透かしの有効化"
#: settings/serializers/security.py:205
msgid "Watermark session content"
msgstr "セッションウォーターマークカスタム内容"
msgid "Session content"
msgstr "セッションウォーターマークカスタム内容"
#: settings/serializers/security.py:208
msgid "Watermark console content"
msgstr "管理ページのウォーターマークカスタム内容"
msgid "Console content"
msgstr "管理ページウォーターマークのカスタム内容"
#: settings/serializers/security.py:211
msgid "Font color"
msgstr "フォントカラー"
#: settings/serializers/security.py:214
msgid "Watermark font size"
msgstr "フォントサイズ"
msgid "Font size"
msgstr "フォントサイズ (px)"
#: settings/serializers/security.py:217
msgid "Watermark height"
msgstr "単一ウォーターマークの高さ"
msgid "Height"
msgstr "高さ (px)"
#: settings/serializers/security.py:220
msgid "Watermark width"
msgstr "単一ウォーターマークの幅"
msgid "Width"
msgstr "幅 (px)"
#: settings/serializers/security.py:223
msgid "Watermark rotate"
msgstr "ウォーターマークの回転角度"
msgid "Rotate"
msgstr "回転 (度)"
#: settings/serializers/security.py:227
msgid "Max idle time (minute)"
@ -8195,15 +8224,15 @@ msgstr "認証に失敗しました (不明): {}"
msgid "Authentication success: {}"
msgstr "認証成功: {}"
#: settings/ws.py:226
#: settings/ws.py:228
msgid "No LDAP user was found"
msgstr "LDAPユーザーが取得されませんでした"
#: settings/ws.py:235
#: settings/ws.py:237
msgid "Total {}, success {}, failure {}"
msgstr "合計 {},成功 {},失敗 {}"
#: settings/ws.py:239
#: settings/ws.py:241
msgid ", disabled {}"
msgstr "無効 {}"
@ -11300,6 +11329,10 @@ msgstr "華東-宿遷"
msgid "Port \"%(port)s\" of instance IP \"%(ip)s\" is not reachable"
msgstr "インスタンスIP \"%(ip)s\" のポート \"%(port)s\" は接続できません"
#: xpack/plugins/cloud/providers/scp.py:108
msgid "Empty"
msgstr "空 "
#: xpack/plugins/cloud/serializers/account.py:104
msgid "Validity display"
msgstr "有効表示"
@ -11471,3 +11504,18 @@ msgstr "ライセンスのインポートに成功"
#: xpack/plugins/license/api.py:53
msgid "Invalid license"
msgstr "ライセンスが無効です"
#~ msgid "Watermark console content"
#~ msgstr "管理ページのウォーターマークカスタム内容"
#~ msgid "Watermark font size"
#~ msgstr "フォントサイズ"
#~ msgid "Watermark height"
#~ msgstr "単一ウォーターマークの高さ"
#~ msgid "Watermark width"
#~ msgstr "単一ウォーターマークの幅"
#~ msgid "Watermark rotate"
#~ msgstr "ウォーターマークの回転角度"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-16 14:10+0800\n"
"POT-Creation-Date: 2025-11-17 17:53+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -18,14 +18,18 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: accounts/api/account/account.py:141
#: accounts/api/account/account.py:142
#: accounts/serializers/account/account.py:181
#: accounts/serializers/account/account.py:362
msgid "Account already exists"
msgstr "계정이 이미 존재합니다"
#: accounts/api/account/account.py:207
msgid "No valid assets found for account creation."
msgstr "계정 생성을 위한 유효한 자산을 찾을 수 없습니다."
#: accounts/api/account/application.py:77
#: authentication/api/connection_token.py:452
#: authentication/api/connection_token.py:453
msgid "Account not found"
msgstr "계정을 찾을 수 없습니다"
@ -459,7 +463,7 @@ msgstr "Vault 작업이 실패했습니다. 다시 시도하거나 Vault의 계
#: accounts/templates/accounts/push_account_report.html:78
#: accounts/templates/accounts/push_account_report.html:118
#: acls/notifications.py:70 acls/serializers/base.py:111
#: assets/models/asset/common.py:102 assets/models/asset/common.py:428
#: assets/models/asset/common.py:102 assets/models/asset/common.py:427
#: assets/models/cmd_filter.py:36 audits/models.py:59 audits/models.py:336
#: audits/serializers.py:230 authentication/models/connection_token.py:42
#: perms/models/asset_permission.py:69 terminal/backends/command/models.py:17
@ -474,7 +478,7 @@ msgstr "자산"
#: accounts/models/account.py:89 accounts/models/template.py:16
#: accounts/serializers/account/account.py:234
#: accounts/serializers/account/account.py:304
#: accounts/serializers/account/account.py:305
#: accounts/serializers/account/template.py:35
#: authentication/serializers/connect_token_secret.py:51
msgid "Su from"
@ -521,13 +525,14 @@ msgstr "비밀번호 변경 상태"
#: accounts/models/account.py:107
#: accounts/models/automations/check_account.py:64
#: accounts/serializers/account/account.py:295
#: accounts/serializers/account/service.py:13
#: accounts/serializers/automations/change_secret.py:117
#: accounts/serializers/automations/change_secret.py:148
#: acls/serializers/base.py:112
#: acls/templates/acls/asset_login_reminder.html:11
#: assets/serializers/gateway.py:33 audits/models.py:60 audits/models.py:337
#: audits/serializers.py:231 authentication/api/connection_token.py:464
#: audits/serializers.py:231 authentication/api/connection_token.py:465
#: 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:31 terminal/notifications.py:291
@ -581,8 +586,8 @@ msgstr "계정 활동"
#: assets/models/asset/common.py:166 assets/models/cmd_filter.py:21
#: assets/models/label.py:18 assets/models/platform.py:15
#: assets/models/platform.py:94 assets/models/zone.py:19
#: assets/serializers/asset/common.py:174 assets/serializers/platform.py:158
#: assets/serializers/platform.py:283
#: assets/serializers/asset/common.py:174 assets/serializers/platform.py:159
#: assets/serializers/platform.py:284
#: authentication/backends/passkey/models.py:10
#: authentication/models/ssh_key.py:12 authentication/notifications.py:17
#: authentication/notifications.py:56
@ -620,7 +625,7 @@ msgstr "아이콘"
#: accounts/models/application.py:20 accounts/models/base.py:39
#: accounts/models/mixins/vault.py:49
#: accounts/serializers/account/account.py:492
#: accounts/serializers/account/account.py:498
#: accounts/serializers/account/base.py:20
#: authentication/models/temp_token.py:11
#: authentication/templates/authentication/_access_key_modal.html:31
@ -793,7 +798,7 @@ msgid "Status"
msgstr "상태"
#: accounts/models/automations/change_secret.py:51
#: accounts/serializers/account/account.py:296 assets/const/automation.py:9
#: accounts/serializers/account/account.py:297 assets/const/automation.py:9
#: authentication/templates/authentication/passkey.html:177
#: authentication/views/base.py:42 authentication/views/base.py:43
#: authentication/views/base.py:44 common/const/choices.py:67
@ -1017,7 +1022,7 @@ msgid "Verify asset account"
msgstr "계정 검증"
#: accounts/models/base.py:37 accounts/models/base.py:66
#: accounts/serializers/account/account.py:491
#: accounts/serializers/account/account.py:497
#: accounts/serializers/account/base.py:17
#: accounts/serializers/automations/change_secret.py:50
#: authentication/serializers/connect_token_secret.py:42
@ -1194,8 +1199,8 @@ 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:284 perms/serializers/user_permission.py:27
#: assets/serializers/cagegory.py:12 assets/serializers/platform.py:174
#: assets/serializers/platform.py:285 perms/serializers/user_permission.py:27
#: settings/models.py:41 tickets/models/ticket/apply_application.py:13
#: users/models/preference.py:12 xpack/plugins/cloud/models.py:41
#: xpack/plugins/cloud/models.py:327
@ -1207,7 +1212,7 @@ msgstr "카테고리"
#: acls/serializers/command_acl.py:19 assets/models/automations/base.py:27
#: 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
#: assets/serializers/platform.py:161 assets/serializers/platform.py:173
#: audits/serializers.py:76 audits/serializers.py:196
#: authentication/models/connection_token.py:67
#: authentication/serializers/connect_token_secret.py:138
@ -1241,54 +1246,47 @@ msgstr "계정이 이미 존재합니다. 필드: {fields}는 고유해야 합
msgid "Has secret"
msgstr "이미 관리된 비밀번호"
#: accounts/serializers/account/account.py:295 ops/models/celery.py:84
#: accounts/serializers/account/account.py:296 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:297
#: accounts/serializers/account/account.py:298
msgid "Changed"
msgstr "수정됨"
#: accounts/serializers/account/account.py:307 acls/models/base.py:97
#: acls/templates/acls/asset_login_reminder.html:10
#: assets/models/automations/base.py:25
#: 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: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:101
msgid "Assets"
msgstr "자산"
#: accounts/serializers/account/account.py:412
#: accounts/serializers/account/account.py:410
#, python-format
msgid "Asset does not support this secret type: %s"
msgstr "자산이 지원하지 않는 계정 유형: %s"
#: accounts/serializers/account/account.py:444
#: accounts/serializers/account/account.py:443
msgid "Account has exist"
msgstr "계정이 이미 존재합니다"
#: accounts/serializers/account/account.py:476
#: accounts/serializers/account/account.py:483
#: accounts/serializers/account/account.py:468
#: accounts/serializers/account/account.py:469
msgid "At least one asset or node must be specified"
msgstr "자산 또는 노드 중 최소 하나 선택"
#: accounts/serializers/account/account.py:482
#: accounts/serializers/account/account.py:489
#: accounts/serializers/account/base.py:73
#: accounts/serializers/account/base.py:88
#: assets/serializers/asset/common.py:425
msgid "Spec info"
msgstr "특별 정보"
#: accounts/serializers/account/account.py:493
#: accounts/serializers/account/account.py:499
#: authentication/serializers/connect_token_secret.py:173
#: authentication/templates/authentication/_access_key_modal.html:30
#: perms/models/perm_node.py:21 users/serializers/group.py:33
#: perms/models/perm_node.py:21 settings/models.py:245
#: users/serializers/group.py:33
msgid "ID"
msgstr "ID"
#: accounts/serializers/account/account.py:503 acls/notifications.py:18
#: accounts/serializers/account/account.py:509 acls/notifications.py:18
#: acls/notifications.py:68 acls/serializers/base.py:104
#: acls/templates/acls/asset_login_reminder.html:8
#: acls/templates/acls/user_login_reminder.html:8
@ -1313,7 +1311,7 @@ msgstr "ID"
msgid "User"
msgstr "사용자"
#: accounts/serializers/account/account.py:504
#: accounts/serializers/account/account.py:510
#: authentication/templates/authentication/_access_key_modal.html:33
#: terminal/notifications.py:165 terminal/notifications.py:225
msgid "Date"
@ -1699,7 +1697,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:23 assets/serializers/platform.py:182
#: assets/serializers/domain.py:23 assets/serializers/platform.py:183
#: orgs/serializers.py:13 perms/serializers/permission.py:61
msgid "Assets amount"
msgstr "자산 수"
@ -1731,7 +1729,7 @@ msgstr "성공한 계정"
#: accounts/templates/accounts/change_secret_report.html:118
#: accounts/templates/accounts/push_account_report.html:77
#: accounts/templates/accounts/push_account_report.html:117
#: audits/handler.py:128
#: audits/handler.py:130
msgid "No"
msgstr "아니요"
@ -1853,6 +1851,18 @@ msgstr "승인자"
msgid "Users"
msgstr "사용자"
#: acls/models/base.py:97 acls/templates/acls/asset_login_reminder.html:10
#: assets/models/automations/base.py:25
#: assets/serializers/automations/base.py:20 assets/serializers/domain.py:33
#: assets/serializers/platform.py:182 assets/serializers/platform.py:214
#: authentication/api/connection_token.py:464 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:101
msgid "Assets"
msgstr "자산"
#: acls/models/command_acl.py:16 assets/models/cmd_filter.py:60
#: ops/serializers/job.py:92 terminal/const.py:88
#: terminal/models/session/session.py:40 terminal/serializers/command.py:18
@ -2130,11 +2140,11 @@ msgstr "최근에 사용자가 로그인했음을 알려드립니다:"
msgid "User details"
msgstr "사용자 세부정보"
#: assets/api/asset/asset.py:154
#: assets/api/asset/asset.py:153
msgid "Cannot create asset directly, you should create a host or other"
msgstr "직접 자산을 생성할 수 없습니다. 호스트나 다른 자산을 생성해야 합니다."
#: assets/api/asset/asset.py:158
#: assets/api/asset/asset.py:157
msgid "The number of assets exceeds the limit of 5000"
msgstr "자산 수가 5000을 초과했습니다."
@ -2567,8 +2577,9 @@ msgid "Cloud"
msgstr "클라우드 서비스"
#: assets/models/asset/common.py:101 assets/models/platform.py:16
#: settings/serializers/auth/radius.py:18 settings/serializers/auth/sms.py:77
#: settings/serializers/msg.py:31 terminal/serializers/storage.py:133
#: assets/serializers/platform.py:87 settings/serializers/auth/radius.py:18
#: settings/serializers/auth/sms.py:77 settings/serializers/msg.py:31
#: terminal/serializers/storage.py:133
#: xpack/plugins/cloud/serializers/account_attrs.py:88
msgid "Port"
msgstr "포트"
@ -2606,19 +2617,19 @@ msgstr "자산 하드웨어 정보 수집"
msgid "Custom info"
msgstr "사용자 정의 속성"
#: assets/models/asset/common.py:431
#: assets/models/asset/common.py:430
msgid "Can refresh asset hardware info"
msgstr "자산 하드웨어 정보를 업데이트할 수 있습니다"
#: assets/models/asset/common.py:432
#: assets/models/asset/common.py:431
msgid "Can test asset connectivity"
msgstr "자산 연결성을 테스트할 수 있습니다."
#: assets/models/asset/common.py:433
#: assets/models/asset/common.py:432
msgid "Can match asset"
msgstr "자산을 매칭할 수 있습니다."
#: assets/models/asset/common.py:434
#: assets/models/asset/common.py:433
msgid "Can change asset nodes"
msgstr "자산 노드를 수정할 수 있습니다."
@ -2782,7 +2793,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
#: assets/serializers/platform.py:160
#: authentication/serializers/connect_token_secret.py:136
#: common/serializers/common.py:85 labels/serializers.py:45
#: settings/serializers/msg.py:91 xpack/plugins/cloud/models.py:404
@ -2833,7 +2844,7 @@ msgstr "주요"
msgid "Required"
msgstr "필수"
#: assets/models/platform.py:19 assets/serializers/platform.py:161
#: assets/models/platform.py:19 assets/serializers/platform.py:162
#: terminal/models/component/storage.py:28 users/const.py:42
#: xpack/plugins/cloud/providers/nutanix.py:30
msgid "Default"
@ -2936,11 +2947,11 @@ msgstr "계정 제거 매개변수"
msgid "Internal"
msgstr "내장"
#: assets/models/platform.py:102 assets/serializers/platform.py:171
#: assets/models/platform.py:102 assets/serializers/platform.py:172
msgid "Charset"
msgstr "인코딩"
#: assets/models/platform.py:104 assets/serializers/platform.py:209
#: assets/models/platform.py:104 assets/serializers/platform.py:210
msgid "Gateway enabled"
msgstr "도메인 게이트웨이 활성화"
@ -2948,15 +2959,15 @@ msgstr "도메인 게이트웨이 활성화"
msgid "DS enabled"
msgstr "디렉토리 서비스 활성화"
#: assets/models/platform.py:107 assets/serializers/platform.py:202
#: assets/models/platform.py:107 assets/serializers/platform.py:203
msgid "Su enabled"
msgstr "계정 전환 활성화"
#: assets/models/platform.py:108 assets/serializers/platform.py:177
#: assets/models/platform.py:108 assets/serializers/platform.py:178
msgid "Su method"
msgstr "계정 전환 방식"
#: assets/models/platform.py:109 assets/serializers/platform.py:180
#: assets/models/platform.py:109 assets/serializers/platform.py:181
msgid "Custom fields"
msgstr "사용자 정의 속성"
@ -2971,7 +2982,7 @@ msgid ""
"type"
msgstr "자산 중 플랫폼을 일괄 업데이트하며, 플랫폼 유형에 맞지 않는 자산은 건너뜁니다"
#: assets/serializers/asset/common.py:36 assets/serializers/platform.py:153
#: assets/serializers/asset/common.py:36 assets/serializers/platform.py:154
msgid "Protocols, format is [\"protocol/port\"]"
msgstr "프로토콜, 형식은 [\"프로토콜/포트\"]"
@ -2991,7 +3002,7 @@ msgid ""
"it"
msgstr "노드 경로, 형식은 [\"/조직/노드명\"], 만약 노드가 존재하지 않으면 생성됩니다"
#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:174
#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:175
#: authentication/serializers/connect_token_secret.py:30
#: authentication/serializers/connect_token_secret.py:77
#: perms/models/asset_permission.py:76 perms/serializers/permission.py:67
@ -3204,39 +3215,39 @@ msgstr "계정 제거 실행"
msgid "Port from addr"
msgstr "포트 출처 주소"
#: assets/serializers/platform.py:98
#: assets/serializers/platform.py:99
msgid ""
"This protocol is primary, and it must be set when adding assets. "
"Additionally, there can only be one primary protocol."
msgstr "이 프로토콜은 주요 프로토콜로, 자산 추가 시 반드시 설정되어야 하며, 단 하나의 주요 프로토콜만 존재할 수 있습니다."
#: assets/serializers/platform.py:103
#: assets/serializers/platform.py:104
msgid "This protocol is required, and it must be set when adding assets."
msgstr "이 프로토콜은 필수항목으로, 자산 추가 시 반드시 설정해야 합니다."
#: assets/serializers/platform.py:106
#: assets/serializers/platform.py:107
msgid ""
"This protocol is default, when adding assets, it will be displayed by "
"default."
msgstr "이 프로토콜은 기본 프로토콜로, 자산 추가 시 자동으로 표시됩니다."
#: assets/serializers/platform.py:109
#: assets/serializers/platform.py:110
msgid "This protocol is public, asset will show this protocol to user"
msgstr "이 프로토콜은 공용으로, 자산이 사용자에게 해당 프로토콜을 표시하며 연결하여 사용할 수 있습니다."
#: assets/serializers/platform.py:162
#: assets/serializers/platform.py:163
msgid "Help text"
msgstr "도움"
#: assets/serializers/platform.py:163
#: assets/serializers/platform.py:164
msgid "Choices"
msgstr "선택"
#: assets/serializers/platform.py:175
#: assets/serializers/platform.py:176
msgid "Automation"
msgstr "자동화"
#: assets/serializers/platform.py:204
#: assets/serializers/platform.py:205
msgid ""
"Login with account when accessing assets, then automatically switch to "
"another, similar to logging in with a regular account and then switching to "
@ -3244,19 +3255,19 @@ msgid ""
msgstr ""
"자산에 접근할 때 계정으로 로그인한 후 자동으로 다른 계정으로 전환합니다. 일반 계정으로 로그인한 후 root로 전환하는 것과 같습니다."
#: assets/serializers/platform.py:210
#: assets/serializers/platform.py:211
msgid "Assets can be connected using a zone gateway"
msgstr "자산은 지역 게이트웨이를 통해 연결할 수 있습니다."
#: assets/serializers/platform.py:212
#: assets/serializers/platform.py:213
msgid "Default zone"
msgstr "기본 도메인"
#: assets/serializers/platform.py:239
#: assets/serializers/platform.py:240
msgid "type is required"
msgstr "유형: 이 필드는 필수입니다."
#: assets/serializers/platform.py:254
#: assets/serializers/platform.py:255
msgid "Protocols is required"
msgstr "프로토콜은 필수입니다."
@ -3491,7 +3502,7 @@ msgstr "업무"
msgid "-"
msgstr "-"
#: audits/handler.py:128
#: audits/handler.py:130
msgid "Yes"
msgstr "입니다"
@ -3769,35 +3780,35 @@ msgstr "이 작업은 귀하의 MFA를 확인해야 하므로, 먼저 활성화
msgid "Reusable connection token is not allowed, global setting not enabled"
msgstr "재사용 가능한 연결 토큰은 허용되지 않으며, 글로벌 설정이 활성화되지 않았습니다."
#: authentication/api/connection_token.py:425
#: authentication/api/connection_token.py:426
msgid "Anonymous account is not supported for this asset"
msgstr "익명 계정은 현재 자산을 지원하지 않습니다."
#: authentication/api/connection_token.py:455
#: authentication/api/connection_token.py:456
msgid "Permission expired"
msgstr "권한이 만료되었습니다."
#: authentication/api/connection_token.py:488
#: authentication/api/connection_token.py:489
msgid "ACL action is reject: {}({})"
msgstr "ACL Action은 거부: {}({})입니다."
#: authentication/api/connection_token.py:492
#: authentication/api/connection_token.py:493
msgid "ACL action is review"
msgstr "ACL Action은 재검토입니다."
#: authentication/api/connection_token.py:502
#: authentication/api/connection_token.py:503
msgid "ACL action is face verify"
msgstr "ACL Action은 얼굴 인식입니다."
#: authentication/api/connection_token.py:507
#: authentication/api/connection_token.py:508
msgid "ACL action not supported for this asset"
msgstr "자산 로그인 규칙은 현재 자산을 지원하지 않습니다."
#: authentication/api/connection_token.py:514
#: authentication/api/connection_token.py:515
msgid "ACL action is face online"
msgstr "ACL Action은 온라인 얼굴 인식입니다."
#: authentication/api/connection_token.py:539
#: authentication/api/connection_token.py:540
msgid "No available face feature"
msgstr "사용 가능한 얼굴 특징이 없습니다."
@ -3879,7 +3890,11 @@ msgstr "유효하지 않은 토큰 헤더입니다. 기호 문자열에는 유
msgid "Invalid token or cache refreshed."
msgstr "새로 고침된 토큰 또는 캐시가 유효하지 않습니다."
#: authentication/backends/oidc/views.py:175
#: authentication/backends/oauth2/views.py:67
msgid "OAuth2 Error"
msgstr "OAuth2 오류"
#: authentication/backends/oidc/views.py:137
msgid "OpenID Error"
msgstr "OpenID 오류"
@ -3908,7 +3923,7 @@ msgstr "추가"
msgid "Credential ID"
msgstr "증명서 ID"
#: authentication/backends/saml2/views.py:282
#: authentication/backends/saml2/views.py:255
msgid "SAML2 Error"
msgstr "SAML2 오류"
@ -4100,16 +4115,16 @@ msgstr "귀하의 비밀번호가 유효하지 않습니다"
msgid "Please wait for %s seconds before retry"
msgstr "%s 초 후에 다시 시도해주세요."
#: authentication/errors/redirect.py:85 authentication/mixins.py:332
#: authentication/errors/redirect.py:85 authentication/mixins.py:365
#: users/views/profile/reset.py:224
msgid "Your password is too simple, please change it for security"
msgstr "비밀번호가 너무 간단합니다. 보안을 위해 수정해주세요."
#: authentication/errors/redirect.py:93 authentication/mixins.py:341
#: authentication/errors/redirect.py:93 authentication/mixins.py:374
msgid "You should to change your password before login"
msgstr "로그인 완료 전에 비밀번호를 먼저 수정해주세요."
#: authentication/errors/redirect.py:101 authentication/mixins.py:350
#: authentication/errors/redirect.py:101 authentication/mixins.py:383
msgid "Your password has expired, please reset before logging in"
msgstr "당신의 비밀번호가 만료되었습니다. 수정 후 로그인해주세요."
@ -4226,21 +4241,27 @@ msgstr "전화번호 삭제로 비활성화"
msgid "Authentication failed (before login check failed): {}"
msgstr "인증 실패 (로그인 전 검사 실패): {}"
#: authentication/mixins.py:84
#: authentication/mixins.py:105
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 "관리자가 '기존 사용자만 로그인 허용'을 활성화했으며, 현재 사용자가 사용자 목록에 없습니다. 관리자에게 연락해 주십시오."
#: authentication/mixins.py:117
msgid "User is invalid"
msgstr "무효한 사용자"
#: authentication/mixins.py:99
#: authentication/mixins.py:132
msgid ""
"The administrator has enabled 'Only allow login from user source'. \n"
" The current user source is {}. Please contact the administrator."
msgstr "관리자가 '사용자 출처에서만 로그인 허용'을 활성화하였습니다. 현재 사용자 출처는 {}이며 관리자를 연락하십시오."
#: authentication/mixins.py:278
#: authentication/mixins.py:311
msgid "The MFA type ({}) is not enabled"
msgstr "해당 MFA ({}) 방식이 활성화되지 않았습니다."
#: authentication/mixins.py:320
#: authentication/mixins.py:353
msgid "Please change your password"
msgstr "비밀번호를 수정하십시오."
@ -4726,22 +4747,22 @@ msgstr "재시도 하시겠습니까?"
msgid "LAN"
msgstr "지역 네트워크"
#: authentication/views/base.py:71
#: authentication/views/base.py:70
#: perms/templates/perms/_msg_permed_items_expire.html:18
msgid "If you have any question, please contact the administrator"
msgstr "질문이나 요구 사항이 있는 경우 시스템 관리자에게 문의해 주세요"
#: authentication/views/base.py:144
#: authentication/views/base.py:143
#, python-format
msgid "%s query user failed"
msgstr "%s 사용자 조회 실패"
#: authentication/views/base.py:152
#: authentication/views/base.py:151
#, python-format
msgid "The %s is already bound to another user"
msgstr "%s 다른 사용자에 이미 바인딩되었습니다."
#: authentication/views/base.py:159
#: authentication/views/base.py:158
#, python-format
msgid "Binding %s successfully"
msgstr "%s 바인딩 성공"
@ -4880,7 +4901,7 @@ msgstr "기업 WeChat에서 사용자 정보를 가져오지 못했습니다."
msgid "Please login with a password and then bind the WeCom"
msgstr "密码로 로그인한 후 기업 WeChat을 연결해 주시기 바랍니다."
#: common/api/action.py:68
#: common/api/action.py:80
msgid "Request file format may be wrong"
msgstr "업로드한 파일 형식이 잘못되었거나 다른 유형의 리소스 파일입니다."
@ -5398,7 +5419,7 @@ msgstr "태그 관리"
msgid "App Labels"
msgstr "색상"
#: labels/models.py:15 settings/serializers/security.py:211
#: labels/models.py:15
msgid "Color"
msgstr "색상"
@ -5456,16 +5477,16 @@ msgid ""
" work orders, and other notifications"
msgstr "시스템의 일부 경고, 작업 지시서 등 사이트 내 메시지를 발송해야 할 때 해당 작업을 실행"
#: ops/ansible/inventory.py:135 ops/ansible/inventory.py:205
#: ops/ansible/inventory.py:136 ops/ansible/inventory.py:206
#: ops/models/job.py:69
msgid "No account available"
msgstr "사용 가능한 계정 없음"
#: ops/ansible/inventory.py:326 ops/ansible/inventory.py:368
#: ops/ansible/inventory.py:327 ops/ansible/inventory.py:369
msgid "Ansible disabled"
msgstr "Ansible이 비활성화되었습니다."
#: ops/ansible/inventory.py:384
#: ops/ansible/inventory.py:385
msgid "Skip hosts below:"
msgstr "다음 호스트를 건너뜁니다:"
@ -5481,34 +5502,38 @@ msgstr "작업 {}가 존재하지 않습니다"
msgid "Task {} args or kwargs error"
msgstr "작업 {}의 실행 매개변수가 잘못되었습니다"
#: ops/api/job.py:70
#: ops/api/job.py:65
msgid "Login to asset {}({}) is rejected by login asset ACL ({})"
msgstr ""
#: ops/api/job.py:88
#, 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:71
#: ops/api/job.py:89
#, python-brace-format
msgid "Asset ({asset}) authorization is missing SSH, SFTP, or WinRM protocol"
msgstr "자산({asset})의 인증에 ssh, sftp 또는 winrm 프로토콜이 부족합니다"
#: ops/api/job.py:72
#: ops/api/job.py:90
#, python-brace-format
msgid "Asset ({asset}) authorization lacks upload permissions"
msgstr "자산({asset})의 인증에 업로드 권한이 부족합니다"
#: ops/api/job.py:160
#: ops/api/job.py:185
msgid "Duplicate file exists"
msgstr "동일한 이름의 파일이 존재합니다"
#: ops/api/job.py:165
#: ops/api/job.py:190
#, python-brace-format
msgid ""
"File size exceeds maximum limit. Please select a file smaller than {limit}MB"
msgstr "파일 크기가 최대 제한을 초과했습니다. {limit}MB보다 작은 파일을 선택해 주세요."
#: ops/api/job.py:238
#: ops/api/job.py:273
msgid ""
"The task is being created and cannot be interrupted. Please try again later."
msgstr "작업을 생성 중입니다. 중단할 수 없으니 잠시 후에 다시 시도해 주세요."
@ -5828,7 +5853,7 @@ msgstr "자재"
msgid "Material Type"
msgstr "자재 유형"
#: ops/models/job.py:561
#: ops/models/job.py:581
msgid "Job Execution"
msgstr "작업 실행"
@ -7398,40 +7423,40 @@ msgid "Period clean"
msgstr "정기 청소"
#: settings/serializers/cleaning.py:15
msgid "Login log retention days (day)"
msgstr "로그인 로그 (일)"
msgid "Login log retention days"
msgstr "로그인 로그 보존 일수"
#: settings/serializers/cleaning.py:19
msgid "Task log retention days (day)"
msgstr "작업 로그 (일)"
msgid "Task log retention days"
msgstr "작업 로그 보존 일수"
#: settings/serializers/cleaning.py:23
msgid "Operate log retention days (day)"
msgstr "액션 로그 (일)"
msgid "Operate log retention days"
msgstr "액션 로그 보존 일수"
#: settings/serializers/cleaning.py:27
msgid "password change log keep days (day)"
msgstr "비밀번호 변경 로그"
msgid "Password change log retention days"
msgstr "사용자 비밀번호 변경 로그 보존 일수"
#: settings/serializers/cleaning.py:31
msgid "FTP log retention days (day)"
msgstr "업로드 및 다운로드 (일)"
msgid "FTP log retention days"
msgstr "업로드 다운로드 기록 보존 일수"
#: settings/serializers/cleaning.py:35
msgid "Cloud sync task history retention days (day)"
msgstr "클라우드 동기화 기록 (일)"
msgid "Cloud sync task history retention days"
msgstr "클라우드 동기화 기록 보존 일수"
#: settings/serializers/cleaning.py:39
msgid "job execution retention days (day)"
msgstr "작업 센터 실행 이력 (일)"
msgid "job execution retention days"
msgstr "작업 실행 이력 보존 일수"
#: settings/serializers/cleaning.py:43
msgid "Activity log retention days (day)"
msgstr "활동 기록 (일)"
msgid "Activity log retention days"
msgstr "활동 기록 보존 일수"
#: settings/serializers/cleaning.py:46
msgid "Session log retention days (day)"
msgstr "세션 로그 (일)"
msgid "Session log retention days"
msgstr "세션 로그 보존 일수"
#: settings/serializers/cleaning.py:48
msgid ""
@ -7441,8 +7466,8 @@ msgstr ""
"세션, 녹화 및 명령 기록은 해당 시간을 초과하면 삭제됩니다 (데이터베이스 저장소에 영향, OSS 등은 영향을 받지 않습니다)"
#: settings/serializers/cleaning.py:53
msgid "Change secret and push record retention days (day)"
msgstr "비밀번호 변경 푸시 기록 보존 일수 (일)"
msgid "Change secret and push record retention days"
msgstr "계정 비밀번호 변경 푸시 기록 보존 일수"
#: settings/serializers/feature.py:23 settings/serializers/msg.py:69
msgid "Subject"
@ -7935,28 +7960,32 @@ msgid "Watermark"
msgstr "워터마크 활성화"
#: settings/serializers/security.py:205
msgid "Watermark session content"
msgid "Session content"
msgstr "세션 워터마크 사용자 정의 내용"
#: settings/serializers/security.py:208
msgid "Watermark console content"
msgid "Console content"
msgstr "관리 페이지 워터마크 사용자 정의 내용"
#: settings/serializers/security.py:211
msgid "Font color"
msgstr "글꼴 색상"
#: settings/serializers/security.py:214
msgid "Watermark font size"
msgstr "글꼴 크기"
msgid "Font size"
msgstr "글꼴 크기 (px)"
#: settings/serializers/security.py:217
msgid "Watermark height"
msgstr "단일 워터마크 높이"
msgid "Height"
msgstr "높이 (px)"
#: settings/serializers/security.py:220
msgid "Watermark width"
msgstr "단일 워터마크 너비"
msgid "Width"
msgstr "너비 (px)"
#: settings/serializers/security.py:223
msgid "Watermark rotate"
msgstr "워터마크 회전 각도"
msgid "Rotate"
msgstr "회전 (도)"
#: settings/serializers/security.py:227
msgid "Max idle time (minute)"
@ -8259,15 +8288,15 @@ msgstr "인증 실패: (알 수 없음): {}"
msgid "Authentication success: {}"
msgstr "인증 성공: {}"
#: settings/ws.py:226
#: settings/ws.py:228
msgid "No LDAP user was found"
msgstr "LDAP 사용자를 획득하지 못함"
#: settings/ws.py:235
#: settings/ws.py:237
msgid "Total {}, success {}, failure {}"
msgstr "총 {}명, 성공 {}명, 실패 {}명"
#: settings/ws.py:239
#: settings/ws.py:241
msgid ", disabled {}"
msgstr "비활성화 {}"
@ -11391,6 +11420,10 @@ msgstr "화동-숙천"
msgid "Port \"%(port)s\" of instance IP \"%(ip)s\" is not reachable"
msgstr "인스턴스 IP %(ip)s의 포트 %(port)s에 접근할 수 없습니다"
#: xpack/plugins/cloud/providers/scp.py:108
msgid "Empty"
msgstr "비어 있음 "
#: xpack/plugins/cloud/serializers/account.py:104
msgid "Validity display"
msgstr "유효성 표시"
@ -11563,25 +11596,3 @@ msgstr "라이센스 가져오기 성공"
#: xpack/plugins/license/api.py:53
msgid "Invalid license"
msgstr "라이센스가 유효하지 않습니다."
#, fuzzy
#~ msgid "Themes"
#~ msgstr "테마"
#, fuzzy
#~ msgid "domain_name"
#~ msgstr "도메인 이름."
#~ msgid "Task execution id"
#~ msgstr "작업 실행 ID"
#~ msgid "Respectful"
#~ 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 "안녕하세요! 다음은 자산 비밀번호 변경 또는 계정 푸시 실패의 상황입니다. 제때 확인하고 처리해 주세요."
#~ msgid "EXCHANGE"
#~ msgstr "EXCHANGE"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-16 14:10+0800\n"
"POT-Creation-Date: 2025-11-17 17:53+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -18,14 +18,18 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: accounts/api/account/account.py:141
#: accounts/api/account/account.py:142
#: accounts/serializers/account/account.py:181
#: accounts/serializers/account/account.py:362
msgid "Account already exists"
msgstr "Conta já existente"
#: accounts/api/account/account.py:207
msgid "No valid assets found for account creation."
msgstr "Não foi encontrado um ativo válido para a criação da conta."
#: accounts/api/account/application.py:77
#: authentication/api/connection_token.py:452
#: authentication/api/connection_token.py:453
msgid "Account not found"
msgstr "Conta não encontrada"
@ -462,7 +466,7 @@ msgstr ""
#: accounts/templates/accounts/push_account_report.html:78
#: accounts/templates/accounts/push_account_report.html:118
#: acls/notifications.py:70 acls/serializers/base.py:111
#: assets/models/asset/common.py:102 assets/models/asset/common.py:428
#: assets/models/asset/common.py:102 assets/models/asset/common.py:427
#: assets/models/cmd_filter.py:36 audits/models.py:59 audits/models.py:336
#: audits/serializers.py:230 authentication/models/connection_token.py:42
#: perms/models/asset_permission.py:69 terminal/backends/command/models.py:17
@ -477,7 +481,7 @@ msgstr "Ativos"
#: accounts/models/account.py:89 accounts/models/template.py:16
#: accounts/serializers/account/account.py:234
#: accounts/serializers/account/account.py:304
#: accounts/serializers/account/account.py:305
#: accounts/serializers/account/template.py:35
#: authentication/serializers/connect_token_secret.py:51
msgid "Su from"
@ -524,13 +528,14 @@ msgstr "Status da Alteração de Senha"
#: accounts/models/account.py:107
#: accounts/models/automations/check_account.py:64
#: accounts/serializers/account/account.py:295
#: accounts/serializers/account/service.py:13
#: accounts/serializers/automations/change_secret.py:117
#: accounts/serializers/automations/change_secret.py:148
#: acls/serializers/base.py:112
#: acls/templates/acls/asset_login_reminder.html:11
#: assets/serializers/gateway.py:33 audits/models.py:60 audits/models.py:337
#: audits/serializers.py:231 authentication/api/connection_token.py:464
#: audits/serializers.py:231 authentication/api/connection_token.py:465
#: 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:31 terminal/notifications.py:291
@ -584,8 +589,8 @@ msgstr "Atividade da conta"
#: assets/models/asset/common.py:166 assets/models/cmd_filter.py:21
#: assets/models/label.py:18 assets/models/platform.py:15
#: assets/models/platform.py:94 assets/models/zone.py:19
#: assets/serializers/asset/common.py:174 assets/serializers/platform.py:158
#: assets/serializers/platform.py:283
#: assets/serializers/asset/common.py:174 assets/serializers/platform.py:159
#: assets/serializers/platform.py:284
#: authentication/backends/passkey/models.py:10
#: authentication/models/ssh_key.py:12 authentication/notifications.py:17
#: authentication/notifications.py:56
@ -623,7 +628,7 @@ msgstr "Ícone"
#: accounts/models/application.py:20 accounts/models/base.py:39
#: accounts/models/mixins/vault.py:49
#: accounts/serializers/account/account.py:492
#: accounts/serializers/account/account.py:498
#: accounts/serializers/account/base.py:20
#: authentication/models/temp_token.py:11
#: authentication/templates/authentication/_access_key_modal.html:31
@ -796,7 +801,7 @@ msgid "Status"
msgstr "Status"
#: accounts/models/automations/change_secret.py:51
#: accounts/serializers/account/account.py:296 assets/const/automation.py:9
#: accounts/serializers/account/account.py:297 assets/const/automation.py:9
#: authentication/templates/authentication/passkey.html:177
#: authentication/views/base.py:42 authentication/views/base.py:43
#: authentication/views/base.py:44 common/const/choices.py:67
@ -1040,7 +1045,7 @@ msgid "Verify asset account"
msgstr "Conta verificada"
#: accounts/models/base.py:37 accounts/models/base.py:66
#: accounts/serializers/account/account.py:491
#: accounts/serializers/account/account.py:497
#: accounts/serializers/account/base.py:17
#: accounts/serializers/automations/change_secret.py:50
#: authentication/serializers/connect_token_secret.py:42
@ -1227,8 +1232,8 @@ 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:284 perms/serializers/user_permission.py:27
#: assets/serializers/cagegory.py:12 assets/serializers/platform.py:174
#: assets/serializers/platform.py:285 perms/serializers/user_permission.py:27
#: settings/models.py:41 tickets/models/ticket/apply_application.py:13
#: users/models/preference.py:12 xpack/plugins/cloud/models.py:41
#: xpack/plugins/cloud/models.py:327
@ -1240,7 +1245,7 @@ msgstr "Categoria"
#: acls/serializers/command_acl.py:19 assets/models/automations/base.py:27
#: 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
#: assets/serializers/platform.py:161 assets/serializers/platform.py:173
#: audits/serializers.py:76 audits/serializers.py:196
#: authentication/models/connection_token.py:67
#: authentication/serializers/connect_token_secret.py:138
@ -1274,54 +1279,47 @@ msgstr "Conta já existe. O campo: {fields} deve ser único."
msgid "Has secret"
msgstr "Senha já gerenciada"
#: accounts/serializers/account/account.py:295 ops/models/celery.py:84
#: accounts/serializers/account/account.py:296 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:297
#: accounts/serializers/account/account.py:298
msgid "Changed"
msgstr "Modificado"
#: accounts/serializers/account/account.py:307 acls/models/base.py:97
#: acls/templates/acls/asset_login_reminder.html:10
#: assets/models/automations/base.py:25
#: 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: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:101
msgid "Assets"
msgstr "Bens"
#: accounts/serializers/account/account.py:412
#: accounts/serializers/account/account.py:410
#, 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:444
#: accounts/serializers/account/account.py:443
msgid "Account has exist"
msgstr "Conta já existente"
#: accounts/serializers/account/account.py:476
#: accounts/serializers/account/account.py:483
#: accounts/serializers/account/account.py:468
#: accounts/serializers/account/account.py:469
msgid "At least one asset or node must be specified"
msgstr "Selecione pelo menos um item de ativo ou nó"
#: accounts/serializers/account/account.py:482
#: accounts/serializers/account/account.py:489
#: accounts/serializers/account/base.py:73
#: accounts/serializers/account/base.py:88
#: assets/serializers/asset/common.py:425
msgid "Spec info"
msgstr "Informações especiais"
#: accounts/serializers/account/account.py:493
#: accounts/serializers/account/account.py:499
#: authentication/serializers/connect_token_secret.py:173
#: authentication/templates/authentication/_access_key_modal.html:30
#: perms/models/perm_node.py:21 users/serializers/group.py:33
#: perms/models/perm_node.py:21 settings/models.py:245
#: users/serializers/group.py:33
msgid "ID"
msgstr "ID"
#: accounts/serializers/account/account.py:503 acls/notifications.py:18
#: accounts/serializers/account/account.py:509 acls/notifications.py:18
#: acls/notifications.py:68 acls/serializers/base.py:104
#: acls/templates/acls/asset_login_reminder.html:8
#: acls/templates/acls/user_login_reminder.html:8
@ -1346,7 +1344,7 @@ msgstr "ID"
msgid "User"
msgstr "Usuário"
#: accounts/serializers/account/account.py:504
#: accounts/serializers/account/account.py:510
#: authentication/templates/authentication/_access_key_modal.html:33
#: terminal/notifications.py:165 terminal/notifications.py:225
msgid "Date"
@ -1769,7 +1767,7 @@ msgstr "Número de tipos"
#: 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:23 assets/serializers/platform.py:182
#: assets/serializers/domain.py:23 assets/serializers/platform.py:183
#: orgs/serializers.py:13 perms/serializers/permission.py:61
msgid "Assets amount"
msgstr "Número de ativos"
@ -1801,7 +1799,7 @@ msgstr "Contas bem-sucedidas"
#: accounts/templates/accounts/change_secret_report.html:118
#: accounts/templates/accounts/push_account_report.html:77
#: accounts/templates/accounts/push_account_report.html:117
#: audits/handler.py:128
#: audits/handler.py:130
msgid "No"
msgstr "Não"
@ -1926,6 +1924,18 @@ msgstr "Aprovador"
msgid "Users"
msgstr "Usuário"
#: acls/models/base.py:97 acls/templates/acls/asset_login_reminder.html:10
#: assets/models/automations/base.py:25
#: assets/serializers/automations/base.py:20 assets/serializers/domain.py:33
#: assets/serializers/platform.py:182 assets/serializers/platform.py:214
#: authentication/api/connection_token.py:464 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:101
msgid "Assets"
msgstr "Bens"
#: acls/models/command_acl.py:16 assets/models/cmd_filter.py:60
#: ops/serializers/job.py:92 terminal/const.py:88
#: terminal/models/session/session.py:40 terminal/serializers/command.py:18
@ -2207,13 +2217,13 @@ msgstr "Queremos informá-lo de que recentemente houve logins de usuários:"
msgid "User details"
msgstr "Detalhes do usuário"
#: assets/api/asset/asset.py:154
#: 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:158
#: 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"
@ -2660,8 +2670,9 @@ msgid "Cloud"
msgstr "Serviço na nuvem"
#: assets/models/asset/common.py:101 assets/models/platform.py:16
#: settings/serializers/auth/radius.py:18 settings/serializers/auth/sms.py:77
#: settings/serializers/msg.py:31 terminal/serializers/storage.py:133
#: assets/serializers/platform.py:87 settings/serializers/auth/radius.py:18
#: settings/serializers/auth/sms.py:77 settings/serializers/msg.py:31
#: terminal/serializers/storage.py:133
#: xpack/plugins/cloud/serializers/account_attrs.py:88
msgid "Port"
msgstr "Porta"
@ -2699,19 +2710,19 @@ msgstr "Coletar informações do hardware do ativo"
msgid "Custom info"
msgstr "Propriedades personalizadas"
#: assets/models/asset/common.py:431
#: assets/models/asset/common.py:430
msgid "Can refresh asset hardware info"
msgstr "Pode atualizar as informações do hardware do ativo"
#: assets/models/asset/common.py:432
#: assets/models/asset/common.py:431
msgid "Can test asset connectivity"
msgstr "Pode testar a conectividade do ativo"
#: assets/models/asset/common.py:433
#: assets/models/asset/common.py:432
msgid "Can match asset"
msgstr "Pode correspondências de ativos"
#: assets/models/asset/common.py:434
#: assets/models/asset/common.py:433
msgid "Can change asset nodes"
msgstr "Pode modificar o nó do ativo"
@ -2875,7 +2886,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
#: assets/serializers/platform.py:160
#: authentication/serializers/connect_token_secret.py:136
#: common/serializers/common.py:85 labels/serializers.py:45
#: settings/serializers/msg.py:91 xpack/plugins/cloud/models.py:404
@ -2926,7 +2937,7 @@ msgstr "Principal"
msgid "Required"
msgstr "Obrigatório"
#: assets/models/platform.py:19 assets/serializers/platform.py:161
#: assets/models/platform.py:19 assets/serializers/platform.py:162
#: terminal/models/component/storage.py:28 users/const.py:42
#: xpack/plugins/cloud/providers/nutanix.py:30
msgid "Default"
@ -3029,11 +3040,11 @@ msgstr "Parâmetros de remoção de conta"
msgid "Internal"
msgstr "Incorporado"
#: assets/models/platform.py:102 assets/serializers/platform.py:171
#: assets/models/platform.py:102 assets/serializers/platform.py:172
msgid "Charset"
msgstr "Codificação"
#: assets/models/platform.py:104 assets/serializers/platform.py:209
#: assets/models/platform.py:104 assets/serializers/platform.py:210
msgid "Gateway enabled"
msgstr "Ativar zone gateway"
@ -3041,15 +3052,15 @@ msgstr "Ativar zone gateway"
msgid "DS enabled"
msgstr "Serviço de diretório habilitado"
#: assets/models/platform.py:107 assets/serializers/platform.py:202
#: assets/models/platform.py:107 assets/serializers/platform.py:203
msgid "Su enabled"
msgstr "Habilitar mudança de conta"
#: assets/models/platform.py:108 assets/serializers/platform.py:177
#: assets/models/platform.py:108 assets/serializers/platform.py:178
msgid "Su method"
msgstr "Método de mudança de conta"
#: assets/models/platform.py:109 assets/serializers/platform.py:180
#: assets/models/platform.py:109 assets/serializers/platform.py:181
msgid "Custom fields"
msgstr "Atributos personalizados"
@ -3066,7 +3077,7 @@ msgstr ""
"Atualização em massa na plataforma de ativos, ativos ignorados que não "
"correspondem ao tipo de plataforma"
#: assets/serializers/asset/common.py:36 assets/serializers/platform.py:153
#: assets/serializers/asset/common.py:36 assets/serializers/platform.py:154
msgid "Protocols, format is [\"protocol/port\"]"
msgstr "Protocolo, formato como [\"protocolo/porta\"]"
@ -3090,7 +3101,7 @@ msgstr ""
"Caminho do nó, formatado como [\"/ organização / nome do nó\"], se o nó não "
"existir, ele será criado"
#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:174
#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:175
#: authentication/serializers/connect_token_secret.py:30
#: authentication/serializers/connect_token_secret.py:77
#: perms/models/asset_permission.py:76 perms/serializers/permission.py:67
@ -3309,7 +3320,7 @@ msgstr "Inicializar a remoção de contas"
msgid "Port from addr"
msgstr "Porta de origem do endereço"
#: assets/serializers/platform.py:98
#: assets/serializers/platform.py:99
msgid ""
"This protocol is primary, and it must be set when adding assets. "
"Additionally, there can only be one primary protocol."
@ -3317,36 +3328,36 @@ msgstr ""
"Este acordo é o principal, deve ser definido ao adicionar ativos, e só pode "
"haver um acordo principal"
#: assets/serializers/platform.py:103
#: assets/serializers/platform.py:104
msgid "This protocol is required, and it must be set when adding assets."
msgstr "Este acordo é obrigatório, deve ser definido ao adicionar ativos"
#: assets/serializers/platform.py:106
#: assets/serializers/platform.py:107
msgid ""
"This protocol is default, when adding assets, it will be displayed by "
"default."
msgstr ""
"Este acordo é o padrão, ao adicionar ativos, ele será exibido por padrão"
#: assets/serializers/platform.py:109
#: assets/serializers/platform.py:110
msgid "This protocol is public, asset will show this protocol to user"
msgstr ""
"Este acordo é público, o ativo exibirá este acordo aos usuários e poderá se "
"conectar para uso"
#: assets/serializers/platform.py:162
#: assets/serializers/platform.py:163
msgid "Help text"
msgstr "Ajuda"
#: assets/serializers/platform.py:163
#: assets/serializers/platform.py:164
msgid "Choices"
msgstr "Selecionar"
#: assets/serializers/platform.py:175
#: assets/serializers/platform.py:176
msgid "Automation"
msgstr "Automação"
#: assets/serializers/platform.py:204
#: assets/serializers/platform.py:205
msgid ""
"Login with account when accessing assets, then automatically switch to "
"another, similar to logging in with a regular account and then switching to "
@ -3356,19 +3367,19 @@ msgstr ""
"para outra conta, como se estivesse fazendo login com uma conta normal e "
"mudasse para root"
#: assets/serializers/platform.py:210
#: assets/serializers/platform.py:211
msgid "Assets can be connected using a zone gateway"
msgstr "O ativo pode se conectar através do gateway regional"
#: assets/serializers/platform.py:212
#: assets/serializers/platform.py:213
msgid "Default zone"
msgstr "Domínio padrão"
#: assets/serializers/platform.py:239
#: assets/serializers/platform.py:240
msgid "type is required"
msgstr "Tipo Esse campo é obrigatório."
#: assets/serializers/platform.py:254
#: assets/serializers/platform.py:255
msgid "Protocols is required"
msgstr "O acordo é obrigatório"
@ -3614,7 +3625,7 @@ msgstr "Tarefas"
msgid "-"
msgstr "-"
#: audits/handler.py:128
#: audits/handler.py:130
msgid "Yes"
msgstr "Sim"
@ -3903,35 +3914,35 @@ 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:425
#: authentication/api/connection_token.py:426
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:456
msgid "Permission expired"
msgstr "A autorização expirou"
#: authentication/api/connection_token.py:488
#: authentication/api/connection_token.py:489
msgid "ACL action is reject: {}({})"
msgstr "Ação do ACL é rejeitar: {} ({})."
#: authentication/api/connection_token.py:492
#: authentication/api/connection_token.py:493
msgid "ACL action is review"
msgstr "Ação ACL é para revisão"
#: authentication/api/connection_token.py:502
#: authentication/api/connection_token.py:503
msgid "ACL action is face verify"
msgstr "Ação ACL é verificação facial"
#: authentication/api/connection_token.py:507
#: authentication/api/connection_token.py:508
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:515
msgid "ACL action is face online"
msgstr "Ação ACL é facial online"
#: authentication/api/connection_token.py:539
#: authentication/api/connection_token.py:540
msgid "No available face feature"
msgstr "Não há características faciais disponíveis"
@ -4013,7 +4024,11 @@ msgstr ""
msgid "Invalid token or cache refreshed."
msgstr "O token de atualização ou o cache é inválido."
#: authentication/backends/oidc/views.py:175
#: authentication/backends/oauth2/views.py:67
msgid "OAuth2 Error"
msgstr "Erro OAuth2"
#: authentication/backends/oidc/views.py:137
msgid "OpenID Error"
msgstr "Erro OpenID"
@ -4043,7 +4058,7 @@ msgstr "Adicional"
msgid "Credential ID"
msgstr "ID da credencial"
#: authentication/backends/saml2/views.py:282
#: authentication/backends/saml2/views.py:255
msgid "SAML2 Error"
msgstr "Erro SAML2"
@ -4240,16 +4255,16 @@ msgstr "Sua senha é inválida"
msgid "Please wait for %s seconds before retry"
msgstr "Por favor, tente novamente após %s segundos"
#: authentication/errors/redirect.py:85 authentication/mixins.py:332
#: authentication/errors/redirect.py:85 authentication/mixins.py:365
#: users/views/profile/reset.py:224
msgid "Your password is too simple, please change it for security"
msgstr "Sua senha é muito simples, por segurança, favor alterar"
#: authentication/errors/redirect.py:93 authentication/mixins.py:341
#: authentication/errors/redirect.py:93 authentication/mixins.py:374
msgid "You should to change your password before login"
msgstr "Antes de finalizar o login, favor alterar a senha"
#: authentication/errors/redirect.py:101 authentication/mixins.py:350
#: authentication/errors/redirect.py:101 authentication/mixins.py:383
msgid "Your password has expired, please reset before logging in"
msgstr "Sua senha expirou, modifique antes de fazer login"
@ -4370,11 +4385,20 @@ msgstr "Desativar limpeza de número de telefone"
msgid "Authentication failed (before login check failed): {}"
msgstr "Falha de autenticação (verificação pré-login falhou): {}"
#: authentication/mixins.py:84
#: authentication/mixins.py:105
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 ""
"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, "
"contate o administrador."
#: authentication/mixins.py:117
msgid "User is invalid"
msgstr "Usuário inválido"
#: authentication/mixins.py:99
#: authentication/mixins.py:132
msgid ""
"The administrator has enabled 'Only allow login from user source'. \n"
" The current user source is {}. Please contact the administrator."
@ -4382,11 +4406,11 @@ msgstr ""
"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:278
#: authentication/mixins.py:311
msgid "The MFA type ({}) is not enabled"
msgstr "Este método MFA ({}) não está ativado"
#: authentication/mixins.py:320
#: authentication/mixins.py:353
msgid "Please change your password"
msgstr "Por favor, altere sua senha."
@ -4903,24 +4927,24 @@ msgstr "Deseja tentar novamente?"
msgid "LAN"
msgstr "Rede Local"
#: authentication/views/base.py:71
#: authentication/views/base.py:70
#: perms/templates/perms/_msg_permed_items_expire.html:18
msgid "If you have any question, please contact the administrator"
msgstr ""
"Em caso de dúvidas ou necessidades, por favor, entre em contato com o "
"administrador do sistema"
#: authentication/views/base.py:144
#: authentication/views/base.py:143
#, python-format
msgid "%s query user failed"
msgstr "%s Falha ao consultar o usuário"
#: authentication/views/base.py:152
#: authentication/views/base.py:151
#, python-format
msgid "The %s is already bound to another user"
msgstr "%s já está vinculado a outro usuário"
#: authentication/views/base.py:159
#: authentication/views/base.py:158
#, python-format
msgid "Binding %s successfully"
msgstr "Vinculação com %s bem sucedida"
@ -5063,7 +5087,7 @@ msgstr "Falha ao obter o usuário do WeChat Corporativo"
msgid "Please login with a password and then bind the WeCom"
msgstr "Faça login com a senha, e então vincule ao WeChat Corporativo"
#: common/api/action.py:68
#: common/api/action.py:80
msgid "Request file format may be wrong"
msgstr "Formato de arquivo enviado errado ou outro tipo de recurso do arquivo"
@ -5604,7 +5628,7 @@ msgstr ""
msgid "App Labels"
msgstr "Gerenciar tags"
#: labels/models.py:15 settings/serializers/security.py:211
#: labels/models.py:15
msgid "Color"
msgstr "Cor"
@ -5664,16 +5688,16 @@ msgstr ""
"Algumas alertas do sistema, ordens de serviço e outras necessidades são "
"atendidas por esta tarefa"
#: ops/ansible/inventory.py:135 ops/ansible/inventory.py:205
#: ops/ansible/inventory.py:136 ops/ansible/inventory.py:206
#: ops/models/job.py:69
msgid "No account available"
msgstr "Sem contas disponíveis"
#: ops/ansible/inventory.py:326 ops/ansible/inventory.py:368
#: ops/ansible/inventory.py:327 ops/ansible/inventory.py:369
msgid "Ansible disabled"
msgstr "Ansible desativado"
#: ops/ansible/inventory.py:384
#: ops/ansible/inventory.py:385
msgid "Skip hosts below:"
msgstr "Pulando os seguintes hosts:"
@ -5689,7 +5713,11 @@ msgstr "A tarefa {} não existe"
msgid "Task {} args or kwargs error"
msgstr "Erro nos parâmetros da tarefa {}"
#: ops/api/job.py:70
#: ops/api/job.py:65
msgid "Login to asset {}({}) is rejected by login asset ACL ({})"
msgstr ""
#: ops/api/job.py:88
#, python-brace-format
msgid ""
"Asset ({asset}) must have at least one of the following protocols added: "
@ -5698,21 +5726,21 @@ msgstr ""
"O ativo ({asset}) deve adicionar pelo menos um dos seguintes protocolos: "
"ssh, sftp, winrm"
#: ops/api/job.py:71
#: ops/api/job.py:89
#, 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:72
#: ops/api/job.py:90
#, python-brace-format
msgid "Asset ({asset}) authorization lacks upload permissions"
msgstr "Falta permissão de upload no ativo ({asset})"
#: ops/api/job.py:160
#: ops/api/job.py:185
msgid "Duplicate file exists"
msgstr "Existe um arquivo com o mesmo nome"
#: ops/api/job.py:165
#: ops/api/job.py:190
#, python-brace-format
msgid ""
"File size exceeds maximum limit. Please select a file smaller than {limit}MB"
@ -5720,7 +5748,7 @@ msgstr ""
"O tamanho do arquivo excede o limite máximo. Selecione um arquivo menor que "
"{limit}MB."
#: ops/api/job.py:238
#: ops/api/job.py:273
msgid ""
"The task is being created and cannot be interrupted. Please try again later."
msgstr ""
@ -6028,7 +6056,7 @@ msgstr "Material"
msgid "Material Type"
msgstr "Tipo de Material"
#: ops/models/job.py:561
#: ops/models/job.py:581
msgid "Job Execution"
msgstr "Execução de trabalhos"
@ -7657,40 +7685,40 @@ msgid "Period clean"
msgstr "Limpeza Programada"
#: settings/serializers/cleaning.py:15
msgid "Login log retention days (day)"
msgstr "Logins (dias)"
msgid "Login log retention days"
msgstr "Número de dias para retenção de logs de login"
#: settings/serializers/cleaning.py:19
msgid "Task log retention days (day)"
msgstr "Log de tarefas (dias)"
msgid "Task log retention days"
msgstr "Número de dias para retenção de logs de tarefas"
#: settings/serializers/cleaning.py:23
msgid "Operate log retention days (day)"
msgstr "Registro de Operações (dias)"
msgid "Operate log retention days"
msgstr "Número de dias para retenção de logs de Ação"
#: settings/serializers/cleaning.py:27
msgid "password change log keep days (day)"
msgstr "Registro de Alteração de Senha"
msgid "Password change log retention days"
msgstr "Número de dias para retenção de logs de alteração de senha do usuário"
#: settings/serializers/cleaning.py:31
msgid "FTP log retention days (day)"
msgstr "Upload/Download (dias)"
msgid "FTP log retention days"
msgstr "Número de dias para retenção de registros de upload e download"
#: settings/serializers/cleaning.py:35
msgid "Cloud sync task history retention days (day)"
msgstr "Registros de Sincronização em Nuvem (dias)"
msgid "Cloud sync task history retention days"
msgstr "Número de dias para retenção de registros de sincronização na nuvem"
#: settings/serializers/cleaning.py:39
msgid "job execution retention days (day)"
msgstr "Histórico de Execuções do Centro de Trabalhos (dias)"
msgid "job execution retention days"
msgstr "Número de dias para retenção do histórico de execução de tarefas"
#: settings/serializers/cleaning.py:43
msgid "Activity log retention days (day)"
msgstr "Registros de Atividades (dias)"
msgid "Activity log retention days"
msgstr "Número de dias para retenção de registros de atividades"
#: settings/serializers/cleaning.py:46
msgid "Session log retention days (day)"
msgstr "Registros de Sessão (dias)"
msgid "Session log retention days"
msgstr "Número de dias para retenção de logs de sessão"
#: settings/serializers/cleaning.py:48
msgid ""
@ -7701,8 +7729,10 @@ msgstr ""
" (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)"
msgstr "Registro de Notificações de Alteração de Senha (dias)"
msgid "Change secret and push record retention days"
msgstr ""
"Número de dias para retenção de registros de notificações sobre alteração de"
" senha da conta"
#: settings/serializers/feature.py:23 settings/serializers/msg.py:69
msgid "Subject"
@ -8228,28 +8258,32 @@ msgid "Watermark"
msgstr "Ativar marca d'água"
#: settings/serializers/security.py:205
msgid "Watermark session content"
msgid "Session content"
msgstr "Conteúdo personalizado da marca d'água da sessão"
#: settings/serializers/security.py:208
msgid "Watermark console content"
msgstr "Página de gerenciamento, conteúdo personalizado de marca d'água"
msgid "Console content"
msgstr "Conteúdo personalizado da marca d'água da página"
#: settings/serializers/security.py:211
msgid "Font color"
msgstr "Cor da fonte"
#: settings/serializers/security.py:214
msgid "Watermark font size"
msgstr "Tamanho da fonte"
msgid "Font size"
msgstr "Tamanho da fonte (px)"
#: settings/serializers/security.py:217
msgid "Watermark height"
msgstr "Altura da marca d'água única"
msgid "Height"
msgstr "Altura (px)"
#: settings/serializers/security.py:220
msgid "Watermark width"
msgstr "Largura da marca d'água única"
msgid "Width"
msgstr "Largura (px)"
#: settings/serializers/security.py:223
msgid "Watermark rotate"
msgstr "Ângulo de rotação da marca d'água"
msgid "Rotate"
msgstr "Rotação (graus)"
#: settings/serializers/security.py:227
msgid "Max idle time (minute)"
@ -8581,15 +8615,15 @@ msgstr "Falha na autenticação: (desconhecido): {}"
msgid "Authentication success: {}"
msgstr "Autenticação bem sucedida: {}"
#: settings/ws.py:226
#: settings/ws.py:228
msgid "No LDAP user was found"
msgstr "Não foi possível obter usuário LDAP"
#: settings/ws.py:235
#: settings/ws.py:237
msgid "Total {}, success {}, failure {}"
msgstr "Total de {}, sucesso {}, falha {}"
#: settings/ws.py:239
#: settings/ws.py:241
msgid ", disabled {}"
msgstr ", desativar {}"
@ -11802,6 +11836,10 @@ msgstr " Leste da China - Suqian"
msgid "Port \"%(port)s\" of instance IP \"%(ip)s\" is not reachable"
msgstr "O IP da instância %(ip)s na porta%(port)s não pode ser acessado"
#: xpack/plugins/cloud/providers/scp.py:108
msgid "Empty"
msgstr "Vazio "
#: xpack/plugins/cloud/serializers/account.py:104
msgid "Validity display"
msgstr "Exibição de validade"
@ -11982,27 +12020,3 @@ msgstr "Importação de licença bem-sucedida"
#: xpack/plugins/license/api.py:53
msgid "Invalid license"
msgstr "Licença inválida"
#, fuzzy
#~ msgid "Themes"
#~ msgstr "Tema"
#, fuzzy
#~ msgid "domain_name"
#~ msgstr "Nome do domínio"
#~ msgid "Task execution id"
#~ msgstr "ID de execução da tarefa"
#~ msgid "Respectful"
#~ msgstr "Prezado(a)"
#~ 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."
#~ msgid "EXCHANGE"
#~ msgstr "EXCHANGE"

View File

@ -3,8 +3,8 @@ msgid ""
msgstr ""
"Project-Id-Version: jumpserver\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-16 14:10+0800\n"
"PO-Revision-Date: 2025-09-26 11:16\n"
"POT-Creation-Date: 2025-11-17 18:20+0800\n"
"PO-Revision-Date: 2025-11-13 12:26\n"
"Last-Translator: ibuler <ibuler@qq.com>\n"
"Language-Team: Russian\n"
"Language: ru_RU\n"
@ -19,14 +19,18 @@ msgstr ""
"X-Crowdin-Project-ID: 832018\n"
"X-Generator: Poedit 2.4.3\n"
#: accounts/api/account/account.py:141
#: accounts/api/account/account.py:142
#: accounts/serializers/account/account.py:181
#: accounts/serializers/account/account.py:362
msgid "Account already exists"
msgstr "Учетная запись уже существует"
msgstr "Учетная запись уже существует."
#: accounts/api/account/account.py:207
msgid "No valid assets found for account creation."
msgstr "Не удалось найти действительные активы для создания учетной записи."
#: accounts/api/account/application.py:77
#: authentication/api/connection_token.py:452
#: authentication/api/connection_token.py:453
msgid "Account not found"
msgstr "Учетная запись не найдена"
@ -464,7 +468,7 @@ msgstr ""
#: accounts/templates/accounts/push_account_report.html:78
#: accounts/templates/accounts/push_account_report.html:118
#: acls/notifications.py:70 acls/serializers/base.py:111
#: assets/models/asset/common.py:102 assets/models/asset/common.py:428
#: assets/models/asset/common.py:102 assets/models/asset/common.py:427
#: assets/models/cmd_filter.py:36 audits/models.py:59 audits/models.py:336
#: audits/serializers.py:230 authentication/models/connection_token.py:42
#: perms/models/asset_permission.py:69 terminal/backends/command/models.py:17
@ -479,7 +483,7 @@ msgstr "Актив"
#: accounts/models/account.py:89 accounts/models/template.py:16
#: accounts/serializers/account/account.py:234
#: accounts/serializers/account/account.py:304
#: accounts/serializers/account/account.py:305
#: accounts/serializers/account/template.py:35
#: authentication/serializers/connect_token_secret.py:51
msgid "Su from"
@ -526,13 +530,14 @@ msgstr "Статус изменения секрета"
#: accounts/models/account.py:107
#: accounts/models/automations/check_account.py:64
#: accounts/serializers/account/account.py:295
#: accounts/serializers/account/service.py:13
#: accounts/serializers/automations/change_secret.py:117
#: accounts/serializers/automations/change_secret.py:148
#: acls/serializers/base.py:112
#: acls/templates/acls/asset_login_reminder.html:11
#: assets/serializers/gateway.py:33 audits/models.py:60 audits/models.py:337
#: audits/serializers.py:231 authentication/api/connection_token.py:464
#: audits/serializers.py:231 authentication/api/connection_token.py:465
#: 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:31 terminal/notifications.py:291
@ -586,8 +591,8 @@ msgstr "Просмотр активности аккаунта"
#: assets/models/asset/common.py:166 assets/models/cmd_filter.py:21
#: assets/models/label.py:18 assets/models/platform.py:15
#: assets/models/platform.py:94 assets/models/zone.py:19
#: assets/serializers/asset/common.py:174 assets/serializers/platform.py:158
#: assets/serializers/platform.py:283
#: assets/serializers/asset/common.py:174 assets/serializers/platform.py:159
#: assets/serializers/platform.py:284
#: authentication/backends/passkey/models.py:10
#: authentication/models/ssh_key.py:12 authentication/notifications.py:17
#: authentication/notifications.py:56
@ -625,7 +630,7 @@ msgstr "Иконка"
#: accounts/models/application.py:20 accounts/models/base.py:39
#: accounts/models/mixins/vault.py:49
#: accounts/serializers/account/account.py:492
#: accounts/serializers/account/account.py:498
#: accounts/serializers/account/base.py:20
#: authentication/models/temp_token.py:11
#: authentication/templates/authentication/_access_key_modal.html:31
@ -798,7 +803,7 @@ msgid "Status"
msgstr "Статус"
#: accounts/models/automations/change_secret.py:51
#: accounts/serializers/account/account.py:296 assets/const/automation.py:9
#: accounts/serializers/account/account.py:297 assets/const/automation.py:9
#: authentication/templates/authentication/passkey.html:177
#: authentication/views/base.py:42 authentication/views/base.py:43
#: authentication/views/base.py:44 common/const/choices.py:67
@ -1027,7 +1032,7 @@ msgid "Verify asset account"
msgstr "Проверка УЗ актива"
#: accounts/models/base.py:37 accounts/models/base.py:66
#: accounts/serializers/account/account.py:491
#: accounts/serializers/account/account.py:497
#: accounts/serializers/account/base.py:17
#: accounts/serializers/automations/change_secret.py:50
#: authentication/serializers/connect_token_secret.py:42
@ -1218,8 +1223,8 @@ 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:284 perms/serializers/user_permission.py:27
#: assets/serializers/cagegory.py:12 assets/serializers/platform.py:174
#: assets/serializers/platform.py:285 perms/serializers/user_permission.py:27
#: settings/models.py:41 tickets/models/ticket/apply_application.py:13
#: users/models/preference.py:12 xpack/plugins/cloud/models.py:41
#: xpack/plugins/cloud/models.py:327
@ -1231,7 +1236,7 @@ msgstr "Категория"
#: acls/serializers/command_acl.py:19 assets/models/automations/base.py:27
#: 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
#: assets/serializers/platform.py:161 assets/serializers/platform.py:173
#: audits/serializers.py:76 audits/serializers.py:196
#: authentication/models/connection_token.py:67
#: authentication/serializers/connect_token_secret.py:138
@ -1266,54 +1271,47 @@ msgstr ""
msgid "Has secret"
msgstr "Секрет добавлен"
#: accounts/serializers/account/account.py:295 ops/models/celery.py:84
#: accounts/serializers/account/account.py:296 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:297
#: accounts/serializers/account/account.py:298
msgid "Changed"
msgstr "Изменено"
#: accounts/serializers/account/account.py:307 acls/models/base.py:97
#: acls/templates/acls/asset_login_reminder.html:10
#: assets/models/automations/base.py:25
#: 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: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:101
msgid "Assets"
msgstr "Активы"
#: accounts/serializers/account/account.py:412
#: accounts/serializers/account/account.py:410
#, python-format
msgid "Asset does not support this secret type: %s"
msgstr "Актив не поддерживает этот тип секрета: %s"
#: accounts/serializers/account/account.py:444
#: accounts/serializers/account/account.py:443
msgid "Account has exist"
msgstr "Учетная запись уже существует"
#: accounts/serializers/account/account.py:476
#: accounts/serializers/account/account.py:483
#: accounts/serializers/account/account.py:468
#: accounts/serializers/account/account.py:469
msgid "At least one asset or node must be specified"
msgstr "Выберите хотя бы один актив или папку"
#: accounts/serializers/account/account.py:482
#: accounts/serializers/account/account.py:489
#: accounts/serializers/account/base.py:73
#: accounts/serializers/account/base.py:88
#: assets/serializers/asset/common.py:425
msgid "Spec info"
msgstr "Специальная информация"
#: accounts/serializers/account/account.py:493
#: accounts/serializers/account/account.py:499
#: authentication/serializers/connect_token_secret.py:173
#: authentication/templates/authentication/_access_key_modal.html:30
#: perms/models/perm_node.py:21 users/serializers/group.py:33
#: perms/models/perm_node.py:21 settings/models.py:245
#: users/serializers/group.py:33
msgid "ID"
msgstr "ID"
#: accounts/serializers/account/account.py:503 acls/notifications.py:18
#: accounts/serializers/account/account.py:509 acls/notifications.py:18
#: acls/notifications.py:68 acls/serializers/base.py:104
#: acls/templates/acls/asset_login_reminder.html:8
#: acls/templates/acls/user_login_reminder.html:8
@ -1338,7 +1336,7 @@ msgstr "ID"
msgid "User"
msgstr "Пользователь"
#: accounts/serializers/account/account.py:504
#: accounts/serializers/account/account.py:510
#: authentication/templates/authentication/_access_key_modal.html:33
#: terminal/notifications.py:165 terminal/notifications.py:225
msgid "Date"
@ -1439,8 +1437,9 @@ msgid ""
"Associated platform, you can configure push parameters. If not associated, "
"default parameters will be used"
msgstr ""
"Свяжите платформу для настройки параметров публикации УЗ. Если привязки нет,"
" будут использоваться параметры по умолчанию."
"Укажите платформу, чтобы настроить особые параметры публикации УЗ. Если не "
"настраивать отдельные параметры, публикация УЗ будет выполнена с параметрами"
" по умолчанию"
#: accounts/serializers/account/virtual.py:24
msgid ""
@ -1752,7 +1751,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:23 assets/serializers/platform.py:182
#: assets/serializers/domain.py:23 assets/serializers/platform.py:183
#: orgs/serializers.py:13 perms/serializers/permission.py:61
msgid "Assets amount"
msgstr "Количество активов"
@ -1784,7 +1783,7 @@ msgstr "Успешные УЗ"
#: accounts/templates/accounts/change_secret_report.html:118
#: accounts/templates/accounts/push_account_report.html:77
#: accounts/templates/accounts/push_account_report.html:117
#: audits/handler.py:128
#: audits/handler.py:130
msgid "No"
msgstr "Нет"
@ -1907,6 +1906,18 @@ msgstr "Утверждающий"
msgid "Users"
msgstr "Пользователь"
#: acls/models/base.py:97 acls/templates/acls/asset_login_reminder.html:10
#: assets/models/automations/base.py:25
#: assets/serializers/automations/base.py:20 assets/serializers/domain.py:33
#: assets/serializers/platform.py:182 assets/serializers/platform.py:214
#: authentication/api/connection_token.py:464 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:101
msgid "Assets"
msgstr "Активы"
#: acls/models/command_acl.py:16 assets/models/cmd_filter.py:60
#: ops/serializers/job.py:92 terminal/const.py:88
#: terminal/models/session/session.py:40 terminal/serializers/command.py:18
@ -1966,7 +1977,7 @@ msgstr "Правила метода подключения"
#: acls/models/data_masking.py:13
msgid "Fixed Character Replacement"
msgstr "Фиксированная замена символов"
msgstr "Замена на фиксированные символы"
#: acls/models/data_masking.py:14
msgid "Hide Middle Characters"
@ -1974,19 +1985,19 @@ msgstr "Скрыть средние символы"
#: acls/models/data_masking.py:15
msgid "Keep Prefix Only"
msgstr "Сохранить префикс"
msgstr "Сохранить только префикс"
#: acls/models/data_masking.py:16
msgid "Keep Suffix Only"
msgstr "Сохранить суффикс"
msgstr "Сохранить только суффикс"
#: acls/models/data_masking.py:21
msgid "Fields pattern"
msgstr "Скрыть имя столбца"
msgstr "Маскировать столбцы"
#: acls/models/data_masking.py:27 acls/serializers/data_masking.py:14
msgid "Masking Method"
msgstr "Метод маскировки"
msgstr "Метод маскирования"
#: acls/models/data_masking.py:31
msgid "Mask Pattern"
@ -2188,12 +2199,12 @@ msgstr "Мы хотим сообщить вам, что недавно воше
msgid "User details"
msgstr "Данные пользователя"
#: assets/api/asset/asset.py:154
#: assets/api/asset/asset.py:153
msgid "Cannot create asset directly, you should create a host or other"
msgstr ""
"Невозможно создать актив напрямую, вам следует создать хост или другой тип"
#: assets/api/asset/asset.py:158
#: assets/api/asset/asset.py:157
msgid "The number of assets exceeds the limit of 5000"
msgstr "Количество активов превышает лимит в 5000"
@ -2638,8 +2649,9 @@ msgid "Cloud"
msgstr "Облака"
#: assets/models/asset/common.py:101 assets/models/platform.py:16
#: settings/serializers/auth/radius.py:18 settings/serializers/auth/sms.py:77
#: settings/serializers/msg.py:31 terminal/serializers/storage.py:133
#: assets/serializers/platform.py:87 settings/serializers/auth/radius.py:18
#: settings/serializers/auth/sms.py:77 settings/serializers/msg.py:31
#: terminal/serializers/storage.py:133
#: xpack/plugins/cloud/serializers/account_attrs.py:88
msgid "Port"
msgstr "Порт"
@ -2677,19 +2689,19 @@ msgstr "Собранные данные"
msgid "Custom info"
msgstr "Пользовательские атрибуты"
#: assets/models/asset/common.py:431
#: assets/models/asset/common.py:430
msgid "Can refresh asset hardware info"
msgstr "Обновление информации об оборудовании актива"
#: assets/models/asset/common.py:432
#: assets/models/asset/common.py:431
msgid "Can test asset connectivity"
msgstr "Проверка доступности актива"
#: assets/models/asset/common.py:433
#: assets/models/asset/common.py:432
msgid "Can match asset"
msgstr "Сопоставление актива"
#: assets/models/asset/common.py:434
#: assets/models/asset/common.py:433
msgid "Can change asset nodes"
msgstr "Изменение папки актива"
@ -2855,7 +2867,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
#: assets/serializers/platform.py:160
#: authentication/serializers/connect_token_secret.py:136
#: common/serializers/common.py:85 labels/serializers.py:45
#: settings/serializers/msg.py:91 xpack/plugins/cloud/models.py:404
@ -2906,7 +2918,7 @@ msgstr "Основной"
msgid "Required"
msgstr "Обязательно"
#: assets/models/platform.py:19 assets/serializers/platform.py:161
#: assets/models/platform.py:19 assets/serializers/platform.py:162
#: terminal/models/component/storage.py:28 users/const.py:42
#: xpack/plugins/cloud/providers/nutanix.py:30
msgid "Default"
@ -3009,11 +3021,11 @@ msgstr "Параметры удаления УЗ"
msgid "Internal"
msgstr "Встроенный"
#: assets/models/platform.py:102 assets/serializers/platform.py:171
#: assets/models/platform.py:102 assets/serializers/platform.py:172
msgid "Charset"
msgstr "Кодировка"
#: assets/models/platform.py:104 assets/serializers/platform.py:209
#: assets/models/platform.py:104 assets/serializers/platform.py:210
msgid "Gateway enabled"
msgstr "Шлюз включен"
@ -3021,15 +3033,15 @@ msgstr "Шлюз включен"
msgid "DS enabled"
msgstr "Службы Каталогов включены"
#: assets/models/platform.py:107 assets/serializers/platform.py:202
#: assets/models/platform.py:107 assets/serializers/platform.py:203
msgid "Su enabled"
msgstr "Переключение su включено"
#: assets/models/platform.py:108 assets/serializers/platform.py:177
#: assets/models/platform.py:108 assets/serializers/platform.py:178
msgid "Su method"
msgstr "Способ переключения su"
#: assets/models/platform.py:109 assets/serializers/platform.py:180
#: assets/models/platform.py:109 assets/serializers/platform.py:181
msgid "Custom fields"
msgstr "Настраиваемые поля"
@ -3046,7 +3058,7 @@ msgstr ""
"Пакетное обновление платформы в активах, пропуская активы, которые не "
"соответствуют типу платформы"
#: assets/serializers/asset/common.py:36 assets/serializers/platform.py:153
#: assets/serializers/asset/common.py:36 assets/serializers/platform.py:154
msgid "Protocols, format is [\"protocol/port\"]"
msgstr "Протокол, формат [\"протокол/порт\"]"
@ -3070,7 +3082,7 @@ msgstr ""
"Путь к папке в формате [\"/Организация/Имя папки\"], если папка не "
"существует, она будет создана"
#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:174
#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:175
#: authentication/serializers/connect_token_secret.py:30
#: authentication/serializers/connect_token_secret.py:77
#: perms/models/asset_permission.py:76 perms/serializers/permission.py:67
@ -3292,7 +3304,7 @@ msgstr "Включить удаление учетной записи"
msgid "Port from addr"
msgstr "Порт из адреса"
#: assets/serializers/platform.py:98
#: assets/serializers/platform.py:99
msgid ""
"This protocol is primary, and it must be set when adding assets. "
"Additionally, there can only be one primary protocol."
@ -3300,13 +3312,13 @@ msgstr ""
"Этот протокол является основным, и его необходимо задать при добавлении "
"активов. Основной протокол может быть только один."
#: assets/serializers/platform.py:103
#: assets/serializers/platform.py:104
msgid "This protocol is required, and it must be set when adding assets."
msgstr ""
"Этот протокол является обязательным, и его необходимо настроить при "
"добавлении активов."
#: assets/serializers/platform.py:106
#: assets/serializers/platform.py:107
msgid ""
"This protocol is default, when adding assets, it will be displayed by "
"default."
@ -3314,25 +3326,25 @@ msgstr ""
"Этот протокол установлен по умолчанию, при добавлении активов он будет "
"отображаться по умолчанию."
#: assets/serializers/platform.py:109
#: assets/serializers/platform.py:110
msgid "This protocol is public, asset will show this protocol to user"
msgstr ""
"Этот протокол является общедоступным, активы будут отображать этот протокол "
"пользователям"
#: assets/serializers/platform.py:162
#: assets/serializers/platform.py:163
msgid "Help text"
msgstr "Помощь"
#: assets/serializers/platform.py:163
#: assets/serializers/platform.py:164
msgid "Choices"
msgstr "Выбор"
#: assets/serializers/platform.py:175
#: assets/serializers/platform.py:176
msgid "Automation"
msgstr "Автоматизация"
#: assets/serializers/platform.py:204
#: assets/serializers/platform.py:205
msgid ""
"Login with account when accessing assets, then automatically switch to "
"another, similar to logging in with a regular account and then switching to "
@ -3342,19 +3354,19 @@ msgstr ""
"автоматически переключитесь на другую учетную запись, как если бы вы вошли с"
" обычной учетной записью и затем переключились на root"
#: assets/serializers/platform.py:210
#: assets/serializers/platform.py:211
msgid "Assets can be connected using a zone gateway"
msgstr "Активы могут быть подключены с помощью шлюза зоны"
#: assets/serializers/platform.py:212
#: assets/serializers/platform.py:213
msgid "Default zone"
msgstr "Зона по умолчанию"
#: assets/serializers/platform.py:239
#: assets/serializers/platform.py:240
msgid "type is required"
msgstr "тип обязателен"
#: assets/serializers/platform.py:254
#: assets/serializers/platform.py:255
msgid "Protocols is required"
msgstr "Требуется указание протокола"
@ -3600,7 +3612,7 @@ msgstr "Задача"
msgid "-"
msgstr "-"
#: audits/handler.py:128
#: audits/handler.py:130
msgid "Yes"
msgstr "Да"
@ -3887,35 +3899,35 @@ msgstr ""
"Повторное использование токена не допускается, глобальная настройка не "
"включена"
#: authentication/api/connection_token.py:425
#: authentication/api/connection_token.py:426
msgid "Anonymous account is not supported for this asset"
msgstr "Анонимная учетная запись не поддерживается для этого актива"
#: authentication/api/connection_token.py:455
#: authentication/api/connection_token.py:456
msgid "Permission expired"
msgstr "Разрешение истекло"
#: authentication/api/connection_token.py:488
#: authentication/api/connection_token.py:489
msgid "ACL action is reject: {}({})"
msgstr "Действие правила — запрет: {}({})"
#: authentication/api/connection_token.py:492
#: authentication/api/connection_token.py:493
msgid "ACL action is review"
msgstr "Действие правила — проверка"
#: authentication/api/connection_token.py:502
#: authentication/api/connection_token.py:503
msgid "ACL action is face verify"
msgstr "Действие правила — идентификация по лицу"
#: authentication/api/connection_token.py:507
#: authentication/api/connection_token.py:508
msgid "ACL action not supported for this asset"
msgstr "Правило входа в актив не поддерживает текущий актив"
#: authentication/api/connection_token.py:514
#: authentication/api/connection_token.py:515
msgid "ACL action is face online"
msgstr "Действие правила — онлайн распознавание лица."
#: authentication/api/connection_token.py:539
#: authentication/api/connection_token.py:540
msgid "No available face feature"
msgstr "Нет доступных характеристик лица"
@ -3955,7 +3967,7 @@ msgstr "Забыли пароль"
#: authentication/api/password.py:70 authentication/mfa/email.py:42
msgid "The validity period of the verification code is {} minute"
msgstr "Срок действия кода проверки составляет {} минут."
msgstr "Срок действия кода проверки: {} мин"
#: authentication/apps.py:7
msgid "App Authentication"
@ -3996,7 +4008,11 @@ msgstr ""
msgid "Invalid token or cache refreshed."
msgstr "Обновлённый токен или кэш недействителен."
#: authentication/backends/oidc/views.py:175
#: authentication/backends/oauth2/views.py:67
msgid "OAuth2 Error"
msgstr "Ошибка OAuth2"
#: authentication/backends/oidc/views.py:137
msgid "OpenID Error"
msgstr "Ошибка OpenID"
@ -4027,7 +4043,7 @@ msgstr "Дополнительно"
msgid "Credential ID"
msgstr "ID учетных данных"
#: authentication/backends/saml2/views.py:282
#: authentication/backends/saml2/views.py:255
msgid "SAML2 Error"
msgstr "Ошибка SAML2"
@ -4224,16 +4240,16 @@ msgstr "Ваш пароль недействителен"
msgid "Please wait for %s seconds before retry"
msgstr "Пожалуйста, подождите %s секунд перед повторной попыткой"
#: authentication/errors/redirect.py:85 authentication/mixins.py:332
#: authentication/errors/redirect.py:85 authentication/mixins.py:365
#: users/views/profile/reset.py:224
msgid "Your password is too simple, please change it for security"
msgstr "Ваш пароль слишком простой, измените его в целях безопасности"
#: authentication/errors/redirect.py:93 authentication/mixins.py:341
#: authentication/errors/redirect.py:93 authentication/mixins.py:374
msgid "You should to change your password before login"
msgstr "Вам необходимо сменить пароль перед входом в систему"
#: authentication/errors/redirect.py:101 authentication/mixins.py:350
#: authentication/errors/redirect.py:101 authentication/mixins.py:383
msgid "Your password has expired, please reset before logging in"
msgstr ""
"Срок действия вашего пароля истек, пожалуйста, сбросьте его перед входом в "
@ -4354,11 +4370,20 @@ msgstr "Удалите номер телефона для отключения"
msgid "Authentication failed (before login check failed): {}"
msgstr "Ошибка аутентификации (сбой до проверки входа): {}"
#: authentication/mixins.py:84
#: authentication/mixins.py:105
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 ""
"Администратор включил опцию 'Разрешить вход только для существующих пользователей'.\n"
" Текущий пользователь не найден в списке пользователей,\n"
" пожалуйста, свяжитесь с администратором."
#: authentication/mixins.py:117
msgid "User is invalid"
msgstr "Недействительный пользователь"
#: authentication/mixins.py:99
#: authentication/mixins.py:132
msgid ""
"The administrator has enabled 'Only allow login from user source'. \n"
" The current user source is {}. Please contact the administrator."
@ -4366,11 +4391,11 @@ msgstr ""
"Администратор включил «Разрешить вход только из источника пользователя».\n"
" Текущий источник пользователя — {}. Обратитесь к администратору."
#: authentication/mixins.py:278
#: authentication/mixins.py:311
msgid "The MFA type ({}) is not enabled"
msgstr "Способ МФА ({}) не включен"
#: authentication/mixins.py:320
#: authentication/mixins.py:353
msgid "Please change your password"
msgstr "Пожалуйста, измените свой пароль"
@ -4890,22 +4915,22 @@ msgstr "Хотите попробовать снова?"
msgid "LAN"
msgstr "Локальная сеть"
#: authentication/views/base.py:71
#: authentication/views/base.py:70
#: perms/templates/perms/_msg_permed_items_expire.html:18
msgid "If you have any question, please contact the administrator"
msgstr "Если у вас есть вопросы, пожалуйста, свяжитесь с администратором"
#: authentication/views/base.py:144
#: authentication/views/base.py:143
#, python-format
msgid "%s query user failed"
msgstr "Ошибка при запросе пользователя %s"
#: authentication/views/base.py:152
#: authentication/views/base.py:151
#, python-format
msgid "The %s is already bound to another user"
msgstr "%s уже привязан к другому пользователю"
#: authentication/views/base.py:159
#: authentication/views/base.py:158
#, python-format
msgid "Binding %s successfully"
msgstr "Привязка %s выполнена успешно"
@ -5048,7 +5073,7 @@ msgstr "Не удалось получить пользователя WeCom"
msgid "Please login with a password and then bind the WeCom"
msgstr "Пожалуйста, войдите с паролем, а затем привяжите WeCom"
#: common/api/action.py:68
#: common/api/action.py:80
msgid "Request file format may be wrong"
msgstr "Неверный формат загружаемого файла или файл другого типа ресурсов"
@ -5589,7 +5614,7 @@ msgstr ""
msgid "App Labels"
msgstr "Управление тегами"
#: labels/models.py:15 settings/serializers/security.py:211
#: labels/models.py:15
msgid "Color"
msgstr "Цвет"
@ -5649,16 +5674,16 @@ msgstr ""
"Эта задача выполняется при необходимости отправки внутреннего сообщения\n"
" для системных оповещений, заявок и т.п."
#: ops/ansible/inventory.py:135 ops/ansible/inventory.py:205
#: ops/ansible/inventory.py:136 ops/ansible/inventory.py:206
#: ops/models/job.py:69
msgid "No account available"
msgstr "Нет доступных учетных записей"
#: ops/ansible/inventory.py:326 ops/ansible/inventory.py:368
#: ops/ansible/inventory.py:327 ops/ansible/inventory.py:369
msgid "Ansible disabled"
msgstr "Ansible отключен"
#: ops/ansible/inventory.py:384
#: ops/ansible/inventory.py:385
msgid "Skip hosts below:"
msgstr "Пропустить следующие хосты:"
@ -5674,7 +5699,11 @@ msgstr "Задача {} не найдена"
msgid "Task {} args or kwargs error"
msgstr "Ошибка параметров выполнения задачи {}"
#: ops/api/job.py:70
#: ops/api/job.py:65
msgid "Login to asset {}({}) is rejected by login asset ACL ({})"
msgstr ""
#: ops/api/job.py:88
#, python-brace-format
msgid ""
"Asset ({asset}) must have at least one of the following protocols added: "
@ -5683,22 +5712,22 @@ msgstr ""
"В актив ({asset}) необходимо добавить как минимум один из протоколов: ssh, "
"sftp или winrm"
#: ops/api/job.py:71
#: ops/api/job.py:89
#, python-brace-format
msgid "Asset ({asset}) authorization is missing SSH, SFTP, or WinRM protocol"
msgstr ""
"Авторизация для актива ({asset}) не включает протоколы ssh, sftp или winrm"
#: ops/api/job.py:72
#: ops/api/job.py:90
#, python-brace-format
msgid "Asset ({asset}) authorization lacks upload permissions"
msgstr "Авторизация актива ({asset}) не имеет разрешения на загрузку"
#: ops/api/job.py:160
#: ops/api/job.py:185
msgid "Duplicate file exists"
msgstr "Файл с таким именем существует"
#: ops/api/job.py:165
#: ops/api/job.py:190
#, python-brace-format
msgid ""
"File size exceeds maximum limit. Please select a file smaller than {limit}MB"
@ -5706,7 +5735,7 @@ msgstr ""
"Размер файла превышает максимальный лимит. Пожалуйста, выберите файл меньше "
"{limit}MB"
#: ops/api/job.py:238
#: ops/api/job.py:273
msgid ""
"The task is being created and cannot be interrupted. Please try again later."
msgstr "Создание задачи, не удалось прервать, попробуйте позже."
@ -6011,7 +6040,7 @@ msgstr "Material"
msgid "Material Type"
msgstr "Тип Material"
#: ops/models/job.py:561
#: ops/models/job.py:581
msgid "Job Execution"
msgstr "Выполнение задания"
@ -6779,11 +6808,11 @@ msgstr "Панель смены пароля УЗ"
#: reports/views.py:181
msgid "Failed to send email: "
msgstr "Не удалось отправить письмо"
msgstr "Не удалось отправить письмо "
#: reports/views.py:182
msgid "Email sent successfully to "
msgstr "Успешно отправлено письмо."
msgstr "Письмо успешно отправлено "
#: settings/api/chat.py:41
msgid "Chat AI is not enabled"
@ -7637,40 +7666,40 @@ msgid "Period clean"
msgstr "Периодическая очистка"
#: settings/serializers/cleaning.py:15
msgid "Login log retention days (day)"
msgstr "Журнал входа (дни)"
msgid "Login log retention days"
msgstr "Время хранения журнала входа"
#: settings/serializers/cleaning.py:19
msgid "Task log retention days (day)"
msgstr "Журнал задач (дни)"
msgid "Task log retention days"
msgstr "Время хранения журнала задач"
#: settings/serializers/cleaning.py:23
msgid "Operate log retention days (day)"
msgstr "Журнал операций (дни)"
msgid "Operate log retention days"
msgstr "Время хранения журнала действий"
#: settings/serializers/cleaning.py:27
msgid "password change log keep days (day)"
msgstr "Журнал смены пароля (дни)"
msgid "Password change log retention days"
msgstr "Время хранения журнала изменения пароля пользователя"
#: settings/serializers/cleaning.py:31
msgid "FTP log retention days (day)"
msgstr "Журнал загрузки/скачивания FTP (дни)"
msgid "FTP log retention days"
msgstr "Время хранения записей загрузки и скачивания"
#: settings/serializers/cleaning.py:35
msgid "Cloud sync task history retention days (day)"
msgstr "Журнал синхронизации с облаком (дни)"
msgid "Cloud sync task history retention days"
msgstr "Время хранения записей облачной синхронизации"
#: settings/serializers/cleaning.py:39
msgid "job execution retention days (day)"
msgstr "История выполнения заданий (дни)"
msgid "job execution retention days"
msgstr "Время хранения истории выполнения заданий"
#: settings/serializers/cleaning.py:43
msgid "Activity log retention days (day)"
msgstr "Журнал действий (дни)"
msgid "Activity log retention days"
msgstr "Время хранения журнала активности"
#: settings/serializers/cleaning.py:46
msgid "Session log retention days (day)"
msgstr "Журнал сессий (дни)"
msgid "Session log retention days"
msgstr "Время хранения журнала сессий"
#: settings/serializers/cleaning.py:48
msgid ""
@ -7681,8 +7710,8 @@ msgstr ""
" удалены (влияет на хранение базы данных, но на OSS не влияет)"
#: settings/serializers/cleaning.py:53
msgid "Change secret and push record retention days (day)"
msgstr "Срок хранения записей смены и публикации паролей (дни)"
msgid "Change secret and push record retention days"
msgstr "Время хранения записей об изменении и публикации пароля"
#: settings/serializers/feature.py:23 settings/serializers/msg.py:69
msgid "Subject"
@ -8200,28 +8229,32 @@ msgid "Watermark"
msgstr "Водяной знак"
#: settings/serializers/security.py:205
msgid "Watermark session content"
msgstr "Водяной знак в сессиях"
msgid "Session content"
msgstr "Настраиваемый водяной знак для сессии"
#: settings/serializers/security.py:208
msgid "Watermark console content"
msgstr "Водяной знак в Консоли"
msgid "Console content"
msgstr "Настраиваемый водяной знак для консоли"
#: settings/serializers/security.py:211
msgid "Font color"
msgstr "Цвет шрифта"
#: settings/serializers/security.py:214
msgid "Watermark font size"
msgstr "Размер шрифта водяного знака"
msgid "Font size"
msgstr "Размер шрифта (пиксели)"
#: settings/serializers/security.py:217
msgid "Watermark height"
msgstr "Высота водяного знака"
msgid "Height"
msgstr "Высота (пиксели)"
#: settings/serializers/security.py:220
msgid "Watermark width"
msgstr "Ширина водяного знака"
msgid "Width"
msgstr "Ширина (пиксели)"
#: settings/serializers/security.py:223
msgid "Watermark rotate"
msgstr "Угол поворота водяного знака"
msgid "Rotate"
msgstr "Поворот (градусы)"
#: settings/serializers/security.py:227
msgid "Max idle time (minute)"
@ -8549,15 +8582,15 @@ msgstr "Ошибка аутентификации: (неизвестная): {}"
msgid "Authentication success: {}"
msgstr "Успешная аутентификация: {}"
#: settings/ws.py:226
#: settings/ws.py:228
msgid "No LDAP user was found"
msgstr "Не удалось получить пользователей из LDAP"
#: settings/ws.py:235
#: settings/ws.py:237
msgid "Total {}, success {}, failure {}"
msgstr "Всего {} , успешно {} , неудачно {}"
#: settings/ws.py:239
#: settings/ws.py:241
msgid ", disabled {}"
msgstr ", отключено {}"
@ -11767,6 +11800,12 @@ msgstr "Восточный Китай - Сучжоу"
msgid "Port \"%(port)s\" of instance IP \"%(ip)s\" is not reachable"
msgstr "Порт %(port)s IP-адреса экземпляра %(ip)s недоступен"
#: xpack/plugins/cloud/providers/scp.py:108
#, fuzzy
#| msgid "empty"
msgid "Empty"
msgstr "пусто"
#: xpack/plugins/cloud/serializers/account.py:104
msgid "Validity display"
msgstr "Отображение срока действия"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-16 14:10+0800\n"
"POT-Creation-Date: 2025-11-17 17:53+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -18,14 +18,18 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: accounts/api/account/account.py:141
#: accounts/api/account/account.py:142
#: accounts/serializers/account/account.py:181
#: accounts/serializers/account/account.py:362
msgid "Account already exists"
msgstr "Tài khoản đã tồn tại"
#: accounts/api/account/account.py:207
msgid "No valid assets found for account creation."
msgstr "Không tìm thấy tài sản hợp lệ để tạo tài khoản."
#: accounts/api/account/application.py:77
#: authentication/api/connection_token.py:452
#: authentication/api/connection_token.py:453
msgid "Account not found"
msgstr "Tài khoản không tìm thấy"
@ -463,7 +467,7 @@ msgstr ""
#: accounts/templates/accounts/push_account_report.html:78
#: accounts/templates/accounts/push_account_report.html:118
#: acls/notifications.py:70 acls/serializers/base.py:111
#: assets/models/asset/common.py:102 assets/models/asset/common.py:428
#: assets/models/asset/common.py:102 assets/models/asset/common.py:427
#: assets/models/cmd_filter.py:36 audits/models.py:59 audits/models.py:336
#: audits/serializers.py:230 authentication/models/connection_token.py:42
#: perms/models/asset_permission.py:69 terminal/backends/command/models.py:17
@ -478,7 +482,7 @@ msgstr "Tài sản"
#: accounts/models/account.py:89 accounts/models/template.py:16
#: accounts/serializers/account/account.py:234
#: accounts/serializers/account/account.py:304
#: accounts/serializers/account/account.py:305
#: accounts/serializers/account/template.py:35
#: authentication/serializers/connect_token_secret.py:51
msgid "Su from"
@ -525,13 +529,14 @@ msgstr "Trạng thái đổi mật khẩu"
#: accounts/models/account.py:107
#: accounts/models/automations/check_account.py:64
#: accounts/serializers/account/account.py:295
#: accounts/serializers/account/service.py:13
#: accounts/serializers/automations/change_secret.py:117
#: accounts/serializers/automations/change_secret.py:148
#: acls/serializers/base.py:112
#: acls/templates/acls/asset_login_reminder.html:11
#: assets/serializers/gateway.py:33 audits/models.py:60 audits/models.py:337
#: audits/serializers.py:231 authentication/api/connection_token.py:464
#: audits/serializers.py:231 authentication/api/connection_token.py:465
#: 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:31 terminal/notifications.py:291
@ -585,8 +590,8 @@ msgstr "Hoạt động tài khoản"
#: assets/models/asset/common.py:166 assets/models/cmd_filter.py:21
#: assets/models/label.py:18 assets/models/platform.py:15
#: assets/models/platform.py:94 assets/models/zone.py:19
#: assets/serializers/asset/common.py:174 assets/serializers/platform.py:158
#: assets/serializers/platform.py:283
#: assets/serializers/asset/common.py:174 assets/serializers/platform.py:159
#: assets/serializers/platform.py:284
#: authentication/backends/passkey/models.py:10
#: authentication/models/ssh_key.py:12 authentication/notifications.py:17
#: authentication/notifications.py:56
@ -624,7 +629,7 @@ msgstr "Biểu tượng"
#: accounts/models/application.py:20 accounts/models/base.py:39
#: accounts/models/mixins/vault.py:49
#: accounts/serializers/account/account.py:492
#: accounts/serializers/account/account.py:498
#: accounts/serializers/account/base.py:20
#: authentication/models/temp_token.py:11
#: authentication/templates/authentication/_access_key_modal.html:31
@ -797,7 +802,7 @@ msgid "Status"
msgstr "Trạng thái"
#: accounts/models/automations/change_secret.py:51
#: accounts/serializers/account/account.py:296 assets/const/automation.py:9
#: accounts/serializers/account/account.py:297 assets/const/automation.py:9
#: authentication/templates/authentication/passkey.html:177
#: authentication/views/base.py:42 authentication/views/base.py:43
#: authentication/views/base.py:44 common/const/choices.py:67
@ -1029,7 +1034,7 @@ msgid "Verify asset account"
msgstr "Xác thực tài khoản"
#: accounts/models/base.py:37 accounts/models/base.py:66
#: accounts/serializers/account/account.py:491
#: accounts/serializers/account/account.py:497
#: accounts/serializers/account/base.py:17
#: accounts/serializers/automations/change_secret.py:50
#: authentication/serializers/connect_token_secret.py:42
@ -1227,8 +1232,8 @@ msgstr "Tài khoản đã tồn tại chính sách"
#: 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:284 perms/serializers/user_permission.py:27
#: assets/serializers/cagegory.py:12 assets/serializers/platform.py:174
#: assets/serializers/platform.py:285 perms/serializers/user_permission.py:27
#: settings/models.py:41 tickets/models/ticket/apply_application.py:13
#: users/models/preference.py:12 xpack/plugins/cloud/models.py:41
#: xpack/plugins/cloud/models.py:327
@ -1240,7 +1245,7 @@ msgstr "Thể loại"
#: acls/serializers/command_acl.py:19 assets/models/automations/base.py:27
#: 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
#: assets/serializers/platform.py:161 assets/serializers/platform.py:173
#: audits/serializers.py:76 audits/serializers.py:196
#: authentication/models/connection_token.py:67
#: authentication/serializers/connect_token_secret.py:138
@ -1274,54 +1279,47 @@ msgstr "Tài khoản đã tồn tại. Trường :{fields} phải là duy nhất
msgid "Has secret"
msgstr "Đã quản lý mật khẩu"
#: accounts/serializers/account/account.py:295 ops/models/celery.py:84
#: accounts/serializers/account/account.py:296 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 "Trạng thái"
#: accounts/serializers/account/account.py:297
#: accounts/serializers/account/account.py:298
msgid "Changed"
msgstr "Đã sửa đổi"
#: accounts/serializers/account/account.py:307 acls/models/base.py:97
#: acls/templates/acls/asset_login_reminder.html:10
#: assets/models/automations/base.py:25
#: 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: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:101
msgid "Assets"
msgstr "Tài sản"
#: accounts/serializers/account/account.py:412
#: accounts/serializers/account/account.py:410
#, python-format
msgid "Asset does not support this secret type: %s"
msgstr "Tài sản không hỗ trợ loại tài khoản: %s"
#: accounts/serializers/account/account.py:444
#: accounts/serializers/account/account.py:443
msgid "Account has exist"
msgstr "Tài khoản đã tồn tại"
#: accounts/serializers/account/account.py:476
#: accounts/serializers/account/account.py:483
#: accounts/serializers/account/account.py:468
#: accounts/serializers/account/account.py:469
msgid "At least one asset or node must be specified"
msgstr "Tài khoản yêu cầu"
#: accounts/serializers/account/account.py:482
#: accounts/serializers/account/account.py:489
#: accounts/serializers/account/base.py:73
#: accounts/serializers/account/base.py:88
#: assets/serializers/asset/common.py:425
msgid "Spec info"
msgstr "Thông tin đặc biệt"
#: accounts/serializers/account/account.py:493
#: accounts/serializers/account/account.py:499
#: authentication/serializers/connect_token_secret.py:173
#: authentication/templates/authentication/_access_key_modal.html:30
#: perms/models/perm_node.py:21 users/serializers/group.py:33
#: perms/models/perm_node.py:21 settings/models.py:245
#: users/serializers/group.py:33
msgid "ID"
msgstr "ID"
#: accounts/serializers/account/account.py:503 acls/notifications.py:18
#: accounts/serializers/account/account.py:509 acls/notifications.py:18
#: acls/notifications.py:68 acls/serializers/base.py:104
#: acls/templates/acls/asset_login_reminder.html:8
#: acls/templates/acls/user_login_reminder.html:8
@ -1346,7 +1344,7 @@ msgstr "ID"
msgid "User"
msgstr "Người dùng"
#: accounts/serializers/account/account.py:504
#: accounts/serializers/account/account.py:510
#: authentication/templates/authentication/_access_key_modal.html:33
#: terminal/notifications.py:165 terminal/notifications.py:225
msgid "Date"
@ -1764,7 +1762,7 @@ msgstr "Số loại"
#: 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:23 assets/serializers/platform.py:182
#: assets/serializers/domain.py:23 assets/serializers/platform.py:183
#: orgs/serializers.py:13 perms/serializers/permission.py:61
msgid "Assets amount"
msgstr "Số lượng tài sản"
@ -1796,7 +1794,7 @@ msgstr "Tài khoản thành công"
#: accounts/templates/accounts/change_secret_report.html:118
#: accounts/templates/accounts/push_account_report.html:77
#: accounts/templates/accounts/push_account_report.html:117
#: audits/handler.py:128
#: audits/handler.py:130
msgid "No"
msgstr "Không"
@ -1922,6 +1920,18 @@ msgstr "Người phê duyệt"
msgid "Users"
msgstr "Người dùng"
#: acls/models/base.py:97 acls/templates/acls/asset_login_reminder.html:10
#: assets/models/automations/base.py:25
#: assets/serializers/automations/base.py:20 assets/serializers/domain.py:33
#: assets/serializers/platform.py:182 assets/serializers/platform.py:214
#: authentication/api/connection_token.py:464 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:101
msgid "Assets"
msgstr "Tài sản"
#: acls/models/command_acl.py:16 assets/models/cmd_filter.py:60
#: ops/serializers/job.py:92 terminal/const.py:88
#: terminal/models/session/session.py:40 terminal/serializers/command.py:18
@ -2203,7 +2213,7 @@ msgstr "Chúng tôi xin thông báo rằng, gần đây có người dùng đã
msgid "User details"
msgstr "Thông tin người dùng"
#: assets/api/asset/asset.py:154
#: assets/api/asset/asset.py:153
msgid "Cannot create asset directly, you should create a host or other"
msgstr ""
"Không thể tạo tài sản trực tiếp, bạn nên tạo máy chủ hoặc các tài sản khác. "
@ -2217,7 +2227,7 @@ msgstr ""
"<SEP> >>> Không có nhiệm vụ nào cần thực hiện. <SEP> >>> Bắt đầu thực "
"hiện đợt nhiệm vụ thứ {index}. <SEP> Không có tài khoản."
#: assets/api/asset/asset.py:158
#: assets/api/asset/asset.py:157
msgid "The number of assets exceeds the limit of 5000"
msgstr "Số lượng tài sản vượt quá giới hạn 5000"
@ -2662,8 +2672,9 @@ msgid "Cloud"
msgstr "Dịch vụ đám mây"
#: assets/models/asset/common.py:101 assets/models/platform.py:16
#: settings/serializers/auth/radius.py:18 settings/serializers/auth/sms.py:77
#: settings/serializers/msg.py:31 terminal/serializers/storage.py:133
#: assets/serializers/platform.py:87 settings/serializers/auth/radius.py:18
#: settings/serializers/auth/sms.py:77 settings/serializers/msg.py:31
#: terminal/serializers/storage.py:133
#: xpack/plugins/cloud/serializers/account_attrs.py:88
msgid "Port"
msgstr "Cổng"
@ -2701,19 +2712,19 @@ msgstr "Thu thập thông tin phần cứng tài sản"
msgid "Custom info"
msgstr "Thuộc tính tùy chỉnh"
#: assets/models/asset/common.py:431
#: assets/models/asset/common.py:430
msgid "Can refresh asset hardware info"
msgstr "Có thể cập nhật thông tin phần cứng tài sản"
#: assets/models/asset/common.py:432
#: assets/models/asset/common.py:431
msgid "Can test asset connectivity"
msgstr "Có thể kiểm tra tính kết nối của tài sản"
#: assets/models/asset/common.py:433
#: assets/models/asset/common.py:432
msgid "Can match asset"
msgstr "Có thể khớp tài sản"
#: assets/models/asset/common.py:434
#: assets/models/asset/common.py:433
msgid "Can change asset nodes"
msgstr "Có thể sửa đổi nút tài sản"
@ -2877,7 +2888,7 @@ msgstr "Giá trị"
#: 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
#: assets/serializers/platform.py:160
#: authentication/serializers/connect_token_secret.py:136
#: common/serializers/common.py:85 labels/serializers.py:45
#: settings/serializers/msg.py:91 xpack/plugins/cloud/models.py:404
@ -2928,7 +2939,7 @@ msgstr "Chính"
msgid "Required"
msgstr "Thiết yếu"
#: assets/models/platform.py:19 assets/serializers/platform.py:161
#: assets/models/platform.py:19 assets/serializers/platform.py:162
#: terminal/models/component/storage.py:28 users/const.py:42
#: xpack/plugins/cloud/providers/nutanix.py:30
msgid "Default"
@ -3031,11 +3042,11 @@ msgstr "Tham số xóa bỏ tài khoản"
msgid "Internal"
msgstr "Builtin"
#: assets/models/platform.py:102 assets/serializers/platform.py:171
#: assets/models/platform.py:102 assets/serializers/platform.py:172
msgid "Charset"
msgstr "Mã hóa"
#: assets/models/platform.py:104 assets/serializers/platform.py:209
#: assets/models/platform.py:104 assets/serializers/platform.py:210
msgid "Gateway enabled"
msgstr "Kích hoạt cổng mạng miền"
@ -3043,15 +3054,15 @@ msgstr "Kích hoạt cổng mạng miền"
msgid "DS enabled"
msgstr "Kích hoạt dịch vụ thư mục"
#: assets/models/platform.py:107 assets/serializers/platform.py:202
#: assets/models/platform.py:107 assets/serializers/platform.py:203
msgid "Su enabled"
msgstr "Switch account enabled"
#: assets/models/platform.py:108 assets/serializers/platform.py:177
#: assets/models/platform.py:108 assets/serializers/platform.py:178
msgid "Su method"
msgstr "Switch account method"
#: assets/models/platform.py:109 assets/serializers/platform.py:180
#: assets/models/platform.py:109 assets/serializers/platform.py:181
msgid "Custom fields"
msgstr "Thuộc tính tùy chỉnh"
@ -3068,7 +3079,7 @@ msgstr ""
"Tài sản trong cập nhật hàng loạt nền tảng, bỏ qua tài sản không phù hợp với "
"loại nền tảng"
#: assets/serializers/asset/common.py:36 assets/serializers/platform.py:153
#: assets/serializers/asset/common.py:36 assets/serializers/platform.py:154
msgid "Protocols, format is [\"protocol/port\"]"
msgstr "Giao thức, định dạng là [\"Giao thức/Cổng\"]"
@ -3092,7 +3103,7 @@ msgstr ""
"Đường dẫn nút, định dạng là [\"/Tổ chức/Tên nút\"], nếu nút không tồn tại, "
"sẽ tạo nó"
#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:174
#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:175
#: authentication/serializers/connect_token_secret.py:30
#: authentication/serializers/connect_token_secret.py:77
#: perms/models/asset_permission.py:76 perms/serializers/permission.py:67
@ -3310,7 +3321,7 @@ msgstr "Khởi động xóa tài khoản"
msgid "Port from addr"
msgstr "Cổng đến từ địa chỉ"
#: assets/serializers/platform.py:98
#: assets/serializers/platform.py:99
msgid ""
"This protocol is primary, and it must be set when adding assets. "
"Additionally, there can only be one primary protocol."
@ -3318,7 +3329,7 @@ msgstr ""
"Giao thức này là chính, cần phải thiết lập khi thêm tài sản, và chỉ có thể "
"có một giao thức chính."
#: assets/serializers/platform.py:103
#: assets/serializers/platform.py:104
msgid "This protocol is required, and it must be set when adding assets."
msgstr ""
"Thỏa thuận này là bắt buộc, cần phải thiết lập khi thêm tài sản. Thỏa thuận này là mặc định, sẽ hiển thị tự động khi thêm tài sản. Thỏa thuận này là công khai, tài sản sẽ hiển thị thỏa thuận này cho người dùng và có thể kết nối sử dụng. \n"
@ -3347,13 +3358,13 @@ msgstr ""
"\n"
"Chưa sử dụng."
#: assets/serializers/platform.py:106
#: assets/serializers/platform.py:107
msgid ""
"This protocol is default, when adding assets, it will be displayed by "
"default."
msgstr "Thỏa thuận này là mặc định, khi thêm tài sản, sẽ hiển thị mặc định."
#: assets/serializers/platform.py:109
#: assets/serializers/platform.py:110
msgid "This protocol is public, asset will show this protocol to user"
msgstr ""
"Thỏa thuận này là công khai, tài sản sẽ được hiển thị cho người dùng, và có "
@ -3365,19 +3376,19 @@ msgstr ""
"của tài sản. Thu thập thông tin phần cứng của tài sản. Tài sản thực hiện "
"Action. Chưa sử dụng. Danh sách mã hóa là char. Danh sách mã hóa là text."
#: assets/serializers/platform.py:162
#: assets/serializers/platform.py:163
msgid "Help text"
msgstr "Giúp đỡ"
#: assets/serializers/platform.py:163
#: assets/serializers/platform.py:164
msgid "Choices"
msgstr "Lựa chọn"
#: assets/serializers/platform.py:175
#: assets/serializers/platform.py:176
msgid "Automation"
msgstr "Tự động hóa"
#: assets/serializers/platform.py:204
#: assets/serializers/platform.py:205
msgid ""
"Login with account when accessing assets, then automatically switch to "
"another, similar to logging in with a regular account and then switching to "
@ -3387,19 +3398,19 @@ msgstr ""
" sang một tài khoản khác, giống như việc đăng nhập bằng tài khoản thông "
"thường rồi chuyển sang root"
#: assets/serializers/platform.py:210
#: assets/serializers/platform.py:211
msgid "Assets can be connected using a zone gateway"
msgstr "Tài sản có thể kết nối qua cổng khu vực"
#: assets/serializers/platform.py:212
#: assets/serializers/platform.py:213
msgid "Default zone"
msgstr "Tên miền mặc định"
#: assets/serializers/platform.py:239
#: assets/serializers/platform.py:240
msgid "type is required"
msgstr "Loại: trường này là bắt buộc."
#: assets/serializers/platform.py:254
#: assets/serializers/platform.py:255
msgid "Protocols is required"
msgstr "Giao thức là bắt buộc"
@ -3643,7 +3654,7 @@ msgstr "Nhiệm vụ"
msgid "-"
msgstr "-"
#: audits/handler.py:128
#: audits/handler.py:130
msgid "Yes"
msgstr "Là"
@ -3929,35 +3940,35 @@ msgstr ""
"Không cho phép sử dụng mã thông báo kết nối có thể tái sử dụng, chưa kích "
"hoạt cài đặt toàn cầu"
#: authentication/api/connection_token.py:425
#: authentication/api/connection_token.py:426
msgid "Anonymous account is not supported for this asset"
msgstr "Tài khoản ẩn danh không hỗ trợ tài sản hiện tại"
#: authentication/api/connection_token.py:455
#: authentication/api/connection_token.py:456
msgid "Permission expired"
msgstr "Quyền truy cập đã hết hạn"
#: authentication/api/connection_token.py:488
#: authentication/api/connection_token.py:489
msgid "ACL action is reject: {}({})"
msgstr "Hành động ACL là từ chối: {}({})"
#: authentication/api/connection_token.py:492
#: authentication/api/connection_token.py:493
msgid "ACL action is review"
msgstr "Hành động ACL là xem xét"
#: authentication/api/connection_token.py:502
#: authentication/api/connection_token.py:503
msgid "ACL action is face verify"
msgstr "Hành động ACL là xác thực khuôn mặt"
#: authentication/api/connection_token.py:507
#: authentication/api/connection_token.py:508
msgid "ACL action not supported for this asset"
msgstr "Quy tắc đăng nhập tài sản không hỗ trợ tài sản hiện tại."
#: authentication/api/connection_token.py:514
#: authentication/api/connection_token.py:515
msgid "ACL action is face online"
msgstr "Hành động ACL là nhận diện khuôn mặt trực tuyến"
#: authentication/api/connection_token.py:539
#: authentication/api/connection_token.py:540
msgid "No available face feature"
msgstr "Không có đặc điểm khuôn mặt khả dụng"
@ -4038,7 +4049,11 @@ msgstr ""
msgid "Invalid token or cache refreshed."
msgstr "Token làm mới hoặc bộ nhớ cache không hợp lệ."
#: authentication/backends/oidc/views.py:175
#: authentication/backends/oauth2/views.py:67
msgid "OAuth2 Error"
msgstr "Lỗi OAuth2"
#: authentication/backends/oidc/views.py:137
msgid "OpenID Error"
msgstr "Lỗi OpenID."
@ -4069,7 +4084,7 @@ msgstr "Bổ sung"
msgid "Credential ID"
msgstr "Mã xác thực ID"
#: authentication/backends/saml2/views.py:282
#: authentication/backends/saml2/views.py:255
msgid "SAML2 Error"
msgstr "Lỗi SAML2"
@ -4266,16 +4281,16 @@ msgstr "Mật khẩu của bạn không hợp lệ"
msgid "Please wait for %s seconds before retry"
msgstr "Vui lòng thử lại sau %s giây"
#: authentication/errors/redirect.py:85 authentication/mixins.py:332
#: authentication/errors/redirect.py:85 authentication/mixins.py:365
#: users/views/profile/reset.py:224
msgid "Your password is too simple, please change it for security"
msgstr "Mật khẩu của bạn quá đơn giản, để đảm bảo an toàn, vui lòng thay đổi"
#: authentication/errors/redirect.py:93 authentication/mixins.py:341
#: authentication/errors/redirect.py:93 authentication/mixins.py:374
msgid "You should to change your password before login"
msgstr "Trước khi hoàn tất đăng nhập, vui lòng thay đổi mật khẩu"
#: authentication/errors/redirect.py:101 authentication/mixins.py:350
#: authentication/errors/redirect.py:101 authentication/mixins.py:383
msgid "Your password has expired, please reset before logging in"
msgstr "Mật khẩu của bạn đã hết hạn, hãy thay đổi rồi mới đăng nhập"
@ -4395,11 +4410,20 @@ msgstr "Xóa số điện thoại để vô hiệu hóa."
msgid "Authentication failed (before login check failed): {}"
msgstr "Xác thực không thành công (Kiểm tra trước khi đăng nhập thất bại): {}"
#: authentication/mixins.py:84
#: authentication/mixins.py:105
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 ""
"Quản trị viên đã bật 'chỉ cho phép người dùng đã tồn tại đăng nhập', người "
"dùng hiện tại không có trong danh sách người dùng, xin vui lòng liên hệ với "
"quản trị viên."
#: authentication/mixins.py:117
msgid "User is invalid"
msgstr "Người dùng không hợp lệ"
#: authentication/mixins.py:99
#: authentication/mixins.py:132
msgid ""
"The administrator has enabled 'Only allow login from user source'. \n"
" The current user source is {}. Please contact the administrator."
@ -4407,11 +4431,11 @@ msgstr ""
"Quản trị viên đã bật 'Chỉ cho phép đăng nhập từ nguồn người dùng', nguồn "
"người dùng hiện tại là {}. Vui lòng liên hệ với quản trị viên."
#: authentication/mixins.py:278
#: authentication/mixins.py:311
msgid "The MFA type ({}) is not enabled"
msgstr "Phương thức MFA ({}) này chưa được kích hoạt"
#: authentication/mixins.py:320
#: authentication/mixins.py:353
msgid "Please change your password"
msgstr "Vui lòng thay đổi mật khẩu"
@ -4926,24 +4950,24 @@ msgstr "Có muốn thử lại không?"
msgid "LAN"
msgstr "Mạng nội bộ"
#: authentication/views/base.py:71
#: authentication/views/base.py:70
#: perms/templates/perms/_msg_permed_items_expire.html:18
msgid "If you have any question, please contact the administrator"
msgstr ""
"Nếu có bất kỳ câu hỏi hoặc nhu cầu nào, xin vui lòng liên hệ với quản trị "
"viên hệ thống"
#: authentication/views/base.py:144
#: authentication/views/base.py:143
#, python-format
msgid "%s query user failed"
msgstr "%s truy vấn người dùng không thành công"
#: authentication/views/base.py:152
#: authentication/views/base.py:151
#, python-format
msgid "The %s is already bound to another user"
msgstr "%s đã được liên kết với một người dùng khác"
#: authentication/views/base.py:159
#: authentication/views/base.py:158
#, python-format
msgid "Binding %s successfully"
msgstr "Liên kết %s thành công"
@ -5085,7 +5109,7 @@ msgid "Please login with a password and then bind the WeCom"
msgstr ""
"Vui lòng đăng nhập bằng mật khẩu trước, rồi liên kết WeChat Doanh Nghiệp"
#: common/api/action.py:68
#: common/api/action.py:80
msgid "Request file format may be wrong"
msgstr "Định dạng tệp tải lên sai hoặc tệp thuộc loại tài nguyên khác."
@ -5633,7 +5657,7 @@ msgstr ""
msgid "App Labels"
msgstr "Labels"
#: labels/models.py:15 settings/serializers/security.py:211
#: labels/models.py:15
msgid "Color"
msgstr "Màu sắc"
@ -5693,16 +5717,16 @@ msgstr ""
"Một số cảnh báo của hệ thống, đơn đặt hàng, v.v. cần gửi tin nhắn trong hệ "
"thống sẽ thực hiện nhiệm vụ này"
#: ops/ansible/inventory.py:135 ops/ansible/inventory.py:205
#: ops/ansible/inventory.py:136 ops/ansible/inventory.py:206
#: ops/models/job.py:69
msgid "No account available"
msgstr "Không có tài khoản nào khả dụng"
#: ops/ansible/inventory.py:326 ops/ansible/inventory.py:368
#: ops/ansible/inventory.py:327 ops/ansible/inventory.py:369
msgid "Ansible disabled"
msgstr "Ansible đã bị vô hiệu hóa"
#: ops/ansible/inventory.py:384
#: ops/ansible/inventory.py:385
msgid "Skip hosts below:"
msgstr "Bỏ qua các máy chủ sau:"
@ -5718,7 +5742,11 @@ msgstr "Nhiệm vụ {} không tồn tại"
msgid "Task {} args or kwargs error"
msgstr "Nhiệm vụ {} có tham số thực thi không hợp lệ"
#: ops/api/job.py:70
#: ops/api/job.py:65
msgid "Login to asset {}({}) is rejected by login asset ACL ({})"
msgstr ""
#: ops/api/job.py:88
#, python-brace-format
msgid ""
"Asset ({asset}) must have at least one of the following protocols added: "
@ -5726,21 +5754,21 @@ msgid ""
msgstr ""
"Tài sản ({asset}) ít nhất phải thêm một trong các giao thức ssh, sftp, winrm"
#: ops/api/job.py:71
#: ops/api/job.py:89
#, python-brace-format
msgid "Asset ({asset}) authorization is missing SSH, SFTP, or WinRM protocol"
msgstr "Ủy quyền tài sản ({asset}) thiếu giao thức ssh, sftp hoặc winrm"
#: ops/api/job.py:72
#: ops/api/job.py:90
#, python-brace-format
msgid "Asset ({asset}) authorization lacks upload permissions"
msgstr "Ủy quyền tài sản ({asset}) thiếu quyền tải lên"
#: ops/api/job.py:160
#: ops/api/job.py:185
msgid "Duplicate file exists"
msgstr "Có tệp cùng tên tồn tại"
#: ops/api/job.py:165
#: ops/api/job.py:190
#, python-brace-format
msgid ""
"File size exceeds maximum limit. Please select a file smaller than {limit}MB"
@ -5748,7 +5776,7 @@ msgstr ""
"Kích thước tệp vượt quá giới hạn tối đa. Vui lòng chọn tệp nhỏ hơn "
"{limit}MB."
#: ops/api/job.py:238
#: ops/api/job.py:273
msgid ""
"The task is being created and cannot be interrupted. Please try again later."
msgstr "Đang tạo nhiệm vụ, không thể ngắt quãng, xin vui lòng thử lại sau."
@ -6054,7 +6082,7 @@ msgstr "Vật liệu"
msgid "Material Type"
msgstr "Loại vật liệu"
#: ops/models/job.py:561
#: ops/models/job.py:581
msgid "Job Execution"
msgstr "Thực thi công việc"
@ -7685,40 +7713,40 @@ msgid "Period clean"
msgstr "Dọn dẹp định kỳ"
#: settings/serializers/cleaning.py:15
msgid "Login log retention days (day)"
msgstr "Nhật ký đăng nhập (ngày)"
msgid "Login log retention days"
msgstr "Ngày lưu giữ nhật ký đăng nhập"
#: settings/serializers/cleaning.py:19
msgid "Task log retention days (day)"
msgstr "Nhật ký tác vụ (ngày)"
msgid "Task log retention days"
msgstr "Ngày lưu giữ nhật ký nhiệm vụ"
#: settings/serializers/cleaning.py:23
msgid "Operate log retention days (day)"
msgstr "Nhật ký hành động (ngày)"
msgid "Operate log retention days"
msgstr "Ngày lưu giữ nhật ký hành động"
#: settings/serializers/cleaning.py:27
msgid "password change log keep days (day)"
msgstr "Nhật ký thay đổi mật khẩu"
msgid "Password change log retention days"
msgstr "Ngày lưu giữ nhật ký thay đổi mật khẩu người dùng"
#: settings/serializers/cleaning.py:31
msgid "FTP log retention days (day)"
msgstr "Tải lên và tải xuống (ngày)"
msgid "FTP log retention days"
msgstr "Ngày lưu giữ nhật ký tải lên và tải xuống"
#: settings/serializers/cleaning.py:35
msgid "Cloud sync task history retention days (day)"
msgstr "Hồ sơ đồng bộ đám mây (ngày)"
msgid "Cloud sync task history retention days"
msgstr "Ngày lưu giữ nhật ký đồng bộ đám mây"
#: settings/serializers/cleaning.py:39
msgid "job execution retention days (day)"
msgstr "Lịch sử thực hiện trung tâm công việc (ngày)"
msgid "job execution retention days"
msgstr "Ngày lưu giữ lịch sử thực hiện công việc"
#: settings/serializers/cleaning.py:43
msgid "Activity log retention days (day)"
msgstr "Hồ sơ hoạt động (ngày)"
msgid "Activity log retention days"
msgstr "Ngày lưu giữ nhật ký hoạt động"
#: settings/serializers/cleaning.py:46
msgid "Session log retention days (day)"
msgstr "Nhật ký phiên (ngày)"
msgid "Session log retention days"
msgstr "Ngày lưu giữ nhật ký phiên làm việc"
#: settings/serializers/cleaning.py:48
msgid ""
@ -7729,8 +7757,8 @@ msgstr ""
"tới lưu trữ cơ sở dữ liệu, không ảnh hưởng tới OSS)"
#: settings/serializers/cleaning.py:53
msgid "Change secret and push record retention days (day)"
msgstr "Số ngày lưu giữ nhật ký đẩy thay đổi mật khẩu (ngày)"
msgid "Change secret and push record retention days"
msgstr "Ngày lưu giữ nhật ký thông báo thay đổi mật khẩu tài khoản."
#: settings/serializers/feature.py:23 settings/serializers/msg.py:69
msgid "Subject"
@ -8247,28 +8275,32 @@ msgid "Watermark"
msgstr "Bật hình mờ"
#: settings/serializers/security.py:205
msgid "Watermark session content"
msgstr "Nội dung hình mờ cuộc trò chuyện tùy chỉnh"
msgid "Session content"
msgstr "Nội dung tùy chỉnh cho watermark phiên họp"
#: settings/serializers/security.py:208
msgid "Watermark console content"
msgstr "Nội dung hình mờ trang quản trị tùy chỉnh"
msgid "Console content"
msgstr "Nội dung tùy chỉnh cho watermark trang quản lý"
#: settings/serializers/security.py:211
msgid "Font color"
msgstr "Màu sắc phông chữ"
#: settings/serializers/security.py:214
msgid "Watermark font size"
msgstr "Font chữ và cỡ chữ"
msgid "Font size"
msgstr "Kích thước phông chữ (px)"
#: settings/serializers/security.py:217
msgid "Watermark height"
msgstr "Chiều cao hình mờ đơn lẻ"
msgid "Height"
msgstr "Chiều cao (px)"
#: settings/serializers/security.py:220
msgid "Watermark width"
msgstr "Chiều rộng hình mờ đơn lẻ"
msgid "Width"
msgstr "Chiều rộng (px)"
#: settings/serializers/security.py:223
msgid "Watermark rotate"
msgstr "Góc xoay hình mờ"
msgid "Rotate"
msgstr "Góc xoay (độ)"
#: settings/serializers/security.py:227
msgid "Max idle time (minute)"
@ -8591,15 +8623,15 @@ msgstr "Xác thực thất bại: (không xác định): {}"
msgid "Authentication success: {}"
msgstr "Xác thực thành công: {}"
#: settings/ws.py:226
#: settings/ws.py:228
msgid "No LDAP user was found"
msgstr "Không lấy được người dùng LDAP"
#: settings/ws.py:235
#: settings/ws.py:237
msgid "Total {}, success {}, failure {}"
msgstr "Tổng cộng {} , thành công {} , thất bại {}"
#: settings/ws.py:239
#: settings/ws.py:241
msgid ", disabled {}"
msgstr ", đã vô hiệu hóa {}"
@ -11821,6 +11853,10 @@ msgstr "Hoa Đông - Thụy Kiến"
msgid "Port \"%(port)s\" of instance IP \"%(ip)s\" is not reachable"
msgstr "Cổng %(port)s của IP %(ip)s không thể truy cập"
#: xpack/plugins/cloud/providers/scp.py:108
msgid "Empty"
msgstr "Trống "
#: xpack/plugins/cloud/serializers/account.py:104
msgid "Validity display"
msgstr "Hiển thị tính hợp lệ"
@ -12021,24 +12057,3 @@ msgstr "Nhập giấy phép thành công"
#: xpack/plugins/license/api.py:53
msgid "Invalid license"
msgstr "Giấy phép không hợp lệ"
#, fuzzy
#~ msgid "Themes"
#~ msgstr "Chủ đề"
#, fuzzy
#~ msgid "domain_name"
#~ msgstr "Tên miền"
#~ msgid "Task execution id"
#~ msgstr "ID thực hiện nhiệm vụ"
#~ msgid "Respectful"
#~ msgstr "Kính gửi"
#~ 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 ""
#~ "Chào bạn! Dưới đây là tình huống về việc thay đổi mật khẩu tài sản hoặc thất"
#~ " bại khi đẩy tài khoản. Vui lòng kiểm tra và xử lý kịp thời."

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: JumpServer 0.3.3\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-16 14:10+0800\n"
"POT-Creation-Date: 2025-11-17 17:53+0800\n"
"PO-Revision-Date: 2021-05-20 10:54+0800\n"
"Last-Translator: ibuler <ibuler@qq.com>\n"
"Language-Team: JumpServer team<ibuler@qq.com>\n"
@ -17,14 +17,18 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.4.3\n"
#: accounts/api/account/account.py:141
#: accounts/api/account/account.py:142
#: accounts/serializers/account/account.py:181
#: accounts/serializers/account/account.py:362
msgid "Account already exists"
msgstr "账号已存在"
#: accounts/api/account/account.py:207
msgid "No valid assets found for account creation."
msgstr "未找到可用于创建账户的有效资产。"
#: accounts/api/account/application.py:77
#: authentication/api/connection_token.py:452
#: authentication/api/connection_token.py:453
msgid "Account not found"
msgstr "账号未找到"
@ -458,7 +462,7 @@ msgstr "Vault 操作失败,请重试,或者检查 Vault 上的账号信息
#: accounts/templates/accounts/push_account_report.html:78
#: accounts/templates/accounts/push_account_report.html:118
#: acls/notifications.py:70 acls/serializers/base.py:111
#: assets/models/asset/common.py:102 assets/models/asset/common.py:428
#: assets/models/asset/common.py:102 assets/models/asset/common.py:427
#: assets/models/cmd_filter.py:36 audits/models.py:59 audits/models.py:336
#: audits/serializers.py:230 authentication/models/connection_token.py:42
#: perms/models/asset_permission.py:69 terminal/backends/command/models.py:17
@ -473,7 +477,7 @@ msgstr "资产"
#: accounts/models/account.py:89 accounts/models/template.py:16
#: accounts/serializers/account/account.py:234
#: accounts/serializers/account/account.py:304
#: accounts/serializers/account/account.py:305
#: accounts/serializers/account/template.py:35
#: authentication/serializers/connect_token_secret.py:51
msgid "Su from"
@ -520,13 +524,14 @@ msgstr "改密状态"
#: accounts/models/account.py:107
#: accounts/models/automations/check_account.py:64
#: accounts/serializers/account/account.py:295
#: accounts/serializers/account/service.py:13
#: accounts/serializers/automations/change_secret.py:117
#: accounts/serializers/automations/change_secret.py:148
#: acls/serializers/base.py:112
#: acls/templates/acls/asset_login_reminder.html:11
#: assets/serializers/gateway.py:33 audits/models.py:60 audits/models.py:337
#: audits/serializers.py:231 authentication/api/connection_token.py:464
#: audits/serializers.py:231 authentication/api/connection_token.py:465
#: 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:31 terminal/notifications.py:291
@ -580,8 +585,8 @@ msgstr "账号活动"
#: assets/models/asset/common.py:166 assets/models/cmd_filter.py:21
#: assets/models/label.py:18 assets/models/platform.py:15
#: assets/models/platform.py:94 assets/models/zone.py:19
#: assets/serializers/asset/common.py:174 assets/serializers/platform.py:158
#: assets/serializers/platform.py:283
#: assets/serializers/asset/common.py:174 assets/serializers/platform.py:159
#: assets/serializers/platform.py:284
#: authentication/backends/passkey/models.py:10
#: authentication/models/ssh_key.py:12 authentication/notifications.py:17
#: authentication/notifications.py:56
@ -616,7 +621,7 @@ msgstr "图标"
#: accounts/models/application.py:20 accounts/models/base.py:39
#: accounts/models/mixins/vault.py:49
#: accounts/serializers/account/account.py:492
#: accounts/serializers/account/account.py:498
#: accounts/serializers/account/base.py:20
#: authentication/models/temp_token.py:11
#: authentication/templates/authentication/_access_key_modal.html:31
@ -786,7 +791,7 @@ msgid "Status"
msgstr "状态"
#: accounts/models/automations/change_secret.py:51
#: accounts/serializers/account/account.py:296 assets/const/automation.py:9
#: accounts/serializers/account/account.py:297 assets/const/automation.py:9
#: authentication/templates/authentication/passkey.html:177
#: authentication/views/base.py:42 authentication/views/base.py:43
#: authentication/views/base.py:44 common/const/choices.py:67
@ -1010,7 +1015,7 @@ msgid "Verify asset account"
msgstr "账号验证"
#: accounts/models/base.py:37 accounts/models/base.py:66
#: accounts/serializers/account/account.py:491
#: accounts/serializers/account/account.py:497
#: accounts/serializers/account/base.py:17
#: accounts/serializers/automations/change_secret.py:50
#: authentication/serializers/connect_token_secret.py:42
@ -1192,8 +1197,8 @@ 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:284 perms/serializers/user_permission.py:27
#: assets/serializers/cagegory.py:12 assets/serializers/platform.py:174
#: assets/serializers/platform.py:285 perms/serializers/user_permission.py:27
#: settings/models.py:41 tickets/models/ticket/apply_application.py:13
#: users/models/preference.py:12 xpack/plugins/cloud/models.py:41
#: xpack/plugins/cloud/models.py:327
@ -1205,7 +1210,7 @@ msgstr "类别"
#: acls/serializers/command_acl.py:19 assets/models/automations/base.py:27
#: 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
#: assets/serializers/platform.py:161 assets/serializers/platform.py:173
#: audits/serializers.py:76 audits/serializers.py:196
#: authentication/models/connection_token.py:67
#: authentication/serializers/connect_token_secret.py:138 ops/models/job.py:155
@ -1239,54 +1244,47 @@ msgstr "帐号已存在。字段:{fields} 必须是唯一的。"
msgid "Has secret"
msgstr "已托管密码"
#: accounts/serializers/account/account.py:295 ops/models/celery.py:84
#: accounts/serializers/account/account.py:296 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:297
#: accounts/serializers/account/account.py:298
msgid "Changed"
msgstr "已修改"
#: accounts/serializers/account/account.py:307 acls/models/base.py:97
#: acls/templates/acls/asset_login_reminder.html:10
#: assets/models/automations/base.py:25
#: 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: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:101
msgid "Assets"
msgstr "资产"
#: accounts/serializers/account/account.py:412
#: accounts/serializers/account/account.py:410
#, python-format
msgid "Asset does not support this secret type: %s"
msgstr "资产不支持账号类型: %s"
#: accounts/serializers/account/account.py:444
#: accounts/serializers/account/account.py:443
msgid "Account has exist"
msgstr "账号已存在"
#: accounts/serializers/account/account.py:476
#: accounts/serializers/account/account.py:483
#: accounts/serializers/account/account.py:468
#: accounts/serializers/account/account.py:469
msgid "At least one asset or node must be specified"
msgstr "必须指定至少一个资产或节点"
#: accounts/serializers/account/account.py:482
#: accounts/serializers/account/account.py:489
#: accounts/serializers/account/base.py:73
#: accounts/serializers/account/base.py:88
#: assets/serializers/asset/common.py:425
msgid "Spec info"
msgstr "特殊信息"
#: accounts/serializers/account/account.py:493
#: accounts/serializers/account/account.py:499
#: authentication/serializers/connect_token_secret.py:173
#: authentication/templates/authentication/_access_key_modal.html:30
#: perms/models/perm_node.py:21 users/serializers/group.py:33
#: perms/models/perm_node.py:21 settings/models.py:245
#: users/serializers/group.py:33
msgid "ID"
msgstr "ID"
#: accounts/serializers/account/account.py:503 acls/notifications.py:18
#: accounts/serializers/account/account.py:509 acls/notifications.py:18
#: acls/notifications.py:68 acls/serializers/base.py:104
#: acls/templates/acls/asset_login_reminder.html:8
#: acls/templates/acls/user_login_reminder.html:8
@ -1310,7 +1308,7 @@ msgstr "ID"
msgid "User"
msgstr "用户"
#: accounts/serializers/account/account.py:504
#: accounts/serializers/account/account.py:510
#: authentication/templates/authentication/_access_key_modal.html:33
#: terminal/notifications.py:165 terminal/notifications.py:225
msgid "Date"
@ -1715,7 +1713,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:23 assets/serializers/platform.py:182
#: assets/serializers/domain.py:23 assets/serializers/platform.py:183
#: orgs/serializers.py:13 perms/serializers/permission.py:61
msgid "Assets amount"
msgstr "资产数量"
@ -1747,7 +1745,7 @@ msgstr "成功账号"
#: accounts/templates/accounts/change_secret_report.html:118
#: accounts/templates/accounts/push_account_report.html:77
#: accounts/templates/accounts/push_account_report.html:117
#: audits/handler.py:128
#: audits/handler.py:130
msgid "No"
msgstr "否"
@ -1868,6 +1866,18 @@ msgstr "审批人"
msgid "Users"
msgstr "用户"
#: acls/models/base.py:97 acls/templates/acls/asset_login_reminder.html:10
#: assets/models/automations/base.py:25
#: assets/serializers/automations/base.py:20 assets/serializers/domain.py:33
#: assets/serializers/platform.py:182 assets/serializers/platform.py:214
#: authentication/api/connection_token.py:464 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:101
msgid "Assets"
msgstr "资产"
#: acls/models/command_acl.py:16 assets/models/cmd_filter.py:60
#: ops/serializers/job.py:92 terminal/const.py:88
#: terminal/models/session/session.py:40 terminal/serializers/command.py:18
@ -2144,11 +2154,11 @@ msgstr "我们想通知您,最近有用户登录:"
msgid "User details"
msgstr "用户详情"
#: assets/api/asset/asset.py:154
#: assets/api/asset/asset.py:153
msgid "Cannot create asset directly, you should create a host or other"
msgstr "不能直接创建资产, 你应该创建主机或其他资产"
#: assets/api/asset/asset.py:158
#: assets/api/asset/asset.py:157
msgid "The number of assets exceeds the limit of 5000"
msgstr "资产数量超过了 5000 的限制"
@ -2582,8 +2592,9 @@ msgid "Cloud"
msgstr "云服务"
#: assets/models/asset/common.py:101 assets/models/platform.py:16
#: settings/serializers/auth/radius.py:18 settings/serializers/auth/sms.py:77
#: settings/serializers/msg.py:31 terminal/serializers/storage.py:133
#: assets/serializers/platform.py:87 settings/serializers/auth/radius.py:18
#: settings/serializers/auth/sms.py:77 settings/serializers/msg.py:31
#: terminal/serializers/storage.py:133
#: xpack/plugins/cloud/serializers/account_attrs.py:88
msgid "Port"
msgstr "端口"
@ -2621,19 +2632,19 @@ msgstr "收集资产硬件信息"
msgid "Custom info"
msgstr "自定义属性"
#: assets/models/asset/common.py:431
#: assets/models/asset/common.py:430
msgid "Can refresh asset hardware info"
msgstr "可以更新资产硬件信息"
#: assets/models/asset/common.py:432
#: assets/models/asset/common.py:431
msgid "Can test asset connectivity"
msgstr "可以测试资产连接性"
#: assets/models/asset/common.py:433
#: assets/models/asset/common.py:432
msgid "Can match asset"
msgstr "可以匹配资产"
#: assets/models/asset/common.py:434
#: assets/models/asset/common.py:433
msgid "Can change asset nodes"
msgstr "可以修改资产节点"
@ -2799,7 +2810,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
#: assets/serializers/platform.py:160
#: authentication/serializers/connect_token_secret.py:136
#: common/serializers/common.py:85 labels/serializers.py:45
#: settings/serializers/msg.py:91 xpack/plugins/cloud/models.py:404
@ -2850,7 +2861,7 @@ msgstr "主要的"
msgid "Required"
msgstr "必须的"
#: assets/models/platform.py:19 assets/serializers/platform.py:161
#: assets/models/platform.py:19 assets/serializers/platform.py:162
#: terminal/models/component/storage.py:28 users/const.py:42
#: xpack/plugins/cloud/providers/nutanix.py:30
msgid "Default"
@ -2953,11 +2964,11 @@ msgstr "账号移除参数"
msgid "Internal"
msgstr "内置"
#: assets/models/platform.py:102 assets/serializers/platform.py:171
#: assets/models/platform.py:102 assets/serializers/platform.py:172
msgid "Charset"
msgstr "编码"
#: assets/models/platform.py:104 assets/serializers/platform.py:209
#: assets/models/platform.py:104 assets/serializers/platform.py:210
msgid "Gateway enabled"
msgstr "启用网域网关"
@ -2965,15 +2976,15 @@ msgstr "启用网域网关"
msgid "DS enabled"
msgstr "启用目录服务"
#: assets/models/platform.py:107 assets/serializers/platform.py:202
#: assets/models/platform.py:107 assets/serializers/platform.py:203
msgid "Su enabled"
msgstr "启用账号切换"
#: assets/models/platform.py:108 assets/serializers/platform.py:177
#: assets/models/platform.py:108 assets/serializers/platform.py:178
msgid "Su method"
msgstr "账号切换方式"
#: assets/models/platform.py:109 assets/serializers/platform.py:180
#: assets/models/platform.py:109 assets/serializers/platform.py:181
msgid "Custom fields"
msgstr "自定义属性"
@ -2988,7 +2999,7 @@ msgid ""
"type"
msgstr "资产中批量更新平台,不符合平台类型跳过的资产"
#: assets/serializers/asset/common.py:36 assets/serializers/platform.py:153
#: assets/serializers/asset/common.py:36 assets/serializers/platform.py:154
msgid "Protocols, format is [\"protocol/port\"]"
msgstr "协议,格式为 [\"协议/端口\"]"
@ -3010,7 +3021,7 @@ msgid ""
"it"
msgstr "节点路径,格式为 [\"/组织/节点名\"], 如果节点不存在,将创建它"
#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:174
#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:175
#: authentication/serializers/connect_token_secret.py:30
#: authentication/serializers/connect_token_secret.py:77
#: perms/models/asset_permission.py:76 perms/serializers/permission.py:67
@ -3228,39 +3239,39 @@ msgstr "启动账号移除"
msgid "Port from addr"
msgstr "端口来自地址"
#: assets/serializers/platform.py:98
#: assets/serializers/platform.py:99
msgid ""
"This protocol is primary, and it must be set when adding assets. "
"Additionally, there can only be one primary protocol."
msgstr "该协议是主要的,添加资产时必须设置,并且只能有一个主要协议"
#: assets/serializers/platform.py:103
#: assets/serializers/platform.py:104
msgid "This protocol is required, and it must be set when adding assets."
msgstr "该协议是必填的,添加资产时必须设置"
#: assets/serializers/platform.py:106
#: assets/serializers/platform.py:107
msgid ""
"This protocol is default, when adding assets, it will be displayed by "
"default."
msgstr "该协议是默认的,添加资产时,将默认显示"
#: assets/serializers/platform.py:109
#: assets/serializers/platform.py:110
msgid "This protocol is public, asset will show this protocol to user"
msgstr "该协议是公开的,资产将向用户显示该协议并可以连接使用"
#: assets/serializers/platform.py:162
#: assets/serializers/platform.py:163
msgid "Help text"
msgstr "帮助"
#: assets/serializers/platform.py:163
#: assets/serializers/platform.py:164
msgid "Choices"
msgstr "选择"
#: assets/serializers/platform.py:175
#: assets/serializers/platform.py:176
msgid "Automation"
msgstr "自动化"
#: assets/serializers/platform.py:204
#: assets/serializers/platform.py:205
msgid ""
"Login with account when accessing assets, then automatically switch to "
"another, similar to logging in with a regular account and then switching to "
@ -3269,19 +3280,19 @@ msgstr ""
"在访问资产时使用账号登录,然后自动切换到另一个账号,就像用普通账号登录然后切"
"换到 root 一样"
#: assets/serializers/platform.py:210
#: assets/serializers/platform.py:211
msgid "Assets can be connected using a zone gateway"
msgstr "资产可以使用区域网关进行连接"
#: assets/serializers/platform.py:212
#: assets/serializers/platform.py:213
msgid "Default zone"
msgstr "默认网域"
#: assets/serializers/platform.py:239
#: assets/serializers/platform.py:240
msgid "type is required"
msgstr "类型 该字段是必填项。"
#: assets/serializers/platform.py:254
#: assets/serializers/platform.py:255
msgid "Protocols is required"
msgstr "协议是必填的"
@ -3518,7 +3529,7 @@ msgstr "任务"
msgid "-"
msgstr "-"
#: audits/handler.py:128
#: audits/handler.py:130
msgid "Yes"
msgstr "是"
@ -3801,35 +3812,35 @@ msgstr "该操作需要验证您的 MFA, 请先开启并配置"
msgid "Reusable connection token is not allowed, global setting not enabled"
msgstr "不允许使用可重复使用的连接令牌,未启用全局设置"
#: authentication/api/connection_token.py:425
#: authentication/api/connection_token.py:426
msgid "Anonymous account is not supported for this asset"
msgstr "匿名账号不支持当前资产"
#: authentication/api/connection_token.py:455
#: authentication/api/connection_token.py:456
msgid "Permission expired"
msgstr "授权已过期"
#: authentication/api/connection_token.py:488
#: authentication/api/connection_token.py:489
msgid "ACL action is reject: {}({})"
msgstr "ACL 动作是拒绝: {}({})"
#: authentication/api/connection_token.py:492
#: authentication/api/connection_token.py:493
msgid "ACL action is review"
msgstr "ACL 动作是复核"
#: authentication/api/connection_token.py:502
#: authentication/api/connection_token.py:503
msgid "ACL action is face verify"
msgstr "ACL 动作是人脸验证"
#: authentication/api/connection_token.py:507
#: authentication/api/connection_token.py:508
msgid "ACL action not supported for this asset"
msgstr "资产登录规则不支持当前资产"
#: authentication/api/connection_token.py:514
#: authentication/api/connection_token.py:515
msgid "ACL action is face online"
msgstr "ACL 动作是人脸在线"
#: authentication/api/connection_token.py:539
#: authentication/api/connection_token.py:540
msgid "No available face feature"
msgstr "没有可用的人脸特征"
@ -3905,7 +3916,11 @@ msgstr "无效的令牌头。符号字符串不应包含无效字符。"
msgid "Invalid token or cache refreshed."
msgstr "刷新的令牌或缓存无效。"
#: authentication/backends/oidc/views.py:175
#: authentication/backends/oauth2/views.py:67
msgid "OAuth2 Error"
msgstr "OAuth2 错误"
#: authentication/backends/oidc/views.py:137
msgid "OpenID Error"
msgstr "OpenID 错误"
@ -3934,7 +3949,7 @@ msgstr "附加"
msgid "Credential ID"
msgstr "凭证 ID"
#: authentication/backends/saml2/views.py:282
#: authentication/backends/saml2/views.py:255
msgid "SAML2 Error"
msgstr "SAML2 错误"
@ -4125,16 +4140,16 @@ msgstr "您的密码无效"
msgid "Please wait for %s seconds before retry"
msgstr "请在 %s 秒后重试"
#: authentication/errors/redirect.py:85 authentication/mixins.py:332
#: authentication/errors/redirect.py:85 authentication/mixins.py:365
#: users/views/profile/reset.py:224
msgid "Your password is too simple, please change it for security"
msgstr "你的密码过于简单,为了安全,请修改"
#: authentication/errors/redirect.py:93 authentication/mixins.py:341
#: authentication/errors/redirect.py:93 authentication/mixins.py:374
msgid "You should to change your password before login"
msgstr "登录完成前,请先修改密码"
#: authentication/errors/redirect.py:101 authentication/mixins.py:350
#: authentication/errors/redirect.py:101 authentication/mixins.py:383
msgid "Your password has expired, please reset before logging in"
msgstr "您的密码已过期,先修改再登录"
@ -4251,21 +4266,29 @@ msgstr "清空手机号码禁用"
msgid "Authentication failed (before login check failed): {}"
msgstr "认证失败 (登录前检查失败): {}"
#: authentication/mixins.py:84
#: authentication/mixins.py:105
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 ""
"管理员已开启'仅允许已存在用户登录',当前用户不在用户列表中,请联系管理员。"
#: authentication/mixins.py:117
msgid "User is invalid"
msgstr "无效的用户"
#: authentication/mixins.py:99
#: authentication/mixins.py:132
msgid ""
"The administrator has enabled 'Only allow login from user source'. \n"
" The current user source is {}. Please contact the administrator."
msgstr "管理员已开启'仅允许从用户来源登录',当前用户来源为{},请联系管理员。"
#: authentication/mixins.py:278
#: authentication/mixins.py:311
msgid "The MFA type ({}) is not enabled"
msgstr "该 MFA ({}) 方式没有启用"
#: authentication/mixins.py:320
#: authentication/mixins.py:353
msgid "Please change your password"
msgstr "请修改密码"
@ -4750,22 +4773,22 @@ msgstr "是否重试 "
msgid "LAN"
msgstr "局域网"
#: authentication/views/base.py:71
#: authentication/views/base.py:70
#: perms/templates/perms/_msg_permed_items_expire.html:18
msgid "If you have any question, please contact the administrator"
msgstr "如果有疑问或需求,请联系系统管理员"
#: authentication/views/base.py:144
#: authentication/views/base.py:143
#, python-format
msgid "%s query user failed"
msgstr "%s 查询用户失败"
#: authentication/views/base.py:152
#: authentication/views/base.py:151
#, python-format
msgid "The %s is already bound to another user"
msgstr "%s 已绑定到另一个用户"
#: authentication/views/base.py:159
#: authentication/views/base.py:158
#, python-format
msgid "Binding %s successfully"
msgstr "绑定 %s 成功"
@ -4905,7 +4928,7 @@ msgstr "从企业微信获取用户失败"
msgid "Please login with a password and then bind the WeCom"
msgstr "请使用密码登录,然后绑定企业微信"
#: common/api/action.py:68
#: common/api/action.py:80
msgid "Request file format may be wrong"
msgstr "上传的文件格式错误 或 其它类型资源的文件"
@ -5429,7 +5452,7 @@ msgstr ""
msgid "App Labels"
msgstr "标签管理"
#: labels/models.py:15 settings/serializers/security.py:211
#: labels/models.py:15
msgid "Color"
msgstr "颜色"
@ -5488,16 +5511,16 @@ msgid ""
" work orders, and other notifications"
msgstr "系统一些告警,工单等需要发送站内信时执行该任务"
#: ops/ansible/inventory.py:135 ops/ansible/inventory.py:205
#: ops/ansible/inventory.py:136 ops/ansible/inventory.py:206
#: ops/models/job.py:69
msgid "No account available"
msgstr "无可用账号"
#: ops/ansible/inventory.py:326 ops/ansible/inventory.py:368
#: ops/ansible/inventory.py:327 ops/ansible/inventory.py:369
msgid "Ansible disabled"
msgstr "Ansible 已禁用"
#: ops/ansible/inventory.py:384
#: ops/ansible/inventory.py:385
msgid "Skip hosts below:"
msgstr "跳过以下主机: "
@ -5513,34 +5536,38 @@ msgstr "任务 {} 不存在"
msgid "Task {} args or kwargs error"
msgstr "任务 {} 执行参数错误"
#: ops/api/job.py:70
#: ops/api/job.py:65
msgid "Login to asset {}({}) is rejected by login asset ACL ({})"
msgstr ""
#: ops/api/job.py:88
#, 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:71
#: ops/api/job.py:89
#, python-brace-format
msgid "Asset ({asset}) authorization is missing SSH, SFTP, or WinRM protocol"
msgstr "资产({asset})授权缺少ssh,sftp或winrm协议"
#: ops/api/job.py:72
#: ops/api/job.py:90
#, python-brace-format
msgid "Asset ({asset}) authorization lacks upload permissions"
msgstr "资产({asset})授权缺少上传权限"
#: ops/api/job.py:160
#: ops/api/job.py:185
msgid "Duplicate file exists"
msgstr "存在同名文件"
#: ops/api/job.py:165
#: ops/api/job.py:190
#, python-brace-format
msgid ""
"File size exceeds maximum limit. Please select a file smaller than {limit}MB"
msgstr "文件大小超过最大限制。请选择小于 {limit}MB 的文件。"
#: ops/api/job.py:238
#: ops/api/job.py:273
msgid ""
"The task is being created and cannot be interrupted. Please try again later."
msgstr "正在创建任务,无法中断,请稍后重试。"
@ -5842,7 +5869,7 @@ msgstr "Material"
msgid "Material Type"
msgstr "Material 类型"
#: ops/models/job.py:561
#: ops/models/job.py:581
msgid "Job Execution"
msgstr "作业执行"
@ -7407,40 +7434,40 @@ msgid "Period clean"
msgstr "定時清掃"
#: settings/serializers/cleaning.py:15
msgid "Login log retention days (day)"
msgstr "登录日志 (天)"
msgid "Login log retention days"
msgstr "登录日志保留天数"
#: settings/serializers/cleaning.py:19
msgid "Task log retention days (day)"
msgstr "任务日志 (天)"
msgid "Task log retention days"
msgstr "任务日志保留天数"
#: settings/serializers/cleaning.py:23
msgid "Operate log retention days (day)"
msgstr "操作日志 (天)"
msgid "Operate log retention days"
msgstr "操作日志保留天数"
#: settings/serializers/cleaning.py:27
msgid "password change log keep days (day)"
msgstr "改密日志"
msgid "Password change log retention days"
msgstr "用户改密日志保留天数"
#: settings/serializers/cleaning.py:31
msgid "FTP log retention days (day)"
msgstr "上传下载 (天)"
msgid "FTP log retention days"
msgstr "上传下载记录保留天数"
#: settings/serializers/cleaning.py:35
msgid "Cloud sync task history retention days (day)"
msgstr "云同步记录 (天)"
msgid "Cloud sync task history retention days"
msgstr "云同步记录保留天数"
#: settings/serializers/cleaning.py:39
msgid "job execution retention days (day)"
msgstr "作业中心执行历史 (天)"
msgid "job execution retention days"
msgstr "作业执行历史保留天数"
#: settings/serializers/cleaning.py:43
msgid "Activity log retention days (day)"
msgstr "活动记录 (天)"
msgid "Activity log retention days"
msgstr "活动记录保留天数"
#: settings/serializers/cleaning.py:46
msgid "Session log retention days (day)"
msgstr "会话日志 (天)"
msgid "Session log retention days"
msgstr "会话日志保留天数"
#: settings/serializers/cleaning.py:48
msgid ""
@ -7450,8 +7477,8 @@ msgstr ""
"会话、录像,命令记录超过该时长将会被清除 (影响数据库存储OSS 等不受影响)"
#: settings/serializers/cleaning.py:53
msgid "Change secret and push record retention days (day)"
msgstr "改密推送记录保留天数 (天)"
msgid "Change secret and push record retention days"
msgstr "账号改密推送记录保留天数"
#: settings/serializers/feature.py:23 settings/serializers/msg.py:69
msgid "Subject"
@ -7933,28 +7960,32 @@ msgid "Watermark"
msgstr "开启水印"
#: settings/serializers/security.py:205
msgid "Watermark session content"
msgid "Session content"
msgstr "会话水印自定义内容"
#: settings/serializers/security.py:208
msgid "Watermark console content"
msgid "Console content"
msgstr "管理页面水印自定义内容"
#: settings/serializers/security.py:211
msgid "Font color"
msgstr "字体颜色"
#: settings/serializers/security.py:214
msgid "Watermark font size"
msgstr "字体字号"
msgid "Font size"
msgstr "字体大小 (px)"
#: settings/serializers/security.py:217
msgid "Watermark height"
msgstr "单个水印高度"
msgid "Height"
msgstr "高度 (px)"
#: settings/serializers/security.py:220
msgid "Watermark width"
msgstr "单个水印宽度"
msgid "Width"
msgstr "宽度 (px)"
#: settings/serializers/security.py:223
msgid "Watermark rotate"
msgstr "水印旋转角度"
msgid "Rotate"
msgstr "旋转 (度)"
#: settings/serializers/security.py:227
msgid "Max idle time (minute)"
@ -8259,15 +8290,15 @@ msgstr "认证失败: (未知): {}"
msgid "Authentication success: {}"
msgstr "认证成功: {}"
#: settings/ws.py:226
#: settings/ws.py:228
msgid "No LDAP user was found"
msgstr "没有获取到 LDAP 用户"
#: settings/ws.py:235
#: settings/ws.py:237
msgid "Total {}, success {}, failure {}"
msgstr "总共 {},成功 {},失败 {}"
#: settings/ws.py:239
#: settings/ws.py:241
msgid ", disabled {}"
msgstr ", 禁用 {}"
@ -11394,6 +11425,12 @@ msgstr "华东-宿迁"
msgid "Port \"%(port)s\" of instance IP \"%(ip)s\" is not reachable"
msgstr "实例 IP %(ip)s 的端口%(port)s 无法访问"
#: xpack/plugins/cloud/providers/scp.py:108
#, fuzzy
#| msgid "empty"
msgid "Empty"
msgstr "空"
#: xpack/plugins/cloud/serializers/account.py:104
msgid "Validity display"
msgstr "有效性显示"
@ -11568,6 +11605,3 @@ msgstr "许可证导入成功"
#: xpack/plugins/license/api.py:53
msgid "Invalid license"
msgstr "许可证无效"
#~ msgid "domain_name"
#~ msgstr "域名称"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: JumpServer 0.3.3\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-16 14:10+0800\n"
"POT-Creation-Date: 2025-11-17 17:53+0800\n"
"PO-Revision-Date: 2021-05-20 10:54+0800\n"
"Last-Translator: ibuler <ibuler@qq.com>\n"
"Language-Team: JumpServer team<ibuler@qq.com>\n"
@ -18,14 +18,18 @@ msgstr ""
"X-Generator: Poedit 2.4.3\n"
"X-ZhConverter: 繁化姬 dict-74c8d060-r1048 @ 2024/04/07 18:19:20 | https://zhconvert.org\n"
#: accounts/api/account/account.py:141
#: accounts/api/account/account.py:142
#: accounts/serializers/account/account.py:181
#: accounts/serializers/account/account.py:362
msgid "Account already exists"
msgstr "帳號已存在"
#: accounts/api/account/account.py:207
msgid "No valid assets found for account creation."
msgstr "未找到可用於創建帳戶的有效資產。"
#: accounts/api/account/application.py:77
#: authentication/api/connection_token.py:452
#: authentication/api/connection_token.py:453
msgid "Account not found"
msgstr "帳號未找到"
@ -459,7 +463,7 @@ msgstr "Vault 操作失敗,請重試,或檢查 Vault 上的帳號信息。"
#: accounts/templates/accounts/push_account_report.html:78
#: accounts/templates/accounts/push_account_report.html:118
#: acls/notifications.py:70 acls/serializers/base.py:111
#: assets/models/asset/common.py:102 assets/models/asset/common.py:428
#: assets/models/asset/common.py:102 assets/models/asset/common.py:427
#: assets/models/cmd_filter.py:36 audits/models.py:59 audits/models.py:336
#: audits/serializers.py:230 authentication/models/connection_token.py:42
#: perms/models/asset_permission.py:69 terminal/backends/command/models.py:17
@ -474,7 +478,7 @@ msgstr "資產"
#: accounts/models/account.py:89 accounts/models/template.py:16
#: accounts/serializers/account/account.py:234
#: accounts/serializers/account/account.py:304
#: accounts/serializers/account/account.py:305
#: accounts/serializers/account/template.py:35
#: authentication/serializers/connect_token_secret.py:51
msgid "Su from"
@ -521,13 +525,14 @@ msgstr "改密狀態"
#: accounts/models/account.py:107
#: accounts/models/automations/check_account.py:64
#: accounts/serializers/account/account.py:295
#: accounts/serializers/account/service.py:13
#: accounts/serializers/automations/change_secret.py:117
#: accounts/serializers/automations/change_secret.py:148
#: acls/serializers/base.py:112
#: acls/templates/acls/asset_login_reminder.html:11
#: assets/serializers/gateway.py:33 audits/models.py:60 audits/models.py:337
#: audits/serializers.py:231 authentication/api/connection_token.py:464
#: audits/serializers.py:231 authentication/api/connection_token.py:465
#: 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:31 terminal/notifications.py:291
@ -581,8 +586,8 @@ msgstr "帳號活動"
#: assets/models/asset/common.py:166 assets/models/cmd_filter.py:21
#: assets/models/label.py:18 assets/models/platform.py:15
#: assets/models/platform.py:94 assets/models/zone.py:19
#: assets/serializers/asset/common.py:174 assets/serializers/platform.py:158
#: assets/serializers/platform.py:283
#: assets/serializers/asset/common.py:174 assets/serializers/platform.py:159
#: assets/serializers/platform.py:284
#: authentication/backends/passkey/models.py:10
#: authentication/models/ssh_key.py:12 authentication/notifications.py:17
#: authentication/notifications.py:56
@ -620,7 +625,7 @@ msgstr "圖示"
#: accounts/models/application.py:20 accounts/models/base.py:39
#: accounts/models/mixins/vault.py:49
#: accounts/serializers/account/account.py:492
#: accounts/serializers/account/account.py:498
#: accounts/serializers/account/base.py:20
#: authentication/models/temp_token.py:11
#: authentication/templates/authentication/_access_key_modal.html:31
@ -793,7 +798,7 @@ msgid "Status"
msgstr "狀態"
#: accounts/models/automations/change_secret.py:51
#: accounts/serializers/account/account.py:296 assets/const/automation.py:9
#: accounts/serializers/account/account.py:297 assets/const/automation.py:9
#: authentication/templates/authentication/passkey.html:177
#: authentication/views/base.py:42 authentication/views/base.py:43
#: authentication/views/base.py:44 common/const/choices.py:67
@ -1017,7 +1022,7 @@ msgid "Verify asset account"
msgstr "帳號驗證"
#: accounts/models/base.py:37 accounts/models/base.py:66
#: accounts/serializers/account/account.py:491
#: accounts/serializers/account/account.py:497
#: accounts/serializers/account/base.py:17
#: accounts/serializers/automations/change_secret.py:50
#: authentication/serializers/connect_token_secret.py:42
@ -1194,8 +1199,8 @@ 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:284 perms/serializers/user_permission.py:27
#: assets/serializers/cagegory.py:12 assets/serializers/platform.py:174
#: assets/serializers/platform.py:285 perms/serializers/user_permission.py:27
#: settings/models.py:41 tickets/models/ticket/apply_application.py:13
#: users/models/preference.py:12 xpack/plugins/cloud/models.py:41
#: xpack/plugins/cloud/models.py:327
@ -1207,7 +1212,7 @@ msgstr "類別"
#: acls/serializers/command_acl.py:19 assets/models/automations/base.py:27
#: 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
#: assets/serializers/platform.py:161 assets/serializers/platform.py:173
#: audits/serializers.py:76 audits/serializers.py:196
#: authentication/models/connection_token.py:67
#: authentication/serializers/connect_token_secret.py:138
@ -1241,54 +1246,47 @@ msgstr "帳號已存在。字段:{fields} 必須是唯一的。"
msgid "Has secret"
msgstr "已託管密碼"
#: accounts/serializers/account/account.py:295 ops/models/celery.py:84
#: accounts/serializers/account/account.py:296 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:297
#: accounts/serializers/account/account.py:298
msgid "Changed"
msgstr "已修改"
#: accounts/serializers/account/account.py:307 acls/models/base.py:97
#: acls/templates/acls/asset_login_reminder.html:10
#: assets/models/automations/base.py:25
#: 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: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:101
msgid "Assets"
msgstr "資產"
#: accounts/serializers/account/account.py:412
#: accounts/serializers/account/account.py:410
#, python-format
msgid "Asset does not support this secret type: %s"
msgstr "資產不支持帳號類型: %s"
#: accounts/serializers/account/account.py:444
#: accounts/serializers/account/account.py:443
msgid "Account has exist"
msgstr "帳號已存在"
#: accounts/serializers/account/account.py:476
#: accounts/serializers/account/account.py:483
#: accounts/serializers/account/account.py:468
#: accounts/serializers/account/account.py:469
msgid "At least one asset or node must be specified"
msgstr "資產或者節點至少選擇一項"
#: accounts/serializers/account/account.py:482
#: accounts/serializers/account/account.py:489
#: accounts/serializers/account/base.py:73
#: accounts/serializers/account/base.py:88
#: assets/serializers/asset/common.py:425
msgid "Spec info"
msgstr "特殊資訊"
#: accounts/serializers/account/account.py:493
#: accounts/serializers/account/account.py:499
#: authentication/serializers/connect_token_secret.py:173
#: authentication/templates/authentication/_access_key_modal.html:30
#: perms/models/perm_node.py:21 users/serializers/group.py:33
#: perms/models/perm_node.py:21 settings/models.py:245
#: users/serializers/group.py:33
msgid "ID"
msgstr "ID"
#: accounts/serializers/account/account.py:503 acls/notifications.py:18
#: accounts/serializers/account/account.py:509 acls/notifications.py:18
#: acls/notifications.py:68 acls/serializers/base.py:104
#: acls/templates/acls/asset_login_reminder.html:8
#: acls/templates/acls/user_login_reminder.html:8
@ -1313,7 +1311,7 @@ msgstr "ID"
msgid "User"
msgstr "用戶"
#: accounts/serializers/account/account.py:504
#: accounts/serializers/account/account.py:510
#: authentication/templates/authentication/_access_key_modal.html:33
#: terminal/notifications.py:165 terminal/notifications.py:225
msgid "Date"
@ -1691,7 +1689,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:23 assets/serializers/platform.py:182
#: assets/serializers/domain.py:23 assets/serializers/platform.py:183
#: orgs/serializers.py:13 perms/serializers/permission.py:61
msgid "Assets amount"
msgstr "資產數量"
@ -1723,7 +1721,7 @@ msgstr "成功帳號"
#: accounts/templates/accounts/change_secret_report.html:118
#: accounts/templates/accounts/push_account_report.html:77
#: accounts/templates/accounts/push_account_report.html:117
#: audits/handler.py:128
#: audits/handler.py:130
msgid "No"
msgstr "否"
@ -1845,6 +1843,18 @@ msgstr "審批人"
msgid "Users"
msgstr "用戶管理"
#: acls/models/base.py:97 acls/templates/acls/asset_login_reminder.html:10
#: assets/models/automations/base.py:25
#: assets/serializers/automations/base.py:20 assets/serializers/domain.py:33
#: assets/serializers/platform.py:182 assets/serializers/platform.py:214
#: authentication/api/connection_token.py:464 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:101
msgid "Assets"
msgstr "資產"
#: acls/models/command_acl.py:16 assets/models/cmd_filter.py:60
#: ops/serializers/job.py:92 terminal/const.py:88
#: terminal/models/session/session.py:40 terminal/serializers/command.py:18
@ -2120,11 +2130,11 @@ msgstr "我們想通知您,最近有用戶登入:"
msgid "User details"
msgstr "使用者詳情"
#: assets/api/asset/asset.py:154
#: assets/api/asset/asset.py:153
msgid "Cannot create asset directly, you should create a host or other"
msgstr "不能直接創建資產, 你應該創建主機或其他資產"
#: assets/api/asset/asset.py:158
#: assets/api/asset/asset.py:157
msgid "The number of assets exceeds the limit of 5000"
msgstr "資產數量超過 5000 的限制"
@ -2555,8 +2565,9 @@ msgid "Cloud"
msgstr "雲服務"
#: assets/models/asset/common.py:101 assets/models/platform.py:16
#: settings/serializers/auth/radius.py:18 settings/serializers/auth/sms.py:77
#: settings/serializers/msg.py:31 terminal/serializers/storage.py:133
#: assets/serializers/platform.py:87 settings/serializers/auth/radius.py:18
#: settings/serializers/auth/sms.py:77 settings/serializers/msg.py:31
#: terminal/serializers/storage.py:133
#: xpack/plugins/cloud/serializers/account_attrs.py:88
msgid "Port"
msgstr "埠"
@ -2594,19 +2605,19 @@ msgstr "收集資產硬體資訊"
msgid "Custom info"
msgstr "自訂屬性"
#: assets/models/asset/common.py:431
#: assets/models/asset/common.py:430
msgid "Can refresh asset hardware info"
msgstr "可以更新資產硬體資訊"
#: assets/models/asset/common.py:432
#: assets/models/asset/common.py:431
msgid "Can test asset connectivity"
msgstr "可以測試資產連接性"
#: assets/models/asset/common.py:433
#: assets/models/asset/common.py:432
msgid "Can match asset"
msgstr "可以匹配資產"
#: assets/models/asset/common.py:434
#: assets/models/asset/common.py:433
msgid "Can change asset nodes"
msgstr "可以修改資產節點"
@ -2772,7 +2783,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
#: assets/serializers/platform.py:160
#: authentication/serializers/connect_token_secret.py:136
#: common/serializers/common.py:85 labels/serializers.py:45
#: settings/serializers/msg.py:91 xpack/plugins/cloud/models.py:404
@ -2823,7 +2834,7 @@ msgstr "主要的"
msgid "Required"
msgstr "必須的"
#: assets/models/platform.py:19 assets/serializers/platform.py:161
#: assets/models/platform.py:19 assets/serializers/platform.py:162
#: terminal/models/component/storage.py:28 users/const.py:42
#: xpack/plugins/cloud/providers/nutanix.py:30
msgid "Default"
@ -2926,11 +2937,11 @@ msgstr "帳號移除參數"
msgid "Internal"
msgstr "內建"
#: assets/models/platform.py:102 assets/serializers/platform.py:171
#: assets/models/platform.py:102 assets/serializers/platform.py:172
msgid "Charset"
msgstr "編碼"
#: assets/models/platform.py:104 assets/serializers/platform.py:209
#: assets/models/platform.py:104 assets/serializers/platform.py:210
msgid "Gateway enabled"
msgstr "啟用網域網関"
@ -2938,15 +2949,15 @@ msgstr "啟用網域網関"
msgid "DS enabled"
msgstr "目錄服務已啟用"
#: assets/models/platform.py:107 assets/serializers/platform.py:202
#: assets/models/platform.py:107 assets/serializers/platform.py:203
msgid "Su enabled"
msgstr "啟用帳號切換"
#: assets/models/platform.py:108 assets/serializers/platform.py:177
#: assets/models/platform.py:108 assets/serializers/platform.py:178
msgid "Su method"
msgstr "帳號切換方式"
#: assets/models/platform.py:109 assets/serializers/platform.py:180
#: assets/models/platform.py:109 assets/serializers/platform.py:181
msgid "Custom fields"
msgstr "自訂屬性"
@ -2961,7 +2972,7 @@ msgid ""
"type"
msgstr "資產中批次更新平台,不符合平台類型跳過的資產"
#: assets/serializers/asset/common.py:36 assets/serializers/platform.py:153
#: assets/serializers/asset/common.py:36 assets/serializers/platform.py:154
msgid "Protocols, format is [\"protocol/port\"]"
msgstr "協定,格式為 [\"協定/連接埠\"]"
@ -2981,7 +2992,7 @@ msgid ""
"it"
msgstr "節點路徑,格式為 [\"/組織/節點名稱\"], 如果節點不存在,將創建它"
#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:174
#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:175
#: authentication/serializers/connect_token_secret.py:30
#: authentication/serializers/connect_token_secret.py:77
#: perms/models/asset_permission.py:76 perms/serializers/permission.py:67
@ -3196,58 +3207,58 @@ msgstr "启动账号移除"
msgid "Port from addr"
msgstr "埠來自地址"
#: assets/serializers/platform.py:98
#: assets/serializers/platform.py:99
msgid ""
"This protocol is primary, and it must be set when adding assets. "
"Additionally, there can only be one primary protocol."
msgstr "該協議是主要的,添加資產時必須設置。並且只能有一個主要協議"
#: assets/serializers/platform.py:103
#: assets/serializers/platform.py:104
msgid "This protocol is required, and it must be set when adding assets."
msgstr "該協議是必填的,添加資產時必須設置"
#: assets/serializers/platform.py:106
#: assets/serializers/platform.py:107
msgid ""
"This protocol is default, when adding assets, it will be displayed by "
"default."
msgstr "該協議是預設的,添加資產時,將默認顯示"
#: assets/serializers/platform.py:109
#: assets/serializers/platform.py:110
msgid "This protocol is public, asset will show this protocol to user"
msgstr "該協議是公開的,資產將向用戶顯示該協議並可以連接使用"
#: assets/serializers/platform.py:162
#: assets/serializers/platform.py:163
msgid "Help text"
msgstr "幫助"
#: assets/serializers/platform.py:163
#: assets/serializers/platform.py:164
msgid "Choices"
msgstr "選擇"
#: assets/serializers/platform.py:175
#: assets/serializers/platform.py:176
msgid "Automation"
msgstr "自動化"
#: assets/serializers/platform.py:204
#: assets/serializers/platform.py:205
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 一樣"
#: assets/serializers/platform.py:210
#: assets/serializers/platform.py:211
msgid "Assets can be connected using a zone gateway"
msgstr "資產可以使用區域網關進行連接"
#: assets/serializers/platform.py:212
#: assets/serializers/platform.py:213
msgid "Default zone"
msgstr "默認網域"
#: assets/serializers/platform.py:239
#: assets/serializers/platform.py:240
msgid "type is required"
msgstr "類型 該欄位是必填項。"
#: assets/serializers/platform.py:254
#: assets/serializers/platform.py:255
msgid "Protocols is required"
msgstr "協議是必填的"
@ -3479,7 +3490,7 @@ msgstr "任務"
msgid "-"
msgstr "-"
#: audits/handler.py:128
#: audits/handler.py:130
msgid "Yes"
msgstr "是"
@ -3757,35 +3768,35 @@ msgstr "該操作需要驗證您的 MFA, 請先開啟並配置"
msgid "Reusable connection token is not allowed, global setting not enabled"
msgstr "不允許使用可重複使用的連接令牌,未啟用全局設置"
#: authentication/api/connection_token.py:425
#: authentication/api/connection_token.py:426
msgid "Anonymous account is not supported for this asset"
msgstr "匿名帳號不支持當前資產"
#: authentication/api/connection_token.py:455
#: authentication/api/connection_token.py:456
msgid "Permission expired"
msgstr "授權已過期"
#: authentication/api/connection_token.py:488
#: authentication/api/connection_token.py:489
msgid "ACL action is reject: {}({})"
msgstr "ACL 動作是拒絕: {}({})"
#: authentication/api/connection_token.py:492
#: authentication/api/connection_token.py:493
msgid "ACL action is review"
msgstr "ACL 動作是覆核"
#: authentication/api/connection_token.py:502
#: authentication/api/connection_token.py:503
msgid "ACL action is face verify"
msgstr "ACL Action 係人臉驗證"
#: authentication/api/connection_token.py:507
#: authentication/api/connection_token.py:508
msgid "ACL action not supported for this asset"
msgstr "資產登錄規則不支持當前資產"
#: authentication/api/connection_token.py:514
#: authentication/api/connection_token.py:515
msgid "ACL action is face online"
msgstr "ACL Action 係人臉在線"
#: authentication/api/connection_token.py:539
#: authentication/api/connection_token.py:540
msgid "No available face feature"
msgstr "沒有可用的人臉特徵"
@ -3859,7 +3870,11 @@ msgstr "無效的令牌頭。符號字串不應包含無效字元。"
msgid "Invalid token or cache refreshed."
msgstr "刷新的令牌或快取無效。"
#: authentication/backends/oidc/views.py:175
#: authentication/backends/oauth2/views.py:67
msgid "OAuth2 Error"
msgstr "OAuth2 錯誤"
#: authentication/backends/oidc/views.py:137
msgid "OpenID Error"
msgstr "OpenID 錯誤"
@ -3888,7 +3903,7 @@ msgstr "附加"
msgid "Credential ID"
msgstr "憑證 ID"
#: authentication/backends/saml2/views.py:282
#: authentication/backends/saml2/views.py:255
msgid "SAML2 Error"
msgstr "SAML2 錯誤"
@ -4077,16 +4092,16 @@ msgstr "您的密碼無效"
msgid "Please wait for %s seconds before retry"
msgstr "請在 %s 秒後重試"
#: authentication/errors/redirect.py:85 authentication/mixins.py:332
#: authentication/errors/redirect.py:85 authentication/mixins.py:365
#: users/views/profile/reset.py:224
msgid "Your password is too simple, please change it for security"
msgstr "你的密碼過於簡單,為了安全,請修改"
#: authentication/errors/redirect.py:93 authentication/mixins.py:341
#: authentication/errors/redirect.py:93 authentication/mixins.py:374
msgid "You should to change your password before login"
msgstr "登錄完成前,請先修改密碼"
#: authentication/errors/redirect.py:101 authentication/mixins.py:350
#: authentication/errors/redirect.py:101 authentication/mixins.py:383
msgid "Your password has expired, please reset before logging in"
msgstr "您的密碼已過期,先修改再登錄"
@ -4203,21 +4218,27 @@ msgstr "清空手機號碼禁用"
msgid "Authentication failed (before login check failed): {}"
msgstr "認證失敗 (登錄前檢查失敗): {}"
#: authentication/mixins.py:84
#: authentication/mixins.py:105
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 "管理員已開啟'僅允許已存在用戶登錄',當前用戶不在用戶列表中,請聯絡管理員。"
#: authentication/mixins.py:117
msgid "User is invalid"
msgstr "無效的用戶"
#: authentication/mixins.py:99
#: authentication/mixins.py:132
msgid ""
"The administrator has enabled 'Only allow login from user source'. \n"
" The current user source is {}. Please contact the administrator."
msgstr "管理員已開啟'僅允許從用戶來源登錄',當前用戶來源為{},請聯絡管理員。"
#: authentication/mixins.py:278
#: authentication/mixins.py:311
msgid "The MFA type ({}) is not enabled"
msgstr "該 MFA ({}) 方式沒有啟用"
#: authentication/mixins.py:320
#: authentication/mixins.py:353
msgid "Please change your password"
msgstr "請修改密碼"
@ -4701,22 +4722,22 @@ msgstr "是否重試 "
msgid "LAN"
msgstr "區域網路"
#: authentication/views/base.py:71
#: authentication/views/base.py:70
#: perms/templates/perms/_msg_permed_items_expire.html:18
msgid "If you have any question, please contact the administrator"
msgstr "如果有疑問或需求,請聯絡系統管理員"
#: authentication/views/base.py:144
#: authentication/views/base.py:143
#, python-format
msgid "%s query user failed"
msgstr "%s 查詢用戶失敗"
#: authentication/views/base.py:152
#: authentication/views/base.py:151
#, python-format
msgid "The %s is already bound to another user"
msgstr "%s 已綁定到另一個用戶"
#: authentication/views/base.py:159
#: authentication/views/base.py:158
#, python-format
msgid "Binding %s successfully"
msgstr "綁定 %s 成功"
@ -4855,7 +4876,7 @@ msgstr "從企業微信獲取用戶失敗"
msgid "Please login with a password and then bind the WeCom"
msgstr "請使用密碼登錄,然後綁定企業微信"
#: common/api/action.py:68
#: common/api/action.py:80
msgid "Request file format may be wrong"
msgstr "上傳的檔案格式錯誤 或 其它類型資源的文件"
@ -5372,7 +5393,7 @@ msgstr ""
msgid "App Labels"
msgstr "標籤管理"
#: labels/models.py:15 settings/serializers/security.py:211
#: labels/models.py:15
msgid "Color"
msgstr "顏色"
@ -5430,16 +5451,16 @@ msgid ""
" work orders, and other notifications"
msgstr "系統某些告警、工單等需要發送站內信時執行該任務"
#: ops/ansible/inventory.py:135 ops/ansible/inventory.py:205
#: ops/ansible/inventory.py:136 ops/ansible/inventory.py:206
#: ops/models/job.py:69
msgid "No account available"
msgstr "無可用帳號"
#: ops/ansible/inventory.py:326 ops/ansible/inventory.py:368
#: ops/ansible/inventory.py:327 ops/ansible/inventory.py:369
msgid "Ansible disabled"
msgstr "Ansible 已禁用"
#: ops/ansible/inventory.py:384
#: ops/ansible/inventory.py:385
msgid "Skip hosts below:"
msgstr "跳過以下主機: "
@ -5455,34 +5476,38 @@ msgstr "任務 {} 不存在"
msgid "Task {} args or kwargs error"
msgstr "任務 {} 執行參數錯誤"
#: ops/api/job.py:70
#: ops/api/job.py:65
msgid "Login to asset {}({}) is rejected by login asset ACL ({})"
msgstr ""
#: ops/api/job.py:88
#, 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:71
#: ops/api/job.py:89
#, python-brace-format
msgid "Asset ({asset}) authorization is missing SSH, SFTP, or WinRM protocol"
msgstr "资产({asset})授权缺少ssh,sftp或winrm协议"
#: ops/api/job.py:72
#: ops/api/job.py:90
#, python-brace-format
msgid "Asset ({asset}) authorization lacks upload permissions"
msgstr "资产({asset})授权缺少上传权限"
#: ops/api/job.py:160
#: ops/api/job.py:185
msgid "Duplicate file exists"
msgstr "存在同名文件"
#: ops/api/job.py:165
#: ops/api/job.py:190
#, python-brace-format
msgid ""
"File size exceeds maximum limit. Please select a file smaller than {limit}MB"
msgstr "檔案大小超過最大限制。請選擇小於 {limit}MB 的文件。"
#: ops/api/job.py:238
#: ops/api/job.py:273
msgid ""
"The task is being created and cannot be interrupted. Please try again later."
msgstr "正在創建任務,無法中斷,請稍後重試。"
@ -5789,7 +5814,7 @@ msgstr "Material"
msgid "Material Type"
msgstr "Material 類型"
#: ops/models/job.py:561
#: ops/models/job.py:581
msgid "Job Execution"
msgstr "作業執行"
@ -7314,40 +7339,40 @@ msgid "Period clean"
msgstr "定時清掃"
#: settings/serializers/cleaning.py:15
msgid "Login log retention days (day)"
msgstr "登入記錄 (天)"
msgid "Login log retention days"
msgstr "登入日誌保留天數"
#: settings/serializers/cleaning.py:19
msgid "Task log retention days (day)"
msgstr "工作紀錄 (天)"
msgid "Task log retention days"
msgstr "任務日誌保留天數"
#: settings/serializers/cleaning.py:23
msgid "Operate log retention days (day)"
msgstr "Action日誌 (天)"
msgid "Operate log retention days"
msgstr "操作日誌保留天數"
#: settings/serializers/cleaning.py:27
msgid "password change log keep days (day)"
msgstr "改密日誌 (天)"
msgid "Password change log retention days"
msgstr "用戶改密日誌保留天數"
#: settings/serializers/cleaning.py:31
msgid "FTP log retention days (day)"
msgstr "上傳下載 (天)"
msgid "FTP log retention days"
msgstr "上傳下載記錄保留天數"
#: settings/serializers/cleaning.py:35
msgid "Cloud sync task history retention days (day)"
msgstr "雲端同步紀錄 (天)"
msgid "Cloud sync task history retention days"
msgstr "雲同步記錄保留天數"
#: settings/serializers/cleaning.py:39
msgid "job execution retention days (day)"
msgstr "作業中心執行歷史 (天)"
msgid "job execution retention days"
msgstr "作業執行歷史保留天數"
#: settings/serializers/cleaning.py:43
msgid "Activity log retention days (day)"
msgstr "活動紀錄 (天)"
msgid "Activity log retention days"
msgstr "活動記錄保留天數"
#: settings/serializers/cleaning.py:46
msgid "Session log retention days (day)"
msgstr "會話日誌 (天)"
msgid "Session log retention days"
msgstr "會話日誌保留天數"
#: settings/serializers/cleaning.py:48
msgid ""
@ -7356,8 +7381,8 @@ msgid ""
msgstr "會話、錄影,命令記錄超過該時長將會被清除 (影響資料庫儲存OSS 等不受影響)"
#: settings/serializers/cleaning.py:53
msgid "Change secret and push record retention days (day)"
msgstr "改密推送記錄保留天數 (天)"
msgid "Change secret and push record retention days"
msgstr "帳號改密推送記錄保留天數"
#: settings/serializers/feature.py:23 settings/serializers/msg.py:69
msgid "Subject"
@ -7820,28 +7845,32 @@ msgid "Watermark"
msgstr "開啟浮水印"
#: settings/serializers/security.py:205
msgid "Watermark session content"
msgid "Session content"
msgstr "會話水印自訂內容"
#: settings/serializers/security.py:208
msgid "Watermark console content"
msgid "Console content"
msgstr "管理頁面水印自訂內容"
#: settings/serializers/security.py:211
msgid "Font color"
msgstr "字體顏色"
#: settings/serializers/security.py:214
msgid "Watermark font size"
msgstr "字體字號"
msgid "Font size"
msgstr "字體大小 (px)"
#: settings/serializers/security.py:217
msgid "Watermark height"
msgstr "單個水印高度"
msgid "Height"
msgstr "高度 (px)"
#: settings/serializers/security.py:220
msgid "Watermark width"
msgstr "單個水印寬度"
msgid "Width"
msgstr "寬度 (px)"
#: settings/serializers/security.py:223
msgid "Watermark rotate"
msgstr "水印旋轉角度"
msgid "Rotate"
msgstr "旋轉 (度)"
#: settings/serializers/security.py:227
msgid "Max idle time (minute)"
@ -8135,15 +8164,15 @@ msgstr "認證失敗: (未知): {}"
msgid "Authentication success: {}"
msgstr "認證成功: {}"
#: settings/ws.py:226
#: settings/ws.py:228
msgid "No LDAP user was found"
msgstr "沒有取得到 LDAP 用戶"
#: settings/ws.py:235
#: settings/ws.py:237
msgid "Total {}, success {}, failure {}"
msgstr "總共 {},成功 {},失敗 {}"
#: settings/ws.py:239
#: settings/ws.py:241
msgid ", disabled {}"
msgstr ",禁用 {}"
@ -11229,6 +11258,12 @@ msgstr "華東-宿遷"
msgid "Port \"%(port)s\" of instance IP \"%(ip)s\" is not reachable"
msgstr "The port%(port)s of Instance IP %(ip)s is inaccessible."
#: xpack/plugins/cloud/providers/scp.py:108
#, fuzzy
#| msgid "empty"
msgid "Empty"
msgstr "空"
#: xpack/plugins/cloud/serializers/account.py:104
msgid "Validity display"
msgstr "有效性顯示"
@ -11397,25 +11432,3 @@ msgstr "許可證匯入成功"
#: xpack/plugins/license/api.py:53
msgid "Invalid license"
msgstr "許可證無效"
#, fuzzy
#~ msgid "Themes"
#~ msgstr "主題"
#, fuzzy
#~ msgid "domain_name"
#~ msgstr "域名稱"
#~ msgid "Task execution id"
#~ msgstr "任務執行 ID"
#~ msgid "Respectful"
#~ 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 "你好! 以下是資產改密或推送帳戶失敗的情況。 請及時檢查並處理。"
#~ msgid "EXCHANGE"
#~ msgstr "EXCHANGE"

View File

@ -9,7 +9,7 @@
"ActionPerm": "Разрешения на действия",
"Address": "Адрес",
"AlreadyExistsPleaseRename": "Файл уже существует, пожалуйста, переименуйте его",
"Announcement: ": "Объявление:",
"Announcement: ": "Объявление: ",
"Authentication failed": "Ошибка аутентификации: неверное имя пользователя или пароль",
"AvailableShortcutKey": "Доступные горячие клавиши",
"Back": "Назад",

View File

@ -121,7 +121,7 @@
"AppletHelpText": "In the upload process, if the application does not exist, create the application; if it exists, update the application.",
"AppletHostCreate": "Add RemoteApp machine",
"AppletHostDetail": "RemoteApp machine",
"AppletHostSelectHelpMessage": "When connecting to an asset, the selection of the application publishing machine is random (but the last used one is preferred). if you want to assign a specific publishing machine to an asset, you can tag it as [publishing machine: publishing machine name] or [AppletHost: publishing machine name]; <br>when selecting an account for the publishing machine, the following situations will choose the user's own <b>account with the same name or proprietary account (starting with js)</b>, otherwise use a public account (starting with jms):<br>&nbsp; 1. both the publishing machine and application support concurrent;<br>&nbsp; 2. the publishing machine supports concurrent, but the application does not, and the current application does not use a proprietary account;<br>&nbsp; 3. the publishing machine does not support concurrent, the application either supports or does not support concurrent, and no application uses a proprietary account;<br> note: whether the application supports concurrent connections is decided by the developer, and whether the host supports concurrent connections is decided by the single user single session setting in the publishing machine configuration",
"AppletHostSelectHelpMessage": "When connecting to an asset, the selection of the application publishing machine is random (but the last used one is preferred). if you want to assign a specific publishing machine to an asset, you can tag it as [发布机: publishing machine name] [AppletHost: publishing machine name] [仅发布机: publishing machine name] [AppletHostOnly: publishing machine name]; <br>when selecting an account for the publishing machine, the following situations will choose the user's own <b>account with the same name or proprietary account (starting with js)</b>, otherwise use a public account (starting with jms):<br>&nbsp; 1. both the publishing machine and application support concurrent;<br>&nbsp; 2. the publishing machine supports concurrent, but the application does not, and the current application does not use a proprietary account;<br>&nbsp; 3. the publishing machine does not support concurrent, the application either supports or does not support concurrent, and no application uses a proprietary account;<br> note: whether the application supports concurrent connections is decided by the developer, and whether the host supports concurrent connections is decided by the single user single session setting in the publishing machine configuration",
"AppletHostUpdate": "Update the remote app publishing machine",
"AppletHostZoneHelpText": "This domain belongs to the system organization",
"AppletHosts": "RemoteApp machine",
@ -199,7 +199,7 @@
"AuditsDashboard": "Audits dashboard",
"Auth": "Authentication",
"AuthConfig": "Authentication",
"AuthIntegration": "AuthIntegration",
"AuthIntegration": "Auth Integration",
"AuthLimit": "Login restriction",
"AuthSAMLCertHelpText": "Save after uploading the certificate key, then view sp metadata",
"AuthSAMLKeyHelpText": "Sp certificates and keys are used for encrypted communication with idp",
@ -773,6 +773,7 @@
"LdapBulkImport": "User import",
"LdapConnectTest": "Test connection",
"LdapLoginTest": "Test login",
"LeakPasswordList": "Leaked password list",
"LeakedPassword": "Leaked password",
"Length": "Length",
"LessEqualThan": "Less than or equal to",
@ -1024,6 +1025,7 @@
"PleaseAgreeToTheTerms": "Please agree to the terms",
"PleaseEnterReason": "Please enter a reason",
"PleaseSelect": "Please select ",
"PleaseSelectAssetOrNode": "Please select at least one asset or node",
"PleaseSelectTheDataYouWantToCheck": "Please select the data you want to check",
"PolicyName": "Policy name",
"Port": "Port",
@ -1619,12 +1621,17 @@
"assetAddress": "Asset address",
"assetId": "Asset ID",
"assetName": "Asset name",
"clickToAdd": "Click to add",
"currentTime": "Current time",
"description": "No data yet",
"disallowSelfUpdateFields": "Not allowed to modify the current fields yourself",
"forceEnableMFAHelpText": "If force enable, user can not disable by themselves",
"isConsoleCanUse": "is Console page can use",
"overwriteProtocolsAndPortsMsg": "This operation will overwrite the protocols and ports of the selected assets. Are you sure you want to continue?",
"pleaseSelectAssets": "Please select assets",
"removeWarningMsg": "Are you sure you want to remove",
"selectFiles": "Selected {number} files",
"selectedAssets": "Selected assets",
"setVariable": "Set variable",
"userId": "User ID",
"userName": "User name"

View File

@ -1028,6 +1028,7 @@
"PleaseAgreeToTheTerms": "Por favor, acepte los términos",
"PleaseEnterReason": "Por favor, introduzca el motivo",
"PleaseSelect": "Por favor seleccione",
"PleaseSelectAssetOrNode": "Por favor, seleccione un activo o nodo",
"PleaseSelectTheDataYouWantToCheck": "Por favor, seleccione los datos que necesita marcar.",
"PolicyName": "Nombre de la estrategia",
"Port": "Puerto",
@ -1628,13 +1629,17 @@
"assetAddress": "Dirección de activo",
"assetId": "ID de activo",
"assetName": "Nombre de activo",
"clickToAdd": "Haga clic en agregar",
"currentTime": "Hora actual",
"description": "Sin datos disponibles.",
"disallowSelfUpdateFields": "No se permite modificar el campo actual.",
"forceEnableMFAHelpText": "Si se habilita forzosamente, el usuario no podrá desactivarlo por sí mismo",
"isConsoleCanUse": "¿Está disponible la página de gestión?< -SEP->Agregar puerta de enlace al dominio",
"name": "Nombre de usuario",
"overwriteProtocolsAndPortsMsg": "Esta acción reemplazará todos los protocolos y puertos, ¿continuar?",
"pleaseSelectAssets": "Por favor, seleccione un activo.",
"removeWarningMsg": "¿Está seguro de que desea eliminar?",
"selectedAssets": "Activos seleccionados",
"setVariable": "configurar parámetros",
"userId": "ID de usuario",
"userName": "Nombre de usuario"

View File

@ -1033,6 +1033,7 @@
"PleaseAgreeToTheTerms": "規約に同意してください",
"PleaseEnterReason": "理由を入力してください",
"PleaseSelect": "選択してくださ",
"PleaseSelectAssetOrNode": "資産またはノードを選択してください",
"PleaseSelectTheDataYouWantToCheck": "選択するデータをチェックしてください",
"PolicyName": "ポリシー名称",
"Port": "ポート",
@ -1633,13 +1634,17 @@
"assetAddress": "資産アドレス",
"assetId": "資産ID",
"assetName": "資産名",
"clickToAdd": "追加をクリック",
"currentTime": "現在の時間",
"description": "データはありません。",
"disallowSelfUpdateFields": "現在のフィールドを自分で変更することは許可されていません",
"forceEnableMFAHelpText": "強制的に有効化すると、ユーザーは自分で無効化することができません。",
"isConsoleCanUse": "管理ページの利用可能性",
"name": "ユーザー名",
"overwriteProtocolsAndPortsMsg": "この操作はすべてのプロトコルとポートを上書きしますが、続行してよろしいですか?",
"pleaseSelectAssets": "資産を選択してください",
"removeWarningMsg": "削除してもよろしいですか",
"selectedAssets": "選択した資産",
"setVariable": "パラメータ設定",
"userId": "ユーザーID",
"userName": "ユーザー名"

View File

@ -1028,6 +1028,7 @@
"PleaseAgreeToTheTerms": "약관 동의 부탁드립니다",
"PleaseEnterReason": "이유를 입력하세요",
"PleaseSelect": "선택해주세요",
"PleaseSelectAssetOrNode": "자산 또는 노드를 선택해 주세요",
"PleaseSelectTheDataYouWantToCheck": "선택할 데이터를 선택해 주십시오.",
"PolicyName": "전략 이름",
"Port": "포트",
@ -1628,13 +1629,17 @@
"assetAddress": "자산 주소",
"assetId": "자산 ID",
"assetName": "자산 이름",
"clickToAdd": "추가를 클릭해 주세요",
"currentTime": "현재 시간",
"description": "데이터가 없습니다.",
"disallowSelfUpdateFields": "현재 필드를 스스로 수정할 수 없음",
"forceEnableMFAHelpText": "강제로 활성화하면 사용자가 스스로 비활성화할 수 없음",
"isConsoleCanUse": "관리 페이지 사용 가능 여부",
"name": "사용자 이름",
"overwriteProtocolsAndPortsMsg": "이 작업은 모든 프로토콜과 포트를 덮어씌우게 됩니다. 계속하시겠습니까?",
"pleaseSelectAssets": "자산을 선택해 주세요",
"removeWarningMsg": "제거할 것인지 확실합니까?",
"selectedAssets": "선택한 자산",
"setVariable": "설정 매개변수",
"userId": "사용자 ID",
"userName": "사용자명"

View File

@ -1029,6 +1029,7 @@
"PleaseAgreeToTheTerms": "Por favor, concorde com os termos",
"PleaseEnterReason": "Por favor, insira o motivo",
"PleaseSelect": "Por favor, selecione",
"PleaseSelectAssetOrNode": "Por favor, selecione um ativo ou nó",
"PleaseSelectTheDataYouWantToCheck": "Por favor, selecione os dados que deseja marcar.",
"PolicyName": "Nome da Política",
"Port": "Porta",
@ -1629,13 +1630,17 @@
"assetAddress": "Endereço do ativo",
"assetId": "ID do ativo",
"assetName": "Nome do ativo",
"clickToAdd": "Clique para adicionar",
"currentTime": "Hora atual",
"description": "Nenhum dado disponível.",
"disallowSelfUpdateFields": "Não é permitido alterar o campo atual",
"forceEnableMFAHelpText": "Se for habilitado forçosamente, o usuário não pode desativar por conta própria",
"isConsoleCanUse": "Se a página de gerenciamento está disponível",
"name": "Nome de usuário",
"overwriteProtocolsAndPortsMsg": "Esta ação substituirá todos os protocolos e portas. Deseja continuar?",
"pleaseSelectAssets": "Por favor, selecione um ativo.",
"removeWarningMsg": "Tem certeza de que deseja remover",
"selectedAssets": "Ativos selecionados",
"setVariable": "Parâmetros de configuração",
"userId": "ID do usuário",
"userName": "Usuário"

View File

@ -122,7 +122,7 @@
"AppletHelpText": "В процессе загрузки, если приложение отсутствует, оно будет создано; если уже существует, будет выполнено обновление.",
"AppletHostCreate": "Добавить сервер RemoteApp",
"AppletHostDetail": "Подробности о хосте RemoteApp",
"AppletHostSelectHelpMessage": "При подключении к активу выбор машины публикации приложения происходит случайным образом (но предпочтение отдается последней использованной). Если вы хотите назначить активу определенную машину, вы можете использовать следующие теги: [publishing machine: имя машины публикации] или [AppletHost: имя машины публикации]; <br>при выборе учетной записи для машины публикации в следующих ситуациях будет выбрана собственная <b>учетная запись пользователя с тем же именем или собственная учетная запись (начинающаяся с js)</b>, в противном случае будет использоваться публичная учетная запись (начинающаяся с jms):<br>&nbsp; 1. И машина публикации, и приложение поддерживают одновременные подключения; <br>&nbsp; 2. Машина публикации поддерживает одновременные подключения, а приложение — нет, и текущее приложение не использует специализированную учетную запись; <br>&nbsp; 3. Машина публикации не поддерживает одновременные подключения, а приложение может как поддерживать, так и не поддерживать одновременные подключения, и ни одно приложение не использует специализированную учетную запись; <br> Примечание: поддержка одновременных подключений со стороны приложения определяется разработчиком, а поддержка одновременных подключений со стороны хоста определяется настройкой «один пользователь — одна сессия» в конфигурации машины публикации.",
"AppletHostSelectHelpMessage": "При подключении к активу выбор сервера публикации приложения происходит случайным образом (но предпочтение отдается последнему использованному).<br>\nЕсли необходимо закрепить сервер публикации за конкретным активом, можно указать один из тегов:\n[AppletHost:имя_сервера], [AppletHostOnly:имя_сервера].<br>\nПри подключении к выбранному серверу публикации и выборе учётной записи применяются следующие правила:<br>\nв перечисленных ниже случаях будет использована <b>учетная запись пользователя с тем же именем</b> или <b>специальная учётная запись (начинающаяся с js)</b>,<br>\nв противном случае будет использоваться общая учётная запись (начинающаяся с jms)<br>\n1. И сервер публикации, и приложение поддерживают одновременные подключения;<br>\n2. Сервер публикации поддерживает одновременные подключения, а приложение — нет, и текущее приложение не использует специальную учётную запись;<br>\n3. Сервер публикации не поддерживает одновременные подключения, а приложение может как поддерживать, так и не поддерживать одновременные подключения, и ни одно приложение не использует специализированную учетную запись;<br>\n\nПримечание: поддержка одновременных подключений со стороны приложения определяется разработчиком,<br>\nа поддержка одновременных подключений со стороны хоста определяется настройкой «один пользователь — одна сессия» в настройках сервера публикации.",
"AppletHostUpdate": "Обновить машину публикации RemoteApp",
"AppletHostZoneHelpText": "Эта зона принадлежит Системной организации",
"AppletHosts": "Хост RemoteApp",
@ -447,10 +447,10 @@
"DangerCommand": "Опасная команда",
"DangerousCommandNum": "Всего опасных команд",
"Dashboard": "Панель инструментов",
"DataMasking": "Демаскировка данных",
"DataMaskingFieldsPatternHelpTip": "Поддержка нескольких имен полей, разделенных запятой, поддержка подстановочных знаков *\nНапример:\nОдно имя поля: password означает, что будет проведено действие по хранению в тайне поля password.\nНесколько имен полей: password, secret означает сохранение в тайне полей password и secret.\nПодстановочный знак *: password* означает, что действие будет применено к полям, содержащим префикс password.\nПодстановочный знак *: .*password означает, что действие будет применено к полям, содержащим суффикс password.",
"DataMaskingRuleHelpHelpMsg": "При подключении к базе данных активов результаты запроса могут быть обработаны в соответствии с этим правилом для обеспечения безопасности данных.",
"DataMaskingRuleHelpHelpText": "При подключении к базе данных активов можно обезопасить результаты запроса в соответствии с данным правилом.",
"DataMasking": "Маскирование данных",
"DataMaskingFieldsPatternHelpTip": "Поддерживается нескольких имён полей, разделённых запятыми, а также использование подстановочного знака *.\nПримеры:\nОдно имя поля: password — выполняется маскирование только поля password.\nНесколько имён полей: password,secret — выполняется маскирование полей password и secret.\nПодстановочный знак *: password* — выполняется маскирование всех полей, имя которых начинается с password.\nПодстановочный знак .*: .*password — выполняется маскирование всех полей, имя которых оканчивается на password",
"DataMaskingRuleHelpHelpMsg": "При подключении к активу базы данных результаты запросов могут быть подвергнуты маскированию в соответствии с этим правилом",
"DataMaskingRuleHelpHelpText": "При подключении к активу базы данных можно выполнять маскирование результатов запросов в соответствии с этим правилом",
"Database": "База данных",
"DatabaseCreate": "Создать актив - база данных",
"DatabasePort": "Порт протокола базы данных",
@ -491,7 +491,7 @@
"DeleteOrgMsg": "Пользователь, Группа пользователей, Актив, Папка, Тег, Зона, Разрешение",
"DeleteOrgTitle": "Пожалуйста, сначала удалите следующие ресурсы в организации",
"DeleteReleasedAssets": "Удалить освобожденные активы",
"DeleteRemoteAccount": "Удалить удаленный аккаунт",
"DeleteRemoteAccount": "Удалить УЗ на активе",
"DeleteSelected": "Удалить выбранное",
"DeleteSuccess": "Успешно удалено",
"DeleteSuccessMsg": "Успешно удалено",
@ -729,7 +729,7 @@
"InstanceName": "Название экземпляра",
"InstanceNamePartIp": "Название экземпляра и часть IP",
"InstancePlatformName": "Название платформы экземпляра",
"Integration": "Интеграция приложений",
"Integration": "Интеграция",
"Interface": "Сетевой интерфейс",
"InterfaceSettings": "Настройки интерфейса",
"Interval": "Интервал",
@ -1028,6 +1028,7 @@
"PleaseAgreeToTheTerms": "Пожалуйста, согласитесь с условиями",
"PleaseEnterReason": "Введите причину",
"PleaseSelect": "Пожалуйста, выберите ",
"PleaseSelectAssetOrNode": "Пожалуйста, выберите актив или узел.",
"PleaseSelectTheDataYouWantToCheck": "Пожалуйста, выберите данные, которые нужно отметить",
"PolicyName": "Название политики",
"Port": "Порт",
@ -1045,7 +1046,7 @@
"PrivilegedOnly": "Только привилегированные",
"PrivilegedTemplate": "Привилегированные",
"Processing": "В процессе",
"ProcessingMessage": "Задача в процессе, пожалуйста, подождите ⏳",
"ProcessingMessage": "Задача выполняется, пожалуйста, подождите ⏳",
"Product": "Продукт",
"ProfileSetting": "Данные профиля",
"Project": "Название проекта",
@ -1117,7 +1118,7 @@
"RelevantCommand": "Команда",
"RelevantSystemUser": "Системный пользователь",
"RemoteAddr": "Удалённый адрес",
"RemoteAssetFoundAccountDeleteMsg": "Удалить аккаунты, обнаруженные с удалённых активов",
"RemoteAssetFoundAccountDeleteMsg": "Удалить УЗ, обнаруженные на удалённых активах",
"RemoteLoginProtocolUsageDistribution": "Распределение протоколов входа в активы",
"Remove": "Удалить",
"RemoveAssetFromNode": "Удалить активы из папки",
@ -1628,13 +1629,17 @@
"assetAddress": "Адрес актива",
"assetId": "ID актива",
"assetName": "Название актива",
"clickToAdd": "Нажмите, чтобы добавить",
"currentTime": "Текущее время",
"description": "Нет данных",
"disallowSelfUpdateFields": "Не разрешено самостоятельно изменять текущие поля.",
"forceEnableMFAHelpText": "При принудительном включении пользователь не может отключить самостоятельно",
"isConsoleCanUse": "Доступна ли Консоль",
"name": "Имя пользователя",
"overwriteProtocolsAndPortsMsg": "Это действие заменит все протоколы и порты. Продолжить?",
"pleaseSelectAssets": "Пожалуйста, выберите актив",
"removeWarningMsg": "Вы уверены, что хотите удалить",
"selectedAssets": "Выбранные активы",
"setVariable": "Задать переменную",
"userId": "ID пользователя",
"userName": "Имя пользователя"

View File

@ -1028,6 +1028,7 @@
"PleaseAgreeToTheTerms": "Vui lòng đồng ý với các điều khoản",
"PleaseEnterReason": "Vui lòng nhập lý do",
"PleaseSelect": "Vui lòng chọn",
"PleaseSelectAssetOrNode": "Vui lòng chọn tài sản hoặc nút",
"PleaseSelectTheDataYouWantToCheck": "Vui lòng chọn dữ liệu cần đánh dấu",
"PolicyName": "Tên chính sách",
"Port": "Cổng",
@ -1628,13 +1629,17 @@
"assetAddress": "Địa chỉ tài sản",
"assetId": "ID tài sản",
"assetName": "Tên tài sản",
"clickToAdd": "Nhấp để thêm",
"currentTime": "Thời gian hiện tại",
"description": "Chưa có dữ liệu.",
"disallowSelfUpdateFields": "Không cho phép tự chỉnh sửa trường hiện tại",
"forceEnableMFAHelpText": "Nếu buộc kích hoạt, người dùng sẽ không thể tự động vô hiệu hóa",
"isConsoleCanUse": "Trang quản lý có khả dụng không",
"name": "Tên người dùng",
"overwriteProtocolsAndPortsMsg": "Hành động này sẽ ghi đè lên tất cả các giao thức và cổng, có tiếp tục không?",
"pleaseSelectAssets": "Vui lòng chọn tài sản.",
"removeWarningMsg": "Bạn có chắc chắn muốn xóa bỏ?",
"selectedAssets": "Tài sản đã chọn",
"setVariable": "Cài đặt tham số",
"userId": "ID người dùng",
"userName": "Tên người dùng"

View File

@ -122,7 +122,7 @@
"AppletHelpText": "在上传过程中,如果应用不存在,则创建该应用;如果已存在,则进行应用更新。",
"AppletHostCreate": "添加远程应用发布机",
"AppletHostDetail": "远程应用发布机详情",
"AppletHostSelectHelpMessage": "连接资产时,应用发布机选择是随机的(但优先选择上次使用的),如果想为某个资产固定发布机,可以指定标签 <发布机:发布机名称> 或 <AppletHost:发布机名称>; <br>连接该发布机选择账号时,以下情况会选择用户的 <b>同名账号 或 专有账号(js开头)</b>,否则使用公用账号(jms开头)<br>&nbsp; 1. 发布机和应用都支持并发; <br>&nbsp; 2. 发布机支持并发,应用不支持并发,当前应用没有使用专有账号; <br>&nbsp; 3. 发布机不支持并发,应用支持并发或不支持,没有任一应用使用专有账号; <br> 注意: 应用支不支持并发是开发者决定,主机支不支持是发布机配置中的 单用户单会话决定",
"AppletHostSelectHelpMessage": "连接资产时,应用发布机选择是随机的(但优先选择上次使用的),如果想为某个资产固定发布机,可以指定标签 <发布机:发布机名称>、<AppletHost:发布机名称>、<仅发布机:发布机名称>、 <AppletHostOnly:发布机名称>; <br>连接该发布机选择账号时,以下情况会选择用户的 <b>同名账号 或 专有账号(js开头)</b>,否则使用公用账号(jms开头)<br>&nbsp; 1. 发布机和应用都支持并发; <br>&nbsp; 2. 发布机支持并发,应用不支持并发,当前应用没有使用专有账号; <br>&nbsp; 3. 发布机不支持并发,应用支持并发或不支持,没有任一应用使用专有账号; <br> 注意: 应用支不支持并发是开发者决定,主机支不支持是发布机配置中的 单用户单会话决定",
"AppletHostUpdate": "更新远程应用发布机",
"AppletHostZoneHelpText": "这里的网域属于 System 组织",
"AppletHosts": "应用发布机",
@ -729,7 +729,7 @@
"InstanceName": "实例名称",
"InstanceNamePartIp": "实例名称和部分IP",
"InstancePlatformName": "实例平台名称",
"Integration": "应用集成",
"Integration": "集成",
"Interface": "网络接口",
"InterfaceSettings": "界面设置",
"Interval": "间隔",
@ -1028,6 +1028,7 @@
"PleaseAgreeToTheTerms": "请同意条款",
"PleaseEnterReason": "请输入原因",
"PleaseSelect": "请选择",
"PleaseSelectAssetOrNode": "请选择资产或节点",
"PleaseSelectTheDataYouWantToCheck": "请选择需要勾选的数据",
"PolicyName": "策略名称",
"Port": "端口",
@ -1628,14 +1629,20 @@
"assetAddress": "资产地址",
"assetId": "资产 ID",
"assetName": "资产名称",
"clickToAdd": "点击添加",
"currentTime": "当前时间",
"description": "暂无数据",
"disallowSelfUpdateFields": "不允许自己修改当前字段",
"forceEnableMFAHelpText": "如果强制启用,用户无法自行禁用",
"isConsoleCanUse": "管理页面是否可用",
"name": "用户名称",
"overwriteProtocolsAndPortsMsg": "此操作将覆盖所有协议和端口,是否继续?",
"pleaseSelectAssets": "请选择资产",
"removeWarningMsg": "你确定要移除",
"selectedAssets": "已选资产",
"setVariable": "设置参数",
"userId": "用户ID",
"userName": "用户名"
"userName": "用户名",
"Risk": "风险",
"selectFiles": "已选择选择{number}文件"
}

View File

@ -1033,6 +1033,7 @@
"PleaseAgreeToTheTerms": "請同意條款",
"PleaseEnterReason": "請輸入原因",
"PleaseSelect": "請選擇",
"PleaseSelectAssetOrNode": "請選擇資產或節點",
"PleaseSelectTheDataYouWantToCheck": "請選擇需要勾選的數據",
"PolicyName": "策略名稱",
"Port": "端口",
@ -1633,13 +1634,17 @@
"assetAddress": "資產地址",
"assetId": "資產 ID",
"assetName": "資產名稱",
"clickToAdd": "點擊添加",
"currentTime": "當前時間",
"description": "目前沒有數據。",
"disallowSelfUpdateFields": "不允許自己修改當前欄位",
"forceEnableMFAHelpText": "如果強制啟用,用戶無法自行禁用",
"isConsoleCanUse": "管理頁面是否可用",
"name": "用戶名稱",
"overwriteProtocolsAndPortsMsg": "此操作將覆蓋所有協議和端口,是否繼續?",
"pleaseSelectAssets": "請選擇資產",
"removeWarningMsg": "你確定要移除",
"selectedAssets": "已選資產",
"setVariable": "設置參數",
"userId": "用戶ID",
"userName": "用戶名"

View File

@ -86,7 +86,7 @@
"Expand all asset": "Развернуть все активы в папке",
"Expire time": "Срок действия",
"ExpiredTime": "Срок действия",
"Face Verify": "Проверка лица",
"Face Verify": "Проверка по лицу",
"Face online required": "Для входа требуется верификация по лицу и мониторинг. Продолжить?",
"Face verify": "Распознавание лица",
"Face verify required": "Для входа требуется верификация по лицу. Продолжить?",
@ -107,7 +107,7 @@
"GUI": "Графический интерфейс",
"General": "Основные настройки",
"Go to Settings": "Перейти в настройки",
"Go to profile": "Перейти к личной информации",
"Go to profile": "Перейти в профиль",
"Help": "Помощь",
"Help or download": "Помощь → Скачать",
"Help text": "Описание",
@ -151,7 +151,7 @@
"No": "Нет",
"No account available": "Нет доступных учетных записей",
"No available connect method": "Нет доступного метода подключения",
"No facial features": "Нет характеристик лица, пожалуйста, перейдите в личную инфрмацию для привязки",
"No facial features": "Данные лица отсутствуют. Пожалуйста, перейдите на страницу личной информации, чтобы привязать их. ",
"No matching found": "Совпадений не найдено",
"No permission": "Нет разрешений",
"No protocol available": "Нет доступных протоколов",

View File

@ -1,6 +1,6 @@
from collections import defaultdict
from django.db.models import Count, Max, F, CharField
from django.db.models import Count, Max, F, CharField, Q
from django.db.models.functions import Cast
from django.http.response import JsonResponse
from django.utils import timezone
@ -18,8 +18,8 @@ from common.utils import lazyproperty
from common.utils.timezone import local_now, local_zero_hour
from ops.const import JobStatus
from orgs.caches import OrgResourceStatisticsCache
from orgs.utils import current_org
from terminal.const import RiskLevelChoices
from orgs.utils import current_org, filter_org_queryset
from terminal.const import RiskLevelChoices, CommandStorageType
from terminal.models import Session, CommandStorage
__all__ = ['IndexApi']
@ -123,15 +123,18 @@ class DateTimeMixin:
return self.get_logs_queryset_filter(qs, 'date_start')
@lazyproperty
def command_queryset_list(self):
def command_type_queryset_list(self):
qs_list = []
for storage in CommandStorage.objects.all():
for storage in CommandStorage.objects.exclude(name='null'):
if not storage.is_valid():
continue
qs = storage.get_command_queryset()
qs_list.append(self.get_logs_queryset_filter(
qs = filter_org_queryset(qs)
qs = self.get_logs_queryset_filter(
qs, 'timestamp', is_timestamp=True
))
)
qs_list.append((storage.type, qs))
return qs_list
@lazyproperty
@ -143,7 +146,7 @@ class DateTimeMixin:
class DatesLoginMetricMixin:
dates_list: list
date_start_end: tuple
command_queryset_list: list
command_type_queryset_list: list
sessions_queryset: Session.objects
ftp_logs_queryset: FTPLog.objects
job_logs_queryset: JobLog.objects
@ -261,11 +264,25 @@ class DatesLoginMetricMixin:
@lazyproperty
def command_statistics(self):
def _count_pair(_tp, _qs):
if _tp == CommandStorageType.es:
total = _qs.count(limit_to_max_result_window=False)
danger = _qs.filter(risk_level=RiskLevelChoices.reject) \
.count(limit_to_max_result_window=False)
return total, danger
agg = _qs.aggregate(
total=Count('pk'),
danger=Count('pk', filter=Q(risk_level=RiskLevelChoices.reject)),
)
return (agg['total'] or 0), (agg['danger'] or 0)
total_amount = 0
danger_amount = 0
for qs in self.command_queryset_list:
total_amount += qs.count()
danger_amount += qs.filter(risk_level=RiskLevelChoices.reject).count()
for tp, qs in self.command_type_queryset_list:
t, d = _count_pair(tp, qs)
total_amount += t
danger_amount += d
return total_amount, danger_amount
@lazyproperty

View File

@ -729,6 +729,12 @@ class Config(dict):
'LOKI_BASE_URL': 'http://loki:3100',
'TOOL_USER_ENABLED': False,
# Suggestion api
'SUGGESTION_LIMIT': 10,
# MCP
'MCP_ENABLED': False,
}
old_config_map = {

View File

@ -267,9 +267,17 @@ DATABASES = {
DB_USE_SSL = CONFIG.DB_USE_SSL
if DB_ENGINE == 'mysql':
DB_OPTIONS['init_command'] = "SET sql_mode='STRICT_TRANS_TABLES'"
if DB_USE_SSL:
DB_CA_PATH = exist_or_default(os.path.join(CERTS_DIR, 'db_ca.pem'), None)
DB_OPTIONS['ssl'] = {'ca': DB_CA_PATH}
if DB_USE_SSL:
DB_CA_PATH = exist_or_default(os.path.join(CERTS_DIR, 'db_ca.pem'), None)
if DB_ENGINE == 'mysql':
DB_OPTIONS['ssl'] = {'ca': DB_CA_PATH }
elif DB_ENGINE == 'postgresql':
DB_OPTIONS.update({
'sslmode': 'require',
'sslrootcert': DB_CA_PATH,
})
# Password validation
# https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators

View File

@ -266,3 +266,6 @@ LOKI_LOG_ENABLED = CONFIG.LOKI_LOG_ENABLED
LOKI_BASE_URL = CONFIG.LOKI_BASE_URL
TOOL_USER_ENABLED = CONFIG.TOOL_USER_ENABLED
SUGGESTION_LIMIT = CONFIG.SUGGESTION_LIMIT
MCP_ENABLED = CONFIG.MCP_ENABLED

View File

@ -38,12 +38,12 @@ REST_FRAMEWORK = {
),
'DEFAULT_FILTER_BACKENDS': (
'django_filters.rest_framework.DjangoFilterBackend',
'rest_framework.filters.SearchFilter',
'common.drf.filters.SearchFilter',
'common.drf.filters.RewriteOrderingFilter',
),
'DEFAULT_METADATA_CLASS': 'common.drf.metadata.SimpleMetadataWithFilters',
'ORDERING_PARAM': "order",
'SEARCH_PARAM': "search",
'SEARCH_PARAM': "q",
'DATETIME_FORMAT': '%Y/%m/%d %H:%M:%S %z',
'DATETIME_INPUT_FORMATS': ['%Y/%m/%d %H:%M:%S %z', 'iso-8601', '%Y-%m-%d %H:%M:%S %z'],
'DEFAULT_PAGINATION_CLASS': 'jumpserver.rewriting.pagination.MaxLimitOffsetPagination',

View File

@ -35,11 +35,14 @@ resource_api = [
api_v1 = resource_api + [
path('prometheus/metrics/', api.PrometheusMetricsApi.as_view()),
path('resources/', api.ResourceTypeListApi.as_view(), name='resource-list'),
path('resources/<str:resource>/', api.ResourceListApi.as_view()),
path('resources/<str:resource>/<str:pk>/', api.ResourceDetailApi.as_view()),
path('search/', api.GlobalSearchView.as_view()),
]
if settings.MCP_ENABLED:
api_v1.extend([
path('resources/', api.ResourceTypeListApi.as_view(), name='resource-list'),
path('resources/<str:resource>/', api.ResourceListApi.as_view()),
path('resources/<str:resource>/<str:pk>/', api.ResourceDetailApi.as_view()),
])
app_view_patterns = [
path('auth/', include('authentication.urls.view_urls'), name='auth'),

View File

@ -104,7 +104,7 @@ class ResourceDownload(TemplateView):
OPENSSH_VERSION=v9.4.0.0
TINKER_VERSION=v0.1.6
VIDEO_PLAYER_VERSION=0.6.0
CLIENT_VERSION=v3.0.7
CLIENT_VERSION=v3.1.0
"""
def get_meta_json(self):

View File

@ -160,6 +160,19 @@ class SSHClient:
try:
self.client.connect(**self.connect_params)
self._channel = self.client.invoke_shell()
# Always perform a gentle handshake that works for servers and
# network devices: drain banner, brief settle, send newline, then
# read in quiet mode to avoid blocking on missing prompt.
try:
while self._channel.recv_ready():
self._channel.recv(self.buffer_size)
except Exception:
pass
time.sleep(0.5)
try:
self._channel.send(b'\n')
except Exception:
pass
self._get_match_recv()
self.switch_user()
except Exception as error:
@ -186,16 +199,40 @@ class SSHClient:
def _get_match_recv(self, answer_reg=DEFAULT_RE):
buffer_str = ''
prev_str = ''
last_change_ts = time.time()
# Quiet-mode reading only when explicitly requested, or when both
# answer regex and prompt are permissive defaults.
use_regex_match = True
if answer_reg == DEFAULT_RE and self.prompt == DEFAULT_RE:
use_regex_match = False
check_reg = self.prompt if answer_reg == DEFAULT_RE else answer_reg
while True:
if self.channel.recv_ready():
chunk = self.channel.recv(self.buffer_size).decode('utf-8', 'replace')
buffer_str += chunk
if chunk:
buffer_str += chunk
last_change_ts = time.time()
if buffer_str and buffer_str != prev_str:
if self.__match(check_reg, buffer_str):
if use_regex_match:
if self.__match(check_reg, buffer_str):
break
else:
# Wait for a brief quiet period to approximate completion
if time.time() - last_change_ts > 0.3:
break
elif not use_regex_match and buffer_str:
# In quiet mode with some data already seen, also break after
# a brief quiet window even if buffer hasn't changed this loop.
if time.time() - last_change_ts > 0.3:
break
elif not use_regex_match and not buffer_str:
# No data at all in quiet mode; bail after short wait
if time.time() - last_change_ts > 1.0:
break
prev_str = buffer_str
time.sleep(0.01)

View File

@ -76,7 +76,8 @@ class JMSInventory:
proxy_command_list.extend(["-W", "%h:%p", "-q"])
if gateway.password:
proxy_command_list.insert(0, f"sshpass -p {gateway.password}")
password = gateway.password.replace("%", "%%")
proxy_command_list.insert(0, f"sshpass -p '{password}'")
if gateway.private_key:
proxy_command_list.append(f"-i {gateway.get_private_key_path(path_dir)}")

View File

@ -152,7 +152,7 @@ class UploadFileRunner:
host_pattern="*",
inventory=self.inventory,
module='copy',
module_args=f"src={self.src_paths}/ dest={self.dest_path}",
module_args=f"src={self.src_paths}/ dest={self.dest_path}/",
verbosity=verbosity,
event_handler=self.cb.event_handler,
status_handler=self.cb.status_handler,

View File

@ -11,12 +11,15 @@ from django.shortcuts import get_object_or_404
from django.utils._os import safe_join
from django.utils.translation import gettext_lazy as _
from rest_framework.decorators import action
from rest_framework.exceptions import PermissionDenied
from rest_framework.response import Response
from rest_framework.views import APIView
from acls.models import LoginAssetACL
from assets.models import Asset
from common.const.http import POST
from common.permissions import IsValidUser
from common.utils import get_request_ip_or_data
from ops.celery import app
from ops.const import Types
from ops.models import Job, JobExecution, JMSPermedInventory
@ -48,7 +51,22 @@ def set_task_to_serializer_data(serializer, task_id):
setattr(serializer, "_data", data)
class JobViewSet(OrgBulkModelViewSet):
class LoginAssetACLCheckMixin:
def check_login_asset_acls(self, user, assets, account, ip):
for asset in assets:
kwargs = {'user': user, 'asset': asset, 'account_username': account}
acls = LoginAssetACL.filter_queryset(**kwargs)
acl = LoginAssetACL.get_match_rule_acls(user, ip, acls)
if not acl:
return
if not acl.is_action(acl.ActionChoices.accept):
raise PermissionDenied(_(
"Login to asset {}({}) is rejected by login asset ACL ({})".format(asset.name, asset.address, acl)
))
class JobViewSet(LoginAssetACLCheckMixin, OrgBulkModelViewSet):
serializer_class = JobSerializer
filterset_fields = ('name', 'type')
search_fields = ('name', 'comment')
@ -118,6 +136,13 @@ class JobViewSet(OrgBulkModelViewSet):
execution.parameters = JobExecutionSerializer.validate_parameters(self._parameters)
execution.creator = self.request.user
execution.save()
assets = merge_nodes_and_assets(job.nodes.all(), job.assets.all(), self.request.user)
self.check_login_asset_acls(
self.request.user,
assets,
job.runas,
get_request_ip_or_data(self.request)
)
set_task_to_serializer_data(serializer, execution.id)
transaction.on_commit(
@ -186,7 +211,7 @@ class JobViewSet(OrgBulkModelViewSet):
return Response({'task_id': serializer.data.get('task_id')}, status=201)
class JobExecutionViewSet(OrgBulkModelViewSet):
class JobExecutionViewSet(LoginAssetACLCheckMixin, OrgBulkModelViewSet):
serializer_class = JobExecutionSerializer
http_method_names = ('get', 'post', 'head', 'options',)
model = JobExecution
@ -203,6 +228,16 @@ class JobExecutionViewSet(OrgBulkModelViewSet):
run_ops_job_execution.apply_async((str(instance.id),), task_id=str(instance.id))
def perform_create(self, serializer):
job = serializer.validated_data.get('job')
if job:
assets = merge_nodes_and_assets(job.nodes.all(), list(job.assets.all()), self.request.user)
self.check_login_asset_acls(
self.request.user,
assets,
job.runas,
get_request_ip_or_data(self.request)
)
instance = serializer.save()
instance.job_version = instance.job.version
instance.material = instance.job.material
@ -235,7 +270,7 @@ class JobExecutionViewSet(OrgBulkModelViewSet):
instance = get_object_or_404(JobExecution, task_id=task_id, creator=request.user)
except Http404:
return Response(
{'error': _('The task is being created and cannot be interrupted. Please try again later.')},
{'error': _("The task is being created and cannot be interrupted. Please try again later.")},
status=400
)
try:
@ -305,13 +340,13 @@ class UsernameHintsAPI(APIView):
assets = merge_nodes_and_assets(node_ids, assets, request.user)
top_accounts = Account.objects \
.exclude(username__startswith='jms_') \
.exclude(username__startswith='js_') \
.filter(username__icontains=query) \
.filter(asset__in=assets) \
.values('username') \
.annotate(total=Count('username')) \
.order_by('-total', '-username')[:10]
.exclude(username__startswith='jms_') \
.exclude(username__startswith='js_') \
.filter(username__icontains=query) \
.filter(asset__in=assets) \
.values('username') \
.annotate(total=Count('username')) \
.order_by('-total', '-username')[:10]
return Response(data=top_accounts)

View File

@ -18,7 +18,7 @@ __all__ = ["Job", "JobExecution", "JMSPermedInventory"]
from simple_history.models import HistoricalRecords
from accounts.models import Account
from acls.models import CommandFilterACL
from acls.models import CommandFilterACL, DataMaskingRule
from assets.models import Asset
from assets.automations.base.manager import SSHTunnelManager
from common.db.encoder import ModelJSONFieldEncoder
@ -516,13 +516,33 @@ class JobExecution(JMSOrgBaseModel):
if error_assets_count > 0:
raise Exception("You do not have access rights to {} assets".format(error_assets_count))
def before_start(self):
self.check_assets_perms()
def check_data_masking_rules_acls(self):
for asset in self.current_job.assets.all():
acls = DataMaskingRule.filter_queryset(
user=self.creator,
asset=asset,
is_active=True,
account_username=self.current_job.runas
)
protocols = [p.name for p in asset.protocols.all()]
if acls and set(protocols) & {'mariadb', 'mysql', 'postgresql', 'sqlserver'}:
print(
"\033[31mcommand \'{}\' on asset {}({}) and account {} is rejected by data masking rules acl {}\033[0m"
.format(self.current_job.args, asset.name, asset.address, self.current_job.runas, list(acls))
)
raise Exception("Command is rejected by data masking rules ACL")
def check_assets_acls(self):
self.check_data_masking_rules_acls()
if self.current_job.type == 'playbook':
self.check_danger_keywords()
if self.current_job.type == 'adhoc':
self.check_command_acl()
def before_start(self):
self.check_assets_perms()
self.check_assets_acls()
def start(self, **kwargs):
self.date_start = timezone.now()
self.set_celery_id()

View File

@ -24,5 +24,7 @@ class OrgMixin:
@sync_to_async
def has_perms(self, user, perms):
self.cookie = self.get_cookie()
self.org = self.get_current_org()
with tmp_to_org(self.org):
return user.has_perms(perms)

View File

@ -23,6 +23,7 @@ user_perms = (
("ops", "job", "*", "*"),
("ops", "jobexecution", "*", "*"),
("ops", "celerytaskexecution", "view", "*"),
("users", "user", "match", "user"),
)
system_user_perms = (

View File

@ -6,6 +6,7 @@ from rest_framework.generics import ListAPIView, CreateAPIView
from rest_framework.views import Response
from rest_framework_bulk.generics import BulkModelViewSet
from common.api.action import RenderToJsonMixin
from common.drf.filters import IDSpmFilterBackend
from users.utils import LoginIpBlockUtil
from ..models import LeakPasswords
@ -61,7 +62,7 @@ class UnlockIPSecurityAPI(CreateAPIView):
return Response(status=200)
class LeakPasswordViewSet(BulkModelViewSet):
class LeakPasswordViewSet(BulkModelViewSet, RenderToJsonMixin):
serializer_class = LeakPasswordPSerializer
model = LeakPasswords
rbac_perms = {
@ -70,6 +71,12 @@ class LeakPasswordViewSet(BulkModelViewSet):
queryset = LeakPasswords.objects.none()
search_fields = ['password']
def get_object(self):
pk = self.kwargs.get('pk')
if pk:
return self.get_queryset().get(id=pk)
return super().get_object()
def get_queryset(self):
return LeakPasswords.objects.using('sqlite').all()

View File

@ -7,6 +7,7 @@ from django.views.static import serve
from rest_framework import generics
from rest_framework import status
from rest_framework.permissions import AllowAny
from rest_framework.response import Response
from rest_framework.views import APIView
from common.utils import get_logger
@ -215,3 +216,10 @@ class SettingsLogoApi(APIView):
else:
return HttpResponse(status=status.HTTP_404_NOT_FOUND)
return serve(request, logo_path, document_root=document_root)
class ClientVersionView(APIView):
permission_classes = (AllowAny,)
def get(self, request, *args, **kwargs):
return Response(['3.1.0'], status=status.HTTP_200_OK)

View File

@ -242,7 +242,7 @@ def register_sqlite_connection():
class LeakPasswords(models.Model):
id = models.AutoField(primary_key=True)
id = models.AutoField(primary_key=True, verbose_name=_("ID"))
password = models.CharField(max_length=1024, verbose_name=_("Password"))
class Meta:

View File

@ -12,43 +12,43 @@ class CleaningSerializer(serializers.Serializer):
LOGIN_LOG_KEEP_DAYS = serializers.IntegerField(
min_value=MIN_VALUE, max_value=9999,
label=_("Login log retention days (day)"),
label=_("Login log retention days"),
)
TASK_LOG_KEEP_DAYS = serializers.IntegerField(
min_value=MIN_VALUE, max_value=9999,
label=_("Task log retention days (day)"),
label=_("Task log retention days"),
)
OPERATE_LOG_KEEP_DAYS = serializers.IntegerField(
min_value=MIN_VALUE, max_value=9999,
label=_("Operate log retention days (day)"),
label=_("Operate log retention days"),
)
PASSWORD_CHANGE_LOG_KEEP_DAYS = serializers.IntegerField(
min_value=MIN_VALUE, max_value=9999,
label=_("password change log keep days (day)"),
label=_("Password change log retention days"),
)
FTP_LOG_KEEP_DAYS = serializers.IntegerField(
min_value=MIN_VALUE, max_value=9999,
label=_("FTP log retention days (day)"),
label=_("FTP log retention days"),
)
CLOUD_SYNC_TASK_EXECUTION_KEEP_DAYS = serializers.IntegerField(
min_value=MIN_VALUE, max_value=9999,
label=_("Cloud sync task history retention days (day)"),
label=_("Cloud sync task history retention days"),
)
JOB_EXECUTION_KEEP_DAYS = serializers.IntegerField(
min_value=MIN_VALUE, max_value=9999,
label=_("job execution retention days (day)"),
label=_("job execution retention days"),
)
ACTIVITY_LOG_KEEP_DAYS = serializers.IntegerField(
min_value=MIN_VALUE, max_value=9999,
label=_("Activity log retention days (day)"),
label=_("Activity log retention days"),
)
TERMINAL_SESSION_KEEP_DURATION = serializers.IntegerField(
min_value=MIN_VALUE, max_value=99999, required=True, label=_('Session log retention days (day)'),
min_value=MIN_VALUE, max_value=99999, required=True, label=_('Session log retention days'),
help_text=_(
'Session, record, command will be delete if more than duration, only in database, OSS will not be affected.')
)
ACCOUNT_CHANGE_SECRET_RECORD_KEEP_DAYS = serializers.IntegerField(
min_value=MIN_VALUE, max_value=9999,
label=_("Change secret and push record retention days (day)"),
label=_("Change secret and push record retention days"),
)

View File

@ -202,25 +202,25 @@ class SecuritySessionSerializer(serializers.Serializer):
required=True, label=_('Watermark'),
)
SECURITY_WATERMARK_SESSION_CONTENT = serializers.CharField(
required=False, label=_('Watermark session content'),
required=False, label=_('Session content'),
)
SECURITY_WATERMARK_CONSOLE_CONTENT = serializers.CharField(
required=False, label=_("Watermark console content")
required=False, label=_("Console content")
)
SECURITY_WATERMARK_COLOR = serializers.CharField(
max_length=32, default="", label=_("Color")
max_length=32, default="", label=_("Font color")
)
SECURITY_WATERMARK_FONT_SIZE = serializers.IntegerField(
required=False, label=_('Watermark font size'), min_value=1, max_value=100,
required=False, label=_('Font size'), min_value=1, max_value=100,
)
SECURITY_WATERMARK_HEIGHT = serializers.IntegerField(
required=False, label=_('Watermark height'), default=200
required=False, label=_('Height'), default=200
)
SECURITY_WATERMARK_WIDTH = serializers.IntegerField(
required=False, label=_('Watermark width'), default=200
required=False, label=_('Width'), default=200
)
SECURITY_WATERMARK_ROTATE = serializers.IntegerField(
required=False, label=_('Watermark rotate'), default=45
required=False, label=_('Rotate'), default=45
)
SECURITY_MAX_IDLE_TIME = serializers.IntegerField(
min_value=1, max_value=99999, required=False,

View File

@ -32,6 +32,7 @@ urlpatterns = [
path('public/open/', api.OpenPublicSettingApi.as_view(), name='open-public-setting'),
path('server-info/', api.ServerInfoApi.as_view(), name='server-info'),
path('i18n/<str:name>/', api.ComponentI18nApi.as_view(), name='i18n-data'),
path('client/versions/', api.ClientVersionView.as_view(), name='client-version'),
]
urlpatterns += router.urls

View File

@ -56,8 +56,6 @@ class ToolsWebsocket(AsyncJsonWebsocketConsumer, OrgMixin):
async def connect(self):
user = self.scope["user"]
if user.is_authenticated:
self.cookie = self.get_cookie()
self.org = self.get_current_org()
has_perm = self.has_perms(user, ['rbac.view_systemtools'])
if await self.is_superuser(user) or (settings.TOOL_USER_ENABLED and has_perm):
await self.accept()
@ -128,14 +126,14 @@ class ToolsWebsocket(AsyncJsonWebsocketConsumer, OrgMixin):
close_old_connections()
class LdapWebsocket(AsyncJsonWebsocketConsumer):
class LdapWebsocket(AsyncJsonWebsocketConsumer, OrgMixin):
category: str
async def connect(self):
user = self.scope["user"]
query = parse_qs(self.scope['query_string'].decode())
self.category = query.get('category', [User.Source.ldap.value])[0]
if user.is_authenticated:
if user.is_authenticated and await self.has_perms(user, ['settings.view_setting']):
await self.accept()
else:
await self.close()
@ -166,8 +164,6 @@ class LdapWebsocket(AsyncJsonWebsocketConsumer):
config = {
'server_uri': serializer.validated_data.get(f"{prefix}SERVER_URI"),
'bind_dn': serializer.validated_data.get(f"{prefix}BIND_DN"),
'password': (serializer.validated_data.get(f"{prefix}BIND_PASSWORD") or
getattr(settings, f"{prefix}BIND_PASSWORD")),
'use_ssl': serializer.validated_data.get(f"{prefix}START_TLS", False),
'search_ou': serializer.validated_data.get(f"{prefix}SEARCH_OU"),
'search_filter': serializer.validated_data.get(f"{prefix}SEARCH_FILTER"),
@ -175,6 +171,12 @@ class LdapWebsocket(AsyncJsonWebsocketConsumer):
'auth_ldap': serializer.validated_data.get(f"{prefix.rstrip('_')}", False)
}
password = serializer.validated_data.get(f"{prefix}BIND_PASSWORD")
if not password and config['server_uri'] == getattr(settings, f"{prefix}SERVER_URI"):
# 只有在没有修改服务器地址的情况下,才使用原有的密码
config['password'] = getattr(settings, f"{prefix}BIND_PASSWORD")
else:
config['password'] = password
return config
@staticmethod

View File

@ -251,7 +251,8 @@ class SessionReplayViewSet(AsyncApiMixin, viewsets.ViewSet):
if url.endswith('.cast.gz'):
tp = 'asciicast'
elif url.endswith('.replay.mp4'):
elif url.endswith('.mp4'):
## .replay.mp4 .part.mp4
tp = 'mp4'
elif url.endswith('replay.json'):
# 新版本将返回元数据信息

View File

@ -36,16 +36,16 @@ class CommandFilter(filters.FilterSet):
date_from = self.form.cleaned_data.get('date_from')
date_to = self.form.cleaned_data.get('date_to')
filters = {}
_filters = {}
if date_from:
date_from = date_from.timestamp()
filters['timestamp__gte'] = date_from
_filters['timestamp__gte'] = date_from
if date_to:
date_to = date_to.timestamp()
filters['timestamp__lte'] = date_to
_filters['timestamp__lte'] = date_to
qs = qs.filter(**filters)
qs = qs.filter(**_filters)
return qs
def filter_by_asset_id(self, queryset, name, value):

View File

@ -41,7 +41,7 @@ class Command(AbstractSessionCommand):
'timestamp': int(d.timestamp()),
'org_id': str(org.id)
})
for i in range(count)
for __ in range(count)
]
cls.objects.bulk_create(commands)
print(f'Create {len(commands)} commands of org ({org})')

View File

@ -41,8 +41,8 @@ class UserViewSet(CommonApiMixin, UserQuerysetMixin, SuggestionMixin, BulkModelV
permission_classes = [RBACPermission, UserObjectPermission]
serializer_classes = {
'default': UserSerializer,
'suggestion': MiniUserSerializer,
'invite': InviteSerializer,
'match': MiniUserSerializer,
'retrieve': UserRetrieveSerializer,
}
rbac_perms = {

View File

@ -93,10 +93,10 @@ dependencies = [
'celery==5.3.1',
'flower==2.0.1',
'django-celery-beat==2.6.0',
'kombu==5.3.1',
'kombu==5.3.5',
'uvicorn==0.22.0',
'websockets==11.0.3',
'python-ldap==3.4.3',
'python-ldap==3.4.5',
'ldap3==2.9.1',
'django-radius',
'django-cas-ng',
@ -149,7 +149,7 @@ dependencies = [
'botocore==1.31.9',
's3transfer==0.6.1',
'xmlsec==1.3.14',
'playwright==1.53.0',
'playwright==1.55.0',
'pdf2image==1.17.0',
'drf-spectacular-sidecar==2025.8.1',
]

View File

@ -18,6 +18,7 @@ fi
echo "4. For Apple processor"
LDFLAGS="-L$(brew --prefix freetds)/lib -L$(brew --prefix openssl@1.1)/lib" CFLAGS="-I$(brew --prefix freetds)/include" pip install $(grep 'pymssql' requirements.txt)
export PKG_CONFIG_PATH="/opt/homebrew/opt/mysql-client/lib/pkgconfig"
echo "5. Install Ansible Receptor"

10
uv.lock
View File

@ -1,5 +1,5 @@
version = 1
revision = 2
revision = 3
requires-python = ">=3.11"
resolution-markers = [
"python_full_version >= '3.14'",
@ -2553,7 +2553,7 @@ requires-dist = [
{ name = "itypes", specifier = "==1.2.0" },
{ name = "jinja2", specifier = "==3.1.6" },
{ name = "jsonfield2", specifier = "==4.0.0.post0" },
{ name = "kombu", specifier = "==5.3.1" },
{ name = "kombu", specifier = "==5.3.5" },
{ name = "ldap3", specifier = "==2.9.1" },
{ name = "lxml", specifier = "==5.2.1" },
{ name = "markupsafe", specifier = "==2.1.3" },
@ -2671,15 +2671,15 @@ wheels = [
[[package]]
name = "kombu"
version = "5.3.1"
version = "5.3.5"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "amqp" },
{ name = "vine" },
]
sdist = { url = "https://files.pythonhosted.org/packages/c8/69/b703f8ec8d0406be22534dad885cac847fe092b793c4893034e3308feb9b/kombu-5.3.1.tar.gz", hash = "sha256:fbd7572d92c0bf71c112a6b45163153dea5a7b6a701ec16b568c27d0fd2370f2", size = 434284, upload-time = "2023-06-15T13:16:22.683Z" }
sdist = { url = "https://files.pythonhosted.org/packages/55/61/0b91085837d446570ea12f63f79463e5a74b449956b1ca9d1946a6f584c2/kombu-5.3.5.tar.gz", hash = "sha256:30e470f1a6b49c70dc6f6d13c3e4cc4e178aa6c469ceb6bcd55645385fc84b93", size = 438460, upload-time = "2024-01-12T19:55:54.982Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/63/58/b23b9c1ffb30d8b5cdfc7bdecb17bfd7ea20c619e86e515297b496177144/kombu-5.3.1-py3-none-any.whl", hash = "sha256:48ee589e8833126fd01ceaa08f8a2041334e9f5894e5763c8486a550454551e9", size = 198498, upload-time = "2023-06-15T13:16:14.57Z" },
{ url = "https://files.pythonhosted.org/packages/f7/88/daca086d72832c74a7e239558ad484644c8cda0b9ae8a690f247bf13c268/kombu-5.3.5-py3-none-any.whl", hash = "sha256:0eac1bbb464afe6fb0924b21bf79460416d25d8abc52546d4f16cad94f789488", size = 200001, upload-time = "2024-01-12T19:55:51.59Z" },
]
[[package]]