diff --git a/web/app/(commonLayout)/datasets/new/[knowledgeSpaceId]/documents/[documentId]/page.tsx b/web/app/(commonLayout)/datasets/new/[knowledgeSpaceId]/documents/[documentId]/page.tsx new file mode 100644 index 00000000000..b62d4ede0a8 --- /dev/null +++ b/web/app/(commonLayout)/datasets/new/[knowledgeSpaceId]/documents/[documentId]/page.tsx @@ -0,0 +1,11 @@ +import { DocumentDetailPage } from '@/features/new-rag/document-detail-page' + +export default async function Page({ + params, +}: { + params: Promise<{ documentId: string; knowledgeSpaceId: string }> +}) { + const { documentId, knowledgeSpaceId } = await params + + return +} diff --git a/web/features/new-rag/README.md b/web/features/new-rag/README.md index 1d30a942899..013391d458b 100644 --- a/web/features/new-rag/README.md +++ b/web/features/new-rag/README.md @@ -16,6 +16,14 @@ tasks. - `create-upload-queue` - `create-knowledge-workflow` - `document-list` +- `document-chunk-detail` +- `document-chunk-tree` +- `document-detail-header` +- `document-detail-model` +- `document-detail-queries` +- `document-detail-page` +- `document-detail-status` +- `document-revision-content` - `document-model` - `document-upload-policy` - `documents-page` @@ -28,6 +36,8 @@ tasks. - `sources-page` - `storage` - `task-event-observer` +- `use-document-task-status` +- `use-document-reindex` - `website-crawl-preview` ## External Modules diff --git a/web/features/new-rag/__tests__/document-detail-model.spec.ts b/web/features/new-rag/__tests__/document-detail-model.spec.ts new file mode 100644 index 00000000000..b4ba85c4ce4 --- /dev/null +++ b/web/features/new-rag/__tests__/document-detail-model.spec.ts @@ -0,0 +1,187 @@ +import type { + DocumentRevisionChunk, + LogicalDocument, + LogicalDocumentRevision, +} from '@dify/contracts/knowledge-fs/types.gen' +import { + buildDocumentChunkTree, + chunkCharacterCount, + chunkContentParts, + chunkMetadataEntries, + chunkTreeLabel, + initialDocumentRevision, + visibleDocumentChunkNodes, +} from '../document-detail-model' + +const chunk = (overrides: Partial): DocumentRevisionChunk => ({ + createdAt: '2026-07-21T10:00:00Z', + documentId: 'document-1', + documentRevision: 3, + enabled: true, + id: 'chunk-1', + knowledgeSpaceId: 'space-1', + ordinal: 1, + text: 'Chunk content', + tokenCount: 2, + userMetadata: {}, + ...overrides, +}) + +const document = (overrides: Partial = {}): LogicalDocument => ({ + active: { + contentHash: 'hash-3', + createdAt: '2026-07-21T10:00:00Z', + documentAssetId: 'asset-1', + documentAssetVersion: 1, + documentId: 'document-1', + knowledgeSpaceId: 'space-1', + mimeType: 'text/markdown', + revision: 3, + sizeBytes: 1200, + state: 'active', + }, + activeRevision: 3, + createdAt: '2026-07-21T09:00:00Z', + id: 'document-1', + knowledgeSpaceId: 'space-1', + rowVersion: 2, + status: 'ready', + title: 'SSO enterprise', + updatedAt: '2026-07-21T10:00:00Z', + userMetadata: {}, + ...overrides, +}) + +const revision = (value: number): Exclude => ({ + contentHash: `hash-${value}`, + createdAt: `2026-07-21T0${value}:00:00Z`, + documentAssetId: 'asset-1', + documentAssetVersion: value, + documentId: 'document-1', + knowledgeSpaceId: 'space-1', + mimeType: 'text/markdown', + revision: value, + sizeBytes: value * 100, + state: value === 3 ? 'active' : 'superseded', +}) + +describe('document detail model', () => { + it('builds a deterministic parent-child tree and keeps orphans visible', () => { + const tree = buildDocumentChunkTree([ + chunk({ id: 'child-b', ordinal: 3, parentChunkId: 'parent' }), + chunk({ id: 'parent', ordinal: 1 }), + chunk({ id: 'orphan', ordinal: 2, parentChunkId: 'missing' }), + chunk({ id: 'child-a', ordinal: 2, parentChunkId: 'parent' }), + ]) + + expect(tree.roots.map((node) => node.chunk.id)).toEqual(['parent', 'orphan']) + expect(tree.byId.get('parent')?.children.map((node) => node.chunk.id)).toEqual([ + 'child-a', + 'child-b', + ]) + }) + + it('breaks cyclic parent links instead of losing every node', () => { + const tree = buildDocumentChunkTree([ + chunk({ id: 'cycle-a', ordinal: 1, parentChunkId: 'cycle-b' }), + chunk({ id: 'cycle-b', ordinal: 2, parentChunkId: 'cycle-a' }), + chunk({ id: 'self', ordinal: 3, parentChunkId: 'self' }), + ]) + + expect(tree.roots.map((node) => node.chunk.id)).toEqual(['cycle-a', 'cycle-b', 'self']) + }) + + it('builds a long parent chain without repeated ancestor walks', () => { + const chunks = Array.from({ length: 5000 }, (_, index) => + chunk({ + id: `chunk-${index}`, + ordinal: index, + parentChunkId: index ? `chunk-${index - 1}` : undefined, + }), + ) + + const tree = buildDocumentChunkTree(chunks) + const visible = visibleDocumentChunkNodes(tree.roots, new Set(tree.byId.keys())) + + expect(tree.byId).toHaveLength(5000) + expect(tree.roots.map((node) => node.chunk.id)).toEqual(['chunk-0']) + expect(visible).toHaveLength(5000) + expect(visible.at(-1)).toMatchObject({ depth: 4999 }) + }) + + it('flattens only expanded descendants in tree order', () => { + const tree = buildDocumentChunkTree([ + chunk({ id: 'parent', ordinal: 1 }), + chunk({ id: 'child', ordinal: 2, parentChunkId: 'parent' }), + chunk({ id: 'grandchild', ordinal: 3, parentChunkId: 'child' }), + ]) + + expect( + visibleDocumentChunkNodes(tree.roots, new Set()).map(({ node }) => node.chunk.id), + ).toEqual(['parent']) + expect( + visibleDocumentChunkNodes(tree.roots, new Set(['parent', 'child'])).map( + ({ depth, node }) => `${depth}:${node.chunk.id}`, + ), + ).toEqual(['0:parent', '1:child', '2:grandchild']) + }) + + it('selects the active revision and falls back to the newest available revision', () => { + expect(initialDocumentRevision(document(), [revision(1), revision(2), revision(3)])).toBe(3) + expect( + initialDocumentRevision(document({ active: null, activeRevision: undefined }), [ + revision(1), + revision(2), + ]), + ).toBe(2) + expect(initialDocumentRevision(document({ active: null, activeRevision: undefined }), [])).toBe( + undefined, + ) + expect( + initialDocumentRevision(document({ active: null, activeRevision: undefined }), [ + { ...revision(4), state: 'failed' }, + { ...revision(5), state: 'candidate' }, + ]), + ).toBeUndefined() + expect( + initialDocumentRevision(document({ active: null, activeRevision: undefined }), [ + revision(2), + { ...revision(4), state: 'failed' }, + ]), + ).toBe(2) + }) + + it('counts unicode characters and formats metadata deterministically', () => { + expect(chunkCharacterCount('A📙B')).toBe(3) + expect(chunkCharacterCount('👨‍👩‍👧‍👦')).toBe(1) + expect( + chunkMetadataEntries({ + page: 2, + section: 'Security', + tags: ['sso', 'saml'], + }), + ).toEqual([ + ['page', '2'], + ['section', 'Security'], + ['tags', '["sso","saml"]'], + ]) + }) + + it('bounds tree labels to a single readable summary', () => { + expect(chunkTreeLabel('First line\nfull body', 3)).toBe('First line') + expect(chunkTreeLabel(' ', 3)).toBe('#3') + expect(chunkTreeLabel('x'.repeat(121), 3)).toBe(`${'x'.repeat(119)}…`) + expect(chunkTreeLabel(`${'x'.repeat(118)}👨‍👩‍👧‍👦yz`, 3)).toBe(`${'x'.repeat(118)}👨‍👩‍👧‍👦…`) + }) + + it('separates multiline chunk headings without duplicating standalone content', () => { + expect(chunkContentParts('Setup requirements\n\nWorkspace contract details')).toEqual({ + body: 'Workspace contract details', + heading: 'Setup requirements', + }) + expect(chunkContentParts('Standalone content')).toEqual({ + body: '', + heading: 'Standalone content', + }) + }) +}) diff --git a/web/features/new-rag/__tests__/document-detail-page.spec.tsx b/web/features/new-rag/__tests__/document-detail-page.spec.tsx new file mode 100644 index 00000000000..d711db768b3 --- /dev/null +++ b/web/features/new-rag/__tests__/document-detail-page.spec.tsx @@ -0,0 +1,1365 @@ +import type { + BulkDocumentReindexResult, + DocumentProcessingTask, + DocumentRevisionChunk, + LogicalDocument, + LogicalDocumentRevision, +} from '@dify/contracts/knowledge-fs/types.gen' +import { act, fireEvent, screen, waitFor, within } from '@testing-library/react' +import userEvent from '@testing-library/user-event' +import copy from 'copy-to-clipboard' +import { renderWithNuqs as render } from '@/test/nuqs-testing' +import { DocumentDetailPage } from '../document-detail-page' + +type InfiniteOptions = { + enabled?: boolean + getNextPageParam: (lastPage: { nextCursor?: string }) => string | undefined + input: (pageParam: string | null) => unknown + initialPageParam: string | null + queryKind: 'chunks' | 'revisions' | 'tasks' +} + +function infiniteInput(options?: Pick) { + if (!options || typeof options.input !== 'function') throw new Error('Expected query input') + return options.input +} + +const documentQuery = vi.hoisted(() => ({ + data: undefined as LogicalDocument | undefined, + error: null as unknown, + isPending: false, + refetch: vi.fn(), +})) + +const taskSnapshotQuery = vi.hoisted(() => ({ + data: undefined as DocumentProcessingTask | undefined, + error: null as unknown, + refetch: vi.fn(), +})) + +const submissionTasksQuery = vi.hoisted(() => ({ + data: undefined as { items: DocumentProcessingTask[] } | undefined, + error: null as unknown, + refetch: vi.fn(), +})) + +const revisionsQuery = vi.hoisted(() => ({ + data: undefined as + | { pages: Array<{ items: LogicalDocumentRevision[]; nextCursor?: string }> } + | undefined, + error: null as unknown, + fetchNextPage: vi.fn(), + hasNextPage: false, + isFetchNextPageError: false, + isFetchingNextPage: false, + isPending: false, + refetch: vi.fn(), +})) + +const chunksQuery = vi.hoisted(() => ({ + data: undefined as + | { pages: Array<{ items: DocumentRevisionChunk[]; nextCursor?: string }> } + | undefined, + error: null as unknown, + fetchNextPage: vi.fn(), + hasNextPage: false, + isFetchNextPageError: false, + isFetchingNextPage: false, + isPending: false, + refetch: vi.fn(), +})) + +const tasksQuery = vi.hoisted(() => ({ + data: undefined as + | { pages: Array<{ items: DocumentProcessingTask[]; nextCursor?: string }> } + | undefined, + error: null as unknown, + fetchNextPage: vi.fn(), + hasNextPage: false, + isFetchNextPageError: false, + isFetchingNextPage: false, + isPending: false, + refetch: vi.fn(), +})) + +const permissionState = vi.hoisted(() => ({ + datasetAtom: Symbol('datasetDefaultPermissionKeysAtom'), + keys: ['dataset.acl.edit'], + refreshAtom: Symbol('refreshWorkspacePermissionKeysAfterMutationDenialAtom'), + refresh: vi.fn(), +})) +const reindexMutation = vi.hoisted(() => ({ mutateAsync: vi.fn() })) +const queryClient = vi.hoisted(() => ({ + invalidateQueries: vi.fn(), + removeQueries: vi.fn(), + setQueryData: vi.fn(), +})) +const toastState = vi.hoisted(() => ({ error: vi.fn(), info: vi.fn(), success: vi.fn() })) +const virtualizerState = vi.hoisted(() => ({ scrollToIndex: vi.fn() })) +const documentOptions = vi.hoisted(() => + vi.fn((options: object) => ({ + ...options, + queryKey: ['knowledge-fs', 'document', 'space-1', 'document-1'], + queryKind: 'document', + })), +) +const taskSnapshotOptions = vi.hoisted(() => + vi.fn((options: object) => ({ ...options, queryKind: 'task-snapshot' })), +) +const documentSubmissionTasksOptions = vi.hoisted(() => + vi.fn((options: object) => ({ + ...options, + queryKey: ['knowledge-fs', 'submission-tasks', 'space-1', 'document-1'], + queryKind: 'submission-tasks', + })), +) +const workspaceSubmissionTasksOptions = vi.hoisted(() => + vi.fn((options: object) => ({ + ...options, + queryKey: ['knowledge-fs', 'workspace-submission-tasks', 'space-1'], + queryKind: 'submission-tasks', + })), +) +const revisionsOptions = vi.hoisted(() => + vi.fn((options: Omit) => ({ + ...options, + queryKey: ['knowledge-fs', 'revisions', 'space-1', 'document-1'], + queryKind: 'revisions', + })), +) +const chunksOptions = vi.hoisted(() => + vi.fn((options: Omit) => ({ + ...options, + queryKey: ['knowledge-fs', 'chunks', 'space-1', 'document-1'], + queryKind: 'chunks', + })), +) +const documentTasksOptions = vi.hoisted(() => + vi.fn((options: Omit) => ({ + ...options, + queryKey: ['knowledge-fs', 'tasks', 'space-1', 'document-1'], + queryKind: 'tasks', + })), +) +const workspaceTasksOptions = vi.hoisted(() => + vi.fn((options: Omit) => ({ + ...options, + queryKey: ['knowledge-fs', 'workspace-tasks', 'space-1'], + queryKind: 'tasks', + })), +) + +vi.mock('jotai', async (importOriginal) => { + const original = await importOriginal() + return { + ...original, + useAtomValue: (atom: unknown) => + atom === permissionState.datasetAtom ? permissionState.keys : undefined, + useSetAtom: (atom: unknown) => + atom === permissionState.refreshAtom ? permissionState.refresh : vi.fn(), + } +}) + +vi.mock('@/context/permission-state', () => ({ + datasetDefaultPermissionKeysAtom: permissionState.datasetAtom, + refreshWorkspacePermissionKeysAfterMutationDenialAtom: permissionState.refreshAtom, +})) + +vi.mock('@langgenius/dify-ui/toast', () => ({ toast: toastState })) +vi.mock('copy-to-clipboard', () => ({ default: vi.fn(() => true) })) + +vi.mock('@tanstack/react-virtual', () => ({ + defaultRangeExtractor: ({ endIndex, startIndex }: { endIndex: number; startIndex: number }) => + Array.from({ length: endIndex - startIndex + 1 }, (_, index) => startIndex + index), + useVirtualizer: ({ + count, + getItemKey, + rangeExtractor, + }: { + count: number + getItemKey: (index: number) => string + rangeExtractor: (range: { endIndex: number; startIndex: number }) => number[] + }) => ({ + getTotalSize: () => count * 56, + getVirtualItems: () => + rangeExtractor({ endIndex: Math.min(count, 12) - 1, startIndex: 0 }).map((index) => ({ + index, + key: getItemKey(index), + size: 56, + start: index * 56, + })), + scrollToIndex: virtualizerState.scrollToIndex, + }), +})) + +vi.mock('@tanstack/react-query', async (importOriginal) => { + const original = await importOriginal() + return { + ...original, + useInfiniteQuery: (options: InfiniteOptions) => { + if (options.queryKind === 'revisions') return revisionsQuery + if ( + options.queryKind === 'chunks' || + ('queryKey' in options && + Array.isArray(options.queryKey) && + options.queryKey.includes('chunks')) + ) + return chunksQuery + return tasksQuery + }, + useMutation: () => reindexMutation, + useQuery: (options: { queryKind?: string }) => { + if (options.queryKind === 'task-snapshot') return taskSnapshotQuery + if (options.queryKind === 'submission-tasks') return submissionTasksQuery + return documentQuery + }, + useQueryClient: () => queryClient, + } +}) + +vi.mock('@/service/client', () => ({ + consoleQuery: { + knowledgeFs: { + getKnowledgeSpacesByIdDocumentsByDocumentIdRevisions: { + infiniteOptions: revisionsOptions, + key: () => ['knowledge-fs', 'revisions'], + }, + getKnowledgeSpacesByIdDocumentsByDocumentIdRevisionsByRevisionChunks: { + infiniteOptions: chunksOptions, + key: () => ['knowledge-fs', 'chunks'], + }, + getKnowledgeSpacesByIdLogicalDocumentsByDocumentId: { + queryOptions: documentOptions, + key: () => ['knowledge-fs', 'document'], + }, + getKnowledgeSpacesByIdDocumentsByDocumentIdProcessingTasksByTaskId: { + queryOptions: taskSnapshotOptions, + }, + getKnowledgeSpacesByIdDocumentsByDocumentIdProcessingTasks: { + infiniteOptions: documentTasksOptions, + key: () => ['knowledge-fs', 'tasks'], + queryOptions: documentSubmissionTasksOptions, + }, + getKnowledgeSpacesByIdProcessingTasks: { + infiniteOptions: workspaceTasksOptions, + key: () => ['knowledge-fs', 'workspace-tasks'], + queryOptions: workspaceSubmissionTasksOptions, + }, + postKnowledgeSpacesByIdDocumentsBulkReindex: { + mutationOptions: () => ({}), + }, + }, + }, +})) + +const activeRevision = (overrides: Partial> = {}) => ({ + contentHash: 'hash-3', + createdAt: '2026-07-21T10:00:00Z', + documentAssetId: 'asset-1', + documentAssetVersion: 1, + documentId: 'document-1', + knowledgeSpaceId: 'space-1', + mimeType: 'text/markdown', + revision: 3, + sizeBytes: 1200, + state: 'active' as const, + ...overrides, +}) + +const logicalDocument = (overrides: Partial = {}): LogicalDocument => ({ + active: activeRevision(), + activeRevision: 3, + createdAt: '2026-07-21T09:00:00Z', + id: 'document-1', + knowledgeSpaceId: 'space-1', + rowVersion: 2, + sourceId: 'source-1', + status: 'ready', + title: 'sso-enterprise.pdf', + updatedAt: '2026-07-21T10:00:00Z', + userMetadata: { sourceName: 'Notion support SOP' }, + ...overrides, +}) + +const chunk = (overrides: Partial): DocumentRevisionChunk => ({ + createdAt: '2026-07-21T10:00:00Z', + documentId: 'document-1', + documentRevision: 3, + enabled: true, + id: 'parent', + knowledgeSpaceId: 'space-1', + ordinal: 1, + text: 'Parent content', + tokenCount: 10, + userMetadata: {}, + ...overrides, +}) + +const task = (overrides: Partial): DocumentProcessingTask => ({ + createdAt: '2026-07-21T10:00:00Z', + documentId: 'document-1', + documentRevision: 4, + id: 'task-1', + knowledgeSpaceId: 'space-1', + progressPercent: 45, + stage: 'nodes_generated', + state: 'running', + updatedAt: '2026-07-21T10:01:00Z', + ...overrides, +}) + +const queuedReindexResult = (): BulkDocumentReindexResult => ({ + bulkJobId: 'bulk-job-1', + items: [ + { + asset: { + createdAt: '2026-07-21T10:00:00Z', + filename: 'sso-enterprise.pdf', + id: 'asset-1', + knowledgeSpaceId: 'space-1', + mimeType: 'application/pdf', + objectKey: 'documents/asset-1', + parserStatus: 'pending', + sha256: 'hash-4', + sizeBytes: 1200, + version: 2, + }, + compilationJob: { id: 'compilation-job-1', stage: 'queued' }, + status: 'queued', + statusUrl: '/knowledge-fs/status/compilation-job-1', + }, + ], + total: 1, +}) + +const missingReindexResult = (): BulkDocumentReindexResult => ({ + bulkJobId: 'bulk-job-1', + items: [{ documentId: 'document-1', status: 'not_found' }], + total: 1, +}) + +describe('DocumentDetailPage', () => { + beforeEach(() => { + vi.clearAllMocks() + permissionState.keys = ['dataset.acl.edit'] + documentQuery.data = logicalDocument() + documentQuery.error = null + documentQuery.isPending = false + revisionsQuery.data = { pages: [{ items: [activeRevision()] }] } + revisionsQuery.error = null + revisionsQuery.hasNextPage = false + revisionsQuery.isFetchNextPageError = false + revisionsQuery.isFetchingNextPage = false + revisionsQuery.isPending = false + chunksQuery.data = { pages: [{ items: [] }] } + chunksQuery.error = null + chunksQuery.hasNextPage = false + chunksQuery.isFetchNextPageError = false + chunksQuery.isFetchingNextPage = false + chunksQuery.isPending = false + tasksQuery.data = { pages: [{ items: [] }] } + tasksQuery.error = null + tasksQuery.hasNextPage = false + tasksQuery.isFetchNextPageError = false + tasksQuery.isFetchingNextPage = false + tasksQuery.isPending = false + taskSnapshotQuery.data = undefined + taskSnapshotQuery.error = null + submissionTasksQuery.data = undefined + submissionTasksQuery.error = null + permissionState.refresh.mockResolvedValue({ + data: { dataset: { default_permission_keys: ['dataset.acl.edit'] } }, + error: null, + }) + reindexMutation.mutateAsync.mockResolvedValue(queuedReindexResult()) + queryClient.invalidateQueries.mockResolvedValue(undefined) + }) + + it('loads the document, revisions, chunks, and task status through generated contracts', () => { + render() + + expect(documentOptions).toHaveBeenCalledWith( + expect.objectContaining({ + input: { params: { documentId: 'document-1', id: 'space-1' } }, + retry: expect.any(Function), + }), + ) + expect(infiniteInput(revisionsOptions.mock.lastCall?.[0])(null)).toEqual({ + params: { documentId: 'document-1', id: 'space-1' }, + query: { limit: 50 }, + }) + expect(infiniteInput(chunksOptions.mock.lastCall?.[0])('next')).toEqual({ + params: { documentId: 'document-1', id: 'space-1', revision: 3 }, + query: { cursor: 'next', limit: 100 }, + }) + expect(infiniteInput(documentTasksOptions.mock.lastCall?.[0])(null)).toEqual({ + params: { documentId: 'document-1', id: 'space-1' }, + query: { limit: 100 }, + }) + expect(workspaceTasksOptions).not.toHaveBeenCalled() + expect(workspaceSubmissionTasksOptions).not.toHaveBeenCalled() + }) + + it('does not construct a chunks request while the document is loading', () => { + documentQuery.data = undefined + documentQuery.isPending = true + + render() + + expect(chunksOptions).not.toHaveBeenCalled() + expect(screen.getByRole('status')).toBeInTheDocument() + }) + + it('uses source provenance instead of exposing an internal source id', () => { + documentQuery.data = logicalDocument({ + userMetadata: {}, + }) + + render() + + expect(screen.queryByText('source-1')).not.toBeInTheDocument() + expect(screen.getAllByText('dataset.newKnowledge.sourceType.connector')).not.toHaveLength(0) + }) + + it('expands the parent-child tree and shows selected chunk content and metadata', async () => { + const user = userEvent.setup() + chunksQuery.data = { + pages: [ + { + items: [ + chunk({ id: 'parent', text: 'Setup requirements' }), + chunk({ + id: 'child', + ordinal: 2, + parentChunkId: 'parent', + text: 'Workspace contract details', + tokenCount: 4, + userMetadata: { section: '2.1', sourcePage: 8 }, + }), + ], + }, + ], + } + + render() + + const tree = screen.getByRole('tree', { name: 'dataset.newKnowledge.documentContents' }) + const parent = within(tree).getByRole('treeitem', { name: /Setup requirements/ }) + expect(parent).toHaveAttribute('aria-expanded', 'true') + const previousContentScroller = screen.getByTestId('chunk-content-scroll') + await user.click(within(tree).getByRole('treeitem', { name: /Workspace contract details/ })) + + const selectedChunkHeading = screen.getByRole('heading', { + name: 'Workspace contract details', + }) + expect(selectedChunkHeading).toBeInTheDocument() + const selectedChunkSection = selectedChunkHeading.closest('section') + expect(selectedChunkSection).not.toBeNull() + await user.click( + within(selectedChunkSection!).getByRole('button', { name: 'common.operation.copy' }), + ) + expect(copy).toHaveBeenCalledWith('Workspace contract details') + expect(toastState.success).toHaveBeenCalledWith('common.actionMsg.copySuccessfully') + const characterCount = screen.getByText('dataset.newKnowledge.characterCount').closest('div') + expect(characterCount).not.toBeNull() + expect(within(characterCount!).getByText('26')).toBeInTheDocument() + expect(screen.getByText('section')).toBeInTheDocument() + expect(screen.getByText('2.1')).toBeInTheDocument() + expect(screen.getByText('sourcePage')).toBeInTheDocument() + expect(screen.getByText('8')).toBeInTheDocument() + const startLabeling = screen.getByRole('button', { + name: 'dataset.metadata.documentMetadata.startLabeling', + }) + expect(startLabeling).toBeEnabled() + await user.click(startLabeling) + expect(toastState.info).toHaveBeenCalledWith('dataset.newKnowledge.filtersUnavailable') + expect(screen.getByTestId('chunk-content-scroll')).toBe(previousContentScroller) + expect(screen.getByRole('heading', { name: 'Setup requirements' })).toBeInTheDocument() + }) + + it('supports tree keyboard navigation, collapse, and selection', async () => { + const user = userEvent.setup() + chunksQuery.data = { + pages: [ + { + items: [ + chunk({ id: 'parent', text: 'Parent node' }), + chunk({ id: 'child', ordinal: 2, parentChunkId: 'parent', text: 'Child node' }), + chunk({ id: 'second', ordinal: 3, text: 'Second root' }), + ], + }, + ], + } + + render() + const tree = screen.getByRole('tree') + const parent = screen.getByRole('treeitem', { name: /Parent node/ }) + tree.focus() + fireEvent.keyDown(tree, { key: 'ArrowRight' }) + expect(tree).toHaveAttribute('aria-activedescendant', 'document-chunk-treeitem-child') + fireEvent.keyDown(tree, { key: 'ArrowDown' }) + expect(tree).toHaveAttribute('aria-activedescendant', 'document-chunk-treeitem-second') + fireEvent.keyDown(tree, { key: 'Home' }) + fireEvent.keyDown(tree, { key: 'ArrowLeft' }) + expect(parent).toHaveAttribute('aria-expanded', 'false') + await user.keyboard('{Enter}') + expect(parent).toHaveAttribute('aria-selected', 'true') + expect(tree).toHaveFocus() + }) + + it('supports mouse expansion and reports active re-index progress', async () => { + const user = userEvent.setup() + chunksQuery.data = { + pages: [ + { + items: [ + chunk({ id: 'parent', text: 'Parent node' }), + chunk({ id: 'child', ordinal: 2, parentChunkId: 'parent', text: 'Child node' }), + ], + }, + ], + } + tasksQuery.data = { pages: [{ items: [task({ progressPercent: 45 })] }] } + + render() + + const parent = screen.getByRole('treeitem', { name: /Parent node/ }) + expect(parent).toHaveAttribute('aria-expanded', 'true') + await user.click(parent) + expect(parent).toHaveAttribute('aria-expanded', 'false') + expect(screen.queryByRole('treeitem', { name: /Child node/ })).toBeNull() + expect(screen.getByRole('status')).toHaveTextContent( + 'dataset.newKnowledge.documentReindexProgress:{"progress":"45"}', + ) + expect( + screen.getByRole('button', { name: 'dataset.newKnowledge.reindexDocument' }), + ).toHaveAttribute('data-disabled') + }) + + it('renders missing revision and empty chunk states without issuing a usable chunk request', () => { + documentQuery.data = logicalDocument({ + active: null, + activeRevision: undefined, + status: 'pending', + }) + revisionsQuery.data = { pages: [{ items: [] }] } + + render() + + expect( + screen.getByRole('heading', { name: 'dataset.newKnowledge.documentRevisionMissingTitle' }), + ).toBeInTheDocument() + expect(chunksOptions).not.toHaveBeenCalled() + }) + + it('keeps cached chunks visible when a background refresh fails', async () => { + const user = userEvent.setup() + chunksQuery.data = { pages: [{ items: [chunk({ id: 'cached', text: 'Cached content' })] }] } + chunksQuery.error = new Error('refresh failed') + + render() + + expect(screen.getByRole('treeitem', { name: 'Cached content' })).toBeInTheDocument() + expect(screen.getByRole('heading', { name: 'Cached content' })).toBeInTheDocument() + expect(screen.getByRole('alert')).toHaveTextContent( + 'dataset.newKnowledge.documentChunksLoadError', + ) + expect(screen.getByText('dataset.newKnowledge.documentContentIncomplete')).toBeVisible() + const indexInformation = screen + .getByRole('heading', { name: 'dataset.newKnowledge.indexInformation' }) + .closest('section') + expect(indexInformation).not.toBeNull() + expect(within(indexInformation!).getAllByText('—')).toHaveLength(3) + await user.click(screen.getByRole('button', { name: 'common.operation.retry' })) + expect(chunksQuery.refetch).toHaveBeenCalledOnce() + }) + + it('loads older revisions and always includes the active revision in the selector', async () => { + const user = userEvent.setup() + revisionsQuery.data = { pages: [{ items: [activeRevision({ revision: 2 })] }] } + revisionsQuery.hasNextPage = true + + render() + + await user.click( + screen.getByRole('combobox', { name: 'dataset.newKnowledge.documentRevision' }), + ) + expect(await screen.findByRole('option', { name: /v3/ })).toBeInTheDocument() + await user.click(screen.getByRole('button', { name: 'dataset.newKnowledge.loadMoreRevisions' })) + expect(revisionsQuery.fetchNextPage).toHaveBeenCalledOnce() + }) + + it('restores the selected revision from the URL', () => { + revisionsQuery.data = { + pages: [{ items: [activeRevision({ revision: 2, state: 'superseded' })] }], + } + + render(, { + searchParams: '?revision=2', + }) + + expect( + screen.getByRole('combobox', { name: 'dataset.newKnowledge.documentRevision' }), + ).toHaveTextContent('v2') + expect(infiniteInput(chunksOptions.mock.lastCall?.[0])(null)).toEqual({ + params: { documentId: 'document-1', id: 'space-1', revision: 2 }, + query: { limit: 100 }, + }) + }) + + it('writes revision selection to browser history', async () => { + const user = userEvent.setup() + revisionsQuery.data = { + pages: [{ items: [activeRevision({ revision: 2, state: 'superseded' })] }], + } + const { onUrlUpdate } = render( + , + ) + + await user.click( + screen.getByRole('combobox', { name: 'dataset.newKnowledge.documentRevision' }), + ) + await user.click(await screen.findByRole('option', { name: /v2/ })) + + await waitFor(() => { + const urlUpdate = onUrlUpdate.mock.calls.at(-1)?.[0] + expect(urlUpdate?.searchParams.get('revision')).toBe('2') + expect(urlUpdate?.options.history).toBe('push') + }) + }) + + it('announces revision cursor errors and restores focus when the final page loads', async () => { + const user = userEvent.setup() + revisionsQuery.hasNextPage = true + const rendered = render( + , + ) + const loadMore = screen.getByRole('button', { + name: 'dataset.newKnowledge.loadMoreRevisions', + }) + + await user.click(loadMore) + revisionsQuery.isFetchingNextPage = true + rendered.rerender() + revisionsQuery.isFetchingNextPage = false + revisionsQuery.isFetchNextPageError = true + rendered.rerender() + expect(screen.getByRole('alert')).toHaveTextContent( + 'dataset.newKnowledge.documentRevisionsLoadError', + ) + expect(screen.getByRole('button', { name: 'common.operation.retry' })).toHaveFocus() + + await user.click(screen.getByRole('button', { name: 'common.operation.retry' })) + revisionsQuery.isFetchingNextPage = true + revisionsQuery.isFetchNextPageError = false + rendered.rerender() + revisionsQuery.isFetchingNextPage = false + revisionsQuery.hasNextPage = false + rendered.rerender() + await waitFor(() => + expect( + screen.getByRole('combobox', { name: 'dataset.newKnowledge.documentRevision' }), + ).toHaveFocus(), + ) + }) + + it('finds a document task on later cursor pages and ignores stale revision tasks', async () => { + tasksQuery.data = { + pages: [{ items: [task({ documentId: 'another-document', id: 'another-task' })] }], + } + tasksQuery.hasNextPage = true + const rendered = render( + , + ) + await waitFor(() => expect(tasksQuery.fetchNextPage).toHaveBeenCalledOnce()) + + tasksQuery.hasNextPage = false + tasksQuery.data = { + pages: [{ items: [task({ documentRevision: 2, state: 'failed' })] }], + } + rendered.rerender() + expect(screen.queryByText('dataset.newKnowledge.documentReindexFailed')).toBeNull() + expect( + screen.getByRole('button', { name: 'dataset.newKnowledge.reindexDocument' }), + ).toBeEnabled() + }) + + it('polls only the discovered active task through the single-task contract', () => { + tasksQuery.data = { pages: [{ items: [task({ state: 'running' })] }] } + render() + + expect(taskSnapshotOptions).toHaveBeenCalledWith( + expect.objectContaining({ + enabled: true, + input: { + params: { documentId: 'document-1', id: 'space-1', taskId: 'task-1' }, + }, + refetchInterval: expect.any(Function), + }), + ) + expect(tasksQuery.refetch).not.toHaveBeenCalled() + }) + + it('refreshes the document and content when an active task becomes terminal', async () => { + tasksQuery.data = { pages: [{ items: [task({ state: 'running' })] }] } + const rendered = render( + , + ) + taskSnapshotQuery.data = task({ state: 'succeeded' }) + rendered.rerender() + + await waitFor(() => expect(queryClient.invalidateQueries).toHaveBeenCalledTimes(4)) + }) + + it('virtualizes long trees and bounds their accessible labels', () => { + chunksQuery.data = { + pages: [ + { + items: Array.from({ length: 100 }, (_, index) => + chunk({ id: `chunk-${index}`, ordinal: index + 1, text: `${'x'.repeat(150)}\nbody` }), + ), + }, + ], + } + + render() + + expect(screen.getAllByRole('treeitem')).toHaveLength(12) + expect(screen.getAllByRole('treeitem')[0]).toHaveAccessibleName(`${'x'.repeat(119)}…`) + }) + + it('shows empty chunks, cursor errors, and a real load-more action', async () => { + const user = userEvent.setup() + chunksQuery.data = { pages: [{ items: [], nextCursor: 'next' }] } + chunksQuery.error = new Error('cursor failed') + chunksQuery.hasNextPage = true + chunksQuery.isFetchNextPageError = true + + render() + + expect(screen.getByRole('alert')).toHaveTextContent( + 'dataset.newKnowledge.documentChunksLoadMoreError', + ) + await user.click(screen.getByRole('button', { name: 'common.operation.retry' })) + expect(chunksQuery.fetchNextPage).toHaveBeenCalledOnce() + }) + + it('keeps remaining chunk pages user-controlled and marks partial document statistics', async () => { + const user = userEvent.setup() + chunksQuery.data = { + pages: [{ items: [chunk({ id: 'first', text: 'First chunk' })], nextCursor: 'next' }], + } + chunksQuery.hasNextPage = true + + render() + + expect(chunksQuery.fetchNextPage).not.toHaveBeenCalled() + expect(screen.getByRole('article')).toHaveAttribute('aria-busy', 'true') + expect(screen.getByText('dataset.newKnowledge.documentContentIncomplete')).toBeVisible() + expect(screen.getByRole('heading', { name: 'First chunk' }).closest('section')).toHaveClass( + '[content-visibility:auto]', + ) + await user.click(screen.getByRole('button', { name: 'dataset.newKnowledge.loadMore' })) + expect(chunksQuery.fetchNextPage).toHaveBeenCalledOnce() + }) + + it('moves focus to newly loaded tree content when the last load-more control disappears', async () => { + const user = userEvent.setup() + chunksQuery.data = { + pages: [{ items: [chunk({ id: 'first', text: 'First chunk' })], nextCursor: 'next' }], + } + chunksQuery.hasNextPage = true + const rendered = render( + , + ) + + await user.click(screen.getByRole('button', { name: 'dataset.newKnowledge.loadMore' })) + chunksQuery.isFetchingNextPage = true + rendered.rerender() + chunksQuery.data = { + pages: [ + { items: [chunk({ id: 'first', text: 'First chunk' })] }, + { items: [chunk({ id: 'second', ordinal: 2, text: 'Second chunk' })] }, + ], + } + chunksQuery.hasNextPage = false + chunksQuery.isFetchingNextPage = false + rendered.rerender() + + const tree = screen.getByRole('tree') + await waitFor(() => expect(tree).toHaveFocus()) + expect(tree).toHaveAttribute('aria-activedescendant', 'document-chunk-treeitem-second') + expect(screen.queryByRole('button', { name: 'dataset.newKnowledge.loadMore' })).toBeNull() + }) + + it('distinguishes missing, restricted, and retryable document failures', async () => { + const user = userEvent.setup() + documentQuery.data = undefined + documentQuery.error = { status: 404 } + const rendered = render( + , + ) + expect( + screen.getByRole('heading', { name: 'dataset.newKnowledge.documentNotFoundTitle' }), + ).toBeInTheDocument() + expect(screen.queryByRole('button', { name: 'common.operation.retry' })).toBeNull() + + documentQuery.error = new Error('temporary failure') + rendered.rerender() + await user.click(screen.getByRole('button', { name: 'common.operation.retry' })) + expect(documentQuery.refetch).toHaveBeenCalledOnce() + }) + + it('shows re-index progress and preserves the last ready revision after failure', () => { + tasksQuery.data = { + pages: [ + { + items: [task({ state: 'failed', errorCode: 'PARSER_FAILED', progressPercent: 80 })], + }, + ], + } + chunksQuery.data = { pages: [{ items: [chunk({ id: 'ready-chunk' })] }] } + + render() + + expect(screen.getByRole('alert')).toHaveTextContent( + 'dataset.newKnowledge.documentReindexFailed', + ) + expect(screen.getByText('dataset.newKnowledge.lastReadyRevisionHint')).toBeInTheDocument() + expect(screen.getByRole('heading', { name: 'Parent content' })).toBeInTheDocument() + }) + + it('renders a valid empty file size as zero bytes', () => { + documentQuery.data = logicalDocument({ + active: activeRevision({ sizeBytes: 0 }), + }) + revisionsQuery.data = { pages: [{ items: [activeRevision({ sizeBytes: 0 })] }] } + + render() + + expect(screen.getByText('0 B')).toBeInTheDocument() + }) + + it('starts re-indexing once and disables writes for readonly users', async () => { + const user = userEvent.setup() + const rendered = render( + , + ) + await user.click(screen.getByRole('button', { name: 'dataset.newKnowledge.reindexDocument' })) + + expect(reindexMutation.mutateAsync).toHaveBeenCalledWith({ + body: { documentIds: ['document-1'] }, + params: { id: 'space-1' }, + }) + await waitFor(() => expect(queryClient.invalidateQueries).toHaveBeenCalled()) + + permissionState.keys = ['dataset.acl.readonly'] + rendered.rerender() + const readonlyReindexButton = screen.getByRole('button', { + name: 'dataset.newKnowledge.reindexDocument', + }) + expect(readonlyReindexButton).toHaveAttribute('data-disabled') + expect(readonlyReindexButton).toHaveAccessibleDescription( + 'dataset.newKnowledge.documentPermissionRestricted', + ) + expect(screen.getByText('dataset.newKnowledge.documentPermissionRestricted')).toBeVisible() + }) + + it('guards re-index against rapid repeats and handles a concurrently removed document', async () => { + const user = userEvent.setup() + let resolveReindex: ((value: BulkDocumentReindexResult) => void) | undefined + reindexMutation.mutateAsync.mockImplementationOnce( + () => + new Promise((resolve) => { + resolveReindex = resolve + }), + ) + render() + const button = screen.getByRole('button', { name: 'dataset.newKnowledge.reindexDocument' }) + + await user.dblClick(button) + expect(reindexMutation.mutateAsync).toHaveBeenCalledOnce() + resolveReindex?.(missingReindexResult()) + await waitFor(() => + expect(toastState.error).toHaveBeenCalledWith('dataset.newKnowledge.documentNotFoundTitle'), + ) + expect(toastState.success).not.toHaveBeenCalled() + expect(queryClient.invalidateQueries).toHaveBeenCalledOnce() + expect(queryClient.removeQueries).toHaveBeenCalledOnce() + expect(queryClient.removeQueries).toHaveBeenCalledWith({ + queryKey: ['knowledge-fs', 'document', 'space-1', 'document-1'], + }) + expect( + screen.getByRole('heading', { name: 'dataset.newKnowledge.documentNotFoundTitle' }), + ).toBeInTheDocument() + }) + + it('does not render cached document data after a refetch returns 403 or 404', () => { + documentQuery.error = { status: 404 } + const rendered = render( + , + ) + + expect( + screen.getByRole('heading', { name: 'dataset.newKnowledge.documentNotFoundTitle' }), + ).toBeInTheDocument() + expect(screen.queryByText('sso-enterprise.pdf')).toBeNull() + + documentQuery.error = { status: 403 } + rendered.rerender() + expect(screen.queryByText('sso-enterprise.pdf')).toBeNull() + + const retry = ( + documentOptions.mock.calls.find(([options]) => 'retry' in options)?.[0] as { + retry: (failureCount: number, error: unknown) => boolean + } + ).retry + expect(retry(0, { status: 403 })).toBe(false) + expect(retry(0, { status: 404 })).toBe(false) + expect(retry(0, new Error('temporary'))).toBe(true) + }) + + it('invalidates document content when an accepted re-index first appears as terminal', async () => { + const user = userEvent.setup() + const rendered = render( + , + ) + + await user.click(screen.getByRole('button', { name: 'dataset.newKnowledge.reindexDocument' })) + await waitFor(() => expect(toastState.success).toHaveBeenCalled()) + queryClient.invalidateQueries.mockClear() + tasksQuery.data = { pages: [{ items: [task({ documentRevision: 4, state: 'succeeded' })] }] } + rendered.rerender() + + await waitFor(() => expect(queryClient.invalidateQueries).toHaveBeenCalledTimes(4)) + }) + + it('offers an explicit continuation when task discovery reaches its page limit', async () => { + const user = userEvent.setup() + tasksQuery.data = { + pages: Array.from({ length: 3 }, (_, index) => ({ + items: [task({ documentId: `other-${index}`, id: `other-task-${index}` })], + nextCursor: `cursor-${index}`, + })), + } + tasksQuery.hasNextPage = true + + render() + + const alert = screen.getByRole('alert') + expect(alert).toHaveTextContent('dataset.newKnowledge.documentTaskLookupIncomplete') + expect( + screen.getByRole('button', { name: 'dataset.newKnowledge.reindexDocument' }), + ).toHaveAttribute('data-disabled') + await user.click( + within(alert).getByRole('button', { + name: 'dataset.newKnowledge.continueCheckingTaskStatus', + }), + ) + await waitFor(() => expect(tasksQuery.fetchNextPage).toHaveBeenCalledOnce()) + await waitFor(() => expect(screen.getByRole('heading', { level: 1 })).toHaveFocus()) + }) + + it('keeps re-index visibly busy through invalidation and stale task-list reconciliation', async () => { + const user = userEvent.setup() + let finishInvalidation: (() => void) | undefined + const invalidation = new Promise((resolve) => { + finishInvalidation = resolve + }) + queryClient.invalidateQueries.mockReturnValue(invalidation) + + render() + const button = screen.getByRole('button', { name: 'dataset.newKnowledge.reindexDocument' }) + await user.click(button) + + expect(button).toHaveAttribute('aria-busy', 'true') + expect(reindexMutation.mutateAsync).toHaveBeenCalledOnce() + finishInvalidation?.() + await waitFor(() => expect(toastState.success).toHaveBeenCalled()) + expect(button).toHaveAttribute('aria-busy', 'true') + await user.click(button) + expect(reindexMutation.mutateAsync).toHaveBeenCalledOnce() + }) + + it('does not mistake an earlier failed revision for the newly submitted re-index', async () => { + const user = userEvent.setup() + tasksQuery.data = { + pages: [{ items: [task({ documentRevision: 4, id: 'old-failed', state: 'failed' })] }], + } + render() + const button = screen.getByRole('button', { name: 'dataset.newKnowledge.reindexDocument' }) + + await user.click(button) + await waitFor(() => expect(toastState.success).toHaveBeenCalled()) + expect(button).toHaveAttribute('data-disabled') + await user.click(button) + expect(reindexMutation.mutateAsync).toHaveBeenCalledOnce() + + const discoveryOptions = documentSubmissionTasksOptions.mock.lastCall?.[0] as unknown as { + refetchInterval: (query: { + state: { data?: { items: DocumentProcessingTask[] }; error?: unknown } + }) => number | false + retry: (failureCount: number, error: unknown) => boolean + } + expect(discoveryOptions.refetchInterval({ state: { data: { items: [] } } })).toBe(2000) + expect( + discoveryOptions.refetchInterval({ + state: { data: { items: [task({ documentRevision: 5 })] } }, + }), + ).toBe(false) + expect( + discoveryOptions.refetchInterval({ + state: { data: { items: [] }, error: { status: 403 } }, + }), + ).toBe(false) + expect(discoveryOptions.retry(0, { status: 403 })).toBe(false) + expect(discoveryOptions.retry(0, { status: 404 })).toBe(false) + }) + + it('keeps submission protection while a delayed status recheck is unresolved', async () => { + vi.useFakeTimers() + tasksQuery.data = { + pages: [{ items: [task({ documentRevision: 4, id: 'old-failed', state: 'failed' })] }], + } + let finishTaskRefresh: (() => void) | undefined + tasksQuery.refetch.mockReturnValueOnce( + new Promise((resolve) => { + finishTaskRefresh = resolve + }), + ) + try { + const rendered = render( + , + ) + const reindexButton = screen.getByRole('button', { + name: 'dataset.newKnowledge.reindexDocument', + }) + await act(async () => { + fireEvent.click(reindexButton) + await Promise.resolve() + await Promise.resolve() + }) + submissionTasksQuery.error = new Error('submission discovery failed') + rendered.rerender() + await act(() => vi.advanceTimersByTimeAsync(30000)) + + const alert = screen.getByRole('alert') + expect(alert).toHaveTextContent('dataset.newKnowledge.documentReindexConfirmationDelayed') + const timedOutDiscoveryOptions = documentSubmissionTasksOptions.mock + .lastCall?.[0] as unknown as { + refetchInterval: (query: { + state: { data?: { items: DocumentProcessingTask[] }; error?: unknown } + }) => number | false + } + expect(timedOutDiscoveryOptions.refetchInterval({ state: { data: { items: [] } } })).toBe( + false, + ) + fireEvent.click( + within(alert).getByRole('button', { + name: 'dataset.newKnowledge.checkReindexStatus', + }), + ) + expect(reindexButton).toHaveAttribute('data-disabled') + expect(reindexMutation.mutateAsync).toHaveBeenCalledOnce() + expect(submissionTasksQuery.refetch).toHaveBeenCalledOnce() + + await act(async () => { + finishTaskRefresh?.() + await Promise.resolve() + }) + expect(reindexButton).toHaveAttribute('data-disabled') + expect(screen.getByRole('heading', { level: 1 })).toHaveFocus() + + await act(async () => { + fireEvent.click( + within(alert).getByRole('button', { + name: 'dataset.newKnowledge.retryReindexDocument', + }), + ) + await Promise.resolve() + await Promise.resolve() + }) + expect(reindexMutation.mutateAsync).toHaveBeenCalledTimes(2) + expect(screen.getByRole('heading', { level: 1 })).toHaveFocus() + const discoveryOptions = documentSubmissionTasksOptions.mock.lastCall?.[0] as unknown as { + refetchInterval: (query: { + state: { data?: { items: DocumentProcessingTask[] } } + }) => number | false + } + expect( + discoveryOptions.refetchInterval({ + state: { data: { items: [task({ documentRevision: 4, state: 'failed' })] } }, + }), + ).toBe(2000) + } finally { + vi.useRealTimers() + } + }) + + it('uses a late first task as the baseline while an explicit resubmit is pending', async () => { + vi.useFakeTimers() + tasksQuery.data = { + pages: [{ items: [task({ documentRevision: 4, id: 'old-failed', state: 'failed' })] }], + } + let finishSecondReindex: ((value: BulkDocumentReindexResult) => void) | undefined + try { + const rendered = render( + , + ) + await act(async () => { + fireEvent.click( + screen.getByRole('button', { name: 'dataset.newKnowledge.reindexDocument' }), + ) + await Promise.resolve() + await Promise.resolve() + }) + await act(() => vi.advanceTimersByTimeAsync(30000)) + reindexMutation.mutateAsync.mockImplementationOnce( + () => + new Promise((resolve) => { + finishSecondReindex = resolve + }), + ) + + fireEvent.click( + screen.getByRole('button', { name: 'dataset.newKnowledge.retryReindexDocument' }), + ) + tasksQuery.data = { + pages: [{ items: [task({ documentRevision: 5, id: 'late-first', state: 'running' })] }], + } + rendered.rerender() + await act(async () => { + finishSecondReindex?.(queuedReindexResult()) + await Promise.resolve() + await Promise.resolve() + }) + + const discoveryOptions = documentSubmissionTasksOptions.mock.lastCall?.[0] as unknown as { + refetchInterval: (query: { + state: { data?: { items: DocumentProcessingTask[] }; error?: unknown } + }) => number | false + } + expect( + discoveryOptions.refetchInterval({ + state: { data: { items: [task({ documentRevision: 5, id: 'late-first' })] } }, + }), + ).toBe(2000) + } finally { + vi.useRealTimers() + } + }) + + it('stops first-page submission discovery when task history observes the new task', async () => { + const user = userEvent.setup() + const rendered = render( + , + ) + await user.click(screen.getByRole('button', { name: 'dataset.newKnowledge.reindexDocument' })) + await waitFor(() => expect(toastState.success).toHaveBeenCalled()) + + tasksQuery.data = { + pages: [{ items: [task({ documentRevision: 4, state: 'running' })] }], + } + rendered.rerender() + + expect(documentSubmissionTasksOptions.mock.lastCall?.[0]).toMatchObject({ enabled: false }) + }) + + it('stops snapshot polling and distrusts stale active task data after 403 or 404', async () => { + tasksQuery.data = { pages: [{ items: [task({ state: 'running' })] }] } + taskSnapshotQuery.error = { status: 404 } + const rendered = render( + , + ) + + expect(screen.queryByRole('status')).toBeNull() + const snapshotOptions = taskSnapshotOptions.mock.lastCall?.[0] as { + refetchInterval: (query: { + state: { data?: DocumentProcessingTask; error?: unknown } + }) => number | false + } + expect(snapshotOptions.refetchInterval({ state: { error: { status: 404 } } })).toBe(false) + await waitFor(() => expect(queryClient.invalidateQueries).toHaveBeenCalled()) + + queryClient.invalidateQueries.mockClear() + taskSnapshotQuery.error = { status: 403 } + rendered.rerender() + expect(screen.getByRole('alert')).toHaveTextContent( + 'dataset.newKnowledge.tasksErrorDescription', + ) + expect( + screen.getByRole('button', { name: 'dataset.newKnowledge.reindexDocument' }), + ).toHaveAttribute('data-disabled') + }) + + it('clears both task caches when a submission-discovered task snapshot returns 404', async () => { + submissionTasksQuery.data = { items: [task({ state: 'running' })] } + taskSnapshotQuery.error = { status: 404 } + + const rendered = render( + , + ) + + await waitFor(() => expect(queryClient.invalidateQueries).toHaveBeenCalledTimes(2)) + expect(queryClient.invalidateQueries).toHaveBeenCalledWith({ + queryKey: ['knowledge-fs', 'tasks', 'space-1', 'document-1'], + }) + expect(queryClient.invalidateQueries).toHaveBeenCalledWith({ + queryKey: ['knowledge-fs', 'submission-tasks', 'space-1', 'document-1'], + }) + expect(queryClient.setQueryData).toHaveBeenCalledTimes(2) + + submissionTasksQuery.data = { items: [task({ id: 'missing-task-2', state: 'running' })] } + rendered.rerender() + await waitFor(() => expect(queryClient.invalidateQueries).toHaveBeenCalledTimes(4)) + expect(queryClient.setQueryData).toHaveBeenCalledTimes(4) + + submissionTasksQuery.data = { items: [task({ state: 'running' })] } + rendered.rerender() + await waitFor(() => expect(queryClient.setQueryData).toHaveBeenCalledTimes(4)) + }) + + it('refreshes stale detail and task-list caches for a newer terminal task on revisit', async () => { + tasksQuery.data = { + pages: [{ items: [task({ documentRevision: 4, state: 'succeeded' })] }], + } + render() + + await waitFor(() => expect(queryClient.invalidateQueries).toHaveBeenCalledTimes(4)) + expect(queryClient.invalidateQueries).toHaveBeenCalledWith({ + queryKey: ['knowledge-fs', 'tasks', 'space-1', 'document-1'], + }) + }) + + it('locks local writes during a 403 refresh and restores editor access afterward', async () => { + const user = userEvent.setup() + let finishPermissionRefresh: + | ((value: { data: { dataset: { default_permission_keys: string[] } }; error: null }) => void) + | undefined + permissionState.refresh.mockReturnValueOnce( + new Promise<{ + data: { dataset: { default_permission_keys: string[] } } + error: null + }>((resolve) => { + finishPermissionRefresh = resolve + }), + ) + reindexMutation.mutateAsync.mockRejectedValueOnce({ status: 403 }) + + render() + const button = screen.getByRole('button', { name: 'dataset.newKnowledge.reindexDocument' }) + await user.click(button) + + await waitFor(() => expect(permissionState.refresh).toHaveBeenCalledOnce()) + expect(button).toHaveAttribute('data-disabled') + finishPermissionRefresh?.({ + data: { dataset: { default_permission_keys: ['dataset.acl.edit'] } }, + error: null, + }) + await waitFor(() => expect(button).not.toHaveAttribute('data-disabled')) + }) + + it('keeps the local write lock when permission refresh resolves with an error', async () => { + const user = userEvent.setup() + permissionState.refresh.mockResolvedValueOnce({ + data: { dataset: { default_permission_keys: ['dataset.acl.edit'] } }, + error: new Error('permission refresh failed'), + }) + reindexMutation.mutateAsync.mockRejectedValueOnce({ status: 403 }) + + render() + const button = screen.getByRole('button', { name: 'dataset.newKnowledge.reindexDocument' }) + await user.click(button) + + await waitFor(() => expect(permissionState.refresh).toHaveBeenCalledOnce()) + expect(button).toHaveAttribute('data-disabled') + const alert = screen.getByRole('alert') + expect(alert).toHaveTextContent('dataset.newKnowledge.documentPermissionRestricted') + const retryButton = within(alert).getByRole('button', { name: 'common.operation.retry' }) + await waitFor(() => expect(retryButton).toHaveFocus()) + + permissionState.refresh.mockResolvedValueOnce({ + data: { dataset: { default_permission_keys: ['dataset.acl.edit'] } }, + error: new Error('permission refresh still failing'), + }) + await user.click(retryButton) + await waitFor(() => expect(permissionState.refresh).toHaveBeenCalledTimes(2)) + expect(retryButton).toHaveFocus() + expect(alert).toBeInTheDocument() + + permissionState.refresh.mockResolvedValueOnce({ + data: { dataset: { default_permission_keys: ['dataset.acl.edit'] } }, + error: null, + }) + await user.click(retryButton) + await waitFor(() => expect(permissionState.refresh).toHaveBeenCalledTimes(3)) + await waitFor(() => expect(button).not.toHaveAttribute('data-disabled')) + expect(screen.getByRole('heading', { level: 1 })).toHaveFocus() + }) + + it('disables re-index while the document is deleting', () => { + documentQuery.data = logicalDocument({ status: 'deleting' }) + render() + + expect( + screen.getByRole('button', { name: 'dataset.newKnowledge.reindexDocument' }), + ).toHaveAttribute('data-disabled') + }) + + it('keeps virtual tree focus stable across Home and End and exposes sibling positions', () => { + chunksQuery.data = { + pages: [ + { + items: Array.from({ length: 100 }, (_, index) => + chunk({ id: `chunk-${index}`, ordinal: index + 1, text: `Chunk ${index + 1}` }), + ), + }, + ], + } + render() + const tree = screen.getByRole('tree') + + tree.focus() + fireEvent.keyDown(tree, { key: 'End' }) + expect(tree).toHaveFocus() + expect(tree).toHaveAttribute('aria-activedescendant', 'document-chunk-treeitem-chunk-99') + expect(screen.getByRole('treeitem', { name: 'Chunk 100' })).toHaveAttribute( + 'aria-posinset', + '100', + ) + expect(screen.getByRole('treeitem', { name: 'Chunk 100' })).toHaveAttribute( + 'aria-setsize', + '100', + ) + expect(screen.getByRole('treeitem', { name: 'Chunk 100' })).toHaveClass( + 'ring-state-accent-solid', + ) + fireEvent.keyDown(tree, { key: 'Home' }) + expect(tree).toHaveAttribute('aria-activedescendant', 'document-chunk-treeitem-chunk-0') + }) + + it('keeps focus on a failed chunk load-more retry', async () => { + const user = userEvent.setup() + chunksQuery.data = { + pages: [{ items: [chunk({ id: 'first', text: 'First chunk' })], nextCursor: 'next' }], + } + chunksQuery.hasNextPage = true + const rendered = render( + , + ) + const loadMore = screen.getByRole('button', { name: 'dataset.newKnowledge.loadMore' }) + expect(screen.getByRole('treeitem', { name: 'First chunk' })).toHaveAttribute( + 'aria-setsize', + '-1', + ) + + await user.click(loadMore) + chunksQuery.isFetchingNextPage = true + rendered.rerender() + chunksQuery.isFetchingNextPage = false + chunksQuery.isFetchNextPageError = true + rendered.rerender() + + expect(screen.getByRole('button', { name: 'common.operation.retry' })).toHaveFocus() + }) +}) diff --git a/web/features/new-rag/__tests__/documents-page.spec.tsx b/web/features/new-rag/__tests__/documents-page.spec.tsx index 034bac3812a..53368914ccb 100644 --- a/web/features/new-rag/__tests__/documents-page.spec.tsx +++ b/web/features/new-rag/__tests__/documents-page.spec.tsx @@ -539,6 +539,10 @@ describe('DocumentsPage', () => { const rows = screen.getAllByRole('row').slice(1) expect(within(rows[0]!).getByText('Ready.pdf')).toBeInTheDocument() + expect(screen.getByRole('link', { name: 'Ready.pdf' })).toHaveAttribute( + 'href', + '/datasets/new/space-1/documents/ready', + ) expect(screen.getAllByText('Notion support SOP').length).toBeGreaterThan(0) expect(screen.getAllByText('v2').length).toBeGreaterThan(0) for (const status of ['ready', 'queued', 'processing', 'failed', 'disabled']) diff --git a/web/features/new-rag/__tests__/routes.spec.ts b/web/features/new-rag/__tests__/routes.spec.ts new file mode 100644 index 00000000000..e7b1adb5b3e --- /dev/null +++ b/web/features/new-rag/__tests__/routes.spec.ts @@ -0,0 +1,65 @@ +import { + newKnowledgeAddSourcePath, + normalizeWebsiteSourceUrl, + parseNewKnowledgeSourceDraft, + singleSearchParam, +} from '../routes' + +describe('New RAG routes', () => { + it('keeps source details out of the add-source URL', () => { + expect(newKnowledgeAddSourcePath('space-1', 'websiteCrawl', 'opaque-draft-key')).toBe( + '/datasets/new/space-1/sources/new?type=websiteCrawl&draft=opaque-draft-key', + ) + }) + + it('rejects repeated search parameters instead of selecting an ambiguous value', () => { + expect(singleSearchParam(['websiteCrawl', 'onlineDrive'])).toBeUndefined() + expect(singleSearchParam('websiteCrawl')).toBe('websiteCrawl') + }) + + it('rejects credentials embedded in website URLs', () => { + expect(normalizeWebsiteSourceUrl('https://user:secret@docs.dify.ai')).toBeUndefined() + expect(normalizeWebsiteSourceUrl('https://docs.dify.ai/docs#intro')?.toString()).toBe( + 'https://docs.dify.ai/docs', + ) + }) + + it('rejects malformed session drafts', () => { + expect(parseNewKnowledgeSourceDraft('{')).toBeUndefined() + expect( + parseNewKnowledgeSourceDraft( + JSON.stringify({ + includeSubpages: true, + maxPages: 201, + provider: 'Firecrawl', + rootUrl: 'https://docs.dify.ai', + sourceName: 'Dify docs', + sourceType: 'websiteCrawl', + syncPolicy: 'provider', + }), + ), + ).toBeUndefined() + }) + + it('migrates a valid website draft saved before source discriminators were added', () => { + expect( + parseNewKnowledgeSourceDraft( + JSON.stringify({ + includeSubpages: false, + maxPages: 25, + provider: 'Firecrawl', + rootUrl: 'https://docs.dify.ai', + sourceName: 'Dify docs', + }), + ), + ).toEqual({ + includeSubpages: false, + maxPages: 25, + provider: 'Firecrawl', + rootUrl: 'https://docs.dify.ai', + sourceName: 'Dify docs', + sourceType: 'websiteCrawl', + syncPolicy: 'provider', + }) + }) +}) diff --git a/web/features/new-rag/document-chunk-detail.tsx b/web/features/new-rag/document-chunk-detail.tsx new file mode 100644 index 00000000000..1c770a31d66 --- /dev/null +++ b/web/features/new-rag/document-chunk-detail.tsx @@ -0,0 +1,291 @@ +import type { + DocumentRevisionChunk, + LogicalDocument, + LogicalDocumentRevision, +} from '@dify/contracts/knowledge-fs/types.gen' +import { Button } from '@langgenius/dify-ui/button' +import { toast } from '@langgenius/dify-ui/toast' +import copy from 'copy-to-clipboard' +import { useEffect, useMemo } from 'react' +import { useTranslation } from 'react-i18next' +import { + chunkCharacterCount, + chunkContentParts, + chunkMetadataEntries, +} from './document-detail-model' + +function formatBytes(bytes: number, locale: string) { + const numberFormat = new Intl.NumberFormat(locale, { maximumFractionDigits: 1 }) + if (bytes < 1024) return `${numberFormat.format(bytes)} B` + const units = ['KB', 'MB', 'GB'] + let value = bytes / 1024 + let unit = units[0] + for (let index = 1; index < units.length && value >= 1024; index++) { + value /= 1024 + unit = units[index] + } + return `${new Intl.NumberFormat(locale, { + maximumFractionDigits: value >= 10 ? 0 : 1, + }).format(value)} ${unit}` +} + +function formatDate(value: string | undefined, locale: string) { + if (!value) return '—' + const date = new Date(value) + if (Number.isNaN(date.getTime())) return value + return new Intl.DateTimeFormat(locale, { + dateStyle: 'medium', + timeStyle: 'short', + }).format(date) +} + +export function DocumentChunkDetail({ + document, + chunks, + chunksComplete, + locale, + revision, + selectedChunkId, +}: { + document: LogicalDocument + chunks: DocumentRevisionChunk[] + chunksComplete: boolean + locale: string + revision?: Exclude + selectedChunkId?: string +}) { + const { t } = useTranslation('dataset') + const { t: tCommon } = useTranslation('common') + const selectedChunk = useMemo( + () => chunks.find((chunk) => chunk.id === selectedChunkId) ?? chunks[0], + [chunks, selectedChunkId], + ) + const characterCount = useMemo( + () => chunks.reduce((total, chunk) => total + chunkCharacterCount(chunk.text), 0), + [chunks], + ) + const averageChunkLength = chunks.length ? Math.round(characterCount / chunks.length) : 0 + const sizeBytes = revision?.sizeBytes ?? document.active?.sizeBytes + const sourceName = + typeof document.userMetadata.sourceName === 'string' + ? document.userMetadata.sourceName + : undefined + const retrievalCount = + typeof document.userMetadata.retrievalCount === 'number' + ? document.userMetadata.retrievalCount + : undefined + + useEffect(() => { + if (!selectedChunkId) return + globalThis.document + ?.getElementById(`document-chunk-${selectedChunkId}`) + ?.scrollIntoView({ block: 'nearest' }) + }, [selectedChunkId]) + + return ( + <> +
+ {!chunksComplete && ( +

+ {t(($) => $['newKnowledge.documentContentIncomplete'])} +

+ )} + {chunks.length ? ( +
+ {chunks.map((chunk) => { + const content = chunkContentParts(chunk.text) + return ( +
+
+
+

+ {content.heading || + t(($) => $['newKnowledge.chunkHeading'], { position: chunk.ordinal })} +

+

+ {t(($) => $['newKnowledge.chunkLocation'], { position: chunk.ordinal })} +

+
+ +
+ {content.body && ( +

+ {content.body} +

+ )} + {!chunk.text && ( +

+ {t(($) => $['newKnowledge.emptyChunk'])} +

+ )} +
+ ) + })} +
+ ) : ( +
+ {t(($) => $['newKnowledge.selectChunk'])} +
+ )} +
+ + + + ) +} diff --git a/web/features/new-rag/document-chunk-tree.tsx b/web/features/new-rag/document-chunk-tree.tsx new file mode 100644 index 00000000000..3fbeff8b56d --- /dev/null +++ b/web/features/new-rag/document-chunk-tree.tsx @@ -0,0 +1,277 @@ +'use client' + +import type { DocumentChunkTree } from './document-detail-model' +import { Button } from '@langgenius/dify-ui/button' +import { cn } from '@langgenius/dify-ui/cn' +import { defaultRangeExtractor, useVirtualizer } from '@tanstack/react-virtual' +import { useEffect, useMemo, useRef, useState } from 'react' +import { useTranslation } from 'react-i18next' +import Loading from '@/app/components/base/loading' +import { chunkTreeLabel, visibleDocumentChunkNodes } from './document-detail-model' + +const VIRTUALIZATION_THRESHOLD = 80 +const TREE_ROW_HEIGHT = 32 + +export function DocumentChunkTreePanel({ + chunkCount, + error, + fetchNextPage, + hasNextPage, + isFetchNextPageError, + isFetchingNextPage, + isPending, + onRetry, + onSelectChunk, + selectedChunkId, + tree, +}: { + chunkCount: number + error: boolean + fetchNextPage: () => Promise + hasNextPage: boolean + isFetchNextPageError: boolean + isFetchingNextPage: boolean + isPending: boolean + onRetry: () => void + onSelectChunk: (chunkId: string) => void + selectedChunkId?: string + tree: DocumentChunkTree +}) { + const { t } = useTranslation('dataset') + const { t: tCommon } = useTranslation('common') + const [collapsedChunkIds, setCollapsedChunkIds] = useState>(() => new Set()) + const [focusedChunkId, setFocusedChunkId] = useState() + const [treeHasFocus, setTreeHasFocus] = useState(false) + const treeScrollRef = useRef(null) + const loadMoreRequestedRef = useRef(false) + const chunkIdsBeforeLoadRef = useRef>(new Set()) + const wasFetchingNextPageRef = useRef(false) + const expandedChunkIds = useMemo( + () => new Set([...tree.byId.keys()].filter((id) => !collapsedChunkIds.has(id))), + [collapsedChunkIds, tree.byId], + ) + const visibleNodes = useMemo( + () => visibleDocumentChunkNodes(tree.roots, expandedChunkIds), + [expandedChunkIds, tree.roots], + ) + const shouldVirtualize = visibleNodes.length > VIRTUALIZATION_THRESHOLD + const currentFocusedChunkId = focusedChunkId ?? visibleNodes[0]?.node.chunk.id + const focusedIndex = visibleNodes.findIndex( + (item) => item.node.chunk.id === currentFocusedChunkId, + ) + const rowVirtualizer = useVirtualizer({ + count: shouldVirtualize ? visibleNodes.length : 0, + estimateSize: () => TREE_ROW_HEIGHT, + getItemKey: (index) => visibleNodes[index]?.node.chunk.id ?? index, + getScrollElement: () => treeScrollRef.current, + overscan: 8, + rangeExtractor: (range) => { + const indexes = defaultRangeExtractor(range) + if (focusedIndex >= 0 && !indexes.includes(focusedIndex)) indexes.push(focusedIndex) + return indexes.sort((left, right) => left - right) + }, + }) + const rowVirtualizerRef = useRef(rowVirtualizer) + rowVirtualizerRef.current = rowVirtualizer + const virtualRows = rowVirtualizer.getVirtualItems() + + const toggleExpanded = (chunkId: string) => { + setCollapsedChunkIds((current) => { + const next = new Set(current) + if (next.has(chunkId)) next.delete(chunkId) + else next.add(chunkId) + return next + }) + } + + const focusChunk = (chunkId: string) => { + const index = visibleNodes.findIndex((item) => item.node.chunk.id === chunkId) + if (index < 0) return + setFocusedChunkId(chunkId) + if (shouldVirtualize) rowVirtualizer.scrollToIndex(index, { align: 'auto' }) + treeScrollRef.current?.focus() + } + + const handleTreeKeyDown = (event: React.KeyboardEvent) => { + const chunkId = currentFocusedChunkId + if (!chunkId) return + const index = visibleNodes.findIndex((item) => item.node.chunk.id === chunkId) + const current = visibleNodes[index] + if (!current) return + const parentId = current.node.chunk.parentChunkId + let nextId: string | undefined + if (event.key === 'ArrowDown') nextId = visibleNodes[index + 1]?.node.chunk.id + else if (event.key === 'ArrowUp') nextId = visibleNodes[index - 1]?.node.chunk.id + else if (event.key === 'Home') nextId = visibleNodes[0]?.node.chunk.id + else if (event.key === 'End') nextId = visibleNodes.at(-1)?.node.chunk.id + else if (event.key === 'ArrowRight' && current.node.children.length) { + if (collapsedChunkIds.has(chunkId)) toggleExpanded(chunkId) + else nextId = current.node.children[0]?.chunk.id + } else if (event.key === 'ArrowLeft') { + if (current.node.children.length && !collapsedChunkIds.has(chunkId)) toggleExpanded(chunkId) + else if (parentId && tree.byId.has(parentId)) nextId = parentId + } else if (event.key === 'Enter' || event.key === ' ') onSelectChunk(chunkId) + else return + event.preventDefault() + if (nextId) focusChunk(nextId) + } + + const handleLoadMore = () => { + if (isFetchingNextPage) return + chunkIdsBeforeLoadRef.current = new Set(tree.byId.keys()) + loadMoreRequestedRef.current = true + void fetchNextPage() + } + + useEffect(() => { + if (isFetchingNextPage) wasFetchingNextPageRef.current = true + if (isFetchingNextPage || !wasFetchingNextPageRef.current || !loadMoreRequestedRef.current) + return + wasFetchingNextPageRef.current = false + loadMoreRequestedRef.current = false + if (isFetchNextPageError) return + const firstNewNode = visibleNodes.find( + (item) => !chunkIdsBeforeLoadRef.current.has(item.node.chunk.id), + ) + requestAnimationFrame(() => { + if (!firstNewNode) { + treeScrollRef.current?.focus() + return + } + const chunkId = firstNewNode.node.chunk.id + const index = visibleNodes.findIndex((item) => item.node.chunk.id === chunkId) + setFocusedChunkId(chunkId) + if (shouldVirtualize) rowVirtualizerRef.current.scrollToIndex(index, { align: 'auto' }) + treeScrollRef.current?.focus() + }) + }, [isFetchNextPageError, isFetchingNextPage, shouldVirtualize, visibleNodes]) + + const renderTreeItem = (item: (typeof visibleNodes)[number], style?: React.CSSProperties) => { + const { depth, node, positionInSet, setSize } = item + const { chunk } = node + const hasChildren = node.children.length > 0 + const expanded = !collapsedChunkIds.has(chunk.id) + const label = chunkTreeLabel(chunk.text, chunk.ordinal) + return ( + + ) + } + + return ( + + ) +} diff --git a/web/features/new-rag/document-detail-header.tsx b/web/features/new-rag/document-detail-header.tsx new file mode 100644 index 00000000000..77a591bc728 --- /dev/null +++ b/web/features/new-rag/document-detail-header.tsx @@ -0,0 +1,148 @@ +import type { + LogicalDocument, + LogicalDocumentRevision, +} from '@dify/contracts/knowledge-fs/types.gen' +import type { RefObject } from 'react' +import { Button } from '@langgenius/dify-ui/button' +import { + Select, + SelectContent, + SelectItem, + SelectItemIndicator, + SelectItemText, + SelectLabel, + SelectTrigger, +} from '@langgenius/dify-ui/select' +import { useEffect, useRef } from 'react' +import { useTranslation } from 'react-i18next' +import Link from '@/next/link' + +export function DocumentDetailHeader({ + backPath, + document, + effectiveRevision, + fetchNextRevisionPage, + hasNextRevisionPage, + isFetchNextRevisionPageError, + isFetchingNextRevisionPage, + onReindex, + onRevisionChange, + reindexDisabled, + reindexDisabledReasonId, + reindexing, + revisions, + taskIsActive, + titleRef, +}: { + backPath: string + document: LogicalDocument + effectiveRevision?: number + fetchNextRevisionPage: () => void + hasNextRevisionPage: boolean + isFetchNextRevisionPageError: boolean + isFetchingNextRevisionPage: boolean + onReindex: () => void + onRevisionChange: (revision: number) => void + reindexDisabled: boolean + reindexDisabledReasonId?: string + reindexing: boolean + revisions: Array> + taskIsActive: boolean + titleRef: RefObject +}) { + const { t } = useTranslation('dataset') + const { t: tCommon } = useTranslation('common') + const revisionTriggerRef = useRef(null) + const loadMoreRequestedRef = useRef(false) + const wasFetchingNextPageRef = useRef(false) + useEffect(() => { + if (isFetchingNextRevisionPage) wasFetchingNextPageRef.current = true + if ( + isFetchingNextRevisionPage || + !wasFetchingNextPageRef.current || + !loadMoreRequestedRef.current + ) + return + wasFetchingNextPageRef.current = false + loadMoreRequestedRef.current = false + if (!isFetchNextRevisionPageError && !hasNextRevisionPage) revisionTriggerRef.current?.focus() + }, [hasNextRevisionPage, isFetchNextRevisionPageError, isFetchingNextRevisionPage]) + + return ( + <> + + + {t(($) => $['newKnowledge.documents'])} + +
+
+

+ {document.title} +

+
+
+ {revisions.length > 0 && effectiveRevision !== undefined && ( + + )} + {(hasNextRevisionPage || isFetchNextRevisionPageError) && ( + + )} + +
+
+ {isFetchNextRevisionPageError && ( +

+ {t(($) => $['newKnowledge.documentRevisionsLoadError'])} +

+ )} + + ) +} diff --git a/web/features/new-rag/document-detail-model.ts b/web/features/new-rag/document-detail-model.ts new file mode 100644 index 00000000000..dbbfa7170d4 --- /dev/null +++ b/web/features/new-rag/document-detail-model.ts @@ -0,0 +1,178 @@ +import type { + DocumentRevisionChunk, + LogicalDocument, + LogicalDocumentRevision, +} from '@dify/contracts/knowledge-fs/types.gen' + +export type DocumentChunkTreeNode = { + children: DocumentChunkTreeNode[] + chunk: DocumentRevisionChunk +} + +export type DocumentChunkTree = { + byId: Map + roots: DocumentChunkTreeNode[] +} + +export function responseStatus(error: unknown): number | undefined { + if (error instanceof Response) return error.status + if (error && typeof error === 'object' && 'status' in error) + return typeof error.status === 'number' ? error.status : undefined + if (error && typeof error === 'object' && 'data' in error) { + const data = error.data + if (data && typeof data === 'object' && 'status' in data) + return typeof data.status === 'number' ? data.status : undefined + } +} + +function compareChunks(left: DocumentRevisionChunk, right: DocumentRevisionChunk) { + return left.ordinal - right.ordinal || left.id.localeCompare(right.id) +} + +function cyclicChunkIds(chunksById: Map) { + const cycleIds = new Set() + const settledIds = new Set() + + for (const chunkId of chunksById.keys()) { + if (settledIds.has(chunkId)) continue + const path: string[] = [] + const pathIndexes = new Map() + let candidateId: string | undefined = chunkId + while (candidateId && chunksById.has(candidateId) && !settledIds.has(candidateId)) { + const cycleStart = pathIndexes.get(candidateId) + if (cycleStart !== undefined) { + for (const cycleId of path.slice(cycleStart)) cycleIds.add(cycleId) + break + } + pathIndexes.set(candidateId, path.length) + path.push(candidateId) + candidateId = chunksById.get(candidateId)?.parentChunkId + } + for (const pathId of path) settledIds.add(pathId) + } + + return cycleIds +} + +export function buildDocumentChunkTree(chunks: DocumentRevisionChunk[]): DocumentChunkTree { + const sortedChunks = [...chunks].sort(compareChunks) + const chunksById = new Map(sortedChunks.map((chunk) => [chunk.id, chunk])) + const cycleIds = cyclicChunkIds(chunksById) + const byId = new Map( + sortedChunks.map((chunk) => [ + chunk.id, + { children: [], chunk } satisfies DocumentChunkTreeNode, + ]), + ) + const roots: DocumentChunkTreeNode[] = [] + + for (const chunk of sortedChunks) { + const node = byId.get(chunk.id)! + const parentId = chunk.parentChunkId + const parent = parentId ? byId.get(parentId) : undefined + if (!parent || !parentId || cycleIds.has(chunk.id)) roots.push(node) + else parent.children.push(node) + } + + for (const node of byId.values()) + node.children.sort((left, right) => compareChunks(left.chunk, right.chunk)) + roots.sort((left, right) => compareChunks(left.chunk, right.chunk)) + return { byId, roots } +} + +export function visibleDocumentChunkNodes( + roots: DocumentChunkTreeNode[], + expandedChunkIds: Set, +) { + const visible: Array<{ + depth: number + node: DocumentChunkTreeNode + positionInSet: number + setSize: number + }> = [] + const pending = roots + .map((node, index) => ({ + depth: 0, + node, + positionInSet: index + 1, + setSize: roots.length, + })) + .reverse() + while (pending.length) { + const item = pending.pop()! + const { depth, node } = item + visible.push(item) + if (!expandedChunkIds.has(node.chunk.id)) continue + for (let index = node.children.length - 1; index >= 0; index--) + pending.push({ + depth: depth + 1, + node: node.children[index]!, + positionInSet: index + 1, + setSize: node.children.length, + }) + } + return visible +} + +export function initialDocumentRevision( + document: LogicalDocument, + revisions: LogicalDocumentRevision[], +) { + const activeRevision = document.activeRevision ?? document.active?.revision + if (activeRevision !== undefined) return activeRevision + return revisions + .filter((revision) => revision?.state === 'active' || revision?.state === 'superseded') + .reduce( + (latest, revision) => + revision && (latest === undefined || revision.revision > latest) + ? revision.revision + : latest, + undefined, + ) +} + +export function chunkTreeLabel(text: string, ordinal: number) { + const firstLine = text.split(/\r?\n/, 1)[0]?.trim() + if (!firstLine) return `#${ordinal}` + const graphemes: string[] = [] + for (const { segment } of new Intl.Segmenter(undefined, { + granularity: 'grapheme', + }).segment(firstLine)) { + graphemes.push(segment) + if (graphemes.length > 120) break + } + return graphemes.length > 120 ? `${graphemes.slice(0, 119).join('')}…` : firstLine +} + +export function chunkContentParts(text: string) { + const lineBreak = text.search(/\r?\n/) + if (lineBreak < 0) return { body: '', heading: text } + return { + body: text.slice(lineBreak).trimStart(), + heading: text.slice(0, lineBreak).trim(), + } +} + +export function chunkCharacterCount(text: string) { + let count = 0 + for (const _segment of new Intl.Segmenter(undefined, { granularity: 'grapheme' }).segment(text)) + count++ + return count +} + +function metadataValue(value: unknown) { + if (typeof value === 'string') return value + if (typeof value === 'number' || typeof value === 'boolean' || value === null) + return String(value) + try { + return JSON.stringify(value) ?? '' + } catch { + return String(value) + } +} + +export function chunkMetadataEntries(metadata: Record) { + return Object.entries(metadata) + .sort(([left], [right]) => left.localeCompare(right)) + .map(([key, value]) => [key, metadataValue(value)] as const) +} diff --git a/web/features/new-rag/document-detail-page.tsx b/web/features/new-rag/document-detail-page.tsx new file mode 100644 index 00000000000..372dc4a7a9a --- /dev/null +++ b/web/features/new-rag/document-detail-page.tsx @@ -0,0 +1,256 @@ +'use client' + +import { Button } from '@langgenius/dify-ui/button' +import { useInfiniteQuery, useQuery } from '@tanstack/react-query' +import { useAtomValue } from 'jotai' +import { createParser, useQueryState } from 'nuqs' +import { useMemo, useRef } from 'react' +import { useTranslation } from 'react-i18next' +import Loading from '@/app/components/base/loading' +import { datasetDefaultPermissionKeysAtom } from '@/context/permission-state' +import { consoleQuery } from '@/service/client' +import { DatasetACLPermission, hasPermission } from '@/utils/permission' +import { DocumentDetailHeader } from './document-detail-header' +import { initialDocumentRevision, responseStatus } from './document-detail-model' +import { DocumentDetailStatus } from './document-detail-status' +import { DocumentRevisionContent } from './document-revision-content' +import { newKnowledgeDocumentsPath } from './routes' +import { useDocumentReindex } from './use-document-reindex' + +const REVISION_PAGE_SIZE = 50 +const REINDEX_RESTRICTION_ID = 'document-reindex-restriction' +const documentRevisionParser = createParser({ + parse: (value) => { + const revision = Number(value) + return Number.isInteger(revision) && revision > 0 ? revision : null + }, + serialize: String, +}).withOptions({ history: 'push' }) + +function ErrorState({ + description, + onRetry, + title, +}: { + description: string + onRetry?: () => void + title: string +}) { + const { t: tCommon } = useTranslation('common') + return ( +
+ +

{title}

+

{description}

+ {onRetry && ( + + )} +
+ ) +} + +export function DocumentDetailPage({ + documentId, + knowledgeSpaceId, +}: { + documentId: string + knowledgeSpaceId: string +}) { + const { i18n, t } = useTranslation('dataset') + const { t: tCommon } = useTranslation('common') + const permissionKeys = useAtomValue(datasetDefaultPermissionKeysAtom) + const [selectedRevision, setSelectedRevision] = useQueryState('revision', documentRevisionParser) + const titleRef = useRef(null) + + const documentQueryOptions = useMemo( + () => + consoleQuery.knowledgeFs.getKnowledgeSpacesByIdLogicalDocumentsByDocumentId.queryOptions({ + input: { params: { documentId, id: knowledgeSpaceId } }, + retry: (failureCount, error) => { + const status = responseStatus(error) + return status !== 403 && status !== 404 && failureCount < 2 + }, + }), + [documentId, knowledgeSpaceId], + ) + const documentQuery = useQuery(documentQueryOptions) + const revisionsQueryOptions = useMemo( + () => + consoleQuery.knowledgeFs.getKnowledgeSpacesByIdDocumentsByDocumentIdRevisions.infiniteOptions( + { + input: (pageParam) => ({ + params: { documentId, id: knowledgeSpaceId }, + query: { + limit: REVISION_PAGE_SIZE, + ...(typeof pageParam === 'string' ? { cursor: pageParam } : {}), + }, + }), + getNextPageParam: (lastPage) => lastPage.nextCursor, + initialPageParam: null as string | null, + }, + ), + [documentId, knowledgeSpaceId], + ) + const revisionsQuery = useInfiniteQuery(revisionsQueryOptions) + const revisions = useMemo( + () => revisionsQuery.data?.pages.flatMap((page) => page.items).filter(Boolean) ?? [], + [revisionsQuery.data], + ) + const availableRevisions = useMemo(() => { + const byRevision = new Map(revisions.map((revision) => [revision.revision, revision])) + if (documentQuery.data?.active) + byRevision.set(documentQuery.data.active.revision, documentQuery.data.active) + return [...byRevision.values()].sort((left, right) => right.revision - left.revision) + }, [documentQuery.data?.active, revisions]) + const effectiveRevision = documentQuery.data + ? (selectedRevision ?? initialDocumentRevision(documentQuery.data, availableRevisions)) + : undefined + const chunksQueryKey = + consoleQuery.knowledgeFs.getKnowledgeSpacesByIdDocumentsByDocumentIdRevisionsByRevisionChunks.key() + const documentActiveRevision = + documentQuery.data?.activeRevision ?? documentQuery.data?.active?.revision ?? 0 + const documentErrorStatus = responseStatus(documentQuery.error) + const { + continueLookup, + documentMissing, + isFetchingNextPage: isFetchingNextTaskPage, + isLookingUp: isLookingUpTask, + isPending: tasksPending, + latestTask, + lookupExhausted, + permissionRecoveryBusy, + permissionRecoveryNeeded, + refetch: refetchTasks, + recheckTimedOutSubmission, + reindex, + reindexBusy, + retryTimedOutSubmission, + retryWritePermission, + submissionPending, + submissionRecoveryBusy, + submissionTimedOut, + taskIsActive, + tasksError, + writePermissionRevoked, + } = useDocumentReindex({ + documentActiveRevision, + chunksQueryKey, + documentId, + documentQueryKey: documentQueryOptions.queryKey, + enabled: + Boolean(documentQuery.data) && documentErrorStatus !== 403 && documentErrorStatus !== 404, + knowledgeSpaceId, + revisionsQueryKey: revisionsQueryOptions.queryKey, + }) + const hasEditPermission = hasPermission(permissionKeys, DatasetACLPermission.Edit) + const canEdit = hasEditPermission && !writePermissionRevoked + const activeRevision = availableRevisions.find( + (revision) => revision.revision === effectiveRevision, + ) + const backPath = newKnowledgeDocumentsPath(knowledgeSpaceId) + const locale = i18n.resolvedLanguage ?? i18n.language + + if (documentQuery.isPending) + return ( +
+ + {tCommon(($) => $.loading)} +
+ ) + + if (documentMissing || documentErrorStatus === 403 || documentErrorStatus === 404) + return ( + $['newKnowledge.documentNotFoundDescription'])} + title={t(($) => $['newKnowledge.documentNotFoundTitle'])} + /> + ) + + if (!documentQuery.data) { + return ( + $['newKnowledge.documentLoadErrorDescription'])} + onRetry={() => void documentQuery.refetch()} + title={t(($) => $['newKnowledge.documentLoadErrorTitle'])} + /> + ) + } + + const document = documentQuery.data + return ( +
+ void revisionsQuery.fetchNextPage()} + hasNextRevisionPage={revisionsQuery.hasNextPage} + isFetchNextRevisionPageError={revisionsQuery.isFetchNextPageError} + isFetchingNextRevisionPage={revisionsQuery.isFetchingNextPage} + onReindex={() => void reindex()} + onRevisionChange={(revision) => void setSelectedRevision(revision)} + reindexDisabled={ + !canEdit || + reindexBusy || + submissionPending || + taskIsActive || + tasksPending || + isFetchingNextTaskPage || + isLookingUpTask || + lookupExhausted || + document.status === 'deleting' || + Boolean(tasksError) + } + reindexDisabledReasonId={!hasEditPermission ? REINDEX_RESTRICTION_ID : undefined} + reindexing={reindexBusy || submissionPending} + revisions={availableRevisions} + taskIsActive={taskIsActive} + titleRef={titleRef} + /> + {!hasEditPermission && ( +

+ {t(($) => $['newKnowledge.documentPermissionRestricted'])} +

+ )} + + void revisionsQuery.refetch()} + refetchTasks={() => void refetchTasks()} + retryTimedOutSubmission={retryTimedOutSubmission} + retryWritePermission={retryWritePermission} + revisionHistoryBackgroundError={Boolean( + revisionsQuery.error && !revisionsQuery.isFetchNextPageError, + )} + submissionRecoveryBusy={submissionRecoveryBusy} + submissionTimedOut={submissionTimedOut} + taskIsActive={taskIsActive} + tasksError={Boolean(tasksError)} + titleRef={titleRef} + /> + + void revisionsQuery.refetch()} + /> +
+ ) +} diff --git a/web/features/new-rag/document-detail-queries.ts b/web/features/new-rag/document-detail-queries.ts new file mode 100644 index 00000000000..c504e8229c3 --- /dev/null +++ b/web/features/new-rag/document-detail-queries.ts @@ -0,0 +1,28 @@ +import { consoleQuery } from '@/service/client' + +const CHUNK_PAGE_SIZE = 100 + +export function documentChunksQueryOptions({ + documentId, + effectiveRevision, + knowledgeSpaceId, +}: { + documentId: string + effectiveRevision: number + knowledgeSpaceId: string +}) { + const chunksQuery = + consoleQuery.knowledgeFs.getKnowledgeSpacesByIdDocumentsByDocumentIdRevisionsByRevisionChunks + + return chunksQuery.infiniteOptions({ + input: (pageParam) => ({ + params: { documentId, id: knowledgeSpaceId, revision: effectiveRevision }, + query: { + limit: CHUNK_PAGE_SIZE, + ...(typeof pageParam === 'string' ? { cursor: pageParam } : {}), + }, + }), + getNextPageParam: (lastPage) => lastPage.nextCursor, + initialPageParam: null as string | null, + }) +} diff --git a/web/features/new-rag/document-detail-status.tsx b/web/features/new-rag/document-detail-status.tsx new file mode 100644 index 00000000000..23c2118f6f8 --- /dev/null +++ b/web/features/new-rag/document-detail-status.tsx @@ -0,0 +1,187 @@ +import type { DocumentProcessingTask } from '@dify/contracts/knowledge-fs/types.gen' +import type { RefObject } from 'react' +import { Button } from '@langgenius/dify-ui/button' +import { useEffect, useRef } from 'react' +import { useTranslation } from 'react-i18next' + +export function DocumentDetailStatus({ + continueLookup, + effectiveRevision, + isLookingUpTask, + latestTask, + locale, + lookupExhausted, + permissionRecoveryBusy, + permissionRecoveryNeeded, + recheckTimedOutSubmission, + refetchRevisions, + refetchTasks, + retryTimedOutSubmission, + retryWritePermission, + revisionHistoryBackgroundError, + submissionRecoveryBusy, + submissionTimedOut, + taskIsActive, + tasksError, + titleRef, +}: { + continueLookup: () => void + effectiveRevision?: number + isLookingUpTask: boolean + latestTask?: DocumentProcessingTask + locale: string + lookupExhausted: boolean + permissionRecoveryBusy: boolean + permissionRecoveryNeeded: boolean + recheckTimedOutSubmission: () => Promise + refetchRevisions: () => void + refetchTasks: () => void + retryTimedOutSubmission: () => Promise + retryWritePermission: () => Promise + revisionHistoryBackgroundError: boolean + submissionRecoveryBusy: boolean + submissionTimedOut: boolean + taskIsActive: boolean + tasksError: boolean + titleRef: RefObject +}) { + const { t } = useTranslation('dataset') + const { t: tCommon } = useTranslation('common') + const permissionRetryRef = useRef(null) + const permissionRecoveryWasNeededRef = useRef(false) + + useEffect(() => { + if (permissionRecoveryNeeded && !permissionRecoveryWasNeededRef.current) + requestAnimationFrame(() => permissionRetryRef.current?.focus()) + permissionRecoveryWasNeededRef.current = permissionRecoveryNeeded + }, [permissionRecoveryNeeded]) + + return ( + <> + {taskIsActive && ( +
+ + {t(($) => $['newKnowledge.documentReindexProgress'], { + progress: new Intl.NumberFormat(locale).format(latestTask?.progressPercent ?? 0), + })} +
+ )} + {latestTask?.state === 'failed' && ( +
+

{t(($) => $['newKnowledge.documentReindexFailed'])}

+

+ {t(($) => $['newKnowledge.lastReadyRevisionHint'])} +

+
+ )} + + {tasksError && ( +
+ {t(($) => $['newKnowledge.tasksErrorDescription'])} + +
+ )} + + {permissionRecoveryNeeded && ( +
+ {t(($) => $['newKnowledge.documentPermissionRestricted'])} + +
+ )} + + {(lookupExhausted || isLookingUpTask) && ( +
+ {isLookingUpTask ? ( + + + {tCommon(($) => $.loading)} + + ) : ( + <> + {t(($) => $['newKnowledge.documentTaskLookupIncomplete'])} + + + )} +
+ )} + + {submissionTimedOut && ( +
+ {t(($) => $['newKnowledge.documentReindexConfirmationDelayed'])} +
+ + +
+
+ )} + + {revisionHistoryBackgroundError && effectiveRevision !== undefined && ( +
+ {t(($) => $['newKnowledge.documentRevisionsLoadError'])} + +
+ )} + + ) +} diff --git a/web/features/new-rag/document-list.tsx b/web/features/new-rag/document-list.tsx index 1192627963c..780313270fe 100644 --- a/web/features/new-rag/document-list.tsx +++ b/web/features/new-rag/document-list.tsx @@ -18,6 +18,7 @@ import { memo, useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import Loading from '@/app/components/base/loading' import { useFormatTimeFromNow } from '@/hooks/use-format-time-from-now' +import Link from '@/next/link' import { sourceName } from './document-model' export type DocumentFilter = DocumentDisplayStatus | 'all' @@ -85,6 +86,7 @@ function TaskTrigger({ const DocumentRow = memo( ({ document, + documentHref, formatTimeFromNow, onSelectedChange, readOnlyReasonId, @@ -96,6 +98,7 @@ const DocumentRow = memo( statusPending, }: { document: LogicalDocument + documentHref: string formatTimeFromNow: (time: number) => string onSelectedChange: (documentId: string) => void readOnlyReasonId?: string @@ -134,9 +137,13 @@ const DocumentRow = memo( aria-hidden className="i-ri-file-text-line size-[18px] shrink-0 text-text-tertiary" /> - + {document.title} - + {revision !== undefined && ( v{revision} @@ -306,6 +313,7 @@ export function DocumentsList({ completingResults, documents, filter, + getDocumentHref, hasNextPage, hasSelectableDocuments, hasTaskError, @@ -341,6 +349,7 @@ export function DocumentsList({ completingResults: boolean documents: LogicalDocument[] filter: DocumentFilter + getDocumentHref: (documentId: string) => string hasNextPage: boolean hasSelectableDocuments: boolean hasTaskError: boolean @@ -498,6 +507,7 @@ export function DocumentsList({ + revisionHistoryError: boolean + revisionHistoryPending: boolean + retryRevisionHistory: () => void +}) { + const { t } = useTranslation('dataset') + const { t: tCommon } = useTranslation('common') + + if (effectiveRevision === undefined && revisionHistoryPending) + return ( +
+ +
+ ) + + if (effectiveRevision === undefined && revisionHistoryError) + return ( +
+ +

+ {t(($) => $['newKnowledge.documentLoadErrorTitle'])} +

+

+ {t(($) => $['newKnowledge.documentLoadErrorDescription'])} +

+ +
+ ) + + if (effectiveRevision === undefined) + return ( +
+ +

+ {t(($) => $['newKnowledge.documentRevisionMissingTitle'])} +

+

+ {t(($) => $['newKnowledge.documentRevisionMissingDescription'])} +

+
+ ) + + return ( + + ) +} + +function LoadedDocumentRevisionContent({ + document, + documentId, + effectiveRevision, + knowledgeSpaceId, + locale, + revision, +}: { + document: LogicalDocument + documentId: string + effectiveRevision: number + knowledgeSpaceId: string + locale: string + revision?: Exclude +}) { + const [selectedChunkId, setSelectedChunkId] = useState() + const chunksQueryOptions = useMemo( + () => documentChunksQueryOptions({ documentId, effectiveRevision, knowledgeSpaceId }), + [documentId, effectiveRevision, knowledgeSpaceId], + ) + const chunksQuery = useInfiniteQuery(chunksQueryOptions) + const chunks = useMemo( + () => + [...(chunksQuery.data?.pages.flatMap((page) => page.items) ?? [])].sort( + (left, right) => left.ordinal - right.ordinal || left.id.localeCompare(right.id), + ), + [chunksQuery.data], + ) + const tree = useMemo(() => buildDocumentChunkTree(chunks), [chunks]) + const selectedChunk = + (selectedChunkId ? tree.byId.get(selectedChunkId)?.chunk : undefined) ?? tree.roots[0]?.chunk + + return ( +
+ void chunksQuery.refetch()} + onSelectChunk={setSelectedChunkId} + selectedChunkId={selectedChunk?.id} + tree={tree} + /> + + +
+ ) +} diff --git a/web/features/new-rag/documents-page.tsx b/web/features/new-rag/documents-page.tsx index f869226c15d..b1d20659b1d 100644 --- a/web/features/new-rag/documents-page.tsx +++ b/web/features/new-rag/documents-page.tsx @@ -37,6 +37,7 @@ import { } from './document-model' import { DOCUMENT_UPLOAD_ACCEPT, documentUploadIssue } from './document-upload-policy' import { ProcessingTasksDrawer } from './processing-tasks-drawer' +import { newKnowledgeDocumentDetailPath } from './routes' import { TaskEventObserver } from './task-event-observer' import { createTaskProgressStore } from './task-progress-store' import { useQueryDataUpdateCount } from './use-query-data-update-count' @@ -2125,6 +2126,9 @@ export function DocumentsPage({ knowledgeSpaceId }: { knowledgeSpaceId: string } completingResults={completingFilteredResults} documents={filteredDocuments} filter={filter} + getDocumentHref={(documentId) => + newKnowledgeDocumentDetailPath(knowledgeSpaceId, documentId) + } hasNextPage={Boolean( hasNextDocumentPage || hasNextTaskPage || hasRelevantNextSourcePage, )} diff --git a/web/features/new-rag/knowledge-space-shell.tsx b/web/features/new-rag/knowledge-space-shell.tsx index da19dc78666..22a16844098 100644 --- a/web/features/new-rag/knowledge-space-shell.tsx +++ b/web/features/new-rag/knowledge-space-shell.tsx @@ -3,6 +3,7 @@ import type { ReactNode } from 'react' import { Button } from '@langgenius/dify-ui/button' import { cn } from '@langgenius/dify-ui/cn' +import { toast } from '@langgenius/dify-ui/toast' import { useQuery } from '@tanstack/react-query' import { useTranslation } from 'react-i18next' import Loading from '@/app/components/base/loading' @@ -87,6 +88,7 @@ export function KnowledgeSpaceShell({ const documentsPath = newKnowledgeDocumentsPath(knowledgeSpaceId) const sourcesActive = pathname === sourcesPath || pathname.startsWith(`${sourcesPath}/`) 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' @@ -120,7 +122,9 @@ export function KnowledgeSpaceShell({ {knowledgeSpaceQuery.data.name}

- {t(($) => $['newKnowledge.cardType'])} + {t(($) => $['chunkingMode.parentChild'])} ·{' '} + {t(($) => $['indexingTechnique.high_quality'])} ·{' '} + {t(($) => $['retrieval.semantic_search.title'])}

@@ -129,6 +133,14 @@ export function KnowledgeSpaceShell({ className="flex gap-0.5 overflow-x-auto px-2 py-1 sm:flex-1 sm:flex-col" aria-label={knowledgeSpaceQuery.data.name} > + {t(($) => $['newKnowledge.documents'])} + + + +
diff --git a/web/features/new-rag/routes.ts b/web/features/new-rag/routes.ts index 8644868d450..a96cf3481d0 100644 --- a/web/features/new-rag/routes.ts +++ b/web/features/new-rag/routes.ts @@ -188,6 +188,9 @@ export const newKnowledgeDetailPath = (knowledgeSpaceId: string) => export const newKnowledgeDocumentsPath = (knowledgeSpaceId: string) => `/datasets/new/${knowledgeSpaceId}/documents` +export const newKnowledgeDocumentDetailPath = (knowledgeSpaceId: string, documentId: string) => + `/datasets/new/${knowledgeSpaceId}/documents/${documentId}` + export const newKnowledgeAddSourcePath = ( knowledgeSpaceId: string, sourceType?: NewKnowledgeSourceType, diff --git a/web/features/new-rag/use-document-reindex.ts b/web/features/new-rag/use-document-reindex.ts new file mode 100644 index 00000000000..cc42745791e --- /dev/null +++ b/web/features/new-rag/use-document-reindex.ts @@ -0,0 +1,250 @@ +'use client' + +import { toast } from '@langgenius/dify-ui/toast' +import { useMutation, useQueryClient } from '@tanstack/react-query' +import { useSetAtom } from 'jotai' +import { useEffect, useRef, useState } from 'react' +import { useTranslation } from 'react-i18next' +import { refreshWorkspacePermissionKeysAfterMutationDenialAtom } from '@/context/permission-state' +import { consoleQuery } from '@/service/client' +import { DatasetACLPermission, hasPermission } from '@/utils/permission' +import { responseStatus } from './document-detail-model' +import { useDocumentTaskStatus } from './use-document-task-status' + +const REINDEX_CONFIRMATION_TIMEOUT = 30000 + +export function useDocumentReindex({ + chunksQueryKey, + documentActiveRevision, + documentId, + documentQueryKey, + enabled, + knowledgeSpaceId, + revisionsQueryKey, +}: { + chunksQueryKey: readonly unknown[] + documentActiveRevision: number + documentId: string + documentQueryKey: readonly unknown[] + enabled: boolean + knowledgeSpaceId: string + revisionsQueryKey: readonly unknown[] +}) { + const { t } = useTranslation('dataset') + const queryClient = useQueryClient() + const refreshWorkspacePermissionKeysAfterMutationDenial = useSetAtom( + refreshWorkspacePermissionKeysAfterMutationDenialAtom, + ) + const [writePermissionRevoked, setWritePermissionRevoked] = useState(false) + const [documentMissing, setDocumentMissing] = useState(false) + const [permissionRecoveryBusy, setPermissionRecoveryBusy] = useState(false) + const [permissionRecoveryNeeded, setPermissionRecoveryNeeded] = useState(false) + const [reindexBusy, setReindexBusy] = useState(false) + const [submissionRecoveryBusy, setSubmissionRecoveryBusy] = useState(false) + const [submittedReindex, setSubmittedReindex] = useState<{ + baselineRevision: number + generation: number + timedOut: boolean + }>() + const nextSubmissionGenerationRef = useRef(0) + const permissionRecoveryPendingRef = useRef(false) + const reindexPendingRef = useRef(false) + const previousTaskStateRef = useRef(undefined) + const acceptedTaskIdRef = useRef(undefined) + const invalidatedTerminalTaskRef = useRef(undefined) + const { mutateAsync: reindexDocument } = useMutation( + consoleQuery.knowledgeFs.postKnowledgeSpacesByIdDocumentsBulkReindex.mutationOptions(), + ) + const taskStatus = useDocumentTaskStatus({ + documentId, + enabled, + knowledgeSpaceId, + minimumRevision: submittedReindex + ? submittedReindex.baselineRevision + 1 + : documentActiveRevision, + submissionDiscoveryGeneration: submittedReindex?.generation, + submissionNeedsRecheck: Boolean(submittedReindex), + submissionPending: Boolean(submittedReindex && !submittedReindex.timedOut), + }) + const { latestTask, taskIsActive } = taskStatus + const latestTaskRef = useRef(latestTask) + latestTaskRef.current = latestTask + const submittedTaskObserved = Boolean( + latestTask && + submittedReindex && + latestTask.documentRevision > submittedReindex.baselineRevision, + ) + const submissionPending = Boolean(submittedReindex && !submittedTaskObserved) + + const retryWritePermission = async () => { + if (permissionRecoveryPendingRef.current) return false + permissionRecoveryPendingRef.current = true + setPermissionRecoveryBusy(true) + try { + const result = await refreshWorkspacePermissionKeysAfterMutationDenial() + const refreshedPermissionKeys = result.data?.dataset?.default_permission_keys + if ( + !result.error && + refreshedPermissionKeys && + hasPermission(refreshedPermissionKeys, DatasetACLPermission.Edit) + ) { + setWritePermissionRevoked(false) + setPermissionRecoveryNeeded(false) + return true + } + setPermissionRecoveryNeeded(true) + return false + } catch { + setPermissionRecoveryNeeded(true) + return false + } finally { + permissionRecoveryPendingRef.current = false + setPermissionRecoveryBusy(false) + } + } + + useEffect(() => { + if (!submittedReindex || submittedReindex.timedOut || submittedTaskObserved) return + const timeout = window.setTimeout( + () => + setSubmittedReindex((current) => + current?.baselineRevision === submittedReindex.baselineRevision + ? { ...current, timedOut: true } + : current, + ), + REINDEX_CONFIRMATION_TIMEOUT, + ) + return () => window.clearTimeout(timeout) + }, [submittedReindex, submittedTaskObserved]) + + useEffect(() => { + const previousState = previousTaskStateRef.current + const previousWasActive = + previousState === 'dispatch_pending' || + previousState === 'queued' || + previousState === 'running' || + previousState === 'retry_wait' + previousTaskStateRef.current = latestTask?.state + const taskMatchesAcceptedSubmission = Boolean( + latestTask && + submittedReindex && + latestTask.documentRevision > submittedReindex.baselineRevision, + ) + if (taskMatchesAcceptedSubmission && latestTask) acceptedTaskIdRef.current = latestTask.id + const terminalTaskKey = latestTask ? `${latestTask.id}:${latestTask.updatedAt}` : undefined + const shouldInvalidateTerminalTask = Boolean( + latestTask && + !taskIsActive && + (previousWasActive || + acceptedTaskIdRef.current === latestTask.id || + taskMatchesAcceptedSubmission || + latestTask.documentRevision > documentActiveRevision) && + invalidatedTerminalTaskRef.current !== terminalTaskKey, + ) + if (!shouldInvalidateTerminalTask || !terminalTaskKey) return + invalidatedTerminalTaskRef.current = terminalTaskKey + void Promise.all([ + queryClient.invalidateQueries({ + queryKey: documentQueryKey, + }), + queryClient.invalidateQueries({ + queryKey: revisionsQueryKey, + }), + queryClient.invalidateQueries({ + queryKey: chunksQueryKey, + }), + queryClient.invalidateQueries({ queryKey: taskStatus.queryKey }), + ]) + }, [ + chunksQueryKey, + documentActiveRevision, + documentQueryKey, + latestTask, + queryClient, + revisionsQueryKey, + submittedReindex, + taskIsActive, + taskStatus.queryKey, + ]) + + const reindex = async (baselineRevision = documentActiveRevision) => { + if (reindexPendingRef.current) return + reindexPendingRef.current = true + setReindexBusy(true) + try { + const result = await reindexDocument({ + body: { documentIds: [documentId] }, + params: { id: knowledgeSpaceId }, + }) + if (!result.items[0] || result.items[0].status === 'not_found') { + setDocumentMissing(true) + queryClient.removeQueries({ queryKey: documentQueryKey }) + await queryClient.invalidateQueries({ + queryKey: documentQueryKey, + }) + toast.error(t(($) => $['newKnowledge.documentNotFoundTitle'])) + return + } + setSubmittedReindex({ + baselineRevision: Math.max( + baselineRevision, + documentActiveRevision, + latestTaskRef.current?.documentRevision ?? documentActiveRevision, + ), + generation: ++nextSubmissionGenerationRef.current, + timedOut: false, + }) + await Promise.all([ + queryClient.invalidateQueries({ + queryKey: documentQueryKey, + }), + queryClient.invalidateQueries({ + queryKey: revisionsQueryKey, + }), + queryClient.invalidateQueries({ + queryKey: chunksQueryKey, + }), + queryClient.invalidateQueries({ queryKey: taskStatus.queryKey }), + ]) + toast.success(t(($) => $['newKnowledge.documentsReindexStarted'])) + } catch (error) { + if (responseStatus(error) === 403) { + setWritePermissionRevoked(true) + await retryWritePermission() + } + toast.error(t(($) => $['newKnowledge.documentsReindexFailed'])) + } finally { + reindexPendingRef.current = false + setReindexBusy(false) + } + } + + return { + ...taskStatus, + documentMissing, + permissionRecoveryBusy, + permissionRecoveryNeeded, + reindex, + reindexBusy, + recheckTimedOutSubmission: async () => { + if (submissionRecoveryBusy) return + setSubmissionRecoveryBusy(true) + try { + await taskStatus.refetch() + } finally { + setSubmissionRecoveryBusy(false) + } + }, + retryTimedOutSubmission: async () => { + if (submissionRecoveryBusy) return + const baselineRevision = submittedReindex?.baselineRevision ?? documentActiveRevision + setSubmittedReindex(undefined) + await reindex(baselineRevision) + }, + retryWritePermission, + submissionRecoveryBusy, + submissionPending, + submissionTimedOut: Boolean(submittedReindex?.timedOut && !submittedTaskObserved), + writePermissionRevoked, + } +} diff --git a/web/features/new-rag/use-document-task-status.ts b/web/features/new-rag/use-document-task-status.ts new file mode 100644 index 00000000000..f27544abe0b --- /dev/null +++ b/web/features/new-rag/use-document-task-status.ts @@ -0,0 +1,275 @@ +'use client' + +import type { + DocumentProcessingTask, + DocumentProcessingTaskList, +} from '@dify/contracts/knowledge-fs/types.gen' +import type { InfiniteData } from '@tanstack/react-query' +import { skipToken, useInfiniteQuery, useQuery, useQueryClient } from '@tanstack/react-query' +import { useEffect, useMemo, useRef, useState } from 'react' +import { consoleQuery } from '@/service/client' +import { responseStatus } from './document-detail-model' +import { newestTaskByDocument } from './document-model' + +const TASK_PAGE_SIZE = 100 +const TASK_LOOKUP_PAGE_BATCH = 3 +const ACTIVE_TASK_REFRESH_INTERVAL = 5000 +const SUBMISSION_DISCOVERY_REFRESH_INTERVAL = 2000 + +function documentTaskIsActive(task: DocumentProcessingTask | undefined) { + return ( + task?.state === 'dispatch_pending' || + task?.state === 'queued' || + task?.state === 'running' || + task?.state === 'retry_wait' + ) +} + +export function useDocumentTaskStatus({ + documentId, + enabled, + knowledgeSpaceId, + minimumRevision, + submissionDiscoveryGeneration, + submissionNeedsRecheck, + submissionPending, +}: { + documentId: string + enabled: boolean + knowledgeSpaceId: string + minimumRevision: number + submissionDiscoveryGeneration?: number + submissionNeedsRecheck: boolean + submissionPending: boolean +}) { + const queryClient = useQueryClient() + const completedDiscoveryGenerationRef = useRef(undefined) + const missingTaskIdsRef = useRef(new Set()) + const [lookupPageLimit, setLookupPageLimit] = useState(TASK_LOOKUP_PAGE_BATCH) + const tasksQueryOptions = useMemo( + () => + consoleQuery.knowledgeFs.getKnowledgeSpacesByIdDocumentsByDocumentIdProcessingTasks.infiniteOptions( + { + enabled, + input: (pageParam) => ({ + params: { documentId, id: knowledgeSpaceId }, + query: { + limit: TASK_PAGE_SIZE, + ...(typeof pageParam === 'string' ? { cursor: pageParam } : {}), + }, + }), + getNextPageParam: (lastPage) => lastPage.nextCursor, + initialPageParam: null as string | null, + }, + ), + [documentId, enabled, knowledgeSpaceId], + ) + const tasksQuery = useInfiniteQuery(tasksQueryOptions) + const { + data: tasksData, + error: tasksQueryError, + fetchNextPage, + hasNextPage, + isFetchingNextPage, + isPending, + refetch: refetchTasks, + } = tasksQuery + const historyTasks = useMemo( + () => tasksData?.pages.flatMap((page) => page.items) ?? [], + [tasksData], + ) + const historyHasSubmittedTask = historyTasks.some( + (task) => + !missingTaskIdsRef.current.has(task.id) && + task.documentId === documentId && + task.documentRevision >= minimumRevision, + ) + const submissionTasksQueryOptions = useMemo( + () => + consoleQuery.knowledgeFs.getKnowledgeSpacesByIdDocumentsByDocumentIdProcessingTasks.queryOptions( + { + enabled: enabled && submissionPending && !historyHasSubmittedTask, + input: { + params: { documentId, id: knowledgeSpaceId }, + query: { limit: TASK_PAGE_SIZE }, + }, + refetchInterval: (query) => { + if ( + query.state.error || + !submissionDiscoveryGeneration || + completedDiscoveryGenerationRef.current === submissionDiscoveryGeneration + ) + return false + const hasSubmittedTask = query.state.data?.items.some( + (task) => + !missingTaskIdsRef.current.has(task.id) && + task.documentId === documentId && + task.documentRevision >= minimumRevision, + ) + if (hasSubmittedTask) { + completedDiscoveryGenerationRef.current = submissionDiscoveryGeneration + return false + } + return enabled && submissionPending && !hasSubmittedTask + ? SUBMISSION_DISCOVERY_REFRESH_INTERVAL + : false + }, + refetchOnWindowFocus: false, + retry: (failureCount, error) => { + const status = responseStatus(error) + return status !== 403 && status !== 404 && failureCount < 2 + }, + }, + ), + [ + documentId, + enabled, + historyHasSubmittedTask, + knowledgeSpaceId, + minimumRevision, + submissionDiscoveryGeneration, + submissionPending, + ], + ) + const submissionTasksQuery = useQuery(submissionTasksQueryOptions) + const tasks = useMemo( + () => [...(submissionTasksQuery.data?.items ?? []), ...historyTasks], + [historyTasks, submissionTasksQuery.data], + ) + const discoveredTask = useMemo(() => { + const candidate = newestTaskByDocument( + tasks.filter( + (task) => + !missingTaskIdsRef.current.has(task.id) && + task.documentId === documentId && + task.documentRevision >= minimumRevision, + ), + ).get(documentId) + return candidate && candidate.documentRevision >= minimumRevision ? candidate : undefined + }, [documentId, minimumRevision, tasks]) + const discoveredTaskIsActive = documentTaskIsActive(discoveredTask) + const taskSnapshotQuery = useQuery( + consoleQuery.knowledgeFs.getKnowledgeSpacesByIdDocumentsByDocumentIdProcessingTasksByTaskId.queryOptions( + { + enabled: enabled && discoveredTaskIsActive, + input: + enabled && discoveredTaskIsActive && discoveredTask + ? { + params: { + documentId, + id: knowledgeSpaceId, + taskId: discoveredTask.id, + }, + } + : skipToken, + refetchInterval: (query) => + !query.state.error && documentTaskIsActive(query.state.data ?? discoveredTask) + ? ACTIVE_TASK_REFRESH_INTERVAL + : false, + retry: (failureCount, error) => { + const status = responseStatus(error) + return status !== 403 && status !== 404 && failureCount < 2 + }, + }, + ), + ) + const taskSnapshotErrorStatus = responseStatus(taskSnapshotQuery.error) + const latestTask = + taskSnapshotErrorStatus === 403 || taskSnapshotErrorStatus === 404 + ? undefined + : taskSnapshotQuery.data?.id === discoveredTask?.id + ? taskSnapshotQuery.data + : discoveredTask + const lookupExhausted = Boolean( + !latestTask && hasNextPage && (tasksData?.pages.length ?? 0) >= lookupPageLimit, + ) + + useEffect(() => { + if ( + isPending || + !enabled || + isFetchingNextPage || + tasksQueryError || + latestTask || + !hasNextPage || + lookupExhausted + ) + return + void fetchNextPage() + }, [ + fetchNextPage, + enabled, + hasNextPage, + isFetchingNextPage, + isPending, + latestTask, + lookupExhausted, + tasksQueryError, + ]) + + useEffect(() => { + if ( + taskSnapshotErrorStatus !== 404 || + !discoveredTask || + missingTaskIdsRef.current.has(discoveredTask.id) + ) + return + missingTaskIdsRef.current.add(discoveredTask.id) + if (completedDiscoveryGenerationRef.current === submissionDiscoveryGeneration) + completedDiscoveryGenerationRef.current = undefined + queryClient.setQueryData( + submissionTasksQueryOptions.queryKey, + (current) => + current + ? { ...current, items: current.items.filter((task) => task.id !== discoveredTask.id) } + : current, + ) + queryClient.setQueryData>( + tasksQueryOptions.queryKey, + (current) => + current + ? { + ...current, + pages: current.pages.map((page) => ({ + ...page, + items: page.items.filter((task) => task.id !== discoveredTask.id), + })), + } + : current, + ) + void Promise.all([ + queryClient.invalidateQueries({ queryKey: tasksQueryOptions.queryKey }), + queryClient.invalidateQueries({ queryKey: submissionTasksQueryOptions.queryKey }), + ]) + }, [ + discoveredTask, + queryClient, + submissionDiscoveryGeneration, + submissionTasksQueryOptions.queryKey, + taskSnapshotErrorStatus, + tasksQueryOptions.queryKey, + ]) + + return { + continueLookup: () => setLookupPageLimit((current) => current + TASK_LOOKUP_PAGE_BATCH), + isFetchingNextPage, + isLookingUp: Boolean(!latestTask && hasNextPage && !lookupExhausted), + isPending, + latestTask, + lookupExhausted, + queryKey: tasksQueryOptions.queryKey, + refetch: async () => { + const results = await Promise.all([ + refetchTasks(), + ...(enabled && submissionNeedsRecheck ? [submissionTasksQuery.refetch()] : []), + ...(enabled && discoveredTaskIsActive ? [taskSnapshotQuery.refetch()] : []), + ]) + return results[0] + }, + taskIsActive: documentTaskIsActive(latestTask), + tasksError: + tasksQueryError ?? + (submissionPending && !historyHasSubmittedTask ? submissionTasksQuery.error : undefined) ?? + (taskSnapshotErrorStatus === 404 ? undefined : taskSnapshotQuery.error), + } +} diff --git a/web/i18n/ar-TN/dataset.json b/web/i18n/ar-TN/dataset.json index ac24aadb012..dd57a25022b 100644 --- a/web/i18n/ar-TN/dataset.json +++ b/web/i18n/ar-TN/dataset.json @@ -140,10 +140,12 @@ "newKnowledge.adjustAndRecrawl": "الضبط وإعادة الزحف", "newKnowledge.allDocumentStatuses": "كل الوضع", "newKnowledge.allSources": "جميع المصادر", + "newKnowledge.apiAgentAccess": "الوصول إلى API والوكيل", "newKnowledge.appsUnavailable": "— تطبيقات", "newKnowledge.authKind.api-key": "مفتاح API", "newKnowledge.authKind.endpoint": "نقطة النهاية", "newKnowledge.authenticationMethod": "طريقة المصادقة", + "newKnowledge.averageChunkLength": "متوسط طول المقطع", "newKnowledge.backToList": "العودة إلى قواعد المعرفة", "newKnowledge.backgroundTasks": "مهام الخلفية", "newKnowledge.backgroundTasksDescription": "يضيف المستند، ويتزامن المصدر، ويعيد فهرسة المهام.", @@ -152,6 +154,11 @@ "newKnowledge.bulkDocumentActions": "إجراءات المستندات المجمعة", "newKnowledge.cancelAddSource": "إلغاء", "newKnowledge.cardType": "مساحة معرفة", + "newKnowledge.characterCount": "الأحرف", + "newKnowledge.checkReindexStatus": "تحقق من حالة إعادة الفهرسة", + "newKnowledge.chunkCount": "المقاطع", + "newKnowledge.chunkHeading": "المقطع {{position}}", + "newKnowledge.chunkLocation": "الموضع {{position}} في هذه المراجعة", "newKnowledge.clearDocumentSelection": "مسح تحديد المستندات", "newKnowledge.configureProvider": "تكوين {{provider}}", "newKnowledge.connectNotion": "ربط Notion", @@ -165,6 +172,7 @@ "newKnowledge.connectionNeedsAttentionDescription": "قم بتحديث الاتصال قبل إضافة مصدر موقع الويب.", "newKnowledge.connectionProvisioning": "جارٍ الاتصال بـ {{provider}}", "newKnowledge.connectionRefreshFailed": "لم نتمكن من تحديث هذا الاتصال. حاول ثانية.", + "newKnowledge.continueCheckingTaskStatus": "متابعة التحقق من حالة المهمة", "newKnowledge.crawlAndPreview": "الزحف والمعاينة", "newKnowledge.crawlFailed": "تعذّر الزحف إلى {{host}}", "newKnowledge.crawlFailed403": "أعاد الموقع الخطأ 403 — قد يحظر برامج الزحف أو يتطلب المصادقة. تحقّق من عنوان URL أو عدّل خيارات الزحف أو جرّب موفّرًا آخر.", @@ -184,6 +192,7 @@ "newKnowledge.createFailed": "لم نتمكن من إنشاء قاعدة المعرفة هذه. تحقق من وصولك وحاول مرة أخرى.", "newKnowledge.createIllustrationTitle": "اربط محتواك مرة واحدة — وسيجيب كل تطبيق بأحدث المعارف.", "newKnowledge.createTitle": "خلق المعرفة", + "newKnowledge.createdAt": "تم الإنشاء", "newKnowledge.creators": "المنشئون", "newKnowledge.customIntervalHours": "فاصل زمني مخصّص (بالساعات)", "newKnowledge.customIntervalInvalid": "أدخل عددًا صحيحًا من 1 إلى 720 ساعة.", @@ -205,14 +214,33 @@ "newKnowledge.discardSourceDraftTitle": "هل تريد تجاهل مسودة المصدر هذه؟", "newKnowledge.documentActions": "إجراءات {{name}}", "newKnowledge.documentActionsUnavailable": "إجراءات المستند غير متاحة لقاعدة المعرفة هذه حتى الآن.", + "newKnowledge.documentChunksEmpty": "لا توجد مقاطع متاحة لهذه المراجعة بعد.", + "newKnowledge.documentChunksLoadError": "تعذّر تحميل مقاطع هذه المراجعة.", + "newKnowledge.documentChunksLoadMoreError": "تعذّر تحميل المزيد من المقاطع. حاول مرة أخرى.", "newKnowledge.documentColumn": "وثيقة", + "newKnowledge.documentContentIncomplete": "جارٍ تحميل بقية محتوى المستند…", + "newKnowledge.documentContents": "المحتويات", + "newKnowledge.documentFacts": "تفاصيل المستند", "newKnowledge.documentFilterLabel": "تصفية المستندات حسب الحالة", + "newKnowledge.documentLoadErrorDescription": "تعذّر تحميل هذا المستند. حاول مرة أخرى.", + "newKnowledge.documentLoadErrorTitle": "تعذّر تحميل المستند", + "newKnowledge.documentNotFoundDescription": "ربما تمت إزالة هذا المستند أو لا تملك صلاحية الوصول إليه.", + "newKnowledge.documentNotFoundTitle": "المستند غير موجود", + "newKnowledge.documentOverviewDescription": "يساعد تصنيف البيانات الوصفية للمستندات الذكاء الاصطناعي على الوصول إليها في الوقت المناسب ويُظهر للمستخدمين مصادر المراجع.", "newKnowledge.documentPermissionRestricted": "لا تسمح أذونات مساحة العمل الخاصة بك بإجراءات المستندات أو المهام.", + "newKnowledge.documentReindexConfirmationDelayed": "تم قبول إعادة الفهرسة، لكن حالة المهمة متأخرة. تحقق منها قبل الإرسال مرة أخرى.", + "newKnowledge.documentReindexFailed": "فشلت إعادة الفهرسة. تظل آخر مراجعة جاهزة متاحة.", + "newKnowledge.documentReindexProgress": "جارٍ إعادة الفهرسة · {{progress}}٪", + "newKnowledge.documentRevision": "المراجعة", + "newKnowledge.documentRevisionMissingDescription": "لا توجد مراجعة جاهزة لهذا المستند بعد. تحقق مجددًا بعد اكتمال المعالجة.", + "newKnowledge.documentRevisionMissingTitle": "لا توجد مراجعة متاحة", + "newKnowledge.documentRevisionsLoadError": "تعذّر تحميل سجل المراجعات. تظل المراجعة الحالية متاحة.", "newKnowledge.documentStatus.disabled": "معطل", "newKnowledge.documentStatus.failed": "فشل", "newKnowledge.documentStatus.processing": "قيد المعالجة", "newKnowledge.documentStatus.queued": "في قائمة الانتظار", "newKnowledge.documentStatus.ready": "جاهز", + "newKnowledge.documentTaskLookupIncomplete": "يتوفر المزيد من سجل المهام. تابع التحقق للعثور على حالة هذا المستند.", "newKnowledge.documentUploadExclusion.batchLimit": "تم تجاوز الحد الأقصى لحجم الدفعة", "newKnowledge.documentUploadExclusion.countLimit": "تم تجاوز الحد الأقصى لعدد الملفات", "newKnowledge.documentUploadExclusion.fileSize": "الملف كبير جدًا", @@ -241,10 +269,12 @@ "newKnowledge.documentsUnavailable": "— مستندات", "newKnowledge.downloadDocuments": "تحميل", "newKnowledge.editSource": "تحرير", + "newKnowledge.emptyChunk": "مقطع فارغ", "newKnowledge.emptyDescription": "أضف مستنداتك ليتمكن الوكلاء من قراءتها مباشرة — من دون إعداد الفهرسة.", "newKnowledge.emptyTitle": "طريقة أذكى لبناء قواعد المعرفة", "newKnowledge.errorDescription": "تعذر تحميل قواعد المعرفة الجديدة. حاول مرة أخرى.", "newKnowledge.errorTitle": "حدث خطأ ما", + "newKnowledge.fileSize": "حجم الملف", "newKnowledge.filtersUnavailable": "سيصبح هذا المرشح متاحًا عندما يوفر KnowledgeFS بياناته الوصفية.", "newKnowledge.firecrawlUnavailable": "الزحف الناري غير متوفر في كتالوج الموفر لمساحة العمل هذه.", "newKnowledge.gotIt": "فهمت", @@ -252,9 +282,11 @@ "newKnowledge.guideTitle": "تعرّف على قاعدة المعرفة الجديدة ✨", "newKnowledge.illustrationHeadline": "اربط محتواك مرة واحدة — ليجيب كل تطبيق بأحدث معرفة.", "newKnowledge.includeSubpages": "تضمين الصفحات الفرعية", + "newKnowledge.indexInformation": "معلومات الفهرسة", "newKnowledge.interruptTask": "إيقاف", "newKnowledge.invalidRootUrl": "أدخل عنوان URL صالحًا يبدأ بـ http(s).", "newKnowledge.keepEditing": "متابعة التحرير", + "newKnowledge.lastIndexed": "آخر فهرسة", "newKnowledge.lastReadyRevisionHint": "لا تؤدي المعالجة الفاشلة إلى مقاطعة الاسترداد مطلقًا، حيث تظل آخر مراجعة جاهزة متاحة في فهرس المحتوى.", "newKnowledge.lastSyncColumn": "آخر مزامنة", "newKnowledge.learnMore": "معرفة المزيد", @@ -263,10 +295,12 @@ "newKnowledge.leavePartialSetupTitle": "مغادرة الإعداد غير المكتمل؟", "newKnowledge.legacy": "قديم", "newKnowledge.loadMore": "تحميل المزيد", + "newKnowledge.loadMoreRevisions": "تحميل مراجعات أقدم", "newKnowledge.loadingSyncPolicy": "جارٍ تحميل سياسة المزامنة", "newKnowledge.manualUpload": "التحميل اليدوي", "newKnowledge.maxPages": "الحد الأقصى للصفحات", "newKnowledge.metadata": "بيانات التعريف", + "newKnowledge.mimeType": "نوع الملف", "newKnowledge.moreProviders": "مزوّدون آخرون", "newKnowledge.name": "اسم المعرفة", "newKnowledge.namePlaceholder": "على سبيل المثال دليل دعم العملاء", @@ -284,6 +318,7 @@ "newKnowledge.notionNotConnectedDescription": "اربط Notion لاختيار الصفحات والحفاظ على مزامنتها.", "newKnowledge.onlineDocuments": "المستندات عبر الإنترنت", "newKnowledge.onlineDrive": "محرك الأقراص عبر الإنترنت", + "newKnowledge.overview": "نظرة عامة", "newKnowledge.pagesAppearDescription": "ازحف إلى الموقع لمراجعة الصفحات التي ستتم إضافتها.", "newKnowledge.pagesAppearTitle": "ستظهر الصفحات هنا", "newKnowledge.pagesCrawled": "تم الزحف إلى {{count}} صفحة في {{host}}", @@ -314,16 +349,24 @@ "newKnowledge.providerNotConfigured": "{{provider}} لم يتم تكوينه", "newKnowledge.providerNotConfiguredDescription": "أضف مفتاح API أو عنوان URL لنقطة النهاية للزحف إلى مواقع الويب باستخدام {{provider}}.", "newKnowledge.providerUnavailable": "هذا الموفر غير متوفر.", + "newKnowledge.quality": "الجودة", "newKnowledge.reCrawl": "إعادة الزحف", "newKnowledge.readOnlyEmpty": "اطلب من محرر مساحة العمل إنشاء أول قاعدة معرفة.", "newKnowledge.refreshConnectionStatus": "تحديث الحالة", "newKnowledge.refreshingConnection": "منعش…", + "newKnowledge.reindexDocument": "إعادة الفهرسة", "newKnowledge.reindexDocuments": "إعادة الفهرسة", "newKnowledge.removeSource": "قم بإزالة المصدر", + "newKnowledge.retrievalCount": "عدد مرات الاسترجاع", "newKnowledge.retryCrawl": "إعادة محاولة الزحف", "newKnowledge.retryProviderLoad": "أعد المحاولة", + "newKnowledge.retryReindexDocument": "إعادة الفهرسة مرة أخرى", "newKnowledge.retrySyncPolicy": "إعادة محاولة سياسة المزامنة", "newKnowledge.retryTask": "أعد المحاولة", + "newKnowledge.revisionState.active": "نشطة", + "newKnowledge.revisionState.candidate": "قيد المعالجة", + "newKnowledge.revisionState.failed": "فشلت", + "newKnowledge.revisionState.superseded": "سابقة", "newKnowledge.rootUrl": "عنوان URL الجذر", "newKnowledge.rootUrlPlaceholder": "https://docs.example.com", "newKnowledge.routeUnavailable": "سيصبح هذا القسم متاحًا في خطوة الإعداد التالية.", @@ -332,6 +375,7 @@ "newKnowledge.selectAll": "تحديد الكل", "newKnowledge.selectAllDocuments": "حدد كافة المستندات", "newKnowledge.selectAllSources": "تحديد كل المصادر", + "newKnowledge.selectChunk": "حدد مقطعًا لفحص محتواه.", "newKnowledge.selectFilesAndFolders": "حدد الملفات والمجلدات للمزامنة", "newKnowledge.skippedFailed": "تم التخطي (فشل)", "newKnowledge.skippedOffDomain": "تم التخطي (خارج النطاق)", @@ -383,9 +427,11 @@ "newKnowledge.tasks": "المهام", "newKnowledge.tasksErrorDescription": "لم نتمكن من تحميل مهام الخلفية. حاول ثانية.", "newKnowledge.tasksWithAttention": "المهام، {{count}} تحتاج إلى الاهتمام", + "newKnowledge.tokenCount": "الرموز", "newKnowledge.unavailableDescription": "KnowledgeFS غير متاح لمساحة العمل هذه حاليًا.", "newKnowledge.unavailableTitle": "المعرفة الجديدة غير متاحة", "newKnowledge.updated": "تم التحديث في {{date}}", + "newKnowledge.updatedAt": "آخر تحديث", "newKnowledge.updatedColumn": "تم التحديث", "newKnowledge.uploadCharactersUnavailable": "الأحرف: —", "newKnowledge.uploadDocuments": "تحميل المستندات", diff --git a/web/i18n/de-DE/dataset.json b/web/i18n/de-DE/dataset.json index 4c0361d195c..846a4ea7347 100644 --- a/web/i18n/de-DE/dataset.json +++ b/web/i18n/de-DE/dataset.json @@ -140,10 +140,12 @@ "newKnowledge.adjustAndRecrawl": "Anpassen und erneut crawlen", "newKnowledge.allDocumentStatuses": "Alle Status", "newKnowledge.allSources": "Alle Quellen", + "newKnowledge.apiAgentAccess": "API- & Agent-Zugriff", "newKnowledge.appsUnavailable": "— Apps", "newKnowledge.authKind.api-key": "API-Schlüssel", "newKnowledge.authKind.endpoint": "Endpunkt", "newKnowledge.authenticationMethod": "Authentifizierungsmethode", + "newKnowledge.averageChunkLength": "Durchschnittliche Abschnittslänge", "newKnowledge.backToList": "Zurück zu den Wissensdatenbanken", "newKnowledge.backgroundTasks": "Hintergrundaufgaben", "newKnowledge.backgroundTasksDescription": "Dokumenthinzufügungen, Quellsynchronisierungen und Neuindizierungsaufträge.", @@ -152,6 +154,11 @@ "newKnowledge.bulkDocumentActions": "Massendokumentaktionen", "newKnowledge.cancelAddSource": "Abbrechen", "newKnowledge.cardType": "Wissensbereich", + "newKnowledge.characterCount": "Zeichen", + "newKnowledge.checkReindexStatus": "Neuindizierungsstatus prüfen", + "newKnowledge.chunkCount": "Abschnitte", + "newKnowledge.chunkHeading": "Abschnitt {{position}}", + "newKnowledge.chunkLocation": "Position {{position}} in dieser Revision", "newKnowledge.clearDocumentSelection": "Dokumentauswahl löschen", "newKnowledge.configureProvider": "{{provider}} konfigurieren", "newKnowledge.connectNotion": "Notion verbinden", @@ -165,6 +172,7 @@ "newKnowledge.connectionNeedsAttentionDescription": "Aktualisieren Sie die Verbindung, bevor Sie eine Website-Quelle hinzufügen.", "newKnowledge.connectionProvisioning": "{{provider}} stellt eine Verbindung her", "newKnowledge.connectionRefreshFailed": "Wir konnten diese Verbindung nicht aktualisieren. Versuchen Sie es erneut.", + "newKnowledge.continueCheckingTaskStatus": "Aufgabenstatus weiter prüfen", "newKnowledge.crawlAndPreview": "Crawlen und Vorschau", "newKnowledge.crawlFailed": "{{host}} konnte nicht gecrawlt werden", "newKnowledge.crawlFailed403": "Die Website hat 403 zurückgegeben – möglicherweise blockiert sie Crawler oder erfordert eine Authentifizierung. Prüfe die URL, passe die Crawl-Optionen an oder versuche einen anderen Anbieter.", @@ -184,6 +192,7 @@ "newKnowledge.createFailed": "Wir konnten diese Wissensdatenbank nicht erstellen. Überprüfen Sie Ihren Zugang und versuchen Sie es erneut.", "newKnowledge.createIllustrationTitle": "Verbinde deine Inhalte einmal – jede App antwortet mit dem aktuellsten Wissen.", "newKnowledge.createTitle": "Wissen schaffen", + "newKnowledge.createdAt": "Erstellt", "newKnowledge.creators": "Ersteller", "newKnowledge.customIntervalHours": "Benutzerdefiniertes Intervall (Stunden)", "newKnowledge.customIntervalInvalid": "Gib eine ganze Zahl zwischen 1 und 720 Stunden ein.", @@ -205,14 +214,33 @@ "newKnowledge.discardSourceDraftTitle": "Diesen Quellenentwurf verwerfen?", "newKnowledge.documentActions": "Aktionen für {{name}}", "newKnowledge.documentActionsUnavailable": "Für diese Wissensdatenbank sind noch keine Dokumentaktionen verfügbar.", + "newKnowledge.documentChunksEmpty": "Für diese Revision sind noch keine Abschnitte verfügbar.", + "newKnowledge.documentChunksLoadError": "Die Abschnitte dieser Revision konnten nicht geladen werden.", + "newKnowledge.documentChunksLoadMoreError": "Weitere Abschnitte konnten nicht geladen werden. Versuchen Sie es erneut.", "newKnowledge.documentColumn": "Dokument", + "newKnowledge.documentContentIncomplete": "Verbleibender Dokumentinhalt wird geladen…", + "newKnowledge.documentContents": "Inhalt", + "newKnowledge.documentFacts": "Dokumentdetails", "newKnowledge.documentFilterLabel": "Dokumente nach Status filtern", + "newKnowledge.documentLoadErrorDescription": "Dieses Dokument konnte nicht geladen werden. Versuchen Sie es erneut.", + "newKnowledge.documentLoadErrorTitle": "Dokument konnte nicht geladen werden", + "newKnowledge.documentNotFoundDescription": "Dieses Dokument wurde möglicherweise entfernt oder Sie haben keinen Zugriff.", + "newKnowledge.documentNotFoundTitle": "Dokument nicht gefunden", + "newKnowledge.documentOverviewDescription": "Das Kennzeichnen von Dokumentmetadaten ermöglicht der KI einen zeitnahen Zugriff und zeigt Nutzern die Quellen von Verweisen.", "newKnowledge.documentPermissionRestricted": "Ihre Workspace-Berechtigungen erlauben keine Dokument- oder Aufgabenaktionen.", + "newKnowledge.documentReindexConfirmationDelayed": "Die Neuindizierung wurde angenommen, aber der Aufgabenstatus ist verzögert. Prüfe ihn vor einer erneuten Übermittlung.", + "newKnowledge.documentReindexFailed": "Die Neuindizierung ist fehlgeschlagen. Die letzte bereite Revision bleibt verfügbar.", + "newKnowledge.documentReindexProgress": "Neuindizierung · {{progress}} %", + "newKnowledge.documentRevision": "Versionsstand", + "newKnowledge.documentRevisionMissingDescription": "Dieses Dokument hat noch keine bereite Revision. Prüfen Sie es nach Abschluss der Verarbeitung erneut.", + "newKnowledge.documentRevisionMissingTitle": "Keine Revision verfügbar", + "newKnowledge.documentRevisionsLoadError": "Der Revisionsverlauf konnte nicht geladen werden. Die aktuelle Revision bleibt verfügbar.", "newKnowledge.documentStatus.disabled": "Deaktiviert", "newKnowledge.documentStatus.failed": "Fehlgeschlagen", "newKnowledge.documentStatus.processing": "Verarbeitung", "newKnowledge.documentStatus.queued": "In der Warteschlange", "newKnowledge.documentStatus.ready": "Bereit", + "newKnowledge.documentTaskLookupIncomplete": "Weitere Aufgabenverläufe sind verfügbar. Prüfe weiter, um den Status dieses Dokuments zu finden.", "newKnowledge.documentUploadExclusion.batchLimit": "Maximale Batchgröße überschritten", "newKnowledge.documentUploadExclusion.countLimit": "Maximale Dateianzahl überschritten", "newKnowledge.documentUploadExclusion.fileSize": "Datei ist zu groß", @@ -241,10 +269,12 @@ "newKnowledge.documentsUnavailable": "— Dokumente", "newKnowledge.downloadDocuments": "Herunterladen", "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.", "newKnowledge.emptyTitle": "Wissensdatenbanken intelligenter aufbauen", "newKnowledge.errorDescription": "Die neuen Wissensdatenbanken konnten nicht geladen werden. Versuchen Sie es erneut.", "newKnowledge.errorTitle": "Etwas ist schiefgelaufen", + "newKnowledge.fileSize": "Dateigröße", "newKnowledge.filtersUnavailable": "Dieser Filter wird verfügbar, sobald KnowledgeFS Metadaten bereitstellt.", "newKnowledge.firecrawlUnavailable": "Firecrawl ist im Anbieterkatalog für diesen Arbeitsbereich nicht verfügbar.", "newKnowledge.gotIt": "Verstanden", @@ -252,9 +282,11 @@ "newKnowledge.guideTitle": "Lernen Sie die neue Wissensdatenbank kennen ✨", "newKnowledge.illustrationHeadline": "Verbinde deine Inhalte einmal – und jede App antwortet mit dem neuesten Wissen.", "newKnowledge.includeSubpages": "Unterseiten einbeziehen", + "newKnowledge.indexInformation": "Indexinformationen", "newKnowledge.interruptTask": "Unterbrechen", "newKnowledge.invalidRootUrl": "Gib eine gültige http(s)-URL ein.", "newKnowledge.keepEditing": "Weiter bearbeiten", + "newKnowledge.lastIndexed": "Zuletzt indexiert", "newKnowledge.lastReadyRevisionHint": "Eine fehlgeschlagene Verarbeitung unterbricht nie den Abruf – die letzte fertige Revision bleibt im Inhaltsindex verfügbar.", "newKnowledge.lastSyncColumn": "Letzte Synchronisierung", "newKnowledge.learnMore": "Mehr erfahren", @@ -263,10 +295,12 @@ "newKnowledge.leavePartialSetupTitle": "Unvollständige Einrichtung verlassen?", "newKnowledge.legacy": "Legacy", "newKnowledge.loadMore": "Mehr laden", + "newKnowledge.loadMoreRevisions": "Ältere Revisionen laden", "newKnowledge.loadingSyncPolicy": "Synchronisierungsrichtlinie wird geladen", "newKnowledge.manualUpload": "Manueller Upload", "newKnowledge.maxPages": "Maximale Seitenzahl", "newKnowledge.metadata": "Metadaten", + "newKnowledge.mimeType": "Dateityp", "newKnowledge.moreProviders": "Weitere Anbieter", "newKnowledge.name": "Wissensname", "newKnowledge.namePlaceholder": "z.B. Kundendiensthandbuch", @@ -284,6 +318,7 @@ "newKnowledge.notionNotConnectedDescription": "Verbinden Sie Notion, um Seiten auszuwählen und synchron zu halten.", "newKnowledge.onlineDocuments": "Online-Dokumente", "newKnowledge.onlineDrive": "Online-Laufwerk", + "newKnowledge.overview": "Übersicht", "newKnowledge.pagesAppearDescription": "Crawle die Website, um zu prüfen, welche Seiten hinzugefügt werden.", "newKnowledge.pagesAppearTitle": "Seiten werden hier angezeigt", "newKnowledge.pagesCrawled": "{{count}} Seiten unter {{host}} gecrawlt", @@ -314,16 +349,24 @@ "newKnowledge.providerNotConfigured": "{{provider}} ist nicht konfiguriert", "newKnowledge.providerNotConfiguredDescription": "Fügen Sie einen API-Schlüssel oder eine Endpunkt-URL hinzu, um Websites mit {{provider}} zu crawlen.", "newKnowledge.providerUnavailable": "Dieser Anbieter ist nicht verfügbar.", + "newKnowledge.quality": "Qualität", "newKnowledge.reCrawl": "Erneut crawlen", "newKnowledge.readOnlyEmpty": "Bitten Sie einen Arbeitsbereich-Editor, die erste Wissensdatenbank zu erstellen.", "newKnowledge.refreshConnectionStatus": "Status aktualisieren", "newKnowledge.refreshingConnection": "Erfrischend…", + "newKnowledge.reindexDocument": "Neu indizieren", "newKnowledge.reindexDocuments": "Neu indizieren", "newKnowledge.removeSource": "Quelle entfernen", + "newKnowledge.retrievalCount": "Anzahl der Abrufe", "newKnowledge.retryCrawl": "Crawl wiederholen", "newKnowledge.retryProviderLoad": "Wiederholen", + "newKnowledge.retryReindexDocument": "Erneut neu indizieren", "newKnowledge.retrySyncPolicy": "Synchronisierungsrichtlinie erneut laden", "newKnowledge.retryTask": "Versuchen Sie es noch einmal", + "newKnowledge.revisionState.active": "Aktiv", + "newKnowledge.revisionState.candidate": "In Verarbeitung", + "newKnowledge.revisionState.failed": "Fehlgeschlagen", + "newKnowledge.revisionState.superseded": "Vorherige", "newKnowledge.rootUrl": "Stamm-URL", "newKnowledge.rootUrlPlaceholder": "https://docs.example.com", "newKnowledge.routeUnavailable": "Dieser Abschnitt wird im nächsten Einrichtungsschritt verfügbar.", @@ -332,6 +375,7 @@ "newKnowledge.selectAll": "Alle auswählen", "newKnowledge.selectAllDocuments": "Wählen Sie alle Dokumente aus", "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.skippedFailed": "Übersprungen (fehlgeschlagen)", "newKnowledge.skippedOffDomain": "Übersprungen (außerhalb der Domain)", @@ -383,9 +427,11 @@ "newKnowledge.tasks": "Aufgaben", "newKnowledge.tasksErrorDescription": "Wir konnten keine Hintergrundaufgaben laden. Versuchen Sie es erneut.", "newKnowledge.tasksWithAttention": "Aufgaben, {{count}} erfordern Aufmerksamkeit", + "newKnowledge.tokenCount": "Token", "newKnowledge.unavailableDescription": "KnowledgeFS ist für diesen Arbeitsbereich derzeit nicht verfügbar.", "newKnowledge.unavailableTitle": "Neues Wissen ist nicht verfügbar", "newKnowledge.updated": "Aktualisiert am {{date}}", + "newKnowledge.updatedAt": "Zuletzt aktualisiert", "newKnowledge.updatedColumn": "Aktualisiert", "newKnowledge.uploadCharactersUnavailable": "Zeichen: —", "newKnowledge.uploadDocuments": "Dokumente hochladen", diff --git a/web/i18n/en-US/dataset.json b/web/i18n/en-US/dataset.json index 3d64dd40001..b8842171079 100644 --- a/web/i18n/en-US/dataset.json +++ b/web/i18n/en-US/dataset.json @@ -140,10 +140,12 @@ "newKnowledge.adjustAndRecrawl": "Adjust & re-crawl", "newKnowledge.allDocumentStatuses": "All status", "newKnowledge.allSources": "All sources", + "newKnowledge.apiAgentAccess": "API & Agent Access", "newKnowledge.appsUnavailable": "— apps", "newKnowledge.authKind.api-key": "API key", "newKnowledge.authKind.endpoint": "Endpoint", "newKnowledge.authenticationMethod": "Authentication method", + "newKnowledge.averageChunkLength": "Average chunk length", "newKnowledge.backToList": "Back to knowledge bases", "newKnowledge.backgroundTasks": "Background tasks", "newKnowledge.backgroundTasksDescription": "Document adds, source syncs, and re-index jobs.", @@ -152,6 +154,11 @@ "newKnowledge.bulkDocumentActions": "Bulk document actions", "newKnowledge.cancelAddSource": "Cancel", "newKnowledge.cardType": "Knowledge space", + "newKnowledge.characterCount": "Characters", + "newKnowledge.checkReindexStatus": "Check re-index status", + "newKnowledge.chunkCount": "Chunks", + "newKnowledge.chunkHeading": "Chunk {{position}}", + "newKnowledge.chunkLocation": "Position {{position}} in this revision", "newKnowledge.clearDocumentSelection": "Clear document selection", "newKnowledge.configureProvider": "Configure {{provider}}", "newKnowledge.connectNotion": "Connect Notion", @@ -165,6 +172,7 @@ "newKnowledge.connectionNeedsAttentionDescription": "Refresh the connection before adding a website source.", "newKnowledge.connectionProvisioning": "{{provider}} is connecting", "newKnowledge.connectionRefreshFailed": "We couldn't refresh this connection. Try again.", + "newKnowledge.continueCheckingTaskStatus": "Continue checking task status", "newKnowledge.crawlAndPreview": "Crawl & preview", "newKnowledge.crawlFailed": "Couldn't crawl {{host}}", "newKnowledge.crawlFailed403": "The site returned 403 — it may block crawlers or require authentication. Check the URL, adjust crawl options, or try another provider.", @@ -184,6 +192,7 @@ "newKnowledge.createFailed": "We couldn't create this knowledge base. Check your access and try again.", "newKnowledge.createIllustrationTitle": "Connect your content once — every app answers with the freshest knowledge.", "newKnowledge.createTitle": "Create Knowledge", + "newKnowledge.createdAt": "Created", "newKnowledge.creators": "Creators", "newKnowledge.customIntervalHours": "Custom interval (hours)", "newKnowledge.customIntervalInvalid": "Enter a whole number from 1 to 720 hours.", @@ -205,14 +214,33 @@ "newKnowledge.discardSourceDraftTitle": "Discard this source draft?", "newKnowledge.documentActions": "Actions for {{name}}", "newKnowledge.documentActionsUnavailable": "Document actions aren't available for this knowledge base yet.", + "newKnowledge.documentChunksEmpty": "No chunks are available for this revision yet.", + "newKnowledge.documentChunksLoadError": "We couldn't load chunks for this revision.", + "newKnowledge.documentChunksLoadMoreError": "We couldn't load more chunks. Try again.", "newKnowledge.documentColumn": "Document", + "newKnowledge.documentContentIncomplete": "Loading the remaining document content…", + "newKnowledge.documentContents": "Contents", + "newKnowledge.documentFacts": "Document details", "newKnowledge.documentFilterLabel": "Filter documents by status", + "newKnowledge.documentLoadErrorDescription": "We couldn't load this document. Try again.", + "newKnowledge.documentLoadErrorTitle": "Document couldn't load", + "newKnowledge.documentNotFoundDescription": "This document may have been removed, or you may not have access.", + "newKnowledge.documentNotFoundTitle": "Document not found", + "newKnowledge.documentOverviewDescription": "Labeling metadata for documents allows AI to access them in a timely manner and exposes the source of references for users.", "newKnowledge.documentPermissionRestricted": "Your workspace permissions don't allow document or task actions.", + "newKnowledge.documentReindexConfirmationDelayed": "Re-indexing was accepted, but its task status is delayed. Check again before submitting another re-index.", + "newKnowledge.documentReindexFailed": "Re-indexing failed. The last ready revision remains available.", + "newKnowledge.documentReindexProgress": "Re-indexing · {{progress}}%", + "newKnowledge.documentRevision": "Revision", + "newKnowledge.documentRevisionMissingDescription": "This document doesn't have a ready revision yet. Check back after processing finishes.", + "newKnowledge.documentRevisionMissingTitle": "No revision available", + "newKnowledge.documentRevisionsLoadError": "We couldn't load revision history. The current revision remains available.", "newKnowledge.documentStatus.disabled": "Disabled", "newKnowledge.documentStatus.failed": "Failed", "newKnowledge.documentStatus.processing": "Processing", "newKnowledge.documentStatus.queued": "Queued", "newKnowledge.documentStatus.ready": "Ready", + "newKnowledge.documentTaskLookupIncomplete": "More task history is available. Continue checking to find this document's status.", "newKnowledge.documentUploadExclusion.batchLimit": "batch size limit exceeded", "newKnowledge.documentUploadExclusion.countLimit": "file count limit exceeded", "newKnowledge.documentUploadExclusion.fileSize": "file is too large", @@ -241,10 +269,12 @@ "newKnowledge.documentsUnavailable": "— documents", "newKnowledge.downloadDocuments": "Download", "newKnowledge.editSource": "Edit", + "newKnowledge.emptyChunk": "Empty chunk", "newKnowledge.emptyDescription": "Add your documents and agents can read them directly — no indexing to configure.", "newKnowledge.emptyTitle": "A smarter way to build knowledge bases", "newKnowledge.errorDescription": "We couldn't load your new knowledge bases. Try again.", "newKnowledge.errorTitle": "Something went wrong", + "newKnowledge.fileSize": "File size", "newKnowledge.filtersUnavailable": "This filter will become available when KnowledgeFS exposes its metadata.", "newKnowledge.firecrawlUnavailable": "Firecrawl isn't available in the provider catalog for this workspace.", "newKnowledge.gotIt": "Got it", @@ -252,9 +282,11 @@ "newKnowledge.guideTitle": "Meet the new Knowledge Base ✨", "newKnowledge.illustrationHeadline": "Connect your content once — every app answers with the freshest knowledge.", "newKnowledge.includeSubpages": "Include sub-pages", + "newKnowledge.indexInformation": "Index information", "newKnowledge.interruptTask": "Interrupt", "newKnowledge.invalidRootUrl": "Enter a valid http(s) URL.", "newKnowledge.keepEditing": "Keep editing", + "newKnowledge.lastIndexed": "Last indexed", "newKnowledge.lastReadyRevisionHint": "Failed processing never interrupts retrieval — the last ready revision stays available in the content index.", "newKnowledge.lastSyncColumn": "Last sync", "newKnowledge.learnMore": "Learn more", @@ -263,10 +295,12 @@ "newKnowledge.leavePartialSetupTitle": "Leave incomplete setup?", "newKnowledge.legacy": "Legacy", "newKnowledge.loadMore": "Load more", + "newKnowledge.loadMoreRevisions": "Load older revisions", "newKnowledge.loadingSyncPolicy": "Loading sync policy", "newKnowledge.manualUpload": "Manual upload", "newKnowledge.maxPages": "Maximum pages", - "newKnowledge.metadata": "Meta Data", + "newKnowledge.metadata": "Metadata", + "newKnowledge.mimeType": "File type", "newKnowledge.moreProviders": "More providers", "newKnowledge.name": "Knowledge name", "newKnowledge.namePlaceholder": "e.g. Customer Support Handbook", @@ -284,6 +318,7 @@ "newKnowledge.notionNotConnectedDescription": "Connect Notion to choose pages and keep them synchronized.", "newKnowledge.onlineDocuments": "Online documents", "newKnowledge.onlineDrive": "Online drive", + "newKnowledge.overview": "Overview", "newKnowledge.pagesAppearDescription": "Crawl the site to review which pages get added.", "newKnowledge.pagesAppearTitle": "Pages will appear here", "newKnowledge.pagesCrawled": "{{count}} pages crawled at {{host}}", @@ -314,16 +349,24 @@ "newKnowledge.providerNotConfigured": "{{provider}} is not configured", "newKnowledge.providerNotConfiguredDescription": "Add an API key or endpoint URL to crawl websites with {{provider}}.", "newKnowledge.providerUnavailable": "This provider is unavailable.", + "newKnowledge.quality": "Quality", "newKnowledge.reCrawl": "Re-crawl", "newKnowledge.readOnlyEmpty": "Ask a workspace editor to create the first knowledge base.", "newKnowledge.refreshConnectionStatus": "Refresh status", "newKnowledge.refreshingConnection": "Refreshing…", + "newKnowledge.reindexDocument": "Re-index", "newKnowledge.reindexDocuments": "Re-index", "newKnowledge.removeSource": "Remove source", + "newKnowledge.retrievalCount": "Retrieval count", "newKnowledge.retryCrawl": "Retry crawl", "newKnowledge.retryProviderLoad": "Retry", + "newKnowledge.retryReindexDocument": "Re-index again", "newKnowledge.retrySyncPolicy": "Retry sync policy", "newKnowledge.retryTask": "Retry", + "newKnowledge.revisionState.active": "Active", + "newKnowledge.revisionState.candidate": "Processing", + "newKnowledge.revisionState.failed": "Failed", + "newKnowledge.revisionState.superseded": "Previous", "newKnowledge.rootUrl": "Root URL", "newKnowledge.rootUrlPlaceholder": "https://docs.example.com", "newKnowledge.routeUnavailable": "This section will become available in the next setup step.", @@ -332,6 +375,7 @@ "newKnowledge.selectAll": "Select all", "newKnowledge.selectAllDocuments": "Select all documents", "newKnowledge.selectAllSources": "Select all sources", + "newKnowledge.selectChunk": "Select a chunk to inspect its content.", "newKnowledge.selectFilesAndFolders": "Select files & folders to sync", "newKnowledge.skippedFailed": "Skipped (failed)", "newKnowledge.skippedOffDomain": "Skipped (off-domain)", @@ -383,9 +427,11 @@ "newKnowledge.tasks": "Tasks", "newKnowledge.tasksErrorDescription": "We couldn't load background tasks. Try again.", "newKnowledge.tasksWithAttention": "Tasks, {{count}} need attention", + "newKnowledge.tokenCount": "Tokens", "newKnowledge.unavailableDescription": "KnowledgeFS isn't available for this workspace right now.", "newKnowledge.unavailableTitle": "New Knowledge is unavailable", "newKnowledge.updated": "Updated {{date}}", + "newKnowledge.updatedAt": "Last updated", "newKnowledge.updatedColumn": "Updated", "newKnowledge.uploadCharactersUnavailable": "Characters: —", "newKnowledge.uploadDocuments": "Upload documents", diff --git a/web/i18n/es-ES/dataset.json b/web/i18n/es-ES/dataset.json index 1db7baf6b49..8eef442d1fb 100644 --- a/web/i18n/es-ES/dataset.json +++ b/web/i18n/es-ES/dataset.json @@ -140,10 +140,12 @@ "newKnowledge.adjustAndRecrawl": "Ajustar y volver a rastrear", "newKnowledge.allDocumentStatuses": "Todo el estado", "newKnowledge.allSources": "Todas las fuentes", + "newKnowledge.apiAgentAccess": "Acceso a API y agentes", "newKnowledge.appsUnavailable": "— aplicaciones", "newKnowledge.authKind.api-key": "Clave API", "newKnowledge.authKind.endpoint": "Punto final", "newKnowledge.authenticationMethod": "Método de autenticación", + "newKnowledge.averageChunkLength": "Longitud media del fragmento", "newKnowledge.backToList": "Volver a las bases de conocimiento", "newKnowledge.backgroundTasks": "Tareas en segundo plano", "newKnowledge.backgroundTasksDescription": "Agrega documentos, sincroniza fuentes y vuelve a indexar trabajos.", @@ -152,6 +154,11 @@ "newKnowledge.bulkDocumentActions": "Acciones de documentos masivos", "newKnowledge.cancelAddSource": "Cancelar", "newKnowledge.cardType": "Espacio de conocimiento", + "newKnowledge.characterCount": "Caracteres", + "newKnowledge.checkReindexStatus": "Comprobar estado de reindexación", + "newKnowledge.chunkCount": "Fragmentos", + "newKnowledge.chunkHeading": "Fragmento {{position}}", + "newKnowledge.chunkLocation": "Posición {{position}} en esta revisión", "newKnowledge.clearDocumentSelection": "Borrar selección de documentos", "newKnowledge.configureProvider": "Configurar {{provider}}", "newKnowledge.connectNotion": "Conectar Notion", @@ -165,6 +172,7 @@ "newKnowledge.connectionNeedsAttentionDescription": "Actualiza la conexión antes de agregar una fuente de sitio web.", "newKnowledge.connectionProvisioning": "{{provider}} se está conectando", "newKnowledge.connectionRefreshFailed": "No pudimos actualizar esta conexión. Intentar otra vez.", + "newKnowledge.continueCheckingTaskStatus": "Seguir comprobando el estado", "newKnowledge.crawlAndPreview": "Rastreo y vista previa", "newKnowledge.crawlFailed": "No se pudo rastrear {{host}}", "newKnowledge.crawlFailed403": "El sitio devolvió un error 403; puede que bloquee rastreadores o requiera autenticación. Comprueba la URL, ajusta las opciones de rastreo o prueba otro proveedor.", @@ -184,6 +192,7 @@ "newKnowledge.createFailed": "No pudimos crear esta base de conocimientos. Comprueba tu acceso y vuelve a intentarlo.", "newKnowledge.createIllustrationTitle": "Conecta tu contenido una vez: cada aplicación responderá con el conocimiento más reciente.", "newKnowledge.createTitle": "Crear conocimiento", + "newKnowledge.createdAt": "Creado", "newKnowledge.creators": "Creadores", "newKnowledge.customIntervalHours": "Intervalo personalizado (horas)", "newKnowledge.customIntervalInvalid": "Introduce un número entero de 1 a 720 horas.", @@ -205,14 +214,33 @@ "newKnowledge.discardSourceDraftTitle": "¿Descartar este borrador de fuente?", "newKnowledge.documentActions": "Acciones para {{name}}", "newKnowledge.documentActionsUnavailable": "Las acciones de documentos aún no están disponibles para esta base de conocimientos.", + "newKnowledge.documentChunksEmpty": "Aún no hay fragmentos disponibles para esta revisión.", + "newKnowledge.documentChunksLoadError": "No se pudieron cargar los fragmentos de esta revisión.", + "newKnowledge.documentChunksLoadMoreError": "No se pudieron cargar más fragmentos. Inténtalo de nuevo.", "newKnowledge.documentColumn": "Documento", + "newKnowledge.documentContentIncomplete": "Cargando el contenido restante del documento…", + "newKnowledge.documentContents": "Contenido", + "newKnowledge.documentFacts": "Detalles del documento", "newKnowledge.documentFilterLabel": "Filtrar documentos por estado", + "newKnowledge.documentLoadErrorDescription": "No se pudo cargar este documento. Inténtalo de nuevo.", + "newKnowledge.documentLoadErrorTitle": "No se pudo cargar el documento", + "newKnowledge.documentNotFoundDescription": "Es posible que este documento se haya eliminado o que no tengas acceso.", + "newKnowledge.documentNotFoundTitle": "Documento no encontrado", + "newKnowledge.documentOverviewDescription": "Etiquetar los metadatos de los documentos permite que la IA acceda a ellos a tiempo y muestra a los usuarios las fuentes de las referencias.", "newKnowledge.documentPermissionRestricted": "Los permisos de tu espacio de trabajo no permiten acciones sobre documentos o tareas.", + "newKnowledge.documentReindexConfirmationDelayed": "La reindexación fue aceptada, pero el estado de la tarea está retrasado. Compruébalo antes de volver a enviarla.", + "newKnowledge.documentReindexFailed": "La reindexación falló. La última revisión lista sigue disponible.", + "newKnowledge.documentReindexProgress": "Reindexando · {{progress}} %", + "newKnowledge.documentRevision": "Revisión", + "newKnowledge.documentRevisionMissingDescription": "Este documento aún no tiene una revisión lista. Vuelve cuando termine el procesamiento.", + "newKnowledge.documentRevisionMissingTitle": "No hay ninguna revisión disponible", + "newKnowledge.documentRevisionsLoadError": "No se pudo cargar el historial de revisiones. La revisión actual sigue disponible.", "newKnowledge.documentStatus.disabled": "Desactivado", "newKnowledge.documentStatus.failed": "Fallido", "newKnowledge.documentStatus.processing": "Procesamiento", "newKnowledge.documentStatus.queued": "En cola", "newKnowledge.documentStatus.ready": "Listo", + "newKnowledge.documentTaskLookupIncomplete": "Hay más historial de tareas disponible. Sigue comprobando para encontrar el estado de este documento.", "newKnowledge.documentUploadExclusion.batchLimit": "se superó el límite de tamaño del lote", "newKnowledge.documentUploadExclusion.countLimit": "se superó el límite de archivos", "newKnowledge.documentUploadExclusion.fileSize": "el archivo es demasiado grande", @@ -241,10 +269,12 @@ "newKnowledge.documentsUnavailable": "— documentos", "newKnowledge.downloadDocuments": "Descargar", "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.", "newKnowledge.emptyTitle": "Una forma más inteligente de crear bases de conocimiento", "newKnowledge.errorDescription": "No pudimos cargar tus nuevas bases de conocimiento. Inténtalo de nuevo.", "newKnowledge.errorTitle": "Algo salió mal", + "newKnowledge.fileSize": "Tamaño del archivo", "newKnowledge.filtersUnavailable": "Este filtro estará disponible cuando KnowledgeFS exponga sus metadatos.", "newKnowledge.firecrawlUnavailable": "Firecrawl no está disponible en el catálogo de proveedores para este espacio de trabajo.", "newKnowledge.gotIt": "Entendido", @@ -252,9 +282,11 @@ "newKnowledge.guideTitle": "Conoce la nueva base de conocimiento ✨", "newKnowledge.illustrationHeadline": "Conecta tu contenido una vez: cada aplicación responderá con el conocimiento más reciente.", "newKnowledge.includeSubpages": "Incluir subpáginas", + "newKnowledge.indexInformation": "Información del índice", "newKnowledge.interruptTask": "Interrumpir", "newKnowledge.invalidRootUrl": "Introduce una URL http(s) válida.", "newKnowledge.keepEditing": "Seguir editando", + "newKnowledge.lastIndexed": "Última indexación", "newKnowledge.lastReadyRevisionHint": "El procesamiento fallido nunca interrumpe la recuperación: la última revisión lista permanece disponible en el índice de contenido.", "newKnowledge.lastSyncColumn": "Última sincronización", "newKnowledge.learnMore": "Más información", @@ -263,10 +295,12 @@ "newKnowledge.leavePartialSetupTitle": "¿Salir de la configuración incompleta?", "newKnowledge.legacy": "Anterior", "newKnowledge.loadMore": "Cargar más", + "newKnowledge.loadMoreRevisions": "Cargar revisiones anteriores", "newKnowledge.loadingSyncPolicy": "Cargando la política de sincronización", "newKnowledge.manualUpload": "Carga manual", "newKnowledge.maxPages": "Máximo de páginas", "newKnowledge.metadata": "Metadatos", + "newKnowledge.mimeType": "Tipo de archivo", "newKnowledge.moreProviders": "Más proveedores", "newKnowledge.name": "Nombre del conocimiento", "newKnowledge.namePlaceholder": "por ej. Manual de atención al cliente", @@ -284,6 +318,7 @@ "newKnowledge.notionNotConnectedDescription": "Conecta Notion para elegir páginas y mantenerlas sincronizadas.", "newKnowledge.onlineDocuments": "Documentos en línea", "newKnowledge.onlineDrive": "Unidad en línea", + "newKnowledge.overview": "Resumen", "newKnowledge.pagesAppearDescription": "Rastrea el sitio para revisar qué páginas se añadirán.", "newKnowledge.pagesAppearTitle": "Las páginas aparecerán aquí", "newKnowledge.pagesCrawled": "{{count}} páginas rastreadas en {{host}}", @@ -314,16 +349,24 @@ "newKnowledge.providerNotConfigured": "{{provider}} no está configurado", "newKnowledge.providerNotConfiguredDescription": "Agregue una clave API o una URL de punto final para rastrear sitios web con {{provider}}.", "newKnowledge.providerUnavailable": "Este proveedor no está disponible.", + "newKnowledge.quality": "Calidad", "newKnowledge.reCrawl": "Volver a rastrear", "newKnowledge.readOnlyEmpty": "Pide a un editor del espacio de trabajo que cree la primera base de conocimiento.", "newKnowledge.refreshConnectionStatus": "Estado de actualización", "newKnowledge.refreshingConnection": "Refrescante…", + "newKnowledge.reindexDocument": "Reindexar", "newKnowledge.reindexDocuments": "Volver a indexar", "newKnowledge.removeSource": "Eliminar fuente", + "newKnowledge.retrievalCount": "Número de recuperaciones", "newKnowledge.retryCrawl": "Reintentar rastreo", "newKnowledge.retryProviderLoad": "Reintentar", + "newKnowledge.retryReindexDocument": "Reindexar de nuevo", "newKnowledge.retrySyncPolicy": "Reintentar la política de sincronización", "newKnowledge.retryTask": "Reintentar", + "newKnowledge.revisionState.active": "Activa", + "newKnowledge.revisionState.candidate": "Procesando", + "newKnowledge.revisionState.failed": "Fallida", + "newKnowledge.revisionState.superseded": "Anterior", "newKnowledge.rootUrl": "URL raíz", "newKnowledge.rootUrlPlaceholder": "https://docs.example.com", "newKnowledge.routeUnavailable": "Esta sección estará disponible en el siguiente paso de configuración.", @@ -332,6 +375,7 @@ "newKnowledge.selectAll": "Seleccionar todo", "newKnowledge.selectAllDocuments": "Seleccionar todos los documentos", "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.skippedFailed": "Omitido (fallido)", "newKnowledge.skippedOffDomain": "Omitido (fuera del dominio)", @@ -383,9 +427,11 @@ "newKnowledge.tasks": "Tareas", "newKnowledge.tasksErrorDescription": "No pudimos cargar tareas en segundo plano. Intentar otra vez.", "newKnowledge.tasksWithAttention": "Tareas, {{count}} necesitan atención", + "newKnowledge.tokenCount": "Unidades de token", "newKnowledge.unavailableDescription": "KnowledgeFS no está disponible para este espacio de trabajo ahora mismo.", "newKnowledge.unavailableTitle": "El nuevo conocimiento no está disponible", "newKnowledge.updated": "Actualizado el {{date}}", + "newKnowledge.updatedAt": "Última actualización", "newKnowledge.updatedColumn": "Actualizado", "newKnowledge.uploadCharactersUnavailable": "Caracteres: —", "newKnowledge.uploadDocuments": "Subir documentos", diff --git a/web/i18n/fa-IR/dataset.json b/web/i18n/fa-IR/dataset.json index 4240b7324d0..a678ec89324 100644 --- a/web/i18n/fa-IR/dataset.json +++ b/web/i18n/fa-IR/dataset.json @@ -140,10 +140,12 @@ "newKnowledge.adjustAndRecrawl": "تنظیم و پیمایش دوباره", "newKnowledge.allDocumentStatuses": "همه وضعیت", "newKnowledge.allSources": "همه منابع", + "newKnowledge.apiAgentAccess": "دسترسی API و عامل", "newKnowledge.appsUnavailable": "— برنامه", "newKnowledge.authKind.api-key": "کلید API", "newKnowledge.authKind.endpoint": "نقطه پایانی", "newKnowledge.authenticationMethod": "روش احراز هویت", + "newKnowledge.averageChunkLength": "میانگین طول قطعه", "newKnowledge.backToList": "بازگشت به پایگاه های دانش", "newKnowledge.backgroundTasks": "وظایف پس زمینه", "newKnowledge.backgroundTasksDescription": "افزودن اسناد، همگام سازی منبع، و فهرست مجدد مشاغل.", @@ -152,6 +154,11 @@ "newKnowledge.bulkDocumentActions": "اقدامات سند انبوه", "newKnowledge.cancelAddSource": "لغو", "newKnowledge.cardType": "فضای دانش", + "newKnowledge.characterCount": "نویسه‌ها", + "newKnowledge.checkReindexStatus": "بررسی وضعیت بازفهرست‌سازی", + "newKnowledge.chunkCount": "قطعه‌ها", + "newKnowledge.chunkHeading": "قطعه {{position}}", + "newKnowledge.chunkLocation": "موقعیت {{position}} در این بازبینی", "newKnowledge.clearDocumentSelection": "انتخاب سند را پاک کنید", "newKnowledge.configureProvider": "{{provider}} را پیکربندی کنید", "newKnowledge.connectNotion": "اتصال Notion", @@ -165,6 +172,7 @@ "newKnowledge.connectionNeedsAttentionDescription": "قبل از افزودن منبع وب سایت، اتصال را تازه کنید.", "newKnowledge.connectionProvisioning": "{{provider}} در حال اتصال است", "newKnowledge.connectionRefreshFailed": "ما نتوانستیم این اتصال را بازخوانی کنیم. دوباره امتحان کنید.", + "newKnowledge.continueCheckingTaskStatus": "ادامه بررسی وضعیت کار", "newKnowledge.crawlAndPreview": "خزیدن و پیش‌نمایش", "newKnowledge.crawlFailed": "پیمایش {{host}} ممکن نشد", "newKnowledge.crawlFailed403": "سایت خطای 403 برگرداند؛ ممکن است خزنده‌ها را مسدود کند یا به احراز هویت نیاز داشته باشد. نشانی را بررسی کنید، گزینه‌های پیمایش را تغییر دهید یا ارائه‌دهندهٔ دیگری را امتحان کنید.", @@ -184,6 +192,7 @@ "newKnowledge.createFailed": "ما نتوانستیم این پایگاه دانش را ایجاد کنیم. دسترسی خود را بررسی کنید و دوباره امتحان کنید.", "newKnowledge.createIllustrationTitle": "محتوای خود را یک‌بار متصل کنید — هر برنامه با تازه‌ترین دانش پاسخ می‌دهد.", "newKnowledge.createTitle": "ایجاد دانش", + "newKnowledge.createdAt": "ایجادشده", "newKnowledge.creators": "ایجادکنندگان", "newKnowledge.customIntervalHours": "بازه سفارشی (ساعت)", "newKnowledge.customIntervalInvalid": "یک عدد صحیح بین ۱ تا ۷۲۰ ساعت وارد کنید.", @@ -205,14 +214,33 @@ "newKnowledge.discardSourceDraftTitle": "این پیش‌نویس منبع حذف شود؟", "newKnowledge.documentActions": "اقدامات برای {{name}}", "newKnowledge.documentActionsUnavailable": "اقدامات سند هنوز برای این پایگاه دانش در دسترس نیست.", + "newKnowledge.documentChunksEmpty": "هنوز قطعه‌ای برای این بازبینی موجود نیست.", + "newKnowledge.documentChunksLoadError": "قطعه‌های این بازبینی بارگیری نشد.", + "newKnowledge.documentChunksLoadMoreError": "قطعه‌های بیشتری بارگیری نشد. دوباره تلاش کنید.", "newKnowledge.documentColumn": "سند", + "newKnowledge.documentContentIncomplete": "در حال بارگذاری ادامه محتوای سند…", + "newKnowledge.documentContents": "محتوا", + "newKnowledge.documentFacts": "جزئیات سند", "newKnowledge.documentFilterLabel": "اسناد را بر اساس وضعیت فیلتر کنید", + "newKnowledge.documentLoadErrorDescription": "این سند بارگیری نشد. دوباره تلاش کنید.", + "newKnowledge.documentLoadErrorTitle": "سند بارگیری نشد", + "newKnowledge.documentNotFoundDescription": "ممکن است این سند حذف شده باشد یا شما دسترسی نداشته باشید.", + "newKnowledge.documentNotFoundTitle": "سند پیدا نشد", + "newKnowledge.documentOverviewDescription": "برچسب‌گذاری فرادادهٔ اسناد به هوش مصنوعی امکان می‌دهد به‌موقع به آن‌ها دسترسی پیدا کند و منبع ارجاعات را به کاربران نشان می‌دهد.", "newKnowledge.documentPermissionRestricted": "مجوزهای فضای کاری شما اجازه انجام عملیات روی اسناد یا وظایف را نمی‌دهد.", + "newKnowledge.documentReindexConfirmationDelayed": "بازفهرست‌سازی پذیرفته شد، اما وضعیت کار با تأخیر نمایش داده می‌شود. پیش از ارسال دوباره آن را بررسی کنید.", + "newKnowledge.documentReindexFailed": "نمایه‌سازی دوباره ناموفق بود. آخرین بازبینی آماده همچنان در دسترس است.", + "newKnowledge.documentReindexProgress": "در حال نمایه‌سازی دوباره · {{progress}}٪", + "newKnowledge.documentRevision": "بازبینی", + "newKnowledge.documentRevisionMissingDescription": "این سند هنوز بازبینی آماده‌ای ندارد. پس از پایان پردازش دوباره بررسی کنید.", + "newKnowledge.documentRevisionMissingTitle": "هیچ بازبینی در دسترس نیست", + "newKnowledge.documentRevisionsLoadError": "تاریخچه بازبینی بارگیری نشد. بازبینی فعلی همچنان در دسترس است.", "newKnowledge.documentStatus.disabled": "غیرفعال", "newKnowledge.documentStatus.failed": "شکست خورد", "newKnowledge.documentStatus.processing": "در حال پردازش", "newKnowledge.documentStatus.queued": "در صف", "newKnowledge.documentStatus.ready": "آماده است", + "newKnowledge.documentTaskLookupIncomplete": "سابقه کار بیشتری موجود است. برای یافتن وضعیت این سند بررسی را ادامه دهید.", "newKnowledge.documentUploadExclusion.batchLimit": "محدودیت اندازه دسته رد شده است", "newKnowledge.documentUploadExclusion.countLimit": "محدودیت تعداد فایل رد شده است", "newKnowledge.documentUploadExclusion.fileSize": "فایل بیش از حد بزرگ است", @@ -241,10 +269,12 @@ "newKnowledge.documentsUnavailable": "— سند", "newKnowledge.downloadDocuments": "دانلود کنید", "newKnowledge.editSource": "ویرایش", + "newKnowledge.emptyChunk": "قطعه خالی", "newKnowledge.emptyDescription": "اسناد خود را اضافه کنید تا عامل‌ها بتوانند مستقیماً آن‌ها را بخوانند — بدون نیاز به تنظیم نمایه‌سازی.", "newKnowledge.emptyTitle": "روشی هوشمندتر برای ساخت پایگاه‌های دانش", "newKnowledge.errorDescription": "پایگاه‌های دانش جدید بارگذاری نشدند. دوباره تلاش کنید.", "newKnowledge.errorTitle": "مشکلی پیش آمد", + "newKnowledge.fileSize": "اندازه فایل", "newKnowledge.filtersUnavailable": "این فیلتر پس از ارائه فراداده توسط KnowledgeFS در دسترس خواهد بود.", "newKnowledge.firecrawlUnavailable": "Firecrawl در کاتالوگ ارائه دهنده برای این فضای کاری موجود نیست.", "newKnowledge.gotIt": "متوجه شدم", @@ -252,9 +282,11 @@ "newKnowledge.guideTitle": "با پایگاه دانش جدید آشنا شوید ✨", "newKnowledge.illustrationHeadline": "محتوای خود را یک‌بار متصل کنید تا هر برنامه با تازه‌ترین دانش پاسخ دهد.", "newKnowledge.includeSubpages": "شامل صفحه‌های فرعی", + "newKnowledge.indexInformation": "اطلاعات نمایه", "newKnowledge.interruptTask": "توقف", "newKnowledge.invalidRootUrl": "یک نشانی معتبر http(s) وارد کنید.", "newKnowledge.keepEditing": "ادامه ویرایش", + "newKnowledge.lastIndexed": "آخرین نمایه‌سازی", "newKnowledge.lastReadyRevisionHint": "پردازش ناموفق هرگز بازیابی را قطع نمی کند - آخرین نسخه آماده در فهرست محتوا در دسترس باقی می ماند.", "newKnowledge.lastSyncColumn": "آخرین همگام سازی", "newKnowledge.learnMore": "بیشتر بدانید", @@ -263,10 +295,12 @@ "newKnowledge.leavePartialSetupTitle": "از راه‌اندازی ناتمام خارج می‌شوید؟", "newKnowledge.legacy": "قدیمی", "newKnowledge.loadMore": "بارگذاری بیشتر", + "newKnowledge.loadMoreRevisions": "بارگیری بازبینی‌های قدیمی‌تر", "newKnowledge.loadingSyncPolicy": "در حال بارگیری سیاست همگام‌سازی", "newKnowledge.manualUpload": "آپلود دستی", "newKnowledge.maxPages": "حداکثر صفحه‌ها", "newKnowledge.metadata": "متا دیتا", + "newKnowledge.mimeType": "نوع فایل", "newKnowledge.moreProviders": "ارائه‌دهندگان بیشتر", "newKnowledge.name": "نام دانش", "newKnowledge.namePlaceholder": "به عنوان مثال راهنمای پشتیبانی مشتری", @@ -284,6 +318,7 @@ "newKnowledge.notionNotConnectedDescription": "برای انتخاب صفحه‌ها و همگام نگه‌داشتن آن‌ها، Notion را متصل کنید.", "newKnowledge.onlineDocuments": "اسناد آنلاین", "newKnowledge.onlineDrive": "درایو آنلاین", + "newKnowledge.overview": "نمای کلی", "newKnowledge.pagesAppearDescription": "سایت را پیمایش کنید تا صفحه‌هایی را که افزوده می‌شوند بررسی کنید.", "newKnowledge.pagesAppearTitle": "صفحه‌ها اینجا نمایش داده می‌شوند", "newKnowledge.pagesCrawled": "{{count}} صفحه در {{host}} پیمایش شد", @@ -314,16 +349,24 @@ "newKnowledge.providerNotConfigured": "{{provider}} پیکربندی نشده است", "newKnowledge.providerNotConfiguredDescription": "برای خزیدن وب‌سایت‌ها با {{provider}}، یک کلید API یا URL نقطه پایانی اضافه کنید.", "newKnowledge.providerUnavailable": "این ارائه دهنده در دسترس نیست.", + "newKnowledge.quality": "کیفیت", "newKnowledge.reCrawl": "پیمایش دوباره", "newKnowledge.readOnlyEmpty": "از یک ویرایشگر فضای کاری بخواهید اولین پایگاه دانش را ایجاد کند.", "newKnowledge.refreshConnectionStatus": "وضعیت بازخوانی", "newKnowledge.refreshingConnection": "تازه‌سازی…", + "newKnowledge.reindexDocument": "نمایه‌سازی دوباره", "newKnowledge.reindexDocuments": "فهرست مجدد", "newKnowledge.removeSource": "حذف منبع", + "newKnowledge.retrievalCount": "تعداد بازیابی", "newKnowledge.retryCrawl": "تلاش دوباره برای پیمایش", "newKnowledge.retryProviderLoad": "دوباره امتحان کنید", + "newKnowledge.retryReindexDocument": "بازفهرست‌سازی دوباره", "newKnowledge.retrySyncPolicy": "تلاش دوباره برای سیاست همگام‌سازی", "newKnowledge.retryTask": "دوباره امتحان کنید", + "newKnowledge.revisionState.active": "فعال", + "newKnowledge.revisionState.candidate": "در حال پردازش", + "newKnowledge.revisionState.failed": "ناموفق", + "newKnowledge.revisionState.superseded": "قبلی", "newKnowledge.rootUrl": "نشانی ریشه", "newKnowledge.rootUrlPlaceholder": "https://docs.example.com", "newKnowledge.routeUnavailable": "این بخش در مرحله راه اندازی بعدی در دسترس خواهد بود.", @@ -332,6 +375,7 @@ "newKnowledge.selectAll": "انتخاب همه", "newKnowledge.selectAllDocuments": "همه اسناد را انتخاب کنید", "newKnowledge.selectAllSources": "انتخاب همه منابع", + "newKnowledge.selectChunk": "یک قطعه را برای بررسی محتوای آن انتخاب کنید.", "newKnowledge.selectFilesAndFolders": "فایل‌ها و پوشه‌ها را برای همگام‌سازی انتخاب کنید", "newKnowledge.skippedFailed": "رد شد (ناموفق)", "newKnowledge.skippedOffDomain": "رد شد (خارج از دامنه)", @@ -383,9 +427,11 @@ "newKnowledge.tasks": "وظایف", "newKnowledge.tasksErrorDescription": "نمی‌توانیم وظایف پس‌زمینه را بارگیری کنیم. دوباره امتحان کنید.", "newKnowledge.tasksWithAttention": "وظایف، {{count}} نیاز به توجه دارد", + "newKnowledge.tokenCount": "توکن‌ها", "newKnowledge.unavailableDescription": "KnowledgeFS اکنون برای این فضای کاری در دسترس نیست.", "newKnowledge.unavailableTitle": "دانش جدید در دسترس نیست", "newKnowledge.updated": "به‌روزرسانی در {{date}}", + "newKnowledge.updatedAt": "آخرین به‌روزرسانی", "newKnowledge.updatedColumn": "به روز شد", "newKnowledge.uploadCharactersUnavailable": "نویسه‌ها: —", "newKnowledge.uploadDocuments": "اسناد را بارگذاری کنید", diff --git a/web/i18n/fr-FR/dataset.json b/web/i18n/fr-FR/dataset.json index bd56d147e3e..6f6855db438 100644 --- a/web/i18n/fr-FR/dataset.json +++ b/web/i18n/fr-FR/dataset.json @@ -140,10 +140,12 @@ "newKnowledge.adjustAndRecrawl": "Ajuster et relancer l’exploration", "newKnowledge.allDocumentStatuses": "Tous les statuts", "newKnowledge.allSources": "Toutes les sources", + "newKnowledge.apiAgentAccess": "Accès API et agents", "newKnowledge.appsUnavailable": "— applications", "newKnowledge.authKind.api-key": "Clé API", "newKnowledge.authKind.endpoint": "Point de terminaison", "newKnowledge.authenticationMethod": "Méthode d'authentification", + "newKnowledge.averageChunkLength": "Longueur moyenne des segments", "newKnowledge.backToList": "Retour aux bases de connaissances", "newKnowledge.backgroundTasks": "Tâches en arrière-plan", "newKnowledge.backgroundTasksDescription": "Ajouts de documents, synchronisations de sources et tâches de réindexation.", @@ -152,6 +154,11 @@ "newKnowledge.bulkDocumentActions": "Actions de documents en masse", "newKnowledge.cancelAddSource": "Annuler", "newKnowledge.cardType": "Espace de connaissances", + "newKnowledge.characterCount": "Caractères", + "newKnowledge.checkReindexStatus": "Vérifier l’état de réindexation", + "newKnowledge.chunkCount": "Segments", + "newKnowledge.chunkHeading": "Segment {{position}}", + "newKnowledge.chunkLocation": "Position {{position}} dans cette révision", "newKnowledge.clearDocumentSelection": "Effacer la sélection des documents", "newKnowledge.configureProvider": "Configurer {{provider}}", "newKnowledge.connectNotion": "Connecter Notion", @@ -165,6 +172,7 @@ "newKnowledge.connectionNeedsAttentionDescription": "Actualisez la connexion avant d'ajouter une source de site Web.", "newKnowledge.connectionProvisioning": "{{provider}} se connecte", "newKnowledge.connectionRefreshFailed": "Nous n'avons pas pu actualiser cette connexion. Essayer à nouveau.", + "newKnowledge.continueCheckingTaskStatus": "Continuer à vérifier l’état", "newKnowledge.crawlAndPreview": "Exploration et aperçu", "newKnowledge.crawlFailed": "Impossible d’explorer {{host}}", "newKnowledge.crawlFailed403": "Le site a renvoyé une erreur 403. Il bloque peut-être les robots d’exploration ou exige une authentification. Vérifiez l’URL, ajustez les options ou essayez un autre fournisseur.", @@ -184,6 +192,7 @@ "newKnowledge.createFailed": "Nous n'avons pas pu créer cette base de connaissances. Vérifiez votre accès et réessayez.", "newKnowledge.createIllustrationTitle": "Connectez votre contenu une fois — chaque application répond avec les connaissances les plus récentes.", "newKnowledge.createTitle": "Créer des connaissances", + "newKnowledge.createdAt": "Créé", "newKnowledge.creators": "Créateurs", "newKnowledge.customIntervalHours": "Intervalle personnalisé (heures)", "newKnowledge.customIntervalInvalid": "Saisissez un nombre entier compris entre 1 et 720 heures.", @@ -205,14 +214,33 @@ "newKnowledge.discardSourceDraftTitle": "Abandonner ce brouillon de source ?", "newKnowledge.documentActions": "Actions pour {{name}}", "newKnowledge.documentActionsUnavailable": "Les actions sur les documents ne sont pas encore disponibles pour cette base de connaissances.", + "newKnowledge.documentChunksEmpty": "Aucun segment n’est encore disponible pour cette révision.", + "newKnowledge.documentChunksLoadError": "Impossible de charger les segments de cette révision.", + "newKnowledge.documentChunksLoadMoreError": "Impossible de charger davantage de segments. Réessayez.", "newKnowledge.documentColumn": "Document", + "newKnowledge.documentContentIncomplete": "Chargement du reste du document…", + "newKnowledge.documentContents": "Contenu", + "newKnowledge.documentFacts": "Détails du document", "newKnowledge.documentFilterLabel": "Filtrer les documents par statut", + "newKnowledge.documentLoadErrorDescription": "Impossible de charger ce document. Réessayez.", + "newKnowledge.documentLoadErrorTitle": "Impossible de charger le document", + "newKnowledge.documentNotFoundDescription": "Ce document a peut-être été supprimé ou vous n’y avez pas accès.", + "newKnowledge.documentNotFoundTitle": "Document introuvable", + "newKnowledge.documentOverviewDescription": "L’étiquetage des métadonnées des documents permet à l’IA d’y accéder rapidement et indique aux utilisateurs les sources des références.", "newKnowledge.documentPermissionRestricted": "Les autorisations de votre espace de travail ne permettent pas les actions sur les documents ou les tâches.", + "newKnowledge.documentReindexConfirmationDelayed": "La réindexation a été acceptée, mais l’état de la tâche est retardé. Vérifiez-le avant un nouvel envoi.", + "newKnowledge.documentReindexFailed": "La réindexation a échoué. La dernière révision prête reste disponible.", + "newKnowledge.documentReindexProgress": "Réindexation · {{progress}} %", + "newKnowledge.documentRevision": "Révision", + "newKnowledge.documentRevisionMissingDescription": "Ce document ne possède pas encore de révision prête. Revenez une fois le traitement terminé.", + "newKnowledge.documentRevisionMissingTitle": "Aucune révision disponible", + "newKnowledge.documentRevisionsLoadError": "Impossible de charger l’historique des révisions. La révision actuelle reste disponible.", "newKnowledge.documentStatus.disabled": "Désactivé", "newKnowledge.documentStatus.failed": "Échec", "newKnowledge.documentStatus.processing": "Traitement", "newKnowledge.documentStatus.queued": "En file d'attente", "newKnowledge.documentStatus.ready": "Prêt", + "newKnowledge.documentTaskLookupIncomplete": "Un historique supplémentaire est disponible. Continuez la vérification pour trouver l’état de ce document.", "newKnowledge.documentUploadExclusion.batchLimit": "limite de taille du lot dépassée", "newKnowledge.documentUploadExclusion.countLimit": "limite du nombre de fichiers dépassée", "newKnowledge.documentUploadExclusion.fileSize": "le fichier est trop volumineux", @@ -241,10 +269,12 @@ "newKnowledge.documentsUnavailable": "— documents", "newKnowledge.downloadDocuments": "Télécharger", "newKnowledge.editSource": "Modifier", + "newKnowledge.emptyChunk": "Segment vide", "newKnowledge.emptyDescription": "Ajoutez vos documents et les agents pourront les lire directement, sans indexation à configurer.", "newKnowledge.emptyTitle": "Une façon plus intelligente de créer des bases de connaissances", "newKnowledge.errorDescription": "Impossible de charger vos nouvelles bases de connaissances. Réessayez.", "newKnowledge.errorTitle": "Une erreur s’est produite", + "newKnowledge.fileSize": "Taille du fichier", "newKnowledge.filtersUnavailable": "Ce filtre sera disponible lorsque KnowledgeFS exposera ses métadonnées.", "newKnowledge.firecrawlUnavailable": "Firecrawl n'est pas disponible dans le catalogue des fournisseurs pour cet espace de travail.", "newKnowledge.gotIt": "Compris", @@ -252,9 +282,11 @@ "newKnowledge.guideTitle": "Découvrez la nouvelle base de connaissances ✨", "newKnowledge.illustrationHeadline": "Connectez votre contenu une fois : chaque application répond avec les connaissances les plus récentes.", "newKnowledge.includeSubpages": "Inclure les sous-pages", + "newKnowledge.indexInformation": "Informations d’indexation", "newKnowledge.interruptTask": "Interrompre", "newKnowledge.invalidRootUrl": "Saisissez une URL http(s) valide.", "newKnowledge.keepEditing": "Continuer la modification", + "newKnowledge.lastIndexed": "Dernière indexation", "newKnowledge.lastReadyRevisionHint": "Un traitement échoué n'interrompt jamais la récupération : la dernière révision prête reste disponible dans l'index de contenu.", "newKnowledge.lastSyncColumn": "Dernière synchronisation", "newKnowledge.learnMore": "En savoir plus", @@ -263,10 +295,12 @@ "newKnowledge.leavePartialSetupTitle": "Quitter la configuration incomplète ?", "newKnowledge.legacy": "Ancien", "newKnowledge.loadMore": "Charger plus", + "newKnowledge.loadMoreRevisions": "Charger les anciennes révisions", "newKnowledge.loadingSyncPolicy": "Chargement de la politique de synchronisation", "newKnowledge.manualUpload": "Téléchargement manuel", "newKnowledge.maxPages": "Nombre maximal de pages", "newKnowledge.metadata": "Métadonnées", + "newKnowledge.mimeType": "Type de fichier", "newKnowledge.moreProviders": "Plus de fournisseurs", "newKnowledge.name": "Nom de la connaissance", "newKnowledge.namePlaceholder": "par ex. Manuel de support client", @@ -284,6 +318,7 @@ "newKnowledge.notionNotConnectedDescription": "Connectez Notion pour choisir des pages et les maintenir synchronisées.", "newKnowledge.onlineDocuments": "Documents en ligne", "newKnowledge.onlineDrive": "Drive en ligne", + "newKnowledge.overview": "Vue d’ensemble", "newKnowledge.pagesAppearDescription": "Explorez le site pour vérifier les pages qui seront ajoutées.", "newKnowledge.pagesAppearTitle": "Les pages apparaîtront ici", "newKnowledge.pagesCrawled": "{{count}} pages explorées sur {{host}}", @@ -314,16 +349,24 @@ "newKnowledge.providerNotConfigured": "{{provider}} n'est pas configuré", "newKnowledge.providerNotConfiguredDescription": "Ajoutez une clé API ou une URL de point de terminaison pour explorer les sites Web avec {{provider}}.", "newKnowledge.providerUnavailable": "Ce fournisseur n'est pas disponible.", + "newKnowledge.quality": "Qualité", "newKnowledge.reCrawl": "Relancer l’exploration", "newKnowledge.readOnlyEmpty": "Demandez à un éditeur de l’espace de travail de créer la première base de connaissances.", "newKnowledge.refreshConnectionStatus": "Actualiser l'état", "newKnowledge.refreshingConnection": "Rafraîchissant…", + "newKnowledge.reindexDocument": "Réindexer", "newKnowledge.reindexDocuments": "Réindexer", "newKnowledge.removeSource": "Supprimer la source", + "newKnowledge.retrievalCount": "Nombre de récupérations", "newKnowledge.retryCrawl": "Réessayer l’exploration", "newKnowledge.retryProviderLoad": "Réessayer", + "newKnowledge.retryReindexDocument": "Réindexer à nouveau", "newKnowledge.retrySyncPolicy": "Réessayer la politique de synchronisation", "newKnowledge.retryTask": "Réessayer", + "newKnowledge.revisionState.active": "En service", + "newKnowledge.revisionState.candidate": "Traitement en cours", + "newKnowledge.revisionState.failed": "Échec", + "newKnowledge.revisionState.superseded": "Précédente", "newKnowledge.rootUrl": "URL racine", "newKnowledge.rootUrlPlaceholder": "https://docs.example.com", "newKnowledge.routeUnavailable": "Cette section deviendra disponible lors de la prochaine étape de configuration.", @@ -332,6 +375,7 @@ "newKnowledge.selectAll": "Tout sélectionner", "newKnowledge.selectAllDocuments": "Sélectionnez tous les documents", "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.skippedFailed": "Ignoré (échec)", "newKnowledge.skippedOffDomain": "Ignoré (hors domaine)", @@ -383,9 +427,11 @@ "newKnowledge.tasks": "Tâches", "newKnowledge.tasksErrorDescription": "Nous ne pouvions pas charger les tâches en arrière-plan. Essayer à nouveau.", "newKnowledge.tasksWithAttention": "Tâches, {{count}} nécessitent une attention particulière", + "newKnowledge.tokenCount": "Jetons", "newKnowledge.unavailableDescription": "KnowledgeFS n’est pas disponible pour cet espace de travail actuellement.", "newKnowledge.unavailableTitle": "Les nouvelles connaissances sont indisponibles", "newKnowledge.updated": "Mis à jour le {{date}}", + "newKnowledge.updatedAt": "Dernière mise à jour", "newKnowledge.updatedColumn": "Mis à jour", "newKnowledge.uploadCharactersUnavailable": "Caractères : —", "newKnowledge.uploadDocuments": "Télécharger des documents", diff --git a/web/i18n/hi-IN/dataset.json b/web/i18n/hi-IN/dataset.json index fdd28274534..b28727a0609 100644 --- a/web/i18n/hi-IN/dataset.json +++ b/web/i18n/hi-IN/dataset.json @@ -140,10 +140,12 @@ "newKnowledge.adjustAndRecrawl": "समायोजित करें और फिर से क्रॉल करें", "newKnowledge.allDocumentStatuses": "सभी स्थिति", "newKnowledge.allSources": "सभी स्रोत", + "newKnowledge.apiAgentAccess": "API और एजेंट एक्सेस", "newKnowledge.appsUnavailable": "— ऐप", "newKnowledge.authKind.api-key": "एपीआई कुंजी", "newKnowledge.authKind.endpoint": "समापन बिंदु", "newKnowledge.authenticationMethod": "प्रमाणीकरण विधि", + "newKnowledge.averageChunkLength": "औसत खंड लंबाई", "newKnowledge.backToList": "ज्ञानकोष पर वापस जाएँ", "newKnowledge.backgroundTasks": "पृष्ठभूमि कार्य", "newKnowledge.backgroundTasksDescription": "दस्तावेज़ जोड़ता है, स्रोत सिंक करता है, और नौकरियों को पुन: अनुक्रमित करता है।", @@ -152,6 +154,11 @@ "newKnowledge.bulkDocumentActions": "थोक दस्तावेज़ क्रियाएँ", "newKnowledge.cancelAddSource": "रद्द करें", "newKnowledge.cardType": "नॉलेज स्पेस", + "newKnowledge.characterCount": "अक्षर", + "newKnowledge.checkReindexStatus": "पुनः इंडेक्स स्थिति जाँचें", + "newKnowledge.chunkCount": "खंड", + "newKnowledge.chunkHeading": "खंड {{position}}", + "newKnowledge.chunkLocation": "इस संशोधन में स्थान {{position}}", "newKnowledge.clearDocumentSelection": "दस्तावेज़ चयन साफ़ करें", "newKnowledge.configureProvider": "{{provider}} कॉन्फ़िगर करें", "newKnowledge.connectNotion": "Notion कनेक्ट करें", @@ -165,6 +172,7 @@ "newKnowledge.connectionNeedsAttentionDescription": "वेबसाइट स्रोत जोड़ने से पहले कनेक्शन को ताज़ा करें।", "newKnowledge.connectionProvisioning": "{{provider}} कनेक्ट हो रहा है", "newKnowledge.connectionRefreshFailed": "हम इस कनेक्शन को ताज़ा नहीं कर सके। पुनः प्रयास करें।", + "newKnowledge.continueCheckingTaskStatus": "कार्य स्थिति जाँचना जारी रखें", "newKnowledge.crawlAndPreview": "क्रॉल और पूर्वावलोकन", "newKnowledge.crawlFailed": "{{host}} को क्रॉल नहीं किया जा सका", "newKnowledge.crawlFailed403": "साइट ने 403 लौटाया — हो सकता है कि वह क्रॉलर को रोकती हो या प्रमाणीकरण मांगती हो। URL जाँचें, क्रॉल विकल्प बदलें या किसी दूसरे प्रदाता को आज़माएँ।", @@ -184,6 +192,7 @@ "newKnowledge.createFailed": "हम यह ज्ञानकोष नहीं बना सके। अपनी पहुंच जांचें और पुनः प्रयास करें।", "newKnowledge.createIllustrationTitle": "अपनी सामग्री को एक बार जोड़ें — हर ऐप नवीनतम ज्ञान के साथ उत्तर देगा।", "newKnowledge.createTitle": "ज्ञान पैदा करें", + "newKnowledge.createdAt": "बनाया गया", "newKnowledge.creators": "निर्माता", "newKnowledge.customIntervalHours": "कस्टम अंतराल (घंटे)", "newKnowledge.customIntervalInvalid": "1 से 720 घंटे तक की पूर्ण संख्या दर्ज करें।", @@ -205,14 +214,33 @@ "newKnowledge.discardSourceDraftTitle": "यह स्रोत ड्राफ़्ट हटाएँ?", "newKnowledge.documentActions": "{{name}} के लिए क्रियाएँ", "newKnowledge.documentActionsUnavailable": "इस ज्ञानकोष के लिए दस्तावेज़ क्रियाएँ अभी तक उपलब्ध नहीं हैं।", + "newKnowledge.documentChunksEmpty": "इस संशोधन के लिए अभी कोई खंड उपलब्ध नहीं है।", + "newKnowledge.documentChunksLoadError": "इस संशोधन के खंड लोड नहीं किए जा सके।", + "newKnowledge.documentChunksLoadMoreError": "और खंड लोड नहीं किए जा सके। फिर से कोशिश करें।", "newKnowledge.documentColumn": "दस्तावेज़", + "newKnowledge.documentContentIncomplete": "दस्तावेज़ की शेष सामग्री लोड हो रही है…", + "newKnowledge.documentContents": "विषय-सूची", + "newKnowledge.documentFacts": "दस्तावेज़ विवरण", "newKnowledge.documentFilterLabel": "स्थिति के अनुसार दस्तावेज़ फ़िल्टर करें", + "newKnowledge.documentLoadErrorDescription": "यह दस्तावेज़ लोड नहीं किया जा सका। फिर से कोशिश करें।", + "newKnowledge.documentLoadErrorTitle": "दस्तावेज़ लोड नहीं हुआ", + "newKnowledge.documentNotFoundDescription": "यह दस्तावेज़ हटाया गया हो सकता है या आपके पास पहुँच नहीं है।", + "newKnowledge.documentNotFoundTitle": "दस्तावेज़ नहीं मिला", + "newKnowledge.documentOverviewDescription": "दस्तावेज़ों के मेटाडेटा को लेबल करने से AI उन्हें समय पर एक्सेस कर सकता है और उपयोगकर्ताओं को संदर्भों के स्रोत दिखा सकता है।", "newKnowledge.documentPermissionRestricted": "आपके कार्यस्थान की अनुमतियाँ दस्तावेज़ या कार्य संबंधी कार्रवाइयों की अनुमति नहीं देती हैं।", + "newKnowledge.documentReindexConfirmationDelayed": "पुनः इंडेक्स अनुरोध स्वीकार हुआ, लेकिन कार्य स्थिति में देरी है। दोबारा भेजने से पहले जाँचें।", + "newKnowledge.documentReindexFailed": "पुनः इंडेक्सिंग विफल हुई। अंतिम तैयार संशोधन उपलब्ध रहेगा।", + "newKnowledge.documentReindexProgress": "पुनः इंडेक्स हो रहा है · {{progress}}%", + "newKnowledge.documentRevision": "संशोधन", + "newKnowledge.documentRevisionMissingDescription": "इस दस्तावेज़ का कोई तैयार संशोधन अभी नहीं है। प्रोसेसिंग पूरी होने के बाद फिर देखें।", + "newKnowledge.documentRevisionMissingTitle": "कोई संशोधन उपलब्ध नहीं", + "newKnowledge.documentRevisionsLoadError": "संशोधन इतिहास लोड नहीं हुआ। वर्तमान संशोधन उपलब्ध रहेगा।", "newKnowledge.documentStatus.disabled": "निष्क्रिय", "newKnowledge.documentStatus.failed": "असफल", "newKnowledge.documentStatus.processing": "प्रोसेस हो रहा है", "newKnowledge.documentStatus.queued": "कतारबद्ध", "newKnowledge.documentStatus.ready": "तैयार", + "newKnowledge.documentTaskLookupIncomplete": "अधिक कार्य इतिहास उपलब्ध है। इस दस्तावेज़ की स्थिति खोजने के लिए जाँच जारी रखें।", "newKnowledge.documentUploadExclusion.batchLimit": "बैच आकार सीमा पार हो गई", "newKnowledge.documentUploadExclusion.countLimit": "फ़ाइल संख्या सीमा पार हो गई", "newKnowledge.documentUploadExclusion.fileSize": "फ़ाइल बहुत बड़ी है", @@ -241,10 +269,12 @@ "newKnowledge.documentsUnavailable": "— दस्तावेज़", "newKnowledge.downloadDocuments": "डाउनलोड करें", "newKnowledge.editSource": "संपादित करें", + "newKnowledge.emptyChunk": "खाली खंड", "newKnowledge.emptyDescription": "अपने दस्तावेज़ जोड़ें ताकि एजेंट उन्हें सीधे पढ़ सकें — इंडेक्सिंग कॉन्फ़िगर करने की ज़रूरत नहीं।", "newKnowledge.emptyTitle": "नॉलेज बेस बनाने का अधिक स्मार्ट तरीका", "newKnowledge.errorDescription": "नए नॉलेज बेस लोड नहीं हो सके। फिर से कोशिश करें।", "newKnowledge.errorTitle": "कुछ गलत हुआ", + "newKnowledge.fileSize": "फ़ाइल का आकार", "newKnowledge.filtersUnavailable": "KnowledgeFS के मेटाडेटा उपलब्ध कराने पर यह फ़िल्टर उपलब्ध होगा।", "newKnowledge.firecrawlUnavailable": "इस कार्यक्षेत्र के लिए प्रदाता कैटलॉग में फायरक्रॉल उपलब्ध नहीं है।", "newKnowledge.gotIt": "समझ गया", @@ -252,9 +282,11 @@ "newKnowledge.guideTitle": "नए नॉलेज बेस से मिलें ✨", "newKnowledge.illustrationHeadline": "अपनी सामग्री एक बार कनेक्ट करें — हर ऐप नवीनतम ज्ञान के साथ जवाब देगा।", "newKnowledge.includeSubpages": "उप-पेज शामिल करें", + "newKnowledge.indexInformation": "अनुक्रमणिका जानकारी", "newKnowledge.interruptTask": "रोकें", "newKnowledge.invalidRootUrl": "मान्य http(s) URL दर्ज करें।", "newKnowledge.keepEditing": "संपादन जारी रखें", + "newKnowledge.lastIndexed": "पिछली बार अनुक्रमित", "newKnowledge.lastReadyRevisionHint": "विफल प्रसंस्करण कभी भी पुनर्प्राप्ति को बाधित नहीं करता है - अंतिम तैयार संशोधन सामग्री सूचकांक में उपलब्ध रहता है।", "newKnowledge.lastSyncColumn": "अंतिम सिंक", "newKnowledge.learnMore": "और जानें", @@ -263,10 +295,12 @@ "newKnowledge.leavePartialSetupTitle": "क्या अधूरा सेटअप छोड़ना है?", "newKnowledge.legacy": "पुराना", "newKnowledge.loadMore": "और लोड करें", + "newKnowledge.loadMoreRevisions": "पुराने संशोधन लोड करें", "newKnowledge.loadingSyncPolicy": "सिंक नीति लोड हो रही है", "newKnowledge.manualUpload": "मैन्युअल अपलोड", "newKnowledge.maxPages": "अधिकतम पेज", "newKnowledge.metadata": "मेटा डेटा", + "newKnowledge.mimeType": "फ़ाइल प्रकार", "newKnowledge.moreProviders": "और प्रदाता", "newKnowledge.name": "ज्ञान नाम", "newKnowledge.namePlaceholder": "जैसे ग्राहक सहायता पुस्तिका", @@ -284,6 +318,7 @@ "newKnowledge.notionNotConnectedDescription": "पृष्ठ चुनने और उन्हें सिंक रखने के लिए Notion कनेक्ट करें।", "newKnowledge.onlineDocuments": "ऑनलाइन दस्तावेज़", "newKnowledge.onlineDrive": "ऑनलाइन ड्राइव", + "newKnowledge.overview": "अवलोकन", "newKnowledge.pagesAppearDescription": "जोड़े जाने वाले पेज देखने के लिए साइट को क्रॉल करें।", "newKnowledge.pagesAppearTitle": "पेज यहाँ दिखाई देंगे", "newKnowledge.pagesCrawled": "{{host}} पर {{count}} पेज क्रॉल किए गए", @@ -314,16 +349,24 @@ "newKnowledge.providerNotConfigured": "{{provider}} कॉन्फ़िगर नहीं है", "newKnowledge.providerNotConfiguredDescription": "{{provider}} के साथ वेबसाइटों को क्रॉल करने के लिए एक एपीआई कुंजी या एंडपॉइंट यूआरएल जोड़ें।", "newKnowledge.providerUnavailable": "यह प्रदाता अनुपलब्ध है।", + "newKnowledge.quality": "गुणवत्ता", "newKnowledge.reCrawl": "फिर से क्रॉल करें", "newKnowledge.readOnlyEmpty": "पहला नॉलेज बेस बनाने के लिए कार्यस्थान संपादक से कहें।", "newKnowledge.refreshConnectionStatus": "स्थिति ताज़ा करें", "newKnowledge.refreshingConnection": "ताज़ा…", + "newKnowledge.reindexDocument": "पुनः इंडेक्स करें", "newKnowledge.reindexDocuments": "पुन: अनुक्रमणिका", "newKnowledge.removeSource": "स्रोत हटाएं", + "newKnowledge.retrievalCount": "पुनर्प्राप्ति संख्या", "newKnowledge.retryCrawl": "क्रॉल का फिर से प्रयास करें", "newKnowledge.retryProviderLoad": "पुनः प्रयास करें", + "newKnowledge.retryReindexDocument": "फिर से पुनः इंडेक्स करें", "newKnowledge.retrySyncPolicy": "सिंक नीति फिर से लोड करें", "newKnowledge.retryTask": "पुनः प्रयास करें", + "newKnowledge.revisionState.active": "सक्रिय", + "newKnowledge.revisionState.candidate": "प्रोसेस हो रहा है", + "newKnowledge.revisionState.failed": "विफल", + "newKnowledge.revisionState.superseded": "पिछला", "newKnowledge.rootUrl": "रूट URL", "newKnowledge.rootUrlPlaceholder": "https://docs.example.com", "newKnowledge.routeUnavailable": "यह अनुभाग अगले सेटअप चरण में उपलब्ध हो जाएगा.", @@ -332,6 +375,7 @@ "newKnowledge.selectAll": "सभी चुनें", "newKnowledge.selectAllDocuments": "सभी दस्तावेज़ चुनें", "newKnowledge.selectAllSources": "सभी स्रोत चुनें", + "newKnowledge.selectChunk": "सामग्री देखने के लिए कोई खंड चुनें।", "newKnowledge.selectFilesAndFolders": "सिंक करने के लिए फ़ाइलें और फ़ोल्डर चुनें", "newKnowledge.skippedFailed": "छोड़ा गया (विफल)", "newKnowledge.skippedOffDomain": "छोड़ा गया (डोमेन से बाहर)", @@ -383,9 +427,11 @@ "newKnowledge.tasks": "कार्य", "newKnowledge.tasksErrorDescription": "हम पृष्ठभूमि कार्य लोड नहीं कर सके. पुनः प्रयास करें।", "newKnowledge.tasksWithAttention": "कार्य, {{count}} पर ध्यान देने की आवश्यकता है", + "newKnowledge.tokenCount": "टोकन", "newKnowledge.unavailableDescription": "KnowledgeFS अभी इस कार्यस्थान के लिए उपलब्ध नहीं है।", "newKnowledge.unavailableTitle": "नया नॉलेज उपलब्ध नहीं है", "newKnowledge.updated": "{{date}} को अपडेट किया गया", + "newKnowledge.updatedAt": "अंतिम अपडेट", "newKnowledge.updatedColumn": "अद्यतन किया गया", "newKnowledge.uploadCharactersUnavailable": "वर्ण: —", "newKnowledge.uploadDocuments": "दस्तावेज़ अपलोड करें", diff --git a/web/i18n/id-ID/dataset.json b/web/i18n/id-ID/dataset.json index 843b8f3963a..d1029d7660d 100644 --- a/web/i18n/id-ID/dataset.json +++ b/web/i18n/id-ID/dataset.json @@ -140,10 +140,12 @@ "newKnowledge.adjustAndRecrawl": "Sesuaikan dan rayapi ulang", "newKnowledge.allDocumentStatuses": "Semua status", "newKnowledge.allSources": "Semua sumber", + "newKnowledge.apiAgentAccess": "Akses API & Agen", "newKnowledge.appsUnavailable": "— aplikasi", "newKnowledge.authKind.api-key": "kunci API", "newKnowledge.authKind.endpoint": "Titik akhir", "newKnowledge.authenticationMethod": "Metode otentikasi", + "newKnowledge.averageChunkLength": "Panjang potongan rata-rata", "newKnowledge.backToList": "Kembali ke basis pengetahuan", "newKnowledge.backgroundTasks": "Tugas latar belakang", "newKnowledge.backgroundTasksDescription": "Penambahan dokumen, sinkronisasi sumber, dan mengindeks ulang pekerjaan.", @@ -152,6 +154,11 @@ "newKnowledge.bulkDocumentActions": "Tindakan dokumen massal", "newKnowledge.cancelAddSource": "Batal", "newKnowledge.cardType": "Ruang pengetahuan", + "newKnowledge.characterCount": "Karakter", + "newKnowledge.checkReindexStatus": "Periksa status pengindeksan ulang", + "newKnowledge.chunkCount": "Potongan", + "newKnowledge.chunkHeading": "Potongan {{position}}", + "newKnowledge.chunkLocation": "Posisi {{position}} dalam revisi ini", "newKnowledge.clearDocumentSelection": "Hapus pilihan dokumen", "newKnowledge.configureProvider": "Konfigurasikan {{provider}}", "newKnowledge.connectNotion": "Hubungkan Notion", @@ -165,6 +172,7 @@ "newKnowledge.connectionNeedsAttentionDescription": "Segarkan koneksi sebelum menambahkan sumber situs web.", "newKnowledge.connectionProvisioning": "{{provider}} terhubung", "newKnowledge.connectionRefreshFailed": "Kami tidak dapat menyegarkan koneksi ini. Coba lagi.", + "newKnowledge.continueCheckingTaskStatus": "Lanjutkan pemeriksaan status tugas", "newKnowledge.crawlAndPreview": "Perayapan & pratinjau", "newKnowledge.crawlFailed": "Tidak dapat merayapi {{host}}", "newKnowledge.crawlFailed403": "Situs mengembalikan 403 — situs mungkin memblokir perayap atau memerlukan autentikasi. Periksa URL, sesuaikan opsi perayapan, atau coba penyedia lain.", @@ -184,6 +192,7 @@ "newKnowledge.createFailed": "Kami tidak dapat membuat basis pengetahuan ini. Periksa akses Anda dan coba lagi.", "newKnowledge.createIllustrationTitle": "Hubungkan konten sekali — setiap aplikasi menjawab dengan pengetahuan terbaru.", "newKnowledge.createTitle": "Ciptakan Pengetahuan", + "newKnowledge.createdAt": "Dibuat", "newKnowledge.creators": "Pembuat", "newKnowledge.customIntervalHours": "Interval khusus (jam)", "newKnowledge.customIntervalInvalid": "Masukkan bilangan bulat antara 1 hingga 720 jam.", @@ -205,14 +214,33 @@ "newKnowledge.discardSourceDraftTitle": "Buang draf sumber ini?", "newKnowledge.documentActions": "Tindakan untuk {{name}}", "newKnowledge.documentActionsUnavailable": "Tindakan dokumen belum tersedia untuk basis pengetahuan ini.", + "newKnowledge.documentChunksEmpty": "Belum ada potongan yang tersedia untuk revisi ini.", + "newKnowledge.documentChunksLoadError": "Potongan untuk revisi ini tidak dapat dimuat.", + "newKnowledge.documentChunksLoadMoreError": "Potongan lainnya tidak dapat dimuat. Coba lagi.", "newKnowledge.documentColumn": "Dokumen", + "newKnowledge.documentContentIncomplete": "Memuat sisa konten dokumen…", + "newKnowledge.documentContents": "Isi", + "newKnowledge.documentFacts": "Detail dokumen", "newKnowledge.documentFilterLabel": "Filter dokumen berdasarkan status", + "newKnowledge.documentLoadErrorDescription": "Dokumen ini tidak dapat dimuat. Coba lagi.", + "newKnowledge.documentLoadErrorTitle": "Dokumen tidak dapat dimuat", + "newKnowledge.documentNotFoundDescription": "Dokumen ini mungkin telah dihapus atau Anda tidak memiliki akses.", + "newKnowledge.documentNotFoundTitle": "Dokumen tidak ditemukan", + "newKnowledge.documentOverviewDescription": "Pelabelan metadata dokumen membantu AI mengaksesnya tepat waktu dan menampilkan sumber referensi kepada pengguna.", "newKnowledge.documentPermissionRestricted": "Izin ruang kerja Anda tidak mengizinkan tindakan pada dokumen atau tugas.", + "newKnowledge.documentReindexConfirmationDelayed": "Pengindeksan ulang diterima, tetapi status tugas tertunda. Periksa sebelum mengirim ulang.", + "newKnowledge.documentReindexFailed": "Pengindeksan ulang gagal. Revisi siap terakhir tetap tersedia.", + "newKnowledge.documentReindexProgress": "Mengindeks ulang · {{progress}}%", + "newKnowledge.documentRevision": "Revisi", + "newKnowledge.documentRevisionMissingDescription": "Dokumen ini belum memiliki revisi siap. Periksa lagi setelah pemrosesan selesai.", + "newKnowledge.documentRevisionMissingTitle": "Tidak ada revisi yang tersedia", + "newKnowledge.documentRevisionsLoadError": "Riwayat revisi tidak dapat dimuat. Revisi saat ini tetap tersedia.", "newKnowledge.documentStatus.disabled": "Dinonaktifkan", "newKnowledge.documentStatus.failed": "Gagal", "newKnowledge.documentStatus.processing": "Pemrosesan", "newKnowledge.documentStatus.queued": "Mengantri", "newKnowledge.documentStatus.ready": "Siap", + "newKnowledge.documentTaskLookupIncomplete": "Riwayat tugas lainnya tersedia. Lanjutkan pemeriksaan untuk menemukan status dokumen ini.", "newKnowledge.documentUploadExclusion.batchLimit": "batas ukuran batch terlampaui", "newKnowledge.documentUploadExclusion.countLimit": "batas jumlah file terlampaui", "newKnowledge.documentUploadExclusion.fileSize": "file terlalu besar", @@ -241,10 +269,12 @@ "newKnowledge.documentsUnavailable": "— dokumen", "newKnowledge.downloadDocuments": "Unduh", "newKnowledge.editSource": "Sunting", + "newKnowledge.emptyChunk": "Potongan kosong", "newKnowledge.emptyDescription": "Tambahkan dokumen agar agen dapat membacanya langsung — tanpa perlu mengatur pengindeksan.", "newKnowledge.emptyTitle": "Cara yang lebih cerdas untuk membuat basis pengetahuan", "newKnowledge.errorDescription": "Kami tidak dapat memuat basis pengetahuan baru Anda. Coba lagi.", "newKnowledge.errorTitle": "Terjadi kesalahan", + "newKnowledge.fileSize": "Ukuran file", "newKnowledge.filtersUnavailable": "Filter ini akan tersedia saat KnowledgeFS menyediakan metadatanya.", "newKnowledge.firecrawlUnavailable": "Firecrawl tidak tersedia di katalog penyedia untuk ruang kerja ini.", "newKnowledge.gotIt": "Mengerti", @@ -252,9 +282,11 @@ "newKnowledge.guideTitle": "Kenali Basis Pengetahuan baru ✨", "newKnowledge.illustrationHeadline": "Hubungkan konten Anda sekali — setiap aplikasi menjawab dengan pengetahuan terbaru.", "newKnowledge.includeSubpages": "Sertakan subhalaman", + "newKnowledge.indexInformation": "Informasi indeks", "newKnowledge.interruptTask": "Hentikan", "newKnowledge.invalidRootUrl": "Masukkan URL http(s) yang valid.", "newKnowledge.keepEditing": "Lanjutkan mengedit", + "newKnowledge.lastIndexed": "Terakhir diindeks", "newKnowledge.lastReadyRevisionHint": "Pemrosesan yang gagal tidak pernah mengganggu pengambilan — revisi terakhir yang siap tetap tersedia di indeks konten.", "newKnowledge.lastSyncColumn": "Sinkronisasi terakhir", "newKnowledge.learnMore": "Pelajari lebih lanjut", @@ -263,10 +295,12 @@ "newKnowledge.leavePartialSetupTitle": "Keluar dari penyiapan yang belum selesai?", "newKnowledge.legacy": "Lama", "newKnowledge.loadMore": "Muat lebih banyak", + "newKnowledge.loadMoreRevisions": "Muat revisi lama", "newKnowledge.loadingSyncPolicy": "Memuat kebijakan sinkronisasi", "newKnowledge.manualUpload": "Unggah secara manual", "newKnowledge.maxPages": "Halaman maksimum", "newKnowledge.metadata": "Data Meta", + "newKnowledge.mimeType": "Jenis file", "newKnowledge.moreProviders": "Penyedia lainnya", "newKnowledge.name": "Nama pengetahuan", "newKnowledge.namePlaceholder": "misalnya Buku Pegangan Dukungan Pelanggan", @@ -284,6 +318,7 @@ "newKnowledge.notionNotConnectedDescription": "Hubungkan Notion untuk memilih halaman dan menjaganya tetap tersinkron.", "newKnowledge.onlineDocuments": "Dokumen daring", "newKnowledge.onlineDrive": "Perjalanan daring", + "newKnowledge.overview": "Ringkasan", "newKnowledge.pagesAppearDescription": "Rayapi situs untuk meninjau halaman yang akan ditambahkan.", "newKnowledge.pagesAppearTitle": "Halaman akan muncul di sini", "newKnowledge.pagesCrawled": "{{count}} halaman dirayapi di {{host}}", @@ -314,16 +349,24 @@ "newKnowledge.providerNotConfigured": "{{provider}} tidak dikonfigurasi", "newKnowledge.providerNotConfiguredDescription": "Tambahkan kunci API atau URL titik akhir untuk merayapi situs web dengan {{provider}}.", "newKnowledge.providerUnavailable": "Penyedia ini tidak tersedia.", + "newKnowledge.quality": "Kualitas", "newKnowledge.reCrawl": "Rayapi ulang", "newKnowledge.readOnlyEmpty": "Minta editor ruang kerja membuat basis pengetahuan pertama.", "newKnowledge.refreshConnectionStatus": "Segarkan status", "newKnowledge.refreshingConnection": "Menyegarkan…", + "newKnowledge.reindexDocument": "Indeks ulang", "newKnowledge.reindexDocuments": "Indeks ulang", "newKnowledge.removeSource": "Hapus sumber", + "newKnowledge.retrievalCount": "Jumlah pengambilan", "newKnowledge.retryCrawl": "Coba perayapan lagi", "newKnowledge.retryProviderLoad": "Coba lagi", + "newKnowledge.retryReindexDocument": "Indeks ulang lagi", "newKnowledge.retrySyncPolicy": "Coba lagi kebijakan sinkronisasi", "newKnowledge.retryTask": "Coba lagi", + "newKnowledge.revisionState.active": "Aktif", + "newKnowledge.revisionState.candidate": "Memproses", + "newKnowledge.revisionState.failed": "Gagal", + "newKnowledge.revisionState.superseded": "Sebelumnya", "newKnowledge.rootUrl": "URL root", "newKnowledge.rootUrlPlaceholder": "https://docs.example.com", "newKnowledge.routeUnavailable": "Bagian ini akan tersedia pada langkah penyiapan berikutnya.", @@ -332,6 +375,7 @@ "newKnowledge.selectAll": "Pilih semua", "newKnowledge.selectAllDocuments": "Pilih semua dokumen", "newKnowledge.selectAllSources": "Pilih semua sumber", + "newKnowledge.selectChunk": "Pilih potongan untuk memeriksa isinya.", "newKnowledge.selectFilesAndFolders": "Pilih file dan folder untuk disinkronkan", "newKnowledge.skippedFailed": "Dilewati (gagal)", "newKnowledge.skippedOffDomain": "Dilewati (di luar domain)", @@ -383,9 +427,11 @@ "newKnowledge.tasks": "Tugas", "newKnowledge.tasksErrorDescription": "Kami tidak dapat memuat tugas latar belakang. Coba lagi.", "newKnowledge.tasksWithAttention": "Tugas, {{count}} perlu perhatian", + "newKnowledge.tokenCount": "Token", "newKnowledge.unavailableDescription": "KnowledgeFS saat ini tidak tersedia untuk ruang kerja ini.", "newKnowledge.unavailableTitle": "Pengetahuan Baru tidak tersedia", "newKnowledge.updated": "Diperbarui {{date}}", + "newKnowledge.updatedAt": "Terakhir diperbarui", "newKnowledge.updatedColumn": "Diperbarui", "newKnowledge.uploadCharactersUnavailable": "Karakter: —", "newKnowledge.uploadDocuments": "Unggah dokumen", diff --git a/web/i18n/it-IT/dataset.json b/web/i18n/it-IT/dataset.json index e38310e1b06..b3d4091dab2 100644 --- a/web/i18n/it-IT/dataset.json +++ b/web/i18n/it-IT/dataset.json @@ -140,10 +140,12 @@ "newKnowledge.adjustAndRecrawl": "Modifica e ripeti la scansione", "newKnowledge.allDocumentStatuses": "Tutto lo stato", "newKnowledge.allSources": "Tutte le fonti", + "newKnowledge.apiAgentAccess": "Accesso API e agenti", "newKnowledge.appsUnavailable": "— app", "newKnowledge.authKind.api-key": "Chiave API", "newKnowledge.authKind.endpoint": "Punto finale", "newKnowledge.authenticationMethod": "Metodo di autenticazione", + "newKnowledge.averageChunkLength": "Lunghezza media dei segmenti", "newKnowledge.backToList": "Torniamo alle basi di conoscenza", "newKnowledge.backgroundTasks": "Attività in background", "newKnowledge.backgroundTasksDescription": "Aggiunte di documenti, sincronizzazioni di origini e processi di reindicizzazione.", @@ -152,6 +154,11 @@ "newKnowledge.bulkDocumentActions": "Azioni di documenti in blocco", "newKnowledge.cancelAddSource": "Annulla", "newKnowledge.cardType": "Spazio di conoscenza", + "newKnowledge.characterCount": "Caratteri", + "newKnowledge.checkReindexStatus": "Controlla stato reindicizzazione", + "newKnowledge.chunkCount": "Segmenti", + "newKnowledge.chunkHeading": "Segmento {{position}}", + "newKnowledge.chunkLocation": "Posizione {{position}} in questa revisione", "newKnowledge.clearDocumentSelection": "Cancella la selezione del documento", "newKnowledge.configureProvider": "Configura {{provider}}", "newKnowledge.connectNotion": "Connetti Notion", @@ -165,6 +172,7 @@ "newKnowledge.connectionNeedsAttentionDescription": "Aggiorna la connessione prima di aggiungere una fonte web.", "newKnowledge.connectionProvisioning": "{{provider}} si sta connettendo", "newKnowledge.connectionRefreshFailed": "Impossibile aggiornare questa connessione. Riprova.", + "newKnowledge.continueCheckingTaskStatus": "Continua a controllare lo stato", "newKnowledge.crawlAndPreview": "Scansione e anteprima", "newKnowledge.crawlFailed": "Impossibile eseguire la scansione di {{host}}", "newKnowledge.crawlFailed403": "Il sito ha restituito un errore 403: potrebbe bloccare i crawler o richiedere l’autenticazione. Controlla l’URL, modifica le opzioni di scansione o prova un altro provider.", @@ -184,6 +192,7 @@ "newKnowledge.createFailed": "Non è stato possibile creare questa base di conoscenza. Controlla il tuo accesso e riprova.", "newKnowledge.createIllustrationTitle": "Collega i contenuti una sola volta: ogni app risponde con le conoscenze più aggiornate.", "newKnowledge.createTitle": "Creare Conoscenza", + "newKnowledge.createdAt": "Creato", "newKnowledge.creators": "Autori", "newKnowledge.customIntervalHours": "Intervallo personalizzato (ore)", "newKnowledge.customIntervalInvalid": "Inserisci un numero intero compreso tra 1 e 720 ore.", @@ -205,14 +214,33 @@ "newKnowledge.discardSourceDraftTitle": "Eliminare questa bozza della fonte?", "newKnowledge.documentActions": "Azioni per {{name}}", "newKnowledge.documentActionsUnavailable": "Le azioni del documento non sono ancora disponibili per questa knowledge base.", + "newKnowledge.documentChunksEmpty": "Non sono ancora disponibili segmenti per questa revisione.", + "newKnowledge.documentChunksLoadError": "Impossibile caricare i segmenti di questa revisione.", + "newKnowledge.documentChunksLoadMoreError": "Impossibile caricare altri segmenti. Riprova.", "newKnowledge.documentColumn": "Documento", + "newKnowledge.documentContentIncomplete": "Caricamento del contenuto restante del documento…", + "newKnowledge.documentContents": "Contenuti", + "newKnowledge.documentFacts": "Dettagli documento", "newKnowledge.documentFilterLabel": "Filtra i documenti per stato", + "newKnowledge.documentLoadErrorDescription": "Impossibile caricare questo documento. Riprova.", + "newKnowledge.documentLoadErrorTitle": "Impossibile caricare il documento", + "newKnowledge.documentNotFoundDescription": "Il documento potrebbe essere stato rimosso oppure potresti non avere accesso.", + "newKnowledge.documentNotFoundTitle": "Documento non trovato", + "newKnowledge.documentOverviewDescription": "L’etichettatura dei metadati dei documenti consente all’IA di accedervi tempestivamente e mostra agli utenti le fonti dei riferimenti.", "newKnowledge.documentPermissionRestricted": "Le autorizzazioni del workspace non consentono azioni su documenti o attività.", + "newKnowledge.documentReindexConfirmationDelayed": "La reindicizzazione è stata accettata, ma lo stato dell’attività è in ritardo. Controllalo prima di inviarne un’altra.", + "newKnowledge.documentReindexFailed": "La reindicizzazione non è riuscita. L’ultima revisione pronta resta disponibile.", + "newKnowledge.documentReindexProgress": "Reindicizzazione · {{progress}}%", + "newKnowledge.documentRevision": "Revisione", + "newKnowledge.documentRevisionMissingDescription": "Questo documento non ha ancora una revisione pronta. Ricontrolla al termine dell’elaborazione.", + "newKnowledge.documentRevisionMissingTitle": "Nessuna revisione disponibile", + "newKnowledge.documentRevisionsLoadError": "Impossibile caricare la cronologia delle revisioni. La revisione corrente resta disponibile.", "newKnowledge.documentStatus.disabled": "Disattivato", "newKnowledge.documentStatus.failed": "Fallito", "newKnowledge.documentStatus.processing": "Elaborazione", "newKnowledge.documentStatus.queued": "In coda", "newKnowledge.documentStatus.ready": "Pronto", + "newKnowledge.documentTaskLookupIncomplete": "È disponibile altra cronologia delle attività. Continua a controllare per trovare lo stato del documento.", "newKnowledge.documentUploadExclusion.batchLimit": "limite delle dimensioni del batch superato", "newKnowledge.documentUploadExclusion.countLimit": "limite del numero di file superato", "newKnowledge.documentUploadExclusion.fileSize": "il file è troppo grande", @@ -241,10 +269,12 @@ "newKnowledge.documentsUnavailable": "— documenti", "newKnowledge.downloadDocuments": "Scarica", "newKnowledge.editSource": "Modifica", + "newKnowledge.emptyChunk": "Segmento vuoto", "newKnowledge.emptyDescription": "Aggiungi i tuoi documenti e gli agenti potranno leggerli direttamente, senza configurare l’indicizzazione.", "newKnowledge.emptyTitle": "Un modo più intelligente per creare knowledge base", "newKnowledge.errorDescription": "Non è stato possibile caricare le nuove knowledge base. Riprova.", "newKnowledge.errorTitle": "Si è verificato un problema", + "newKnowledge.fileSize": "Dimensione file", "newKnowledge.filtersUnavailable": "Questo filtro sarà disponibile quando KnowledgeFS esporrà i relativi metadati.", "newKnowledge.firecrawlUnavailable": "Firecrawl non è disponibile nel catalogo del provider per questa area di lavoro.", "newKnowledge.gotIt": "Ho capito", @@ -252,9 +282,11 @@ "newKnowledge.guideTitle": "Scopri la nuova Knowledge Base ✨", "newKnowledge.illustrationHeadline": "Collega i tuoi contenuti una sola volta: ogni app risponderà con le conoscenze più aggiornate.", "newKnowledge.includeSubpages": "Includi sottopagine", + "newKnowledge.indexInformation": "Informazioni sull’indice", "newKnowledge.interruptTask": "Interrompere", "newKnowledge.invalidRootUrl": "Inserisci un URL http(s) valido.", "newKnowledge.keepEditing": "Continua a modificare", + "newKnowledge.lastIndexed": "Ultima indicizzazione", "newKnowledge.lastReadyRevisionHint": "L'elaborazione non riuscita non interrompe mai il recupero: l'ultima revisione pronta rimane disponibile nell'indice del contenuto.", "newKnowledge.lastSyncColumn": "Ultima sincronizzazione", "newKnowledge.learnMore": "Scopri di più", @@ -263,10 +295,12 @@ "newKnowledge.leavePartialSetupTitle": "Uscire dalla configurazione incompleta?", "newKnowledge.legacy": "Legacy", "newKnowledge.loadMore": "Carica altro", + "newKnowledge.loadMoreRevisions": "Carica revisioni precedenti", "newKnowledge.loadingSyncPolicy": "Caricamento dei criteri di sincronizzazione", "newKnowledge.manualUpload": "Caricamento manuale", "newKnowledge.maxPages": "Numero massimo di pagine", "newKnowledge.metadata": "Metadati", + "newKnowledge.mimeType": "Tipo di file", "newKnowledge.moreProviders": "Altri provider", "newKnowledge.name": "Nome della conoscenza", "newKnowledge.namePlaceholder": "ad es. Manuale dell'assistenza clienti", @@ -284,6 +318,7 @@ "newKnowledge.notionNotConnectedDescription": "Connetti Notion per scegliere le pagine e mantenerle sincronizzate.", "newKnowledge.onlineDocuments": "Documenti online", "newKnowledge.onlineDrive": "Unità in linea", + "newKnowledge.overview": "Panoramica", "newKnowledge.pagesAppearDescription": "Esegui la scansione del sito per verificare quali pagine verranno aggiunte.", "newKnowledge.pagesAppearTitle": "Le pagine appariranno qui", "newKnowledge.pagesCrawled": "{{count}} pagine sottoposte a scansione su {{host}}", @@ -314,16 +349,24 @@ "newKnowledge.providerNotConfigured": "{{provider}} non è configurato", "newKnowledge.providerNotConfiguredDescription": "Aggiungi una chiave API o un URL endpoint per eseguire la scansione dei siti web con {{provider}}.", "newKnowledge.providerUnavailable": "Questo fornitore non è disponibile.", + "newKnowledge.quality": "Qualità", "newKnowledge.reCrawl": "Ripeti la scansione", "newKnowledge.readOnlyEmpty": "Chiedi a un editor dello spazio di lavoro di creare la prima knowledge base.", "newKnowledge.refreshConnectionStatus": "Aggiorna lo stato", "newKnowledge.refreshingConnection": "Aggiornamento…", + "newKnowledge.reindexDocument": "Reindicizza", "newKnowledge.reindexDocuments": "Reindicizzare", "newKnowledge.removeSource": "Rimuovi la fonte", + "newKnowledge.retrievalCount": "Numero di recuperi", "newKnowledge.retryCrawl": "Riprova la scansione", "newKnowledge.retryProviderLoad": "Riprova", + "newKnowledge.retryReindexDocument": "Reindicizza di nuovo", "newKnowledge.retrySyncPolicy": "Riprova i criteri di sincronizzazione", "newKnowledge.retryTask": "Riprova", + "newKnowledge.revisionState.active": "Attiva", + "newKnowledge.revisionState.candidate": "In elaborazione", + "newKnowledge.revisionState.failed": "Non riuscita", + "newKnowledge.revisionState.superseded": "Precedente", "newKnowledge.rootUrl": "URL principale", "newKnowledge.rootUrlPlaceholder": "https://docs.example.com", "newKnowledge.routeUnavailable": "Questa sezione diventerà disponibile nella fase di configurazione successiva.", @@ -332,6 +375,7 @@ "newKnowledge.selectAll": "Seleziona tutto", "newKnowledge.selectAllDocuments": "Seleziona tutti i documenti", "newKnowledge.selectAllSources": "Seleziona tutte le origini", + "newKnowledge.selectChunk": "Seleziona un segmento per esaminarne il contenuto.", "newKnowledge.selectFilesAndFolders": "Seleziona file e cartelle da sincronizzare", "newKnowledge.skippedFailed": "Ignorato (errore)", "newKnowledge.skippedOffDomain": "Ignorato (fuori dominio)", @@ -383,9 +427,11 @@ "newKnowledge.tasks": "Compiti", "newKnowledge.tasksErrorDescription": "Non è stato possibile caricare le attività in background. Riprova.", "newKnowledge.tasksWithAttention": "I compiti, {{count}} richiedono attenzione", + "newKnowledge.tokenCount": "Token", "newKnowledge.unavailableDescription": "KnowledgeFS non è al momento disponibile per questo spazio di lavoro.", "newKnowledge.unavailableTitle": "La nuova conoscenza non è disponibile", "newKnowledge.updated": "Aggiornato il {{date}}", + "newKnowledge.updatedAt": "Ultimo aggiornamento", "newKnowledge.updatedColumn": "Aggiornato", "newKnowledge.uploadCharactersUnavailable": "Caratteri: —", "newKnowledge.uploadDocuments": "Carica documenti", diff --git a/web/i18n/ja-JP/dataset.json b/web/i18n/ja-JP/dataset.json index 20faf3d04d8..27193e187e4 100644 --- a/web/i18n/ja-JP/dataset.json +++ b/web/i18n/ja-JP/dataset.json @@ -140,10 +140,12 @@ "newKnowledge.adjustAndRecrawl": "調整して再クロール", "newKnowledge.allDocumentStatuses": "すべてのステータス", "newKnowledge.allSources": "すべてのソース", + "newKnowledge.apiAgentAccess": "API とエージェントアクセス", "newKnowledge.appsUnavailable": "— 個のアプリ", "newKnowledge.authKind.api-key": "APIキー", "newKnowledge.authKind.endpoint": "エンドポイント", "newKnowledge.authenticationMethod": "認証方法", + "newKnowledge.averageChunkLength": "チャンクの平均長", "newKnowledge.backToList": "ナレッジベースに戻る", "newKnowledge.backgroundTasks": "バックグラウンドタスク", "newKnowledge.backgroundTasksDescription": "ドキュメントの追加、ソースの同期、ジョブの再インデックス。", @@ -152,6 +154,11 @@ "newKnowledge.bulkDocumentActions": "一括ドキュメントアクション", "newKnowledge.cancelAddSource": "キャンセル", "newKnowledge.cardType": "ナレッジスペース", + "newKnowledge.characterCount": "文字数", + "newKnowledge.checkReindexStatus": "再インデックス状態を確認", + "newKnowledge.chunkCount": "チャンク", + "newKnowledge.chunkHeading": "チャンク {{position}}", + "newKnowledge.chunkLocation": "このリビジョン内の位置 {{position}}", "newKnowledge.clearDocumentSelection": "ドキュメントの選択をクリアする", "newKnowledge.configureProvider": "{{provider}} を構成する", "newKnowledge.connectNotion": "Notion に接続", @@ -165,6 +172,7 @@ "newKnowledge.connectionNeedsAttentionDescription": "Web サイトのソースを追加する前に接続を更新してください。", "newKnowledge.connectionProvisioning": "{{provider}} が接続中です", "newKnowledge.connectionRefreshFailed": "この接続を更新できませんでした。もう一度やり直してください。", + "newKnowledge.continueCheckingTaskStatus": "タスク状態の確認を続ける", "newKnowledge.crawlAndPreview": "クロールとプレビュー", "newKnowledge.crawlFailed": "{{host}} をクロールできませんでした", "newKnowledge.crawlFailed403": "サイトから403が返されました。クローラーがブロックされているか、認証が必要な可能性があります。URLを確認し、クロールオプションを調整するか、別のプロバイダーを試してください。", @@ -184,6 +192,7 @@ "newKnowledge.createFailed": "このナレッジ ベースを作成できませんでした。アクセスを確認して再試行してください。", "newKnowledge.createIllustrationTitle": "コンテンツを一度接続すれば、すべてのアプリが最新のナレッジで回答します。", "newKnowledge.createTitle": "知識の創造", + "newKnowledge.createdAt": "作成日時", "newKnowledge.creators": "作成者", "newKnowledge.customIntervalHours": "カスタム間隔(時間)", "newKnowledge.customIntervalInvalid": "1~720 の整数を入力してください。", @@ -205,14 +214,33 @@ "newKnowledge.discardSourceDraftTitle": "このソースの下書きを破棄しますか?", "newKnowledge.documentActions": "{{name}} のアクション", "newKnowledge.documentActionsUnavailable": "ドキュメント アクションは、このナレッジ ベースではまだ利用できません。", + "newKnowledge.documentChunksEmpty": "このリビジョンで利用できるチャンクはまだありません。", + "newKnowledge.documentChunksLoadError": "このリビジョンのチャンクを読み込めませんでした。", + "newKnowledge.documentChunksLoadMoreError": "追加のチャンクを読み込めませんでした。もう一度お試しください。", "newKnowledge.documentColumn": "文書", + "newKnowledge.documentContentIncomplete": "ドキュメントの残りの内容を読み込んでいます…", + "newKnowledge.documentContents": "目次", + "newKnowledge.documentFacts": "ドキュメントの詳細", "newKnowledge.documentFilterLabel": "ドキュメントをステータスでフィルタリングする", + "newKnowledge.documentLoadErrorDescription": "このドキュメントを読み込めませんでした。もう一度お試しください。", + "newKnowledge.documentLoadErrorTitle": "ドキュメントを読み込めませんでした", + "newKnowledge.documentNotFoundDescription": "このドキュメントは削除されたか、アクセス権がない可能性があります。", + "newKnowledge.documentNotFoundTitle": "ドキュメントが見つかりません", + "newKnowledge.documentOverviewDescription": "ドキュメントのメタデータをラベル付けすると、AI が必要なときにアクセスでき、ユーザーに参照元を示せます。", "newKnowledge.documentPermissionRestricted": "ワークスペースの権限では、ドキュメントまたはタスクの操作を実行できません。", + "newKnowledge.documentReindexConfirmationDelayed": "再インデックスは受理されましたが、タスク状態の反映が遅れています。再送信前に確認してください。", + "newKnowledge.documentReindexFailed": "再インデックスに失敗しました。最後に準備完了となったリビジョンは引き続き利用できます。", + "newKnowledge.documentReindexProgress": "再インデックス中 · {{progress}}%", + "newKnowledge.documentRevision": "リビジョン", + "newKnowledge.documentRevisionMissingDescription": "このドキュメントには準備完了のリビジョンがまだありません。処理完了後に再度確認してください。", + "newKnowledge.documentRevisionMissingTitle": "利用可能なリビジョンはありません", + "newKnowledge.documentRevisionsLoadError": "リビジョン履歴を読み込めませんでした。現在のリビジョンは引き続き利用できます。", "newKnowledge.documentStatus.disabled": "無効", "newKnowledge.documentStatus.failed": "失敗しました", "newKnowledge.documentStatus.processing": "処理中", "newKnowledge.documentStatus.queued": "キューに入れられました", "newKnowledge.documentStatus.ready": "準備完了", + "newKnowledge.documentTaskLookupIncomplete": "さらにタスク履歴があります。このドキュメントの状態を確認し続けてください。", "newKnowledge.documentUploadExclusion.batchLimit": "バッチサイズの上限を超えています", "newKnowledge.documentUploadExclusion.countLimit": "ファイル数の上限を超えています", "newKnowledge.documentUploadExclusion.fileSize": "ファイルが大きすぎます", @@ -241,10 +269,12 @@ "newKnowledge.documentsUnavailable": "— 件のドキュメント", "newKnowledge.downloadDocuments": "ダウンロード", "newKnowledge.editSource": "編集", + "newKnowledge.emptyChunk": "空のチャンク", "newKnowledge.emptyDescription": "ドキュメントを追加すると、エージェントが直接読み取れます。インデックス設定は不要です。", "newKnowledge.emptyTitle": "ナレッジベースをよりスマートに構築", "newKnowledge.errorDescription": "新しいナレッジベースを読み込めませんでした。もう一度お試しください。", "newKnowledge.errorTitle": "問題が発生しました", + "newKnowledge.fileSize": "ファイルサイズ", "newKnowledge.filtersUnavailable": "KnowledgeFS がメタデータを提供すると、このフィルターを利用できます。", "newKnowledge.firecrawlUnavailable": "Firecrawl は、このワークスペースのプロバイダー カタログでは使用できません。", "newKnowledge.gotIt": "了解", @@ -252,9 +282,11 @@ "newKnowledge.guideTitle": "新しいナレッジベースへようこそ ✨", "newKnowledge.illustrationHeadline": "コンテンツを一度接続すれば、すべてのアプリが最新のナレッジで回答します。", "newKnowledge.includeSubpages": "サブページを含める", + "newKnowledge.indexInformation": "インデックス情報", "newKnowledge.interruptTask": "中断", "newKnowledge.invalidRootUrl": "有効なhttp(s) URLを入力してください。", "newKnowledge.keepEditing": "編集を続ける", + "newKnowledge.lastIndexed": "最終インデックス日時", "newKnowledge.lastReadyRevisionHint": "処理が失敗しても取得が中断されることはありません。準備ができた最後のリビジョンはコンテンツ インデックス内で利用可能なままになります。", "newKnowledge.lastSyncColumn": "最終同期", "newKnowledge.learnMore": "詳細を見る", @@ -263,10 +295,12 @@ "newKnowledge.leavePartialSetupTitle": "未完了のセットアップを終了しますか?", "newKnowledge.legacy": "旧バージョン", "newKnowledge.loadMore": "さらに読み込む", + "newKnowledge.loadMoreRevisions": "古いリビジョンを読み込む", "newKnowledge.loadingSyncPolicy": "同期ポリシーを読み込み中", "newKnowledge.manualUpload": "手動アップロード", "newKnowledge.maxPages": "最大ページ数", "newKnowledge.metadata": "メタデータ", + "newKnowledge.mimeType": "ファイル形式", "newKnowledge.moreProviders": "その他のプロバイダー", "newKnowledge.name": "ナレッジ名", "newKnowledge.namePlaceholder": "例:カスタマーサポートハンドブック", @@ -284,6 +318,7 @@ "newKnowledge.notionNotConnectedDescription": "Notion に接続してページを選択し、同期を維持します。", "newKnowledge.onlineDocuments": "オンライン文書", "newKnowledge.onlineDrive": "オンラインドライブ", + "newKnowledge.overview": "概要", "newKnowledge.pagesAppearDescription": "サイトをクロールして、追加されるページを確認します。", "newKnowledge.pagesAppearTitle": "ページはここに表示されます", "newKnowledge.pagesCrawled": "{{host}} で{{count}}ページをクロールしました", @@ -314,16 +349,24 @@ "newKnowledge.providerNotConfigured": "{{provider}} が構成されていません", "newKnowledge.providerNotConfiguredDescription": "{{provider}} を使用して Web サイトをクロールするための API キーまたはエンドポイント URL を追加します。", "newKnowledge.providerUnavailable": "このプロバイダーは利用できません。", + "newKnowledge.quality": "品質", "newKnowledge.reCrawl": "再クロール", "newKnowledge.readOnlyEmpty": "最初のナレッジベースの作成をワークスペース編集者に依頼してください。", "newKnowledge.refreshConnectionStatus": "ステータスの更新", "newKnowledge.refreshingConnection": "爽やか…", + "newKnowledge.reindexDocument": "再インデックス", "newKnowledge.reindexDocuments": "インデックスを再作成する", "newKnowledge.removeSource": "ソースを削除", + "newKnowledge.retrievalCount": "取得回数", "newKnowledge.retryCrawl": "クロールを再試行", "newKnowledge.retryProviderLoad": "再試行", + "newKnowledge.retryReindexDocument": "もう一度再インデックス", "newKnowledge.retrySyncPolicy": "同期ポリシーを再読み込み", "newKnowledge.retryTask": "再試行", + "newKnowledge.revisionState.active": "有効", + "newKnowledge.revisionState.candidate": "処理中", + "newKnowledge.revisionState.failed": "失敗", + "newKnowledge.revisionState.superseded": "以前", "newKnowledge.rootUrl": "ルートURL", "newKnowledge.rootUrlPlaceholder": "https://docs.example.com", "newKnowledge.routeUnavailable": "このセクションは、次のセットアップ手順で使用できるようになります。", @@ -332,6 +375,7 @@ "newKnowledge.selectAll": "すべて選択", "newKnowledge.selectAllDocuments": "すべてのドキュメントを選択します", "newKnowledge.selectAllSources": "すべてのソースを選択", + "newKnowledge.selectChunk": "内容を確認するチャンクを選択してください。", "newKnowledge.selectFilesAndFolders": "同期するファイルとフォルダーを選択", "newKnowledge.skippedFailed": "スキップ(失敗)", "newKnowledge.skippedOffDomain": "スキップ(ドメイン外)", @@ -383,9 +427,11 @@ "newKnowledge.tasks": "タスク", "newKnowledge.tasksErrorDescription": "バックグラウンドタスクをロードできませんでした。もう一度やり直してください。", "newKnowledge.tasksWithAttention": "タスク、{{count}} は注意が必要です", + "newKnowledge.tokenCount": "トークン", "newKnowledge.unavailableDescription": "このワークスペースでは現在 KnowledgeFS を利用できません。", "newKnowledge.unavailableTitle": "新しいナレッジは利用できません", "newKnowledge.updated": "{{date}} に更新", + "newKnowledge.updatedAt": "最終更新", "newKnowledge.updatedColumn": "更新されました", "newKnowledge.uploadCharactersUnavailable": "文字数:—", "newKnowledge.uploadDocuments": "書類のアップロード", diff --git a/web/i18n/ko-KR/dataset.json b/web/i18n/ko-KR/dataset.json index 9b102f3b97c..a821ff43ec5 100644 --- a/web/i18n/ko-KR/dataset.json +++ b/web/i18n/ko-KR/dataset.json @@ -140,10 +140,12 @@ "newKnowledge.adjustAndRecrawl": "조정 후 다시 크롤링", "newKnowledge.allDocumentStatuses": "모든 상태", "newKnowledge.allSources": "모든 소스", + "newKnowledge.apiAgentAccess": "API 및 에이전트 액세스", "newKnowledge.appsUnavailable": "앱 —개", "newKnowledge.authKind.api-key": "API 키", "newKnowledge.authKind.endpoint": "종점", "newKnowledge.authenticationMethod": "인증 방법", + "newKnowledge.averageChunkLength": "평균 청크 길이", "newKnowledge.backToList": "지식 베이스로 돌아가기", "newKnowledge.backgroundTasks": "백그라운드 작업", "newKnowledge.backgroundTasksDescription": "문서 추가, 소스 동기화 및 재색인 작업.", @@ -152,6 +154,11 @@ "newKnowledge.bulkDocumentActions": "대량 문서 작업", "newKnowledge.cancelAddSource": "취소", "newKnowledge.cardType": "지식 공간", + "newKnowledge.characterCount": "문자 수", + "newKnowledge.checkReindexStatus": "재인덱싱 상태 확인", + "newKnowledge.chunkCount": "청크", + "newKnowledge.chunkHeading": "청크 {{position}}", + "newKnowledge.chunkLocation": "이 리비전의 위치 {{position}}", "newKnowledge.clearDocumentSelection": "문서 선택 지우기", "newKnowledge.configureProvider": "{{provider}} 구성", "newKnowledge.connectNotion": "Notion 연결", @@ -165,6 +172,7 @@ "newKnowledge.connectionNeedsAttentionDescription": "웹사이트 소스를 추가하기 전에 연결을 새로 고치세요.", "newKnowledge.connectionProvisioning": "{{provider}}이 연결 중입니다.", "newKnowledge.connectionRefreshFailed": "이 연결을 새로 고칠 수 없습니다. 다시 시도해 보세요.", + "newKnowledge.continueCheckingTaskStatus": "작업 상태 계속 확인", "newKnowledge.crawlAndPreview": "크롤링 및 미리보기", "newKnowledge.crawlFailed": "{{host}}을(를) 크롤링할 수 없습니다", "newKnowledge.crawlFailed403": "사이트에서 403을 반환했습니다. 크롤러를 차단하거나 인증이 필요할 수 있습니다. URL을 확인하고 크롤링 옵션을 조정하거나 다른 제공업체를 사용해 보세요.", @@ -184,6 +192,7 @@ "newKnowledge.createFailed": "이 기술 자료를 만들 수 없습니다. 액세스 권한을 확인하고 다시 시도하세요.", "newKnowledge.createIllustrationTitle": "콘텐츠를 한 번 연결하면 모든 앱이 최신 지식으로 답변합니다.", "newKnowledge.createTitle": "지식 창조", + "newKnowledge.createdAt": "생성됨", "newKnowledge.creators": "생성자", "newKnowledge.customIntervalHours": "사용자 지정 간격(시간)", "newKnowledge.customIntervalInvalid": "1~720 사이의 정수를 입력하세요.", @@ -205,14 +214,33 @@ "newKnowledge.discardSourceDraftTitle": "이 소스 초안을 삭제할까요?", "newKnowledge.documentActions": "{{name}}에 대한 작업", "newKnowledge.documentActionsUnavailable": "이 기술 자료에는 아직 문서 작업을 사용할 수 없습니다.", + "newKnowledge.documentChunksEmpty": "이 리비전에 사용할 수 있는 청크가 아직 없습니다.", + "newKnowledge.documentChunksLoadError": "이 리비전의 청크를 불러오지 못했습니다.", + "newKnowledge.documentChunksLoadMoreError": "청크를 더 불러오지 못했습니다. 다시 시도하세요.", "newKnowledge.documentColumn": "문서", + "newKnowledge.documentContentIncomplete": "나머지 문서 콘텐츠를 불러오는 중…", + "newKnowledge.documentContents": "목차", + "newKnowledge.documentFacts": "문서 세부 정보", "newKnowledge.documentFilterLabel": "상태별로 문서 필터링", + "newKnowledge.documentLoadErrorDescription": "이 문서를 불러오지 못했습니다. 다시 시도하세요.", + "newKnowledge.documentLoadErrorTitle": "문서를 불러오지 못함", + "newKnowledge.documentNotFoundDescription": "이 문서가 삭제되었거나 접근 권한이 없을 수 있습니다.", + "newKnowledge.documentNotFoundTitle": "문서를 찾을 수 없음", + "newKnowledge.documentOverviewDescription": "문서 메타데이터에 레이블을 지정하면 AI가 적시에 문서에 접근하고 사용자에게 참조 출처를 표시할 수 있습니다.", "newKnowledge.documentPermissionRestricted": "워크스페이스 권한으로는 문서 또는 작업 동작을 수행할 수 없습니다.", + "newKnowledge.documentReindexConfirmationDelayed": "재인덱싱이 접수되었지만 작업 상태 반영이 지연되고 있습니다. 다시 제출하기 전에 확인하세요.", + "newKnowledge.documentReindexFailed": "재인덱싱에 실패했습니다. 마지막 준비 완료 리비전은 계속 사용할 수 있습니다.", + "newKnowledge.documentReindexProgress": "재인덱싱 중 · {{progress}}%", + "newKnowledge.documentRevision": "리비전", + "newKnowledge.documentRevisionMissingDescription": "이 문서에는 아직 준비 완료된 리비전이 없습니다. 처리가 끝난 후 다시 확인하세요.", + "newKnowledge.documentRevisionMissingTitle": "사용 가능한 리비전 없음", + "newKnowledge.documentRevisionsLoadError": "리비전 기록을 불러오지 못했습니다. 현재 리비전은 계속 사용할 수 있습니다.", "newKnowledge.documentStatus.disabled": "비활성화", "newKnowledge.documentStatus.failed": "실패", "newKnowledge.documentStatus.processing": "처리 중", "newKnowledge.documentStatus.queued": "대기 중", "newKnowledge.documentStatus.ready": "준비됨", + "newKnowledge.documentTaskLookupIncomplete": "더 많은 작업 기록이 있습니다. 이 문서의 상태를 찾으려면 계속 확인하세요.", "newKnowledge.documentUploadExclusion.batchLimit": "배치 크기 제한을 초과했습니다", "newKnowledge.documentUploadExclusion.countLimit": "파일 수 제한을 초과했습니다", "newKnowledge.documentUploadExclusion.fileSize": "파일이 너무 큽니다", @@ -241,10 +269,12 @@ "newKnowledge.documentsUnavailable": "문서 —개", "newKnowledge.downloadDocuments": "다운로드", "newKnowledge.editSource": "편집", + "newKnowledge.emptyChunk": "빈 청크", "newKnowledge.emptyDescription": "문서를 추가하면 에이전트가 직접 읽을 수 있습니다. 인덱싱 설정은 필요하지 않습니다.", "newKnowledge.emptyTitle": "지식 베이스를 구축하는 더 스마트한 방법", "newKnowledge.errorDescription": "새 지식 베이스를 불러오지 못했습니다. 다시 시도하세요.", "newKnowledge.errorTitle": "문제가 발생했습니다", + "newKnowledge.fileSize": "파일 크기", "newKnowledge.filtersUnavailable": "KnowledgeFS에서 메타데이터를 제공하면 이 필터를 사용할 수 있습니다.", "newKnowledge.firecrawlUnavailable": "이 작업공간의 공급자 카탈로그에서는 Firecrawl을 사용할 수 없습니다.", "newKnowledge.gotIt": "확인", @@ -252,9 +282,11 @@ "newKnowledge.guideTitle": "새로운 지식 베이스를 만나보세요 ✨", "newKnowledge.illustrationHeadline": "콘텐츠를 한 번 연결하면 모든 앱이 최신 지식으로 답변합니다.", "newKnowledge.includeSubpages": "하위 페이지 포함", + "newKnowledge.indexInformation": "인덱스 정보", "newKnowledge.interruptTask": "중단", "newKnowledge.invalidRootUrl": "유효한 http(s) URL을 입력하세요.", "newKnowledge.keepEditing": "계속 편집", + "newKnowledge.lastIndexed": "마지막 인덱싱", "newKnowledge.lastReadyRevisionHint": "실패한 처리는 검색을 중단하지 않습니다. 마지막으로 준비된 개정은 콘텐츠 인덱스에서 계속 사용할 수 있습니다.", "newKnowledge.lastSyncColumn": "마지막 동기화", "newKnowledge.learnMore": "자세히 알아보기", @@ -263,10 +295,12 @@ "newKnowledge.leavePartialSetupTitle": "완료되지 않은 설정을 나갈까요?", "newKnowledge.legacy": "레거시", "newKnowledge.loadMore": "더 보기", + "newKnowledge.loadMoreRevisions": "이전 리비전 불러오기", "newKnowledge.loadingSyncPolicy": "동기화 정책 불러오는 중", "newKnowledge.manualUpload": "수동 업로드", "newKnowledge.maxPages": "최대 페이지 수", "newKnowledge.metadata": "메타데이터", + "newKnowledge.mimeType": "파일 형식", "newKnowledge.moreProviders": "더 많은 공급자", "newKnowledge.name": "지식 이름", "newKnowledge.namePlaceholder": "예를 들어 고객 지원 핸드북", @@ -284,6 +318,7 @@ "newKnowledge.notionNotConnectedDescription": "페이지를 선택하고 동기화 상태를 유지하려면 Notion을 연결하세요.", "newKnowledge.onlineDocuments": "온라인 문서", "newKnowledge.onlineDrive": "온라인 드라이브", + "newKnowledge.overview": "개요", "newKnowledge.pagesAppearDescription": "사이트를 크롤링하여 추가될 페이지를 확인하세요.", "newKnowledge.pagesAppearTitle": "페이지가 여기에 표시됩니다", "newKnowledge.pagesCrawled": "{{host}}에서 {{count}}개 페이지를 크롤링했습니다", @@ -314,16 +349,24 @@ "newKnowledge.providerNotConfigured": "{{provider}}이 구성되지 않았습니다.", "newKnowledge.providerNotConfiguredDescription": "{{provider}}을(를) 사용하여 웹사이트를 크롤링하려면 API 키 또는 엔드포인트 URL을 추가하세요.", "newKnowledge.providerUnavailable": "이 제공자를 사용할 수 없습니다.", + "newKnowledge.quality": "품질", "newKnowledge.reCrawl": "다시 크롤링", "newKnowledge.readOnlyEmpty": "워크스페이스 편집자에게 첫 번째 지식 베이스 생성을 요청하세요.", "newKnowledge.refreshConnectionStatus": "새로 고침 상태", "newKnowledge.refreshingConnection": "상쾌하다…", + "newKnowledge.reindexDocument": "재인덱싱", "newKnowledge.reindexDocuments": "재인덱싱", "newKnowledge.removeSource": "소스 제거", + "newKnowledge.retrievalCount": "검색 횟수", "newKnowledge.retryCrawl": "크롤링 다시 시도", "newKnowledge.retryProviderLoad": "재시도", + "newKnowledge.retryReindexDocument": "다시 재인덱싱", "newKnowledge.retrySyncPolicy": "동기화 정책 다시 시도", "newKnowledge.retryTask": "재시도", + "newKnowledge.revisionState.active": "활성", + "newKnowledge.revisionState.candidate": "처리 중", + "newKnowledge.revisionState.failed": "실패", + "newKnowledge.revisionState.superseded": "이전", "newKnowledge.rootUrl": "루트 URL", "newKnowledge.rootUrlPlaceholder": "https://docs.example.com", "newKnowledge.routeUnavailable": "이 섹션은 다음 설정 단계에서 사용할 수 있습니다.", @@ -332,6 +375,7 @@ "newKnowledge.selectAll": "모두 선택", "newKnowledge.selectAllDocuments": "모든 문서 선택", "newKnowledge.selectAllSources": "모든 소스 선택", + "newKnowledge.selectChunk": "내용을 확인할 청크를 선택하세요.", "newKnowledge.selectFilesAndFolders": "동기화할 파일과 폴더 선택", "newKnowledge.skippedFailed": "건너뜀(실패)", "newKnowledge.skippedOffDomain": "건너뜀(도메인 외부)", @@ -383,9 +427,11 @@ "newKnowledge.tasks": "작업", "newKnowledge.tasksErrorDescription": "백그라운드 작업을 로드할 수 없습니다. 다시 시도해 보세요.", "newKnowledge.tasksWithAttention": "작업, {{count}}에 주의가 필요합니다.", + "newKnowledge.tokenCount": "토큰", "newKnowledge.unavailableDescription": "현재 이 워크스페이스에서 KnowledgeFS를 사용할 수 없습니다.", "newKnowledge.unavailableTitle": "새 지식을 사용할 수 없음", "newKnowledge.updated": "{{date}} 업데이트", + "newKnowledge.updatedAt": "마지막 업데이트", "newKnowledge.updatedColumn": "업데이트됨", "newKnowledge.uploadCharactersUnavailable": "문자 수: —", "newKnowledge.uploadDocuments": "문서 업로드", diff --git a/web/i18n/nl-NL/dataset.json b/web/i18n/nl-NL/dataset.json index 3a799a53955..d9b9e53f73c 100644 --- a/web/i18n/nl-NL/dataset.json +++ b/web/i18n/nl-NL/dataset.json @@ -140,10 +140,12 @@ "newKnowledge.adjustAndRecrawl": "Aanpassen en opnieuw crawlen", "newKnowledge.allDocumentStatuses": "Alle status", "newKnowledge.allSources": "Alle bronnen", + "newKnowledge.apiAgentAccess": "API- en agenttoegang", "newKnowledge.appsUnavailable": "— apps", "newKnowledge.authKind.api-key": "API-sleutel", "newKnowledge.authKind.endpoint": "Eindpunt", "newKnowledge.authenticationMethod": "Authenticatiemethode", + "newKnowledge.averageChunkLength": "Gemiddelde segmentlengte", "newKnowledge.backToList": "Terug naar kennisbanken", "newKnowledge.backgroundTasks": "Achtergrondtaken", "newKnowledge.backgroundTasksDescription": "Documenten toevoegen, bronsynchronisaties en taken opnieuw indexeren.", @@ -152,6 +154,11 @@ "newKnowledge.bulkDocumentActions": "Bulkdocumentacties", "newKnowledge.cancelAddSource": "Annuleren", "newKnowledge.cardType": "Kennisruimte", + "newKnowledge.characterCount": "Tekens", + "newKnowledge.checkReindexStatus": "Status van herindexering controleren", + "newKnowledge.chunkCount": "Segmenten", + "newKnowledge.chunkHeading": "Fragment {{position}}", + "newKnowledge.chunkLocation": "Positie {{position}} in deze revisie", "newKnowledge.clearDocumentSelection": "Documentselectie wissen", "newKnowledge.configureProvider": "{{provider}} configureren", "newKnowledge.connectNotion": "Notion verbinden", @@ -165,6 +172,7 @@ "newKnowledge.connectionNeedsAttentionDescription": "Vernieuw de verbinding voordat u een websitebron toevoegt.", "newKnowledge.connectionProvisioning": "{{provider}} maakt verbinding", "newKnowledge.connectionRefreshFailed": "We konden deze verbinding niet vernieuwen. Probeer het opnieuw.", + "newKnowledge.continueCheckingTaskStatus": "Taakstatus blijven controleren", "newKnowledge.crawlAndPreview": "Crawlen en bekijken", "newKnowledge.crawlFailed": "Kan {{host}} niet crawlen", "newKnowledge.crawlFailed403": "De site retourneerde 403. Mogelijk worden crawlers geblokkeerd of is authenticatie vereist. Controleer de URL, pas de crawlopties aan of probeer een andere provider.", @@ -184,6 +192,7 @@ "newKnowledge.createFailed": "We konden deze kennisbank niet creëren. Controleer uw toegang en probeer het opnieuw.", "newKnowledge.createIllustrationTitle": "Koppel je inhoud één keer — elke app antwoordt met de meest actuele kennis.", "newKnowledge.createTitle": "Creëer kennis", + "newKnowledge.createdAt": "Aangemaakt", "newKnowledge.creators": "Makers", "newKnowledge.customIntervalHours": "Aangepast interval (uren)", "newKnowledge.customIntervalInvalid": "Voer een geheel getal van 1 tot 720 uur in.", @@ -205,14 +214,33 @@ "newKnowledge.discardSourceDraftTitle": "Dit bronconcept verwijderen?", "newKnowledge.documentActions": "Acties voor {{name}}", "newKnowledge.documentActionsUnavailable": "Documentacties zijn nog niet beschikbaar voor deze kennisbank.", + "newKnowledge.documentChunksEmpty": "Er zijn nog geen fragmenten beschikbaar voor deze revisie.", + "newKnowledge.documentChunksLoadError": "De fragmenten voor deze revisie konden niet worden geladen.", + "newKnowledge.documentChunksLoadMoreError": "Meer fragmenten konden niet worden geladen. Probeer het opnieuw.", "newKnowledge.documentColumn": "Document", + "newKnowledge.documentContentIncomplete": "Resterende documentinhoud laden…", + "newKnowledge.documentContents": "Inhoud", + "newKnowledge.documentFacts": "Documentdetails", "newKnowledge.documentFilterLabel": "Documenten filteren op status", + "newKnowledge.documentLoadErrorDescription": "Dit document kon niet worden geladen. Probeer het opnieuw.", + "newKnowledge.documentLoadErrorTitle": "Document kon niet worden geladen", + "newKnowledge.documentNotFoundDescription": "Dit document is mogelijk verwijderd of je hebt geen toegang.", + "newKnowledge.documentNotFoundTitle": "Document niet gevonden", + "newKnowledge.documentOverviewDescription": "Door documentmetadata te labelen kan AI er tijdig toegang toe krijgen en worden de bronnen van verwijzingen aan gebruikers getoond.", "newKnowledge.documentPermissionRestricted": "Uw werkruimtemachtigingen staan geen document- of taakacties toe.", + "newKnowledge.documentReindexConfirmationDelayed": "De herindexering is geaccepteerd, maar de taakstatus is vertraagd. Controleer deze voordat je opnieuw indient.", + "newKnowledge.documentReindexFailed": "Opnieuw indexeren is mislukt. De laatste gereedstaande revisie blijft beschikbaar.", + "newKnowledge.documentReindexProgress": "Opnieuw indexeren · {{progress}}%", + "newKnowledge.documentRevision": "Revisie", + "newKnowledge.documentRevisionMissingDescription": "Dit document heeft nog geen gereedstaande revisie. Kijk opnieuw nadat de verwerking is voltooid.", + "newKnowledge.documentRevisionMissingTitle": "Geen revisie beschikbaar", + "newKnowledge.documentRevisionsLoadError": "De revisiegeschiedenis kon niet worden geladen. De huidige revisie blijft beschikbaar.", "newKnowledge.documentStatus.disabled": "Uitgeschakeld", "newKnowledge.documentStatus.failed": "Mislukt", "newKnowledge.documentStatus.processing": "Verwerking", "newKnowledge.documentStatus.queued": "In de wachtrij", "newKnowledge.documentStatus.ready": "Klaar", + "newKnowledge.documentTaskLookupIncomplete": "Er is meer taakgeschiedenis beschikbaar. Blijf controleren om de status van dit document te vinden.", "newKnowledge.documentUploadExclusion.batchLimit": "limiet voor batchgrootte overschreden", "newKnowledge.documentUploadExclusion.countLimit": "limiet voor aantal bestanden overschreden", "newKnowledge.documentUploadExclusion.fileSize": "bestand is te groot", @@ -241,10 +269,12 @@ "newKnowledge.documentsUnavailable": "— documenten", "newKnowledge.downloadDocuments": "Downloaden", "newKnowledge.editSource": "Bewerken", + "newKnowledge.emptyChunk": "Leeg fragment", "newKnowledge.emptyDescription": "Voeg je documenten toe zodat agents ze direct kunnen lezen, zonder indexering te configureren.", "newKnowledge.emptyTitle": "Een slimmere manier om kennisbanken te bouwen", "newKnowledge.errorDescription": "We konden je nieuwe kennisbanken niet laden. Probeer het opnieuw.", "newKnowledge.errorTitle": "Er is iets misgegaan", + "newKnowledge.fileSize": "Bestandsgrootte", "newKnowledge.filtersUnavailable": "Dit filter wordt beschikbaar zodra KnowledgeFS metadata aanbiedt.", "newKnowledge.firecrawlUnavailable": "Firecrawl is niet beschikbaar in de providercatalogus voor deze werkruimte.", "newKnowledge.gotIt": "Begrepen", @@ -252,9 +282,11 @@ "newKnowledge.guideTitle": "Maak kennis met de nieuwe Kennisbank ✨", "newKnowledge.illustrationHeadline": "Koppel je content één keer — elke app antwoordt met de meest actuele kennis.", "newKnowledge.includeSubpages": "Subpagina’s opnemen", + "newKnowledge.indexInformation": "Indexinformatie", "newKnowledge.interruptTask": "Onderbreken", "newKnowledge.invalidRootUrl": "Voer een geldige http(s)-URL in.", "newKnowledge.keepEditing": "Doorgaan met bewerken", + "newKnowledge.lastIndexed": "Laatst geïndexeerd", "newKnowledge.lastReadyRevisionHint": "Een mislukte verwerking onderbreekt het ophalen nooit; de laatste gereedstaande revisie blijft beschikbaar in de inhoudsindex.", "newKnowledge.lastSyncColumn": "Laatste synchronisatie", "newKnowledge.learnMore": "Meer informatie", @@ -263,10 +295,12 @@ "newKnowledge.leavePartialSetupTitle": "Onvoltooide configuratie verlaten?", "newKnowledge.legacy": "Oud", "newKnowledge.loadMore": "Meer laden", + "newKnowledge.loadMoreRevisions": "Oudere revisies laden", "newKnowledge.loadingSyncPolicy": "Synchronisatiebeleid laden", "newKnowledge.manualUpload": "Handmatig uploaden", "newKnowledge.maxPages": "Maximumaantal pagina’s", "newKnowledge.metadata": "Metagegevens", + "newKnowledge.mimeType": "Bestandstype", "newKnowledge.moreProviders": "Meer providers", "newKnowledge.name": "Kennis naam", "newKnowledge.namePlaceholder": "bijv. Handboek voor klantenondersteuning", @@ -284,6 +318,7 @@ "newKnowledge.notionNotConnectedDescription": "Verbind Notion om pagina’s te kiezen en gesynchroniseerd te houden.", "newKnowledge.onlineDocuments": "Onlinedocumenten", "newKnowledge.onlineDrive": "Online rijden", + "newKnowledge.overview": "Overzicht", "newKnowledge.pagesAppearDescription": "Crawl de site om te bekijken welke pagina’s worden toegevoegd.", "newKnowledge.pagesAppearTitle": "Pagina’s verschijnen hier", "newKnowledge.pagesCrawled": "{{count}} pagina’s gecrawld op {{host}}", @@ -314,16 +349,24 @@ "newKnowledge.providerNotConfigured": "{{provider}} is niet geconfigureerd", "newKnowledge.providerNotConfiguredDescription": "Voeg een API-sleutel of eindpunt-URL toe om websites te crawlen met {{provider}}.", "newKnowledge.providerUnavailable": "Deze aanbieder is niet beschikbaar.", + "newKnowledge.quality": "Kwaliteit", "newKnowledge.reCrawl": "Opnieuw crawlen", "newKnowledge.readOnlyEmpty": "Vraag een werkruimte-editor om de eerste kennisbank te maken.", "newKnowledge.refreshConnectionStatus": "Vernieuwingsstatus", "newKnowledge.refreshingConnection": "Verfrissen…", + "newKnowledge.reindexDocument": "Opnieuw indexeren", "newKnowledge.reindexDocuments": "Opnieuw indexeren", "newKnowledge.removeSource": "Bron verwijderen", + "newKnowledge.retrievalCount": "Aantal zoekacties", "newKnowledge.retryCrawl": "Crawl opnieuw proberen", "newKnowledge.retryProviderLoad": "Probeer het opnieuw", + "newKnowledge.retryReindexDocument": "Opnieuw herindexeren", "newKnowledge.retrySyncPolicy": "Synchronisatiebeleid opnieuw proberen", "newKnowledge.retryTask": "Opnieuw proberen", + "newKnowledge.revisionState.active": "Actief", + "newKnowledge.revisionState.candidate": "Wordt verwerkt", + "newKnowledge.revisionState.failed": "Mislukt", + "newKnowledge.revisionState.superseded": "Vorige", "newKnowledge.rootUrl": "Hoofd-URL", "newKnowledge.rootUrlPlaceholder": "https://docs.example.com", "newKnowledge.routeUnavailable": "Deze sectie komt beschikbaar in de volgende installatiestap.", @@ -332,6 +375,7 @@ "newKnowledge.selectAll": "Alles selecteren", "newKnowledge.selectAllDocuments": "Selecteer alle documenten", "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.skippedFailed": "Overgeslagen (mislukt)", "newKnowledge.skippedOffDomain": "Overgeslagen (buiten domein)", @@ -383,9 +427,11 @@ "newKnowledge.tasks": "Taken", "newKnowledge.tasksErrorDescription": "We konden achtergrondtaken niet laden. Probeer het opnieuw.", "newKnowledge.tasksWithAttention": "Taken, {{count}} hebben aandacht nodig", + "newKnowledge.tokenCount": "Tokeneenheden", "newKnowledge.unavailableDescription": "KnowledgeFS is momenteel niet beschikbaar voor deze werkruimte.", "newKnowledge.unavailableTitle": "Nieuwe kennis is niet beschikbaar", "newKnowledge.updated": "Bijgewerkt op {{date}}", + "newKnowledge.updatedAt": "Laatst bijgewerkt", "newKnowledge.updatedColumn": "Bijgewerkt", "newKnowledge.uploadCharactersUnavailable": "Tekens: —", "newKnowledge.uploadDocuments": "Documenten uploaden", diff --git a/web/i18n/pl-PL/dataset.json b/web/i18n/pl-PL/dataset.json index f8eee855eb3..9cb709e96c6 100644 --- a/web/i18n/pl-PL/dataset.json +++ b/web/i18n/pl-PL/dataset.json @@ -140,10 +140,12 @@ "newKnowledge.adjustAndRecrawl": "Dostosuj i przeskanuj ponownie", "newKnowledge.allDocumentStatuses": "Wszystkie stany", "newKnowledge.allSources": "Wszystkie źródła", + "newKnowledge.apiAgentAccess": "Dostęp do API i agentów", "newKnowledge.appsUnavailable": "— aplikacji", "newKnowledge.authKind.api-key": "Klucz API", "newKnowledge.authKind.endpoint": "Punkt końcowy", "newKnowledge.authenticationMethod": "Metoda uwierzytelniania", + "newKnowledge.averageChunkLength": "Średnia długość fragmentu", "newKnowledge.backToList": "Powrót do baz wiedzy", "newKnowledge.backgroundTasks": "Zadania w tle", "newKnowledge.backgroundTasksDescription": "Dodawanie dokumentów, synchronizacja źródeł i ponowne indeksowanie zadań.", @@ -152,6 +154,11 @@ "newKnowledge.bulkDocumentActions": "Zbiorcze akcje dokumentów", "newKnowledge.cancelAddSource": "Anuluj", "newKnowledge.cardType": "Przestrzeń wiedzy", + "newKnowledge.characterCount": "Znaki", + "newKnowledge.checkReindexStatus": "Sprawdź stan ponownego indeksowania", + "newKnowledge.chunkCount": "Fragmenty", + "newKnowledge.chunkHeading": "Fragment {{position}}", + "newKnowledge.chunkLocation": "Pozycja {{position}} w tej wersji", "newKnowledge.clearDocumentSelection": "Wyczyść wybór dokumentu", "newKnowledge.configureProvider": "Skonfiguruj {{provider}}", "newKnowledge.connectNotion": "Połącz z Notion", @@ -165,6 +172,7 @@ "newKnowledge.connectionNeedsAttentionDescription": "Odśwież połączenie przed dodaniem źródła strony internetowej.", "newKnowledge.connectionProvisioning": "{{provider}} łączy się", "newKnowledge.connectionRefreshFailed": "Nie mogliśmy odświeżyć tego połączenia. Spróbuj ponownie.", + "newKnowledge.continueCheckingTaskStatus": "Kontynuuj sprawdzanie stanu zadania", "newKnowledge.crawlAndPreview": "Indeksowanie i podgląd", "newKnowledge.crawlFailed": "Nie udało się przeskanować {{host}}", "newKnowledge.crawlFailed403": "Witryna zwróciła błąd 403 — może blokować roboty indeksujące lub wymagać uwierzytelnienia. Sprawdź adres URL, dostosuj opcje skanowania albo użyj innego dostawcy.", @@ -184,6 +192,7 @@ "newKnowledge.createFailed": "Nie mogliśmy utworzyć tej bazy wiedzy. Sprawdź swój dostęp i spróbuj ponownie.", "newKnowledge.createIllustrationTitle": "Połącz treści raz — każda aplikacja odpowie, korzystając z najnowszej wiedzy.", "newKnowledge.createTitle": "Twórz wiedzę", + "newKnowledge.createdAt": "Utworzono", "newKnowledge.creators": "Twórcy", "newKnowledge.customIntervalHours": "Niestandardowy interwał (godziny)", "newKnowledge.customIntervalInvalid": "Wprowadź liczbę całkowitą od 1 do 720 godzin.", @@ -205,14 +214,33 @@ "newKnowledge.discardSourceDraftTitle": "Odrzucić tę wersję roboczą źródła?", "newKnowledge.documentActions": "Działania dla {{name}}", "newKnowledge.documentActionsUnavailable": "Działania dotyczące dokumentów nie są jeszcze dostępne dla tej bazy wiedzy.", + "newKnowledge.documentChunksEmpty": "Dla tej wersji nie ma jeszcze dostępnych fragmentów.", + "newKnowledge.documentChunksLoadError": "Nie udało się wczytać fragmentów tej wersji.", + "newKnowledge.documentChunksLoadMoreError": "Nie udało się wczytać kolejnych fragmentów. Spróbuj ponownie.", "newKnowledge.documentColumn": "Dokument", + "newKnowledge.documentContentIncomplete": "Wczytywanie pozostałej treści dokumentu…", + "newKnowledge.documentContents": "Zawartość", + "newKnowledge.documentFacts": "Szczegóły dokumentu", "newKnowledge.documentFilterLabel": "Filtruj dokumenty według statusu", + "newKnowledge.documentLoadErrorDescription": "Nie udało się wczytać tego dokumentu. Spróbuj ponownie.", + "newKnowledge.documentLoadErrorTitle": "Nie udało się wczytać dokumentu", + "newKnowledge.documentNotFoundDescription": "Dokument mógł zostać usunięty lub nie masz do niego dostępu.", + "newKnowledge.documentNotFoundTitle": "Nie znaleziono dokumentu", + "newKnowledge.documentOverviewDescription": "Oznaczanie metadanych dokumentów umożliwia AI szybki dostęp do nich i pokazuje użytkownikom źródła odwołań.", "newKnowledge.documentPermissionRestricted": "Uprawnienia Twojego obszaru roboczego nie pozwalają na działania na dokumentach ani zadaniach.", + "newKnowledge.documentReindexConfirmationDelayed": "Ponowne indeksowanie zostało przyjęte, ale stan zadania jest opóźniony. Sprawdź go przed ponownym wysłaniem.", + "newKnowledge.documentReindexFailed": "Ponowne indeksowanie nie powiodło się. Ostatnia gotowa wersja pozostaje dostępna.", + "newKnowledge.documentReindexProgress": "Ponowne indeksowanie · {{progress}}%", + "newKnowledge.documentRevision": "Wersja", + "newKnowledge.documentRevisionMissingDescription": "Ten dokument nie ma jeszcze gotowej wersji. Sprawdź ponownie po zakończeniu przetwarzania.", + "newKnowledge.documentRevisionMissingTitle": "Brak dostępnej wersji", + "newKnowledge.documentRevisionsLoadError": "Nie udało się wczytać historii wersji. Bieżąca wersja pozostaje dostępna.", "newKnowledge.documentStatus.disabled": "Wyłączony", "newKnowledge.documentStatus.failed": "Nie udało się", "newKnowledge.documentStatus.processing": "Przetwarzanie", "newKnowledge.documentStatus.queued": "W kolejce", "newKnowledge.documentStatus.ready": "Gotowy", + "newKnowledge.documentTaskLookupIncomplete": "Dostępna jest dalsza historia zadań. Kontynuuj sprawdzanie, aby znaleźć stan tego dokumentu.", "newKnowledge.documentUploadExclusion.batchLimit": "przekroczono limit rozmiaru partii", "newKnowledge.documentUploadExclusion.countLimit": "przekroczono limit liczby plików", "newKnowledge.documentUploadExclusion.fileSize": "plik jest zbyt duży", @@ -241,10 +269,12 @@ "newKnowledge.documentsUnavailable": "— dokumentów", "newKnowledge.downloadDocuments": "Pobierz", "newKnowledge.editSource": "Edytuj", + "newKnowledge.emptyChunk": "Pusty fragment", "newKnowledge.emptyDescription": "Dodaj dokumenty, aby agenci mogli je czytać bezpośrednio — bez konfigurowania indeksowania.", "newKnowledge.emptyTitle": "Inteligentniejszy sposób tworzenia baz wiedzy", "newKnowledge.errorDescription": "Nie udało się wczytać nowych baz wiedzy. Spróbuj ponownie.", "newKnowledge.errorTitle": "Coś poszło nie tak", + "newKnowledge.fileSize": "Rozmiar pliku", "newKnowledge.filtersUnavailable": "Filtr będzie dostępny, gdy KnowledgeFS udostępni metadane.", "newKnowledge.firecrawlUnavailable": "Firecrawl nie jest dostępny w katalogu dostawców dla tego obszaru roboczego.", "newKnowledge.gotIt": "Rozumiem", @@ -252,9 +282,11 @@ "newKnowledge.guideTitle": "Poznaj nową bazę wiedzy ✨", "newKnowledge.illustrationHeadline": "Połącz treści raz — każda aplikacja odpowie, korzystając z najnowszej wiedzy.", "newKnowledge.includeSubpages": "Uwzględnij podstrony", + "newKnowledge.indexInformation": "Informacje o indeksie", "newKnowledge.interruptTask": "Przerwij", "newKnowledge.invalidRootUrl": "Wprowadź prawidłowy adres URL http(s).", "newKnowledge.keepEditing": "Kontynuuj edycję", + "newKnowledge.lastIndexed": "Ostatnio zindeksowano", "newKnowledge.lastReadyRevisionHint": "Nieudane przetwarzanie nigdy nie przerywa pobierania — ostatnia gotowa wersja pozostaje dostępna w indeksie zawartości.", "newKnowledge.lastSyncColumn": "Ostatnia synchronizacja", "newKnowledge.learnMore": "Dowiedz się więcej", @@ -263,10 +295,12 @@ "newKnowledge.leavePartialSetupTitle": "Opuścić nieukończoną konfigurację?", "newKnowledge.legacy": "Starsza wersja", "newKnowledge.loadMore": "Załaduj więcej", + "newKnowledge.loadMoreRevisions": "Wczytaj starsze wersje", "newKnowledge.loadingSyncPolicy": "Ładowanie zasad synchronizacji", "newKnowledge.manualUpload": "Przesyłanie ręczne", "newKnowledge.maxPages": "Maksymalna liczba stron", "newKnowledge.metadata": "Metadane", + "newKnowledge.mimeType": "Typ pliku", "newKnowledge.moreProviders": "Więcej dostawców", "newKnowledge.name": "Nazwa wiedzy", "newKnowledge.namePlaceholder": "np. Podręcznik obsługi klienta", @@ -284,6 +318,7 @@ "newKnowledge.notionNotConnectedDescription": "Połącz z Notion, aby wybrać strony i utrzymywać ich synchronizację.", "newKnowledge.onlineDocuments": "Dokumenty online", "newKnowledge.onlineDrive": "Dysk online", + "newKnowledge.overview": "Przegląd", "newKnowledge.pagesAppearDescription": "Przeskanuj witrynę, aby sprawdzić, które strony zostaną dodane.", "newKnowledge.pagesAppearTitle": "Strony pojawią się tutaj", "newKnowledge.pagesCrawled": "Przeskanowano {{count}} stron w {{host}}", @@ -314,16 +349,24 @@ "newKnowledge.providerNotConfigured": "{{provider}} nie jest skonfigurowany", "newKnowledge.providerNotConfiguredDescription": "Dodaj klucz API lub adres URL punktu końcowego, aby indeksować strony internetowe za pomocą {{provider}}.", "newKnowledge.providerUnavailable": "Ten dostawca jest niedostępny.", + "newKnowledge.quality": "Jakość", "newKnowledge.reCrawl": "Przeskanuj ponownie", "newKnowledge.readOnlyEmpty": "Poproś edytora obszaru roboczego o utworzenie pierwszej bazy wiedzy.", "newKnowledge.refreshConnectionStatus": "Odśwież status", "newKnowledge.refreshingConnection": "Odświeżanie…", + "newKnowledge.reindexDocument": "Indeksuj ponownie", "newKnowledge.reindexDocuments": "Ponowne indeksowanie", "newKnowledge.removeSource": "Usuń źródło", + "newKnowledge.retrievalCount": "Liczba pobrań", "newKnowledge.retryCrawl": "Ponów skanowanie", "newKnowledge.retryProviderLoad": "Spróbuj ponownie", + "newKnowledge.retryReindexDocument": "Indeksuj ponownie", "newKnowledge.retrySyncPolicy": "Ponów ładowanie zasad synchronizacji", "newKnowledge.retryTask": "Spróbuj ponownie", + "newKnowledge.revisionState.active": "Aktywna", + "newKnowledge.revisionState.candidate": "Przetwarzanie", + "newKnowledge.revisionState.failed": "Niepowodzenie", + "newKnowledge.revisionState.superseded": "Poprzednia", "newKnowledge.rootUrl": "Główny adres URL", "newKnowledge.rootUrlPlaceholder": "https://docs.example.com", "newKnowledge.routeUnavailable": "Ta sekcja będzie dostępna w następnym kroku konfiguracji.", @@ -332,6 +375,7 @@ "newKnowledge.selectAll": "Zaznacz wszystko", "newKnowledge.selectAllDocuments": "Wybierz wszystkie dokumenty", "newKnowledge.selectAllSources": "Wybierz wszystkie źródła", + "newKnowledge.selectChunk": "Wybierz fragment, aby sprawdzić jego zawartość.", "newKnowledge.selectFilesAndFolders": "Wybierz pliki i foldery do synchronizacji", "newKnowledge.skippedFailed": "Pominięto (błąd)", "newKnowledge.skippedOffDomain": "Pominięto (poza domeną)", @@ -383,9 +427,11 @@ "newKnowledge.tasks": "Zadania", "newKnowledge.tasksErrorDescription": "Nie udało się wczytać zadań w tle. Spróbuj ponownie.", "newKnowledge.tasksWithAttention": "Zadania, {{count}} wymagają uwagi", + "newKnowledge.tokenCount": "Tokeny", "newKnowledge.unavailableDescription": "KnowledgeFS nie jest obecnie dostępny dla tego obszaru roboczego.", "newKnowledge.unavailableTitle": "Nowa wiedza jest niedostępna", "newKnowledge.updated": "Zaktualizowano {{date}}", + "newKnowledge.updatedAt": "Ostatnia aktualizacja", "newKnowledge.updatedColumn": "Zaktualizowano", "newKnowledge.uploadCharactersUnavailable": "Znaki: —", "newKnowledge.uploadDocuments": "Prześlij dokumenty", diff --git a/web/i18n/pt-BR/dataset.json b/web/i18n/pt-BR/dataset.json index 3cd3f65a6d9..8bc68f5587c 100644 --- a/web/i18n/pt-BR/dataset.json +++ b/web/i18n/pt-BR/dataset.json @@ -140,10 +140,12 @@ "newKnowledge.adjustAndRecrawl": "Ajustar e rastrear novamente", "newKnowledge.allDocumentStatuses": "Todos os status", "newKnowledge.allSources": "Todas as fontes", + "newKnowledge.apiAgentAccess": "Acesso à API e aos agentes", "newKnowledge.appsUnavailable": "— apps", "newKnowledge.authKind.api-key": "Chave de API", "newKnowledge.authKind.endpoint": "Ponto final", "newKnowledge.authenticationMethod": "Método de autenticação", + "newKnowledge.averageChunkLength": "Comprimento médio do segmento", "newKnowledge.backToList": "Voltar às bases de conhecimento", "newKnowledge.backgroundTasks": "Tarefas em segundo plano", "newKnowledge.backgroundTasksDescription": "Adições de documentos, sincronizações de origem e reindexação de trabalhos.", @@ -152,6 +154,11 @@ "newKnowledge.bulkDocumentActions": "Ações de documentos em massa", "newKnowledge.cancelAddSource": "Cancelar", "newKnowledge.cardType": "Espaço de conhecimento", + "newKnowledge.characterCount": "Caracteres", + "newKnowledge.checkReindexStatus": "Verificar status da reindexação", + "newKnowledge.chunkCount": "Segmentos", + "newKnowledge.chunkHeading": "Trecho {{position}}", + "newKnowledge.chunkLocation": "Posição {{position}} nesta revisão", "newKnowledge.clearDocumentSelection": "Limpar seleção de documentos", "newKnowledge.configureProvider": "Configurar {{provider}}", "newKnowledge.connectNotion": "Conectar o Notion", @@ -165,6 +172,7 @@ "newKnowledge.connectionNeedsAttentionDescription": "Atualize a conexão antes de adicionar uma fonte de site.", "newKnowledge.connectionProvisioning": "{{provider}} está se conectando", "newKnowledge.connectionRefreshFailed": "Não foi possível atualizar esta conexão. Tente novamente.", + "newKnowledge.continueCheckingTaskStatus": "Continuar verificando o status", "newKnowledge.crawlAndPreview": "Rastreamento e visualização", "newKnowledge.crawlFailed": "Não foi possível rastrear {{host}}", "newKnowledge.crawlFailed403": "O site retornou 403 — ele pode bloquear rastreadores ou exigir autenticação. Verifique a URL, ajuste as opções de rastreamento ou tente outro provedor.", @@ -184,6 +192,7 @@ "newKnowledge.createFailed": "Não foi possível criar esta base de conhecimento. Verifique seu acesso e tente novamente.", "newKnowledge.createIllustrationTitle": "Conecte seu conteúdo uma vez — cada aplicativo responde com o conhecimento mais atualizado.", "newKnowledge.createTitle": "Crie Conhecimento", + "newKnowledge.createdAt": "Criado", "newKnowledge.creators": "Criadores", "newKnowledge.customIntervalHours": "Intervalo personalizado (horas)", "newKnowledge.customIntervalInvalid": "Digite um número inteiro de 1 a 720 horas.", @@ -205,14 +214,33 @@ "newKnowledge.discardSourceDraftTitle": "Descartar este rascunho de fonte?", "newKnowledge.documentActions": "Ações para {{name}}", "newKnowledge.documentActionsUnavailable": "As ações do documento ainda não estão disponíveis para esta base de conhecimento.", + "newKnowledge.documentChunksEmpty": "Ainda não há trechos disponíveis para esta revisão.", + "newKnowledge.documentChunksLoadError": "Não foi possível carregar os trechos desta revisão.", + "newKnowledge.documentChunksLoadMoreError": "Não foi possível carregar mais trechos. Tente novamente.", "newKnowledge.documentColumn": "Documento", + "newKnowledge.documentContentIncomplete": "Carregando o restante do conteúdo do documento…", + "newKnowledge.documentContents": "Conteúdo", + "newKnowledge.documentFacts": "Detalhes do documento", "newKnowledge.documentFilterLabel": "Filtrar documentos por status", + "newKnowledge.documentLoadErrorDescription": "Não foi possível carregar este documento. Tente novamente.", + "newKnowledge.documentLoadErrorTitle": "Não foi possível carregar o documento", + "newKnowledge.documentNotFoundDescription": "Este documento pode ter sido removido ou você pode não ter acesso.", + "newKnowledge.documentNotFoundTitle": "Documento não encontrado", + "newKnowledge.documentOverviewDescription": "Rotular os metadados dos documentos permite que a IA os acesse no momento certo e mostra aos usuários as fontes das referências.", "newKnowledge.documentPermissionRestricted": "As permissões do seu workspace não permitem ações em documentos ou tarefas.", + "newKnowledge.documentReindexConfirmationDelayed": "A reindexação foi aceita, mas o status da tarefa está atrasado. Verifique antes de enviar novamente.", + "newKnowledge.documentReindexFailed": "A reindexação falhou. A última revisão pronta continua disponível.", + "newKnowledge.documentReindexProgress": "Reindexando · {{progress}}%", + "newKnowledge.documentRevision": "Revisão", + "newKnowledge.documentRevisionMissingDescription": "Este documento ainda não tem uma revisão pronta. Volte após o processamento terminar.", + "newKnowledge.documentRevisionMissingTitle": "Nenhuma revisão disponível", + "newKnowledge.documentRevisionsLoadError": "Não foi possível carregar o histórico de revisões. A revisão atual continua disponível.", "newKnowledge.documentStatus.disabled": "Desativado", "newKnowledge.documentStatus.failed": "Falha", "newKnowledge.documentStatus.processing": "Processamento", "newKnowledge.documentStatus.queued": "Na fila", "newKnowledge.documentStatus.ready": "Pronto", + "newKnowledge.documentTaskLookupIncomplete": "Há mais histórico de tarefas disponível. Continue verificando para encontrar o status deste documento.", "newKnowledge.documentUploadExclusion.batchLimit": "limite de tamanho do lote excedido", "newKnowledge.documentUploadExclusion.countLimit": "limite de quantidade de arquivos excedido", "newKnowledge.documentUploadExclusion.fileSize": "o arquivo é muito grande", @@ -241,10 +269,12 @@ "newKnowledge.documentsUnavailable": "— documentos", "newKnowledge.downloadDocuments": "Baixar", "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.", "newKnowledge.emptyTitle": "Uma forma mais inteligente de criar bases de conhecimento", "newKnowledge.errorDescription": "Não foi possível carregar suas novas bases de conhecimento. Tente novamente.", "newKnowledge.errorTitle": "Algo deu errado", + "newKnowledge.fileSize": "Tamanho do arquivo", "newKnowledge.filtersUnavailable": "Este filtro ficará disponível quando o KnowledgeFS expuser seus metadados.", "newKnowledge.firecrawlUnavailable": "O Firecrawl não está disponível no catálogo de provedores deste espaço de trabalho.", "newKnowledge.gotIt": "Entendi", @@ -252,9 +282,11 @@ "newKnowledge.guideTitle": "Conheça a nova Base de Conhecimento ✨", "newKnowledge.illustrationHeadline": "Conecte seu conteúdo uma vez — cada aplicativo responderá com o conhecimento mais recente.", "newKnowledge.includeSubpages": "Incluir subpáginas", + "newKnowledge.indexInformation": "Informações do índice", "newKnowledge.interruptTask": "Interromper", "newKnowledge.invalidRootUrl": "Insira uma URL http(s) válida.", "newKnowledge.keepEditing": "Continuar editando", + "newKnowledge.lastIndexed": "Última indexação", "newKnowledge.lastReadyRevisionHint": "O processamento com falha nunca interrompe a recuperação — a última revisão pronta permanece disponível no índice de conteúdo.", "newKnowledge.lastSyncColumn": "Última sincronização", "newKnowledge.learnMore": "Saiba mais", @@ -263,10 +295,12 @@ "newKnowledge.leavePartialSetupTitle": "Sair da configuração incompleta?", "newKnowledge.legacy": "Legado", "newKnowledge.loadMore": "Carregar mais", + "newKnowledge.loadMoreRevisions": "Carregar revisões anteriores", "newKnowledge.loadingSyncPolicy": "Carregando política de sincronização", "newKnowledge.manualUpload": "Carregamento manual", "newKnowledge.maxPages": "Máximo de páginas", "newKnowledge.metadata": "Metadados", + "newKnowledge.mimeType": "Tipo de arquivo", "newKnowledge.moreProviders": "Mais provedores", "newKnowledge.name": "Nome do conhecimento", "newKnowledge.namePlaceholder": "por exemplo Manual de Suporte ao Cliente", @@ -284,6 +318,7 @@ "newKnowledge.notionNotConnectedDescription": "Conecte o Notion para escolher páginas e mantê-las sincronizadas.", "newKnowledge.onlineDocuments": "Documentos on-line", "newKnowledge.onlineDrive": "Unidade on-line", + "newKnowledge.overview": "Visão geral", "newKnowledge.pagesAppearDescription": "Rastreie o site para revisar quais páginas serão adicionadas.", "newKnowledge.pagesAppearTitle": "As páginas aparecerão aqui", "newKnowledge.pagesCrawled": "{{count}} páginas rastreadas em {{host}}", @@ -314,16 +349,24 @@ "newKnowledge.providerNotConfigured": "{{provider}} não está configurado", "newKnowledge.providerNotConfiguredDescription": "Adicione uma chave de API ou URL de endpoint para rastrear sites com {{provider}}.", "newKnowledge.providerUnavailable": "Este provedor não está disponível.", + "newKnowledge.quality": "Qualidade", "newKnowledge.reCrawl": "Rastrear novamente", "newKnowledge.readOnlyEmpty": "Peça a um editor do espaço de trabalho para criar a primeira base de conhecimento.", "newKnowledge.refreshConnectionStatus": "Atualizar status", "newKnowledge.refreshingConnection": "Refrescante…", + "newKnowledge.reindexDocument": "Reindexar", "newKnowledge.reindexDocuments": "Reindexar", "newKnowledge.removeSource": "Remover fonte", + "newKnowledge.retrievalCount": "Quantidade de recuperações", "newKnowledge.retryCrawl": "Tentar rastreamento novamente", "newKnowledge.retryProviderLoad": "Tentar novamente", + "newKnowledge.retryReindexDocument": "Reindexar novamente", "newKnowledge.retrySyncPolicy": "Tentar novamente a política de sincronização", "newKnowledge.retryTask": "Tentar novamente", + "newKnowledge.revisionState.active": "Ativa", + "newKnowledge.revisionState.candidate": "Processando", + "newKnowledge.revisionState.failed": "Falhou", + "newKnowledge.revisionState.superseded": "Anterior", "newKnowledge.rootUrl": "URL raiz", "newKnowledge.rootUrlPlaceholder": "https://docs.example.com", "newKnowledge.routeUnavailable": "Esta seção estará disponível na próxima etapa de configuração.", @@ -332,6 +375,7 @@ "newKnowledge.selectAll": "Selecionar tudo", "newKnowledge.selectAllDocuments": "Selecione todos os documentos", "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.skippedFailed": "Ignorado (falha)", "newKnowledge.skippedOffDomain": "Ignorado (fora do domínio)", @@ -383,9 +427,11 @@ "newKnowledge.tasks": "Tarefas", "newKnowledge.tasksErrorDescription": "Não foi possível carregar tarefas em segundo plano. Tente novamente.", "newKnowledge.tasksWithAttention": "Tarefas, {{count}} precisam de atenção", + "newKnowledge.tokenCount": "Unidades de token", "newKnowledge.unavailableDescription": "O KnowledgeFS não está disponível para este espaço de trabalho no momento.", "newKnowledge.unavailableTitle": "O Novo Conhecimento não está disponível", "newKnowledge.updated": "Atualizado em {{date}}", + "newKnowledge.updatedAt": "Última atualização", "newKnowledge.updatedColumn": "Atualizado", "newKnowledge.uploadCharactersUnavailable": "Caracteres: —", "newKnowledge.uploadDocuments": "Carregar documentos", diff --git a/web/i18n/ro-RO/dataset.json b/web/i18n/ro-RO/dataset.json index 7647dd195c2..7aaeb7ef0d8 100644 --- a/web/i18n/ro-RO/dataset.json +++ b/web/i18n/ro-RO/dataset.json @@ -140,10 +140,12 @@ "newKnowledge.adjustAndRecrawl": "Ajustează și explorează din nou", "newKnowledge.allDocumentStatuses": "Toate statutul", "newKnowledge.allSources": "Toate sursele", + "newKnowledge.apiAgentAccess": "Acces API și agenți", "newKnowledge.appsUnavailable": "— aplicații", "newKnowledge.authKind.api-key": "cheie API", "newKnowledge.authKind.endpoint": "Punct final", "newKnowledge.authenticationMethod": "Metoda de autentificare", + "newKnowledge.averageChunkLength": "Lungimea medie a segmentului", "newKnowledge.backToList": "Înapoi la bazele de cunoștințe", "newKnowledge.backgroundTasks": "Sarcini de fundal", "newKnowledge.backgroundTasksDescription": "Adăugări de documente, sincronizare sursă și reindexare lucrări.", @@ -152,6 +154,11 @@ "newKnowledge.bulkDocumentActions": "Acțiuni în bloc pentru documente", "newKnowledge.cancelAddSource": "Anula", "newKnowledge.cardType": "Spațiu de cunoștințe", + "newKnowledge.characterCount": "Caractere", + "newKnowledge.checkReindexStatus": "Verifică starea reindexării", + "newKnowledge.chunkCount": "Segmente", + "newKnowledge.chunkHeading": "Fragment {{position}}", + "newKnowledge.chunkLocation": "Poziția {{position}} în această revizie", "newKnowledge.clearDocumentSelection": "Ștergeți selecția documentului", "newKnowledge.configureProvider": "Configurați {{provider}}", "newKnowledge.connectNotion": "Conectează Notion", @@ -165,6 +172,7 @@ "newKnowledge.connectionNeedsAttentionDescription": "Reîmprospătați conexiunea înainte de a adăuga o sursă de site.", "newKnowledge.connectionProvisioning": "{{provider}} se conectează", "newKnowledge.connectionRefreshFailed": "Nu am putut reîmprospăta această conexiune. Încearcă din nou.", + "newKnowledge.continueCheckingTaskStatus": "Continuă verificarea stării", "newKnowledge.crawlAndPreview": "Accesați cu crawlere și previzualizați", "newKnowledge.crawlFailed": "Nu s-a putut explora {{host}}", "newKnowledge.crawlFailed403": "Site-ul a returnat 403 — este posibil să blocheze crawlerele sau să necesite autentificare. Verifică adresa URL, ajustează opțiunile de explorare sau încearcă alt furnizor.", @@ -184,6 +192,7 @@ "newKnowledge.createFailed": "Nu am putut crea această bază de cunoștințe. Verificați accesul și încercați din nou.", "newKnowledge.createIllustrationTitle": "Conectează conținutul o singură dată — fiecare aplicație răspunde cu cele mai noi cunoștințe.", "newKnowledge.createTitle": "Creați cunoștințe", + "newKnowledge.createdAt": "Creat", "newKnowledge.creators": "Creatori", "newKnowledge.customIntervalHours": "Interval personalizat (ore)", "newKnowledge.customIntervalInvalid": "Introdu un număr întreg între 1 și 720 de ore.", @@ -205,14 +214,33 @@ "newKnowledge.discardSourceDraftTitle": "Elimini această schiță de sursă?", "newKnowledge.documentActions": "Acțiuni pentru {{name}}", "newKnowledge.documentActionsUnavailable": "Acțiunile documentului nu sunt încă disponibile pentru această bază de cunoștințe.", + "newKnowledge.documentChunksEmpty": "Nu există încă fragmente disponibile pentru această revizie.", + "newKnowledge.documentChunksLoadError": "Nu am putut încărca fragmentele acestei revizii.", + "newKnowledge.documentChunksLoadMoreError": "Nu am putut încărca mai multe fragmente. Încearcă din nou.", "newKnowledge.documentColumn": "Fișier", + "newKnowledge.documentContentIncomplete": "Se încarcă restul conținutului documentului…", + "newKnowledge.documentContents": "Conținut", + "newKnowledge.documentFacts": "Detalii document", "newKnowledge.documentFilterLabel": "Filtrați documentele după stare", + "newKnowledge.documentLoadErrorDescription": "Nu am putut încărca acest document. Încearcă din nou.", + "newKnowledge.documentLoadErrorTitle": "Documentul nu a putut fi încărcat", + "newKnowledge.documentNotFoundDescription": "Este posibil ca documentul să fi fost eliminat sau să nu ai acces.", + "newKnowledge.documentNotFoundTitle": "Document negăsit", + "newKnowledge.documentOverviewDescription": "Etichetarea metadatelor documentelor permite inteligenței artificiale să le acceseze la timp și le arată utilizatorilor sursele referințelor.", "newKnowledge.documentPermissionRestricted": "Permisiunile spațiului de lucru nu permit acțiuni asupra documentelor sau sarcinilor.", + "newKnowledge.documentReindexConfirmationDelayed": "Reindexarea a fost acceptată, dar starea activității întârzie. Verific-o înainte de a retrimite.", + "newKnowledge.documentReindexFailed": "Reindexarea a eșuat. Ultima revizie pregătită rămâne disponibilă.", + "newKnowledge.documentReindexProgress": "Se reindexează · {{progress}}%", + "newKnowledge.documentRevision": "Revizie", + "newKnowledge.documentRevisionMissingDescription": "Acest document nu are încă o revizie pregătită. Revino după finalizarea procesării.", + "newKnowledge.documentRevisionMissingTitle": "Nicio revizie disponibilă", + "newKnowledge.documentRevisionsLoadError": "Nu am putut încărca istoricul reviziilor. Revizia curentă rămâne disponibilă.", "newKnowledge.documentStatus.disabled": "Dezactivat", "newKnowledge.documentStatus.failed": "A eșuat", "newKnowledge.documentStatus.processing": "Prelucrare", "newKnowledge.documentStatus.queued": "În coadă", "newKnowledge.documentStatus.ready": "Gata", + "newKnowledge.documentTaskLookupIncomplete": "Este disponibil mai mult istoric al activităților. Continuă verificarea pentru a găsi starea documentului.", "newKnowledge.documentUploadExclusion.batchLimit": "limita dimensiunii lotului a fost depășită", "newKnowledge.documentUploadExclusion.countLimit": "limita numărului de fișiere a fost depășită", "newKnowledge.documentUploadExclusion.fileSize": "fișierul este prea mare", @@ -241,10 +269,12 @@ "newKnowledge.documentsUnavailable": "— documente", "newKnowledge.downloadDocuments": "Descărcați", "newKnowledge.editSource": "Edita", + "newKnowledge.emptyChunk": "Fragment gol", "newKnowledge.emptyDescription": "Adaugă documentele, iar agenții le pot citi direct — fără indexare de configurat.", "newKnowledge.emptyTitle": "O modalitate mai inteligentă de a crea baze de cunoștințe", "newKnowledge.errorDescription": "Nu am putut încărca noile baze de cunoștințe. Încearcă din nou.", "newKnowledge.errorTitle": "Ceva nu a funcționat", + "newKnowledge.fileSize": "Dimensiunea fișierului", "newKnowledge.filtersUnavailable": "Acest filtru va fi disponibil când KnowledgeFS va furniza metadatele.", "newKnowledge.firecrawlUnavailable": "Firecrawl nu este disponibil în catalogul furnizorilor pentru acest spațiu de lucru.", "newKnowledge.gotIt": "Am înțeles", @@ -252,9 +282,11 @@ "newKnowledge.guideTitle": "Descoperă noua bază de cunoștințe ✨", "newKnowledge.illustrationHeadline": "Conectează conținutul o singură dată — fiecare aplicație răspunde cu cele mai noi informații.", "newKnowledge.includeSubpages": "Include subpaginile", + "newKnowledge.indexInformation": "Informații despre index", "newKnowledge.interruptTask": "Întrerupe", "newKnowledge.invalidRootUrl": "Introdu o adresă URL http(s) validă.", "newKnowledge.keepEditing": "Continuă editarea", + "newKnowledge.lastIndexed": "Ultima indexare", "newKnowledge.lastReadyRevisionHint": "Procesarea eșuată nu întrerupe niciodată recuperarea — ultima revizuire gata rămâne disponibilă în indexul de conținut.", "newKnowledge.lastSyncColumn": "Ultima sincronizare", "newKnowledge.learnMore": "Află mai multe", @@ -263,10 +295,12 @@ "newKnowledge.leavePartialSetupTitle": "Ieșiți din configurarea incompletă?", "newKnowledge.legacy": "Versiune veche", "newKnowledge.loadMore": "Încarcă mai multe", + "newKnowledge.loadMoreRevisions": "Încarcă revizii mai vechi", "newKnowledge.loadingSyncPolicy": "Se încarcă politica de sincronizare", "newKnowledge.manualUpload": "Încărcare manuală", "newKnowledge.maxPages": "Număr maxim de pagini", "newKnowledge.metadata": "Metadate", + "newKnowledge.mimeType": "Tip de fișier", "newKnowledge.moreProviders": "Mai mulți furnizori", "newKnowledge.name": "Nume de cunoștințe", "newKnowledge.namePlaceholder": "de ex. Manual de asistență pentru clienți", @@ -284,6 +318,7 @@ "newKnowledge.notionNotConnectedDescription": "Conectează Notion pentru a alege pagini și a le menține sincronizate.", "newKnowledge.onlineDocuments": "Documente online", "newKnowledge.onlineDrive": "Conducere online", + "newKnowledge.overview": "Prezentare generală", "newKnowledge.pagesAppearDescription": "Explorează site-ul pentru a verifica paginile care vor fi adăugate.", "newKnowledge.pagesAppearTitle": "Paginile vor apărea aici", "newKnowledge.pagesCrawled": "{{count}} pagini explorate la {{host}}", @@ -314,16 +349,24 @@ "newKnowledge.providerNotConfigured": "{{provider}} nu este configurat", "newKnowledge.providerNotConfiguredDescription": "Adăugați o cheie API sau o adresă URL a punctului final pentru a accesa cu crawlere site-urile web cu {{provider}}.", "newKnowledge.providerUnavailable": "Acest furnizor nu este disponibil.", + "newKnowledge.quality": "Calitate", "newKnowledge.reCrawl": "Explorează din nou", "newKnowledge.readOnlyEmpty": "Cere unui editor al spațiului de lucru să creeze prima bază de cunoștințe.", "newKnowledge.refreshConnectionStatus": "Starea de reîmprospătare", "newKnowledge.refreshingConnection": "Înviorare…", + "newKnowledge.reindexDocument": "Reindexează", "newKnowledge.reindexDocuments": "Reindexați", "newKnowledge.removeSource": "Eliminați sursa", + "newKnowledge.retrievalCount": "Număr de regăsiri", "newKnowledge.retryCrawl": "Reîncearcă explorarea", "newKnowledge.retryProviderLoad": "Reîncercați", + "newKnowledge.retryReindexDocument": "Reindexează din nou", "newKnowledge.retrySyncPolicy": "Reîncearcă politica de sincronizare", "newKnowledge.retryTask": "Reîncercați", + "newKnowledge.revisionState.active": "Activă", + "newKnowledge.revisionState.candidate": "În procesare", + "newKnowledge.revisionState.failed": "Eșuată", + "newKnowledge.revisionState.superseded": "Anterioară", "newKnowledge.rootUrl": "URL rădăcină", "newKnowledge.rootUrlPlaceholder": "https://docs.example.com", "newKnowledge.routeUnavailable": "Această secțiune va deveni disponibilă în următorul pas de configurare.", @@ -332,6 +375,7 @@ "newKnowledge.selectAll": "Selectează tot", "newKnowledge.selectAllDocuments": "Selectați toate documentele", "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.skippedFailed": "Omis (eșuat)", "newKnowledge.skippedOffDomain": "Omis (în afara domeniului)", @@ -383,9 +427,11 @@ "newKnowledge.tasks": "Sarcini", "newKnowledge.tasksErrorDescription": "Nu am putut încărca sarcinile de fundal. Încearcă din nou.", "newKnowledge.tasksWithAttention": "Sarcini, {{count}} necesită atenție", + "newKnowledge.tokenCount": "Tokenuri", "newKnowledge.unavailableDescription": "KnowledgeFS nu este disponibil momentan pentru acest spațiu de lucru.", "newKnowledge.unavailableTitle": "Noua bază de cunoștințe nu este disponibilă", "newKnowledge.updated": "Actualizat la {{date}}", + "newKnowledge.updatedAt": "Ultima actualizare", "newKnowledge.updatedColumn": "Actualizat", "newKnowledge.uploadCharactersUnavailable": "Caractere: —", "newKnowledge.uploadDocuments": "Încărcați documente", diff --git a/web/i18n/ru-RU/dataset.json b/web/i18n/ru-RU/dataset.json index 682c7882dfd..95527eb5d9e 100644 --- a/web/i18n/ru-RU/dataset.json +++ b/web/i18n/ru-RU/dataset.json @@ -140,10 +140,12 @@ "newKnowledge.adjustAndRecrawl": "Настроить и просканировать снова", "newKnowledge.allDocumentStatuses": "Все статусы", "newKnowledge.allSources": "Все источники", + "newKnowledge.apiAgentAccess": "Доступ к API и агентам", "newKnowledge.appsUnavailable": "— приложений", "newKnowledge.authKind.api-key": "API-ключ", "newKnowledge.authKind.endpoint": "Конечная точка", "newKnowledge.authenticationMethod": "Метод аутентификации", + "newKnowledge.averageChunkLength": "Средняя длина фрагмента", "newKnowledge.backToList": "Вернуться к базам знаний", "newKnowledge.backgroundTasks": "Фоновые задачи", "newKnowledge.backgroundTasksDescription": "Добавление документов, синхронизация источников и переиндексация заданий.", @@ -152,6 +154,11 @@ "newKnowledge.bulkDocumentActions": "Массовые действия с документами", "newKnowledge.cancelAddSource": "Отмена", "newKnowledge.cardType": "Пространство знаний", + "newKnowledge.characterCount": "Символы", + "newKnowledge.checkReindexStatus": "Проверить статус переиндексации", + "newKnowledge.chunkCount": "Фрагменты", + "newKnowledge.chunkHeading": "Фрагмент {{position}}", + "newKnowledge.chunkLocation": "Позиция {{position}} в этой редакции", "newKnowledge.clearDocumentSelection": "Очистить выбор документа", "newKnowledge.configureProvider": "Настроить {{provider}}", "newKnowledge.connectNotion": "Подключить Notion", @@ -165,6 +172,7 @@ "newKnowledge.connectionNeedsAttentionDescription": "Обновите соединение перед добавлением источника веб-сайта.", "newKnowledge.connectionProvisioning": "{{provider}} подключается", "newKnowledge.connectionRefreshFailed": "Не удалось обновить это соединение. Попробуйте еще раз.", + "newKnowledge.continueCheckingTaskStatus": "Продолжить проверку статуса", "newKnowledge.crawlAndPreview": "Сканирование и предварительный просмотр", "newKnowledge.crawlFailed": "Не удалось просканировать {{host}}", "newKnowledge.crawlFailed403": "Сайт вернул ошибку 403 — возможно, он блокирует поисковых роботов или требует авторизации. Проверьте URL, измените параметры сканирования или попробуйте другого провайдера.", @@ -184,6 +192,7 @@ "newKnowledge.createFailed": "Мы не смогли создать эту базу знаний. Проверьте доступ и повторите попытку.", "newKnowledge.createIllustrationTitle": "Подключите контент один раз — каждое приложение будет отвечать на основе самых свежих знаний.", "newKnowledge.createTitle": "Создавайте знания", + "newKnowledge.createdAt": "Создано", "newKnowledge.creators": "Создатели", "newKnowledge.customIntervalHours": "Пользовательский интервал (часы)", "newKnowledge.customIntervalInvalid": "Введите целое число от 1 до 720 часов.", @@ -205,14 +214,33 @@ "newKnowledge.discardSourceDraftTitle": "Удалить этот черновик источника?", "newKnowledge.documentActions": "Действия для {{name}}", "newKnowledge.documentActionsUnavailable": "Действия с документами пока недоступны для этой базы знаний.", + "newKnowledge.documentChunksEmpty": "Для этой редакции пока нет доступных фрагментов.", + "newKnowledge.documentChunksLoadError": "Не удалось загрузить фрагменты этой редакции.", + "newKnowledge.documentChunksLoadMoreError": "Не удалось загрузить дополнительные фрагменты. Повторите попытку.", "newKnowledge.documentColumn": "Документ", + "newKnowledge.documentContentIncomplete": "Загружается оставшееся содержимое документа…", + "newKnowledge.documentContents": "Содержание", + "newKnowledge.documentFacts": "Сведения о документе", "newKnowledge.documentFilterLabel": "Фильтровать документы по статусу", + "newKnowledge.documentLoadErrorDescription": "Не удалось загрузить этот документ. Повторите попытку.", + "newKnowledge.documentLoadErrorTitle": "Не удалось загрузить документ", + "newKnowledge.documentNotFoundDescription": "Возможно, документ удалён или у вас нет доступа.", + "newKnowledge.documentNotFoundTitle": "Документ не найден", + "newKnowledge.documentOverviewDescription": "Разметка метаданных документов позволяет ИИ своевременно получать к ним доступ и показывает пользователям источники ссылок.", "newKnowledge.documentPermissionRestricted": "Разрешения вашего рабочего пространства не позволяют выполнять действия с документами или задачами.", + "newKnowledge.documentReindexConfirmationDelayed": "Переиндексация принята, но статус задачи задерживается. Проверьте его перед повторной отправкой.", + "newKnowledge.documentReindexFailed": "Переиндексация завершилась с ошибкой. Последняя готовая редакция остаётся доступной.", + "newKnowledge.documentReindexProgress": "Переиндексация · {{progress}}%", + "newKnowledge.documentRevision": "Редакция", + "newKnowledge.documentRevisionMissingDescription": "У этого документа пока нет готовой редакции. Проверьте снова после завершения обработки.", + "newKnowledge.documentRevisionMissingTitle": "Нет доступной редакции", + "newKnowledge.documentRevisionsLoadError": "Не удалось загрузить историю редакций. Текущая редакция остаётся доступной.", "newKnowledge.documentStatus.disabled": "Отключено", "newKnowledge.documentStatus.failed": "Не удалось", "newKnowledge.documentStatus.processing": "Обработка", "newKnowledge.documentStatus.queued": "В очереди", "newKnowledge.documentStatus.ready": "Готово", + "newKnowledge.documentTaskLookupIncomplete": "Доступна дополнительная история задач. Продолжите проверку, чтобы найти статус документа.", "newKnowledge.documentUploadExclusion.batchLimit": "превышен предел размера пакета", "newKnowledge.documentUploadExclusion.countLimit": "превышен предел количества файлов", "newKnowledge.documentUploadExclusion.fileSize": "файл слишком большой", @@ -241,10 +269,12 @@ "newKnowledge.documentsUnavailable": "— документов", "newKnowledge.downloadDocuments": "Скачать", "newKnowledge.editSource": "Править", + "newKnowledge.emptyChunk": "Пустой фрагмент", "newKnowledge.emptyDescription": "Добавьте документы, и агенты смогут читать их напрямую — без настройки индексации.", "newKnowledge.emptyTitle": "Более умный способ создавать базы знаний", "newKnowledge.errorDescription": "Не удалось загрузить новые базы знаний. Повторите попытку.", "newKnowledge.errorTitle": "Что-то пошло не так", + "newKnowledge.fileSize": "Размер файла", "newKnowledge.filtersUnavailable": "Фильтр станет доступен, когда KnowledgeFS предоставит метаданные.", "newKnowledge.firecrawlUnavailable": "Firecrawl недоступен в каталоге поставщиков для этой рабочей области.", "newKnowledge.gotIt": "Понятно", @@ -252,9 +282,11 @@ "newKnowledge.guideTitle": "Познакомьтесь с новой базой знаний ✨", "newKnowledge.illustrationHeadline": "Подключите контент один раз — и каждое приложение будет отвечать на основе самых свежих знаний.", "newKnowledge.includeSubpages": "Включать вложенные страницы", + "newKnowledge.indexInformation": "Сведения об индексе", "newKnowledge.interruptTask": "Прерывание", "newKnowledge.invalidRootUrl": "Введите корректный URL с http(s).", "newKnowledge.keepEditing": "Продолжить редактирование", + "newKnowledge.lastIndexed": "Последняя индексация", "newKnowledge.lastReadyRevisionHint": "Неудачная обработка никогда не прерывает извлечение — последняя готовая редакция остается доступной в индексе контента.", "newKnowledge.lastSyncColumn": "Последняя синхронизация", "newKnowledge.learnMore": "Подробнее", @@ -263,10 +295,12 @@ "newKnowledge.leavePartialSetupTitle": "Выйти из незавершённой настройки?", "newKnowledge.legacy": "Предыдущая версия", "newKnowledge.loadMore": "Загрузить ещё", + "newKnowledge.loadMoreRevisions": "Загрузить предыдущие редакции", "newKnowledge.loadingSyncPolicy": "Загрузка политики синхронизации", "newKnowledge.manualUpload": "Загрузка вручную", "newKnowledge.maxPages": "Максимум страниц", "newKnowledge.metadata": "Метаданные", + "newKnowledge.mimeType": "Тип файла", "newKnowledge.moreProviders": "Другие провайдеры", "newKnowledge.name": "Название знания", "newKnowledge.namePlaceholder": "например Руководство по поддержке клиентов", @@ -284,6 +318,7 @@ "newKnowledge.notionNotConnectedDescription": "Подключите Notion, чтобы выбирать страницы и поддерживать их синхронизацию.", "newKnowledge.onlineDocuments": "Онлайн-документы", "newKnowledge.onlineDrive": "Онлайн-диск", + "newKnowledge.overview": "Обзор", "newKnowledge.pagesAppearDescription": "Просканируйте сайт, чтобы проверить, какие страницы будут добавлены.", "newKnowledge.pagesAppearTitle": "Здесь появятся страницы", "newKnowledge.pagesCrawled": "Просканировано страниц на {{host}}: {{count}}", @@ -314,16 +349,24 @@ "newKnowledge.providerNotConfigured": "{{provider}} не настроено", "newKnowledge.providerNotConfiguredDescription": "Добавьте ключ API или URL-адрес конечной точки для сканирования веб-сайтов с помощью {{provider}}.", "newKnowledge.providerUnavailable": "Этот провайдер недоступен.", + "newKnowledge.quality": "Качество", "newKnowledge.reCrawl": "Просканировать снова", "newKnowledge.readOnlyEmpty": "Попросите редактора рабочего пространства создать первую базу знаний.", "newKnowledge.refreshConnectionStatus": "Обновить статус", "newKnowledge.refreshingConnection": "Обновление…", + "newKnowledge.reindexDocument": "Переиндексировать", "newKnowledge.reindexDocuments": "Переиндексация", "newKnowledge.removeSource": "Удалить источник", + "newKnowledge.retrievalCount": "Количество извлечений", "newKnowledge.retryCrawl": "Повторить сканирование", "newKnowledge.retryProviderLoad": "Повторить попытку", + "newKnowledge.retryReindexDocument": "Переиндексировать снова", "newKnowledge.retrySyncPolicy": "Повторить загрузку политики синхронизации", "newKnowledge.retryTask": "Повторить попытку", + "newKnowledge.revisionState.active": "Активная", + "newKnowledge.revisionState.candidate": "Обработка", + "newKnowledge.revisionState.failed": "Ошибка", + "newKnowledge.revisionState.superseded": "Предыдущая", "newKnowledge.rootUrl": "Корневой URL", "newKnowledge.rootUrlPlaceholder": "https://docs.example.com", "newKnowledge.routeUnavailable": "Этот раздел станет доступен на следующем этапе настройки.", @@ -332,6 +375,7 @@ "newKnowledge.selectAll": "Выбрать все", "newKnowledge.selectAllDocuments": "Выбрать все документы", "newKnowledge.selectAllSources": "Выбрать все источники", + "newKnowledge.selectChunk": "Выберите фрагмент, чтобы просмотреть его содержимое.", "newKnowledge.selectFilesAndFolders": "Выберите файлы и папки для синхронизации", "newKnowledge.skippedFailed": "Пропущено (ошибка)", "newKnowledge.skippedOffDomain": "Пропущено (вне домена)", @@ -383,9 +427,11 @@ "newKnowledge.tasks": "Задачи", "newKnowledge.tasksErrorDescription": "Не удалось загрузить фоновые задачи. Попробуйте еще раз.", "newKnowledge.tasksWithAttention": "Задачи, {{count}} требуют внимания", + "newKnowledge.tokenCount": "Токены", "newKnowledge.unavailableDescription": "KnowledgeFS сейчас недоступен для этого рабочего пространства.", "newKnowledge.unavailableTitle": "Новая база знаний недоступна", "newKnowledge.updated": "Обновлено {{date}}", + "newKnowledge.updatedAt": "Последнее обновление", "newKnowledge.updatedColumn": "Обновлено", "newKnowledge.uploadCharactersUnavailable": "Символы: —", "newKnowledge.uploadDocuments": "Загрузить документы", diff --git a/web/i18n/sl-SI/dataset.json b/web/i18n/sl-SI/dataset.json index 1c64063ac4f..5edb712bfa6 100644 --- a/web/i18n/sl-SI/dataset.json +++ b/web/i18n/sl-SI/dataset.json @@ -140,10 +140,12 @@ "newKnowledge.adjustAndRecrawl": "Prilagodi in ponovno preišči", "newKnowledge.allDocumentStatuses": "Vsi statusi", "newKnowledge.allSources": "Vsi viri", + "newKnowledge.apiAgentAccess": "Dostop do API-ja in agentov", "newKnowledge.appsUnavailable": "— aplikacij", "newKnowledge.authKind.api-key": "API ključ", "newKnowledge.authKind.endpoint": "Končna točka", "newKnowledge.authenticationMethod": "Metoda avtentikacije", + "newKnowledge.averageChunkLength": "Povprečna dolžina odseka", "newKnowledge.backToList": "Nazaj k bazam znanja", "newKnowledge.backgroundTasks": "Naloge v ozadju", "newKnowledge.backgroundTasksDescription": "Dodajanje dokumentov, sinhronizacija virov in ponovno indeksiranje opravil.", @@ -152,6 +154,11 @@ "newKnowledge.bulkDocumentActions": "Dejanja množičnih dokumentov", "newKnowledge.cancelAddSource": "Prekliči", "newKnowledge.cardType": "Prostor znanja", + "newKnowledge.characterCount": "Znaki", + "newKnowledge.checkReindexStatus": "Preveri stanje ponovnega indeksiranja", + "newKnowledge.chunkCount": "Odseki", + "newKnowledge.chunkHeading": "Del {{position}}", + "newKnowledge.chunkLocation": "Položaj {{position}} v tej različici", "newKnowledge.clearDocumentSelection": "Počisti izbiro dokumenta", "newKnowledge.configureProvider": "Konfigurirajte {{provider}}", "newKnowledge.connectNotion": "Poveži Notion", @@ -165,6 +172,7 @@ "newKnowledge.connectionNeedsAttentionDescription": "Osvežite povezavo, preden dodate vir spletnega mesta.", "newKnowledge.connectionProvisioning": "{{provider}} vzpostavlja povezavo", "newKnowledge.connectionRefreshFailed": "Te povezave nismo mogli osvežiti. Poskusite znova.", + "newKnowledge.continueCheckingTaskStatus": "Nadaljuj preverjanje stanja opravila", "newKnowledge.crawlAndPreview": "Iskanje in predogled", "newKnowledge.crawlFailed": "Spletnega mesta {{host}} ni bilo mogoče preiskati", "newKnowledge.crawlFailed403": "Spletno mesto je vrnilo napako 403 — morda blokira pajke ali zahteva prijavo. Preverite URL, prilagodite možnosti preiskovanja ali poskusite drugega ponudnika.", @@ -184,6 +192,7 @@ "newKnowledge.createFailed": "Te baze znanja nismo mogli ustvariti. Preverite dostop in poskusite znova.", "newKnowledge.createIllustrationTitle": "Vsebino povežite enkrat — vsaka aplikacija odgovarja z najnovejšim znanjem.", "newKnowledge.createTitle": "Ustvarite znanje", + "newKnowledge.createdAt": "Ustvarjeno", "newKnowledge.creators": "Ustvarjalci", "newKnowledge.customIntervalHours": "Interval po meri (ure)", "newKnowledge.customIntervalInvalid": "Vnesite celo število od 1 do 720 ur.", @@ -205,14 +214,33 @@ "newKnowledge.discardSourceDraftTitle": "Želite zavreči ta osnutek vira?", "newKnowledge.documentActions": "Dejanja za {{name}}", "newKnowledge.documentActionsUnavailable": "Dejanja dokumentov še niso na voljo za to bazo znanja.", + "newKnowledge.documentChunksEmpty": "Za to različico še ni razpoložljivih delov.", + "newKnowledge.documentChunksLoadError": "Delov te različice ni bilo mogoče naložiti.", + "newKnowledge.documentChunksLoadMoreError": "Dodatnih delov ni bilo mogoče naložiti. Poskusite znova.", "newKnowledge.documentColumn": "Dokument", + "newKnowledge.documentContentIncomplete": "Nalaganje preostale vsebine dokumenta…", + "newKnowledge.documentContents": "Vsebina", + "newKnowledge.documentFacts": "Podrobnosti dokumenta", "newKnowledge.documentFilterLabel": "Filtrirajte dokumente po statusu", + "newKnowledge.documentLoadErrorDescription": "Tega dokumenta ni bilo mogoče naložiti. Poskusite znova.", + "newKnowledge.documentLoadErrorTitle": "Dokumenta ni bilo mogoče naložiti", + "newKnowledge.documentNotFoundDescription": "Dokument je bil morda odstranjen ali pa nimate dostopa.", + "newKnowledge.documentNotFoundTitle": "Dokument ni najden", + "newKnowledge.documentOverviewDescription": "Označevanje metapodatkov dokumentov omogoča umetni inteligenci pravočasen dostop in uporabnikom prikaže vire sklicev.", "newKnowledge.documentPermissionRestricted": "Dovoljenja vašega delovnega prostora ne omogočajo dejanj dokumentov ali opravil.", + "newKnowledge.documentReindexConfirmationDelayed": "Ponovno indeksiranje je bilo sprejeto, vendar stanje opravila zamuja. Preverite ga pred ponovno oddajo.", + "newKnowledge.documentReindexFailed": "Ponovno indeksiranje ni uspelo. Zadnja pripravljena različica ostaja na voljo.", + "newKnowledge.documentReindexProgress": "Ponovno indeksiranje · {{progress}}%", + "newKnowledge.documentRevision": "Različica", + "newKnowledge.documentRevisionMissingDescription": "Ta dokument še nima pripravljene različice. Preverite po končani obdelavi.", + "newKnowledge.documentRevisionMissingTitle": "Ni razpoložljive različice", + "newKnowledge.documentRevisionsLoadError": "Zgodovine različic ni bilo mogoče naložiti. Trenutna različica ostaja na voljo.", "newKnowledge.documentStatus.disabled": "Onemogočeno", "newKnowledge.documentStatus.failed": "Ni uspelo", "newKnowledge.documentStatus.processing": "Obdelava", "newKnowledge.documentStatus.queued": "V čakalni vrsti", "newKnowledge.documentStatus.ready": "Pripravljeno", + "newKnowledge.documentTaskLookupIncomplete": "Na voljo je več zgodovine opravil. Nadaljujte preverjanje, da najdete stanje dokumenta.", "newKnowledge.documentUploadExclusion.batchLimit": "omejitev velikosti paketa je presežena", "newKnowledge.documentUploadExclusion.countLimit": "omejitev števila datotek je presežena", "newKnowledge.documentUploadExclusion.fileSize": "datoteka je prevelika", @@ -241,10 +269,12 @@ "newKnowledge.documentsUnavailable": "— dokumentov", "newKnowledge.downloadDocuments": "Prenos", "newKnowledge.editSource": "Uredi", + "newKnowledge.emptyChunk": "Prazen del", "newKnowledge.emptyDescription": "Dodajte dokumente in agenti jih lahko berejo neposredno — brez nastavljanja indeksiranja.", "newKnowledge.emptyTitle": "Pametnejši način ustvarjanja baz znanja", "newKnowledge.errorDescription": "Novih baz znanja ni bilo mogoče naložiti. Poskusite znova.", "newKnowledge.errorTitle": "Prišlo je do napake", + "newKnowledge.fileSize": "Velikost datoteke", "newKnowledge.filtersUnavailable": "Ta filter bo na voljo, ko bo KnowledgeFS razkril metapodatke.", "newKnowledge.firecrawlUnavailable": "Firecrawl ni na voljo v katalogu ponudnika za ta delovni prostor.", "newKnowledge.gotIt": "Razumem", @@ -252,9 +282,11 @@ "newKnowledge.guideTitle": "Spoznajte novo bazo znanja ✨", "newKnowledge.illustrationHeadline": "Vsebino povežite enkrat — vsaka aplikacija bo odgovarjala z najnovejšim znanjem.", "newKnowledge.includeSubpages": "Vključi podstrani", + "newKnowledge.indexInformation": "Podatki o indeksu", "newKnowledge.interruptTask": "Prekini", "newKnowledge.invalidRootUrl": "Vnesite veljaven URL http(s).", "newKnowledge.keepEditing": "Nadaljuj urejanje", + "newKnowledge.lastIndexed": "Nazadnje indeksirano", "newKnowledge.lastReadyRevisionHint": "Neuspešna obdelava nikoli ne prekine pridobivanja — zadnja pripravljena revizija ostane na voljo v indeksu vsebine.", "newKnowledge.lastSyncColumn": "Zadnja sinhronizacija", "newKnowledge.learnMore": "Več informacij", @@ -263,10 +295,12 @@ "newKnowledge.leavePartialSetupTitle": "Želite zapustiti nedokončano nastavitev?", "newKnowledge.legacy": "Staro", "newKnowledge.loadMore": "Naloži več", + "newKnowledge.loadMoreRevisions": "Naloži starejše različice", "newKnowledge.loadingSyncPolicy": "Nalaganje pravilnika sinhronizacije", "newKnowledge.manualUpload": "Ročno nalaganje", "newKnowledge.maxPages": "Največje število strani", "newKnowledge.metadata": "Meta podatki", + "newKnowledge.mimeType": "Vrsta datoteke", "newKnowledge.moreProviders": "Več ponudnikov", "newKnowledge.name": "Ime znanja", "newKnowledge.namePlaceholder": "npr. Priročnik za podporo strankam", @@ -284,6 +318,7 @@ "newKnowledge.notionNotConnectedDescription": "Povežite Notion, da izberete strani in jih ohranite sinhronizirane.", "newKnowledge.onlineDocuments": "Spletni dokumenti", "newKnowledge.onlineDrive": "Spletna vožnja", + "newKnowledge.overview": "Pregled", "newKnowledge.pagesAppearDescription": "Preiščite spletno mesto in preverite, katere strani bodo dodane.", "newKnowledge.pagesAppearTitle": "Strani bodo prikazane tukaj", "newKnowledge.pagesCrawled": "Preiskanih strani na {{host}}: {{count}}", @@ -314,16 +349,24 @@ "newKnowledge.providerNotConfigured": "{{provider}} ni konfiguriran", "newKnowledge.providerNotConfiguredDescription": "Dodajte ključ API ali URL končne točke za iskanje po spletnih mestih z {{provider}}.", "newKnowledge.providerUnavailable": "Ta ponudnik ni dosegljiv.", + "newKnowledge.quality": "Kakovost", "newKnowledge.reCrawl": "Ponovno preišči", "newKnowledge.readOnlyEmpty": "Prosite urednika delovnega prostora, naj ustvari prvo bazo znanja.", "newKnowledge.refreshConnectionStatus": "Osveži stanje", "newKnowledge.refreshingConnection": "Osvežitev …", + "newKnowledge.reindexDocument": "Ponovno indeksiraj", "newKnowledge.reindexDocuments": "Ponovno indeksiraj", "newKnowledge.removeSource": "Odstrani vir", + "newKnowledge.retrievalCount": "Število pridobitev", "newKnowledge.retryCrawl": "Ponovi preiskovanje", "newKnowledge.retryProviderLoad": "Poskusi znova", + "newKnowledge.retryReindexDocument": "Ponovno indeksiraj", "newKnowledge.retrySyncPolicy": "Znova poskusi naložiti pravilnik sinhronizacije", "newKnowledge.retryTask": "Poskusite znova", + "newKnowledge.revisionState.active": "Aktivna", + "newKnowledge.revisionState.candidate": "Obdelava", + "newKnowledge.revisionState.failed": "Neuspešno", + "newKnowledge.revisionState.superseded": "Prejšnja", "newKnowledge.rootUrl": "Korenski URL", "newKnowledge.rootUrlPlaceholder": "https://docs.example.com", "newKnowledge.routeUnavailable": "Ta razdelek bo na voljo v naslednjem koraku nastavitve.", @@ -332,6 +375,7 @@ "newKnowledge.selectAll": "Izberi vse", "newKnowledge.selectAllDocuments": "Izberite vse dokumente", "newKnowledge.selectAllSources": "Izberi vse vire", + "newKnowledge.selectChunk": "Izberite del za pregled njegove vsebine.", "newKnowledge.selectFilesAndFolders": "Izberite datoteke in mape za sinhronizacijo", "newKnowledge.skippedFailed": "Preskočeno (neuspešno)", "newKnowledge.skippedOffDomain": "Preskočeno (zunaj domene)", @@ -383,9 +427,11 @@ "newKnowledge.tasks": "Naloge", "newKnowledge.tasksErrorDescription": "Opravil v ozadju nismo mogli naložiti. poskusi ponovno", "newKnowledge.tasksWithAttention": "Naloge, {{count}} potrebujejo pozornost", + "newKnowledge.tokenCount": "Žetoni", "newKnowledge.unavailableDescription": "KnowledgeFS trenutno ni na voljo za ta delovni prostor.", "newKnowledge.unavailableTitle": "Novo znanje ni na voljo", "newKnowledge.updated": "Posodobljeno {{date}}", + "newKnowledge.updatedAt": "Nazadnje posodobljeno", "newKnowledge.updatedColumn": "Posodobljeno", "newKnowledge.uploadCharactersUnavailable": "Znaki: —", "newKnowledge.uploadDocuments": "Nalaganje dokumentov", diff --git a/web/i18n/th-TH/dataset.json b/web/i18n/th-TH/dataset.json index 94015c3215c..d040287fcfb 100644 --- a/web/i18n/th-TH/dataset.json +++ b/web/i18n/th-TH/dataset.json @@ -140,10 +140,12 @@ "newKnowledge.adjustAndRecrawl": "ปรับและรวบรวมข้อมูลอีกครั้ง", "newKnowledge.allDocumentStatuses": "สถานะทั้งหมด", "newKnowledge.allSources": "แหล่งที่มาทั้งหมด", + "newKnowledge.apiAgentAccess": "การเข้าถึง API และเอเจนต์", "newKnowledge.appsUnavailable": "— แอป", "newKnowledge.authKind.api-key": "คีย์ API", "newKnowledge.authKind.endpoint": "จุดสิ้นสุด", "newKnowledge.authenticationMethod": "วิธีการตรวจสอบความถูกต้อง", + "newKnowledge.averageChunkLength": "ความยาวส่วนข้อมูลเฉลี่ย", "newKnowledge.backToList": "กลับสู่ฐานความรู้", "newKnowledge.backgroundTasks": "งานเบื้องหลัง", "newKnowledge.backgroundTasksDescription": "การเพิ่มเอกสาร การซิงค์แหล่งที่มา และงานจัดทำดัชนีใหม่", @@ -152,6 +154,11 @@ "newKnowledge.bulkDocumentActions": "การดำเนินการกับเอกสารจำนวนมาก", "newKnowledge.cancelAddSource": "ยกเลิก", "newKnowledge.cardType": "พื้นที่ความรู้", + "newKnowledge.characterCount": "อักขระ", + "newKnowledge.checkReindexStatus": "ตรวจสอบสถานะการทำดัชนีใหม่", + "newKnowledge.chunkCount": "ส่วนข้อมูล", + "newKnowledge.chunkHeading": "ส่วนข้อมูล {{position}}", + "newKnowledge.chunkLocation": "ตำแหน่ง {{position}} ในรุ่นแก้ไขนี้", "newKnowledge.clearDocumentSelection": "ล้างการเลือกเอกสาร", "newKnowledge.configureProvider": "กำหนดค่า {{provider}}", "newKnowledge.connectNotion": "เชื่อมต่อ Notion", @@ -165,6 +172,7 @@ "newKnowledge.connectionNeedsAttentionDescription": "รีเฟรชการเชื่อมต่อก่อนที่จะเพิ่มแหล่งที่มาของเว็บไซต์", "newKnowledge.connectionProvisioning": "กำลังเชื่อมต่อ {{provider}}", "newKnowledge.connectionRefreshFailed": "เราไม่สามารถรีเฟรชการเชื่อมต่อนี้ได้ ลองอีกครั้ง", + "newKnowledge.continueCheckingTaskStatus": "ตรวจสอบสถานะงานต่อ", "newKnowledge.crawlAndPreview": "รวบรวมข้อมูลและดูตัวอย่าง", "newKnowledge.crawlFailed": "ไม่สามารถรวบรวมข้อมูล {{host}} ได้", "newKnowledge.crawlFailed403": "เว็บไซต์ส่งคืนข้อผิดพลาด 403 ซึ่งอาจบล็อกโปรแกรมรวบรวมข้อมูลหรือต้องมีการยืนยันตัวตน ตรวจสอบ URL ปรับตัวเลือกการรวบรวมข้อมูล หรือลองใช้ผู้ให้บริการรายอื่น", @@ -184,6 +192,7 @@ "newKnowledge.createFailed": "เราไม่สามารถสร้างฐานความรู้นี้ได้ ตรวจสอบการเข้าถึงของคุณแล้วลองอีกครั้ง", "newKnowledge.createIllustrationTitle": "เชื่อมต่อเนื้อหาเพียงครั้งเดียว — ทุกแอปจะตอบด้วยความรู้ล่าสุด", "newKnowledge.createTitle": "สร้างองค์ความรู้", + "newKnowledge.createdAt": "สร้างเมื่อ", "newKnowledge.creators": "ผู้สร้าง", "newKnowledge.customIntervalHours": "ช่วงเวลาแบบกำหนดเอง (ชั่วโมง)", "newKnowledge.customIntervalInvalid": "ป้อนจำนวนเต็มตั้งแต่ 1 ถึง 720 ชั่วโมง", @@ -205,14 +214,33 @@ "newKnowledge.discardSourceDraftTitle": "ละทิ้งฉบับร่างแหล่งข้อมูลนี้หรือไม่", "newKnowledge.documentActions": "การดำเนินการสำหรับ {{name}}", "newKnowledge.documentActionsUnavailable": "การดำเนินการกับเอกสารยังไม่พร้อมใช้งานสำหรับฐานความรู้นี้", + "newKnowledge.documentChunksEmpty": "ยังไม่มีส่วนข้อมูลสำหรับรุ่นแก้ไขนี้", + "newKnowledge.documentChunksLoadError": "ไม่สามารถโหลดส่วนข้อมูลของรุ่นแก้ไขนี้ได้", + "newKnowledge.documentChunksLoadMoreError": "ไม่สามารถโหลดส่วนข้อมูลเพิ่มเติมได้ โปรดลองอีกครั้ง", "newKnowledge.documentColumn": "เอกสาร", + "newKnowledge.documentContentIncomplete": "กำลังโหลดเนื้อหาเอกสารที่เหลือ…", + "newKnowledge.documentContents": "สารบัญ", + "newKnowledge.documentFacts": "รายละเอียดเอกสาร", "newKnowledge.documentFilterLabel": "กรองเอกสารตามสถานะ", + "newKnowledge.documentLoadErrorDescription": "ไม่สามารถโหลดเอกสารนี้ได้ โปรดลองอีกครั้ง", + "newKnowledge.documentLoadErrorTitle": "โหลดเอกสารไม่ได้", + "newKnowledge.documentNotFoundDescription": "เอกสารนี้อาจถูกลบหรือคุณอาจไม่มีสิทธิ์เข้าถึง", + "newKnowledge.documentNotFoundTitle": "ไม่พบเอกสาร", + "newKnowledge.documentOverviewDescription": "การติดป้ายกำกับข้อมูลเมตาของเอกสารช่วยให้ AI เข้าถึงเอกสารได้ทันท่วงทีและแสดงแหล่งที่มาของการอ้างอิงแก่ผู้ใช้", "newKnowledge.documentPermissionRestricted": "สิทธิ์ของพื้นที่ทำงานไม่อนุญาตให้ดำเนินการกับเอกสารหรืองาน", + "newKnowledge.documentReindexConfirmationDelayed": "ระบบรับคำขอทำดัชนีใหม่แล้ว แต่สถานะงานล่าช้า โปรดตรวจสอบก่อนส่งอีกครั้ง", + "newKnowledge.documentReindexFailed": "การจัดทำดัชนีใหม่ล้มเหลว รุ่นแก้ไขล่าสุดที่พร้อมใช้งานยังคงอยู่", + "newKnowledge.documentReindexProgress": "กำลังจัดทำดัชนีใหม่ · {{progress}}%", + "newKnowledge.documentRevision": "รุ่นแก้ไข", + "newKnowledge.documentRevisionMissingDescription": "เอกสารนี้ยังไม่มีรุ่นแก้ไขที่พร้อม โปรดตรวจสอบอีกครั้งหลังประมวลผลเสร็จ", + "newKnowledge.documentRevisionMissingTitle": "ไม่มีรุ่นแก้ไขที่พร้อมใช้งาน", + "newKnowledge.documentRevisionsLoadError": "ไม่สามารถโหลดประวัติรุ่นแก้ไขได้ รุ่นปัจจุบันยังคงใช้งานได้", "newKnowledge.documentStatus.disabled": "ปิดการใช้งาน", "newKnowledge.documentStatus.failed": "ล้มเหลว", "newKnowledge.documentStatus.processing": "กำลังประมวลผล", "newKnowledge.documentStatus.queued": "เข้าคิว", "newKnowledge.documentStatus.ready": "พร้อม", + "newKnowledge.documentTaskLookupIncomplete": "ยังมีประวัติงานเพิ่มเติม โปรดตรวจสอบต่อเพื่อค้นหาสถานะของเอกสารนี้", "newKnowledge.documentUploadExclusion.batchLimit": "เกินขีดจำกัดขนาดแบตช์", "newKnowledge.documentUploadExclusion.countLimit": "เกินขีดจำกัดจำนวนไฟล์", "newKnowledge.documentUploadExclusion.fileSize": "ไฟล์มีขนาดใหญ่เกินไป", @@ -241,10 +269,12 @@ "newKnowledge.documentsUnavailable": "— เอกสาร", "newKnowledge.downloadDocuments": "ดาวน์โหลด", "newKnowledge.editSource": "แก้ไข", + "newKnowledge.emptyChunk": "ส่วนข้อมูลว่าง", "newKnowledge.emptyDescription": "เพิ่มเอกสารของคุณ แล้วเอเจนต์จะอ่านได้โดยตรง โดยไม่ต้องตั้งค่าการทำดัชนี", "newKnowledge.emptyTitle": "วิธีที่ชาญฉลาดกว่าในการสร้างฐานความรู้", "newKnowledge.errorDescription": "ไม่สามารถโหลดฐานความรู้ใหม่ได้ โปรดลองอีกครั้ง", "newKnowledge.errorTitle": "เกิดข้อผิดพลาด", + "newKnowledge.fileSize": "ขนาดไฟล์", "newKnowledge.filtersUnavailable": "ตัวกรองนี้จะพร้อมใช้งานเมื่อ KnowledgeFS เปิดเผยข้อมูลเมตา", "newKnowledge.firecrawlUnavailable": "Firecrawl ไม่พร้อมใช้งานในแค็ตตาล็อกผู้ให้บริการสำหรับพื้นที่ทำงานนี้", "newKnowledge.gotIt": "เข้าใจแล้ว", @@ -252,9 +282,11 @@ "newKnowledge.guideTitle": "พบกับฐานความรู้แบบใหม่ ✨", "newKnowledge.illustrationHeadline": "เชื่อมต่อเนื้อหาครั้งเดียว ทุกแอปจะตอบด้วยความรู้ล่าสุด", "newKnowledge.includeSubpages": "รวมหน้าย่อย", + "newKnowledge.indexInformation": "ข้อมูลดัชนี", "newKnowledge.interruptTask": "ขัดจังหวะ", "newKnowledge.invalidRootUrl": "ป้อน URL http(s) ที่ถูกต้อง", "newKnowledge.keepEditing": "แก้ไขต่อ", + "newKnowledge.lastIndexed": "จัดทำดัชนีล่าสุด", "newKnowledge.lastReadyRevisionHint": "การประมวลผลที่ล้มเหลวจะไม่ขัดจังหวะการดึงข้อมูล — การแก้ไขที่พร้อมใช้ครั้งล่าสุดจะยังคงอยู่ในดัชนีเนื้อหา", "newKnowledge.lastSyncColumn": "ซิงค์ครั้งล่าสุด", "newKnowledge.learnMore": "เรียนรู้เพิ่มเติม", @@ -263,10 +295,12 @@ "newKnowledge.leavePartialSetupTitle": "ออกจากการตั้งค่าที่ยังไม่เสร็จหรือไม่?", "newKnowledge.legacy": "แบบเดิม", "newKnowledge.loadMore": "โหลดเพิ่มเติม", + "newKnowledge.loadMoreRevisions": "โหลดรุ่นแก้ไขก่อนหน้า", "newKnowledge.loadingSyncPolicy": "กำลังโหลดนโยบายการซิงค์", "newKnowledge.manualUpload": "อัพโหลดด้วยตนเอง", "newKnowledge.maxPages": "จำนวนหน้าสูงสุด", "newKnowledge.metadata": "ข้อมูลเมตา", + "newKnowledge.mimeType": "ประเภทไฟล์", "newKnowledge.moreProviders": "ผู้ให้บริการเพิ่มเติม", "newKnowledge.name": "ชื่อความรู้", "newKnowledge.namePlaceholder": "เช่น คู่มือการสนับสนุนลูกค้า", @@ -284,6 +318,7 @@ "newKnowledge.notionNotConnectedDescription": "เชื่อมต่อ Notion เพื่อเลือกหน้าและคงการซิงค์ไว้", "newKnowledge.onlineDocuments": "เอกสารออนไลน์", "newKnowledge.onlineDrive": "ไดรฟ์ออนไลน์", + "newKnowledge.overview": "ภาพรวม", "newKnowledge.pagesAppearDescription": "รวบรวมข้อมูลเว็บไซต์เพื่อตรวจสอบหน้าที่จะเพิ่ม", "newKnowledge.pagesAppearTitle": "หน้าจะแสดงที่นี่", "newKnowledge.pagesCrawled": "รวบรวมข้อมูล {{count}} หน้าที่ {{host}}", @@ -314,16 +349,24 @@ "newKnowledge.providerNotConfigured": "{{provider}} ไม่ได้กำหนดค่า", "newKnowledge.providerNotConfiguredDescription": "เพิ่มคีย์ API หรือ URL ปลายทางเพื่อรวบรวมข้อมูลเว็บไซต์ด้วย {{provider}}", "newKnowledge.providerUnavailable": "ผู้ให้บริการนี้ไม่พร้อมใช้งาน", + "newKnowledge.quality": "คุณภาพ", "newKnowledge.reCrawl": "รวบรวมข้อมูลอีกครั้ง", "newKnowledge.readOnlyEmpty": "ขอให้ผู้แก้ไขพื้นที่ทำงานสร้างฐานความรู้แรก", "newKnowledge.refreshConnectionStatus": "รีเฟรชสถานะ", "newKnowledge.refreshingConnection": "สดชื่น...", + "newKnowledge.reindexDocument": "จัดทำดัชนีใหม่", "newKnowledge.reindexDocuments": "จัดทำดัชนีใหม่", "newKnowledge.removeSource": "ลบแหล่งสัญญาณ", + "newKnowledge.retrievalCount": "จำนวนการเรียกค้น", "newKnowledge.retryCrawl": "ลองรวบรวมข้อมูลอีกครั้ง", "newKnowledge.retryProviderLoad": "ลองอีกครั้ง", + "newKnowledge.retryReindexDocument": "ทำดัชนีใหม่อีกครั้ง", "newKnowledge.retrySyncPolicy": "ลองโหลดนโยบายการซิงค์อีกครั้ง", "newKnowledge.retryTask": "ลองอีกครั้ง", + "newKnowledge.revisionState.active": "ใช้งานอยู่", + "newKnowledge.revisionState.candidate": "กำลังประมวลผล", + "newKnowledge.revisionState.failed": "ล้มเหลว", + "newKnowledge.revisionState.superseded": "ก่อนหน้า", "newKnowledge.rootUrl": "URL หลัก", "newKnowledge.rootUrlPlaceholder": "https://docs.example.com", "newKnowledge.routeUnavailable": "ส่วนนี้จะพร้อมใช้งานในขั้นตอนการตั้งค่าถัดไป", @@ -332,6 +375,7 @@ "newKnowledge.selectAll": "เลือกทั้งหมด", "newKnowledge.selectAllDocuments": "เลือกเอกสารทั้งหมด", "newKnowledge.selectAllSources": "เลือกแหล่งที่มาทั้งหมด", + "newKnowledge.selectChunk": "เลือกส่วนข้อมูลเพื่อตรวจสอบเนื้อหา", "newKnowledge.selectFilesAndFolders": "เลือกไฟล์และโฟลเดอร์ที่จะซิงค์", "newKnowledge.skippedFailed": "ข้าม (ล้มเหลว)", "newKnowledge.skippedOffDomain": "ข้าม (นอกโดเมน)", @@ -383,9 +427,11 @@ "newKnowledge.tasks": "งาน", "newKnowledge.tasksErrorDescription": "เราไม่สามารถโหลดงานพื้นหลังได้ ลองอีกครั้ง", "newKnowledge.tasksWithAttention": "งาน {{count}} ต้องการความสนใจ", + "newKnowledge.tokenCount": "โทเค็น", "newKnowledge.unavailableDescription": "ขณะนี้ KnowledgeFS ไม่พร้อมใช้งานสำหรับพื้นที่ทำงานนี้", "newKnowledge.unavailableTitle": "ความรู้แบบใหม่ไม่พร้อมใช้งาน", "newKnowledge.updated": "อัปเดตเมื่อ {{date}}", + "newKnowledge.updatedAt": "อัปเดตล่าสุด", "newKnowledge.updatedColumn": "อัปเดตแล้ว", "newKnowledge.uploadCharactersUnavailable": "อักขระ: —", "newKnowledge.uploadDocuments": "อัพโหลดเอกสาร", diff --git a/web/i18n/tr-TR/dataset.json b/web/i18n/tr-TR/dataset.json index cbd6fa18f4e..4d58a33ef82 100644 --- a/web/i18n/tr-TR/dataset.json +++ b/web/i18n/tr-TR/dataset.json @@ -140,10 +140,12 @@ "newKnowledge.adjustAndRecrawl": "Ayarla ve yeniden tara", "newKnowledge.allDocumentStatuses": "Tüm durum", "newKnowledge.allSources": "Tüm kaynaklar", + "newKnowledge.apiAgentAccess": "API ve Ajan Erişimi", "newKnowledge.appsUnavailable": "— uygulama", "newKnowledge.authKind.api-key": "API anahtarı", "newKnowledge.authKind.endpoint": "Uç nokta", "newKnowledge.authenticationMethod": "Kimlik doğrulama yöntemi", + "newKnowledge.averageChunkLength": "Ortalama parça uzunluğu", "newKnowledge.backToList": "Bilgi tabanlarına geri dön", "newKnowledge.backgroundTasks": "Arka plan görevleri", "newKnowledge.backgroundTasksDescription": "Belge ekleme, kaynak senkronizasyonu ve işleri yeniden indeksleme.", @@ -152,6 +154,11 @@ "newKnowledge.bulkDocumentActions": "Toplu belge işlemleri", "newKnowledge.cancelAddSource": "İptal et", "newKnowledge.cardType": "Bilgi alanı", + "newKnowledge.characterCount": "Karakterler", + "newKnowledge.checkReindexStatus": "Yeniden indeksleme durumunu kontrol et", + "newKnowledge.chunkCount": "Parçalar", + "newKnowledge.chunkHeading": "Parça {{position}}", + "newKnowledge.chunkLocation": "Bu revizyondaki {{position}}. konum", "newKnowledge.clearDocumentSelection": "Belge seçimini temizle", "newKnowledge.configureProvider": "{{provider}}'ı Yapılandır", "newKnowledge.connectNotion": "Notion’a bağlan", @@ -165,6 +172,7 @@ "newKnowledge.connectionNeedsAttentionDescription": "Bir web sitesi kaynağı eklemeden önce bağlantıyı yenileyin.", "newKnowledge.connectionProvisioning": "{{provider}} bağlanıyor", "newKnowledge.connectionRefreshFailed": "Bu bağlantıyı yenileyemedik. Tekrar deneyin.", + "newKnowledge.continueCheckingTaskStatus": "Görev durumunu kontrol etmeye devam et", "newKnowledge.crawlAndPreview": "Tara ve önizle", "newKnowledge.crawlFailed": "{{host}} taranamadı", "newKnowledge.crawlFailed403": "Site 403 yanıtı verdi — tarayıcıları engelliyor veya kimlik doğrulaması gerektiriyor olabilir. URL’yi kontrol edin, tarama seçeneklerini ayarlayın ya da başka bir sağlayıcı deneyin.", @@ -184,6 +192,7 @@ "newKnowledge.createFailed": "Bu bilgi tabanını oluşturamadık. Erişiminizi kontrol edip tekrar deneyin.", "newKnowledge.createIllustrationTitle": "İçeriğinizi bir kez bağlayın — her uygulama en güncel bilgilerle yanıt versin.", "newKnowledge.createTitle": "Bilgi Yaratın", + "newKnowledge.createdAt": "Oluşturuldu", "newKnowledge.creators": "Oluşturanlar", "newKnowledge.customIntervalHours": "Özel aralık (saat)", "newKnowledge.customIntervalInvalid": "1 ile 720 saat arasında bir tam sayı girin.", @@ -205,14 +214,33 @@ "newKnowledge.discardSourceDraftTitle": "Bu kaynak taslağı silinsin mi?", "newKnowledge.documentActions": "{{name}} için eylemler", "newKnowledge.documentActionsUnavailable": "Belge eylemleri henüz bu bilgi tabanında kullanılamıyor.", + "newKnowledge.documentChunksEmpty": "Bu revizyon için henüz parça yok.", + "newKnowledge.documentChunksLoadError": "Bu revizyonun parçaları yüklenemedi.", + "newKnowledge.documentChunksLoadMoreError": "Daha fazla parça yüklenemedi. Tekrar deneyin.", "newKnowledge.documentColumn": "Belge", + "newKnowledge.documentContentIncomplete": "Belgenin kalan içeriği yükleniyor…", + "newKnowledge.documentContents": "İçerik", + "newKnowledge.documentFacts": "Belge ayrıntıları", "newKnowledge.documentFilterLabel": "Belgeleri duruma göre filtreleyin", + "newKnowledge.documentLoadErrorDescription": "Bu belge yüklenemedi. Tekrar deneyin.", + "newKnowledge.documentLoadErrorTitle": "Belge yüklenemedi", + "newKnowledge.documentNotFoundDescription": "Bu belge kaldırılmış olabilir veya erişiminiz olmayabilir.", + "newKnowledge.documentNotFoundTitle": "Belge bulunamadı", + "newKnowledge.documentOverviewDescription": "Belge meta verilerini etiketlemek, yapay zekânın belgelere zamanında erişmesini ve kullanıcılara referans kaynaklarını göstermesini sağlar.", "newKnowledge.documentPermissionRestricted": "Çalışma alanı izinleriniz belge veya görev işlemlerine izin vermiyor.", + "newKnowledge.documentReindexConfirmationDelayed": "Yeniden indeksleme kabul edildi ancak görev durumu gecikiyor. Tekrar göndermeden önce kontrol edin.", + "newKnowledge.documentReindexFailed": "Yeniden dizinleme başarısız oldu. Son hazır revizyon kullanılabilir durumda.", + "newKnowledge.documentReindexProgress": "Yeniden dizinleniyor · %{{progress}}", + "newKnowledge.documentRevision": "Revizyon", + "newKnowledge.documentRevisionMissingDescription": "Bu belgenin henüz hazır bir revizyonu yok. İşlem tamamlandıktan sonra tekrar kontrol edin.", + "newKnowledge.documentRevisionMissingTitle": "Kullanılabilir revizyon yok", + "newKnowledge.documentRevisionsLoadError": "Revizyon geçmişi yüklenemedi. Geçerli revizyon kullanılabilir durumda.", "newKnowledge.documentStatus.disabled": "Devre dışı", "newKnowledge.documentStatus.failed": "Başarısız", "newKnowledge.documentStatus.processing": "İşleme", "newKnowledge.documentStatus.queued": "Sıraya alındı", "newKnowledge.documentStatus.ready": "Hazır", + "newKnowledge.documentTaskLookupIncomplete": "Daha fazla görev geçmişi var. Bu belgenin durumunu bulmak için kontrol etmeye devam edin.", "newKnowledge.documentUploadExclusion.batchLimit": "toplu iş boyutu sınırı aşıldı", "newKnowledge.documentUploadExclusion.countLimit": "dosya sayısı sınırı aşıldı", "newKnowledge.documentUploadExclusion.fileSize": "dosya çok büyük", @@ -241,10 +269,12 @@ "newKnowledge.documentsUnavailable": "— belge", "newKnowledge.downloadDocuments": "İndir", "newKnowledge.editSource": "Düzenle", + "newKnowledge.emptyChunk": "Boş parça", "newKnowledge.emptyDescription": "Belgelerinizi ekleyin; ajanlar indeksleme yapılandırmadan belgeleri doğrudan okuyabilsin.", "newKnowledge.emptyTitle": "Bilgi tabanları oluşturmanın daha akıllı yolu", "newKnowledge.errorDescription": "Yeni bilgi tabanlarınız yüklenemedi. Tekrar deneyin.", "newKnowledge.errorTitle": "Bir şeyler yanlış gitti", + "newKnowledge.fileSize": "Dosya boyutu", "newKnowledge.filtersUnavailable": "KnowledgeFS meta verilerini sunduğunda bu filtre kullanılabilir olacak.", "newKnowledge.firecrawlUnavailable": "Firecrawl bu çalışma alanının sağlayıcı kataloğunda mevcut değil.", "newKnowledge.gotIt": "Anladım", @@ -252,9 +282,11 @@ "newKnowledge.guideTitle": "Yeni Bilgi Tabanı ile tanışın ✨", "newKnowledge.illustrationHeadline": "İçeriğinizi bir kez bağlayın — her uygulama en güncel bilgilerle yanıt versin.", "newKnowledge.includeSubpages": "Alt sayfaları dahil et", + "newKnowledge.indexInformation": "Dizin bilgileri", "newKnowledge.interruptTask": "Kesinti", "newKnowledge.invalidRootUrl": "Geçerli bir http(s) URL’si girin.", "newKnowledge.keepEditing": "Düzenlemeye devam et", + "newKnowledge.lastIndexed": "Son dizinleme", "newKnowledge.lastReadyRevisionHint": "Başarısız işleme hiçbir zaman alımı kesintiye uğratmaz; son hazır revizyon içerik dizininde mevcut kalır.", "newKnowledge.lastSyncColumn": "Son senkronizasyon", "newKnowledge.learnMore": "Daha fazla bilgi", @@ -263,10 +295,12 @@ "newKnowledge.leavePartialSetupTitle": "Tamamlanmamış kurulumdan çıkılsın mı?", "newKnowledge.legacy": "Eski", "newKnowledge.loadMore": "Daha fazla yükle", + "newKnowledge.loadMoreRevisions": "Eski revizyonları yükle", "newKnowledge.loadingSyncPolicy": "Eşitleme politikası yükleniyor", "newKnowledge.manualUpload": "Manuel yükleme", "newKnowledge.maxPages": "En fazla sayfa", "newKnowledge.metadata": "Meta Veriler", + "newKnowledge.mimeType": "Dosya türü", "newKnowledge.moreProviders": "Daha fazla sağlayıcı", "newKnowledge.name": "Bilgi adı", "newKnowledge.namePlaceholder": "örneğin Müşteri Desteği El Kitabı", @@ -284,6 +318,7 @@ "newKnowledge.notionNotConnectedDescription": "Sayfaları seçmek ve eşitlenmiş tutmak için Notion’a bağlanın.", "newKnowledge.onlineDocuments": "Çevrimiçi belgeler", "newKnowledge.onlineDrive": "Çevrimiçi sürücü", + "newKnowledge.overview": "Genel bakış", "newKnowledge.pagesAppearDescription": "Hangi sayfaların ekleneceğini görmek için siteyi tarayın.", "newKnowledge.pagesAppearTitle": "Sayfalar burada görünecek", "newKnowledge.pagesCrawled": "{{host}} üzerinde {{count}} sayfa tarandı", @@ -314,16 +349,24 @@ "newKnowledge.providerNotConfigured": "{{provider}} yapılandırılmadı", "newKnowledge.providerNotConfiguredDescription": "{{provider}} ile web sitelerini taramak için bir API anahtarı veya uç nokta URL'si ekleyin.", "newKnowledge.providerUnavailable": "Bu sağlayıcı kullanılamıyor.", + "newKnowledge.quality": "Kalite", "newKnowledge.reCrawl": "Yeniden tara", "newKnowledge.readOnlyEmpty": "İlk bilgi tabanını oluşturması için bir çalışma alanı editörüne başvurun.", "newKnowledge.refreshConnectionStatus": "Durumu yenile", "newKnowledge.refreshingConnection": "Yenileniyor…", + "newKnowledge.reindexDocument": "Yeniden dizinle", "newKnowledge.reindexDocuments": "Yeniden indeksle", "newKnowledge.removeSource": "Kaynağı kaldır", + "newKnowledge.retrievalCount": "Getirme sayısı", "newKnowledge.retryCrawl": "Taramayı yeniden dene", "newKnowledge.retryProviderLoad": "Tekrar dene", + "newKnowledge.retryReindexDocument": "Yeniden indeksle", "newKnowledge.retrySyncPolicy": "Eşitleme politikasını yeniden dene", "newKnowledge.retryTask": "Yeniden dene", + "newKnowledge.revisionState.active": "Etkin", + "newKnowledge.revisionState.candidate": "İşleniyor", + "newKnowledge.revisionState.failed": "Başarısız", + "newKnowledge.revisionState.superseded": "Önceki", "newKnowledge.rootUrl": "Kök URL", "newKnowledge.rootUrlPlaceholder": "https://docs.example.com", "newKnowledge.routeUnavailable": "Bu bölüm bir sonraki kurulum adımında kullanılabilir hale gelecektir.", @@ -332,6 +375,7 @@ "newKnowledge.selectAll": "Tümünü seç", "newKnowledge.selectAllDocuments": "Tüm belgeleri seç", "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.skippedFailed": "Atlandı (başarısız)", "newKnowledge.skippedOffDomain": "Atlandı (alan adı dışında)", @@ -383,9 +427,11 @@ "newKnowledge.tasks": "Görevler", "newKnowledge.tasksErrorDescription": "Arka plan görevlerini yükleyemedik. Tekrar deneyin.", "newKnowledge.tasksWithAttention": "Görevler, {{count}} tanesiyle ilgilenilmesi gerekiyor", + "newKnowledge.tokenCount": "Jetonlar", "newKnowledge.unavailableDescription": "KnowledgeFS şu anda bu çalışma alanında kullanılamıyor.", "newKnowledge.unavailableTitle": "Yeni Bilgi kullanılamıyor", "newKnowledge.updated": "{{date}} tarihinde güncellendi", + "newKnowledge.updatedAt": "Son güncelleme", "newKnowledge.updatedColumn": "Güncellendi", "newKnowledge.uploadCharactersUnavailable": "Karakterler: —", "newKnowledge.uploadDocuments": "Belgeleri yükleyin", diff --git a/web/i18n/uk-UA/dataset.json b/web/i18n/uk-UA/dataset.json index 938f7030959..18979829a2f 100644 --- a/web/i18n/uk-UA/dataset.json +++ b/web/i18n/uk-UA/dataset.json @@ -140,10 +140,12 @@ "newKnowledge.adjustAndRecrawl": "Налаштувати й просканувати знову", "newKnowledge.allDocumentStatuses": "Всі статуси", "newKnowledge.allSources": "Усі джерела", + "newKnowledge.apiAgentAccess": "Доступ до API та агентів", "newKnowledge.appsUnavailable": "— застосунків", "newKnowledge.authKind.api-key": "API ключ", "newKnowledge.authKind.endpoint": "Кінцева точка", "newKnowledge.authenticationMethod": "Метод автентифікації", + "newKnowledge.averageChunkLength": "Середня довжина фрагмента", "newKnowledge.backToList": "Назад до баз знань", "newKnowledge.backgroundTasks": "Фонові завдання", "newKnowledge.backgroundTasksDescription": "Додавання документів, синхронізація джерела та повторне індексування завдань.", @@ -152,6 +154,11 @@ "newKnowledge.bulkDocumentActions": "Масові дії з документами", "newKnowledge.cancelAddSource": "Скасувати", "newKnowledge.cardType": "Простір знань", + "newKnowledge.characterCount": "Символи", + "newKnowledge.checkReindexStatus": "Перевірити стан переіндексації", + "newKnowledge.chunkCount": "Фрагменти", + "newKnowledge.chunkHeading": "Фрагмент {{position}}", + "newKnowledge.chunkLocation": "Позиція {{position}} у цій редакції", "newKnowledge.clearDocumentSelection": "Очистити вибір документів", "newKnowledge.configureProvider": "Налаштувати {{provider}}", "newKnowledge.connectNotion": "Підключити Notion", @@ -165,6 +172,7 @@ "newKnowledge.connectionNeedsAttentionDescription": "Оновіть з’єднання, перш ніж додавати джерело веб-сайту.", "newKnowledge.connectionProvisioning": "{{provider}} підключається", "newKnowledge.connectionRefreshFailed": "Нам не вдалося оновити це з’єднання. Спробуйте знову.", + "newKnowledge.continueCheckingTaskStatus": "Продовжити перевірку стану", "newKnowledge.crawlAndPreview": "Сканування та попередній перегляд", "newKnowledge.crawlFailed": "Не вдалося просканувати {{host}}", "newKnowledge.crawlFailed403": "Сайт повернув помилку 403 — можливо, він блокує пошукових роботів або вимагає автентифікації. Перевірте URL-адресу, змініть параметри сканування або спробуйте іншого постачальника.", @@ -184,6 +192,7 @@ "newKnowledge.createFailed": "Ми не змогли створити цю базу знань. Перевірте свій доступ і повторіть спробу.", "newKnowledge.createIllustrationTitle": "Підключіть вміст один раз — кожен застосунок відповідатиме на основі найсвіжіших знань.", "newKnowledge.createTitle": "Створюйте знання", + "newKnowledge.createdAt": "Створено", "newKnowledge.creators": "Автори", "newKnowledge.customIntervalHours": "Власний інтервал (години)", "newKnowledge.customIntervalInvalid": "Введіть ціле число від 1 до 720 годин.", @@ -205,14 +214,33 @@ "newKnowledge.discardSourceDraftTitle": "Відхилити цю чернетку джерела?", "newKnowledge.documentActions": "Дії для {{name}}", "newKnowledge.documentActionsUnavailable": "Дії з документами поки що недоступні для цієї бази знань.", + "newKnowledge.documentChunksEmpty": "Для цієї редакції ще немає доступних фрагментів.", + "newKnowledge.documentChunksLoadError": "Не вдалося завантажити фрагменти цієї редакції.", + "newKnowledge.documentChunksLoadMoreError": "Не вдалося завантажити додаткові фрагменти. Спробуйте ще раз.", "newKnowledge.documentColumn": "документ", + "newKnowledge.documentContentIncomplete": "Завантажується решта вмісту документа…", + "newKnowledge.documentContents": "Зміст", + "newKnowledge.documentFacts": "Відомості про документ", "newKnowledge.documentFilterLabel": "Фільтр документів за статусом", + "newKnowledge.documentLoadErrorDescription": "Не вдалося завантажити цей документ. Спробуйте ще раз.", + "newKnowledge.documentLoadErrorTitle": "Не вдалося завантажити документ", + "newKnowledge.documentNotFoundDescription": "Можливо, документ видалено або у вас немає доступу.", + "newKnowledge.documentNotFoundTitle": "Документ не знайдено", + "newKnowledge.documentOverviewDescription": "Позначення метаданих документів дає ШІ змогу своєчасно отримувати до них доступ і показує користувачам джерела посилань.", "newKnowledge.documentPermissionRestricted": "Дозволи вашого робочого простору не дозволяють виконувати дії з документами або завданнями.", + "newKnowledge.documentReindexConfirmationDelayed": "Переіндексацію прийнято, але стан завдання затримується. Перевірте його перед повторним надсиланням.", + "newKnowledge.documentReindexFailed": "Повторне індексування завершилося помилкою. Остання готова редакція залишається доступною.", + "newKnowledge.documentReindexProgress": "Повторне індексування · {{progress}}%", + "newKnowledge.documentRevision": "Редакція", + "newKnowledge.documentRevisionMissingDescription": "Цей документ ще не має готової редакції. Перевірте після завершення обробки.", + "newKnowledge.documentRevisionMissingTitle": "Немає доступної редакції", + "newKnowledge.documentRevisionsLoadError": "Не вдалося завантажити історію редакцій. Поточна редакція залишається доступною.", "newKnowledge.documentStatus.disabled": "Вимкнено", "newKnowledge.documentStatus.failed": "Не вдалося", "newKnowledge.documentStatus.processing": "Обробка", "newKnowledge.documentStatus.queued": "У черзі", "newKnowledge.documentStatus.ready": "Готовий", + "newKnowledge.documentTaskLookupIncomplete": "Доступна додаткова історія завдань. Продовжте перевірку, щоб знайти стан документа.", "newKnowledge.documentUploadExclusion.batchLimit": "перевищено обмеження розміру пакета", "newKnowledge.documentUploadExclusion.countLimit": "перевищено обмеження кількості файлів", "newKnowledge.documentUploadExclusion.fileSize": "файл завеликий", @@ -241,10 +269,12 @@ "newKnowledge.documentsUnavailable": "— документів", "newKnowledge.downloadDocuments": "Завантажити", "newKnowledge.editSource": "Редагувати", + "newKnowledge.emptyChunk": "Порожній фрагмент", "newKnowledge.emptyDescription": "Додайте документи, і агенти зможуть читати їх безпосередньо — без налаштування індексації.", "newKnowledge.emptyTitle": "Розумніший спосіб створювати бази знань", "newKnowledge.errorDescription": "Не вдалося завантажити нові бази знань. Спробуйте ще раз.", "newKnowledge.errorTitle": "Щось пішло не так", + "newKnowledge.fileSize": "Розмір файлу", "newKnowledge.filtersUnavailable": "Фільтр стане доступним, коли KnowledgeFS надасть метадані.", "newKnowledge.firecrawlUnavailable": "Firecrawl недоступний у каталозі постачальників для цієї робочої області.", "newKnowledge.gotIt": "Зрозуміло", @@ -252,9 +282,11 @@ "newKnowledge.guideTitle": "Познайомтеся з новою базою знань ✨", "newKnowledge.illustrationHeadline": "Підключіть вміст один раз — і кожна програма відповідатиме на основі найсвіжіших знань.", "newKnowledge.includeSubpages": "Включати підсторінки", + "newKnowledge.indexInformation": "Відомості про індекс", "newKnowledge.interruptTask": "Переривати", "newKnowledge.invalidRootUrl": "Введіть дійсну URL-адресу http(s).", "newKnowledge.keepEditing": "Продовжити редагування", + "newKnowledge.lastIndexed": "Останнє індексування", "newKnowledge.lastReadyRevisionHint": "Невдала обробка ніколи не перериває пошук — остання готова версія залишається доступною в індексі вмісту.", "newKnowledge.lastSyncColumn": "Остання синхронізація", "newKnowledge.learnMore": "Докладніше", @@ -263,10 +295,12 @@ "newKnowledge.leavePartialSetupTitle": "Вийти з незавершеного налаштування?", "newKnowledge.legacy": "Попередня версія", "newKnowledge.loadMore": "Завантажити ще", + "newKnowledge.loadMoreRevisions": "Завантажити попередні редакції", "newKnowledge.loadingSyncPolicy": "Завантаження політики синхронізації", "newKnowledge.manualUpload": "Ручне завантаження", "newKnowledge.maxPages": "Максимум сторінок", "newKnowledge.metadata": "Метадані", + "newKnowledge.mimeType": "Тип файлу", "newKnowledge.moreProviders": "Інші провайдери", "newKnowledge.name": "Назва знання", "newKnowledge.namePlaceholder": "напр. Посібник із підтримки клієнтів", @@ -284,6 +318,7 @@ "newKnowledge.notionNotConnectedDescription": "Підключіть Notion, щоб вибирати сторінки й підтримувати їх синхронізацію.", "newKnowledge.onlineDocuments": "Документи онлайн", "newKnowledge.onlineDrive": "Онлайн драйв", + "newKnowledge.overview": "Огляд", "newKnowledge.pagesAppearDescription": "Проскануйте сайт, щоб переглянути сторінки, які буде додано.", "newKnowledge.pagesAppearTitle": "Тут з’являться сторінки", "newKnowledge.pagesCrawled": "Проскановано сторінок на {{host}}: {{count}}", @@ -314,16 +349,24 @@ "newKnowledge.providerNotConfigured": "{{provider}} не налаштовано", "newKnowledge.providerNotConfiguredDescription": "Додайте ключ API або URL-адресу кінцевої точки, щоб сканувати веб-сайти за допомогою {{provider}}.", "newKnowledge.providerUnavailable": "Цей провайдер недоступний.", + "newKnowledge.quality": "Якість", "newKnowledge.reCrawl": "Просканувати знову", "newKnowledge.readOnlyEmpty": "Попросіть редактора робочого простору створити першу базу знань.", "newKnowledge.refreshConnectionStatus": "Оновити статус", "newKnowledge.refreshingConnection": "Оновлення…", + "newKnowledge.reindexDocument": "Переіндексувати", "newKnowledge.reindexDocuments": "Переіндексувати", "newKnowledge.removeSource": "Видалити джерело", + "newKnowledge.retrievalCount": "Кількість отримань", "newKnowledge.retryCrawl": "Повторити сканування", "newKnowledge.retryProviderLoad": "Спробуйте ще раз", + "newKnowledge.retryReindexDocument": "Переіндексувати знову", "newKnowledge.retrySyncPolicy": "Повторити завантаження політики синхронізації", "newKnowledge.retryTask": "Повторіть спробу", + "newKnowledge.revisionState.active": "Активна", + "newKnowledge.revisionState.candidate": "Обробка", + "newKnowledge.revisionState.failed": "Помилка", + "newKnowledge.revisionState.superseded": "Попередня", "newKnowledge.rootUrl": "Коренева URL-адреса", "newKnowledge.rootUrlPlaceholder": "https://docs.example.com", "newKnowledge.routeUnavailable": "Цей розділ стане доступним на наступному кроці налаштування.", @@ -332,6 +375,7 @@ "newKnowledge.selectAll": "Вибрати все", "newKnowledge.selectAllDocuments": "Виберіть усі документи", "newKnowledge.selectAllSources": "Вибрати всі джерела", + "newKnowledge.selectChunk": "Виберіть фрагмент, щоб переглянути його вміст.", "newKnowledge.selectFilesAndFolders": "Виберіть файли й папки для синхронізації", "newKnowledge.skippedFailed": "Пропущено (помилка)", "newKnowledge.skippedOffDomain": "Пропущено (поза доменом)", @@ -383,9 +427,11 @@ "newKnowledge.tasks": "завдання", "newKnowledge.tasksErrorDescription": "Не вдалося завантажити фонові завдання. Спробуйте знову.", "newKnowledge.tasksWithAttention": "Завдання, {{count}} потребують уваги", + "newKnowledge.tokenCount": "Токени", "newKnowledge.unavailableDescription": "KnowledgeFS зараз недоступний для цього робочого простору.", "newKnowledge.unavailableTitle": "Нова база знань недоступна", "newKnowledge.updated": "Оновлено {{date}}", + "newKnowledge.updatedAt": "Останнє оновлення", "newKnowledge.updatedColumn": "Оновлено", "newKnowledge.uploadCharactersUnavailable": "Символи: —", "newKnowledge.uploadDocuments": "Завантажити документи", diff --git a/web/i18n/vi-VN/dataset.json b/web/i18n/vi-VN/dataset.json index f8f849ce91a..f24db177e36 100644 --- a/web/i18n/vi-VN/dataset.json +++ b/web/i18n/vi-VN/dataset.json @@ -140,10 +140,12 @@ "newKnowledge.adjustAndRecrawl": "Điều chỉnh và thu thập lại", "newKnowledge.allDocumentStatuses": "Tất cả trạng thái", "newKnowledge.allSources": "Tất cả các nguồn", + "newKnowledge.apiAgentAccess": "Quyền truy cập API và tác nhân", "newKnowledge.appsUnavailable": "— ứng dụng", "newKnowledge.authKind.api-key": "Khóa API", "newKnowledge.authKind.endpoint": "Điểm cuối", "newKnowledge.authenticationMethod": "Phương thức xác thực", + "newKnowledge.averageChunkLength": "Độ dài đoạn trung bình", "newKnowledge.backToList": "Quay lại cơ sở kiến thức", "newKnowledge.backgroundTasks": "Tác vụ nền", "newKnowledge.backgroundTasksDescription": "Tài liệu thêm, đồng bộ hóa nguồn và lập chỉ mục lại công việc.", @@ -152,6 +154,11 @@ "newKnowledge.bulkDocumentActions": "Hành động tài liệu hàng loạt", "newKnowledge.cancelAddSource": "Hủy", "newKnowledge.cardType": "Không gian kiến thức", + "newKnowledge.characterCount": "Ký tự", + "newKnowledge.checkReindexStatus": "Kiểm tra trạng thái lập chỉ mục lại", + "newKnowledge.chunkCount": "Đoạn", + "newKnowledge.chunkHeading": "Đoạn {{position}}", + "newKnowledge.chunkLocation": "Vị trí {{position}} trong bản sửa đổi này", "newKnowledge.clearDocumentSelection": "Xóa lựa chọn tài liệu", "newKnowledge.configureProvider": "Định cấu hình {{provider}}", "newKnowledge.connectNotion": "Kết nối Notion", @@ -165,6 +172,7 @@ "newKnowledge.connectionNeedsAttentionDescription": "Làm mới kết nối trước khi thêm nguồn trang web.", "newKnowledge.connectionProvisioning": "{{provider}} đang kết nối", "newKnowledge.connectionRefreshFailed": "Chúng tôi không thể làm mới kết nối này. Hãy thử lại.", + "newKnowledge.continueCheckingTaskStatus": "Tiếp tục kiểm tra trạng thái tác vụ", "newKnowledge.crawlAndPreview": "Thu thập thông tin và xem trước", "newKnowledge.crawlFailed": "Không thể thu thập dữ liệu từ {{host}}", "newKnowledge.crawlFailed403": "Trang web trả về lỗi 403 — có thể trang đang chặn trình thu thập hoặc yêu cầu xác thực. Kiểm tra URL, điều chỉnh tùy chọn thu thập hoặc thử nhà cung cấp khác.", @@ -184,6 +192,7 @@ "newKnowledge.createFailed": "Chúng tôi không thể tạo ra nền tảng kiến thức này. Hãy kiểm tra quyền truy cập của bạn và thử lại.", "newKnowledge.createIllustrationTitle": "Kết nối nội dung một lần — mọi ứng dụng đều trả lời bằng kiến thức mới nhất.", "newKnowledge.createTitle": "Tạo kiến thức", + "newKnowledge.createdAt": "Đã tạo", "newKnowledge.creators": "Người tạo", "newKnowledge.customIntervalHours": "Khoảng thời gian tùy chỉnh (giờ)", "newKnowledge.customIntervalInvalid": "Nhập số nguyên từ 1 đến 720 giờ.", @@ -205,14 +214,33 @@ "newKnowledge.discardSourceDraftTitle": "Hủy bản nháp nguồn này?", "newKnowledge.documentActions": "Các hành động dành cho {{name}}", "newKnowledge.documentActionsUnavailable": "Hành động tài liệu chưa có sẵn cho cơ sở kiến thức này.", + "newKnowledge.documentChunksEmpty": "Chưa có đoạn nào cho bản sửa đổi này.", + "newKnowledge.documentChunksLoadError": "Không thể tải các đoạn của bản sửa đổi này.", + "newKnowledge.documentChunksLoadMoreError": "Không thể tải thêm đoạn. Hãy thử lại.", "newKnowledge.documentColumn": "tài liệu", + "newKnowledge.documentContentIncomplete": "Đang tải phần nội dung tài liệu còn lại…", + "newKnowledge.documentContents": "Nội dung", + "newKnowledge.documentFacts": "Chi tiết tài liệu", "newKnowledge.documentFilterLabel": "Lọc tài liệu theo trạng thái", + "newKnowledge.documentLoadErrorDescription": "Không thể tải tài liệu này. Hãy thử lại.", + "newKnowledge.documentLoadErrorTitle": "Không thể tải tài liệu", + "newKnowledge.documentNotFoundDescription": "Tài liệu có thể đã bị xóa hoặc bạn không có quyền truy cập.", + "newKnowledge.documentNotFoundTitle": "Không tìm thấy tài liệu", + "newKnowledge.documentOverviewDescription": "Gắn nhãn siêu dữ liệu cho tài liệu giúp AI truy cập kịp thời và hiển thị nguồn tham chiếu cho người dùng.", "newKnowledge.documentPermissionRestricted": "Quyền trong không gian làm việc của bạn không cho phép thao tác với tài liệu hoặc tác vụ.", + "newKnowledge.documentReindexConfirmationDelayed": "Yêu cầu lập chỉ mục lại đã được chấp nhận nhưng trạng thái tác vụ bị trễ. Hãy kiểm tra trước khi gửi lại.", + "newKnowledge.documentReindexFailed": "Lập chỉ mục lại thất bại. Bản sửa đổi sẵn sàng gần nhất vẫn khả dụng.", + "newKnowledge.documentReindexProgress": "Đang lập chỉ mục lại · {{progress}}%", + "newKnowledge.documentRevision": "Bản sửa đổi", + "newKnowledge.documentRevisionMissingDescription": "Tài liệu này chưa có bản sửa đổi sẵn sàng. Hãy kiểm tra lại sau khi xử lý xong.", + "newKnowledge.documentRevisionMissingTitle": "Không có bản sửa đổi", + "newKnowledge.documentRevisionsLoadError": "Không thể tải lịch sử sửa đổi. Bản sửa đổi hiện tại vẫn khả dụng.", "newKnowledge.documentStatus.disabled": "Đã tắt", "newKnowledge.documentStatus.failed": "thất bại", "newKnowledge.documentStatus.processing": "Đang xử lý", "newKnowledge.documentStatus.queued": "Đã xếp hàng", "newKnowledge.documentStatus.ready": "Sẵn sàng", + "newKnowledge.documentTaskLookupIncomplete": "Còn thêm lịch sử tác vụ. Hãy tiếp tục kiểm tra để tìm trạng thái của tài liệu này.", "newKnowledge.documentUploadExclusion.batchLimit": "đã vượt quá giới hạn kích thước lô", "newKnowledge.documentUploadExclusion.countLimit": "đã vượt quá giới hạn số lượng tệp", "newKnowledge.documentUploadExclusion.fileSize": "tệp quá lớn", @@ -241,10 +269,12 @@ "newKnowledge.documentsUnavailable": "— tài liệu", "newKnowledge.downloadDocuments": "Tải xuống", "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.", "newKnowledge.emptyTitle": "Cách thông minh hơn để xây dựng cơ sở kiến thức", "newKnowledge.errorDescription": "Không thể tải các cơ sở kiến thức mới. Hãy thử lại.", "newKnowledge.errorTitle": "Đã xảy ra lỗi", + "newKnowledge.fileSize": "Kích thước tệp", "newKnowledge.filtersUnavailable": "Bộ lọc này sẽ khả dụng khi KnowledgeFS cung cấp siêu dữ liệu.", "newKnowledge.firecrawlUnavailable": "Firecrawl không có sẵn trong danh mục nhà cung cấp cho không gian làm việc này.", "newKnowledge.gotIt": "Đã hiểu", @@ -252,9 +282,11 @@ "newKnowledge.guideTitle": "Khám phá Cơ sở kiến thức mới ✨", "newKnowledge.illustrationHeadline": "Kết nối nội dung một lần — mọi ứng dụng sẽ trả lời bằng kiến thức mới nhất.", "newKnowledge.includeSubpages": "Bao gồm các trang con", + "newKnowledge.indexInformation": "Thông tin chỉ mục", "newKnowledge.interruptTask": "Ngắt", "newKnowledge.invalidRootUrl": "Nhập URL http(s) hợp lệ.", "newKnowledge.keepEditing": "Tiếp tục chỉnh sửa", + "newKnowledge.lastIndexed": "Lập chỉ mục gần nhất", "newKnowledge.lastReadyRevisionHint": "Quá trình xử lý không thành công không bao giờ làm gián đoạn quá trình truy xuất — bản sửa đổi sẵn sàng cuối cùng vẫn có sẵn trong chỉ mục nội dung.", "newKnowledge.lastSyncColumn": "Đồng bộ hóa lần cuối", "newKnowledge.learnMore": "Tìm hiểu thêm", @@ -263,10 +295,12 @@ "newKnowledge.leavePartialSetupTitle": "Thoát khỏi thiết lập chưa hoàn tất?", "newKnowledge.legacy": "Cũ", "newKnowledge.loadMore": "Tải thêm", + "newKnowledge.loadMoreRevisions": "Tải các bản sửa đổi cũ hơn", "newKnowledge.loadingSyncPolicy": "Đang tải chính sách đồng bộ", "newKnowledge.manualUpload": "Tải lên thủ công", "newKnowledge.maxPages": "Số trang tối đa", "newKnowledge.metadata": "Siêu dữ liệu", + "newKnowledge.mimeType": "Loại tệp", "newKnowledge.moreProviders": "Nhà cung cấp khác", "newKnowledge.name": "Tên kiến thức", "newKnowledge.namePlaceholder": "ví dụ: Sổ tay hỗ trợ khách hàng", @@ -284,6 +318,7 @@ "newKnowledge.notionNotConnectedDescription": "Kết nối Notion để chọn trang và duy trì đồng bộ.", "newKnowledge.onlineDocuments": "Tài liệu trực tuyến", "newKnowledge.onlineDrive": "Ổ đĩa trực tuyến", + "newKnowledge.overview": "Tổng quan", "newKnowledge.pagesAppearDescription": "Thu thập trang web để xem những trang nào sẽ được thêm.", "newKnowledge.pagesAppearTitle": "Các trang sẽ xuất hiện ở đây", "newKnowledge.pagesCrawled": "Đã thu thập {{count}} trang tại {{host}}", @@ -314,16 +349,24 @@ "newKnowledge.providerNotConfigured": "{{provider}} chưa được định cấu hình", "newKnowledge.providerNotConfiguredDescription": "Thêm khóa API hoặc URL điểm cuối để thu thập dữ liệu trang web bằng {{provider}}.", "newKnowledge.providerUnavailable": "Nhà cung cấp này không có sẵn.", + "newKnowledge.quality": "Chất lượng", "newKnowledge.reCrawl": "Thu thập lại", "newKnowledge.readOnlyEmpty": "Yêu cầu biên tập viên không gian làm việc tạo cơ sở kiến thức đầu tiên.", "newKnowledge.refreshConnectionStatus": "Trạng thái làm mới", "newKnowledge.refreshingConnection": "Đang làm mới…", + "newKnowledge.reindexDocument": "Lập chỉ mục lại", "newKnowledge.reindexDocuments": "Lập chỉ mục lại", "newKnowledge.removeSource": "Xóa nguồn", + "newKnowledge.retrievalCount": "Số lần truy xuất", "newKnowledge.retryCrawl": "Thử thu thập lại", "newKnowledge.retryProviderLoad": "Thử lại", + "newKnowledge.retryReindexDocument": "Lập chỉ mục lại lần nữa", "newKnowledge.retrySyncPolicy": "Thử lại chính sách đồng bộ", "newKnowledge.retryTask": "Thử lại", + "newKnowledge.revisionState.active": "Đang hoạt động", + "newKnowledge.revisionState.candidate": "Đang xử lý", + "newKnowledge.revisionState.failed": "Thất bại", + "newKnowledge.revisionState.superseded": "Trước đó", "newKnowledge.rootUrl": "URL gốc", "newKnowledge.rootUrlPlaceholder": "https://docs.example.com", "newKnowledge.routeUnavailable": "Phần này sẽ có sẵn trong bước thiết lập tiếp theo.", @@ -332,6 +375,7 @@ "newKnowledge.selectAll": "Chọn tất cả", "newKnowledge.selectAllDocuments": "Chọn tất cả tài liệu", "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.skippedFailed": "Đã bỏ qua (thất bại)", "newKnowledge.skippedOffDomain": "Đã bỏ qua (ngoài miền)", @@ -383,9 +427,11 @@ "newKnowledge.tasks": "Nhiệm vụ", "newKnowledge.tasksErrorDescription": "Chúng tôi không thể tải tác vụ nền. Hãy thử lại.", "newKnowledge.tasksWithAttention": "Nhiệm vụ, {{count}} cần chú ý", + "newKnowledge.tokenCount": "Token", "newKnowledge.unavailableDescription": "KnowledgeFS hiện không khả dụng cho không gian làm việc này.", "newKnowledge.unavailableTitle": "Kiến thức mới không khả dụng", "newKnowledge.updated": "Cập nhật {{date}}", + "newKnowledge.updatedAt": "Cập nhật gần nhất", "newKnowledge.updatedColumn": "Đã cập nhật", "newKnowledge.uploadCharactersUnavailable": "Ký tự: —", "newKnowledge.uploadDocuments": "Tải tài liệu lên", diff --git a/web/i18n/zh-Hans/dataset.json b/web/i18n/zh-Hans/dataset.json index dc03d3bda14..5d33cabf359 100644 --- a/web/i18n/zh-Hans/dataset.json +++ b/web/i18n/zh-Hans/dataset.json @@ -140,10 +140,12 @@ "newKnowledge.adjustAndRecrawl": "调整并重新抓取", "newKnowledge.allDocumentStatuses": "全部状态", "newKnowledge.allSources": "所有来源", + "newKnowledge.apiAgentAccess": "API 与智能体访问", "newKnowledge.appsUnavailable": "— 个应用", "newKnowledge.authKind.api-key": "API 密钥", "newKnowledge.authKind.endpoint": "端点", "newKnowledge.authenticationMethod": "认证方式", + "newKnowledge.averageChunkLength": "平均分段长度", "newKnowledge.backToList": "返回知识库列表", "newKnowledge.backgroundTasks": "后台任务", "newKnowledge.backgroundTasksDescription": "文档添加、数据源同步和重新索引任务。", @@ -152,6 +154,11 @@ "newKnowledge.bulkDocumentActions": "批量文档操作", "newKnowledge.cancelAddSource": "取消", "newKnowledge.cardType": "知识空间", + "newKnowledge.characterCount": "字符数", + "newKnowledge.checkReindexStatus": "检查重新索引状态", + "newKnowledge.chunkCount": "分段数", + "newKnowledge.chunkHeading": "分段 {{position}}", + "newKnowledge.chunkLocation": "此修订版本中的第 {{position}} 个位置", "newKnowledge.clearDocumentSelection": "清除文档选择", "newKnowledge.configureProvider": "配置{{provider}}", "newKnowledge.connectNotion": "连接 Notion", @@ -165,6 +172,7 @@ "newKnowledge.connectionNeedsAttentionDescription": "添加网站源之前刷新连接。", "newKnowledge.connectionProvisioning": "{{provider}} 正在连接", "newKnowledge.connectionRefreshFailed": "我们无法刷新此连接。再试一次。", + "newKnowledge.continueCheckingTaskStatus": "继续检查任务状态", "newKnowledge.crawlAndPreview": "抓取和预览", "newKnowledge.crawlFailed": "无法抓取 {{host}}", "newKnowledge.crawlFailed403": "网站返回了 403,可能阻止抓取工具访问或需要身份验证。请检查 URL、调整抓取选项,或尝试其他提供商。", @@ -184,6 +192,7 @@ "newKnowledge.createFailed": "无法创建此知识库,请检查权限后重试。", "newKnowledge.createIllustrationTitle": "只需连接一次内容——每个应用都能用最新知识作答。", "newKnowledge.createTitle": "创建知识库", + "newKnowledge.createdAt": "创建时间", "newKnowledge.creators": "创建者", "newKnowledge.customIntervalHours": "自定义间隔(小时)", "newKnowledge.customIntervalInvalid": "请输入 1 到 720 之间的整数小时数。", @@ -205,14 +214,33 @@ "newKnowledge.discardSourceDraftTitle": "放弃此来源草稿?", "newKnowledge.documentActions": "{{name}} 的操作", "newKnowledge.documentActionsUnavailable": "此知识库暂不支持文档操作。", + "newKnowledge.documentChunksEmpty": "此修订版本暂时没有可用分段。", + "newKnowledge.documentChunksLoadError": "无法加载此修订版本的分段。", + "newKnowledge.documentChunksLoadMoreError": "无法加载更多分段,请重试。", "newKnowledge.documentColumn": "文档", + "newKnowledge.documentContentIncomplete": "正在加载剩余文档内容…", + "newKnowledge.documentContents": "目录", + "newKnowledge.documentFacts": "文档详情", "newKnowledge.documentFilterLabel": "按状态筛选文档", + "newKnowledge.documentLoadErrorDescription": "无法加载此文档,请重试。", + "newKnowledge.documentLoadErrorTitle": "文档加载失败", + "newKnowledge.documentNotFoundDescription": "此文档可能已被删除,或你没有访问权限。", + "newKnowledge.documentNotFoundTitle": "未找到文档", + "newKnowledge.documentOverviewDescription": "为文档标注元数据可帮助 AI 及时访问内容,并向用户展示引用来源。", "newKnowledge.documentPermissionRestricted": "你的工作区权限不允许执行文档或任务操作。", + "newKnowledge.documentReindexConfirmationDelayed": "重新索引已受理,但任务状态同步延迟。再次提交前请先检查状态。", + "newKnowledge.documentReindexFailed": "重新索引失败,最后一个就绪的修订版本仍然可用。", + "newKnowledge.documentReindexProgress": "正在重新索引 · {{progress}}%", + "newKnowledge.documentRevision": "修订版本", + "newKnowledge.documentRevisionMissingDescription": "此文档还没有就绪的修订版本,请在处理完成后再查看。", + "newKnowledge.documentRevisionMissingTitle": "没有可用的修订版本", + "newKnowledge.documentRevisionsLoadError": "无法加载修订历史,当前修订版本仍然可用。", "newKnowledge.documentStatus.disabled": "已禁用", "newKnowledge.documentStatus.failed": "失败", "newKnowledge.documentStatus.processing": "处理中", "newKnowledge.documentStatus.queued": "排队中", "newKnowledge.documentStatus.ready": "就绪", + "newKnowledge.documentTaskLookupIncomplete": "还有更多任务历史记录。继续检查以查找此文档的状态。", "newKnowledge.documentUploadExclusion.batchLimit": "超出批次大小限制", "newKnowledge.documentUploadExclusion.countLimit": "超出文件数量限制", "newKnowledge.documentUploadExclusion.fileSize": "文件过大", @@ -241,10 +269,12 @@ "newKnowledge.documentsUnavailable": "— 篇文档", "newKnowledge.downloadDocuments": "下载", "newKnowledge.editSource": "编辑", + "newKnowledge.emptyChunk": "空分段", "newKnowledge.emptyDescription": "添加文档后,智能体即可直接读取,无需配置索引。", "newKnowledge.emptyTitle": "更智能的知识库构建方式", "newKnowledge.errorDescription": "无法加载新知识库,请重试。", "newKnowledge.errorTitle": "出现错误", + "newKnowledge.fileSize": "文件大小", "newKnowledge.filtersUnavailable": "KnowledgeFS 提供元数据后即可使用此筛选器。", "newKnowledge.firecrawlUnavailable": "Firecrawl 在此工作区的提供程序目录中不可用。", "newKnowledge.gotIt": "知道了", @@ -252,9 +282,11 @@ "newKnowledge.guideTitle": "认识全新的知识库 ✨", "newKnowledge.illustrationHeadline": "只需连接一次内容,每个应用都能基于最新知识回答。", "newKnowledge.includeSubpages": "包含子页面", + "newKnowledge.indexInformation": "索引信息", "newKnowledge.interruptTask": "中断", "newKnowledge.invalidRootUrl": "请输入有效的 http(s) URL。", "newKnowledge.keepEditing": "继续编辑", + "newKnowledge.lastIndexed": "最近索引时间", "newKnowledge.lastReadyRevisionHint": "处理失败不会中断检索,内容索引中会继续保留上一个就绪的修订。", "newKnowledge.lastSyncColumn": "上次同步", "newKnowledge.learnMore": "了解更多", @@ -263,10 +295,12 @@ "newKnowledge.leavePartialSetupTitle": "离开未完成的设置?", "newKnowledge.legacy": "旧版", "newKnowledge.loadMore": "加载更多", + "newKnowledge.loadMoreRevisions": "加载更早的修订版本", "newKnowledge.loadingSyncPolicy": "正在加载同步策略", "newKnowledge.manualUpload": "手动上传", "newKnowledge.maxPages": "最大页面数", "newKnowledge.metadata": "元数据", + "newKnowledge.mimeType": "文件类型", "newKnowledge.moreProviders": "更多提供商", "newKnowledge.name": "知识库名称", "newKnowledge.namePlaceholder": "例如:客户支持手册", @@ -284,6 +318,7 @@ "newKnowledge.notionNotConnectedDescription": "连接 Notion 以选择页面并保持同步。", "newKnowledge.onlineDocuments": "在线文档", "newKnowledge.onlineDrive": "在线驱动器", + "newKnowledge.overview": "概览", "newKnowledge.pagesAppearDescription": "抓取网站以查看将添加哪些页面。", "newKnowledge.pagesAppearTitle": "页面将显示在此处", "newKnowledge.pagesCrawled": "已抓取 {{host}} 的 {{count}} 个页面", @@ -314,16 +349,24 @@ "newKnowledge.providerNotConfigured": "{{provider}} 未配置", "newKnowledge.providerNotConfiguredDescription": "添加 API 密钥或端点 URL 以使用 {{provider}} 抓取网站。", "newKnowledge.providerUnavailable": "该提供商不可用。", + "newKnowledge.quality": "质量", "newKnowledge.reCrawl": "重新抓取", "newKnowledge.readOnlyEmpty": "请联系工作区编辑者创建第一个知识库。", "newKnowledge.refreshConnectionStatus": "刷新状态", "newKnowledge.refreshingConnection": "正在刷新……", + "newKnowledge.reindexDocument": "重新索引", "newKnowledge.reindexDocuments": "重新索引", "newKnowledge.removeSource": "删除来源", + "newKnowledge.retrievalCount": "检索次数", "newKnowledge.retryCrawl": "重试抓取", "newKnowledge.retryProviderLoad": "重试", + "newKnowledge.retryReindexDocument": "再次重新索引", "newKnowledge.retrySyncPolicy": "重试同步策略", "newKnowledge.retryTask": "重试", + "newKnowledge.revisionState.active": "活跃", + "newKnowledge.revisionState.candidate": "处理中", + "newKnowledge.revisionState.failed": "失败", + "newKnowledge.revisionState.superseded": "上一个", "newKnowledge.rootUrl": "根 URL", "newKnowledge.rootUrlPlaceholder": "https://docs.example.com", "newKnowledge.routeUnavailable": "此部分将在下一设置步骤中开放。", @@ -332,6 +375,7 @@ "newKnowledge.selectAll": "全选", "newKnowledge.selectAllDocuments": "选择全部文档", "newKnowledge.selectAllSources": "选择所有来源", + "newKnowledge.selectChunk": "选择一个分段以查看其内容。", "newKnowledge.selectFilesAndFolders": "选择要同步的文件和文件夹", "newKnowledge.skippedFailed": "已跳过(失败)", "newKnowledge.skippedOffDomain": "已跳过(域外)", @@ -383,9 +427,11 @@ "newKnowledge.tasks": "任务", "newKnowledge.tasksErrorDescription": "无法加载后台任务,请重试。", "newKnowledge.tasksWithAttention": "任务,{{count}} 个需要关注", + "newKnowledge.tokenCount": "Token 数", "newKnowledge.unavailableDescription": "KnowledgeFS 当前在此工作区不可用。", "newKnowledge.unavailableTitle": "新版知识库不可用", "newKnowledge.updated": "更新于 {{date}}", + "newKnowledge.updatedAt": "最后更新", "newKnowledge.updatedColumn": "更新时间", "newKnowledge.uploadCharactersUnavailable": "字符数:—", "newKnowledge.uploadDocuments": "上传文档", diff --git a/web/i18n/zh-Hant/dataset.json b/web/i18n/zh-Hant/dataset.json index 7c4a2490a9e..06c5b72d905 100644 --- a/web/i18n/zh-Hant/dataset.json +++ b/web/i18n/zh-Hant/dataset.json @@ -140,10 +140,12 @@ "newKnowledge.adjustAndRecrawl": "調整並重新抓取", "newKnowledge.allDocumentStatuses": "全部狀態", "newKnowledge.allSources": "所有來源", + "newKnowledge.apiAgentAccess": "API 與智慧體存取", "newKnowledge.appsUnavailable": "— 個應用程式", "newKnowledge.authKind.api-key": "API 金鑰", "newKnowledge.authKind.endpoint": "端點", "newKnowledge.authenticationMethod": "認證方式", + "newKnowledge.averageChunkLength": "平均分段長度", "newKnowledge.backToList": "返回知識庫列表", "newKnowledge.backgroundTasks": "背景任務", "newKnowledge.backgroundTasksDescription": "文件新增、資料來源同步和重新索引任務。", @@ -152,6 +154,11 @@ "newKnowledge.bulkDocumentActions": "批次文件操作", "newKnowledge.cancelAddSource": "取消", "newKnowledge.cardType": "知識空間", + "newKnowledge.characterCount": "字元數", + "newKnowledge.checkReindexStatus": "檢查重新索引狀態", + "newKnowledge.chunkCount": "分段數", + "newKnowledge.chunkHeading": "分段 {{position}}", + "newKnowledge.chunkLocation": "此修訂版本中的第 {{position}} 個位置", "newKnowledge.clearDocumentSelection": "清除文件選取", "newKnowledge.configureProvider": "配置{{provider}}", "newKnowledge.connectNotion": "連接 Notion", @@ -165,6 +172,7 @@ "newKnowledge.connectionNeedsAttentionDescription": "新增網站來源之前刷新連線。", "newKnowledge.connectionProvisioning": "{{provider}} 正在連接", "newKnowledge.connectionRefreshFailed": "我們無法刷新此連線。再試一次。", + "newKnowledge.continueCheckingTaskStatus": "繼續檢查任務狀態", "newKnowledge.crawlAndPreview": "抓取與預覽", "newKnowledge.crawlFailed": "無法抓取 {{host}}", "newKnowledge.crawlFailed403": "網站傳回了 403,可能阻擋抓取工具或需要驗證。請檢查 URL、調整抓取選項,或嘗試其他供應商。", @@ -184,6 +192,7 @@ "newKnowledge.createFailed": "無法建立此知識庫,請檢查權限後再試一次。", "newKnowledge.createIllustrationTitle": "只需連接一次內容——每個應用都能以最新知識作答。", "newKnowledge.createTitle": "建立知識庫", + "newKnowledge.createdAt": "建立時間", "newKnowledge.creators": "建立者", "newKnowledge.customIntervalHours": "自訂間隔(小時)", "newKnowledge.customIntervalInvalid": "請輸入 1 到 720 之間的整數小時數。", @@ -205,14 +214,33 @@ "newKnowledge.discardSourceDraftTitle": "捨棄此來源草稿?", "newKnowledge.documentActions": "{{name}} 的操作", "newKnowledge.documentActionsUnavailable": "此知識庫暫不支援文件操作。", + "newKnowledge.documentChunksEmpty": "此修訂版本暫時沒有可用分段。", + "newKnowledge.documentChunksLoadError": "無法載入此修訂版本的分段。", + "newKnowledge.documentChunksLoadMoreError": "無法載入更多分段,請再試一次。", "newKnowledge.documentColumn": "文件", + "newKnowledge.documentContentIncomplete": "正在載入剩餘文件內容…", + "newKnowledge.documentContents": "目錄", + "newKnowledge.documentFacts": "文件詳細資料", "newKnowledge.documentFilterLabel": "依狀態篩選文件", + "newKnowledge.documentLoadErrorDescription": "無法載入此文件,請再試一次。", + "newKnowledge.documentLoadErrorTitle": "文件載入失敗", + "newKnowledge.documentNotFoundDescription": "此文件可能已被移除,或你沒有存取權限。", + "newKnowledge.documentNotFoundTitle": "找不到文件", + "newKnowledge.documentOverviewDescription": "為文件標註中繼資料可協助 AI 及時存取內容,並向使用者顯示引用來源。", "newKnowledge.documentPermissionRestricted": "你的工作區權限不允許執行文件或任務操作。", + "newKnowledge.documentReindexConfirmationDelayed": "重新索引已受理,但任務狀態同步延遲。再次提交前請先檢查狀態。", + "newKnowledge.documentReindexFailed": "重新建立索引失敗,最後一個就緒的修訂版本仍然可用。", + "newKnowledge.documentReindexProgress": "正在重新建立索引 · {{progress}}%", + "newKnowledge.documentRevision": "修訂版本", + "newKnowledge.documentRevisionMissingDescription": "此文件尚未有就緒的修訂版本,請在處理完成後再查看。", + "newKnowledge.documentRevisionMissingTitle": "沒有可用的修訂版本", + "newKnowledge.documentRevisionsLoadError": "無法載入修訂歷程,目前的修訂版本仍然可用。", "newKnowledge.documentStatus.disabled": "已停用", "newKnowledge.documentStatus.failed": "失敗", "newKnowledge.documentStatus.processing": "處理中", "newKnowledge.documentStatus.queued": "排隊中", "newKnowledge.documentStatus.ready": "就緒", + "newKnowledge.documentTaskLookupIncomplete": "還有更多任務歷史記錄。繼續檢查以尋找此文件的狀態。", "newKnowledge.documentUploadExclusion.batchLimit": "超出批次大小限制", "newKnowledge.documentUploadExclusion.countLimit": "超出檔案數量限制", "newKnowledge.documentUploadExclusion.fileSize": "檔案過大", @@ -241,10 +269,12 @@ "newKnowledge.documentsUnavailable": "— 份文件", "newKnowledge.downloadDocuments": "下載", "newKnowledge.editSource": "編輯", + "newKnowledge.emptyChunk": "空分段", "newKnowledge.emptyDescription": "加入文件後,智慧代理即可直接讀取,無需設定索引。", "newKnowledge.emptyTitle": "更聰明的知識庫建立方式", "newKnowledge.errorDescription": "無法載入新知識庫,請再試一次。", "newKnowledge.errorTitle": "發生錯誤", + "newKnowledge.fileSize": "檔案大小", "newKnowledge.filtersUnavailable": "KnowledgeFS 提供中繼資料後即可使用此篩選器。", "newKnowledge.firecrawlUnavailable": "Firecrawl 在此工作區的提供者目錄中不可用。", "newKnowledge.gotIt": "知道了", @@ -252,9 +282,11 @@ "newKnowledge.guideTitle": "認識全新的知識庫 ✨", "newKnowledge.illustrationHeadline": "只需連接一次內容,每個應用程式都能以最新知識回答。", "newKnowledge.includeSubpages": "包含子頁面", + "newKnowledge.indexInformation": "索引資訊", "newKnowledge.interruptTask": "中斷", "newKnowledge.invalidRootUrl": "請輸入有效的 http(s) URL。", "newKnowledge.keepEditing": "繼續編輯", + "newKnowledge.lastIndexed": "最近建立索引時間", "newKnowledge.lastReadyRevisionHint": "處理失敗不會中斷檢索,內容索引中會繼續保留上一個就緒的修訂。", "newKnowledge.lastSyncColumn": "上次同步", "newKnowledge.learnMore": "瞭解更多", @@ -263,10 +295,12 @@ "newKnowledge.leavePartialSetupTitle": "離開未完成的設定?", "newKnowledge.legacy": "舊版", "newKnowledge.loadMore": "載入更多", + "newKnowledge.loadMoreRevisions": "載入較早的修訂版本", "newKnowledge.loadingSyncPolicy": "正在載入同步政策", "newKnowledge.manualUpload": "手動上傳", "newKnowledge.maxPages": "頁面數上限", "newKnowledge.metadata": "中繼資料", + "newKnowledge.mimeType": "檔案類型", "newKnowledge.moreProviders": "更多提供者", "newKnowledge.name": "知識庫名稱", "newKnowledge.namePlaceholder": "例如:客戶支援手冊", @@ -284,6 +318,7 @@ "newKnowledge.notionNotConnectedDescription": "連接 Notion 以選擇頁面並保持同步。", "newKnowledge.onlineDocuments": "線上文檔", "newKnowledge.onlineDrive": "線上驅動器", + "newKnowledge.overview": "概覽", "newKnowledge.pagesAppearDescription": "抓取網站以查看將新增哪些頁面。", "newKnowledge.pagesAppearTitle": "頁面將顯示在此處", "newKnowledge.pagesCrawled": "已抓取 {{host}} 的 {{count}} 個頁面", @@ -314,16 +349,24 @@ "newKnowledge.providerNotConfigured": "{{provider}} 未配置", "newKnowledge.providerNotConfiguredDescription": "新增 API 金鑰或端點 URL 以使用 {{provider}} 抓取網站。", "newKnowledge.providerUnavailable": "該提供者不可用。", + "newKnowledge.quality": "品質", "newKnowledge.reCrawl": "重新抓取", "newKnowledge.readOnlyEmpty": "請聯絡工作區編輯者建立第一個知識庫。", "newKnowledge.refreshConnectionStatus": "刷新狀態", "newKnowledge.refreshingConnection": "正在重新整理…", + "newKnowledge.reindexDocument": "重新建立索引", "newKnowledge.reindexDocuments": "重新索引", "newKnowledge.removeSource": "刪除來源", + "newKnowledge.retrievalCount": "檢索次數", "newKnowledge.retryCrawl": "重試抓取", "newKnowledge.retryProviderLoad": "重試", + "newKnowledge.retryReindexDocument": "再次重新索引", "newKnowledge.retrySyncPolicy": "重試同步政策", "newKnowledge.retryTask": "重試", + "newKnowledge.revisionState.active": "啟用中", + "newKnowledge.revisionState.candidate": "處理中", + "newKnowledge.revisionState.failed": "失敗", + "newKnowledge.revisionState.superseded": "上一個", "newKnowledge.rootUrl": "根 URL", "newKnowledge.rootUrlPlaceholder": "https://docs.example.com", "newKnowledge.routeUnavailable": "此區段將在下一個設定步驟中開放。", @@ -332,6 +375,7 @@ "newKnowledge.selectAll": "全選", "newKnowledge.selectAllDocuments": "選取全部文件", "newKnowledge.selectAllSources": "選擇所有來源", + "newKnowledge.selectChunk": "選取一個分段以查看其內容。", "newKnowledge.selectFilesAndFolders": "選擇要同步的檔案與資料夾", "newKnowledge.skippedFailed": "已略過(失敗)", "newKnowledge.skippedOffDomain": "已略過(網域外)", @@ -383,9 +427,11 @@ "newKnowledge.tasks": "任務", "newKnowledge.tasksErrorDescription": "無法載入背景任務,請再試一次。", "newKnowledge.tasksWithAttention": "任務,{{count}} 個需要注意", + "newKnowledge.tokenCount": "Token 數", "newKnowledge.unavailableDescription": "KnowledgeFS 目前在此工作區不可用。", "newKnowledge.unavailableTitle": "新版知識庫不可用", "newKnowledge.updated": "更新於 {{date}}", + "newKnowledge.updatedAt": "最後更新", "newKnowledge.updatedColumn": "更新時間", "newKnowledge.uploadCharactersUnavailable": "字元數:—", "newKnowledge.uploadDocuments": "上傳文件",