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": "影像",