diff --git a/web/app/components/main-nav/components/__tests__/workspace-card.spec.tsx b/web/app/components/main-nav/components/__tests__/workspace-card.spec.tsx index b560a049206..a7f7aea8c61 100644 --- a/web/app/components/main-nav/components/__tests__/workspace-card.spec.tsx +++ b/web/app/components/main-nav/components/__tests__/workspace-card.spec.tsx @@ -194,6 +194,27 @@ describe('WorkspaceCard', () => { expect(screen.getByRole('button', { name: workspaceMenuAccessibleName })).toBeInTheDocument() }) + it('keeps full workspace names on the final interactive title owner', async () => { + const user = userEvent.setup() + renderWorkspaceCard() + + const trigger = screen.getByRole('button', { name: workspaceMenuAccessibleName }) + expect(trigger).toHaveAttribute('title', 'Solar Studio') + expect(within(trigger).getByText('Solar Studio')).not.toHaveAttribute('title') + + await user.click(trigger) + + const panel = await screen.findByRole('dialog', { name: 'Solar Studio' }) + const workspaceItem = within(panel).getByRole('button', { + name: 'Evan Workspace', + }) + expect(workspaceItem).toHaveAttribute('title', 'Evan Workspace') + expect(within(workspaceItem).getByText('Evan Workspace')).not.toHaveAttribute('title') + expect( + within(panel).getByRole('button', { name: 'common.mainNav.workspace.settings' }), + ).toHaveAttribute('title', 'common.mainNav.workspace.settings') + }) + it('includes the visible workspace plan in the menu trigger accessible name', () => { renderWorkspaceCard({ systemFeatures: { deployment_edition: 'CLOUD' } }) @@ -308,8 +329,12 @@ describe('WorkspaceCard', () => { expect( within(panel).getByRole('button', { name: 'common.mainNav.workspace.sort.openMenu' }), ).toBeDisabled() - expect(within(panel).getByRole('button', { name: 'common.operation.search' })).toBeDisabled() + expect(within(panel).getByRole('button', { name: 'common.operation.search' })).toHaveAttribute( + 'aria-disabled', + 'true', + ) expect(panel.querySelector('[aria-busy="true"]')).toBeInTheDocument() + expect(within(panel).getByRole('status', { name: 'common.loading' })).toBeInTheDocument() expect(within(panel).queryByRole('button', { name: 'Evan Workspace' })).not.toBeInTheDocument() }) @@ -390,32 +415,79 @@ describe('WorkspaceCard', () => { ).toBeInTheDocument() const workspaceItem = within(panel).getByRole('button', { name: 'Evan Workspace' }) expect(workspaceItem).toBeInTheDocument() - expect(workspaceItem.parentElement).toHaveClass('max-h-[240px]', 'overflow-y-auto') + const workspaceList = within(panel).getByRole('list', { + name: 'common.userProfile.workspace', + }) + expect(within(workspaceList).getAllByRole('listitem')).toHaveLength(2) + expect(workspaceList.parentElement).toHaveClass('max-h-[240px]', 'overflow-y-auto') }) it('filters workspace switcher options from the search action', async () => { + const user = userEvent.setup() renderWorkspaceCard() - fireEvent.click(screen.getByRole('button', { name: workspaceMenuAccessibleName })) - fireEvent.click(await screen.findByRole('button', { name: 'common.operation.search' })) + await user.click(screen.getByRole('button', { name: workspaceMenuAccessibleName })) + const searchTrigger = await screen.findByRole('button', { name: 'common.operation.search' }) + expect(searchTrigger).toHaveAttribute('aria-expanded', 'false') + + await user.click(searchTrigger) expect(screen.getByText('common.userProfile.workspace')).toBeInTheDocument() expect( screen.getByRole('button', { name: 'common.mainNav.workspace.sort.openMenu' }), ).toBeInTheDocument() - expect(screen.getByRole('button', { name: 'common.operation.search' })).toHaveClass( - 'bg-state-base-hover', - ) + expect(searchTrigger).toHaveAttribute('aria-expanded', 'true') + const controlledPanelId = searchTrigger.getAttribute('aria-controls') + expect(controlledPanelId).toBeTruthy() - fireEvent.change(screen.getByPlaceholderText('common.mainNav.workspace.searchPlaceholder'), { - target: { value: 'evan' }, - }) + const searchInput = screen.getByPlaceholderText('common.mainNav.workspace.searchPlaceholder') + expect(document.getElementById(controlledPanelId!)).toContainElement(searchInput) + expect(searchInput).toHaveFocus() + await user.type(searchInput, 'evan') const panel = screen.getByRole('dialog', { name: 'Solar Studio' }) expect(within(panel).getByRole('button', { name: 'Evan Workspace' })).toBeInTheDocument() expect(within(panel).queryByRole('button', { name: 'Solar Studio' })).not.toBeInTheDocument() }) + it('announces an empty workspace search result', async () => { + const user = userEvent.setup() + renderWorkspaceCard() + + await user.click(screen.getByRole('button', { name: workspaceMenuAccessibleName })) + await user.click(await screen.findByRole('button', { name: 'common.operation.search' })) + await user.type( + screen.getByPlaceholderText('common.mainNav.workspace.searchPlaceholder'), + 'missing', + ) + + const panel = screen.getByRole('dialog', { name: 'Solar Studio' }) + expect(within(panel).getByRole('status')).toHaveTextContent( + 'common.mainNav.workspace.noResults', + ) + expect( + within(panel).queryByRole('list', { name: 'common.userProfile.workspace' }), + ).not.toBeInTheDocument() + }) + + it('exposes only the current workspace as current', async () => { + const user = userEvent.setup() + renderWorkspaceCard() + + await user.click(screen.getByRole('button', { name: workspaceMenuAccessibleName })) + + const panel = await screen.findByRole('dialog', { name: 'Solar Studio' }) + const workspaceList = within(panel).getByRole('list', { + name: 'common.userProfile.workspace', + }) + expect( + within(workspaceList).getByRole('button', { name: 'Solar Studio', current: true }), + ).toBeInTheDocument() + expect( + within(workspaceList).getByRole('button', { name: 'Evan Workspace' }), + ).not.toHaveAttribute('aria-current') + }) + it('sorts workspaces by last opened and can sort by created time', async () => { mockWorkspaces = [ { @@ -451,7 +523,10 @@ describe('WorkspaceCard', () => { fireEvent.click(screen.getByRole('button', { name: workspaceMenuAccessibleName })) const panel = await screen.findByRole('dialog', { name: 'Solar Studio' }) - const defaultWorkspaceOptions = within(panel) + const workspaceList = within(panel).getByRole('list', { + name: 'common.userProfile.workspace', + }) + const defaultWorkspaceOptions = within(workspaceList) .getAllByRole('button') .map((item) => item.getAttribute('title')) .filter(Boolean) @@ -476,7 +551,7 @@ describe('WorkspaceCard', () => { screen.getByRole('menuitemradio', { name: 'common.mainNav.workspace.sort.createdTime' }), ) - const createdTimeWorkspaceOptions = within(panel) + const createdTimeWorkspaceOptions = within(workspaceList) .getAllByRole('button') .map((item) => item.getAttribute('title')) .filter(Boolean) @@ -488,6 +563,39 @@ describe('WorkspaceCard', () => { ]) }) + it('closes the nested sort menu before the workspace popover on Escape', async () => { + const user = userEvent.setup() + renderWorkspaceCard() + + const workspaceTrigger = screen.getByRole('button', { name: workspaceMenuAccessibleName }) + await user.click(workspaceTrigger) + const panel = await screen.findByRole('dialog', { name: 'Solar Studio' }) + const sortTrigger = within(panel).getByRole('button', { + name: 'common.mainNav.workspace.sort.openMenu', + }) + await user.click(sortTrigger) + expect( + await screen.findByRole('menuitemradio', { + name: 'common.mainNav.workspace.sort.lastOpened', + }), + ).toBeInTheDocument() + + await user.keyboard('{Escape}') + + expect( + screen.queryByRole('menuitemradio', { + name: 'common.mainNav.workspace.sort.lastOpened', + }), + ).not.toBeInTheDocument() + expect(panel).toBeInTheDocument() + expect(sortTrigger).toHaveFocus() + + await user.keyboard('{Escape}') + + await waitFor(() => expect(panel).not.toBeInTheDocument()) + expect(workspaceTrigger).toHaveFocus() + }) + it('opens account settings from workspace menu actions', async () => { renderWorkspaceCard() @@ -527,6 +635,20 @@ describe('WorkspaceCard', () => { ) }) + it('closes the popover without switching when the current workspace is selected', async () => { + const user = userEvent.setup() + renderWorkspaceCard() + + await user.click(screen.getByRole('button', { name: workspaceMenuAccessibleName })) + const panel = await screen.findByRole('dialog', { name: 'Solar Studio' }) + await user.click(within(panel).getByRole('button', { name: 'Solar Studio', current: true })) + + await waitFor(() => + expect(screen.queryByRole('dialog', { name: 'Solar Studio' })).not.toBeInTheDocument(), + ) + expect(mockSwitchWorkspace).not.toHaveBeenCalled() + }) + it('keeps workspace settings visible for dataset operators without member management permission', async () => { mockCurrentWorkspaceQuery({ ...currentWorkspaceValue, diff --git a/web/app/components/main-nav/components/__tests__/workspace-switcher.browser.spec.tsx b/web/app/components/main-nav/components/__tests__/workspace-switcher.browser.spec.tsx new file mode 100644 index 00000000000..60bc3ed877f --- /dev/null +++ b/web/app/components/main-nav/components/__tests__/workspace-switcher.browser.spec.tsx @@ -0,0 +1,62 @@ +import type { TenantListItemResponse } from '@dify/contracts/api/console/workspaces/types.gen' +import { page, userEvent } from 'vite-plus/test/browser' +import { render } from 'vitest-browser-react' +import { WorkspaceSwitcher } from '../workspace-switcher' + +const workspaces: TenantListItemResponse[] = [ + { + id: 'workspace-current', + name: 'Solar Studio', + plan: 'sandbox', + status: 'normal', + created_at: 2, + current: true, + }, + { + id: 'workspace-other', + name: 'Solar Studio', + plan: 'team', + status: 'normal', + created_at: 1, + current: false, + }, +] + +describe('WorkspaceSwitcher visual states', () => { + it('keeps current, hover, and focus-visible as independent states', async () => { + // Chromium owns the rendered hover/focus-visible output that happy-dom cannot reproduce. + const screen = await render( + , + ) + const workspaceList = screen.getByRole('list', { name: 'common.userProfile.workspace' }) + const workspaceItems = workspaceList.getByRole('listitem') + const current = workspaceItems.nth(0).getByRole('button') + const other = workspaceItems.nth(1).getByRole('button') + const captureList = () => page.screenshot({ element: workspaceList, save: false }) + + const currentResting = await page.screenshot({ element: current, save: false }) + const otherResting = await page.screenshot({ element: other, save: false }) + expect(currentResting).not.toBe(otherResting) + + const resting = await captureList() + + await other.hover() + const hover = await captureList() + expect(hover).not.toBe(resting) + + await userEvent.unhover(other) + await current.hover() + const currentHover = await captureList() + expect(currentHover).not.toBe(resting) + expect(currentHover).not.toBe(hover) + + await userEvent.unhover(current) + await userEvent.tab() + await userEvent.tab() + await userEvent.tab() + expect(current.element()).toHaveFocus() + const focusVisible = await captureList() + expect(focusVisible).not.toBe(resting) + expect(focusVisible).not.toBe(currentHover) + }) +}) diff --git a/web/app/components/main-nav/components/workspace-card.tsx b/web/app/components/main-nav/components/workspace-card.tsx index 4b98e28261c..6d9d1d81711 100644 --- a/web/app/components/main-nav/components/workspace-card.tsx +++ b/web/app/components/main-nav/components/workspace-card.tsx @@ -126,10 +126,7 @@ function WorkspaceCardTrigger({
- + {name} {showStatus && {status}} @@ -183,8 +180,8 @@ function WorkspaceMenuHeader({ name: string status: ReactNode showInviteMembers: boolean - settingsLabel: ReactNode - inviteMembersLabel: ReactNode + settingsLabel: string + inviteMembersLabel: string onOpenSettings: () => void onInviteMembers: () => void }) { @@ -205,6 +202,7 @@ function WorkspaceMenuHeader({
+ className="size-6 min-h-0 w-6 justify-center gap-0 rounded-md p-0.5 data-panel-open:bg-state-base-hover data-panel-open:text-text-secondary" + render={ + $['operation.search'], { ns: 'common' })}> + + + + + } + />
- {searchVisible && ( +
- )} - +
+ ) } @@ -156,6 +156,8 @@ export function WorkspaceSwitcher({ isPending, onSwitchWorkspace, }: WorkspaceSwitcherProps) { + const { t } = useTranslation() + const workspaceListLabelId = useId() const [workspaceSearchText, setWorkspaceSearchText] = useState('') const [workspaceSort, setWorkspaceSort] = useState('lastOpened') const displayedWorkspaces = useMemo(() => { @@ -183,6 +185,7 @@ export function WorkspaceSwitcher({
{isPending ? ( -
- +
$.loading, { ns: 'common' })} + className="flex h-8 items-center justify-center" + > + +
+ ) : displayedWorkspaces.length === 0 ? ( +
+ {t(($) => $[workspaceSwitchI18nKey('mainNav.workspace.noResults')], { + ns: 'common', + })}
) : ( - displayedWorkspaces.map((workspace) => { - const workspaceName = getWorkspaceName(workspace) +
    + {displayedWorkspaces.map((workspace) => { + const workspaceName = getWorkspaceName(workspace) - return ( - - ) - }) + return ( +
  • + +
  • + ) + })} +
)}
diff --git a/web/i18n/ar-TN/common.json b/web/i18n/ar-TN/common.json index a60ccd28834..afda3c9652a 100644 --- a/web/i18n/ar-TN/common.json +++ b/web/i18n/ar-TN/common.json @@ -211,6 +211,7 @@ "mainNav.workspace.credits": "{{count}} رصيد", "mainNav.workspace.creditsUnit": "أرصدة", "mainNav.workspace.inviteMembers": "Invite members", + "mainNav.workspace.noResults": "لم يتم العثور على مساحات عمل", "mainNav.workspace.openMenu": "فتح قائمة مساحة العمل", "mainNav.workspace.searchPlaceholder": "Search workspace", "mainNav.workspace.settings": "Workspace settings", diff --git a/web/i18n/de-DE/common.json b/web/i18n/de-DE/common.json index 52978625901..973c59213ae 100644 --- a/web/i18n/de-DE/common.json +++ b/web/i18n/de-DE/common.json @@ -211,6 +211,7 @@ "mainNav.workspace.credits": "{{count}} Credits", "mainNav.workspace.creditsUnit": "Credits", "mainNav.workspace.inviteMembers": "Invite members", + "mainNav.workspace.noResults": "Keine Arbeitsbereiche gefunden", "mainNav.workspace.openMenu": "Workspace-Menü öffnen", "mainNav.workspace.searchPlaceholder": "Search workspace", "mainNav.workspace.settings": "Workspace settings", diff --git a/web/i18n/en-US/common.json b/web/i18n/en-US/common.json index 0fc4518c58f..b25d1191ba5 100644 --- a/web/i18n/en-US/common.json +++ b/web/i18n/en-US/common.json @@ -211,6 +211,7 @@ "mainNav.workspace.credits": "{{count}} credits", "mainNav.workspace.creditsUnit": "credits", "mainNav.workspace.inviteMembers": "Invite members", + "mainNav.workspace.noResults": "No workspaces found", "mainNav.workspace.openMenu": "Open workspace menu", "mainNav.workspace.searchPlaceholder": "Search workspace", "mainNav.workspace.settings": "Workspace settings", diff --git a/web/i18n/es-ES/common.json b/web/i18n/es-ES/common.json index 5dc1d0bacfe..35f58083a55 100644 --- a/web/i18n/es-ES/common.json +++ b/web/i18n/es-ES/common.json @@ -211,6 +211,7 @@ "mainNav.workspace.credits": "{{count}} créditos", "mainNav.workspace.creditsUnit": "créditos", "mainNav.workspace.inviteMembers": "Invite members", + "mainNav.workspace.noResults": "No se encontraron espacios de trabajo", "mainNav.workspace.openMenu": "Abrir menú del espacio de trabajo", "mainNav.workspace.searchPlaceholder": "Search workspace", "mainNav.workspace.settings": "Workspace settings", diff --git a/web/i18n/fa-IR/common.json b/web/i18n/fa-IR/common.json index 4ed2f54264d..e25b7985cba 100644 --- a/web/i18n/fa-IR/common.json +++ b/web/i18n/fa-IR/common.json @@ -211,6 +211,7 @@ "mainNav.workspace.credits": "{{count}} اعتبار", "mainNav.workspace.creditsUnit": "اعتبار", "mainNav.workspace.inviteMembers": "Invite members", + "mainNav.workspace.noResults": "هیچ فضای کاری یافت نشد", "mainNav.workspace.openMenu": "باز کردن منوی فضای کاری", "mainNav.workspace.searchPlaceholder": "Search workspace", "mainNav.workspace.settings": "Workspace settings", diff --git a/web/i18n/fr-FR/common.json b/web/i18n/fr-FR/common.json index b0f8d11a4e3..2750b22825d 100644 --- a/web/i18n/fr-FR/common.json +++ b/web/i18n/fr-FR/common.json @@ -211,6 +211,7 @@ "mainNav.workspace.credits": "{{count}} crédits", "mainNav.workspace.creditsUnit": "crédits", "mainNav.workspace.inviteMembers": "Invite members", + "mainNav.workspace.noResults": "Aucun espace de travail trouvé", "mainNav.workspace.openMenu": "Ouvrir le menu de l’espace de travail", "mainNav.workspace.searchPlaceholder": "Search workspace", "mainNav.workspace.settings": "Workspace settings", diff --git a/web/i18n/hi-IN/common.json b/web/i18n/hi-IN/common.json index cc501813156..a63eebfa40b 100644 --- a/web/i18n/hi-IN/common.json +++ b/web/i18n/hi-IN/common.json @@ -211,6 +211,7 @@ "mainNav.workspace.credits": "{{count}} क्रेडिट", "mainNav.workspace.creditsUnit": "क्रेडिट", "mainNav.workspace.inviteMembers": "Invite members", + "mainNav.workspace.noResults": "कोई वर्कस्पेस नहीं मिला", "mainNav.workspace.openMenu": "वर्कस्पेस मेनू खोलें", "mainNav.workspace.searchPlaceholder": "Search workspace", "mainNav.workspace.settings": "Workspace settings", diff --git a/web/i18n/id-ID/common.json b/web/i18n/id-ID/common.json index 9842b0e73ca..dd5e1bd3361 100644 --- a/web/i18n/id-ID/common.json +++ b/web/i18n/id-ID/common.json @@ -211,6 +211,7 @@ "mainNav.workspace.credits": "{{count}} kredit", "mainNav.workspace.creditsUnit": "kredit", "mainNav.workspace.inviteMembers": "Invite members", + "mainNav.workspace.noResults": "Tidak ada workspace yang ditemukan", "mainNav.workspace.openMenu": "Buka menu workspace", "mainNav.workspace.searchPlaceholder": "Search workspace", "mainNav.workspace.settings": "Workspace settings", diff --git a/web/i18n/it-IT/common.json b/web/i18n/it-IT/common.json index 9d39d111543..b3b368485f2 100644 --- a/web/i18n/it-IT/common.json +++ b/web/i18n/it-IT/common.json @@ -211,6 +211,7 @@ "mainNav.workspace.credits": "{{count}} crediti", "mainNav.workspace.creditsUnit": "crediti", "mainNav.workspace.inviteMembers": "Invite members", + "mainNav.workspace.noResults": "Nessun workspace trovato", "mainNav.workspace.openMenu": "Apri menu workspace", "mainNav.workspace.searchPlaceholder": "Search workspace", "mainNav.workspace.settings": "Workspace settings", diff --git a/web/i18n/ja-JP/common.json b/web/i18n/ja-JP/common.json index b0c2886fb9e..b01f04d92b9 100644 --- a/web/i18n/ja-JP/common.json +++ b/web/i18n/ja-JP/common.json @@ -211,6 +211,7 @@ "mainNav.workspace.credits": "{{count}} クレジット", "mainNav.workspace.creditsUnit": "クレジット", "mainNav.workspace.inviteMembers": "メンバーを招待", + "mainNav.workspace.noResults": "ワークスペースが見つかりません", "mainNav.workspace.openMenu": "ワークスペースメニューを開く", "mainNav.workspace.searchPlaceholder": "ワークスペースを検索", "mainNav.workspace.settings": "ワークスペース設定", diff --git a/web/i18n/ko-KR/common.json b/web/i18n/ko-KR/common.json index a39e9ed2b6d..56fcb1e5ef9 100644 --- a/web/i18n/ko-KR/common.json +++ b/web/i18n/ko-KR/common.json @@ -211,6 +211,7 @@ "mainNav.workspace.credits": "{{count}} 크레딧", "mainNav.workspace.creditsUnit": "크레딧", "mainNav.workspace.inviteMembers": "Invite members", + "mainNav.workspace.noResults": "워크스페이스를 찾을 수 없습니다", "mainNav.workspace.openMenu": "워크스페이스 메뉴 열기", "mainNav.workspace.searchPlaceholder": "Search workspace", "mainNav.workspace.settings": "Workspace settings", diff --git a/web/i18n/lo-LA/common.json b/web/i18n/lo-LA/common.json index 536eba81f79..c9331276ba2 100644 --- a/web/i18n/lo-LA/common.json +++ b/web/i18n/lo-LA/common.json @@ -211,6 +211,7 @@ "mainNav.workspace.credits": "{{count}} ເຄຣດິດ", "mainNav.workspace.creditsUnit": "ເຄຣດິດ", "mainNav.workspace.inviteMembers": "ເຊີນສະມາຊິກ", + "mainNav.workspace.noResults": "ບໍ່ພົບພື້ນທີ່ເຮັດວຽກ", "mainNav.workspace.openMenu": "ເປີດເມນູພື້ນທີ່ເຮັດວຽກ", "mainNav.workspace.searchPlaceholder": "ຄົ້ນຫາພື້ນທີ່ເຮັດວຽກ", "mainNav.workspace.settings": "ການຕັ້ງຄ່າພື້ນທີ່ເຮັດວຽກ", diff --git a/web/i18n/nl-NL/common.json b/web/i18n/nl-NL/common.json index ada2ed37284..d4a45e17ac1 100644 --- a/web/i18n/nl-NL/common.json +++ b/web/i18n/nl-NL/common.json @@ -211,6 +211,7 @@ "mainNav.workspace.credits": "{{count}} credits", "mainNav.workspace.creditsUnit": "credits", "mainNav.workspace.inviteMembers": "Invite members", + "mainNav.workspace.noResults": "Geen werkruimtes gevonden", "mainNav.workspace.openMenu": "Werkruimtemenu openen", "mainNav.workspace.searchPlaceholder": "Search workspace", "mainNav.workspace.settings": "Workspace settings", diff --git a/web/i18n/pl-PL/common.json b/web/i18n/pl-PL/common.json index 9f0b2616413..f95132beafe 100644 --- a/web/i18n/pl-PL/common.json +++ b/web/i18n/pl-PL/common.json @@ -211,6 +211,7 @@ "mainNav.workspace.credits": "{{count}} kredytów", "mainNav.workspace.creditsUnit": "kredyty", "mainNav.workspace.inviteMembers": "Invite members", + "mainNav.workspace.noResults": "Nie znaleziono obszarów roboczych", "mainNav.workspace.openMenu": "Otwórz menu obszaru roboczego", "mainNav.workspace.searchPlaceholder": "Search workspace", "mainNav.workspace.settings": "Workspace settings", diff --git a/web/i18n/pt-BR/common.json b/web/i18n/pt-BR/common.json index e5b19972671..1b84bd37e5c 100644 --- a/web/i18n/pt-BR/common.json +++ b/web/i18n/pt-BR/common.json @@ -211,6 +211,7 @@ "mainNav.workspace.credits": "{{count}} créditos", "mainNav.workspace.creditsUnit": "créditos", "mainNav.workspace.inviteMembers": "Invite members", + "mainNav.workspace.noResults": "Nenhum workspace encontrado", "mainNav.workspace.openMenu": "Abrir menu do workspace", "mainNav.workspace.searchPlaceholder": "Search workspace", "mainNav.workspace.settings": "Workspace settings", diff --git a/web/i18n/ro-RO/common.json b/web/i18n/ro-RO/common.json index c44adecf3cb..d5969e7ab76 100644 --- a/web/i18n/ro-RO/common.json +++ b/web/i18n/ro-RO/common.json @@ -211,6 +211,7 @@ "mainNav.workspace.credits": "{{count}} credite", "mainNav.workspace.creditsUnit": "credite", "mainNav.workspace.inviteMembers": "Invite members", + "mainNav.workspace.noResults": "Nu s-au găsit spații de lucru", "mainNav.workspace.openMenu": "Deschide meniul spațiului de lucru", "mainNav.workspace.searchPlaceholder": "Search workspace", "mainNav.workspace.settings": "Workspace settings", diff --git a/web/i18n/ru-RU/common.json b/web/i18n/ru-RU/common.json index 06832cdc80f..ac071704d7f 100644 --- a/web/i18n/ru-RU/common.json +++ b/web/i18n/ru-RU/common.json @@ -211,6 +211,7 @@ "mainNav.workspace.credits": "{{count}} кредитов", "mainNav.workspace.creditsUnit": "кредиты", "mainNav.workspace.inviteMembers": "Invite members", + "mainNav.workspace.noResults": "Рабочие пространства не найдены", "mainNav.workspace.openMenu": "Открыть меню рабочей области", "mainNav.workspace.searchPlaceholder": "Search workspace", "mainNav.workspace.settings": "Workspace settings", diff --git a/web/i18n/sl-SI/common.json b/web/i18n/sl-SI/common.json index 5979a3e6743..2db7fc57bf6 100644 --- a/web/i18n/sl-SI/common.json +++ b/web/i18n/sl-SI/common.json @@ -211,6 +211,7 @@ "mainNav.workspace.credits": "{{count}} kreditov", "mainNav.workspace.creditsUnit": "krediti", "mainNav.workspace.inviteMembers": "Invite members", + "mainNav.workspace.noResults": "Ni najdenih delovnih prostorov", "mainNav.workspace.openMenu": "Odpri meni delovnega prostora", "mainNav.workspace.searchPlaceholder": "Search workspace", "mainNav.workspace.settings": "Workspace settings", diff --git a/web/i18n/th-TH/common.json b/web/i18n/th-TH/common.json index e85c29ff2eb..1318ab13927 100644 --- a/web/i18n/th-TH/common.json +++ b/web/i18n/th-TH/common.json @@ -211,6 +211,7 @@ "mainNav.workspace.credits": "{{count}} เครดิต", "mainNav.workspace.creditsUnit": "เครดิต", "mainNav.workspace.inviteMembers": "Invite members", + "mainNav.workspace.noResults": "ไม่พบพื้นที่ทำงาน", "mainNav.workspace.openMenu": "เปิดเมนูพื้นที่ทำงาน", "mainNav.workspace.searchPlaceholder": "Search workspace", "mainNav.workspace.settings": "Workspace settings", diff --git a/web/i18n/tr-TR/common.json b/web/i18n/tr-TR/common.json index bfd30dc5a00..2e11f9626da 100644 --- a/web/i18n/tr-TR/common.json +++ b/web/i18n/tr-TR/common.json @@ -211,6 +211,7 @@ "mainNav.workspace.credits": "{{count}} kredi", "mainNav.workspace.creditsUnit": "kredi", "mainNav.workspace.inviteMembers": "Invite members", + "mainNav.workspace.noResults": "Çalışma alanı bulunamadı", "mainNav.workspace.openMenu": "Çalışma alanı menüsünü aç", "mainNav.workspace.searchPlaceholder": "Search workspace", "mainNav.workspace.settings": "Workspace settings", diff --git a/web/i18n/uk-UA/common.json b/web/i18n/uk-UA/common.json index 011449c67ab..388e89620b1 100644 --- a/web/i18n/uk-UA/common.json +++ b/web/i18n/uk-UA/common.json @@ -211,6 +211,7 @@ "mainNav.workspace.credits": "{{count}} кредитів", "mainNav.workspace.creditsUnit": "кредити", "mainNav.workspace.inviteMembers": "Invite members", + "mainNav.workspace.noResults": "Робочі простори не знайдено", "mainNav.workspace.openMenu": "Відкрити меню робочого простору", "mainNav.workspace.searchPlaceholder": "Search workspace", "mainNav.workspace.settings": "Workspace settings", diff --git a/web/i18n/vi-VN/common.json b/web/i18n/vi-VN/common.json index 267387c547e..2d662d037bd 100644 --- a/web/i18n/vi-VN/common.json +++ b/web/i18n/vi-VN/common.json @@ -211,6 +211,7 @@ "mainNav.workspace.credits": "{{count}} tín dụng", "mainNav.workspace.creditsUnit": "tín dụng", "mainNav.workspace.inviteMembers": "Invite members", + "mainNav.workspace.noResults": "Không tìm thấy không gian làm việc", "mainNav.workspace.openMenu": "Mở menu workspace", "mainNav.workspace.searchPlaceholder": "Search workspace", "mainNav.workspace.settings": "Workspace settings", diff --git a/web/i18n/zh-Hans/common.json b/web/i18n/zh-Hans/common.json index 33307528ef9..b54d8e5293f 100644 --- a/web/i18n/zh-Hans/common.json +++ b/web/i18n/zh-Hans/common.json @@ -211,6 +211,7 @@ "mainNav.workspace.credits": "{{count}} 消息额度", "mainNav.workspace.creditsUnit": "消息额度", "mainNav.workspace.inviteMembers": "邀请成员", + "mainNav.workspace.noResults": "未找到工作空间", "mainNav.workspace.openMenu": "打开工作空间菜单", "mainNav.workspace.searchPlaceholder": "搜索工作空间", "mainNav.workspace.settings": "工作空间设置", diff --git a/web/i18n/zh-Hant/common.json b/web/i18n/zh-Hant/common.json index 43113137c09..ac5fb952f34 100644 --- a/web/i18n/zh-Hant/common.json +++ b/web/i18n/zh-Hant/common.json @@ -211,6 +211,7 @@ "mainNav.workspace.credits": "{{count}} 點額度", "mainNav.workspace.creditsUnit": "點額度", "mainNav.workspace.inviteMembers": "邀請成員", + "mainNav.workspace.noResults": "找不到工作區", "mainNav.workspace.openMenu": "開啟工作區選單", "mainNav.workspace.searchPlaceholder": "搜尋工作區", "mainNav.workspace.settings": "工作區設定",