diff --git a/react/src/components/BAIGeneralNotificationItem.tsx b/react/src/components/BAIGeneralNotificationItem.tsx index 9713ffbe34..0cb0dafdac 100644 --- a/react/src/components/BAIGeneralNotificationItem.tsx +++ b/react/src/components/BAIGeneralNotificationItem.tsx @@ -1,10 +1,11 @@ import { NotificationState } from '../hooks/useBAINotification'; +import BAINotificationBackgroundProgress from './BAINotificationBackgroundProgress'; import { CheckCircleOutlined, ClockCircleOutlined, CloseCircleOutlined, } from '@ant-design/icons'; -import { Button, Card, List, Progress, Typography, theme } from 'antd'; +import { Button, Card, List, Typography, theme } from 'antd'; import { BAIFlex } from 'backend.ai-ui'; import dayjs from 'dayjs'; import _ from 'lodash'; @@ -117,36 +118,23 @@ const BAIGeneralNotificationItem: React.FC<{ marginTop: token.marginSM, }} > - - {notification.extraDescription} - + {_.isString(notification.extraDescription) ? ( + + {notification.extraDescription} + + ) : ( + notification.extraDescription + )} ) : null} - {notification.backgroundTask && - _.isNumber(notification.backgroundTask.percent) ? ( - - ) : null} + )} {showDate ? ( diff --git a/react/src/components/BAINodeNotificationItem.tsx b/react/src/components/BAINodeNotificationItem.tsx index aafa38f45d..b35998f560 100644 --- a/react/src/components/BAINodeNotificationItem.tsx +++ b/react/src/components/BAINodeNotificationItem.tsx @@ -1,5 +1,6 @@ import { NotificationState } from '../hooks/useBAINotification'; import BAIComputeSessionNodeNotificationItem from './BAIComputeSessionNodeNotificationItem'; +import BAIVirtualFolderNodeNotificationItem from './BAIVirtualFolderNodeNotificationItem'; import React from 'react'; import { graphql, useRefetchableFragment } from 'react-relay'; import { BAINodeNotificationItemFragment$key } from 'src/__generated__/BAINodeNotificationItemFragment.graphql'; @@ -18,6 +19,8 @@ const nodeFragmentOperation = graphql` ... on VirtualFolderNode { __typename status + ...BAIVirtualFolderNodeNotificationItemFragment + @alias(as: "virtualFolderNodeFrgmt") } } `; @@ -39,6 +42,13 @@ const BAINodeNotificationItem: React.FC<{ /> ); } else if (node?.__typename === 'VirtualFolderNode') { + return ( + + ); } else { // console.warn('Unknown node type in BAINodeNotificationItem:', node); return null; diff --git a/react/src/components/BAINotificationBackgroundProgress.tsx b/react/src/components/BAINotificationBackgroundProgress.tsx new file mode 100644 index 0000000000..425effafaf --- /dev/null +++ b/react/src/components/BAINotificationBackgroundProgress.tsx @@ -0,0 +1,35 @@ +import { Progress, theme } from 'antd'; +import _ from 'lodash'; +import { NotificationState } from 'src/hooks/useBAINotification'; + +interface BAINotificationBackgroundProgressProps { + backgroundTask: NotificationState['backgroundTask']; + showDate?: boolean; +} + +const BAINotificationBackgroundProgress: React.FC< + BAINotificationBackgroundProgressProps +> = ({ backgroundTask, showDate }) => { + 'use memo'; + + const { token } = theme.useToken(); + + return _.isNumber(backgroundTask?.percent) ? ( + + ) : null; +}; + +export default BAINotificationBackgroundProgress; diff --git a/react/src/components/BAIVirtualFolderNodeNotificationItem.tsx b/react/src/components/BAIVirtualFolderNodeNotificationItem.tsx new file mode 100644 index 0000000000..e0eea6d2b9 --- /dev/null +++ b/react/src/components/BAIVirtualFolderNodeNotificationItem.tsx @@ -0,0 +1,135 @@ +import BAINotificationBackgroundProgress from './BAINotificationBackgroundProgress'; +import { useToggle } from 'ahooks'; +import { Card, List, theme, Typography } from 'antd'; +import { BAIFlex, BAILink, BAINotificationItem, BAIText } from 'backend.ai-ui'; +import dayjs from 'dayjs'; +import _ from 'lodash'; +import { useTranslation } from 'react-i18next'; +import { graphql, useFragment } from 'react-relay'; +import { useNavigate } from 'react-router-dom'; +import { BAIVirtualFolderNodeNotificationItemFragment$key } from 'src/__generated__/BAIVirtualFolderNodeNotificationItemFragment.graphql'; +import { + NotificationState, + useSetBAINotification, +} from 'src/hooks/useBAINotification'; + +interface BAIVirtualFolderNodeNotificationItemProps { + notification: NotificationState; + virtualFolderNodeFrgmt: BAIVirtualFolderNodeNotificationItemFragment$key | null; + showDate?: boolean; +} + +const BAIVirtualFolderNodeNotificationItem: React.FC< + BAIVirtualFolderNodeNotificationItemProps +> = ({ notification, virtualFolderNodeFrgmt, showDate }) => { + 'use memo'; + + const navigate = useNavigate(); + const { t } = useTranslation(); + const { token } = theme.useToken(); + const { closeNotification } = useSetBAINotification(); + const [showExtraDescription, { toggle: toggleShowExtraDescription }] = + useToggle(false); + + const node = useFragment( + graphql` + fragment BAIVirtualFolderNodeNotificationItemFragment on VirtualFolderNode { + row_id + id + name + status + } + `, + virtualFolderNodeFrgmt, + ); + + return ( + node && ( + + {t('general.Folder')}:  + { + navigate( + `/data${node.row_id ? `?${new URLSearchParams({ folder: node.row_id }).toString()}` : ''}`, + ); + closeNotification(notification.key); + }} + > + {node.name} + + + } + description={ + + + + {_.isString(notification.description) ? ( + + {_.truncate(notification.description, { length: 300 })} + + ) : ( + notification.description + )} + + {notification.extraDescription && !notification?.onCancel ? ( + + { + toggleShowExtraDescription(); + }} + > + {t('notification.SeeDetail')} + + + ) : null} + + + {notification.extraDescription && showExtraDescription ? ( + + {_.isString(notification.extraDescription) ? ( + + {notification.extraDescription} + + ) : ( + notification.extraDescription + )} + + ) : null} + + {notification.backgroundTask && ( + + )} + + + } + footer={ + showDate ? dayjs(notification.created).format('lll') : undefined + } + /> + ) + ); +}; + +export default BAIVirtualFolderNodeNotificationItem; diff --git a/react/src/components/VFolderNodes.tsx b/react/src/components/VFolderNodes.tsx index e79149d55d..61087ec9c4 100644 --- a/react/src/components/VFolderNodes.tsx +++ b/react/src/components/VFolderNodes.tsx @@ -2,7 +2,7 @@ import { VFolderNodesFragment$data, VFolderNodesFragment$key, } from '../__generated__/VFolderNodesFragment.graphql'; -import { useSuspendedBackendaiClient } from '../hooks'; +import { useSuspendedBackendaiClient, useWebUINavigate } from '../hooks'; import { useCurrentUserInfo } from '../hooks/backendai'; import { useTanMutation } from '../hooks/reactQueryAlias'; import { useSetBAINotification } from '../hooks/useBAINotification'; @@ -84,6 +84,7 @@ const VFolderNodes: React.FC = ({ const { upsertNotification } = useSetBAINotification(); const { generateFolderPath } = useFolderExplorerOpener(); const { getErrorMessage } = useErrorMessageResolver(); + const navigate = useWebUINavigate(); const [deletingVFolder, setDeletingVFolder] = useState(null); @@ -107,6 +108,7 @@ const VFolderNodes: React.FC = ({ ...VFolderNodeIdenticonFragment ...SharedFolderPermissionInfoModalFragment ...BAIVFolderDeleteButtonFragment + ...BAINodeNotificationItemFragment } `, vfoldersFrgmt, @@ -274,6 +276,8 @@ const VFolderNodes: React.FC = ({ }, onError: (error) => { upsertNotification({ + key: `vfolder-error-${vfolder?.id}`, + node: vfolder, description: getErrorMessage(error), open: true, }); @@ -298,9 +302,49 @@ const VFolderNodes: React.FC = ({ ); }, onError: (error) => { + const matchString = error?.message.match( + /sessions\(ids: (\[.*?\])\)/, + )?.[1]; + const occupiedSession = JSON.parse( + matchString?.replace(/'/g, '"') || '[]', + ); upsertNotification({ - description: getErrorMessage(error), open: true, + key: `vfolder-error-${vfolder?.id}`, + node: vfolder, + description: getErrorMessage(error).replace( + /\(ids[\s\S]*$/, + '', + ), + extraDescription: !_.isEmpty(occupiedSession) ? ( + + + {t('data.folders.MountedSessions')} + + {_.map(occupiedSession, (sessionId) => ( + { + navigate({ + pathname: '/session', + search: new URLSearchParams({ + sessionDetail: sessionId, + }).toString(), + }); + }} + > + {sessionId} + + ))} + + ) : null, }); }, }); @@ -427,6 +471,8 @@ const VFolderNodes: React.FC = ({ }, onError: (error) => { upsertNotification({ + key: `vfolder-error-${deletingVFolder?.id}`, + ...(deletingVFolder && { node: deletingVFolder }), description: getErrorMessage(error), open: true, }); diff --git a/react/src/hooks/useBAINotification.tsx b/react/src/hooks/useBAINotification.tsx index a98982da2f..40d2d36d81 100644 --- a/react/src/hooks/useBAINotification.tsx +++ b/react/src/hooks/useBAINotification.tsx @@ -64,7 +64,7 @@ export interface NotificationState renderDataMessage?: (message?: string) => React.ReactNode; promise?: Promise | null; }; - extraDescription?: string | null; + extraDescription?: ReactNode | null; onCancel?: (() => void) | null; skipDesktopNotification?: boolean; extraData: any; @@ -279,6 +279,8 @@ export const useBAINotificationEffect = () => { * @returns An object containing functions for manipulating notifications. */ export const useSetBAINotification = () => { + 'use memo'; + // Don't use _notifications carefully when you need to mutate it. const setNotifications = useSetAtom(notificationListState); const [desktopNotification] = useBAISettingUserState('desktop_notification'); diff --git a/resources/i18n/de.json b/resources/i18n/de.json index bc02f60df0..9bbc3af25f 100644 --- a/resources/i18n/de.json +++ b/resources/i18n/de.json @@ -402,6 +402,7 @@ "MaxSize": "Maximale Größe", "ModifyPermissions": "Berechtigungen ändern", "MountPermission": "Erlaubnis montieren", + "MountedSessions": "Gemountete Sitzungen", "MoveToTrash": "Ziehen Sie zu Müllbehälter", "MoveToTrashDescription": "Sind Sie sicher, dass Sie \"{{folderName}}\" in den Müll verschieben möchten?", "MoveToTrashMultipleDescription": "Sind Sie sicher, dass Sie {{folderLength}} Ordner in Müll bin verschieben möchten?", @@ -693,6 +694,7 @@ "Enabled": "aktiviert", "ErrorOccurred": "Etwas lief schief. \nBitte versuchen Sie es später erneut.", "ExtendLoginSession": "Eine Anmeldesitzung verlängern", + "Folder": "Ordner", "Folders": "Ordner", "General": "Allgemein", "Image": "Bild", diff --git a/resources/i18n/el.json b/resources/i18n/el.json index 0790161139..9aa4006a4e 100644 --- a/resources/i18n/el.json +++ b/resources/i18n/el.json @@ -400,6 +400,7 @@ "MaxSize": "Μέγιστο μέγεθος", "ModifyPermissions": "Τροποποίηση δικαιωμάτων", "MountPermission": "Τοποθετημένος άδεια", + "MountedSessions": "Προσαρτημένες συνεδρίες", "MoveToTrash": "Μετακίνηση στον κάδο απορριμμάτων", "MoveToTrashDescription": "Είστε βέβαιοι ότι θέλετε να μετακινήσετε το \"{{ folderName }}\" στον κάδο απορριμμάτων;", "MoveToTrashMultipleDescription": "Είστε σίγουροι ότι θέλετε να μετακινήσετε τους φακέλους {{ folderLength }} στον κάδο απορριμμάτων;", @@ -690,6 +691,7 @@ "Enabled": "Ενεργοποιήθηκε", "ErrorOccurred": "Κάτι πήγε στραβά. \nΔοκιμάστε ξανά αργότερα.", "ExtendLoginSession": "Επέκταση μιας περιόδου σύνδεσης", + "Folder": "Φάκελος", "Folders": "Φάκελοι", "General": "Γενικά", "Image": "Εικόνα", diff --git a/resources/i18n/en.json b/resources/i18n/en.json index 59a2820671..ca43abbec9 100644 --- a/resources/i18n/en.json +++ b/resources/i18n/en.json @@ -405,6 +405,7 @@ "MaxSize": "Max Size", "ModifyPermissions": "Modify permissions", "MountPermission": "Mount Permission", + "MountedSessions": "Mounted Sessions", "MoveToTrash": "Move to trash bin", "MoveToTrashDescription": "Are you sure you want to move \"{{ folderName }}\" to trash bin?", "MoveToTrashMultipleDescription": "Are you sure you want to move {{ folderLength }} folders to trash bin?", @@ -698,6 +699,7 @@ "Enabled": "Enabled", "ErrorOccurred": "Something went wrong. Please try again later.", "ExtendLoginSession": "Extend login session", + "Folder": "Folder", "Folders": "Folders", "General": "General", "Image": "Image", diff --git a/resources/i18n/es.json b/resources/i18n/es.json index d61effb27d..c283ce1d64 100644 --- a/resources/i18n/es.json +++ b/resources/i18n/es.json @@ -402,6 +402,7 @@ "MaxSize": "Tamaño máximo", "ModifyPermissions": "Modificar permisos", "MountPermission": "Montar permiso", + "MountedSessions": "Sesiones montadas", "MoveToTrash": "Muévete a la basura de la basura", "MoveToTrashDescription": "¿Estás seguro de que quieres mover \"{{folderName}}\" a la basura?", "MoveToTrashMultipleDescription": "¿Estás seguro de que quieres mover las carpetas {{folderLength}} a la basura?", @@ -693,6 +694,7 @@ "Enabled": "Activado", "ErrorOccurred": "Algo salió mal. \nVuelva a intentarlo más tarde.", "ExtendLoginSession": "Prolongar una sesión de inicio de sesión", + "Folder": "Carpeta", "Folders": "Carpetas", "General": "General", "Image": "Imagen", diff --git a/resources/i18n/fi.json b/resources/i18n/fi.json index a411722b7d..6ae07cc21f 100644 --- a/resources/i18n/fi.json +++ b/resources/i18n/fi.json @@ -402,6 +402,7 @@ "MaxSize": "Enimmäiskoko", "ModifyPermissions": "Muokkaa käyttöoikeuksia", "MountPermission": "Kiinnityslupa", + "MountedSessions": "Liitetyt istunnot", "MoveToTrash": "Siirry roskakoriin", "MoveToTrashDescription": "Oletko varma, että haluat siirtää \"{{folderName}}\" roskakoriin?", "MoveToTrashMultipleDescription": "Haluatko varmasti liikuttaa {{folderLength}} kansioita roskakoriin?", @@ -693,6 +694,7 @@ "Enabled": "Käytössä", "ErrorOccurred": "Jotain meni pieleen. \nYritä myöhemmin uudelleen.", "ExtendLoginSession": "Sisäänkirjautumisistunnon laajentaminen", + "Folder": "Kansio", "Folders": "Kansiot", "General": "Yleistä", "Image": "Kuva", diff --git a/resources/i18n/fr.json b/resources/i18n/fr.json index f95d8882bc..399183553f 100644 --- a/resources/i18n/fr.json +++ b/resources/i18n/fr.json @@ -402,6 +402,7 @@ "MaxSize": "Taille maximale", "ModifyPermissions": "Modifier les autorisations", "MountPermission": "Autorisation de montage", + "MountedSessions": "Sessions montées", "MoveToTrash": "Déplacer dans la poubelle", "MoveToTrashDescription": "Êtes-vous sûr de vouloir déplacer \"{{folderName}}\" pour corberer le bac?", "MoveToTrashMultipleDescription": "Êtes-vous sûr de vouloir déplacer des dossiers {{folderLength}} aux déchets?", @@ -693,6 +694,7 @@ "Enabled": "Activée", "ErrorOccurred": "Quelque chose s'est mal passé. \nVeuillez réessayer plus tard.", "ExtendLoginSession": "Prolonger une session de connexion", + "Folder": "Dossier", "Folders": "Dossiers", "General": "Général", "Image": "Image", diff --git a/resources/i18n/id.json b/resources/i18n/id.json index cee69cbc97..f27a821c8e 100644 --- a/resources/i18n/id.json +++ b/resources/i18n/id.json @@ -401,6 +401,7 @@ "MaxSize": "Ukuran maksimal", "ModifyPermissions": "Memodifikasi izin", "MountPermission": "MUNGGAL Izin", + "MountedSessions": "Sesi Terpasang", "MoveToTrash": "Pindah ke tempat sampah", "MoveToTrashDescription": "Apakah Anda yakin ingin memindahkan \"{{folderName}}\" ke tempat sampah?", "MoveToTrashMultipleDescription": "Apakah Anda yakin ingin memindahkan {{folderLength}} folder ke tempat sampah?", @@ -692,6 +693,7 @@ "Enabled": "Diaktifkan", "ErrorOccurred": "Ada yang salah. \nSilakan coba lagi nanti.", "ExtendLoginSession": "Memperpanjang sesi masuk", + "Folder": "Folder", "Folders": "Folder", "General": "Umum", "Image": "Gambar", diff --git a/resources/i18n/it.json b/resources/i18n/it.json index d66646b042..de12db67ee 100644 --- a/resources/i18n/it.json +++ b/resources/i18n/it.json @@ -401,6 +401,7 @@ "MaxSize": "Dimensione massima", "ModifyPermissions": "Modificare le autorizzazioni", "MountPermission": "Autorizzazione del montaggio", + "MountedSessions": "Sessioni montate", "MoveToTrash": "Passa al cestino della spazzatura", "MoveToTrashDescription": "Sei sicuro di voler spostare \"{{folderName}}\" in cestino?", "MoveToTrashMultipleDescription": "Sei sicuro di voler spostare le cartelle {{folderLength}} per spazzare via?", @@ -692,6 +693,7 @@ "Enabled": "Abilitato", "ErrorOccurred": "Qualcosa è andato storto. \nPer favore riprova più tardi.", "ExtendLoginSession": "Estendere una sessione di login", + "Folder": "Cartella", "Folders": "cartelle", "General": "Generale", "Image": "Immagine", diff --git a/resources/i18n/ja.json b/resources/i18n/ja.json index 5bede80cc8..beb7d00431 100644 --- a/resources/i18n/ja.json +++ b/resources/i18n/ja.json @@ -401,6 +401,7 @@ "MaxSize": "最大サイズ", "ModifyPermissions": "権限修正", "MountPermission": "マウント許可", + "MountedSessions": "マウント済みセッション", "MoveToTrash": "ゴミ箱に移動します", "MoveToTrashDescription": "「{{{folderName}}」をゴミ箱に移動したいですか?", "MoveToTrashMultipleDescription": "{{folderLength}}フォルダーをトラッシュビンに移動しますか?", @@ -692,6 +693,7 @@ "Enabled": "有効", "ErrorOccurred": "何かがうまくいかなかった。\n後でもう一度やり直してください。", "ExtendLoginSession": "ログインセッションの延長", + "Folder": "フォルダ", "Folders": "フォルダー", "General": "一般", "Image": "画像", diff --git a/resources/i18n/ko.json b/resources/i18n/ko.json index 650eb52052..0a5e0f13be 100644 --- a/resources/i18n/ko.json +++ b/resources/i18n/ko.json @@ -404,6 +404,7 @@ "MaxSize": "최대 크기", "ModifyPermissions": "권한 수정", "MountPermission": "마운트 권한", + "MountedSessions": "마운트 된 세션", "MoveToTrash": "휴지통으로 이동", "MoveToTrashDescription": "\"{{ folderName }}\"을(를) 휴지통으로 이동하시겠습니까?", "MoveToTrashMultipleDescription": "{{folderLength}}개의 폴더를 휴지통으로 이동하시겠습니까?", @@ -696,6 +697,7 @@ "Enabled": "활성화", "ErrorOccurred": "문제가 발생했습니다. 잠시 후 다시 시도해 주세요.", "ExtendLoginSession": "로그인 세션 연장", + "Folder": "폴더", "Folders": "폴더", "General": "일반", "Image": "이미지", diff --git a/resources/i18n/mn.json b/resources/i18n/mn.json index e93cd0ff5d..58478e5e2b 100644 --- a/resources/i18n/mn.json +++ b/resources/i18n/mn.json @@ -401,6 +401,7 @@ "MaxSize": "Хамгийн их хэмжээ", "ModifyPermissions": "Зөвшөөрлийг өөрчлөх", "MountPermission": "ЗОРИУЛСАН", + "MountedSessions": "Маунтлагдсан сессүүд", "MoveToTrash": "Хогийн сав руу шилжих", "MoveToTrashDescription": "Та \"{{folderName}}\" хогийн сав руу шилжихийг хүсч байна уу?", "MoveToTrashMultipleDescription": "Та {{folderLength}} хавтас руу зөөхийг хүсч байна уу?", @@ -691,6 +692,7 @@ "Enabled": "Идэвхжсэн", "ErrorOccurred": "Ямар нэг зүйл буруу болсон. \nДараа дахин оролдоно уу.", "ExtendLoginSession": "Нэвтрэх сессийг сунгах", + "Folder": "Хавтас", "Folders": "Фолдерууд", "General": "Генерал", "Image": "Зураг", diff --git a/resources/i18n/ms.json b/resources/i18n/ms.json index 1cfdd5b1ea..c55f1c1c3e 100644 --- a/resources/i18n/ms.json +++ b/resources/i18n/ms.json @@ -401,6 +401,7 @@ "MaxSize": "Saiz maks", "ModifyPermissions": "Ubah suai kebenaran", "MountPermission": "Izin gunung", + "MountedSessions": "Sesi Terpasang", "MoveToTrash": "Pindah ke Tong sampah", "MoveToTrashDescription": "Adakah anda pasti mahu bergerak \"{{folderName}}\" ke sampah sampah?", "MoveToTrashMultipleDescription": "Adakah anda pasti mahu bergerak {{folderLength}} folder ke sampah tong?", @@ -692,6 +693,7 @@ "Enabled": "Diaktifkan", "ErrorOccurred": "Ada yang tidak kena. \nSila cuba lagi kemudian.", "ExtendLoginSession": "Lanjutkan sesi log masuk", + "Folder": "Folder", "Folders": "Folder", "General": "Umum", "Image": "Gambar", diff --git a/resources/i18n/pl.json b/resources/i18n/pl.json index 891cb96c4d..228030cd68 100644 --- a/resources/i18n/pl.json +++ b/resources/i18n/pl.json @@ -402,6 +402,7 @@ "MaxSize": "Max rozmiar", "ModifyPermissions": "Modyfikowanie uprawnień", "MountPermission": "Zamontować pozwolenie", + "MountedSessions": "Zamontowane sesje", "MoveToTrash": "Przenieś się do kosza na śmieci", "MoveToTrashDescription": "Czy na pewno chcesz przenieść „{{folderName}}” do kosza na śmieci?", "MoveToTrashMultipleDescription": "Czy na pewno chcesz przenieść foldery {{folderLength}} do śmieci?", @@ -692,6 +693,7 @@ "Enabled": "Włączone", "ErrorOccurred": "Coś poszło nie tak. \nSpróbuj ponownie później.", "ExtendLoginSession": "Przedłużanie sesji logowania", + "Folder": "Folder", "Folders": "Lornetka składana", "General": "Ogólne", "Image": "Obraz", diff --git a/resources/i18n/pt-BR.json b/resources/i18n/pt-BR.json index e792ee8038..afd4626684 100644 --- a/resources/i18n/pt-BR.json +++ b/resources/i18n/pt-BR.json @@ -402,6 +402,7 @@ "MaxSize": "Tamanho máximo", "ModifyPermissions": "Modificar permissões", "MountPermission": "Permissão de montagem", + "MountedSessions": "Sessões Montadas", "MoveToTrash": "Mover para a lixeira", "MoveToTrashDescription": "Tem certeza de que deseja mover \"{{folderName}}\" para a lixeira?", "MoveToTrashMultipleDescription": "Tem certeza de que deseja mover {{folderLength}} pastas para a lixeira?", @@ -693,6 +694,7 @@ "Enabled": "Habilitado", "ErrorOccurred": "Algo deu errado. \nPor favor, tente novamente mais tarde.", "ExtendLoginSession": "Prolongar uma sessão de início de sessão", + "Folder": "Pasta", "Folders": "Pastas", "General": "Geral", "Image": "Imagem", diff --git a/resources/i18n/pt.json b/resources/i18n/pt.json index 74aaa99422..1863c1e79e 100644 --- a/resources/i18n/pt.json +++ b/resources/i18n/pt.json @@ -402,6 +402,7 @@ "MaxSize": "Tamanho máximo", "ModifyPermissions": "Modificar permissões", "MountPermission": "Permissão de montagem", + "MountedSessions": "Sessões montadas", "MoveToTrash": "Mover para a lixeira", "MoveToTrashDescription": "Tem certeza de que deseja mover \"{{folderName}}\" para a lixeira?", "MoveToTrashMultipleDescription": "Tem certeza de que deseja mover {{folderLength}} pastas para lixo?", @@ -693,6 +694,7 @@ "Enabled": "Habilitado", "ErrorOccurred": "Algo deu errado. \nPor favor, tente novamente mais tarde.", "ExtendLoginSession": "Prolongar uma sessão de início de sessão", + "Folder": "Pasta", "Folders": "Pastas", "General": "Geral", "Image": "Imagem", diff --git a/resources/i18n/ru.json b/resources/i18n/ru.json index be54576e66..f164e2c4b0 100644 --- a/resources/i18n/ru.json +++ b/resources/i18n/ru.json @@ -402,6 +402,7 @@ "MaxSize": "Максимальный размер", "ModifyPermissions": "Изменение прав доступа", "MountPermission": "Разрешение на крепление", + "MountedSessions": "Смонтированные сессии", "MoveToTrash": "Переехать в мусорное ведро", "MoveToTrashDescription": "Вы уверены, что хотите переместить \"{{folderName}}\" в мусорное ведро?", "MoveToTrashMultipleDescription": "Вы уверены, что хотите переместить папки {{folderLength}} в мусор?", @@ -692,6 +693,7 @@ "Enabled": "Включено", "ErrorOccurred": "Что -то пошло не так. \nПожалуйста, попробуйте еще раз позже.", "ExtendLoginSession": "Продление сеанса входа в систему", + "Folder": "Папка", "Folders": "Папки", "General": "Общие сведения", "Image": "Изображение", diff --git a/resources/i18n/th.json b/resources/i18n/th.json index cd9c459bfe..d1867d0313 100644 --- a/resources/i18n/th.json +++ b/resources/i18n/th.json @@ -402,6 +402,7 @@ "MaxSize": "ขนาดสูงสุด", "ModifyPermissions": "แก้ไขสิทธิ์", "MountPermission": "การอนุญาตเมานต์", + "MountedSessions": "เซสชันที่เมานต์", "MoveToTrash": "ย้ายไปที่ถังขยะ", "MoveToTrashDescription": "คุณแน่ใจหรือไม่ว่าต้องการย้าย \"{{folderName}}\" ไปยังถังขยะ?", "MoveToTrashMultipleDescription": "คุณแน่ใจหรือว่าคุณต้องการย้ายโฟลเดอร์ {{folderLength}} ไปยังถังขยะ?", @@ -682,6 +683,7 @@ "Enabled": "เปิดใช้งาน", "ErrorOccurred": "มีบางอย่างผิดปกติ \nโปรดลองอีกครั้งในภายหลัง", "ExtendLoginSession": "ขยายเซสชันการเข้าสู่ระบบ", + "Folder": "โฟลเดอร์", "Folders": "โฟลเดอร์", "General": "ทั่วไป", "Image": "อิมเมจ", diff --git a/resources/i18n/tr.json b/resources/i18n/tr.json index b2e7544fbf..7fed7e9236 100644 --- a/resources/i18n/tr.json +++ b/resources/i18n/tr.json @@ -402,6 +402,7 @@ "MaxSize": "Maksimum Boyut", "ModifyPermissions": "İzinleri değiştirme", "MountPermission": "Montaj İzni", + "MountedSessions": "Bağlanmış Oturumlar", "MoveToTrash": "Çöp kutusuna geç", "MoveToTrashDescription": "\"{{folderName}}\" ı çöp kutusuna taşımak istediğinizden emin misiniz?", "MoveToTrashMultipleDescription": "{{folderLength}} klasörlerini çöpe taşımak istediğinizden emin misiniz?", @@ -693,6 +694,7 @@ "Enabled": "Etkin", "ErrorOccurred": "Bir şeyler ters gitti. \nLütfen daha sonra tekrar deneyin.", "ExtendLoginSession": "Oturum açma oturumunu uzatma", + "Folder": "Klasör", "Folders": "klasörler", "General": "Genel", "Image": "Resim", diff --git a/resources/i18n/vi.json b/resources/i18n/vi.json index a6ec426f90..6fd1e36de6 100644 --- a/resources/i18n/vi.json +++ b/resources/i18n/vi.json @@ -402,6 +402,7 @@ "MaxSize": "Kích thước tối đa", "ModifyPermissions": "Sửa đổi quyền", "MountPermission": "Gắn kết quyền", + "MountedSessions": "Các phiên đã gắn", "MoveToTrash": "Di chuyển đến thùng rác", "MoveToTrashDescription": "Bạn có chắc là bạn muốn di chuyển \"{{folderName}}\" sang thùng rác không?", "MoveToTrashMultipleDescription": "Bạn có chắc là bạn muốn di chuyển {{folderLength}} các thư mục sang thùng rác không?", @@ -693,6 +694,7 @@ "Enabled": "Đã bật", "ErrorOccurred": "Có gì đó đã sai. \nVui lòng thử lại sau.", "ExtendLoginSession": "Gia hạn phiên đăng nhập", + "Folder": "Thư mục", "Folders": "Thư mục", "General": "Tổng quan", "Image": "Hình ảnh", diff --git a/resources/i18n/zh-CN.json b/resources/i18n/zh-CN.json index 70ca505cd3..5c58e8ec76 100644 --- a/resources/i18n/zh-CN.json +++ b/resources/i18n/zh-CN.json @@ -402,6 +402,7 @@ "MaxSize": "最大尺寸", "ModifyPermissions": "修改权限", "MountPermission": "安装许可", + "MountedSessions": "已挂载的会话", "MoveToTrash": "移至垃圾箱", "MoveToTrashDescription": "您确定要将“ {{folderName}}”移至垃圾桶?", "MoveToTrashMultipleDescription": "您确定要将{{folderLength}}文件夹移动到垃圾桶中吗?", @@ -693,6 +694,7 @@ "Enabled": "启用", "ErrorOccurred": "出了点问题。\n请稍后再试。", "ExtendLoginSession": "延长登录会话", + "Folder": "文件夹", "Folders": "文件夹", "General": "一般情况", "Image": "图像", diff --git a/resources/i18n/zh-TW.json b/resources/i18n/zh-TW.json index b5f533fd2b..ee30a4f565 100644 --- a/resources/i18n/zh-TW.json +++ b/resources/i18n/zh-TW.json @@ -402,6 +402,7 @@ "MaxSize": "最大尺寸", "ModifyPermissions": "修改权限", "MountPermission": "安裝許可", + "MountedSessions": "已掛載的工作階段", "MoveToTrash": "移至垃圾箱", "MoveToTrashDescription": "您確定要將“ {{folderName}}”移至垃圾桶?", "MoveToTrashMultipleDescription": "您確定要將{{folderLength}}文件夾移動到垃圾桶嗎?", @@ -692,6 +693,7 @@ "Enabled": "啟用", "ErrorOccurred": "出了點問題。請稍後再試。", "ExtendLoginSession": "延长登录会话", + "Folder": "資料夾", "Folders": "文件夾", "General": "一般情况", "Image": "影像",