fix(dataset): align New RAG document views

This commit is contained in:
Stephen Zhou 2026-07-27 22:56:59 +08:00
parent e5d4f37469
commit b4a8f7f180
No known key found for this signature in database
33 changed files with 654 additions and 271 deletions

View File

@ -439,7 +439,8 @@ describe('DocumentDetailPage', () => {
queryClient.invalidateQueries.mockResolvedValue(undefined)
})
it('loads the document, revisions, chunks, and task status through generated contracts', () => {
it('loads the document, revisions, chunks, and task status through generated contracts', async () => {
const user = userEvent.setup()
render(<DocumentDetailPage documentId="document-1" knowledgeSpaceId="space-1" />)
expect(documentOptions).toHaveBeenCalledWith(
@ -466,6 +467,19 @@ describe('DocumentDetailPage', () => {
params: { control_space_id: 'space-1' },
query: { limit: 100 },
})
await user.click(
screen.getByRole('button', {
name: /dataset\.newKnowledge\.documentActions/,
}),
)
expect(screen.getAllByRole('menuitem')).toHaveLength(5)
expect(screen.getByRole('menuitem', { name: 'common.operation.rename' })).toBeInTheDocument()
expect(
screen.queryByRole('menuitem', { name: 'dataset.newKnowledge.reindexDocument' }),
).not.toBeInTheDocument()
expect(
screen.getByRole('menuitem', { name: 'dataset.newKnowledge.removeSource' }),
).toBeInTheDocument()
})
it('does not construct a chunks request while the document is loading', () => {

View File

@ -692,8 +692,16 @@ describe('DocumentsPage', () => {
})
expect(rowActions).toBeEnabled()
await user.click(rowActions)
const rowMenuItems = await screen.findAllByRole('menuitem')
expect(rowMenuItems).toHaveLength(6)
expect(rowMenuItems[0]).toHaveAccessibleName('common.operation.rename')
expect(rowMenuItems[1]).toHaveAccessibleName('dataset.newKnowledge.reindexDocument')
expect(rowMenuItems[2]).toHaveAccessibleName('dataset.newKnowledge.disableSource')
expect(rowMenuItems[3]).toHaveAccessibleName('dataset.batchAction.archive')
expect(rowMenuItems[4]).toHaveAccessibleName('dataset.newKnowledge.downloadDocuments')
expect(rowMenuItems[5]).toHaveAccessibleName('dataset.newKnowledge.removeSource')
await user.click(
await screen.findByRole('menuitem', { name: 'dataset.newKnowledge.downloadDocuments' }),
screen.getByRole('menuitem', { name: 'dataset.newKnowledge.downloadDocuments' }),
)
expect(toastMock.info).toHaveBeenCalledWith('dataset.newKnowledge.documentActionsUnavailable')
@ -816,6 +824,30 @@ describe('DocumentsPage', () => {
).not.toBeInTheDocument()
})
it('opens the upload form when files are dropped on a populated document page', () => {
documentsQuery.data = { pages: [{ items: [document()] }] }
const droppedFile = new File(['# handbook'], 'handbook.md', { type: 'text/markdown' })
render(<DocumentsPage knowledgeSpaceId="space-1" />)
const documentSurface = screen
.getByRole('heading', { name: 'dataset.newKnowledge.documents' })
.closest('section')
expect(documentSurface).not.toBeNull()
fireEvent.drop(documentSurface!, {
dataTransfer: {
dropEffect: 'copy',
files: [droppedFile],
types: ['Files'],
},
})
expect(
screen.getByRole('heading', { name: 'dataset.newKnowledge.addDocument' }),
).toBeInTheDocument()
expect(screen.getByText('handbook.md')).toBeInTheDocument()
})
it('keeps direct-upload actions unavailable until the deployment is verified', () => {
systemFeaturesStateMock.uploadEnabled = false
@ -1884,7 +1916,7 @@ describe('DocumentsPage', () => {
await waitFor(() => expect(screen.getByRole('table').parentElement).toHaveFocus())
})
it('re-indexes selected documents and disables backend-dependent actions', async () => {
it('re-indexes selected documents and keeps the designed bulk action order', async () => {
const user = userEvent.setup()
documentsQuery.data = {
pages: [{ items: [document({ id: 'one', title: 'One.pdf' }), document({ id: 'two' })] }],
@ -1908,25 +1940,24 @@ describe('DocumentsPage', () => {
expect(reindex).toBeEnabled()
const orderedActions = within(actions).getAllByRole('button')
expect(orderedActions[0]).toHaveAccessibleName('dataset.newKnowledge.reindexDocuments')
expect(orderedActions[1]).toHaveAccessibleName('dataset.newKnowledge.clearDocumentSelection')
expect(actions.firstElementChild).toBe(orderedActions[0])
expect(orderedActions[1]!.nextElementSibling).toHaveTextContent(
expect(orderedActions[1]).toHaveAccessibleName('dataset.newKnowledge.downloadDocuments')
expect(orderedActions[2]).toHaveAccessibleName('dataset.newKnowledge.deleteDocuments')
expect(orderedActions[3]).toHaveAccessibleName('dataset.newKnowledge.clearDocumentSelection')
expect(actions.firstElementChild).toHaveTextContent(
'dataset.newKnowledge.documentsSelected:{"count":1}',
)
expect(
within(actions).getByText(
'dataset.newKnowledge.downloadDocuments / dataset.newKnowledge.deleteDocuments · dataset.cornerLabel.unavailable',
),
).toBeVisible()
const download = within(actions).getByRole('button', {
name: 'dataset.newKnowledge.downloadDocuments',
})
const remove = within(actions).getByRole('button', {
name: 'dataset.newKnowledge.deleteDocuments',
})
expect(download).toBeDisabled()
expect(remove).toBeDisabled()
expect(toastMock.info).not.toHaveBeenCalled()
expect(download).toBeEnabled()
expect(remove).toBeEnabled()
await user.click(download)
await user.click(remove)
expect(toastMock.info).toHaveBeenCalledTimes(2)
expect(toastMock.info).toHaveBeenCalledWith('dataset.newKnowledge.documentActionsUnavailable')
await user.dblClick(reindex)
expect(reindexMutation.mutateAsync).toHaveBeenCalledOnce()
expect(reindexMutation.mutateAsync).toHaveBeenCalledWith({

View File

@ -96,6 +96,25 @@ describe('KnowledgeSpaceShell', () => {
expect(screen.getByText('source content')).toBeInTheDocument()
})
it('lets users collapse and restore the knowledge detail sidebar', async () => {
const user = userEvent.setup()
queryMock.data = {
control_space_id: 'space-1',
state: 'active',
technical_summary: { name: 'Support knowledge' },
}
render(<KnowledgeSpaceShell knowledgeSpaceId="space-1">source content</KnowledgeSpaceShell>)
await user.click(screen.getByRole('button', { name: 'layout.sidebar.collapseSidebar' }))
expect(screen.getByRole('button', { name: 'layout.sidebar.expandSidebar' })).toBeInTheDocument()
await user.click(screen.getByRole('button', { name: 'layout.sidebar.expandSidebar' }))
expect(
screen.getByRole('button', { name: 'layout.sidebar.collapseSidebar' }),
).toBeInTheDocument()
})
it('polls provisioning spaces without mounting data-plane children', () => {
queryMock.data = {
control_space_id: 'space-1',

View File

@ -0,0 +1,69 @@
'use client'
import { cn } from '@langgenius/dify-ui/cn'
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from '@langgenius/dify-ui/dropdown-menu'
import { toast } from '@langgenius/dify-ui/toast'
import { useTranslation } from 'react-i18next'
export function DocumentActionsDropdown({
className,
documentTitle,
showReindex = true,
}: {
className?: string
documentTitle: string
showReindex?: boolean
}) {
const { t } = useTranslation('dataset')
const { t: tCommon } = useTranslation('common')
const unavailable = () => toast.info(t(($) => $['newKnowledge.documentActionsUnavailable']))
return (
<DropdownMenu modal={false}>
<DropdownMenuTrigger
aria-label={t(($) => $['newKnowledge.documentActions'], { name: documentTitle })}
className={cn(
'ml-auto flex size-7 items-center justify-end rounded-md text-text-tertiary outline-hidden hover:bg-state-base-hover focus-visible:ring-2 focus-visible:ring-state-accent-solid',
className,
)}
>
<span aria-hidden className="i-ri-more-fill size-4" />
</DropdownMenuTrigger>
<DropdownMenuContent placement="bottom-end" sideOffset={4} popupClassName="w-[200px]">
<DropdownMenuItem className="gap-2 px-3" onClick={unavailable}>
<span aria-hidden className="i-ri-edit-line size-4" />
{tCommon(($) => $['operation.rename'])}
</DropdownMenuItem>
{showReindex && (
<DropdownMenuItem className="gap-2 px-3" onClick={unavailable}>
<span aria-hidden className="i-ri-loop-left-line size-4" />
{t(($) => $['newKnowledge.reindexDocument'])}
</DropdownMenuItem>
)}
<DropdownMenuItem className="gap-2 px-3" onClick={unavailable}>
<span aria-hidden className="i-ri-indeterminate-circle-line size-4" />
{t(($) => $['newKnowledge.disableSource'])}
</DropdownMenuItem>
<DropdownMenuItem className="gap-2 px-3" onClick={unavailable}>
<span aria-hidden className="i-ri-archive-2-line size-4" />
{t(($) => $['batchAction.archive'])}
</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuItem className="gap-2 px-3" onClick={unavailable}>
<span aria-hidden className="i-ri-download-line size-4" />
{t(($) => $['newKnowledge.downloadDocuments'])}
</DropdownMenuItem>
<DropdownMenuItem variant="destructive" className="gap-2 px-3" onClick={unavailable}>
<span aria-hidden className="i-ri-delete-bin-line size-4" />
{t(($) => $['newKnowledge.removeSource'])}
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
)
}

View File

@ -13,6 +13,7 @@ import {
import { useEffect, useRef } from 'react'
import { useTranslation } from 'react-i18next'
import Link from '@/next/link'
import { DocumentActionsDropdown } from './document-actions-dropdown'
export function DocumentDetailHeader({
backPath,
@ -126,6 +127,7 @@ export function DocumentDetailHeader({
<Button
aria-busy={reindexing || taskIsActive}
aria-describedby={reindexDisabledReasonId}
className="gap-1 pl-3"
disabled={reindexDisabled}
loading={reindexing}
onClick={onReindex}
@ -133,6 +135,11 @@ export function DocumentDetailHeader({
<span aria-hidden className="i-ri-refresh-line size-4" />
{t(($) => $['newKnowledge.reindexDocument'])}
</Button>
<DocumentActionsDropdown
className="size-8 justify-center"
documentTitle={document.title}
showReindex={false}
/>
</div>
</div>
{isFetchNextRevisionPageError && (

View File

@ -6,13 +6,6 @@ import type { LogicalDocument } from './document-models'
import { Button } from '@langgenius/dify-ui/button'
import { Checkbox } from '@langgenius/dify-ui/checkbox'
import { cn } from '@langgenius/dify-ui/cn'
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from '@langgenius/dify-ui/dropdown-menu'
import {
Select,
SelectContent,
@ -29,6 +22,7 @@ import Loading from '@/app/components/base/loading'
import { SearchInput } from '@/app/components/base/search-input'
import { useFormatTimeFromNow } from '@/hooks/use-format-time-from-now'
import Link from '@/next/link'
import { DocumentActionsDropdown } from './document-actions-dropdown'
import { sourceName } from './document-model'
export type DocumentFilter = DocumentDisplayStatus | 'all'
@ -44,6 +38,14 @@ const statusIconClass: Record<DocumentDisplayStatus, string> = {
disabled: 'i-ri-indeterminate-circle-line text-text-tertiary',
}
const statusTextClass: Record<DocumentDisplayStatus, string> = {
ready: 'font-normal text-text-secondary',
queued: 'font-normal text-text-tertiary',
processing: 'font-medium text-text-accent',
failed: 'font-medium text-text-destructive',
disabled: 'font-medium text-text-tertiary',
}
function TaskTrigger({
activeTaskCount,
attentionTaskBadge,
@ -62,7 +64,12 @@ function TaskTrigger({
const { t } = useTranslation('dataset')
return (
<>
<Button aria-label={tasksButtonLabel} data-has-error={hasTaskError} onClick={onOpenTasks}>
<Button
aria-label={tasksButtonLabel}
className="gap-1 pl-3"
data-has-error={hasTaskError}
onClick={onOpenTasks}
>
<span
aria-hidden
className={cn(
@ -126,13 +133,8 @@ const DocumentRow = memo(
const updatedTime = Date.parse(document.updatedAt)
return (
<tr
className={cn(
'border-t border-divider-subtle',
status === 'disabled' && !statusPending && 'opacity-60',
)}
>
<td className="w-10 py-3 pr-3">
<tr className="h-12 border-t border-divider-subtle">
<td className="w-10 align-middle">
<Checkbox
checked={selected}
disabled={selectionDisabled || status === 'disabled'}
@ -141,7 +143,7 @@ const DocumentRow = memo(
onCheckedChange={() => onSelectedChange(document.id)}
/>
</td>
<td className="min-w-0 py-3 pr-3 sm:min-w-72 sm:pr-6">
<td className="min-w-0 pr-3 align-middle sm:min-w-72 sm:pr-6">
<div className="flex min-w-0 items-center gap-2.5">
<span
aria-hidden
@ -149,19 +151,19 @@ const DocumentRow = memo(
/>
<Link
id={titleId}
className="truncate rounded system-xs-medium text-text-primary hover:text-text-accent focus-visible:ring-2 focus-visible:ring-state-accent-solid focus-visible:outline-hidden"
className="truncate rounded text-[13px] leading-[17px] font-medium text-text-primary hover:text-text-accent focus-visible:ring-2 focus-visible:ring-state-accent-solid focus-visible:outline-hidden"
href={documentHref}
>
{document.title}
</Link>
{revision !== undefined && (
<span className="shrink-0 rounded border border-divider-regular px-1 system-2xs-medium text-text-tertiary">
<span className="flex min-h-4 min-w-4 shrink-0 items-center justify-center rounded-[5px] border border-divider-regular px-1 system-2xs-medium text-text-tertiary">
v{revision}
</span>
)}
</div>
</td>
<td className="hidden w-52 py-3 pr-6 system-xs-regular text-text-secondary lg:table-cell">
<td className="hidden w-[210px] pr-6 align-middle system-xs-regular text-text-secondary lg:table-cell">
{sourcePending ? (
<span className="inline-flex items-center gap-2">
<span
@ -176,7 +178,7 @@ const DocumentRow = memo(
</span>
)}
</td>
<td className="w-24 py-3 pr-2 sm:w-56 sm:pr-6">
<td className="w-24 pr-2 align-middle sm:w-[240px] sm:pr-6">
{statusPending ? (
<span className="inline-flex items-center gap-2">
<span
@ -188,45 +190,26 @@ const DocumentRow = memo(
) : (
<span
className={cn(
'inline-flex items-center gap-1.5 system-xs-regular',
status === 'failed' ? 'text-text-destructive' : 'text-text-secondary',
'inline-flex items-center gap-1.5 text-xs leading-4',
statusTextClass[status],
)}
>
<span aria-hidden className={cn('size-3.5', statusIconClass[status])} />
<span
aria-hidden
className={cn(
status === 'processing' ? 'size-4' : 'size-3.5',
statusIconClass[status],
)}
/>
{t(($) => $[`newKnowledge.documentStatus.${status}`])}
</span>
)}
</td>
<td className="hidden w-40 py-3 pr-6 system-xs-regular text-text-tertiary lg:table-cell">
<td className="hidden w-[150px] pr-6 align-middle system-xs-regular text-text-tertiary lg:table-cell">
{Number.isNaN(updatedTime) ? document.updatedAt : formatTimeFromNow(updatedTime)}
</td>
<td className="w-10 py-3 text-right">
<DropdownMenu modal={false}>
<DropdownMenuTrigger
aria-label={t(($) => $['newKnowledge.documentActions'], { name: document.title })}
className="flex size-7 items-center justify-center rounded-md text-text-tertiary outline-hidden hover:bg-state-base-hover focus-visible:ring-2 focus-visible:ring-state-accent-solid"
>
<span aria-hidden className="i-ri-more-fill size-4" />
</DropdownMenuTrigger>
<DropdownMenuContent placement="bottom-end" sideOffset={4} popupClassName="w-44">
<DropdownMenuItem
className="gap-2 px-3"
onClick={() => toast.info(t(($) => $['newKnowledge.documentActionsUnavailable']))}
>
<span aria-hidden className="i-ri-download-line size-4" />
{t(($) => $['newKnowledge.downloadDocuments'])}
</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuItem
variant="destructive"
className="gap-2 px-3"
onClick={() => toast.info(t(($) => $['newKnowledge.documentActionsUnavailable']))}
>
<span aria-hidden className="i-ri-delete-bin-line size-4" />
{t(($) => $['newKnowledge.deleteDocuments'])}
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
<td className="w-10 align-middle">
<DocumentActionsDropdown documentTitle={document.title} />
</td>
</tr>
)
@ -239,7 +222,6 @@ export function DocumentsEmpty({
canEdit,
hasTaskError,
onAddDocument,
onDropFiles,
onOpenTasks,
readOnlyReasonId,
tasksButtonLabel,
@ -251,7 +233,6 @@ export function DocumentsEmpty({
canEdit: boolean
hasTaskError: boolean
onAddDocument: () => void
onDropFiles: (files: File[]) => void
onOpenTasks: () => void
readOnlyReasonId?: string
tasksButtonLabel: string
@ -262,28 +243,18 @@ export function DocumentsEmpty({
const tasksVisible = activeTaskCount > 0 || Boolean(attentionTaskBadge) || hasTaskError
return (
<div
className="flex min-h-96 flex-1 flex-col items-center justify-center px-6 text-center"
onDragOver={(event) => {
event.preventDefault()
event.dataTransfer.dropEffect = canEdit ? 'copy' : 'none'
}}
onDrop={(event) => {
event.preventDefault()
if (canEdit) onDropFiles([...event.dataTransfer.files])
}}
>
<div className="flex min-h-96 flex-1 flex-col items-center justify-center gap-4 p-6 text-center">
<span className="flex size-12 items-center justify-center rounded-xl bg-background-section text-text-accent">
<span aria-hidden className="i-ri-file-text-fill size-6" />
</span>
<h2 className="mt-4 system-md-semibold text-text-primary">
<h2 className="text-base leading-normal font-semibold text-text-primary">
{t(($) => $['newKnowledge.documentsEmptyTitle'])}
</h2>
<p className="mt-2 max-w-lg system-xs-regular text-text-tertiary">
<p className="max-w-[460px] text-[13px] leading-normal font-normal text-text-tertiary">
{t(($) => $['newKnowledge.documentsEmptyDescription'])}
</p>
<Button
className="mt-4"
className="gap-1 pl-3"
variant="primary"
aria-busy={uploading}
disabled={!canEdit}
@ -295,12 +266,12 @@ export function DocumentsEmpty({
{t(($) => $['newKnowledge.addDocument'])}
</Button>
{canEdit && (
<p className="mt-2 system-2xs-regular text-text-quaternary">
<p className="system-xs-regular text-text-quaternary">
{t(($) => $['newKnowledge.documentsDropHint'])}
</p>
)}
{tasksVisible && (
<div className="mt-4 flex flex-wrap items-center justify-center gap-2">
<div className="flex flex-wrap items-center justify-center gap-2">
<TaskTrigger
activeTaskCount={activeTaskCount}
attentionTaskBadge={attentionTaskBadge}
@ -417,7 +388,7 @@ export function DocumentsList({
return (
<>
<div className="mt-5 flex flex-col gap-2 xl:flex-row xl:items-center">
<div className="mt-4 flex flex-col gap-2 xl:flex-row xl:items-center">
<Select<DocumentFilter>
disabled={statusPending}
value={filter}
@ -471,11 +442,15 @@ export function DocumentsList({
tasksLiveStatus={tasksLiveStatus}
/>
)}
<Button onClick={() => toast.info(t(($) => $['newKnowledge.filtersUnavailable']))}>
<span aria-hidden className="i-ri-price-tag-3-line size-4" />
<Button
className="gap-1 pl-3"
onClick={() => toast.info(t(($) => $['newKnowledge.filtersUnavailable']))}
>
<span aria-hidden className="i-ri-file-text-line size-4" />
{t(($) => $['newKnowledge.metadata'])}
</Button>
<Button
className="gap-1 pl-3"
variant="primary"
aria-busy={uploading}
disabled={!canUpload}
@ -496,9 +471,9 @@ export function DocumentsList({
tabIndex={-1}
>
<table className="w-full table-fixed border-collapse text-left lg:min-w-[900px] lg:table-auto">
<thead className="system-2xs-medium text-text-tertiary uppercase">
<tr>
<th className="pb-2 font-medium">
<thead className="text-[11px] leading-4 font-medium tracking-[0.3px] text-text-tertiary">
<tr className="h-9">
<th className="w-10 py-2.5 font-medium">
<Checkbox
checked={allSelected}
indeterminate={someSelected && !allSelected}
@ -514,15 +489,19 @@ export function DocumentsList({
onCheckedChange={onSelectAll}
/>
</th>
<th className="pb-2 font-medium">{t(($) => $['newKnowledge.documentColumn'])}</th>
<th className="hidden pb-2 font-medium lg:table-cell">
<th className="py-2.5 pr-6 font-medium">
{t(($) => $['newKnowledge.documentColumn'])}
</th>
<th className="hidden w-[210px] py-2.5 pr-6 font-medium lg:table-cell">
{t(($) => $['newKnowledge.sourceColumn'])}
</th>
<th className="pb-2 font-medium">{t(($) => $['newKnowledge.statusColumn'])}</th>
<th className="hidden pb-2 font-medium lg:table-cell">
<th className="w-24 py-2.5 pr-2 font-medium sm:w-[240px] sm:pr-6">
{t(($) => $['newKnowledge.statusColumn'])}
</th>
<th className="hidden w-[150px] py-2.5 pr-6 font-medium lg:table-cell">
{t(($) => $['newKnowledge.updatedColumn'])}
</th>
<th aria-label={t(($) => $['newKnowledge.actionsColumn'])} />
<th className="w-10 py-2.5" aria-label={t(($) => $['newKnowledge.actionsColumn'])} />
</tr>
</thead>
<tbody>
@ -589,7 +568,7 @@ export function DocumentsList({
</div>
)}
</div>
<p className="mt-3 flex items-center gap-1.5 system-xs-regular text-text-tertiary">
<p className="mt-4 flex min-h-4 items-center gap-1.5 system-xs-regular text-text-tertiary">
<span aria-hidden className="i-ri-information-2-line size-3.5" />
{t(($) => $['newKnowledge.lastReadyRevisionHint'])}
</p>
@ -672,14 +651,18 @@ export function DocumentBulkActions({
}) {
const { t } = useTranslation('dataset')
return (
<div className="pointer-events-none fixed inset-x-0 bottom-[calc(1.75rem+env(safe-area-inset-bottom,0px))] z-20 flex justify-center pr-[calc(1rem+env(safe-area-inset-right,0px))] pl-[calc(1rem+env(safe-area-inset-left,0px))]">
<div className="pointer-events-none fixed right-0 bottom-[calc(1.75rem+env(safe-area-inset-bottom,0px))] left-0 z-20 flex justify-center pr-[calc(1rem+env(safe-area-inset-right,0px))] pl-[calc(1rem+env(safe-area-inset-left,0px))] sm:left-[var(--new-rag-sidebar-width,0px)]">
<div
aria-label={t(($) => $['newKnowledge.bulkDocumentActions'])}
className="pointer-events-auto flex max-w-full min-w-0 items-center gap-2 overflow-x-auto rounded-[14px] border border-divider-subtle bg-components-panel-bg px-3 py-2.5 shadow-xl"
className="pointer-events-auto flex max-w-full min-w-0 items-center gap-2 overflow-x-auto rounded-[14px] border border-divider-subtle bg-components-panel-bg py-2.5 pr-2.5 pl-4 shadow-[0_12px_32px_-6px_rgba(15,23,41,0.16),0_2px_6px_rgba(15,23,41,0.06)]"
role="group"
onBlurCapture={onBlurCapture}
onFocusCapture={onFocusCapture}
>
<span className="shrink-0 system-sm-medium text-text-primary">
{t(($) => $['newKnowledge.documentsSelected'], { count: selectedCount })}
</span>
<span aria-hidden className="h-5 w-px shrink-0 bg-divider-regular" />
<Button
aria-describedby={disabled ? 'document-reindex-unavailable' : undefined}
aria-busy={reindexing}
@ -691,18 +674,6 @@ export function DocumentBulkActions({
>
{t(($) => $['newKnowledge.reindexDocuments'])}
</Button>
<Button
variant="ghost"
size="small"
aria-label={t(($) => $['newKnowledge.clearDocumentSelection'])}
className="size-7 shrink-0 px-0"
onClick={onClear}
>
<span aria-hidden className="i-ri-close-line size-4" />
</Button>
<span className="shrink-0 px-1 system-xs-medium text-text-primary">
{t(($) => $['newKnowledge.documentsSelected'], { count: selectedCount })}
</span>
{disabled && disabledReason && (
<span
id="document-reindex-unavailable"
@ -714,33 +685,55 @@ export function DocumentBulkActions({
{disabledReason}
</span>
)}
<span
id="document-actions-unavailable"
className="max-w-44 shrink-0 system-2xs-regular text-text-tertiary"
>
{t(($) => $['newKnowledge.downloadDocuments'])}
{' / '}
{t(($) => $['newKnowledge.deleteDocuments'])}
{' · '}
{t(($) => $['cornerLabel.unavailable'])}
</span>
<Button
aria-describedby="document-actions-unavailable"
className="shrink-0"
size="small"
disabled
onClick={() => toast.info(t(($) => $['newKnowledge.documentActionsUnavailable']))}
>
{t(($) => $['newKnowledge.downloadDocuments'])}
</Button>
<Button
aria-describedby="document-actions-unavailable"
className="shrink-0"
size="small"
disabled
tone="destructive"
onClick={() => toast.info(t(($) => $['newKnowledge.documentActionsUnavailable']))}
>
{t(($) => $['newKnowledge.deleteDocuments'])}
</Button>
<Button
variant="ghost"
size="small"
aria-label={t(($) => $['newKnowledge.clearDocumentSelection'])}
className="size-[26px] shrink-0 px-0"
onClick={onClear}
>
<span aria-hidden className="i-ri-close-line size-3.5" />
</Button>
</div>
</div>
)
}
export function DocumentDropOverlay() {
const { t } = useTranslation('dataset')
return (
<div
className="pointer-events-none absolute inset-0 z-30 flex flex-col items-center justify-center rounded-lg border-2 border-dashed border-divider-regular bg-[rgba(255,255,255,0.5)] text-center backdrop-blur-[5px]"
role="status"
>
<div className="flex w-[228px] items-center justify-center gap-5 rounded-xl border border-dashed border-divider-regular bg-components-panel-bg px-8 py-7 shadow-xs">
<span aria-hidden className="i-ri-file-word-2-fill size-6 text-text-accent" />
<span aria-hidden className="i-ri-file-pdf-2-fill size-6 text-text-destructive" />
<span aria-hidden className="i-ri-file-excel-fill size-6 text-text-success" />
<span aria-hidden className="i-ri-file-text-fill size-6 text-text-tertiary" />
</div>
<p className="mt-4 system-md-semibold text-text-primary">
{t(($) => $['newKnowledge.dropFilesHere'])}
</p>
<p className="mt-2 system-xs-regular text-text-tertiary">
{t(($) => $['newKnowledge.documentUploadFormats'])}
</p>
</div>
)
}

View File

@ -2,6 +2,7 @@
import { Button } from '@langgenius/dify-ui/button'
import { cn } from '@langgenius/dify-ui/cn'
import { toast } from '@langgenius/dify-ui/toast'
import { useMemo, useRef, useState } from 'react'
import { useTranslation } from 'react-i18next'
import {
@ -16,6 +17,13 @@ function fileSize(size: number) {
return `${(size / (1024 * 1024)).toFixed(1)} MB`
}
function fileIconClass(extension: string) {
if (extension === 'PDF') return 'i-ri-file-pdf-2-fill text-text-destructive'
if (extension === 'DOC' || extension === 'DOCX') return 'i-ri-file-word-2-fill text-text-accent'
if (extension === 'XLS' || extension === 'XLSX') return 'i-ri-file-excel-fill text-text-success'
return 'i-ri-file-text-fill text-text-tertiary'
}
export function DocumentUploadForm({
initialFiles = [],
onCancel,
@ -52,7 +60,7 @@ export function DocumentUploadForm({
return (
<form
aria-labelledby="new-knowledge-documents-title"
className="mx-auto flex w-full max-w-[640px] flex-1 flex-col pt-8"
className="mt-4 flex w-full max-w-[640px] flex-1 flex-col"
onSubmit={(event) => {
event.preventDefault()
if (!validFiles.length || uploading) return
@ -73,7 +81,7 @@ export function DocumentUploadForm({
}}
/>
<button
className="flex min-h-44 w-full flex-col items-center justify-center rounded-xl border border-dashed border-divider-regular bg-background-section px-6 py-9 text-center outline-hidden transition-colors hover:border-state-accent-solid hover:bg-state-accent-hover focus-visible:ring-2 focus-visible:ring-state-accent-solid disabled:cursor-not-allowed disabled:opacity-50"
className="flex w-full flex-col items-center justify-center gap-2 rounded-xl border-[1.5px] border-dashed border-divider-regular bg-background-section px-6 py-9 text-center outline-hidden transition-colors hover:border-state-accent-solid hover:bg-state-accent-hover focus-visible:ring-2 focus-visible:ring-state-accent-solid disabled:cursor-not-allowed disabled:opacity-50"
disabled={uploading}
type="button"
onClick={() => inputRef.current?.click()}
@ -86,80 +94,85 @@ export function DocumentUploadForm({
if (!uploading) addFiles([...event.dataTransfer.files])
}}
>
<span className="flex size-11 items-center justify-center rounded-xl bg-background-default-subtle">
<span aria-hidden className="i-ri-file-upload-line size-[22px] text-text-tertiary" />
<span className="flex size-11 items-center justify-center rounded-[10px] bg-background-default-subtle">
<span aria-hidden className="i-ri-file-text-fill size-[22px] text-text-accent" />
</span>
<span className="mt-3 system-sm-medium text-text-primary">
{t(($) => $['newKnowledge.uploadFiles'])}
<span className="system-md-medium text-text-primary">
{t(($) => $['newKnowledge.uploadDropZoneTitle'])}
</span>
<span className="mt-1 system-xs-regular text-text-tertiary">
{t(($) => $['newKnowledge.documentsDropHint'])}
</span>
<span className="mt-1 system-2xs-regular text-text-quaternary">
PDF, DOCX, Markdown, HTML, XLSX, TXT · 15 MB
<span className="system-xs-regular text-text-quaternary">
{t(($) => $['newKnowledge.documentUploadFormats'])}
</span>
</button>
{files.length > 0 && (
<section className="mt-6" aria-label={t(($) => $['newKnowledge.uploadDocuments'])}>
<div className="flex items-center justify-between">
<h3 className="system-sm-semibold text-text-primary">
{t(($) => $['newKnowledge.uploadDocuments'])}
</h3>
<span className="system-xs-regular text-text-tertiary">
{validFiles.length} / {files.length}
</span>
</div>
<ul className="mt-3 space-y-2">
<section className="mt-4" aria-label={t(($) => $['newKnowledge.uploadDocuments'])}>
<h3 className="system-sm-semibold text-text-primary">
{t(($) => $['newKnowledge.selectedFiles'], {
total: files.length,
valid: validFiles.length,
})}
</h3>
<ul className="mt-2 space-y-1">
{files.map((file, index) => {
const issue = documentUploadIssue(file)
const extension = documentUploadFileExtension(file.name).toLocaleUpperCase()
const previewAvailable = !issue && (extension === 'DOC' || extension === 'DOCX')
return (
<li
key={`${file.name}:${file.size}:${file.lastModified}`}
className={cn(
'flex min-h-16 items-center gap-3 rounded-xl border px-3 py-2.5',
'flex min-h-12 items-center overflow-hidden rounded-lg border-[0.5px] shadow-xs',
issue
? 'border-state-destructive-border bg-state-destructive-hover'
: 'border-divider-subtle bg-background-default',
: 'border-components-panel-border bg-components-panel-on-panel-item-bg',
)}
>
<span
className={cn(
'flex size-10 shrink-0 items-center justify-center rounded-lg',
issue
? 'bg-state-destructive-hover text-text-destructive'
: 'bg-background-section text-text-accent',
)}
>
<span aria-hidden className="i-ri-file-text-fill size-5" />
<span className="flex shrink-0 items-start p-3">
<span aria-hidden className={cn('size-6', fileIconClass(extension))} />
</span>
<span className="min-w-0 flex-1 text-left">
<span className="min-w-0 flex-1 py-1 pr-2 text-left">
<span className="block truncate system-xs-medium text-text-primary">
{file.name}
</span>
<span className="mt-0.5 block system-2xs-regular text-text-tertiary">
<span className="mt-0.5 flex min-h-3 items-center gap-1 system-2xs-medium text-text-tertiary">
{extension || 'FILE'} · {fileSize(file.size)}
{issue && (
<>
<span aria-hidden className="text-text-quaternary">
·
</span>
<span className="truncate text-text-destructive">
{t(($) => $[`newKnowledge.documentUploadExclusion.${issue}`])}
</span>
</>
)}
</span>
{issue && (
<span className="mt-0.5 block system-2xs-regular text-text-destructive">
{t(($) => $[`newKnowledge.documentUploadExclusion.${issue}`])}
</span>
)}
</span>
<button
aria-label={`${tCommon(($) => $['operation.remove'])} · ${file.name}`}
className="flex size-8 shrink-0 items-center justify-center rounded-lg text-text-tertiary outline-hidden hover:bg-state-base-hover hover:text-text-secondary focus-visible:ring-2 focus-visible:ring-state-accent-solid"
disabled={uploading}
type="button"
onClick={() =>
setFiles((current) =>
current.filter((_, currentIndex) => currentIndex !== index),
)
}
>
<span aria-hidden className="i-ri-close-line size-4" />
</button>
<span className="flex shrink-0 items-center gap-1 py-2 pr-3">
{previewAvailable && (
<Button
size="small"
type="button"
onClick={() => toast.info(t(($) => $['newKnowledge.previewUnavailable']))}
>
{t(($) => $['newKnowledge.preview'])}
</Button>
)}
<button
aria-label={`${tCommon(($) => $['operation.remove'])} · ${file.name}`}
className="flex size-7 shrink-0 items-center justify-center rounded-md text-text-tertiary outline-hidden hover:bg-state-base-hover hover:text-text-secondary focus-visible:ring-2 focus-visible:ring-state-accent-solid"
disabled={uploading}
type="button"
onClick={() =>
setFiles((current) =>
current.filter((_, currentIndex) => currentIndex !== index),
)
}
>
<span aria-hidden className="i-ri-delete-bin-line size-4" />
</button>
</span>
</li>
)
})}
@ -167,18 +180,19 @@ export function DocumentUploadForm({
</section>
)}
<div className="mt-8 flex justify-end gap-2 border-t border-divider-subtle pt-4">
<div className="mt-4 flex justify-end gap-3 pt-5">
<Button disabled={uploading} type="button" onClick={onCancel}>
{tCommon(($) => $['operation.cancel'])}
</Button>
<Button
aria-label={t(($) => $['newKnowledge.addDocument'])}
aria-busy={uploading}
disabled={!validFiles.length || uploading}
loading={uploading}
type="submit"
variant="primary"
>
{t(($) => $['newKnowledge.addDocument'])}
{t(($) => $['newKnowledge.addAndProcess'])}
</Button>
</div>
</form>

View File

@ -27,7 +27,12 @@ import { knowledgeFsUploadEnabledAtom } from '@/context/system-features-state'
import { consoleClient, consoleQuery } from '@/service/client'
import { DatasetACLPermission, hasPermission } from '@/utils/permission'
import { useAuxiliaryTaskReadGuard } from './auxiliary-task-read-guard'
import { DocumentBulkActions, DocumentsEmpty, DocumentsList } from './document-list'
import {
DocumentBulkActions,
DocumentDropOverlay,
DocumentsEmpty,
DocumentsList,
} from './document-list'
import {
ACTIVE_TASK_STATES,
documentDisplayStatus,
@ -203,6 +208,8 @@ export function DocumentsPage({ knowledgeSpaceId }: { knowledgeSpaceId: string }
const [selectedDocumentIds, setSelectedDocumentIds] = useState<Set<string>>(() => new Set())
const [uploadFormOpen, setUploadFormOpen] = useState(false)
const [uploadFormInitialFiles, setUploadFormInitialFiles] = useState<File[]>([])
const [isFileDragActive, setIsFileDragActive] = useState(false)
const fileDragDepthRef = useRef(0)
const [tasksOpen, setTasksOpen] = useState(false)
const [writePermissionRevoked, setWritePermissionRevoked] = useState(false)
const [writePermissionRecoveryGeneration, setWritePermissionRecoveryGeneration] = useState<
@ -318,6 +325,14 @@ export function DocumentsPage({ knowledgeSpaceId }: { knowledgeSpaceId: string }
)
const canWrite = hasWorkspaceWritePermission && !permissionDenied && !writePermissionRevoked
const canUpload = canWrite && uploadAvailable
const openUploadForm = useCallback((files: File[] = []) => {
writePermissionFocusRecoveryRequestedRef.current = true
writePermissionFocusOriginRef.current = document.activeElement as HTMLElement | null
fileDragDepthRef.current = 0
setIsFileDragActive(false)
setUploadFormInitialFiles(files)
setUploadFormOpen(true)
}, [])
const documentWriteRestrictionReasonId = permissionPending
? 'documents-permission-pending'
: permissionQueryError
@ -1865,9 +1880,39 @@ export function DocumentsPage({ knowledgeSpaceId }: { knowledgeSpaceId: string }
<section
ref={documentsSectionRef}
className={cn(
'flex min-h-full flex-col px-4 pt-6 sm:px-8 sm:pt-7',
bulkActionsVisible ? 'pb-[calc(7rem+env(safe-area-inset-bottom,0px))]' : 'pb-6 sm:pb-7',
'relative flex min-h-full flex-col px-4 pt-6 sm:px-8',
bulkActionsVisible ? 'pb-[calc(7rem+env(safe-area-inset-bottom,0px))]' : 'pb-6',
)}
onDragEnter={(event) => {
const types = Array.from(event.dataTransfer.types ?? [])
if (types.length && !types.includes('Files')) return
event.preventDefault()
if (!canUpload || uploadFormOpen || uploading) return
fileDragDepthRef.current += 1
setIsFileDragActive(true)
}}
onDragLeave={() => {
if (!fileDragDepthRef.current) return
fileDragDepthRef.current -= 1
if (!fileDragDepthRef.current) setIsFileDragActive(false)
}}
onDragOver={(event) => {
const types = Array.from(event.dataTransfer.types ?? [])
if (types.length && !types.includes('Files')) return
event.preventDefault()
if (!uploadFormOpen)
event.dataTransfer.dropEffect = canUpload && !uploading ? 'copy' : 'none'
}}
onDrop={(event) => {
const types = Array.from(event.dataTransfer.types ?? [])
if (types.length && !types.includes('Files')) return
event.preventDefault()
fileDragDepthRef.current = 0
setIsFileDragActive(false)
if (!canUpload || uploadFormOpen || uploading) return
const files = [...event.dataTransfer.files]
if (files.length) openUploadForm(files)
}}
onBlurCapture={(event) => {
if (!event.currentTarget.contains(event.relatedTarget as Node | null)) {
documentSurfaceHadFocusRef.current = false
@ -1897,7 +1942,7 @@ export function DocumentsPage({ knowledgeSpaceId }: { knowledgeSpaceId: string }
<h2
ref={documentsTitleRef}
id="new-knowledge-documents-title"
className="title-xl-semi-bold text-text-primary"
className="title-xl-semi-bold leading-6 text-text-primary"
tabIndex={-1}
>
{t(($) =>
@ -2130,18 +2175,7 @@ export function DocumentsPage({ knowledgeSpaceId }: { knowledgeSpaceId: string }
attentionTaskBadge={attentionTaskBadge}
canEdit={canUpload}
hasTaskError={hasTaskError}
onAddDocument={() => {
writePermissionFocusRecoveryRequestedRef.current = true
writePermissionFocusOriginRef.current = document.activeElement as HTMLElement | null
setUploadFormInitialFiles([])
setUploadFormOpen(true)
}}
onDropFiles={(files) => {
writePermissionFocusRecoveryRequestedRef.current = true
writePermissionFocusOriginRef.current = document.activeElement as HTMLElement | null
setUploadFormInitialFiles(files)
setUploadFormOpen(true)
}}
onAddDocument={() => openUploadForm()}
onOpenTasks={() => setTasksOpen(true)}
readOnlyReasonId={documentUploadRestrictionReasonId}
tasksButtonLabel={tasksButtonLabel}
@ -2169,12 +2203,7 @@ export function DocumentsPage({ knowledgeSpaceId }: { knowledgeSpaceId: string }
isFetchNextPageError={documentsQuery.isFetchNextPageError}
isFetchingNextDocumentPage={isFetchingNextDocumentPage}
isFetchingNextPage={isFetchingNextResultsPage}
onAddDocument={() => {
writePermissionFocusRecoveryRequestedRef.current = true
writePermissionFocusOriginRef.current = document.activeElement as HTMLElement | null
setUploadFormInitialFiles([])
setUploadFormOpen(true)
}}
onAddDocument={() => openUploadForm()}
onFilterChange={setFilter}
onLoadMore={loadMoreResults}
onOpenTasks={() => setTasksOpen(true)}
@ -2204,6 +2233,7 @@ export function DocumentsPage({ knowledgeSpaceId }: { knowledgeSpaceId: string }
uploading={uploading}
/>
)}
{isFileDragActive && canUpload && !uploadFormOpen && <DocumentDropOverlay />}
</section>
{bulkActionsVisible && (
<DocumentBulkActions

View File

@ -1,12 +1,17 @@
'use client'
import type { ReactNode } from 'react'
import type { CSSProperties, ReactNode } from 'react'
import { Button } from '@langgenius/dify-ui/button'
import { cn } from '@langgenius/dify-ui/cn'
import { DialogTrigger } from '@langgenius/dify-ui/dialog'
import { toast } from '@langgenius/dify-ui/toast'
import { useQuery } from '@tanstack/react-query'
import { useState } from 'react'
import { useTranslation } from 'react-i18next'
import SidebarLeftArrowIcon from '@/app/components/base/icons/src/vender/SidebarLeftArrowIcon'
import Loading from '@/app/components/base/loading'
import { DetailSidebarToggleButton } from '@/app/components/detail-sidebar/toggle-button'
import { gotoAnythingDialogHandle } from '@/app/components/goto-anything/dialog-handle'
import useDocumentTitle from '@/hooks/use-document-title'
import Link from '@/next/link'
import { usePathname } from '@/next/navigation'
@ -33,6 +38,8 @@ export function KnowledgeSpaceShell({
const { t } = useTranslation('dataset')
const { t: tCommon } = useTranslation('common')
const { t: tHit } = useTranslation('datasetHitTesting')
const { t: tApp } = useTranslation('app')
const [sidebarExpanded, setSidebarExpanded] = useState(true)
const pathname = usePathname()
const knowledgeSpaceQuery = useQuery({
...consoleQuery.knowledgeFs.spaces.byControlSpaceId.get.queryOptions({
@ -95,44 +102,97 @@ export function KnowledgeSpaceShell({
const documentsActive = pathname === documentsPath || pathname.startsWith(`${documentsPath}/`)
const showDeferredPage = () => toast.info(t(($) => $['cornerLabel.unavailable']))
const navItemClassName =
'flex h-8 shrink-0 items-center gap-2 rounded-lg px-3 system-sm-medium outline-hidden hover:bg-state-base-hover focus-visible:ring-2 focus-visible:ring-state-accent-solid'
'flex h-8 shrink-0 items-center gap-2 rounded-lg pr-1 pl-3 system-sm-medium outline-hidden hover:bg-state-base-hover focus-visible:ring-2 focus-visible:ring-state-accent-solid'
const navIcon = (className: string) => (
<span aria-hidden className="flex size-5 shrink-0 items-center justify-center">
<span className={cn('size-[18px]', className)} />
</span>
)
return (
<div className="flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden bg-background-body p-1">
<div
className="flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden bg-background-body p-1"
style={
{
'--new-rag-sidebar-width': sidebarExpanded ? '248px' : '64px',
} as CSSProperties
}
>
<div className="flex min-h-0 min-w-0 flex-1 flex-col gap-1 overflow-hidden sm:flex-row">
<aside className="flex shrink-0 flex-col overflow-hidden rounded-lg bg-components-panel-bg shadow-xs sm:w-60">
<div className="flex h-12 min-w-0 items-center px-1 pr-2">
<Link
href={newKnowledgeListPath}
aria-label={t(($) => $['newKnowledge.backToList'])}
className="flex h-8 w-10 shrink-0 items-center justify-center rounded-lg text-text-tertiary outline-hidden hover:bg-state-base-hover focus-visible:ring-2 focus-visible:ring-state-accent-solid"
>
<span aria-hidden className="i-ri-arrow-left-s-line size-4" />
<span aria-hidden className="i-ri-home-5-line size-4" />
</Link>
<span aria-hidden className="text-text-quaternary">
/
</span>
<span className="truncate px-1.5 system-sm-semibold-uppercase text-text-secondary">
{t(($) => $.knowledge)}
</span>
<aside
className={cn(
'flex shrink-0 flex-col overflow-hidden rounded-lg bg-components-panel-bg shadow-xs transition-[width] motion-reduce:transition-none',
sidebarExpanded ? 'sm:w-60' : 'sm:w-14',
)}
>
<div
className={cn(
'flex h-12 min-w-0 items-center',
sidebarExpanded ? 'py-2 pr-2 pl-1' : 'justify-center px-3 pt-2 pb-1',
)}
>
{sidebarExpanded && (
<>
<div className="flex min-w-0 flex-1 items-center gap-px">
<Link
href={newKnowledgeListPath}
aria-label={t(($) => $['newKnowledge.backToList'])}
className="flex shrink-0 items-center rounded-lg py-2 pr-1.5 pl-0.5 text-text-tertiary outline-hidden transition-colors hover:bg-state-base-hover hover:text-text-secondary focus-visible:ring-2 focus-visible:ring-state-accent-solid"
>
<span aria-hidden className="i-ri-arrow-left-s-line size-4" />
<span aria-hidden className="i-ri-home-5-line size-4" />
</Link>
<span aria-hidden className="system-md-regular text-text-quaternary">
/
</span>
<span className="truncate px-1.5 py-2 system-sm-semibold-uppercase text-text-secondary">
{t(($) => $.knowledge)}
</span>
</div>
<DialogTrigger
handle={gotoAnythingDialogHandle}
render={
<button
type="button"
aria-label={tApp(($) => $['gotoAnything.searchTitle'])}
className="flex size-8 shrink-0 items-center justify-center overflow-hidden rounded-[10px] text-text-tertiary outline-hidden transition-colors hover:bg-state-base-hover hover:text-text-secondary focus-visible:ring-2 focus-visible:ring-state-accent-solid"
>
<span aria-hidden className="i-custom-vender-main-nav-quick-search size-4" />
</button>
}
/>
</>
)}
<DetailSidebarToggleButton
expand={sidebarExpanded}
onToggle={() => setSidebarExpanded((expanded) => !expanded)}
icon={<SidebarLeftArrowIcon aria-hidden className="size-4" />}
className="size-8 rounded-[10px] border-0 bg-transparent px-0 text-text-tertiary shadow-none hover:border-0 hover:bg-state-base-hover hover:text-text-secondary"
/>
</div>
<div className="flex min-w-0 items-center px-1 py-2">
<div className="flex min-w-0 flex-1 items-center gap-2 rounded-xl p-2">
<div
className={cn(
'flex min-w-0 flex-1 items-center rounded-xl p-2',
sidebarExpanded ? 'gap-2' : 'justify-center',
)}
>
<KnowledgeSpaceIcon
icon={knowledgeSpaceQuery.data.technical_summary?.icon}
size="medium"
/>
<div className="min-w-0 flex-1">
<h1 className="truncate system-md-semibold text-text-secondary">
{knowledgeSpaceName}
</h1>
<p className="mt-0.5 truncate system-2xs-medium-uppercase text-text-tertiary">
{t(($) => $['chunkingMode.parentChild'])} ·{' '}
{t(($) => $['indexingTechnique.high_quality'])} ·{' '}
{t(($) => $['retrieval.semantic_search.title'])}
</p>
</div>
{sidebarExpanded && (
<div className="min-w-0 flex-1">
<h1 className="truncate system-md-semibold text-text-secondary">
{knowledgeSpaceName}
</h1>
<p className="mt-0.5 truncate system-2xs-medium-uppercase text-text-tertiary">
{t(($) => $['chunkingMode.parentChild'])} ·{' '}
{t(($) => $['indexingTechnique.high_quality'])} ·{' '}
{t(($) => $['retrieval.semantic_search.title'])}
</p>
</div>
)}
</div>
</div>
<nav
@ -140,72 +200,103 @@ export function KnowledgeSpaceShell({
aria-label={knowledgeSpaceName}
>
<Button
aria-label={t(($) => $['newKnowledge.overview'])}
variant="ghost"
className={cn(navItemClassName, 'justify-start text-text-secondary')}
className={cn(
navItemClassName,
sidebarExpanded ? 'justify-start' : 'justify-center px-0',
'text-text-secondary',
)}
onClick={showDeferredPage}
>
<span aria-hidden className="i-ri-layout-grid-line size-4" />
{t(($) => $['newKnowledge.overview'])}
{navIcon('i-ri-layout-grid-line')}
{sidebarExpanded && t(($) => $['newKnowledge.overview'])}
</Button>
<Link
href={sourcesPath}
aria-label={t(($) => $['newKnowledge.sourceColumn'])}
aria-current={sourcesActive ? 'page' : undefined}
className={cn(
navItemClassName,
sourcesActive ? 'bg-state-base-active text-text-accent' : 'text-text-secondary',
sidebarExpanded ? 'justify-start' : 'justify-center px-0',
sourcesActive
? 'bg-state-base-active font-semibold text-text-accent'
: 'text-text-secondary',
)}
>
<span aria-hidden className="i-ri-book-open-line size-4" />
{t(($) => $['newKnowledge.sourceColumn'])}
{navIcon('i-ri-book-open-line')}
{sidebarExpanded && t(($) => $['newKnowledge.sourceColumn'])}
</Link>
<Link
href={documentsPath}
aria-label={t(($) => $['newKnowledge.documentColumn'])}
aria-current={documentsActive ? 'page' : undefined}
className={cn(
navItemClassName,
documentsActive ? 'bg-state-base-active text-text-accent' : 'text-text-secondary',
sidebarExpanded ? 'justify-start' : 'justify-center px-0',
documentsActive
? 'bg-state-base-active font-semibold text-text-accent'
: 'text-text-secondary',
)}
>
<span aria-hidden className="i-ri-file-text-line size-4" />
{t(($) => $['newKnowledge.documentColumn'])}
{navIcon('i-ri-file-text-line')}
{sidebarExpanded && t(($) => $['newKnowledge.documentColumn'])}
</Link>
<Button
variant="ghost"
className={cn(navItemClassName, 'justify-start text-text-secondary')}
onClick={showDeferredPage}
>
<span aria-hidden className="i-ri-search-eye-line size-4" />
{tHit(($) => $.title)}
</Button>
<Button
variant="ghost"
className={cn(navItemClassName, 'justify-start text-text-secondary')}
onClick={showDeferredPage}
>
<span aria-hidden className="i-ri-shield-check-line size-4" />
{t(($) => $['newKnowledge.quality'])}
</Button>
<Button
variant="ghost"
className={cn(navItemClassName, 'justify-start text-text-secondary')}
onClick={showDeferredPage}
>
<span aria-hidden className="i-ri-equalizer-2-line size-4" />
{tCommon(($) => $['datasetMenus.settings'])}
</Button>
<span className="hidden flex-1 sm:block" />
<Button
aria-label={tHit(($) => $.title)}
variant="ghost"
className={cn(
navItemClassName,
'justify-start border-[0.5px] border-components-panel-border text-text-secondary',
sidebarExpanded ? 'justify-start' : 'justify-center px-0',
'text-text-secondary',
)}
onClick={showDeferredPage}
>
<span aria-hidden className="i-custom-vender-workflow-agent size-4" />
{t(($) => $['newKnowledge.apiAgentAccess'])}
{navIcon('i-ri-search-eye-line')}
{sidebarExpanded && tHit(($) => $.title)}
</Button>
<Button
aria-label={t(($) => $['newKnowledge.quality'])}
variant="ghost"
className={cn(
navItemClassName,
sidebarExpanded ? 'justify-start' : 'justify-center px-0',
'text-text-secondary',
)}
onClick={showDeferredPage}
>
{navIcon('i-ri-shield-check-line')}
{sidebarExpanded && t(($) => $['newKnowledge.quality'])}
</Button>
<Button
aria-label={tCommon(($) => $['datasetMenus.settings'])}
variant="ghost"
className={cn(
navItemClassName,
sidebarExpanded ? 'justify-start' : 'justify-center px-0',
'text-text-secondary',
)}
onClick={showDeferredPage}
>
{navIcon('i-ri-equalizer-2-line')}
{sidebarExpanded && tCommon(($) => $['datasetMenus.settings'])}
</Button>
</nav>
<div className={cn('shrink-0 py-2', sidebarExpanded ? 'px-3' : 'px-2')}>
<Button
aria-label={t(($) => $['newKnowledge.apiAgentAccess'])}
variant="ghost"
className={cn(
navItemClassName,
'w-full border-[0.5px] border-components-panel-border text-text-secondary',
sidebarExpanded ? 'justify-start' : 'justify-center px-0',
)}
onClick={showDeferredPage}
>
{navIcon('i-custom-vender-workflow-agent')}
{sidebarExpanded && t(($) => $['newKnowledge.apiAgentAccess'])}
</Button>
</div>
</aside>
<section className="min-h-0 min-w-0 flex-1 overflow-auto rounded-lg bg-components-panel-bg shadow-xs">
{children}

View File

@ -413,7 +413,7 @@ export function ProcessingTasksDrawer({
<DrawerCloseButton
ref={drawerCloseButtonRef}
aria-label={tCommon(($) => $['operation.close'])}
className="size-6 rounded-md"
className="size-[26px] rounded-md"
/>
</div>
<DrawerDescription className="mt-1 system-xs-regular text-text-tertiary">
@ -514,7 +514,7 @@ export function ProcessingTasksDrawer({
<Loading />
</div>
) : orderedTasks.length ? (
<ul className="divide-y divide-divider-subtle">
<ul>
{orderedTasks.map((task) => {
const title =
documentTitles.get(task.documentId) ??
@ -541,10 +541,10 @@ export function ProcessingTasksDrawer({
}
/>
<div className="min-w-0 flex-1">
<p className="truncate system-xs-medium text-text-primary">
<p className="truncate system-sm-medium text-text-primary">
{t(($) => $['newKnowledge.processDocument'], { name: title })}
</p>
<p className="mt-0.5 truncate system-2xs-regular text-text-tertiary">
<p className="mt-[3px] truncate system-xs-regular text-text-tertiary">
{t(($) => $[`newKnowledge.processingTaskState.${task.state}`], {
progress: task.progressPercent,
})}

View File

@ -132,6 +132,7 @@
"mixtureInternalAndExternalTip": "مطلوب نموذج إعادة الترتيب لخلط المعرفة الداخلية والخارجية.",
"multimodal": "متعدد الوسائط",
"newKnowledge.actionsColumn": "الإجراءات",
"newKnowledge.addAndProcess": "إضافة ومعالجة",
"newKnowledge.addDocument": "أضف وثيقة",
"newKnowledge.addSource": "أضف المصدر",
"newKnowledge.addSourceDescription": "قم بتوصيل مصدر بقاعدة المعرفة هذه - تتم مزامنته تلقائيًا ويظل محدثًا.",
@ -250,6 +251,7 @@
"newKnowledge.documentUploadExclusion.quota": "تم تجاوز حصة مساحة العمل",
"newKnowledge.documentUploadExclusion.target": "لم يعد هدف المستند صالحًا",
"newKnowledge.documentUploadFailed": "لم نتمكن من تحميل هذه المستندات. حاول ثانية.",
"newKnowledge.documentUploadFormats": "PDF، DOCX، Markdown، HTML، XLSX، TXT — حتى 15 ميغابايت لكل ملف",
"newKnowledge.documentUploadPartial": "بدأت معالجة {{accepted}} مستندًا؛ تعذرت إضافة {{excluded}}: {{details}}",
"newKnowledge.documentUploadRejected": "لم يتم قبول أي مستند: {{details}}",
"newKnowledge.documentUploadStarted": "بدأت معالجة المستندات.",
@ -268,6 +270,7 @@
"newKnowledge.documentsSelected": "تم تحديد وثائق {{count}}",
"newKnowledge.documentsUnavailable": "— مستندات",
"newKnowledge.downloadDocuments": "تحميل",
"newKnowledge.dropFilesHere": "أفلت الملفات هنا",
"newKnowledge.editSource": "تحرير",
"newKnowledge.emptyChunk": "مقطع فارغ",
"newKnowledge.emptyDescription": "أضف مستنداتك ليتمكن الوكلاء من قراءتها مباشرة — من دون إعداد الفهرسة.",
@ -379,6 +382,7 @@
"newKnowledge.selectAllSources": "تحديد كل المصادر",
"newKnowledge.selectChunk": "حدد مقطعًا لفحص محتواه.",
"newKnowledge.selectFilesAndFolders": "حدد الملفات والمجلدات للمزامنة",
"newKnowledge.selectedFiles": "الملفات المحددة ({{valid}} من {{total}} صالحة)",
"newKnowledge.skippedFailed": "تم التخطي (فشل)",
"newKnowledge.skippedOffDomain": "تم التخطي (خارج النطاق)",
"newKnowledge.sourceActions": "إجراءات {{name}}",
@ -437,6 +441,7 @@
"newKnowledge.updatedColumn": "تم التحديث",
"newKnowledge.uploadCharactersUnavailable": "الأحرف: —",
"newKnowledge.uploadDocuments": "تحميل المستندات",
"newKnowledge.uploadDropZoneTitle": "اسحب الملفات وأفلتها هنا، أو انقر للتصفح",
"newKnowledge.uploadFiles": "رفع الملفات",
"newKnowledge.uploadFilesDescription": "أضف ملفات من جهازك — ستتم فهرستها بمجرد إنشائها.",
"newKnowledge.uploadingFiles": "جارٍ الرفع…",

View File

@ -132,6 +132,7 @@
"mixtureInternalAndExternalTip": "Das Rerank-Modell ist für die Mischung von internem und externem Wissen erforderlich.",
"multimodal": "Multimodal",
"newKnowledge.actionsColumn": "Aktionen",
"newKnowledge.addAndProcess": "Hinzufügen und verarbeiten",
"newKnowledge.addDocument": "Dokument hinzufügen",
"newKnowledge.addSource": "Quelle hinzufügen",
"newKnowledge.addSourceDescription": "Verbinden Sie eine Quelle mit dieser Wissensdatenbank sie wird automatisch synchronisiert und bleibt aktuell.",
@ -250,6 +251,7 @@
"newKnowledge.documentUploadExclusion.quota": "Arbeitsbereichskontingent überschritten",
"newKnowledge.documentUploadExclusion.target": "Dokumentziel ist nicht mehr gültig",
"newKnowledge.documentUploadFailed": "Wir konnten diese Dokumente nicht hochladen. Versuchen Sie es erneut.",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, XLSX, TXT — bis zu 15 MB pro Datei",
"newKnowledge.documentUploadPartial": "{{accepted}} Dokumente wurden gestartet; {{excluded}} konnten nicht hinzugefügt werden: {{details}}",
"newKnowledge.documentUploadRejected": "Keine Dokumente wurden akzeptiert: {{details}}",
"newKnowledge.documentUploadStarted": "Die Dokumentenverarbeitung wurde gestartet.",
@ -268,6 +270,7 @@
"newKnowledge.documentsSelected": "{{count}} Dokumente ausgewählt",
"newKnowledge.documentsUnavailable": "— Dokumente",
"newKnowledge.downloadDocuments": "Herunterladen",
"newKnowledge.dropFilesHere": "Dateien hier ablegen",
"newKnowledge.editSource": "Bearbeiten",
"newKnowledge.emptyChunk": "Leerer Abschnitt",
"newKnowledge.emptyDescription": "Fügen Sie Ihre Dokumente hinzu, damit Agents sie direkt lesen können — ohne eine Indizierung einzurichten.",
@ -379,6 +382,7 @@
"newKnowledge.selectAllSources": "Alle Quellen auswählen",
"newKnowledge.selectChunk": "Wählen Sie einen Abschnitt aus, um seinen Inhalt zu prüfen.",
"newKnowledge.selectFilesAndFolders": "Dateien und Ordner zum Synchronisieren auswählen",
"newKnowledge.selectedFiles": "Ausgewählte Dateien ({{valid}} von {{total}} gültig)",
"newKnowledge.skippedFailed": "Übersprungen (fehlgeschlagen)",
"newKnowledge.skippedOffDomain": "Übersprungen (außerhalb der Domain)",
"newKnowledge.sourceActions": "Aktionen für {{name}}",
@ -437,6 +441,7 @@
"newKnowledge.updatedColumn": "Aktualisiert",
"newKnowledge.uploadCharactersUnavailable": "Zeichen: —",
"newKnowledge.uploadDocuments": "Dokumente hochladen",
"newKnowledge.uploadDropZoneTitle": "Dateien hierher ziehen oder zum Durchsuchen klicken",
"newKnowledge.uploadFiles": "Dateien hochladen",
"newKnowledge.uploadFilesDescription": "Fügen Sie Dateien von Ihrem Computer hinzu — sie werden beim Erstellen sofort indiziert.",
"newKnowledge.uploadingFiles": "Wird hochgeladen…",

View File

@ -132,6 +132,7 @@
"mixtureInternalAndExternalTip": "The Rerank model is required for mixture of internal and external knowledge.",
"multimodal": "Multimodal",
"newKnowledge.actionsColumn": "Actions",
"newKnowledge.addAndProcess": "Add & process",
"newKnowledge.addDocument": "Add document",
"newKnowledge.addSource": "Add source",
"newKnowledge.addSourceDescription": "Connect a source to this knowledge base — it syncs automatically and stays fresh.",
@ -250,6 +251,7 @@
"newKnowledge.documentUploadExclusion.quota": "workspace quota exceeded",
"newKnowledge.documentUploadExclusion.target": "document target is no longer valid",
"newKnowledge.documentUploadFailed": "We couldn't upload these documents. Try again.",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, XLSX, TXT — up to 15 MB each",
"newKnowledge.documentUploadPartial": "{{accepted}} documents started; {{excluded}} could not be added: {{details}}",
"newKnowledge.documentUploadRejected": "No documents were accepted: {{details}}",
"newKnowledge.documentUploadStarted": "Document processing started.",
@ -268,6 +270,7 @@
"newKnowledge.documentsSelected": "{{count}} documents selected",
"newKnowledge.documentsUnavailable": "— documents",
"newKnowledge.downloadDocuments": "Download",
"newKnowledge.dropFilesHere": "Drop files here",
"newKnowledge.editSource": "Edit",
"newKnowledge.emptyChunk": "Empty chunk",
"newKnowledge.emptyDescription": "Add your documents and agents can read them directly — no indexing to configure.",
@ -299,7 +302,7 @@
"newKnowledge.loadingSyncPolicy": "Loading sync policy",
"newKnowledge.manualUpload": "Manual upload",
"newKnowledge.maxPages": "Maximum pages",
"newKnowledge.metadata": "Metadata",
"newKnowledge.metadata": "Meta Data",
"newKnowledge.mimeType": "File type",
"newKnowledge.moreProviders": "More providers",
"newKnowledge.name": "Knowledge name",
@ -379,6 +382,7 @@
"newKnowledge.selectAllSources": "Select all sources",
"newKnowledge.selectChunk": "Select a chunk to inspect its content.",
"newKnowledge.selectFilesAndFolders": "Select files & folders to sync",
"newKnowledge.selectedFiles": "Selected files ({{valid}} of {{total}} valid)",
"newKnowledge.skippedFailed": "Skipped (failed)",
"newKnowledge.skippedOffDomain": "Skipped (off-domain)",
"newKnowledge.sourceActions": "Actions for {{name}}",
@ -437,6 +441,7 @@
"newKnowledge.updatedColumn": "Updated",
"newKnowledge.uploadCharactersUnavailable": "Characters: —",
"newKnowledge.uploadDocuments": "Upload documents",
"newKnowledge.uploadDropZoneTitle": "Drag & drop files here, or click to browse",
"newKnowledge.uploadFiles": "Upload files",
"newKnowledge.uploadFilesDescription": "Add files from your computer — they're indexed as soon as you create.",
"newKnowledge.uploadingFiles": "Uploading…",

View File

@ -132,6 +132,7 @@
"mixtureInternalAndExternalTip": "El modelo de Rerank es necesario para la mezcla de conocimiento interno y externo.",
"multimodal": "Multimodal",
"newKnowledge.actionsColumn": "Acciones",
"newKnowledge.addAndProcess": "Agregar y procesar",
"newKnowledge.addDocument": "Agregar documento",
"newKnowledge.addSource": "Agregar fuente",
"newKnowledge.addSourceDescription": "Conecte una fuente a esta base de conocimientos: se sincroniza automáticamente y se mantiene actualizada.",
@ -250,6 +251,7 @@
"newKnowledge.documentUploadExclusion.quota": "se superó la cuota del espacio de trabajo",
"newKnowledge.documentUploadExclusion.target": "el destino del documento ya no es válido",
"newKnowledge.documentUploadFailed": "No pudimos cargar estos documentos. Intentar otra vez.",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, XLSX, TXT — hasta 15 MB cada uno",
"newKnowledge.documentUploadPartial": "Se inició el procesamiento de {{accepted}} documentos; no se pudieron añadir {{excluded}}: {{details}}",
"newKnowledge.documentUploadRejected": "No se aceptó ningún documento: {{details}}",
"newKnowledge.documentUploadStarted": "Se inició el procesamiento de documentos.",
@ -268,6 +270,7 @@
"newKnowledge.documentsSelected": "Documentos {{count}} seleccionados",
"newKnowledge.documentsUnavailable": "— documentos",
"newKnowledge.downloadDocuments": "Descargar",
"newKnowledge.dropFilesHere": "Suelta los archivos aquí",
"newKnowledge.editSource": "Editar",
"newKnowledge.emptyChunk": "Fragmento vacío",
"newKnowledge.emptyDescription": "Añade tus documentos y los agentes podrán leerlos directamente, sin configurar la indexación.",
@ -379,6 +382,7 @@
"newKnowledge.selectAllSources": "Seleccionar todos los orígenes",
"newKnowledge.selectChunk": "Selecciona un fragmento para revisar su contenido.",
"newKnowledge.selectFilesAndFolders": "Selecciona archivos y carpetas para sincronizar",
"newKnowledge.selectedFiles": "Archivos seleccionados ({{valid}} de {{total}} válidos)",
"newKnowledge.skippedFailed": "Omitido (fallido)",
"newKnowledge.skippedOffDomain": "Omitido (fuera del dominio)",
"newKnowledge.sourceActions": "Acciones para {{name}}",
@ -437,6 +441,7 @@
"newKnowledge.updatedColumn": "Actualizado",
"newKnowledge.uploadCharactersUnavailable": "Caracteres: —",
"newKnowledge.uploadDocuments": "Subir documentos",
"newKnowledge.uploadDropZoneTitle": "Arrastra y suelta archivos aquí, o haz clic para explorar",
"newKnowledge.uploadFiles": "Subir archivos",
"newKnowledge.uploadFilesDescription": "Añade archivos desde tu ordenador; se indexarán en cuanto los crees.",
"newKnowledge.uploadingFiles": "Subiendo…",

View File

@ -132,6 +132,7 @@
"mixtureInternalAndExternalTip": "مدل Rerank برای آمیختگی دانش درونی و بیرونی مورد نیاز است.",
"multimodal": "چندوجهی",
"newKnowledge.actionsColumn": "اقدامات",
"newKnowledge.addAndProcess": "افزودن و پردازش",
"newKnowledge.addDocument": "سند اضافه کنید",
"newKnowledge.addSource": "اضافه کردن منبع",
"newKnowledge.addSourceDescription": "منبعی را به این پایگاه دانش متصل کنید - به طور خودکار همگام‌سازی می‌شود و تازه می‌ماند.",
@ -250,6 +251,7 @@
"newKnowledge.documentUploadExclusion.quota": "سهمیه فضای کاری رد شده است",
"newKnowledge.documentUploadExclusion.target": "هدف سند دیگر معتبر نیست",
"newKnowledge.documentUploadFailed": "ما نتوانستیم این اسناد را آپلود کنیم. دوباره امتحان کنید.",
"newKnowledge.documentUploadFormats": "PDF، DOCX، Markdown، HTML، XLSX، TXT — حداکثر ۱۵ مگابایت برای هر فایل",
"newKnowledge.documentUploadPartial": "پردازش {{accepted}} سند آغاز شد؛ {{excluded}} سند افزوده نشد: {{details}}",
"newKnowledge.documentUploadRejected": "هیچ سندی پذیرفته نشد: {{details}}",
"newKnowledge.documentUploadStarted": "پردازش اسناد آغاز شد.",
@ -268,6 +270,7 @@
"newKnowledge.documentsSelected": "اسناد {{count}} انتخاب شد",
"newKnowledge.documentsUnavailable": "— سند",
"newKnowledge.downloadDocuments": "دانلود کنید",
"newKnowledge.dropFilesHere": "فایل‌ها را اینجا رها کنید",
"newKnowledge.editSource": "ویرایش",
"newKnowledge.emptyChunk": "قطعه خالی",
"newKnowledge.emptyDescription": "اسناد خود را اضافه کنید تا عامل‌ها بتوانند مستقیماً آن‌ها را بخوانند — بدون نیاز به تنظیم نمایه‌سازی.",
@ -379,6 +382,7 @@
"newKnowledge.selectAllSources": "انتخاب همه منابع",
"newKnowledge.selectChunk": "یک قطعه را برای بررسی محتوای آن انتخاب کنید.",
"newKnowledge.selectFilesAndFolders": "فایل‌ها و پوشه‌ها را برای همگام‌سازی انتخاب کنید",
"newKnowledge.selectedFiles": "فایل‌های انتخاب‌شده ({{valid}} از {{total}} معتبر)",
"newKnowledge.skippedFailed": "رد شد (ناموفق)",
"newKnowledge.skippedOffDomain": "رد شد (خارج از دامنه)",
"newKnowledge.sourceActions": "اقدامات برای {{name}}",
@ -437,6 +441,7 @@
"newKnowledge.updatedColumn": "به روز شد",
"newKnowledge.uploadCharactersUnavailable": "نویسه‌ها: —",
"newKnowledge.uploadDocuments": "اسناد را بارگذاری کنید",
"newKnowledge.uploadDropZoneTitle": "فایل‌ها را اینجا بکشید و رها کنید یا برای انتخاب کلیک کنید",
"newKnowledge.uploadFiles": "بارگذاری فایل‌ها",
"newKnowledge.uploadFilesDescription": "فایل‌ها را از رایانه اضافه کنید — به‌محض ایجاد نمایه‌سازی می‌شوند.",
"newKnowledge.uploadingFiles": "در حال بارگذاری…",

View File

@ -132,6 +132,7 @@
"mixtureInternalAndExternalTip": "Le modèle Rerank est nécessaire pour mélanger les connaissances internes et externes.",
"multimodal": "Multimodal",
"newKnowledge.actionsColumn": "Actions",
"newKnowledge.addAndProcess": "Ajouter et traiter",
"newKnowledge.addDocument": "Ajouter un document",
"newKnowledge.addSource": "Ajouter une source",
"newKnowledge.addSourceDescription": "Connectez une source à cette base de connaissances : elle se synchronise automatiquement et reste à jour.",
@ -250,6 +251,7 @@
"newKnowledge.documentUploadExclusion.quota": "quota de lespace de travail dépassé",
"newKnowledge.documentUploadExclusion.target": "la cible du document nest plus valide",
"newKnowledge.documentUploadFailed": "Nous n'avons pas pu télécharger ces documents. Essayer à nouveau.",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, XLSX, TXT — jusquà 15 Mo chacun",
"newKnowledge.documentUploadPartial": "Le traitement de {{accepted}} documents a démarré ; {{excluded}} nont pas pu être ajoutés : {{details}}",
"newKnowledge.documentUploadRejected": "Aucun document na été accepté : {{details}}",
"newKnowledge.documentUploadStarted": "Le traitement du document a commencé.",
@ -268,6 +270,7 @@
"newKnowledge.documentsSelected": "Documents {{count}} sélectionnés",
"newKnowledge.documentsUnavailable": "— documents",
"newKnowledge.downloadDocuments": "Télécharger",
"newKnowledge.dropFilesHere": "Déposez les fichiers ici",
"newKnowledge.editSource": "Modifier",
"newKnowledge.emptyChunk": "Segment vide",
"newKnowledge.emptyDescription": "Ajoutez vos documents et les agents pourront les lire directement, sans indexation à configurer.",
@ -379,6 +382,7 @@
"newKnowledge.selectAllSources": "Sélectionner toutes les sources",
"newKnowledge.selectChunk": "Sélectionnez un segment pour examiner son contenu.",
"newKnowledge.selectFilesAndFolders": "Sélectionnez les fichiers et dossiers à synchroniser",
"newKnowledge.selectedFiles": "Fichiers sélectionnés ({{valid}} sur {{total}} valides)",
"newKnowledge.skippedFailed": "Ignoré (échec)",
"newKnowledge.skippedOffDomain": "Ignoré (hors domaine)",
"newKnowledge.sourceActions": "Actions pour {{name}}",
@ -437,6 +441,7 @@
"newKnowledge.updatedColumn": "Mis à jour",
"newKnowledge.uploadCharactersUnavailable": "Caractères : —",
"newKnowledge.uploadDocuments": "Télécharger des documents",
"newKnowledge.uploadDropZoneTitle": "Glissez-déposez les fichiers ici ou cliquez pour parcourir",
"newKnowledge.uploadFiles": "Importer des fichiers",
"newKnowledge.uploadFilesDescription": "Ajoutez des fichiers depuis votre ordinateur : ils sont indexés dès leur création.",
"newKnowledge.uploadingFiles": "Téléversement…",

View File

@ -132,6 +132,7 @@
"mixtureInternalAndExternalTip": "आंतरिक और बाहरी ज्ञान के मिश्रण के लिए रीरैंक मॉडल की आवश्यकता होती है।",
"multimodal": "बहु-मोडल",
"newKnowledge.actionsColumn": "क्रियाएँ",
"newKnowledge.addAndProcess": "जोड़ें और प्रोसेस करें",
"newKnowledge.addDocument": "दस्तावेज़ जोड़ें",
"newKnowledge.addSource": "स्रोत जोड़ें",
"newKnowledge.addSourceDescription": "इस ज्ञानकोष से एक स्रोत कनेक्ट करें - यह स्वचालित रूप से समन्वयित होता है और ताज़ा रहता है।",
@ -250,6 +251,7 @@
"newKnowledge.documentUploadExclusion.quota": "कार्यस्थान कोटा पार हो गया",
"newKnowledge.documentUploadExclusion.target": "दस्तावेज़ लक्ष्य अब मान्य नहीं है",
"newKnowledge.documentUploadFailed": "हम ये दस्तावेज़ अपलोड नहीं कर सके. पुनः प्रयास करें।",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, XLSX, TXT — प्रत्येक अधिकतम 15 MB",
"newKnowledge.documentUploadPartial": "{{accepted}} दस्तावेज़ों की प्रोसेसिंग शुरू हुई; {{excluded}} जोड़े नहीं जा सके: {{details}}",
"newKnowledge.documentUploadRejected": "कोई दस्तावेज़ स्वीकार नहीं किया गया: {{details}}",
"newKnowledge.documentUploadStarted": "दस्तावेज़ प्रसंस्करण शुरू हुआ.",
@ -268,6 +270,7 @@
"newKnowledge.documentsSelected": "{{count}} दस्तावेज़ चयनित",
"newKnowledge.documentsUnavailable": "— दस्तावेज़",
"newKnowledge.downloadDocuments": "डाउनलोड करें",
"newKnowledge.dropFilesHere": "फ़ाइलें यहाँ छोड़ें",
"newKnowledge.editSource": "संपादित करें",
"newKnowledge.emptyChunk": "खाली खंड",
"newKnowledge.emptyDescription": "अपने दस्तावेज़ जोड़ें ताकि एजेंट उन्हें सीधे पढ़ सकें — इंडेक्सिंग कॉन्फ़िगर करने की ज़रूरत नहीं।",
@ -379,6 +382,7 @@
"newKnowledge.selectAllSources": "सभी स्रोत चुनें",
"newKnowledge.selectChunk": "सामग्री देखने के लिए कोई खंड चुनें।",
"newKnowledge.selectFilesAndFolders": "सिंक करने के लिए फ़ाइलें और फ़ोल्डर चुनें",
"newKnowledge.selectedFiles": "चुनी गई फ़ाइलें ({{total}} में से {{valid}} मान्य)",
"newKnowledge.skippedFailed": "छोड़ा गया (विफल)",
"newKnowledge.skippedOffDomain": "छोड़ा गया (डोमेन से बाहर)",
"newKnowledge.sourceActions": "{{name}} के लिए कार्रवाइयां",
@ -437,6 +441,7 @@
"newKnowledge.updatedColumn": "अद्यतन किया गया",
"newKnowledge.uploadCharactersUnavailable": "वर्ण: —",
"newKnowledge.uploadDocuments": "दस्तावेज़ अपलोड करें",
"newKnowledge.uploadDropZoneTitle": "फ़ाइलें यहाँ खींचकर छोड़ें, या ब्राउज़ करने के लिए क्लिक करें",
"newKnowledge.uploadFiles": "फ़ाइलें अपलोड करें",
"newKnowledge.uploadFilesDescription": "अपने कंप्यूटर से फ़ाइलें जोड़ें — बनाते ही वे इंडेक्स हो जाएँगी।",
"newKnowledge.uploadingFiles": "अपलोड हो रहा है…",

View File

@ -132,6 +132,7 @@
"mixtureInternalAndExternalTip": "Model Rerank diperlukan untuk campuran pengetahuan internal dan eksternal.",
"multimodal": "Multimodal",
"newKnowledge.actionsColumn": "Tindakan",
"newKnowledge.addAndProcess": "Tambahkan & proses",
"newKnowledge.addDocument": "Tambahkan dokumen",
"newKnowledge.addSource": "Tambahkan sumber",
"newKnowledge.addSourceDescription": "Hubungkan sumber ke basis pengetahuan ini — sumber tersebut akan disinkronkan secara otomatis dan tetap segar.",
@ -250,6 +251,7 @@
"newKnowledge.documentUploadExclusion.quota": "kuota ruang kerja terlampaui",
"newKnowledge.documentUploadExclusion.target": "target dokumen tidak lagi valid",
"newKnowledge.documentUploadFailed": "Kami tidak dapat mengunggah dokumen-dokumen ini. Coba lagi.",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, XLSX, TXT — maksimal 15 MB per file",
"newKnowledge.documentUploadPartial": "Pemrosesan {{accepted}} dokumen dimulai; {{excluded}} tidak dapat ditambahkan: {{details}}",
"newKnowledge.documentUploadRejected": "Tidak ada dokumen yang diterima: {{details}}",
"newKnowledge.documentUploadStarted": "Pemrosesan dokumen dimulai.",
@ -268,6 +270,7 @@
"newKnowledge.documentsSelected": "Dokumen {{count}} dipilih",
"newKnowledge.documentsUnavailable": "— dokumen",
"newKnowledge.downloadDocuments": "Unduh",
"newKnowledge.dropFilesHere": "Letakkan file di sini",
"newKnowledge.editSource": "Sunting",
"newKnowledge.emptyChunk": "Potongan kosong",
"newKnowledge.emptyDescription": "Tambahkan dokumen agar agen dapat membacanya langsung — tanpa perlu mengatur pengindeksan.",
@ -379,6 +382,7 @@
"newKnowledge.selectAllSources": "Pilih semua sumber",
"newKnowledge.selectChunk": "Pilih potongan untuk memeriksa isinya.",
"newKnowledge.selectFilesAndFolders": "Pilih file dan folder untuk disinkronkan",
"newKnowledge.selectedFiles": "File terpilih ({{valid}} dari {{total}} valid)",
"newKnowledge.skippedFailed": "Dilewati (gagal)",
"newKnowledge.skippedOffDomain": "Dilewati (di luar domain)",
"newKnowledge.sourceActions": "Tindakan untuk {{name}}",
@ -437,6 +441,7 @@
"newKnowledge.updatedColumn": "Diperbarui",
"newKnowledge.uploadCharactersUnavailable": "Karakter: —",
"newKnowledge.uploadDocuments": "Unggah dokumen",
"newKnowledge.uploadDropZoneTitle": "Seret & letakkan file di sini, atau klik untuk memilih",
"newKnowledge.uploadFiles": "Unggah file",
"newKnowledge.uploadFilesDescription": "Tambahkan file dari komputer — file akan diindeks segera setelah dibuat.",
"newKnowledge.uploadingFiles": "Mengunggah…",

View File

@ -132,6 +132,7 @@
"mixtureInternalAndExternalTip": "Il modello Rerank è necessario per la combinazione di conoscenze interne ed esterne.",
"multimodal": "Multimodale",
"newKnowledge.actionsColumn": "Azioni",
"newKnowledge.addAndProcess": "Aggiungi ed elabora",
"newKnowledge.addDocument": "Aggiungi documento",
"newKnowledge.addSource": "Aggiungi fonte",
"newKnowledge.addSourceDescription": "Collega una fonte a questa knowledge base: si sincronizza automaticamente e rimane aggiornata.",
@ -250,6 +251,7 @@
"newKnowledge.documentUploadExclusion.quota": "quota dell'area di lavoro superata",
"newKnowledge.documentUploadExclusion.target": "la destinazione del documento non è più valida",
"newKnowledge.documentUploadFailed": "Non è stato possibile caricare questi documenti. Riprova.",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, XLSX, TXT — fino a 15 MB ciascuno",
"newKnowledge.documentUploadPartial": "Elaborazione avviata per {{accepted}} documenti; impossibile aggiungerne {{excluded}}: {{details}}",
"newKnowledge.documentUploadRejected": "Nessun documento è stato accettato: {{details}}",
"newKnowledge.documentUploadStarted": "È iniziata l'elaborazione del documento.",
@ -268,6 +270,7 @@
"newKnowledge.documentsSelected": "Documenti {{count}} selezionati",
"newKnowledge.documentsUnavailable": "— documenti",
"newKnowledge.downloadDocuments": "Scarica",
"newKnowledge.dropFilesHere": "Trascina qui i file",
"newKnowledge.editSource": "Modifica",
"newKnowledge.emptyChunk": "Segmento vuoto",
"newKnowledge.emptyDescription": "Aggiungi i tuoi documenti e gli agenti potranno leggerli direttamente, senza configurare lindicizzazione.",
@ -379,6 +382,7 @@
"newKnowledge.selectAllSources": "Seleziona tutte le origini",
"newKnowledge.selectChunk": "Seleziona un segmento per esaminarne il contenuto.",
"newKnowledge.selectFilesAndFolders": "Seleziona file e cartelle da sincronizzare",
"newKnowledge.selectedFiles": "File selezionati ({{valid}} di {{total}} validi)",
"newKnowledge.skippedFailed": "Ignorato (errore)",
"newKnowledge.skippedOffDomain": "Ignorato (fuori dominio)",
"newKnowledge.sourceActions": "Azioni per {{name}}",
@ -437,6 +441,7 @@
"newKnowledge.updatedColumn": "Aggiornato",
"newKnowledge.uploadCharactersUnavailable": "Caratteri: —",
"newKnowledge.uploadDocuments": "Carica documenti",
"newKnowledge.uploadDropZoneTitle": "Trascina qui i file oppure fai clic per sfogliare",
"newKnowledge.uploadFiles": "Carica file",
"newKnowledge.uploadFilesDescription": "Aggiungi file dal computer: vengono indicizzati appena li crei.",
"newKnowledge.uploadingFiles": "Caricamento…",

View File

@ -132,6 +132,7 @@
"mixtureInternalAndExternalTip": "内部と外部のナレッジベースを混在させる場合、Rerank モデルが必要です。",
"multimodal": "マルチモーダル",
"newKnowledge.actionsColumn": "アクション",
"newKnowledge.addAndProcess": "追加して処理",
"newKnowledge.addDocument": "ドキュメントの追加",
"newKnowledge.addSource": "ソースを追加",
"newKnowledge.addSourceDescription": "ソースをこのナレッジ ベースに接続すると、自動的に同期され、最新の状態が保たれます。",
@ -250,6 +251,7 @@
"newKnowledge.documentUploadExclusion.quota": "ワークスペースのクォータを超えています",
"newKnowledge.documentUploadExclusion.target": "ドキュメントの対象が無効になっています",
"newKnowledge.documentUploadFailed": "これらの書類をアップロードできませんでした。もう一度やり直してください。",
"newKnowledge.documentUploadFormats": "PDF、DOCX、Markdown、HTML、XLSX、TXT — 1ファイル最大15 MB",
"newKnowledge.documentUploadPartial": "{{accepted}} 件のドキュメントの処理を開始しました。{{excluded}} 件は追加できませんでした:{{details}}",
"newKnowledge.documentUploadRejected": "ドキュメントを受け付けられませんでした:{{details}}",
"newKnowledge.documentUploadStarted": "文書処理が開始されました。",
@ -268,6 +270,7 @@
"newKnowledge.documentsSelected": "{{count}} ドキュメントが選択されました",
"newKnowledge.documentsUnavailable": "— 件のドキュメント",
"newKnowledge.downloadDocuments": "ダウンロード",
"newKnowledge.dropFilesHere": "ここにファイルをドロップ",
"newKnowledge.editSource": "編集",
"newKnowledge.emptyChunk": "空のチャンク",
"newKnowledge.emptyDescription": "ドキュメントを追加すると、エージェントが直接読み取れます。インデックス設定は不要です。",
@ -379,6 +382,7 @@
"newKnowledge.selectAllSources": "すべてのソースを選択",
"newKnowledge.selectChunk": "内容を確認するチャンクを選択してください。",
"newKnowledge.selectFilesAndFolders": "同期するファイルとフォルダーを選択",
"newKnowledge.selectedFiles": "選択したファイル({{total}}件中{{valid}}件が有効)",
"newKnowledge.skippedFailed": "スキップ(失敗)",
"newKnowledge.skippedOffDomain": "スキップ(ドメイン外)",
"newKnowledge.sourceActions": "{{name}} のアクション",
@ -437,6 +441,7 @@
"newKnowledge.updatedColumn": "更新されました",
"newKnowledge.uploadCharactersUnavailable": "文字数:—",
"newKnowledge.uploadDocuments": "書類のアップロード",
"newKnowledge.uploadDropZoneTitle": "ここにファイルをドラッグ&ドロップするか、クリックして選択",
"newKnowledge.uploadFiles": "ファイルをアップロード",
"newKnowledge.uploadFilesDescription": "コンピューターからファイルを追加すると、作成時にすぐインデックス化されます。",
"newKnowledge.uploadingFiles": "アップロード中…",

View File

@ -132,6 +132,7 @@
"mixtureInternalAndExternalTip": "리랭크 모델은 내부 및 외부 지식의 혼합에 필요합니다.",
"multimodal": "멀티모달",
"newKnowledge.actionsColumn": "작업",
"newKnowledge.addAndProcess": "추가 및 처리",
"newKnowledge.addDocument": "문서 추가",
"newKnowledge.addSource": "소스 추가",
"newKnowledge.addSourceDescription": "이 지식 베이스에 소스를 연결하세요. 자동으로 동기화되고 최신 상태로 유지됩니다.",
@ -250,6 +251,7 @@
"newKnowledge.documentUploadExclusion.quota": "워크스페이스 할당량을 초과했습니다",
"newKnowledge.documentUploadExclusion.target": "문서 대상이 더 이상 유효하지 않습니다",
"newKnowledge.documentUploadFailed": "이 문서를 업로드할 수 없습니다. 다시 시도해 보세요.",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, XLSX, TXT — 파일당 최대 15 MB",
"newKnowledge.documentUploadPartial": "문서 {{accepted}}개의 처리를 시작했습니다. {{excluded}}개는 추가하지 못했습니다: {{details}}",
"newKnowledge.documentUploadRejected": "수락된 문서가 없습니다: {{details}}",
"newKnowledge.documentUploadStarted": "문서 처리가 시작되었습니다.",
@ -268,6 +270,7 @@
"newKnowledge.documentsSelected": "{{count}} 문서가 선택됨",
"newKnowledge.documentsUnavailable": "문서 —개",
"newKnowledge.downloadDocuments": "다운로드",
"newKnowledge.dropFilesHere": "여기에 파일을 놓으세요",
"newKnowledge.editSource": "편집",
"newKnowledge.emptyChunk": "빈 청크",
"newKnowledge.emptyDescription": "문서를 추가하면 에이전트가 직접 읽을 수 있습니다. 인덱싱 설정은 필요하지 않습니다.",
@ -379,6 +382,7 @@
"newKnowledge.selectAllSources": "모든 소스 선택",
"newKnowledge.selectChunk": "내용을 확인할 청크를 선택하세요.",
"newKnowledge.selectFilesAndFolders": "동기화할 파일과 폴더 선택",
"newKnowledge.selectedFiles": "선택한 파일 ({{total}}개 중 {{valid}}개 유효)",
"newKnowledge.skippedFailed": "건너뜀(실패)",
"newKnowledge.skippedOffDomain": "건너뜀(도메인 외부)",
"newKnowledge.sourceActions": "{{name}}에 대한 작업",
@ -437,6 +441,7 @@
"newKnowledge.updatedColumn": "업데이트됨",
"newKnowledge.uploadCharactersUnavailable": "문자 수: —",
"newKnowledge.uploadDocuments": "문서 업로드",
"newKnowledge.uploadDropZoneTitle": "파일을 여기로 끌어다 놓거나 클릭하여 찾아보기",
"newKnowledge.uploadFiles": "파일 업로드",
"newKnowledge.uploadFilesDescription": "컴퓨터에서 파일을 추가하면 생성 즉시 인덱싱됩니다.",
"newKnowledge.uploadingFiles": "업로드 중…",

View File

@ -132,6 +132,7 @@
"mixtureInternalAndExternalTip": "The Rerank model is required for mixture of internal and external knowledge.",
"multimodal": "Multimodal",
"newKnowledge.actionsColumn": "Acties",
"newKnowledge.addAndProcess": "Toevoegen en verwerken",
"newKnowledge.addDocument": "Document toevoegen",
"newKnowledge.addSource": "Bron toevoegen",
"newKnowledge.addSourceDescription": "Verbind een bron met deze kennisbank: deze synchroniseert automatisch en blijft actueel.",
@ -250,6 +251,7 @@
"newKnowledge.documentUploadExclusion.quota": "werkruimtequotum overschreden",
"newKnowledge.documentUploadExclusion.target": "documentdoel is niet meer geldig",
"newKnowledge.documentUploadFailed": "We konden deze documenten niet uploaden. Probeer het opnieuw.",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, XLSX, TXT — maximaal 15 MB per bestand",
"newKnowledge.documentUploadPartial": "Verwerking van {{accepted}} documenten gestart; {{excluded}} konden niet worden toegevoegd: {{details}}",
"newKnowledge.documentUploadRejected": "Er zijn geen documenten geaccepteerd: {{details}}",
"newKnowledge.documentUploadStarted": "Documentverwerking gestart.",
@ -268,6 +270,7 @@
"newKnowledge.documentsSelected": "{{count}}-documenten geselecteerd",
"newKnowledge.documentsUnavailable": "— documenten",
"newKnowledge.downloadDocuments": "Downloaden",
"newKnowledge.dropFilesHere": "Zet bestanden hier neer",
"newKnowledge.editSource": "Bewerken",
"newKnowledge.emptyChunk": "Leeg fragment",
"newKnowledge.emptyDescription": "Voeg je documenten toe zodat agents ze direct kunnen lezen, zonder indexering te configureren.",
@ -379,6 +382,7 @@
"newKnowledge.selectAllSources": "Alle bronnen selecteren",
"newKnowledge.selectChunk": "Selecteer een fragment om de inhoud te bekijken.",
"newKnowledge.selectFilesAndFolders": "Selecteer bestanden en mappen om te synchroniseren",
"newKnowledge.selectedFiles": "Geselecteerde bestanden ({{valid}} van {{total}} geldig)",
"newKnowledge.skippedFailed": "Overgeslagen (mislukt)",
"newKnowledge.skippedOffDomain": "Overgeslagen (buiten domein)",
"newKnowledge.sourceActions": "Acties voor {{name}}",
@ -437,6 +441,7 @@
"newKnowledge.updatedColumn": "Bijgewerkt",
"newKnowledge.uploadCharactersUnavailable": "Tekens: —",
"newKnowledge.uploadDocuments": "Documenten uploaden",
"newKnowledge.uploadDropZoneTitle": "Sleep bestanden hierheen of klik om te bladeren",
"newKnowledge.uploadFiles": "Bestanden uploaden",
"newKnowledge.uploadFilesDescription": "Voeg bestanden van je computer toe; ze worden geïndexeerd zodra je ze aanmaakt.",
"newKnowledge.uploadingFiles": "Uploaden…",

View File

@ -132,6 +132,7 @@
"mixtureInternalAndExternalTip": "Model Rerank jest wymagany do połączenia wiedzy wewnętrznej i zewnętrznej.",
"multimodal": "Multimodalny",
"newKnowledge.actionsColumn": "Działania",
"newKnowledge.addAndProcess": "Dodaj i przetwórz",
"newKnowledge.addDocument": "Dodaj dokument",
"newKnowledge.addSource": "Dodaj źródło",
"newKnowledge.addSourceDescription": "Podłącz źródło do tej bazy wiedzy — synchronizuje się ona automatycznie i pozostaje aktualna.",
@ -250,6 +251,7 @@
"newKnowledge.documentUploadExclusion.quota": "przekroczono limit obszaru roboczego",
"newKnowledge.documentUploadExclusion.target": "miejsce docelowe dokumentu jest już nieprawidłowe",
"newKnowledge.documentUploadFailed": "Nie mogliśmy przesłać tych dokumentów. Spróbuj ponownie.",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, XLSX, TXT — do 15 MB każdy",
"newKnowledge.documentUploadPartial": "Rozpoczęto przetwarzanie {{accepted}} dokumentów; nie udało się dodać {{excluded}}: {{details}}",
"newKnowledge.documentUploadRejected": "Nie zaakceptowano żadnych dokumentów: {{details}}",
"newKnowledge.documentUploadStarted": "Rozpoczęto przetwarzanie dokumentu.",
@ -268,6 +270,7 @@
"newKnowledge.documentsSelected": "Wybrano dokumenty {{count}}",
"newKnowledge.documentsUnavailable": "— dokumentów",
"newKnowledge.downloadDocuments": "Pobierz",
"newKnowledge.dropFilesHere": "Upuść pliki tutaj",
"newKnowledge.editSource": "Edytuj",
"newKnowledge.emptyChunk": "Pusty fragment",
"newKnowledge.emptyDescription": "Dodaj dokumenty, aby agenci mogli je czytać bezpośrednio — bez konfigurowania indeksowania.",
@ -379,6 +382,7 @@
"newKnowledge.selectAllSources": "Wybierz wszystkie źródła",
"newKnowledge.selectChunk": "Wybierz fragment, aby sprawdzić jego zawartość.",
"newKnowledge.selectFilesAndFolders": "Wybierz pliki i foldery do synchronizacji",
"newKnowledge.selectedFiles": "Wybrane pliki ({{valid}} z {{total}} prawidłowych)",
"newKnowledge.skippedFailed": "Pominięto (błąd)",
"newKnowledge.skippedOffDomain": "Pominięto (poza domeną)",
"newKnowledge.sourceActions": "Działania dla {{name}}",
@ -437,6 +441,7 @@
"newKnowledge.updatedColumn": "Zaktualizowano",
"newKnowledge.uploadCharactersUnavailable": "Znaki: —",
"newKnowledge.uploadDocuments": "Prześlij dokumenty",
"newKnowledge.uploadDropZoneTitle": "Przeciągnij i upuść pliki tutaj lub kliknij, aby przeglądać",
"newKnowledge.uploadFiles": "Prześlij pliki",
"newKnowledge.uploadFilesDescription": "Dodaj pliki z komputera — zostaną zindeksowane od razu po utworzeniu.",
"newKnowledge.uploadingFiles": "Przesyłanie…",

View File

@ -132,6 +132,7 @@
"mixtureInternalAndExternalTip": "O modelo de Reclassificação é necessário para a mistura de conhecimento interno e externo.",
"multimodal": "Multimodal",
"newKnowledge.actionsColumn": "Ações",
"newKnowledge.addAndProcess": "Adicionar e processar",
"newKnowledge.addDocument": "Adicionar documento",
"newKnowledge.addSource": "Adicionar fonte",
"newKnowledge.addSourceDescription": "Conecte uma fonte a esta base de conhecimento — ela sincroniza automaticamente e permanece atualizada.",
@ -250,6 +251,7 @@
"newKnowledge.documentUploadExclusion.quota": "cota do espaço de trabalho excedida",
"newKnowledge.documentUploadExclusion.target": "o destino do documento não é mais válido",
"newKnowledge.documentUploadFailed": "Não foi possível fazer upload desses documentos. Tente novamente.",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, XLSX, TXT — até 15 MB cada",
"newKnowledge.documentUploadPartial": "O processamento de {{accepted}} documentos foi iniciado; não foi possível adicionar {{excluded}}: {{details}}",
"newKnowledge.documentUploadRejected": "Nenhum documento foi aceito: {{details}}",
"newKnowledge.documentUploadStarted": "O processamento do documento foi iniciado.",
@ -268,6 +270,7 @@
"newKnowledge.documentsSelected": "Documentos {{count}} selecionados",
"newKnowledge.documentsUnavailable": "— documentos",
"newKnowledge.downloadDocuments": "Baixar",
"newKnowledge.dropFilesHere": "Solte os arquivos aqui",
"newKnowledge.editSource": "Editar",
"newKnowledge.emptyChunk": "Trecho vazio",
"newKnowledge.emptyDescription": "Adicione seus documentos para que os agentes possam lê-los diretamente, sem configurar a indexação.",
@ -379,6 +382,7 @@
"newKnowledge.selectAllSources": "Selecionar todas as origens",
"newKnowledge.selectChunk": "Selecione um trecho para inspecionar seu conteúdo.",
"newKnowledge.selectFilesAndFolders": "Selecione arquivos e pastas para sincronizar",
"newKnowledge.selectedFiles": "Arquivos selecionados ({{valid}} de {{total}} válidos)",
"newKnowledge.skippedFailed": "Ignorado (falha)",
"newKnowledge.skippedOffDomain": "Ignorado (fora do domínio)",
"newKnowledge.sourceActions": "Ações para {{name}}",
@ -437,6 +441,7 @@
"newKnowledge.updatedColumn": "Atualizado",
"newKnowledge.uploadCharactersUnavailable": "Caracteres: —",
"newKnowledge.uploadDocuments": "Carregar documentos",
"newKnowledge.uploadDropZoneTitle": "Arraste e solte arquivos aqui ou clique para procurar",
"newKnowledge.uploadFiles": "Enviar arquivos",
"newKnowledge.uploadFilesDescription": "Adicione arquivos do seu computador; eles são indexados assim que você os cria.",
"newKnowledge.uploadingFiles": "Enviando…",

View File

@ -132,6 +132,7 @@
"mixtureInternalAndExternalTip": "Modelul Rerank este necesar pentru amestecul de cunoștințe interne și externe.",
"multimodal": "Multimodal",
"newKnowledge.actionsColumn": "Acțiuni",
"newKnowledge.addAndProcess": "Adaugă și procesează",
"newKnowledge.addDocument": "Adăugați document",
"newKnowledge.addSource": "Adăugați sursa",
"newKnowledge.addSourceDescription": "Conectați o sursă la această bază de cunoștințe — se sincronizează automat și rămâne actuală.",
@ -250,6 +251,7 @@
"newKnowledge.documentUploadExclusion.quota": "cota spațiului de lucru a fost depășită",
"newKnowledge.documentUploadExclusion.target": "destinația documentului nu mai este validă",
"newKnowledge.documentUploadFailed": "Nu am putut încărca aceste documente. Încearcă din nou.",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, XLSX, TXT — până la 15 MB fiecare",
"newKnowledge.documentUploadPartial": "Procesarea a {{accepted}} documente a început; {{excluded}} nu au putut fi adăugate: {{details}}",
"newKnowledge.documentUploadRejected": "Nu a fost acceptat niciun document: {{details}}",
"newKnowledge.documentUploadStarted": "Procesarea documentelor a început.",
@ -268,6 +270,7 @@
"newKnowledge.documentsSelected": "{{count}} documente selectate",
"newKnowledge.documentsUnavailable": "— documente",
"newKnowledge.downloadDocuments": "Descărcați",
"newKnowledge.dropFilesHere": "Plasează fișierele aici",
"newKnowledge.editSource": "Edita",
"newKnowledge.emptyChunk": "Fragment gol",
"newKnowledge.emptyDescription": "Adaugă documentele, iar agenții le pot citi direct — fără indexare de configurat.",
@ -379,6 +382,7 @@
"newKnowledge.selectAllSources": "Selectează toate sursele",
"newKnowledge.selectChunk": "Selectează un fragment pentru a-i verifica conținutul.",
"newKnowledge.selectFilesAndFolders": "Selectează fișierele și folderele de sincronizat",
"newKnowledge.selectedFiles": "Fișiere selectate ({{valid}} din {{total}} valide)",
"newKnowledge.skippedFailed": "Omis (eșuat)",
"newKnowledge.skippedOffDomain": "Omis (în afara domeniului)",
"newKnowledge.sourceActions": "Acțiuni pentru {{name}}",
@ -437,6 +441,7 @@
"newKnowledge.updatedColumn": "Actualizat",
"newKnowledge.uploadCharactersUnavailable": "Caractere: —",
"newKnowledge.uploadDocuments": "Încărcați documente",
"newKnowledge.uploadDropZoneTitle": "Trage și plasează fișierele aici sau fă clic pentru a naviga",
"newKnowledge.uploadFiles": "Încarcă fișiere",
"newKnowledge.uploadFilesDescription": "Adaugă fișiere de pe computer — sunt indexate imediat ce le creezi.",
"newKnowledge.uploadingFiles": "Se încarcă…",

View File

@ -132,6 +132,7 @@
"mixtureInternalAndExternalTip": "Модель Rerank необходима для смешивания внутренних и внешних знаний.",
"multimodal": "Мультимодальный",
"newKnowledge.actionsColumn": "Действия",
"newKnowledge.addAndProcess": "Добавить и обработать",
"newKnowledge.addDocument": "Добавить документ",
"newKnowledge.addSource": "Добавить источник",
"newKnowledge.addSourceDescription": "Подключите источник к этой базе знаний — она синхронизируется автоматически и остается актуальной.",
@ -250,6 +251,7 @@
"newKnowledge.documentUploadExclusion.quota": "превышена квота рабочей области",
"newKnowledge.documentUploadExclusion.target": "назначение документа больше недействительно",
"newKnowledge.documentUploadFailed": "Нам не удалось загрузить эти документы. Попробуйте еще раз.",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, XLSX, TXT — до 15 МБ каждый",
"newKnowledge.documentUploadPartial": "Начата обработка {{accepted}} документов; не удалось добавить {{excluded}}: {{details}}",
"newKnowledge.documentUploadRejected": "Ни один документ не принят: {{details}}",
"newKnowledge.documentUploadStarted": "Началась обработка документов.",
@ -268,6 +270,7 @@
"newKnowledge.documentsSelected": "{{count}} выбраны документы",
"newKnowledge.documentsUnavailable": "— документов",
"newKnowledge.downloadDocuments": "Скачать",
"newKnowledge.dropFilesHere": "Перетащите файлы сюда",
"newKnowledge.editSource": "Править",
"newKnowledge.emptyChunk": "Пустой фрагмент",
"newKnowledge.emptyDescription": "Добавьте документы, и агенты смогут читать их напрямую — без настройки индексации.",
@ -379,6 +382,7 @@
"newKnowledge.selectAllSources": "Выбрать все источники",
"newKnowledge.selectChunk": "Выберите фрагмент, чтобы просмотреть его содержимое.",
"newKnowledge.selectFilesAndFolders": "Выберите файлы и папки для синхронизации",
"newKnowledge.selectedFiles": "Выбранные файлы ({{valid}} из {{total}} допустимы)",
"newKnowledge.skippedFailed": "Пропущено (ошибка)",
"newKnowledge.skippedOffDomain": "Пропущено (вне домена)",
"newKnowledge.sourceActions": "Действия для {{name}}",
@ -437,6 +441,7 @@
"newKnowledge.updatedColumn": "Обновлено",
"newKnowledge.uploadCharactersUnavailable": "Символы: —",
"newKnowledge.uploadDocuments": "Загрузить документы",
"newKnowledge.uploadDropZoneTitle": "Перетащите файлы сюда или нажмите для выбора",
"newKnowledge.uploadFiles": "Загрузить файлы",
"newKnowledge.uploadFilesDescription": "Добавьте файлы с компьютера — они будут проиндексированы сразу после создания.",
"newKnowledge.uploadingFiles": "Загрузка…",

View File

@ -132,6 +132,7 @@
"mixtureInternalAndExternalTip": "Model za ponovno razvrščanje je potreben za mešanico notranjega in zunanjega znanja.",
"multimodal": "Multimodalen",
"newKnowledge.actionsColumn": "Dejanja",
"newKnowledge.addAndProcess": "Dodaj in obdelaj",
"newKnowledge.addDocument": "Dodaj dokument",
"newKnowledge.addSource": "Dodaj vir",
"newKnowledge.addSourceDescription": "Povežite vir s to bazo znanja — samodejno se sinhronizira in ostane sveža.",
@ -250,6 +251,7 @@
"newKnowledge.documentUploadExclusion.quota": "kvota delovnega prostora je presežena",
"newKnowledge.documentUploadExclusion.target": "cilj dokumenta ni več veljaven",
"newKnowledge.documentUploadFailed": "Teh dokumentov nismo mogli naložiti. poskusi ponovno",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, XLSX, TXT — do 15 MB na datoteko",
"newKnowledge.documentUploadPartial": "Obdelava {{accepted}} dokumentov se je začela; {{excluded}} jih ni bilo mogoče dodati: {{details}}",
"newKnowledge.documentUploadRejected": "Noben dokument ni bil sprejet: {{details}}",
"newKnowledge.documentUploadStarted": "Začela se je obdelava dokumentov.",
@ -268,6 +270,7 @@
"newKnowledge.documentsSelected": "Izbrani dokumenti {{count}}",
"newKnowledge.documentsUnavailable": "— dokumentov",
"newKnowledge.downloadDocuments": "Prenos",
"newKnowledge.dropFilesHere": "Spustite datoteke sem",
"newKnowledge.editSource": "Uredi",
"newKnowledge.emptyChunk": "Prazen del",
"newKnowledge.emptyDescription": "Dodajte dokumente in agenti jih lahko berejo neposredno — brez nastavljanja indeksiranja.",
@ -379,6 +382,7 @@
"newKnowledge.selectAllSources": "Izberi vse vire",
"newKnowledge.selectChunk": "Izberite del za pregled njegove vsebine.",
"newKnowledge.selectFilesAndFolders": "Izberite datoteke in mape za sinhronizacijo",
"newKnowledge.selectedFiles": "Izbrane datoteke ({{valid}} od {{total}} veljavnih)",
"newKnowledge.skippedFailed": "Preskočeno (neuspešno)",
"newKnowledge.skippedOffDomain": "Preskočeno (zunaj domene)",
"newKnowledge.sourceActions": "Dejanja za {{name}}",
@ -437,6 +441,7 @@
"newKnowledge.updatedColumn": "Posodobljeno",
"newKnowledge.uploadCharactersUnavailable": "Znaki: —",
"newKnowledge.uploadDocuments": "Nalaganje dokumentov",
"newKnowledge.uploadDropZoneTitle": "Povlecite in spustite datoteke sem ali kliknite za brskanje",
"newKnowledge.uploadFiles": "Naloži datoteke",
"newKnowledge.uploadFilesDescription": "Dodajte datoteke iz računalnika — indeksirajo se takoj ob ustvarjanju.",
"newKnowledge.uploadingFiles": "Nalaganje…",

View File

@ -132,6 +132,7 @@
"mixtureInternalAndExternalTip": "โมเดล Rerank จําเป็นสําหรับการผสมผสานระหว่างความรู้ภายในและภายนอก",
"multimodal": "หลายรูปแบบ",
"newKnowledge.actionsColumn": "การดำเนินการ",
"newKnowledge.addAndProcess": "เพิ่มและประมวลผล",
"newKnowledge.addDocument": "เพิ่มเอกสาร",
"newKnowledge.addSource": "เพิ่มแหล่งที่มา",
"newKnowledge.addSourceDescription": "เชื่อมต่อแหล่งข้อมูลกับฐานความรู้นี้ โดยจะซิงค์โดยอัตโนมัติและมีความสดใหม่อยู่เสมอ",
@ -250,6 +251,7 @@
"newKnowledge.documentUploadExclusion.quota": "เกินโควตาพื้นที่ทำงาน",
"newKnowledge.documentUploadExclusion.target": "เป้าหมายเอกสารไม่ถูกต้องอีกต่อไป",
"newKnowledge.documentUploadFailed": "เราไม่สามารถอัปโหลดเอกสารเหล่านี้ได้ ลองอีกครั้ง",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, XLSX, TXT — สูงสุดไฟล์ละ 15 MB",
"newKnowledge.documentUploadPartial": "เริ่มประมวลผลเอกสาร {{accepted}} รายการแล้ว; เพิ่มไม่ได้ {{excluded}} รายการ: {{details}}",
"newKnowledge.documentUploadRejected": "ไม่มีเอกสารที่ได้รับการยอมรับ: {{details}}",
"newKnowledge.documentUploadStarted": "การประมวลผลเอกสารเริ่มต้นขึ้น",
@ -268,6 +270,7 @@
"newKnowledge.documentsSelected": "เลือกเอกสาร {{count}} แล้ว",
"newKnowledge.documentsUnavailable": "— เอกสาร",
"newKnowledge.downloadDocuments": "ดาวน์โหลด",
"newKnowledge.dropFilesHere": "วางไฟล์ที่นี่",
"newKnowledge.editSource": "แก้ไข",
"newKnowledge.emptyChunk": "ส่วนข้อมูลว่าง",
"newKnowledge.emptyDescription": "เพิ่มเอกสารของคุณ แล้วเอเจนต์จะอ่านได้โดยตรง โดยไม่ต้องตั้งค่าการทำดัชนี",
@ -379,6 +382,7 @@
"newKnowledge.selectAllSources": "เลือกแหล่งที่มาทั้งหมด",
"newKnowledge.selectChunk": "เลือกส่วนข้อมูลเพื่อตรวจสอบเนื้อหา",
"newKnowledge.selectFilesAndFolders": "เลือกไฟล์และโฟลเดอร์ที่จะซิงค์",
"newKnowledge.selectedFiles": "ไฟล์ที่เลือก (ใช้ได้ {{valid}} จาก {{total}} ไฟล์)",
"newKnowledge.skippedFailed": "ข้าม (ล้มเหลว)",
"newKnowledge.skippedOffDomain": "ข้าม (นอกโดเมน)",
"newKnowledge.sourceActions": "การดำเนินการสำหรับ {{name}}",
@ -437,6 +441,7 @@
"newKnowledge.updatedColumn": "อัปเดตแล้ว",
"newKnowledge.uploadCharactersUnavailable": "อักขระ: —",
"newKnowledge.uploadDocuments": "อัพโหลดเอกสาร",
"newKnowledge.uploadDropZoneTitle": "ลากและวางไฟล์ที่นี่ หรือคลิกเพื่อเรียกดู",
"newKnowledge.uploadFiles": "อัปโหลดไฟล์",
"newKnowledge.uploadFilesDescription": "เพิ่มไฟล์จากคอมพิวเตอร์ ไฟล์จะถูกทำดัชนีทันทีที่สร้าง",
"newKnowledge.uploadingFiles": "กำลังอัปโหลด…",

View File

@ -132,6 +132,7 @@
"mixtureInternalAndExternalTip": "Yeniden Sıralama modeli, iç ve dış bilgilerin karışımı için gereklidir.",
"multimodal": "Çok Modlu",
"newKnowledge.actionsColumn": "Eylemler",
"newKnowledge.addAndProcess": "Ekle ve işle",
"newKnowledge.addDocument": "Belge ekle",
"newKnowledge.addSource": "Kaynak ekle",
"newKnowledge.addSourceDescription": "Bir kaynağı bu bilgi tabanına bağlayın; otomatik olarak senkronize edilir ve güncel kalır.",
@ -250,6 +251,7 @@
"newKnowledge.documentUploadExclusion.quota": "çalışma alanı kotasııldı",
"newKnowledge.documentUploadExclusion.target": "belge hedefi artık geçerli değil",
"newKnowledge.documentUploadFailed": "Bu belgeleri yükleyemedik. Tekrar deneyin.",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, XLSX, TXT — dosya başına en fazla 15 MB",
"newKnowledge.documentUploadPartial": "{{accepted}} belgenin işlenmesi başladı; {{excluded}} belge eklenemedi: {{details}}",
"newKnowledge.documentUploadRejected": "Hiçbir belge kabul edilmedi: {{details}}",
"newKnowledge.documentUploadStarted": "Evrak işlemleri başlatıldı.",
@ -268,6 +270,7 @@
"newKnowledge.documentsSelected": "{{count}} belgeleri seçildi",
"newKnowledge.documentsUnavailable": "— belge",
"newKnowledge.downloadDocuments": "İndir",
"newKnowledge.dropFilesHere": "Dosyaları buraya bırakın",
"newKnowledge.editSource": "Düzenle",
"newKnowledge.emptyChunk": "Boş parça",
"newKnowledge.emptyDescription": "Belgelerinizi ekleyin; ajanlar indeksleme yapılandırmadan belgeleri doğrudan okuyabilsin.",
@ -379,6 +382,7 @@
"newKnowledge.selectAllSources": "Tüm kaynakları seç",
"newKnowledge.selectChunk": "İçeriğini incelemek için bir parça seçin.",
"newKnowledge.selectFilesAndFolders": "Senkronize edilecek dosya ve klasörleri seçin",
"newKnowledge.selectedFiles": "Seçilen dosyalar ({{total}} dosyadan {{valid}} tanesi geçerli)",
"newKnowledge.skippedFailed": "Atlandı (başarısız)",
"newKnowledge.skippedOffDomain": "Atlandı (alan adı dışında)",
"newKnowledge.sourceActions": "{{name}} için eylemler",
@ -437,6 +441,7 @@
"newKnowledge.updatedColumn": "Güncellendi",
"newKnowledge.uploadCharactersUnavailable": "Karakterler: —",
"newKnowledge.uploadDocuments": "Belgeleri yükleyin",
"newKnowledge.uploadDropZoneTitle": "Dosyaları buraya sürükleyip bırakın veya göz atmak için tıklayın",
"newKnowledge.uploadFiles": "Dosya yükle",
"newKnowledge.uploadFilesDescription": "Bilgisayarınızdan dosya ekleyin; oluşturduğunuz anda indekslenirler.",
"newKnowledge.uploadingFiles": "Yükleniyor…",

View File

@ -132,6 +132,7 @@
"mixtureInternalAndExternalTip": "Модель Rerank необхідна для поєднання внутрішніх і зовнішніх знань.",
"multimodal": "Мультимодальний",
"newKnowledge.actionsColumn": "Дії",
"newKnowledge.addAndProcess": "Додати й обробити",
"newKnowledge.addDocument": "Додати документ",
"newKnowledge.addSource": "Додати джерело",
"newKnowledge.addSourceDescription": "Підключіть джерело до цієї бази знань — вона автоматично синхронізується та залишається актуальною.",
@ -250,6 +251,7 @@
"newKnowledge.documentUploadExclusion.quota": "перевищено квоту робочої області",
"newKnowledge.documentUploadExclusion.target": "ціль документа більше недійсна",
"newKnowledge.documentUploadFailed": "Нам не вдалося завантажити ці документи. Спробуйте знову.",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, XLSX, TXT — до 15 МБ кожен",
"newKnowledge.documentUploadPartial": "Розпочато обробку {{accepted}} документів; не вдалося додати {{excluded}}: {{details}}",
"newKnowledge.documentUploadRejected": "Жодного документа не прийнято: {{details}}",
"newKnowledge.documentUploadStarted": "Розпочато обробку документів.",
@ -268,6 +270,7 @@
"newKnowledge.documentsSelected": "Вибрані документи {{count}}",
"newKnowledge.documentsUnavailable": "— документів",
"newKnowledge.downloadDocuments": "Завантажити",
"newKnowledge.dropFilesHere": "Перетягніть файли сюди",
"newKnowledge.editSource": "Редагувати",
"newKnowledge.emptyChunk": "Порожній фрагмент",
"newKnowledge.emptyDescription": "Додайте документи, і агенти зможуть читати їх безпосередньо — без налаштування індексації.",
@ -379,6 +382,7 @@
"newKnowledge.selectAllSources": "Вибрати всі джерела",
"newKnowledge.selectChunk": "Виберіть фрагмент, щоб переглянути його вміст.",
"newKnowledge.selectFilesAndFolders": "Виберіть файли й папки для синхронізації",
"newKnowledge.selectedFiles": "Вибрані файли ({{valid}} з {{total}} дійсні)",
"newKnowledge.skippedFailed": "Пропущено (помилка)",
"newKnowledge.skippedOffDomain": "Пропущено (поза доменом)",
"newKnowledge.sourceActions": "Дії для {{name}}",
@ -437,6 +441,7 @@
"newKnowledge.updatedColumn": "Оновлено",
"newKnowledge.uploadCharactersUnavailable": "Символи: —",
"newKnowledge.uploadDocuments": "Завантажити документи",
"newKnowledge.uploadDropZoneTitle": "Перетягніть файли сюди або натисніть, щоб вибрати",
"newKnowledge.uploadFiles": "Завантажити файли",
"newKnowledge.uploadFilesDescription": "Додайте файли з комп’ютера — вони індексуються одразу після створення.",
"newKnowledge.uploadingFiles": "Завантаження…",

View File

@ -132,6 +132,7 @@
"mixtureInternalAndExternalTip": "Mô hình Rerank là cần thiết cho sự kết hợp giữa kiến thức bên trong và bên ngoài.",
"multimodal": "Đa phương thức",
"newKnowledge.actionsColumn": "Hành động",
"newKnowledge.addAndProcess": "Thêm và xử lý",
"newKnowledge.addDocument": "Thêm tài liệu",
"newKnowledge.addSource": "Thêm nguồn",
"newKnowledge.addSourceDescription": "Kết nối nguồn với cơ sở kiến thức này — nguồn này tự động đồng bộ hóa và luôn cập nhật.",
@ -250,6 +251,7 @@
"newKnowledge.documentUploadExclusion.quota": "đã vượt quá hạn mức không gian làm việc",
"newKnowledge.documentUploadExclusion.target": "đích tài liệu không còn hợp lệ",
"newKnowledge.documentUploadFailed": "Chúng tôi không thể tải lên những tài liệu này. Hãy thử lại.",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, XLSX, TXT — tối đa 15 MB mỗi tệp",
"newKnowledge.documentUploadPartial": "Đã bắt đầu xử lý {{accepted}} tài liệu; không thể thêm {{excluded}} tài liệu: {{details}}",
"newKnowledge.documentUploadRejected": "Không có tài liệu nào được chấp nhận: {{details}}",
"newKnowledge.documentUploadStarted": "Quá trình xử lý tài liệu bắt đầu.",
@ -268,6 +270,7 @@
"newKnowledge.documentsSelected": "Đã chọn tài liệu {{count}}",
"newKnowledge.documentsUnavailable": "— tài liệu",
"newKnowledge.downloadDocuments": "Tải xuống",
"newKnowledge.dropFilesHere": "Thả tệp vào đây",
"newKnowledge.editSource": "Chỉnh sửa",
"newKnowledge.emptyChunk": "Đoạn trống",
"newKnowledge.emptyDescription": "Thêm tài liệu để tác nhân có thể đọc trực tiếp — không cần cấu hình lập chỉ mục.",
@ -379,6 +382,7 @@
"newKnowledge.selectAllSources": "Chọn tất cả nguồn",
"newKnowledge.selectChunk": "Chọn một đoạn để xem nội dung.",
"newKnowledge.selectFilesAndFolders": "Chọn tệp và thư mục để đồng bộ",
"newKnowledge.selectedFiles": "Tệp đã chọn ({{valid}}/{{total}} hợp lệ)",
"newKnowledge.skippedFailed": "Đã bỏ qua (thất bại)",
"newKnowledge.skippedOffDomain": "Đã bỏ qua (ngoài miền)",
"newKnowledge.sourceActions": "Hành động dành cho {{name}}",
@ -437,6 +441,7 @@
"newKnowledge.updatedColumn": "Đã cập nhật",
"newKnowledge.uploadCharactersUnavailable": "Ký tự: —",
"newKnowledge.uploadDocuments": "Tải tài liệu lên",
"newKnowledge.uploadDropZoneTitle": "Kéo và thả tệp vào đây hoặc nhấp để duyệt",
"newKnowledge.uploadFiles": "Tải tệp lên",
"newKnowledge.uploadFilesDescription": "Thêm tệp từ máy tính — tệp sẽ được lập chỉ mục ngay khi tạo.",
"newKnowledge.uploadingFiles": "Đang tải lên…",

View File

@ -132,6 +132,7 @@
"mixtureInternalAndExternalTip": "混合使用内部和外部知识时需要配置 Rerank 模型。",
"multimodal": "多模态",
"newKnowledge.actionsColumn": "行动",
"newKnowledge.addAndProcess": "添加并处理",
"newKnowledge.addDocument": "添加文档",
"newKnowledge.addSource": "添加来源",
"newKnowledge.addSourceDescription": "将来源连接到该知识库 - 它会自动同步并保持最新。",
@ -250,6 +251,7 @@
"newKnowledge.documentUploadExclusion.quota": "超出工作区配额",
"newKnowledge.documentUploadExclusion.target": "文档目标已失效",
"newKnowledge.documentUploadFailed": "无法上传这些文档,请重试。",
"newKnowledge.documentUploadFormats": "PDF、DOCX、Markdown、HTML、XLSX、TXT — 每个文件不超过 15 MB",
"newKnowledge.documentUploadPartial": "已开始处理 {{accepted}} 个文档;{{excluded}} 个无法添加:{{details}}",
"newKnowledge.documentUploadRejected": "未接受任何文档:{{details}}",
"newKnowledge.documentUploadStarted": "文档处理已开始。",
@ -268,6 +270,7 @@
"newKnowledge.documentsSelected": "已选择 {{count}} 个文档",
"newKnowledge.documentsUnavailable": "— 篇文档",
"newKnowledge.downloadDocuments": "下载",
"newKnowledge.dropFilesHere": "在此处放置文件",
"newKnowledge.editSource": "编辑",
"newKnowledge.emptyChunk": "空分段",
"newKnowledge.emptyDescription": "添加文档后,智能体即可直接读取,无需配置索引。",
@ -379,6 +382,7 @@
"newKnowledge.selectAllSources": "选择所有来源",
"newKnowledge.selectChunk": "选择一个分段以查看其内容。",
"newKnowledge.selectFilesAndFolders": "选择要同步的文件和文件夹",
"newKnowledge.selectedFiles": "已选文件({{total}} 个中 {{valid}} 个有效)",
"newKnowledge.skippedFailed": "已跳过(失败)",
"newKnowledge.skippedOffDomain": "已跳过(域外)",
"newKnowledge.sourceActions": "{{name}} 的操作",
@ -437,6 +441,7 @@
"newKnowledge.updatedColumn": "更新时间",
"newKnowledge.uploadCharactersUnavailable": "字符数:—",
"newKnowledge.uploadDocuments": "上传文档",
"newKnowledge.uploadDropZoneTitle": "将文件拖放到此处,或点击浏览",
"newKnowledge.uploadFiles": "上传文件",
"newKnowledge.uploadFilesDescription": "从电脑添加文件,创建后会立即建立索引。",
"newKnowledge.uploadingFiles": "正在上传…",

View File

@ -132,6 +132,7 @@
"mixtureInternalAndExternalTip": "Rerank 模型是內部和外部知識的混合所必需的。",
"multimodal": "多模態",
"newKnowledge.actionsColumn": "行動",
"newKnowledge.addAndProcess": "新增並處理",
"newKnowledge.addDocument": "新增文件",
"newKnowledge.addSource": "新增來源",
"newKnowledge.addSourceDescription": "將來源連接到該知識庫 - 它會自動同步並保持最新。",
@ -250,6 +251,7 @@
"newKnowledge.documentUploadExclusion.quota": "超出工作區配額",
"newKnowledge.documentUploadExclusion.target": "文件目標已失效",
"newKnowledge.documentUploadFailed": "無法上傳這些文件,請再試一次。",
"newKnowledge.documentUploadFormats": "PDF、DOCX、Markdown、HTML、XLSX、TXT — 每個檔案不超過 15 MB",
"newKnowledge.documentUploadPartial": "已開始處理 {{accepted}} 個文件;{{excluded}} 個無法新增:{{details}}",
"newKnowledge.documentUploadRejected": "未接受任何文件:{{details}}",
"newKnowledge.documentUploadStarted": "文件處理已開始。",
@ -268,6 +270,7 @@
"newKnowledge.documentsSelected": "已選取 {{count}} 個文件",
"newKnowledge.documentsUnavailable": "— 份文件",
"newKnowledge.downloadDocuments": "下載",
"newKnowledge.dropFilesHere": "將檔案拖放到此處",
"newKnowledge.editSource": "編輯",
"newKnowledge.emptyChunk": "空分段",
"newKnowledge.emptyDescription": "加入文件後,智慧代理即可直接讀取,無需設定索引。",
@ -379,6 +382,7 @@
"newKnowledge.selectAllSources": "選擇所有來源",
"newKnowledge.selectChunk": "選取一個分段以查看其內容。",
"newKnowledge.selectFilesAndFolders": "選擇要同步的檔案與資料夾",
"newKnowledge.selectedFiles": "已選檔案({{total}} 個中 {{valid}} 個有效)",
"newKnowledge.skippedFailed": "已略過(失敗)",
"newKnowledge.skippedOffDomain": "已略過(網域外)",
"newKnowledge.sourceActions": "{{name}} 的操作",
@ -437,6 +441,7 @@
"newKnowledge.updatedColumn": "更新時間",
"newKnowledge.uploadCharactersUnavailable": "字元數:—",
"newKnowledge.uploadDocuments": "上傳文件",
"newKnowledge.uploadDropZoneTitle": "將檔案拖放到此處,或點擊瀏覽",
"newKnowledge.uploadFiles": "上傳檔案",
"newKnowledge.uploadFilesDescription": "從電腦加入檔案,建立後會立即建立索引。",
"newKnowledge.uploadingFiles": "正在上傳…",