From cfe389dd3981252c7c6350a6237ce8515e193e3c Mon Sep 17 00:00:00 2001 From: liyoumin <306917629@qq.com> Date: Thu, 3 Aug 2023 17:13:50 +0800 Subject: [PATCH] fix: fix the domain description 1. fix the domain description 2.filter the disabled domain when get domain options Change-Id: I6ece6d4cf50fbed3ac2569b70fc47591932d69c6 --- src/locales/en.json | 3 + src/locales/ko-kr.json | 431 +++++++++--------- src/locales/zh-hans.json | 3 + .../containers/Domain/actions/Create.jsx | 20 +- .../containers/Domain/actions/Delete.jsx | 21 +- .../containers/Project/actions/Delete.jsx | 21 +- src/resources/keystone/domain.jsx | 5 +- 7 files changed, 285 insertions(+), 219 deletions(-) diff --git a/src/locales/en.json b/src/locales/en.json index 095ab275..56370d57 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -237,6 +237,7 @@ "Base Info": "Base Info", "Basic Parameters": "Basic Parameters", "Batch Allocate": "Batch Allocate", + "Before deleting the project, it is recommended to clean up the resources under the project.": "Before deleting the project, it is recommended to clean up the resources under the project.", "Belarus": "Belarus", "Belgium": "Belgium", "Belize": "Belize", @@ -1301,6 +1302,7 @@ "Invalid: CIDR Format Error(e.g. 10.10.10.0/24)": "Invalid: CIDR Format Error(e.g. 10.10.10.0/24)", "Invalid: DNS Format Error(e.g. 1001:1001::)": "Invalid: DNS Format Error(e.g. 1001:1001::)", "Invalid: DNS Format Error(e.g. 114.114.114.114)": "Invalid: DNS Format Error(e.g. 114.114.114.114)", + "Invalid: Domain name cannot be duplicated": "Invalid: Domain name cannot be duplicated", "Invalid: Password must be the same with confirm password.": "Invalid: Password must be the same with confirm password.", "Invalid: Please input a valid ip": "Invalid: Please input a valid ip", "Invalid: Please input a valid ipv4": "Invalid: Please input a valid ipv4", @@ -1815,6 +1817,7 @@ "Please input {label}!": "Please input {label}!", "Please make sure this IP address be available to avoid creating VM failure.": "Please make sure this IP address be available to avoid creating VM failure.", "Please make sure this IP address be available.": "Please make sure this IP address be available.", + "Please note that when deleting a domain, all projects, users, and user groups under the domain will be deleted directly!": "Please note that when deleting a domain, all projects, users, and user groups under the domain will be deleted directly!", "Please reasonably plan the network and subnet to which the virtual network card belongs.": "Please reasonably plan the network and subnet to which the virtual network card belongs.", "Please save your token properly and it will be valid for {left}.": "Please save your token properly and it will be valid for {left}.", "Please select": "Please select", diff --git a/src/locales/ko-kr.json b/src/locales/ko-kr.json index dc73e499..cf3beb7c 100644 --- a/src/locales/ko-kr.json +++ b/src/locales/ko-kr.json @@ -236,6 +236,7 @@ "Base Info": "기본 정보", "Basic Parameters": "기본 파라미터", "Batch Allocate": "배치 할당", + "Before deleting the project, it is recommended to clean up the resources under the project.": "프로젝트를 삭제하기 전에 프로젝트 하위의 자원을 정리하는 것이 좋습니다.", "Belarus": "벨라루스", "Belgium": "벨기에", "Belize": "벨리즈", @@ -1198,71 +1199,71 @@ "Image Pulling": "Image 다운로드", "Image Size": "Image 크기", "Image Snapshot Pending": "", - "Image Uploading":"이미지 업로드", - "Images":"이미지", - "Immediate effect":"즉각적인 효과", - "Immediately delete":"즉시 삭제", - "Implied Roles":"내재된 역할", - "Import Keypair":"키 페어 가져오기", - "Import Metadata":"메타데이터 가져오기", - "Import metadata":"메타데이터 가져오기", - "Importing":"가져오는 중", - "In Cluster":"클러스터 내", - "In Use":"사용 중", - "In general, administrator for Windows,root for Linux, please fill by image uploading.":"일반적으로 Windows의 경우 administrator, Linux의 경우 root로 이미지 업로드시 지정합니다.", - "In order to avoid data loss, the instance will shut down and interrupt your business. Please confirm carefully.":"데이터 손실을 방지하기 위해 인스턴스는 종료됩니다.", - "In the last 30 days":"지난 30일", - "In the last 7 days":"지난 7일", - "In the last hour":"지난 1시간", - "In-use":"사용 중", - "Inactive":"비활성", - "Increment Backup":"증분 백업", - "Incremental":"증분", - "Incremental Backup":"증분 백업", + "Image Uploading": "이미지 업로드", + "Images": "이미지", + "Immediate effect": "즉각적인 효과", + "Immediately delete": "즉시 삭제", + "Implied Roles": "내재된 역할", + "Import Keypair": "키 페어 가져오기", + "Import Metadata": "메타데이터 가져오기", + "Import metadata": "메타데이터 가져오기", + "Importing": "가져오는 중", + "In Cluster": "클러스터 내", + "In Use": "사용 중", + "In general, administrator for Windows,root for Linux, please fill by image uploading.": "일반적으로 Windows의 경우 administrator, Linux의 경우 root로 이미지 업로드시 지정합니다.", + "In order to avoid data loss, the instance will shut down and interrupt your business. Please confirm carefully.": "데이터 손실을 방지하기 위해 인스턴스는 종료됩니다.", + "In the last 30 days": "지난 30일", + "In the last 7 days": "지난 7일", + "In the last hour": "지난 1시간", + "In-use": "사용 중", + "Inactive": "비활성", + "Increment Backup": "증분 백업", + "Incremental": "증분", + "Incremental Backup": "증분 백업", "India": "", - "Indicates whether this VPN can only respond to connections or both respond to and initiate connections.":"VPN이 연결만 가능한지, 연결에 모두 응답과 초기화가 모두 가능한지를 나타냅니다.", + "Indicates whether this VPN can only respond to connections or both respond to and initiate connections.": "VPN이 연결만 가능한지, 연결에 모두 응답과 초기화가 모두 가능한지를 나타냅니다.", "Indonesia": "", - "Infinity":"무한대", - "Info":"정보", - "Ingress":"인그레스", - "Init Complete":"초기화 완료", - "Init Failed":"초기화 실패", - "Init In Progress":"초기화 진행 중", - "Initial Admin User":"초기 관리자", - "Initial Databases":"초기 데이터베이스", - "Initial Volume Size":"초기 볼륨 크기", - "Initialize Databases":"데이터베이스 초기화", - "Initiator Mode":"초기 모드", - "Input destination port or port range(example: 80 or 80:160)":"입력 대상 포트 또는 포트 범위(예: 80 또는 80:160)", - "Input external port or port range(example: 80 or 80:160)":"외부 포트 또는 포트 범위 입력(예: 80 또는 80:160)", - "Input internal port or port range(example: 80 or 80:160)":"입력 내부 포트 또는 포트 범위(예: 80 또는 80:160)", - "Input source port or port range(example: 80 or 80:160)":"입력 소스 포트 또는 포트 범위(예: 80 또는 80:160)", - "Insecure Registry":"암호화되지 않은 레지스트리", - "Inspect Failed":"검사 실패", - "Inspecting":"검사 중", + "Infinity": "무한대", + "Info": "정보", + "Ingress": "인그레스", + "Init Complete": "초기화 완료", + "Init Failed": "초기화 실패", + "Init In Progress": "초기화 진행 중", + "Initial Admin User": "초기 관리자", + "Initial Databases": "초기 데이터베이스", + "Initial Volume Size": "초기 볼륨 크기", + "Initialize Databases": "데이터베이스 초기화", + "Initiator Mode": "초기 모드", + "Input destination port or port range(example: 80 or 80:160)": "입력 대상 포트 또는 포트 범위(예: 80 또는 80:160)", + "Input external port or port range(example: 80 or 80:160)": "외부 포트 또는 포트 범위 입력(예: 80 또는 80:160)", + "Input internal port or port range(example: 80 or 80:160)": "입력 내부 포트 또는 포트 범위(예: 80 또는 80:160)", + "Input source port or port range(example: 80 or 80:160)": "입력 소스 포트 또는 포트 범위(예: 80 또는 80:160)", + "Insecure Registry": "암호화되지 않은 레지스트리", + "Inspect Failed": "검사 실패", + "Inspecting": "검사 중", "Instance": "인스턴스", - "Instance \"{ name }\" has already been locked.":"인스턴스 \"{ name }\"이(가) 이미 잠겼습니다.", - "Instance \"{ name }\" is ironic, can not soft reboot it.":"인스턴스 \"{ name }\"은(는) Ironic 입니다. 소프트 재부팅할 수 없습니다.", - "Instance \"{ name }\" is locked, can not delete it.":"인스턴스 \"{ name }\"이(가) 잠겼습니다. 삭제할 수 없습니다.", - "Instance \"{ name }\" is locked, can not pause it.":"인스턴스 \"{ name }\"이(가) 잠겼습니다. 일시 중지할 수 없습니다.", - "Instance \"{ name }\" is locked, can not reboot it.":"인스턴스 \"{ name }\"이(가) 잠겼습니다. 재부팅할 수 없습니다.", - "Instance \"{ name }\" is locked, can not resume it.":"인스턴스 \"{ name }\"이(가) 잠겼습니다. 다시 시작할 수 없습니다.", - "Instance \"{ name }\" is locked, can not soft reboot it.":"인스턴스 \"{ name }\"이(가) 잠겼습니다. 소프트 재부팅할 수 없습니다.", - "Instance \"{ name }\" is locked, can not start it.":" 인스턴스 \"{ name }\"이(가) 잠겨 있어 시작할 수 없습니다.", - "Instance \"{ name }\" is locked, can not stop it.":"인스턴스 \"{ name }\"이(가) 잠겼습니다. 중지할 수 없습니다.", - "Instance \"{ name }\" is locked, can not suspend it.":"인스턴스 \"{ name }\"이(가) 잠겼습니다. 일시 중지할 수 없습니다.", - "Instance \"{ name }\" is locked, can not unpause it.":"인스턴스 \"{ name }\"이(가) 잠겼습니다. 일시 중지를 해제할 수 없습니다.", - "Instance \"{ name }\" is not locked, can not unlock it.":"인스턴스 \"{ name }\"이(가) 잠기지 않았으므로 잠금 해제할 수 없습니다.", - "Instance \"{ name }\" status is not active, can not soft reboot it.":"인스턴스 \"{ name }\" 상태가 활성이 아니므로 소프트 재부팅할 수 없습니다.", - "Instance \"{ name }\" status is not in active or shutoff, can not reboot it.":"인스턴스 \"{ name }\" 상태가 활성 상태가 아니거나 종료되었습니다. 재부팅할 수 없습니다.", - "Instance \"{ name }\" status is not in active or suspended, can not stop it.":"인스턴스 \"{ name }\" 상태가 활성이 아니거나 일시 중단되었습니다. 중지할 수 없습니다.", - "Instance \"{ name }\" status is not in active, can not pause it.":"인스턴스 \"{ name }\" 상태가 활성 상태가 아니므로 일시 중지할 수 없습니다.", - "Instance \"{ name }\" status is not in active, can not suspend it.":"인스턴스 \"{ name }\" 상태가 활성이 아니므로 일시 중지할 수 없습니다.", - "Instance \"{ name }\" status is not in paused, can not unpause it.":"인스턴스 \"{ name }\" 상태가 일시 중지되지 않았으므로 일시 중지를 해제할 수 없습니다.", - "Instance \"{ name }\" status is not in suspended, can not resume it.":"인스턴스 \"{ name }\" 상태가 일시 중단되지 않았으므로 재개할 수 없습니다.", - "Instance \"{ name }\" status is not shutoff, can not start it.":"인스턴스 \"{ 이름 }\" 상태가 종료되지 않았으므로 시작할 수 없습니다.", - "Instance Addr":"인스턴스 주소", - "Instance Architecture":"인스턴스 아키텍처", + "Instance \"{ name }\" has already been locked.": "인스턴스 \"{ name }\"이(가) 이미 잠겼습니다.", + "Instance \"{ name }\" is ironic, can not soft reboot it.": "인스턴스 \"{ name }\"은(는) Ironic 입니다. 소프트 재부팅할 수 없습니다.", + "Instance \"{ name }\" is locked, can not delete it.": "인스턴스 \"{ name }\"이(가) 잠겼습니다. 삭제할 수 없습니다.", + "Instance \"{ name }\" is locked, can not pause it.": "인스턴스 \"{ name }\"이(가) 잠겼습니다. 일시 중지할 수 없습니다.", + "Instance \"{ name }\" is locked, can not reboot it.": "인스턴스 \"{ name }\"이(가) 잠겼습니다. 재부팅할 수 없습니다.", + "Instance \"{ name }\" is locked, can not resume it.": "인스턴스 \"{ name }\"이(가) 잠겼습니다. 다시 시작할 수 없습니다.", + "Instance \"{ name }\" is locked, can not soft reboot it.": "인스턴스 \"{ name }\"이(가) 잠겼습니다. 소프트 재부팅할 수 없습니다.", + "Instance \"{ name }\" is locked, can not start it.": " 인스턴스 \"{ name }\"이(가) 잠겨 있어 시작할 수 없습니다.", + "Instance \"{ name }\" is locked, can not stop it.": "인스턴스 \"{ name }\"이(가) 잠겼습니다. 중지할 수 없습니다.", + "Instance \"{ name }\" is locked, can not suspend it.": "인스턴스 \"{ name }\"이(가) 잠겼습니다. 일시 중지할 수 없습니다.", + "Instance \"{ name }\" is locked, can not unpause it.": "인스턴스 \"{ name }\"이(가) 잠겼습니다. 일시 중지를 해제할 수 없습니다.", + "Instance \"{ name }\" is not locked, can not unlock it.": "인스턴스 \"{ name }\"이(가) 잠기지 않았으므로 잠금 해제할 수 없습니다.", + "Instance \"{ name }\" status is not active, can not soft reboot it.": "인스턴스 \"{ name }\" 상태가 활성이 아니므로 소프트 재부팅할 수 없습니다.", + "Instance \"{ name }\" status is not in active or shutoff, can not reboot it.": "인스턴스 \"{ name }\" 상태가 활성 상태가 아니거나 종료되었습니다. 재부팅할 수 없습니다.", + "Instance \"{ name }\" status is not in active or suspended, can not stop it.": "인스턴스 \"{ name }\" 상태가 활성이 아니거나 일시 중단되었습니다. 중지할 수 없습니다.", + "Instance \"{ name }\" status is not in active, can not pause it.": "인스턴스 \"{ name }\" 상태가 활성 상태가 아니므로 일시 중지할 수 없습니다.", + "Instance \"{ name }\" status is not in active, can not suspend it.": "인스턴스 \"{ name }\" 상태가 활성이 아니므로 일시 중지할 수 없습니다.", + "Instance \"{ name }\" status is not in paused, can not unpause it.": "인스턴스 \"{ name }\" 상태가 일시 중지되지 않았으므로 일시 중지를 해제할 수 없습니다.", + "Instance \"{ name }\" status is not in suspended, can not resume it.": "인스턴스 \"{ name }\" 상태가 일시 중단되지 않았으므로 재개할 수 없습니다.", + "Instance \"{ name }\" status is not shutoff, can not start it.": "인스턴스 \"{ 이름 }\" 상태가 종료되지 않았으므로 시작할 수 없습니다.", + "Instance Addr": "인스턴스 주소", + "Instance Architecture": "인스턴스 아키텍처", "Instance Detail": "인스턴스 세부 정보", "Instance ID": "인스턴스 ID", "Instance IP": "인스턴스 IP", @@ -1274,72 +1275,73 @@ "Instance Snapshots": "인스턴스 스냅샷", "Instance Status": "인스턴스 상태", "Instances": "인스턴스", - "Instances \"{ name }\" are locked, can not delete them.":"인스턴스 \"{ name }\"이(가) 잠겼습니다. 삭제할 수 없습니다.", - "Insufficient {name} quota to create resources(left { quota }, input { input }).":"리소스를 생성하기 위한 \"{ name }\" 할당량이 부족합니다(left { quota }, input { input }).", - "Interface Info":"인터페이스 정보", + "Instances \"{ name }\" are locked, can not delete them.": "인스턴스 \"{ name }\"이(가) 잠겼습니다. 삭제할 수 없습니다.", + "Insufficient {name} quota to create resources(left { quota }, input { input }).": "리소스를 생성하기 위한 \"{ name }\" 할당량이 부족합니다(left { quota }, input { input }).", + "Interface Info": "인터페이스 정보", "Interface Name:": "인터페이스 이름", - "Interface for vendor-specific functionality on this node":"이 노드의 공급업체별 기능에 대한 인터페이스", - "Interface used for attaching and detaching volumes on this node":"이 노드에서 볼륨을 연결 및 분리하는 데 사용되는 인터페이스", - "Interface used for configuring RAID on this node":"이 노드에서 RAID를 구성하는 데 사용되는 인터페이스", + "Interface for vendor-specific functionality on this node": "이 노드의 공급업체별 기능에 대한 인터페이스", + "Interface used for attaching and detaching volumes on this node": "이 노드에서 볼륨을 연결 및 분리하는 데 사용되는 인터페이스", + "Interface used for configuring RAID on this node": "이 노드에서 RAID를 구성하는 데 사용되는 인터페이스", "Interfaces": "인터페이스", - "Internal Ip Address":"내부 IP 주소", - "Internal Network Bandwidth(Gbps)":"내부 네트워크 대역폭(Gbps)", - "Internal Port":"내부 포트", - "Internal Port/Port Range":"내부 포트/포트 범위", - "Internal Server Error (code: 500) ":"내부 서버 오류(코드: 500)", - "Invalid":"유효하지 않은", - "Invalid CIDR.":"잘못된 CIDR.", - "Invalid IP Address":"잘못된 IP 주소", - "Invalid IP Address and Port":"잘못된 IP 주소 및 포트", - "Invalid Mac Address. Please Use \":\" as separator.":"잘못된 Mac 주소입니다. \":\"를 구분 기호로 사용하십시오.", - "Invalid Tag Value: {tag}":"잘못된 태그 값: {tag}", - "Invalid combination":"잘못된 조합", - "Invalid: ":"유효하지 않은: ", - "Invalid: Allocation Pools Format Error(e.g. 192.168.1.2,192.168.1.200) and start ip should be less than end ip":"잘못됨: 할당 풀 형식 오류(예: 192.168.1.2,192.168.1.200) 및 시작 IP는 종료 IP보다 작아야 합니다", - "Invalid: Allocation Pools Format Error(e.g. fd00:dead:beef:58::9,fd00:dead:beef:58::13) and start ip should be less than end ip":"잘못됨: 할당 풀 형식 오류(예: fd00:dead:beef:58::9,fd00:dead:beef:58::13) 및 시작 IP는 종료 IP보다 작아야 합니다.", - "Invalid: CIDR Format Error(e.g. 10.10.10.0/24)":"잘못됨: CIDR 형식 오류(예: 10.10.10.0/24)", - "Invalid: DNS Format Error(e.g. 1001:1001::)":"잘못됨: DNS 형식 오류(예: 1001:1001::)", - "Invalid: DNS Format Error(e.g. 114.114.114.114)":"잘못됨: DNS 형식 오류(예: 114.114.114.114)", - "Invalid: Password must be the same with confirm password.":"잘못됨: 암호는 암호 확인과 동일해야 합니다.", - "Invalid: Please input a valid ip":"잘못됨: 유효한 IP를 입력하십시오", - "Invalid: Please input a valid ipv4":"잘못됨: 유효한 ipv4를 입력하십시오", - "Invalid: Please input a valid ipv6.":"잘못됨: 유효한 ipv6을 입력하십시오.", - "Invalid: Project name can not be chinese":"잘못됨: 프로젝트 이름은 중국어일 수 없습니다.", - "Invalid: Project name can not be duplicated":"잘못됨: 프로젝트 이름은 중복될 수 없습니다.", - "Invalid: Quota value(s) cannot be less than the current usage value(s): { used } used.":"잘못됨: 할당량 값은 현재 사용 값보다 작을 수 없습니다: { used } 사용됨.", - "Invalid: User Group name can not be duplicated":"잘못됨: 사용자 그룹 이름은 중복될 수 없습니다.", - "Invalid: User name can not be duplicated":"잘못됨: 사용자 이름은 중복될 수 없습니다.", + "Internal Ip Address": "내부 IP 주소", + "Internal Network Bandwidth(Gbps)": "내부 네트워크 대역폭(Gbps)", + "Internal Port": "내부 포트", + "Internal Port/Port Range": "내부 포트/포트 범위", + "Internal Server Error (code: 500) ": "내부 서버 오류(코드: 500)", + "Invalid": "유효하지 않은", + "Invalid CIDR.": "잘못된 CIDR.", + "Invalid IP Address": "잘못된 IP 주소", + "Invalid IP Address and Port": "잘못된 IP 주소 및 포트", + "Invalid Mac Address. Please Use \":\" as separator.": "잘못된 Mac 주소입니다. \":\"를 구분 기호로 사용하십시오.", + "Invalid Tag Value: {tag}": "잘못된 태그 값: {tag}", + "Invalid combination": "잘못된 조합", + "Invalid: ": "유효하지 않은: ", + "Invalid: Allocation Pools Format Error(e.g. 192.168.1.2,192.168.1.200) and start ip should be less than end ip": "잘못됨: 할당 풀 형식 오류(예: 192.168.1.2,192.168.1.200) 및 시작 IP는 종료 IP보다 작아야 합니다", + "Invalid: Allocation Pools Format Error(e.g. fd00:dead:beef:58::9,fd00:dead:beef:58::13) and start ip should be less than end ip": "잘못됨: 할당 풀 형식 오류(예: fd00:dead:beef:58::9,fd00:dead:beef:58::13) 및 시작 IP는 종료 IP보다 작아야 합니다.", + "Invalid: CIDR Format Error(e.g. 10.10.10.0/24)": "잘못됨: CIDR 형식 오류(예: 10.10.10.0/24)", + "Invalid: DNS Format Error(e.g. 1001:1001::)": "잘못됨: DNS 형식 오류(예: 1001:1001::)", + "Invalid: DNS Format Error(e.g. 114.114.114.114)": "잘못됨: DNS 형식 오류(예: 114.114.114.114)", + "Invalid: Domain name cannot be duplicated": "잘못됨: 도메인 이름은 중복될 수 없습니다.", + "Invalid: Password must be the same with confirm password.": "잘못됨: 암호는 암호 확인과 동일해야 합니다.", + "Invalid: Please input a valid ip": "잘못됨: 유효한 IP를 입력하십시오", + "Invalid: Please input a valid ipv4": "잘못됨: 유효한 ipv4를 입력하십시오", + "Invalid: Please input a valid ipv6.": "잘못됨: 유효한 ipv6을 입력하십시오.", + "Invalid: Project name can not be chinese": "잘못됨: 프로젝트 이름은 중국어일 수 없습니다.", + "Invalid: Project name can not be duplicated": "잘못됨: 프로젝트 이름은 중복될 수 없습니다.", + "Invalid: Quota value(s) cannot be less than the current usage value(s): { used } used.": "잘못됨: 할당량 값은 현재 사용 값보다 작을 수 없습니다: { used } 사용됨.", + "Invalid: User Group name can not be duplicated": "잘못됨: 사용자 그룹 이름은 중복될 수 없습니다.", + "Invalid: User name can not be duplicated": "잘못됨: 사용자 이름은 중복될 수 없습니다.", "Ip Address": "IP 주소", "Iran (Islamic Republic of)": "", "Iraq": "", "Ireland": "", - "Ironic Instance":"Ironic 인스턴스", - "Ironic Instance Name":"Ironic 인스턴스 이름", - "Is Current Project":"현재 프로젝트", + "Ironic Instance": "Ironic 인스턴스", + "Ironic Instance Name": "Ironic 인스턴스 이름", + "Is Current Project": "현재 프로젝트", "Is Public": "공용", - "Is admin only":"관리자 전용", - "Is associate to floating ip: ":"유동 IP에 연결됨: ", - "Is external network port":"외부 네트워크 포트", - "Isolate":"격리", - "Isolate(No multithreading)":"격리(멀티스레딩 없음)", - "Israel":"", - "It is IPv6 type.":"IPv6 유형입니다.", - "It is recommended that the { instanceType } instance simultaneously set large page memory to large. { instanceType } instances also require faster memory addressing capabilities.":"{ instanceType } 인스턴스는 대용량 페이지 메모리를 동시에 대용량으로 설정하는 것이 좋습니다. { instanceType } 인스턴스도 더 빠른 메모리 주소 지정 기능이 필요합니다.", - "It is recommended that you perform this cloning operation on a disk without any reading/writing":"읽기/쓰기 없이 디스크에서 이 복제 작업을 수행하는 것이 좋습니다.", - "It is recommended that you use the private network address 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16":"사설 네트워크 주소 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16을 사용하는 것이 좋습니다", - "It is recommended that { instanceType } instance simultaneously set NUMA affinity policy for PCIE device to force or priority matching. This configuration can further improve PCIE computing performance.":"{ instanceType } 인스턴스가 동시에 PCIE 장치에 대한 NUMA 선호도 정책을 강제로 설정하거나 일치 우선 순위를 지정하는 것이 좋습니다. 이 구성은 PCIE 컴퓨팅 성능을 더욱 향상시킬 수 있습니다.", - "It is recommended to install and use this agent. The instance created with this image can be used to modify the password (qemu_guest_agent needs to be installed when creating the image).":"이 에이전트를 설치하여 사용하는 것이 좋습니다. 이 이미지로 생성된 인스턴스는 비밀번호를 수정하는 데 사용할 수 있습니다(이미지 생성 시 qemu_guest_agent를 설치해야 함).", - "It is recommended to set CPU binding strategy as binding on { instanceType } instance. This configuration further improves the performance of the instance CPU.":"CPU 바인딩 전략을 { instanceType } 인스턴스 바인딩으로 설정하는 것이 좋습니다. 이 구성은 인스턴스 CPU의 성능을 더욱 향상시킵니다.", - "It is recommended to set the CPU thread binding policy as thread binding in { instanceType } instance, which can further improve the CPU performance of instance.":"CPU 스레드 바인딩 정책을 { instanceType } 인스턴스의 스레드 바인딩으로 설정하는 것이 좋습니다. 이렇게 하면 인스턴스의 CPU 성능을 더욱 향상시킬 수 있습니다.", - "It is suggested to use the marked AZ directly, too much AZ will lead to the fragmentation of available resources":"표시된 AZ를 직접 사용하는 것이 좋습니다. AZ가 너무 많으면 사용 가능한 리소스가 조각화될 수 있습니다.", - "It is unreachable for all floating ips.":"모든 부동 IP에 대해 연결할 수 없습니다.", - "It is unreachable for this floating ip.":"이 부동 IP에 연결할 수 없습니다.", + "Is admin only": "관리자 전용", + "Is associate to floating ip: ": "유동 IP에 연결됨: ", + "Is external network port": "외부 네트워크 포트", + "Isolate": "격리", + "Isolate(No multithreading)": "격리(멀티스레딩 없음)", + "Israel": "", + "It is IPv6 type.": "IPv6 유형입니다.", + "It is recommended that the { instanceType } instance simultaneously set large page memory to large. { instanceType } instances also require faster memory addressing capabilities.": "{ instanceType } 인스턴스는 대용량 페이지 메모리를 동시에 대용량으로 설정하는 것이 좋습니다. { instanceType } 인스턴스도 더 빠른 메모리 주소 지정 기능이 필요합니다.", + "It is recommended that you perform this cloning operation on a disk without any reading/writing": "읽기/쓰기 없이 디스크에서 이 복제 작업을 수행하는 것이 좋습니다.", + "It is recommended that you use the private network address 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16": "사설 네트워크 주소 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16을 사용하는 것이 좋습니다", + "It is recommended that { instanceType } instance simultaneously set NUMA affinity policy for PCIE device to force or priority matching. This configuration can further improve PCIE computing performance.": "{ instanceType } 인스턴스가 동시에 PCIE 장치에 대한 NUMA 선호도 정책을 강제로 설정하거나 일치 우선 순위를 지정하는 것이 좋습니다. 이 구성은 PCIE 컴퓨팅 성능을 더욱 향상시킬 수 있습니다.", + "It is recommended to install and use this agent. The instance created with this image can be used to modify the password (qemu_guest_agent needs to be installed when creating the image).": "이 에이전트를 설치하여 사용하는 것이 좋습니다. 이 이미지로 생성된 인스턴스는 비밀번호를 수정하는 데 사용할 수 있습니다(이미지 생성 시 qemu_guest_agent를 설치해야 함).", + "It is recommended to set CPU binding strategy as binding on { instanceType } instance. This configuration further improves the performance of the instance CPU.": "CPU 바인딩 전략을 { instanceType } 인스턴스 바인딩으로 설정하는 것이 좋습니다. 이 구성은 인스턴스 CPU의 성능을 더욱 향상시킵니다.", + "It is recommended to set the CPU thread binding policy as thread binding in { instanceType } instance, which can further improve the CPU performance of instance.": "CPU 스레드 바인딩 정책을 { instanceType } 인스턴스의 스레드 바인딩으로 설정하는 것이 좋습니다. 이렇게 하면 인스턴스의 CPU 성능을 더욱 향상시킬 수 있습니다.", + "It is suggested to use the marked AZ directly, too much AZ will lead to the fragmentation of available resources": "표시된 AZ를 직접 사용하는 것이 좋습니다. AZ가 너무 많으면 사용 가능한 리소스가 조각화될 수 있습니다.", + "It is unreachable for all floating ips.": "모든 부동 IP에 대해 연결할 수 없습니다.", + "It is unreachable for this floating ip.": "이 부동 IP에 연결할 수 없습니다.", "Italy": "", - "Items in Cache":"캐시 항목", + "Items in Cache": "캐시 항목", "Jamaica": "", "Japan": "", "Jordan": "", - "Jump to Console":"콘솔로 이동", + "Jump to Console": "콘솔로 이동", "Kampuchea": "", "Kazakhstan": "", "Kenya": "", @@ -1349,155 +1351,155 @@ "Key": "키", "Key Pair": "키 페어", "Key Pairs": "키 페어", - "Key Size (bits)":"키 크기(비트)", + "Key Size (bits)": "키 크기(비트)", "Keypair": "키 페어", "Keypair Detail": "키 페어 세부 정보", - "Keypair Info":"키 쌍 정보", - "Keystone Credentials":"Keystone 자격 증명", - "Keystone token is expired.":"Keystone 토큰이 만료되었습니다.", - "Kill":"제거", - "Kill Container":"컨테이너 제거", - "Kill Signal":"제거 신호 ", - "Killed":"제거 ", - "Kubernetes":"쿠버네티스", + "Keypair Info": "키 쌍 정보", + "Keystone Credentials": "Keystone 자격 증명", + "Keystone token is expired.": "Keystone 토큰이 만료되었습니다.", + "Kill": "제거", + "Kill Container": "컨테이너 제거", + "Kill Signal": "제거 신호 ", + "Killed": "제거 ", + "Kubernetes": "쿠버네티스", "Kuwait": "", "Kyrgyzstan": "", - "LB Algorithm":"LB 알고리즘", - "LEAST_CONNECTIONS":"LEAST_CONNECTIONS", - "Labels":"라벨", + "LB Algorithm": "LB 알고리즘", + "LEAST_CONNECTIONS": "LEAST_CONNECTIONS", + "Labels": "라벨", "Lao People's Democratic Republic": "", - "Large":"크기가 큰", - "Large(Optimal performance)":"대형(최적 성능)", - "Last 2 Weeks":"지난 2주", - "Last 24H Status":"마지막 24시간 상태", - "Last 7 Days":"지난 7일", - "Last Day":"마지막 날", - "Last Hour":"지난 시간", - "Last Updated":"마지막 업데이트", - "Last week alarm trend":"지난 주 알람 추세", + "Large": "크기가 큰", + "Large(Optimal performance)": "대형(최적 성능)", + "Last 2 Weeks": "지난 2주", + "Last 24H Status": "마지막 24시간 상태", + "Last 7 Days": "지난 7일", + "Last Day": "마지막 날", + "Last Hour": "지난 시간", + "Last Updated": "마지막 업데이트", + "Last week alarm trend": "지난 주 알람 추세", "Latvia": "", - "Leave Maintenance Mode":"유지 관리 모드 나가기", + "Leave Maintenance Mode": "유지 관리 모드 나가기", "Lebanon": "", - "Left":"왼쪽", + "Left": "왼쪽", "Lesotho": "", "Liberia": "", "Libyan Arab Jamahiriya": "", "Liechtenstein": "", - "Lifetime":"평생", - "Lifetime Value":"평생 가치", - "Listener":"리스너", - "Listener Connection Limit":"리스너 연결 제한", - "Listener Description":"리스너 설명", - "Listener Detail":"리스너 세부 정보", - "Listener Name":"리스너 이름", - "Listener Number":"리스너 번호", - "Listener Protocol":"리스너 프로토콜", - "Listener Protocol Port":"리스너 프로토콜 포트", - "Listeners":"리스너", + "Lifetime": "평생", + "Lifetime Value": "평생 가치", + "Listener": "리스너", + "Listener Connection Limit": "리스너 연결 제한", + "Listener Description": "리스너 설명", + "Listener Detail": "리스너 세부 정보", + "Listener Name": "리스너 이름", + "Listener Number": "리스너 번호", + "Listener Protocol": "리스너 프로토콜", + "Listener Protocol Port": "리스너 프로토콜 포트", + "Listeners": "리스너", "Lithuania": "", - "Live Migrate":"라이브 마이그레이션", - "Live Migration At Destination":"대상에서 라이브 마이그레이션", + "Live Migrate": "라이브 마이그레이션", + "Live Migration At Destination": "대상에서 라이브 마이그레이션", "Load Balancer": "로드 밸런서", "Load Balancer Detail": "로드 밸런서 세부 정보", "Load Balancer Name": "로드 밸런서 이름", "Load Balancers": "로드 밸런서", - "Load Template from a file":"파일에서 템플릿 불러오기", - "Load from local files":"로컬 파일에서 불러오기", - "LoadBalancers Instances":"LoadBalancers 인스턴스", - "Local":"로컬", - "Local Endpoint Group":"로컬 엔드포인트 그룹", - "Local Endpoint Group ID":"로컬 엔드포인트 그룹 ID", - "Local Link Connection":"로컬 링크 연결", - "Local Network":"로컬 네트워크", - "Local SSD":"로컬 SSD", - "Local Subnet":"로컬 서브넷", - "Locality":"", + "Load Template from a file": "파일에서 템플릿 불러오기", + "Load from local files": "로컬 파일에서 불러오기", + "LoadBalancers Instances": "LoadBalancers 인스턴스", + "Local": "로컬", + "Local Endpoint Group": "로컬 엔드포인트 그룹", + "Local Endpoint Group ID": "로컬 엔드포인트 그룹 ID", + "Local Link Connection": "로컬 링크 연결", + "Local Network": "로컬 네트워크", + "Local SSD": "로컬 SSD", + "Local Subnet": "로컬 서브넷", + "Locality": "", "Lock": "잠금", "Lock Instance": "인스턴스 잠금", "Lock Status": "잠금 상태", - "Lock instance will lock the operations that have a direct impact on the operation of the instance, such as: shutdown, restart, delete, the mounting and unmounting of volume, etc. It does not involve the capacity expansion and change type of volume.":"인스턴스 잠금은 종료, 재시작, 삭제, 볼륨 마운트 및 마운트 해제 등과 같이 인스턴스 작동에 직접적인 영향을 미치는 작업이 불가능합니다. 용량 확장 및 볼륨 유형 변경을 포함하지 않습니다. ", + "Lock instance will lock the operations that have a direct impact on the operation of the instance, such as: shutdown, restart, delete, the mounting and unmounting of volume, etc. It does not involve the capacity expansion and change type of volume.": "인스턴스 잠금은 종료, 재시작, 삭제, 볼륨 마운트 및 마운트 해제 등과 같이 인스턴스 작동에 직접적인 영향을 미치는 작업이 불가능합니다. 용량 확장 및 볼륨 유형 변경을 포함하지 않습니다. ", "Locked": "잠김", "Log": "로그", "Log in": "로그인", - "Login Name":"로그인 이름", - "Login Password":"로그인 비밀번호", + "Login Name": "로그인 이름", + "Login Password": "로그인 비밀번호", "Login Type": "로그인 입력", "Logs": "로그", "Luxembourg": "", - "MAC Address":"MAC 주소", - "MAC Learning State":"MAC 학습 상태", - "MAPRFS":"MAPRFS", - "MEM %":"메모리 %", - "MEM LIMIT (MiB)":"메모리 제한(MiB)", - "MEM USAGE (MiB)":"메모리 사용량(MiB)", - "MTU":"MTU", - "Mac Address":"Mac 주소", - "MacVTap":"MacVTap", + "MAC Address": "MAC 주소", + "MAC Learning State": "MAC 학습 상태", + "MAPRFS": "MAPRFS", + "MEM %": "메모리 %", + "MEM LIMIT (MiB)": "메모리 제한(MiB)", + "MEM USAGE (MiB)": "메모리 사용량(MiB)", + "MTU": "MTU", + "Mac Address": "Mac 주소", + "MacVTap": "MacVTap", "Macau": "", "Madagascar": "", - "Mail Exchange Record":"MX 레코드", - "Maintained":"", - "Maintenance":"", + "Mail Exchange Record": "MX 레코드", + "Maintained": "", + "Maintenance": "", "Malawi": "", "Malaysia": "", "Maldives": "", "Mali": "", "Malta": "", - "Manage Access":"액세스 관리", - "Manage Access Rule":"액세스 규칙 관리", - "Manage Error":"오류 관리", + "Manage Access": "액세스 관리", + "Manage Access Rule": "액세스 규칙 관리", + "Manage Error": "오류 관리", "Manage Host": "호스트 관리", "Manage Metadata": "메타데이터 관리", "Manage QoS Spec": "QOS 스펙 관리", "Manage Resource Types": "리소스 타입 관리", "Manage Security Group": "보안 그룹 관리", - "Manage Starting":"시작 관리", - "Manage State":"상태 관리", + "Manage Starting": "시작 관리", + "Manage State": "상태 관리", "Manage User": "사용자 관리", "Manage User Group": "사용자 그룹 관리", "Manage host": "호스트 관리", "Manage user": "사용자 관리", "Manage user group": "사용자 그룹 관리", - "Manageable":"관리 가능", - "Management":"관리", - "Management Reason":"관리 영역", + "Manageable": "관리 가능", + "Management": "관리", + "Management Reason": "관리 영역", "Manu": "", - "Manual input":"수동 입력", - "Manually Assigned Address":"수동으로 할당된 주소", - "Manually Specify":"수동 지정", + "Manual input": "수동 입력", + "Manually Assigned Address": "수동으로 할당된 주소", + "Manually Specify": "수동 지정", "Marshall Islands": "", "Martinique": "", - "Master Node Addresses":"마스터 노드 주소", - "Master Node Flavor":"마스터 노드 Flavor", - "Master Node LB Enabled":"마스터 노드 LB 사용", - "Masters":"마스터", + "Master Node Addresses": "마스터 노드 주소", + "Master Node Flavor": "마스터 노드 Flavor", + "Master Node LB Enabled": "마스터 노드 LB 사용", + "Masters": "마스터", "Mauritania": "", "Mauritius": "", - "Max Avail":"최대 사용 가능", - "Max BandWidth":"최대 대역폭", - "Max Burst":"최대 버스트", - "Max Retries":"최대 재시도 횟수", - "Max Retry":"최대 재시도", - "Max connect":"최대 연결", - "Maximum interval time for each health check response":"각 상태 확인 응답의 최대 간격 시간", - "Maximum time to allow one check to run in seconds":"1회 검사를 실행할 수 있는 최대 시간(초)", + "Max Avail": "최대 사용 가능", + "Max BandWidth": "최대 대역폭", + "Max Burst": "최대 버스트", + "Max Retries": "최대 재시도 횟수", + "Max Retry": "최대 재시도", + "Max connect": "최대 연결", + "Maximum interval time for each health check response": "각 상태 확인 응답의 최대 간격 시간", + "Maximum time to allow one check to run in seconds": "1회 검사를 실행할 수 있는 최대 시간(초)", "Mayotte": "", - "Mem":"메모리", + "Mem": "메모리", "Member Count": "멤버 수", "Member Detail": "멤버 세부 정보", "Member Num": "멤버 수", "Members": "멤버", - "Members of Each Group":"각 그룹의 구성원", - "Members of Each Server Group":"각 서버 그룹의 구성원", - "Memory":"메모리", - "Memory (GiB)":"메모리(GiB)", - "Memory (MiB)":"메모리(MiB)", - "Memory Optimized":"메모리 최적화", - "Memory Page":"메모리 페이지", - "Memory Page Size":"메모리 페이지 크기", - "Memory Usage":"메모리 사용량", - "Memory Usages (GiB)":"메모리 사용량(GiB)", - "Mesos":"메소스", + "Members of Each Group": "각 그룹의 구성원", + "Members of Each Server Group": "각 서버 그룹의 구성원", + "Memory": "메모리", + "Memory (GiB)": "메모리(GiB)", + "Memory (MiB)": "메모리(MiB)", + "Memory Optimized": "메모리 최적화", + "Memory Page": "메모리 페이지", + "Memory Page Size": "메모리 페이지 크기", + "Memory Usage": "메모리 사용량", + "Memory Usages (GiB)": "메모리 사용량(GiB)", + "Mesos": "메소스", "Message": "메시지", "Message Details": "메시지 세부 정보", "Message Queue Service": "", @@ -1814,6 +1816,7 @@ "Please input {label}!": "{label}을(를) 입력하세요!", "Please make sure this IP address be available to avoid creating VM failure.": "VM 생성 실패를 피하기 위해 IP 주소가 사용 가능한지 확인하세요.", "Please make sure this IP address be available.": "IP 주소가 사용 가능한지 확인하세요.", + "Please note that when deleting a domain, all projects, users, and user groups under the domain will be deleted directly!": "도메인을 삭제할 때 해당 도메인 하위의 모든 프로젝트, 사용자 및 사용자 그룹이 모두 직접 삭제됩니다!", "Please reasonably plan the network and subnet to which the virtual network card belongs.": "가상 네트워크 카드가 속한 네트워크와 서브넷을 합리적으로 계획하세요.", "Please save your token properly and it will be valid for {left}.": "토큰을 적절히 저장하고 {left} 동안 유효합니다.", "Please select": "선택하세요.", diff --git a/src/locales/zh-hans.json b/src/locales/zh-hans.json index 1037a065..696faa12 100644 --- a/src/locales/zh-hans.json +++ b/src/locales/zh-hans.json @@ -237,6 +237,7 @@ "Base Info": "基本信息", "Basic Parameters": "基本参数", "Batch Allocate": "批量申请", + "Before deleting the project, it is recommended to clean up the resources under the project.": "删除项目前,建议先清理项目下的资源!", "Belarus": "白俄罗斯", "Belgium": "比利时", "Belize": "伯利兹城", @@ -1301,6 +1302,7 @@ "Invalid: CIDR Format Error(e.g. 10.10.10.0/24)": "无效:CIDR格式错误(例如: 10.10.10.0/24)", "Invalid: DNS Format Error(e.g. 1001:1001::)": "无效:DNS格式错误(例如: 1001:1001::)", "Invalid: DNS Format Error(e.g. 114.114.114.114)": "无效:DNS格式错误(例如: 114.114.114.114)", + "Invalid: Domain name cannot be duplicated": "无效,域名不可重复", "Invalid: Password must be the same with confirm password.": "无效:密码和确认密码必须一致。", "Invalid: Please input a valid ip": "无效:请输入有效的IP", "Invalid: Please input a valid ipv4": "无效:请输入有效的IPV4", @@ -1815,6 +1817,7 @@ "Please input {label}!": "请输入{label}!", "Please make sure this IP address be available to avoid creating VM failure.": "需检查此 IP 是否已被占用,否则可能创建失败。", "Please make sure this IP address be available.": "需确保此IP未被占用。", + "Please note that when deleting a domain, all projects, users, and user groups under the domain will be deleted directly!": "请注意,删除域时,会直接把域下的项目、用户和用户组全部删除!", "Please reasonably plan the network and subnet to which the virtual network card belongs.": "请合理规划虚拟网卡所属的网络和子网。", "Please save your token properly and it will be valid for {left}.": "请妥善保管您的Token,该Token {left} 内有效。", "Please select": "请选择", diff --git a/src/pages/identity/containers/Domain/actions/Create.jsx b/src/pages/identity/containers/Domain/actions/Create.jsx index 62567db8..b9d401ff 100644 --- a/src/pages/identity/containers/Domain/actions/Create.jsx +++ b/src/pages/identity/containers/Domain/actions/Create.jsx @@ -16,6 +16,7 @@ import { inject, observer } from 'mobx-react'; import globalDomainStore from 'stores/keystone/domain'; import { ModalAction } from 'containers/Action'; import { statusTypes } from 'resources/keystone/domain'; +import { toJS } from 'mobx'; export class Create extends ModalAction { init() { @@ -43,6 +44,11 @@ export class Create extends ModalAction { return data; } + get currentList() { + const { list: { data = [] } = {} } = this.store; + return data; + } + get formItems() { return [ { @@ -51,7 +57,8 @@ export class Create extends ModalAction { type: 'input', placeholder: t('Please input name'), required: true, - help: t('The name cannot be modified after creation'), + extra: t('The name cannot be modified after creation'), + validator: this.nameValidator, }, // { // name: 'domainManager', @@ -81,6 +88,17 @@ export class Create extends ModalAction { ]; } + nameValidator = (rule, value) => { + const data = toJS(this.currentList); + if (data.find((d) => d.name === value)) { + return Promise.reject( + new Error(t('Invalid: Domain name cannot be duplicated')) + ); + } + + return Promise.resolve(true); + }; + onSubmit = (values) => { values.enabled = values.enabled.value; return this.store.create(values); diff --git a/src/pages/identity/containers/Domain/actions/Delete.jsx b/src/pages/identity/containers/Domain/actions/Delete.jsx index 437ace7f..bab6849e 100644 --- a/src/pages/identity/containers/Domain/actions/Delete.jsx +++ b/src/pages/identity/containers/Domain/actions/Delete.jsx @@ -11,7 +11,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. - +import React from 'react'; import { ConfirmAction } from 'containers/Action'; import globalDomainStore from 'stores/keystone/domain'; @@ -40,6 +40,25 @@ export default class DeleteAction extends ConfirmAction { allowedCheckFunc = (data) => !data.enabled; + confirmContext = (data) => { + const name = this.getName(data); + return ( +
+
+ {t('Are you sure to {action} (instance: {name})?', { + action: this.actionNameDisplay || this.title, + name, + })} +
+
+ {t( + 'Please note that when deleting a domain, all projects, users, and user groups under the domain will be deleted directly!' + )} +
+
+ ); + }; + onSubmit = (data) => { const { id } = data; return globalDomainStore.delete({ id }); diff --git a/src/pages/identity/containers/Project/actions/Delete.jsx b/src/pages/identity/containers/Project/actions/Delete.jsx index b965f97d..40f88161 100644 --- a/src/pages/identity/containers/Project/actions/Delete.jsx +++ b/src/pages/identity/containers/Project/actions/Delete.jsx @@ -11,7 +11,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. - +import React from 'react'; import { ConfirmAction } from 'containers/Action'; import globalProjectStore from 'stores/keystone/project'; @@ -53,6 +53,25 @@ export default class DeleteAction extends ConfirmAction { }); }; + confirmContext = (data) => { + const name = this.getName(data); + return ( +
+
+ {t('Are you sure to {action} (instance: {name})?', { + action: this.actionNameDisplay || this.title, + name, + })} +
+
+ {t( + 'Before deleting the project, it is recommended to clean up the resources under the project.' + )} +
+
+ ); + }; + onSubmit = (data) => { const { id } = data; return globalProjectStore.delete({ id }); diff --git a/src/resources/keystone/domain.jsx b/src/resources/keystone/domain.jsx index fd79d515..54b93a76 100644 --- a/src/resources/keystone/domain.jsx +++ b/src/resources/keystone/domain.jsx @@ -19,8 +19,9 @@ export const getDomainOptions = (self) => { const { domains } = globalDomainStore; const domainList = (domains || []).filter( (it) => - baseDomains.indexOf(it.name) === -1 || - it.id === (self.item || {}).domain_id + (baseDomains.indexOf(it.name) === -1 || + it.id === (self.item || {}).domain_id) && + !!it.enabled ); return domainList.map((it) => ({ label: it.name,