diff --git a/e2e/session.test.ts b/e2e/session.test.ts index 1f9ab8ca08..66d54954c1 100644 --- a/e2e/session.test.ts +++ b/e2e/session.test.ts @@ -1,4 +1,10 @@ -import { createSession, deleteSession, loginAsUser } from './test-util'; +import { + createSession, + deleteSession, + loginAsAdmin, + loginAsUser, + navigateTo, +} from './test-util'; import { test, expect } from '@playwright/test'; test.describe('Sessions ', () => { @@ -9,3 +15,45 @@ test.describe('Sessions ', () => { await deleteSession(page, sessionName); }); }); + +test.describe('Restrict resource policy and see resource warning message', () => { + test('superadmin to modify keypair resource policy', async ({ page }) => { + await loginAsAdmin(page); + + // go to resource policy page + await navigateTo(page, 'resource-policy'); + + // modify resource limit (cpu, memory) to zero + await page + .getByRole('table') + .getByRole('button', { name: 'setting' }) + .click(); + await page.locator('.ant-checkbox-input').first().uncheck(); + await page.getByLabel('CPU(optional)').click(); + await page.getByLabel('CPU(optional)').fill('0'); + await page + .locator( + 'div:nth-child(2) > div > div > .ant-checkbox-wrapper > span:nth-child(2)', + ) + .first() + .uncheck(); + await page.getByLabel('Memory(optional)').click(); + await page.getByLabel('Memory(optional)').fill('0'); + await page.getByRole('button', { name: 'OK' }).click(); + + // go back to session page and see message in resource allocation section + await navigateTo(page, 'session/start'); + + await page.getByRole('button', { name: 'Next right' }).click(); + const notEnoughCPUResourceMsg = await page + .locator('#resource_cpu_help') + .getByText('Allocatable resources falls') + .textContent(); + const notEnoughRAMResourceMsg = await page + .getByText('Allocatable resources falls') + .nth(1) + .textContent(); + + expect(notEnoughCPUResourceMsg).toEqual(notEnoughRAMResourceMsg); + }); +}); diff --git a/react/src/components/DynamicUnitInputNumberWithSlider.tsx b/react/src/components/DynamicUnitInputNumberWithSlider.tsx index e750d6553d..38d1cd7e88 100644 --- a/react/src/components/DynamicUnitInputNumberWithSlider.tsx +++ b/react/src/components/DynamicUnitInputNumberWithSlider.tsx @@ -5,6 +5,7 @@ import DynamicUnitInputNumber, { DynamicUnitInputNumberProps, } from './DynamicUnitInputNumber'; import Flex from './Flex'; +import { isMinOversMaxValue } from './ResourceAllocationFormItems'; import { Slider, theme } from 'antd'; import { SliderMarks } from 'antd/es/slider'; import _ from 'lodash'; @@ -69,7 +70,10 @@ const DynamicUnitInputNumberWithSlider: React.FC< min={min} max={max} units={units} - value={value} + // set value to 0mib when min value overs max value + value={ + isMinOversMaxValue(_.parseInt(min), _.parseInt(max)) ? '0m' : value + } onChange={(nextValue) => { setValue(nextValue); }} @@ -143,7 +147,15 @@ const DynamicUnitInputNumberWithSlider: React.FC< }} step={step} // min={minGiB.number} // DO NOT use min, because slider left should be 0 - value={valueGiB?.number} + // set value to 0 when min value overs max value + value={ + isMinOversMaxValue( + minGiB?.number as number, + maxGiB?.number as number, + ) + ? 0 + : valueGiB?.number + } tooltip={{ formatter: (value = 0) => { return value < 1 @@ -176,8 +188,12 @@ const DynamicUnitInputNumberWithSlider: React.FC< color: token.colorTextSecondary, }, // if 0, without unit - label: - minGiB.number === 0 + label: isMinOversMaxValue( + minGiB?.number as number, + maxGiB?.number as number, + ) + ? undefined + : minGiB.number === 0 ? minGiB.number : minGiB.number >= 1 ? minGiB.number + 'g' @@ -195,8 +211,12 @@ const DynamicUnitInputNumberWithSlider: React.FC< style: { color: token.colorTextSecondary, }, - label: - maxGiB.number === 0 + label: isMinOversMaxValue( + minGiB?.number as number, + maxGiB?.number as number, + ) + ? undefined + : maxGiB.number === 0 ? maxGiB.number : maxGiB.number >= 1 ? maxGiB.number + 'g' diff --git a/react/src/components/ResourceAllocationFormItems.tsx b/react/src/components/ResourceAllocationFormItems.tsx index ca2cf7a83e..8247f97437 100644 --- a/react/src/components/ResourceAllocationFormItems.tsx +++ b/react/src/components/ResourceAllocationFormItems.tsx @@ -55,6 +55,10 @@ export const RESOURCE_ALLOCATION_INITIAL_FORM_VALUES = { enabledAutomaticShmem: true, }; +export const isMinOversMaxValue = (min: number, max: number) => { + return min >= max; +}; + export interface ResourceAllocationFormValue { resource: { cpu: number; @@ -487,6 +491,20 @@ const ResourceAllocationFormItems: React.FC< { warningOnly: true, validator: async (rule, value: number) => { + if ( + _.isNumber(resourceLimits.cpu?.min) && + _.isNumber(resourceLimits.cpu?.max) && + isMinOversMaxValue( + resourceLimits.cpu?.min, + resourceLimits.cpu?.max, + ) + ) { + return Promise.reject( + t( + 'session.launcher.InsufficientAllocationOfResourcesWarning', + ), + ); + } if (showRemainingWarning) { if ( _.isNumber(remaining.cpu) && @@ -652,6 +670,18 @@ const ResourceAllocationFormItems: React.FC< { warningOnly: true, validator: async (rule, value: string) => { + if ( + compareNumberWithUnits( + resourceLimits.mem?.min as string, + resourceLimits.mem?.max as string, + ) > 0 + ) { + return Promise.reject( + t( + 'session.launcher.InsufficientAllocationOfResourcesWarning', + ), + ); + } if (showRemainingWarning) { if ( !_.isElement(value) && @@ -918,6 +948,32 @@ const ResourceAllocationFormItems: React.FC< { warningOnly: true, validator: async (rule: any, value: number) => { + if ( + _.isNumber( + resourceLimits.accelerators[ + currentAcceleratorType + ]?.min, + ) && + _.isNumber( + resourceLimits.accelerators[ + currentAcceleratorType + ]?.max, + ) && + isMinOversMaxValue( + resourceLimits.accelerators[ + currentAcceleratorType + ]?.min, + resourceLimits.accelerators[ + currentAcceleratorType + ]?.max, + ) + ) { + return Promise.reject( + t( + 'session.launcher.InsufficientAllocationOfResourcesWarning', + ), + ); + } if (showRemainingWarning) { if ( _.isNumber( diff --git a/resources/i18n/de.json b/resources/i18n/de.json index e6b0652eae..7b76a9698c 100644 --- a/resources/i18n/de.json +++ b/resources/i18n/de.json @@ -278,7 +278,8 @@ "ProxyDirectTCPNotSupported": "Eine direkte Proxy-TCP-Verbindung wird noch nicht unterstützt", "InvalidPortFormat": "Das Format der Anschlussnummer ist falsch.", "DuplicatedPort": "Es gibt doppelte Anschlüsse.", - "FolderAliasOverlappingToAutoMount": "Es existiert ein Auto-Mount-Ordner mit demselben Namen." + "FolderAliasOverlappingToAutoMount": "Es existiert ein Auto-Mount-Ordner mit demselben Namen.", + "InsufficientAllocationOfResourcesWarning": "Die zuweisbaren Ressourcen liegen unter der im ausgewählten Bild erforderlichen Mindestressource." }, "Preparing": "Vorbereitung...", "PreparingSession": "Sitzung vorbereiten...", diff --git a/resources/i18n/el.json b/resources/i18n/el.json index 96349789c6..722f7ffa89 100644 --- a/resources/i18n/el.json +++ b/resources/i18n/el.json @@ -278,7 +278,8 @@ "ProxyDirectTCPNotSupported": "Η απευθείας σύνδεση TCP μεσολάβησης δεν υποστηρίζεται ακόμη", "InvalidPortFormat": "Η μορφή του αριθμού θύρας είναι λανθασμένη.", "DuplicatedPort": "Υπάρχουν διπλές θύρες.", - "FolderAliasOverlappingToAutoMount": "Υπάρχει ένας φάκελος αυτόματης προσάρτησης με το ίδιο όνομα." + "FolderAliasOverlappingToAutoMount": "Υπάρχει ένας φάκελος αυτόματης προσάρτησης με το ίδιο όνομα.", + "InsufficientAllocationOfResourcesWarning": "Οι κατανεμητέοι πόροι πέφτουν κάτω από τον ελάχιστο απαιτούμενο πόρο στην επιλεγμένη εικόνα." }, "Preparing": "Προετοιμασία ...", "PreparingSession": "Προετοιμασία συνεδρίας ...", diff --git a/resources/i18n/en.json b/resources/i18n/en.json index dd5fb3437d..3efdf3638a 100644 --- a/resources/i18n/en.json +++ b/resources/i18n/en.json @@ -292,7 +292,8 @@ "ProxyDirectTCPNotSupported": "Proxy direct TCP connection is not supported yet", "InvalidPortFormat": "The port number format is incorrect.", "DuplicatedPort": "There are duplicate ports.", - "FolderAliasOverlappingToAutoMount": "An auto-mount folder with the same name exists." + "FolderAliasOverlappingToAutoMount": "An auto-mount folder with the same name exists.", + "InsufficientAllocationOfResourcesWarning": "Allocatable resources falls below the minimum resource required in the selected image." }, "Preparing": "Preparing...", "PreparingSession": "Preparing session...", diff --git a/resources/i18n/es.json b/resources/i18n/es.json index cf849fbc96..fc55f36f3b 100644 --- a/resources/i18n/es.json +++ b/resources/i18n/es.json @@ -1296,7 +1296,8 @@ "ProxyDirectTCPNotSupported": "La conexión TCP directa de proxy aún no es compatible", "InvalidPortFormat": "El formato del número de puerto es incorrecto.", "DuplicatedPort": "Hay puertos duplicados.", - "FolderAliasOverlappingToAutoMount": "Existe una carpeta de montaje automático con el mismo nombre." + "FolderAliasOverlappingToAutoMount": "Existe una carpeta de montaje automático con el mismo nombre.", + "InsufficientAllocationOfResourcesWarning": "Los recursos asignables están por debajo del recurso mínimo requerido en la imagen seleccionada." }, "ExpiresAfter": "Tiempo restante", "CPU": "CPU", diff --git a/resources/i18n/fi.json b/resources/i18n/fi.json index acc80e5016..b9f725aaf8 100644 --- a/resources/i18n/fi.json +++ b/resources/i18n/fi.json @@ -1293,7 +1293,8 @@ "ProxyDirectTCPNotSupported": "Välityspalvelimen suoraa TCP-yhteyttä ei tueta vielä", "InvalidPortFormat": "Porttinumeron muoto on virheellinen.", "DuplicatedPort": "Portteja on päällekkäin.", - "FolderAliasOverlappingToAutoMount": "Samanniminen automaattinen kiinnityskansio on olemassa." + "FolderAliasOverlappingToAutoMount": "Samanniminen automaattinen kiinnityskansio on olemassa.", + "InsufficientAllocationOfResourcesWarning": "Allokoitavat resurssit jäävät alle valitussa kuvassa vaaditun vähimmäisresurssin." }, "ExpiresAfter": "Jäljellä oleva aika", "CPU": "CPU", diff --git a/resources/i18n/fr.json b/resources/i18n/fr.json index e9d94c41ad..364d215da0 100644 --- a/resources/i18n/fr.json +++ b/resources/i18n/fr.json @@ -278,7 +278,8 @@ "ProxyDirectTCPNotSupported": "La connexion TCP directe par proxy n'est pas encore prise en charge", "InvalidPortFormat": "Le format du numéro de port est incorrect.", "DuplicatedPort": "Il y a des ports en double.", - "FolderAliasOverlappingToAutoMount": "Il existe un dossier de montage automatique portant le même nom." + "FolderAliasOverlappingToAutoMount": "Il existe un dossier de montage automatique portant le même nom.", + "InsufficientAllocationOfResourcesWarning": "Les ressources allouables sont inférieures à la ressource minimale requise dans l'image sélectionnée." }, "Preparing": "En train de préparer...", "PreparingSession": "Séance de préparation...", diff --git a/resources/i18n/id.json b/resources/i18n/id.json index daaf940c28..cbcdf68d62 100644 --- a/resources/i18n/id.json +++ b/resources/i18n/id.json @@ -279,7 +279,8 @@ "ProxyDirectTCPNotSupported": "Koneksi TCP langsung proxy belum didukung", "InvalidPortFormat": "Format nomor port salah.", "DuplicatedPort": "Terdapat port ganda.", - "FolderAliasOverlappingToAutoMount": "Folder pemasangan otomatis dengan nama yang sama tersedia." + "FolderAliasOverlappingToAutoMount": "Folder pemasangan otomatis dengan nama yang sama tersedia.", + "InsufficientAllocationOfResourcesWarning": "Sumber daya yang dapat dialokasikan berada di bawah sumber daya minimum yang diperlukan pada gambar yang dipilih." }, "Preparing": "Mempersiapkan...", "PreparingSession": "Mempersiapkan sesi...", diff --git a/resources/i18n/it.json b/resources/i18n/it.json index 604e6d66e6..fe44f912a1 100644 --- a/resources/i18n/it.json +++ b/resources/i18n/it.json @@ -278,7 +278,8 @@ "ProxyDirectTCPNotSupported": "La connessione TCP diretta proxy non è ancora supportata", "InvalidPortFormat": "Il formato del numero di porta non è corretto.", "DuplicatedPort": "Ci sono porte duplicate.", - "FolderAliasOverlappingToAutoMount": "Esiste una cartella di montaggio automatico con lo stesso nome." + "FolderAliasOverlappingToAutoMount": "Esiste una cartella di montaggio automatico con lo stesso nome.", + "InsufficientAllocationOfResourcesWarning": "Le risorse assegnabili sono inferiori alla risorsa minima richiesta nell'immagine selezionata." }, "Preparing": "Preparazione...", "PreparingSession": "Preparazione della sessione...", diff --git a/resources/i18n/ja.json b/resources/i18n/ja.json index 84ad569de1..450238d619 100644 --- a/resources/i18n/ja.json +++ b/resources/i18n/ja.json @@ -278,7 +278,8 @@ "ProxyDirectTCPNotSupported": "プロキシ直接 TCP 接続はまだサポートされていません", "InvalidPortFormat": "ポート番号の形式が正しくない。", "DuplicatedPort": "ポートが重複している。", - "FolderAliasOverlappingToAutoMount": "同名の自動マウントフォルダが存在する。" + "FolderAliasOverlappingToAutoMount": "同名の自動マウントフォルダが存在する。", + "InsufficientAllocationOfResourcesWarning": "割り当て可能なリソースが、選択したイメージに必要な最小リソースを下回ります。" }, "Preparing": "準備...", "PreparingSession": "セッションの準備...", diff --git a/resources/i18n/ko.json b/resources/i18n/ko.json index 4888ed1507..9a5cf41f0f 100644 --- a/resources/i18n/ko.json +++ b/resources/i18n/ko.json @@ -279,7 +279,8 @@ "ProxyDirectTCPNotSupported": "프록시 직접 TCP 연결은 아직 지원되지 않습니다.", "InvalidPortFormat": "포트 형식이 올바르지 않습니다.", "DuplicatedPort": "중복된 포트가 있습니다.", - "FolderAliasOverlappingToAutoMount": "동일한 이름의 자동 마운트 폴더가 존재합니다." + "FolderAliasOverlappingToAutoMount": "동일한 이름의 자동 마운트 폴더가 존재합니다.", + "InsufficientAllocationOfResourcesWarning": "할당 가능한 자원이 선택된 이미지에서 요구되는 최소 자원보다 부족합니다." }, "Preparing": "준비중...", "PreparingSession": "세션 준비중...", diff --git a/resources/i18n/mn.json b/resources/i18n/mn.json index c724bf5b60..dc0670c546 100644 --- a/resources/i18n/mn.json +++ b/resources/i18n/mn.json @@ -279,7 +279,8 @@ "ProxyDirectTCPNotSupported": "Прокси шууд TCP холболт хараахан дэмжигдээгүй байна", "InvalidPortFormat": "Портын дугаарын формат буруу байна.", "DuplicatedPort": "Давхардсан портууд байна.", - "FolderAliasOverlappingToAutoMount": "Ижил нэртэй автоматаар холбох хавтас байна." + "FolderAliasOverlappingToAutoMount": "Ижил нэртэй автоматаар холбох хавтас байна.", + "InsufficientAllocationOfResourcesWarning": "Хуваарилах нөөц нь сонгосон зурагт шаардагдах хамгийн бага нөөцөөс доогуур байна." }, "Preparing": "Бэлтгэж байна ...", "PreparingSession": "Session бэлтгэж байна ...", diff --git a/resources/i18n/ms.json b/resources/i18n/ms.json index d821577e60..b9169f8b69 100644 --- a/resources/i18n/ms.json +++ b/resources/i18n/ms.json @@ -278,7 +278,8 @@ "ProxyDirectTCPNotSupported": "Sambungan TCP langsung proksi belum disokong lagi", "InvalidPortFormat": "Format nombor port tidak betul.", "DuplicatedPort": "Terdapat port pendua.", - "FolderAliasOverlappingToAutoMount": "Folder auto-lekap dengan nama yang sama wujud." + "FolderAliasOverlappingToAutoMount": "Folder auto-lekap dengan nama yang sama wujud.", + "InsufficientAllocationOfResourcesWarning": "Sumber yang boleh diperuntukkan berada di bawah sumber minimum yang diperlukan dalam imej yang dipilih." }, "Preparing": "Menyiapkan ...", "PreparingSession": "Menyiapkan sesi ...", diff --git a/resources/i18n/pl.json b/resources/i18n/pl.json index 29b3b2129d..d3aa89cbd2 100644 --- a/resources/i18n/pl.json +++ b/resources/i18n/pl.json @@ -278,7 +278,8 @@ "ProxyDirectTCPNotSupported": "Bezpośrednie połączenie proxy TCP nie jest jeszcze obsługiwane", "InvalidPortFormat": "Format numeru portu jest nieprawidłowy.", "DuplicatedPort": "Istnieją zduplikowane porty.", - "FolderAliasOverlappingToAutoMount": "Istnieje folder automatycznego montażu o tej samej nazwie." + "FolderAliasOverlappingToAutoMount": "Istnieje folder automatycznego montażu o tej samej nazwie.", + "InsufficientAllocationOfResourcesWarning": "Zasoby, które można przydzielić, są mniejsze niż minimalne zasoby wymagane w wybranym obrazie." }, "Preparing": "Przygotowuję...", "PreparingSession": "Przygotowuję sesję...", diff --git a/resources/i18n/pt-BR.json b/resources/i18n/pt-BR.json index 3cd68591fd..116e769b2b 100644 --- a/resources/i18n/pt-BR.json +++ b/resources/i18n/pt-BR.json @@ -278,7 +278,8 @@ "ProxyDirectTCPNotSupported": "A conexão TCP direta do proxy ainda não é suportada", "InvalidPortFormat": "O formato do número da porta está incorreto.", "DuplicatedPort": "Existem portas duplicadas.", - "FolderAliasOverlappingToAutoMount": "Existe uma pasta de montagem automática com o mesmo nome." + "FolderAliasOverlappingToAutoMount": "Existe uma pasta de montagem automática com o mesmo nome.", + "InsufficientAllocationOfResourcesWarning": "Os recursos alocáveis ​​ficam abaixo do recurso mínimo exigido na imagem selecionada." }, "Preparing": "Preparando...", "PreparingSession": "Preparando sessão ...", diff --git a/resources/i18n/pt.json b/resources/i18n/pt.json index e4324969cf..1ef29d34b4 100644 --- a/resources/i18n/pt.json +++ b/resources/i18n/pt.json @@ -278,7 +278,8 @@ "ProxyDirectTCPNotSupported": "A conexão TCP direta do proxy ainda não é suportada", "InvalidPortFormat": "O formato do número da porta está incorreto.", "DuplicatedPort": "Existem portas duplicadas.", - "FolderAliasOverlappingToAutoMount": "Existe uma pasta de montagem automática com o mesmo nome." + "FolderAliasOverlappingToAutoMount": "Existe uma pasta de montagem automática com o mesmo nome.", + "InsufficientAllocationOfResourcesWarning": "Os recursos alocáveis ​​ficam abaixo do recurso mínimo exigido na imagem selecionada." }, "Preparing": "Preparando...", "PreparingSession": "Preparando sessão ...", diff --git a/resources/i18n/ru.json b/resources/i18n/ru.json index 269455c3cf..3b65246d55 100644 --- a/resources/i18n/ru.json +++ b/resources/i18n/ru.json @@ -278,7 +278,8 @@ "ProxyDirectTCPNotSupported": "Прямое TCP-соединение через прокси-сервер пока не поддерживается.", "InvalidPortFormat": "Неверный формат номера порта.", "DuplicatedPort": "Имеются дублирующиеся порты.", - "FolderAliasOverlappingToAutoMount": "Существует папка автомонтирования с таким же именем." + "FolderAliasOverlappingToAutoMount": "Существует папка автомонтирования с таким же именем.", + "InsufficientAllocationOfResourcesWarning": "Выделяемые ресурсы ниже минимального ресурса, необходимого для выбранного изображения." }, "Preparing": "Подготовка ...", "PreparingSession": "Подготовка сеанса ...", diff --git a/resources/i18n/th.json b/resources/i18n/th.json index 8194e6a032..bc1f1a03ac 100644 --- a/resources/i18n/th.json +++ b/resources/i18n/th.json @@ -292,7 +292,8 @@ "ProxyDirectTCPNotSupported": "ยังไม่รองรับการเชื่อมต่อ TCP โดยตรงผ่านพร็อกซี", "InvalidPortFormat": "รูปแบบหมายเลขพอร์ตไม่ถูกต้อง", "DuplicatedPort": "มีพอร์ตที่ซ้ำกัน", - "FolderAliasOverlappingToAutoMount": "มีโฟลเดอร์ที่เมาท์อัตโนมัติที่มีชื่อเดียวกันอยู่แล้ว" + "FolderAliasOverlappingToAutoMount": "มีโฟลเดอร์ที่เมาท์อัตโนมัติที่มีชื่อเดียวกันอยู่แล้ว", + "InsufficientAllocationOfResourcesWarning": "ทรัพยากรที่จัดสรรได้อยู่ต่ำกว่าทรัพยากรขั้นต่ำที่จำเป็นในรูปภาพที่เลือก" }, "Preparing": "กำลังเตรียมการ...", "PreparingSession": "กำลังเตรียมเซสชัน...", diff --git a/resources/i18n/tr.json b/resources/i18n/tr.json index 01f4705708..579a062c6d 100644 --- a/resources/i18n/tr.json +++ b/resources/i18n/tr.json @@ -278,7 +278,8 @@ "ProxyDirectTCPNotSupported": "Proxy doğrudan TCP bağlantısı henüz desteklenmiyor", "InvalidPortFormat": "Bağlantı noktası numarası biçimi yanlış.", "DuplicatedPort": "Çift bağlantı noktaları var.", - "FolderAliasOverlappingToAutoMount": "Aynı ada sahip bir otomatik montaj klasörü mevcut." + "FolderAliasOverlappingToAutoMount": "Aynı ada sahip bir otomatik montaj klasörü mevcut.", + "InsufficientAllocationOfResourcesWarning": "Tahsis edilebilir kaynaklar, seçilen görüntüde gereken minimum kaynağın altına düşüyor." }, "Preparing": "hazırlanıyor...", "PreparingSession": "Oturum hazırlanıyor...", diff --git a/resources/i18n/vi.json b/resources/i18n/vi.json index 09532fbb78..6444a64c6e 100644 --- a/resources/i18n/vi.json +++ b/resources/i18n/vi.json @@ -278,7 +278,8 @@ "ProxyDirectTCPNotSupported": "Kết nối TCP trực tiếp proxy chưa được hỗ trợ", "InvalidPortFormat": "Định dạng số cổng không chính xác.", "DuplicatedPort": "Có cổng trùng lặp.", - "FolderAliasOverlappingToAutoMount": "Đã tồn tại một thư mục tự động gắn kết có cùng tên." + "FolderAliasOverlappingToAutoMount": "Đã tồn tại một thư mục tự động gắn kết có cùng tên.", + "InsufficientAllocationOfResourcesWarning": "Tài nguyên có thể phân bổ giảm xuống dưới mức tài nguyên tối thiểu được yêu cầu trong hình ảnh đã chọn." }, "Preparing": "Đang chuẩn bị ...", "PreparingSession": "Đang chuẩn bị phiên ...", diff --git a/resources/i18n/zh-CN.json b/resources/i18n/zh-CN.json index f9ef6a61e9..1ba6eceadc 100644 --- a/resources/i18n/zh-CN.json +++ b/resources/i18n/zh-CN.json @@ -278,7 +278,8 @@ "ProxyDirectTCPNotSupported": "尚不支持代理直接 TCP 连接", "InvalidPortFormat": "端口号格式不正确。", "DuplicatedPort": "有重复的端口。", - "FolderAliasOverlappingToAutoMount": "存在同名的自动挂载文件夹。" + "FolderAliasOverlappingToAutoMount": "存在同名的自动挂载文件夹。", + "InsufficientAllocationOfResourcesWarning": "可分配资源低于所选映像所需的最低资源。" }, "Preparing": "正在准备...", "PreparingSession": "正在准备会议...", diff --git a/resources/i18n/zh-TW.json b/resources/i18n/zh-TW.json index 5d35352f6e..c00b564cf2 100644 --- a/resources/i18n/zh-TW.json +++ b/resources/i18n/zh-TW.json @@ -278,7 +278,8 @@ "ProxyDirectTCPNotSupported": "尚不支援代理直接 TCP 連接", "InvalidPortFormat": "端口号格式不正确。", "DuplicatedPort": "有重复的端口。", - "FolderAliasOverlappingToAutoMount": "存在同名的自动挂载文件夹。" + "FolderAliasOverlappingToAutoMount": "存在同名的自动挂载文件夹。", + "InsufficientAllocationOfResourcesWarning": "可分配資源低於所選映像所需的最低資源。" }, "Preparing": "正在準備...", "PreparingSession": "正在準備會議...",