diff --git a/react/data/schema.graphql b/react/data/schema.graphql index a1634e2d18..00562e5235 100644 --- a/react/data/schema.graphql +++ b/react/data/schema.graphql @@ -131,8 +131,11 @@ type Queries { """Added in 24.03.4.""" vfolder_nodes( + """Added in 24.12.0.""" + scope_id: ScopeField + """Added in 24.09.0.""" - project_id: UUID! + project_id: UUID @deprecated(reason: "Deprecated since 24.12.0. use `scope_id` instead.") """Added in 24.09.0.""" permission: VFolderPermissionValueField @@ -155,8 +158,11 @@ type Queries { compute_session_node( id: GlobalIDField! + """Added in 24.12.0.""" + scope_id: ScopeField + """Added in 24.09.0.""" - project_id: UUID! + project_id: UUID @deprecated(reason: "Deprecated since 24.12.0. use `scope_id` instead.") """Added in 24.09.0. Default is read_attribute.""" permission: SessionPermissionValueField = "read_attribute" @@ -164,8 +170,11 @@ type Queries { """Added in 24.09.0.""" compute_session_nodes( + """Added in 24.12.0.""" + scope_id: ScopeField + """Added in 24.09.0.""" - project_id: UUID! + project_id: UUID @deprecated(reason: "Deprecated since 24.12.0. use `scope_id` instead.") """Added in 24.09.0. Default is read_attribute.""" permission: SessionPermissionValueField = "read_attribute" @@ -411,7 +420,7 @@ type DomainNode implements Node { scaling_groups(filter: String, order: String, offset: Int, before: String, after: String, first: Int, last: Int): ScalinGroupConnection } -"""Added in 24.12.0.""" +"""Added in 24.09.1.""" scalar Bytes """Added in 24.12.0.""" @@ -1493,6 +1502,9 @@ type ContainerRegistryNode implements Node { """Added in 24.09.0.""" ssl_verify: Boolean + + """Added in 24.09.3.""" + extra: JSONString } """Added in 24.09.0.""" @@ -1710,6 +1722,9 @@ type Mutations { """Added in 24.09.0.""" create_container_registry_node( + """Added in 24.09.3.""" + extra: JSONString + """Added in 24.09.0.""" is_global: Boolean @@ -1739,6 +1754,9 @@ type Mutations { """Added in 24.09.0.""" modify_container_registry_node( + """Added in 24.09.3.""" + extra: JSONString + """Object id. Can be either global id or object id. Added in 24.09.0.""" id: String! diff --git a/react/src/components/BAICodeEditor.tsx b/react/src/components/BAICodeEditor.tsx index 32f00a3f34..609953ba7e 100644 --- a/react/src/components/BAICodeEditor.tsx +++ b/react/src/components/BAICodeEditor.tsx @@ -4,8 +4,8 @@ import CodeMirror, { ReactCodeMirrorProps } from '@uiw/react-codemirror'; import { EditorView } from '@uiw/react-codemirror'; interface BAICodeEditorProps extends Omit { - value: string; - onChange: (value: string) => void; + value?: string; + onChange?: (value: string) => void; language: LanguageName; editable?: boolean; showLineNumbers?: boolean; @@ -39,9 +39,9 @@ const BAICodeEditor: React.FC = ({ basicSetup={{ lineNumbers: showLineNumbers, }} - {...CodeMirrorProps} value={script} onChange={(value, viewUpdate) => setScript(value)} + {...CodeMirrorProps} /> ); }; diff --git a/react/src/components/ContainerRegistryEditorModal.tsx b/react/src/components/ContainerRegistryEditorModal.tsx index 5f1cd1919b..acdbd84403 100644 --- a/react/src/components/ContainerRegistryEditorModal.tsx +++ b/react/src/components/ContainerRegistryEditorModal.tsx @@ -1,15 +1,34 @@ +import { useSuspendedBackendaiClient } from '../hooks'; +import { useThemeMode } from '../hooks/useThemeMode'; +import BAICodeEditor from './BAICodeEditor'; import BAIModal, { BAIModalProps } from './BAIModal'; +import Flex from './Flex'; import HiddenFormItem from './HiddenFormItem'; import { ContainerRegistryEditorModalCreateMutation } from './__generated__/ContainerRegistryEditorModalCreateMutation.graphql'; +import { ContainerRegistryEditorModalCreateWithoutExtraMutation } from './__generated__/ContainerRegistryEditorModalCreateWithoutExtraMutation.graphql'; import { ContainerRegistryEditorModalFragment$key } from './__generated__/ContainerRegistryEditorModalFragment.graphql'; import { ContainerRegistryEditorModalModifyMutation } from './__generated__/ContainerRegistryEditorModalModifyMutation.graphql'; +import { ContainerRegistryEditorModalModifyWithoutExtraMutation } from './__generated__/ContainerRegistryEditorModalModifyWithoutExtraMutation.graphql'; +import { ContainerRegistryEditorModalModifyWithoutPasswordAndExtraMutation } from './__generated__/ContainerRegistryEditorModalModifyWithoutPasswordAndExtraMutation.graphql'; import { ContainerRegistryEditorModalModifyWithoutPasswordMutation } from './__generated__/ContainerRegistryEditorModalModifyWithoutPasswordMutation.graphql'; -import { Form, Input, Select, Checkbox, FormInstance, App } from 'antd'; +import { Form, Input, Select, Checkbox, FormInstance, App, theme } from 'antd'; import graphql from 'babel-plugin-relay/macro'; import _ from 'lodash'; import React, { useRef } from 'react'; import { useTranslation } from 'react-i18next'; -import { useFragment, useMutation } from 'react-relay'; +import { useFragment, useMutation, UseMutationConfig } from 'react-relay'; + +type RegistryFormInput = { + row_id?: string; + registry_name: string; + url: string; + type: string; + project: string; + username?: string; + password?: string; + isChangedPassword?: boolean; + extra?: string; +}; interface ContainerRegistryEditorModalProps extends Omit { @@ -20,10 +39,16 @@ const ContainerRegistryEditorModal: React.FC< ContainerRegistryEditorModalProps > = ({ containerRegistryFrgmt = null, onOk, ...modalProps }) => { const { t } = useTranslation(); - const formRef = useRef(null); - + const { token } = theme.useToken(); + const { isDarkMode } = useThemeMode(); const { message, modal } = App.useApp(); + const baiClient = useSuspendedBackendaiClient(); + const isSupportExtraField = + baiClient.isManagerVersionCompatibleWith('24.09.3'); + + const formRef = useRef>(null); + const containerRegistry = useFragment( graphql` fragment ContainerRegistryEditorModalFragment on ContainerRegistryNode { @@ -36,109 +61,24 @@ const ContainerRegistryEditorModal: React.FC< project username ssl_verify + extra @since(version: "24.09.3") } `, containerRegistryFrgmt, ); + const [commitCreateRegistry, isInflightCreateRegistry] = - useMutation(graphql` - mutation ContainerRegistryEditorModalCreateMutation( - $registry_name: String! - $type: ContainerRegistryTypeField! - $url: String! - $is_global: Boolean - $password: String - $project: String - $ssl_verify: Boolean - $username: String - ) { - create_container_registry_node( - registry_name: $registry_name - type: $type - url: $url - is_global: $is_global - password: $password - project: $project - ssl_verify: $ssl_verify - username: $username - ) { - container_registry { - id - } - } - } - `); + useCreateContainerMutation(); const [commitModifyRegistry, isInflightModifyRegistry] = - useMutation(graphql` - mutation ContainerRegistryEditorModalModifyMutation( - $id: String! - $registry_name: String - $type: ContainerRegistryTypeField - $url: String - $is_global: Boolean - $password: String - $project: String - $ssl_verify: Boolean - $username: String - ) { - modify_container_registry_node( - id: $id - registry_name: $registry_name - type: $type - url: $url - is_global: $is_global - password: $password - project: $project - ssl_verify: $ssl_verify - username: $username - ) { - container_registry { - id - } - } - } - `); - - const [ - commitModifyRegistryWithoutPassword, - isInflightModifyRegistryWithoutPassword, - ] = useMutation( - graphql` - mutation ContainerRegistryEditorModalModifyWithoutPasswordMutation( - $id: String! - $registry_name: String - $type: ContainerRegistryTypeField - $url: String - $is_global: Boolean - $project: String - $ssl_verify: Boolean - $username: String - ) { - modify_container_registry_node( - id: $id - registry_name: $registry_name - type: $type - url: $url - is_global: $is_global - project: $project - ssl_verify: $ssl_verify - username: $username - ) { - container_registry { - id - } - } - } - `, - ); + useModifyContainerMutation(); const handleSave = async () => { return formRef.current ?.validateFields() .then((values) => { let mutationVariables = { - id: _.isEmpty(values.row_id) ? undefined : values.row_id, + id: values.row_id, registry_name: values.registry_name, url: values.url, type: values.type, @@ -150,37 +90,20 @@ const ContainerRegistryEditorModal: React.FC< ? null // unset : values.password : undefined, // no change + extra: _.isEmpty(values.extra) + ? null + : JSON.stringify(JSON.parse(values.extra ?? '{}')), }; + if (containerRegistry) { - if (!values.isChangedPassword) { - delete mutationVariables.password; - commitModifyRegistryWithoutPassword({ - variables: mutationVariables, - onCompleted: (res, errors) => { - if ( - _.isEmpty( - res.modify_container_registry_node?.container_registry, - ) - ) { - message.error(t('dialog.ErrorOccurred')); - return; - } - if (errors && errors.length > 0) { - const errorMsgList = _.map(errors, (error) => error.message); - for (const error of errorMsgList) { - message.error(error, 2.5); - } - } else { - onOk && onOk('modify'); - } - }, - onError: (error) => { - message.error(t('dialog.ErrorOccurred')); + commitModifyRegistry( + { + variables: { + ...mutationVariables, + ...(mutationVariables.id + ? { id: mutationVariables.id } + : { id: '' }), }, - }); - } else { - commitModifyRegistry({ - variables: mutationVariables, onCompleted: (res, errors) => { if ( _.isEmpty( @@ -202,8 +125,9 @@ const ContainerRegistryEditorModal: React.FC< onError: (error) => { message.error(t('dialog.ErrorOccurred')); }, - }); - } + }, + values.isChangedPassword ?? false, + ); } else { mutationVariables = _.omitBy(mutationVariables, _.isNil) as Required< typeof mutationVariables @@ -244,11 +168,7 @@ const ContainerRegistryEditorModal: React.FC< : t('registry.AddRegistry') } okText={containerRegistry ? t('button.Save') : t('button.Add')} - confirmLoading={ - isInflightCreateRegistry || - isInflightModifyRegistry || - isInflightModifyRegistryWithoutPassword - } + confirmLoading={isInflightCreateRegistry || isInflightModifyRegistry} onOk={() => { formRef.current ?.validateFields() @@ -284,6 +204,13 @@ const ContainerRegistryEditorModal: React.FC< containerRegistry ? { ...containerRegistry, + extra: containerRegistry?.extra + ? JSON.stringify( + JSON.parse(containerRegistry?.extra), + null, + 2, + ) + : '', } : {} } @@ -474,9 +401,297 @@ const ContainerRegistryEditorModal: React.FC< ); }} + {isSupportExtraField && ( + + + { + if (value) { + try { + JSON.parse(value); + } catch (e) { + return Promise.reject( + t('registry.DescExtraJsonFormat'), + ); + } + } + return Promise.resolve(); + }, + }, + ]} + > + + + + + )} ); }; +function useCreateContainerMutation() { + const baiClient = useSuspendedBackendaiClient(); + const isSupportExtraField = + baiClient.isManagerVersionCompatibleWith('24.09.3'); + const [commitCreateRegistry, isInflightCreateRegistry] = + useMutation(graphql` + mutation ContainerRegistryEditorModalCreateMutation( + $registry_name: String! + $type: ContainerRegistryTypeField! + $url: String! + $is_global: Boolean + $password: String + $project: String + $ssl_verify: Boolean + $username: String + $extra: JSONString + ) { + create_container_registry_node( + registry_name: $registry_name + type: $type + url: $url + is_global: $is_global + password: $password + project: $project + ssl_verify: $ssl_verify + username: $username + extra: $extra + ) { + container_registry { + id + } + } + } + `); + + // Because the input of mutation is provided as some argument, not the input type, + // versions of the mutation that do not include a particular argument are provided with 'Without'. + const [ + commitCreateRegistryWithoutExtra, + isInflightCreateRegistryWithoutExtra, + ] = useMutation( + graphql` + mutation ContainerRegistryEditorModalCreateWithoutExtraMutation( + $registry_name: String! + $type: ContainerRegistryTypeField! + $url: String! + $is_global: Boolean + $password: String + $project: String + $ssl_verify: Boolean + $username: String + ) { + create_container_registry_node( + registry_name: $registry_name + type: $type + url: $url + is_global: $is_global + password: $password + project: $project + ssl_verify: $ssl_verify + username: $username + ) { + container_registry { + id + } + } + } + `, + ); + + return isSupportExtraField + ? ([commitCreateRegistry, isInflightCreateRegistry] as const) + : ([ + commitCreateRegistryWithoutExtra, + isInflightCreateRegistryWithoutExtra, + ] as const); +} + +function useModifyContainerMutation() { + const baiClient = useSuspendedBackendaiClient(); + const isSupportExtraField = + baiClient.isManagerVersionCompatibleWith('24.09.3'); + + const [commitModifyRegistry, isInflightModifyRegistry] = + useMutation(graphql` + mutation ContainerRegistryEditorModalModifyMutation( + $id: String! + $registry_name: String + $type: ContainerRegistryTypeField + $url: String + $is_global: Boolean + $password: String + $project: String + $ssl_verify: Boolean + $username: String + $extra: JSONString + ) { + modify_container_registry_node( + id: $id + registry_name: $registry_name + type: $type + url: $url + is_global: $is_global + password: $password + project: $project + ssl_verify: $ssl_verify + username: $username + extra: $extra + ) { + container_registry { + id + } + } + } + `); + + const [ + commitModifyRegistryWithoutExtra, + isInflightModifyRegistryWithoutExtra, + ] = useMutation( + graphql` + mutation ContainerRegistryEditorModalModifyWithoutExtraMutation( + $id: String! + $registry_name: String + $type: ContainerRegistryTypeField + $url: String + $is_global: Boolean + $password: String + $project: String + $ssl_verify: Boolean + $username: String + ) { + modify_container_registry_node( + id: $id + registry_name: $registry_name + type: $type + url: $url + is_global: $is_global + password: $password + project: $project + ssl_verify: $ssl_verify + username: $username + ) { + container_registry { + id + } + } + } + `, + ); + + const [ + commitModifyRegistryWithoutPassword, + isInflightModifyRegistryWithoutPassword, + ] = useMutation( + graphql` + mutation ContainerRegistryEditorModalModifyWithoutPasswordMutation( + $id: String! + $registry_name: String + $type: ContainerRegistryTypeField + $url: String + $is_global: Boolean + $project: String + $ssl_verify: Boolean + $username: String + $extra: JSONString + ) { + modify_container_registry_node( + id: $id + registry_name: $registry_name + type: $type + url: $url + is_global: $is_global + project: $project + ssl_verify: $ssl_verify + username: $username + extra: $extra + ) { + container_registry { + id + } + } + } + `, + ); + + const [ + commitModifyRegistryWithoutPasswordAndExtra, + isInflightModifyRegistryWithoutPasswordAndExtra, + ] = + useMutation( + graphql` + mutation ContainerRegistryEditorModalModifyWithoutPasswordAndExtraMutation( + $id: String! + $registry_name: String + $type: ContainerRegistryTypeField + $url: String + $is_global: Boolean + $project: String + $ssl_verify: Boolean + $username: String + ) { + modify_container_registry_node( + id: $id + registry_name: $registry_name + type: $type + url: $url + is_global: $is_global + project: $project + ssl_verify: $ssl_verify + username: $username + ) { + container_registry { + id + } + } + } + `, + ); + + return [ + ( + config: + | UseMutationConfig + | UseMutationConfig + | UseMutationConfig + | UseMutationConfig, + isChangedPassword: boolean, + ) => { + if (!isChangedPassword && 'password' in config.variables) { + delete config.variables.password; + } + if (isSupportExtraField) { + return isChangedPassword + ? commitModifyRegistry(config) + : commitModifyRegistryWithoutPassword(config); + } else { + return isChangedPassword + ? commitModifyRegistryWithoutExtra(config) + : commitModifyRegistryWithoutPasswordAndExtra(config); + } + }, + isInflightModifyRegistry || + isInflightModifyRegistryWithoutExtra || + isInflightModifyRegistryWithoutPassword || + isInflightModifyRegistryWithoutPasswordAndExtra, + ] as const; +} + export default ContainerRegistryEditorModal; diff --git a/resources/i18n/de.json b/resources/i18n/de.json index a5eadde99f..95cbcd0056 100644 --- a/resources/i18n/de.json +++ b/resources/i18n/de.json @@ -1114,7 +1114,9 @@ "RegistryName": "Registrierungsname", "DescRegistryNameIsEmpty": "Der Registrierungsname ist leer", "RegistryNameAlreadyExists": "Der Registrierungsname ist bereits vorhanden. \nBitte ändern Sie den hinzuzufügenden Registrierungsnamen.", - "Project": "Projekt" + "Project": "Projekt", + "DescExtraJsonFormat": "Bitte geben Sie gültig formatiertes JSON ein", + "ExtraInformation": "Zusätzliche Informationen" }, "resourceGroup": { "ResourceGroups": "Ressourcengruppen", diff --git a/resources/i18n/el.json b/resources/i18n/el.json index 1462cb3c96..926b84a637 100644 --- a/resources/i18n/el.json +++ b/resources/i18n/el.json @@ -1114,7 +1114,9 @@ "RegistryName": "Όνομα Μητρώου", "DescRegistryNameIsEmpty": "Το όνομα μητρώου είναι κενό", "RegistryNameAlreadyExists": "Το όνομα μητρώου υπάρχει ήδη. \nΑλλάξτε το όνομα μητρώου για προσθήκη.", - "Project": "Σχέδιο" + "Project": "Σχέδιο", + "DescExtraJsonFormat": "Εισαγάγετε JSON με έγκυρη μορφή", + "ExtraInformation": "Επιπλέον Πληροφορίες" }, "resourceGroup": { "ResourceGroups": "Ομάδες πόρων", diff --git a/resources/i18n/en.json b/resources/i18n/en.json index b376582e14..591aa00ac2 100644 --- a/resources/i18n/en.json +++ b/resources/i18n/en.json @@ -1243,7 +1243,9 @@ "RegistryName": "Registry Name", "DescRegistryNameIsEmpty": "Registry name is empty", "RegistryNameAlreadyExists": "Registry name already exists. Please change the registry name to add.", - "Project": "Project" + "Project": "Project", + "DescExtraJsonFormat": "Please enter validly formatted JSON", + "ExtraInformation": "Extra Information" }, "resourceGroup": { "ResourceGroups": "Resource Groups", diff --git a/resources/i18n/es.json b/resources/i18n/es.json index 19aa5519de..f18f40a932 100644 --- a/resources/i18n/es.json +++ b/resources/i18n/es.json @@ -905,7 +905,9 @@ "RegistryName": "Nombre de registro", "DescRegistryNameIsEmpty": "El nombre del registro está vacío", "RegistryNameAlreadyExists": "El nombre del registro ya existe. \nCambie el nombre del registro para agregar.", - "Project": "Proyecto" + "Project": "Proyecto", + "DescExtraJsonFormat": "Por favor ingrese JSON con formato válido", + "ExtraInformation": "Información adicional" }, "resourceGroup": { "Active": "Activo", diff --git a/resources/i18n/fi.json b/resources/i18n/fi.json index c0262b61e2..aada45c22c 100644 --- a/resources/i18n/fi.json +++ b/resources/i18n/fi.json @@ -902,7 +902,9 @@ "RegistryName": "Rekisterin nimi", "DescRegistryNameIsEmpty": "Rekisterin nimi on tyhjä", "RegistryNameAlreadyExists": "Rekisterin nimi on jo olemassa. \nMuuta lisättävä rekisterinimi.", - "Project": "Projekti" + "Project": "Projekti", + "DescExtraJsonFormat": "Anna kelvollisesti muotoiltu JSON", + "ExtraInformation": "Lisätiedot" }, "resourceGroup": { "Active": "Aktiivinen", diff --git a/resources/i18n/fr.json b/resources/i18n/fr.json index ff551deda5..60ff772b91 100644 --- a/resources/i18n/fr.json +++ b/resources/i18n/fr.json @@ -1114,7 +1114,9 @@ "RegistryName": "Nom du registre", "DescRegistryNameIsEmpty": "Le nom du registre est vide", "RegistryNameAlreadyExists": "Le nom du registre existe déjà. \nVeuillez modifier le nom du registre à ajouter.", - "Project": "Projet" + "Project": "Projet", + "DescExtraJsonFormat": "Veuillez saisir un JSON au format valide", + "ExtraInformation": "Informations supplémentaires" }, "resourceGroup": { "ResourceGroups": "Groupes de ressources", diff --git a/resources/i18n/id.json b/resources/i18n/id.json index c1945ba295..1d121bba11 100644 --- a/resources/i18n/id.json +++ b/resources/i18n/id.json @@ -1115,7 +1115,9 @@ "RegistryName": "Nama Registri", "DescRegistryNameIsEmpty": "Nama registri kosong", "RegistryNameAlreadyExists": "Nama registri sudah ada. \nSilakan ubah nama registri untuk ditambahkan.", - "Project": "Proyek" + "Project": "Proyek", + "DescExtraJsonFormat": "Silakan masukkan JSON yang diformat secara valid", + "ExtraInformation": "Informasi Tambahan" }, "resourceGroup": { "ResourceGroups": "Grup Sumber Daya", diff --git a/resources/i18n/it.json b/resources/i18n/it.json index 70c123106e..a3aed19a09 100644 --- a/resources/i18n/it.json +++ b/resources/i18n/it.json @@ -1114,7 +1114,9 @@ "RegistryName": "Nome del registro", "DescRegistryNameIsEmpty": "Il nome del registro è vuoto", "RegistryNameAlreadyExists": "Il nome del registro esiste già. \nModificare il nome del registro da aggiungere.", - "Project": "Progetto" + "Project": "Progetto", + "DescExtraJsonFormat": "Inserisci JSON formattato in modo valido", + "ExtraInformation": "Informazioni aggiuntive" }, "resourceGroup": { "ResourceGroups": "Gruppi di risorse", diff --git a/resources/i18n/ja.json b/resources/i18n/ja.json index 2ffb9188d5..7dcafbce70 100644 --- a/resources/i18n/ja.json +++ b/resources/i18n/ja.json @@ -1114,7 +1114,9 @@ "RegistryName": "レジストリ名", "DescRegistryNameIsEmpty": "レジストリ名が空です", "RegistryNameAlreadyExists": "レジストリ名はすでに存在します。\n追加するレジストリ名を変更してください。", - "Project": "プロジェクト" + "Project": "プロジェクト", + "DescExtraJsonFormat": "有効な形式の JSON を入力してください", + "ExtraInformation": "追加情報" }, "resourceGroup": { "ResourceGroups": "リソースグループ", diff --git a/resources/i18n/ko.json b/resources/i18n/ko.json index fc8c46f9b3..48dd888281 100644 --- a/resources/i18n/ko.json +++ b/resources/i18n/ko.json @@ -1230,7 +1230,9 @@ "RegistryName": "레지스트리 이름", "DescRegistryNameIsEmpty": "레지스트리 이름이 비어 있습니다.", "RegistryNameAlreadyExists": "레지스트리 이름이 이미 존재합니다. \n레지스트리 이름을 변경해주세요.", - "Project": "프로젝트" + "Project": "프로젝트", + "DescExtraJsonFormat": "유효한 형식의 JSON을 입력해 주세요", + "ExtraInformation": "추가 정보" }, "resourceGroup": { "ResourceGroups": "자원 그룹", diff --git a/resources/i18n/mn.json b/resources/i18n/mn.json index deec53f107..906e96d9f8 100644 --- a/resources/i18n/mn.json +++ b/resources/i18n/mn.json @@ -1114,7 +1114,9 @@ "RegistryName": "Бүртгэлийн нэр", "DescRegistryNameIsEmpty": "Бүртгэлийн нэр хоосон байна", "RegistryNameAlreadyExists": "Бүртгэлийн нэр аль хэдийн байна. \nНэмэх бүртгэлийн нэрийг өөрчилнө үү.", - "Project": "Төсөл" + "Project": "Төсөл", + "DescExtraJsonFormat": "Зөв форматтай JSON оруулна уу", + "ExtraInformation": "Нэмэлт мэдээлэл" }, "resourceGroup": { "ResourceGroups": "Нөөцийн бүлгүүд", diff --git a/resources/i18n/ms.json b/resources/i18n/ms.json index 193b5d1123..19c18b8f35 100644 --- a/resources/i18n/ms.json +++ b/resources/i18n/ms.json @@ -1114,7 +1114,9 @@ "RegistryName": "Nama Pendaftaran", "DescRegistryNameIsEmpty": "Nama pendaftaran kosong", "RegistryNameAlreadyExists": "Nama pendaftaran sudah wujud. \nSila tukar nama pendaftaran untuk ditambahkan.", - "Project": "Projek" + "Project": "Projek", + "DescExtraJsonFormat": "Sila masukkan JSON yang diformatkan dengan sah", + "ExtraInformation": "Maklumat Tambahan" }, "resourceGroup": { "ResourceGroups": "Kumpulan Sumber", diff --git a/resources/i18n/pl.json b/resources/i18n/pl.json index 9344266842..741ed027ac 100644 --- a/resources/i18n/pl.json +++ b/resources/i18n/pl.json @@ -1114,7 +1114,9 @@ "RegistryName": "Nazwa rejestru", "DescRegistryNameIsEmpty": "Nazwa rejestru jest pusta", "RegistryNameAlreadyExists": "Nazwa rejestru już istnieje. \nZmień nazwę rejestru, aby go dodać.", - "Project": "Projekt" + "Project": "Projekt", + "DescExtraJsonFormat": "Proszę wprowadzić prawidłowo sformatowany JSON", + "ExtraInformation": "Dodatkowe informacje" }, "resourceGroup": { "ResourceGroups": "Grupy zasobów", diff --git a/resources/i18n/pt-BR.json b/resources/i18n/pt-BR.json index e0e00b1cbc..0a9b301f4f 100644 --- a/resources/i18n/pt-BR.json +++ b/resources/i18n/pt-BR.json @@ -1114,7 +1114,9 @@ "RegistryName": "Nome do registro", "DescRegistryNameIsEmpty": "O nome do registro está vazio", "RegistryNameAlreadyExists": "O nome do registro já existe. \nAltere o nome do registro para adicionar.", - "Project": "Projeto" + "Project": "Projeto", + "DescExtraJsonFormat": "Insira JSON formatado de forma válida", + "ExtraInformation": "Informações extras" }, "resourceGroup": { "ResourceGroups": "Grupos de Recursos", diff --git a/resources/i18n/pt.json b/resources/i18n/pt.json index bc0063689a..e24f8ceab8 100644 --- a/resources/i18n/pt.json +++ b/resources/i18n/pt.json @@ -1114,7 +1114,9 @@ "RegistryName": "Nome do Registro", "DescRegistryNameIsEmpty": "O nome do registro está vazio", "RegistryNameAlreadyExists": "O nome do registro já existe. \nAltere o nome do registro para adicionar.", - "Project": "Projeto" + "Project": "Projeto", + "DescExtraJsonFormat": "Insira JSON formatado de forma válida", + "ExtraInformation": "Informações extras" }, "resourceGroup": { "ResourceGroups": "Grupos de Recursos", diff --git a/resources/i18n/ru.json b/resources/i18n/ru.json index 9287ac051d..2d43cc80c4 100644 --- a/resources/i18n/ru.json +++ b/resources/i18n/ru.json @@ -1114,7 +1114,9 @@ "RegistryName": "Имя реестра", "DescRegistryNameIsEmpty": "Имя реестра пусто", "RegistryNameAlreadyExists": "Имя реестра уже существует. \nПожалуйста, измените имя реестра для добавления.", - "Project": "Проект" + "Project": "Проект", + "DescExtraJsonFormat": "Пожалуйста, введите JSON в правильном формате.", + "ExtraInformation": "Дополнительная информация" }, "resourceGroup": { "ResourceGroups": "Группы ресурсов", diff --git a/resources/i18n/th.json b/resources/i18n/th.json index 706213a0f9..5684f2ff7e 100644 --- a/resources/i18n/th.json +++ b/resources/i18n/th.json @@ -1225,7 +1225,9 @@ "RegistryName": "ชื่อรีจิสทรี", "DescRegistryNameIsEmpty": "ชื่อรีจิสทรีว่างเปล่า", "RegistryNameAlreadyExists": "มีชื่อรีจิสทรีอยู่แล้ว \nกรุณาเปลี่ยนชื่อรีจิสทรีที่จะเพิ่ม", - "Project": "โครงการ" + "Project": "โครงการ", + "DescExtraJsonFormat": "โปรดป้อน JSON ที่มีรูปแบบถูกต้อง", + "ExtraInformation": "ข้อมูลเพิ่มเติม" }, "resourceGroup": { "ResourceGroups": "กลุ่มทรัพยากร", diff --git a/resources/i18n/tr.json b/resources/i18n/tr.json index 375e6e0ee0..2fa21bd1c1 100644 --- a/resources/i18n/tr.json +++ b/resources/i18n/tr.json @@ -1113,7 +1113,9 @@ "RegistryName": "Kayıt Defteri Adı", "DescRegistryNameIsEmpty": "Kayıt defteri adı boş", "RegistryNameAlreadyExists": "Kayıt defteri adı zaten mevcut. \nLütfen eklemek için kayıt defteri adını değiştirin.", - "Project": "Proje" + "Project": "Proje", + "DescExtraJsonFormat": "Lütfen geçerli olarak biçimlendirilmiş JSON girin", + "ExtraInformation": "Ekstra Bilgi" }, "resourceGroup": { "ResourceGroups": "Kaynak Grupları", diff --git a/resources/i18n/vi.json b/resources/i18n/vi.json index 8cba295f8b..4d7dcb007b 100644 --- a/resources/i18n/vi.json +++ b/resources/i18n/vi.json @@ -1114,7 +1114,9 @@ "RegistryName": "Tên đăng ký", "DescRegistryNameIsEmpty": "Tên đăng ký trống", "RegistryNameAlreadyExists": "Tên đăng ký đã tồn tại. \nVui lòng thay đổi tên đăng ký để thêm.", - "Project": "Dự án" + "Project": "Dự án", + "DescExtraJsonFormat": "Vui lòng nhập JSON được định dạng hợp lệ", + "ExtraInformation": "Thông tin bổ sung" }, "resourceGroup": { "ResourceGroups": "Nhóm tài nguyên", diff --git a/resources/i18n/zh-CN.json b/resources/i18n/zh-CN.json index 54a25057e8..234cb7380e 100644 --- a/resources/i18n/zh-CN.json +++ b/resources/i18n/zh-CN.json @@ -1114,7 +1114,9 @@ "RegistryName": "注册表名称", "DescRegistryNameIsEmpty": "注册表名称为空", "RegistryNameAlreadyExists": "注册表名称已存在。\n请更改注册表名称来添加。", - "Project": "项目" + "Project": "项目", + "DescExtraJsonFormat": "请输入格式有效的 JSON", + "ExtraInformation": "额外信息" }, "resourceGroup": { "ResourceGroups": "资源组", diff --git a/resources/i18n/zh-TW.json b/resources/i18n/zh-TW.json index cda205850f..37215038ce 100644 --- a/resources/i18n/zh-TW.json +++ b/resources/i18n/zh-TW.json @@ -1115,7 +1115,9 @@ "RegistryName": "註冊表名稱", "DescRegistryNameIsEmpty": "註冊表名稱為空", "RegistryNameAlreadyExists": "註冊表名稱已存在。\n請更改註冊表名稱來新增。", - "Project": "專案" + "Project": "專案", + "DescExtraJsonFormat": "請輸入格式有效的 JSON", + "ExtraInformation": "額外資訊" }, "resourceGroup": { "ResourceGroups": "資源組",